diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8ba27ae6f54..6778ec7e0de 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -77,7 +77,7 @@ go.sum @ajm188 @deepthi @harshit-gangal @mattlord @rohit-nayak-ps @systay @froui /go/vt/vttablet/*tmclient* @ajm188 @GuptaManan100 @rohit-nayak-ps @shlomi-noach /go/vt/vttablet/vexec @mattlord @rohit-nayak-ps @shlomi-noach /go/vt/wrangler @deepthi @mattlord @rohit-nayak-ps -/go/vt/workflow @mattlord @rohit-nayak-ps +/go/vt/vtctl/workflow @mattlord @rohit-nayak-ps /proto/ @deepthi @harshit-gangal /proto/vtadmin.proto @ajm188 @notfelineit @mattlord /proto/vtctldata.proto @ajm188 @notfelineit @mattlord diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index 443d28e80d6..3ae0a89b4a9 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -12,18 +12,18 @@ env: jobs: build: name: Assign Milestone - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: pull-requests: write steps: + - name: Checkout code + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 - - - name: Checkout code - uses: actions/checkout@v4 + go-version-file: go.mod - name: Assign Milestone run: | diff --git a/.github/workflows/auto_approve_pr.yml b/.github/workflows/auto_approve_pr.yml index 6985f78e224..de553694927 100644 --- a/.github/workflows/auto_approve_pr.yml +++ b/.github/workflows/auto_approve_pr.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Auto Approve Pull Request env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/check_label.yml b/.github/workflows/check_label.yml index ec5309c6757..15b3ae3ec15 100644 --- a/.github/workflows/check_label.yml +++ b/.github/workflows/check_label.yml @@ -9,7 +9,7 @@ jobs: check_pull_request_labels: name: Check Pull Request labels timeout-minutes: 10 - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest if: github.repository == 'vitessio/vitess' steps: - name: Release Notes label diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index 3502c973632..f69df918be1 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -6,7 +6,7 @@ permissions: read-all jobs: build: name: Check Make vtadmin_authz_testgen - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - name: Skip CI run: | @@ -27,11 +27,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -47,10 +47,10 @@ jobs: - '.github/workflows/check_make_vtadmin_authz_testgen.yml' - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.22.5 + go-version-file: go.mod - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 61c83168c23..0f8d404a256 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -6,7 +6,7 @@ permissions: read-all jobs: build: name: Check Make VTAdmin Web Proto - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - name: Skip CI run: | @@ -27,11 +27,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -49,14 +49,14 @@ jobs: - '.github/workflows/check_make_vtadmin_web_proto.yml' - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.22.5 + go-version-file: go.mod - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' - uses: actions/setup-node@v4 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: # node-version should match package.json node-version: '20.12.2' diff --git a/.github/workflows/close_stale_pull_requests.yml b/.github/workflows/close_stale_pull_requests.yml index e0201c0104b..17fef550aa3 100644 --- a/.github/workflows/close_stale_pull_requests.yml +++ b/.github/workflows/close_stale_pull_requests.yml @@ -9,12 +9,12 @@ permissions: read-all jobs: close_stale_pull_requests: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: pull-requests: write steps: - - uses: actions/stale@v5 + - uses: actions/stale@f7176fd3007623b69d27091f9b9d4ab7995f0a06 # v5.2.1 with: days-before-stale: 30 # Do not handle issues at all. We only want to handle PRs. diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 9bbef78eeb8..a7451cc8661 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (12) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_13.yml b/.github/workflows/cluster_endtoend_13.yml index f26195f49e5..d9d96f7d9b5 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (13) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_15.yml b/.github/workflows/cluster_endtoend_15.yml index cae2e55e669..a78e747fe7d 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (15) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_18.yml b/.github/workflows/cluster_endtoend_18.yml index bcac80cf804..2156ed918a3 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (18) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -156,7 +156,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_21.yml b/.github/workflows/cluster_endtoend_21.yml index 9434a280829..ca99cc29fc9 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (21) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index 8a562120fdb..b0790925f7a 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (backup_pitr) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml new file mode 100644 index 00000000000..f0db46c9049 --- /dev/null +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml @@ -0,0 +1,157 @@ +# DO NOT MODIFY: THIS FILE IS GENERATED USING "make generate_ci_workflows" + +name: Cluster (backup_pitr_mysqlshell) +on: [push, pull_request] +concurrency: + group: format('{0}-{1}', ${{ github.ref }}, 'Cluster (backup_pitr_mysqlshell)') + cancel-in-progress: true + +permissions: read-all + +env: + LAUNCHABLE_ORGANIZATION: "vitess" + LAUNCHABLE_WORKSPACE: "vitess-app" + GITHUB_PR_HEAD_SHA: "${{ github.event.pull_request.head.sha }}" + +jobs: + build: + name: Run endtoend tests on Cluster (backup_pitr_mysqlshell) + runs-on: ubuntu-latest + + steps: + - name: Skip CI + run: | + if [[ "${{contains( github.event.pull_request.labels.*.name, 'Skip CI')}}" == "true" ]]; then + echo "skipping CI due to the 'Skip CI' label" + exit 1 + fi + + - name: Check if workflow needs to be skipped + id: skip-workflow + run: | + skip='false' + if [[ "${{github.event.pull_request}}" == "" ]] && [[ "${{github.ref}}" != "refs/heads/main" ]] && [[ ! "${{github.ref}}" =~ ^refs/heads/release-[0-9]+\.[0-9]$ ]] && [[ ! "${{github.ref}}" =~ "refs/tags/.*" ]]; then + skip='true' + fi + echo Skip ${skip} + echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT + + PR_DATA=$(curl -s\ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}") + draft=$(echo "$PR_DATA" | jq .draft -r) + echo "is_draft=${draft}" >> $GITHUB_OUTPUT + + - name: Check out code + if: steps.skip-workflow.outputs.skip-workflow == 'false' + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + + - name: Check for changes in relevant files + if: steps.skip-workflow.outputs.skip-workflow == 'false' + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 + id: changes + with: + token: '' + filters: | + end_to_end: + - 'go/**/*.go' + - 'go/vt/sidecardb/**/*.sql' + - 'go/test/endtoend/onlineddl/vrepl_suite/**' + - 'test.go' + - 'Makefile' + - 'build.env' + - 'go.sum' + - 'go.mod' + - 'proto/*.proto' + - 'tools/**' + - 'config/**' + - 'bootstrap.sh' + - '.github/workflows/cluster_endtoend_backup_pitr_mysqlshell.yml' + + - name: Set up Go + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version-file: go.mod + + - name: Set up python + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + + - name: Tune the OS + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + # Limit local port range to not use ports that overlap with server side + # ports that we listen on. + sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" + # Increase the asynchronous non-blocking I/O. More information at https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_use_native_aio + echo "fs.aio-max-nr = 1048576" | sudo tee -a /etc/sysctl.conf + sudo sysctl -p /etc/sysctl.conf + + - name: Get dependencies + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + + # Get key to latest MySQL repo + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + # Setup MySQL 8.0 + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb + echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections + sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* + sudo apt-get -qq update + # Install everything else we need, and configure + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + + 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 + + # install JUnit report formatter + go install github.com/vitessio/go-junit-report@HEAD + + - name: Setup launchable dependencies + if: steps.skip-workflow.outputs.is_draft == 'false' && steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' + run: | + # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up + pip3 install --user launchable~=1.0 > /dev/null + + # verify that launchable setup is all correct. + launchable verify || true + + # Tell Launchable about the build you are producing and testing + launchable record build --name "$GITHUB_RUN_ID" --no-commit-collection --source . + + - name: Run cluster endtoend test + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 45 + run: | + # We set the VTDATAROOT to the /tmp folder to reduce the file path of mysql.sock file + # which musn't be more than 107 characters long. + export VTDATAROOT="/tmp/" + source build.env + + set -exo pipefail + + # run the tests however you normally do, then produce a JUnit XML file + eatmydata -- go run test.go -docker=false -follow -shard backup_pitr_mysqlshell | tee -a output.txt | go-junit-report -set-exit-code > report.xml + + - name: Print test output and Record test result in launchable if PR is not a draft + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() + run: | + if [[ "${{steps.skip-workflow.outputs.is_draft}}" == "false" ]]; then + # send recorded tests to launchable + launchable record tests --build "$GITHUB_RUN_ID" go-test . || true + fi + + # print test output + cat output.txt + + - name: Test Summary + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 + with: + paths: "report.xml" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml index 1891d1a75d2..5d75aa3e56e 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (backup_pitr_xtrabackup) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -154,7 +154,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml index 1d1627463b1..3263e55e1d0 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (ers_prs_newfeatures_heavy) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -169,7 +169,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_mysql80.yml b/.github/workflows/cluster_endtoend_mysql80.yml index 8c2f3e4dd80..51612778ab6 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (mysql80) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_mysql_server_vault.yml b/.github/workflows/cluster_endtoend_mysql_server_vault.yml index 48a4c5c1897..8b1ad64c1f1 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (mysql_server_vault) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -156,7 +156,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert.yml b/.github/workflows/cluster_endtoend_onlineddl_revert.yml index d48f9919055..8bbdac23b1c 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (onlineddl_revert) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -72,13 +72,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -97,12 +97,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -152,7 +152,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml index bf06949472a..89a611f2671 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (onlineddl_scheduler) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -72,13 +72,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -97,12 +97,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -152,7 +152,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml index c920d49cbd3..b0b3dfd23cf 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -72,13 +72,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -97,12 +97,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -156,7 +156,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml index f58e9239bcb..ca3c46e4113 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -72,13 +72,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -97,12 +97,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -156,7 +156,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml index 7a30bd2c476..a7462070fb8 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -72,13 +72,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -97,12 +97,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -156,7 +156,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml index f1ba097e3f9..4dfed7e08b7 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -72,13 +72,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -97,12 +97,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -156,7 +156,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml index 0a239092a2f..bad67619e5f 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (schemadiff_vrepl) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -72,13 +72,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -97,12 +97,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -156,7 +156,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml index 27b72d07b9e..7d7fd26fedc 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (tabletmanager_consul) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -156,7 +156,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml index 90c07975836..b74640e57d1 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (tabletmanager_tablegc) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index f2643f2060c..c101cd72450 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (tabletmanager_throttler_topo) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_topo_connection_cache.yml b/.github/workflows/cluster_endtoend_topo_connection_cache.yml index 80883fb70d1..a3455fae92b 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (topo_connection_cache) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml index 79a154c2ead..ec063bd783d 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vreplication_across_db_versions) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_basic.yml b/.github/workflows/cluster_endtoend_vreplication_basic.yml index 9af84e462c9..bb9dcfe7742 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml index 3180f0ea723..dd59ad06cf7 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vreplication_cellalias) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml b/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml index b52e0cb433b..5dff9b71f5d 100644 --- a/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml +++ b/.github/workflows/cluster_endtoend_vreplication_copy_parallel.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vreplication_copy_parallel) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml b/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml index 26e670c3d08..8fdb1bd567a 100644 --- a/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml +++ b/.github/workflows/cluster_endtoend_vreplication_foreign_key_stress.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vreplication_foreign_key_stress) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml b/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml index ab8ea8b7264..55260161652 100644 --- a/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml +++ b/.github/workflows/cluster_endtoend_vreplication_mariadb_to_mysql.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vreplication_mariadb_to_mysql) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml index 924a45aa439..2f47615564c 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml b/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml index 35270501b38..51c8397d712 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multi_tenant.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vreplication_multi_tenant) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml index d93a59e2d50..315ab84aa77 100644 --- a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml +++ b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_and_materialize.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vreplication_partial_movetables_and_materialize) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vreplication_v2.yml b/.github/workflows/cluster_endtoend_vreplication_v2.yml index 65a3d58b2a0..b8ffa1c27b8 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vreplication_v2) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -173,7 +173,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vstream.yml b/.github/workflows/cluster_endtoend_vstream.yml index 74ef2e73b86..efc0ae1564f 100644 --- a/.github/workflows/cluster_endtoend_vstream.yml +++ b/.github/workflows/cluster_endtoend_vstream.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vstream) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index c95fe428092..ddc172bd59e 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtbackup) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml index 72fd1c652eb..dee6ab7ea65 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtctlbackup_sharded_clustertest_heavy) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -169,7 +169,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml index 374ac97a4d7..2c16a563531 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_concurrentdml) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml index 7f2c2f6e9ba..78cd2b09356 100644 --- a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml +++ b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_foreignkey_stress) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_gen4.yml b/.github/workflows/cluster_endtoend_vtgate_gen4.yml index 5890970519f..60930f758bd 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_gen4) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml index 6ac03c17e81..5511adfbb66 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_general_heavy) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -169,7 +169,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_godriver.yml b/.github/workflows/cluster_endtoend_vtgate_godriver.yml index 9eba657c65d..8b1b2cc9a49 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_godriver) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml index 9600c48486f..14277b0bf60 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_partial_keyspace) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_queries.yml b/.github/workflows/cluster_endtoend_vtgate_queries.yml index dcc10cb9b4a..d6d8d82f29c 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_queries) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml index 8d95830e276..2aa7c64ce54 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_readafterwrite) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml index ad95087a8f3..08dd4f0d11d 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_reservedconn) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_schema.yml b/.github/workflows/cluster_endtoend_vtgate_schema.yml index a3b79c0b8d0..d0e4cbfb50e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_schema) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml index 50a044c4bc2..963ac487892 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_schema_tracker) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml index 007289158ac..2b08bb8ce33 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_tablet_healthcheck_cache) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_topo.yml b/.github/workflows/cluster_endtoend_vtgate_topo.yml index 2384d8e6021..233fd212433 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_topo) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml index 906f9aa04d8..8396ff0e6be 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_topo_consul) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -156,7 +156,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml index 64861ef358a..f156754bef1 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_topo_etcd) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_transaction.yml b/.github/workflows/cluster_endtoend_vtgate_transaction.yml index 41a84f42d3f..7ef4ed4774e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_transaction) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -136,7 +136,7 @@ jobs: set -exo pipefail # run the tests however you normally do, then produce a JUnit XML file - eatmydata -- go run test.go -docker=false -follow -shard vtgate_transaction | tee -a output.txt | go-junit-report -set-exit-code > report.xml + eatmydata -- go run test.go -docker=false -follow -shard vtgate_transaction -build-tag=debug2PC | tee -a output.txt | go-junit-report -set-exit-code > report.xml - name: Print test output and Record test result in launchable if PR is not a draft if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml index a879e88ba44..7222a0cc9f4 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_unsharded) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml index 964146c9829..653938d0f54 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_vindex_heavy) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -169,7 +169,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtgate_vschema.yml b/.github/workflows/cluster_endtoend_vtgate_vschema.yml index c66c9959ab2..fdd2a435123 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtgate_vschema) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vtorc.yml b/.github/workflows/cluster_endtoend_vtorc.yml index d6fb811f533..d1cf4b6db39 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vtorc) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -54,11 +54,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -80,13 +80,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -105,12 +105,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -160,7 +160,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml index 248a611a864..80e9174da81 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (vttablet_prscomplex) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -96,12 +96,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 sudo service mysql stop sudo service etcd stop @@ -151,7 +151,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index 5a8acc66d8c..bfcbb96ccb7 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (xb_backup) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -154,7 +154,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index 94fb11320fb..f07aa3d01a1 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Cluster (xb_recovery) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -154,7 +154,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 5640bc01b69..92ef037ee6b 100644 --- a/.github/workflows/code_freeze.yml +++ b/.github/workflows/code_freeze.yml @@ -7,7 +7,7 @@ permissions: read-all jobs: build: name: Code Freeze - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - name: Fail if Code Freeze is enabled run: | diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 3015309d2c2..7846749a013 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -13,10 +13,10 @@ jobs: steps: - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in files relevant to code coverage - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -30,13 +30,13 @@ jobs: - name: Set up Go if: steps.changes.outputs.changed_files == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.changes.outputs.changed_files == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.changes.outputs.changed_files == 'true' diff --git a/.github/workflows/codeql_analysis.yml b/.github/workflows/codeql_analysis.yml index 154ce0fa822..e1a474ce9a2 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -14,7 +14,7 @@ permissions: read-all jobs: analyze: name: Analyze - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: actions: read contents: read @@ -27,12 +27,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL @@ -59,7 +59,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index cb393141ae3..a42bbc0ff2d 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -12,28 +12,22 @@ permissions: read-all jobs: build: name: Create Release - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: contents: write steps: + - name: Check out code + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: 1.22.5 - - - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - node-version: '20.12.2' + go-version-file: go.mod - name: Tune the OS run: | sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" - - name: Check out code - uses: actions/checkout@v4 - - name: Get dependencies run: | sudo apt-get update diff --git a/.github/workflows/build_docker_images.yml b/.github/workflows/docker_build_images.yml similarity index 74% rename from .github/workflows/build_docker_images.yml rename to .github/workflows/docker_build_images.yml index da1e7c63887..827946a43dc 100644 --- a/.github/workflows/build_docker_images.yml +++ b/.github/workflows/docker_build_images.yml @@ -1,11 +1,11 @@ name: Build Docker Images on: - pull_request: push: branches: - main tags: - - '*' + - 'v[2-9][0-9]*.*' # run only on tags greater or equal to v20.0.0 where this new way of building docker image was changed + workflow_dispatch: concurrency: group: format('{0}-{1}', ${{ github.ref }}, 'Build Docker Images') @@ -14,30 +14,10 @@ concurrency: permissions: read-all jobs: - push: - name: Set push variable - runs-on: ubuntu-20.04 - if: github.repository == 'vitessio/vitess' - outputs: - push: ${{ steps.push.outputs.push }} - - steps: - - name: Set push variable - id: push - run: | - push='false' - if [[ "${{github.event.pull_request}}" == "" ]]; then - push='true' - fi - echo Push ${push} - echo "push=${push}" >> $GITHUB_OUTPUT - build_and_push_vttestserver: name: Build and push vttestserver runs-on: gh-hosted-runners-16cores-1 - if: github.repository == 'vitessio/vitess' && needs.push.result == 'success' - needs: - - push + if: github.repository == 'vitessio/vitess' strategy: fail-fast: true @@ -46,11 +26,10 @@ jobs: steps: - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Docker Hub - if: needs.push.outputs.push == 'true' - uses: docker/login-action@v3 + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} @@ -61,11 +40,11 @@ jobs: - name: Build and push on main if: startsWith(github.ref, 'refs/tags/') == false - uses: docker/build-push-action@v5 + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 with: context: . file: ${{ env.DOCKERFILE }} - push: ${{ needs.push.outputs.push }} + push: true tags: vitess/vttestserver:${{ matrix.branch }} ###### @@ -82,20 +61,17 @@ jobs: - name: Build and push on tags if: startsWith(github.ref, 'refs/tags/') - uses: docker/build-push-action@v5 + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 with: context: . file: ${{ env.DOCKERFILE }} push: true tags: ${{ env.DOCKER_TAG }} - build_and_push_lite: name: Build and push lite - runs-on: gh-hosted-runners-16cores-1 - if: github.repository == 'vitessio/vitess' && needs.push.result == 'success' - needs: - - push + runs-on: ubuntu-latest + if: github.repository == 'vitessio/vitess' strategy: fail-fast: true @@ -104,11 +80,10 @@ jobs: steps: - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Docker Hub - if: needs.push.outputs.push == 'true' - uses: docker/login-action@v3 + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} @@ -123,11 +98,11 @@ jobs: - name: Build and push on main if: startsWith(github.ref, 'refs/tags/') == false - uses: docker/build-push-action@v5 + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 with: context: . file: ${{ env.DOCKERFILE }} - push: ${{ needs.push.outputs.push }} + push: true tags: vitess/lite:${{ matrix.branch }} ###### @@ -148,7 +123,7 @@ jobs: - name: Build and push on tags if: startsWith(github.ref, 'refs/tags/') - uses: docker/build-push-action@v5 + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 with: context: . file: ${{ env.DOCKERFILE }} @@ -158,9 +133,8 @@ jobs: build_and_push_components: name: Build and push runs-on: gh-hosted-runners-16cores-1 - if: github.repository == 'vitessio/vitess' && needs.push.result == 'success' && needs.build_and_push_lite.result == 'success' + if: github.repository == 'vitessio/vitess' && needs.build_and_push_lite.result == 'success' needs: - - push - build_and_push_lite strategy: @@ -171,11 +145,10 @@ jobs: steps: - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Docker Hub - if: needs.push.outputs.push == 'true' - uses: docker/login-action@v3 + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} @@ -186,10 +159,10 @@ jobs: - name: Build and push on main latest tag if: startsWith(github.ref, 'refs/tags/') == false && matrix.debian == 'bookworm' - uses: docker/build-push-action@v5 + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 with: context: ${{ env.DOCKER_CTX }} - push: ${{ needs.push.outputs.push }} + push: true tags: vitess/${{ matrix.component }}:latest build-args: | VT_BASE_VER=latest @@ -197,10 +170,10 @@ jobs: - name: Build and push on main debian specific tag if: startsWith(github.ref, 'refs/tags/') == false - uses: docker/build-push-action@v5 + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 with: context: ${{ env.DOCKER_CTX }} - push: ${{ needs.push.outputs.push }} + push: true tags: vitess/${{ matrix.component }}:latest-${{ matrix.debian }} build-args: | VT_BASE_VER=latest @@ -229,7 +202,7 @@ jobs: # Build and Push component image to DOCKER_TAG, applies to both debian version - name: Build and push on tags using Debian extension if: startsWith(github.ref, 'refs/tags/') - uses: docker/build-push-action@v5 + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 with: context: ${{ env.DOCKER_CTX }} push: true @@ -242,11 +215,29 @@ jobs: # It is fine to build a second time here when "matrix.debian == 'bookworm'" as we have cached the first build already - name: Build and push on tags without Debian extension if: startsWith(github.ref, 'refs/tags/') && matrix.debian == 'bookworm' - uses: docker/build-push-action@v5 + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 with: context: ${{ env.DOCKER_CTX }} push: true tags: ${{ env.DOCKER_TAG_DEFAULT_DEBIAN }} build-args: | VT_BASE_VER=${{ env.TAG_NAME }} - DEBIAN_VER=${{ matrix.debian }}-slim \ No newline at end of file + DEBIAN_VER=${{ matrix.debian }}-slim + + slack_notification: + name: Slack Notification if failed + runs-on: ubuntu-latest + needs: + - build_and_push_vttestserver + - build_and_push_lite + - build_and_push_components + if: ${{ failure() }} + steps: + - name: Slack Workflow Notification + uses: Gamesight/slack-workflow-status@68bf00d0dbdbcb206c278399aa1ef6c14f74347a # v1.3.0 + with: + repo_token: ${{secrets.GITHUB_TOKEN}} + slack_webhook_url: ${{secrets.SLACK_WEBHOOK_URL}} + channel: '#docker-build-notifications' + name: 'Docker Build Notification' + icon_url: https://avatars.githubusercontent.com/u/33043890?s=96&v=4 \ No newline at end of file diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index 2a1c1050461..ce1c9e7277b 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -5,7 +5,7 @@ jobs: build: name: Docker Test Cluster 10 - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -27,11 +27,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -52,9 +52,9 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index ba73f50252b..eb2319b8c9f 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -5,7 +5,7 @@ jobs: build: name: Docker Test Cluster 25 - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -27,11 +27,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -52,9 +52,9 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index cef0ea4d583..78c8d0b1753 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -5,7 +5,7 @@ jobs: build: name: End-to-End Test (Race) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI run: | @@ -26,11 +26,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -50,9 +50,9 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -65,7 +65,7 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 783d3305fc8..9e06e4ee44b 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -5,7 +5,7 @@ jobs: build: name: End-to-End Test - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI run: | @@ -26,11 +26,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -50,9 +50,9 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index 78cd2d1784f..65669158415 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -30,11 +30,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -55,9 +55,9 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' @@ -71,7 +71,7 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index fa08d3d80cb..c031ea315b5 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -30,11 +30,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -55,9 +55,9 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' @@ -71,7 +71,7 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml new file mode 100644 index 00000000000..7d20694b850 --- /dev/null +++ b/.github/workflows/scorecards.yml @@ -0,0 +1,67 @@ +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + push: + branches: [ "main" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + # Uncomment the permissions below if installing in a private repository. + # contents: read + # actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@v3 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard (optional). + # Commenting out will disable upload of results to your repo's Code Scanning dashboard + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: results.sarif diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 75fb01e487e..cd896d5fd29 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -9,7 +9,7 @@ permissions: read-all jobs: build: name: Static Code Checks Etc - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -31,7 +31,7 @@ jobs: - name: Checkout code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Run FOSSA scan and upload build data uses: fossa-contrib/fossa-action@v3 @@ -42,7 +42,7 @@ jobs: - name: Check for changes in Go files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -52,6 +52,7 @@ jobs: - '*.go' - 'go.sum' - 'go.mod' + - '.github/workflows/static_checks_etc.yml' parser_changes: - 'go/vt/sqlparser/**' - 'go.sum' @@ -118,12 +119,13 @@ jobs: - '.github/**' - 'Makefile' - 'test/ci_workflow_gen.go' + - '.github/workflows/static_checks_etc.yml' - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && (steps.changes.outputs.go_files == 'true' || steps.changes.outputs.parser_changes == 'true' || steps.changes.outputs.proto_changes == 'true') - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' @@ -193,7 +195,7 @@ jobs: - name: Install golangci-lint if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' - run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.56.2 + run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.60.2 - name: Clean Env if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' @@ -221,6 +223,13 @@ jobs: echo "$output" exit 1 + - name: Setup Node + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + with: + # make proto requires newer node than the pre-installed one + node-version: '20.12.2' + - name: check_make_proto if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' run: | diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 3f6de3eb6f8..e764cd33d9d 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -43,11 +43,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -67,13 +67,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' @@ -147,7 +147,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/unit_race_evalengine.yml b/.github/workflows/unit_race_evalengine.yml index 77ada6729bd..5a5cb637681 100644 --- a/.github/workflows/unit_race_evalengine.yml +++ b/.github/workflows/unit_race_evalengine.yml @@ -43,11 +43,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -67,13 +67,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' @@ -147,7 +147,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/unit_test_evalengine_mysql57.yml b/.github/workflows/unit_test_evalengine_mysql57.yml index 7ab842835fb..cff3ca581bb 100644 --- a/.github/workflows/unit_test_evalengine_mysql57.yml +++ b/.github/workflows/unit_test_evalengine_mysql57.yml @@ -16,7 +16,7 @@ env: jobs: test: name: Unit Test (evalengine_mysql57) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -69,13 +69,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' @@ -102,9 +102,8 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb - # mysql57 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb # Bionic packages are still compatible for Jammy since there's no MySQL 5.7 # packages for Jammy. echo mysql-apt-config mysql-apt-config/repo-codename select bionic | sudo debconf-set-selections @@ -112,7 +111,7 @@ jobs: sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq install -y mysql-client=5.7* mysql-community-server=5.7* mysql-server=5.7* libncurses5 - + sudo apt-get -qq install -y make unzip g++ curl git wget ant openjdk-11-jdk eatmydata sudo service mysql stop sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 @@ -173,7 +172,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/unit_test_evalengine_mysql80.yml b/.github/workflows/unit_test_evalengine_mysql80.yml index f5c127a8b77..5578829d48d 100644 --- a/.github/workflows/unit_test_evalengine_mysql80.yml +++ b/.github/workflows/unit_test_evalengine_mysql80.yml @@ -16,7 +16,7 @@ env: jobs: test: name: Unit Test (evalengine_mysql80) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -69,13 +69,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' @@ -102,14 +102,13 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb - # mysql80 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq install -y mysql-server mysql-client - + sudo apt-get -qq install -y make unzip g++ curl git wget ant openjdk-11-jdk eatmydata sudo service mysql stop sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 @@ -170,7 +169,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/unit_test_evalengine_mysql84.yml b/.github/workflows/unit_test_evalengine_mysql84.yml new file mode 100644 index 00000000000..2a86d5bfabd --- /dev/null +++ b/.github/workflows/unit_test_evalengine_mysql84.yml @@ -0,0 +1,175 @@ +# DO NOT MODIFY: THIS FILE IS GENERATED USING "make generate_ci_workflows" + +name: Unit Test (evalengine_mysql84) +on: [push, pull_request] +concurrency: + group: format('{0}-{1}', ${{ github.ref }}, 'Unit Test (evalengine_mysql84)') + cancel-in-progress: true + +permissions: read-all + +env: + LAUNCHABLE_ORGANIZATION: "vitess" + LAUNCHABLE_WORKSPACE: "vitess-app" + GITHUB_PR_HEAD_SHA: "${{ github.event.pull_request.head.sha }}" + +jobs: + test: + name: Unit Test (evalengine_mysql84) + runs-on: ubuntu-latest + + steps: + - name: Skip CI + run: | + if [[ "${{contains( github.event.pull_request.labels.*.name, 'Skip CI')}}" == "true" ]]; then + echo "skipping CI due to the 'Skip CI' label" + exit 1 + fi + + - name: Check if workflow needs to be skipped + id: skip-workflow + run: | + skip='false' + if [[ "${{github.event.pull_request}}" == "" ]] && [[ "${{github.ref}}" != "refs/heads/main" ]] && [[ ! "${{github.ref}}" =~ ^refs/heads/release-[0-9]+\.[0-9]$ ]] && [[ ! "${{github.ref}}" =~ "refs/tags/.*" ]]; then + skip='true' + fi + echo Skip ${skip} + echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT + + PR_DATA=$(curl \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}") + draft=$(echo "$PR_DATA" | jq .draft -r) + echo "is_draft=${draft}" >> $GITHUB_OUTPUT + + - name: Check out code + if: steps.skip-workflow.outputs.skip-workflow == 'false' + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + + - name: Check for changes in relevant files + if: steps.skip-workflow.outputs.skip-workflow == 'false' + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 + id: changes + with: + token: '' + filters: | + unit_tests: + - 'go/**' + - 'test.go' + - 'Makefile' + - 'build.env' + - 'go.sum' + - 'go.mod' + - 'proto/*.proto' + - 'tools/**' + - 'config/**' + - 'bootstrap.sh' + - '.github/workflows/unit_test_evalengine_mysql84.yml' + + - name: Set up Go + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version-file: go.mod + + - name: Set up python + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + + - name: Tune the OS + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + run: | + sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" + # Increase the asynchronous non-blocking I/O. More information at https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_use_native_aio + echo "fs.aio-max-nr = 1048576" | sudo tee -a /etc/sysctl.conf + sudo sysctl -p /etc/sysctl.conf + + - name: Get dependencies + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + run: | + export DEBIAN_FRONTEND="noninteractive" + sudo apt-get -qq update + + # Uninstall any previously installed MySQL first + sudo systemctl stop apparmor + sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq remove -y --purge mysql-server mysql-client mysql-common + sudo apt-get -qq -y autoremove + sudo apt-get -qq -y autoclean + sudo deluser mysql + sudo rm -rf /var/lib/mysql + sudo rm -rf /etc/mysql + + # Get key to latest MySQL repo + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb + + echo mysql-apt-config mysql-apt-config/select-server select mysql-8.4-lts | sudo debconf-set-selections + sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* + sudo apt-get -qq update + sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq install -y mysql-server mysql-client + + sudo apt-get -qq install -y make unzip g++ curl git wget ant openjdk-11-jdk eatmydata + sudo service mysql stop + sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 + sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ + sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld || echo "could not remove mysqld profile" + + mkdir -p dist bin + curl -s -L https://github.com/coreos/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz | tar -zxC dist + mv dist/etcd-v3.3.10-linux-amd64/{etcd,etcdctl} bin/ + + go mod download + go install golang.org/x/tools/cmd/goimports@latest + + # install JUnit report formatter + go install github.com/vitessio/go-junit-report@HEAD + + - name: Run make tools + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + run: | + make tools + + - name: Setup launchable dependencies + if: steps.skip-workflow.outputs.is_draft == 'false' && steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && github.base_ref == 'main' + run: | + # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up + pip3 install --user launchable~=1.0 > /dev/null + + # verify that launchable setup is all correct. + launchable verify || true + + # Tell Launchable about the build you are producing and testing + launchable record build --name "$GITHUB_RUN_ID" --no-commit-collection --source . + + - name: Run test + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + timeout-minutes: 30 + run: | + set -exo pipefail + # We set the VTDATAROOT to the /tmp folder to reduce the file path of mysql.sock file + # which musn't be more than 107 characters long. + export VTDATAROOT="/tmp/" + + export NOVTADMINBUILD=1 + export VTEVALENGINETEST="1" + + eatmydata -- make unit_test | tee -a output.txt | go-junit-report -set-exit-code > report.xml + + - name: Print test output and Record test result in launchable if PR is not a draft + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() + run: | + if [[ "${{steps.skip-workflow.outputs.is_draft}}" == "false" ]]; then + # send recorded tests to launchable + launchable record tests --build "$GITHUB_RUN_ID" go-test . || true + fi + + # print test output + cat output.txt + + - name: Test Summary + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 + with: + paths: "report.xml" + show: "fail" diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index cd28efef0d8..4f2ce90e16a 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -16,7 +16,7 @@ env: jobs: test: name: Unit Test (mysql57) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -69,13 +69,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' @@ -102,9 +102,8 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb - # mysql57 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb # Bionic packages are still compatible for Jammy since there's no MySQL 5.7 # packages for Jammy. echo mysql-apt-config mysql-apt-config/repo-codename select bionic | sudo debconf-set-selections @@ -112,7 +111,7 @@ jobs: sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq install -y mysql-client=5.7* mysql-community-server=5.7* mysql-server=5.7* libncurses5 - + sudo apt-get -qq install -y make unzip g++ curl git wget ant openjdk-11-jdk eatmydata sudo service mysql stop sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 @@ -173,7 +172,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index e66423ad1b7..03f31a25cc8 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -16,7 +16,7 @@ env: jobs: test: name: Unit Test (mysql80) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -69,13 +69,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' @@ -102,14 +102,13 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb - # mysql80 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq install -y mysql-server mysql-client - + sudo apt-get -qq install -y make unzip g++ curl git wget ant openjdk-11-jdk eatmydata sudo service mysql stop sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 @@ -170,7 +169,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/unit_test_mysql84.yml b/.github/workflows/unit_test_mysql84.yml new file mode 100644 index 00000000000..95a56aeff81 --- /dev/null +++ b/.github/workflows/unit_test_mysql84.yml @@ -0,0 +1,175 @@ +# DO NOT MODIFY: THIS FILE IS GENERATED USING "make generate_ci_workflows" + +name: Unit Test (mysql84) +on: [push, pull_request] +concurrency: + group: format('{0}-{1}', ${{ github.ref }}, 'Unit Test (mysql84)') + cancel-in-progress: true + +permissions: read-all + +env: + LAUNCHABLE_ORGANIZATION: "vitess" + LAUNCHABLE_WORKSPACE: "vitess-app" + GITHUB_PR_HEAD_SHA: "${{ github.event.pull_request.head.sha }}" + +jobs: + test: + name: Unit Test (mysql84) + runs-on: ubuntu-latest + + steps: + - name: Skip CI + run: | + if [[ "${{contains( github.event.pull_request.labels.*.name, 'Skip CI')}}" == "true" ]]; then + echo "skipping CI due to the 'Skip CI' label" + exit 1 + fi + + - name: Check if workflow needs to be skipped + id: skip-workflow + run: | + skip='false' + if [[ "${{github.event.pull_request}}" == "" ]] && [[ "${{github.ref}}" != "refs/heads/main" ]] && [[ ! "${{github.ref}}" =~ ^refs/heads/release-[0-9]+\.[0-9]$ ]] && [[ ! "${{github.ref}}" =~ "refs/tags/.*" ]]; then + skip='true' + fi + echo Skip ${skip} + echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT + + PR_DATA=$(curl \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}") + draft=$(echo "$PR_DATA" | jq .draft -r) + echo "is_draft=${draft}" >> $GITHUB_OUTPUT + + - name: Check out code + if: steps.skip-workflow.outputs.skip-workflow == 'false' + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + + - name: Check for changes in relevant files + if: steps.skip-workflow.outputs.skip-workflow == 'false' + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 + id: changes + with: + token: '' + filters: | + unit_tests: + - 'go/**' + - 'test.go' + - 'Makefile' + - 'build.env' + - 'go.sum' + - 'go.mod' + - 'proto/*.proto' + - 'tools/**' + - 'config/**' + - 'bootstrap.sh' + - '.github/workflows/unit_test_mysql84.yml' + + - name: Set up Go + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version-file: go.mod + + - name: Set up python + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + + - name: Tune the OS + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + run: | + sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" + # Increase the asynchronous non-blocking I/O. More information at https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_use_native_aio + echo "fs.aio-max-nr = 1048576" | sudo tee -a /etc/sysctl.conf + sudo sysctl -p /etc/sysctl.conf + + - name: Get dependencies + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + run: | + export DEBIAN_FRONTEND="noninteractive" + sudo apt-get -qq update + + # Uninstall any previously installed MySQL first + sudo systemctl stop apparmor + sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq remove -y --purge mysql-server mysql-client mysql-common + sudo apt-get -qq -y autoremove + sudo apt-get -qq -y autoclean + sudo deluser mysql + sudo rm -rf /var/lib/mysql + sudo rm -rf /etc/mysql + + # Get key to latest MySQL repo + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb + + echo mysql-apt-config mysql-apt-config/select-server select mysql-8.4-lts | sudo debconf-set-selections + sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* + sudo apt-get -qq update + sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq install -y mysql-server mysql-client + + sudo apt-get -qq install -y make unzip g++ curl git wget ant openjdk-11-jdk eatmydata + sudo service mysql stop + sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 + sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ + sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld || echo "could not remove mysqld profile" + + mkdir -p dist bin + curl -s -L https://github.com/coreos/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz | tar -zxC dist + mv dist/etcd-v3.3.10-linux-amd64/{etcd,etcdctl} bin/ + + go mod download + go install golang.org/x/tools/cmd/goimports@latest + + # install JUnit report formatter + go install github.com/vitessio/go-junit-report@HEAD + + - name: Run make tools + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + run: | + make tools + + - name: Setup launchable dependencies + if: steps.skip-workflow.outputs.is_draft == 'false' && steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && github.base_ref == 'main' + run: | + # Get Launchable CLI installed. If you can, make it a part of the builder image to speed things up + pip3 install --user launchable~=1.0 > /dev/null + + # verify that launchable setup is all correct. + launchable verify || true + + # Tell Launchable about the build you are producing and testing + launchable record build --name "$GITHUB_RUN_ID" --no-commit-collection --source . + + - name: Run test + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' + timeout-minutes: 30 + run: | + set -exo pipefail + # We set the VTDATAROOT to the /tmp folder to reduce the file path of mysql.sock file + # which musn't be more than 107 characters long. + export VTDATAROOT="/tmp/" + + export NOVTADMINBUILD=1 + export VTEVALENGINETEST="0" + + eatmydata -- make unit_test | tee -a output.txt | go-junit-report -set-exit-code > report.xml + + - name: Print test output and Record test result in launchable if PR is not a draft + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() + run: | + if [[ "${{steps.skip-workflow.outputs.is_draft}}" == "false" ]]; then + # send recorded tests to launchable + launchable record tests --build "$GITHUB_RUN_ID" go-test . || true + fi + + # print test output + cat output.txt + + - name: Test Summary + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 + with: + paths: "report.xml" + show: "fail" diff --git a/.github/workflows/update_golang_dependencies.yml b/.github/workflows/update_golang_dependencies.yml index 7538090d51e..a614a634d83 100644 --- a/.github/workflows/update_golang_dependencies.yml +++ b/.github/workflows/update_golang_dependencies.yml @@ -17,12 +17,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: main diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index df9677e7cf4..10ddbf9533c 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -15,20 +15,20 @@ jobs: pull-requests: write strategy: matrix: - branch: [ main, release-20.0, release-19.0, release-18.0 ] + branch: [ main, release-21.0, release-20.0, release-19.0, release-18.0 ] name: Update Golang Version runs-on: ubuntu-latest steps: - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: 1.22.5 - - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ matrix.branch }} + - name: Set up Go + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version-file: go.mod + - name: Detect new version and update codebase env: GH_TOKEN: ${{ github.token }} @@ -38,9 +38,9 @@ jobs: echo "old-go-version=${old_go_version}" >> $GITHUB_OUTPUT if [ ${{ matrix.branch }} == "main" ]; then - go run ./go/tools/go-upgrade/go-upgrade.go upgrade --workflow-update=false --main --allow-major-upgrade + go run ./go/tools/go-upgrade/go-upgrade.go upgrade --main --allow-major-upgrade else - go run ./go/tools/go-upgrade/go-upgrade.go upgrade --workflow-update=false + go run ./go/tools/go-upgrade/go-upgrade.go upgrade fi output=$(git status -s) @@ -81,8 +81,6 @@ jobs: There are a few manual steps remaining: - [ ] Make sure you update the Golang version used in the previous and next release branches for the Upgrade/Downgrade tests. - [ ] Build and Push the bootstrap images to Docker Hub, the bot cannot handle that. - - [ ] Update the `./.github/workflows/*.yml` files with the newer Golang version, the bot cannot handle that due to permissions. - - To accomplish this, run the following: `go run ./go/tools/go-upgrade/go-upgrade.go upgrade workflows --go-to=${{steps.detect-and-update.outputs.go-version}}` cc @vitessio/release base: ${{ matrix.branch }} diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index e8b8a688879..f1c4f335f0d 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -35,7 +35,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -49,7 +49,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -70,13 +70,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version: 1.22.7 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -107,7 +107,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -129,7 +129,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index 0e24c534057..73c24c5e72e 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -25,7 +25,7 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -51,7 +51,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -72,13 +72,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -109,7 +109,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -131,7 +131,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 3f25e2c8663..9c866affb0b 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -38,7 +38,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -52,7 +52,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -74,13 +74,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version: 1.22.7 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -102,7 +102,7 @@ jobs: # Install MySQL 8.0 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -129,7 +129,7 @@ jobs: # Checkout to the last release of Vitess - name: Checkout to the other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -151,7 +151,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml index 83a678fc065..802ee78d940 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -27,7 +27,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -53,7 +53,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -75,13 +75,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -103,7 +103,7 @@ jobs: # Install MySQL 8.0 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -130,7 +130,7 @@ jobs: # Checkout to the next release of Vitess - name: Checkout to the other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -152,7 +152,7 @@ jobs: # Checkout to this build's commit - name: Checkout to commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml index c280365b6d3..89e5f7c4d25 100644 --- a/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml +++ b/.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml @@ -38,13 +38,13 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -81,13 +81,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version: 1.22.7 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -108,7 +108,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -127,7 +127,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out last version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -150,7 +150,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out next version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -173,7 +173,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index 93360699f93..f7d68dfee04 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -38,7 +38,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -52,7 +52,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -73,13 +73,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version: 1.22.7 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -100,7 +100,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -116,10 +116,26 @@ jobs: # install JUnit report formatter go install github.com/vitessio/go-junit-report@HEAD + # Build current commit's binaries + - name: Get dependencies for this commit + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + go mod download + + - name: Building the binaries for this commit + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + timeout-minutes: 10 + run: | + source build.env + NOVTADMINBUILD=1 make build + mkdir -p /tmp/vitess-build-current/ + cp -R bin /tmp/vitess-build-current/ + rm -Rf bin/* + # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -138,24 +154,11 @@ jobs: cp -R bin /tmp/vitess-build-other/ rm -Rf bin/* - # Checkout to this build's commit - - name: Check out commit's code - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 - - - name: Get dependencies for this commit - if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - run: | - go mod download - - - name: Building the binaries for this commit + - name: Convert ErrorContains checks to Error checks if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - timeout-minutes: 10 run: | - source build.env - NOVTADMINBUILD=1 make build - mkdir -p /tmp/vitess-build-current/ - cp -R bin /tmp/vitess-build-current/ + find ./go/test/endtoend -name '*.go' -exec sed -i 's/ErrorContains/Error/g' {} + + find ./go/test/endtoend -name '*.go' -exec sed -i 's/EqualError/Error/g' {} + # Swap the binaries in the bin. Use vtgate version n-1 and keep vttablet at version n - name: Use last release's VTGate @@ -163,12 +166,13 @@ jobs: run: | source build.env + cp -r /tmp/vitess-build-current/bin/* $PWD/bin/ rm -f $PWD/bin/vtgate cp /tmp/vitess-build-other/bin/vtgate $PWD/bin/vtgate vtgate --version - # Running a test with vtgate at version n-1 and vttablet at version n - - name: Run query serving tests (vtgate=N-1, vttablet=N) + # Running a test with vtgate at version n-1 and vttablet/vtctld at version n + - name: Run query serving tests (vtgate=N-1, vttablet=N, vtctld=N) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | rm -rf /tmp/vtdataroot @@ -177,8 +181,8 @@ jobs: source build.env eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_query_serving_queries - # Swap the binaries again. This time, vtgate will be at version n, and vttablet will be at version n-1 - - name: Use current version VTGate, and other version VTTablet + # Swap the binaries again. This time, vtgate will be at version n, and vttablet/vtctld will be at version n-1 + - name: Use current version VTGate, and other version VTTablet/VTctld if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | source build.env @@ -197,8 +201,8 @@ jobs: vtgate --version vttablet --version - # Running a test with vtgate at version n and vttablet at version n-1 - - name: Run query serving tests (vtgate=N, vttablet=N-1) + # Running a test with vtgate at version n and vttablet/vtctld at version n-1 + - name: Run query serving tests (vtgate=N, vttablet=N-1, vtctld=N-1) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | rm -rf /tmp/vtdataroot diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml index 6c3674a1d75..e3a34bd43f8 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml @@ -27,7 +27,7 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -53,7 +53,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -74,13 +74,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -101,7 +101,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -120,7 +120,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -142,7 +142,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -158,12 +158,17 @@ jobs: mkdir -p /tmp/vitess-build-current/ cp -R bin /tmp/vitess-build-current/ + - name: Convert ErrorContains checks to Error checks + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + find ./go/test/endtoend -name '*.go' -exec sed -i 's/ErrorContains/Error/g' {} + + find ./go/test/endtoend -name '*.go' -exec sed -i 's/EqualError/Error/g' {} + + # Swap the binaries in the bin. Use vtgate version n+1 and keep vttablet at version n - name: Use next release's VTGate if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' run: | source build.env - rm -f $PWD/bin/vtgate cp /tmp/vitess-build-other/bin/vtgate $PWD/bin/vtgate vtgate --version diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index cc519f335cf..a9162d2f199 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -38,7 +38,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -52,7 +52,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -73,13 +73,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version: 1.22.7 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -100,7 +100,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -119,7 +119,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -141,7 +141,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -157,6 +157,12 @@ jobs: mkdir -p /tmp/vitess-build-current/ cp -R bin /tmp/vitess-build-current/ + - name: Convert ErrorContains checks to Error checks + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + find ./go/test/endtoend -name '*.go' -exec sed -i 's/ErrorContains/Error/g' {} + + find ./go/test/endtoend -name '*.go' -exec sed -i 's/EqualError/Error/g' {} + + # Swap the binaries in the bin. Use vtgate version n-1 and keep vttablet at version n - name: Use last release's VTGate if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml index c1864a9a3e7..bf5f63d8836 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml @@ -27,7 +27,7 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -53,7 +53,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -74,13 +74,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -101,7 +101,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -120,7 +120,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -142,7 +142,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -158,6 +158,12 @@ jobs: mkdir -p /tmp/vitess-build-current/ cp -R bin /tmp/vitess-build-current/ + - name: Convert ErrorContains checks to Error checks + if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' + run: | + find ./go/test/endtoend -name '*.go' -exec sed -i 's/ErrorContains/Error/g' {} + + find ./go/test/endtoend -name '*.go' -exec sed -i 's/EqualError/Error/g' {} + + # Swap the binaries in the bin. Use vtgate version n+1 and keep vttablet at version n - name: Use next release's VTGate if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index 66033484ce3..ac6615b5788 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -27,7 +27,7 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -53,7 +53,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -74,13 +74,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -101,7 +101,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -120,7 +120,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -142,7 +142,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index d937bc7bc11..e163ab35ea4 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -27,7 +27,7 @@ jobs: fi - name: Check out commit's code - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -53,7 +53,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -74,13 +74,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -101,7 +101,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -127,7 +127,7 @@ jobs: # Checkout to the next release of Vitess - name: Check out other version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} @@ -149,7 +149,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index ac6ef068654..93e94466b74 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -38,7 +38,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -52,7 +52,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -73,13 +73,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version: 1.22.7 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -100,7 +100,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -119,7 +119,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -141,7 +141,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index df0cdb9c7c9..12f6b514aa1 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -38,7 +38,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -52,7 +52,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -73,13 +73,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version: 1.22.7 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -100,7 +100,7 @@ jobs: sudo rm -rf /etc/mysql # Install mysql80 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get update @@ -119,7 +119,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -141,7 +141,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_semi_sync.yml b/.github/workflows/upgrade_downgrade_test_semi_sync.yml index 91b3b22b93e..16dac6e7fd2 100644 --- a/.github/workflows/upgrade_downgrade_test_semi_sync.yml +++ b/.github/workflows/upgrade_downgrade_test_semi_sync.yml @@ -35,7 +35,7 @@ jobs: - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 @@ -49,7 +49,7 @@ jobs: - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -70,13 +70,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version: 1.22.7 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -107,7 +107,7 @@ jobs: # Checkout to the last release of Vitess - name: Check out other version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} @@ -129,7 +129,7 @@ jobs: # Checkout to this build's commit - name: Check out commit's code if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get dependencies for this commit if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/vitess_tester_vtgate.yml b/.github/workflows/vitess_tester_vtgate.yml index 0c2965fee9c..4946130158a 100644 --- a/.github/workflows/vitess_tester_vtgate.yml +++ b/.github/workflows/vitess_tester_vtgate.yml @@ -16,7 +16,7 @@ env: jobs: build: name: Run endtoend tests on Vitess Tester (vtgate) - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -45,11 +45,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -57,7 +57,7 @@ jobs: end_to_end: - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - - 'go/test/endtoend/onlineddl/vrepl_suite/**' + - 'go/test/endtoend/vtgate/vitess_tester/**' - 'test.go' - 'Makefile' - 'build.env' @@ -71,13 +71,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -95,7 +95,7 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update @@ -112,7 +112,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD # install vitess tester - go install github.com/vitessio/vitess-tester@eb953122baba163ed8ccaa6642458ee984f5d7e4 + go install github.com/vitessio/vt/go/vt@e43009309f599378504905d4b804460f47822ac5 - name: Setup launchable dependencies if: steps.skip-workflow.outputs.is_draft == 'false' && steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' @@ -134,6 +134,7 @@ jobs: # which musn't be more than 107 characters long. export VTDATAROOT="/tmp/" source build.env + export NOVTADMINBUILD=1 make build set -exo pipefail @@ -141,11 +142,11 @@ jobs: i=1 for dir in ./go/test/endtoend/vtgate/vitess_tester/*/; do # We go over all the directories in the given path. - # If there is a vschema file there, we use it, otherwise we let vitess-tester autogenerate it. + # If there is a vschema file there, we use it, otherwise we let vt tester autogenerate it. if [ -f $dir/vschema.json ]; then - vitess-tester --sharded --xunit --test-dir $dir --vschema "$dir"vschema.json + vt tester --xunit --vschema "$dir"vschema.json $dir/*.test else - vitess-tester --sharded --xunit --test-dir $dir + vt tester --sharded --xunit $dir/*.test fi # Number the reports by changing their file names. mv report.xml report"$i".xml @@ -165,7 +166,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report*.xml" - show: "fail, skip" + show: "fail" diff --git a/.github/workflows/vtadmin_web_build.yml b/.github/workflows/vtadmin_web_build.yml index ccc920312c5..096b70cd002 100644 --- a/.github/workflows/vtadmin_web_build.yml +++ b/.github/workflows/vtadmin_web_build.yml @@ -16,7 +16,7 @@ permissions: read-all jobs: build: - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI run: | @@ -35,7 +35,7 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/setup-node@v4 diff --git a/.github/workflows/vtadmin_web_lint.yml b/.github/workflows/vtadmin_web_lint.yml index e40d1174953..5435b4b54fe 100644 --- a/.github/workflows/vtadmin_web_lint.yml +++ b/.github/workflows/vtadmin_web_lint.yml @@ -16,7 +16,7 @@ permissions: read-all jobs: lint: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - name: Skip CI run: | @@ -35,7 +35,7 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/setup-node@v4 diff --git a/.github/workflows/vtadmin_web_unit_tests.yml b/.github/workflows/vtadmin_web_unit_tests.yml index df1de751466..b765a68fa76 100644 --- a/.github/workflows/vtadmin_web_unit_tests.yml +++ b/.github/workflows/vtadmin_web_unit_tests.yml @@ -16,7 +16,7 @@ permissions: read-all jobs: unit-tests: - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI run: | @@ -35,7 +35,7 @@ jobs: echo Skip ${skip} echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v4 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/setup-node@v4 diff --git a/.gitignore b/.gitignore index 70ae13ad32d..e8c441d3bd7 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,4 @@ report # mise files .mise.toml +/errors/ diff --git a/.golangci.yml b/.golangci.yml index d20e7d1e9fd..e907f56743b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,5 +1,5 @@ run: - go: 1.20 + go: 1.23 timeout: 10m linters-settings: @@ -11,7 +11,38 @@ linters-settings: - pkg: "math/rand$" desc: Please use math/rand/v2 errcheck: - exclude: ./misc/errcheck_excludes.txt + exclude-functions: + - flag.Set + - (*flag.FlagSet).Parse + - (flag.Value).Set + - fmt.Fprint + - fmt.Fprintf + - io.WriteString(fmt.State) + - io.WriteString(net/http.ResponseWriter) + - (net.Listener).Close + - (net/http.ResponseWriter).Write + - (*os.File).Close + - os.Remove + - os.RemoveAll + - os.Rename + - (*github.com/spf13/cobra.Command).Help + - (*github.com/spf13/cobra.Command).MarkFlagRequired + - (*github.com/spf13/cobra.Command).MarkPersistentFlagRequired + - (*github.com/spf13/cobra.Command).MarkPersistentFlagFilename + - (*github.com/spf13/pflag.FlagSet).MarkDeprecated + - (*google.golang.org/grpc.ClientConn).Close + - (*google.golang.org/grpc.Server).Serve + - (*vitess.io/vitess/go/bytes2.Buffer).Write + - (*vitess.io/vitess/go/bytes2.Buffer).WriteByte + - (*vitess.io/vitess/go/bytes2.Buffer).WriteString + - (vitess.io/vitess/go/sqltypes.BinWriter).Write + - vitess.io/vitess/go/vt/orchestrator/external/golib/log.Errore + - vitess.io/vitess/go/vt/orchestrator/external/golib/log.Errorf + - vitess.io/vitess/go/vt/orchestrator/external/golib/log.Fatal + - vitess.io/vitess/go/vt/orchestrator/external/golib/log.Fatale + - vitess.io/vitess/go/vt/orchestrator/external/golib/log.Fatalf + - (*vitess.io/vitess/go/vt/vttest.LocalCluster).TearDown + goimports: local-prefixes: vitess.io/vitess govet: diff --git a/MAINTAINERS.md b/MAINTAINERS.md index d94ed7652ad..320ce87534b 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -24,7 +24,7 @@ The following is the full list, alphabetically ordered. deepthi, mattlord, derekperkins ### Builds -dkhenry, shlomi-noach, ajm188, vmg, GuptaManan100, frouioui +shlomi-noach, ajm188, vmg, GuptaManan100, frouioui ### Resharding rohit-nayak-ps, deepthi, mattlord @@ -54,7 +54,7 @@ deepthi, ajm188, GuptaManan100, dbussink harshit-gangal ### Kubernetes -derekperkins, dkhenry, GuptaManan100, frouioui +derekperkins, GuptaManan100, frouioui ### VTAdmin ajm188, notfelineit diff --git a/Makefile b/Makefile index e46f5d1ca5a..02c5d7b8fc0 100644 --- a/Makefile +++ b/Makefile @@ -81,6 +81,7 @@ endif bash ./build.env go build -trimpath $(EXTRA_BUILD_FLAGS) $(VT_GO_PARALLEL) \ -ldflags "$(EXTRA_BUILD_LDFLAGS) $(shell tools/build_version_flags.sh)" \ + -tags "$(EXTRA_BUILD_TAGS)" \ -o ${VTROOTBIN} ./go/... # build the vitess binaries statically @@ -94,6 +95,7 @@ endif CGO_ENABLED=0 go build \ -trimpath $(EXTRA_BUILD_FLAGS) $(VT_GO_PARALLEL) \ -ldflags "$(EXTRA_BUILD_LDFLAGS) $(shell tools/build_version_flags.sh)" \ + -tags "$(EXTRA_BUILD_TAGS)" \ -o ${VTROOTBIN} ./go/... ifndef NOVTADMINBUILD echo "Building VTAdmin Web, disable VTAdmin build by setting 'NOVTADMINBUILD'" @@ -116,6 +118,7 @@ endif CGO_ENABLED=0 GOOS=${GOOS} GOARCH=${GOARCH} go build \ -trimpath $(EXTRA_BUILD_FLAGS) $(VT_GO_PARALLEL) \ -ldflags "$(EXTRA_BUILD_LDFLAGS) $(shell tools/build_version_flags.sh)" \ + -tags "$(EXTRA_BUILD_TAGS)" \ -o ${VTROOTBIN}/${GOOS}_${GOARCH} ./go/... @if [ ! -x "${VTROOTBIN}/${GOOS}_${GOARCH}/vttablet" ]; then \ @@ -130,6 +133,7 @@ endif go build -trimpath \ $(EXTRA_BUILD_FLAGS) $(VT_GO_PARALLEL) \ -ldflags "$(EXTRA_BUILD_LDFLAGS) $(shell tools/build_version_flags.sh)" \ + -tags "$(EXTRA_BUILD_TAGS)" \ -gcflags -'N -l' \ -o ${VTROOTBIN} ./go/... @@ -280,9 +284,9 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # Please read docker/README.md to understand the different available images. # This rule builds the bootstrap images for all flavors. -DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 +DOCKER_IMAGES_FOR_TEST = mysql80 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=34 +BOOTSTRAP_VERSION=37 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go @@ -324,6 +328,7 @@ $(DOCKER_LITE_TARGETS): docker_lite_%: ${call build_docker_image,docker/lite/Dockerfile.$*,vitess/lite:$*} docker_lite_push: + echo "pushing lite image: latest" && docker push vitess/lite:latest for i in $(DOCKER_LITE_SUFFIX); do echo "pushing lite image: $$i"; docker push vitess/lite:$$i || exit 1; done docker_lite_all: docker_lite $(DOCKER_LITE_TARGETS) diff --git a/README.md b/README.md index adc8cd93c19..b1247a29469 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Go Report Card](https://goreportcard.com/badge/vitess.io/vitess)](https://goreportcard.com/report/vitess.io/vitess) [![FOSSA Status](https://app.fossa.com/api/projects/custom%2B162%2Fvitess.svg?type=shield&issueType=license)](https://app.fossa.com/projects/custom%2B162%2Fvitess?ref=badge_shield&issueType=license) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/1724/badge)](https://bestpractices.coreinfrastructure.org/projects/1724) +[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/vitessio/vitess/badge)](https://scorecard.dev/viewer/?uri=github.com/vitessio/vitess) # Vitess diff --git a/build.env b/build.env index ba741be4211..4dbe682ac79 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.22.5 || echo "Go version reported: `go version`. Version 1.22.5+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.23.2 || echo "Go version reported: `go version`. Version 1.23.2+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/changelog/18.0/18.0.6/changelog.md b/changelog/18.0/18.0.6/changelog.md new file mode 100644 index 00000000000..0e23b7ef6bc --- /dev/null +++ b/changelog/18.0/18.0.6/changelog.md @@ -0,0 +1,55 @@ +# Changelog of Vitess v18.0.6 + +### Bug fixes +#### Docker + * [release-18.0] Fix the install dependencies script in Docker (#16340) [#16345](https://github.com/vitessio/vitess/pull/16345) +#### Query Serving + * [release-18.0] fix: handle info_schema routing (#15899) [#15905](https://github.com/vitessio/vitess/pull/15905) + * [release-18.0] fix: remove keyspace when merging subqueries (#16019) [#16026](https://github.com/vitessio/vitess/pull/16026) + * [release-18.0] Fix Incorrect Optimization with LIMIT and GROUP BY (#16263) [#16266](https://github.com/vitessio/vitess/pull/16266) + * [release-18.0] planner: Handle ORDER BY inside derived tables (#16353) [#16358](https://github.com/vitessio/vitess/pull/16358) + * [release-18.0] Fix Join Predicate Cleanup Bug in Route Merging (#16386) [#16388](https://github.com/vitessio/vitess/pull/16388) +#### VReplication + * [release-18.0] vtctldclient: Apply (Shard | Keyspace| Table) Routing Rules commands don't work (#16096) [#16123](https://github.com/vitessio/vitess/pull/16123) + * [release-18.0] VDiff CLI: Fix VDiff `show` bug (#16177) [#16197](https://github.com/vitessio/vitess/pull/16197) + * [release-18.0] VReplication Workflow: set state correctly when restarting workflow streams in the copy phase (#16217) [#16221](https://github.com/vitessio/vitess/pull/16221) + * [release-18.0] VReplication: Properly handle target shards w/o a primary in Reshard (#16283) [#16290](https://github.com/vitessio/vitess/pull/16290) +#### VTTablet + * [18.x] Fix `schemacopy` collation issues [#15859](https://github.com/vitessio/vitess/pull/15859) +#### VTorc + * [release-18.0] Add timeout to all the contexts used for RPC calls in vtorc (#15991) [#16104](https://github.com/vitessio/vitess/pull/16104) +#### vtexplain + * [release-18.0] Fix `vtexplain` not handling `UNION` queries with `weight_string` results correctly. (#16129) [#16156](https://github.com/vitessio/vitess/pull/16156) +### CI/Build +#### Build/CI + * [release-18.0] Add DCO workflow (#16052) [#16055](https://github.com/vitessio/vitess/pull/16055) + * [release-18.0] Remove DCO workaround (#16087) [#16090](https://github.com/vitessio/vitess/pull/16090) + * [release-18.0] CI: Fix for xtrabackup install failures (#16329) [#16331](https://github.com/vitessio/vitess/pull/16331) +#### General + * [release-18.0] Upgrade the Golang version to `go1.21.11` [#16063](https://github.com/vitessio/vitess/pull/16063) + * [release-18.0] Upgrade the Golang version to `go1.21.12` [#16320](https://github.com/vitessio/vitess/pull/16320) +### Dependencies +#### VTAdmin + * [release-18.0] Update braces package (#16115) [#16117](https://github.com/vitessio/vitess/pull/16117) +### Internal Cleanup +#### Examples + * [release-18.0] Update env.sh so that is does not error when running on Mac (#15835) [#15914](https://github.com/vitessio/vitess/pull/15914) +### Performance +#### VTTablet + * [release-18.0] Do not load table stats when booting `vttablet`. (#15715) [#16099](https://github.com/vitessio/vitess/pull/16099) +### Regression +#### Query Serving + * [release-18.0] fix: insert on duplicate update to add list argument in the bind variables map (#15961) [#15966](https://github.com/vitessio/vitess/pull/15966) +### Release +#### General + * [release-18.0] Bump to `v18.0.6-SNAPSHOT` after the `v18.0.5` release [#15888](https://github.com/vitessio/vitess/pull/15888) + * [release-18.0] Code Freeze for `v18.0.6` [#16444](https://github.com/vitessio/vitess/pull/16444) +### Testing +#### Query Serving + * [release-18.0] test: Cleaner plan tests output (#15922) [#15923](https://github.com/vitessio/vitess/pull/15923) + * [release-18] Vitess tester workflow (#16127) [#16419](https://github.com/vitessio/vitess/pull/16419) +#### VTCombo + * [release-18.0] Fix flaky tests that use vtcombo (#16178) [#16211](https://github.com/vitessio/vitess/pull/16211) +#### vtexplain + * [release-18.0] Fix flakiness in `vtexplain` unit test case. (#16159) [#16166](https://github.com/vitessio/vitess/pull/16166) + diff --git a/changelog/18.0/18.0.6/release_notes.md b/changelog/18.0/18.0.6/release_notes.md new file mode 100644 index 00000000000..9dbeaa12276 --- /dev/null +++ b/changelog/18.0/18.0.6/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v18.0.6 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/18.0/18.0.6/changelog.md). + +The release includes 28 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/vitess-bot, @arthurschreiber, @shlomi-noach, @vitess-bot + diff --git a/changelog/18.0/18.0.7/changelog.md b/changelog/18.0/18.0.7/changelog.md new file mode 100644 index 00000000000..f9b6fd53bbc --- /dev/null +++ b/changelog/18.0/18.0.7/changelog.md @@ -0,0 +1,45 @@ +# Changelog of Vitess v18.0.7 + +### Bug fixes +#### Query Serving + * [release-18.0] bugfix: don't treat join predicates as filter predicates (#16472) [#16473](https://github.com/vitessio/vitess/pull/16473) + * [release-18.0] Fix RegisterNotifier to use a copy of the tables to prevent data races (#14716) [#16490](https://github.com/vitessio/vitess/pull/16490) + * [release-18.0] fix: reference table join merge (#16488) [#16495](https://github.com/vitessio/vitess/pull/16495) + * [release-18.0] simplify merging logic (#16525) [#16531](https://github.com/vitessio/vitess/pull/16531) + * [release-18.0] Fix query plan cache misses metric (#16562) [#16626](https://github.com/vitessio/vitess/pull/16626) + * [release-18.0] JSON Encoding: Use Type_RAW for marshalling json (#16637) [#16680](https://github.com/vitessio/vitess/pull/16680) +#### Throttler + * v18 backport: Throttler/vreplication: fix app name used by VPlayer (#16578) [#16581](https://github.com/vitessio/vitess/pull/16581) +#### VReplication + * [release-18.0] VStream API: validate that last PK has fields defined (#16478) [#16485](https://github.com/vitessio/vitess/pull/16485) +#### VTAdmin + * [release-18.0] VTAdmin: Upgrade websockets js package (#16504) [#16511](https://github.com/vitessio/vitess/pull/16511) +#### VTGate + * [release-18.0] Fix `RemoveTablet` during `TabletExternallyReparented` causing connection issues (#16371) [#16566](https://github.com/vitessio/vitess/pull/16566) +#### VTorc + * [release-18.0] FindErrantGTIDs: superset is not an errant GTID situation (#16725) [#16727](https://github.com/vitessio/vitess/pull/16727) +### CI/Build +#### General + * [release-18.0] Upgrade the Golang version to `go1.21.13` [#16545](https://github.com/vitessio/vitess/pull/16545) + * [release-18.0] Bump upgrade tests to `go1.22.7` [#16722](https://github.com/vitessio/vitess/pull/16722) +#### VTAdmin + * [release-18.0] Update micromatch to 4.0.8 (#16660) [#16665](https://github.com/vitessio/vitess/pull/16665) +### Enhancement +#### Build/CI + * [release-18.0] Improve the queries upgrade/downgrade CI workflow by using same test code version as binary (#16494) [#16500](https://github.com/vitessio/vitess/pull/16500) +#### Online DDL + * v18 backport: Online DDL: avoid SQL's `CONVERT(...)`, convert programmatically if needed [#16604](https://github.com/vitessio/vitess/pull/16604) + * [release-18.0] VReplication workflows: retry "wrong tablet type" errors (#16645) [#16651](https://github.com/vitessio/vitess/pull/16651) +### Internal Cleanup +#### Build/CI + * [release-18.0] Move from 4-cores larger runners to `ubuntu-latest` (#16714) [#16716](https://github.com/vitessio/vitess/pull/16716) +### Regression +#### Query Serving + * [release-18.0] bugfix: Allow cross-keyspace joins (#16520) [#16522](https://github.com/vitessio/vitess/pull/16522) +### Release +#### General + * [release-18.0] Bump to `v18.0.7-SNAPSHOT` after the `v18.0.6` release [#16454](https://github.com/vitessio/vitess/pull/16454) +### Testing +#### Query Serving + * [release-18.0] Replace ErrorContains checks with Error checks before running upgrade downgrade [#16701](https://github.com/vitessio/vitess/pull/16701) + diff --git a/changelog/18.0/18.0.7/release_notes.md b/changelog/18.0/18.0.7/release_notes.md new file mode 100644 index 00000000000..2e48f54ee07 --- /dev/null +++ b/changelog/18.0/18.0.7/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v18.0.7 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/18.0/18.0.7/changelog.md). + +The release includes 21 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/vitess-bot, @frouioui, @shlomi-noach, @vitess-bot + diff --git a/changelog/18.0/README.md b/changelog/18.0/README.md index 77dddf2cfbc..98d6b52589b 100644 --- a/changelog/18.0/README.md +++ b/changelog/18.0/README.md @@ -1,4 +1,12 @@ ## v18.0 +* **[18.0.7](18.0.7)** + * [Changelog](18.0.7/changelog.md) + * [Release Notes](18.0.7/release_notes.md) + +* **[18.0.6](18.0.6)** + * [Changelog](18.0.6/changelog.md) + * [Release Notes](18.0.6/release_notes.md) + * **[18.0.5](18.0.5)** * [Changelog](18.0.5/changelog.md) * [Release Notes](18.0.5/release_notes.md) diff --git a/changelog/19.0/19.0.5/changelog.md b/changelog/19.0/19.0.5/changelog.md new file mode 100644 index 00000000000..4d0a520059d --- /dev/null +++ b/changelog/19.0/19.0.5/changelog.md @@ -0,0 +1,71 @@ +# Changelog of Vitess v19.0.5 + +### Bug fixes +#### Cluster management + * [release-19.0] Use default schema reload config values when config file is empty (#16393) [#16410](https://github.com/vitessio/vitess/pull/16410) +#### Docker + * [release-19.0] Fix the install dependencies script in Docker (#16340) [#16346](https://github.com/vitessio/vitess/pull/16346) +#### Documentation + * [release-19.0] Fix the `v19.0.0` release notes and use the `vitess/lite` image for the MySQL container (#16282) [#16285](https://github.com/vitessio/vitess/pull/16285) +#### Online DDL + * [release-19.0] Online DDL shadow table: rename referenced table name in self referencing FK (#16205) [#16207](https://github.com/vitessio/vitess/pull/16207) +#### Query Serving + * [release-19.0] fix: handle info_schema routing (#15899) [#15906](https://github.com/vitessio/vitess/pull/15906) + * [release-19.0] connpool: Allow time out during shutdown (#15979) [#16003](https://github.com/vitessio/vitess/pull/16003) + * [release-19.0] fix: remove keyspace when merging subqueries (#16019) [#16027](https://github.com/vitessio/vitess/pull/16027) + * [release-19.0] Handle Nullability for Columns from Outer Tables (#16174) [#16185](https://github.com/vitessio/vitess/pull/16185) + * [release-19.0] Fix vtgate crash in group concat [#16254](https://github.com/vitessio/vitess/pull/16254) + * [release-19.0] Fix Incorrect Optimization with LIMIT and GROUP BY (#16263) [#16267](https://github.com/vitessio/vitess/pull/16267) + * [release-19.0] planner: Handle ORDER BY inside derived tables (#16353) [#16359](https://github.com/vitessio/vitess/pull/16359) + * [release-19.0] fix issue with aggregation inside of derived tables (#16366) [#16384](https://github.com/vitessio/vitess/pull/16384) + * [release-19.0] Fix Join Predicate Cleanup Bug in Route Merging (#16386) [#16389](https://github.com/vitessio/vitess/pull/16389) + * [release-19.0] Fix panic in schema tracker in presence of keyspace routing rules (#16383) [#16406](https://github.com/vitessio/vitess/pull/16406) + * [release-19.0] Fix subquery planning having an aggregation that is used in order by as long as we can merge it all into a single route (#16402) [#16407](https://github.com/vitessio/vitess/pull/16407) +#### VReplication + * [release-19.0] vtctldclient: Apply (Shard | Keyspace| Table) Routing Rules commands don't work (#16096) [#16124](https://github.com/vitessio/vitess/pull/16124) + * [release-19.0] VDiff CLI: Fix VDiff `show` bug (#16177) [#16198](https://github.com/vitessio/vitess/pull/16198) + * [release-19.0] VReplication Workflow: set state correctly when restarting workflow streams in the copy phase (#16217) [#16222](https://github.com/vitessio/vitess/pull/16222) + * [release-19.0] VReplication: Properly handle target shards w/o a primary in Reshard (#16283) [#16291](https://github.com/vitessio/vitess/pull/16291) +#### VTorc + * [release-19.0] Add timeout to all the contexts used for RPC calls in vtorc (#15991) [#16103](https://github.com/vitessio/vitess/pull/16103) +#### vtexplain + * [release-19.0] Fix `vtexplain` not handling `UNION` queries with `weight_string` results correctly. (#16129) [#16157](https://github.com/vitessio/vitess/pull/16157) +### CI/Build +#### Build/CI + * [release-19.0] Add DCO workflow (#16052) [#16056](https://github.com/vitessio/vitess/pull/16056) + * [release-19.0] Remove DCO workaround (#16087) [#16091](https://github.com/vitessio/vitess/pull/16091) + * [release-19.0] CI: Fix for xtrabackup install failures (#16329) [#16332](https://github.com/vitessio/vitess/pull/16332) +#### General + * [release-19.0] Upgrade the Golang version to `go1.22.4` [#16061](https://github.com/vitessio/vitess/pull/16061) + * [release-19.0] Upgrade the Golang version to `go1.22.5` [#16322](https://github.com/vitessio/vitess/pull/16322) +#### VTAdmin + * [release-19.0] Update VTAdmin build script (#15839) [#15850](https://github.com/vitessio/vitess/pull/15850) +### Dependencies +#### VTAdmin + * [release-19.0] Update braces package (#16115) [#16118](https://github.com/vitessio/vitess/pull/16118) +### Internal Cleanup +#### Examples + * [release-19.0] Update env.sh so that is does not error when running on Mac (#15835) [#15915](https://github.com/vitessio/vitess/pull/15915) +### Performance +#### VTTablet + * [release-19.0] Do not load table stats when booting `vttablet`. (#15715) [#16100](https://github.com/vitessio/vitess/pull/16100) +### Regression +#### Query Serving + * [release-19.0] fix: derived table join column expression to be part of add join predicate on rewrite (#15956) [#15960](https://github.com/vitessio/vitess/pull/15960) + * [release-19.0] fix: insert on duplicate update to add list argument in the bind variables map (#15961) [#15967](https://github.com/vitessio/vitess/pull/15967) + * [release-19.0] fix: order by subquery planning (#16049) [#16132](https://github.com/vitessio/vitess/pull/16132) + * [release-19.0] feat: add a LIMIT 1 on EXISTS subqueries to limit network overhead (#16153) [#16191](https://github.com/vitessio/vitess/pull/16191) +### Release +#### General + * [release-19.0] Bump to `v19.0.5-SNAPSHOT` after the `v19.0.4` release [#15889](https://github.com/vitessio/vitess/pull/15889) +### Testing +#### Build/CI + * Run more test on release-19 branch [#16152](https://github.com/vitessio/vitess/pull/16152) +#### Query Serving + * [release-19.0] test: Cleaner plan tests output (#15922) [#15964](https://github.com/vitessio/vitess/pull/15964) + * [release-19] Vitess tester workflow (#16127) [#16418](https://github.com/vitessio/vitess/pull/16418) +#### VTCombo + * [release-19.0] Fix flaky tests that use vtcombo (#16178) [#16212](https://github.com/vitessio/vitess/pull/16212) +#### vtexplain + * [release-19.0] Fix flakiness in `vtexplain` unit test case. (#16159) [#16167](https://github.com/vitessio/vitess/pull/16167) + diff --git a/changelog/19.0/19.0.5/release_notes.md b/changelog/19.0/19.0.5/release_notes.md new file mode 100644 index 00000000000..5df66930dd1 --- /dev/null +++ b/changelog/19.0/19.0.5/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v19.0.5 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/19.0/19.0.5/changelog.md). + +The release includes 40 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/vitess-bot, @harshit-gangal, @systay, @vitess-bot + diff --git a/changelog/19.0/19.0.6/changelog.md b/changelog/19.0/19.0.6/changelog.md new file mode 100644 index 00000000000..3a3506ac1ff --- /dev/null +++ b/changelog/19.0/19.0.6/changelog.md @@ -0,0 +1,48 @@ +# Changelog of Vitess v19.0.6 + +### Bug fixes +#### Query Serving + * [release-19.0] bugfix: don't treat join predicates as filter predicates (#16472) [#16474](https://github.com/vitessio/vitess/pull/16474) + * [release-19.0] fix: reference table join merge (#16488) [#16496](https://github.com/vitessio/vitess/pull/16496) + * [release-19.0] simplify merging logic (#16525) [#16532](https://github.com/vitessio/vitess/pull/16532) + * [release-19.0] Fix: Offset planning in hash joins (#16540) [#16551](https://github.com/vitessio/vitess/pull/16551) + * [release-19.0] Fix query plan cache misses metric (#16562) [#16627](https://github.com/vitessio/vitess/pull/16627) + * [release-19.0] JSON Encoding: Use Type_RAW for marshalling json (#16637) [#16681](https://github.com/vitessio/vitess/pull/16681) +#### Throttler + * v19 backport: Throttler/vreplication: fix app name used by VPlayer (#16578) [#16580](https://github.com/vitessio/vitess/pull/16580) +#### VReplication + * [release-19.0] VStream API: validate that last PK has fields defined (#16478) [#16486](https://github.com/vitessio/vitess/pull/16486) +#### VTAdmin + * [release-19.0] VTAdmin: Upgrade websockets js package (#16504) [#16512](https://github.com/vitessio/vitess/pull/16512) +#### VTGate + * [release-19.0] Fix `RemoveTablet` during `TabletExternallyReparented` causing connection issues (#16371) [#16567](https://github.com/vitessio/vitess/pull/16567) +#### VTorc + * [release-19.0] FindErrantGTIDs: superset is not an errant GTID situation (#16725) [#16728](https://github.com/vitessio/vitess/pull/16728) +### CI/Build +#### General + * [release-19.0] Upgrade the Golang version to `go1.22.6` [#16543](https://github.com/vitessio/vitess/pull/16543) +#### VTAdmin + * [release-19.0] Update micromatch to 4.0.8 (#16660) [#16666](https://github.com/vitessio/vitess/pull/16666) +### Enhancement +#### Build/CI + * [release-19.0] Improve the queries upgrade/downgrade CI workflow by using same test code version as binary (#16494) [#16501](https://github.com/vitessio/vitess/pull/16501) +#### Online DDL + * [release-19.0] VReplication workflows: retry "wrong tablet type" errors (#16645) [#16652](https://github.com/vitessio/vitess/pull/16652) +### Internal Cleanup +#### Build/CI + * [release-19.0] Move from 4-cores larger runners to `ubuntu-latest` (#16714) [#16717](https://github.com/vitessio/vitess/pull/16717) +#### Docker + * [release-19.0] Remove mysql57/percona57 bootstrap images (#16620) [#16622](https://github.com/vitessio/vitess/pull/16622) +### Performance +#### Online DDL + * v19 backport: Online DDL: avoid SQL's `CONVERT(...)`, convert programmatically if needed [#16603](https://github.com/vitessio/vitess/pull/16603) +### Regression +#### Query Serving + * [release-19.0] bugfix: Allow cross-keyspace joins (#16520) [#16523](https://github.com/vitessio/vitess/pull/16523) +### Release +#### General + * [release-19.0] Bump to `v19.0.6-SNAPSHOT` after the `v19.0.5` release [#16456](https://github.com/vitessio/vitess/pull/16456) +### Testing +#### Query Serving + * [release-19.0] Replace ErrorContains checks with Error checks before running upgrade downgrade [#16700](https://github.com/vitessio/vitess/pull/16700) + diff --git a/changelog/19.0/19.0.6/release_notes.md b/changelog/19.0/19.0.6/release_notes.md new file mode 100644 index 00000000000..422bb50d1eb --- /dev/null +++ b/changelog/19.0/19.0.6/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v19.0.6 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/19.0/19.0.6/changelog.md). + +The release includes 21 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/vitess-bot, @shlomi-noach, @systay, @vitess-bot + diff --git a/changelog/19.0/README.md b/changelog/19.0/README.md index b5c6489f101..cd43ee9bbd3 100644 --- a/changelog/19.0/README.md +++ b/changelog/19.0/README.md @@ -1,4 +1,12 @@ ## v19.0 +* **[19.0.6](19.0.6)** + * [Changelog](19.0.6/changelog.md) + * [Release Notes](19.0.6/release_notes.md) + +* **[19.0.5](19.0.5)** + * [Changelog](19.0.5/changelog.md) + * [Release Notes](19.0.5/release_notes.md) + * **[19.0.4](19.0.4)** * [Changelog](19.0.4/changelog.md) * [Release Notes](19.0.4/release_notes.md) diff --git a/changelog/20.0/20.0.1/changelog.md b/changelog/20.0/20.0.1/changelog.md new file mode 100644 index 00000000000..fc420a61eec --- /dev/null +++ b/changelog/20.0/20.0.1/changelog.md @@ -0,0 +1,40 @@ +# Changelog of Vitess v20.0.1 + +### Bug fixes +#### Cluster management + * Fix Downgrade problem from v20 in semi-sync plugin [#16357](https://github.com/vitessio/vitess/pull/16357) + * [release-20.0] Use default schema reload config values when config file is empty (#16393) [#16411](https://github.com/vitessio/vitess/pull/16411) +#### Docker + * [release-20.0] Fix the install dependencies script in Docker (#16340) [#16347](https://github.com/vitessio/vitess/pull/16347) +#### Documentation + * [release-20.0] Fix the `v19.0.0` release notes and use the `vitess/lite` image for the MySQL container (#16282) [#16286](https://github.com/vitessio/vitess/pull/16286) +#### Query Serving + * [release-20.0] Fix Incorrect Optimization with LIMIT and GROUP BY (#16263) [#16268](https://github.com/vitessio/vitess/pull/16268) + * [release-20.0] planner: Handle ORDER BY inside derived tables (#16353) [#16360](https://github.com/vitessio/vitess/pull/16360) + * [release-20.0] fix issue with aggregation inside of derived tables (#16366) [#16385](https://github.com/vitessio/vitess/pull/16385) + * [release-20.0] Fix Join Predicate Cleanup Bug in Route Merging (#16386) [#16390](https://github.com/vitessio/vitess/pull/16390) + * [release-20.0] Fix panic in user defined aggregation functions planning (#16398) [#16404](https://github.com/vitessio/vitess/pull/16404) + * [release-20.0] Fix panic in schema tracker in presence of keyspace routing rules (#16383) [#16405](https://github.com/vitessio/vitess/pull/16405) + * [release-20.0] Fix subquery planning having an aggregation that is used in order by as long as we can merge it all into a single route (#16402) [#16408](https://github.com/vitessio/vitess/pull/16408) +#### VReplication + * [release-20.0] VReplication: Properly handle target shards w/o a primary in Reshard (#16283) [#16292](https://github.com/vitessio/vitess/pull/16292) + * [release-20.0] VDiff: Copy non in_keyrange workflow filters to target tablet query (#16307) [#16315](https://github.com/vitessio/vitess/pull/16315) +### CI/Build +#### Build/CI + * [release-20.0] CI: Fix for xtrabackup install failures (#16329) [#16333](https://github.com/vitessio/vitess/pull/16333) +#### General + * [release-20.0] Upgrade the Golang version to `go1.22.5` [#16323](https://github.com/vitessio/vitess/pull/16323) +### Internal Cleanup +#### Documentation + * [release-20.0] Add a note on `QueryCacheHits` and `QueryCacheMisses` in the release notes (#16299) [#16306](https://github.com/vitessio/vitess/pull/16306) +#### General + * [release-20.0] Update post release `v20.0.0` [#16287](https://github.com/vitessio/vitess/pull/16287) +### Release +#### General + * [release-20.0-rc] Bump to `v20.0.1-SNAPSHOT` after the `v20.0.0` release [#16275](https://github.com/vitessio/vitess/pull/16275) + * [release-20.0] Bump to `v20.0.1-SNAPSHOT` after the `v20.0.0` release [#16276](https://github.com/vitessio/vitess/pull/16276) +### Testing +#### Query Serving + * [release-20.0] fix flaky test TestQueryTimeoutWithShardTargeting (#16150) [#16179](https://github.com/vitessio/vitess/pull/16179) + * [release-20] Vitess tester workflow (#16127) [#16417](https://github.com/vitessio/vitess/pull/16417) + diff --git a/changelog/20.0/20.0.1/release_notes.md b/changelog/20.0/20.0.1/release_notes.md new file mode 100644 index 00000000000..f9f3d04937a --- /dev/null +++ b/changelog/20.0/20.0.1/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v20.0.1 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/20.0/20.0.1/changelog.md). + +The release includes 21 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/vitess-bot, @frouioui, @shlomi-noach, @vitess-bot + diff --git a/changelog/20.0/20.0.2/changelog.md b/changelog/20.0/20.0.2/changelog.md new file mode 100644 index 00000000000..8433070b6ed --- /dev/null +++ b/changelog/20.0/20.0.2/changelog.md @@ -0,0 +1,52 @@ +# Changelog of Vitess v20.0.2 + +### Bug fixes +#### Query Serving + * [release-20.0] bugfix: don't treat join predicates as filter predicates (#16472) [#16475](https://github.com/vitessio/vitess/pull/16475) + * [release-20.0] fix: reference table join merge (#16488) [#16497](https://github.com/vitessio/vitess/pull/16497) + * [release-20.0] simplify merging logic (#16525) [#16533](https://github.com/vitessio/vitess/pull/16533) + * [release-20.0] Fix: Offset planning in hash joins (#16540) [#16552](https://github.com/vitessio/vitess/pull/16552) + * [release-20.0] Fix query plan cache misses metric (#16562) [#16628](https://github.com/vitessio/vitess/pull/16628) + * [release-20.0] Fix race conditions in the concatenate engine streaming (#16640) [#16648](https://github.com/vitessio/vitess/pull/16648) + * [release-20.0] JSON Encoding: Use Type_RAW for marshalling json (#16637) [#16682](https://github.com/vitessio/vitess/pull/16682) +#### Throttler + * v20 backport: Throttler/vreplication: fix app name used by VPlayer (#16578) [#16579](https://github.com/vitessio/vitess/pull/16579) +#### VReplication + * [release-20.0] VStream API: validate that last PK has fields defined (#16478) [#16487](https://github.com/vitessio/vitess/pull/16487) + * [release-20.0] VReplication: Properly ignore errors from trying to drop tables that don't exist (#16505) [#16561](https://github.com/vitessio/vitess/pull/16561) +#### VTAdmin + * [release-20.0] VTAdmin: Upgrade websockets js package (#16504) [#16513](https://github.com/vitessio/vitess/pull/16513) +#### VTGate + * [release-20.0] Fix `RemoveTablet` during `TabletExternallyReparented` causing connection issues (#16371) [#16568](https://github.com/vitessio/vitess/pull/16568) +#### VTorc + * [release-20.0] FindErrantGTIDs: superset is not an errant GTID situation (#16725) [#16729](https://github.com/vitessio/vitess/pull/16729) +### CI/Build +#### Docker + * [release-20.0] Fix `docker_lite_push` make target (#16662) [#16668](https://github.com/vitessio/vitess/pull/16668) +#### General + * [release-20.0] Upgrade the Golang version to `go1.22.6` [#16546](https://github.com/vitessio/vitess/pull/16546) + * [release-20.0] Upgrade the Golang version to `go1.22.7` [#16719](https://github.com/vitessio/vitess/pull/16719) +#### VTAdmin + * [release-20.0] Update micromatch to 4.0.8 (#16660) [#16667](https://github.com/vitessio/vitess/pull/16667) +### Enhancement +#### Build/CI + * [release-20.0] Improve the queries upgrade/downgrade CI workflow by using same test code version as binary (#16494) [#16502](https://github.com/vitessio/vitess/pull/16502) +#### Online DDL + * [release-20.0] VReplication workflows: retry "wrong tablet type" errors (#16645) [#16653](https://github.com/vitessio/vitess/pull/16653) +### Internal Cleanup +#### Build/CI + * [release-20.0] Move from 4-cores larger runners to `ubuntu-latest` (#16714) [#16718](https://github.com/vitessio/vitess/pull/16718) +#### Docker + * [release-20.0] Remove mysql57/percona57 bootstrap images (#16620) [#16623](https://github.com/vitessio/vitess/pull/16623) +### Performance +#### Online DDL + * v20 backport: Online DDL: avoid SQL's `CONVERT(...)`, convert programmatically if needed [#16602](https://github.com/vitessio/vitess/pull/16602) +### Regression +#### Query Serving + * [release-20.0] bugfix: Allow cross-keyspace joins (#16520) [#16524](https://github.com/vitessio/vitess/pull/16524) +### Testing +#### Build/CI + * [release-20.0] Fix error contain checks in vtgate package (#16672) [#16677](https://github.com/vitessio/vitess/pull/16677) +#### Query Serving + * [release-20.0] Replace ErrorContains checks with Error checks before running upgrade downgrade [#16699](https://github.com/vitessio/vitess/pull/16699) + diff --git a/changelog/20.0/20.0.2/release_notes.md b/changelog/20.0/20.0.2/release_notes.md new file mode 100644 index 00000000000..de580ad9bb2 --- /dev/null +++ b/changelog/20.0/20.0.2/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v20.0.2 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/20.0/20.0.2/changelog.md). + +The release includes 25 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/vitess-bot, @shlomi-noach, @vitess-bot + diff --git a/changelog/20.0/README.md b/changelog/20.0/README.md index a143396b60c..f8e12c1d453 100644 --- a/changelog/20.0/README.md +++ b/changelog/20.0/README.md @@ -1,4 +1,12 @@ ## v20.0 +* **[20.0.2](20.0.2)** + * [Changelog](20.0.2/changelog.md) + * [Release Notes](20.0.2/release_notes.md) + +* **[20.0.1](20.0.1)** + * [Changelog](20.0.1/changelog.md) + * [Release Notes](20.0.1/release_notes.md) + * **[20.0.0](20.0.0)** * [Changelog](20.0.0/changelog.md) * [Release Notes](20.0.0/release_notes.md) diff --git a/changelog/21.0/21.0.0/changelog.md b/changelog/21.0/21.0.0/changelog.md new file mode 100644 index 00000000000..32b09e1344e --- /dev/null +++ b/changelog/21.0/21.0.0/changelog.md @@ -0,0 +1,473 @@ +# Changelog of Vitess v21.0.0 + +### Bug fixes +#### ACL + * Fix ACL checks for CTEs [#16642](https://github.com/vitessio/vitess/pull/16642) +#### Backup and Restore + * fixing issue with xtrabackup and long gtids [#16304](https://github.com/vitessio/vitess/pull/16304) + * Fix `xtrabackup`/`builtin` context when doing `AddFiles` [#16806](https://github.com/vitessio/vitess/pull/16806) + * Fail fast when builtinbackup fails to restore a single file [#16856](https://github.com/vitessio/vitess/pull/16856) + * [release-21.0] fix releasing the global read lock when mysqlshell backup fails (#17000) [#17012](https://github.com/vitessio/vitess/pull/17012) +#### Build/CI + * Fix echo command in build docker images workflow [#16350](https://github.com/vitessio/vitess/pull/16350) + * CI: Remove build docker images CI action until we figure out if that it is affecting our rate limits [#16759](https://github.com/vitessio/vitess/pull/16759) + * Fix golang upgrade workflow [#16890](https://github.com/vitessio/vitess/pull/16890) +#### Cluster management + * Use default schema reload config values when config file is empty [#16393](https://github.com/vitessio/vitess/pull/16393) + * fix: Use authentication_policy to specify default auth plugin for MySQL 8.4 [#16426](https://github.com/vitessio/vitess/pull/16426) + * [Direct PR] [release-21.0] Revert Errant GTID detection in vttablets [#17019](https://github.com/vitessio/vitess/pull/17019) +#### Docker + * Fix the install dependencies script in Docker [#16340](https://github.com/vitessio/vitess/pull/16340) +#### Documentation + * Fix the `v19.0.0` release notes and use the `vitess/lite` image for the MySQL container [#16282](https://github.com/vitessio/vitess/pull/16282) +#### Examples + * Example operator 401_scheduled_backups.yaml incorrect keyspace [#16732](https://github.com/vitessio/vitess/pull/16732) + * small fixes for docker-compose setup [#16818](https://github.com/vitessio/vitess/pull/16818) +#### Observability + * VReplication: Estimate lag when workflow fully throttled [#16577](https://github.com/vitessio/vitess/pull/16577) +#### Online DDL + * Online DDL: Fail a --in-order-completion migration, if a _prior_ migration within the same context is 'failed' or 'cancelled' [#16071](https://github.com/vitessio/vitess/pull/16071) + * Ensure that we check the correct collation for foreign keys [#16109](https://github.com/vitessio/vitess/pull/16109) + * Online DDL shadow table: rename referenced table name in self referencing FK [#16205](https://github.com/vitessio/vitess/pull/16205) + * Online DDL: do not update last_throttled_timestamp with zero value [#16395](https://github.com/vitessio/vitess/pull/16395) + * Support `SHOW VITESS_MIGRATIONS` from inside a transaction [#16399](https://github.com/vitessio/vitess/pull/16399) +#### Query Serving + * Fix dual merging in outer join queries [#15959](https://github.com/vitessio/vitess/pull/15959) + * Handle single sharded keyspaces for analysis [#16068](https://github.com/vitessio/vitess/pull/16068) + * Fix schemadiff semantics handling [#16073](https://github.com/vitessio/vitess/pull/16073) + * `schemadiff`: only compare column collations if of textual type [#16138](https://github.com/vitessio/vitess/pull/16138) + * Handle Nullability for Columns from Outer Tables [#16174](https://github.com/vitessio/vitess/pull/16174) + * fix: rows affected count for multi table update for non-literal column value [#16181](https://github.com/vitessio/vitess/pull/16181) + * Correct Handling of UNION Queries with Literals in the Vitess Planner [#16227](https://github.com/vitessio/vitess/pull/16227) + * Parsing `Json_arrayagg` and `Json_objectagg` to allow some queries to work [#16251](https://github.com/vitessio/vitess/pull/16251) + * Fix Incorrect Optimization with LIMIT and GROUP BY [#16263](https://github.com/vitessio/vitess/pull/16263) + * planner: Handle ORDER BY inside derived tables [#16353](https://github.com/vitessio/vitess/pull/16353) + * fix issue with aggregation inside of derived tables [#16366](https://github.com/vitessio/vitess/pull/16366) + * Fix Join Predicate Cleanup Bug in Route Merging [#16386](https://github.com/vitessio/vitess/pull/16386) + * Fix panic in user defined aggregation functions planning [#16398](https://github.com/vitessio/vitess/pull/16398) + * Fix subquery planning having an aggregation that is used in order by as long as we can merge it all into a single route [#16402](https://github.com/vitessio/vitess/pull/16402) + * bugfix: don't treat join predicates as filter predicates [#16472](https://github.com/vitessio/vitess/pull/16472) + * fix: reference table join merge [#16488](https://github.com/vitessio/vitess/pull/16488) + * fix: sequence table next value acl permission to writer role [#16509](https://github.com/vitessio/vitess/pull/16509) + * fix: show tables to use any keyspace on system schema [#16521](https://github.com/vitessio/vitess/pull/16521) + * simplify merging logic [#16525](https://github.com/vitessio/vitess/pull/16525) + * Fix: Offset planning in hash joins [#16540](https://github.com/vitessio/vitess/pull/16540) + * Fix query plan cache misses metric [#16562](https://github.com/vitessio/vitess/pull/16562) + * Atomic Transaction bug fix with PRS disruption [#16576](https://github.com/vitessio/vitess/pull/16576) + * JSON Encoding: Use Type_RAW for marshalling json [#16637](https://github.com/vitessio/vitess/pull/16637) + * Fix race conditions in the concatenate engine streaming [#16640](https://github.com/vitessio/vitess/pull/16640) + * Fix Precedence rule for Tilda op [#16649](https://github.com/vitessio/vitess/pull/16649) + * fix sizegen so it handles type aliases [#16650](https://github.com/vitessio/vitess/pull/16650) + * Fix race condition that prevents queries from being buffered after vtgate startup [#16655](https://github.com/vitessio/vitess/pull/16655) + * Fix data race in keyspace event watcher [#16683](https://github.com/vitessio/vitess/pull/16683) + * fix: DDL comments to be recorded in AST [#16774](https://github.com/vitessio/vitess/pull/16774) + * vtgate: Use the time zone setting correctly [#16824](https://github.com/vitessio/vitess/pull/16824) + * VTTablet: smartconnpool: notify all expired waiters [#16897](https://github.com/vitessio/vitess/pull/16897) + * [release-21.0] fix issue with json unmarshalling of operators with space in them [#16933](https://github.com/vitessio/vitess/pull/16933) + * [release-21.0] VTGate MoveTables Buffering: Fix panic when buffering is disabled (#16922) [#16936](https://github.com/vitessio/vitess/pull/16936) + * [release-21.0] fixes bugs around expression precedence and LIKE (#16934) [#16947](https://github.com/vitessio/vitess/pull/16947) + * [release-21.0] [Direct PR] bugfix: add HAVING columns inside derived tables (#16976) [#16980](https://github.com/vitessio/vitess/pull/16980) +#### Schema Tracker + * Log and ignore the error in reading udfs in schema tracker [#16630](https://github.com/vitessio/vitess/pull/16630) +#### Throttler + * Tablet throttler: remove cached metric associated with removed tablet [#16555](https://github.com/vitessio/vitess/pull/16555) + * Throttler/vreplication: fix app name used by VPlayer [#16578](https://github.com/vitessio/vitess/pull/16578) +#### VReplication + * vtctldclient: Fix Apply (Shard | Keyspace| Table) Routing Rules commands [#16096](https://github.com/vitessio/vitess/pull/16096) + * CI Bug: Rename shard name back to match existing workflow file for vreplication_migrate_vdiff2_convert_tz [#16148](https://github.com/vitessio/vitess/pull/16148) + * VReplication: handle escaped identifiers in vschema when initializing sequence tables [#16169](https://github.com/vitessio/vitess/pull/16169) + * VDiff CLI: Fix VDiff `show` bug [#16177](https://github.com/vitessio/vitess/pull/16177) + * CI flaky test: Fix flakiness in vreplication_migrate_vdiff2_convert_tz [#16180](https://github.com/vitessio/vitess/pull/16180) + * VReplication Workflow: set state correctly when restarting workflow streams in the copy phase [#16217](https://github.com/vitessio/vitess/pull/16217) + * VReplication: Properly handle target shards w/o a primary in Reshard [#16283](https://github.com/vitessio/vitess/pull/16283) + * VDiff: Copy non in_keyrange workflow filters to target tablet query [#16307](https://github.com/vitessio/vitess/pull/16307) + * VReplication: disable use of `session_track_gtids` [#16424](https://github.com/vitessio/vitess/pull/16424) + * VStream API: validate that last PK has fields defined [#16478](https://github.com/vitessio/vitess/pull/16478) + * VReplication: Properly ignore errors from trying to drop tables that don't exist [#16505](https://github.com/vitessio/vitess/pull/16505) + * VReplication: Return lock error everywhere that LockName fails [#16560](https://github.com/vitessio/vitess/pull/16560) + * VReplication: Gather source positions once we know all writes are done during traffic switch [#16572](https://github.com/vitessio/vitess/pull/16572) + * VTGate VStream: Ensure reasonable delivery time for reshard journal event [#16639](https://github.com/vitessio/vitess/pull/16639) + * Workflow Status: change logic to determine whether `MoveTables` writes are switched [#16731](https://github.com/vitessio/vitess/pull/16731) + * Migrate Workflow: Scope vindex names correctly when target and source keyspace have different names [#16769](https://github.com/vitessio/vitess/pull/16769) + * VReplication: Support both vindex col def formats when initing target sequences [#16862](https://github.com/vitessio/vitess/pull/16862) + * [release-21.0] fix: Infinite logs in case of non-existent stream logs (#17004) [#17014](https://github.com/vitessio/vitess/pull/17014) + * [release-21.0] VReplication: Support reversing read-only traffic in vtctldclient (#16920) [#17015](https://github.com/vitessio/vitess/pull/17015) + * [release-21.0] Use proper zstd decoder pool for binlog event compression handling (#17042) [#17045](https://github.com/vitessio/vitess/pull/17045) +#### VTAdmin + * VTAdmin: Upgrade websockets js package [#16504](https://github.com/vitessio/vitess/pull/16504) + * VTAdmin: Fix serve-handler's path-to-regexp dep and add default schema refresh [#16778](https://github.com/vitessio/vitess/pull/16778) +#### VTCombo + * vtcombo: close query service on drop database [#16606](https://github.com/vitessio/vitess/pull/16606) +#### VTGate + * Fix `RemoveTablet` during `TabletExternallyReparented` causing connection issues [#16371](https://github.com/vitessio/vitess/pull/16371) + * Fix panic in schema tracker in presence of keyspace routing rules [#16383](https://github.com/vitessio/vitess/pull/16383) + * [release-21.0] Fix deadlock between health check and topology watcher (#16995) [#17010](https://github.com/vitessio/vitess/pull/17010) +#### VTTablet + * Fix race in `replicationLagModule` of `go/vt/throttle` [#16078](https://github.com/vitessio/vitess/pull/16078) +#### VTorc + * FindErrantGTIDs: superset is not an errant GTID situation [#16725](https://github.com/vitessio/vitess/pull/16725) + * Remember all tablets in VTOrc [#16888](https://github.com/vitessio/vitess/pull/16888) +#### schema management + * `schemadiff`: fix index/foreign-key apply scenario [#16698](https://github.com/vitessio/vitess/pull/16698) +#### vtctldclient + * [release-21.0] Fix flag name typo from #16852 (#16921) [#16923](https://github.com/vitessio/vitess/pull/16923) +#### vtexplain + * Fix `vtexplain` not handling `UNION` queries with `weight_string` results correctly. [#16129](https://github.com/vitessio/vitess/pull/16129) +#### vttestserver + * parse transaction timeout as duration [#16338](https://github.com/vitessio/vitess/pull/16338) +### CI/Build +#### Backup and Restore + * `backup_pitr` CI: validate rejoining replication stream [#16807](https://github.com/vitessio/vitess/pull/16807) +#### Build/CI + * Add DCO workflow [#16052](https://github.com/vitessio/vitess/pull/16052) + * Remove DCO workaround [#16087](https://github.com/vitessio/vitess/pull/16087) + * CI: Fix for xtrabackup install failures [#16329](https://github.com/vitessio/vitess/pull/16329) + * CI: rename `TestSchemaChange` to distinguish the tests [#16694](https://github.com/vitessio/vitess/pull/16694) + * CI: Use valid tag for the ossf-scorecard action [#16730](https://github.com/vitessio/vitess/pull/16730) + * `endtoend`: better error reporting in Online DDL MySQL execution tests [#16786](https://github.com/vitessio/vitess/pull/16786) + * Docker Images Build CI action: add updated version from release-20.0 back in prep for v21 release [#16799](https://github.com/vitessio/vitess/pull/16799) + * Use `go-version-file: go.mod` in CI [#16841](https://github.com/vitessio/vitess/pull/16841) + * [release-21.0] Flakes: Address flakes in TestMoveTables* unit tests (#16942) [#16951](https://github.com/vitessio/vitess/pull/16951) +#### Docker + * Docker: Update node vtadmin version [#16147](https://github.com/vitessio/vitess/pull/16147) + * Fix `docker_lite_push` make target [#16662](https://github.com/vitessio/vitess/pull/16662) + * [release-21.0] Build `vttestserver` in GHA and send Slack message on Docker Build failure (#16963) [#17047](https://github.com/vitessio/vitess/pull/17047) +#### General + * [main] Upgrade the Golang version to `go1.22.4` [#16062](https://github.com/vitessio/vitess/pull/16062) + * [main] Upgrade the Golang version to `go1.22.5` [#16319](https://github.com/vitessio/vitess/pull/16319) + * Update Golang to `1.23.0` [#16599](https://github.com/vitessio/vitess/pull/16599) + * [main] Upgrade the Golang version to `go1.23.1` [#16720](https://github.com/vitessio/vitess/pull/16720) + * [main] Upgrade the Golang version to `go1.23.2` [#16891](https://github.com/vitessio/vitess/pull/16891) +#### Online DDL + * CI: increase timeout for Online DDL foreign key stress tests [#16203](https://github.com/vitessio/vitess/pull/16203) + * CI: wait-for rather than 'assume' in Online DDL flow [#16210](https://github.com/vitessio/vitess/pull/16210) + * A couple changes in Online DDL CI [#16272](https://github.com/vitessio/vitess/pull/16272) +#### VReplication + * CI: Lower resources used for TestVtctldMigrateSharded [#16875](https://github.com/vitessio/vitess/pull/16875) + * [release-21.0] VReplication: Restore previous minimal e2e test behavior (#17016) [#17017](https://github.com/vitessio/vitess/pull/17017) +#### VTAdmin + * Update micromatch to 4.0.8 [#16660](https://github.com/vitessio/vitess/pull/16660) +#### VTGate + * CI: testing self referencing tables in foreign key stress tests [#16216](https://github.com/vitessio/vitess/pull/16216) +### Dependencies +#### General + * Upgrade the Golang Dependencies [#16194](https://github.com/vitessio/vitess/pull/16194) + * Upgrade the Golang Dependencies [#16302](https://github.com/vitessio/vitess/pull/16302) + * Upgrade the Golang Dependencies [#16379](https://github.com/vitessio/vitess/pull/16379) + * Upgrade the Golang Dependencies [#16514](https://github.com/vitessio/vitess/pull/16514) + * Upgrade the Golang Dependencies [#16600](https://github.com/vitessio/vitess/pull/16600) + * Upgrade the Golang Dependencies [#16691](https://github.com/vitessio/vitess/pull/16691) + * Upgrade the Golang Dependencies [#16785](https://github.com/vitessio/vitess/pull/16785) +#### Java + * Bump com.google.protobuf:protobuf-java from 3.24.3 to 3.25.5 in /java [#16809](https://github.com/vitessio/vitess/pull/16809) + * [release-21.0] Bump commons-io:commons-io from 2.7 to 2.14.0 in /java (#16889) [#16932](https://github.com/vitessio/vitess/pull/16932) +#### VTAdmin + * Update braces package [#16115](https://github.com/vitessio/vitess/pull/16115) + * VTAdmin: Address security vuln in path-to-regexp node pkg [#16770](https://github.com/vitessio/vitess/pull/16770) +### Documentation +#### Documentation + * Changelog 20.0: Fix broken links [#16048](https://github.com/vitessio/vitess/pull/16048) + * copy editing changes to summary [#16880](https://github.com/vitessio/vitess/pull/16880) + * Add blurb about experimental 8.4 support [#16886](https://github.com/vitessio/vitess/pull/16886) + * [release-21.0] Add missing changelog for PR #16852 (#17002) [#17006](https://github.com/vitessio/vitess/pull/17006) +#### General + * release notes: update dml related release notes [#16241](https://github.com/vitessio/vitess/pull/16241) +#### Query Serving + * [Direct PR][release note]: Atomic Distributed Transaction [#17079](https://github.com/vitessio/vitess/pull/17079) +#### VReplication + * Release docs: Add vreplication related entries to the v20 summary [#16259](https://github.com/vitessio/vitess/pull/16259) +#### VTTablet + * clarify collations are also supported for `db_charset` [#16423](https://github.com/vitessio/vitess/pull/16423) +### Enhancement +#### Build/CI + * Improve the queries upgrade/downgrade CI workflow by using same test code version as binary [#16494](https://github.com/vitessio/vitess/pull/16494) + * [release-21.0] Change upgrade test to still use the older version of tests (#16937) [#16970](https://github.com/vitessio/vitess/pull/16970) +#### CLI + * Support specifying expected primary in ERS/PRS [#16852](https://github.com/vitessio/vitess/pull/16852) +#### Cluster management + * Prefer replicas that have innodb buffer pool populated in PRS [#16374](https://github.com/vitessio/vitess/pull/16374) + * Allow cross cell promotion in PRS [#16461](https://github.com/vitessio/vitess/pull/16461) + * Fix: Errant GTID detection on the replicas when they set replication source [#16833](https://github.com/vitessio/vitess/pull/16833) + * [release-21.0] [Direct PR] Add RPC to read the reparent journal position [#16982](https://github.com/vitessio/vitess/pull/16982) + * [Direct PR] [release-21.0] Augment `PrimaryStatus` to also send Server UUID [#17032](https://github.com/vitessio/vitess/pull/17032) +#### Docker + * Remove the `bootstrap` dependency on the Docker images we ship [#16339](https://github.com/vitessio/vitess/pull/16339) +#### Evalengine + * evalengine: Implement `PERIOD_ADD` [#16492](https://github.com/vitessio/vitess/pull/16492) + * evalengine: Implement `PERIOD_DIFF` [#16557](https://github.com/vitessio/vitess/pull/16557) +#### General + * Add MySQL 8.4 unit tests [#16440](https://github.com/vitessio/vitess/pull/16440) + * Added the scorecard github action and its badge [#16538](https://github.com/vitessio/vitess/pull/16538) +#### Online DDL + * `schemadiff`: improved diff ordering with various foreign key strategies [#16081](https://github.com/vitessio/vitess/pull/16081) + * Online DDL: `ALTER VITESS_MIGRATION CLEANUP ALL` [#16314](https://github.com/vitessio/vitess/pull/16314) + * Online DDL: ensure high `lock_wait_timeout` in Vreplication cut-over [#16601](https://github.com/vitessio/vitess/pull/16601) + * Online DDL: new `message_timestamp` column in `schema_migrations` table [#16633](https://github.com/vitessio/vitess/pull/16633) + * Online DDL: better support for subsecond `--force-cut-over-after` DDL strategy flag value. [#16635](https://github.com/vitessio/vitess/pull/16635) + * VReplication workflows: retry "wrong tablet type" errors [#16645](https://github.com/vitessio/vitess/pull/16645) +#### Query Serving + * Add parsing support for `ANY`/`SOME`/`ALL` comparison modifiers. [#16080](https://github.com/vitessio/vitess/pull/16080) + * VIndexes: Stop recommending md5 based vindex types as md5 is considered insecure [#16113](https://github.com/vitessio/vitess/pull/16113) + * feat: make the arguments print themselves with type info [#16232](https://github.com/vitessio/vitess/pull/16232) + * Group Concat function support for separator [#16237](https://github.com/vitessio/vitess/pull/16237) + * Prevent Early Ordering Pushdown to Enable Aggregation Pushdown to MySQL [#16278](https://github.com/vitessio/vitess/pull/16278) + * Add new mysql connection drain [#16298](https://github.com/vitessio/vitess/pull/16298) + * Improve typing during query planning [#16310](https://github.com/vitessio/vitess/pull/16310) + * Fail on prepare of reserved connection [#16316](https://github.com/vitessio/vitess/pull/16316) + * make sure to add weight_string for the right expression [#16325](https://github.com/vitessio/vitess/pull/16325) + * flow based tablet load balancer [#16351](https://github.com/vitessio/vitess/pull/16351) + * feat: remove ORDER BY from inside derived table [#16354](https://github.com/vitessio/vitess/pull/16354) + * Implement parser support for all select modifiers [#16396](https://github.com/vitessio/vitess/pull/16396) + * Handle dual queries with LIMIT on the vtgate [#16400](https://github.com/vitessio/vitess/pull/16400) + * Complex Expression handling for uncorrelated IN and NOT IN subqueries [#16439](https://github.com/vitessio/vitess/pull/16439) + * Add basic vector support for MySQL 9.x [#16464](https://github.com/vitessio/vitess/pull/16464) + * allow innodb_lock_wait_timeout as system variable [#16574](https://github.com/vitessio/vitess/pull/16574) + * Add command to see the unresolved transactions [#16589](https://github.com/vitessio/vitess/pull/16589) + * Reject TwoPC calls if semi-sync is not enabled [#16608](https://github.com/vitessio/vitess/pull/16608) + * Additional recursive CTE work [#16616](https://github.com/vitessio/vitess/pull/16616) + * DDL allowed outside of transaction in vttablet [#16661](https://github.com/vitessio/vitess/pull/16661) + * `BinlogEvent`: publish `ServerID()` function [#16713](https://github.com/vitessio/vitess/pull/16713) + * feat: authoritative query timeout for vttablet from vtgate [#16735](https://github.com/vitessio/vitess/pull/16735) + * Add `vexplain trace` [#16768](https://github.com/vitessio/vitess/pull/16768) + * Count how many shards were hit by routes when using `vexplain` [#16802](https://github.com/vitessio/vitess/pull/16802) + * Add VEXPLAIN KEYS for improved sharding key selection [#16830](https://github.com/vitessio/vitess/pull/16830) + * reject atomic distributed transaction on savepoints and modified system settings [#16835](https://github.com/vitessio/vitess/pull/16835) + * Making Reshard work smoothly with Atomic Transactions [#16844](https://github.com/vitessio/vitess/pull/16844) + * Query serving: incorporate mirror query results in log stats, fix mirror query max lag bug [#16879](https://github.com/vitessio/vitess/pull/16879) + * Enhanced output for vexplain keys [#16892](https://github.com/vitessio/vitess/pull/16892) +#### Throttler + * Tablet throttler: multi-metric support [#15988](https://github.com/vitessio/vitess/pull/15988) + * Throttler: return app name in check result, synthesize "why throttled" explanation from result [#16416](https://github.com/vitessio/vitess/pull/16416) + * Throttler: `SelfMetric` interface, simplify adding new throttler metrics [#16469](https://github.com/vitessio/vitess/pull/16469) + * Throttler: `CheckThrottlerResponseCode` to replace HTTP status codes [#16491](https://github.com/vitessio/vitess/pull/16491) + * Deprecate `UpdateThrottlerConfig`'s `--check-as-check-self` and `--check-as-check-shard` flags [#16507](https://github.com/vitessio/vitess/pull/16507) + * `mysqld` system metrics, with `TabletManager` rpc [#16850](https://github.com/vitessio/vitess/pull/16850) +#### VReplication + * VReplication: Improve handling of vplayer stalls [#15797](https://github.com/vitessio/vitess/pull/15797) + * VReplication: LookupVindex create use existing artifacts when possible [#16097](https://github.com/vitessio/vitess/pull/16097) + * VReplication: use new topo named locks and TTL override for workflow coordination [#16260](https://github.com/vitessio/vitess/pull/16260) + * VReplication: Handle large binlog compressed transactions more efficiently [#16328](https://github.com/vitessio/vitess/pull/16328) + * VReplication: make flags workflow-specific and dynamically changeable [#16583](https://github.com/vitessio/vitess/pull/16583) + * VDiff: Improve row diff handling in report [#16618](https://github.com/vitessio/vitess/pull/16618) + * VDiff: Add control for start/resume and stop [#16654](https://github.com/vitessio/vitess/pull/16654) + * VReplication: Force flag for traffic switching [#16709](https://github.com/vitessio/vitess/pull/16709) + * VReplication: Replace most usage of SimulatedNulls [#16734](https://github.com/vitessio/vitess/pull/16734) + * VReplication: Add VTGate VStreamFlag to include journal events in the stream [#16737](https://github.com/vitessio/vitess/pull/16737) + * VReplication: Validate min set of user permissions in traffic switch prechecks [#16762](https://github.com/vitessio/vitess/pull/16762) + * Materialize workflow support for reference tables [#16787](https://github.com/vitessio/vitess/pull/16787) + * VReplication: Undo vschema changes on LookupVindex workflow creation fail [#16810](https://github.com/vitessio/vitess/pull/16810) + * VReplication: Support automatically replacing auto_inc cols with sequences [#16860](https://github.com/vitessio/vitess/pull/16860) +#### VTAdmin + * VTAdmin: Initiate workflow details tab [#16570](https://github.com/vitessio/vitess/pull/16570) + * VTAdmin: Workflow status endpoint [#16587](https://github.com/vitessio/vitess/pull/16587) + * VTAdmin(API): Add workflow start/stop endpoint [#16658](https://github.com/vitessio/vitess/pull/16658) + * VTAdmin: Distributed transactions list on VTAdmin [#16793](https://github.com/vitessio/vitess/pull/16793) + * [Release 21.0] [Direct PR] Conclude txn in VTAdmin and `GetUnresolvedTransactions` bug fix [#16949](https://github.com/vitessio/vitess/pull/16949) +#### VTCombo + * VTCombo: Ensure VSchema exists when creating keyspace [#16094](https://github.com/vitessio/vitess/pull/16094) +#### VTGate + * VStream API: allow keyspace-level heartbeats to be streamed [#16593](https://github.com/vitessio/vitess/pull/16593) +#### VTTablet + * Heartbeat writer can always generate on-demand leased heartbeats, even if not at all configured [#16014](https://github.com/vitessio/vitess/pull/16014) + * Add tablet-tags/`--init_tags` stats [#16695](https://github.com/vitessio/vitess/pull/16695) + * Add `ChangeTabletTags` RPC to `vtctl`, `ChangeTags` RPC to `vttablet` [#16857](https://github.com/vitessio/vitess/pull/16857) +#### VTorc + * Errant GTID Counts metric in VTOrc [#16829](https://github.com/vitessio/vitess/pull/16829) +#### schema management + * `schemadiff`: Online DDL support, declarative based [#16462](https://github.com/vitessio/vitess/pull/16462) + * `shcemadiff`: support `INSTANT` DDL for changing column visibility [#16503](https://github.com/vitessio/vitess/pull/16503) + * SidecarDB: Don't ignore table charset and collation [#16670](https://github.com/vitessio/vitess/pull/16670) + * schemadiff: more `INSTANT` algorithm considerations [#16678](https://github.com/vitessio/vitess/pull/16678) + * schemadiff: reject non-deterministic function in new column's default value [#16684](https://github.com/vitessio/vitess/pull/16684) + * schemadiff: reject `uuid_short` and `random_bytes` in new column expression [#16692](https://github.com/vitessio/vitess/pull/16692) +#### vtctldclient + * Add `vtctldclient` container image [#16318](https://github.com/vitessio/vitess/pull/16318) +#### web UI + * VTAdmin(web): Add workflow start/stop actions [#16675](https://github.com/vitessio/vitess/pull/16675) + * VTAdmin(web): Some tweaks in the workflow details [#16706](https://github.com/vitessio/vitess/pull/16706) + * VTAdmin(web): Initiate MoveTables workflow create screen [#16707](https://github.com/vitessio/vitess/pull/16707) +### Feature +#### Backup and Restore + * adding new mysql shell backup engine [#16295](https://github.com/vitessio/vitess/pull/16295) + * select backup engine in Backup() and ignore engines in RestoreFromBackup() [#16428](https://github.com/vitessio/vitess/pull/16428) +#### Query Serving + * add support for vtgate traffic mirroring (queryserving) [#15992](https://github.com/vitessio/vitess/pull/15992) + * rpc: retrieve unresolved transactions [#16356](https://github.com/vitessio/vitess/pull/16356) + * Transaction watcher and notifier [#16363](https://github.com/vitessio/vitess/pull/16363) + * Distributed Transaction Resolver [#16381](https://github.com/vitessio/vitess/pull/16381) + * Support recursive CTEs [#16427](https://github.com/vitessio/vitess/pull/16427) + * Query to read transaction state [#16431](https://github.com/vitessio/vitess/pull/16431) + * Modify distributed transaction commit flow [#16468](https://github.com/vitessio/vitess/pull/16468) + * vttablet api distributed transaction changes [#16506](https://github.com/vitessio/vitess/pull/16506) + * Atomic Transactions correctness with PRS, ERS and MySQL & Vttablet Restarts [#16553](https://github.com/vitessio/vitess/pull/16553) + * Reject atomic distributed transaction on a network connection [#16584](https://github.com/vitessio/vitess/pull/16584) + * Atomic Transactions handling with Online DDL [#16585](https://github.com/vitessio/vitess/pull/16585) + * Multiple changes on Distributed Transaction user apis [#16788](https://github.com/vitessio/vitess/pull/16788) + * Distributed Transaction: Action on commit prepared or redo prepared failure [#16803](https://github.com/vitessio/vitess/pull/16803) +#### VTAdmin + * VTAdmin: Show throttled status in workflows [#16308](https://github.com/vitessio/vitess/pull/16308) +#### vtctldclient + * add support for vtgate traffic mirroring [#15945](https://github.com/vitessio/vitess/pull/15945) + * Add Unresolved Transactions command in vtctld service [#16679](https://github.com/vitessio/vitess/pull/16679) + * Add conclude transaction command to vtctld service [#16693](https://github.com/vitessio/vitess/pull/16693) +### Internal Cleanup +#### Backup and Restore + * builtinbackup: log during restore as restore, not as backup [#16483](https://github.com/vitessio/vitess/pull/16483) + * Migrate the S3 SDK from v1 to v2 [#16664](https://github.com/vitessio/vitess/pull/16664) +#### Build/CI + * Add `release-20.0` to the list of branches to upgrade the Go version on [#16053](https://github.com/vitessio/vitess/pull/16053) + * Use new way of specifying test files to the vitess-tester [#16233](https://github.com/vitessio/vitess/pull/16233) + * Remove unnecessary node install step in local/region examples workflow [#16293](https://github.com/vitessio/vitess/pull/16293) + * fix: fixed the pinned-dependencies [#16612](https://github.com/vitessio/vitess/pull/16612) + * Fix go.mod files [#16625](https://github.com/vitessio/vitess/pull/16625) + * Move from 4-cores larger runners to `ubuntu-latest` [#16714](https://github.com/vitessio/vitess/pull/16714) +#### CLI + * SetShardTabletControl: Improve flag help output [#16376](https://github.com/vitessio/vitess/pull/16376) + * Move concurrent connection dial limit out of `healthcheck`. [#16378](https://github.com/vitessio/vitess/pull/16378) +#### Cluster management + * Remove unused parameters in reparent code and add CheckLockShard calls [#16312](https://github.com/vitessio/vitess/pull/16312) +#### Docker + * Remove unnecessary Docker build workflows [#16196](https://github.com/vitessio/vitess/pull/16196) + * Remove mysql57/percona57 bootstrap images [#16620](https://github.com/vitessio/vitess/pull/16620) +#### Documentation + * Update eol-process.md [#16249](https://github.com/vitessio/vitess/pull/16249) + * Add a note on `QueryCacheHits` and `QueryCacheMisses` in the release notes [#16299](https://github.com/vitessio/vitess/pull/16299) + * Add release notes for the new connection drain (+ use dashes instead of underscore) [#16334](https://github.com/vitessio/vitess/pull/16334) + * Remove specific Kubernetes version instructions and link to the Vites… [#16610](https://github.com/vitessio/vitess/pull/16610) +#### Examples + * Remove docker_local from Makefile [#16335](https://github.com/vitessio/vitess/pull/16335) +#### General + * Deprecated metrics deletion [#16086](https://github.com/vitessio/vitess/pull/16086) + * No usage of math/rand [#16264](https://github.com/vitessio/vitess/pull/16264) + * [cleanup] Protos: Use UnmarshalPB() when unmarshalling a proto object [#16311](https://github.com/vitessio/vitess/pull/16311) + * Update golangci-lint to newer faster version [#16636](https://github.com/vitessio/vitess/pull/16636) + * Remove the vitess-mixin [#16657](https://github.com/vitessio/vitess/pull/16657) + * bug: fix slice init length [#16674](https://github.com/vitessio/vitess/pull/16674) + * Fix generated proto [#16702](https://github.com/vitessio/vitess/pull/16702) + * Update part of codebase to use new for := range syntax [#16738](https://github.com/vitessio/vitess/pull/16738) + * Remove former maintainer from areas of expertise section [#16801](https://github.com/vitessio/vitess/pull/16801) +#### Governance + * Add `timvaillancourt` to some `CODEOWNERS` paths [#16107](https://github.com/vitessio/vitess/pull/16107) + * Fix the email in `pom.xml` [#16111](https://github.com/vitessio/vitess/pull/16111) +#### Online DDL + * Online DDL internal cleanup: using formal statements as opposed to textual SQL [#16230](https://github.com/vitessio/vitess/pull/16230) + * Online DDL: remove legacy (and ancient) 'REVERT ' syntax [#16301](https://github.com/vitessio/vitess/pull/16301) +#### Query Serving + * refactor: cleaner cloning API [#16079](https://github.com/vitessio/vitess/pull/16079) + * `schemadiff` small internal refactor: formalizing column charset/collation [#16239](https://github.com/vitessio/vitess/pull/16239) + * sqlparser: Remove unneeded escaping [#16255](https://github.com/vitessio/vitess/pull/16255) + * Fix codegen [#16257](https://github.com/vitessio/vitess/pull/16257) + * deprecate queryserver-enable-settings-pool flag [#16280](https://github.com/vitessio/vitess/pull/16280) + * Cleanup: Health Stream removed db pool usage [#16336](https://github.com/vitessio/vitess/pull/16336) + * Remove JSON annotations [#16437](https://github.com/vitessio/vitess/pull/16437) + * Remove some unused MySQL 5.6 code [#16465](https://github.com/vitessio/vitess/pull/16465) + * Small internal cleanups [#16467](https://github.com/vitessio/vitess/pull/16467) + * vindex function: error when keyspace not selected [#16534](https://github.com/vitessio/vitess/pull/16534) + * Planner cleaning: cleanup and refactor [#16569](https://github.com/vitessio/vitess/pull/16569) + * Add resultsObserver to ScatterConn [#16638](https://github.com/vitessio/vitess/pull/16638) + * Fix error code received from vttablets on context expiration [#16685](https://github.com/vitessio/vitess/pull/16685) +#### Throttler + * Throttler code: some refactoring and cleanup [#16368](https://github.com/vitessio/vitess/pull/16368) +#### Topology + * Topology Server Locking Refactor [#16005](https://github.com/vitessio/vitess/pull/16005) +#### VReplication + * VReplication: Improve table plan builder errors [#16588](https://github.com/vitessio/vitess/pull/16588) + * VReplication: Improve replication plan builder and event application errors [#16596](https://github.com/vitessio/vitess/pull/16596) +#### VTAdmin + * Remove unused `formatRelativeTime` import [#16549](https://github.com/vitessio/vitess/pull/16549) + * VTAdmin: Upgrade deps to address security vulns [#16843](https://github.com/vitessio/vitess/pull/16843) +#### VTGate + * Support passing filters to `discovery.NewHealthCheck(...)` [#16170](https://github.com/vitessio/vitess/pull/16170) +#### VTTablet + * `txthrottler`: move `ThrottlerInterface` to `go/vt/throttler`, use `slices` pkg, add stats [#16248](https://github.com/vitessio/vitess/pull/16248) + * Deprecate vttablet metrics `QueryCacheXX` and rename to `QueryPlanCacheXX` [#16289](https://github.com/vitessio/vitess/pull/16289) +#### schema management + * `schemadiff`/Online DDL internal refactor [#16767](https://github.com/vitessio/vitess/pull/16767) +#### vtctldclient + * VReplication: Add custom logger support to Workflow Server [#16547](https://github.com/vitessio/vitess/pull/16547) +### Performance +#### Backup and Restore + * mysqlctl: open backup files with fadvise(2) and FADV_SEQUENTIAL [#16441](https://github.com/vitessio/vitess/pull/16441) +#### Online DDL + * Online DDL: avoid SQL's `CONVERT(...)`, convert programmatically if needed [#16597](https://github.com/vitessio/vitess/pull/16597) +#### Performance + * go/mysql: use clear builtin for zerofill [#16348](https://github.com/vitessio/vitess/pull/16348) + * go/mysql: improve GTID encoding for OK packet [#16361](https://github.com/vitessio/vitess/pull/16361) +#### Query Serving + * go/mysql: performance optimizations in protocol encoding [#16341](https://github.com/vitessio/vitess/pull/16341) + * go/vt/sqlparser: improve performance in TrackedBuffer formatting [#16364](https://github.com/vitessio/vitess/pull/16364) + * `schemadiff`: optimize permutation evaluation [#16435](https://github.com/vitessio/vitess/pull/16435) + * Performance improvements - Planner [#16631](https://github.com/vitessio/vitess/pull/16631) + * Optimize Operator Input Handling [#16689](https://github.com/vitessio/vitess/pull/16689) + * Small fix to decrease memory allocation [#16791](https://github.com/vitessio/vitess/pull/16791) +### Regression +#### Query Serving + * fix: order by subquery planning [#16049](https://github.com/vitessio/vitess/pull/16049) + * feat: add a LIMIT 1 on EXISTS subqueries to limit network overhead [#16153](https://github.com/vitessio/vitess/pull/16153) + * bugfix: Allow cross-keyspace joins [#16520](https://github.com/vitessio/vitess/pull/16520) + * [release-21.0] [Direct PR] fix: route engine to handle column truncation for execute after lookup (#16981) [#16986](https://github.com/vitessio/vitess/pull/16986) + * [release-21.0] Add support for `MultiEqual` opcode for lookup vindexes. (#16975) [#17041](https://github.com/vitessio/vitess/pull/17041) +### Release +#### Build/CI + * [release-21.0] Fix the release workflow (#16964) [#17020](https://github.com/vitessio/vitess/pull/17020) +#### General + * [main] Copy `v20.0.0-RC1` release notes [#16140](https://github.com/vitessio/vitess/pull/16140) + * [main] Copy `v20.0.0-RC2` release notes [#16234](https://github.com/vitessio/vitess/pull/16234) + * [main] Copy `v20.0.0` release notes [#16273](https://github.com/vitessio/vitess/pull/16273) + * [main] Copy `v18.0.6` release notes [#16453](https://github.com/vitessio/vitess/pull/16453) + * [main] Copy `v19.0.5` release notes [#16455](https://github.com/vitessio/vitess/pull/16455) + * [main] Copy `v20.0.1` release notes [#16457](https://github.com/vitessio/vitess/pull/16457) + * [main] Copy `v18.0.7` release notes [#16746](https://github.com/vitessio/vitess/pull/16746) + * [main] Copy `v19.0.6` release notes [#16752](https://github.com/vitessio/vitess/pull/16752) + * [main] Copy `v20.0.2` release notes [#16755](https://github.com/vitessio/vitess/pull/16755) + * [release-21.0] Code Freeze for `v21.0.0-RC1` [#16912](https://github.com/vitessio/vitess/pull/16912) + * [release-21.0] Release of `v21.0.0-RC1` [#16950](https://github.com/vitessio/vitess/pull/16950) + * [release-21.0] Bump to `v21.0.0-SNAPSHOT` after the `v21.0.0-RC1` release [#16955](https://github.com/vitessio/vitess/pull/16955) + * [release-21.0] Release of `v21.0.0-RC2` [#17022](https://github.com/vitessio/vitess/pull/17022) + * [release-21.0] Bump to `v21.0.0-SNAPSHOT` after the `v21.0.0-RC2` release [#17049](https://github.com/vitessio/vitess/pull/17049) + * [release-21.0] Add release notes for known issue in v21.0.0 [#17067](https://github.com/vitessio/vitess/pull/17067) +### Testing +#### Build/CI + * Online DDL flow CI: Update golang version to 1.22.4 [#16066](https://github.com/vitessio/vitess/pull/16066) + * Run the static checks workflow if the file changes [#16659](https://github.com/vitessio/vitess/pull/16659) + * Fix error contain checks in vtgate package [#16672](https://github.com/vitessio/vitess/pull/16672) + * Don't show skipped tests in summary action [#16859](https://github.com/vitessio/vitess/pull/16859) +#### Cluster management + * Add semi-sync plugin test in main [#16372](https://github.com/vitessio/vitess/pull/16372) + * [release-21.0] Flaky test fixes (#16940) [#16960](https://github.com/vitessio/vitess/pull/16960) +#### General + * CI Summary Addition [#16143](https://github.com/vitessio/vitess/pull/16143) + * Add Summary in unit-race workflow [#16164](https://github.com/vitessio/vitess/pull/16164) + * Allow for MySQL 8.4 in endtoend tests [#16885](https://github.com/vitessio/vitess/pull/16885) +#### Query Serving + * `schemadiff`: adding a FK dependency unit test [#16069](https://github.com/vitessio/vitess/pull/16069) + * Adding Distributed Transaction Test [#16114](https://github.com/vitessio/vitess/pull/16114) + * Vitess tester workflow [#16127](https://github.com/vitessio/vitess/pull/16127) + * fix flaky test TestQueryTimeoutWithShardTargeting [#16150](https://github.com/vitessio/vitess/pull/16150) + * test: Remove unreachable test skipping [#16265](https://github.com/vitessio/vitess/pull/16265) + * Make sure end to end test actually tests the fix [#16277](https://github.com/vitessio/vitess/pull/16277) + * Skip running vtadmin build for vitess tester workflow [#16459](https://github.com/vitessio/vitess/pull/16459) + * Fuzzer testing for 2PC transactions [#16476](https://github.com/vitessio/vitess/pull/16476) + * Move tables with atomic transactions [#16676](https://github.com/vitessio/vitess/pull/16676) + * Replace ErrorContains checks with Error checks before running upgrade downgrade [#16688](https://github.com/vitessio/vitess/pull/16688) + * Fix upgrade test in release-20 by skipping tests [#16705](https://github.com/vitessio/vitess/pull/16705) + * Reduce flakiness in TwoPC testing [#16712](https://github.com/vitessio/vitess/pull/16712) + * fix distributed transactions disruptions test with move table [#16765](https://github.com/vitessio/vitess/pull/16765) + * Add a test to verify we respect the overall query timeout [#16800](https://github.com/vitessio/vitess/pull/16800) + * flaky test fix for query timeout change [#16821](https://github.com/vitessio/vitess/pull/16821) + * Fix error message check on query timeout [#16827](https://github.com/vitessio/vitess/pull/16827) + * upgrade vitess-tester to latest version [#16884](https://github.com/vitessio/vitess/pull/16884) + * Relax vexplain test for upcoming changes [#17035](https://github.com/vitessio/vitess/pull/17035) +#### Throttler + * Throttler flaky test: explicitly disabling throttler so as to ensure it does not re-enable [#16369](https://github.com/vitessio/vitess/pull/16369) +#### VReplication + * Multi-tenant Movetables: add e2e test for vdiff [#16309](https://github.com/vitessio/vitess/pull/16309) + * VReplication workflow package: unit tests for StreamMigrator, Mount et al [#16498](https://github.com/vitessio/vitess/pull/16498) + * CI: Temporarily skip flaky TestMoveTablesUnsharded [#16812](https://github.com/vitessio/vitess/pull/16812) +#### VTCombo + * Fix flaky tests that use vtcombo [#16178](https://github.com/vitessio/vitess/pull/16178) +#### vtexplain + * Fix flakiness in `vtexplain` unit test case. [#16159](https://github.com/vitessio/vitess/pull/16159) +#### vttestserver + * Flaky test fix `TestCanGetKeyspaces` [#16214](https://github.com/vitessio/vitess/pull/16214) + diff --git a/changelog/21.0/21.0.0/release_notes.md b/changelog/21.0/21.0.0/release_notes.md new file mode 100644 index 00000000000..6fe295fbb3b --- /dev/null +++ b/changelog/21.0/21.0.0/release_notes.md @@ -0,0 +1,263 @@ +# Release of Vitess v21.0.0 +## Summary + +### Table of Contents + +- **[Known Issues](#known-issues)** + - **[Backup reports itself as successful despite failures](#backup-reports-as-successful)** +- **[Major Changes](#major-changes)** + - **[Deprecations and Deletions](#deprecations-and-deletions)** + - [Deprecated VTTablet Flags](#vttablet-flags) + - [Deletion of deprecated metrics](#metric-deletion) + - [Deprecated Metrics](#deprecations-metrics) + - **[Traffic Mirroring](#traffic-mirroring)** + - **[Atomic Distributed Transaction Support](#atomic-transaction)** + - **[New VTGate Shutdown Behavior](#new-vtgate-shutdown-behavior)** + - **[Tablet Throttler: Multi-Metric support](#tablet-throttler)** + - **[Allow Cross Cell Promotion in PRS](#allow-cross-cell)** + - **[Support for recursive CTEs](#recursive-cte)** + - **[VTGate Tablet Balancer](#tablet-balancer)** + - **[Query Timeout Override](#query-timeout)** + - **[New Backup Engine](#new-backup-engine)** + - **[Dynamic VReplication Configuration](#dynamic-vreplication-configuration)** + - **[Reference Table Materialization](#reference-table-materialization)** + - **[New VEXPLAIN Modes: TRACE and KEYS](#new-vexplain-modes)** + - **[Automatically Replace MySQL auto_increment Clauses with Vitess Sequences](#auto-replace-mysql-autoinc-with-seq)** + - **[Experimental MySQL 8.4 support](#experimental-mysql-84)** + - **[Current Errant GTIDs Count Metric](#errant-gtid-metric)** + - **[vtctldclient ChangeTabletTags](#vtctldclient-changetablettags)** + - **[Support for specifying expected primary in reparents](#reparents-expectedprimary)** + +## Known Issues + +### Backup reports itself as successful despite failures + +In this release, we have identified an issue where a backup may succeed even if one of the underlying files fails to be backed up. +The underlying errors are ignored and the backup action reports success. +This issue exists only with the `builtin` backup engine, and it can occur only when the engine has already started backing up all files. +Please refer to https://github.com/vitessio/vitess/issues/17063 for more details. + +## Major Changes + +### Deprecations and Deletions + +#### Deprecated VTTablet Flags + +- `queryserver-enable-settings-pool` flag, added in `v15`, has been on by default since `v17`. + It is now deprecated and will be removed in a future release. + +#### Deletion of deprecated metrics + +The following VTOrc metrics were deprecated in `v20`. They have now been deleted. + +| Metric Name | +|:--------------------------------------------:| +| `analysis.change.write` | +| `audit.write` | +| `discoveries.attempt` | +| `discoveries.fail` | +| `discoveries.instance_poll_seconds_exceeded` | +| `discoveries.queue_length` | +| `discoveries.recent_count` | +| `instance.read` | +| `instance.read_topology` | +| `emergency_reparent_counts` | +| `planned_reparent_counts` | +| `reparent_shard_operation_timings` | + +#### Deprecated Metrics + +The following metrics are now deprecated and will be deleted in a future release, please use their replacements. + +| Component | Metric Name | Replaced By | +|------------|:---------------------:|:-------------------------------:| +| `vttablet` | `QueryCacheLength` | `QueryEnginePlanCacheLength` | +| `vttablet` | `QueryCacheSize` | `QueryEnginePlanCacheSize` | +| `vttablet` | `QueryCacheCapacity` | `QueryEnginePlanCacheCapacity` | +| `vttablet` | `QueryCacheEvictions` | `QueryEnginePlanCacheEvictions` | +| `vttablet` | `QueryCacheHits` | `QueryEnginePlanCacheHits` | +| `vttablet` | `QueryCacheMisses` | `QueryEnginePlanCacheMisses` | + +### Traffic Mirroring + +Traffic mirroring is intended to help reduce some of the uncertainty inherent to `MoveTables SwitchTraffic`. When +traffic mirroring is enabled, VTGate will mirror a percentage of traffic from one keyspace to another. + +Mirror rules may be enabled through `vtctldclient` with `MoveTables MirrorTraffic`. For example: + +```bash +$ vtctldclient --server :15999 MoveTables --target-keyspace customer --workflow commerce2customer MirrorTraffic --percent 5.0 +``` + +Mirror rules can be inspected with `GetMirrorRules`. + +### Atomic Distributed Transaction Support + +We have introduced atomic distributed transactions as an experimental feature. +Users can now run multi-shard transactions with stronger guarantees. +Vitess now provides two modes of transactional guarantees for multi-shard transactions: Best Effort and Atomic. +These can be selected based on the user’s requirements and the trade-offs they are willing to make. + +Follow the documentation to enable [Atomic Distributed Transaction](https://vitess.io/docs/21.0/reference/features/distributed-transaction/) + +For more details on the implementation and trade-offs, please refer to the [RFC](https://github.com/vitessio/vitess/issues/16245) + +### New VTGate Shutdown Behavior + +We added a new option to VTGate to disallow new connections while VTGate is shutting down, +while allowing existing connections to finish their work until they manually disconnect or until +the `--onterm_timeout` is reached, without getting a `Server shutdown in progress` error. + +This new behavior can be enabled by specifying the new `--mysql-server-drain-onterm` flag to VTGate. + +You can find more information about this option in the [RFC](https://github.com/vitessio/vitess/issues/15971). + +### Tablet Throttler: Multi-Metric support + +Up until `v20`, the tablet throttler would only monitor and use a single metric. That would be replication lag, by +default, or could be the result of a custom query. In this release, we introduce a major redesign so that the throttler +monitors and uses multiple metrics at the same time, including the above two. + +The default behavior now is to monitor all metrics, but only use `lag` (if the custom query is undefined) or the `custom` +metric (if the custom query is defined). This is backwards-compatible with `v20`. A `v20` `PRIMARY` is compatible with +a `v21` `REPLICA`, and a `v21` `PRIMARY` is compatible with a `v20` `REPLICA`. + +However, it is now possible to assign any combination of one or more metrics for a given app. The throttler +would then accept or reject the app's requests based on the health of _all_ assigned metrics. We have provided a pre-defined +list of metrics: + +- `lag`: replication lag based on heartbeat injection. +- `threads_running`: concurrent active threads on the MySQL server. +- `loadavg`: per core load average measured on the tablet instance/pod. +- `custom`: the result of a custom query executed on the MySQL server. + +Each metric has a default threshold which can be overridden by the `UpdateThrottlerConfig` command. + +The throttler also supports the catch-all `"all"` app name, and it is thus possible to assign metrics to **all** apps. +Explicit app to metric assignments will override the catch-all configuration. + +Metrics are assigned a default _scope_, which could be `self` (isolated to the tablet) or `shard` (max, aka **worst** +value among shard tablets). It is further possible to require a different scope for each metric. + +### Allow Cross Cell Promotion in PRS + +Up until now if the users wanted to promote a replica in a different cell from the current primary +using `PlannedReparentShard`, they had to specify the new primary with the `--new-primary` flag. + +We have now added a new flag `--allow-cross-cell-promotion` that lets `PlannedReparentShard` choose a primary in a +different cell even if no new primary is provided explicitly. + +### Experimental support for recursive CTEs + +We have added experimental support for recursive CTEs in Vitess. We are marking it as experimental because it is not yet +fully tested and may have some limitations. We are looking for feedback from the community to improve this feature. + +### VTGate Tablet Balancer + +When a VTGate routes a query and has multiple available tablets for a given shard / tablet type (e.g. REPLICA), the +current default behavior routes the query with local cell affinity and round robin policy. The VTGate Tablet Balancer +provides an alternate mechanism that routes queries to maintain an even distribution of query load to each tablet, while +preferentially routing to tablets in the same cell as the VTGate. + +The tablet balancer is enabled by a new flag `--enable-balancer` and configured by `--balancer-vtgate-cells` +and `--balancer-keyspaces`. + +See the [RFC ](https://github.com/vitessio/vitess/issues/12241) for more details on the design and configuration of this feature. + +### Query Timeout Override + +VTGate sends an authoritative query timeout to VTTablet when the `QUERY_TIMEOUT_MS` comment directive, +`query_timeout` session system variable, or `query-timeout` flag is set. +The order of precedence is: comment directive > session variable > VTGate flag. +VTTablet overrides its default query timeout with the value received from VTGate. +All timeouts are specified in milliseconds. + +When a query is executed inside a transaction, there is an additional nuance. The actual timeout used will be the smaller +of the transaction timeout and the query timeout. + +A query can also be set to have no timeout by using the `QUERY_TIMEOUT_MS` comment directive with a value of `0`. + +Example usage: +`select /*vt+ QUERY_TIMEOUT_MS=30 */ col from tbl` + +### New Backup Engine (EXPERIMENTAL) + +We are introducing a new backup engine for logical backups in order to support use cases that require something other +than physical backups. This feature is experimental and is based on [MySQL Shell](https://dev.mysql.com/doc/mysql-shell/8.0/en/). + +The new engine is enabled by using `--backup_engine_implementation=mysqlshell`. There are other options that are required, +so please read the [documentation](https://vitess.io/docs/21.0/user-guides/operating-vitess/backup-and-restore/creating-a-backup/) to learn which options are required and how to configure them. + +### Dynamic VReplication Configuration + +Previously, many of the configuration options for VReplication Workflows had to be provided using VTTablet flags. This +meant that any change to VReplication configuration required restarting VTTablets. We now allow these to be overridden +while creating a workflow or dynamically after the workflow is already in progress. + +### Reference Table Materialization + +There is a new option in [`Materialize` workflows](https://vitess.io/docs/reference/vreplication/materialize/) to keep a synced copy of [reference or lookup tables](https://vitess.io/docs/reference/vreplication/reference_tables/) +(countries, states, zip codes, etc) from an unsharded keyspace, which holds the source of truth for the reference +table, to all shards in a sharded keyspace. + +### New VEXPLAIN Modes: TRACE and KEYS + +#### VEXPLAIN TRACE + +The new `TRACE` mode for `VEXPLAIN` provides a detailed execution trace of queries, showing how they're processed through various +operators and interactions with tablets. This mode is particularly useful for: + +- Identifying performance bottlenecks +- Understanding query execution patterns +- Optimizing complex queries +- Debugging unexpected query behavior + +`TRACE` mode runs the query and logs all interactions, returning a JSON representation of the query execution plan with additional +statistics like number of calls, average rows processed, and number of shards queried. + +#### VEXPLAIN KEYS + +The `KEYS` mode for `VEXPLAIN` offers a concise summary of query structure, highlighting columns used in joins, filters, and +grouping operations. This information is crucial for: + +- Identifying potential sharding key candidates +- Optimizing query performance +- Analyzing query patterns to inform database design decisions + +`KEYS` mode analyzes the query structure without executing it, providing JSON output that includes grouping columns, join columns, +filter columns (potential candidates for indexes, primary keys, or sharding keys), and the statement type. + +These new `VEXPLAIN` modes enhance Vitess's query analysis capabilities, allowing for more informed decisions about sharding +strategies and query optimization. + +### Automatically Replace MySQL auto_increment Clauses with Vitess Sequences + +In https://github.com/vitessio/vitess/pull/16860 we added support for replacing MySQL `auto_increment` clauses with [Vitess Sequences](https://vitess.io/docs/reference/features/vitess-sequences/), performing all of the setup and initialization +work automatically during the [`MoveTables`](https://vitess.io/docs/reference/vreplication/movetables/) workflow. As part of that work we have deprecated the +[`--remove-sharded-auto-increment` boolean flag](https://vitess.io/docs/20.0/reference/programs/vtctldclient/vtctldclient_movetables/vtctldclient_movetables_create/) and you should begin using the new +[`--sharded-auto-increment-handling` flag](https://vitess.io/docs/21.0/reference/programs/vtctldclient/vtctldclient_movetables/vtctldclient_movetables_create/) instead. Please see the new +[`MoveTables` Auto Increment Handling](https://vitess.io/docs/21.0/reference/vreplication/movetables/#auto-increment-handling) documentation for additional details. + +### Experimental MySQL 8.4 support + +We have added experimental support for MySQL 8.4. It passes the Vitess test suite, but it is otherwise not yet tested. We are looking for feedback from the community to improve this to move support out of the experimental phase in a future release. + +### Current Errant GTIDs Count Metric +A new metric called `CurrentErrantGTIDCount` has been added to the `VTOrc` component. +This metric shows the current count of the errant GTIDs in the tablets. + +### `vtctldclient ChangeTabletTags` command + +The `vtctldclient` command `ChangeTabletTags` was added to allow the tags of a tablet to be changed dynamically. + +### Support specifying expected primary in reparents + +The `EmergencyReparentShard` and `PlannedReparentShard` commands and RPCs now support specifying a primary we expect to still be the current primary in order for a reparent operation to be processed. This allows reparents to be conditional on a specific state being true. + +------------ +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/21.0/21.0.0/changelog.md). + +The release includes 364 merged Pull Requests. + +Thanks to all our contributors: @GrahamCampbell, @GuptaManan100, @Utkar5hM, @anshikavashistha, @app/dependabot, @app/vitess-bot, @arthurschreiber, @beingnoble03, @brendar, @cameronmccord2, @chrism1001, @cuishuang, @dbussink, @deepthi, @demmer, @frouioui, @harshit-gangal, @harshitasao, @icyflame, @kirtanchandak, @mattlord, @mattrobenolt, @maxenglander, @mcrauwel, @notfelineit, @perminov, @rafer, @rohit-nayak-ps, @runewake2, @rvrangel, @shanth96, @shlomi-noach, @systay, @timvaillancourt, @vitess-bot + diff --git a/changelog/21.0/21.0.0/summary.md b/changelog/21.0/21.0.0/summary.md index 0d046ae9d75..512aa45a12f 100644 --- a/changelog/21.0/21.0.0/summary.md +++ b/changelog/21.0/21.0.0/summary.md @@ -1,25 +1,53 @@ - ## Summary ### Table of Contents +- **[Known Issues](#known-issues)** + - **[Backup reports itself as successful despite failures](#backup-reports-as-successful)** - **[Major Changes](#major-changes)** - - **[Deprecations and Deletions](#deprecations-and-deletions)** - - [Deletion of deprecated metrics](#metric-deletion) - - [VTTablet Flags](#vttablet-flags) - - [Metrics](#deprecations-metrics) - - **[Traffic Mirroring](#traffic-mirroring)** - - **[New VTGate Shutdown Behavior](#new-vtgate-shutdown-behavior)** - - **[Tablet Throttler: Multi-Metric support](#tablet-throttler)** - -## Major Changes - -### Deprecations and Deletions - -#### Deletion of deprecated metrics - -The following metrics that were deprecated in the previous release, have now been deleted. - + - **[Deprecations and Deletions](#deprecations-and-deletions)** + - [Deprecated VTTablet Flags](#vttablet-flags) + - [Deletion of deprecated metrics](#metric-deletion) + - [Deprecated Metrics](#deprecations-metrics) + - **[Traffic Mirroring](#traffic-mirroring)** + - **[Atomic Distributed Transaction Support](#atomic-transaction)** + - **[New VTGate Shutdown Behavior](#new-vtgate-shutdown-behavior)** + - **[Tablet Throttler: Multi-Metric support](#tablet-throttler)** + - **[Allow Cross Cell Promotion in PRS](#allow-cross-cell)** + - **[Support for recursive CTEs](#recursive-cte)** + - **[VTGate Tablet Balancer](#tablet-balancer)** + - **[Query Timeout Override](#query-timeout)** + - **[New Backup Engine](#new-backup-engine)** + - **[Dynamic VReplication Configuration](#dynamic-vreplication-configuration)** + - **[Reference Table Materialization](#reference-table-materialization)** + - **[New VEXPLAIN Modes: TRACE and KEYS](#new-vexplain-modes)** + - **[Automatically Replace MySQL auto_increment Clauses with Vitess Sequences](#auto-replace-mysql-autoinc-with-seq)** + - **[Experimental MySQL 8.4 support](#experimental-mysql-84)** + - **[Current Errant GTIDs Count Metric](#errant-gtid-metric)** + - **[vtctldclient ChangeTabletTags](#vtctldclient-changetablettags)** + - **[Support for specifying expected primary in reparents](#reparents-expectedprimary)** + +## Known Issues + +### Backup reports itself as successful despite failures + +In this release, we have identified an issue where a backup may succeed even if one of the underlying files fails to be backed up. +The underlying errors are ignored and the backup action reports success. +This issue exists only with the `builtin` backup engine, and it can occur only when the engine has already started backing up all files. +Please refer to https://github.com/vitessio/vitess/issues/17063 for more details. + +## Major Changes + +### Deprecations and Deletions + +#### Deprecated VTTablet Flags + +- `queryserver-enable-settings-pool` flag, added in `v15`, has been on by default since `v17`. + It is now deprecated and will be removed in a future release. + +#### Deletion of deprecated metrics + +The following VTOrc metrics were deprecated in `v20`. They have now been deleted. | Metric Name | |:--------------------------------------------:| @@ -36,14 +64,9 @@ The following metrics that were deprecated in the previous release, have now bee | `planned_reparent_counts` | | `reparent_shard_operation_timings` | -#### VTTablet Flags - -- `queryserver-enable-settings-pool` flag, added in v15, has been on by default since v17. -It is now deprecated and will be removed in a future release. +#### Deprecated Metrics -#### Metrics - -The following metrics are now deprecated, if provided please use their replacement. +The following metrics are now deprecated and will be deleted in a future release, please use their replacements. | Component | Metric Name | Replaced By | |------------|:---------------------:|:-------------------------------:| @@ -54,10 +77,10 @@ The following metrics are now deprecated, if provided please use their replaceme | `vttablet` | `QueryCacheHits` | `QueryEnginePlanCacheHits` | | `vttablet` | `QueryCacheMisses` | `QueryEnginePlanCacheMisses` | +### Traffic Mirroring -### Traffic Mirroring - -Traffic mirroring is intended to help reduce some of the uncertainty inherent to `MoveTables SwitchTraffic`. When traffic mirroring is enabled, VTGate will mirror a percentage of traffic from one keyspace to another. +Traffic mirroring is intended to help reduce some of the uncertainty inherent to `MoveTables SwitchTraffic`. When +traffic mirroring is enabled, VTGate will mirror a percentage of traffic from one keyspace to another. Mirror rules may be enabled through `vtctldclient` with `MoveTables MirrorTraffic`. For example: @@ -67,32 +90,165 @@ $ vtctldclient --server :15999 MoveTables --target-keyspace customer --workflow Mirror rules can be inspected with `GetMirrorRules`. -### New VTGate Shutdown Behavior +### Atomic Distributed Transaction Support + +We have introduced atomic distributed transactions as an experimental feature. +Users can now run multi-shard transactions with stronger guarantees. +Vitess now provides two modes of transactional guarantees for multi-shard transactions: Best Effort and Atomic. +These can be selected based on the user’s requirements and the trade-offs they are willing to make. + +Follow the documentation to enable [Atomic Distributed Transaction](https://vitess.io/docs/21.0/reference/features/distributed-transaction/) -We added a new option to affect the VTGate shutdown process in v21 by using a connection drain timeout rather than the older activity drain timeout. -The goal of this new behavior, connection draining option, is to disallow new connections when VTGate is shutting down, -but continue allowing existing connections to finish their work until they manually disconnect or until the `--onterm_timeout` timeout is reached, -without getting a `Server shutdown in progress` error. +For more details on the implementation and trade-offs, please refer to the [RFC](https://github.com/vitessio/vitess/issues/16245) + +### New VTGate Shutdown Behavior + +We added a new option to VTGate to disallow new connections while VTGate is shutting down, +while allowing existing connections to finish their work until they manually disconnect or until +the `--onterm_timeout` is reached, without getting a `Server shutdown in progress` error. This new behavior can be enabled by specifying the new `--mysql-server-drain-onterm` flag to VTGate. -See more information about this change by [reading its RFC](https://github.com/vitessio/vitess/issues/15971). +You can find more information about this option in the [RFC](https://github.com/vitessio/vitess/issues/15971). -### Tablet Throttler: Multi-Metric support +### Tablet Throttler: Multi-Metric support -Up till `v20`, the tablet throttler would only monitor and use a single metric. That would be replication lag, by default, or could be the result of a custom query. `v21` introduces a major redesign where the throttler monitors and uses multiple metrics at the same time, including the above two. +Up until `v20`, the tablet throttler would only monitor and use a single metric. That would be replication lag, by +default, or could be the result of a custom query. In this release, we introduce a major redesign so that the throttler +monitors and uses multiple metrics at the same time, including the above two. -Backwards compatible with `v20`, the default behavior in `v21` is to monitor all metrics, but only use `lag` (if the cutsom query is undefined) or the `cutsom` metric (if the custom query is defined). A `v20` `PRIMARY` is compatible with a `v21` `REPLICA`, and a `v21` `PRIMARY` is compatible with a `v20` `REPLICA`. +The default behavior now is to monitor all metrics, but only use `lag` (if the custom query is undefined) or the `custom` +metric (if the custom query is defined). This is backwards-compatible with `v20`. A `v20` `PRIMARY` is compatible with +a `v21` `REPLICA`, and a `v21` `PRIMARY` is compatible with a `v20` `REPLICA`. -However, with `v21` it is possible to assign any combination of metrics (one or more) for a given app. The throttler would then accept or reject the app's requests based on the health of _all_ assigned metrics. `v21` comes with a preset list metrics, expected to be expanded: +However, it is now possible to assign any combination of one or more metrics for a given app. The throttler +would then accept or reject the app's requests based on the health of _all_ assigned metrics. We have provided a pre-defined +list of metrics: - `lag`: replication lag based on heartbeat injection. - `threads_running`: concurrent active threads on the MySQL server. - `loadavg`: per core load average measured on the tablet instance/pod. - `custom`: the result of a custom query executed on the MySQL server. -Each metric has a factory threshold which can be overridden by the `UpdateThrottlerConfig` command. +Each metric has a default threshold which can be overridden by the `UpdateThrottlerConfig` command. + +The throttler also supports the catch-all `"all"` app name, and it is thus possible to assign metrics to **all** apps. +Explicit app to metric assignments will override the catch-all configuration. + +Metrics are assigned a default _scope_, which could be `self` (isolated to the tablet) or `shard` (max, aka **worst** +value among shard tablets). It is further possible to require a different scope for each metric. + +### Allow Cross Cell Promotion in PRS + +Up until now if the users wanted to promote a replica in a different cell from the current primary +using `PlannedReparentShard`, they had to specify the new primary with the `--new-primary` flag. + +We have now added a new flag `--allow-cross-cell-promotion` that lets `PlannedReparentShard` choose a primary in a +different cell even if no new primary is provided explicitly. + +### Experimental support for recursive CTEs + +We have added experimental support for recursive CTEs in Vitess. We are marking it as experimental because it is not yet +fully tested and may have some limitations. We are looking for feedback from the community to improve this feature. + +### VTGate Tablet Balancer + +When a VTGate routes a query and has multiple available tablets for a given shard / tablet type (e.g. REPLICA), the +current default behavior routes the query with local cell affinity and round robin policy. The VTGate Tablet Balancer +provides an alternate mechanism that routes queries to maintain an even distribution of query load to each tablet, while +preferentially routing to tablets in the same cell as the VTGate. + +The tablet balancer is enabled by a new flag `--enable-balancer` and configured by `--balancer-vtgate-cells` +and `--balancer-keyspaces`. + +See the [RFC ](https://github.com/vitessio/vitess/issues/12241) for more details on the design and configuration of this feature. + +### Query Timeout Override + +VTGate sends an authoritative query timeout to VTTablet when the `QUERY_TIMEOUT_MS` comment directive, +`query_timeout` session system variable, or `query-timeout` flag is set. +The order of precedence is: comment directive > session variable > VTGate flag. +VTTablet overrides its default query timeout with the value received from VTGate. +All timeouts are specified in milliseconds. + +When a query is executed inside a transaction, there is an additional nuance. The actual timeout used will be the smaller +of the transaction timeout and the query timeout. + +A query can also be set to have no timeout by using the `QUERY_TIMEOUT_MS` comment directive with a value of `0`. + +Example usage: +`select /*vt+ QUERY_TIMEOUT_MS=30 */ col from tbl` + +### New Backup Engine (EXPERIMENTAL) + +We are introducing a new backup engine for logical backups in order to support use cases that require something other +than physical backups. This feature is experimental and is based on [MySQL Shell](https://dev.mysql.com/doc/mysql-shell/8.0/en/). + +The new engine is enabled by using `--backup_engine_implementation=mysqlshell`. There are other options that are required, +so please read the [documentation](https://vitess.io/docs/21.0/user-guides/operating-vitess/backup-and-restore/creating-a-backup/) to learn which options are required and how to configure them. + +### Dynamic VReplication Configuration + +Previously, many of the configuration options for VReplication Workflows had to be provided using VTTablet flags. This +meant that any change to VReplication configuration required restarting VTTablets. We now allow these to be overridden +while creating a workflow or dynamically after the workflow is already in progress. + +### Reference Table Materialization + +There is a new option in [`Materialize` workflows](https://vitess.io/docs/reference/vreplication/materialize/) to keep a synced copy of [reference or lookup tables](https://vitess.io/docs/reference/vreplication/reference_tables/) +(countries, states, zip codes, etc) from an unsharded keyspace, which holds the source of truth for the reference +table, to all shards in a sharded keyspace. + +### New VEXPLAIN Modes: TRACE and KEYS + +#### VEXPLAIN TRACE + +The new `TRACE` mode for `VEXPLAIN` provides a detailed execution trace of queries, showing how they're processed through various +operators and interactions with tablets. This mode is particularly useful for: + +- Identifying performance bottlenecks +- Understanding query execution patterns +- Optimizing complex queries +- Debugging unexpected query behavior + +`TRACE` mode runs the query and logs all interactions, returning a JSON representation of the query execution plan with additional +statistics like number of calls, average rows processed, and number of shards queried. + +#### VEXPLAIN KEYS + +The `KEYS` mode for `VEXPLAIN` offers a concise summary of query structure, highlighting columns used in joins, filters, and +grouping operations. This information is crucial for: + +- Identifying potential sharding key candidates +- Optimizing query performance +- Analyzing query patterns to inform database design decisions + +`KEYS` mode analyzes the query structure without executing it, providing JSON output that includes grouping columns, join columns, +filter columns (potential candidates for indexes, primary keys, or sharding keys), and the statement type. + +These new `VEXPLAIN` modes enhance Vitess's query analysis capabilities, allowing for more informed decisions about sharding +strategies and query optimization. + +### Automatically Replace MySQL auto_increment Clauses with Vitess Sequences + +In https://github.com/vitessio/vitess/pull/16860 we added support for replacing MySQL `auto_increment` clauses with [Vitess Sequences](https://vitess.io/docs/reference/features/vitess-sequences/), performing all of the setup and initialization +work automatically during the [`MoveTables`](https://vitess.io/docs/reference/vreplication/movetables/) workflow. As part of that work we have deprecated the +[`--remove-sharded-auto-increment` boolean flag](https://vitess.io/docs/20.0/reference/programs/vtctldclient/vtctldclient_movetables/vtctldclient_movetables_create/) and you should begin using the new +[`--sharded-auto-increment-handling` flag](https://vitess.io/docs/21.0/reference/programs/vtctldclient/vtctldclient_movetables/vtctldclient_movetables_create/) instead. Please see the new +[`MoveTables` Auto Increment Handling](https://vitess.io/docs/21.0/reference/vreplication/movetables/#auto-increment-handling) documentation for additional details. + +### Experimental MySQL 8.4 support + +We have added experimental support for MySQL 8.4. It passes the Vitess test suite, but it is otherwise not yet tested. We are looking for feedback from the community to improve this to move support out of the experimental phase in a future release. + +### Current Errant GTIDs Count Metric +A new metric called `CurrentErrantGTIDCount` has been added to the `VTOrc` component. +This metric shows the current count of the errant GTIDs in the tablets. + +### `vtctldclient ChangeTabletTags` command + +The `vtctldclient` command `ChangeTabletTags` was added to allow the tags of a tablet to be changed dynamically. -The throttler also supports the catch-all `"all"` app name, and it is thus possible to assign metrics to _all_ apps. Explicit app to metric assignments will override the catch-all configuration. +### Support specifying expected primary in reparents -Metrics are assigned a default _scope_, which could be `self` (isolated to the tablet) or `shard` (max, aka _worst_ value among shard tablets). It is further possible to require a different scope for each metric. +The `EmergencyReparentShard` and `PlannedReparentShard` commands and RPCs now support specifying a primary we expect to still be the current primary in order for a reparent operation to be processed. This allows reparents to be conditional on a specific state being true. diff --git a/changelog/21.0/README.md b/changelog/21.0/README.md index bade1b597f8..a77e98bcaba 100644 --- a/changelog/21.0/README.md +++ b/changelog/21.0/README.md @@ -1,2 +1,4 @@ ## v21.0 * **[21.0.0](21.0.0)** + * [Changelog](21.0.0/changelog.md) + * [Release Notes](21.0.0/release_notes.md) diff --git a/config/init_db.sql b/config/init_db.sql index 25ea2a42f3a..118d8d02687 100644 --- a/config/init_db.sql +++ b/config/init_db.sql @@ -29,6 +29,7 @@ DROP DATABASE IF EXISTS test; CREATE USER 'vt_dba'@'localhost'; GRANT ALL ON *.* TO 'vt_dba'@'localhost'; GRANT GRANT OPTION ON *.* TO 'vt_dba'@'localhost'; +GRANT PROXY ON ''@'' TO 'vt_dba'@'localhost' WITH GRANT OPTION; # User for app traffic, with global read-write access. CREATE USER 'vt_app'@'localhost'; diff --git a/config/mycnf/mysql84.cnf b/config/mycnf/mysql84.cnf index 90d7a535602..93e4bd571e1 100644 --- a/config/mycnf/mysql84.cnf +++ b/config/mycnf/mysql84.cnf @@ -14,7 +14,7 @@ mysqlx = 0 # 8.4 changes the default auth-plugin to caching_sha2_password and # disables mysql_native_password by default. mysql_native_password = ON -default_authentication_plugin = mysql_native_password +authentication_policy = 'mysql_native_password' # Semi-sync replication is required for automated unplanned failover # (when the primary goes away). Here we just load the plugin so it's diff --git a/config/vtorc/default.json b/config/vtorc/default.json index 8fc7ab3747d..0a234473d32 100644 --- a/config/vtorc/default.json +++ b/config/vtorc/default.json @@ -1,8 +1,4 @@ { "Debug": true, - "MySQLTopologyUser": "orc_client_user", - "MySQLTopologyPassword": "orc_client_user_password", - "MySQLReplicaUser": "vt_repl", - "MySQLReplicaPassword": "", "RecoveryPeriodBlockSeconds": 5 } diff --git a/doc/design-docs/AtomicTransactionsWithDisruptions.md b/doc/design-docs/AtomicTransactionsWithDisruptions.md new file mode 100644 index 00000000000..7b3e050ae0d --- /dev/null +++ b/doc/design-docs/AtomicTransactionsWithDisruptions.md @@ -0,0 +1,61 @@ +# Handling disruptions in atomic transactions + +## Overview + +This document describes how to make atomic transactions resilient in the face of disruptions. The basic design and components involved in an atomic transaction are described in [here](./TwoPhaseCommitDesign.md) The document describes each of the disruptions that can happen in a running cluster and how atomic transactions are engineered to handle them without breaking their guarantee of being atomic. + +## `PlannedReparentShard` and `EmergencyReparentShard` + +For both Planned and Emergency reparents, we call `DemotePrimary` on the primary tablet. For Planned reparent, this call has to succeed, while on Emergency reparent, if the primary is unreachable then this call can fail, and we would still proceed further. + +As part of the `DemotePrimary` flow, when we transition the tablet to a non-serving state, we wait for all the transactions to have completed (in `TxEngine.shutdownLocked()` we have `te.txPool.WaitForEmpty()`). If the user has specified a shutdown grace-period, then after that much time elapses, we go ahead and forcefully kill all running queries. We then also rollback the prepared transactions. It is crucial that we rollback the prepared transactions only after all other writes have been killed, because when we rollback a prepared transaction, it lets go of the locks it was holding. If there were some other conflicting write in progress that hadn't been killed, then it could potentially go through and cause data corruption since we won't be able to prepare the transaction again. All the code to kill queries can be found in `stateManager.terminateAllQueries()`. + +The above outlined steps ensure that we either wait for all prepared transactions to conclude or we rollback them safely so that they can be prepared again on the new primary. + +On the new primary, when we call `PromoteReplica`, we redo all the prepared transactions before we allow any new writes to go through. This ensures that the new primary is in the same state as the old primary was before the reparent. The code for redoing the prepared transactions can be found in `TxEngine.RedoPreparedTransactions()`. + +If everything goes as described above, there is no reason for redoing of prepared transactions to fail. But in case, something unexpected happens and preparing transactions fails, we still allow the vttablet to accept new writes because we decided availability of the tablet is more important. We will however, build tooling and metrics for the users to be notified of these failures and let them handle this in the way they see fit. + +While Planned reparent is an operation where all the processes are running fine, Emergency reparent is called when something has gone wrong with the cluster. Because we call `DemotePrimary` in parallel with `StopReplicationAndBuildStatusMap`, we can run into a case wherein the primary tries to write something to the binlog after all the replicas have stopped replicating. If we were to run without semi-sync, then the primary could potentially commit a prepared transaction, and return a success to the vtgate trying to commit this transaction. The vtgate can then conclude that the transaction is safe to conclude and remove all the metadata information. However, on the new primary since the transaction commit didn't get replicated, it would re-prepare the transaction and would wait for a coordinator to either commit or rollback it, but that would never happen. Essentially we would have a transaction stuck in prepared state on a shard indefinitely. To avoid this situation, it is essential that we run with semi-sync, because this ensures that any write that is acknowledged as a success to the caller, would necessarily have to be replicated to at least one replica. This ensures that the transaction would also already be committed on the new primary. + +## MySQL Restarts + +When MySQL restarts, it loses all the ongoing transactions which includes all the prepared transactions. This is because the transaction logs are not persistent across restarts. This is a MySQL limitation and there is no way to get around this. However, at the Vitess level we must ensure that we can commit the prepared transactions even in case of MySQL restarts without any failures. + +Vttablet has the code to detect MySQL failures and call `stateManager.checkMySQL()` which transitions the tablet to a NotConnected state. This prevents any writes from going through until the vttablet has transitioned back to a serving state. + +However, we cannot rely on `checkMySQL` to ensure that no conflicting writes go through. This is because the time between MySQL restart and the vttablet transitioning to a NotConnected state can be large. During this time, the vttablet would still be accepting writes and some of them could potentially conflict with the prepared transactions. + +To handle this, we rely on the fact that when MySQL restarts, it starts with super-read-only turned on. This means that no writes can go through. It is VTOrc that registers this as an issue and fixes it by calling `UndoDemotePrimary`. As part of that call, before we set MySQL to read-write, we ensure that all the prepared transactions are redone in the read_only state. We use the dba pool (that has admin permissions) to prepare the transactions. This is safe because we know that no conflicting writes can go through until we set MySQL to read-write. The code to set MySQL to read-write after redoing prepared transactions can be found in `TabletManager.redoPreparedTransactionsAndSetReadWrite()`. + +Handling MySQL restarts is the only reason we needed to add the code to redo prepared transactions whenever MySQL transitions from super-read-only to read-write state. Even though, we only need to do this in `UndoDemotePrimary`, it not necessary that it is `UndoDemotePrimary` that sets MySQL to read-write. If the user notices that the tablet is in a read-only state before VTOrc has a chance to fix it, they can manually call `SetReadWrite` on the tablet. +Therefore, the safest option was to always check if we need to redo the prepared transactions whenever MySQL transitions from super-read-only to read-write state. + +## Vttablet Restarts + +When Vttabet restarts, all the previous connections are dropped. It starts in a non-serving state, and then after reading the shard and tablet records from the topo, it transitions to a serving state. +As part of this transition we need to ensure that we redo the prepared transactions before we start accepting any writes. This is done as part of the `TxEngine.transition` function when we transition to an `AcceptingReadWrite` state. We call the same code for redoing the prepared transactions that we called for MySQL restarts, PRS and ERS. + +## Online DDL + +During an Online DDL cutover, we need to ensure that all the prepared transactions on the online DDL table needs to be completed before we can proceed with the cutover. +This is because the cutover involves a schema change and we cannot have any prepared transactions that are dependent on the old schema. + +As part of the cut-over process, Online DDL adds query rules to buffer new queries on the table. +It then checks for any open prepared transaction on the table and waits for up to 100ms if found, then checks again. +If it finds no prepared transaction of the table, it moves forward with the cut-over, otherwise it fails. The Online DDL mechanism will later retry the cut-over. + +In the Prepare code, we check the query rules before adding the transaction to the prepared list and re-check the rules before storing the transaction logs in the transaction redo table. +Any transaction that went past the first check will fail the second check if the cutover proceeds. + +The check on both sides prevents either the cutover from proceeding or the transaction from being prepared. + +## MoveTables + +The only step of a `MoveTables` workflow that needs to synchronize with atomic transactions is `SwitchTraffic` for writes. As part of this step, we want to disallow writes to only the tables involved. We use `DeniedTables` in `ShardInfo` to accomplish this. After we update the topo server with the new `DeniedTables`, we make all the vttablets refresh their topo to ensure that they've registered the change. + +On vttablet, the `DeniedTables` are used to add query rules very similar to the ones in Online DDL. The only difference is that in Online DDL, we buffer the queries, but for `SwitchTraffic` we fail them altogether. Addition of these query rules, prevents any new atomic transactions from being prepared. + +Next, we try locking the tables to ensure no existing write is pending. This step blocks until all open prepared transactions have succeeded. + +After this step, `SwitchTraffic` can proceed without any issues, since we are guaranteed to reject any new atomic transactions until the `DeniedTables` has been reset, and having acquired the table lock, we know no write is currently in progress. diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index dd9d1c19f17..1a90bd1c37b 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -132,4 +132,17 @@ List of changes between bootstrap image versions. ## [34] - 2024-07-02 ### Changes -- Update build to golang 1.22.5 \ No newline at end of file +- Update build to golang 1.22.5 + +## [35] - 2024-08-14 +### Changes +- Update build to golang 1.23.0 +- MySQL57 and Percona57 tags will be removed thereafter + +## [36] - 2024-09-05 +### Changes +- Update build to golang 1.23.1 + +## [37] - 2024-10-04 +### Changes +- Update build to golang 1.23.2 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index c48a485bec3..b95f3d37eda 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.22.5-bullseye +FROM --platform=linux/amd64 golang:1.23.2-bullseye # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/bootstrap/Dockerfile.mysql57 b/docker/bootstrap/Dockerfile.mysql57 deleted file mode 100644 index 983f3640472..00000000000 --- a/docker/bootstrap/Dockerfile.mysql57 +++ /dev/null @@ -1,24 +0,0 @@ -ARG bootstrap_version -ARG image="vitess/bootstrap:${bootstrap_version}-common" - -FROM --platform=linux/amd64 "${image}" - -USER root - -# Install MySQL 5.7 -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends gnupg dirmngr ca-certificates && \ - for i in $(seq 1 10); do apt-key adv --no-tty --recv-keys --keyserver keyserver.ubuntu.com A8D3785C && break; done && \ - add-apt-repository 'deb http://repo.mysql.com/apt/debian/ buster mysql-5.7' && \ - for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done && \ - echo 'deb http://repo.percona.com/apt buster main' > /etc/apt/sources.list.d/percona.list && \ - { \ - echo debconf debconf/frontend select Noninteractive; \ - echo percona-server-server-5.7 percona-server-server/root_password password 'unused'; \ - echo percona-server-server-5.7 percona-server-server/root_password_again password 'unused'; \ - } | debconf-set-selections && \ - percona-release enable-only tools \ - apt-get update -y && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server libmysqlclient-dev libdbd-mysql-perl rsync libev4 percona-xtrabackup-24 && \ - rm -rf /var/lib/apt/lists/* - -USER vitess diff --git a/docker/bootstrap/Dockerfile.percona57 b/docker/bootstrap/Dockerfile.percona57 deleted file mode 100644 index e9cd5043d44..00000000000 --- a/docker/bootstrap/Dockerfile.percona57 +++ /dev/null @@ -1,22 +0,0 @@ -ARG bootstrap_version -ARG image="vitess/bootstrap:${bootstrap_version}-common" - -FROM --platform=linux/amd64 "${image}" - -USER root - -# Install Percona 5.7 -RUN for i in $(seq 1 10); do apt-key adv --no-tty --keyserver keyserver.ubuntu.com --recv-keys 9334A25F8507EFA5 && break; done && \ - add-apt-repository 'deb http://repo.percona.com/apt bullseye main' && \ - { \ - echo debconf debconf/frontend select Noninteractive; \ - echo percona-server-server-5.7 percona-server-server/root_password password 'unused'; \ - echo percona-server-server-5.7 percona-server-server/root_password_again password 'unused'; \ - } | debconf-set-selections && \ - percona-release enable-only tools \ - apt-get update && \ - apt-get install -y --no-install-recommends percona-server-server-5.7 && \ - apt-get install -y --no-install-recommends libperconaserverclient20-dev percona-xtrabackup-24 && \ - rm -rf /var/lib/apt/lists/* - -USER vitess diff --git a/docker/bootstrap/README.md b/docker/bootstrap/README.md index 717f4336442..b273305d6b9 100644 --- a/docker/bootstrap/README.md +++ b/docker/bootstrap/README.md @@ -6,9 +6,7 @@ after successfully running `bootstrap.sh` and `dev.env`. The `vitess/bootstrap` image comes in different flavors: * `vitess/bootstrap:common` - dependencies that are common to all flavors -* `vitess/bootstrap:mysql57` - bootstrap image for MySQL 5.7 * `vitess/bootstrap:mysql80` - bootstrap image for MySQL 8.0 -* `vitess/bootstrap:percona57` - bootstrap image for Percona Server 5.7 * `vitess/bootstrap:percona80` - bootstrap image for Percona Server 8.0 **NOTE: Unlike the base image that builds Vitess itself, this bootstrap image diff --git a/docker/lite/Dockerfile b/docker/lite/Dockerfile index 7c0b22aed3c..77235b09c27 100644 --- a/docker/lite/Dockerfile +++ b/docker/lite/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.22.5-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.2-bullseye AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER @@ -33,13 +33,18 @@ RUN make install PREFIX=/vt/install # Start over and build the final image. FROM --platform=linux/amd64 debian:bullseye-slim +# Install locale required for mysqlsh +RUN apt-get update && apt-get install -y locales \ + && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ + && locale-gen en_US.UTF-8 + # Install dependencies COPY docker/utils/install_dependencies.sh /vt/dist/install_dependencies.sh RUN /vt/dist/install_dependencies.sh mysql80 # Set up Vitess user and directory tree. RUN groupadd -r vitess && useradd -r -g vitess vitess -RUN mkdir -p /vt/vtdataroot && chown -R vitess:vitess /vt +RUN mkdir -p /vt/vtdataroot /home/vitess && chown -R vitess:vitess /vt /home/vitess # Set up Vitess environment (just enough to run pre-built Go binaries) ENV VTROOT /vt diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index cded55438ec..462263093be 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.22.5-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.2-bullseye AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER diff --git a/docker/utils/install_dependencies.sh b/docker/utils/install_dependencies.sh index b686c2418bf..91e6e2b8c76 100755 --- a/docker/utils/install_dependencies.sh +++ b/docker/utils/install_dependencies.sh @@ -86,6 +86,7 @@ mysql57) /tmp/mysql-client_${VERSION}-1debian10_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian10_amd64.deb /tmp/mysql-server_${VERSION}-1debian10_amd64.deb + mysql-shell percona-xtrabackup-24 ) ;; @@ -112,6 +113,7 @@ mysql80) /tmp/mysql-community-server-core_${VERSION}-1debian11_amd64.deb /tmp/mysql-community-server_${VERSION}-1debian11_amd64.deb /tmp/mysql-server_${VERSION}-1debian11_amd64.deb + mysql-shell percona-xtrabackup-80 ) ;; diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index 2e79d389c7d..5e885be3422 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=linux/amd64 golang:1.22.5-bullseye AS builder +FROM --platform=linux/amd64 golang:1.23.2-bullseye AS builder # Allows docker builds to set the BUILD_NUMBER ARG BUILD_NUMBER diff --git a/docker/vttestserver/README.md b/docker/vttestserver/README.md new file mode 100644 index 00000000000..1567cf30340 --- /dev/null +++ b/docker/vttestserver/README.md @@ -0,0 +1,17 @@ +## vttestserver docker image + +### How to build manually during a release + +If for whatever reason the automatic build did not happen for `vttestserver` during a release, or if it has failed, +there is a way of building it by hand. Here is how it goes: + +```bash +docker login + +# we first checkout to the git tag of the release we want to build +# we assume in this example that we are releasing v21.0.0-rc1, but replace this by any other tag +git checkout v21.0.0-rc1 + +docker build -f docker/vtttestserver/Dockerfile.mysql80 -t vitess/vttestserver:v21.0.0-rc1-mysql80 . +docker push vitess/vttestserver:v21.0.0-rc1-mysql80 +``` \ No newline at end of file diff --git a/examples/common/scripts/vtadmin-up.sh b/examples/common/scripts/vtadmin-up.sh index 356f6ac3880..499c6ea6204 100755 --- a/examples/common/scripts/vtadmin-up.sh +++ b/examples/common/scripts/vtadmin-up.sh @@ -43,7 +43,7 @@ vtadmin \ --alsologtostderr \ --rbac \ --rbac-config="${script_dir}/../vtadmin/rbac.yaml" \ - --cluster "id=${cluster_name},name=${cluster_name},discovery=staticfile,discovery-staticfile-path=${script_dir}/../vtadmin/discovery.json,tablet-fqdn-tmpl=http://{{ .Tablet.Hostname }}:15{{ .Tablet.Alias.Uid }}" \ + --cluster "id=${cluster_name},name=${cluster_name},discovery=staticfile,discovery-staticfile-path=${script_dir}/../vtadmin/discovery.json,tablet-fqdn-tmpl=http://{{ .Tablet.Hostname }}:15{{ .Tablet.Alias.Uid }},schema-cache-default-expiration=1m" \ > "${log_dir}/vtadmin-api.out" 2>&1 & vtadmin_api_pid=$! diff --git a/examples/common/vtorc/config.json b/examples/common/vtorc/config.json index e1f27ee5762..53b012c2162 100644 --- a/examples/common/vtorc/config.json +++ b/examples/common/vtorc/config.json @@ -1,8 +1,4 @@ { - "MySQLTopologyUser": "orc_client_user", - "MySQLTopologyPassword": "orc_client_user_password", - "MySQLReplicaUser": "vt_repl", - "MySQLReplicaPassword": "", "RecoveryPeriodBlockSeconds": 1, "InstancePollSeconds": 1 } \ No newline at end of file diff --git a/examples/compose/README.md b/examples/compose/README.md index 8d20f360620..91ec8708de5 100644 --- a/examples/compose/README.md +++ b/examples/compose/README.md @@ -67,7 +67,7 @@ vitess/examples/compose$ docker-compose up -d ### Check cluster status Check the status of the cluster. ``` -vitess/examples/compose$ docker-compose ps +vitess/examples/compose$ docker-compose ps -a Name Command State Ports --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- compose_consul1_1 docker-entrypoint.sh agent ... Up 8300/tcp, 8301/tcp, 8301/udp, 8302/tcp, 8302/udp, diff --git a/examples/compose/config/init_db.sql b/examples/compose/config/init_db.sql index b567faf1722..8c0ba4ebdd9 100644 --- a/examples/compose/config/init_db.sql +++ b/examples/compose/config/init_db.sql @@ -39,6 +39,7 @@ CREATE TABLE IF NOT EXISTS _vt.shard_metadata ( CREATE USER 'vt_dba'@'localhost'; GRANT ALL ON *.* TO 'vt_dba'@'localhost'; GRANT GRANT OPTION ON *.* TO 'vt_dba'@'localhost'; +GRANT PROXY ON ''@'' TO 'vt_dba'@'localhost' WITH GRANT OPTION; # User for app traffic, with global read-write access. CREATE USER 'vt_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, diff --git a/examples/compose/docker-compose.beginners.yml b/examples/compose/docker-compose.beginners.yml index d647d9fdc4d..bb364846df1 100644 --- a/examples/compose/docker-compose.beginners.yml +++ b/examples/compose/docker-compose.beginners.yml @@ -73,10 +73,12 @@ services: --grpc_port $GRPC_PORT "] depends_on: - - consul1 - - consul2 - - consul3 - depends_on: + consul1: + condition: service_started + consul2: + condition: service_started + consul3: + condition: service_started external_db_host: condition: service_healthy @@ -105,8 +107,8 @@ services: - KEYSPACE - DB depends_on: - - vtctld - depends_on: + vtctld: + condition: service_started vttablet101: condition: service_healthy diff --git a/examples/compose/vtorc-up.sh b/examples/compose/vtorc-up.sh index 7a7394dfc86..a4b03ede7d0 100755 --- a/examples/compose/vtorc-up.sh +++ b/examples/compose/vtorc-up.sh @@ -27,10 +27,6 @@ if [ $external = 1 ] ; then # This can be overridden by passing VTORC_CONFIG env variable echo "Updating $config..." cp /vt/vtorc/default.json /vt/vtorc/tmp.json - sed -i '/MySQLTopologyUser/c\ \"MySQLTopologyUser\" : \"'"$DB_USER"'\",' /vt/vtorc/tmp.json - sed -i '/MySQLTopologyPassword/c\ \"MySQLTopologyPassword\" : \"'"$DB_PASS"'\",' /vt/vtorc/tmp.json - sed -i '/MySQLReplicaUser/c\ \"MySQLReplicaUser\" : \"'"$DB_USER"'\",' /vt/vtorc/tmp.json - sed -i '/MySQLReplicaPassword/c\ \"MySQLReplicaPassword\" : \"'"$DB_PASS"'\",' /vt/vtorc/tmp.json cat /vt/vtorc/tmp.json cp /vt/vtorc/tmp.json /vt/vtorc/config.json else diff --git a/examples/compose/vtorc/default.json b/examples/compose/vtorc/default.json index e0a03884c99..58513568044 100644 --- a/examples/compose/vtorc/default.json +++ b/examples/compose/vtorc/default.json @@ -1,10 +1,6 @@ { "Debug": true, "EnableSyslog": false, - "MySQLTopologyUser": "orc_client_user", - "MySQLTopologyPassword": "orc_client_user_password", - "MySQLReplicaUser": "vt_repl", - "MySQLReplicaPassword": "", "BackendDB": "sqlite", "SQLite3DataFile": "/tmp/vtorc.sqlite3", "RecoverMasterClusterFilters": ["*"], diff --git a/examples/compose/vttablet-up.sh b/examples/compose/vttablet-up.sh index 8d02a7a528e..9e16869b1af 100755 --- a/examples/compose/vttablet-up.sh +++ b/examples/compose/vttablet-up.sh @@ -158,5 +158,5 @@ exec $VTROOT/bin/vttablet \ --init_shard $shard \ --backup_storage_implementation file \ --file_backup_storage_root $VTDATAROOT/backups \ - --queryserver-config-schema-reload-time 60 \ + --queryserver-config-schema-reload-time 60s \ $external_db_args diff --git a/examples/local/vstream_client.go b/examples/local/vstream_client.go index 98d2129f898..ab00f83871d 100644 --- a/examples/local/vstream_client.go +++ b/examples/local/vstream_client.go @@ -23,13 +23,13 @@ import ( "log" "time" - vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" - - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" _ "vitess.io/vitess/go/vt/vtctl/grpcvtctlclient" _ "vitess.io/vitess/go/vt/vtgate/grpcvtgateconn" "vitess.io/vitess/go/vt/vtgate/vtgateconn" + + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" ) /* @@ -73,15 +73,19 @@ func main() { } defer conn.Close() flags := &vtgatepb.VStreamFlags{ - //MinimizeSkew: false, - //HeartbeatInterval: 60, //seconds + // MinimizeSkew: false, + // HeartbeatInterval: 60, //seconds + // StopOnReshard: true, + // IncludeReshardJournalEvents: true, } reader, err := conn.VStream(ctx, topodatapb.TabletType_PRIMARY, vgtid, filter, flags) + if err != nil { + log.Fatal(err) + } for { e, err := reader.Recv() switch err { case nil: - _ = e fmt.Printf("%v\n", e) case io.EOF: fmt.Printf("stream ended\n") diff --git a/examples/operator/101_initial_cluster.yaml b/examples/operator/101_initial_cluster.yaml index 4a4f478adac..a4f9f447e21 100644 --- a/examples/operator/101_initial_cluster.yaml +++ b/examples/operator/101_initial_cluster.yaml @@ -159,6 +159,7 @@ stringData: CREATE USER 'vt_dba'@'localhost'; GRANT ALL ON *.* TO 'vt_dba'@'localhost'; GRANT GRANT OPTION ON *.* TO 'vt_dba'@'localhost'; + GRANT PROXY ON ''@'' TO 'vt_dba'@'localhost' WITH GRANT OPTION; # User for app traffic, with global read-write access. CREATE USER 'vt_app'@'localhost'; diff --git a/examples/operator/401_scheduled_backups.yaml b/examples/operator/401_scheduled_backups.yaml index 5cb0f6c3ea1..0e74ada8478 100644 --- a/examples/operator/401_scheduled_backups.yaml +++ b/examples/operator/401_scheduled_backups.yaml @@ -42,7 +42,7 @@ spec: jobTimeoutMinute: 5 strategies: - name: BackupShard - keyspace: "customer" + keyspace: "commerce" shard: "-" images: vtctld: vitess/lite:latest diff --git a/examples/operator/README.md b/examples/operator/README.md index 9182b25340c..38d9fe4d6ed 100644 --- a/examples/operator/README.md +++ b/examples/operator/README.md @@ -1,8 +1,10 @@ # Instructions - +{{< info >}} +For the best experience, please refer to the [Vitess Operator Compatibility Matrix](https://github.com/planetscale/vitess-operator#compatibility) to ensure compatibility between your version of Vitess and Kubernetes. You would then specify the appropriate Kubernetes version to Minikube using the `--kubernetes-version` flag. +{{< /info >}} ``` # Start minikube -minikube start --cpus=8 --memory=11000 --disk-size=50g --kubernetes-version=v1.25.8 +minikube start --cpus=8 --memory=11000 --disk-size=50g # Install Operator kubectl apply -f operator.yaml diff --git a/examples/operator/operator.yaml b/examples/operator/operator.yaml index 1ebf69da491..4b1b64df1ac 100644 --- a/examples/operator/operator.yaml +++ b/examples/operator/operator.yaml @@ -2,8 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.11.3 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.16.1 name: etcdlockservers.planetscale.com spec: group: planetscale.com @@ -61,6 +60,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic dataSource: properties: apiGroup: @@ -90,18 +90,6 @@ spec: type: object resources: properties: - claims: - items: - properties: - name: - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -132,11 +120,13 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic required: - key - operator type: object type: array + x-kubernetes-list-type: atomic matchLabels: additionalProperties: type: string @@ -145,6 +135,8 @@ spec: x-kubernetes-map-type: atomic storageClassName: type: string + volumeAttributesClassName: + type: string volumeMode: type: string volumeName: @@ -164,6 +156,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -202,6 +195,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -233,6 +227,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -252,6 +248,7 @@ spec: items: properties: name: + default: "" type: string type: object x-kubernetes-map-type: atomic @@ -279,6 +276,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -330,8 +329,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.11.3 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.16.1 name: vitessbackups.planetscale.com spec: group: planetscale.com @@ -383,8 +381,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.11.3 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.16.1 name: vitessbackupschedules.planetscale.com spec: group: planetscale.com @@ -449,6 +446,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -554,8 +553,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.11.3 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.16.1 name: vitessbackupstorages.planetscale.com spec: group: planetscale.com @@ -720,8 +718,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.11.3 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.16.1 name: vitesscells.planetscale.com spec: group: planetscale.com @@ -779,893 +776,1265 @@ spec: type: object type: object type: object - extraEnv: - items: - properties: - name: - type: string - value: - type: string - valueFrom: - properties: - configMapKeyRef: - properties: - key: - type: string - name: - type: string - optional: - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - properties: - apiVersion: - type: string - fieldPath: - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - properties: - containerName: - type: string - divisor: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - properties: - key: - type: string - name: - type: string - optional: - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - extraFlags: - additionalProperties: - type: string - type: object - extraLabels: - additionalProperties: - type: string - type: object - extraVolumeMounts: - items: - properties: - mountPath: - type: string - mountPropagation: - type: string - name: - type: string - readOnly: - type: boolean - subPath: - type: string - subPathExpr: - type: string - required: - - mountPath - - name - type: object - type: array - extraVolumes: - x-kubernetes-preserve-unknown-fields: true - initContainers: - x-kubernetes-preserve-unknown-fields: true - lifecycle: + autoscaler: properties: - postStart: + behavior: properties: - exec: - properties: - command: - items: - type: string - type: array - type: object - httpGet: + scaleDown: properties: - host: - type: string - httpHeaders: + policies: items: properties: - name: + periodSeconds: + format: int32 + type: integer + type: type: string value: - type: string + format: int32 + type: integer required: - - name + - periodSeconds + - type - value type: object type: array - path: - type: string - port: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - type: string - required: - - port - type: object - tcpSocket: - properties: - host: + x-kubernetes-list-type: atomic + selectPolicy: type: string - port: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - preStop: - properties: - exec: - properties: - command: - items: - type: string - type: array + stabilizationWindowSeconds: + format: int32 + type: integer type: object - httpGet: + scaleUp: properties: - host: - type: string - httpHeaders: + policies: items: properties: - name: + periodSeconds: + format: int32 + type: integer + type: type: string value: - type: string + format: int32 + type: integer required: - - name + - periodSeconds + - type - value type: object type: array - path: - type: string - port: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - scheme: - type: string - required: - - port - type: object - tcpSocket: - properties: - host: + x-kubernetes-list-type: atomic + selectPolicy: type: string - port: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - required: - - port + stabilizationWindowSeconds: + format: int32 + type: integer type: object type: object - type: object - replicas: - format: int32 - minimum: 0 - type: integer - resources: - properties: - claims: + maxReplicas: + format: int32 + minimum: 0 + type: integer + metrics: items: properties: - name: - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - type: object - secureTransport: - properties: - required: - type: boolean - tls: - properties: - certSecret: - properties: - key: - type: string - name: - type: string - volumeName: - type: string - required: - - key - type: object - clientCACertSecret: - properties: - key: - type: string - name: - type: string - volumeName: - type: string - required: - - key - type: object - keySecret: - properties: - key: - type: string - name: - type: string - volumeName: - type: string - required: - - key - type: object - type: object - type: object - service: - properties: - annotations: - additionalProperties: - type: string - type: object - clusterIP: - type: string - type: object - sidecarContainers: - x-kubernetes-preserve-unknown-fields: true - terminationGracePeriodSeconds: - format: int64 - type: integer - tolerations: - x-kubernetes-preserve-unknown-fields: true - topologySpreadConstraints: - x-kubernetes-preserve-unknown-fields: true - type: object - globalLockserver: - properties: - address: - type: string - implementation: - type: string - rootPath: - type: string - required: - - address - - implementation - - rootPath - type: object - imagePullPolicies: - properties: - mysqld: - type: string - mysqldExporter: - type: string - vtadmin: - type: string - vtbackup: - type: string - vtctld: - type: string - vtgate: - type: string - vtorc: - type: string - vttablet: - type: string - type: object - imagePullSecrets: - items: - properties: - name: - type: string - type: object - x-kubernetes-map-type: atomic - type: array - images: - properties: - vtgate: - type: string - type: object - lockserver: - properties: - cellInfoAddress: - type: string - etcd: - properties: - advertisePeerURLs: - items: - type: string - maxItems: 3 - minItems: 3 - type: array - affinity: - x-kubernetes-preserve-unknown-fields: true - annotations: - additionalProperties: - type: string - type: object - clientService: - properties: - annotations: - additionalProperties: - type: string - type: object - clusterIP: - type: string - type: object - createClientService: - type: boolean - createPDB: - type: boolean - createPeerService: - type: boolean - dataVolumeClaimTemplate: - properties: - accessModes: - items: - type: string - type: array - dataSource: - properties: - apiGroup: - type: string - kind: - type: string - name: - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - properties: - apiGroup: - type: string - kind: - type: string - name: - type: string - namespace: - type: string - required: - - kind - - name - type: object - resources: - properties: - claims: - items: + containerResource: + properties: + container: + type: string + name: + type: string + target: + properties: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + type: string + value: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - container + - name + - target + type: object + external: + properties: + metric: properties: name: type: string + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic required: - name type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - type: object - selector: - properties: - matchExpressions: - items: + target: properties: - key: - type: string - operator: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: type: string - values: - items: - type: string - type: array + value: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true required: - - key - - operator + - type type: object - type: array - matchLabels: - additionalProperties: - type: string - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - type: string - volumeMode: - type: string - volumeName: - type: string - type: object - extraEnv: - items: - properties: - name: - type: string - value: - type: string - valueFrom: + required: + - metric + - target + type: object + object: properties: - configMapKeyRef: + describedObject: properties: - key: + apiVersion: + type: string + kind: type: string name: type: string - optional: - type: boolean required: - - key + - kind + - name type: object - x-kubernetes-map-type: atomic - fieldRef: + metric: properties: - apiVersion: - type: string - fieldPath: + name: type: string + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic required: - - fieldPath + - name type: object - x-kubernetes-map-type: atomic - resourceFieldRef: + target: properties: - containerName: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: type: string - divisor: + value: anyOf: - type: integer - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true - resource: + required: + - type + type: object + required: + - describedObject + - metric + - target + type: object + pods: + properties: + metric: + properties: + name: type: string + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic required: - - resource + - name type: object - x-kubernetes-map-type: atomic - secretKeyRef: + target: properties: - key: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: type: string - name: + value: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - metric + - target + type: object + resource: + properties: + name: + type: string + target: + properties: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: type: string - optional: - type: boolean + value: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true required: - - key + - type type: object - x-kubernetes-map-type: atomic + required: + - name + - target type: object - required: - - name - type: object - type: array - extraFlags: - additionalProperties: - type: string - type: object - extraLabels: - additionalProperties: - type: string - type: object - extraVolumeMounts: - items: - properties: - mountPath: - type: string - mountPropagation: - type: string - name: - type: string - readOnly: - type: boolean - subPath: - type: string - subPathExpr: + type: type: string required: - - mountPath - - name - type: object - type: array - extraVolumes: - x-kubernetes-preserve-unknown-fields: true - image: - type: string - imagePullPolicy: - type: string - imagePullSecrets: - items: - properties: - name: - type: string + - type type: object - x-kubernetes-map-type: atomic type: array - initContainers: - x-kubernetes-preserve-unknown-fields: true - localMemberIndex: + x-kubernetes-list-type: atomic + minReplicas: format: int32 - maximum: 3 - minimum: 1 + minimum: 0 type: integer - peerService: - properties: - annotations: - additionalProperties: - type: string - type: object - clusterIP: - type: string - type: object - resources: - properties: - claims: - items: + type: object + extraEnv: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: properties: + key: + type: string name: + default: "" type: string + optional: + type: boolean required: - - name + - key type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - type: object - sidecarContainers: - x-kubernetes-preserve-unknown-fields: true - tolerations: - x-kubernetes-preserve-unknown-fields: true - type: object - external: - properties: - address: - type: string - implementation: - type: string - rootPath: - type: string - required: - - address - - implementation - - rootPath - type: object - type: object - name: - maxLength: 63 - minLength: 1 - pattern: ^[A-Za-z0-9]([_.A-Za-z0-9]*[A-Za-z0-9])?$ - type: string - topologyReconciliation: - properties: - pruneCells: - type: boolean - pruneKeyspaces: - type: boolean - pruneShardCells: - type: boolean - pruneShards: - type: boolean - pruneSrvKeyspaces: - type: boolean - pruneTablets: - type: boolean - registerCells: - type: boolean - registerCellsAliases: - type: boolean - type: object - zone: - type: string - required: - - allCells - - globalLockserver - - name - type: object - status: - properties: - gateway: - properties: - available: - type: string - serviceName: - type: string - type: object - idle: - type: string - keyspaces: - additionalProperties: - type: object - type: object - lockserver: - properties: - etcd: - properties: - available: - type: string - clientServiceName: - type: string - observedGeneration: - format: int64 - type: integer - type: object - type: object - observedGeneration: - format: int64 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.11.3 - creationTimestamp: null - name: vitessclusters.planetscale.com -spec: - group: planetscale.com - names: - kind: VitessCluster - listKind: VitessClusterList - plural: vitessclusters - shortNames: - - vt - singular: vitesscluster - scope: Namespaced - versions: - - name: v2 - schema: - openAPIV3Schema: - properties: - apiVersion: - type: string - kind: - type: string - metadata: - type: object - spec: - properties: - backup: - properties: - engine: - enum: - - builtin - - xtrabackup - type: string - locations: - items: - properties: - annotations: - additionalProperties: - type: string - type: object - azblob: - properties: - account: - minLength: 1 - type: string - authSecret: - properties: - key: - type: string - name: - type: string - volumeName: - type: string - required: - - key - type: object - container: - minLength: 1 - type: string - keyPrefix: - maxLength: 256 - pattern: ^[^\r\n]*$ - type: string - required: - - account - - authSecret - - container - type: object - ceph: - properties: - authSecret: + x-kubernetes-map-type: atomic + fieldRef: properties: - key: - type: string - name: + apiVersion: type: string - volumeName: + fieldPath: type: string required: - - key + - fieldPath type: object - required: - - authSecret - type: object - gcs: - properties: - authSecret: + x-kubernetes-map-type: atomic + resourceFieldRef: properties: - key: - type: string - name: + containerName: type: string - volumeName: + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: type: string required: - - key + - resource type: object - bucket: - minLength: 1 - type: string - keyPrefix: - maxLength: 256 - pattern: ^[^\r\n]*$ - type: string - required: - - bucket - type: object - name: - maxLength: 63 - pattern: ^[A-Za-z0-9]([A-Za-z0-9-_.]*[A-Za-z0-9])?$ - type: string - s3: - properties: - authSecret: + x-kubernetes-map-type: atomic + secretKeyRef: properties: key: type: string name: + default: "" type: string - volumeName: - type: string + optional: + type: boolean required: - key type: object - bucket: - minLength: 1 - type: string - endpoint: - type: string - forcePathStyle: - type: boolean - keyPrefix: - maxLength: 256 - pattern: ^[^\r\n]*$ - type: string - region: - minLength: 1 - type: string - required: - - bucket - - region + x-kubernetes-map-type: atomic type: object - volume: - x-kubernetes-preserve-unknown-fields: true - volumeSubPath: - type: string + required: + - name type: object - minItems: 1 type: array - schedules: + extraFlags: + additionalProperties: + type: string + type: object + extraLabels: + additionalProperties: + type: string + type: object + extraVolumeMounts: items: properties: - affinity: - x-kubernetes-preserve-unknown-fields: true - allowedMissedRun: - minimum: 0 - type: integer - annotations: - additionalProperties: - type: string - type: object - concurrencyPolicy: - enum: - - Allow - - Forbid - example: Forbid + mountPath: type: string - failedJobsHistoryLimit: - format: int32 - minimum: 0 - type: integer - jobTimeoutMinute: - default: 10 - format: int32 - minimum: 0 + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + extraVolumes: + x-kubernetes-preserve-unknown-fields: true + initContainers: + x-kubernetes-preserve-unknown-fields: true + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + replicas: + format: int32 + minimum: 0 + type: integer + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + secureTransport: + properties: + required: + type: boolean + tls: + properties: + certSecret: + properties: + key: + type: string + name: + type: string + volumeName: + type: string + required: + - key + type: object + clientCACertSecret: + properties: + key: + type: string + name: + type: string + volumeName: + type: string + required: + - key + type: object + keySecret: + properties: + key: + type: string + name: + type: string + volumeName: + type: string + required: + - key + type: object + type: object + type: object + service: + properties: + annotations: + additionalProperties: + type: string + type: object + clusterIP: + type: string + type: object + sidecarContainers: + x-kubernetes-preserve-unknown-fields: true + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + x-kubernetes-preserve-unknown-fields: true + topologySpreadConstraints: + x-kubernetes-preserve-unknown-fields: true + type: object + globalLockserver: + properties: + address: + type: string + implementation: + type: string + rootPath: + type: string + required: + - address + - implementation + - rootPath + type: object + imagePullPolicies: + properties: + mysqld: + type: string + mysqldExporter: + type: string + vtadmin: + type: string + vtbackup: + type: string + vtctld: + type: string + vtgate: + type: string + vtorc: + type: string + vttablet: + type: string + type: object + imagePullSecrets: + items: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: array + images: + properties: + vtgate: + type: string + type: object + lockserver: + properties: + cellInfoAddress: + type: string + etcd: + properties: + advertisePeerURLs: + items: + type: string + maxItems: 3 + minItems: 3 + type: array + affinity: + x-kubernetes-preserve-unknown-fields: true + annotations: + additionalProperties: + type: string + type: object + clientService: + properties: + annotations: + additionalProperties: + type: string + type: object + clusterIP: + type: string + type: object + createClientService: + type: boolean + createPDB: + type: boolean + createPeerService: + type: boolean + dataVolumeClaimTemplate: + properties: + accessModes: + items: + type: string + type: array + x-kubernetes-list-type: atomic + dataSource: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object + resources: + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + type: string + volumeAttributesClassName: + type: string + volumeMode: + type: string + volumeName: + type: string + type: object + extraEnv: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + extraFlags: + additionalProperties: + type: string + type: object + extraLabels: + additionalProperties: + type: string + type: object + extraVolumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + extraVolumes: + x-kubernetes-preserve-unknown-fields: true + image: + type: string + imagePullPolicy: + type: string + imagePullSecrets: + items: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: array + initContainers: + x-kubernetes-preserve-unknown-fields: true + localMemberIndex: + format: int32 + maximum: 3 + minimum: 1 + type: integer + peerService: + properties: + annotations: + additionalProperties: + type: string + type: object + clusterIP: + type: string + type: object + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + sidecarContainers: + x-kubernetes-preserve-unknown-fields: true + tolerations: + x-kubernetes-preserve-unknown-fields: true + type: object + external: + properties: + address: + type: string + implementation: + type: string + rootPath: + type: string + required: + - address + - implementation + - rootPath + type: object + type: object + name: + maxLength: 63 + minLength: 1 + pattern: ^[A-Za-z0-9]([_.A-Za-z0-9]*[A-Za-z0-9])?$ + type: string + topologyReconciliation: + properties: + pruneCells: + type: boolean + pruneKeyspaces: + type: boolean + pruneShardCells: + type: boolean + pruneShards: + type: boolean + pruneSrvKeyspaces: + type: boolean + pruneTablets: + type: boolean + registerCells: + type: boolean + registerCellsAliases: + type: boolean + type: object + zone: + type: string + required: + - allCells + - globalLockserver + - name + type: object + status: + properties: + gateway: + properties: + available: + type: string + labelSelector: + type: string + replicas: + format: int32 + minimum: 0 + type: integer + serviceName: + type: string + type: object + idle: + type: string + keyspaces: + additionalProperties: + type: object + type: object + lockserver: + properties: + etcd: + properties: + available: + type: string + clientServiceName: + type: string + observedGeneration: + format: int64 + type: integer + type: object + type: object + observedGeneration: + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + scale: + labelSelectorPath: .status.gateway.labelSelector + specReplicasPath: .spec.gateway.replicas + statusReplicasPath: .status.gateway.replicas + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.1 + name: vitessclusters.planetscale.com +spec: + group: planetscale.com + names: + kind: VitessCluster + listKind: VitessClusterList + plural: vitessclusters + shortNames: + - vt + singular: vitesscluster + scope: Namespaced + versions: + - name: v2 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + backup: + properties: + engine: + enum: + - builtin + - xtrabackup + - mysqlshell + type: string + locations: + items: + properties: + annotations: + additionalProperties: + type: string + type: object + azblob: + properties: + account: + minLength: 1 + type: string + authSecret: + properties: + key: + type: string + name: + type: string + volumeName: + type: string + required: + - key + type: object + container: + minLength: 1 + type: string + keyPrefix: + maxLength: 256 + pattern: ^[^\r\n]*$ + type: string + required: + - account + - authSecret + - container + type: object + ceph: + properties: + authSecret: + properties: + key: + type: string + name: + type: string + volumeName: + type: string + required: + - key + type: object + required: + - authSecret + type: object + gcs: + properties: + authSecret: + properties: + key: + type: string + name: + type: string + volumeName: + type: string + required: + - key + type: object + bucket: + minLength: 1 + type: string + keyPrefix: + maxLength: 256 + pattern: ^[^\r\n]*$ + type: string + required: + - bucket + type: object + name: + maxLength: 63 + pattern: ^[A-Za-z0-9]([A-Za-z0-9-_.]*[A-Za-z0-9])?$ + type: string + s3: + properties: + authSecret: + properties: + key: + type: string + name: + type: string + volumeName: + type: string + required: + - key + type: object + bucket: + minLength: 1 + type: string + endpoint: + type: string + forcePathStyle: + type: boolean + keyPrefix: + maxLength: 256 + pattern: ^[^\r\n]*$ + type: string + region: + minLength: 1 + type: string + required: + - bucket + - region + type: object + volume: + x-kubernetes-preserve-unknown-fields: true + volumeSubPath: + type: string + type: object + minItems: 1 + type: array + schedules: + items: + properties: + affinity: + x-kubernetes-preserve-unknown-fields: true + allowedMissedRun: + minimum: 0 + type: integer + annotations: + additionalProperties: + type: string + type: object + concurrencyPolicy: + enum: + - Allow + - Forbid + example: Forbid + type: string + failedJobsHistoryLimit: + format: int32 + minimum: 0 + type: integer + jobTimeoutMinute: + default: 10 + format: int32 + minimum: 0 type: integer name: example: every-day @@ -1674,115 +2043,452 @@ spec: type: string resources: properties: - claims: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + schedule: + example: 0 0 * * * + minLength: 0 + type: string + startingDeadlineSeconds: + format: int64 + minimum: 0 + type: integer + strategies: + items: + properties: + extraFlags: + additionalProperties: + type: string + type: object + keyspace: + example: commerce + type: string + name: + enum: + - BackupShard + type: string + shard: + example: '-' + type: string + required: + - keyspace + - name + - shard + type: object + minItems: 1 + type: array + successfulJobsHistoryLimit: + format: int32 + minimum: 0 + type: integer + suspend: + type: boolean + required: + - name + - resources + - schedule + - strategies + type: object + type: array + subcontroller: + properties: + serviceAccountName: + type: string + type: object + required: + - locations + type: object + cells: + items: + properties: + gateway: + properties: + affinity: + x-kubernetes-preserve-unknown-fields: true + annotations: + additionalProperties: + type: string + type: object + authentication: + properties: + static: + properties: + secret: + properties: + key: + type: string + name: + type: string + volumeName: + type: string + required: + - key + type: object + type: object + type: object + autoscaler: + properties: + behavior: + properties: + scaleDown: + properties: + policies: + items: + properties: + periodSeconds: + format: int32 + type: integer + type: + type: string + value: + format: int32 + type: integer + required: + - periodSeconds + - type + - value + type: object + type: array + x-kubernetes-list-type: atomic + selectPolicy: + type: string + stabilizationWindowSeconds: + format: int32 + type: integer + type: object + scaleUp: + properties: + policies: + items: + properties: + periodSeconds: + format: int32 + type: integer + type: + type: string + value: + format: int32 + type: integer + required: + - periodSeconds + - type + - value + type: object + type: array + x-kubernetes-list-type: atomic + selectPolicy: + type: string + stabilizationWindowSeconds: + format: int32 + type: integer + type: object + type: object + maxReplicas: + format: int32 + minimum: 0 + type: integer + metrics: items: properties: - name: + containerResource: + properties: + container: + type: string + name: + type: string + target: + properties: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + type: string + value: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - container + - name + - target + type: object + external: + properties: + metric: + properties: + name: + type: string + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + properties: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + type: string + value: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - metric + - target + type: object + object: + properties: + describedObject: + properties: + apiVersion: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + metric: + properties: + name: + type: string + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + properties: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + type: string + value: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - describedObject + - metric + - target + type: object + pods: + properties: + metric: + properties: + name: + type: string + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + properties: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + type: string + value: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - metric + - target + type: object + resource: + properties: + name: + type: string + target: + properties: + averageUtilization: + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + type: string + value: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - name + - target + type: object + type: type: string required: - - name + - type type: object type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - type: object - schedule: - example: 0 0 * * * - minLength: 0 - type: string - startingDeadlineSeconds: - format: int64 - minimum: 0 - type: integer - strategies: - items: - properties: - extraFlags: - additionalProperties: - type: string - type: object - keyspace: - example: commerce - type: string - name: - enum: - - BackupShard - type: string - shard: - example: '-' - type: string - required: - - keyspace - - name - - shard - type: object - minItems: 1 - type: array - successfulJobsHistoryLimit: - format: int32 - minimum: 0 - type: integer - suspend: - type: boolean - required: - - name - - resources - - schedule - - strategies - type: object - type: array - subcontroller: - properties: - serviceAccountName: - type: string - type: object - required: - - locations - type: object - cells: - items: - properties: - gateway: - properties: - affinity: - x-kubernetes-preserve-unknown-fields: true - annotations: - additionalProperties: - type: string - type: object - authentication: - properties: - static: - properties: - secret: - properties: - key: - type: string - name: - type: string - volumeName: - type: string - required: - - key - type: object - type: object + x-kubernetes-list-type: atomic + minReplicas: + format: int32 + minimum: 0 + type: integer type: object extraEnv: items: @@ -1798,6 +2504,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -1836,6 +2543,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -1867,6 +2575,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -1890,6 +2600,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic type: object httpGet: properties: @@ -1907,6 +2618,7 @@ spec: - value type: object type: array + x-kubernetes-list-type: atomic path: type: string port: @@ -1919,6 +2631,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1940,6 +2660,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic type: object httpGet: properties: @@ -1957,6 +2678,7 @@ spec: - value type: object type: array + x-kubernetes-list-type: atomic path: type: string port: @@ -1969,6 +2691,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1994,6 +2724,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -2117,6 +2849,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic dataSource: properties: apiGroup: @@ -2146,18 +2879,6 @@ spec: type: object resources: properties: - claims: - items: - properties: - name: - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2188,11 +2909,13 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic required: - key - operator type: object type: array + x-kubernetes-list-type: atomic matchLabels: additionalProperties: type: string @@ -2201,6 +2924,8 @@ spec: x-kubernetes-map-type: atomic storageClassName: type: string + volumeAttributesClassName: + type: string volumeMode: type: string volumeName: @@ -2220,6 +2945,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -2258,6 +2984,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -2289,6 +3016,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -2308,6 +3037,7 @@ spec: items: properties: name: + default: "" type: string type: object x-kubernetes-map-type: atomic @@ -2335,6 +3065,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -2441,6 +3173,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic dataSource: properties: apiGroup: @@ -2470,18 +3203,6 @@ spec: type: object resources: properties: - claims: - items: - properties: - name: - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2512,11 +3233,13 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic required: - key - operator type: object type: array + x-kubernetes-list-type: atomic matchLabels: additionalProperties: type: string @@ -2525,6 +3248,8 @@ spec: x-kubernetes-map-type: atomic storageClassName: type: string + volumeAttributesClassName: + type: string volumeMode: type: string volumeName: @@ -2544,6 +3269,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -2582,6 +3308,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -2613,6 +3340,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -2632,6 +3361,7 @@ spec: items: properties: name: + default: "" type: string type: object x-kubernetes-map-type: atomic @@ -2659,6 +3389,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -2725,6 +3457,7 @@ spec: items: properties: name: + default: "" type: string type: object x-kubernetes-map-type: atomic @@ -2846,6 +3579,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic dataSource: properties: apiGroup: @@ -2875,18 +3609,6 @@ spec: type: object resources: properties: - claims: - items: - properties: - name: - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -2917,11 +3639,13 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic required: - key - operator type: object type: array + x-kubernetes-list-type: atomic matchLabels: additionalProperties: type: string @@ -2930,6 +3654,8 @@ spec: x-kubernetes-map-type: atomic storageClassName: type: string + volumeAttributesClassName: + type: string volumeMode: type: string volumeName: @@ -2991,6 +3717,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -3029,6 +3756,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -3056,6 +3784,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -3080,6 +3810,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -3116,6 +3848,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -3179,6 +3913,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -3284,6 +4020,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic dataSource: properties: apiGroup: @@ -3313,18 +4050,6 @@ spec: type: object resources: properties: - claims: - items: - properties: - name: - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -3355,11 +4080,13 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic required: - key - operator type: object type: array + x-kubernetes-list-type: atomic matchLabels: additionalProperties: type: string @@ -3368,6 +4095,8 @@ spec: x-kubernetes-map-type: atomic storageClassName: type: string + volumeAttributesClassName: + type: string volumeMode: type: string volumeName: @@ -3429,6 +4158,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -3467,6 +4197,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -3494,6 +4225,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -3518,6 +4251,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -3554,6 +4289,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -3617,6 +4354,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -3696,6 +4435,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -3734,6 +4474,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -3765,6 +4506,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -3785,6 +4528,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -3897,6 +4642,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -3935,6 +4681,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -3966,6 +4713,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -3989,6 +4738,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -4046,6 +4797,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -4088,6 +4841,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -4126,6 +4880,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -4157,6 +4912,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -4206,6 +4963,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -4349,8 +5108,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.11.3 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.16.1 name: vitesskeyspaces.planetscale.com spec: group: planetscale.com @@ -4540,6 +5298,7 @@ spec: items: properties: name: + default: "" type: string type: object x-kubernetes-map-type: atomic @@ -4634,6 +5393,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic dataSource: properties: apiGroup: @@ -4663,18 +5423,6 @@ spec: type: object resources: properties: - claims: - items: - properties: - name: - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -4705,11 +5453,13 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic required: - key - operator type: object type: array + x-kubernetes-list-type: atomic matchLabels: additionalProperties: type: string @@ -4718,6 +5468,8 @@ spec: x-kubernetes-map-type: atomic storageClassName: type: string + volumeAttributesClassName: + type: string volumeMode: type: string volumeName: @@ -4779,6 +5531,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -4817,6 +5570,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -4844,6 +5598,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -4868,6 +5624,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -4904,6 +5662,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -4967,6 +5727,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -5072,6 +5834,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic dataSource: properties: apiGroup: @@ -5101,18 +5864,6 @@ spec: type: object resources: properties: - claims: - items: - properties: - name: - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -5143,11 +5894,13 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic required: - key - operator type: object type: array + x-kubernetes-list-type: atomic matchLabels: additionalProperties: type: string @@ -5156,6 +5909,8 @@ spec: x-kubernetes-map-type: atomic storageClassName: type: string + volumeAttributesClassName: + type: string volumeMode: type: string volumeName: @@ -5217,6 +5972,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -5255,6 +6011,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -5282,6 +6039,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -5306,6 +6065,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -5342,6 +6103,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -5405,6 +6168,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -5518,6 +6283,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -5556,6 +6322,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -5587,6 +6354,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -5607,6 +6376,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -5784,8 +6555,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.11.3 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.16.1 name: vitessshards.planetscale.com spec: group: planetscale.com @@ -5984,6 +6754,7 @@ spec: items: properties: name: + default: "" type: string type: object x-kubernetes-map-type: atomic @@ -6052,6 +6823,7 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic dataSource: properties: apiGroup: @@ -6081,18 +6853,6 @@ spec: type: object resources: properties: - claims: - items: - properties: - name: - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -6123,11 +6883,13 @@ spec: items: type: string type: array + x-kubernetes-list-type: atomic required: - key - operator type: object type: array + x-kubernetes-list-type: atomic matchLabels: additionalProperties: type: string @@ -6136,6 +6898,8 @@ spec: x-kubernetes-map-type: atomic storageClassName: type: string + volumeAttributesClassName: + type: string volumeMode: type: string volumeName: @@ -6197,6 +6961,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -6235,6 +7000,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -6262,6 +7028,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -6286,6 +7054,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -6322,6 +7092,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -6385,6 +7157,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -6483,6 +7257,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -6521,6 +7296,7 @@ spec: key: type: string name: + default: "" type: string optional: type: boolean @@ -6552,6 +7328,8 @@ spec: type: string readOnly: type: boolean + recursiveReadOnly: + type: string subPath: type: string subPathExpr: @@ -6572,6 +7350,8 @@ spec: properties: name: type: string + request: + type: string required: - name type: object @@ -6817,6 +7597,12 @@ rules: - jobs verbs: - '*' + - apiGroups: + - autoscaling + resources: + - horizontalpodautoscalers + verbs: + - '*' --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding diff --git a/go.mod b/go.mod index 59d0ad29827..8e7a90f89c8 100644 --- a/go.mod +++ b/go.mod @@ -1,25 +1,24 @@ module vitess.io/vitess -go 1.22.5 +go 1.23.2 require ( cloud.google.com/go/storage v1.43.0 - github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 + github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 github.com/Azure/azure-pipeline-go v0.2.3 github.com/Azure/azure-storage-blob-go v0.15.0 github.com/HdrHistogram/hdrhistogram-go v0.9.0 // indirect github.com/aquarapid/vaultlib v0.5.1 github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go v1.54.19 github.com/buger/jsonparser v1.1.1 github.com/cespare/xxhash/v2 v2.3.0 github.com/corpix/uarand v0.1.1 // indirect - github.com/dave/jennifer v1.7.0 + github.com/dave/jennifer v1.7.1 github.com/evanphx/json-patch v5.9.0+incompatible github.com/fsnotify/fsnotify v1.7.0 github.com/go-sql-driver/mysql v1.7.1 github.com/golang/glog v1.2.2 - github.com/golang/protobuf v1.5.4 + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 github.com/google/go-cmp v0.6.0 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 @@ -28,11 +27,10 @@ require ( github.com/gorilla/mux v1.8.1 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/hashicorp/consul/api v1.29.2 + github.com/hashicorp/consul/api v1.29.4 github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428 - github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/klauspost/compress v1.17.9 github.com/klauspost/pgzip v1.2.6 github.com/krishicks/yaml-patch v0.0.10 @@ -40,7 +38,7 @@ require ( github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1 github.com/montanaflynn/stats v0.7.1 github.com/olekukonko/tablewriter v0.0.5 - github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e + github.com/opentracing-contrib/go-grpc v0.0.0-20240724223109-9dec25a38fa8 github.com/opentracing/opentracing-go v1.2.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 // indirect @@ -48,9 +46,9 @@ require ( github.com/pires/go-proxyproto v0.7.0 github.com/pkg/errors v0.9.1 github.com/planetscale/pargzip v0.0.0-20201116224723-90c7fc03ea8a - github.com/planetscale/vtprotobuf v0.5.0 - github.com/prometheus/client_golang v1.19.1 - github.com/prometheus/common v0.55.0 + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 + github.com/prometheus/client_golang v1.20.3 + github.com/prometheus/common v0.59.1 github.com/sjmudd/stopwatch v0.1.1 github.com/soheilhy/cmux v0.1.5 github.com/spf13/cobra v1.8.1 @@ -58,32 +56,32 @@ require ( github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.9.0 github.com/tchap/go-patricia v2.3.0+incompatible - github.com/tidwall/gjson v1.17.1 - github.com/tinylib/msgp v1.2.0 // indirect + github.com/tidwall/gjson v1.17.3 + github.com/tinylib/msgp v1.2.1 // indirect github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 github.com/z-division/go-zookeeper v1.0.0 - go.etcd.io/etcd/api/v3 v3.5.14 - go.etcd.io/etcd/client/pkg/v3 v3.5.14 - go.etcd.io/etcd/client/v3 v3.5.14 + go.etcd.io/etcd/api/v3 v3.5.16 + go.etcd.io/etcd/client/pkg/v3 v3.5.16 + go.etcd.io/etcd/client/v3 v3.5.16 go.uber.org/mock v0.2.0 - golang.org/x/crypto v0.25.0 // indirect - golang.org/x/mod v0.19.0 // indirect - golang.org/x/net v0.27.0 - golang.org/x/oauth2 v0.21.0 - golang.org/x/sys v0.22.0 - golang.org/x/term v0.22.0 - golang.org/x/text v0.16.0 // indirect - golang.org/x/time v0.5.0 - golang.org/x/tools v0.23.0 - google.golang.org/api v0.188.0 - google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect - google.golang.org/grpc v1.65.0 + golang.org/x/crypto v0.27.0 // indirect + golang.org/x/mod v0.21.0 // indirect + golang.org/x/net v0.29.0 + golang.org/x/oauth2 v0.23.0 + golang.org/x/sys v0.25.0 + golang.org/x/term v0.24.0 + golang.org/x/text v0.18.0 // indirect + golang.org/x/time v0.6.0 + golang.org/x/tools v0.25.0 + google.golang.org/api v0.197.0 + google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.66.2 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/grpc/examples v0.0.0-20210430044426-28078834f35b google.golang.org/protobuf v1.34.2 - gopkg.in/DataDog/dd-trace-go.v1 v1.65.1 + gopkg.in/DataDog/dd-trace-go.v1 v1.67.1 gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect gopkg.in/ldap.v2 v2.5.1 sigs.k8s.io/yaml v1.4.0 @@ -92,6 +90,11 @@ require ( require ( github.com/DataDog/datadog-go/v5 v5.5.0 github.com/Shopify/toxiproxy/v2 v2.9.0 + github.com/aws/aws-sdk-go-v2 v1.30.4 + github.com/aws/aws-sdk-go-v2/config v1.27.31 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.15 + github.com/aws/aws-sdk-go-v2/service/s3 v1.60.1 + github.com/aws/smithy-go v1.20.4 github.com/bndr/gotabulate v1.1.2 github.com/gammazero/deque v0.2.1 github.com/google/safehtml v0.1.0 @@ -104,26 +107,40 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 github.com/xlab/treeprint v1.2.0 go.uber.org/goleak v1.3.0 - golang.org/x/exp v0.0.0-20240707233637-46b078467d37 - golang.org/x/sync v0.7.0 + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 + golang.org/x/sync v0.8.0 gonum.org/v1/gonum v0.14.0 - modernc.org/sqlite v1.30.2 + modernc.org/sqlite v1.33.1 ) require ( - cloud.google.com/go v0.115.0 // indirect - cloud.google.com/go/auth v0.7.1 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.3 // indirect - cloud.google.com/go/compute/metadata v0.5.0 // indirect - cloud.google.com/go/iam v1.1.11 // indirect + cloud.google.com/go v0.115.1 // indirect + cloud.google.com/go/auth v0.9.4 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect + cloud.google.com/go/compute/metadata v0.5.1 // indirect + cloud.google.com/go/iam v1.2.1 // indirect github.com/DataDog/appsec-internal-go v1.7.0 // indirect - github.com/DataDog/datadog-agent/pkg/obfuscate v0.55.0 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.55.0 // indirect - github.com/DataDog/go-libddwaf/v3 v3.3.0 // indirect - github.com/DataDog/go-sqllexer v0.0.12 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.57.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 // indirect + github.com/DataDog/go-libddwaf/v3 v3.4.0 // indirect + github.com/DataDog/go-sqllexer v0.0.14 // indirect github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect github.com/DataDog/sketches-go v1.4.6 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.30 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.30.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect @@ -137,9 +154,9 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.5 // indirect + github.com/google/s2a-go v0.1.8 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.13.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect @@ -152,14 +169,14 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-ieproxy v0.0.12 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/onsi/gomega v1.23.0 // indirect github.com/outcaste-io/ristretto v0.2.3 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect @@ -171,27 +188,27 @@ require ( github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/secure-systems-lab/go-securesystemslib v0.8.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/cast v1.7.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect + go.opentelemetry.io/otel v1.30.0 // indirect + go.opentelemetry.io/otel/metric v1.30.0 // indirect + go.opentelemetry.io/otel/trace v1.30.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b // indirect - modernc.org/libc v1.55.1 // indirect + modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a // indirect + modernc.org/libc v1.60.1 // indirect modernc.org/mathutil v1.6.0 // indirect modernc.org/memory v1.8.0 // indirect modernc.org/strutil v1.2.0 // indirect diff --git a/go.sum b/go.sum index 3ff3456402a..5258e8f05fa 100644 --- a/go.sum +++ b/go.sum @@ -1,21 +1,21 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= -cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= -cloud.google.com/go/auth v0.7.1 h1:Iv1bbpzJ2OIg16m94XI9/tlzZZl3cdeR3nGVGj78N7s= -cloud.google.com/go/auth v0.7.1/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs= -cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI= -cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I= -cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= -cloud.google.com/go/iam v1.1.11 h1:0mQ8UKSfdHLut6pH9FM3bI55KWR46ketn0PuXleDyxw= -cloud.google.com/go/iam v1.1.11/go.mod h1:biXoiLWYIKntto2joP+62sd9uW5EpkZmKIvfNcTWlnQ= -cloud.google.com/go/longrunning v0.5.9 h1:haH9pAuXdPAMqHvzX0zlWQigXT7B0+CL4/2nXXdBo5k= -cloud.google.com/go/longrunning v0.5.9/go.mod h1:HD+0l9/OOW0za6UWdKJtXoFAX/BGg/3Wj8p10NeWF7c= +cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go/auth v0.9.4 h1:DxF7imbEbiFu9+zdKC6cKBko1e8XeJnipNqIbWZ+kDI= +cloud.google.com/go/auth v0.9.4/go.mod h1:SHia8n6//Ya940F1rLimhJCjjx7KE17t0ctFEci3HkA= +cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= +cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +cloud.google.com/go/compute/metadata v0.5.1 h1:NM6oZeZNlYjiwYje+sYFjEpP0Q0zCan1bmQW/KmIrGs= +cloud.google.com/go/compute/metadata v0.5.1/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU= +cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g= +cloud.google.com/go/longrunning v0.6.0 h1:mM1ZmaNsQsnb+5n1DNPeL0KwQd9jQRqSqSDEkBZr+aI= +cloud.google.com/go/longrunning v0.6.0/go.mod h1:uHzSZqW89h7/pasCWNYdUpwGz3PcVWhrWupreVPYLts= cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= github.com/Azure/azure-storage-blob-go v0.15.0 h1:rXtgp8tN1p29GvpGgfJetavIG0V7OgcSXPpwp3tx6qk= @@ -34,17 +34,17 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/appsec-internal-go v1.7.0 h1:iKRNLih83dJeVya3IoUfK+6HLD/hQsIbyBlfvLmAeb0= github.com/DataDog/appsec-internal-go v1.7.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.55.0 h1:q8n6qVTPATzBL02e0rxCOrLFWDNw4as0GcuKWkJENFk= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.55.0/go.mod h1:/C99KWKukVnTtIiYCQ55izSNDQceREb8vSPa3zUn6jc= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.55.0 h1:+T+3WXCFC9g8r4AVBaD3v1LOKSLyKAtl/LtXyCTcm7I= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.55.0/go.mod h1:3yFk56PJ57yS1GqI9HAsS4PSlAeGCC9RQA7jxKzYj6g= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.57.0 h1:5hk3X9Ymna7RqYzoR3K15AZNgASJ89LvJY48tpTsjj0= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.57.0/go.mod h1:Po5HwoDd4FmT/EqgrE9x7Zz4LjxtGBSIuNY1C1lppBQ= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0/go.mod h1:4Vo3SJ24uzfKHUHLoFa8t8o+LH+7TCQ7sPcZDtOpSP4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/DataDog/go-libddwaf/v3 v3.3.0 h1:jS72fuQpFgJZEdEJDmHJCPAgNTEMZoz1EUvimPUOiJ4= -github.com/DataDog/go-libddwaf/v3 v3.3.0/go.mod h1:Bz/0JkpGf689mzbUjKJeheJINqsyyhM8p9PDuHdK2Ec= -github.com/DataDog/go-sqllexer v0.0.12 h1:ncvAr5bbwtc7JMezzcU2379oKz1oHhRF1hkR6BSvhqM= -github.com/DataDog/go-sqllexer v0.0.12/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= +github.com/DataDog/go-libddwaf/v3 v3.4.0 h1:NJ2W2vhYaOm1OWr1LJCbdgp7ezG/XLJcQKBmjFwhSuM= +github.com/DataDog/go-libddwaf/v3 v3.4.0/go.mod h1:n98d9nZ1gzenRSk53wz8l6d34ikxS+hs62A31Fqmyi4= +github.com/DataDog/go-sqllexer v0.0.14 h1:xUQh2tLr/95LGxDzLmttLgTo/1gzFeOyuwrQa/Iig4Q= +github.com/DataDog/go-sqllexer v0.0.14/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= @@ -73,8 +73,44 @@ github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= -github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.30.4 h1:frhcagrVNrzmT95RJImMHgabt99vkXGslubDaDagTk8= +github.com/aws/aws-sdk-go-v2 v1.30.4/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= +github.com/aws/aws-sdk-go-v2/config v1.27.31 h1:kxBoRsjhT3pq0cKthgj6RU6bXTm/2SgdoUMyrVw0rAI= +github.com/aws/aws-sdk-go-v2/config v1.27.31/go.mod h1:z04nZdSWFPaDwK3DdJOG2r+scLQzMYuJeW0CujEm9FM= +github.com/aws/aws-sdk-go-v2/credentials v1.17.30 h1:aau/oYFtibVovr2rDt8FHlU17BTicFEMAi29V1U+L5Q= +github.com/aws/aws-sdk-go-v2/credentials v1.17.30/go.mod h1:BPJ/yXV92ZVq6G8uYvbU0gSl8q94UB63nMT5ctNO38g= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 h1:yjwoSyDZF8Jth+mUk5lSPJCkMC0lMy6FaCD51jm6ayE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12/go.mod h1:fuR57fAgMk7ot3WcNQfb6rSEn+SUffl7ri+aa8uKysI= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.15 h1:ijB7hr56MngOiELJe0C5aQRaBQ11LveNgWFyG02AUto= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.15/go.mod h1:0QEmQSSWMVfiAk93l1/ayR9DQ9+jwni7gHS2NARZXB0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 h1:TNyt/+X43KJ9IJJMjKfa3bNTiZbUP7DeCxfbTROESwY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16/go.mod h1:2DwJF39FlNAUiX5pAc0UNeiz16lK2t7IaFcm0LFHEgc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 h1:jYfy8UPmd+6kJW5YhY0L1/KftReOGxI/4NtVSTh9O/I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16/go.mod h1:7ZfEPZxkW42Afq4uQB8H2E2e6ebh6mXTueEpYzjCzcs= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16 h1:mimdLQkIX1zr8GIPY1ZtALdBQGxcASiBd2MOp8m/dMc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16/go.mod h1:YHk6owoSwrIsok+cAH9PENCOGoH5PU2EllX4vLtSrsY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18 h1:GckUnpm4EJOAio1c8o25a+b3lVfwVzC9gnSBqiiNmZM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18/go.mod h1:Br6+bxfG33Dk3ynmkhsW2Z/t9D4+lRqdLDNCKi85w0U= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 h1:tJ5RnkHCiSH0jyd6gROjlJtNwov0eGYNz8s8nFcR0jQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18/go.mod h1:++NHzT+nAF7ZPrHPsA+ENvsXkOO8wEu+C6RXltAG4/c= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16 h1:jg16PhLPUiHIj8zYIW6bqzeQSuHVEiWnGA0Brz5Xv2I= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16/go.mod h1:Uyk1zE1VVdsHSU7096h/rwnXDzOzYQVl+FNPhPw7ShY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.60.1 h1:mx2ucgtv+MWzJesJY9Ig/8AFHgoE5FwLXwUVgW/FGdI= +github.com/aws/aws-sdk-go-v2/service/s3 v1.60.1/go.mod h1:BSPI0EfnYUuNHPS0uqIo5VrRwzie+Fp+YhQOUs16sKI= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 h1:zCsFCKvbj25i7p1u94imVoO447I/sFv8qq+lGJhRN0c= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.5/go.mod h1:ZeDX1SnKsVlejeuz41GiajjZpRSWR7/42q/EyA/QEiM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 h1:SKvPgvdvmiTWoi0GAJ7AsJfOz3ngVkD/ERbs5pUnHNI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5/go.mod h1:20sz31hv/WsPa3HhU3hfrIet2kxM4Pe0r20eBZ20Tac= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.5 h1:OMsEmCyz2i89XwRwPouAJvhj81wINh+4UK+k/0Yo/q8= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.5/go.mod h1:vmSqFK+BVIwVpDAGZB3CoCXHzurt4qBE8lf+I/kRTh0= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -103,8 +139,8 @@ github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE= -github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= +github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -142,6 +178,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gammazero/deque v0.2.1 h1:qSdsbG6pgp6nL7A0+K/B7s12mcCY/5l5SIUpMOl+dC0= github.com/gammazero/deque v0.2.1/go.mod h1:LFroj8x4cMYCukHJDbxFCkT+r9AndaJnFMuZDV34tuU= +github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= +github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -181,7 +219,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -195,7 +232,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -206,8 +242,8 @@ github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9 github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/safehtml v0.1.0 h1:EwLKo8qawTKfsi0orxcQAZzu07cICaBeFMegAU9eaT8= github.com/google/safehtml v0.1.0/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= @@ -216,10 +252,10 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= -github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= @@ -229,9 +265,8 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDa github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/consul/api v1.29.2 h1:aYyRn8EdE2mSfG14S1+L9Qkjtz8RzmaWh6AcNGRNwPw= -github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk= +github.com/hashicorp/consul/api v1.29.4 h1:P6slzxDLBOxUSj3fWo2o65VuKtbtOXFi7TSSgtXutuE= +github.com/hashicorp/consul/api v1.29.4/go.mod h1:HUlfw+l2Zy68ceJavv2zAyArl2fqhGWnMycyt56sBgg= github.com/hashicorp/consul/proto-public v0.6.2 h1:+DA/3g/IiKlJZb88NBn0ZgXrxJp2NlvCZdEyl+qxvL0= github.com/hashicorp/consul/proto-public v0.6.2/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= @@ -289,10 +324,6 @@ github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428 h1:Mo9W14pwbO9VfRe+y github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -315,6 +346,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/krishicks/yaml-patch v0.0.10 h1:H4FcHpnNwVmw8u0MjPRjWyIXtco6zM2F78t+57oNM3E= github.com/krishicks/yaml-patch v0.0.10/go.mod h1:Sm5TchwZS6sm7RJoyg87tzxm2ZcKzdRE4Q7TjNhPrME= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -336,8 +369,8 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= @@ -378,8 +411,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= -github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= -github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= +github.com/opentracing-contrib/go-grpc v0.0.0-20240724223109-9dec25a38fa8 h1:gHTSPFezGeYzTWCvpPM6lBanwXfuksik5Hy5MEHtvUA= +github.com/opentracing-contrib/go-grpc v0.0.0-20240724223109-9dec25a38fa8/go.mod h1:z1k3YVSdAPSXtMUPS1TBWG5DaNWlT+VCbB0Qm3QJe74= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= @@ -390,8 +423,8 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 h1:jYi87L8j62qkXzaYHAQAhEapgukhenIMZRBKTNRLHJ4= github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= @@ -405,8 +438,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/planetscale/pargzip v0.0.0-20201116224723-90c7fc03ea8a h1:y0OpQ4+5tKxeh9+H+2cVgASl9yMZYV9CILinKOiKafA= github.com/planetscale/pargzip v0.0.0-20201116224723-90c7fc03ea8a/go.mod h1:GJFUzQuXIoB2Kjn1ZfDhJr/42D5nWOqRcIQVgCxTuIE= -github.com/planetscale/vtprotobuf v0.5.0 h1:l8PXm6Colok5z6qQLNhAj2Jq5BfoMTIHxLER5a6nDqM= -github.com/planetscale/vtprotobuf v0.5.0/go.mod h1:wm1N3qk9G/4+VM1WhpkLbvY/d8+0PbwYYpP5P5VhTks= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -415,8 +448,8 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4= +github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -425,8 +458,8 @@ github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0= +github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= @@ -470,8 +503,8 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= @@ -495,22 +528,21 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= -github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94= +github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tinylib/msgp v1.2.0 h1:0uKB/662twsVBpYUPbokj4sTSKhWFKB7LopO2kWK8lY= -github.com/tinylib/msgp v1.2.0/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= +github.com/tinylib/msgp v1.2.1 h1:6ypy2qcCznxpP4hpORzhtXyTqrBs7cfM9MCCWY8zsmU= +github.com/tinylib/msgp v1.2.1/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= @@ -525,26 +557,26 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/z-division/go-zookeeper v1.0.0 h1:ULsCj0nP6+U1liDFWe+2oEF6o4amixoDcDlwEUghVUY= github.com/z-division/go-zookeeper v1.0.0/go.mod h1:6X4UioQXpvyezJJl4J9NHAJKsoffCwy5wCaaTktXjOA= -go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0= -go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU= -go.etcd.io/etcd/client/pkg/v3 v3.5.14 h1:SaNH6Y+rVEdxfpA2Jr5wkEvN6Zykme5+YnbCkxvuWxQ= -go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI= -go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg= -go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk= +go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0= +go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= +go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q= +go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= +go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= +go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= +go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= +go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= +go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= +go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= +go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= @@ -568,11 +600,11 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240707233637-46b078467d37 h1:uLDX+AfeFCct3a2C7uIWBKMJIR3CJMhcgfrUAqjRK6w= -golang.org/x/exp v0.0.0-20240707233637-46b078467d37/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -580,8 +612,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= -golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -593,7 +625,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -605,12 +636,12 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= -golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -618,8 +649,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -657,19 +688,19 @@ golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -682,18 +713,18 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= -golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= +golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= -google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= -google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= +google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ= +google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -701,22 +732,21 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc= -google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= -google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d h1:kHjw/5UfflP/L5EbledDrcG4C2597RtymmGRZvHiCuY= -google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= +google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= +google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/grpc/examples v0.0.0-20210430044426-28078834f35b h1:D/GTYPo6I1oEo08Bfpuj3xl5XE+UGHj7//5fVyKxhsQ= @@ -731,12 +761,10 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/DataDog/dd-trace-go.v1 v1.65.1 h1:Ne7kzWr/br/jwhUJR7CnqPl/mUpNxa6LfgZs0S4htZM= -gopkg.in/DataDog/dd-trace-go.v1 v1.65.1/go.mod h1:beNFIWd/H04d0k96cfltgiDH2+t0T5sDbyYLF3VTXqk= +gopkg.in/DataDog/dd-trace-go.v1 v1.67.1 h1:frgcpZ18wmpj+/TwyDJM8057M65aOdgaxLiZ8pb1PFU= +gopkg.in/DataDog/dd-trace-go.v1 v1.67.1/go.mod h1:6DdiJPKOeJfZyd/IUGCAd5elY8qPGkztK6wbYYsMjag= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= @@ -765,22 +793,20 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/gotraceui v0.2.0 h1:dmNsfQ9Vl3GwbiVD7Z8d/osC6WtGGrasyrC2suc4ZIQ= -honnef.co/go/gotraceui v0.2.0/go.mod h1:qHo4/W75cA3bX0QQoSvDjbJa4R8mAyyFjbWAj63XElc= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= -modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y= -modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s= +modernc.org/ccgo/v4 v4.21.0 h1:kKPI3dF7RIag8YcToh5ZwDcVMIv6VGa0ED5cvh0LMW4= +modernc.org/ccgo/v4 v4.21.0/go.mod h1:h6kt6H/A2+ew/3MW/p6KEoQmrq/i3pr0J/SiwiaF/g0= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= -modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= -modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= -modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b h1:BnN1t+pb1cy61zbvSUV7SeI0PwosMhlAEi/vBY4qxp8= -modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= -modernc.org/libc v1.55.1 h1:2K/vMbMDGymj0CO4mcQybYW8SW3czB+u9rlghpMkTrI= -modernc.org/libc v1.55.1/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= +modernc.org/gc/v2 v2.5.0 h1:bJ9ChznK1L1mUtAQtxi0wi5AtAs5jQuw4PrPHO5pb6M= +modernc.org/gc/v2 v2.5.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a h1:CfbpOLEo2IwNzJdMvE8aiRbPMxoTpgAJeyePh0SmO8M= +modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.60.1 h1:at373l8IFRTkJIkAU85BIuUoBM4T1b51ds0E1ovPG2s= +modernc.org/libc v1.60.1/go.mod h1:xJuobKuNxKH3RUatS7GjR+suWj+5c2K7bi4m/S5arOY= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= @@ -789,8 +815,8 @@ modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= -modernc.org/sqlite v1.30.2 h1:IPVVkhLu5mMVnS1dQgh3h0SAACRWcVk7aoLP9Us3UCk= -modernc.org/sqlite v1.30.2/go.mod h1:DUmsiWQDaAvU4abhc/N+djlom/L2o8f7gZ95RCvyoLU= +modernc.org/sqlite v1.33.1 h1:trb6Z3YYoeM9eDL1O8do81kP+0ejv+YzgyFo+Gwy0nM= +modernc.org/sqlite v1.33.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/go/cmd/vtctldclient/cli/tablets.go b/go/cmd/vtctldclient/cli/tablets.go index a2962c42b45..efd729a16ce 100644 --- a/go/cmd/vtctldclient/cli/tablets.go +++ b/go/cmd/vtctldclient/cli/tablets.go @@ -17,9 +17,11 @@ limitations under the License. package cli import ( - "vitess.io/vitess/go/vt/topo/topoproto" + "fmt" + "strings" topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/topo/topoproto" ) // TabletAliasesFromPosArgs takes a list of positional (non-flag) arguments and @@ -38,3 +40,22 @@ func TabletAliasesFromPosArgs(args []string) ([]*topodatapb.TabletAlias, error) return aliases, nil } + +// TabletTagsFromPosArgs takes a list of positional (non-flag) arguements and +// converts them to a map of tablet tags. +func TabletTagsFromPosArgs(args []string) (map[string]string, error) { + if len(args) == 0 { + return nil, fmt.Errorf("no tablet tags specified") + } + + tags := make(map[string]string, len(args)) + for _, kvPair := range args { + if !strings.Contains(kvPair, "=") { + return nil, fmt.Errorf("invalid tablet tag %q specified. tablet tags must be specified in key=value format", kvPair) + } + fields := strings.SplitN(kvPair, "=", 2) + tags[fields[0]] = fields[1] + } + + return tags, nil +} diff --git a/go/cmd/vtctldclient/cli/tablets_test.go b/go/cmd/vtctldclient/cli/tablets_test.go new file mode 100644 index 00000000000..4e5a7f74df5 --- /dev/null +++ b/go/cmd/vtctldclient/cli/tablets_test.go @@ -0,0 +1,48 @@ +/* +Copyright 2024 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 cli + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestTabletTagsFromPosArgs(t *testing.T) { + t.Parallel() + + { + tags, err := TabletTagsFromPosArgs([]string{"fail"}) + assert.Error(t, err) + assert.Nil(t, tags) + } + { + tags, err := TabletTagsFromPosArgs([]string{"hello=world"}) + assert.NoError(t, err) + assert.Equal(t, map[string]string{ + "hello": "world", + }, tags) + } + { + tags, err := TabletTagsFromPosArgs([]string{"hello=world", "test=123"}) + assert.NoError(t, err) + assert.Equal(t, map[string]string{ + "hello": "world", + "test": "123", + }, tags) + } +} diff --git a/go/cmd/vtctldclient/command/backups.go b/go/cmd/vtctldclient/command/backups.go index ea439ded70e..63d8c81d848 100644 --- a/go/cmd/vtctldclient/command/backups.go +++ b/go/cmd/vtctldclient/command/backups.go @@ -35,7 +35,7 @@ import ( var ( // Backup makes a Backup gRPC call to a vtctld. Backup = &cobra.Command{ - Use: "Backup [--concurrency ] [--allow-primary] [--incremental-from-pos=||auto] [--upgrade-safe] ", + Use: "Backup [--concurrency ] [--allow-primary] [--incremental-from-pos=||auto] [--upgrade-safe] [--backup-engine=enginename] ", Short: "Uses the BackupStorage service on the given tablet to create and store a new backup.", DisableFlagsInUseLine: true, Args: cobra.ExactArgs(1), @@ -70,7 +70,7 @@ If no replica-type tablet can be found, the backup can be taken on the primary i } // RestoreFromBackup makes a RestoreFromBackup gRPC call to a vtctld. RestoreFromBackup = &cobra.Command{ - Use: "RestoreFromBackup [--backup-timestamp|-t ] [--restore-to-pos ] [--dry-run] ", + Use: "RestoreFromBackup [--backup-timestamp|-t ] [--restore-to-pos ] [--allowed-backup-engines=enginename,] [--dry-run] ", Short: "Stops mysqld on the specified tablet and restores the data from either the latest backup or closest before `backup-timestamp`.", DisableFlagsInUseLine: true, Args: cobra.ExactArgs(1), @@ -80,6 +80,7 @@ If no replica-type tablet can be found, the backup can be taken on the primary i var backupOptions = struct { AllowPrimary bool + BackupEngine string Concurrency int32 IncrementalFromPos string UpgradeSafe bool @@ -93,13 +94,19 @@ func commandBackup(cmd *cobra.Command, args []string) error { cli.FinishedParsing(cmd) - stream, err := client.Backup(commandCtx, &vtctldatapb.BackupRequest{ + req := &vtctldatapb.BackupRequest{ TabletAlias: tabletAlias, AllowPrimary: backupOptions.AllowPrimary, Concurrency: backupOptions.Concurrency, IncrementalFromPos: backupOptions.IncrementalFromPos, UpgradeSafe: backupOptions.UpgradeSafe, - }) + } + + if backupOptions.BackupEngine != "" { + req.BackupEngine = &backupOptions.BackupEngine + } + + stream, err := client.Backup(commandCtx, req) if err != nil { return err } @@ -218,10 +225,11 @@ func commandRemoveBackup(cmd *cobra.Command, args []string) error { } var restoreFromBackupOptions = struct { - BackupTimestamp string - RestoreToPos string - RestoreToTimestamp string - DryRun bool + BackupTimestamp string + AllowedBackupEngines []string + RestoreToPos string + RestoreToTimestamp string + DryRun bool }{} func commandRestoreFromBackup(cmd *cobra.Command, args []string) error { @@ -243,10 +251,11 @@ func commandRestoreFromBackup(cmd *cobra.Command, args []string) error { } req := &vtctldatapb.RestoreFromBackupRequest{ - TabletAlias: alias, - RestoreToPos: restoreFromBackupOptions.RestoreToPos, - RestoreToTimestamp: protoutil.TimeToProto(restoreToTimestamp), - DryRun: restoreFromBackupOptions.DryRun, + TabletAlias: alias, + RestoreToPos: restoreFromBackupOptions.RestoreToPos, + RestoreToTimestamp: protoutil.TimeToProto(restoreToTimestamp), + DryRun: restoreFromBackupOptions.DryRun, + AllowedBackupEngines: restoreFromBackupOptions.AllowedBackupEngines, } if restoreFromBackupOptions.BackupTimestamp != "" { @@ -282,6 +291,7 @@ func init() { Backup.Flags().BoolVar(&backupOptions.AllowPrimary, "allow-primary", false, "Allow the primary of a shard to be used for the backup. WARNING: If using the builtin backup engine, this will shutdown mysqld on the primary and stop writes for the duration of the backup.") Backup.Flags().Int32Var(&backupOptions.Concurrency, "concurrency", 4, "Specifies the number of compression/checksum jobs to run simultaneously.") Backup.Flags().StringVar(&backupOptions.IncrementalFromPos, "incremental-from-pos", "", "Position, or name of backup from which to create an incremental backup. Default: empty. If given, then this backup becomes an incremental backup from given position or given backup. If value is 'auto', this backup will be taken from the last successful backup position.") + Backup.Flags().StringVar(&backupOptions.BackupEngine, "backup-engine", "", "Request a specific backup engine for this backup request. Defaults to the preferred backup engine of the target vttablet") Backup.Flags().BoolVar(&backupOptions.UpgradeSafe, "upgrade-safe", false, "Whether to use innodb_fast_shutdown=0 for the backup so it is safe to use for MySQL upgrades.") Root.AddCommand(Backup) @@ -299,6 +309,7 @@ func init() { Root.AddCommand(RemoveBackup) RestoreFromBackup.Flags().StringVarP(&restoreFromBackupOptions.BackupTimestamp, "backup-timestamp", "t", "", "Use the backup taken at, or closest before, this timestamp. Omit to use the latest backup. Timestamp format is \"YYYY-mm-DD.HHMMSS\".") + RestoreFromBackup.Flags().StringSliceVar(&restoreFromBackupOptions.AllowedBackupEngines, "allowed-backup-engines", restoreFromBackupOptions.AllowedBackupEngines, "if set, only backups taken with the specified engines are eligible to be restored") RestoreFromBackup.Flags().StringVar(&restoreFromBackupOptions.RestoreToPos, "restore-to-pos", "", "Run a point in time recovery that ends with the given position. This will attempt to use one full backup followed by zero or more incremental backups") RestoreFromBackup.Flags().StringVar(&restoreFromBackupOptions.RestoreToTimestamp, "restore-to-timestamp", "", "Run a point in time recovery that restores up to, and excluding, given timestamp in RFC3339 format (`2006-01-02T15:04:05Z07:00`). This will attempt to use one full backup followed by zero or more incremental backups") RestoreFromBackup.Flags().BoolVar(&restoreFromBackupOptions.DryRun, "dry-run", false, "Only validate restore steps, do not actually restore data") diff --git a/go/cmd/vtctldclient/command/keyspaces.go b/go/cmd/vtctldclient/command/keyspaces.go index 6330220d773..565e0c8aa82 100644 --- a/go/cmd/vtctldclient/command/keyspaces.go +++ b/go/cmd/vtctldclient/command/keyspaces.go @@ -182,7 +182,7 @@ func commandCreateKeyspace(cmd *cobra.Command, args []string) error { return errors.New("--sidecar-db-name cannot be empty when creating a keyspace") } if len(createKeyspaceOptions.SidecarDBName) > mysql.MaxIdentifierLength { - return sqlerror.NewSQLError(sqlerror.ERTooLongIdent, sqlerror.SSDataTooLong, "--sidecar-db-name identifier value of %q is too long (%d chars), max length for database identifiers is %d characters", + return sqlerror.NewSQLErrorf(sqlerror.ERTooLongIdent, sqlerror.SSDataTooLong, "--sidecar-db-name identifier value of %q is too long (%d chars), max length for database identifiers is %d characters", createKeyspaceOptions.SidecarDBName, len(createKeyspaceOptions.SidecarDBName), mysql.MaxIdentifierLength) } diff --git a/go/cmd/vtctldclient/command/onlineddl.go b/go/cmd/vtctldclient/command/onlineddl.go index 0ee64317bd6..cec60ddd988 100644 --- a/go/cmd/vtctldclient/command/onlineddl.go +++ b/go/cmd/vtctldclient/command/onlineddl.go @@ -56,8 +56,8 @@ var ( RunE: commandOnlineDDLCancel, } OnlineDDLCleanup = &cobra.Command{ - Use: "cleanup ", - Short: "Mark a given schema migration ready for artifact cleanup.", + Use: "cleanup ", + Short: "Mark a given schema migration, or all complete/failed/cancelled migrations, ready for artifact cleanup.", Example: "OnlineDDL cleanup test_keyspace 82fa54ac_e83e_11ea_96b7_f875a4d24e90", DisableFlagsInUseLine: true, Args: cobra.ExactArgs(2), @@ -168,12 +168,10 @@ func commandOnlineDDLCancel(cmd *cobra.Command, args []string) error { } func commandOnlineDDLCleanup(cmd *cobra.Command, args []string) error { - keyspace := cmd.Flags().Arg(0) - uuid := cmd.Flags().Arg(1) - if !schema.IsOnlineDDLUUID(uuid) { - return fmt.Errorf("%s is not a valid UUID", uuid) + keyspace, uuid, err := analyzeOnlineDDLCommandWithUuidOrAllArgument(cmd) + if err != nil { + return err } - cli.FinishedParsing(cmd) resp, err := client.CleanupSchemaMigration(commandCtx, &vtctldatapb.CleanupSchemaMigrationRequest{ diff --git a/go/cmd/vtctldclient/command/reparents.go b/go/cmd/vtctldclient/command/reparents.go index 17b87eaba4f..0043c6f7aa9 100644 --- a/go/cmd/vtctldclient/command/reparents.go +++ b/go/cmd/vtctldclient/command/reparents.go @@ -92,6 +92,7 @@ var emergencyReparentShardOptions = struct { Force bool WaitReplicasTimeout time.Duration NewPrimaryAliasStr string + ExpectedPrimaryAliasStr string IgnoreReplicaAliasStrList []string PreventCrossCellPromotion bool WaitForAllTablets bool @@ -105,6 +106,7 @@ func commandEmergencyReparentShard(cmd *cobra.Command, args []string) error { var ( newPrimaryAlias *topodatapb.TabletAlias + expectedPrimaryAlias *topodatapb.TabletAlias ignoreReplicaAliases = make([]*topodatapb.TabletAlias, len(emergencyReparentShardOptions.IgnoreReplicaAliasStrList)) ) @@ -115,6 +117,13 @@ func commandEmergencyReparentShard(cmd *cobra.Command, args []string) error { } } + if emergencyReparentShardOptions.ExpectedPrimaryAliasStr != "" { + expectedPrimaryAlias, err = topoproto.ParseTabletAlias(emergencyReparentShardOptions.ExpectedPrimaryAliasStr) + if err != nil { + return err + } + } + for i, aliasStr := range emergencyReparentShardOptions.IgnoreReplicaAliasStrList { alias, err := topoproto.ParseTabletAlias(aliasStr) if err != nil { @@ -130,6 +139,7 @@ func commandEmergencyReparentShard(cmd *cobra.Command, args []string) error { Keyspace: keyspace, Shard: shard, NewPrimary: newPrimaryAlias, + ExpectedPrimary: expectedPrimaryAlias, IgnoreReplicas: ignoreReplicaAliases, WaitReplicasTimeout: protoutil.DurationToProto(emergencyReparentShardOptions.WaitReplicasTimeout), PreventCrossCellPromotion: emergencyReparentShardOptions.PreventCrossCellPromotion, @@ -185,8 +195,10 @@ func commandInitShardPrimary(cmd *cobra.Command, args []string) error { var plannedReparentShardOptions = struct { NewPrimaryAliasStr string AvoidPrimaryAliasStr string + ExpectedPrimaryAliasStr string WaitReplicasTimeout time.Duration TolerableReplicationLag time.Duration + AllowCrossCellPromotion bool }{} func commandPlannedReparentShard(cmd *cobra.Command, args []string) error { @@ -196,8 +208,9 @@ func commandPlannedReparentShard(cmd *cobra.Command, args []string) error { } var ( - newPrimaryAlias *topodatapb.TabletAlias - avoidPrimaryAlias *topodatapb.TabletAlias + newPrimaryAlias *topodatapb.TabletAlias + avoidPrimaryAlias *topodatapb.TabletAlias + expectedPrimaryAlias *topodatapb.TabletAlias ) if plannedReparentShardOptions.NewPrimaryAliasStr != "" { @@ -214,6 +227,13 @@ func commandPlannedReparentShard(cmd *cobra.Command, args []string) error { } } + if plannedReparentShardOptions.ExpectedPrimaryAliasStr != "" { + expectedPrimaryAlias, err = topoproto.ParseTabletAlias(plannedReparentShardOptions.ExpectedPrimaryAliasStr) + if err != nil { + return err + } + } + cli.FinishedParsing(cmd) resp, err := client.PlannedReparentShard(commandCtx, &vtctldatapb.PlannedReparentShardRequest{ @@ -221,8 +241,10 @@ func commandPlannedReparentShard(cmd *cobra.Command, args []string) error { Shard: shard, NewPrimary: newPrimaryAlias, AvoidPrimary: avoidPrimaryAlias, + ExpectedPrimary: expectedPrimaryAlias, WaitReplicasTimeout: protoutil.DurationToProto(plannedReparentShardOptions.WaitReplicasTimeout), TolerableReplicationLag: protoutil.DurationToProto(plannedReparentShardOptions.TolerableReplicationLag), + AllowCrossCellPromotion: plannedReparentShardOptions.AllowCrossCellPromotion, }) if err != nil { return err @@ -284,6 +306,7 @@ func commandTabletExternallyReparented(cmd *cobra.Command, args []string) error func init() { EmergencyReparentShard.Flags().DurationVar(&emergencyReparentShardOptions.WaitReplicasTimeout, "wait-replicas-timeout", topo.RemoteOperationTimeout, "Time to wait for replicas to catch up in reparenting.") EmergencyReparentShard.Flags().StringVar(&emergencyReparentShardOptions.NewPrimaryAliasStr, "new-primary", "", "Alias of a tablet that should be the new primary. If not specified, the vtctld will select the best candidate to promote.") + EmergencyReparentShard.Flags().StringVar(&emergencyReparentShardOptions.ExpectedPrimaryAliasStr, "expected-primary", "", "Alias of a tablet that must be the current primary in order for the reparent to be processed.") EmergencyReparentShard.Flags().BoolVar(&emergencyReparentShardOptions.PreventCrossCellPromotion, "prevent-cross-cell-promotion", false, "Only promotes a new primary from the same cell as the previous primary.") EmergencyReparentShard.Flags().BoolVar(&emergencyReparentShardOptions.WaitForAllTablets, "wait-for-all-tablets", false, "Should ERS wait for all the tablets to respond. Useful when all the tablets are reachable.") EmergencyReparentShard.Flags().StringSliceVarP(&emergencyReparentShardOptions.IgnoreReplicaAliasStrList, "ignore-replicas", "i", nil, "Comma-separated, repeated list of replica tablet aliases to ignore during the emergency reparent.") @@ -297,6 +320,8 @@ func init() { PlannedReparentShard.Flags().DurationVar(&plannedReparentShardOptions.TolerableReplicationLag, "tolerable-replication-lag", 0, "Amount of replication lag that is considered acceptable for a tablet to be eligible for promotion when Vitess makes the choice of a new primary.") PlannedReparentShard.Flags().StringVar(&plannedReparentShardOptions.NewPrimaryAliasStr, "new-primary", "", "Alias of a tablet that should be the new primary.") PlannedReparentShard.Flags().StringVar(&plannedReparentShardOptions.AvoidPrimaryAliasStr, "avoid-primary", "", "Alias of a tablet that should not be the primary; i.e. \"reparent to any other tablet if this one is the primary\".") + PlannedReparentShard.Flags().StringVar(&plannedReparentShardOptions.ExpectedPrimaryAliasStr, "expected-primary", "", "Alias of a tablet that must be the current primary in order for the reparent to be processed.") + PlannedReparentShard.Flags().BoolVar(&plannedReparentShardOptions.AllowCrossCellPromotion, "allow-cross-cell-promotion", false, "Allow cross cell promotion") Root.AddCommand(PlannedReparentShard) Root.AddCommand(ReparentTablet) diff --git a/go/cmd/vtctldclient/command/root_test.go b/go/cmd/vtctldclient/command/root_test.go index 5efe844e1a1..86333ec0e69 100644 --- a/go/cmd/vtctldclient/command/root_test.go +++ b/go/cmd/vtctldclient/command/root_test.go @@ -20,7 +20,6 @@ import ( "context" "fmt" "os" - "strings" "testing" "time" @@ -110,9 +109,7 @@ func TestRootWithInternalVtctld(t *testing.T) { err := command.Root.Execute() if tc.expectErr != "" { - if !strings.Contains(err.Error(), tc.expectErr) { - t.Errorf(fmt.Sprintf("%s error = %v, expectErr = %v", tc.command, err, tc.expectErr)) - } + require.ErrorContains(t, err, tc.expectErr) } else { require.NoError(t, err, "unexpected error: %v", err) } diff --git a/go/cmd/vtctldclient/command/tablets.go b/go/cmd/vtctldclient/command/tablets.go index 3e1c1114133..bb468fbd7ff 100644 --- a/go/cmd/vtctldclient/command/tablets.go +++ b/go/cmd/vtctldclient/command/tablets.go @@ -34,6 +34,17 @@ import ( ) var ( + // ChangeTabletTags makes a ChangeTabletTags gRPC call to a vtctld. + ChangeTabletTags = &cobra.Command{ + Use: "ChangeTabletTags [ ... ]", + Short: "Changes the tablet tags for the specified tablet, if possible.", + Long: `Changes the tablet tags for the specified tablet, if possible. + +Tags must be specified as key=value pairs.`, + DisableFlagsInUseLine: true, + Args: cobra.MinimumNArgs(2), + RunE: commandChangeTabletTags, + } // ChangeTabletType makes a ChangeTabletType gRPC call to a vtctld. ChangeTabletType = &cobra.Command{ Use: "ChangeTabletType [--dry-run] ", @@ -212,6 +223,40 @@ Note that, in the SleepTablet implementation, the value should be positively-sig } ) +var changeTabletTagsOptions = struct { + Replace bool +}{} + +func commandChangeTabletTags(cmd *cobra.Command, args []string) error { + allArgs := cmd.Flags().Args() + + alias, err := topoproto.ParseTabletAlias(allArgs[0]) + if err != nil { + return err + } + + tags, err := cli.TabletTagsFromPosArgs(allArgs[1:]) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + resp, err := client.ChangeTabletTags(commandCtx, &vtctldatapb.ChangeTabletTagsRequest{ + TabletAlias: alias, + Tags: tags, + Replace: changeTabletTagsOptions.Replace, + }) + if err != nil { + return err + } + + fmt.Printf("- %v\n", cli.MarshalMapAWK(resp.BeforeTags)) + fmt.Printf("+ %v\n", cli.MarshalMapAWK(resp.AfterTags)) + + return nil +} + var changeTabletTypeOptions = struct { DryRun bool }{} @@ -629,6 +674,9 @@ func commandStopReplication(cmd *cobra.Command, args []string) error { } func init() { + ChangeTabletTags.Flags().BoolVarP(&changeTabletTagsOptions.Replace, "replace", "r", false, "Replace all tablet tags with the tags provided. By default tags are merged/updated.") + Root.AddCommand(ChangeTabletTags) + ChangeTabletType.Flags().BoolVarP(&changeTabletTypeOptions.DryRun, "dry-run", "d", false, "Shows the proposed change without actually executing it.") Root.AddCommand(ChangeTabletType) diff --git a/go/cmd/vtctldclient/command/throttler.go b/go/cmd/vtctldclient/command/throttler.go index 7a4f6c92653..da8b0763b0d 100644 --- a/go/cmd/vtctldclient/command/throttler.go +++ b/go/cmd/vtctldclient/command/throttler.go @@ -37,7 +37,7 @@ import ( var ( // UpdateThrottlerConfig makes a UpdateThrottlerConfig gRPC call to a vtctld. UpdateThrottlerConfig = &cobra.Command{ - Use: "UpdateThrottlerConfig [--enable|--disable] [--threshold=] [--custom-query=] [--check-as-check-self|--check-as-check-shard] [--throttle-app|unthrottle-app=] [--throttle-app-ratio=] [--throttle-app-duration=] ", + Use: "UpdateThrottlerConfig [--enable|--disable] [--metric-name=] [--threshold=] [--custom-query=] [--throttle-app|unthrottle-app=] [--throttle-app-ratio=] [--throttle-app-duration=] [--throttle-app-exempt=] [--app-name= --app-metrics=] ", Short: "Update the tablet throttler configuration for all tablets in the given keyspace (across all cells)", DisableFlagsInUseLine: true, Args: cobra.ExactArgs(1), @@ -171,6 +171,8 @@ func init() { UpdateThrottlerConfig.Flags().StringVar(&updateThrottlerConfigOptions.CustomQuery, "custom-query", "", "custom throttler check query") UpdateThrottlerConfig.Flags().BoolVar(&updateThrottlerConfigOptions.CheckAsCheckSelf, "check-as-check-self", false, "/throttler/check requests behave as is /throttler/check-self was called") UpdateThrottlerConfig.Flags().BoolVar(&updateThrottlerConfigOptions.CheckAsCheckShard, "check-as-check-shard", false, "use standard behavior for /throttler/check requests") + UpdateThrottlerConfig.Flags().MarkDeprecated("check-as-check-self", "specify metric with scope in --app-metrics to apply to all checks, or use --scope in CheckThrottler for a specific check") + UpdateThrottlerConfig.Flags().MarkDeprecated("check-as-check-shard", "specify metric with scope in --app-metrics to apply to all checks, or use --scope in CheckThrottler for a specific check") UpdateThrottlerConfig.Flags().StringVar(&unthrottledAppRule.Name, "unthrottle-app", "", "an app name to unthrottle") UpdateThrottlerConfig.Flags().StringVar(&throttledAppRule.Name, "throttle-app", "", "an app name to throttle") @@ -178,7 +180,7 @@ func init() { UpdateThrottlerConfig.Flags().DurationVar(&throttledAppDuration, "throttle-app-duration", throttle.DefaultAppThrottleDuration, "duration after which throttled app rule expires (app specififed in --throttled-app)") UpdateThrottlerConfig.Flags().BoolVar(&throttledAppRule.Exempt, "throttle-app-exempt", throttledAppRule.Exempt, "exempt this app from being at all throttled. WARNING: use with extreme care, as this is likely to push metrics beyond the throttler's threshold, and starve other apps") UpdateThrottlerConfig.Flags().StringVar(&updateThrottlerConfigOptions.AppName, "app-name", "", "app name for which to assign metrics (requires --app-metrics)") - UpdateThrottlerConfig.Flags().StringSliceVar(&updateThrottlerConfigOptions.AppCheckedMetrics, "app-metrics", nil, "metrics to be used when checking the throttler for the app (requires --app-name). Empty to restore to default metrics") + UpdateThrottlerConfig.Flags().StringSliceVar(&updateThrottlerConfigOptions.AppCheckedMetrics, "app-metrics", nil, "metrics to be used when checking the throttler for the app (requires --app-name). Empty to restore to default metrics. Example: --app-metrics=lag,custom,shard/loadavg") UpdateThrottlerConfig.MarkFlagsMutuallyExclusive("unthrottle-app", "throttle-app") UpdateThrottlerConfig.MarkFlagsRequiredTogether("app-name", "app-metrics") diff --git a/go/cmd/vtctldclient/command/transactions.go b/go/cmd/vtctldclient/command/transactions.go new file mode 100644 index 00000000000..c576acf2041 --- /dev/null +++ b/go/cmd/vtctldclient/command/transactions.go @@ -0,0 +1,132 @@ +/* +Copyright 2024 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 command + +import ( + "fmt" + + "github.com/spf13/cobra" + + "vitess.io/vitess/go/cmd/vtctldclient/cli" + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" +) + +var ( + DistributedTransaction = &cobra.Command{ + Use: "DistributedTransaction [command] [command-flags]", + Short: "Perform commands on distributed transaction", + Args: cobra.ExactArgs(1), + + DisableFlagsInUseLine: true, + } + + unresolvedTransactionsOptions = struct { + Keyspace string + AbandonAge int64 // in seconds + }{} + + // GetUnresolvedTransactions makes an GetUnresolvedTransactions gRPC call to a vtctld. + GetUnresolvedTransactions = &cobra.Command{ + Use: "unresolved-list --keyspace --abandon-age ", + Short: "Retrieves unresolved transactions for the given keyspace.", + Aliases: []string{"List"}, + Args: cobra.NoArgs, + RunE: commandGetUnresolvedTransactions, + + DisableFlagsInUseLine: true, + } + + concludeTransactionOptions = struct { + Dtid string + }{} + + // ConcludeTransaction makes a ConcludeTransaction gRPC call to a vtctld. + ConcludeTransaction = &cobra.Command{ + Use: "conclude --dtid ", + Short: "Concludes the unresolved transaction by rolling back the prepared transaction on each participating shard and removing the transaction metadata record.", + Aliases: []string{"Conclude"}, + Args: cobra.NoArgs, + RunE: commandConcludeTransaction, + + DisableFlagsInUseLine: true, + } +) + +type ConcludeTransactionOutput struct { + Dtid string `json:"dtid"` + Message string `json:"message"` + Error string `json:"error,omitempty"` +} + +const ( + concludeSuccess = "Successfully concluded the distributed transaction" + concludeFailure = "Failed to conclude the distributed transaction" +) + +func commandGetUnresolvedTransactions(cmd *cobra.Command, args []string) error { + cli.FinishedParsing(cmd) + + resp, err := client.GetUnresolvedTransactions(commandCtx, + &vtctldatapb.GetUnresolvedTransactionsRequest{ + Keyspace: unresolvedTransactionsOptions.Keyspace, + AbandonAge: unresolvedTransactionsOptions.AbandonAge, + }) + if err != nil { + return err + } + + data, err := cli.MarshalJSON(resp.Transactions) + if err != nil { + return err + } + fmt.Println(string(data)) + return nil +} + +func commandConcludeTransaction(cmd *cobra.Command, args []string) (err error) { + cli.FinishedParsing(cmd) + + output := ConcludeTransactionOutput{ + Dtid: concludeTransactionOptions.Dtid, + Message: concludeSuccess, + } + + _, err = client.ConcludeTransaction(commandCtx, + &vtctldatapb.ConcludeTransactionRequest{ + Dtid: concludeTransactionOptions.Dtid, + }) + if err != nil { + output.Message = concludeFailure + output.Error = err.Error() + } + + data, _ := cli.MarshalJSON(output) + fmt.Println(string(data)) + + return err +} + +func init() { + GetUnresolvedTransactions.Flags().StringVarP(&unresolvedTransactionsOptions.Keyspace, "keyspace", "k", "", "unresolved transactions list for the given keyspace.") + GetUnresolvedTransactions.Flags().Int64VarP(&unresolvedTransactionsOptions.AbandonAge, "abandon-age", "a", 0, "unresolved transactions list which are older than the specified age(in seconds).") + DistributedTransaction.AddCommand(GetUnresolvedTransactions) + + ConcludeTransaction.Flags().StringVarP(&concludeTransactionOptions.Dtid, "dtid", "d", "", "conclude transaction for the given distributed transaction ID.") + DistributedTransaction.AddCommand(ConcludeTransaction) + + Root.AddCommand(DistributedTransaction) +} diff --git a/go/cmd/vtctldclient/command/vreplication/common/cancel.go b/go/cmd/vtctldclient/command/vreplication/common/cancel.go index 838a95faad9..6b664a190bc 100644 --- a/go/cmd/vtctldclient/command/vreplication/common/cancel.go +++ b/go/cmd/vtctldclient/command/vreplication/common/cancel.go @@ -21,6 +21,8 @@ import ( "sort" "github.com/spf13/cobra" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "vitess.io/vitess/go/cmd/vtctldclient/cli" @@ -31,6 +33,7 @@ var CancelOptions = struct { KeepData bool KeepRoutingRules bool Shards []string + DeleteBatchSize int64 }{} func GetCancelCommand(opts *SubCommandsOpts) *cobra.Command { @@ -60,9 +63,13 @@ func commandCancel(cmd *cobra.Command, args []string) error { KeepData: CancelOptions.KeepData, KeepRoutingRules: CancelOptions.KeepRoutingRules, Shards: CancelOptions.Shards, + DeleteBatchSize: CancelOptions.DeleteBatchSize, } resp, err := GetClient().WorkflowDelete(GetCommandCtx(), req) if err != nil { + if grpcerr, ok := status.FromError(err); ok && (grpcerr.Code() == codes.DeadlineExceeded) { + return fmt.Errorf("Cancel action timed out. Please try again and the work will pick back up where it left off. Note that you can control the timeout using the --action_timeout flag and the delete batch size with --delete-batch-size.") + } return err } diff --git a/go/cmd/vtctldclient/command/vreplication/common/update.go b/go/cmd/vtctldclient/command/vreplication/common/update.go index 7875c9412ac..896d417d8db 100644 --- a/go/cmd/vtctldclient/command/vreplication/common/update.go +++ b/go/cmd/vtctldclient/command/vreplication/common/update.go @@ -21,13 +21,12 @@ import ( "sort" "strings" - "vitess.io/vitess/go/vt/proto/vtrpc" - "vitess.io/vitess/go/vt/vterrors" - "github.com/spf13/cobra" "vitess.io/vitess/go/cmd/vtctldclient/cli" "vitess.io/vitess/go/textutil" + "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" @@ -143,9 +142,8 @@ func commandUpdateState(cmd *cobra.Command, args []string) error { TabletRequest: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflowUpdateOptions.Workflow, Cells: textutil.SimulatedNullStringSlice, - TabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, - OnDdl: binlogdatapb.OnDDLAction(textutil.SimulatedNullInt), - State: state, + TabletTypes: textutil.SimulatedNullTabletTypeSlice, + State: &state, }, } diff --git a/go/cmd/vtctldclient/command/vreplication/common/utils.go b/go/cmd/vtctldclient/command/vreplication/common/utils.go index da774647c38..5ab3f43d627 100644 --- a/go/cmd/vtctldclient/command/vreplication/common/utils.go +++ b/go/cmd/vtctldclient/command/vreplication/common/utils.go @@ -19,6 +19,7 @@ package common import ( "bytes" "context" + "encoding/json" "fmt" "strings" "time" @@ -26,6 +27,8 @@ import ( "github.com/spf13/cobra" "vitess.io/vitess/go/cmd/vtctldclient/cli" + "vitess.io/vitess/go/vt/key" + "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtctl/vtctldclient" @@ -35,6 +38,7 @@ import ( tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" + vttablet "vitess.io/vitess/go/vt/vttablet/common" ) var ( @@ -66,6 +70,8 @@ var ( MySQLServerVersion string TruncateUILen int TruncateErrLen int + ReferenceTables []string + ConfigOverrides []string }{} ) @@ -139,6 +145,50 @@ func ParseTabletTypes(cmd *cobra.Command) error { return nil } +func ParseTableMaterializeSettings(tableSettings string, parser *sqlparser.Parser) ([]*vtctldatapb.TableMaterializeSettings, error) { + tableMaterializeSettings := make([]*vtctldatapb.TableMaterializeSettings, 0) + err := json.Unmarshal([]byte(tableSettings), &tableMaterializeSettings) + if err != nil { + return tableMaterializeSettings, fmt.Errorf("table-settings is not valid JSON") + } + if len(tableMaterializeSettings) == 0 { + return tableMaterializeSettings, fmt.Errorf("empty table-settings") + } + + // Validate the provided queries. + seenSourceTables := make(map[string]bool) + for _, tms := range tableMaterializeSettings { + if tms.TargetTable == "" || tms.SourceExpression == "" { + return tableMaterializeSettings, fmt.Errorf("missing target_table or source_expression") + } + // Validate that the query is valid. + stmt, err := parser.Parse(tms.SourceExpression) + if err != nil { + return tableMaterializeSettings, fmt.Errorf("invalid source_expression: %q", tms.SourceExpression) + } + // Validate that each source-expression uses a different table. + // If any of them query the same table the materialize workflow + // will fail. + err = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case sqlparser.TableName: + if node.Name.NotEmpty() { + if seenSourceTables[node.Name.String()] { + return false, fmt.Errorf("multiple source_expression queries use the same table: %q", node.Name.String()) + } + seenSourceTables[node.Name.String()] = true + } + } + return true, nil + }, stmt) + if err != nil { + return tableMaterializeSettings, err + } + } + + return tableMaterializeSettings, nil +} + func validateOnDDL(cmd *cobra.Command) error { if _, ok := binlogdatapb.OnDDLAction_value[strings.ToUpper(CreateOptions.OnDDL)]; !ok { return fmt.Errorf("invalid on-ddl value: %s", CreateOptions.OnDDL) @@ -146,6 +196,37 @@ func validateOnDDL(cmd *cobra.Command) error { return nil } +// ParseConfigOverrides converts a slice of key=value strings into a map of config overrides. The slice is passed +// as a flag to the command, and the key=value pairs are used to override the default vreplication config values. +func ParseConfigOverrides(overrides []string) (map[string]string, error) { + configOverrides := make(map[string]string, len(overrides)) + defaultConfig, err := vttablet.NewVReplicationConfig(nil) + if err != nil { + return nil, err + } + for _, kv := range overrides { + key, value, ok := strings.Cut(kv, "=") + if !ok { + return nil, fmt.Errorf("invalid config override format (var=value expected): %s", kv) + } + if _, ok := defaultConfig.Map()[key]; !ok { + return nil, fmt.Errorf("unknown vreplication config flag: %s", key) + } + configOverrides[key] = value + } + return configOverrides, nil +} + +// ValidateShards checks if the provided shard names are valid key ranges. +func ValidateShards(shards []string) error { + for _, shard := range shards { + if !key.IsValidKeyRange(shard) { + return fmt.Errorf("invalid shard: %q", shard) + } + } + return nil +} + func ParseAndValidateCreateOptions(cmd *cobra.Command) error { if err := validateOnDDL(cmd); err != nil { return err @@ -221,6 +302,7 @@ func AddCommonCreateFlags(cmd *cobra.Command) { cmd.Flags().BoolVar(&CreateOptions.DeferSecondaryKeys, "defer-secondary-keys", false, "Defer secondary index creation for a table until after it has been copied.") cmd.Flags().BoolVar(&CreateOptions.AutoStart, "auto-start", true, "Start the workflow after creating it.") cmd.Flags().BoolVar(&CreateOptions.StopAfterCopy, "stop-after-copy", false, "Stop the workflow after it's finished copying the existing rows and before it starts replicating changes.") + cmd.Flags().StringSliceVar(&CreateOptions.ConfigOverrides, "config-overrides", []string{}, "Specify one or more VReplication config flags to override as a comma-separated list of key=value pairs.") } var MirrorTrafficOptions = struct { @@ -239,6 +321,7 @@ var SwitchTrafficOptions = struct { Direction workflow.TrafficSwitchDirection InitializeTargetSequences bool Shards []string + Force bool }{} func AddCommonSwitchTrafficFlags(cmd *cobra.Command, initializeTargetSequences bool) { @@ -248,8 +331,9 @@ func AddCommonSwitchTrafficFlags(cmd *cobra.Command, initializeTargetSequences b cmd.Flags().DurationVar(&SwitchTrafficOptions.MaxReplicationLagAllowed, "max-replication-lag-allowed", MaxReplicationLagDefault, "Allow traffic to be switched only if VReplication lag is below this.") cmd.Flags().BoolVar(&SwitchTrafficOptions.EnableReverseReplication, "enable-reverse-replication", true, "Setup replication going back to the original source keyspace to support rolling back the traffic cutover.") cmd.Flags().BoolVar(&SwitchTrafficOptions.DryRun, "dry-run", false, "Print the actions that would be taken and report any known errors that would have occurred.") + cmd.Flags().BoolVar(&SwitchTrafficOptions.Force, "force", false, "Force the traffic switch even if some potentially non-critical actions cannot be performed; for example the tablet refresh fails on some tablets in the keyspace. WARNING: this should be used with extreme caution and only in emergency situations!") if initializeTargetSequences { - cmd.Flags().BoolVar(&SwitchTrafficOptions.InitializeTargetSequences, "initialize-target-sequences", false, "When moving tables from an unsharded keyspace to a sharded keyspace, initialize any sequences that are being used on the target when switching writes.") + cmd.Flags().BoolVar(&SwitchTrafficOptions.InitializeTargetSequences, "initialize-target-sequences", false, "When moving tables from an unsharded keyspace to a sharded keyspace, initialize any sequences that are being used on the target when switching writes. If the sequence table is not found, and the sequence table reference was fully qualified OR a value was specified for --global-keyspace, then we will attempt to create the sequence table in that keyspace.") } } diff --git a/go/cmd/vtctldclient/command/vreplication/materialize/create.go b/go/cmd/vtctldclient/command/vreplication/materialize/create.go index 3eccd20df2a..04f20410f46 100644 --- a/go/cmd/vtctldclient/command/vreplication/materialize/create.go +++ b/go/cmd/vtctldclient/command/vreplication/materialize/create.go @@ -91,6 +91,14 @@ func commandCreate(cmd *cobra.Command, args []string) error { tsp := common.GetTabletSelectionPreference(cmd) cli.FinishedParsing(cmd) + configOverrides, err := common.ParseConfigOverrides(common.CreateOptions.ConfigOverrides) + if err != nil { + return err + } + workflowOptions := &vtctldatapb.WorkflowOptions{ + Config: configOverrides, + } + ms := &vtctldatapb.MaterializeSettings{ Workflow: common.BaseOptions.Workflow, MaterializationIntent: vtctldatapb.MaterializationIntent_CUSTOM, @@ -101,6 +109,8 @@ func commandCreate(cmd *cobra.Command, args []string) error { Cell: strings.Join(common.CreateOptions.Cells, ","), TabletTypes: topoproto.MakeStringTypeCSV(common.CreateOptions.TabletTypes), TabletSelectionPreference: tsp, + ReferenceTables: common.CreateOptions.ReferenceTables, + WorkflowOptions: workflowOptions, } createOptions.TableSettings.parser, err = sqlparser.New(sqlparser.Options{ @@ -152,47 +162,9 @@ func (ts *tableSettings) String() string { } func (ts *tableSettings) Set(v string) error { - ts.val = make([]*vtctldatapb.TableMaterializeSettings, 0) - err := json.Unmarshal([]byte(v), &ts.val) - if err != nil { - return fmt.Errorf("table-settings is not valid JSON") - } - if len(ts.val) == 0 { - return fmt.Errorf("empty table-settings") - } - - // Validate the provided queries. - seenSourceTables := make(map[string]bool) - for _, tms := range ts.val { - if tms.TargetTable == "" || tms.SourceExpression == "" { - return fmt.Errorf("missing target_table or source_expression") - } - // Validate that the query is valid. - stmt, err := ts.parser.Parse(tms.SourceExpression) - if err != nil { - return fmt.Errorf("invalid source_expression: %q", tms.SourceExpression) - } - // Validate that each source-expression uses a different table. - // If any of them query the same table the materialize workflow - // will fail. - err = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { - switch node := node.(type) { - case sqlparser.TableName: - if node.Name.NotEmpty() { - if seenSourceTables[node.Name.String()] { - return false, fmt.Errorf("multiple source_expression queries use the same table: %q", node.Name.String()) - } - seenSourceTables[node.Name.String()] = true - } - } - return true, nil - }, stmt) - if err != nil { - return err - } - } - - return nil + var err error + ts.val, err = common.ParseTableMaterializeSettings(v, ts.parser) + return err } func (ts *tableSettings) Type() string { diff --git a/go/cmd/vtctldclient/command/vreplication/materialize/materialize.go b/go/cmd/vtctldclient/command/vreplication/materialize/materialize.go index 5845504af3f..cb595e6b7f7 100644 --- a/go/cmd/vtctldclient/command/vreplication/materialize/materialize.go +++ b/go/cmd/vtctldclient/command/vreplication/materialize/materialize.go @@ -47,11 +47,11 @@ func registerCommands(root *cobra.Command) { create.Flags().StringVar(&createOptions.SourceKeyspace, "source-keyspace", "", "Keyspace where the tables queried in the 'source_expression' values within table-settings live.") create.MarkFlagRequired("source-keyspace") create.Flags().Var(&createOptions.TableSettings, "table-settings", "A JSON array defining what tables to materialize using what select statements. See the --help output for more details.") - create.MarkFlagRequired("table-settings") create.Flags().BoolVar(&common.CreateOptions.StopAfterCopy, "stop-after-copy", false, "Stop the workflow after it's finished copying the existing rows and before it starts replicating changes.") create.Flags().StringVar(&common.CreateOptions.MySQLServerVersion, "mysql_server_version", fmt.Sprintf("%s-Vitess", config.DefaultMySQLVersion), "Configure the MySQL version to use for example for the parser.") create.Flags().IntVar(&common.CreateOptions.TruncateUILen, "sql-max-length-ui", 512, "truncate queries in debug UIs to the given length (default 512)") create.Flags().IntVar(&common.CreateOptions.TruncateErrLen, "sql-max-length-errors", 0, "truncate queries in error logs to the given length (default unlimited)") + create.Flags().StringSliceVarP(&common.CreateOptions.ReferenceTables, "reference-tables", "r", nil, "Used to specify the reference tables to materialize on every target shard.") base.AddCommand(create) // Generic workflow commands. diff --git a/go/cmd/vtctldclient/command/vreplication/movetables/create.go b/go/cmd/vtctldclient/command/vreplication/movetables/create.go index e7d5dbdfd82..71d812e99e6 100644 --- a/go/cmd/vtctldclient/command/vreplication/movetables/create.go +++ b/go/cmd/vtctldclient/command/vreplication/movetables/create.go @@ -40,6 +40,8 @@ var ( NoRoutingRules bool AtomicCopy bool WorkflowOptions vtctldatapb.WorkflowOptions + // This maps to a WorkflowOptions.ShardedAutoIncrementHandling ENUM value. + ShardedAutoIncrementHandlingStr string }{} // create makes a MoveTablesCreate gRPC call to a vtctld. @@ -87,6 +89,20 @@ var ( return fmt.Errorf("cannot specify both --tenant-id (i.e. a multi-tenant migration) and --source-shards (i.e. a shard-by-shard migration)") } + // createOptions.ShardedAutoIncrementHandlingStr is the CLI flag value + // provided and we need to map that to the ENUM value for + // createOptions.WorkflowOptions.ShardedAutoIncrementHandling which + // gets saved in the _vt.vreplication record's options column. + createOptions.ShardedAutoIncrementHandlingStr = strings.ToUpper(createOptions.ShardedAutoIncrementHandlingStr) + val, ok := vtctldatapb.ShardedAutoIncrementHandling_value[createOptions.ShardedAutoIncrementHandlingStr] + if !ok { + return fmt.Errorf("invalid value provided for --sharded-auto-increment-handling, valid values are: %s", shardedAutoIncHandlingStrOptions) + } + createOptions.WorkflowOptions.ShardedAutoIncrementHandling = vtctldatapb.ShardedAutoIncrementHandling(val) + if val == int32(vtctldatapb.ShardedAutoIncrementHandling_REPLACE) && createOptions.WorkflowOptions.GlobalKeyspace == "" { + fmt.Println("WARNING: no global-keyspace value provided so all sequence table references not fully qualified must be created manually before switching traffic") + } + return nil }, RunE: commandCreate, @@ -101,6 +117,12 @@ func commandCreate(cmd *cobra.Command, args []string) error { tsp := common.GetTabletSelectionPreference(cmd) cli.FinishedParsing(cmd) + configOverrides, err := common.ParseConfigOverrides(common.CreateOptions.ConfigOverrides) + if err != nil { + return err + } + createOptions.WorkflowOptions.Config = configOverrides + req := &vtctldatapb.MoveTablesCreateRequest{ Workflow: common.BaseOptions.Workflow, TargetKeyspace: common.BaseOptions.TargetKeyspace, diff --git a/go/cmd/vtctldclient/command/vreplication/movetables/movetables.go b/go/cmd/vtctldclient/command/vreplication/movetables/movetables.go index 4d8f9eaf3f0..969c05ec08d 100644 --- a/go/cmd/vtctldclient/command/vreplication/movetables/movetables.go +++ b/go/cmd/vtctldclient/command/vreplication/movetables/movetables.go @@ -17,12 +17,21 @@ limitations under the License. package movetables import ( + "fmt" + "strings" + "github.com/spf13/cobra" "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/common" "vitess.io/vitess/go/vt/topo/topoproto" + + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) +// The default batch size to use when deleting tenant data +// if a multi-tenant migration is canceled or deleted. +const DefaultDeleteBatchSize = 1000 + var ( // base is the base command for all actions related to MoveTables. base = &cobra.Command{ @@ -32,6 +41,7 @@ var ( Aliases: []string{"movetables"}, Args: cobra.ExactArgs(1), } + shardedAutoIncHandlingStrOptions string ) func registerCommands(root *cobra.Command) { @@ -49,8 +59,16 @@ func registerCommands(root *cobra.Command) { create.Flags().BoolVar(&createOptions.NoRoutingRules, "no-routing-rules", false, "(Advanced) Do not create routing rules while creating the workflow. See the reference documentation for limitations if you use this flag.") create.Flags().BoolVar(&createOptions.AtomicCopy, "atomic-copy", false, "(EXPERIMENTAL) A single copy phase is run for all tables from the source. Use this, for example, if your source keyspace has tables which use foreign key constraints.") create.Flags().StringVar(&createOptions.WorkflowOptions.TenantId, "tenant-id", "", "(EXPERIMENTAL: Multi-tenant migrations only) The tenant ID to use for the MoveTables workflow into a multi-tenant keyspace.") - create.Flags().BoolVar(&createOptions.WorkflowOptions.StripShardedAutoIncrement, "remove-sharded-auto-increment", true, "If moving the table(s) to a sharded keyspace, remove any auto_increment clauses when copying the schema to the target as sharded keyspaces should rely on either user/application generated values or Vitess sequences to ensure uniqueness.") create.Flags().StringSliceVar(&createOptions.WorkflowOptions.Shards, "shards", nil, "(EXPERIMENTAL: Multi-tenant migrations only) Specify that vreplication streams should only be created on this subset of target shards. Warning: you should first ensure that all rows on the source route to the specified subset of target shards using your VIndex of choice or you could lose data during the migration.") + create.Flags().StringVar(&createOptions.WorkflowOptions.GlobalKeyspace, "global-keyspace", "", "If specified, then attempt to create any global resources here such as sequence tables needed to replace auto_increment table clauses that are removed due to --sharded-auto-increment-handling=REPLACE. The value must be an unsharded keyspace that already exists.") + create.Flags().StringVar(&createOptions.ShardedAutoIncrementHandlingStr, "sharded-auto-increment-handling", vtctldatapb.ShardedAutoIncrementHandling_REMOVE.String(), + fmt.Sprintf("If moving the table(s) to a sharded keyspace, remove any MySQL auto_increment clauses when copying the schema to the target as sharded keyspaces should rely on either user/application generated values or Vitess sequences to ensure uniqueness. If REPLACE is specified then they are automatically replaced by Vitess sequence definitions. (options are: %s)", + shardedAutoIncHandlingStrOptions)) + // This flag was deprecated in v21 so can be removed in v22+. + create.Flags().StringVar(&createOptions.ShardedAutoIncrementHandlingStr, "remove-sharded-auto-increment", vtctldatapb.ShardedAutoIncrementHandling_REMOVE.String(), + fmt.Sprintf("If moving the table(s) to a sharded keyspace, remove any MySQL auto_increment clauses when copying the schema to the target as sharded keyspaces should rely on either user/application generated values or Vitess sequences to ensure uniqueness. If REPLACE is specified then they are automatically replaced by Vitess sequence definitions. (options are: %s)", + shardedAutoIncHandlingStrOptions)) + create.Flags().MarkDeprecated("remove-sharded-auto-increment", "please use --sharded-auto-increment-handling instead.") base.AddCommand(create) opts := &common.SubCommandsOpts{ @@ -94,10 +112,24 @@ func registerCommands(root *cobra.Command) { cancel := common.GetCancelCommand(opts) cancel.Flags().BoolVar(&common.CancelOptions.KeepData, "keep-data", false, "Keep the partially copied table data from the MoveTables workflow in the target keyspace.") cancel.Flags().BoolVar(&common.CancelOptions.KeepRoutingRules, "keep-routing-rules", false, "Keep the routing rules created for the MoveTables workflow.") + cancel.Flags().Int64Var(&common.CancelOptions.DeleteBatchSize, "delete-batch-size", DefaultDeleteBatchSize, "When cleaning up the migrated data in tables moved as part of a multi-tenant workflow, delete the records in batches of this size.") common.AddShardSubsetFlag(cancel, &common.CancelOptions.Shards) base.AddCommand(cancel) } func init() { common.RegisterCommandHandler("MoveTables", registerCommands) + + sb := strings.Builder{} + strvals := make([]string, len(vtctldatapb.ShardedAutoIncrementHandling_name)) + for enumval, strval := range vtctldatapb.ShardedAutoIncrementHandling_name { + strvals[enumval] = strval + } + for i, v := range strvals { + if i > 0 { + sb.WriteByte(',') + } + sb.WriteString(v) + } + shardedAutoIncHandlingStrOptions = sb.String() } diff --git a/go/cmd/vtctldclient/command/vreplication/reshard/create.go b/go/cmd/vtctldclient/command/vreplication/reshard/create.go index 05700dbb9fe..cf9bb0345b3 100644 --- a/go/cmd/vtctldclient/command/vreplication/reshard/create.go +++ b/go/cmd/vtctldclient/command/vreplication/reshard/create.go @@ -59,6 +59,14 @@ func commandReshardCreate(cmd *cobra.Command, args []string) error { tsp := common.GetTabletSelectionPreference(cmd) cli.FinishedParsing(cmd) + configOverrides, err := common.ParseConfigOverrides(common.CreateOptions.ConfigOverrides) + if err != nil { + return err + } + workflowOptions := &vtctldatapb.WorkflowOptions{ + Config: configOverrides, + } + req := &vtctldatapb.ReshardCreateRequest{ Workflow: common.BaseOptions.Workflow, Keyspace: common.BaseOptions.TargetKeyspace, @@ -72,6 +80,7 @@ func commandReshardCreate(cmd *cobra.Command, args []string) error { SourceShards: reshardCreateOptions.sourceShards, TargetShards: reshardCreateOptions.targetShards, SkipSchemaCopy: reshardCreateOptions.skipSchemaCopy, + WorkflowOptions: workflowOptions, } resp, err := common.GetClient().ReshardCreate(common.GetCommandCtx(), req) if err != nil { diff --git a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go index 9355049e39b..54b2eec0840 100644 --- a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go +++ b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff.go @@ -46,7 +46,7 @@ import ( ) var ( - tabletTypesDefault = []topodatapb.TabletType{ + TabletTypesDefault = []topodatapb.TabletType{ topodatapb.TabletType_RDONLY, topodatapb.TabletType_REPLICA, topodatapb.TabletType_PRIMARY, @@ -69,6 +69,8 @@ var ( WaitUpdateInterval time.Duration AutoRetry bool MaxDiffDuration time.Duration + RowDiffColumnTruncateAt int64 + AutoStart bool }{} deleteOptions = struct { @@ -76,7 +78,8 @@ var ( }{} resumeOptions = struct { - UUID uuid.UUID + UUID uuid.UUID + TargetShards []string }{} showOptions = struct { @@ -85,7 +88,8 @@ var ( }{} stopOptions = struct { - UUID uuid.UUID + UUID uuid.UUID + TargetShards []string }{} parseAndValidateCreate = func(cmd *cobra.Command, args []string) error { @@ -98,7 +102,7 @@ var ( createOptions.UUID = uuid.New() } if !cmd.Flags().Lookup("tablet-types").Changed { - createOptions.TabletTypes = tabletTypesDefault + createOptions.TabletTypes = TabletTypesDefault } if cmd.Flags().Lookup("source-cells").Changed { for i, cell := range createOptions.SourceCells { @@ -142,7 +146,7 @@ var ( Use: "create", Short: "Create and run a VDiff to compare the tables involved in a VReplication workflow between the source and target.", Example: `vtctldclient --server localhost:15999 vdiff --workflow commerce2customer --target-keyspace customer create -vtctldclient --server localhost:15999 vdiff --workflow commerce2customer --target-keyspace customer create b3f59678-5241-11ee-be56-0242ac120002`, +vtctldclient --server :15999 vdiff --workflow c2c --target-keyspace customer create b3f59678-5241-11ee-be56-0242ac120002 --source-cells zone1 --tablet-types "rdonly,replica" --target-cells zone1 --update-table-stats --max-report-sample-rows 1000 --wait --wait-update-interval 5s --max-diff-duration 1h --row-diff-column-truncate-at 0`, SilenceUsage: true, DisableFlagsInUseLine: true, Aliases: []string{"Create"}, @@ -190,7 +194,8 @@ vtctldclient --server localhost:15999 vdiff --workflow commerce2customer --targe return fmt.Errorf("invalid UUID provided: %v", err) } resumeOptions.UUID = uuid - return nil + + return common.ValidateShards(resumeOptions.TargetShards) }, RunE: commandResume, } @@ -199,8 +204,8 @@ vtctldclient --server localhost:15999 vdiff --workflow commerce2customer --targe show = &cobra.Command{ Use: "show", Short: "Show the status of a VDiff.", - Example: `vtctldclient --server localhost:15999 vdiff --workflow commerce2customer --target-keyspace customer show last -vtctldclient --server localhost:15999 vdiff --workflow commerce2customer --target-keyspace customer show a037a9e2-5628-11ee-8c99-0242ac120002 + Example: `vtctldclient --server localhost:15999 vdiff --workflow commerce2customer --target-keyspace customer show last --verbose --format json +vtctldclient --server :15999 vdiff --workflow commerce2customer --target-keyspace customer show a037a9e2-5628-11ee-8c99-0242ac120002 vtctldclient --server localhost:15999 vdiff --workflow commerce2customer --target-keyspace customer show all`, DisableFlagsInUseLine: true, Aliases: []string{"Show"}, @@ -235,7 +240,8 @@ vtctldclient --server localhost:15999 vdiff --workflow commerce2customer --targe return fmt.Errorf("invalid UUID provided: %v", err) } stopOptions.UUID = uuid - return nil + + return common.ValidateShards(stopOptions.TargetShards) }, RunE: commandStop, } @@ -294,6 +300,8 @@ func commandCreate(cmd *cobra.Command, args []string) error { AutoRetry: createOptions.AutoRetry, MaxReportSampleRows: createOptions.MaxReportSampleRows, MaxDiffDuration: protoutil.DurationToProto(createOptions.MaxDiffDuration), + RowDiffColumnTruncateAt: createOptions.RowDiffColumnTruncateAt, + AutoStart: &createOptions.AutoStart, }) if err != nil { @@ -377,6 +385,7 @@ func commandResume(cmd *cobra.Command, args []string) error { Workflow: common.BaseOptions.Workflow, TargetKeyspace: common.BaseOptions.TargetKeyspace, Uuid: resumeOptions.UUID.String(), + TargetShards: resumeOptions.TargetShards, }) if err != nil { @@ -408,12 +417,14 @@ type summary struct { RowsCompared int64 HasMismatch bool Shards string - StartedAt string `json:"StartedAt,omitempty"` - CompletedAt string `json:"CompletedAt,omitempty"` - TableSummaryMap map[string]tableSummary `json:"TableSummary,omitempty"` - Reports map[string]map[string]vdiff.DiffReport `json:"Reports,omitempty"` - Errors map[string]string `json:"Errors,omitempty"` - Progress *vdiff.ProgressReport `json:"Progress,omitempty"` + StartedAt string `json:"StartedAt,omitempty"` + CompletedAt string `json:"CompletedAt,omitempty"` + TableSummaryMap map[string]tableSummary `json:"TableSummary,omitempty"` + // This is keyed by table name and then by shard name. + Reports map[string]map[string]vdiff.DiffReport `json:"Reports,omitempty"` + // This is keyed by shard name. + Errors map[string]string `json:"Errors,omitempty"` + Progress *vdiff.ProgressReport `json:"Progress,omitempty"` } const summaryTextTemplate = ` @@ -696,6 +707,9 @@ func buildSingleSummary(keyspace, workflow, uuid string, resp *vtctldatapb.VDiff // Table summary information that must be accounted for across all shards. { table := row.AsString("table_name", "") + if table == "" { // This occurs when the table diff has not started on 1 or more shards + continue + } // Create the global VDiff table summary object if it doesn't exist. if _, ok := tableSummaryMap[table]; !ok { tableSummaryMap[table] = tableSummary{ @@ -778,7 +792,7 @@ func buildSingleSummary(keyspace, workflow, uuid string, resp *vtctldatapb.VDiff // If the vdiff has been started then we can calculate the progress. if summary.State == vdiff.StartedState { - buildProgressReport(summary, totalRowsToCompare) + summary.Progress = BuildProgressReport(summary.RowsCompared, totalRowsToCompare, summary.StartedAt) } sort.Strings(shards) // Sort for predictable output @@ -797,17 +811,17 @@ func buildSingleSummary(keyspace, workflow, uuid string, resp *vtctldatapb.VDiff return summary, nil } -func buildProgressReport(summary *summary, rowsToCompare int64) { +func BuildProgressReport(rowsCompared int64, rowsToCompare int64, startedAt string) *vdiff.ProgressReport { report := &vdiff.ProgressReport{} - if summary.RowsCompared >= 1 { + if rowsCompared >= 1 { // Round to 2 decimal points. - report.Percentage = math.Round(math.Min((float64(summary.RowsCompared)/float64(rowsToCompare))*100, 100.00)*100) / 100 + report.Percentage = math.Round(math.Min((float64(rowsCompared)/float64(rowsToCompare))*100, 100.00)*100) / 100 } if math.IsNaN(report.Percentage) { report.Percentage = 0 } pctToGo := math.Abs(report.Percentage - 100.00) - startTime, _ := time.Parse(vdiff.TimestampFormat, summary.StartedAt) + startTime, _ := time.Parse(vdiff.TimestampFormat, startedAt) curTime := time.Now().UTC() runTime := curTime.Unix() - startTime.Unix() if report.Percentage >= 1 { @@ -818,7 +832,7 @@ func buildProgressReport(summary *summary, rowsToCompare int64) { report.ETA = eta.Format(vdiff.TimestampFormat) } } - summary.Progress = report + return report } func commandShow(cmd *cobra.Command, args []string) error { @@ -856,6 +870,7 @@ func commandStop(cmd *cobra.Command, args []string) error { Workflow: common.BaseOptions.Workflow, TargetKeyspace: common.BaseOptions.TargetKeyspace, Uuid: stopOptions.UUID.String(), + TargetShards: stopOptions.TargetShards, }) if err != nil { @@ -879,23 +894,27 @@ func registerCommands(root *cobra.Command) { create.Flags().Int64Var(&createOptions.Limit, "limit", math.MaxInt64, "Max rows to stop comparing after.") create.Flags().BoolVar(&createOptions.DebugQuery, "debug-query", false, "Adds a mysql query to the report that can be used for further debugging.") create.Flags().Int64Var(&createOptions.MaxReportSampleRows, "max-report-sample-rows", 10, "Maximum number of row differences to report (0 for all differences). NOTE: when increasing this value it is highly recommended to also specify --only-pks") - create.Flags().BoolVar(&createOptions.OnlyPKs, "only-pks", false, "When reporting missing rows, only show primary keys in the report.") + create.Flags().BoolVar(&createOptions.OnlyPKs, "only-pks", false, "When reporting row differences, only show primary keys in the report.") create.Flags().StringSliceVar(&createOptions.Tables, "tables", nil, "Only run vdiff for these tables in the workflow.") create.Flags().Int64Var(&createOptions.MaxExtraRowsToCompare, "max-extra-rows-to-compare", 1000, "If there are collation differences between the source and target, you can have rows that are identical but simply returned in a different order from MySQL. We will do a second pass to compare the rows for any actual differences in this case and this flag allows you to control the resources used for this operation.") create.Flags().BoolVar(&createOptions.Wait, "wait", false, "When creating or resuming a vdiff, wait for it to finish before exiting.") create.Flags().DurationVar(&createOptions.WaitUpdateInterval, "wait-update-interval", time.Duration(1*time.Minute), "When waiting on a vdiff to finish, check and display the current status this often.") create.Flags().BoolVar(&createOptions.AutoRetry, "auto-retry", true, "Should this vdiff automatically retry and continue in case of recoverable errors.") - create.Flags().BoolVar(&createOptions.UpdateTableStats, "update-table-stats", false, "Update the table statistics, using ANALYZE TABLE, on each table involved in the VDiff during initialization. This will ensure that progress estimates are as accurate as possible -- but it does involve locks and can potentially impact query processing on the target keyspace.") + create.Flags().BoolVar(&createOptions.UpdateTableStats, "update-table-stats", false, "Update the table statistics, using ANALYZE TABLE, on each table involved in the vdiff during initialization. This will ensure that progress estimates are as accurate as possible -- but it does involve locks and can potentially impact query processing on the target keyspace.") create.Flags().DurationVar(&createOptions.MaxDiffDuration, "max-diff-duration", 0, "How long should an individual table diff run before being stopped and restarted in order to lessen the impact on tablets due to holding open database snapshots for long periods of time (0 is the default and means no time limit).") + create.Flags().Int64Var(&createOptions.RowDiffColumnTruncateAt, "row-diff-column-truncate-at", 128, "When showing row differences, truncate the non Primary Key column values to this length. A value less than 1 means do not truncate.") + create.Flags().BoolVar(&createOptions.AutoStart, "auto-start", true, "Start the vdiff upon creation. When false, the vdiff will be created but will not run until resumed.") base.AddCommand(create) base.AddCommand(delete) + resume.Flags().StringSliceVar(&resumeOptions.TargetShards, "target-shards", nil, "The target shards to resume the vdiff on; default is all shards.") base.AddCommand(resume) show.Flags().BoolVar(&showOptions.Verbose, "verbose", false, "Show verbose output in summaries") base.AddCommand(show) + stop.Flags().StringSliceVar(&stopOptions.TargetShards, "target-shards", nil, "The target shards to stop the vdiff on; default is all shards.") base.AddCommand(stop) } diff --git a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go index 8742d22abd0..8fbff03433d 100644 --- a/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go +++ b/go/cmd/vtctldclient/command/vreplication/vdiff/vdiff_test.go @@ -772,7 +772,7 @@ func TestBuildProgressReport(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - buildProgressReport(tt.args.summary, tt.args.rowsToCompare) + tt.args.summary.Progress = BuildProgressReport(tt.args.summary.RowsCompared, tt.args.rowsToCompare, tt.args.summary.StartedAt) // We always check the percentage require.Equal(t, int(tt.want.Percentage), int(tt.args.summary.Progress.Percentage)) diff --git a/go/cmd/vtctldclient/command/vreplication/workflow/delete.go b/go/cmd/vtctldclient/command/vreplication/workflow/delete.go index 3739979ff5f..6d78c3b4077 100644 --- a/go/cmd/vtctldclient/command/vreplication/workflow/delete.go +++ b/go/cmd/vtctldclient/command/vreplication/workflow/delete.go @@ -32,6 +32,7 @@ var ( deleteOptions = struct { KeepData bool KeepRoutingRules bool + DeleteBatchSize int64 }{} // delete makes a WorkflowDelete gRPC call to a vtctld. @@ -55,6 +56,7 @@ func commandDelete(cmd *cobra.Command, args []string) error { KeepData: deleteOptions.KeepData, KeepRoutingRules: deleteOptions.KeepRoutingRules, Shards: baseOptions.Shards, + DeleteBatchSize: deleteOptions.DeleteBatchSize, } resp, err := common.GetClient().WorkflowDelete(common.GetCommandCtx(), req) if err != nil { diff --git a/go/cmd/vtctldclient/command/vreplication/workflow/state.go b/go/cmd/vtctldclient/command/vreplication/workflow/state.go index 89e75312ab2..c10e50f403c 100644 --- a/go/cmd/vtctldclient/command/vreplication/workflow/state.go +++ b/go/cmd/vtctldclient/command/vreplication/workflow/state.go @@ -29,7 +29,6 @@ import ( binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) @@ -79,9 +78,8 @@ func commandUpdateState(cmd *cobra.Command, args []string) error { TabletRequest: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: baseOptions.Workflow, Cells: textutil.SimulatedNullStringSlice, - TabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, - OnDdl: binlogdatapb.OnDDLAction(textutil.SimulatedNullInt), - State: state, + TabletTypes: textutil.SimulatedNullTabletTypeSlice, + State: &state, }, } diff --git a/go/cmd/vtctldclient/command/vreplication/workflow/update.go b/go/cmd/vtctldclient/command/vreplication/workflow/update.go index 3d06ad3e64e..256cede5ab9 100644 --- a/go/cmd/vtctldclient/command/vreplication/workflow/update.go +++ b/go/cmd/vtctldclient/command/vreplication/workflow/update.go @@ -25,6 +25,7 @@ import ( "vitess.io/vitess/go/cmd/vtctldclient/cli" "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/common" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/textutil" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -39,6 +40,7 @@ var ( TabletTypes []topodatapb.TabletType TabletTypesInPreferenceOrder bool OnDDL string + ConfigOverrides []string }{} // update makes a WorkflowUpdate gRPC call to a vtctld. @@ -65,14 +67,17 @@ var ( } changes = true } else { - updateOptions.TabletTypes = []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)} + updateOptions.TabletTypes = textutil.SimulatedNullTabletTypeSlice } if cmd.Flags().Lookup("on-ddl").Changed { // Validate the provided value changes = true if _, ok := binlogdatapb.OnDDLAction_value[strings.ToUpper(updateOptions.OnDDL)]; !ok { return fmt.Errorf("invalid on-ddl value: %s", updateOptions.OnDDL) } - } // Simulated NULL will need to be handled in command + } + if len(updateOptions.ConfigOverrides) > 0 { + changes = true + } if !changes { return fmt.Errorf("no configuration options specified to update") } @@ -85,15 +90,6 @@ var ( func commandUpdate(cmd *cobra.Command, args []string) error { cli.FinishedParsing(cmd) - // We've already validated any provided value, if one WAS provided. - // Now we need to do the mapping from the string representation to - // the enum value. - onddl := int32(textutil.SimulatedNullInt) // Simulated NULL when no value provided - if val, ok := binlogdatapb.OnDDLAction_value[strings.ToUpper(updateOptions.OnDDL)]; ok { - onddl = val - } - - // Simulated NULL when no value is provided. tsp := tabletmanagerdatapb.TabletSelectionPreference_UNKNOWN if cmd.Flags().Lookup("tablet-types-in-order").Changed { if updateOptions.TabletTypesInPreferenceOrder { @@ -103,18 +99,29 @@ func commandUpdate(cmd *cobra.Command, args []string) error { } } + configOverrides, err := common.ParseConfigOverrides(updateOptions.ConfigOverrides) + if err != nil { + return err + } + req := &vtctldatapb.WorkflowUpdateRequest{ Keyspace: baseOptions.Keyspace, TabletRequest: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: baseOptions.Workflow, Cells: updateOptions.Cells, TabletTypes: updateOptions.TabletTypes, - TabletSelectionPreference: tsp, - OnDdl: binlogdatapb.OnDDLAction(onddl), - State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), // We don't allow changing this in the client command + TabletSelectionPreference: &tsp, + ConfigOverrides: configOverrides, }, } + // We've already validated any provided value, if one WAS provided. + // Now we need to do the mapping from the string representation to + // the enum value. + if val, ok := binlogdatapb.OnDDLAction_value[strings.ToUpper(updateOptions.OnDDL)]; ok { + req.TabletRequest.OnDdl = ptr.Of(binlogdatapb.OnDDLAction(val)) + } + resp, err := common.GetClient().WorkflowUpdate(common.GetCommandCtx(), req) if err != nil { return err diff --git a/go/cmd/vtctldclient/command/vreplication/workflow/workflow.go b/go/cmd/vtctldclient/command/vreplication/workflow/workflow.go index a4fbb37d4bd..63de3b70cee 100644 --- a/go/cmd/vtctldclient/command/vreplication/workflow/workflow.go +++ b/go/cmd/vtctldclient/command/vreplication/workflow/workflow.go @@ -20,6 +20,7 @@ import ( "github.com/spf13/cobra" "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/common" + "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/movetables" "vitess.io/vitess/go/vt/topo/topoproto" ) @@ -60,6 +61,7 @@ func registerCommands(root *cobra.Command) { delete.MarkFlagRequired("workflow") delete.Flags().BoolVar(&deleteOptions.KeepData, "keep-data", false, "Keep the partially copied table data from the workflow in the target keyspace.") delete.Flags().BoolVar(&deleteOptions.KeepRoutingRules, "keep-routing-rules", false, "Keep the routing rules created for the workflow.") + delete.Flags().Int64Var(&deleteOptions.DeleteBatchSize, "delete-batch-size", movetables.DefaultDeleteBatchSize, "When cleaning up the migrated data in tables moved as part of a multi-tenant MoveTables workflow, delete the records in batches of this size.") common.AddShardSubsetFlag(delete, &baseOptions.Shards) base.AddCommand(delete) @@ -88,6 +90,8 @@ func registerCommands(root *cobra.Command) { update.Flags().VarP((*topoproto.TabletTypeListFlag)(&updateOptions.TabletTypes), "tablet-types", "t", "New source tablet types to replicate from (e.g. PRIMARY,REPLICA,RDONLY).") update.Flags().BoolVar(&updateOptions.TabletTypesInPreferenceOrder, "tablet-types-in-order", true, "When performing source tablet selection, look for candidates in the type order as they are listed in the tablet-types flag.") update.Flags().StringVar(&updateOptions.OnDDL, "on-ddl", "", "New instruction on what to do when DDL is encountered in the VReplication stream. Possible values are IGNORE, STOP, EXEC, and EXEC_IGNORE.") + update.Flags().StringSliceVar(&updateOptions.ConfigOverrides, "config-overrides", nil, "Specify one or more VReplication config flags to override as a comma-separated list of key=value pairs.") + common.AddShardSubsetFlag(update, &baseOptions.Shards) base.AddCommand(update) } diff --git a/go/cmd/vtgateclienttest/services/fallback.go b/go/cmd/vtgateclienttest/services/fallback.go index 72175fe01ce..dab0e912ddb 100644 --- a/go/cmd/vtgateclienttest/services/fallback.go +++ b/go/cmd/vtgateclienttest/services/fallback.go @@ -60,10 +60,6 @@ func (c fallbackClient) CloseSession(ctx context.Context, session *vtgatepb.Sess return c.fallback.CloseSession(ctx, session) } -func (c fallbackClient) ResolveTransaction(ctx context.Context, dtid string) error { - return c.fallback.ResolveTransaction(ctx, dtid) -} - func (c fallbackClient) VStream(ctx context.Context, tabletType topodatapb.TabletType, vgtid *binlogdatapb.VGtid, filter *binlogdatapb.Filter, flags *vtgatepb.VStreamFlags, send func([]*binlogdatapb.VEvent) error) error { return c.fallback.VStream(ctx, tabletType, vgtid, filter, flags, send) } diff --git a/go/cmd/vtgateclienttest/services/terminal.go b/go/cmd/vtgateclienttest/services/terminal.go index 7245be547ac..8fa321e2606 100644 --- a/go/cmd/vtgateclienttest/services/terminal.go +++ b/go/cmd/vtgateclienttest/services/terminal.go @@ -71,10 +71,6 @@ func (c *terminalClient) CloseSession(ctx context.Context, session *vtgatepb.Ses return errTerminal } -func (c *terminalClient) ResolveTransaction(ctx context.Context, dtid string) error { - return errTerminal -} - func (c *terminalClient) VStream(ctx context.Context, tabletType topodatapb.TabletType, vgtid *binlogdatapb.VGtid, filter *binlogdatapb.Filter, flags *vtgatepb.VStreamFlags, send func([]*binlogdatapb.VEvent) error) error { return errTerminal } diff --git a/go/flags/endtoend/flags_test.go b/go/flags/endtoend/flags_test.go index cfc237dae5c..c1e244f5f70 100644 --- a/go/flags/endtoend/flags_test.go +++ b/go/flags/endtoend/flags_test.go @@ -22,13 +22,12 @@ package flags import ( "bytes" + _ "embed" "os" "os/exec" "testing" "text/template" - _ "embed" - "github.com/stretchr/testify/require" "vitess.io/vitess/go/test/utils" diff --git a/go/flags/endtoend/mysqlctl.txt b/go/flags/endtoend/mysqlctl.txt index 044d12981d5..2b179496fff 100644 --- a/go/flags/endtoend/mysqlctl.txt +++ b/go/flags/endtoend/mysqlctl.txt @@ -40,7 +40,7 @@ Flags: --db-credentials-vault-tls-ca string Path to CA PEM for validating Vault server certificate --db-credentials-vault-tokenfile string Path to file containing Vault auth token; token can also be passed using VAULT_TOKEN environment variable --db-credentials-vault-ttl duration How long to cache DB credentials from the Vault server (default 30m0s) - --db_charset string Character set used for this tablet. (default "utf8mb4") + --db_charset string Character set/collation used for this tablet. Make sure to configure this to a charset/collation supported by the lowest MySQL version in your environment. (default "utf8mb4") --db_conn_query_info enable parsing and processing of QUERY_OK info fields --db_connect_timeout_ms int connection timeout to mysqld in milliseconds (0 for no timeout) --db_dba_password string db dba password diff --git a/go/flags/endtoend/mysqlctld.txt b/go/flags/endtoend/mysqlctld.txt index 6bb1beb5bae..594329ce073 100644 --- a/go/flags/endtoend/mysqlctld.txt +++ b/go/flags/endtoend/mysqlctld.txt @@ -41,7 +41,7 @@ Flags: --db-credentials-vault-tls-ca string Path to CA PEM for validating Vault server certificate --db-credentials-vault-tokenfile string Path to file containing Vault auth token; token can also be passed using VAULT_TOKEN environment variable --db-credentials-vault-ttl duration How long to cache DB credentials from the Vault server (default 30m0s) - --db_charset string Character set used for this tablet. (default "utf8mb4") + --db_charset string Character set/collation used for this tablet. Make sure to configure this to a charset/collation supported by the lowest MySQL version in your environment. (default "utf8mb4") --db_conn_query_info enable parsing and processing of QUERY_OK info fields --db_connect_timeout_ms int connection timeout to mysqld in milliseconds (0 for no timeout) --db_dba_password string db dba password @@ -61,6 +61,7 @@ Flags: --db_tls_min_version string Configures the minimal TLS version negotiated when SSL is enabled. Defaults to TLSv1.2. Options: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. --dba_idle_timeout duration Idle timeout for dba connections (default 1m0s) --dba_pool_size int Size of the connection pool for dba connections (default 20) + --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_mode string Which auth plugin implementation to use (eg: static) --grpc_auth_mtls_allowed_substrings string List of substrings of at least one of the client certificate names (separated by colon). --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. diff --git a/go/flags/endtoend/vtbackup.txt b/go/flags/endtoend/vtbackup.txt index 004871d7c09..bf3a9eb9690 100644 --- a/go/flags/endtoend/vtbackup.txt +++ b/go/flags/endtoend/vtbackup.txt @@ -92,7 +92,7 @@ Flags: --db_appdebug_password string db appdebug password --db_appdebug_use_ssl Set this flag to false to make the appdebug connection to not use ssl (default true) --db_appdebug_user string db appdebug user userKey (default "vt_appdebug") - --db_charset string Character set used for this tablet. (default "utf8mb4") + --db_charset string Character set/collation used for this tablet. Make sure to configure this to a charset/collation supported by the lowest MySQL version in your environment. (default "utf8mb4") --db_conn_query_info enable parsing and processing of QUERY_OK info fields --db_connect_timeout_ms int connection timeout to mysqld in milliseconds (0 for no timeout) --db_dba_password string db dba password @@ -128,6 +128,7 @@ Flags: --file_backup_storage_root string Root directory for the file backup storage. --gcs_backup_storage_bucket string Google Cloud Storage bucket to use for backups. --gcs_backup_storage_root string Root prefix for all backup-related object names. + --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. --grpc_compression string Which protocol to use for compressing gRPC. Default: nothing. Supported: snappy --grpc_enable_tracing Enable gRPC tracing. @@ -175,6 +176,12 @@ Flags: --mycnf_slow_log_path string mysql slow query log path --mycnf_socket_file string mysql socket file --mycnf_tmp_dir string mysql tmp directory + --mysql-shell-backup-location string location where the backup will be stored + --mysql-shell-dump-flags string flags to pass to mysql shell dump utility. This should be a JSON string and will be saved in the MANIFEST (default "{\"threads\": 4}") + --mysql-shell-flags string execution flags to pass to mysqlsh binary to be used during dump/load (default "--defaults-file=/dev/null --js -h localhost") + --mysql-shell-load-flags string flags to pass to mysql shell load utility. This should be a JSON string (default "{\"threads\": 4, \"loadUsers\": true, \"updateGtidSet\": \"replace\", \"skipBinlog\": true, \"progressFile\": \"\"}") + --mysql-shell-should-drain decide if we should drain while taking a backup or continue to serving traffic + --mysql-shell-speedup-restore speed up restore by disabling redo logging and double write buffer during the restore process --mysql-shutdown-timeout duration how long to wait for mysqld shutdown (default 5m0s) --mysql_port int mysql port (default 3306) --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") diff --git a/go/flags/endtoend/vtcombo.txt b/go/flags/endtoend/vtcombo.txt index c59cd789ed3..8c6eafe9c1c 100644 --- a/go/flags/endtoend/vtcombo.txt +++ b/go/flags/endtoend/vtcombo.txt @@ -76,7 +76,7 @@ Flags: --db_appdebug_password string db appdebug password --db_appdebug_use_ssl Set this flag to false to make the appdebug connection to not use ssl (default true) --db_appdebug_user string db appdebug user userKey (default "vt_appdebug") - --db_charset string Character set used for this tablet. (default "utf8mb4") + --db_charset string Character set/collation used for this tablet. Make sure to configure this to a charset/collation supported by the lowest MySQL version in your environment. (default "utf8mb4") --db_conn_query_info enable parsing and processing of QUERY_OK info fields --db_connect_timeout_ms int connection timeout to mysqld in milliseconds (0 for no timeout) --db_dba_password string db dba password @@ -167,7 +167,6 @@ Flags: --grpc_server_keepalive_timeout duration After having pinged for keepalive check, the server waits for a duration of Timeout and if no activity is seen even after that the connection is closed. (default 10s) --grpc_use_effective_callerid If set, and SSL is not used, will set the immediate caller id from the effective caller id's principal. --health_check_interval duration Interval between health checks (default 20s) - --healthcheck-dial-concurrency int Maximum concurrency of new healthcheck connections. This should be less than the golang max thread limit of 10000. (default 1024) --healthcheck_retry_delay duration health check retry delay (default 2ms) --healthcheck_timeout duration the health check timeout period (default 1m0s) --heartbeat_enable If true, vttablet records (if master) or checks (if replica) the current time of a replication heartbeat in the sidecar database's heartbeat table. The result is used to inform the serving state of the vttablet via healthchecks. @@ -226,6 +225,12 @@ Flags: --mysql-server-drain-onterm If set, the server waits for --onterm_timeout for already connected clients to complete their in flight work --mysql-server-keepalive-period duration TCP period between keep-alives --mysql-server-pool-conn-read-buffers If set, the server will pool incoming connection read buffers + --mysql-shell-backup-location string location where the backup will be stored + --mysql-shell-dump-flags string flags to pass to mysql shell dump utility. This should be a JSON string and will be saved in the MANIFEST (default "{\"threads\": 4}") + --mysql-shell-flags string execution flags to pass to mysqlsh binary to be used during dump/load (default "--defaults-file=/dev/null --js -h localhost") + --mysql-shell-load-flags string flags to pass to mysql shell load utility. This should be a JSON string (default "{\"threads\": 4, \"loadUsers\": true, \"updateGtidSet\": \"replace\", \"skipBinlog\": true, \"progressFile\": \"\"}") + --mysql-shell-should-drain decide if we should drain while taking a backup or continue to serving traffic + --mysql-shell-speedup-restore speed up restore by disabling redo logging and double write buffer during the restore process --mysql-shutdown-timeout duration timeout to use when MySQL is being shut down. (default 5m0s) --mysql_allow_clear_text_without_tls If set, the server will allow the use of a clear text password over non-SSL connections. --mysql_auth_server_impl string Which auth server implementation to use. Options: none, ldap, clientcert, static, vault. (default "static") @@ -302,10 +307,11 @@ Flags: --queryserver-enable-views Enable views support in vttablet. --queryserver_enable_online_ddl Enable online DDL. (default true) --redact-debug-ui-queries redact full queries and bind variables from debug UI - --relay_log_max_items int Maximum number of rows for VReplication target buffering. (default 5000) - --relay_log_max_size int Maximum buffer size (in bytes) for VReplication target buffering. If single rows are larger than this, a single row is buffered at a time. (default 250000) + --relay_log_max_items int Maximum number of rows for vreplication target buffering. (default 5000) + --relay_log_max_size int Maximum buffer size (in bytes) for vreplication target buffering. If single rows are larger than this, a single row is buffered at a time. (default 250000) --remote_operation_timeout duration time to wait for a remote operation (default 15s) --replication_connect_retry duration how long to wait in between replica reconnect attempts. Only precise to the second. (default 10s) + --restore-from-backup-allowed-engines strings (init restore parameter) if set, only backups taken with the specified engines are eligible to be restored --restore-to-pos string (init incremental restore parameter) if set, run a point in time recovery that ends with the given position. This will attempt to use one full backup followed by zero or more incremental backups --restore-to-timestamp string (init incremental restore parameter) if set, run a point in time recovery that restores up to the given timestamp, if possible. Given timestamp in RFC3339 format. Example: '2006-01-02T15:04:05Z07:00' --restore_concurrency int (init restore parameter) how many concurrent files to restore at once (default 4) diff --git a/go/flags/endtoend/vtctlclient.txt b/go/flags/endtoend/vtctlclient.txt index 3c9c0a3cbb0..e7402c0eefd 100644 --- a/go/flags/endtoend/vtctlclient.txt +++ b/go/flags/endtoend/vtctlclient.txt @@ -9,6 +9,7 @@ Usage of vtctlclient: --config-type string Config file type (omit to infer config type from file extension). --datadog-agent-host string host to send spans to. if empty, no tracing will be done --datadog-agent-port string port to send spans to. if empty, no tracing will be done + --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. --grpc_compression string Which protocol to use for compressing gRPC. Default: nothing. Supported: snappy --grpc_enable_tracing Enable gRPC tracing. diff --git a/go/flags/endtoend/vtctld.txt b/go/flags/endtoend/vtctld.txt index f8e680da0f0..8b1aa6f4a92 100644 --- a/go/flags/endtoend/vtctld.txt +++ b/go/flags/endtoend/vtctld.txt @@ -57,6 +57,7 @@ Flags: --file_backup_storage_root string Root directory for the file backup storage. --gcs_backup_storage_bucket string Google Cloud Storage bucket to use for backups. --gcs_backup_storage_root string Root prefix for all backup-related object names. + --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_mode string Which auth plugin implementation to use (eg: static) --grpc_auth_mtls_allowed_substrings string List of substrings of at least one of the client certificate names (separated by colon). --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. @@ -85,7 +86,6 @@ Flags: --grpc_server_keepalive_enforcement_policy_permit_without_stream gRPC server permit client keepalive pings even when there are no active streams (RPCs) --grpc_server_keepalive_time duration After a duration of this time, if the server doesn't see any activity, it pings the client to see if the transport is still alive. (default 10s) --grpc_server_keepalive_timeout duration After having pinged for keepalive check, the server waits for a duration of Timeout and if no activity is seen even after that the connection is closed. (default 10s) - --healthcheck-dial-concurrency int Maximum concurrency of new healthcheck connections. This should be less than the golang max thread limit of 10000. (default 1024) -h, --help help for vtctld --jaeger-agent-host string host and port to send spans to. if empty, no tracing will be done --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index 01db05f602d..5ff2a7b21da 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -18,6 +18,7 @@ Available Commands: ApplyVSchema Applies the VTGate routing schema to the provided keyspace. Shows the result after application. Backup Uses the BackupStorage service on the given tablet to create and store a new backup. BackupShard Finds the most up-to-date REPLICA, RDONLY, or SPARE tablet in the given shard and uses the BackupStorage service on that tablet to create and store a new backup. + ChangeTabletTags Changes the tablet tags for the specified tablet, if possible. ChangeTabletType Changes the db type for the specified tablet, if possible. CheckThrottler Issue a throttler check on the given tablet. CreateKeyspace Creates the specified keyspace in the topology. @@ -28,6 +29,7 @@ Available Commands: DeleteShards Deletes the specified shards from the topology. DeleteSrvVSchema Deletes the SrvVSchema object in the given cell. DeleteTablets Deletes tablet(s) from the topology. + DistributedTransaction Perform commands on distributed transaction EmergencyReparentShard Reparents the shard to the new primary. Assumes the old primary is dead and not responding. ExecuteFetchAsApp Executes the given query as the App user on the remote tablet. ExecuteFetchAsDBA Executes the given query as the DBA user on the remote tablet. diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index 6d68e09d09b..4cb4cd34148 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -28,6 +28,8 @@ Flags: --allow-kill-statement Allows the execution of kill statement --allowed_tablet_types strings Specifies the tablet types this vtgate is allowed to route queries to. Should be provided as a comma-separated set of tablet types. --alsologtostderr log to standard error as well as files + --balancer-keyspaces strings When in balanced mode, a comma-separated list of keyspaces for which to use the balancer (optional) + --balancer-vtgate-cells strings When in balanced mode, a comma-separated list of cells that contain vtgates (required) --bind-address string Bind address for the server. If empty, the server will listen on all available unicast and anycast IP addresses of the local system. --buffer_drain_concurrency int Maximum number of requests retried simultaneously. More concurrency will increase the load on the PRIMARY vttablet when draining the buffer. (default 1) --buffer_keyspace_shards string If not empty, limit buffering to these entries (comma separated). Entry format: keyspace or keyspace/shard. Requires --enable_buffer=true. @@ -53,6 +55,7 @@ Flags: --discovery_high_replication_lag_minimum_serving duration Threshold above which replication lag is considered too high when applying the min_number_serving_vttablets flag. (default 2h0m0s) --discovery_low_replication_lag duration Threshold below which replication lag is considered low enough to be healthy. (default 30s) --emit_stats If set, emit stats to push-based monitoring and stats backends + --enable-balancer Enable the tablet balancer to evenly spread query load for a given tablet type --enable-partial-keyspace-migration (Experimental) Follow shard routing rules: enable only while migrating a keyspace shard by shard. See documentation on Partial MoveTables for more. (default false) --enable-views Enable views support in vtgate. --enable_buffer Enable buffering (stalling) of primary traffic during failovers. @@ -64,6 +67,7 @@ Flags: --foreign_key_mode string This is to provide how to handle foreign key constraint in create/alter table. Valid values are: allow, disallow (default "allow") --gate_query_cache_memory int gate server query cache size in bytes, maximum amount of memory to be cached. vtgate analyzes every incoming query and generate a query plan, these plans are being cached in a lru cache. This config controls the capacity of the lru cache. (default 33554432) --gateway_initial_tablet_timeout duration At startup, the tabletGateway will wait up to this duration to get at least one tablet per keyspace/shard/tablet type (default 30s) + --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc-send-session-in-streaming If set, will send the session as last packet in streaming api to support transactions in streaming --grpc-use-effective-groups If set, and SSL is not used, will set the immediate caller's security groups from the effective caller id's groups. --grpc-use-static-authentication-callerid If set, will set the immediate caller id to the username authenticated by the static auth plugin. @@ -96,7 +100,6 @@ Flags: --grpc_server_keepalive_time duration After a duration of this time, if the server doesn't see any activity, it pings the client to see if the transport is still alive. (default 10s) --grpc_server_keepalive_timeout duration After having pinged for keepalive check, the server waits for a duration of Timeout and if no activity is seen even after that the connection is closed. (default 10s) --grpc_use_effective_callerid If set, and SSL is not used, will set the immediate caller id from the effective caller id's principal. - --healthcheck-dial-concurrency int Maximum concurrency of new healthcheck connections. This should be less than the golang max thread limit of 10000. (default 1024) --healthcheck_retry_delay duration health check retry delay (default 2ms) --healthcheck_timeout duration the health check timeout period (default 1m0s) -h, --help help for vtgate diff --git a/go/flags/endtoend/vtgateclienttest.txt b/go/flags/endtoend/vtgateclienttest.txt index e7d8fc5e177..8a2f18b6b5a 100644 --- a/go/flags/endtoend/vtgateclienttest.txt +++ b/go/flags/endtoend/vtgateclienttest.txt @@ -14,6 +14,7 @@ Flags: --config-persistence-min-interval duration minimum interval between persisting dynamic config changes back to disk (if no change has occurred, nothing is done). (default 1s) --config-type string Config file type (omit to infer config type from file extension). --default_tablet_type topodatapb.TabletType The default tablet type to set for queries, when one is not explicitly selected. (default PRIMARY) + --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_mode string Which auth plugin implementation to use (eg: static) --grpc_auth_mtls_allowed_substrings string List of substrings of at least one of the client certificate names (separated by colon). --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. diff --git a/go/flags/endtoend/vtorc.txt b/go/flags/endtoend/vtorc.txt index 841cfc8b556..3917522a2f8 100644 --- a/go/flags/endtoend/vtorc.txt +++ b/go/flags/endtoend/vtorc.txt @@ -34,6 +34,7 @@ Flags: --config-type string Config file type (omit to infer config type from file extension). --consul_auth_static_file string JSON File to read the topos/tokens from. --emit_stats If set, emit stats to push-based monitoring and stats backends + --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. --grpc_compression string Which protocol to use for compressing gRPC. Default: nothing. Supported: snappy --grpc_enable_tracing Enable gRPC tracing. diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index f5a7f8e8f51..35a07b265bc 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -110,7 +110,7 @@ Flags: --db_appdebug_password string db appdebug password --db_appdebug_use_ssl Set this flag to false to make the appdebug connection to not use ssl (default true) --db_appdebug_user string db appdebug user userKey (default "vt_appdebug") - --db_charset string Character set used for this tablet. (default "utf8mb4") + --db_charset string Character set/collation used for this tablet. Make sure to configure this to a charset/collation supported by the lowest MySQL version in your environment. (default "utf8mb4") --db_conn_query_info enable parsing and processing of QUERY_OK info fields --db_connect_timeout_ms int connection timeout to mysqld in milliseconds (0 for no timeout) --db_dba_password string db dba password @@ -166,6 +166,7 @@ Flags: --gcs_backup_storage_bucket string Google Cloud Storage bucket to use for backups. --gcs_backup_storage_root string Root prefix for all backup-related object names. --gh-ost-path string override default gh-ost binary full path (default "gh-ost") + --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_mode string Which auth plugin implementation to use (eg: static) --grpc_auth_mtls_allowed_substrings string List of substrings of at least one of the client certificate names (separated by colon). --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. @@ -243,6 +244,12 @@ Flags: --mycnf_slow_log_path string mysql slow query log path --mycnf_socket_file string mysql socket file --mycnf_tmp_dir string mysql tmp directory + --mysql-shell-backup-location string location where the backup will be stored + --mysql-shell-dump-flags string flags to pass to mysql shell dump utility. This should be a JSON string and will be saved in the MANIFEST (default "{\"threads\": 4}") + --mysql-shell-flags string execution flags to pass to mysqlsh binary to be used during dump/load (default "--defaults-file=/dev/null --js -h localhost") + --mysql-shell-load-flags string flags to pass to mysql shell load utility. This should be a JSON string (default "{\"threads\": 4, \"loadUsers\": true, \"updateGtidSet\": \"replace\", \"skipBinlog\": true, \"progressFile\": \"\"}") + --mysql-shell-should-drain decide if we should drain while taking a backup or continue to serving traffic + --mysql-shell-speedup-restore speed up restore by disabling redo logging and double write buffer during the restore process --mysql-shutdown-timeout duration timeout to use when MySQL is being shut down. (default 5m0s) --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --mysqlctl_mycnf_template string template file to use for generating the my.cnf file during server init @@ -292,10 +299,11 @@ Flags: --queryserver-enable-views Enable views support in vttablet. --queryserver_enable_online_ddl Enable online DDL. (default true) --redact-debug-ui-queries redact full queries and bind variables from debug UI - --relay_log_max_items int Maximum number of rows for VReplication target buffering. (default 5000) - --relay_log_max_size int Maximum buffer size (in bytes) for VReplication target buffering. If single rows are larger than this, a single row is buffered at a time. (default 250000) + --relay_log_max_items int Maximum number of rows for vreplication target buffering. (default 5000) + --relay_log_max_size int Maximum buffer size (in bytes) for vreplication target buffering. If single rows are larger than this, a single row is buffered at a time. (default 250000) --remote_operation_timeout duration time to wait for a remote operation (default 15s) --replication_connect_retry duration how long to wait in between replica reconnect attempts. Only precise to the second. (default 10s) + --restore-from-backup-allowed-engines strings (init restore parameter) if set, only backups taken with the specified engines are eligible to be restored --restore-to-pos string (init incremental restore parameter) if set, run a point in time recovery that ends with the given position. This will attempt to use one full backup followed by zero or more incremental backups --restore-to-timestamp string (init incremental restore parameter) if set, run a point in time recovery that restores up to the given timestamp, if possible. Given timestamp in RFC3339 format. Example: '2006-01-02T15:04:05Z07:00' --restore_concurrency int (init restore parameter) how many concurrent files to restore at once (default 4) diff --git a/go/flags/endtoend/vttestserver.txt b/go/flags/endtoend/vttestserver.txt index 95c69714e59..042ffd37643 100644 --- a/go/flags/endtoend/vttestserver.txt +++ b/go/flags/endtoend/vttestserver.txt @@ -43,6 +43,7 @@ Flags: --external_topo_implementation string the topology implementation to use for vtcombo process --extra_my_cnf string extra files to add to the config, separated by ':' --foreign_key_mode string This is to provide how to handle foreign key constraint in create/alter table. Valid values are: allow, disallow (default "allow") + --grpc-dial-concurrency-limit int Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000. (default 1024) --grpc_auth_mode string Which auth plugin implementation to use (eg: static) --grpc_auth_mtls_allowed_substrings string List of substrings of at least one of the client certificate names (separated by colon). --grpc_auth_static_client_creds string When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server. @@ -87,6 +88,12 @@ Flags: --max-stack-size int configure the maximum stack size in bytes (default 67108864) --max_table_shard_size int The maximum number of initial rows in a table shard. Ignored if--initialize_with_random_data is false. The actual number is chosen randomly (default 10000) --min_table_shard_size int The minimum number of initial rows in a table shard. Ignored if--initialize_with_random_data is false. The actual number is chosen randomly. (default 1000) + --mysql-shell-backup-location string location where the backup will be stored + --mysql-shell-dump-flags string flags to pass to mysql shell dump utility. This should be a JSON string and will be saved in the MANIFEST (default "{\"threads\": 4}") + --mysql-shell-flags string execution flags to pass to mysqlsh binary to be used during dump/load (default "--defaults-file=/dev/null --js -h localhost") + --mysql-shell-load-flags string flags to pass to mysql shell load utility. This should be a JSON string (default "{\"threads\": 4, \"loadUsers\": true, \"updateGtidSet\": \"replace\", \"skipBinlog\": true, \"progressFile\": \"\"}") + --mysql-shell-should-drain decide if we should drain while taking a backup or continue to serving traffic + --mysql-shell-speedup-restore speed up restore by disabling redo logging and double write buffer during the restore process --mysql_bind_host string which host to bind vtgate mysql listener to (default "localhost") --mysql_only If this flag is set only mysql is initialized. The rest of the vitess components are not started. Also, the output specifies the mysql unix socket instead of the vtgate port. --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") diff --git a/go/ioutil/writer.go b/go/ioutil/writer.go index 4aac07ba501..759ae1b7ab6 100644 --- a/go/ioutil/writer.go +++ b/go/ioutil/writer.go @@ -22,6 +22,7 @@ wrappers around WriteCloser and Writer. package ioutil import ( + "bytes" "io" "time" ) @@ -87,3 +88,16 @@ func NewMeteredWriter(tw io.Writer, fns ...func(int, time.Duration)) MeteredWrit func (tw *meteredWriter) Write(p []byte) (int, error) { return tw.meter.measure(tw.Writer.Write, p) } + +// BytesBufferWriter implements io.WriteCloser using an in-memory buffer. +type BytesBufferWriter struct { + *bytes.Buffer +} + +func (m BytesBufferWriter) Close() error { + return nil +} + +func NewBytesBufferWriter() BytesBufferWriter { + return BytesBufferWriter{bytes.NewBuffer(nil)} +} diff --git a/go/mysql/auth_server.go b/go/mysql/auth_server.go index f4bda2655a5..59a5634bbc0 100644 --- a/go/mysql/auth_server.go +++ b/go/mysql/auth_server.go @@ -428,7 +428,7 @@ func (n *mysqlNativePasswordAuthMethod) AllowClearTextWithoutTLS() bool { func (n *mysqlNativePasswordAuthMethod) HandleAuthPluginData(conn *Conn, user string, serverAuthPluginData []byte, clientAuthPluginData []byte, remoteAddr net.Addr) (Getter, error) { if serverAuthPluginData[len(serverAuthPluginData)-1] != 0x00 { - return nil, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return nil, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } salt := serverAuthPluginData[:len(serverAuthPluginData)-1] @@ -520,7 +520,7 @@ func (n *mysqlCachingSha2AuthMethod) AllowClearTextWithoutTLS() bool { func (n *mysqlCachingSha2AuthMethod) HandleAuthPluginData(c *Conn, user string, serverAuthPluginData []byte, clientAuthPluginData []byte, remoteAddr net.Addr) (Getter, error) { if serverAuthPluginData[len(serverAuthPluginData)-1] != 0x00 { - return nil, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return nil, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } salt := serverAuthPluginData[:len(serverAuthPluginData)-1] @@ -532,7 +532,7 @@ func (n *mysqlCachingSha2AuthMethod) HandleAuthPluginData(c *Conn, user string, switch cacheState { case AuthRejected: - return nil, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return nil, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) case AuthAccepted: // We need to write a more data packet to indicate the // handshake completed properly. This will be followed @@ -547,7 +547,7 @@ func (n *mysqlCachingSha2AuthMethod) HandleAuthPluginData(c *Conn, user string, return result, nil case AuthNeedMoreData: if !c.TLSEnabled() && !c.IsUnixSocket() { - return nil, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return nil, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } data, pos := c.startEphemeralPacketWithHeader(2) @@ -563,7 +563,7 @@ func (n *mysqlCachingSha2AuthMethod) HandleAuthPluginData(c *Conn, user string, return n.storage.UserEntryWithPassword(c, user, password, remoteAddr) default: // Somehow someone returned an unknown state, let's error with access denied. - return nil, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return nil, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } } @@ -601,7 +601,7 @@ func newSalt() ([]byte, error) { } // Salt must be a legal UTF8 string. - for i := 0; i < len(salt); i++ { + for i := range len(salt) { salt[i] &= 0x7f if salt[i] == '\x00' || salt[i] == '$' { salt[i]++ diff --git a/go/mysql/auth_server_clientcert_test.go b/go/mysql/auth_server_clientcert_test.go index eff92053d94..72a1ecce87c 100644 --- a/go/mysql/auth_server_clientcert_test.go +++ b/go/mysql/auth_server_clientcert_test.go @@ -27,13 +27,24 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/tlstest" "vitess.io/vitess/go/vt/vttls" ) const clientCertUsername = "Client Cert" +// The listener's Accept() loop actually only ends on a connection +// error, which will occur when trying to connect after the listener +// has been closed. So this function closes the listener and then +// calls Connect to trigger the error which ends that work. +var cleanupListener = func(ctx context.Context, l *Listener, params *ConnParams) { + l.Close() + _, _ = Connect(ctx, params) +} + func TestValidCert(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := newAuthServerClientCert(string(MysqlClearPassword)) @@ -52,21 +63,6 @@ func TestValidCert(t *testing.T) { tlstest.CreateSignedCert(root, tlstest.CA, "02", "client", clientCertUsername) tlstest.CreateCRL(root, tlstest.CA) - // Create the server with TLS config. - serverConfig, err := vttls.ServerConfig( - path.Join(root, "server-cert.pem"), - path.Join(root, "server-key.pem"), - path.Join(root, "ca-cert.pem"), - path.Join(root, "ca-crl.pem"), - "", - tls.VersionTLS12) - require.NoError(t, err, "TLSServerConfig failed: %v", err) - - l.TLSConfig.Store(serverConfig) - go func() { - l.Accept() - }() - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -81,7 +77,20 @@ func TestValidCert(t *testing.T) { ServerName: "server.example.com", } - ctx := context.Background() + // Create the server with TLS config. + serverConfig, err := vttls.ServerConfig( + path.Join(root, "server-cert.pem"), + path.Join(root, "server-key.pem"), + path.Join(root, "ca-cert.pem"), + path.Join(root, "ca-crl.pem"), + "", + tls.VersionTLS12) + require.NoError(t, err, "TLSServerConfig failed: %v", err) + + l.TLSConfig.Store(serverConfig) + go l.Accept() + defer cleanupListener(ctx, l, params) + conn, err := Connect(ctx, params) require.NoError(t, err, "Connect failed: %v", err) @@ -103,6 +112,7 @@ func TestValidCert(t *testing.T) { } func TestNoCert(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := newAuthServerClientCert(string(MysqlClearPassword)) @@ -120,6 +130,17 @@ func TestNoCert(t *testing.T) { tlstest.CreateSignedCert(root, tlstest.CA, "01", "server", "server.example.com") tlstest.CreateCRL(root, tlstest.CA) + // Setup the right parameters. + params := &ConnParams{ + Host: host, + Port: port, + Uname: "user1", + Pass: "", + SslMode: vttls.VerifyIdentity, + SslCa: path.Join(root, "ca-cert.pem"), + ServerName: "server.example.com", + } + // Create the server with TLS config. serverConfig, err := vttls.ServerConfig( path.Join(root, "server-cert.pem"), @@ -131,22 +152,9 @@ func TestNoCert(t *testing.T) { require.NoError(t, err, "TLSServerConfig failed: %v", err) l.TLSConfig.Store(serverConfig) - go func() { - l.Accept() - }() - - // Setup the right parameters. - params := &ConnParams{ - Host: host, - Port: port, - Uname: "user1", - Pass: "", - SslMode: vttls.VerifyIdentity, - SslCa: path.Join(root, "ca-cert.pem"), - ServerName: "server.example.com", - } + go l.Accept() + defer cleanupListener(ctx, l, params) - ctx := context.Background() conn, err := Connect(ctx, params) assert.Error(t, err, "Connect() should have errored due to no client cert") diff --git a/go/mysql/auth_server_static.go b/go/mysql/auth_server_static.go index 6e3a9693c69..46302bcabe1 100644 --- a/go/mysql/auth_server_static.go +++ b/go/mysql/auth_server_static.go @@ -50,8 +50,10 @@ type AuthServerStatic struct { // entries contains the users, passwords and user data. entries map[string][]*AuthServerStaticEntry + // Signal handling related fields. sigChan chan os.Signal ticker *time.Ticker + done chan struct{} // Tell the signal related goroutines to stop } // AuthServerStaticEntry stores the values for a given user. @@ -162,7 +164,7 @@ func (a *AuthServerStatic) UserEntryWithPassword(conn *Conn, user string, passwo a.mu.Unlock() if !ok { - return &StaticUserData{}, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &StaticUserData{}, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } for _, entry := range entries { @@ -171,7 +173,7 @@ func (a *AuthServerStatic) UserEntryWithPassword(conn *Conn, user string, passwo return &StaticUserData{entry.UserData, entry.Groups}, nil } } - return &StaticUserData{}, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &StaticUserData{}, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } // UserEntryWithHash implements password lookup based on a @@ -182,14 +184,14 @@ func (a *AuthServerStatic) UserEntryWithHash(conn *Conn, salt []byte, user strin a.mu.Unlock() if !ok { - return &StaticUserData{}, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &StaticUserData{}, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } for _, entry := range entries { if entry.MysqlNativePassword != "" { hash, err := DecodeMysqlNativePasswordHex(entry.MysqlNativePassword) if err != nil { - return &StaticUserData{entry.UserData, entry.Groups}, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &StaticUserData{entry.UserData, entry.Groups}, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } isPass := VerifyHashedMysqlNativePassword(authResponse, salt, hash) @@ -204,7 +206,7 @@ func (a *AuthServerStatic) UserEntryWithHash(conn *Conn, salt []byte, user strin } } } - return &StaticUserData{}, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &StaticUserData{}, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } // UserEntryWithCacheHash implements password lookup based on a @@ -215,7 +217,7 @@ func (a *AuthServerStatic) UserEntryWithCacheHash(conn *Conn, salt []byte, user a.mu.Unlock() if !ok { - return &StaticUserData{}, AuthRejected, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &StaticUserData{}, AuthRejected, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } for _, entry := range entries { @@ -226,7 +228,7 @@ func (a *AuthServerStatic) UserEntryWithCacheHash(conn *Conn, salt []byte, user return &StaticUserData{entry.UserData, entry.Groups}, AuthAccepted, nil } } - return &StaticUserData{}, AuthRejected, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &StaticUserData{}, AuthRejected, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } // AuthMethods returns the AuthMethod instances this auth server can handle. @@ -267,11 +269,17 @@ func (a *AuthServerStatic) installSignalHandlers() { return } + a.done = make(chan struct{}) a.sigChan = make(chan os.Signal, 1) signal.Notify(a.sigChan, syscall.SIGHUP) go func() { - for range a.sigChan { - a.reload() + for { + select { + case <-a.done: + return + case <-a.sigChan: + a.reload() + } } }() @@ -279,14 +287,22 @@ func (a *AuthServerStatic) installSignalHandlers() { if a.reloadInterval > 0 { a.ticker = time.NewTicker(a.reloadInterval) go func() { - for range a.ticker.C { - a.sigChan <- syscall.SIGHUP + for { + select { + case <-a.done: + return + case <-a.ticker.C: + a.sigChan <- syscall.SIGHUP + } } }() } } func (a *AuthServerStatic) close() { + if a.done != nil { + close(a.done) + } if a.ticker != nil { a.ticker.Stop() } diff --git a/go/mysql/auth_server_static_test.go b/go/mysql/auth_server_static_test.go index 12ae74e0d60..a808ce9b66b 100644 --- a/go/mysql/auth_server_static_test.go +++ b/go/mysql/auth_server_static_test.go @@ -25,6 +25,8 @@ import ( "time" "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/test/utils" ) // getEntries is a test-only method for AuthServerStatic. @@ -35,6 +37,7 @@ func (a *AuthServerStatic) getEntries() map[string][]*AuthServerStaticEntry { } func TestJsonConfigParser(t *testing.T) { + _ = utils.LeakCheckContext(t) // works with legacy format config := make(map[string][]*AuthServerStaticEntry) jsonConfig := "{\"mysql_user\":{\"Password\":\"123\", \"UserData\":\"dummy\"}, \"mysql_user_2\": {\"Password\": \"123\", \"UserData\": \"mysql_user_2\"}}" @@ -67,6 +70,7 @@ func TestJsonConfigParser(t *testing.T) { } func TestValidateHashGetter(t *testing.T) { + _ = utils.LeakCheckContext(t) jsonConfig := `{"mysql_user": [{"Password": "password", "UserData": "user.name", "Groups": ["user_group"]}]}` auth := NewAuthServerStatic("", jsonConfig, 0) @@ -90,6 +94,7 @@ func TestValidateHashGetter(t *testing.T) { } func TestHostMatcher(t *testing.T) { + _ = utils.LeakCheckContext(t) ip := net.ParseIP("192.168.0.1") addr := &net.TCPAddr{IP: ip, Port: 9999} match := MatchSourceHost(net.Addr(addr), "") @@ -105,9 +110,9 @@ func TestHostMatcher(t *testing.T) { } func TestStaticConfigHUP(t *testing.T) { + _ = utils.LeakCheckContext(t) tmpFile, err := os.CreateTemp("", "mysql_auth_server_static_file.json") require.NoError(t, err, "couldn't create temp file: %v", err) - defer os.Remove(tmpFile.Name()) oldStr := "str5" @@ -125,14 +130,19 @@ func TestStaticConfigHUP(t *testing.T) { mu.Lock() defer mu.Unlock() - // delete registered Auth server - clear(authServers) + // Delete registered Auth servers. + for k, v := range authServers { + if s, ok := v.(*AuthServerStatic); ok { + s.close() + } + delete(authServers, k) + } } func TestStaticConfigHUPWithRotation(t *testing.T) { + _ = utils.LeakCheckContext(t) tmpFile, err := os.CreateTemp("", "mysql_auth_server_static_file.json") require.NoError(t, err, "couldn't create temp file: %v", err) - defer os.Remove(tmpFile.Name()) oldStr := "str1" @@ -147,6 +157,16 @@ func TestStaticConfigHUPWithRotation(t *testing.T) { hupTestWithRotation(t, aStatic, tmpFile, oldStr, "str4") hupTestWithRotation(t, aStatic, tmpFile, "str4", "str5") + + mu.Lock() + defer mu.Unlock() + // Delete registered Auth servers. + for k, v := range authServers { + if s, ok := v.(*AuthServerStatic); ok { + s.close() + } + delete(authServers, k) + } } func hupTest(t *testing.T, aStatic *AuthServerStatic, tmpFile *os.File, oldStr, newStr string) { @@ -178,6 +198,7 @@ func hupTestWithRotation(t *testing.T, aStatic *AuthServerStatic, tmpFile *os.Fi } func TestStaticPasswords(t *testing.T) { + _ = utils.LeakCheckContext(t) jsonConfig := ` { "user01": [{ "Password": "user01" }], diff --git a/go/mysql/binlog/binlog_json.go b/go/mysql/binlog/binlog_json.go index 2a0aba3163a..03bf604fb2d 100644 --- a/go/mysql/binlog/binlog_json.go +++ b/go/mysql/binlog/binlog_json.go @@ -224,7 +224,7 @@ var binaryIntSizes = map[jsonDataType]int{ func binparserInt(typ jsonDataType, data []byte, pos int) (*json.Value, error) { var val uint64 size := binaryIntSizes[typ] - for i := 0; i < size; i++ { + for i := range size { val = val + uint64(data[pos+i])<<(8*i) } var s string @@ -344,7 +344,7 @@ func binparserArray(typ jsonDataType, data []byte, pos int) (node *json.Value, e large := typ == jsonLargeArray elementCount, pos = readInt(data, pos, large) _, pos = readInt(data, pos, large) - for i := 0; i < elementCount; i++ { + for range elementCount { elem, pos, err = binparserElement(data, pos, large) if err != nil { return nil, err @@ -366,7 +366,7 @@ func binparserObject(typ jsonDataType, data []byte, pos int) (node *json.Value, _, pos = readInt(data, pos, large) keys := make([]string, elementCount) // stores all the keys in this object - for i := 0; i < elementCount; i++ { + for i := range elementCount { var keyOffset int var keyLength int keyOffset, pos = readInt(data, pos, large) @@ -384,7 +384,7 @@ func binparserObject(typ jsonDataType, data []byte, pos int) (node *json.Value, var elem *json.Value // get the value for each key - for i := 0; i < elementCount; i++ { + for i := range elementCount { elem, pos, err = binparserElement(data, pos, large) if err != nil { return nil, err diff --git a/go/mysql/binlog/constants.go b/go/mysql/binlog/constants.go index d08889efde8..89a08b7f209 100644 --- a/go/mysql/binlog/constants.go +++ b/go/mysql/binlog/constants.go @@ -79,6 +79,9 @@ const ( // TypeTime2 is MYSQL_TYPE_TIME2 TypeTime2 = 19 + // TypeVector is MYSQL_TYPE_VECTOR + TypeVector = 242 + // TypeJSON is MYSQL_TYPE_JSON TypeJSON = 245 diff --git a/go/mysql/binlog/rbr.go b/go/mysql/binlog/rbr.go index 73c293a8750..8b95b0daee9 100644 --- a/go/mysql/binlog/rbr.go +++ b/go/mysql/binlog/rbr.go @@ -111,7 +111,7 @@ func CellLength(data []byte, pos int, typ byte, metadata uint16) (int, error) { return intg0*4 + dig2bytes[intg0x] + frac0*4 + dig2bytes[frac0x], nil case TypeEnum, TypeSet: return int(metadata & 0xff), nil - case TypeJSON, TypeTinyBlob, TypeMediumBlob, TypeLongBlob, TypeBlob, TypeGeometry: + case TypeJSON, TypeTinyBlob, TypeMediumBlob, TypeLongBlob, TypeBlob, TypeGeometry, TypeVector: // Of the Blobs, only TypeBlob is used in binary logs, // but supports others just in case. switch metadata { @@ -542,7 +542,7 @@ func CellValue(data []byte, pos int, typ byte, metadata uint16, field *querypb.F } // now the full digits, 32 bits each, 9 digits - for i := 0; i < intg0; i++ { + for range intg0 { val = binary.BigEndian.Uint32(d[pos : pos+4]) fmt.Fprintf(txt, "%09d", val) pos += 4 @@ -564,7 +564,7 @@ func CellValue(data []byte, pos int, typ byte, metadata uint16, field *querypb.F txt.WriteByte('.') // now the full fractional digits - for i := 0; i < frac0; i++ { + for range frac0 { val = binary.BigEndian.Uint32(d[pos : pos+4]) fmt.Fprintf(txt, "%09d", val) pos += 4 @@ -652,8 +652,8 @@ func CellValue(data []byte, pos int, typ byte, metadata uint16, field *querypb.F return sqltypes.MakeTrusted(querypb.Type_SET, data[pos:pos+l]), l, nil - case TypeJSON, TypeTinyBlob, TypeMediumBlob, TypeLongBlob, TypeBlob: - // Only TypeBlob is used in binary logs, + case TypeJSON, TypeTinyBlob, TypeMediumBlob, TypeLongBlob, TypeBlob, TypeVector: + // Only TypeBlob and TypeVector is used in binary logs, // but supports others just in case. l := 0 switch metadata { @@ -718,7 +718,7 @@ func CellValue(data []byte, pos int, typ byte, metadata uint16, field *querypb.F // numbers. l := int(metadata & 0xff) var val uint64 - for i := 0; i < l; i++ { + for i := range l { val += uint64(data[pos+i]) << (uint(i) * 8) } return sqltypes.MakeTrusted(querypb.Type_UINT64, diff --git a/go/mysql/binlog_event.go b/go/mysql/binlog_event.go index 84f92c3809d..5d472230d0e 100644 --- a/go/mysql/binlog_event.go +++ b/go/mysql/binlog_event.go @@ -91,6 +91,8 @@ type BinlogEvent interface { // Timestamp returns the timestamp from the event header. Timestamp() uint32 + // ServerID returns the server ID from the event header. + ServerID() uint32 // Format returns a BinlogFormat struct based on the event data. // This is only valid if IsFormatDescription() returns true. @@ -158,7 +160,7 @@ type BinlogFormat struct { HeaderSizes []byte // ServerVersion is the name of the MySQL server version. - // It starts with something like 5.6.33-xxxx. + // It starts with something like 8.0.34-xxxx. ServerVersion string // FormatVersion is the version number of the binlog file format. @@ -328,7 +330,7 @@ func (b *Bitmap) Set(index int, value bool) { // hence the non-efficient logic. func (b *Bitmap) BitCount() int { sum := 0 - for i := 0; i < b.count; i++ { + for i := range b.count { if b.Bit(i) { sum++ } diff --git a/go/mysql/binlog_event_compression.go b/go/mysql/binlog_event_compression.go index 378698bc64b..1cb38d5cb16 100644 --- a/go/mysql/binlog_event_compression.go +++ b/go/mysql/binlog_event_compression.go @@ -25,7 +25,6 @@ import ( "github.com/klauspost/compress/zstd" "vitess.io/vitess/go/stats" - "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/vterrors" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" @@ -89,26 +88,9 @@ var ( // allocations and GC overhead so this pool allows us to handle // concurrent cases better while still scaling to 0 when there's no // usage. - statefulDecoderPool sync.Pool + statefulDecoderPool = &decoderPool{} ) -func init() { - var err error - statelessDecoder, err = zstd.NewReader(nil, zstd.WithDecoderConcurrency(0)) - if err != nil { // Should only happen e.g. due to ENOMEM - log.Errorf("Error creating stateless decoder: %v", err) - } - statefulDecoderPool = sync.Pool{ - New: func() any { - d, err := zstd.NewReader(nil, zstd.WithDecoderMaxMemory(zstdInMemoryDecompressorMaxSize)) - if err != nil { // Should only happen e.g. due to ENOMEM - log.Errorf("Error creating stateful decoder: %v", err) - } - return d - }, - } -} - type TransactionPayload struct { size uint64 compressionType uint64 @@ -304,12 +286,9 @@ func (tp *TransactionPayload) decompress() error { // larger payloads. if tp.uncompressedSize > zstdInMemoryDecompressorMaxSize { in := bytes.NewReader(tp.payload) - streamDecoder := statefulDecoderPool.Get().(*zstd.Decoder) - if streamDecoder == nil { - return vterrors.New(vtrpcpb.Code_INTERNAL, "failed to create stateful stream decoder") - } - if err := streamDecoder.Reset(in); err != nil { - return vterrors.Wrap(err, "error resetting stateful stream decoder") + streamDecoder, err := statefulDecoderPool.Get(in) + if err != nil { + return err } compressedTrxPayloadsUsingStream.Add(1) tp.reader = streamDecoder @@ -317,8 +296,12 @@ func (tp *TransactionPayload) decompress() error { } // Process smaller payloads using only in-memory buffers. - if statelessDecoder == nil { // Should never happen - return vterrors.New(vtrpcpb.Code_INTERNAL, "failed to create stateless decoder") + if statelessDecoder == nil { // Should only need to be done once + var err error + statelessDecoder, err = zstd.NewReader(nil, zstd.WithDecoderConcurrency(0)) + if err != nil { // Should only happen e.g. due to ENOMEM + return vterrors.Wrap(err, "failed to create stateless decoder") + } } decompressedBytes := make([]byte, 0, tp.uncompressedSize) // Perform a single pre-allocation decompressedBytes, err := statelessDecoder.DecodeAll(tp.payload, decompressedBytes[:0]) @@ -340,11 +323,8 @@ func (tp *TransactionPayload) decompress() error { func (tp *TransactionPayload) Close() { switch reader := tp.reader.(type) { case *zstd.Decoder: - if err := reader.Reset(nil); err == nil || err == io.EOF { - readersPool.Put(reader) - } + statefulDecoderPool.Put(reader) default: - reader = nil } tp.iterator = nil } @@ -368,3 +348,38 @@ func (tp *TransactionPayload) GetNextEvent() (BinlogEvent, error) { //func (tp *TransactionPayload) Events() iter.Seq[BinlogEvent] { // return tp.iterator //} + +// decoderPool manages a sync.Pool of *zstd.Decoders. +type decoderPool struct { + pool sync.Pool +} + +// Get gets a pooled OR new *zstd.Decoder. +func (dp *decoderPool) Get(reader io.Reader) (*zstd.Decoder, error) { + var ( + decoder *zstd.Decoder + ok bool + ) + if pooled := dp.pool.Get(); pooled != nil { + decoder, ok = pooled.(*zstd.Decoder) + if !ok { + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "[BUG] expected *zstd.Decoder but got %T", pooled) + } + } else { + d, err := zstd.NewReader(nil, zstd.WithDecoderMaxMemory(zstdInMemoryDecompressorMaxSize)) + if err != nil { // Should only happen e.g. due to ENOMEM + return nil, vterrors.Wrap(err, "failed to create stateful stream decoder") + } + decoder = d + } + if err := decoder.Reset(reader); err != nil { + return nil, vterrors.Wrap(err, "error resetting stateful stream decoder") + } + return decoder, nil +} + +func (dp *decoderPool) Put(decoder *zstd.Decoder) { + if err := decoder.Reset(nil); err == nil || err == io.EOF { + dp.pool.Put(decoder) + } +} diff --git a/go/mysql/binlog_event_compression_test.go b/go/mysql/binlog_event_compression_test.go new file mode 100644 index 00000000000..4c6418a1aa0 --- /dev/null +++ b/go/mysql/binlog_event_compression_test.go @@ -0,0 +1,75 @@ +/* +Copyright 2024 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 mysql + +import ( + "bytes" + "io" + "testing" + + "github.com/klauspost/compress/zstd" + "github.com/stretchr/testify/require" +) + +func TestDecoderPool(t *testing.T) { + validateDecoder := func(t *testing.T, err error, decoder *zstd.Decoder) { + require.NoError(t, err) + require.NotNil(t, decoder) + require.IsType(t, &zstd.Decoder{}, decoder) + } + tests := []struct { + name string + reader io.Reader + wantErr bool + }{ + { + name: "happy path", + reader: bytes.NewReader([]byte{0x68, 0x61, 0x70, 0x70, 0x79}), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // It's not guaranteed that we get the same decoder back from the pool + // that we just put in, so we use a loop and ensure that it worked at + // least one of the times. Without doing this the test would be flaky. + poolingUsed := false + + for i := 0; i < 20; i++ { + decoder, err := statefulDecoderPool.Get(tt.reader) + validateDecoder(t, err, decoder) + statefulDecoderPool.Put(decoder) + + decoder2, err := statefulDecoderPool.Get(tt.reader) + validateDecoder(t, err, decoder2) + if decoder2 == decoder { + poolingUsed = true + } + statefulDecoderPool.Put(decoder2) + + decoder3, err := statefulDecoderPool.Get(tt.reader) + validateDecoder(t, err, decoder3) + if decoder3 == decoder || decoder3 == decoder2 { + poolingUsed = true + } + statefulDecoderPool.Put(decoder3) + } + + require.True(t, poolingUsed) + }) + } +} diff --git a/go/mysql/binlog_event_filepos.go b/go/mysql/binlog_event_filepos.go index 8a2976da80d..c71c8346964 100644 --- a/go/mysql/binlog_event_filepos.go +++ b/go/mysql/binlog_event_filepos.go @@ -211,6 +211,10 @@ func (ev filePosFakeEvent) Timestamp() uint32 { return ev.timestamp } +func (ev filePosFakeEvent) ServerID() uint32 { + return 1 +} + func (ev filePosFakeEvent) Format() (BinlogFormat, error) { return BinlogFormat{}, nil } diff --git a/go/mysql/binlog_event_make_test.go b/go/mysql/binlog_event_make_test.go index 32401bfa401..84535213cd9 100644 --- a/go/mysql/binlog_event_make_test.go +++ b/go/mysql/binlog_event_make_test.go @@ -254,7 +254,7 @@ func TestLargeTableMapEvent(t *testing.T) { types := make([]byte, 0, colLen) metadata := make([]uint16, 0, colLen) - for i := 0; i < colLen; i++ { + for range colLen { types = append(types, binlog.TypeLongLong) metadata = append(metadata, 0) } @@ -374,6 +374,7 @@ func TestRowsEvent(t *testing.T) { require.True(t, reflect.DeepEqual(gotRows, rows), "NewRowsEvent().Rows() got Rows:\n%v\nexpected:\n%v", gotRows, rows) assert.NotZero(t, event.Timestamp()) + assert.NotZero(t, event.ServerID()) } func TestHeartbeatEvent(t *testing.T) { @@ -384,6 +385,7 @@ func TestHeartbeatEvent(t *testing.T) { require.NotNil(t, event) assert.True(t, event.IsHeartbeat()) assert.Zero(t, event.Timestamp()) + assert.NotZero(t, event.ServerID()) } func TestRotateRotateEvent(t *testing.T) { @@ -429,7 +431,7 @@ func TestLargeRowsEvent(t *testing.T) { types := make([]byte, 0, colLen) metadata := make([]uint16, 0, colLen) - for i := 0; i < colLen; i++ { + for range colLen { types = append(types, binlog.TypeLong) metadata = append(metadata, 0) } @@ -446,7 +448,7 @@ func TestLargeRowsEvent(t *testing.T) { identify := make([]byte, 0, colLen*4) data := make([]byte, 0, colLen*4) - for i := 0; i < colLen; i++ { + for range colLen { identify = append(identify, 0x10, 0x20, 0x30, 0x40) data = append(data, 0x10, 0x20, 0x30, 0x40) } @@ -467,7 +469,7 @@ func TestLargeRowsEvent(t *testing.T) { } // All rows are included, none are NULL. - for i := 0; i < colLen; i++ { + for i := range colLen { rows.IdentifyColumns.Set(i, true) rows.DataColumns.Set(i, true) } @@ -476,7 +478,7 @@ func TestLargeRowsEvent(t *testing.T) { // 1076895760 is 0x40302010. identifies, _ := rows.StringIdentifiesForTests(tm, 0) expected := make([]string, 0, colLen) - for i := 0; i < colLen; i++ { + for range colLen { expected = append(expected, "1076895760") } if !reflect.DeepEqual(identifies, expected) { diff --git a/go/mysql/binlog_event_rbr.go b/go/mysql/binlog_event_rbr.go index 64d17c2b306..d77b7bcb9a0 100644 --- a/go/mysql/binlog_event_rbr.go +++ b/go/mysql/binlog_event_rbr.go @@ -43,6 +43,7 @@ const ( tableMapEnumAndSetDefaultCharset tableMapEnumAndSetColumnCharset tableMapColumnVisibility + tableMapVectorDimensionality ) // This byte in the optional metadata indicates that we should @@ -136,7 +137,7 @@ func metadataLength(typ byte) int { // No data here. return 0 - case binlog.TypeFloat, binlog.TypeDouble, binlog.TypeTimestamp2, binlog.TypeDateTime2, binlog.TypeTime2, binlog.TypeJSON, binlog.TypeTinyBlob, binlog.TypeMediumBlob, binlog.TypeLongBlob, binlog.TypeBlob, binlog.TypeGeometry: + case binlog.TypeFloat, binlog.TypeDouble, binlog.TypeTimestamp2, binlog.TypeDateTime2, binlog.TypeTime2, binlog.TypeJSON, binlog.TypeTinyBlob, binlog.TypeMediumBlob, binlog.TypeLongBlob, binlog.TypeBlob, binlog.TypeGeometry, binlog.TypeVector: // One byte. return 1 @@ -172,7 +173,7 @@ func metadataRead(data []byte, pos int, typ byte) (uint16, int, error) { // No data here. return 0, pos, nil - case binlog.TypeFloat, binlog.TypeDouble, binlog.TypeTimestamp2, binlog.TypeDateTime2, binlog.TypeTime2, binlog.TypeJSON, binlog.TypeTinyBlob, binlog.TypeMediumBlob, binlog.TypeLongBlob, binlog.TypeBlob, binlog.TypeGeometry: + case binlog.TypeFloat, binlog.TypeDouble, binlog.TypeTimestamp2, binlog.TypeDateTime2, binlog.TypeTime2, binlog.TypeJSON, binlog.TypeTinyBlob, binlog.TypeMediumBlob, binlog.TypeLongBlob, binlog.TypeBlob, binlog.TypeGeometry, binlog.TypeVector: // One byte. return uint16(data[pos]), pos + 1, nil @@ -198,7 +199,7 @@ func metadataWrite(data []byte, pos int, typ byte, value uint16) int { // No data here. return pos - case binlog.TypeFloat, binlog.TypeDouble, binlog.TypeTimestamp2, binlog.TypeDateTime2, binlog.TypeTime2, binlog.TypeJSON, binlog.TypeTinyBlob, binlog.TypeMediumBlob, binlog.TypeLongBlob, binlog.TypeBlob, binlog.TypeGeometry: + case binlog.TypeFloat, binlog.TypeDouble, binlog.TypeTimestamp2, binlog.TypeDateTime2, binlog.TypeTime2, binlog.TypeJSON, binlog.TypeTinyBlob, binlog.TypeMediumBlob, binlog.TypeLongBlob, binlog.TypeBlob, binlog.TypeGeometry, binlog.TypeVector: // One byte. data[pos] = byte(value) return pos + 1 diff --git a/go/mysql/capabilities/capability.go b/go/mysql/capabilities/capability.go index 234707538ec..4015059e686 100644 --- a/go/mysql/capabilities/capability.go +++ b/go/mysql/capabilities/capability.go @@ -40,7 +40,7 @@ const ( InstantAddDropColumnFlavorCapability // Adding/dropping column in any position/ordinal. InstantChangeColumnDefaultFlavorCapability // InstantExpandEnumCapability // - MySQLJSONFlavorCapability // JSON type supported + InstantChangeColumnVisibilityCapability // MySQLUpgradeInServerFlavorCapability // DynamicRedoLogCapacityFlavorCapability // supported in MySQL 8.0.30 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-30.html DisableRedoLogFlavorCapability // supported in MySQL 8.0.21 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html @@ -48,6 +48,8 @@ const ( PerformanceSchemaDataLocksTableCapability // supported in MySQL 8.0.1 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html InstantDDLXtrabackupCapability // Supported in 8.0.32 and above, solving a MySQL-vs-Xtrabackup bug starting 8.0.29 ReplicaTerminologyCapability // Supported in 8.0.26 and above, using SHOW REPLICA STATUS and all variations. + BinaryLogStatus // Supported in 8.2.0 and above, uses SHOW BINARY LOG STATUS + RestrictFKOnNonStandardKey // Supported in 8.4.0 and above, restricts usage of non-standard indexes for foreign keys. ) type CapableOf func(capability FlavorCapability) (bool, error) @@ -87,8 +89,6 @@ func MySQLVersionHasCapability(serverVersion string, capability FlavorCapability } // Capabilities sorted by version. switch capability { - case MySQLJSONFlavorCapability: - return atLeast(5, 7, 0) case InstantDDLFlavorCapability, InstantExpandEnumCapability, InstantAddLastColumnFlavorCapability, @@ -107,6 +107,8 @@ func MySQLVersionHasCapability(serverVersion string, capability FlavorCapability return atLeast(8, 0, 21) case FastDropTableFlavorCapability: return atLeast(8, 0, 23) + case InstantChangeColumnVisibilityCapability: + return atLeast(8, 0, 23) case InstantAddDropColumnFlavorCapability: return atLeast(8, 0, 29) case DynamicRedoLogCapacityFlavorCapability: @@ -119,6 +121,10 @@ func MySQLVersionHasCapability(serverVersion string, capability FlavorCapability // So be conservative here, and only use the new syntax on newer versions, // so we don't have to have too many different flavors. return atLeast(8, 0, 26) + case BinaryLogStatus: + return atLeast(8, 2, 0) + case RestrictFKOnNonStandardKey: + return atLeast(8, 4, 0) default: return false, nil } diff --git a/go/mysql/capabilities/capability_test.go b/go/mysql/capabilities/capability_test.go index 6e96c3487f5..aeb18bed22e 100644 --- a/go/mysql/capabilities/capability_test.go +++ b/go/mysql/capabilities/capability_test.go @@ -145,7 +145,7 @@ func TestMySQLVersionCapableOf(t *testing.T) { isCapable: false, }, { - version: "5.6.7", + version: "5.7.29", capability: InstantDDLFlavorCapability, isCapable: false, }, @@ -154,16 +154,6 @@ func TestMySQLVersionCapableOf(t *testing.T) { capability: TransactionalGtidExecutedFlavorCapability, isCapable: false, }, - { - version: "5.6.7", - capability: MySQLJSONFlavorCapability, - isCapable: false, - }, - { - version: "5.7.29", - capability: MySQLJSONFlavorCapability, - isCapable: true, - }, { version: "8.0.30", capability: DynamicRedoLogCapacityFlavorCapability, diff --git a/go/mysql/client.go b/go/mysql/client.go index 16740bf38db..2a72806a6be 100644 --- a/go/mysql/client.go +++ b/go/mysql/client.go @@ -95,11 +95,11 @@ func Connect(ctx context.Context, params *ConnParams) (*Conn, error) { // should return a 2003. if netProto == "tcp" { status <- connectResult{ - err: sqlerror.NewSQLError(sqlerror.CRConnHostError, sqlerror.SSUnknownSQLState, "net.Dial(%v) failed: %v", addr, err), + err: sqlerror.NewSQLErrorf(sqlerror.CRConnHostError, sqlerror.SSUnknownSQLState, "net.Dial(%v) failed: %v", addr, err), } } else { status <- connectResult{ - err: sqlerror.NewSQLError(sqlerror.CRConnectionError, sqlerror.SSUnknownSQLState, "net.Dial(%v) to local server failed: %v", addr, err), + err: sqlerror.NewSQLErrorf(sqlerror.CRConnectionError, sqlerror.SSUnknownSQLState, "net.Dial(%v) to local server failed: %v", addr, err), } } return @@ -179,11 +179,11 @@ func (c *Conn) Ping() error { data[pos] = ComPing if err := c.writeEphemeralPacket(); err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) } data, err := c.readEphemeralPacket() if err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } defer c.recycleReadPacket() switch data[0] { @@ -208,7 +208,7 @@ func (c *Conn) clientHandshake(params *ConnParams) error { // Wait for the server initial handshake packet, and parse it. data, err := c.readPacket() if err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, "", "initial packet read failed: %v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, "", "initial packet read failed: %v", err) } capabilities, salt, err := c.parseInitialHandshakePacket(data) if err != nil { @@ -219,7 +219,7 @@ func (c *Conn) clientHandshake(params *ConnParams) error { // Sanity check. if capabilities&CapabilityClientProtocol41 == 0 { - return sqlerror.NewSQLError(sqlerror.CRVersionError, sqlerror.SSUnknownSQLState, "cannot connect to servers earlier than 4.1") + return sqlerror.NewSQLErrorf(sqlerror.CRVersionError, sqlerror.SSUnknownSQLState, "cannot connect to servers earlier than 4.1") } // Remember a subset of the capabilities, so we can use them @@ -234,7 +234,7 @@ func (c *Conn) clientHandshake(params *ConnParams) error { // If client asked for SSL, but server doesn't support it, // stop right here. if params.SslRequired() && capabilities&CapabilityClientSSL == 0 { - return sqlerror.NewSQLError(sqlerror.CRSSLConnectionError, sqlerror.SSUnknownSQLState, "server doesn't support SSL but client asked for it") + return sqlerror.NewSQLErrorf(sqlerror.CRSSLConnectionError, sqlerror.SSUnknownSQLState, "server doesn't support SSL but client asked for it") } // The ServerName to verify depends on what the hostname is. @@ -255,13 +255,13 @@ func (c *Conn) clientHandshake(params *ConnParams) error { tlsVersion, err := vttls.TLSVersionToNumber(params.TLSMinVersion) if err != nil { - return sqlerror.NewSQLError(sqlerror.CRSSLConnectionError, sqlerror.SSUnknownSQLState, "error parsing minimal TLS version: %v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRSSLConnectionError, sqlerror.SSUnknownSQLState, "error parsing minimal TLS version: %v", err) } // Build the TLS config. clientConfig, err := vttls.ClientConfig(params.EffectiveSslMode(), params.SslCert, params.SslKey, params.SslCa, params.SslCrl, serverName, tlsVersion) if err != nil { - return sqlerror.NewSQLError(sqlerror.CRSSLConnectionError, sqlerror.SSUnknownSQLState, "error loading client cert and ca: %v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRSSLConnectionError, sqlerror.SSUnknownSQLState, "error loading client cert and ca: %v", err) } // Send the SSLRequest packet. @@ -292,7 +292,7 @@ func (c *Conn) clientHandshake(params *ConnParams) error { } else if params.Flags&CapabilityClientSessionTrack == CapabilityClientSessionTrack { // If client asked for ClientSessionTrack, but server doesn't support it, // stop right here. - return sqlerror.NewSQLError(sqlerror.CRSSLConnectionError, sqlerror.SSUnknownSQLState, "server doesn't support ClientSessionTrack but client asked for it") + return sqlerror.NewSQLErrorf(sqlerror.CRSSLConnectionError, sqlerror.SSUnknownSQLState, "server doesn't support ClientSessionTrack but client asked for it") } // Build and send our handshake response 41. @@ -317,7 +317,7 @@ func (c *Conn) clientHandshake(params *ConnParams) error { // Wait for response, should be OK. response, err := c.readPacket() if err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } switch response[0] { case OKPacket: @@ -327,7 +327,7 @@ func (c *Conn) clientHandshake(params *ConnParams) error { return ParseErrorPacket(response) default: // FIXME(alainjobart) handle extra auth cases and so on. - return sqlerror.NewSQLError(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "initial server response is asking for more information, not implemented yet: %v", response) + return sqlerror.NewSQLErrorf(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "initial server response is asking for more information, not implemented yet: %v", response) } } @@ -342,7 +342,7 @@ func (c *Conn) parseInitialHandshakePacket(data []byte) (uint32, []byte, error) // Protocol version. pver, pos, ok := readByte(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRVersionError, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no protocol version") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRVersionError, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no protocol version") } // Server is allowed to immediately send ERR packet @@ -351,41 +351,41 @@ func (c *Conn) parseInitialHandshakePacket(data []byte) (uint32, []byte, error) // Normally there would be a 1-byte sql_state_marker field and a 5-byte // sql_state field here, but docs say these will not be present in this case. errorMsg, _, _ := readEOFString(data, pos) - return 0, nil, sqlerror.NewSQLError(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "immediate error from server errorCode=%v errorMsg=%v", errorCode, errorMsg) + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "immediate error from server errorCode=%v errorMsg=%v", errorCode, errorMsg) } if pver != protocolVersion { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRVersionError, sqlerror.SSUnknownSQLState, "bad protocol version: %v", pver) + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRVersionError, sqlerror.SSUnknownSQLState, "bad protocol version: %v", pver) } // Read the server version. c.ServerVersion, pos, ok = readNullString(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no server version") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no server version") } // Read the connection id. c.ConnectionID, pos, ok = readUint32(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no connection id") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no connection id") } // Read the first part of the auth-plugin-data authPluginData, pos, ok := readBytes(data, pos, 8) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no auth-plugin-data-part-1") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no auth-plugin-data-part-1") } // One byte filler, 0. We don't really care about the value. _, pos, ok = readByte(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no filler") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no filler") } // Lower 2 bytes of the capability flags. capLower, pos, ok := readUint16(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no capability flags (lower 2 bytes)") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no capability flags (lower 2 bytes)") } var capabilities = uint32(capLower) @@ -397,20 +397,20 @@ func (c *Conn) parseInitialHandshakePacket(data []byte) (uint32, []byte, error) // Character set. characterSet, pos, ok := readByte(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no character set") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no character set") } c.CharacterSet = collations.ID(characterSet) // Status flags. Ignored. _, pos, ok = readUint16(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no status flags") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no status flags") } // Upper 2 bytes of the capability flags. capUpper, pos, ok := readUint16(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no capability flags (upper 2 bytes)") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no capability flags (upper 2 bytes)") } capabilities += uint32(capUpper) << 16 @@ -420,13 +420,13 @@ func (c *Conn) parseInitialHandshakePacket(data []byte) (uint32, []byte, error) if capabilities&CapabilityClientPluginAuth != 0 { authPluginDataLength, pos, ok = readByte(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no length of auth-plugin-data") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no length of auth-plugin-data") } } else { // One byte filler, 0. We don't really care about the value. _, pos, ok = readByte(data, pos) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no length of auth-plugin-data filler") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no length of auth-plugin-data filler") } } @@ -443,12 +443,12 @@ func (c *Conn) parseInitialHandshakePacket(data []byte) (uint32, []byte, error) var authPluginDataPart2 []byte authPluginDataPart2, pos, ok = readBytes(data, pos, l) if !ok { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no auth-plugin-data-part-2") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: packet has no auth-plugin-data-part-2") } // The last byte has to be 0, and is not part of the data. if authPluginDataPart2[l-1] != 0 { - return 0, nil, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: auth-plugin-data-part-2 is not 0 terminated") + return 0, nil, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "parseInitialHandshakePacket: auth-plugin-data-part-2 is not 0 terminated") } authPluginData = append(authPluginData, authPluginDataPart2[0:l-1]...) } @@ -505,7 +505,7 @@ func (c *Conn) writeSSLRequest(capabilities uint32, characterSet uint8, params * // And send it as is. if err := c.writeEphemeralPacket(); err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "cannot send SSLRequest: %v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "cannot send SSLRequest: %v", err) } return nil } @@ -602,11 +602,11 @@ func (c *Conn) writeHandshakeResponse41(capabilities uint32, scrambledPassword [ // Sanity-check the length. if pos != len(data) { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "writeHandshakeResponse41: only packed %v bytes, out of %v allocated", pos, len(data)) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "writeHandshakeResponse41: only packed %v bytes, out of %v allocated", pos, len(data)) } if err := c.writeEphemeralPacket(); err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "cannot send HandshakeResponse41: %v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "cannot send HandshakeResponse41: %v", err) } return nil } @@ -616,7 +616,7 @@ func (c *Conn) writeHandshakeResponse41(capabilities uint32, scrambledPassword [ func (c *Conn) handleAuthResponse(params *ConnParams) error { response, err := c.readPacket() if err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } switch response[0] { @@ -636,7 +636,7 @@ func (c *Conn) handleAuthResponse(params *ConnParams) error { case ErrPacket: return ParseErrorPacket(response) default: - return sqlerror.NewSQLError(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "initial server response cannot be parsed: %v", response) + return sqlerror.NewSQLErrorf(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "initial server response cannot be parsed: %v", response) } return nil @@ -648,7 +648,7 @@ func (c *Conn) handleAuthSwitchPacket(params *ConnParams, response []byte) error var salt []byte c.authPluginName, salt, err = parseAuthSwitchRequest(response) if err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "cannot parse auth switch request: %v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "cannot parse auth switch request: %v", err) } if salt != nil { c.salt = salt @@ -669,7 +669,7 @@ func (c *Conn) handleAuthSwitchPacket(params *ConnParams, response []byte) error return err } default: - return sqlerror.NewSQLError(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "server asked for unsupported auth method: %v", c.authPluginName) + return sqlerror.NewSQLErrorf(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "server asked for unsupported auth method: %v", c.authPluginName) } // The response could be an OKPacket, AuthMoreDataPacket or ErrPacket @@ -711,7 +711,7 @@ func (c *Conn) handleAuthMoreDataPacket(data byte, params *ConnParams) error { // Next packet should either be an OKPacket or ErrPacket return c.handleAuthResponse(params) default: - return sqlerror.NewSQLError(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "cannot parse AuthMoreDataPacket: %v", data) + return sqlerror.NewSQLErrorf(sqlerror.CRServerHandshakeErr, sqlerror.SSUnknownSQLState, "cannot parse AuthMoreDataPacket: %v", data) } } @@ -741,7 +741,7 @@ func (c *Conn) requestPublicKey() (rsaKey *rsa.PublicKey, err error) { response, err := c.readPacket() if err != nil { - return nil, sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return nil, sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } // Server should respond with a AuthMoreDataPacket containing the public key diff --git a/go/mysql/collations/charset/helpers.go b/go/mysql/collations/charset/helpers.go index b66a6c77b87..62216394263 100644 --- a/go/mysql/collations/charset/helpers.go +++ b/go/mysql/collations/charset/helpers.go @@ -22,7 +22,7 @@ func Slice(charset Charset, input []byte, from, to int) []byte { } iter := input start := 0 - for i := 0; i < to; i++ { + for i := range to { r, size := charset.DecodeRune(iter) if r == RuneError && size < 2 { break diff --git a/go/mysql/collations/charset/simplifiedchinese/gb18030.go b/go/mysql/collations/charset/simplifiedchinese/gb18030.go index 0e09dc8e3ab..8d6a98ba046 100644 --- a/go/mysql/collations/charset/simplifiedchinese/gb18030.go +++ b/go/mysql/collations/charset/simplifiedchinese/gb18030.go @@ -150,7 +150,7 @@ func (Charset_gb18030) DecodeRune(src []byte) (rune, int) { return utf8.RuneError, 1 } c2 := src[2] - if c2 < 0x81 || 0xff <= c2 { + if c2 < 0x81 { return utf8.RuneError, 1 } c3 := src[3] diff --git a/go/mysql/collations/colldata/8bit.go b/go/mysql/collations/colldata/8bit.go index 67ae8541d56..c88e1ec3a2d 100644 --- a/go/mysql/collations/colldata/8bit.go +++ b/go/mysql/collations/colldata/8bit.go @@ -158,7 +158,7 @@ func (c *Collation_8bit_simple_ci) Collate(left, right []byte, rightIsPrefix boo sortOrder := c.sort cmpLen := min(len(left), len(right)) - for i := 0; i < cmpLen; i++ { + for i := range cmpLen { sortL, sortR := sortOrder[left[i]], sortOrder[right[i]] if sortL != sortR { return int(sortL) - int(sortR) @@ -174,7 +174,7 @@ func (c *Collation_8bit_simple_ci) TinyWeightString(src []byte) uint32 { var w32 [4]byte sortOrder := c.sort sortLen := min(4, len(src)) - for i := 0; i < sortLen; i++ { + for i := range sortLen { w32[i] = sortOrder[src[i]] } return binary.BigEndian.Uint32(w32[:4]) diff --git a/go/mysql/collations/colldata/cached_size.go b/go/mysql/collations/colldata/cached_size.go index 36167c69d6d..b348baaaed8 100644 --- a/go/mysql/collations/colldata/cached_size.go +++ b/go/mysql/collations/colldata/cached_size.go @@ -19,10 +19,6 @@ package colldata import hack "vitess.io/vitess/go/hack" -type cachedObject interface { - CachedSize(alloc bool) int64 -} - func (cached *eightbitWildcard) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -63,10 +59,6 @@ func (cached *unicodeWildcard) CachedSize(alloc bool) int64 { if alloc { size += int64(48) } - // field charset vitess.io/vitess/go/mysql/collations/charset/types.Charset - if cc, ok := cached.charset.(cachedObject); ok { - size += cc.CachedSize(true) - } // field pattern []rune { size += hack.RuntimeAllocSize(int64(cap(cached.pattern)) * int64(4)) diff --git a/go/mysql/collations/colldata/uca_contraction_test.go b/go/mysql/collations/colldata/uca_contraction_test.go index a3511a07df6..3503b6e6ad8 100644 --- a/go/mysql/collations/colldata/uca_contraction_test.go +++ b/go/mysql/collations/colldata/uca_contraction_test.go @@ -129,7 +129,7 @@ func benchmarkFind(b *testing.B, input []byte, contract uca.Contractor) { b.ReportAllocs() b.ResetTimer() - for n := 0; n < b.N; n++ { + for range b.N { in := input for len(in) > 0 { cp, width := utf8.DecodeRune(in) @@ -144,7 +144,7 @@ func benchmarkFindJA(b *testing.B, input []byte, contract uca.Contractor) { b.ReportAllocs() b.ResetTimer() - for n := 0; n < b.N; n++ { + for range b.N { prev := rune(0) in := input for len(in) > 0 { @@ -166,7 +166,7 @@ func newStrgen() *strgen { } func (s *strgen) withASCII() *strgen { - for r := rune(0); r < utf8.RuneSelf; r++ { + for r := range rune(utf8.RuneSelf) { s.repertoire[r] = struct{}{} } return s diff --git a/go/mysql/collations/colldata/uca_test.go b/go/mysql/collations/colldata/uca_test.go index 5eb51fed67e..4be261edf9c 100644 --- a/go/mysql/collations/colldata/uca_test.go +++ b/go/mysql/collations/colldata/uca_test.go @@ -180,7 +180,7 @@ func TestIsPrefix(t *testing.T) { coll := testcollation(t, collName) input := []rune(strings.ToUpper(ExampleStringLong)) - for size := 0; size < len(input); size++ { + for size := range len(input) { left := ExampleStringLong right := string(input[:size]) @@ -777,7 +777,7 @@ func BenchmarkAllUCAWeightStrings(b *testing.B) { b.ResetTimer() - for i := 0; i < b.N; i++ { + for range b.N { _ = collation.WeightString(buf, input, 0) } }) @@ -1058,7 +1058,7 @@ func BenchmarkUCA900Collation(b *testing.B) { str2 := []byte(strings.ToUpper(content)) for _, collation := range Collations { b.Run(fmt.Sprintf("%s/%d/%s", teststr.Name, length, collation.Name()), func(b *testing.B) { - for i := 0; i < b.N; i++ { + for range b.N { _ = collation.Collate(str1, str2, false) } }) diff --git a/go/mysql/collations/env.go b/go/mysql/collations/env.go index ae5419a5797..77e498562bf 100644 --- a/go/mysql/collations/env.go +++ b/go/mysql/collations/env.go @@ -100,16 +100,11 @@ func fetchCacheEnvironment(version collver) *Environment { // The version string must be in the format that is sent by the server as the version packet // when opening a new MySQL connection func NewEnvironment(serverVersion string) *Environment { - // 5.7 is the oldest version we support today, so use that as - // the default. - // NOTE: this should be changed when we EOL MySQL 5.7 support - var version collver = collverMySQL57 + // 8.0 is the oldest fully supported version, so use that as the default. + // All newer MySQL versions including 9 are so far compatible as well. + var version collver = collverMySQL8 serverVersion = strings.TrimSpace(strings.ToLower(serverVersion)) switch { - case strings.HasSuffix(serverVersion, "-ripple"): - // the ripple binlog server can mask the actual version of mysqld; - // assume we have the highest - version = collverMySQL8 case strings.Contains(serverVersion, "mariadb"): switch { case strings.Contains(serverVersion, "10.0."): @@ -125,8 +120,6 @@ func NewEnvironment(serverVersion string) *Environment { version = collverMySQL56 case strings.HasPrefix(serverVersion, "5.7."): version = collverMySQL57 - case strings.HasPrefix(serverVersion, "8."): - version = collverMySQL8 } return fetchCacheEnvironment(version) } diff --git a/go/mysql/collations/integration/main_test.go b/go/mysql/collations/integration/main_test.go index 23c6f8d2716..665a86ad266 100644 --- a/go/mysql/collations/integration/main_test.go +++ b/go/mysql/collations/integration/main_test.go @@ -47,7 +47,7 @@ func mysqlconn(t *testing.T) *mysql.Conn { if err != nil { t.Fatal(err) } - if !strings.HasPrefix(conn.ServerVersion, "8.") { + if strings.HasPrefix(conn.ServerVersion, "5.7.") { conn.Close() t.Skipf("collation integration tests are only supported in MySQL 8.0+") } diff --git a/go/mysql/collations/internal/uca/iter_fast_900.go b/go/mysql/collations/internal/uca/iter_fast_900.go index cbe32cfdb70..42e32042133 100644 --- a/go/mysql/collations/internal/uca/iter_fast_900.go +++ b/go/mysql/collations/internal/uca/iter_fast_900.go @@ -301,7 +301,7 @@ func (it *FastIterator900) NextWeightBlock64(dstbytes []byte) int { // Slow path: just loop up to 8 times to fill the buffer and bail // early if we exhaust the iterator. - for i := 0; i < 8; i++ { + for i := range 8 { w, ok := it.Next() if !ok { return i * 2 diff --git a/go/mysql/collations/internal/uca/layout.go b/go/mysql/collations/internal/uca/layout.go index 35a2749eb21..e13fcb282b3 100644 --- a/go/mysql/collations/internal/uca/layout.go +++ b/go/mysql/collations/internal/uca/layout.go @@ -71,7 +71,7 @@ func equalWeights900(table Weights, levels int, A, B rune) bool { cA := int((*pageA)[offsetA]) cB := int((*pageB)[offsetB]) - for l := 0; l < levels; l++ { + for l := range levels { wA, wB := l*256, l*256 wA1, wB1 := wA+(cA*256*3), wB+(cB*256*3) @@ -118,7 +118,7 @@ func (Layout_uca900) DebugWeights(table Weights, codepoint rune) (result []uint1 } ceCount := int((*page)[offset]) - for ce := 0; ce < ceCount; ce++ { + for ce := range ceCount { result = append(result, (*page)[256+(ce*3+0)*256+offset], (*page)[256+(ce*3+1)*256+offset], @@ -264,8 +264,8 @@ func (Layout_uca_legacy) allocPage(original *[]uint16, patches []Patch) []uint16 } newPage := make([]uint16, minLenForPage) - for i := 0; i < CodepointsPerPage; i++ { - for j := 0; j < originalStride; j++ { + for i := range CodepointsPerPage { + for range originalStride { newPage[1+i*newStride] = (*original)[1+i*originalStride] } } diff --git a/go/mysql/collations/tools/makecolldata/codegen/tablegen.go b/go/mysql/collations/tools/makecolldata/codegen/tablegen.go index e1549c23bff..479e876f1f3 100644 --- a/go/mysql/collations/tools/makecolldata/codegen/tablegen.go +++ b/go/mysql/collations/tools/makecolldata/codegen/tablegen.go @@ -151,7 +151,7 @@ func (p *page) weights900Fast(level int) (w []uint32) { if p.entryCount == 0 { return nil } - for i := 0; i < 128; i++ { + for i := range 128 { entry := &p.entries[i] if len(entry.weights) > 3 { panic("trying to dump fast weights for codepoint with >3 weights") @@ -165,7 +165,7 @@ func (p *page) weights900Fast(level int) (w []uint32) { } w = append(w, weight) } - for i := 0; i < 128; i++ { + for range 128 { w = append(w, 0x0) } return @@ -179,7 +179,7 @@ func (p *page) weights900() (w []uint16) { for _, entry := range p.entries { w = append(w, uint16(len(entry.weights)/3)) } - for level := 0; level < maxCollations; level++ { + for level := range maxCollations { for _, entry := range p.entries { var weight uint16 if level < len(entry.weights) { diff --git a/go/mysql/collations/vindex/unicode/norm/composition.go b/go/mysql/collations/vindex/unicode/norm/composition.go index 0e1bcb94128..db97e1a8453 100644 --- a/go/mysql/collations/vindex/unicode/norm/composition.go +++ b/go/mysql/collations/vindex/unicode/norm/composition.go @@ -136,7 +136,7 @@ func (rb *reorderBuffer) doFlush() bool { // appendFlush appends the normalized segment to rb.out. func appendFlush(rb *reorderBuffer) bool { - for i := 0; i < rb.nrune; i++ { + for i := range rb.nrune { start := rb.rune[i].pos end := start + rb.rune[i].size rb.out = append(rb.out, rb.byte[start:end]...) diff --git a/go/mysql/conn.go b/go/mysql/conn.go index d61549c92ef..d4f870e660f 100644 --- a/go/mysql/conn.go +++ b/go/mysql/conn.go @@ -585,7 +585,7 @@ func (c *Conn) readPacket() ([]byte, error) { func (c *Conn) ReadPacket() ([]byte, error) { result, err := c.readPacket() if err != nil { - return nil, sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return nil, sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } return result, err } @@ -1249,7 +1249,7 @@ func (c *Conn) handleComPrepare(handler Handler, data []byte) (kontinue bool) { } bindVars := make(map[string]*querypb.BindVariable, paramsCount) - for i := uint16(0); i < paramsCount; i++ { + for i := range uint16(paramsCount) { parameterID := fmt.Sprintf("v%d", i+1) bindVars[parameterID] = &querypb.BindVariable{} } @@ -1593,7 +1593,7 @@ func ParseErrorPacket(data []byte) error { // Error code is 2 bytes. code, pos, ok := readUint16(data, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRUnknownError, sqlerror.SSUnknownSQLState, "invalid error packet code: %v", data) + return sqlerror.NewSQLErrorf(sqlerror.CRUnknownError, sqlerror.SSUnknownSQLState, "invalid error packet code: %v", data) } // '#' marker of the SQL state is 1 byte. Ignored. @@ -1602,13 +1602,13 @@ func ParseErrorPacket(data []byte) error { // SQL state is 5 bytes sqlState, pos, ok := readBytes(data, pos, 5) if !ok { - return sqlerror.NewSQLError(sqlerror.CRUnknownError, sqlerror.SSUnknownSQLState, "invalid error packet sqlState: %v", data) + return sqlerror.NewSQLErrorf(sqlerror.CRUnknownError, sqlerror.SSUnknownSQLState, "invalid error packet sqlState: %v", data) } // Human readable error message is the rest. msg := string(data[pos:]) - return sqlerror.NewSQLError(sqlerror.ErrorCode(code), string(sqlState), "%v", msg) + return sqlerror.NewSQLErrorf(sqlerror.ErrorCode(code), string(sqlState), "%v", msg) } // GetTLSClientCerts gets TLS certificates. @@ -1624,12 +1624,18 @@ func (c *Conn) TLSEnabled() bool { return c.Capabilities&CapabilityClientSSL > 0 } -// IsUnixSocket returns true if this connection is over a Unix socket. +// IsUnixSocket returns true if the server connection is over a Unix socket. func (c *Conn) IsUnixSocket() bool { _, ok := c.listener.listener.(*net.UnixListener) return ok } +// IsClientUnixSocket returns true if the client connection is over a Unix socket with the server. +func (c *Conn) IsClientUnixSocket() bool { + _, ok := c.conn.(*net.UnixConn) + return ok +} + // GetRawConn returns the raw net.Conn for nefarious purposes. func (c *Conn) GetRawConn() net.Conn { return c.conn diff --git a/go/mysql/conn_test.go b/go/mysql/conn_test.go index 64b97052ead..088e487e961 100644 --- a/go/mysql/conn_test.go +++ b/go/mysql/conn_test.go @@ -22,6 +22,7 @@ import ( crypto_rand "crypto/rand" "encoding/binary" "encoding/hex" + "errors" "fmt" "math/rand/v2" "net" @@ -743,7 +744,7 @@ func TestEOFOrLengthEncodedIntFuzz(t *testing.T) { cConn.Close() }() - for i := 0; i < 100; i++ { + for range 100 { bytes := make([]byte, rand.IntN(16)+1) _, err := crypto_rand.Read(bytes) require.NoError(t, err, "error doing rand.Read") @@ -937,7 +938,7 @@ func TestConnectionErrorWhileWritingComQuery(t *testing.T) { // this handler will return an error on the first run, and fail the test if it's run more times errorString := make([]byte, 17000) - handler := &testRun{t: t, err: fmt.Errorf(string(errorString))} + handler := &testRun{t: t, err: errors.New(string(errorString))} res := sConn.handleNextCommand(handler) require.False(t, res, "we should beak the connection in case of error writing error packet") } @@ -1000,7 +1001,7 @@ func TestPrepareAndExecute(t *testing.T) { // and check that the handler received the correct input ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() - for i := 0; i < 100; i++ { + for i := range 100 { startGoRoutine(ctx, t, fmt.Sprintf("%d:%s", i, randSeq(i))) } diff --git a/go/mysql/datetime/helpers.go b/go/mysql/datetime/helpers.go index 68466e320e2..fc25a6cba48 100644 --- a/go/mysql/datetime/helpers.go +++ b/go/mysql/datetime/helpers.go @@ -76,7 +76,7 @@ func appendInt(b []byte, x int, width int) []byte { // match reports whether s1 and s2 match ignoring case. // It is assumed s1 and s2 are the same length. func match(s1, s2 string) bool { - for i := 0; i < len(s1); i++ { + for i := range len(s1) { c1 := s1[i] c2 := s2[i] if c1 != c2 { @@ -153,7 +153,7 @@ func isDigit[bytes []byte | string](s bytes, i int) bool { func isNumber[bytes []byte | string](s bytes) (int, bool) { var dot bool pos := -1 - for i := 0; i < len(s); i++ { + for i := range len(s) { if !isDigit(s, i) { if dot { return i, true @@ -189,7 +189,7 @@ func getnum(s string, fixed bool) (int, string, bool) { func getnuml(s string, l int) (int, string, bool) { var res int - for i := 0; i < l; i++ { + for i := range l { if !isDigit(s, i) { return 0, s, false } @@ -273,7 +273,7 @@ func parseNanoseconds[bytes []byte | string](value bytes, nbytes int) (ns int, l // We need nanoseconds, which means scaling by the number // of missing digits in the format, maximum length 10. scaleDigits := 10 - nbytes - for i := 0; i < scaleDigits; i++ { + for range scaleDigits { ns *= 10 } diff --git a/go/mysql/datetime/mydate.go b/go/mysql/datetime/mydate.go index 62cbb3f2524..5b77082055a 100644 --- a/go/mysql/datetime/mydate.go +++ b/go/mysql/datetime/mydate.go @@ -89,3 +89,48 @@ func DateFromDayNumber(daynr int) Date { d.year, d.month, d.day = mysqlDateFromDayNumber(daynr) return d } + +// ValidatePeriod validates the MySQL period. +// Returns false if period is non-positive or contains incorrect month value. +func ValidatePeriod(period int64) bool { + if period <= 0 { + return false + } + month := period % 100 + if month == 0 || month > 12 { + return false + } + return true +} + +// PeriodToMonths converts a MySQL period into number of months. +// This is an algorithm that has been reverse engineered from MySQL. +func PeriodToMonths(period int64) int64 { + p := uint64(period) + if p == 0 { + return 0 + } + y := p / 100 + if y < 70 { + y += 2000 + } else if y < 100 { + y += 1900 + } + return int64(y*12 + p%100 - 1) +} + +// MonthsToPeriod converts number of months into MySQL period. +// This is an algorithm that has been reverse engineered from MySQL. +func MonthsToPeriod(months int64) int64 { + m := uint64(months) + if m == 0 { + return 0 + } + y := m / 12 + if y < 70 { + y += 2000 + } else if y < 100 { + y += 1900 + } + return int64(y*100 + m%12 + 1) +} diff --git a/go/mysql/datetime/mydate_test.go b/go/mysql/datetime/mydate_test.go index bb5073b8ff8..a743db60709 100644 --- a/go/mysql/datetime/mydate_test.go +++ b/go/mysql/datetime/mydate_test.go @@ -65,3 +65,57 @@ func TestDayNumberFields(t *testing.T) { assert.Equal(t, wantDate, got) } } + +func TestValidatePeriod(t *testing.T) { + testCases := []struct { + period int64 + want bool + }{ + {110112, true}, + {101122, false}, + {-1112212, false}, + {7110, true}, + } + + for _, tc := range testCases { + got := ValidatePeriod(tc.period) + assert.Equal(t, tc.want, got) + } +} + +func TestPeriodToMonths(t *testing.T) { + testCases := []struct { + period int64 + want int64 + }{ + {0, 0}, + {110112, 13223}, + {100112, 12023}, + {7112, 23663}, + {200112, 24023}, + {112, 24023}, + } + + for _, tc := range testCases { + got := PeriodToMonths(tc.period) + assert.Equal(t, tc.want, got) + } +} + +func TestMonthsToPeriod(t *testing.T) { + testCases := []struct { + months int64 + want int64 + }{ + {0, 0}, + {13223, 110112}, + {12023, 100112}, + {23663, 197112}, + {24023, 200112}, + } + + for _, tc := range testCases { + got := MonthsToPeriod(tc.months) + assert.Equal(t, tc.want, got) + } +} diff --git a/go/mysql/decimal/mysql_test.go b/go/mysql/decimal/mysql_test.go index d1b0c52169b..602e4b41eef 100644 --- a/go/mysql/decimal/mysql_test.go +++ b/go/mysql/decimal/mysql_test.go @@ -234,10 +234,10 @@ func TestLargeDecimals(t *testing.T) { } func TestVeryLargeDecimals(t *testing.T) { - for i := 0; i <= 65; i++ { + for i := range 66 { integral := bytes.Repeat([]byte{'9'}, i) integral = append(integral, '.') - for j := 0; j <= 65; j++ { + for j := range 66 { decimal := append(integral, bytes.Repeat([]byte{'9'}, j)...) _, err := NewFromMySQL(decimal) if err != nil { @@ -308,7 +308,7 @@ var decimals = []string{ func BenchmarkDecimalParsing(b *testing.B) { b.Run("Naive", func(b *testing.B) { b.ReportAllocs() - for n := 0; n < b.N; n++ { + for range b.N { for _, dec := range decimals { _, _ = NewFromString(dec) } @@ -322,7 +322,7 @@ func BenchmarkDecimalParsing(b *testing.B) { b.Run("MySQL", func(b *testing.B) { b.ReportAllocs() - for n := 0; n < b.N; n++ { + for range b.N { for _, dec := range decimalBytes { _, _ = NewFromMySQL(dec) } @@ -365,7 +365,7 @@ func TestRoundtripStress(t *testing.T) { count = 100 } - for n := 0; n < count; n++ { + for range count { fb := strconv.AppendFloat(nil, rand.NormFloat64(), 'f', -1, 64) d, err := NewFromMySQL(fb) if err != nil { @@ -381,13 +381,13 @@ func TestRoundtripStress(t *testing.T) { func BenchmarkFormatting(b *testing.B) { const Count = 10000 var parsed = make([]Decimal, 0, Count) - for i := 0; i < Count; i++ { + for range Count { parsed = append(parsed, NewFromFloat(rand.NormFloat64())) } b.Run("StringFixed(8)", func(b *testing.B) { b.ReportAllocs() - for n := 0; n < b.N; n++ { + for range b.N { for _, dec := range parsed { _ = dec.StringFixed(8) } @@ -396,7 +396,7 @@ func BenchmarkFormatting(b *testing.B) { b.Run("formatwithPrecision(8)", func(b *testing.B) { b.ReportAllocs() - for n := 0; n < b.N; n++ { + for range b.N { for _, dec := range parsed { _ = dec.formatFast(8, true, false) } @@ -405,7 +405,7 @@ func BenchmarkFormatting(b *testing.B) { b.Run("formatFast", func(b *testing.B) { b.ReportAllocs() - for n := 0; n < b.N; n++ { + for range b.N { for _, dec := range parsed { _ = dec.formatFast(0, false, false) } @@ -414,7 +414,7 @@ func BenchmarkFormatting(b *testing.B) { b.Run("formatSlow", func(b *testing.B) { b.ReportAllocs() - for n := 0; n < b.N; n++ { + for range b.N { for _, dec := range parsed { _ = dec.formatSlow(false) } diff --git a/go/mysql/endtoend/client_test.go b/go/mysql/endtoend/client_test.go index ce01c57369d..7799a322429 100644 --- a/go/mysql/endtoend/client_test.go +++ b/go/mysql/endtoend/client_test.go @@ -204,7 +204,7 @@ func doTestMultiResult(t *testing.T, disableClientDeprecateEOF bool) { require.NoError(t, err) assert.Zero(t, result.RowsAffected, "create table RowsAffected ") - for i := 0; i < 255; i++ { + for i := range 255 { result, err := conn.ExecuteFetch(fmt.Sprintf("insert into a(id, name) values(%v, 'nice name %v')", 1000+i, i), 1000, true) require.NoError(t, err) assert.EqualValues(t, 1, result.RowsAffected, "insert into returned RowsAffected") diff --git a/go/mysql/endtoend/query_benchmark_test.go b/go/mysql/endtoend/query_benchmark_test.go index 7552e470b53..9bfd866a551 100644 --- a/go/mysql/endtoend/query_benchmark_test.go +++ b/go/mysql/endtoend/query_benchmark_test.go @@ -95,7 +95,7 @@ func benchmarkInserts(b *testing.B, params *mysql.ConnParams) { b.ResetTimer() // Do the insert. - for i := 0; i < b.N; i++ { + for i := range b.N { _, err := conn.ExecuteFetch(fmt.Sprintf("insert into a(id, name) values(%v, 'nice name %v')", i, i), 0, false) if err != nil { b.Fatalf("ExecuteFetch(%v) failed: %v", i, err) @@ -106,7 +106,7 @@ func benchmarkInserts(b *testing.B, params *mysql.ConnParams) { func benchmarkParallelReads(b *testing.B, params *mysql.ConnParams, parallelCount int) { ctx := context.Background() wg := sync.WaitGroup{} - for i := 0; i < parallelCount; i++ { + for i := range parallelCount { wg.Add(1) go func(i int) { defer wg.Done() @@ -116,7 +116,7 @@ func benchmarkParallelReads(b *testing.B, params *mysql.ConnParams, parallelCoun b.Error(err) } - for j := 0; j < b.N; j++ { + for j := range b.N { if _, err := conn.ExecuteFetch("select * from a", 20000, true); err != nil { b.Errorf("ExecuteFetch(%v, %v) failed: %v", i, j, err) } @@ -144,7 +144,7 @@ func BenchmarkSetVarsWithQueryHints(b *testing.B) { for _, sleepDuration := range []time.Duration{0, 1 * time.Millisecond} { b.Run(fmt.Sprintf("Sleep %d ms", sleepDuration/time.Millisecond), func(b *testing.B) { - for i := 0; i < b.N; i++ { + for i := range b.N { _, err := conn.ExecuteFetch(fmt.Sprintf("insert /*+ SET_VAR(sql_mode = ' ') SET_VAR(sql_safe_updates = 0) */ into t(id) values (%d)", i), 1, false) if err != nil { b.Fatal(err) @@ -194,7 +194,7 @@ func BenchmarkSetVarsMultipleSets(b *testing.B) { for _, sleepDuration := range []time.Duration{0, 1 * time.Millisecond} { b.Run(fmt.Sprintf("Sleep %d ms", sleepDuration/time.Millisecond), func(b *testing.B) { - for i := 0; i < b.N; i++ { + for i := range b.N { setFunc() _, err = conn.ExecuteFetch(fmt.Sprintf("insert into t(id) values (%d)", i), 1, false) @@ -242,7 +242,7 @@ func BenchmarkSetVarsMultipleSetsInSameStmt(b *testing.B) { for _, sleepDuration := range []time.Duration{0, 1 * time.Millisecond} { b.Run(fmt.Sprintf("Sleep %d ms", sleepDuration/time.Millisecond), func(b *testing.B) { - for i := 0; i < b.N; i++ { + for i := range b.N { _, _, err := conn.ExecuteFetchMulti(fmt.Sprintf("set sql_mode = '', sql_safe_updates = 0 ; insert into t(id) values (%d)", i), 1, false) if err != nil { b.Fatal(err) @@ -304,7 +304,7 @@ func BenchmarkSetVarsSingleSet(b *testing.B) { for _, sleepDuration := range []time.Duration{0, 1 * time.Millisecond} { b.Run(fmt.Sprintf("Sleep %d ms", sleepDuration/time.Millisecond), func(b *testing.B) { - for i := 0; i < b.N; i++ { + for i := range b.N { _, err = conn.ExecuteFetch(fmt.Sprintf("insert into t(id) values (%d)", i), 1, false) if err != nil { b.Fatal(err) diff --git a/go/mysql/endtoend/query_test.go b/go/mysql/endtoend/query_test.go index 3436d045071..5d7511b4834 100644 --- a/go/mysql/endtoend/query_test.go +++ b/go/mysql/endtoend/query_test.go @@ -121,7 +121,7 @@ func TestQueries(t *testing.T) { } // Insert a few rows. - for i := 0; i < 100; i++ { + for i := range 100 { result, err := conn.ExecuteFetch(fmt.Sprintf("insert into a(id, name) values(%v, 'nice name %v')", 1000+i, i), 1000, true) require.NoError(t, err, "ExecuteFetch(%v) failed: %v", i, err) assert.Equal(t, uint64(1), result.RowsAffected, "insert into returned RowsAffected %v, was expecting 1", result.RowsAffected) @@ -156,7 +156,7 @@ func TestLargeQueries(t *testing.T) { return string(b) } - for i := 0; i < 2; i++ { + for i := range 2 { for j := -2; j < 2; j++ { expectedString := randString((i+1)*mysql.MaxPacketSize + j) diff --git a/go/mysql/fakesqldb/server.go b/go/mysql/fakesqldb/server.go index 33512f23514..cd1080c862c 100644 --- a/go/mysql/fakesqldb/server.go +++ b/go/mysql/fakesqldb/server.go @@ -432,7 +432,7 @@ func (db *DB) HandleQuery(c *mysql.Conn, query string, callback func(*sqltypes.R userCallback(query) } if pat.err != "" { - return fmt.Errorf(pat.err) + return errors.New(pat.err) } return callback(pat.result) } @@ -592,6 +592,13 @@ func (db *DB) AddQueryPattern(queryPattern string, expectedResult *sqltypes.Resu db.patternData[queryPattern] = exprResult{queryPattern: queryPattern, expr: expr, result: &result} } +// RemoveQueryPattern removes a query pattern that was previously added. +func (db *DB) RemoveQueryPattern(queryPattern string) { + db.mu.Lock() + defer db.mu.Unlock() + delete(db.patternData, queryPattern) +} + // RejectQueryPattern allows a query pattern to be rejected with an error func (db *DB) RejectQueryPattern(queryPattern, error string) { expr := regexp.MustCompile("(?is)^" + queryPattern + "$") @@ -853,7 +860,7 @@ func (db *DB) GetQueryPatternResult(key string) (func(string), ExpectedResult, b userCallback, ok := db.queryPatternUserCallback[pat.expr] if ok { if pat.err != "" { - return userCallback, ExpectedResult{pat.result, nil}, true, fmt.Errorf(pat.err) + return userCallback, ExpectedResult{pat.result, nil}, true, errors.New(pat.err) } return userCallback, ExpectedResult{pat.result, nil}, true, nil } diff --git a/go/mysql/fastparse/atof.go b/go/mysql/fastparse/atof.go index 4193031c987..695d9e32edb 100644 --- a/go/mysql/fastparse/atof.go +++ b/go/mysql/fastparse/atof.go @@ -64,7 +64,7 @@ func commonPrefixLenIgnoreCase(s, prefix string) int { if n > len(s) { n = len(s) } - for i := 0; i < n; i++ { + for i := range n { c := s[i] if 'A' <= c && c <= 'Z' { c += 'a' - 'A' diff --git a/go/mysql/flavor.go b/go/mysql/flavor.go index f732b1ccb88..a0f9e8cc4b1 100644 --- a/go/mysql/flavor.go +++ b/go/mysql/flavor.go @@ -158,7 +158,7 @@ type flavor interface { // flavorFuncs maps flavor names to their implementation. // Flavors need to register only if they support being specified in the // connection parameters. -var flavorFuncs = make(map[string]func() flavor) +var flavorFuncs = make(map[string]func(serverVersion string) flavor) // GetFlavor fills in c.Flavor. If the params specify the flavor, // that is used. Otherwise, we auto-detect. @@ -172,11 +172,11 @@ var flavorFuncs = make(map[string]func() flavor) // Note on such servers, 'select version()' would return 10.0.21-MariaDB-... // as well (not matching what c.ServerVersion is, but matching after we remove // the prefix). -func GetFlavor(serverVersion string, flavorFunc func() flavor) (f flavor, capableOf capabilities.CapableOf, canonicalVersion string) { +func GetFlavor(serverVersion string, flavorFunc func(serverVersion string) flavor) (f flavor, capableOf capabilities.CapableOf, canonicalVersion string) { canonicalVersion = serverVersion switch { case flavorFunc != nil: - f = flavorFunc() + f = flavorFunc(serverVersion) case strings.HasPrefix(serverVersion, mariaDBReplicationHackPrefix): canonicalVersion = serverVersion[len(mariaDBReplicationHackPrefix):] f = mariadbFlavor101{mariadbFlavor{serverVersion: canonicalVersion}} @@ -282,7 +282,7 @@ func (c *Conn) GetServerUUID() (string, error) { // PrimaryFilePosition returns the current primary's file based replication position. func (c *Conn) PrimaryFilePosition() (replication.Position, error) { - filePosFlavor := filePosFlavor{} + filePosFlavor := filePosFlavor{serverVersion: c.ServerVersion} gtidSet, err := filePosFlavor.primaryGTIDSet(c) if err != nil { return replication.Position{}, err @@ -440,7 +440,7 @@ func (c *Conn) CatchupToGTIDCommands(params *ConnParams, pos replication.Positio // the context expires for the file position flavor. It returns an error if // we did not succeed. func (c *Conn) WaitUntilFilePosition(ctx context.Context, pos replication.Position) error { - filePosFlavor := filePosFlavor{} + filePosFlavor := filePosFlavor{serverVersion: c.ServerVersion} return filePosFlavor.waitUntilPosition(ctx, c, pos) } diff --git a/go/mysql/flavor_filepos.go b/go/mysql/flavor_filepos.go index 5e766e81912..01d748c66f3 100644 --- a/go/mysql/flavor_filepos.go +++ b/go/mysql/flavor_filepos.go @@ -32,19 +32,25 @@ import ( ) type filePosFlavor struct { - format BinlogFormat - file string - savedEvent BinlogEvent + format BinlogFormat + file string + savedEvent BinlogEvent + serverVersion string } // newFilePosFlavor creates a new filePos flavor. -func newFilePosFlavor() flavor { - return &filePosFlavor{} +func newFilePosFlavor(serverVersion string) flavor { + return &filePosFlavor{serverVersion: serverVersion} } // primaryGTIDSet is part of the Flavor interface. func (flv *filePosFlavor) primaryGTIDSet(c *Conn) (replication.GTIDSet, error) { - qr, err := c.ExecuteFetch("SHOW MASTER STATUS", 100, true /* wantfields */) + query := "SHOW MASTER STATUS" + if ok, err := c.SupportsCapability(capabilities.BinaryLogStatus); err == nil && ok { + query = "SHOW BINARY LOG STATUS" + } + + qr, err := c.ExecuteFetch(query, 100, true /* wantfields */) if err != nil { return nil, err } @@ -142,7 +148,7 @@ func (flv *filePosFlavor) readBinlogEvent(c *Conn) (BinlogEvent, error) { } switch result[0] { case EOFPacket: - return nil, sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", io.EOF) + return nil, sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", io.EOF) case ErrPacket: return nil, ParseErrorPacket(result) } @@ -291,14 +297,21 @@ func (flv *filePosFlavor) waitUntilPosition(ctx context.Context, c *Conn, pos re if !ok { return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "position is not filePos compatible: %#v", pos.GTIDSet) } + queryPos := "SELECT MASTER_POS_WAIT('%s', %d)" + queryPosSub := "SELECT MASTER_POS_WAIT('%s', %d, %.6f)" + + if ok, err := c.SupportsCapability(capabilities.ReplicaTerminologyCapability); err == nil && ok { + queryPos = "SELECT SOURCE_POS_WAIT('%s', %d)" + queryPosSub = "SELECT SOURCE_POS_WAIT('%s', %d, %.6f)" + } - query := fmt.Sprintf("SELECT MASTER_POS_WAIT('%s', %d)", filePosPos.File, filePosPos.Pos) + query := fmt.Sprintf(queryPos, filePosPos.File, filePosPos.Pos) if deadline, ok := ctx.Deadline(); ok { timeout := time.Until(deadline) if timeout <= 0 { return vterrors.Errorf(vtrpcpb.Code_DEADLINE_EXCEEDED, "timed out waiting for position %v", pos) } - query = fmt.Sprintf("SELECT MASTER_POS_WAIT('%s', %d, %.6f)", filePosPos.File, filePosPos.Pos, timeout.Seconds()) + query = fmt.Sprintf(queryPosSub, filePosPos.File, filePosPos.Pos, timeout.Seconds()) } result, err := c.ExecuteFetch(query, 1, false) @@ -354,8 +367,10 @@ func (*filePosFlavor) baseShowTablesWithSizes() string { } // supportsCapability is part of the Flavor interface. -func (*filePosFlavor) supportsCapability(capability capabilities.FlavorCapability) (bool, error) { +func (f *filePosFlavor) supportsCapability(capability capabilities.FlavorCapability) (bool, error) { switch capability { + case capabilities.BinaryLogStatus: + return capabilities.ServerVersionAtLeast(f.serverVersion, 8, 2, 0) default: return false, nil } diff --git a/go/mysql/flavor_mariadb.go b/go/mysql/flavor_mariadb.go index 301ec2b0596..bafb24a0c77 100644 --- a/go/mysql/flavor_mariadb.go +++ b/go/mysql/flavor_mariadb.go @@ -351,7 +351,7 @@ func (mariadbFlavor) readBinlogEvent(c *Conn) (BinlogEvent, error) { } switch result[0] { case EOFPacket: - return nil, sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", io.EOF) + return nil, sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", io.EOF) case ErrPacket: return nil, ParseErrorPacket(result) } diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index 5de3dc4ed46..b840c3cca36 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -386,7 +386,7 @@ func (mysqlFlavor) readBinlogEvent(c *Conn) (BinlogEvent, error) { } switch result[0] { case EOFPacket: - return nil, sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", io.EOF) + return nil, sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", io.EOF) case ErrPacket: return nil, ParseErrorPacket(result) } @@ -413,15 +413,20 @@ const BaseShowTables = `SELECT t.table_name, ` // TablesWithSize80 is a query to select table along with size for mysql 8.0 -// // Note the following: -// - We use a single query to fetch both partitioned and non-partitioned tables. This is because -// accessing `information_schema.innodb_tablespaces` is expensive on servers with many tablespaces, -// and every query that loads the table needs to perform full table scans on it. Doing a single -// table scan is more efficient than doing more than one. -// - We utilize `INFORMATION_SCHEMA`.`TABLES`.`CREATE_OPTIONS` column to do early pruning before the JOIN. // - `TABLES`.`TABLE_NAME` has `utf8mb4_0900_ai_ci` collation. `INNODB_TABLESPACES`.`NAME` has `utf8mb3_general_ci`. // We normalize the collation to get better query performance (we force the casting at the time of our choosing) +// - InnoDB has different table names than MySQL does, in particular for partitioned tables. As far as InnoDB +// is concerned, each partition is its own table. +// - We use a `UNION ALL` approach to handle two distinct scenarios: tables that are partitioned and those that are not. +// Since we `LEFT JOIN` from `TABLES` to `INNODB_TABLESPACES`, we know we already do full table scan on `TABLES`. We therefore +// don't mind spending some extra computation time (as in `CONCAT(t.table_schema, '/', t.table_name, '#p#%') COLLATE utf8mb3_general_ci`) +// to make things easier for the JOIN. +// - We utilize `INFORMATION_SCHEMA`.`TABLES`.`CREATE_OPTIONS` column to tell if the table is partitioned or not. The column +// may be `NULL` or may have multiple attributes, one of which is "partitioned", which we are looking for. +// - In a partitioned table, InnoDB will return multiple rows for the same table name, one for each partition, which we successively SUM. +// We also `SUM` the sizes in the non-partitioned case. This is not because we need to, but because it makes the query +// symmetric and less prone to future edit errors. const TablesWithSize80 = `SELECT t.table_name, t.table_type, UNIX_TIMESTAMP(t.create_time), @@ -429,10 +434,24 @@ const TablesWithSize80 = `SELECT t.table_name, SUM(i.file_size), SUM(i.allocated_size) FROM information_schema.tables t - LEFT JOIN information_schema.innodb_tablespaces i - ON i.name LIKE CONCAT(t.table_schema, '/', t.table_name, IF(t.create_options <=> 'partitioned', '#p#%', '')) COLLATE utf8mb3_general_ci + LEFT JOIN (SELECT name, file_size, allocated_size FROM information_schema.innodb_tablespaces WHERE name LIKE CONCAT(database(), '/%')) i + ON i.name = CONCAT(t.table_schema, '/', t.table_name) COLLATE utf8mb3_general_ci WHERE - t.table_schema = database() + t.table_schema = database() AND IFNULL(t.create_options, '') NOT LIKE '%partitioned%' + GROUP BY + t.table_schema, t.table_name, t.table_type, t.create_time, t.table_comment +UNION ALL +SELECT t.table_name, + t.table_type, + UNIX_TIMESTAMP(t.create_time), + t.table_comment, + SUM(i.file_size), + SUM(i.allocated_size) + FROM information_schema.tables t + LEFT JOIN (SELECT name, file_size, allocated_size FROM information_schema.innodb_tablespaces WHERE name LIKE CONCAT(database(), '/%')) i + ON i.name LIKE (CONCAT(t.table_schema, '/', t.table_name, '#p#%') COLLATE utf8mb3_general_ci) + WHERE + t.table_schema = database() AND t.create_options LIKE '%partitioned%' GROUP BY t.table_schema, t.table_name, t.table_type, t.create_time, t.table_comment ` diff --git a/go/mysql/flavor_mysqlgr.go b/go/mysql/flavor_mysqlgr.go index df3dc060742..98516e9cc9f 100644 --- a/go/mysql/flavor_mysqlgr.go +++ b/go/mysql/flavor_mysqlgr.go @@ -42,8 +42,8 @@ type mysqlGRFlavor struct { } // newMysqlGRFlavor creates a new mysqlGR flavor. -func newMysqlGRFlavor() flavor { - return &mysqlGRFlavor{} +func newMysqlGRFlavor(serverVersion string) flavor { + return &mysqlGRFlavor{mysqlFlavor{serverVersion: serverVersion}} } // startReplicationCommand returns the command to start the replication. diff --git a/go/mysql/flavor_mysqlgr_test.go b/go/mysql/flavor_mysqlgr_test.go index 348aefca934..33c6567b888 100644 --- a/go/mysql/flavor_mysqlgr_test.go +++ b/go/mysql/flavor_mysqlgr_test.go @@ -84,7 +84,7 @@ func TestMysqlGRSupportCapability(t *testing.T) { isCapable: false, }, { - version: "5.6.7", + version: "5.7.29", capability: capabilities.InstantDDLFlavorCapability, isCapable: false, }, @@ -93,16 +93,6 @@ func TestMysqlGRSupportCapability(t *testing.T) { capability: capabilities.TransactionalGtidExecutedFlavorCapability, isCapable: false, }, - { - version: "5.6.7", - capability: capabilities.MySQLJSONFlavorCapability, - isCapable: false, - }, - { - version: "5.7.29", - capability: capabilities.MySQLJSONFlavorCapability, - isCapable: true, - }, { version: "8.0.30", capability: capabilities.DynamicRedoLogCapacityFlavorCapability, diff --git a/go/mysql/flavor_test.go b/go/mysql/flavor_test.go index 172ffa67eb2..3d584b8293b 100644 --- a/go/mysql/flavor_test.go +++ b/go/mysql/flavor_test.go @@ -53,11 +53,6 @@ func TestServerVersionCapableOf(t *testing.T) { capability: capabilities.TransactionalGtidExecutedFlavorCapability, isCapable: false, }, - { - version: "5.7.29", - capability: capabilities.MySQLJSONFlavorCapability, - isCapable: true, - }, { version: "8.0.30", capability: capabilities.DynamicRedoLogCapacityFlavorCapability, diff --git a/go/mysql/handshake_test.go b/go/mysql/handshake_test.go index 284189c30e8..13ed1099e58 100644 --- a/go/mysql/handshake_test.go +++ b/go/mysql/handshake_test.go @@ -37,6 +37,7 @@ import ( // This file tests the handshake scenarios between our client and our server. func TestClearTextClientAuth(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStaticWithAuthMethodDescription("", "", 0, MysqlClearPassword) @@ -51,10 +52,6 @@ func TestClearTextClientAuth(t *testing.T) { defer l.Close() host := l.Addr().(*net.TCPAddr).IP.String() port := l.Addr().(*net.TCPAddr).Port - go func() { - l.Accept() - }() - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -63,9 +60,10 @@ func TestClearTextClientAuth(t *testing.T) { Pass: "password1", SslMode: vttls.Disabled, } + go l.Accept() + defer cleanupListener(ctx, l, params) // Connection should fail, as server requires SSL for clear text auth. - ctx := context.Background() _, err = Connect(ctx, params) if err == nil || !strings.Contains(err.Error(), "Cannot use clear text authentication over non-SSL connections") { t.Fatalf("unexpected connection error: %v", err) @@ -92,6 +90,7 @@ func TestClearTextClientAuth(t *testing.T) { // TestSSLConnection creates a server with TLS support, a client that // also has SSL support, and connects them. func TestSSLConnection(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStaticWithAuthMethodDescription("", "", 0, MysqlClearPassword) @@ -103,7 +102,6 @@ func TestSSLConnection(t *testing.T) { // Create the listener, so we can get its host. l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err, "NewListener failed: %v", err) - defer l.Close() host := l.Addr().(*net.TCPAddr).IP.String() port := l.Addr().(*net.TCPAddr).Port @@ -122,12 +120,6 @@ func TestSSLConnection(t *testing.T) { "", tls.VersionTLS12) require.NoError(t, err, "TLSServerConfig failed: %v", err) - - l.TLSConfig.Store(serverConfig) - go func() { - l.Accept() - }() - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -141,20 +133,22 @@ func TestSSLConnection(t *testing.T) { SslKey: path.Join(root, "client-key.pem"), ServerName: "server.example.com", } + l.TLSConfig.Store(serverConfig) + go l.Accept() + defer cleanupListener(ctx, l, params) t.Run("Basics", func(t *testing.T) { - testSSLConnectionBasics(t, params) + testSSLConnectionBasics(t, ctx, params) }) // Make sure clear text auth works over SSL. t.Run("ClearText", func(t *testing.T) { - testSSLConnectionClearText(t, params) + testSSLConnectionClearText(t, ctx, params) }) } -func testSSLConnectionClearText(t *testing.T, params *ConnParams) { +func testSSLConnectionClearText(t *testing.T, ctx context.Context, params *ConnParams) { // Create a client connection, connect. - ctx := context.Background() conn, err := Connect(ctx, params) require.NoError(t, err, "Connect failed: %v", err) @@ -170,9 +164,8 @@ func testSSLConnectionClearText(t *testing.T, params *ConnParams) { conn.writeComQuit() } -func testSSLConnectionBasics(t *testing.T, params *ConnParams) { +func testSSLConnectionBasics(t *testing.T, ctx context.Context, params *ConnParams) { // Create a client connection, connect. - ctx := context.Background() conn, err := Connect(ctx, params) require.NoError(t, err, "Connect failed: %v", err) diff --git a/go/mysql/icuregex/compiler.go b/go/mysql/icuregex/compiler.go index 6aa92e268bb..83962ef73b2 100644 --- a/go/mysql/icuregex/compiler.go +++ b/go/mysql/icuregex/compiler.go @@ -240,7 +240,7 @@ func (c *compiler) nextChar(ch *reChar) { // ch.char = 0 c.nextCharLL() // Consume the initial 0. - for index := 0; index < 3; index++ { + for index := range 3 { ch2 := c.peekCharLL() if ch2 < chDigit0 || ch2 > chDigit7 { if index == 0 { @@ -1740,7 +1740,7 @@ func (c *compiler) stripNOPs() { // Make a first pass over the code, computing the amount that things // will be offset at each location in the original code. var loc, d int - for loc = 0; loc < end; loc++ { + for loc = range end { deltas = append(deltas, d) op := c.out.compiledPat[loc] if op.typ() == urxNop { @@ -1753,7 +1753,7 @@ func (c *compiler) stripNOPs() { // are being moved. The array of offsets from the first step is used // to compute the new operand values. var src, dst int - for src = 0; src < end; src++ { + for src = range end { op := c.out.compiledPat[src] opType := op.typ() diff --git a/go/mysql/icuregex/icu_test.go b/go/mysql/icuregex/icu_test.go index 9e9be505df7..4336608f0d8 100644 --- a/go/mysql/icuregex/icu_test.go +++ b/go/mysql/icuregex/icu_test.go @@ -267,7 +267,7 @@ func (tp *TestPattern) Test(t testing.TB) bool { findCount = 1 } - for i := 0; i < findCount; i++ { + for range findCount { isMatch, err = func() (bool, error) { defer func() { if r := recover(); r != nil { @@ -299,7 +299,7 @@ func (tp *TestPattern) Test(t testing.TB) bool { return true } - for i := 0; i < matcher.GroupCount(); i++ { + for i := range matcher.GroupCount() { expectedStart := -1 expectedEnd := -1 diff --git a/go/mysql/icuregex/internal/ubidi/ubidi.go b/go/mysql/icuregex/internal/ubidi/ubidi.go index 79482dfbc8d..1aaa8a0a791 100644 --- a/go/mysql/icuregex/internal/ubidi/ubidi.go +++ b/go/mysql/icuregex/internal/ubidi/ubidi.go @@ -297,7 +297,7 @@ func AddPropertyStarts(sa propertySet) { mrs := mirrors() /* add the code points from the bidi mirroring table */ length := idxs[ixMirrorLength] - for i := int32(0); i < length; i++ { + for i := range int32(length) { c := mirrorCodePoint(rune(mrs[i])) sa.AddRuneRange(c, c+1) } diff --git a/go/mysql/icuregex/internal/uchar/uchar.go b/go/mysql/icuregex/internal/uchar/uchar.go index e93b51d9bb4..1fbc874665b 100644 --- a/go/mysql/icuregex/internal/uchar/uchar.go +++ b/go/mysql/icuregex/internal/uchar/uchar.go @@ -203,7 +203,7 @@ func parseInt(str string) (string, uint8) { start := 0 end := 0 whitespace: - for i := 0; i < len(str); i++ { + for i := range len(str) { switch str[i] { case ' ', '\f', '\n', '\r', '\t', '\v': start++ @@ -214,7 +214,7 @@ whitespace: } str = str[start:] - for i := 0; i < len(str); i++ { + for i := range len(str) { if str[i] < '0' || str[i] > '9' { end = i break diff --git a/go/mysql/icuregex/internal/unames/loader.go b/go/mysql/icuregex/internal/unames/loader.go index 296670b1c66..60969f6350b 100644 --- a/go/mysql/icuregex/internal/unames/loader.go +++ b/go/mysql/icuregex/internal/unames/loader.go @@ -69,7 +69,7 @@ func loadCharNames() { algCount := b.Uint32() charNames.algNames = make([]algorithmicRange, 0, algCount) - for i := uint32(0); i < algCount; i++ { + for range uint32(algCount) { ar := algorithmicRange{ start: b.Uint32(), end: b.Uint32(), diff --git a/go/mysql/icuregex/internal/unames/unames.go b/go/mysql/icuregex/internal/unames/unames.go index 66e8ba15615..bdd30495458 100644 --- a/go/mysql/icuregex/internal/unames/unames.go +++ b/go/mysql/icuregex/internal/unames/unames.go @@ -130,7 +130,7 @@ func (ar *algorithmicRange) findAlgName(otherName string) rune { } t := otherName - for i = 0; i < len(factors); i++ { + for i = range len(factors) { s = elements[i] for s[0] != 0 && len(t) > 0 { @@ -153,7 +153,7 @@ func (ar *algorithmicRange) findAlgName(otherName string) rune { func (ar *algorithmicRange) writeFactorSuffix0(factors []uint16, s []uint8, buf *strings.Builder, elements, elementBases *[8][]byte) { /* write each element */ - for i := 0; i < len(factors); i++ { + for i := range len(factors) { (*elements)[i] = s (*elementBases)[i] = s diff --git a/go/mysql/icuregex/internal/uprops/properties.go b/go/mysql/icuregex/internal/uprops/properties.go index 954fc920f6c..9e9bfb2761d 100644 --- a/go/mysql/icuregex/internal/uprops/properties.go +++ b/go/mysql/icuregex/internal/uprops/properties.go @@ -114,7 +114,7 @@ func getInclusionsForBinaryProperty(prop Property) (*uset.UnicodeSet, error) { numRanges := incl.RangeCount() startHasProperty := rune(-1) - for i := 0; i < numRanges; i++ { + for i := range numRanges { rangeEnd := incl.RangeEnd(i) for c := incl.RangeStart(i); c <= rangeEnd; c++ { if HasBinaryProperty(c, prop) { @@ -152,7 +152,7 @@ func getInclusionsForIntProperty(prop Property) (*uset.UnicodeSet, error) { numRanges := incl.RangeCount() prevValue := int32(0) - for i := 0; i < numRanges; i++ { + for i := range numRanges { rangeEnd := incl.RangeEnd(i) for c := incl.RangeStart(i); c <= rangeEnd; c++ { value := getIntPropertyValue(c, prop) diff --git a/go/mysql/icuregex/internal/uset/close.go b/go/mysql/icuregex/internal/uset/close.go index bd3f9f0f7e3..56438804bf3 100644 --- a/go/mysql/icuregex/internal/uset/close.go +++ b/go/mysql/icuregex/internal/uset/close.go @@ -82,7 +82,7 @@ func (u *UnicodeSet) CloseOver(attribute USet) { foldSet := u.Clone() n := u.RangeCount() - for i := 0; i < n; i++ { + for i := range n { start := u.RangeStart(i) end := u.RangeEnd(i) diff --git a/go/mysql/icuregex/internal/uset/pattern.go b/go/mysql/icuregex/internal/uset/pattern.go index 20b44da9c6d..af836941647 100644 --- a/go/mysql/icuregex/internal/uset/pattern.go +++ b/go/mysql/icuregex/internal/uset/pattern.go @@ -69,7 +69,7 @@ func (u *UnicodeSet) ToPattern(w *strings.Builder, escapeUnprintable bool) { } } else { // Default; emit the ranges as pairs - for i := 0; i < count; i++ { + for i := range count { start := u.RangeStart(i) end := u.RangeEnd(i) u.appendToPattern(w, start, escapeUnprintable) diff --git a/go/mysql/icuregex/internal/uset/unicode_set.go b/go/mysql/icuregex/internal/uset/unicode_set.go index d85bab47532..27cfb92d916 100644 --- a/go/mysql/icuregex/internal/uset/unicode_set.go +++ b/go/mysql/icuregex/internal/uset/unicode_set.go @@ -471,7 +471,7 @@ func (u *UnicodeSet) Clear() { func (u *UnicodeSet) Len() (n int) { count := u.RangeCount() - for i := 0; i < count; i++ { + for i := range count { n += int(u.RangeEnd(i)) - int(u.RangeStart(i)) + 1 } return @@ -616,7 +616,7 @@ func (u *UnicodeSet) ApplyFilter(inclusions *UnicodeSet, filter Filter) { startHasProperty := rune(-1) limitRange := inclusions.RangeCount() - for j := 0; j < limitRange; j++ { + for j := range limitRange { // get current range start := inclusions.RangeStart(j) end := inclusions.RangeEnd(j) diff --git a/go/mysql/icuregex/matcher.go b/go/mysql/icuregex/matcher.go index 1b5495f495f..aa0a78385e4 100644 --- a/go/mysql/icuregex/matcher.go +++ b/go/mysql/icuregex/matcher.go @@ -128,7 +128,7 @@ func (m *Matcher) MatchAt(startIdx int, toEnd bool) error { fp := m.resetStack() *fp.inputIdx() = startIdx *fp.patIdx() = 0 - for i := 0; i < len(m.data); i++ { + for i := range len(m.data) { m.data[i] = 0 } diff --git a/go/mysql/json/marshal.go b/go/mysql/json/marshal.go index d1a0072ccbb..97d14a336c8 100644 --- a/go/mysql/json/marshal.go +++ b/go/mysql/json/marshal.go @@ -175,6 +175,6 @@ func MarshalSQLValue(buf []byte) (*sqltypes.Value, error) { return nil, err } - newVal := sqltypes.MakeTrusted(querypb.Type_JSON, jsonVal.MarshalSQLTo(nil)) + newVal := sqltypes.MakeTrusted(querypb.Type_RAW, jsonVal.MarshalSQLTo(nil)) return &newVal, nil } diff --git a/go/mysql/json/parser.go b/go/mysql/json/parser.go index b7a87c25756..02225c7db24 100644 --- a/go/mysql/json/parser.go +++ b/go/mysql/json/parser.go @@ -328,7 +328,7 @@ func hasSpecialChars(s string) bool { if strings.IndexByte(s, '"') >= 0 || strings.IndexByte(s, '\\') >= 0 { return true } - for i := 0; i < len(s); i++ { + for i := range len(s) { if s[i] < 0x20 { return true } @@ -420,7 +420,7 @@ func unescapeStringBestEffort(s string) string { // parseRawKey is similar to parseRawString, but is optimized // for small-sized keys without escape sequences. func parseRawKey(s string) (string, string, bool, error) { - for i := 0; i < len(s); i++ { + for i := range len(s) { if s[i] == '"' { // Fast path. return s[:i], s[i+1:], false, nil diff --git a/go/mysql/mysql_fuzzer.go b/go/mysql/mysql_fuzzer.go index 7370ad8a479..3ec302151f2 100644 --- a/go/mysql/mysql_fuzzer.go +++ b/go/mysql/mysql_fuzzer.go @@ -310,7 +310,7 @@ func FuzzTLSServer(data []byte) int { totalQueries := 20 var queries [][]byte c := gofuzzheaders.NewConsumer(data) - for i := 0; i < totalQueries; i++ { + for i := range totalQueries { query, err := c.GetBytes() if err != nil { return -1 @@ -377,7 +377,7 @@ func FuzzTLSServer(data []byte) int { return -1 } - for i := 0; i < len(queries); i++ { + for i := range len(queries) { conn.writeFuzzedPacket(queries[i]) } return 1 diff --git a/go/mysql/query.go b/go/mysql/query.go index 22299e5cc80..26582cecbd9 100644 --- a/go/mysql/query.go +++ b/go/mysql/query.go @@ -99,36 +99,36 @@ func (c *Conn) writeComSetOption(operation uint16) error { func (c *Conn) readColumnDefinition(field *querypb.Field, index int) error { colDef, err := c.readEphemeralPacket() if err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } defer c.recycleReadPacket() // Catalog is ignored, always set to "def" pos, ok := skipLenEncString(colDef, 0) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v catalog failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v catalog failed", index) } // schema, table, orgTable, name and OrgName are strings. field.Database, pos, ok = readLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v schema failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v schema failed", index) } field.Table, pos, ok = readLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v table failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v table failed", index) } field.OrgTable, pos, ok = readLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v org_table failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v org_table failed", index) } field.Name, pos, ok = readLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v name failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v name failed", index) } field.OrgName, pos, ok = readLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v org_name failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v org_name failed", index) } // Skip length of fixed-length fields. @@ -137,37 +137,37 @@ func (c *Conn) readColumnDefinition(field *querypb.Field, index int) error { // characterSet is a uint16. characterSet, pos, ok := readUint16(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v characterSet failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v characterSet failed", index) } field.Charset = uint32(characterSet) // columnLength is a uint32. field.ColumnLength, pos, ok = readUint32(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v columnLength failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v columnLength failed", index) } // type is one byte. t, pos, ok := readByte(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v type failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v type failed", index) } // flags is 2 bytes. flags, pos, ok := readUint16(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v flags failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v flags failed", index) } // Convert MySQL type to Vitess type. field.Type, err = sqltypes.MySQLToType(t, int64(flags)) if err != nil { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "MySQLToType(%v,%v) failed for column %v: %v", t, flags, index, err) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "MySQLToType(%v,%v) failed for column %v: %v", t, flags, index, err) } // Decimals is a byte. decimals, _, ok := readByte(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v decimals failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v decimals failed", index) } field.Decimals = uint32(decimals) @@ -197,7 +197,7 @@ func (c *Conn) readColumnDefinition(field *querypb.Field, index int) error { func (c *Conn) readColumnDefinitionType(field *querypb.Field, index int) error { colDef, err := c.readEphemeralPacket() if err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } defer c.recycleReadPacket() @@ -205,27 +205,27 @@ func (c *Conn) readColumnDefinitionType(field *querypb.Field, index int) error { // strings, all skipped. pos, ok := skipLenEncString(colDef, 0) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v catalog failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v catalog failed", index) } pos, ok = skipLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v schema failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v schema failed", index) } pos, ok = skipLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v table failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v table failed", index) } pos, ok = skipLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v org_table failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v org_table failed", index) } pos, ok = skipLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v name failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v name failed", index) } pos, ok = skipLenEncString(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v org_name failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "skipping col %v org_name failed", index) } // Skip length of fixed-length fields. @@ -234,31 +234,31 @@ func (c *Conn) readColumnDefinitionType(field *querypb.Field, index int) error { // characterSet is a uint16. _, pos, ok = readUint16(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v characterSet failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v characterSet failed", index) } // columnLength is a uint32. _, pos, ok = readUint32(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v columnLength failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v columnLength failed", index) } // type is one byte t, pos, ok := readByte(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v type failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v type failed", index) } // flags is 2 bytes flags, _, ok := readUint16(colDef, pos) if !ok { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v flags failed", index) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "extracting col %v flags failed", index) } // Convert MySQL type to Vitess type. field.Type, err = sqltypes.MySQLToType(t, int64(flags)) if err != nil { - return sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "MySQLToType(%v,%v) failed for column %v: %v", t, flags, index, err) + return sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "MySQLToType(%v,%v) failed for column %v: %v", t, flags, index, err) } // skip decimals @@ -274,7 +274,7 @@ func (c *Conn) parseRow(data []byte, fields []*querypb.Field, reader func([]byte result = make([]sqltypes.Value, 0, colNumber) } pos := 0 - for i := 0; i < colNumber; i++ { + for i := range colNumber { if data[pos] == NullValue { result = append(result, sqltypes.Value{}) pos++ @@ -417,7 +417,7 @@ func (c *Conn) ReadQueryResult(maxrows int, wantfields bool) (*sqltypes.Result, // Read column headers. One packet per column. // Build the fields. - for i := 0; i < colNumber; i++ { + for i := range colNumber { result.Fields[i] = &fields[i] if wantfields { @@ -435,7 +435,7 @@ func (c *Conn) ReadQueryResult(maxrows int, wantfields bool) (*sqltypes.Result, // EOF is only present here if it's not deprecated. data, err := c.readEphemeralPacket() if err != nil { - return nil, false, 0, sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return nil, false, 0, sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } if c.isEOFPacket(data) { @@ -457,7 +457,7 @@ func (c *Conn) ReadQueryResult(maxrows int, wantfields bool) (*sqltypes.Result, for { data, err := c.readEphemeralPacket() if err != nil { - return nil, false, 0, sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return nil, false, 0, sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } if c.isEOFPacket(data) { @@ -527,7 +527,7 @@ func (c *Conn) drainResults() error { for { data, err := c.readEphemeralPacket() if err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } if c.isEOFPacket(data) { c.recycleReadPacket() @@ -543,7 +543,7 @@ func (c *Conn) drainResults() error { func (c *Conn) readComQueryResponse(packetOk *PacketOK) (int, error) { data, err := c.readEphemeralPacket() if err != nil { - return 0, sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return 0, sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } defer c.recycleReadPacket() if len(data) == 0 { @@ -627,7 +627,7 @@ func (c *Conn) parseComStmtExecute(prepareData map[uint32]*PrepareData, data []b newParamsBoundFlag, pos, ok := readByte(payload, pos) if ok && newParamsBoundFlag == 0x01 { var mysqlType, flags byte - for i := uint16(0); i < prepare.ParamsCount; i++ { + for i := range uint16(prepare.ParamsCount) { mysqlType, pos, ok = readByte(payload, pos) if !ok { return stmtID, 0, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "reading parameter type failed") @@ -641,14 +641,14 @@ func (c *Conn) parseComStmtExecute(prepareData map[uint32]*PrepareData, data []b // convert MySQL type to internal type. valType, err := sqltypes.MySQLToType(mysqlType, int64(flags)) if err != nil { - return stmtID, 0, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "MySQLToType(%v,%v) failed: %v", mysqlType, flags, err) + return stmtID, 0, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "MySQLToType(%v,%v) failed: %v", mysqlType, flags, err) } prepare.ParamsType[i] = int32(valType) } } - for i := 0; i < len(prepare.ParamsType); i++ { + for i := range len(prepare.ParamsType) { var val sqltypes.Value parameterID := fmt.Sprintf("v%d", i+1) if v, ok := prepare.BindVars[parameterID]; ok { @@ -663,7 +663,7 @@ func (c *Conn) parseComStmtExecute(prepareData map[uint32]*PrepareData, data []b val, pos, ok = c.parseStmtArgs(payload, querypb.Type(prepare.ParamsType[i]), pos) } if !ok { - return stmtID, 0, sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "decoding parameter value failed: %v", prepare.ParamsType[i]) + return stmtID, 0, sqlerror.NewSQLErrorf(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "decoding parameter value failed: %v", prepare.ParamsType[i]) } prepare.BindVars[parameterID] = sqltypes.ValueBindVariable(val) @@ -685,7 +685,7 @@ func (c *Conn) parseStmtArgs(data []byte, typ querypb.Type, pos int) (sqltypes.V case sqltypes.Uint16: val, pos, ok := readUint16(data, pos) return sqltypes.NewUint64(uint64(val)), pos, ok - case sqltypes.Int16, sqltypes.Year: + case sqltypes.Int16: val, pos, ok := readUint16(data, pos) return sqltypes.NewInt64(int64(int16(val))), pos, ok case sqltypes.Uint24, sqltypes.Uint32: @@ -696,7 +696,7 @@ func (c *Conn) parseStmtArgs(data []byte, typ querypb.Type, pos int) (sqltypes.V return sqltypes.NewInt64(int64(int32(val))), pos, ok case sqltypes.Float32: val, pos, ok := readUint32(data, pos) - return sqltypes.NewFloat64(float64(math.Float32frombits(uint32(val)))), pos, ok + return sqltypes.NewFloat64(float64(math.Float32frombits(val))), pos, ok case sqltypes.Uint64: val, pos, ok := readUint64(data, pos) return sqltypes.NewUint64(val), pos, ok @@ -713,7 +713,11 @@ func (c *Conn) parseStmtArgs(data []byte, typ querypb.Type, pos int) (sqltypes.V } switch size { case 0x00: - return sqltypes.NewVarChar(" "), pos, ok + out := []byte("0000-00-00") + if typ != sqltypes.Date { + out = append(out, []byte(" 00:00:00")...) + } + return sqltypes.MakeTrusted(typ, out), pos, ok case 0x0b: year, pos, ok := readUint16(data, pos) if !ok { @@ -743,15 +747,22 @@ func (c *Conn) parseStmtArgs(data []byte, typ querypb.Type, pos int) (sqltypes.V if !ok { return sqltypes.NULL, 0, false } - val := strconv.Itoa(int(year)) + "-" + - strconv.Itoa(int(month)) + "-" + - strconv.Itoa(int(day)) + " " + - strconv.Itoa(int(hour)) + ":" + - strconv.Itoa(int(minute)) + ":" + - strconv.Itoa(int(second)) + "." + - fmt.Sprintf("%06d", microSecond) - - return sqltypes.NewVarChar(val), pos, ok + val := strconv.AppendInt(nil, int64(year), 10) + val = append(val, '-') + val = strconv.AppendInt(val, int64(month), 10) + val = append(val, '-') + val = strconv.AppendInt(val, int64(day), 10) + if typ != sqltypes.Date { + val = append(val, ' ') + val = strconv.AppendInt(val, int64(hour), 10) + val = append(val, ':') + val = strconv.AppendInt(val, int64(minute), 10) + val = append(val, ':') + val = strconv.AppendInt(val, int64(second), 10) + val = append(val, '.') + val = append(val, fmt.Sprintf("%06d", microSecond)...) + } + return sqltypes.MakeTrusted(typ, val), pos, ok case 0x07: year, pos, ok := readUint16(data, pos) if !ok { @@ -777,14 +788,21 @@ func (c *Conn) parseStmtArgs(data []byte, typ querypb.Type, pos int) (sqltypes.V if !ok { return sqltypes.NULL, 0, false } - val := strconv.Itoa(int(year)) + "-" + - strconv.Itoa(int(month)) + "-" + - strconv.Itoa(int(day)) + " " + - strconv.Itoa(int(hour)) + ":" + - strconv.Itoa(int(minute)) + ":" + - strconv.Itoa(int(second)) - - return sqltypes.NewVarChar(val), pos, ok + val := strconv.AppendInt(nil, int64(year), 10) + val = append(val, '-') + val = strconv.AppendInt(val, int64(month), 10) + val = append(val, '-') + val = strconv.AppendInt(val, int64(day), 10) + if typ != sqltypes.Date { + val = append(val, ' ') + val = strconv.AppendInt(val, int64(hour), 10) + val = append(val, ':') + val = strconv.AppendInt(val, int64(minute), 10) + val = append(val, ':') + val = strconv.AppendInt(val, int64(second), 10) + } + + return sqltypes.MakeTrusted(typ, val), pos, ok case 0x04: year, pos, ok := readUint16(data, pos) if !ok { @@ -798,11 +816,16 @@ func (c *Conn) parseStmtArgs(data []byte, typ querypb.Type, pos int) (sqltypes.V if !ok { return sqltypes.NULL, 0, false } - val := strconv.Itoa(int(year)) + "-" + - strconv.Itoa(int(month)) + "-" + - strconv.Itoa(int(day)) + val := strconv.AppendInt(nil, int64(year), 10) + val = append(val, '-') + val = strconv.AppendInt(val, int64(month), 10) + val = append(val, '-') + val = strconv.AppendInt(val, int64(day), 10) + if typ != sqltypes.Date { + val = append(val, []byte(" 00:00:00")...) + } - return sqltypes.NewVarChar(val), pos, ok + return sqltypes.MakeTrusted(typ, val), pos, ok default: return sqltypes.NULL, 0, false } @@ -813,7 +836,7 @@ func (c *Conn) parseStmtArgs(data []byte, typ querypb.Type, pos int) (sqltypes.V } switch size { case 0x00: - return sqltypes.NewVarChar("00:00:00"), pos, ok + return sqltypes.NewTime("00:00:00"), pos, ok case 0x0c: isNegative, pos, ok := readByte(data, pos) if !ok { @@ -852,7 +875,7 @@ func (c *Conn) parseStmtArgs(data []byte, typ querypb.Type, pos int) (sqltypes.V strconv.Itoa(int(second)) + "." + fmt.Sprintf("%06d", microSecond) - return sqltypes.NewVarChar(val), pos, ok + return sqltypes.NewTime(val), pos, ok case 0x08: isNegative, pos, ok := readByte(data, pos) if !ok { @@ -886,14 +909,14 @@ func (c *Conn) parseStmtArgs(data []byte, typ querypb.Type, pos int) (sqltypes.V strconv.Itoa(int(minute)) + ":" + strconv.Itoa(int(second)) - return sqltypes.NewVarChar(val), pos, ok + return sqltypes.NewTime(val), pos, ok default: return sqltypes.NULL, 0, false } - case sqltypes.Decimal, sqltypes.Text, sqltypes.Blob, sqltypes.VarChar, sqltypes.VarBinary, sqltypes.Char, - sqltypes.Bit, sqltypes.Enum, sqltypes.Set, sqltypes.Geometry, sqltypes.Binary, sqltypes.TypeJSON: + case sqltypes.Decimal, sqltypes.Text, sqltypes.Blob, sqltypes.VarChar, sqltypes.VarBinary, sqltypes.Year, sqltypes.Char, + sqltypes.Bit, sqltypes.Enum, sqltypes.Set, sqltypes.Geometry, sqltypes.Binary, sqltypes.TypeJSON, sqltypes.Vector: val, pos, ok := readLenEncStringAsBytesCopy(data, pos) - return sqltypes.MakeTrusted(sqltypes.VarBinary, val), pos, ok + return sqltypes.MakeTrusted(typ, val), pos, ok default: return sqltypes.NULL, pos, false } @@ -1114,7 +1137,7 @@ func (c *Conn) writePrepare(fld []*querypb.Field, prepare *PrepareData) error { } if paramsCount > 0 { - for i := uint16(0); i < paramsCount; i++ { + for range uint16(paramsCount) { if err := c.writeColumnDefinition(&querypb.Field{ Name: "?", Type: sqltypes.VarBinary, @@ -1174,7 +1197,7 @@ func (c *Conn) writeBinaryRow(fields []*querypb.Field, row []sqltypes.Value) err pos = writeByte(data, pos, 0x00) - for i := 0; i < nullBitMapLen; i++ { + for range nullBitMapLen { pos = writeByte(data, pos, 0x00) } @@ -1268,7 +1291,7 @@ func val2MySQL(v sqltypes.Value) ([]byte, error) { return []byte{}, err } out = make([]byte, 8) - writeUint64(out, pos, uint64(val)) + writeUint64(out, pos, val) case sqltypes.Int64: val, err := strconv.ParseInt(v.ToString(), 10, 64) if err != nil { @@ -1315,7 +1338,7 @@ func val2MySQL(v sqltypes.Value) ([]byte, error) { } val := make([]byte, 6) count := copy(val, v.Raw()[20:]) - for i := 0; i < (6 - count); i++ { + for i := range 6 - count { val[count+i] = 0x30 } microSecond, err := strconv.ParseUint(string(val), 10, 32) @@ -1437,14 +1460,14 @@ func val2MySQL(v sqltypes.Value) ([]byte, error) { if err != nil { return []byte{}, err } - pos = writeUint32(out, pos, uint32(days)) + pos = writeUint32(out, pos, days) pos = writeByte(out, pos, byte(hours)) pos = writeByte(out, pos, byte(minutes)) pos = writeByte(out, pos, byte(seconds)) val := make([]byte, 6) count := copy(val, microSecond) - for i := 0; i < (6 - count); i++ { + for i := range 6 - count { val[count+i] = 0x30 } microSeconds, err := strconv.ParseUint(string(val), 10, 32) @@ -1493,7 +1516,7 @@ func val2MySQL(v sqltypes.Value) ([]byte, error) { if err != nil { return []byte{}, err } - pos = writeUint32(out, pos, uint32(days)) + pos = writeUint32(out, pos, days) pos = writeByte(out, pos, byte(hours)) pos = writeByte(out, pos, byte(minutes)) writeByte(out, pos, byte(seconds)) diff --git a/go/mysql/query_test.go b/go/mysql/query_test.go index 0e1f48c1804..6892508ac0c 100644 --- a/go/mysql/query_test.go +++ b/go/mysql/query_test.go @@ -315,10 +315,7 @@ func TestComStmtExecuteUpdStmt(t *testing.T) { assert.EqualValues(t, querypb.Type_DATETIME, prepData.ParamsType[15], "got: %s", querypb.Type(prepData.ParamsType[15])) assert.EqualValues(t, querypb.Type_TIMESTAMP, prepData.ParamsType[16], "got: %s", querypb.Type(prepData.ParamsType[16])) assert.EqualValues(t, querypb.Type_TIME, prepData.ParamsType[17], "got: %s", querypb.Type(prepData.ParamsType[17])) - - // this is year but in binary it is changed to varbinary - assert.EqualValues(t, querypb.Type_VARBINARY, prepData.ParamsType[18], "got: %s", querypb.Type(prepData.ParamsType[18])) - + assert.EqualValues(t, querypb.Type_YEAR, prepData.ParamsType[18], "got: %s", querypb.Type(prepData.ParamsType[18])) assert.EqualValues(t, querypb.Type_CHAR, prepData.ParamsType[19], "got: %s", querypb.Type(prepData.ParamsType[19])) assert.EqualValues(t, querypb.Type_CHAR, prepData.ParamsType[20], "got: %s", querypb.Type(prepData.ParamsType[20])) assert.EqualValues(t, querypb.Type_TEXT, prepData.ParamsType[21], "got: %s", querypb.Type(prepData.ParamsType[21])) @@ -463,6 +460,7 @@ func TestQueries(t *testing.T) { // Skip TUPLE, not possible in Result. {Name: "Type_GEOMETRY ", Type: querypb.Type_GEOMETRY, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_BINARY_FLAG | querypb.MySqlFlag_BLOB_FLAG)}, {Name: "Type_JSON ", Type: querypb.Type_JSON, Charset: collations.CollationUtf8mb4ID}, + {Name: "Type_VECTOR ", Type: querypb.Type_VECTOR, Charset: collations.CollationBinaryID}, }, Rows: [][]sqltypes.Value{ { @@ -495,6 +493,7 @@ func TestQueries(t *testing.T) { sqltypes.MakeTrusted(querypb.Type_SET, []byte("Type_SET")), sqltypes.MakeTrusted(querypb.Type_GEOMETRY, []byte("Type_GEOMETRY")), sqltypes.MakeTrusted(querypb.Type_JSON, []byte("Type_JSON")), + sqltypes.MakeTrusted(querypb.Type_VECTOR, []byte("Type_VECTOR")), }, { sqltypes.NULL, @@ -526,6 +525,7 @@ func TestQueries(t *testing.T) { sqltypes.NULL, sqltypes.NULL, sqltypes.NULL, + sqltypes.NULL, }, }, }) diff --git a/go/mysql/replication.go b/go/mysql/replication.go index 08baaa169c8..84c65842c7e 100644 --- a/go/mysql/replication.go +++ b/go/mysql/replication.go @@ -48,7 +48,7 @@ func (c *Conn) WriteComBinlogDump(serverID uint32, binlogFilename string, binlog pos = writeUint32(data, pos, serverID) _ = writeEOFString(data, pos, binlogFilename) if err := c.writeEphemeralPacket(); err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) } return nil } @@ -86,16 +86,16 @@ func (c *Conn) WriteComBinlogDumpGTID(serverID uint32, binlogFilename string, bi 4 + // data-size len(gtidSet) // data data, pos := c.startEphemeralPacketWithHeader(length) - pos = writeByte(data, pos, ComBinlogDumpGTID) //nolint - pos = writeUint16(data, pos, flags) //nolint - pos = writeUint32(data, pos, serverID) //nolint - pos = writeUint32(data, pos, uint32(len(binlogFilename))) //nolint - pos = writeEOFString(data, pos, binlogFilename) //nolint - pos = writeUint64(data, pos, binlogPos) //nolint - pos = writeUint32(data, pos, uint32(len(gtidSet))) //nolint - pos += copy(data[pos:], gtidSet) //nolint + pos = writeByte(data, pos, ComBinlogDumpGTID) // nolint + pos = writeUint16(data, pos, flags) // nolint + pos = writeUint32(data, pos, serverID) // nolint + pos = writeUint32(data, pos, uint32(len(binlogFilename))) // nolint + pos = writeEOFString(data, pos, binlogFilename) // nolint + pos = writeUint64(data, pos, binlogPos) // nolint + pos = writeUint32(data, pos, uint32(len(gtidSet))) // nolint + pos += copy(data[pos:], gtidSet) // nolint if err := c.writeEphemeralPacket(); err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) } return nil } @@ -113,7 +113,7 @@ func (c *Conn) SendSemiSyncAck(binlogFilename string, binlogPos uint64) error { pos = writeUint64(data, pos, binlogPos) _ = writeEOFString(data, pos, binlogFilename) if err := c.writeEphemeralPacket(); err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) } return nil @@ -135,7 +135,7 @@ func (c *Conn) WriteBinlogEvent(ev BinlogEvent, semiSyncEnabled bool) error { } _ = writeEOFString(data, pos, string(ev.Bytes())) if err := c.writeEphemeralPacket(); err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "%v", err) } return nil } diff --git a/go/mysql/replication/mysql56_gtid.go b/go/mysql/replication/mysql56_gtid.go index dd23fb2092b..dd55caf1949 100644 --- a/go/mysql/replication/mysql56_gtid.go +++ b/go/mysql/replication/mysql56_gtid.go @@ -153,11 +153,11 @@ func DecodePositionMySQL56(s string) (rp Position, gtidSet Mysql56GTIDSet, err e return rp, nil, err } if !rp.MatchesFlavor(Mysql56FlavorID) { - return rp, nil, vterrors.Wrapf(ErrExpectMysql56Flavor, s) + return rp, nil, vterrors.Wrap(ErrExpectMysql56Flavor, s) } gtidSet, ok = rp.GTIDSet.(Mysql56GTIDSet) if !ok { - return rp, nil, vterrors.Wrapf(ErrExpectMysql56Flavor, s) + return rp, nil, vterrors.Wrap(ErrExpectMysql56Flavor, s) } return rp, gtidSet, nil } diff --git a/go/mysql/replication/mysql56_gtid_set.go b/go/mysql/replication/mysql56_gtid_set.go index 1d46176b19a..77142272c6a 100644 --- a/go/mysql/replication/mysql56_gtid_set.go +++ b/go/mysql/replication/mysql56_gtid_set.go @@ -467,6 +467,39 @@ func (set Mysql56GTIDSet) SIDBlock() []byte { return buf.Bytes() } +// ErrantGTIDsOnReplica gets the errant GTIDs on the replica by comparing against the primary position and UUID. +func ErrantGTIDsOnReplica(replicaPosition Position, primaryPosition Position, primarySid SID) (string, error) { + replicaGTIDSet, replicaOk := replicaPosition.GTIDSet.(Mysql56GTIDSet) + primaryGTIDSet, primaryOk := primaryPosition.GTIDSet.(Mysql56GTIDSet) + + // Currently we only support errant GTID detection for MySQL 56 flavour. + if !replicaOk || !primaryOk { + return "", nil + } + + // Calculate the difference between the replica and primary GTID sets. + // We discount the writes from the primary server first. This is required because sometimes + // the replica might advertise itself as more advanced than the primary, and we don't want to + // incorrectly mark GTIDs errant. + // For example, it is perfectly valid to see the replica GTID set be `ff8ecd9a-8f92-11ef-b369-733dd679dde6:1-33` + // while that of the primary be `ff8ecd9a-8f92-11ef-b369-733dd679dde6:1-29` when `ff8ecd9a-8f92-11ef-b369-733dd679dde6` + // is the primary server UUID. In this case, the replica is not errant. + diffSet := replicaGTIDSet.RemoveUUID(primarySid).Difference(primaryGTIDSet) + return diffSet.String(), nil +} + +// RemoveUUID removes a specific UUID from the gtid set. +func (set Mysql56GTIDSet) RemoveUUID(uuid SID) Mysql56GTIDSet { + newSet := make(Mysql56GTIDSet) + for sid, intervals := range set { + if sid == uuid { + continue + } + newSet[sid] = intervals + } + return newSet +} + // Difference will supply the difference between the receiver and supplied Mysql56GTIDSets, and supply the result // as a Mysql56GTIDSet. func (set Mysql56GTIDSet) Difference(other Mysql56GTIDSet) Mysql56GTIDSet { @@ -619,7 +652,7 @@ func NewMysql56GTIDSetFromSIDBlock(data []byte) (Mysql56GTIDSet, error) { if err := binary.Read(buf, binary.LittleEndian, &nSIDs); err != nil { return nil, vterrors.Wrapf(err, "cannot read nSIDs") } - for i := uint64(0); i < nSIDs; i++ { + for i := range uint64(nSIDs) { var sid SID if c, err := buf.Read(sid[:]); err != nil || c != 16 { return nil, vterrors.Errorf(vtrpc.Code_INTERNAL, "cannot read SID %v: %v %v", i, err, c) @@ -688,3 +721,18 @@ func Subtract(lhs, rhs string) (string, error) { diffSet := lhsSet.Difference(rhsSet) return diffSet.String(), nil } + +// GTIDCount returns the number of GTIDs in a GTID set. +func GTIDCount(gtidStr string) (int64, error) { + gtidSet, err := ParseMysql56GTIDSet(gtidStr) + if err != nil { + return 0, err + } + var count int64 + for _, intervals := range gtidSet { + for _, intvl := range intervals { + count = count + intvl.end - intvl.start + 1 + } + } + return count, nil +} diff --git a/go/mysql/replication/mysql56_gtid_set_test.go b/go/mysql/replication/mysql56_gtid_set_test.go index 323baae3885..bc5d5a6d6ec 100644 --- a/go/mysql/replication/mysql56_gtid_set_test.go +++ b/go/mysql/replication/mysql56_gtid_set_test.go @@ -704,3 +704,153 @@ func BenchmarkMySQL56GTIDParsing(b *testing.B) { } } } + +func TestGTIDCount(t *testing.T) { + tests := []struct { + name string + gtidStr string + wantCount int64 + wantErr string + }{ + { + name: "Empty GTID String", + gtidStr: "", + wantCount: 0, + }, { + name: "Single GTID", + gtidStr: "00010203-0405-0607-0809-0a0b0c0d0e0f:12", + wantCount: 1, + }, { + name: "Single GTID Interval", + gtidStr: "00010203-0405-0607-0809-0a0b0c0d0e0f:1-5", + wantCount: 5, + }, { + name: "Single UUID", + gtidStr: "00010203-0405-0607-0809-0a0b0c0d0e0f:1-5:11-20", + wantCount: 15, + }, { + name: "Multiple UUIDs", + gtidStr: "00010203-0405-0607-0809-0a0b0c0d0e0f:1-5:10-20,00010203-0405-0607-0809-0a0b0c0d0eff:1-5:50", + wantCount: 22, + }, { + name: "Parsing error", + gtidStr: "incorrect set", + wantErr: "invalid MySQL 5.6 GTID set", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + count, err := GTIDCount(tt.gtidStr) + require.EqualValues(t, tt.wantCount, count) + if tt.wantErr != "" { + require.ErrorContains(t, err, tt.wantErr) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestErrantGTIDsOnReplica(t *testing.T) { + tests := []struct { + name string + replicaPosition string + primaryPosition string + primarySID string + errantGtidWanted string + wantErr string + }{ + { + name: "Empty replica position", + replicaPosition: "MySQL56/", + primaryPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8", + primarySID: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9", + errantGtidWanted: "", + }, { + name: "Empty primary position", + replicaPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8", + primaryPosition: "MySQL56/", + primarySID: "8bc65cca-3fe4-11ed-bbfb-091034d48b3e", + errantGtidWanted: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8", + }, { + name: "Primary seen as lagging for its own writes", + replicaPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-33", + primaryPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-29", + primarySID: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9", + }, { + name: "Empty primary position - with multiple errant gtids", + replicaPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1", + primaryPosition: "MySQL56/", + primarySID: "8bc65cca-3fe4-11ed-bbfb-091034d49c4f", + errantGtidWanted: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1", + }, { + name: "Single errant GTID", + replicaPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1,8bc65cca-3fe4-11ed-bbfb-091034d48bd3:34", + primaryPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-50,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1-30", + primarySID: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9", + errantGtidWanted: "8bc65cca-3fe4-11ed-bbfb-091034d48bd3:34", + }, { + name: "Multiple errant GTID", + replicaPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1-32,8bc65cca-3fe4-11ed-bbfb-091034d48bd3:3-35", + primaryPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-50,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1-30,8bc65cca-3fe4-11ed-bbfb-091034d48bd3:34", + primarySID: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9", + errantGtidWanted: "8bc65cca-3fe4-11ed-bbfb-091034d48b3e:31-32,8bc65cca-3fe4-11ed-bbfb-091034d48bd3:3-33:35", + }, { + name: "Multiple errant GTID after discounting primary writes", + replicaPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-10,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1-32,8bc65cca-3fe4-11ed-bbfb-091034d48bd3:3-35", + primaryPosition: "MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1-30,8bc65cca-3fe4-11ed-bbfb-091034d48bd3:34", + primarySID: "8bc65cca-3fe4-11ed-bbfb-091034d48b3e", + errantGtidWanted: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:9-10,8bc65cca-3fe4-11ed-bbfb-091034d48bd3:3-33:35", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + replPos, err := DecodePosition(tt.replicaPosition) + require.NoError(t, err) + primaryPos, err := DecodePosition(tt.primaryPosition) + require.NoError(t, err) + primarySID, err := ParseSID(tt.primarySID) + require.NoError(t, err) + errantGTIDs, err := ErrantGTIDsOnReplica(replPos, primaryPos, primarySID) + if tt.wantErr != "" { + require.ErrorContains(t, err, tt.wantErr) + } else { + require.NoError(t, err) + require.EqualValues(t, tt.errantGtidWanted, errantGTIDs) + } + + }) + } +} + +func TestMysql56GTIDSet_RemoveUUID(t *testing.T) { + tests := []struct { + name string + initialSet string + uuid string + wantSet string + }{ + { + name: "Remove unknown UUID", + initialSet: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1:4-24", + uuid: "8bc65c84-3fe4-11ed-a912-257f0fcde6c9", + wantSet: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1:4-24", + }, + { + name: "Remove a single UUID", + initialSet: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1:4-24", + uuid: "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9", + wantSet: "8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1:4-24", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gtidSet, err := ParseMysql56GTIDSet(tt.initialSet) + require.NoError(t, err) + sid, err := ParseSID(tt.uuid) + require.NoError(t, err) + gtidSet = gtidSet.RemoveUUID(sid) + require.EqualValues(t, tt.wantSet, gtidSet.String()) + }) + } +} diff --git a/go/mysql/replication/primary_status.go b/go/mysql/replication/primary_status.go index 511777a5a4a..220fce3cfde 100644 --- a/go/mysql/replication/primary_status.go +++ b/go/mysql/replication/primary_status.go @@ -30,6 +30,8 @@ type PrimaryStatus struct { Position Position // FilePosition represents the server's file based position. FilePosition Position + // ServerUUID is the UUID of the server. + ServerUUID string } // PrimaryStatusToProto translates a PrimaryStatus to proto3. @@ -37,6 +39,7 @@ func PrimaryStatusToProto(s PrimaryStatus) *replicationdatapb.PrimaryStatus { return &replicationdatapb.PrimaryStatus{ Position: EncodePosition(s.Position), FilePosition: EncodePosition(s.FilePosition), + ServerUuid: s.ServerUUID, } } diff --git a/go/mysql/replication/replication_status.go b/go/mysql/replication/replication_status.go index 9b7d674f2a9..b79ae3dc262 100644 --- a/go/mysql/replication/replication_status.go +++ b/go/mysql/replication/replication_status.go @@ -178,23 +178,23 @@ func ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus { } // FindErrantGTIDs can be used to find errant GTIDs in the receiver's relay log, by comparing it against all known replicas, -// provided as a list of ReplicationStatus's. This method only works if the flavor for all retrieved ReplicationStatus's is MySQL. +// provided as a list of Positions. This method only works if the flavor for all retrieved Positions is MySQL. // The result is returned as a Mysql56GTIDSet, each of whose elements is a found errant GTID. // This function is best effort in nature. If it marks something as errant, then it is for sure errant. But there may be cases of errant GTIDs, which aren't caught by this function. -func (s *ReplicationStatus) FindErrantGTIDs(otherReplicaStatuses []*ReplicationStatus) (Mysql56GTIDSet, error) { - if len(otherReplicaStatuses) == 0 { +func FindErrantGTIDs(position Position, sourceUUID SID, otherPositions []Position) (Mysql56GTIDSet, error) { + if len(otherPositions) == 0 { // If there is nothing to compare this replica against, then we must assume that its GTID set is the correct one. return nil, nil } - relayLogSet, ok := s.RelayLogPosition.GTIDSet.(Mysql56GTIDSet) + gtidSet, ok := position.GTIDSet.(Mysql56GTIDSet) if !ok { return nil, fmt.Errorf("errant GTIDs can only be computed on the MySQL flavor") } - otherSets := make([]Mysql56GTIDSet, 0, len(otherReplicaStatuses)) - for _, status := range otherReplicaStatuses { - otherSet, ok := status.RelayLogPosition.GTIDSet.(Mysql56GTIDSet) + otherSets := make([]Mysql56GTIDSet, 0, len(otherPositions)) + for _, pos := range otherPositions { + otherSet, ok := pos.GTIDSet.(Mysql56GTIDSet) if !ok { panic("The receiver ReplicationStatus contained a Mysql56GTIDSet in its relay log, but a replica's ReplicationStatus is of another flavor. This should never happen.") } @@ -202,9 +202,9 @@ func (s *ReplicationStatus) FindErrantGTIDs(otherReplicaStatuses []*ReplicationS } // Copy set for final diffSet so we don't mutate receiver. - diffSet := make(Mysql56GTIDSet, len(relayLogSet)) - for sid, intervals := range relayLogSet { - if sid == s.SourceUUID { + diffSet := make(Mysql56GTIDSet, len(gtidSet)) + for sid, intervals := range gtidSet { + if sid == sourceUUID { continue } diffSet[sid] = intervals diff --git a/go/mysql/replication/replication_status_test.go b/go/mysql/replication/replication_status_test.go index 25ff48dcd9c..8b458f76803 100644 --- a/go/mysql/replication/replication_status_test.go +++ b/go/mysql/replication/replication_status_test.go @@ -86,14 +86,14 @@ func TestFindErrantGTIDs(t *testing.T) { } testcases := []struct { - mainRepStatus *ReplicationStatus - otherRepStatuses []*ReplicationStatus - want Mysql56GTIDSet + mainRepStatus *ReplicationStatus + otherPositions []Position + want Mysql56GTIDSet }{{ mainRepStatus: &ReplicationStatus{SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set1}}, - otherRepStatuses: []*ReplicationStatus{ - {SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set2}}, - {SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set3}}, + otherPositions: []Position{ + {GTIDSet: set2}, + {GTIDSet: set3}, }, want: Mysql56GTIDSet{ sid1: []interval{{39, 39}, {40, 49}, {71, 75}}, @@ -101,15 +101,27 @@ func TestFindErrantGTIDs(t *testing.T) { sid4: []interval{{1, 30}}, }, }, { - mainRepStatus: &ReplicationStatus{SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set1}}, - otherRepStatuses: []*ReplicationStatus{{SourceUUID: sid1, RelayLogPosition: Position{GTIDSet: set1}}}, + mainRepStatus: &ReplicationStatus{SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set1}}, + otherPositions: []Position{{GTIDSet: set1}}, // servers with the same GTID sets should not be diagnosed with errant GTIDs want: nil, + }, { + mainRepStatus: &ReplicationStatus{SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set2}}, + otherPositions: []Position{{GTIDSet: set3}}, + // set2 is a strict subset of set3 + want: nil, + }, { + mainRepStatus: &ReplicationStatus{SourceUUID: sourceSID, RelayLogPosition: Position{GTIDSet: set3}}, + otherPositions: []Position{{GTIDSet: set2}}, + // set3 is a strict superset of set2 + want: Mysql56GTIDSet{ + sid1: []interval{{38, 38}, {61, 70}}, + }, }} for _, testcase := range testcases { t.Run("", func(t *testing.T) { - got, err := testcase.mainRepStatus.FindErrantGTIDs(testcase.otherRepStatuses) + got, err := FindErrantGTIDs(testcase.mainRepStatus.RelayLogPosition, testcase.mainRepStatus.SourceUUID, testcase.otherPositions) require.NoError(t, err) require.Equal(t, testcase.want, got) }) diff --git a/go/mysql/replication_test.go b/go/mysql/replication_test.go index c397bc71b45..c9a54485497 100644 --- a/go/mysql/replication_test.go +++ b/go/mysql/replication_test.go @@ -23,10 +23,13 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/test/utils" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" ) func TestComBinlogDump(t *testing.T) { + _ = utils.LeakCheckContext(t) listener, sConn, cConn := createSocketPair(t) defer func() { listener.Close() @@ -72,6 +75,7 @@ func TestComBinlogDump(t *testing.T) { } func TestComBinlogDumpGTID(t *testing.T) { + _ = utils.LeakCheckContext(t) listener, sConn, cConn := createSocketPair(t) defer func() { listener.Close() @@ -161,6 +165,7 @@ func TestComBinlogDumpGTID(t *testing.T) { } func TestSendSemiSyncAck(t *testing.T) { + _ = utils.LeakCheckContext(t) listener, sConn, cConn := createSocketPair(t) defer func() { listener.Close() diff --git a/go/mysql/server_test.go b/go/mysql/server_test.go index 082a176e3af..975bc964633 100644 --- a/go/mysql/server_test.go +++ b/go/mysql/server_test.go @@ -267,6 +267,7 @@ func getHostPort(t *testing.T, a net.Addr) (string, int) { } func TestConnectionFromListener(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -282,9 +283,6 @@ func TestConnectionFromListener(t *testing.T) { l, err := NewFromListener(listener, authServer, th, 0, 0, false, 0, 0) require.NoError(t, err, "NewListener failed") - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) fmt.Printf("host: %s, port: %d\n", host, port) // Setup the right parameters. @@ -294,13 +292,16 @@ func TestConnectionFromListener(t *testing.T) { Uname: "user1", Pass: "password1", } + go l.Accept() + defer cleanupListener(ctx, l, params) - c, err := Connect(context.Background(), params) + c, err := Connect(ctx, params) require.NoError(t, err, "Should be able to connect to server") c.Close() } func TestConnectionWithoutSourceHost(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -309,13 +310,10 @@ func TestConnectionWithoutSourceHost(t *testing.T) { UserData: "userData1", }} defer authServer.close() + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err, "NewListener failed") - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -323,13 +321,16 @@ func TestConnectionWithoutSourceHost(t *testing.T) { Uname: "user1", Pass: "password1", } + go l.Accept() + defer cleanupListener(ctx, l, params) - c, err := Connect(context.Background(), params) + c, err := Connect(ctx, params) require.NoError(t, err, "Should be able to connect to server") c.Close() } func TestConnectionWithSourceHost(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -344,11 +345,7 @@ func TestConnectionWithSourceHost(t *testing.T) { l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err, "NewListener failed") - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -356,13 +353,16 @@ func TestConnectionWithSourceHost(t *testing.T) { Uname: "user1", Pass: "password1", } + go l.Accept() + defer cleanupListener(ctx, l, params) - _, err = Connect(context.Background(), params) + _, err = Connect(ctx, params) // target is localhost, should not work from tcp connection require.EqualError(t, err, "Access denied for user 'user1' (errno 1045) (sqlstate 28000)", "Should not be able to connect to server") } func TestConnectionUseMysqlNativePasswordWithSourceHost(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -377,11 +377,7 @@ func TestConnectionUseMysqlNativePasswordWithSourceHost(t *testing.T) { l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err, "NewListener failed") - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -389,13 +385,16 @@ func TestConnectionUseMysqlNativePasswordWithSourceHost(t *testing.T) { Uname: "user1", Pass: "mysql_password", } + go l.Accept() + defer cleanupListener(ctx, l, params) - _, err = Connect(context.Background(), params) + _, err = Connect(ctx, params) // target is localhost, should not work from tcp connection require.EqualError(t, err, "Access denied for user 'user1' (errno 1045) (sqlstate 28000)", "Should not be able to connect to server") } func TestConnectionUnixSocket(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -415,22 +414,22 @@ func TestConnectionUnixSocket(t *testing.T) { l, err := NewListener("unix", unixSocket.Name(), authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err, "NewListener failed") - defer l.Close() - go l.Accept() - // Setup the right parameters. params := &ConnParams{ UnixSocket: unixSocket.Name(), Uname: "user1", Pass: "password1", } + go l.Accept() + defer cleanupListener(ctx, l, params) - c, err := Connect(context.Background(), params) + c, err := Connect(ctx, params) require.NoError(t, err, "Should be able to connect to server") c.Close() } func TestClientFoundRows(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -439,13 +438,10 @@ func TestClientFoundRows(t *testing.T) { UserData: "userData1", }} defer authServer.close() + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err, "NewListener failed") - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -453,9 +449,11 @@ func TestClientFoundRows(t *testing.T) { Uname: "user1", Pass: "password1", } + go l.Accept() + defer cleanupListener(ctx, l, params) // Test without flag. - c, err := Connect(context.Background(), params) + c, err := Connect(ctx, params) require.NoError(t, err, "Connect failed") foundRows := th.LastConn().Capabilities & CapabilityClientFoundRows assert.Equal(t, uint32(0), foundRows, "FoundRows flag: %x, second bit must be 0", th.LastConn().Capabilities) @@ -464,7 +462,7 @@ func TestClientFoundRows(t *testing.T) { // Test with flag. params.Flags |= CapabilityClientFoundRows - c, err = Connect(context.Background(), params) + c, err = Connect(ctx, params) require.NoError(t, err, "Connect failed") foundRows = th.LastConn().Capabilities & CapabilityClientFoundRows assert.NotZero(t, foundRows, "FoundRows flag: %x, second bit must be set", th.LastConn().Capabilities) @@ -472,6 +470,7 @@ func TestClientFoundRows(t *testing.T) { } func TestConnCounts(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} user := "anotherNotYetConnectedUser1" @@ -483,13 +482,10 @@ func TestConnCounts(t *testing.T) { UserData: "userData1", }} defer authServer.close() + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err, "NewListener failed") - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Test with one new connection. params := &ConnParams{ Host: host, @@ -497,14 +493,16 @@ func TestConnCounts(t *testing.T) { Uname: user, Pass: passwd, } + go l.Accept() + defer cleanupListener(ctx, l, params) - c, err := Connect(context.Background(), params) + c, err := Connect(ctx, params) require.NoError(t, err, "Connect failed") checkCountsForUser(t, user, 1) // Test with a second new connection. - c2, err := Connect(context.Background(), params) + c2, err := Connect(ctx, params) require.NoError(t, err) checkCountsForUser(t, user, 2) @@ -529,6 +527,7 @@ func checkCountsForUser(t assert.TestingT, user string, expected int64) { } func TestServer(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -537,14 +536,10 @@ func TestServer(t *testing.T) { UserData: "userData1", }} defer authServer.close() + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err) - l.SlowConnectWarnThreshold.Store(time.Nanosecond.Nanoseconds()) - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -552,6 +547,9 @@ func TestServer(t *testing.T) { Uname: "user1", Pass: "password1", } + l.SlowConnectWarnThreshold.Store(time.Nanosecond.Nanoseconds()) + go l.Accept() + defer cleanupListener(ctx, l, params) // Run a 'select rows' command with results. output, err := runMysqlWithErr(t, params, "select rows") @@ -629,6 +627,7 @@ func TestServer(t *testing.T) { } func TestServerStats(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -637,14 +636,10 @@ func TestServerStats(t *testing.T) { UserData: "userData1", }} defer authServer.close() + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err) - l.SlowConnectWarnThreshold.Store(time.Nanosecond.Nanoseconds()) - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -652,10 +647,13 @@ func TestServerStats(t *testing.T) { Uname: "user1", Pass: "password1", } + l.SlowConnectWarnThreshold.Store(time.Nanosecond.Nanoseconds()) + go l.Accept() + defer cleanupListener(ctx, l, params) timings.Reset() - connAccept.Reset() connCount.Reset() + connAccept.Reset() connSlow.Reset() connRefuse.Reset() @@ -667,9 +665,23 @@ func TestServerStats(t *testing.T) { assert.Contains(t, output, "ERROR 1047 (08S01)") assert.Contains(t, output, "forced query error", "Unexpected output for 'error': %v", output) - assert.EqualValues(t, 0, connCount.Get(), "connCount") + // Accept starts a goroutine to handle each incoming connection. + // It's in that goroutine where live stats/gauges such as the + // current connection counts are updated when the handle function + // ends (e.g. connCount.Add(-1)). + // So we wait for the expected value to avoid races and flakiness. + // 1 second should be enough, but no reason to fail the test or + // a CI workflow if the test is CPU starved. + conditionWait := 10 * time.Second + conditionTick := 10 * time.Millisecond + assert.Eventually(t, func() bool { + return connCount.Get() == int64(0) + }, conditionWait, conditionTick, "connCount") + assert.Eventually(t, func() bool { + return connSlow.Get() == int64(1) + }, conditionWait, conditionTick, "connSlow") + assert.EqualValues(t, 1, connAccept.Get(), "connAccept") - assert.EqualValues(t, 1, connSlow.Get(), "connSlow") assert.EqualValues(t, 0, connRefuse.Get(), "connRefuse") expectedTimingDeltas := map[string]int64{ @@ -703,6 +715,7 @@ func TestServerStats(t *testing.T) { // TestClearTextServer creates a Server that needs clear text // passwords from the client. func TestClearTextServer(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStaticWithAuthMethodDescription("", "", 0, MysqlClearPassword) @@ -711,16 +724,10 @@ func TestClearTextServer(t *testing.T) { UserData: "userData1", }} defer authServer.close() + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err) - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - - version, _ := runMysql(t, nil, "--version") - isMariaDB := strings.Contains(version, "MariaDB") - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -728,6 +735,11 @@ func TestClearTextServer(t *testing.T) { Uname: "user1", Pass: "password1", } + go l.Accept() + defer cleanupListener(ctx, l, params) + + version, _ := runMysql(t, nil, "--version") + isMariaDB := strings.Contains(version, "MariaDB") // Run a 'select rows' command with results. This should fail // as clear text is not enabled by default on the client @@ -776,6 +788,7 @@ func TestClearTextServer(t *testing.T) { // TestDialogServer creates a Server that uses the dialog plugin on the client. func TestDialogServer(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStaticWithAuthMethodDescription("", "", 0, MysqlDialog) @@ -784,14 +797,11 @@ func TestDialogServer(t *testing.T) { UserData: "userData1", }} defer authServer.close() + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err) l.AllowClearTextWithoutTLS.Store(true) - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -800,6 +810,9 @@ func TestDialogServer(t *testing.T) { Pass: "password1", SslMode: vttls.Disabled, } + go l.Accept() + defer cleanupListener(ctx, l, params) + sql := "select rows" output, ok := runMysql(t, params, sql) if strings.Contains(output, "No such file or directory") || strings.Contains(output, "Authentication plugin 'dialog' cannot be loaded") { @@ -815,6 +828,7 @@ func TestDialogServer(t *testing.T) { // TestTLSServer creates a Server with TLS support, then uses mysql // client to connect to it. func TestTLSServer(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -823,46 +837,20 @@ func TestTLSServer(t *testing.T) { }} defer authServer.close() + // Create the certs. + root := t.TempDir() + tlstest.CreateCA(root) + tlstest.CreateSignedCert(root, tlstest.CA, "01", "server", "server.example.com") + tlstest.CreateSignedCert(root, tlstest.CA, "02", "client", "Client Cert") + // Create the listener, so we can get its host. // Below, we are enabling --ssl-verify-server-cert, which adds // a check that the common name of the certificate matches the // server host name we connect to. l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err) - defer l.Close() - host := l.Addr().(*net.TCPAddr).IP.String() port := l.Addr().(*net.TCPAddr).Port - - // Create the certs. - root := t.TempDir() - tlstest.CreateCA(root) - tlstest.CreateSignedCert(root, tlstest.CA, "01", "server", "server.example.com") - tlstest.CreateSignedCert(root, tlstest.CA, "02", "client", "Client Cert") - - // Create the server with TLS config. - serverConfig, err := vttls.ServerConfig( - path.Join(root, "server-cert.pem"), - path.Join(root, "server-key.pem"), - path.Join(root, "ca-cert.pem"), - "", - "", - tls.VersionTLS12) - require.NoError(t, err) - l.TLSConfig.Store(serverConfig) - - var wg sync.WaitGroup - wg.Add(1) - go func(l *Listener) { - wg.Done() - l.Accept() - }(l) - // This is ensure the listener is called - wg.Wait() - // Sleep so that the Accept function is called as well.' - time.Sleep(3 * time.Second) - - connCountByTLSVer.ResetAll() // Setup the right parameters. params := &ConnParams{ Host: host, @@ -876,9 +864,23 @@ func TestTLSServer(t *testing.T) { SslKey: path.Join(root, "client-key.pem"), ServerName: "server.example.com", } + // Create the server with TLS config. + serverConfig, err := vttls.ServerConfig( + path.Join(root, "server-cert.pem"), + path.Join(root, "server-key.pem"), + path.Join(root, "ca-cert.pem"), + "", + "", + tls.VersionTLS12) + require.NoError(t, err) + l.TLSConfig.Store(serverConfig) + go l.Accept() + defer cleanupListener(ctx, l, params) + + connCountByTLSVer.ResetAll() // Run a 'select rows' command with results. - conn, err := Connect(context.Background(), params) + conn, err := Connect(ctx, params) // output, ok := runMysql(t, params, "select rows") require.NoError(t, err) results, err := conn.ExecuteFetch("select rows", 1000, true) @@ -913,25 +915,9 @@ func TestTLSServer(t *testing.T) { // TestTLSRequired creates a Server with TLS required, then tests that an insecure mysql // client is rejected func TestTLSRequired(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} - authServer := NewAuthServerStatic("", "", 0) - authServer.entries["user1"] = []*AuthServerStaticEntry{{ - Password: "password1", - }} - defer authServer.close() - - // Create the listener, so we can get its host. - // Below, we are enabling --ssl-verify-server-cert, which adds - // a check that the common name of the certificate matches the - // server host name we connect to. - l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) - require.NoError(t, err) - defer l.Close() - - host := l.Addr().(*net.TCPAddr).IP.String() - port := l.Addr().(*net.TCPAddr).Port - // Create the certs. root := t.TempDir() tlstest.CreateCA(root) @@ -940,6 +926,13 @@ func TestTLSRequired(t *testing.T) { tlstest.CreateSignedCert(root, tlstest.CA, "03", "revoked-client", "Revoked Client Cert") tlstest.RevokeCertAndRegenerateCRL(root, tlstest.CA, "revoked-client") + params := &ConnParams{ + Uname: "user1", + Pass: "password1", + SslMode: vttls.Disabled, // TLS is disabled at first + ServerName: "server.example.com", + } + // Create the server with TLS config. serverConfig, err := vttls.ServerConfig( path.Join(root, "server-cert.pem"), @@ -949,34 +942,49 @@ func TestTLSRequired(t *testing.T) { "", tls.VersionTLS12) require.NoError(t, err) - l.TLSConfig.Store(serverConfig) - l.RequireSecureTransport = true - - var wg sync.WaitGroup - wg.Add(1) - go func(l *Listener) { - wg.Done() - l.Accept() - }(l) - // This is ensure the listener is called - wg.Wait() - // Sleep so that the Accept function is called as well.' - time.Sleep(3 * time.Second) - - // Setup conn params without SSL. - params := &ConnParams{ - Host: host, - Port: port, - Uname: "user1", - Pass: "password1", - SslMode: vttls.Disabled, - ServerName: "server.example.com", + + authServer := NewAuthServerStatic("", "", 0) + authServer.entries["user1"] = []*AuthServerStaticEntry{{ + Password: "password1", + }} + defer authServer.close() + + var l *Listener + setupServer := func() { + // Create the listener, so we can get its host. + // Below, we are enabling --ssl-verify-server-cert, which adds + // a check that the common name of the certificate matches the + // server host name we connect to. + l, err = NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) + require.NoError(t, err) + host := l.Addr().(*net.TCPAddr).IP.String() + port := l.Addr().(*net.TCPAddr).Port + l.TLSConfig.Store(serverConfig) + l.RequireSecureTransport = true + go l.Accept() + params.Host = host + params.Port = port + } + setupServer() + + defer cleanupListener(ctx, l, params) + + // This test calls Connect multiple times so we add handling for when the + // listener goes away for any reason. + connectWithGoneServerHandling := func() (*Conn, error) { + conn, err := Connect(ctx, params) + if sqlErr, ok := sqlerror.NewSQLErrorFromError(err).(*sqlerror.SQLError); ok && sqlErr.Num == sqlerror.CRConnHostError { + cleanupListener(ctx, l, params) + setupServer() + conn, err = Connect(ctx, params) + } + return conn, err } - conn, err := Connect(context.Background(), params) - require.NotNil(t, err) - require.Contains(t, err.Error(), "Code: UNAVAILABLE") - require.Contains(t, err.Error(), "server does not allow insecure connections, client must use SSL/TLS") - require.Contains(t, err.Error(), "(errno 1105) (sqlstate HY000)") + + conn, err := connectWithGoneServerHandling() + require.ErrorContains(t, err, "Code: UNAVAILABLE") + require.ErrorContains(t, err, "server does not allow insecure connections, client must use SSL/TLS") + require.ErrorContains(t, err, "(errno 1105) (sqlstate HY000)") if conn != nil { conn.Close() } @@ -987,7 +995,7 @@ func TestTLSRequired(t *testing.T) { params.SslCert = path.Join(root, "client-cert.pem") params.SslKey = path.Join(root, "client-key.pem") - conn, err = Connect(context.Background(), params) + conn, err = connectWithGoneServerHandling() require.NoError(t, err) if conn != nil { conn.Close() @@ -996,15 +1004,15 @@ func TestTLSRequired(t *testing.T) { // setup conn params with TLS, but with a revoked client certificate params.SslCert = path.Join(root, "revoked-client-cert.pem") params.SslKey = path.Join(root, "revoked-client-key.pem") - conn, err = Connect(context.Background(), params) - require.NotNil(t, err) - require.Contains(t, err.Error(), "remote error: tls: bad certificate") + conn, err = connectWithGoneServerHandling() + require.ErrorContains(t, err, "remote error: tls: bad certificate") if conn != nil { conn.Close() } } func TestCachingSha2PasswordAuthWithTLS(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStaticWithAuthMethodDescription("", "", 0, CachingSha2Password) @@ -1013,19 +1021,17 @@ func TestCachingSha2PasswordAuthWithTLS(t *testing.T) { } defer authServer.close() - // Create the listener, so we can get its host. - l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) - require.NoError(t, err, "NewListener failed: %v", err) - defer l.Close() - host := l.Addr().(*net.TCPAddr).IP.String() - port := l.Addr().(*net.TCPAddr).Port - // Create the certs. root := t.TempDir() tlstest.CreateCA(root) tlstest.CreateSignedCert(root, tlstest.CA, "01", "server", "server.example.com") tlstest.CreateSignedCert(root, tlstest.CA, "02", "client", "Client Cert") + // Create the listener, so we can get its host. + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) + require.NoError(t, err, "NewListener failed: %v", err) + host := l.Addr().(*net.TCPAddr).IP.String() + port := l.Addr().(*net.TCPAddr).Port // Create the server with TLS config. serverConfig, err := vttls.ServerConfig( path.Join(root, "server-cert.pem"), @@ -1035,12 +1041,6 @@ func TestCachingSha2PasswordAuthWithTLS(t *testing.T) { "", tls.VersionTLS12) require.NoError(t, err, "TLSServerConfig failed: %v", err) - - l.TLSConfig.Store(serverConfig) - go func() { - l.Accept() - }() - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -1054,10 +1054,11 @@ func TestCachingSha2PasswordAuthWithTLS(t *testing.T) { SslKey: path.Join(root, "client-key.pem"), ServerName: "server.example.com", } + l.TLSConfig.Store(serverConfig) + go l.Accept() + defer cleanupListener(ctx, l, params) // Connection should fail, as server requires SSL for caching_sha2_password. - ctx := context.Background() - conn, err := Connect(ctx, params) require.NoError(t, err, "unexpected connection error: %v", err) @@ -1093,12 +1094,11 @@ func newAuthServerAlwaysFallback(file, jsonConfig string, reloadInterval time.Du authMethod := NewSha2CachingAuthMethod(&alwaysFallbackAuth{}, a, a) a.methods = []AuthMethod{authMethod} - a.reload() - a.installSignalHandlers() return a } func TestCachingSha2PasswordAuthWithMoreData(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := newAuthServerAlwaysFallback("", "", 0) @@ -1107,19 +1107,17 @@ func TestCachingSha2PasswordAuthWithMoreData(t *testing.T) { } defer authServer.close() - // Create the listener, so we can get its host. - l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) - require.NoError(t, err, "NewListener failed: %v", err) - defer l.Close() - host := l.Addr().(*net.TCPAddr).IP.String() - port := l.Addr().(*net.TCPAddr).Port - // Create the certs. root := t.TempDir() tlstest.CreateCA(root) tlstest.CreateSignedCert(root, tlstest.CA, "01", "server", "server.example.com") tlstest.CreateSignedCert(root, tlstest.CA, "02", "client", "Client Cert") + // Create the listener, so we can get its host. + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) + require.NoError(t, err, "NewListener failed: %v", err) + host := l.Addr().(*net.TCPAddr).IP.String() + port := l.Addr().(*net.TCPAddr).Port // Create the server with TLS config. serverConfig, err := vttls.ServerConfig( path.Join(root, "server-cert.pem"), @@ -1129,12 +1127,6 @@ func TestCachingSha2PasswordAuthWithMoreData(t *testing.T) { "", tls.VersionTLS12) require.NoError(t, err, "TLSServerConfig failed: %v", err) - - l.TLSConfig.Store(serverConfig) - go func() { - l.Accept() - }() - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -1148,10 +1140,11 @@ func TestCachingSha2PasswordAuthWithMoreData(t *testing.T) { SslKey: path.Join(root, "client-key.pem"), ServerName: "server.example.com", } + l.TLSConfig.Store(serverConfig) + go l.Accept() + defer cleanupListener(ctx, l, params) // Connection should fail, as server requires SSL for caching_sha2_password. - ctx := context.Background() - conn, err := Connect(ctx, params) require.NoError(t, err, "unexpected connection error: %v", err) @@ -1168,6 +1161,7 @@ func TestCachingSha2PasswordAuthWithMoreData(t *testing.T) { } func TestCachingSha2PasswordAuthWithoutTLS(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStaticWithAuthMethodDescription("", "", 0, CachingSha2Password) @@ -1179,13 +1173,8 @@ func TestCachingSha2PasswordAuthWithoutTLS(t *testing.T) { // Create the listener. l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err, "NewListener failed: %v", err) - defer l.Close() host := l.Addr().(*net.TCPAddr).IP.String() port := l.Addr().(*net.TCPAddr).Port - go func() { - l.Accept() - }() - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -1194,9 +1183,10 @@ func TestCachingSha2PasswordAuthWithoutTLS(t *testing.T) { Pass: "password1", SslMode: vttls.Disabled, } + go l.Accept() + defer cleanupListener(ctx, l, params) // Connection should fail, as server requires SSL for caching_sha2_password. - ctx := context.Background() _, err = Connect(ctx, params) if err == nil || !strings.Contains(err.Error(), "No authentication methods available for authentication") { t.Fatalf("unexpected connection error: %v", err) @@ -1211,6 +1201,7 @@ func checkCountForTLSVer(t *testing.T, version string, expected int64) { } func TestErrorCodes(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) @@ -1219,13 +1210,10 @@ func TestErrorCodes(t *testing.T) { UserData: "userData1", }} defer authServer.close() + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err) - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -1233,8 +1221,9 @@ func TestErrorCodes(t *testing.T) { Uname: "user1", Pass: "password1", } + go l.Accept() + defer cleanupListener(ctx, l, params) - ctx := context.Background() client, err := Connect(ctx, params) require.NoError(t, err) @@ -1390,6 +1379,7 @@ func binaryPath(root, binary string) (string, error) { } func TestListenerShutdown(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} authServer := NewAuthServerStatic("", "", 0) authServer.entries["user1"] = []*AuthServerStaticEntry{{ @@ -1397,13 +1387,10 @@ func TestListenerShutdown(t *testing.T) { UserData: "userData1", }} defer authServer.close() + l, err := NewListener("tcp", "127.0.0.1:", authServer, th, 0, 0, false, false, 0, 0) require.NoError(t, err) - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) - // Setup the right parameters. params := &ConnParams{ Host: host, @@ -1411,9 +1398,12 @@ func TestListenerShutdown(t *testing.T) { Uname: "user1", Pass: "password1", } + go l.Accept() + defer cleanupListener(ctx, l, params) + connRefuse.Reset() - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(ctx) defer cancel() conn, err := Connect(ctx, params) @@ -1424,7 +1414,7 @@ func TestListenerShutdown(t *testing.T) { l.Shutdown() - assert.EqualValues(t, 1, connRefuse.Get(), "connRefuse") + waitForConnRefuse(t, ctx, 1) err = conn.Ping() require.EqualError(t, err, "Server shutdown in progress (errno 1053) (sqlstate 08S01)") @@ -1436,6 +1426,24 @@ func TestListenerShutdown(t *testing.T) { require.Equal(t, "Server shutdown in progress", sqlErr.Message) } +func waitForConnRefuse(t *testing.T, ctx context.Context, valWanted int64) { + ctx, cancel := context.WithTimeout(ctx, 10*time.Second) + defer cancel() + tick := time.NewTicker(100 * time.Millisecond) + defer tick.Stop() + + for { + select { + case <-ctx.Done(): + require.FailNow(t, "connRefuse did not reach %v", valWanted) + case <-tick.C: + if connRefuse.Get() == valWanted { + return + } + } + } +} + func TestParseConnAttrs(t *testing.T) { expected := map[string]string{ "_client_version": "8.0.11", @@ -1465,21 +1473,21 @@ func TestParseConnAttrs(t *testing.T) { } func TestServerFlush(t *testing.T) { + ctx := utils.LeakCheckContext(t) mysqlServerFlushDelay := 10 * time.Millisecond th := &testHandler{} l, err := NewListener("tcp", "127.0.0.1:", NewAuthServerNone(), th, 0, 0, false, false, 0, mysqlServerFlushDelay) require.NoError(t, err) - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) params := &ConnParams{ Host: host, Port: port, } + go l.Accept() + defer cleanupListener(ctx, l, params) - c, err := Connect(context.Background(), params) + c, err := Connect(ctx, params) require.NoError(t, err) defer c.Close() @@ -1513,20 +1521,21 @@ func TestServerFlush(t *testing.T) { } func TestTcpKeepAlive(t *testing.T) { + ctx := utils.LeakCheckContext(t) th := &testHandler{} + l, err := NewListener("tcp", "127.0.0.1:", NewAuthServerNone(), th, 0, 0, false, false, 0, 0) require.NoError(t, err) - defer l.Close() - go l.Accept() - host, port := getHostPort(t, l.Addr()) params := &ConnParams{ Host: host, Port: port, } + go l.Accept() + defer cleanupListener(ctx, l, params) // on connect, the tcp method should be called. - c, err := Connect(context.Background(), params) + c, err := Connect(ctx, params) require.NoError(t, err) defer c.Close() require.True(t, th.lastConn.keepAliveOn, "tcp property method not called") diff --git a/go/mysql/sqlerror/constants.go b/go/mysql/sqlerror/constants.go index a247ca15aa4..da2351bf00d 100644 --- a/go/mysql/sqlerror/constants.go +++ b/go/mysql/sqlerror/constants.go @@ -34,8 +34,9 @@ func (e ErrorCode) ToString() string { // See above reference for more information on each code. const ( // Vitess specific errors, (100-999) - ERNotReplica = ErrorCode(100) - ERNonAtomicCommit = ErrorCode(301) + ERNotReplica = ErrorCode(100) + ERNonAtomicCommit = ErrorCode(301) + ERInAtomicRecovery = ErrorCode(302) // unknown ERUnknownError = ErrorCode(1105) @@ -122,9 +123,12 @@ const ( ErSPNotVarArg = ErrorCode(1414) ERRowIsReferenced2 = ErrorCode(1451) ErNoReferencedRow2 = ErrorCode(1452) + ERInnodbIndexCorrupt = ErrorCode(1817) ERDupIndex = ErrorCode(1831) ERInnodbReadOnly = ErrorCode(1874) + ERVectorConversion = ErrorCode(6138) + // already exists ERDbCreateExists = ErrorCode(1007) ERTableExists = ErrorCode(1050) @@ -243,6 +247,7 @@ const ( ERNoSuchUser = ErrorCode(1449) ERForbidSchemaChange = ErrorCode(1450) ERWrongValue = ErrorCode(1525) + ERWrongParamcountToNativeFct = ErrorCode(1582) ERDataOutOfRange = ErrorCode(1690) ERInvalidJSONText = ErrorCode(3140) ERInvalidJSONTextInParams = ErrorCode(3141) @@ -252,27 +257,32 @@ const ( ERJSONValueTooBig = ErrorCode(3150) ERJSONDocumentTooDeep = ErrorCode(3157) - ERLockNowait = ErrorCode(3572) - ERRegexpStringNotTerminated = ErrorCode(3684) - ERRegexpBufferOverflow = ErrorCode(3684) - ERRegexpIllegalArgument = ErrorCode(3685) - ERRegexpIndexOutOfBounds = ErrorCode(3686) - ERRegexpInternal = ErrorCode(3687) - ERRegexpRuleSyntax = ErrorCode(3688) - ERRegexpBadEscapeSequence = ErrorCode(3689) - ERRegexpUnimplemented = ErrorCode(3690) - ERRegexpMismatchParen = ErrorCode(3691) - ERRegexpBadInterval = ErrorCode(3692) - ERRRegexpMaxLtMin = ErrorCode(3693) - ERRegexpInvalidBackRef = ErrorCode(3694) - ERRegexpLookBehindLimit = ErrorCode(3695) - ERRegexpMissingCloseBracket = ErrorCode(3696) - ERRegexpInvalidRange = ErrorCode(3697) - ERRegexpStackOverflow = ErrorCode(3698) - ERRegexpTimeOut = ErrorCode(3699) - ERRegexpPatternTooBig = ErrorCode(3700) - ERRegexpInvalidCaptureGroup = ErrorCode(3887) - ERRegexpInvalidFlag = ErrorCode(3900) + ERLockNowait = ErrorCode(3572) + ERCTERecursiveRequiresUnion = ErrorCode(3573) + ERCTERecursiveForbidsAggregation = ErrorCode(3575) + ERCTERecursiveForbiddenJoinOrder = ErrorCode(3576) + ERCTERecursiveRequiresSingleReference = ErrorCode(3577) + ERCTEMaxRecursionDepth = ErrorCode(3636) + ERRegexpStringNotTerminated = ErrorCode(3684) + ERRegexpBufferOverflow = ErrorCode(3684) + ERRegexpIllegalArgument = ErrorCode(3685) + ERRegexpIndexOutOfBounds = ErrorCode(3686) + ERRegexpInternal = ErrorCode(3687) + ERRegexpRuleSyntax = ErrorCode(3688) + ERRegexpBadEscapeSequence = ErrorCode(3689) + ERRegexpUnimplemented = ErrorCode(3690) + ERRegexpMismatchParen = ErrorCode(3691) + ERRegexpBadInterval = ErrorCode(3692) + ERRRegexpMaxLtMin = ErrorCode(3693) + ERRegexpInvalidBackRef = ErrorCode(3694) + ERRegexpLookBehindLimit = ErrorCode(3695) + ERRegexpMissingCloseBracket = ErrorCode(3696) + ERRegexpInvalidRange = ErrorCode(3697) + ERRegexpStackOverflow = ErrorCode(3698) + ERRegexpTimeOut = ErrorCode(3699) + ERRegexpPatternTooBig = ErrorCode(3700) + ERRegexpInvalidCaptureGroup = ErrorCode(3887) + ERRegexpInvalidFlag = ErrorCode(3900) ERCharacterSetMismatch = ErrorCode(3995) diff --git a/go/mysql/sqlerror/sql_error.go b/go/mysql/sqlerror/sql_error.go index 935fd77a12f..f2a5fb46388 100644 --- a/go/mysql/sqlerror/sql_error.go +++ b/go/mysql/sqlerror/sql_error.go @@ -38,14 +38,18 @@ type SQLError struct { // NewSQLError creates a new SQLError. // If sqlState is left empty, it will default to "HY000" (general error). // TODO: Should be aligned with vterrors, stack traces and wrapping -func NewSQLError(number ErrorCode, sqlState string, format string, args ...any) *SQLError { +func NewSQLErrorf(number ErrorCode, sqlState string, format string, args ...any) *SQLError { + return NewSQLError(number, sqlState, fmt.Sprintf(format, args...)) +} + +func NewSQLError(number ErrorCode, sqlState string, msg string) *SQLError { if sqlState == "" { sqlState = SSUnknownSQLState } return &SQLError{ Num: number, State: sqlState, - Message: fmt.Sprintf(format, args...), + Message: msg, } } @@ -172,79 +176,85 @@ type mysqlCode struct { } var stateToMysqlCode = map[vterrors.State]mysqlCode{ - vterrors.Undefined: {num: ERUnknownError, state: SSUnknownSQLState}, - vterrors.AccessDeniedError: {num: ERAccessDeniedError, state: SSAccessDeniedError}, - vterrors.BadDb: {num: ERBadDb, state: SSClientError}, - vterrors.BadFieldError: {num: ERBadFieldError, state: SSBadFieldError}, - vterrors.BadTableError: {num: ERBadTable, state: SSUnknownTable}, - vterrors.CantUseOptionHere: {num: ERCantUseOptionHere, state: SSClientError}, - vterrors.DataOutOfRange: {num: ERDataOutOfRange, state: SSDataOutOfRange}, - vterrors.DbCreateExists: {num: ERDbCreateExists, state: SSUnknownSQLState}, - vterrors.DbDropExists: {num: ERDbDropExists, state: SSUnknownSQLState}, - vterrors.DupFieldName: {num: ERDupFieldName, state: SSDupFieldName}, - vterrors.EmptyQuery: {num: EREmptyQuery, state: SSClientError}, - vterrors.IncorrectGlobalLocalVar: {num: ERIncorrectGlobalLocalVar, state: SSUnknownSQLState}, - vterrors.InnodbReadOnly: {num: ERInnodbReadOnly, state: SSUnknownSQLState}, - vterrors.LockOrActiveTransaction: {num: ERLockOrActiveTransaction, state: SSUnknownSQLState}, - vterrors.NoDB: {num: ERNoDb, state: SSNoDB}, - vterrors.NoSuchTable: {num: ERNoSuchTable, state: SSUnknownTable}, - vterrors.NotSupportedYet: {num: ERNotSupportedYet, state: SSClientError}, - vterrors.ForbidSchemaChange: {num: ERForbidSchemaChange, state: SSUnknownSQLState}, - vterrors.MixOfGroupFuncAndFields: {num: ERMixOfGroupFuncAndFields, state: SSClientError}, - vterrors.NetPacketTooLarge: {num: ERNetPacketTooLarge, state: SSNetError}, - vterrors.NonUniqError: {num: ERNonUniq, state: SSConstraintViolation}, - vterrors.NonUniqTable: {num: ERNonUniqTable, state: SSClientError}, - vterrors.NonUpdateableTable: {num: ERNonUpdateableTable, state: SSUnknownSQLState}, - vterrors.QueryInterrupted: {num: ERQueryInterrupted, state: SSQueryInterrupted}, - vterrors.SPDoesNotExist: {num: ERSPDoesNotExist, state: SSClientError}, - vterrors.SyntaxError: {num: ERSyntaxError, state: SSClientError}, - vterrors.UnsupportedPS: {num: ERUnsupportedPS, state: SSUnknownSQLState}, - vterrors.UnknownSystemVariable: {num: ERUnknownSystemVariable, state: SSUnknownSQLState}, - vterrors.UnknownTable: {num: ERUnknownTable, state: SSUnknownTable}, - vterrors.WrongGroupField: {num: ERWrongGroupField, state: SSClientError}, - vterrors.WrongNumberOfColumnsInSelect: {num: ERWrongNumberOfColumnsInSelect, state: SSWrongNumberOfColumns}, - vterrors.WrongTypeForVar: {num: ERWrongTypeForVar, state: SSClientError}, - vterrors.WrongValueForVar: {num: ERWrongValueForVar, state: SSClientError}, - vterrors.WrongValue: {num: ERWrongValue, state: SSUnknownSQLState}, - vterrors.WrongFieldWithGroup: {num: ERWrongFieldWithGroup, state: SSClientError}, - vterrors.ServerNotAvailable: {num: ERServerIsntAvailable, state: SSNetError}, - vterrors.CantDoThisInTransaction: {num: ERCantDoThisDuringAnTransaction, state: SSCantDoThisDuringAnTransaction}, - vterrors.RequiresPrimaryKey: {num: ERRequiresPrimaryKey, state: SSClientError}, - vterrors.RowIsReferenced2: {num: ERRowIsReferenced2, state: SSConstraintViolation}, - vterrors.NoReferencedRow2: {num: ErNoReferencedRow2, state: SSConstraintViolation}, - vterrors.NoSuchSession: {num: ERUnknownComError, state: SSNetError}, - vterrors.OperandColumns: {num: EROperandColumns, state: SSWrongNumberOfColumns}, - vterrors.WrongValueCountOnRow: {num: ERWrongValueCountOnRow, state: SSWrongValueCountOnRow}, - vterrors.WrongArguments: {num: ERWrongArguments, state: SSUnknownSQLState}, - vterrors.ViewWrongList: {num: ERViewWrongList, state: SSUnknownSQLState}, - vterrors.UnknownStmtHandler: {num: ERUnknownStmtHandler, state: SSUnknownSQLState}, - vterrors.KeyDoesNotExist: {num: ERKeyDoesNotExist, state: SSClientError}, - vterrors.UnknownTimeZone: {num: ERUnknownTimeZone, state: SSUnknownSQLState}, - vterrors.RegexpStringNotTerminated: {num: ERRegexpStringNotTerminated, state: SSUnknownSQLState}, - vterrors.RegexpBufferOverflow: {num: ERRegexpBufferOverflow, state: SSUnknownSQLState}, - vterrors.RegexpIllegalArgument: {num: ERRegexpIllegalArgument, state: SSUnknownSQLState}, - vterrors.RegexpIndexOutOfBounds: {num: ERRegexpIndexOutOfBounds, state: SSUnknownSQLState}, - vterrors.RegexpInternal: {num: ERRegexpInternal, state: SSUnknownSQLState}, - vterrors.RegexpRuleSyntax: {num: ERRegexpRuleSyntax, state: SSUnknownSQLState}, - vterrors.RegexpBadEscapeSequence: {num: ERRegexpBadEscapeSequence, state: SSUnknownSQLState}, - vterrors.RegexpUnimplemented: {num: ERRegexpUnimplemented, state: SSUnknownSQLState}, - vterrors.RegexpMismatchParen: {num: ERRegexpMismatchParen, state: SSUnknownSQLState}, - vterrors.RegexpBadInterval: {num: ERRegexpBadInterval, state: SSUnknownSQLState}, - vterrors.RegexpMaxLtMin: {num: ERRRegexpMaxLtMin, state: SSUnknownSQLState}, - vterrors.RegexpInvalidBackRef: {num: ERRegexpInvalidBackRef, state: SSUnknownSQLState}, - vterrors.RegexpLookBehindLimit: {num: ERRegexpLookBehindLimit, state: SSUnknownSQLState}, - vterrors.RegexpMissingCloseBracket: {num: ERRegexpMissingCloseBracket, state: SSUnknownSQLState}, - vterrors.RegexpInvalidRange: {num: ERRegexpInvalidRange, state: SSUnknownSQLState}, - vterrors.RegexpStackOverflow: {num: ERRegexpStackOverflow, state: SSUnknownSQLState}, - vterrors.RegexpTimeOut: {num: ERRegexpTimeOut, state: SSUnknownSQLState}, - vterrors.RegexpPatternTooBig: {num: ERRegexpPatternTooBig, state: SSUnknownSQLState}, - vterrors.RegexpInvalidFlag: {num: ERRegexpInvalidFlag, state: SSUnknownSQLState}, - vterrors.RegexpInvalidCaptureGroup: {num: ERRegexpInvalidCaptureGroup, state: SSUnknownSQLState}, - vterrors.CharacterSetMismatch: {num: ERCharacterSetMismatch, state: SSUnknownSQLState}, - vterrors.WrongParametersToNativeFct: {num: ERWrongParametersToNativeFct, state: SSUnknownSQLState}, - vterrors.KillDeniedError: {num: ERKillDenied, state: SSUnknownSQLState}, - vterrors.BadNullError: {num: ERBadNullError, state: SSConstraintViolation}, - vterrors.InvalidGroupFuncUse: {num: ERInvalidGroupFuncUse, state: SSUnknownSQLState}, + vterrors.Undefined: {num: ERUnknownError, state: SSUnknownSQLState}, + vterrors.AccessDeniedError: {num: ERAccessDeniedError, state: SSAccessDeniedError}, + vterrors.BadDb: {num: ERBadDb, state: SSClientError}, + vterrors.BadFieldError: {num: ERBadFieldError, state: SSBadFieldError}, + vterrors.BadTableError: {num: ERBadTable, state: SSUnknownTable}, + vterrors.CantUseOptionHere: {num: ERCantUseOptionHere, state: SSClientError}, + vterrors.DataOutOfRange: {num: ERDataOutOfRange, state: SSDataOutOfRange}, + vterrors.DbCreateExists: {num: ERDbCreateExists, state: SSUnknownSQLState}, + vterrors.DbDropExists: {num: ERDbDropExists, state: SSUnknownSQLState}, + vterrors.DupFieldName: {num: ERDupFieldName, state: SSDupFieldName}, + vterrors.EmptyQuery: {num: EREmptyQuery, state: SSClientError}, + vterrors.IncorrectGlobalLocalVar: {num: ERIncorrectGlobalLocalVar, state: SSUnknownSQLState}, + vterrors.InnodbReadOnly: {num: ERInnodbReadOnly, state: SSUnknownSQLState}, + vterrors.LockOrActiveTransaction: {num: ERLockOrActiveTransaction, state: SSUnknownSQLState}, + vterrors.NoDB: {num: ERNoDb, state: SSNoDB}, + vterrors.NoSuchTable: {num: ERNoSuchTable, state: SSUnknownTable}, + vterrors.NotSupportedYet: {num: ERNotSupportedYet, state: SSClientError}, + vterrors.ForbidSchemaChange: {num: ERForbidSchemaChange, state: SSUnknownSQLState}, + vterrors.MixOfGroupFuncAndFields: {num: ERMixOfGroupFuncAndFields, state: SSClientError}, + vterrors.NetPacketTooLarge: {num: ERNetPacketTooLarge, state: SSNetError}, + vterrors.NonUniqError: {num: ERNonUniq, state: SSConstraintViolation}, + vterrors.NonUniqTable: {num: ERNonUniqTable, state: SSClientError}, + vterrors.NonUpdateableTable: {num: ERNonUpdateableTable, state: SSUnknownSQLState}, + vterrors.QueryInterrupted: {num: ERQueryInterrupted, state: SSQueryInterrupted}, + vterrors.SPDoesNotExist: {num: ERSPDoesNotExist, state: SSClientError}, + vterrors.SyntaxError: {num: ERSyntaxError, state: SSClientError}, + vterrors.UnsupportedPS: {num: ERUnsupportedPS, state: SSUnknownSQLState}, + vterrors.UnknownSystemVariable: {num: ERUnknownSystemVariable, state: SSUnknownSQLState}, + vterrors.UnknownTable: {num: ERUnknownTable, state: SSUnknownTable}, + vterrors.WrongGroupField: {num: ERWrongGroupField, state: SSClientError}, + vterrors.WrongNumberOfColumnsInSelect: {num: ERWrongNumberOfColumnsInSelect, state: SSWrongNumberOfColumns}, + vterrors.WrongTypeForVar: {num: ERWrongTypeForVar, state: SSClientError}, + vterrors.WrongValueForVar: {num: ERWrongValueForVar, state: SSClientError}, + vterrors.WrongValue: {num: ERWrongValue, state: SSUnknownSQLState}, + vterrors.WrongFieldWithGroup: {num: ERWrongFieldWithGroup, state: SSClientError}, + vterrors.ServerNotAvailable: {num: ERServerIsntAvailable, state: SSNetError}, + vterrors.CantDoThisInTransaction: {num: ERCantDoThisDuringAnTransaction, state: SSCantDoThisDuringAnTransaction}, + vterrors.RequiresPrimaryKey: {num: ERRequiresPrimaryKey, state: SSClientError}, + vterrors.RowIsReferenced2: {num: ERRowIsReferenced2, state: SSConstraintViolation}, + vterrors.NoReferencedRow2: {num: ErNoReferencedRow2, state: SSConstraintViolation}, + vterrors.NoSuchSession: {num: ERUnknownComError, state: SSNetError}, + vterrors.OperandColumns: {num: EROperandColumns, state: SSWrongNumberOfColumns}, + vterrors.WrongValueCountOnRow: {num: ERWrongValueCountOnRow, state: SSWrongValueCountOnRow}, + vterrors.WrongArguments: {num: ERWrongArguments, state: SSUnknownSQLState}, + vterrors.ViewWrongList: {num: ERViewWrongList, state: SSUnknownSQLState}, + vterrors.UnknownStmtHandler: {num: ERUnknownStmtHandler, state: SSUnknownSQLState}, + vterrors.KeyDoesNotExist: {num: ERKeyDoesNotExist, state: SSClientError}, + vterrors.UnknownTimeZone: {num: ERUnknownTimeZone, state: SSUnknownSQLState}, + vterrors.RegexpStringNotTerminated: {num: ERRegexpStringNotTerminated, state: SSUnknownSQLState}, + vterrors.RegexpBufferOverflow: {num: ERRegexpBufferOverflow, state: SSUnknownSQLState}, + vterrors.RegexpIllegalArgument: {num: ERRegexpIllegalArgument, state: SSUnknownSQLState}, + vterrors.RegexpIndexOutOfBounds: {num: ERRegexpIndexOutOfBounds, state: SSUnknownSQLState}, + vterrors.RegexpInternal: {num: ERRegexpInternal, state: SSUnknownSQLState}, + vterrors.RegexpRuleSyntax: {num: ERRegexpRuleSyntax, state: SSUnknownSQLState}, + vterrors.RegexpBadEscapeSequence: {num: ERRegexpBadEscapeSequence, state: SSUnknownSQLState}, + vterrors.RegexpUnimplemented: {num: ERRegexpUnimplemented, state: SSUnknownSQLState}, + vterrors.RegexpMismatchParen: {num: ERRegexpMismatchParen, state: SSUnknownSQLState}, + vterrors.RegexpBadInterval: {num: ERRegexpBadInterval, state: SSUnknownSQLState}, + vterrors.RegexpMaxLtMin: {num: ERRRegexpMaxLtMin, state: SSUnknownSQLState}, + vterrors.RegexpInvalidBackRef: {num: ERRegexpInvalidBackRef, state: SSUnknownSQLState}, + vterrors.RegexpLookBehindLimit: {num: ERRegexpLookBehindLimit, state: SSUnknownSQLState}, + vterrors.RegexpMissingCloseBracket: {num: ERRegexpMissingCloseBracket, state: SSUnknownSQLState}, + vterrors.RegexpInvalidRange: {num: ERRegexpInvalidRange, state: SSUnknownSQLState}, + vterrors.RegexpStackOverflow: {num: ERRegexpStackOverflow, state: SSUnknownSQLState}, + vterrors.RegexpTimeOut: {num: ERRegexpTimeOut, state: SSUnknownSQLState}, + vterrors.RegexpPatternTooBig: {num: ERRegexpPatternTooBig, state: SSUnknownSQLState}, + vterrors.RegexpInvalidFlag: {num: ERRegexpInvalidFlag, state: SSUnknownSQLState}, + vterrors.RegexpInvalidCaptureGroup: {num: ERRegexpInvalidCaptureGroup, state: SSUnknownSQLState}, + vterrors.CharacterSetMismatch: {num: ERCharacterSetMismatch, state: SSUnknownSQLState}, + vterrors.WrongParametersToNativeFct: {num: ERWrongParametersToNativeFct, state: SSUnknownSQLState}, + vterrors.KillDeniedError: {num: ERKillDenied, state: SSUnknownSQLState}, + vterrors.BadNullError: {num: ERBadNullError, state: SSConstraintViolation}, + vterrors.InvalidGroupFuncUse: {num: ERInvalidGroupFuncUse, state: SSUnknownSQLState}, + vterrors.VectorConversion: {num: ERVectorConversion, state: SSUnknownSQLState}, + vterrors.CTERecursiveRequiresSingleReference: {num: ERCTERecursiveRequiresSingleReference, state: SSUnknownSQLState}, + vterrors.CTERecursiveRequiresUnion: {num: ERCTERecursiveRequiresUnion, state: SSUnknownSQLState}, + vterrors.CTERecursiveForbidsAggregation: {num: ERCTERecursiveForbidsAggregation, state: SSUnknownSQLState}, + vterrors.CTERecursiveForbiddenJoinOrder: {num: ERCTERecursiveForbiddenJoinOrder, state: SSUnknownSQLState}, + vterrors.CTEMaxRecursionDepth: {num: ERCTEMaxRecursionDepth, state: SSUnknownSQLState}, } func getStateToMySQLState(state vterrors.State) mysqlCode { @@ -284,7 +294,7 @@ func convertToMysqlError(err error) error { if !ok { return err } - return NewSQLError(mysqlCode.num, mysqlCode.state, err.Error()) + return NewSQLError(mysqlCode.num, mysqlCode.state, err.Error()) //nolint:govet } var isGRPCOverflowRE = regexp.MustCompile(`.*?grpc: (received|trying to send) message larger than max \(\d+ vs. \d+\)`) diff --git a/go/mysql/streaming_query.go b/go/mysql/streaming_query.go index 3d0d9ef49e8..95b4e293601 100644 --- a/go/mysql/streaming_query.go +++ b/go/mysql/streaming_query.go @@ -78,7 +78,7 @@ func (c *Conn) ExecuteStreamFetch(query string) (err error) { // EOF is only present here if it's not deprecated. data, err := c.readEphemeralPacket() if err != nil { - return sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) + return sqlerror.NewSQLErrorf(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "%v", err) } defer c.recycleReadPacket() if c.isEOFPacket(data) { @@ -88,7 +88,7 @@ func (c *Conn) ExecuteStreamFetch(query string) (err error) { } else if isErrorPacket(data) { return ParseErrorPacket(data) } else { - return sqlerror.NewSQLError(sqlerror.CRCommandsOutOfSync, sqlerror.SSUnknownSQLState, "unexpected packet after fields: %v", data) + return sqlerror.NewSQLErrorf(sqlerror.CRCommandsOutOfSync, sqlerror.SSUnknownSQLState, "unexpected packet after fields: %v", data) } } diff --git a/go/mysql/vault/auth_server_vault.go b/go/mysql/vault/auth_server_vault.go index d2bc2548817..1f86d84ac40 100644 --- a/go/mysql/vault/auth_server_vault.go +++ b/go/mysql/vault/auth_server_vault.go @@ -159,14 +159,14 @@ func (a *AuthServerVault) UserEntryWithHash(conn *mysql.Conn, salt []byte, user a.mu.Unlock() if !ok { - return &mysql.StaticUserData{}, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &mysql.StaticUserData{}, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } for _, entry := range userEntries { if entry.MysqlNativePassword != "" { hash, err := mysql.DecodeMysqlNativePasswordHex(entry.MysqlNativePassword) if err != nil { - return &mysql.StaticUserData{Username: entry.UserData, Groups: entry.Groups}, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &mysql.StaticUserData{Username: entry.UserData, Groups: entry.Groups}, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } isPass := mysql.VerifyHashedMysqlNativePassword(authResponse, salt, hash) if mysql.MatchSourceHost(remoteAddr, entry.SourceHost) && isPass { @@ -180,7 +180,7 @@ func (a *AuthServerVault) UserEntryWithHash(conn *mysql.Conn, salt []byte, user } } } - return &mysql.StaticUserData{}, sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) + return &mysql.StaticUserData{}, sqlerror.NewSQLErrorf(sqlerror.ERAccessDeniedError, sqlerror.SSAccessDeniedError, "Access denied for user '%v'", user) } func (a *AuthServerVault) setTTLTicker(ttl time.Duration) { diff --git a/go/pools/smartconnpool/waitlist.go b/go/pools/smartconnpool/waitlist.go index d4abeade0ac..f16215f4b14 100644 --- a/go/pools/smartconnpool/waitlist.go +++ b/go/pools/smartconnpool/waitlist.go @@ -88,11 +88,14 @@ func (wl *waitlist[C]) expire(force bool) { // or remove everything if force is true for e := wl.list.Front(); e != nil; e = e.Next() { if force || e.Value.ctx.Err() != nil { - wl.list.Remove(e) expired = append(expired, e) continue } } + // remove the expired waiters from the waitlist after traversing it + for _, e := range expired { + wl.list.Remove(e) + } wl.mu.Unlock() // once all the expired waiters have been removed from the waitlist, wake them up one by one diff --git a/go/pools/smartconnpool/waitlist_test.go b/go/pools/smartconnpool/waitlist_test.go new file mode 100644 index 00000000000..1486aa989b6 --- /dev/null +++ b/go/pools/smartconnpool/waitlist_test.go @@ -0,0 +1,68 @@ +/* +Copyright 2024 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 smartconnpool + +import ( + "context" + "sync/atomic" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestWaitlistExpireWithMultipleWaiters(t *testing.T) { + wait := waitlist[*TestConn]{} + wait.init() + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond) + defer cancel() + + waiterCount := 2 + expireCount := atomic.Int32{} + + for i := 0; i < waiterCount; i++ { + go func() { + _, err := wait.waitForConn(ctx, nil) + if err != nil { + expireCount.Add(1) + } + }() + } + + // Wait for the context to expire + <-ctx.Done() + + // Expire the waiters + wait.expire(false) + + // Wait for the notified goroutines to finish + timeout := time.After(1 * time.Second) + ticker := time.NewTicker(10 * time.Millisecond) + defer ticker.Stop() + for expireCount.Load() != int32(waiterCount) { + select { + case <-timeout: + require.Failf(t, "Timed out waiting for all waiters to expire", "Wanted %d, got %d", waiterCount, expireCount.Load()) + case <-ticker.C: + // try again + } + } + + assert.Equal(t, int32(waiterCount), expireCount.Load()) +} diff --git a/go/sqltypes/cached_size.go b/go/sqltypes/cached_size.go index 2a488f8450e..632c8249455 100644 --- a/go/sqltypes/cached_size.go +++ b/go/sqltypes/cached_size.go @@ -34,17 +34,9 @@ func (cached *Result) CachedSize(alloc bool) int64 { size += elem.CachedSize(true) } } - // field Rows [][]vitess.io/vitess/go/sqltypes.Value + // field Rows []vitess.io/vitess/go/sqltypes.Row { size += hack.RuntimeAllocSize(int64(cap(cached.Rows)) * int64(24)) - for _, elem := range cached.Rows { - { - size += hack.RuntimeAllocSize(int64(cap(elem)) * int64(32)) - for _, elem := range elem { - size += elem.CachedSize(false) - } - } - } } // field SessionStateChanges string size += hack.RuntimeAllocSize(int64(len(cached.SessionStateChanges))) diff --git a/go/sqltypes/type.go b/go/sqltypes/type.go index 4090dd0107a..8be10986747 100644 --- a/go/sqltypes/type.go +++ b/go/sqltypes/type.go @@ -186,6 +186,7 @@ const ( HexVal = querypb.Type_HEXVAL Tuple = querypb.Type_TUPLE BitNum = querypb.Type_BITNUM + Vector = querypb.Type_VECTOR ) // bit-shift the mysql flags by two byte so we @@ -219,6 +220,7 @@ var mysqlToType = map[byte]querypb.Type{ 17: Timestamp, 18: Datetime, 19: Time, + 242: Vector, 245: TypeJSON, 246: Decimal, 247: Enum, @@ -276,10 +278,6 @@ func modifyType(typ querypb.Type, flags int64) querypb.Type { if flags&mysqlSet != 0 { return Set } - case Year: - if flags&mysqlBinary != 0 { - return VarBinary - } } return typ } @@ -335,6 +333,7 @@ var typeToMySQL = map[querypb.Type]struct { Datetime: {typ: 12, flags: mysqlBinary}, Year: {typ: 13, flags: mysqlUnsigned}, Bit: {typ: 16, flags: mysqlUnsigned}, + Vector: {typ: 242}, TypeJSON: {typ: 245}, Decimal: {typ: 246}, Text: {typ: 252}, diff --git a/go/sqltypes/value.go b/go/sqltypes/value.go index 4dde979066b..438b51a13ba 100644 --- a/go/sqltypes/value.go +++ b/go/sqltypes/value.go @@ -19,7 +19,6 @@ package sqltypes import ( "bytes" - "encoding/base64" "encoding/hex" "encoding/json" "errors" @@ -441,6 +440,8 @@ func (v Value) EncodeSQL(b BinWriter) { switch { case v.Type() == Null: b.Write(NullBytes) + case v.IsBinary(): + encodeBinarySQL(v.val, b) case v.IsQuoted(): encodeBytesSQL(v.val, b) case v.Type() == Bit: @@ -456,6 +457,8 @@ func (v Value) EncodeSQLStringBuilder(b *strings.Builder) { switch { case v.Type() == Null: b.Write(NullBytes) + case v.IsBinary(): + encodeBinarySQLStringBuilder(v.val, b) case v.IsQuoted(): encodeBytesSQLStringBuilder(v.val, b) case v.Type() == Bit: @@ -482,6 +485,8 @@ func (v Value) EncodeSQLBytes2(b *bytes2.Buffer) { switch { case v.Type() == Null: b.Write(NullBytes) + case v.IsBinary(): + encodeBinarySQLBytes2(v.val, b) case v.IsQuoted(): encodeBytesSQLBytes2(v.val, b) case v.Type() == Bit: @@ -491,18 +496,6 @@ func (v Value) EncodeSQLBytes2(b *bytes2.Buffer) { } } -// EncodeASCII encodes the value using 7-bit clean ascii bytes. -func (v Value) EncodeASCII(b BinWriter) { - switch { - case v.Type() == Null: - b.Write(NullBytes) - case v.IsQuoted() || v.Type() == Bit: - encodeBytesASCII(v.val, b) - default: - b.Write(v.val) - } -} - // IsNull returns true if Value is null. func (v Value) IsNull() bool { return v.Type() == Null @@ -758,6 +751,22 @@ func (v Value) TinyWeight() uint32 { return v.tinyweight } +func encodeBinarySQL(val []byte, b BinWriter) { + buf := &bytes2.Buffer{} + encodeBinarySQLBytes2(val, buf) + b.Write(buf.Bytes()) +} + +func encodeBinarySQLBytes2(val []byte, buf *bytes2.Buffer) { + buf.Write([]byte("_binary")) + encodeBytesSQLBytes2(val, buf) +} + +func encodeBinarySQLStringBuilder(val []byte, buf *strings.Builder) { + buf.Write([]byte("_binary")) + encodeBytesSQLStringBuilder(val, buf) +} + func encodeBytesSQL(val []byte, b BinWriter) { buf := &bytes2.Buffer{} encodeBytesSQLBytes2(val, buf) @@ -838,16 +847,6 @@ func encodeBytesSQLBits(val []byte, b BinWriter) { fmt.Fprint(b, "'") } -func encodeBytesASCII(val []byte, b BinWriter) { - buf := &bytes2.Buffer{} - buf.WriteByte('\'') - encoder := base64.NewEncoder(base64.StdEncoding, buf) - encoder.Write(val) - encoder.Close() - buf.WriteByte('\'') - b.Write(buf.Bytes()) -} - // SQLEncodeMap specifies how to escape binary data with '\'. // Complies to https://dev.mysql.com/doc/refman/5.7/en/string-literals.html // Handling escaping of % and _ is different than other characters. diff --git a/go/sqltypes/value_test.go b/go/sqltypes/value_test.go index c7bdf1234dd..fbf9be5b19b 100644 --- a/go/sqltypes/value_test.go +++ b/go/sqltypes/value_test.go @@ -367,34 +367,28 @@ func TestEncode(t *testing.T) { outSQL string outASCII string }{{ - in: NULL, - outSQL: "null", - outASCII: "null", + in: NULL, + outSQL: "null", }, { - in: TestValue(Int64, "1"), - outSQL: "1", - outASCII: "1", + in: TestValue(Int64, "1"), + outSQL: "1", }, { - in: TestValue(VarChar, "foo"), - outSQL: "'foo'", - outASCII: "'Zm9v'", + in: TestValue(VarChar, "foo"), + outSQL: "'foo'", }, { - in: TestValue(VarChar, "\x00'\"\b\n\r\t\x1A\\"), - outSQL: "'\\0\\'\"\\b\\n\\r\\t\\Z\\\\'", - outASCII: "'ACciCAoNCRpc'", + in: TestValue(VarChar, "\x00'\"\b\n\r\t\x1A\\"), + outSQL: "'\\0\\'\"\\b\\n\\r\\t\\Z\\\\'", + }, { + in: TestValue(VarBinary, "\x00'\"\b\n\r\t\x1A\\"), + outSQL: "_binary'\\0\\'\"\\b\\n\\r\\t\\Z\\\\'", }, { - in: TestValue(Bit, "a"), - outSQL: "b'01100001'", - outASCII: "'YQ=='", + in: TestValue(Bit, "a"), + outSQL: "b'01100001'", }} for _, tcase := range testcases { var buf strings.Builder tcase.in.EncodeSQL(&buf) assert.Equal(t, tcase.outSQL, buf.String()) - - buf.Reset() - tcase.in.EncodeASCII(&buf) - assert.Equal(t, tcase.outASCII, buf.String()) } } @@ -639,6 +633,9 @@ func TestEncodeSQLStringBuilder(t *testing.T) { }, { in: TestTuple(TestValue(Int64, "1"), TestValue(VarChar, "foo")), outSQL: "(1, 'foo')", + }, { + in: TestValue(VarBinary, "foo"), + outSQL: "_binary'foo'", }} for _, tcase := range testcases { var buf strings.Builder diff --git a/go/stats/export.go b/go/stats/export.go index 58be67e13f9..dee087dd3c5 100644 --- a/go/stats/export.go +++ b/go/stats/export.go @@ -384,19 +384,76 @@ func IsDimensionCombined(name string) bool { // them apart later. The function also replaces specific label values with "all" // if a dimenstion is marked as true in combinedLabels. func safeJoinLabels(labels []string, combinedLabels []bool) string { - sanitizedLabels := make([]string, len(labels)) + // fast path that potentially requires 0 allocations + switch len(labels) { + case 0: + return "" + case 1: + if combinedLabels == nil || !combinedLabels[0] { + return safeLabel(labels[0]) + } + return StatsAllStr + } + + var b strings.Builder + size := len(labels) - 1 // number of separators for idx, label := range labels { if combinedLabels != nil && combinedLabels[idx] { - sanitizedLabels[idx] = StatsAllStr + size += len(StatsAllStr) + } else { + size += len(label) + } + } + b.Grow(size) + + for idx, label := range labels { + if idx > 0 { + b.WriteByte('.') + } + if combinedLabels != nil && combinedLabels[idx] { + b.WriteString(StatsAllStr) + } else { + appendSafeLabel(&b, label) + } + } + return b.String() +} + +// appendSafeLabel is a more efficient version equivalent +// to strings.ReplaceAll(label, ".", "_"), but appends into +// a strings.Builder. +func appendSafeLabel(b *strings.Builder, label string) { + // first quickly check if there are any periods to be replaced + found := false + for i := 0; i < len(label); i++ { + if label[i] == '.' { + found = true + break + } + } + // if there are none, we can just write the label as-is into the + // Builder. + if !found { + b.WriteString(label) + return + } + + for i := 0; i < len(label); i++ { + if label[i] == '.' { + b.WriteByte('_') } else { - sanitizedLabels[idx] = safeLabel(label) + b.WriteByte(label[i]) } } - return strings.Join(sanitizedLabels, ".") } func safeLabel(label string) string { - return strings.Replace(label, ".", "_", -1) + // XXX: strings.ReplaceAll is optimal in the case where '.' does not + // exist in the label name, and will return the string as-is without + // allocations. So if we are working with a single label, it's preferrable + // over appendSafeLabel, since appendSafeLabel is required to allocate + // into a strings.Builder. + return strings.ReplaceAll(label, ".", "_") } func isVarDropped(name string) bool { diff --git a/go/stats/export_test.go b/go/stats/export_test.go index e6160f77184..797d5c556d9 100644 --- a/go/stats/export_test.go +++ b/go/stats/export_test.go @@ -19,6 +19,7 @@ package stats import ( "expvar" "reflect" + "strings" "testing" "github.com/stretchr/testify/require" @@ -189,3 +190,73 @@ func TestStringMapWithMultiLabels(t *testing.T) { require.Equal(t, c.ValueLabel(), "ccc") } + +func TestSafeJoinLabels(t *testing.T) { + cases := []struct { + labels []string + combined []bool + want string + }{ + { + labels: []string{}, + want: "", + }, + { + labels: []string{"foo"}, + want: "foo", + }, + { + labels: []string{"foo.bar"}, + want: "foo_bar", + }, + { + labels: []string{"foo"}, + combined: []bool{true}, + want: "all", + }, + { + labels: []string{"foo", "bar"}, + want: "foo.bar", + }, + { + labels: []string{"foo", "bar"}, + combined: []bool{true, false}, + want: "all.bar", + }, + { + labels: []string{"foo", "bar"}, + combined: []bool{true, true}, + want: "all.all", + }, + { + labels: []string{"foo", "bar"}, + combined: []bool{false, true}, + want: "foo.all", + }, + { + labels: []string{"foo.bar", "bar.baz"}, + want: "foo_bar.bar_baz", + }, + } + for _, tc := range cases { + t.Run(strings.Join(tc.labels, ","), func(t *testing.T) { + require.Equal(t, tc.want, safeJoinLabels(tc.labels, tc.combined)) + }) + } +} +func BenchmarkSafeJoinLabels(b *testing.B) { + labels := [5]string{"foo:bar", "foo.bar", "c1a", "testing", "testing.a.b"} + combined := [5]bool{true, true, true, true, true} + b.Run("no combined", func(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = safeJoinLabels(labels[:], nil) + } + }) + b.Run("combined", func(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _ = safeJoinLabels(labels[:], combined[:]) + } + }) +} diff --git a/go/test/endtoend/backup/pitr_mysqlshell/backup_pitr_mysqlshell_test.go b/go/test/endtoend/backup/pitr_mysqlshell/backup_pitr_mysqlshell_test.go new file mode 100644 index 00000000000..fe6fa0b7dcd --- /dev/null +++ b/go/test/endtoend/backup/pitr_mysqlshell/backup_pitr_mysqlshell_test.go @@ -0,0 +1,61 @@ +/* +Copyright 2024 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 mysqlctld + +import ( + "testing" + + backup "vitess.io/vitess/go/test/endtoend/backup/vtctlbackup" +) + +// TestIncrementalBackupAndRestoreToPos +func TestIncrementalBackupAndRestoreToPos(t *testing.T) { + tcase := &backup.PITRTestCase{ + Name: "MySQLShell", + SetupType: backup.MySQLShell, + ComprssDetails: &backup.CompressionDetails{ + CompressorEngineName: "pgzip", + }, + } + backup.ExecTestIncrementalBackupAndRestoreToPos(t, tcase) +} + +// TestIncrementalBackupAndRestoreToTimestamp - tests incremental backups and restores. +// The general outline of the test: +// - Generate some schema with data +// - Take a full backup +// - Proceed to take a series of inremental backups. In between, inject data (insert rows), and keep record +// of which data (number of rows) is present in each backup, and at which timestamp. +// - Expect backups success/failure per scenario +// - Next up, we start testing restores. Randomly pick recorded timestamps and restore to those points in time. +// - In each restore, excpect to find the data (number of rows) recorded for said timestamp +// - Some restores should fail because the timestamp exceeds the last binlog +// - Do so for all recorded tiemstamps. +// - Then, a 2nd round where some backups are purged -- this tests to see that we're still able to find a restore path +// (of course we only delete backups that still leave us with valid restore paths). +// +// All of the above is done for BuiltinBackup, XtraBackup, Mysqlctld (which is technically builtin) +func TestIncrementalBackupAndRestoreToTimestamp(t *testing.T) { + tcase := &backup.PITRTestCase{ + Name: "MySQLShell", + SetupType: backup.MySQLShell, + ComprssDetails: &backup.CompressionDetails{ + CompressorEngineName: "pgzip", + }, + } + backup.ExecTestIncrementalBackupAndRestoreToTimestamp(t, tcase) +} diff --git a/go/test/endtoend/backup/vtbackup/backup_only_test.go b/go/test/endtoend/backup/vtbackup/backup_only_test.go index 7dada7a77d2..4e018986100 100644 --- a/go/test/endtoend/backup/vtbackup/backup_only_test.go +++ b/go/test/endtoend/backup/vtbackup/backup_only_test.go @@ -69,15 +69,10 @@ func TestTabletInitialBackup(t *testing.T) { // Initialize the tablets initTablets(t, false, false) - vtTabletVersion, err := cluster.GetMajorVersion("vttablet") - require.NoError(t, err) - // For all version at or above v17.0.0, each replica will start in super_read_only mode. Let's verify that is working correctly. - if vtTabletVersion >= 17 { - err := primary.VttabletProcess.CreateDB("testDB") - require.ErrorContains(t, err, "The MySQL server is running with the --super-read-only option so it cannot execute this statement") - err = replica1.VttabletProcess.CreateDB("testDB") - require.ErrorContains(t, err, "The MySQL server is running with the --super-read-only option so it cannot execute this statement") - } + err := primary.VttabletProcess.CreateDB("testDB") + require.ErrorContains(t, err, "The MySQL server is running with the --super-read-only option so it cannot execute this statement") + err = replica1.VttabletProcess.CreateDB("testDB") + require.ErrorContains(t, err, "The MySQL server is running with the --super-read-only option so it cannot execute this statement") // Restore the Tablet restore(t, primary, "replica", "NOT_SERVING") @@ -172,7 +167,7 @@ func firstBackupTest(t *testing.T, tabletType string) { restore(t, replica2, "replica", "SERVING") // Replica2 takes time to serve. Sleeping for 5 sec. time.Sleep(5 * time.Second) - //check the new replica has the data + // check the new replica has the data cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) removeBackups(t) diff --git a/go/test/endtoend/backup/vtctlbackup/backup_test.go b/go/test/endtoend/backup/vtctlbackup/backup_test.go index 92c7a2f3048..be9e5bbf490 100644 --- a/go/test/endtoend/backup/vtctlbackup/backup_test.go +++ b/go/test/endtoend/backup/vtctlbackup/backup_test.go @@ -29,6 +29,7 @@ func TestBuiltinBackup(t *testing.T) { func TestBuiltinBackupWithZstdCompression(t *testing.T) { defer setDefaultCompressionFlag() + defer setDefaultCommonArgs() cDetails := &CompressionDetails{ CompressorEngineName: "zstd", ExternalCompressorCmd: "zstd", @@ -41,6 +42,7 @@ func TestBuiltinBackupWithZstdCompression(t *testing.T) { func TestBuiltinBackupWithExternalZstdCompression(t *testing.T) { defer setDefaultCompressionFlag() + defer setDefaultCommonArgs() cDetails := &CompressionDetails{ CompressorEngineName: "external", ExternalCompressorCmd: "zstd", @@ -53,6 +55,7 @@ func TestBuiltinBackupWithExternalZstdCompression(t *testing.T) { func TestBuiltinBackupWithExternalZstdCompressionAndManifestedDecompressor(t *testing.T) { defer setDefaultCompressionFlag() + defer setDefaultCommonArgs() cDetails := &CompressionDetails{ CompressorEngineName: "external", ExternalCompressorCmd: "zstd", diff --git a/go/test/endtoend/backup/vtctlbackup/backup_utils.go b/go/test/endtoend/backup/vtctlbackup/backup_utils.go index 707c9010b0c..7c03b776c74 100644 --- a/go/test/endtoend/backup/vtctlbackup/backup_utils.go +++ b/go/test/endtoend/backup/vtctlbackup/backup_utils.go @@ -54,19 +54,20 @@ const ( XtraBackup = iota BuiltinBackup Mysqlctld + MySQLShell timeout = time.Duration(60 * time.Second) topoConsistencyTimeout = 20 * time.Second ) var ( - primary *cluster.Vttablet - replica1 *cluster.Vttablet - replica2 *cluster.Vttablet - replica3 *cluster.Vttablet - localCluster *cluster.LocalProcessCluster - newInitDBFile string - useXtrabackup bool - cell = cluster.DefaultCell + primary *cluster.Vttablet + replica1 *cluster.Vttablet + replica2 *cluster.Vttablet + replica3 *cluster.Vttablet + localCluster *cluster.LocalProcessCluster + newInitDBFile string + currentSetupType int + cell = cluster.DefaultCell hostname = "localhost" keyspaceName = "ks" @@ -74,14 +75,7 @@ var ( shardKsName = fmt.Sprintf("%s/%s", keyspaceName, shardName) dbCredentialFile string shardName = "0" - commonTabletArg = []string{ - "--vreplication_retry_delay", "1s", - "--degraded_threshold", "5s", - "--lock_tables_timeout", "5s", - "--watch_replication_stream", - "--enable_replication_reporter", - "--serving_state_grace_period", "1s", - } + commonTabletArg = getDefaultCommonArgs() vtInsertTest = ` create table vt_insert_test ( @@ -103,6 +97,7 @@ type CompressionDetails struct { // LaunchCluster : starts the cluster as per given params. func LaunchCluster(setupType int, streamMode string, stripes int, cDetails *CompressionDetails) (int, error) { + currentSetupType = setupType localCluster = cluster.NewCluster(cell, hostname) // Start topo server @@ -144,10 +139,9 @@ func LaunchCluster(setupType int, streamMode string, stripes int, cDetails *Comp extraArgs := []string{"--db-credentials-file", dbCredentialFile} commonTabletArg = append(commonTabletArg, "--db-credentials-file", dbCredentialFile) - // Update arguments for xtrabackup - if setupType == XtraBackup { - useXtrabackup = true - + // Update arguments for different backup engines + switch setupType { + case XtraBackup: xtrabackupArgs := []string{ "--backup_engine_implementation", "xtrabackup", fmt.Sprintf("--xtrabackup_stream_mode=%s", streamMode), @@ -162,6 +156,18 @@ func LaunchCluster(setupType int, streamMode string, stripes int, cDetails *Comp } commonTabletArg = append(commonTabletArg, xtrabackupArgs...) + case MySQLShell: + mysqlShellBackupLocation := path.Join(localCluster.CurrentVTDATAROOT, "backups-mysqlshell") + err = os.MkdirAll(mysqlShellBackupLocation, 0o777) + if err != nil { + return 0, err + } + + mysqlShellArgs := []string{ + "--backup_engine_implementation", "mysqlshell", + "--mysql-shell-backup-location", mysqlShellBackupLocation, + } + commonTabletArg = append(commonTabletArg, mysqlShellArgs...) } commonTabletArg = append(commonTabletArg, getCompressorArgs(cDetails)...) @@ -178,9 +184,19 @@ func LaunchCluster(setupType int, streamMode string, stripes int, cDetails *Comp tablet := localCluster.NewVttabletInstance(tabletType, 0, cell) tablet.VttabletProcess = localCluster.VtprocessInstanceFromVttablet(tablet, shard.Name, keyspaceName) tablet.VttabletProcess.DbPassword = dbPassword - tablet.VttabletProcess.ExtraArgs = commonTabletArg tablet.VttabletProcess.SupportsBackup = true + // since we spin different mysqld processes, we need to pass exactly the socket of the this particular + // one when running mysql shell dump/loads + if setupType == MySQLShell { + commonTabletArg = append(commonTabletArg, + "--mysql-shell-flags", fmt.Sprintf("--js -u vt_dba -p%s -S %s", dbPassword, + path.Join(os.Getenv("VTDATAROOT"), fmt.Sprintf("/vt_%010d", tablet.TabletUID), "mysql.sock"), + ), + ) + } + tablet.VttabletProcess.ExtraArgs = commonTabletArg + if setupType == Mysqlctld { mysqlctldProcess, err := cluster.MysqlCtldProcessInstance(tablet.TabletUID, tablet.MySQLPort, localCluster.TmpDirectory) if err != nil { @@ -1032,13 +1048,9 @@ func verifySemiSyncStatus(t *testing.T, vttablet *cluster.Vttablet, expectedStat } func terminateBackup(t *testing.T, alias string) { - stopBackupMsg := "Done taking Backup" - if useXtrabackup { + stopBackupMsg := "Completed backing up" + if currentSetupType == XtraBackup { stopBackupMsg = "Starting backup with" - useXtrabackup = false - defer func() { - useXtrabackup = true - }() } args := append([]string{"--server", localCluster.VtctldClientProcess.Server, "--alsologtostderr"}, "Backup", alias) @@ -1067,12 +1079,8 @@ func terminateBackup(t *testing.T, alias string) { func terminateRestore(t *testing.T) { stopRestoreMsg := "Copying file 10" - if useXtrabackup { + if currentSetupType == XtraBackup { stopRestoreMsg = "Restore: Preparing" - useXtrabackup = false - defer func() { - useXtrabackup = true - }() } args := append([]string{"--server", localCluster.VtctldClientProcess.Server, "--alsologtostderr"}, "RestoreFromBackup", primary.Alias) @@ -1133,6 +1141,17 @@ func GetReplicaGtidPurged(t *testing.T, replicaIndex int) string { return row.AsString("gtid_purged", "") } +func ReconnectReplicaToPrimary(t *testing.T, replicaIndex int) { + query := fmt.Sprintf("CHANGE REPLICATION SOURCE TO SOURCE_HOST='localhost', SOURCE_PORT=%d, SOURCE_USER='vt_repl', SOURCE_AUTO_POSITION = 1", primary.MySQLPort) + replica := getReplica(t, replicaIndex) + _, err := replica.VttabletProcess.QueryTablet("stop replica", keyspaceName, true) + require.NoError(t, err) + _, err = replica.VttabletProcess.QueryTablet(query, keyspaceName, true) + require.NoError(t, err) + _, err = replica.VttabletProcess.QueryTablet("start replica", keyspaceName, true) + require.NoError(t, err) +} + func InsertRowOnPrimary(t *testing.T, hint string) { if hint == "" { hint = textutil.RandomHash()[:12] @@ -1345,9 +1364,9 @@ func TestReplicaRestoreToTimestamp(t *testing.T, restoreToTimestamp time.Time, e } func verifyTabletBackupStats(t *testing.T, vars map[string]any) { - // Currently only the builtin backup engine instruments bytes-processed - // counts. - if !useXtrabackup { + switch currentSetupType { + // Currently only the builtin backup engine instruments bytes-processed counts. + case BuiltinBackup: require.Contains(t, vars, "BackupBytes") bb := vars["BackupBytes"].(map[string]any) require.Contains(t, bb, "BackupEngine.Builtin.Compressor:Write") @@ -1361,8 +1380,10 @@ func verifyTabletBackupStats(t *testing.T, vars map[string]any) { require.Contains(t, vars, "BackupCount") bc := vars["BackupCount"].(map[string]any) require.Contains(t, bc, "-.-.Backup") - // Currently only the builtin backup engine implements operation counts. - if !useXtrabackup { + + switch currentSetupType { + // Currently only the builtin backup engine instruments bytes-processed counts. + case BuiltinBackup: require.Contains(t, bc, "BackupEngine.Builtin.Compressor:Close") require.Contains(t, bc, "BackupEngine.Builtin.Destination:Close") require.Contains(t, bc, "BackupEngine.Builtin.Destination:Open") @@ -1373,8 +1394,10 @@ func verifyTabletBackupStats(t *testing.T, vars map[string]any) { require.Contains(t, vars, "BackupDurationNanoseconds") bd := vars["BackupDurationNanoseconds"] require.Contains(t, bd, "-.-.Backup") + + switch currentSetupType { // Currently only the builtin backup engine emits timings. - if !useXtrabackup { + case BuiltinBackup: require.Contains(t, bd, "BackupEngine.Builtin.Compressor:Close") require.Contains(t, bd, "BackupEngine.Builtin.Compressor:Write") require.Contains(t, bd, "BackupEngine.Builtin.Destination:Close") @@ -1384,6 +1407,7 @@ func verifyTabletBackupStats(t *testing.T, vars map[string]any) { require.Contains(t, bd, "BackupEngine.Builtin.Source:Open") require.Contains(t, bd, "BackupEngine.Builtin.Source:Read") } + if backupstorage.BackupStorageImplementation == "file" { require.Contains(t, bd, "BackupStorage.File.File:Write") } @@ -1408,7 +1432,8 @@ func verifyTabletRestoreStats(t *testing.T, vars map[string]any) { verifyRestorePositionAndTimeStats(t, vars) - if !useXtrabackup { + switch currentSetupType { + case BuiltinBackup: require.Contains(t, vars, "RestoreBytes") bb := vars["RestoreBytes"].(map[string]any) require.Contains(t, bb, "BackupEngine.Builtin.Decompressor:Read") @@ -1420,8 +1445,10 @@ func verifyTabletRestoreStats(t *testing.T, vars map[string]any) { require.Contains(t, vars, "RestoreCount") bc := vars["RestoreCount"].(map[string]any) require.Contains(t, bc, "-.-.Restore") + + switch currentSetupType { // Currently only the builtin backup engine emits operation counts. - if !useXtrabackup { + case BuiltinBackup: require.Contains(t, bc, "BackupEngine.Builtin.Decompressor:Close") require.Contains(t, bc, "BackupEngine.Builtin.Destination:Close") require.Contains(t, bc, "BackupEngine.Builtin.Destination:Open") @@ -1432,8 +1459,10 @@ func verifyTabletRestoreStats(t *testing.T, vars map[string]any) { require.Contains(t, vars, "RestoreDurationNanoseconds") bd := vars["RestoreDurationNanoseconds"] require.Contains(t, bd, "-.-.Restore") + + switch currentSetupType { // Currently only the builtin backup engine emits timings. - if !useXtrabackup { + case BuiltinBackup: require.Contains(t, bd, "BackupEngine.Builtin.Decompressor:Close") require.Contains(t, bd, "BackupEngine.Builtin.Decompressor:Read") require.Contains(t, bd, "BackupEngine.Builtin.Destination:Close") @@ -1443,5 +1472,152 @@ func verifyTabletRestoreStats(t *testing.T, vars map[string]any) { require.Contains(t, bd, "BackupEngine.Builtin.Source:Open") require.Contains(t, bd, "BackupEngine.Builtin.Source:Read") } + require.Contains(t, bd, "BackupStorage.File.File:Read") } + +func getDefaultCommonArgs() []string { + return []string{ + "--vreplication_retry_delay", "1s", + "--degraded_threshold", "5s", + "--lock_tables_timeout", "5s", + "--watch_replication_stream", + "--enable_replication_reporter", + "--serving_state_grace_period", "1s", + } +} + +func setDefaultCommonArgs() { commonTabletArg = getDefaultCommonArgs() } + +// fetch the backup engine used on the last backup triggered by the end-to-end tests. +func getBackupEngineOfLastBackup(t *testing.T) string { + lastBackup := getLastBackup(t) + + manifest := readManifestFile(t, path.Join(localCluster.CurrentVTDATAROOT, "backups", keyspaceName, shardName, lastBackup)) + + return manifest.BackupMethod +} + +func getLastBackup(t *testing.T) string { + backups, err := localCluster.ListBackups(shardKsName) + require.NoError(t, err) + + return backups[len(backups)-1] +} + +func TestBackupEngineSelector(t *testing.T) { + defer setDefaultCommonArgs() + defer cluster.PanicHandler(t) + + // launch the custer with xtrabackup as the default engine + code, err := LaunchCluster(XtraBackup, "xbstream", 0, &CompressionDetails{CompressorEngineName: "pgzip"}) + require.Nilf(t, err, "setup failed with status code %d", code) + + defer TearDownCluster() + + localCluster.DisableVTOrcRecoveries(t) + defer func() { + localCluster.EnableVTOrcRecoveries(t) + }() + verifyInitialReplication(t) + + t.Run("backup with backup-engine=builtin", func(t *testing.T) { + // first try to backup with an alternative engine (builtin) + err = localCluster.VtctldClientProcess.ExecuteCommand("Backup", "--allow-primary", "--backup-engine=builtin", primary.Alias) + require.NoError(t, err) + engineUsed := getBackupEngineOfLastBackup(t) + require.Equal(t, "builtin", engineUsed) + }) + + t.Run("backup with backup-engine=xtrabackup", func(t *testing.T) { + // then try to backup specifying the xtrabackup engine + err = localCluster.VtctldClientProcess.ExecuteCommand("Backup", "--allow-primary", "--backup-engine=xtrabackup", primary.Alias) + require.NoError(t, err) + engineUsed := getBackupEngineOfLastBackup(t) + require.Equal(t, "xtrabackup", engineUsed) + }) + + t.Run("backup without specifying backup-engine", func(t *testing.T) { + // check that by default we still use the xtrabackup engine if not specified + err = localCluster.VtctldClientProcess.ExecuteCommand("Backup", "--allow-primary", primary.Alias) + require.NoError(t, err) + engineUsed := getBackupEngineOfLastBackup(t) + require.Equal(t, "xtrabackup", engineUsed) + }) +} + +func TestRestoreAllowedBackupEngines(t *testing.T) { + defer setDefaultCommonArgs() + defer cluster.PanicHandler(t) + + backupMsg := "right after xtrabackup backup" + + cDetails := &CompressionDetails{CompressorEngineName: "pgzip"} + + // launch the custer with xtrabackup as the default engine + code, err := LaunchCluster(XtraBackup, "xbstream", 0, cDetails) + require.Nilf(t, err, "setup failed with status code %d", code) + + defer TearDownCluster() + + localCluster.DisableVTOrcRecoveries(t) + defer func() { + localCluster.EnableVTOrcRecoveries(t) + }() + verifyInitialReplication(t) + + t.Run("generate backups", func(t *testing.T) { + // lets take two backups, each using a different backup engine + err = localCluster.VtctldClientProcess.ExecuteCommand("Backup", "--allow-primary", "--backup-engine=builtin", primary.Alias) + require.NoError(t, err) + + err = localCluster.VtctldClientProcess.ExecuteCommand("Backup", "--allow-primary", "--backup-engine=xtrabackup", primary.Alias) + require.NoError(t, err) + }) + + // insert more data on the primary + _, err = primary.VttabletProcess.QueryTablet(fmt.Sprintf("insert into vt_insert_test (msg) values ('%s')", backupMsg), keyspaceName, true) + require.NoError(t, err) + + t.Run("restore replica and verify data", func(t *testing.T) { + // now bring up another replica, letting it restore from backup. + restoreWaitForBackup(t, "replica", cDetails, true) + err = replica2.VttabletProcess.WaitForTabletStatusesForTimeout([]string{"SERVING"}, timeout) + require.NoError(t, err) + + // check the new replica has the data + cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) + result, err := replica2.VttabletProcess.QueryTablet( + fmt.Sprintf("select msg from vt_insert_test where msg='%s'", backupMsg), replica2.VttabletProcess.Keyspace, true) + require.NoError(t, err) + require.Equal(t, backupMsg, result.Named().Row().AsString("msg", "")) + }) + + t.Run("test broken restore", func(t *testing.T) { + // now lets break the last backup in the shard + err = os.Remove(path.Join(localCluster.CurrentVTDATAROOT, + "backups", keyspaceName, shardName, + getLastBackup(t), "backup.xbstream.gz")) + require.NoError(t, err) + + // and try to restore from it + err = localCluster.VtctldClientProcess.ExecuteCommand("RestoreFromBackup", replica2.Alias) + require.Error(t, err) // this should fail + }) + + t.Run("test older working backup", func(t *testing.T) { + // now we retry but with the first backup + err = localCluster.VtctldClientProcess.ExecuteCommand("RestoreFromBackup", "--allowed-backup-engines=builtin", replica2.Alias) + require.NoError(t, err) // this should succeed + + // make sure we are replicating after the restore is done + err = replica2.VttabletProcess.WaitForTabletStatusesForTimeout([]string{"SERVING"}, timeout) + require.NoError(t, err) + cluster.VerifyRowsInTablet(t, replica2, keyspaceName, 2) + + result, err := replica2.VttabletProcess.QueryTablet( + fmt.Sprintf("select msg from vt_insert_test where msg='%s'", backupMsg), replica2.VttabletProcess.Keyspace, true) + require.NoError(t, err) + require.Equal(t, backupMsg, result.Named().Row().AsString("msg", "")) + }) +} diff --git a/go/test/endtoend/backup/vtctlbackup/pitr_test_framework.go b/go/test/endtoend/backup/vtctlbackup/pitr_test_framework.go index 7f611d81ad6..4c84c3e63bc 100644 --- a/go/test/endtoend/backup/vtctlbackup/pitr_test_framework.go +++ b/go/test/endtoend/backup/vtctlbackup/pitr_test_framework.go @@ -68,21 +68,24 @@ type testedBackupTimestampInfo struct { postTimestamp time.Time } -func waitForReplica(t *testing.T, replicaIndex int) { +// waitForReplica waits for the replica to have same row set as on primary. +func waitForReplica(t *testing.T, replicaIndex int) int { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() + ticker := time.NewTicker(1 * time.Second) + defer ticker.Stop() pMsgs := ReadRowsFromPrimary(t) for { rMsgs := ReadRowsFromReplica(t, replicaIndex) if len(pMsgs) == len(rMsgs) { // success - return + return len(pMsgs) } select { case <-ctx.Done(): assert.FailNow(t, "timeout waiting for replica to catch up") - return - case <-time.After(time.Second): + return 0 + case <-ticker.C: // } } @@ -289,6 +292,12 @@ func ExecTestIncrementalBackupAndRestoreToPos(t *testing.T, tcase *PITRTestCase) if sampleTestedBackupPos == "" { sampleTestedBackupPos = pos } + t.Run("post-pitr, wait for replica to catch up", func(t *testing.T) { + // Replica is DRAINED and does not have replication configuration. + // We now connect the replica to the primary and validate it's able to catch up. + ReconnectReplicaToPrimary(t, 0) + waitForReplica(t, 0) + }) }) } } @@ -539,6 +548,12 @@ func ExecTestIncrementalBackupAndRestoreToTimestamp(t *testing.T, tcase *PITRTes if sampleTestedBackupIndex < 0 { sampleTestedBackupIndex = backupIndex } + t.Run("post-pitr, wait for replica to catch up", func(t *testing.T) { + // Replica is DRAINED and does not have replication configuration. + // We now connect the replica to the primary and validate it's able to catch up. + ReconnectReplicaToPrimary(t, 0) + waitForReplica(t, 0) + }) } else { numFailedRestores++ } diff --git a/go/test/endtoend/backup/xtrabackup/select_engine_test.go b/go/test/endtoend/backup/xtrabackup/select_engine_test.go new file mode 100644 index 00000000000..582cb58d874 --- /dev/null +++ b/go/test/endtoend/backup/xtrabackup/select_engine_test.go @@ -0,0 +1,17 @@ +package vtctlbackup + +import ( + "testing" + + backup "vitess.io/vitess/go/test/endtoend/backup/vtctlbackup" +) + +func TestBackupEngineSelector(t *testing.T) { + defer setDefaultCompressionFlag() + backup.TestBackupEngineSelector(t) +} + +func TestRestoreAllowedBackupEngines(t *testing.T) { + defer setDefaultCompressionFlag() + backup.TestRestoreAllowedBackupEngines(t) +} diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index 44636b3cdb6..9874d368dcd 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -151,11 +151,12 @@ type Vttablet struct { // Keyspace : Cluster accepts keyspace to launch it type Keyspace struct { - Name string - SchemaSQL string - VSchema string - SidecarDBName string - Shards []Shard + Name string + SchemaSQL string + VSchema string + SidecarDBName string + DurabilityPolicy string + Shards []Shard } // Shard with associated vttablets @@ -169,6 +170,17 @@ func (shard *Shard) PrimaryTablet() *Vttablet { return shard.Vttablets[0] } +// FindPrimaryTablet finds the primary tablet in the shard. +func (shard *Shard) FindPrimaryTablet() *Vttablet { + for _, vttablet := range shard.Vttablets { + tabletType := vttablet.VttabletProcess.GetTabletType() + if tabletType == "primary" { + return vttablet + } + } + return nil +} + // Rdonly get the last tablet which is rdonly func (shard *Shard) Rdonly() *Vttablet { for idx, tablet := range shard.Vttablets { @@ -284,9 +296,10 @@ func (cluster *LocalProcessCluster) startPartialKeyspace(keyspace Keyspace, shar cluster.HasPartialKeyspaces = true routedKeyspace := &Keyspace{ - Name: fmt.Sprintf("%s_routed", keyspace.Name), - SchemaSQL: keyspace.SchemaSQL, - VSchema: keyspace.VSchema, + Name: fmt.Sprintf("%s_routed", keyspace.Name), + SchemaSQL: keyspace.SchemaSQL, + VSchema: keyspace.VSchema, + DurabilityPolicy: keyspace.DurabilityPolicy, } err = cluster.startKeyspace(*routedKeyspace, shardNames, replicaCount, rdonly, customizers...) @@ -374,105 +387,11 @@ func (cluster *LocalProcessCluster) startKeyspace(keyspace Keyspace, shardNames keyspace.SidecarDBName = sidecar.DefaultName } // Create the keyspace if it doesn't already exist. - _ = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName) + _ = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) for _, shardName := range shardNames { - shard := &Shard{ - Name: shardName, - } - log.Infof("Starting shard: %v", shardName) - var mysqlctlProcessList []*exec.Cmd - for i := 0; i < totalTabletsRequired; i++ { - // instantiate vttablet object with reserved ports - tabletUID := cluster.GetAndReserveTabletUID() - tablet := &Vttablet{ - TabletUID: tabletUID, - Type: "replica", - HTTPPort: cluster.GetAndReservePort(), - GrpcPort: cluster.GetAndReservePort(), - MySQLPort: cluster.GetAndReservePort(), - Alias: fmt.Sprintf("%s-%010d", cluster.Cell, tabletUID), - } - if i == 0 { // Make the first one as primary - tablet.Type = "primary" - } else if i == totalTabletsRequired-1 && rdonly { // Make the last one as rdonly if rdonly flag is passed - tablet.Type = "rdonly" - } - // Start Mysqlctl process - log.Infof("Starting mysqlctl for table uid %d, mysql port %d", tablet.TabletUID, tablet.MySQLPort) - mysqlctlProcess, err := MysqlCtlProcessInstanceOptionalInit(tablet.TabletUID, tablet.MySQLPort, cluster.TmpDirectory, !cluster.ReusingVTDATAROOT) - if err != nil { - return err - } - switch tablet.Type { - case "primary": - mysqlctlProcess.Binary += os.Getenv("PRIMARY_TABLET_BINARY_SUFFIX") - case "replica": - mysqlctlProcess.Binary += os.Getenv("REPLICA_TABLET_BINARY_SUFFIX") - } - tablet.MysqlctlProcess = *mysqlctlProcess - proc, err := tablet.MysqlctlProcess.StartProcess() - if err != nil { - log.Errorf("error starting mysqlctl process: %v, %v", tablet.MysqlctldProcess, err) - return err - } - mysqlctlProcessList = append(mysqlctlProcessList, proc) - - // start vttablet process - tablet.VttabletProcess = VttabletProcessInstance( - tablet.HTTPPort, - tablet.GrpcPort, - tablet.TabletUID, - cluster.Cell, - shardName, - keyspace.Name, - cluster.VtctldProcess.Port, - tablet.Type, - cluster.TopoProcess.Port, - cluster.Hostname, - cluster.TmpDirectory, - cluster.VtTabletExtraArgs, - cluster.DefaultCharset) - switch tablet.Type { - case "primary": - tablet.VttabletProcess.Binary += os.Getenv("PRIMARY_TABLET_BINARY_SUFFIX") - case "replica": - tablet.VttabletProcess.Binary += os.Getenv("REPLICA_TABLET_BINARY_SUFFIX") - } - tablet.Alias = tablet.VttabletProcess.TabletPath - if cluster.ReusingVTDATAROOT { - tablet.VttabletProcess.ServingStatus = "SERVING" - } - shard.Vttablets = append(shard.Vttablets, tablet) - // Apply customizations - for _, customizer := range customizers { - if f, ok := customizer.(func(*VttabletProcess)); ok { - f(tablet.VttabletProcess) - } else { - return fmt.Errorf("type mismatch on customizer: %T", customizer) - } - } - } - - // wait till all mysqlctl is instantiated - for _, proc := range mysqlctlProcessList { - if err = proc.Wait(); err != nil { - log.Errorf("unable to start mysql process %v: %v", proc, err) - return err - } - } - for _, tablet := range shard.Vttablets { - log.Infof("Starting vttablet for tablet uid %d, grpc port %d", tablet.TabletUID, tablet.GrpcPort) - - if err = tablet.VttabletProcess.Setup(); err != nil { - log.Errorf("error starting vttablet for tablet uid %d, grpc port %d: %v", tablet.TabletUID, tablet.GrpcPort, err) - return - } - } - - // Make first tablet as primary - if err = cluster.VtctldClientProcess.InitializeShard(keyspace.Name, shardName, cluster.Cell, shard.Vttablets[0].TabletUID); err != nil { - log.Errorf("error running InitializeShard on keyspace %v, shard %v: %v", keyspace.Name, shardName, err) - return + shard, err := cluster.AddShard(keyspace.Name, shardName, totalTabletsRequired, rdonly, customizers) + if err != nil { + return err } keyspace.Shards = append(keyspace.Shards, *shard) } @@ -486,33 +405,135 @@ func (cluster *LocalProcessCluster) startKeyspace(keyspace Keyspace, shardNames } if !existingKeyspace { cluster.Keyspaces = append(cluster.Keyspaces, keyspace) - } - // Apply Schema SQL - if keyspace.SchemaSQL != "" { - if err = cluster.VtctldClientProcess.ApplySchema(keyspace.Name, keyspace.SchemaSQL); err != nil { - log.Errorf("error applying schema: %v, %v", keyspace.SchemaSQL, err) - return + // Apply Schema SQL + if keyspace.SchemaSQL != "" { + if err = cluster.VtctldClientProcess.ApplySchema(keyspace.Name, keyspace.SchemaSQL); err != nil { + log.Errorf("error applying schema: %v, %v", keyspace.SchemaSQL, err) + return + } + } + + // Apply VSchema + if keyspace.VSchema != "" { + if err = cluster.VtctldClientProcess.ApplyVSchema(keyspace.Name, keyspace.VSchema); err != nil { + log.Errorf("error applying vschema: %v, %v", keyspace.VSchema, err) + return + } + } + + log.Infof("Done creating keyspace: %v ", keyspace.Name) + + err = cluster.StartVTOrc(keyspace.Name) + if err != nil { + log.Errorf("Error starting VTOrc - %v", err) + return err } } - // Apply VSchema - if keyspace.VSchema != "" { - if err = cluster.VtctldClientProcess.ApplyVSchema(keyspace.Name, keyspace.VSchema); err != nil { - log.Errorf("error applying vschema: %v, %v", keyspace.VSchema, err) - return + return +} + +func (cluster *LocalProcessCluster) AddShard(keyspaceName string, shardName string, totalTabletsRequired int, rdonly bool, customizers []any) (*Shard, error) { + shard := &Shard{ + Name: shardName, + } + log.Infof("Starting shard: %v", shardName) + var mysqlctlProcessList []*exec.Cmd + for i := 0; i < totalTabletsRequired; i++ { + // instantiate vttablet object with reserved ports + tabletUID := cluster.GetAndReserveTabletUID() + tablet := &Vttablet{ + TabletUID: tabletUID, + Type: "replica", + HTTPPort: cluster.GetAndReservePort(), + GrpcPort: cluster.GetAndReservePort(), + MySQLPort: cluster.GetAndReservePort(), + Alias: fmt.Sprintf("%s-%010d", cluster.Cell, tabletUID), + } + if i == 0 { // Make the first one as primary + tablet.Type = "primary" + } else if i == totalTabletsRequired-1 && rdonly { // Make the last one as rdonly if rdonly flag is passed + tablet.Type = "rdonly" + } + // Start Mysqlctl process + log.Infof("Starting mysqlctl for table uid %d, mysql port %d", tablet.TabletUID, tablet.MySQLPort) + mysqlctlProcess, err := MysqlCtlProcessInstanceOptionalInit(tablet.TabletUID, tablet.MySQLPort, cluster.TmpDirectory, !cluster.ReusingVTDATAROOT) + if err != nil { + return nil, err + } + switch tablet.Type { + case "primary": + mysqlctlProcess.Binary += os.Getenv("PRIMARY_TABLET_BINARY_SUFFIX") + case "replica": + mysqlctlProcess.Binary += os.Getenv("REPLICA_TABLET_BINARY_SUFFIX") + } + tablet.MysqlctlProcess = *mysqlctlProcess + proc, err := tablet.MysqlctlProcess.StartProcess() + if err != nil { + log.Errorf("error starting mysqlctl process: %v, %v", tablet.MysqlctldProcess, err) + return nil, err + } + mysqlctlProcessList = append(mysqlctlProcessList, proc) + + // start vttablet process + tablet.VttabletProcess = VttabletProcessInstance( + tablet.HTTPPort, + tablet.GrpcPort, + tablet.TabletUID, + cluster.Cell, + shardName, + keyspaceName, + cluster.VtctldProcess.Port, + tablet.Type, + cluster.TopoProcess.Port, + cluster.Hostname, + cluster.TmpDirectory, + cluster.VtTabletExtraArgs, + cluster.DefaultCharset) + switch tablet.Type { + case "primary": + tablet.VttabletProcess.Binary += os.Getenv("PRIMARY_TABLET_BINARY_SUFFIX") + case "replica": + tablet.VttabletProcess.Binary += os.Getenv("REPLICA_TABLET_BINARY_SUFFIX") + } + tablet.Alias = tablet.VttabletProcess.TabletPath + if cluster.ReusingVTDATAROOT { + tablet.VttabletProcess.ServingStatus = "SERVING" + } + shard.Vttablets = append(shard.Vttablets, tablet) + // Apply customizations + for _, customizer := range customizers { + if f, ok := customizer.(func(*VttabletProcess)); ok { + f(tablet.VttabletProcess) + } else { + return nil, fmt.Errorf("type mismatch on customizer: %T", customizer) + } } } - log.Infof("Done creating keyspace: %v ", keyspace.Name) + // wait till all mysqlctl is instantiated + for _, proc := range mysqlctlProcessList { + if err := proc.Wait(); err != nil { + log.Errorf("unable to start mysql process %v: %v", proc, err) + return nil, err + } + } + for _, tablet := range shard.Vttablets { + log.Infof("Starting vttablet for tablet uid %d, grpc port %d", tablet.TabletUID, tablet.GrpcPort) - err = cluster.StartVTOrc(keyspace.Name) - if err != nil { - log.Errorf("Error starting VTOrc - %v", err) - return err + if err := tablet.VttabletProcess.Setup(); err != nil { + log.Errorf("error starting vttablet for tablet uid %d, grpc port %d: %v", tablet.TabletUID, tablet.GrpcPort, err) + return nil, err + } } - return + // Make first tablet as primary + if err := cluster.VtctldClientProcess.InitializeShard(keyspaceName, shardName, cluster.Cell, shard.Vttablets[0].TabletUID); err != nil { + log.Errorf("error running InitializeShard on keyspace %v, shard %v: %v", keyspaceName, shardName, err) + return nil, err + } + return shard, nil } // StartUnshardedKeyspaceLegacy starts unshared keyspace with shard name as "0" @@ -538,7 +559,7 @@ func (cluster *LocalProcessCluster) StartKeyspaceLegacy(keyspace Keyspace, shard keyspace.SidecarDBName = sidecar.DefaultName } // Create the keyspace if it doesn't already exist. - _ = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName) + _ = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) var mysqlctlProcessList []*exec.Cmd for _, shardName := range shardNames { shard := &Shard{ @@ -681,7 +702,7 @@ func (cluster *LocalProcessCluster) SetupCluster(keyspace *Keyspace, shards []Sh if !cluster.ReusingVTDATAROOT { // Create Keyspace - err = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName) + err = cluster.VtctlProcess.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName, keyspace.DurabilityPolicy) if err != nil { log.Error(err) return diff --git a/go/test/endtoend/cluster/move_tables.go b/go/test/endtoend/cluster/move_tables.go new file mode 100644 index 00000000000..6886a9dbb49 --- /dev/null +++ b/go/test/endtoend/cluster/move_tables.go @@ -0,0 +1,101 @@ +/* +Copyright 2024 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 cluster + +import ( + "fmt" + "strings" + "testing" + "time" +) + +// MoveTablesWorkflow is used to store the information needed to run +// MoveTables commands. +type MoveTablesWorkflow struct { + t *testing.T + clusterInstance *LocalProcessCluster + workflowName string + targetKs string + srcKs string + tables string + tabletTypes []string +} + +// NewMoveTables creates a new MoveTablesWorkflow. +func NewMoveTables(t *testing.T, clusterInstance *LocalProcessCluster, workflowName, targetKs, srcKs, tables string, tabletTypes []string) *MoveTablesWorkflow { + return &MoveTablesWorkflow{ + t: t, + clusterInstance: clusterInstance, + workflowName: workflowName, + tables: tables, + targetKs: targetKs, + srcKs: srcKs, + tabletTypes: tabletTypes, + } +} + +func (mtw *MoveTablesWorkflow) Create() (string, error) { + args := []string{"Create", "--source-keyspace=" + mtw.srcKs} + if mtw.tables != "" { + args = append(args, "--tables="+mtw.tables) + } else { + args = append(args, "--all-tables") + } + if len(mtw.tabletTypes) != 0 { + args = append(args, "--tablet-types") + args = append(args, strings.Join(mtw.tabletTypes, ",")) + } + return mtw.exec(args...) +} + +func (mtw *MoveTablesWorkflow) exec(args ...string) (string, error) { + args2 := []string{"MoveTables", "--workflow=" + mtw.workflowName, "--target-keyspace=" + mtw.targetKs} + args2 = append(args2, args...) + return mtw.clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args2...) +} + +func (mtw *MoveTablesWorkflow) SwitchReadsAndWrites() (string, error) { + return mtw.exec("SwitchTraffic") +} + +func (mtw *MoveTablesWorkflow) ReverseReadsAndWrites() (string, error) { + return mtw.exec("ReverseTraffic") +} + +func (mtw *MoveTablesWorkflow) Cancel() (string, error) { + return mtw.exec("Cancel") +} + +func (mtw *MoveTablesWorkflow) Complete() (string, error) { + return mtw.exec("Complete") +} + +func (mtw *MoveTablesWorkflow) Show() (string, error) { + return mtw.exec("Show") +} + +func (mtw *MoveTablesWorkflow) WaitForVreplCatchup(timeToWait time.Duration) { + for _, ks := range mtw.clusterInstance.Keyspaces { + if ks.Name != mtw.targetKs { + continue + } + for _, shard := range ks.Shards { + vttablet := shard.PrimaryTablet().VttabletProcess + vttablet.WaitForVReplicationToCatchup(mtw.t, mtw.workflowName, fmt.Sprintf("vt_%s", vttablet.Keyspace), "", timeToWait) + } + } +} diff --git a/go/test/endtoend/cluster/reshard.go b/go/test/endtoend/cluster/reshard.go new file mode 100644 index 00000000000..3cec8c14e4d --- /dev/null +++ b/go/test/endtoend/cluster/reshard.go @@ -0,0 +1,102 @@ +/* +Copyright 2024 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 cluster + +import ( + "fmt" + "slices" + "strings" + "testing" + "time" +) + +// ReshardWorkflow is used to store the information needed to run +// Reshard commands. +type ReshardWorkflow struct { + t *testing.T + clusterInstance *LocalProcessCluster + workflowName string + targetKs string + sourceShards string + targetShards string +} + +// NewReshard creates a new ReshardWorkflow. +func NewReshard(t *testing.T, clusterInstance *LocalProcessCluster, workflowName, targetKs, targetShards, srcShards string) *ReshardWorkflow { + return &ReshardWorkflow{ + t: t, + clusterInstance: clusterInstance, + workflowName: workflowName, + targetKs: targetKs, + sourceShards: srcShards, + targetShards: targetShards, + } +} + +func (rw *ReshardWorkflow) Create() (string, error) { + args := []string{"Create"} + if rw.sourceShards != "" { + args = append(args, "--source-shards="+rw.sourceShards) + } + if rw.targetShards != "" { + args = append(args, "--target-shards="+rw.targetShards) + } + + return rw.exec(args...) +} + +func (rw *ReshardWorkflow) exec(args ...string) (string, error) { + args2 := []string{"Reshard", "--workflow=" + rw.workflowName, "--target-keyspace=" + rw.targetKs} + args2 = append(args2, args...) + return rw.clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args2...) +} + +func (rw *ReshardWorkflow) SwitchReadsAndWrites() (string, error) { + return rw.exec("SwitchTraffic") +} + +func (rw *ReshardWorkflow) ReverseReadsAndWrites() (string, error) { + return rw.exec("ReverseTraffic") +} + +func (rw *ReshardWorkflow) Cancel() (string, error) { + return rw.exec("Cancel") +} + +func (rw *ReshardWorkflow) Complete() (string, error) { + return rw.exec("Complete") +} + +func (rw *ReshardWorkflow) Show() (string, error) { + return rw.exec("Show") +} + +func (rw *ReshardWorkflow) WaitForVreplCatchup(timeToWait time.Duration) { + targetShards := strings.Split(rw.targetShards, ",") + for _, ks := range rw.clusterInstance.Keyspaces { + if ks.Name != rw.targetKs { + continue + } + for _, shard := range ks.Shards { + if !slices.Contains(targetShards, shard.Name) { + continue + } + vttablet := shard.FindPrimaryTablet().VttabletProcess + vttablet.WaitForVReplicationToCatchup(rw.t, rw.workflowName, fmt.Sprintf("vt_%s", vttablet.Keyspace), "", timeToWait) + } + } +} diff --git a/go/test/endtoend/cluster/vtctl_process.go b/go/test/endtoend/cluster/vtctl_process.go index b9d8a5b46ce..185c3079d34 100644 --- a/go/test/endtoend/cluster/vtctl_process.go +++ b/go/test/endtoend/cluster/vtctl_process.go @@ -60,15 +60,15 @@ func (vtctl *VtctlProcess) AddCellInfo(Cell string) (err error) { } // CreateKeyspace executes vtctl command to create keyspace -func (vtctl *VtctlProcess) CreateKeyspace(keyspace, sidecarDBName string) (err error) { - var output string - // For upgrade/downgrade tests where an older version is also used. - if vtctl.VtctlMajorVersion < 17 { - log.Errorf("CreateKeyspace does not support the --sidecar-db-name flag in vtctl version %d; ignoring...", vtctl.VtctlMajorVersion) - output, err = vtctl.ExecuteCommandWithOutput("CreateKeyspace", keyspace) - } else { - output, err = vtctl.ExecuteCommandWithOutput("CreateKeyspace", keyspace, "--sidecar-db-name", sidecarDBName) +func (vtctl *VtctlProcess) CreateKeyspace(keyspace, sidecarDBName, durabilityPolicy string) error { + args := []string{ + "CreateKeyspace", keyspace, + "--sidecar-db-name", sidecarDBName, } + if durabilityPolicy != "" { + args = append(args, "--durability-policy", durabilityPolicy) + } + output, err := vtctl.ExecuteCommandWithOutput(args...) if err != nil { log.Errorf("CreateKeyspace returned err: %s, output: %s", err, output) } diff --git a/go/test/endtoend/cluster/vtctld_process.go b/go/test/endtoend/cluster/vtctld_process.go index d87427af9b9..6ac6ed5d2b0 100644 --- a/go/test/endtoend/cluster/vtctld_process.go +++ b/go/test/endtoend/cluster/vtctld_process.go @@ -65,15 +65,10 @@ func (vtctld *VtctldProcess) Setup(cell string, extraArgs ...string) (err error) "--log_dir", vtctld.LogDir, "--port", fmt.Sprintf("%d", vtctld.Port), "--grpc_port", fmt.Sprintf("%d", vtctld.GrpcPort), + "--bind-address", "127.0.0.1", + "--grpc_bind_address", "127.0.0.1", ) - if v, err := GetMajorVersion("vtctld"); err != nil { - return err - } else if v >= 18 { - vtctld.proc.Args = append(vtctld.proc.Args, "--bind-address", "127.0.0.1") - vtctld.proc.Args = append(vtctld.proc.Args, "--grpc_bind_address", "127.0.0.1") - } - if *isCoverage { vtctld.proc.Args = append(vtctld.proc.Args, "--test.coverprofile="+getCoveragePath("vtctld.out")) } diff --git a/go/test/endtoend/cluster/vtgate_process.go b/go/test/endtoend/cluster/vtgate_process.go index 5143e9ad8a4..c01f7c6e93b 100644 --- a/go/test/endtoend/cluster/vtgate_process.go +++ b/go/test/endtoend/cluster/vtgate_process.go @@ -85,12 +85,8 @@ func (vtgate *VtgateProcess) Setup() (err error) { "--tablet_types_to_wait", vtgate.TabletTypesToWait, "--service_map", vtgate.ServiceMap, "--mysql_auth_server_impl", vtgate.MySQLAuthServerImpl, - } - if v, err := GetMajorVersion("vtgate"); err != nil { - return err - } else if v >= 18 { - args = append(args, "--bind-address", "127.0.0.1") - args = append(args, "--grpc_bind_address", "127.0.0.1") + "--bind-address", "127.0.0.1", + "--grpc_bind_address", "127.0.0.1", } // If no explicit mysql_server_version has been specified then we autodetect // the MySQL version that will be used for the test and base the vtgate's @@ -313,11 +309,11 @@ func VtgateProcessInstance( } // GetVars returns map of vars -func (vtgate *VtgateProcess) GetVars() (map[string]any, error) { +func (vtgate *VtgateProcess) GetVars() map[string]any { resultMap := make(map[string]any) resp, err := http.Get(vtgate.VerifyURL) if err != nil { - return nil, fmt.Errorf("error getting response from %s", vtgate.VerifyURL) + return nil } defer resp.Body.Close() @@ -325,11 +321,11 @@ func (vtgate *VtgateProcess) GetVars() (map[string]any, error) { respByte, _ := io.ReadAll(resp.Body) err := json.Unmarshal(respByte, &resultMap) if err != nil { - return nil, fmt.Errorf("not able to parse response body") + return nil } - return resultMap, nil + return resultMap } - return nil, fmt.Errorf("unsuccessful response") + return nil } // ReadVSchema reads the vschema from the vtgate endpoint for it and returns diff --git a/go/test/endtoend/cluster/vtorc_process.go b/go/test/endtoend/cluster/vtorc_process.go index cac5921d01d..4fcb68e292d 100644 --- a/go/test/endtoend/cluster/vtorc_process.go +++ b/go/test/endtoend/cluster/vtorc_process.go @@ -51,10 +51,6 @@ type VTOrcProcess struct { type VTOrcConfiguration struct { Debug bool ListenAddress string - MySQLTopologyUser string - MySQLTopologyPassword string - MySQLReplicaUser string - MySQLReplicaPassword string RecoveryPeriodBlockSeconds int TopologyRefreshSeconds int `json:",omitempty"` PreventCrossDataCenterPrimaryFailover bool `json:",omitempty"` @@ -71,10 +67,6 @@ func (config *VTOrcConfiguration) ToJSONString() string { func (config *VTOrcConfiguration) AddDefaults(webPort int) { config.Debug = true - config.MySQLTopologyUser = "orc_client_user" - config.MySQLTopologyPassword = "orc_client_user_password" - config.MySQLReplicaUser = "vt_repl" - config.MySQLReplicaPassword = "" if config.RecoveryPeriodBlockSeconds == 0 { config.RecoveryPeriodBlockSeconds = 1 } @@ -126,14 +118,9 @@ func (orc *VTOrcProcess) Setup() (err error) { "--instance-poll-time", "1s", // Faster topo information refresh speeds up the tests. This doesn't add any significant load either "--topo-information-refresh-duration", "3s", + "--bind-address", "127.0.0.1", ) - if v, err := GetMajorVersion("vtorc"); err != nil { - return err - } else if v >= 18 { - orc.proc.Args = append(orc.proc.Args, "--bind-address", "127.0.0.1") - } - if *isCoverage { orc.proc.Args = append(orc.proc.Args, "--test.coverprofile="+getCoveragePath("orc.out")) } diff --git a/go/test/endtoend/cluster/vttablet_process.go b/go/test/endtoend/cluster/vttablet_process.go index 6bd60b63191..6c7a85ec533 100644 --- a/go/test/endtoend/cluster/vttablet_process.go +++ b/go/test/endtoend/cluster/vttablet_process.go @@ -111,13 +111,9 @@ func (vttablet *VttabletProcess) Setup() (err error) { "--file_backup_storage_root", vttablet.FileBackupStorageRoot, "--service_map", vttablet.ServiceMap, "--db_charset", vttablet.Charset, + "--bind-address", "127.0.0.1", + "--grpc_bind_address", "127.0.0.1", ) - if v, err := GetMajorVersion("vttablet"); err != nil { - return err - } else if v >= 18 { - vttablet.proc.Args = append(vttablet.proc.Args, "--bind-address", "127.0.0.1") - vttablet.proc.Args = append(vttablet.proc.Args, "--grpc_bind_address", "127.0.0.1") - } if *isCoverage { vttablet.proc.Args = append(vttablet.proc.Args, "--test.coverprofile="+getCoveragePath("vttablet.out")) @@ -615,6 +611,7 @@ func (vttablet *VttabletProcess) getDBSystemValues(placeholder string, value str // WaitForVReplicationToCatchup waits for "workflow" to finish copying func (vttablet *VttabletProcess) WaitForVReplicationToCatchup(t testing.TB, workflow, database string, sidecarDBName string, duration time.Duration) { + t.Helper() if sidecarDBName == "" { sidecarDBName = sidecar.DefaultName } @@ -640,7 +637,7 @@ func (vttablet *VttabletProcess) WaitForVReplicationToCatchup(t testing.TB, work for ind, query := range queries { waitDuration := 500 * time.Millisecond for duration > 0 { - log.Infof("Executing query %s on %s", query, vttablet.Name) + log.Infof("Executing query %s on %s", query, vttablet.TabletPath) lastChecked = time.Now() qr, err := executeQuery(conn, query) if err != nil { diff --git a/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go b/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go index 4c759ff577a..7dea6cf525f 100644 --- a/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go +++ b/go/test/endtoend/encryption/encryptedreplication/encrypted_replication_test.go @@ -131,7 +131,7 @@ func initializeCluster(t *testing.T) (int, error) { for _, keyspaceStr := range []string{keyspace} { KeyspacePtr := &cluster.Keyspace{Name: keyspaceStr} keyspace := *KeyspacePtr - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName); err != nil { + if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { return 1, err } shard := &cluster.Shard{ diff --git a/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go b/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go index 9147b7b9080..1363e07b2cd 100644 --- a/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go +++ b/go/test/endtoend/encryption/encryptedtransport/encrypted_transport_test.go @@ -350,7 +350,7 @@ func clusterSetUp(t *testing.T) (int, error) { for _, keyspaceStr := range []string{keyspace} { KeyspacePtr := &cluster.Keyspace{Name: keyspaceStr} keyspace := *KeyspacePtr - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName); err != nil { + if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspace.Name, sidecar.DefaultName, ""); err != nil { return 1, err } shard := &cluster.Shard{ diff --git a/go/test/endtoend/mysqlctl/mysqlctl_test.go b/go/test/endtoend/mysqlctl/mysqlctl_test.go index 6c3d65226e3..f93724fa4a8 100644 --- a/go/test/endtoend/mysqlctl/mysqlctl_test.go +++ b/go/test/endtoend/mysqlctl/mysqlctl_test.go @@ -53,7 +53,7 @@ func TestMain(m *testing.M) { return 1 } - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName); err != nil { + if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { return 1 } diff --git a/go/test/endtoend/mysqlctld/mysqlctld_test.go b/go/test/endtoend/mysqlctld/mysqlctld_test.go index 328bc563377..beb155830e2 100644 --- a/go/test/endtoend/mysqlctld/mysqlctld_test.go +++ b/go/test/endtoend/mysqlctld/mysqlctld_test.go @@ -57,7 +57,7 @@ func TestMain(m *testing.M) { return 1 } - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName); err != nil { + if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { return 1 } diff --git a/go/test/endtoend/onlineddl/exec_util.go b/go/test/endtoend/onlineddl/exec_util.go index 95ab25ece5c..d86f39eb834 100644 --- a/go/test/endtoend/onlineddl/exec_util.go +++ b/go/test/endtoend/onlineddl/exec_util.go @@ -46,6 +46,10 @@ func CreateTempScript(t *testing.T, content string) (fileName string) { func MysqlClientExecFile(t *testing.T, mysqlParams *mysql.ConnParams, testDataPath, testName string, fileName string) (output string) { t.Helper() + errorFile, err := os.CreateTemp("", "onlineddl-test-") + require.NoError(t, err) + defer os.Remove(errorFile.Name()) + bashPath, err := exec.LookPath("bash") require.NoError(t, err) mysqlPath, err := exec.LookPath("mysql") @@ -55,13 +59,15 @@ func MysqlClientExecFile(t *testing.T, mysqlParams *mysql.ConnParams, testDataPa if !filepath.IsAbs(fileName) { filePath, _ = filepath.Abs(path.Join(testDataPath, testName, fileName)) } - bashCommand := fmt.Sprintf(`%s -u%s --socket=%s --database=%s -s -s < %s 2> /tmp/error.log`, mysqlPath, mysqlParams.Uname, mysqlParams.UnixSocket, mysqlParams.DbName, filePath) + bashCommand := fmt.Sprintf(`%s -u%s --socket=%s --database=%s -s -s < %s 2> %s`, mysqlPath, mysqlParams.Uname, mysqlParams.UnixSocket, mysqlParams.DbName, filePath, errorFile.Name()) cmd, err := exec.Command( bashPath, "-c", bashCommand, ).Output() - require.NoError(t, err) + errorContent, readerr := os.ReadFile(errorFile.Name()) + require.NoError(t, readerr) + require.NoError(t, err, "error details: %s", errorContent) return string(cmd) } diff --git a/go/test/endtoend/onlineddl/flow/onlineddl_flow_test.go b/go/test/endtoend/onlineddl/flow/onlineddl_flow_test.go index 58e985296b5..c442c042f8a 100644 --- a/go/test/endtoend/onlineddl/flow/onlineddl_flow_test.go +++ b/go/test/endtoend/onlineddl/flow/onlineddl_flow_test.go @@ -63,7 +63,7 @@ import ( "vitess.io/vitess/go/test/endtoend/throttler" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/schema" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" throttlebase "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" ) @@ -200,7 +200,7 @@ func TestMain(m *testing.M) { } -func TestSchemaChange(t *testing.T) { +func TestOnlineDDLFlow(t *testing.T) { defer cluster.PanicHandler(t) ctx := context.Background() diff --git a/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go b/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go index 3a963c85ce2..af88806fb26 100644 --- a/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go +++ b/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go @@ -203,7 +203,7 @@ func TestMain(m *testing.M) { } -func TestSchemaChange(t *testing.T) { +func TestRevertSchemaChanges(t *testing.T) { defer cluster.PanicHandler(t) shards = clusterInstance.Keyspaces[0].Shards require.Equal(t, 1, len(shards)) diff --git a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go index c059f68b8b7..b7e18e9af7c 100644 --- a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go +++ b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go @@ -304,7 +304,7 @@ func TestMain(m *testing.M) { } -func TestSchemaChange(t *testing.T) { +func TestSchedulerSchemaChanges(t *testing.T) { throttler.EnableLagThrottlerAndWaitForStatus(t, clusterInstance) @@ -455,6 +455,19 @@ func testScheduler(t *testing.T) { }) } + var originalLockWaitTimeout int64 + t.Run("set low lock_wait_timeout", func(t *testing.T) { + rs, err := primaryTablet.VttabletProcess.QueryTablet("select @@lock_wait_timeout as lock_wait_timeout", keyspaceName, false) + require.NoError(t, err) + row := rs.Named().Row() + require.NotNil(t, row) + originalLockWaitTimeout = row.AsInt64("lock_wait_timeout", 0) + require.NotZero(t, originalLockWaitTimeout) + + _, err = primaryTablet.VttabletProcess.QueryTablet("set global lock_wait_timeout=1", keyspaceName, false) + require.NoError(t, err) + }) + // CREATE t.Run("CREATE TABLEs t1, t2", func(t *testing.T) { { // The table does not exist @@ -572,6 +585,21 @@ func testScheduler(t *testing.T) { } }) }) + t.Run("show vitess_migrations in transaction", func(t *testing.T) { + // The function validates there is no error + rs := onlineddl.VtgateExecQueryInTransaction(t, &vtParams, "show vitess_migrations", "") + assert.NotEmpty(t, rs.Rows) + }) + + t.Run("low @@lock_wait_timeout", func(t *testing.T) { + defer primaryTablet.VttabletProcess.QueryTablet(fmt.Sprintf("set global lock_wait_timeout=%d", originalLockWaitTimeout), keyspaceName, false) + + t1uuid = testOnlineDDLStatement(t, createParams(trivialAlterT1Statement, ddlStrategy, "vtgate", "", "", false)) // wait + t.Run("trivial t1 migration", func(t *testing.T) { + onlineddl.CheckMigrationStatus(t, &vtParams, shards, t1uuid, schema.OnlineDDLStatusComplete) + checkTable(t, t1Name, true) + }) + }) forceCutoverCapable, err := capableOf(capabilities.PerformanceSchemaDataLocksTableCapability) // 8.0 require.NoError(t, err) @@ -600,7 +628,7 @@ func testScheduler(t *testing.T) { commitTransactionChan := make(chan any) transactionErrorChan := make(chan error) t.Run("locking table rows", func(t *testing.T) { - go runInTransaction(t, ctx, shards[0].Vttablets[0], "select * from t1_test for update", commitTransactionChan, transactionErrorChan) + go runInTransaction(t, ctx, primaryTablet, "select * from t1_test for update", commitTransactionChan, transactionErrorChan) }) t.Run("injecting heartbeats asynchronously", func(t *testing.T) { go func() { @@ -1063,6 +1091,22 @@ func testScheduler(t *testing.T) { }) }) + readCleanupsTimetamps := func(t *testing.T, migrationsLike string) (rows int64, cleanedUp int64, needCleanup int64, artifacts []string) { + rs := onlineddl.ReadMigrations(t, &vtParams, migrationsLike) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + rows++ + if row["cleanup_timestamp"].IsNull() { + needCleanup++ + } else { + cleanedUp++ + } + migrationArtifacts := textutil.SplitDelimitedList(row.AsString("artifacts", "")) + artifacts = append(artifacts, migrationArtifacts...) + } + return + } + t.Run("Cleanup artifacts", func(t *testing.T) { // Create a migration with a low --retain-artifacts value. // We will cancel the migration and expect the artifact to be cleaned. @@ -1099,14 +1143,14 @@ func testScheduler(t *testing.T) { defer cancel() for { - rs := onlineddl.ReadMigrations(t, &vtParams, t1uuid) - require.NotNil(t, rs) - row := rs.Named().Row() - require.NotNil(t, row) - if !row["cleanup_timestamp"].IsNull() { + rows, cleanedUp, needCleanup, _ := readCleanupsTimetamps(t, t1uuid) + assert.EqualValues(t, 1, rows) + if cleanedUp == 1 { // This is what we've been waiting for break } + assert.EqualValues(t, 0, cleanedUp) + assert.EqualValues(t, 1, needCleanup) select { case <-ctx.Done(): assert.Fail(t, "timeout waiting for cleanup") @@ -1120,6 +1164,108 @@ func testScheduler(t *testing.T) { }) }) + t.Run("cleanup artifacts with CLEANUP ALL", func(t *testing.T) { + // First, cleanup any existing migrations. We don't have an exact track of how many we've had so far. + t.Run("initial cleanup all", func(t *testing.T) { + t.Run("validate migrations exist that need cleanup", func(t *testing.T) { + _, _, needCleanup, _ := readCleanupsTimetamps(t, "%") + assert.Greater(t, needCleanup, int64(1)) + }) + t.Run("issue cleanup all", func(t *testing.T) { + cleanedUp := onlineddl.CheckCleanupAllMigrations(t, &vtParams, -1) + t.Logf("marked %d migrations for cleanup", cleanedUp) + }) + t.Run("wait for all migrations cleanup", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), extendedWaitTime) + defer cancel() + + for { + rows, cleanedUp, needCleanup, artifacts := readCleanupsTimetamps(t, "%") + if needCleanup == 0 { + // This is what we've been waiting for + assert.NotZero(t, rows) + assert.Equal(t, rows, cleanedUp) + assert.Empty(t, artifacts) + t.Logf("rows needing cleanup: %v", needCleanup) + return + } + select { + case <-ctx.Done(): + assert.Fail(t, "timeout waiting for cleanup", "rows needing cleanup: %v. artifacts: %v", needCleanup, artifacts) + return + case <-time.After(time.Second): + } + t.Logf("rows needing cleanup: %v. artifacts: %v", needCleanup, artifacts) + } + }) + }) + // Create a migration with a low --retain-artifacts value. + // We will cancel the migration and expect the artifact to be cleaned. + t.Run("start migration", func(t *testing.T) { + // Intentionally set `--retain-artifacts=1h` which is a long time. Then we will issue + // `ALTER VITESS_MIGRATION CLEANUP ALL` and expect the artifact to be cleaned. + t1uuid = testOnlineDDLStatement(t, createParams(trivialAlterT1Statement, ddlStrategy+" --postpone-completion --retain-artifacts=1h", "vtctl", "", "", true)) // skip wait + onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusRunning) + }) + t.Run("wait for ready_to_complete", func(t *testing.T) { + waitForReadyToComplete(t, t1uuid, true) + }) + var artifacts []string + t.Run("validate artifact exists", func(t *testing.T) { + rs := onlineddl.ReadMigrations(t, &vtParams, t1uuid) + require.NotNil(t, rs) + row := rs.Named().Row() + require.NotNil(t, row) + + artifacts = textutil.SplitDelimitedList(row.AsString("artifacts", "")) + require.Len(t, artifacts, 1) + checkTable(t, artifacts[0], true) + + retainArtifactsSeconds := row.AsInt64("retain_artifacts_seconds", 0) + assert.EqualValues(t, 3600, retainArtifactsSeconds) // due to --retain-artifacts=1h + }) + t.Run("check needs cleanup", func(t *testing.T) { + _, _, needCleanup, _ := readCleanupsTimetamps(t, "%") + assert.EqualValues(t, 1, needCleanup) + }) + t.Run("complete migration", func(t *testing.T) { + onlineddl.CheckCompleteMigration(t, &vtParams, shards, t1uuid, true) + status := onlineddl.WaitForMigrationStatus(t, &vtParams, shards, t1uuid, normalWaitTime, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed, schema.OnlineDDLStatusCancelled) + fmt.Printf("# Migration status (for debug purposes): <%s>\n", status) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, t1uuid, schema.OnlineDDLStatusComplete) + }) + t.Run("cleanup all", func(t *testing.T) { + onlineddl.CheckCleanupAllMigrations(t, &vtParams, 1) + }) + t.Run("wait for migration cleanup", func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), extendedWaitTime) + defer cancel() + + for { + rows, cleanedUp, needCleanup, artifacts := readCleanupsTimetamps(t, "%") + if needCleanup == 0 { + // This is what we've been waiting for + assert.NotZero(t, rows) + assert.Equal(t, rows, cleanedUp) + assert.Empty(t, artifacts) + t.Logf("rows needing cleanup: %v", needCleanup) + return + } + select { + case <-ctx.Done(): + assert.Fail(t, "timeout waiting for cleanup", "rows needing cleanup: %v. artifacts: %v", needCleanup, artifacts) + return + case <-time.After(time.Second): + } + t.Logf("rows needing cleanup: %v. artifacts: %v", needCleanup, artifacts) + } + }) + + t.Run("validate artifact does not exist", func(t *testing.T) { + checkTable(t, artifacts[0], false) + }) + }) + checkConstraintCapable, err := capableOf(capabilities.CheckConstraintsCapability) // 8.0.16 and above require.NoError(t, err) if checkConstraintCapable { @@ -1133,7 +1279,7 @@ func testScheduler(t *testing.T) { // name it `with_constraint_chk_1`. But we expect Online DDL to explicitly // modify the constraint name, specifically to get rid of the prefix, // so that we don't get into https://bugs.mysql.com/bug.php?id=107772 situation. - createStatement := getCreateTableStatement(t, shards[0].Vttablets[0], "with_constraint") + createStatement := getCreateTableStatement(t, primaryTablet, "with_constraint") assert.NotContains(t, createStatement, "with_constraint_chk") }) }) @@ -1174,6 +1320,7 @@ func testScheduler(t *testing.T) { for _, row := range rs.Named().Rows { message := row["message"].ToString() require.Contains(t, message, "errno 1146") + require.False(t, row["message_timestamp"].IsNull()) } }) @@ -1317,6 +1464,7 @@ func testScheduler(t *testing.T) { for _, row := range rs.Named().Rows { message := row["message"].ToString() require.Contains(t, message, vuuids[2]) // Indicating this migration failed due to vuuids[2] failure + require.False(t, row["message_timestamp"].IsNull()) } } }) @@ -2462,7 +2610,7 @@ func testForeignKeys(t *testing.T) { // // In this stress test, we enable Online DDL if the variable 'rename_table_preserve_foreign_key' is present. The Online DDL mechanism will in turn // query for this variable, and manipulate it, when starting the migration and when cutting over. - rs, err := shards[0].Vttablets[0].VttabletProcess.QueryTablet("show global variables like 'rename_table_preserve_foreign_key'", keyspaceName, false) + rs, err := primaryTablet.VttabletProcess.QueryTablet("show global variables like 'rename_table_preserve_foreign_key'", keyspaceName, false) require.NoError(t, err) fkOnlineDDLPossible = len(rs.Rows) > 0 t.Logf("MySQL support for 'rename_table_preserve_foreign_key': %v", fkOnlineDDLPossible) diff --git a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go index 83fe6bea988..161b1566680 100644 --- a/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go +++ b/go/test/endtoend/onlineddl/vrepl/onlineddl_vrepl_test.go @@ -80,6 +80,9 @@ var ( ALTER TABLE %s DROP PRIMARY KEY, DROP COLUMN vrepl_col` + alterTableFailedVreplicationStatement = ` + ALTER TABLE %s + ADD UNIQUE KEY test_val_uidx (test_val)` // We will run this query while throttling vreplication alterTableThrottlingStatement = ` ALTER TABLE %s @@ -220,7 +223,7 @@ func TestMain(m *testing.M) { } -func TestSchemaChange(t *testing.T) { +func TestVreplSchemaChanges(t *testing.T) { defer cluster.PanicHandler(t) shards = clusterInstance.Keyspaces[0].Shards @@ -397,6 +400,8 @@ func TestSchemaChange(t *testing.T) { assert.GreaterOrEqual(t, lastThrottledTimestamp, startedTimestamp) component := row.AsString("component_throttled", "") assert.Contains(t, []string{throttlerapp.VCopierName.String(), throttlerapp.VPlayerName.String()}, component) + reason := row.AsString("reason_throttled", "") + assert.Contains(t, reason, "is explicitly denied access") // unthrottle onlineddl.UnthrottleAllMigrations(t, &vtParams) @@ -454,6 +459,19 @@ func TestSchemaChange(t *testing.T) { onlineddl.CheckMigrationArtifacts(t, &vtParams, shards, uuid, true) // migration will fail again }) + t.Run("failed migration due to vreplication", func(t *testing.T) { + insertRows(t, 2) + uuid := testOnlineDDLStatement(t, alterTableFailedVreplicationStatement, "online", providedUUID, providedMigrationContext, "vtgate", "vrepl_col", "", false) + onlineddl.WaitForMigrationStatus(t, &vtParams, shards, uuid, normalMigrationWait, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusFailed) + + rs := onlineddl.ReadMigrations(t, &vtParams, uuid) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + message := row["message"].ToString() + assert.Contains(t, message, "vreplication: terminal error:", "migration row: %v", row) + } + }) t.Run("cancel all migrations: nothing to cancel", func(t *testing.T) { // no migrations pending at this time time.Sleep(10 * time.Second) diff --git a/go/test/endtoend/onlineddl/vrepl_stress/onlineddl_vrepl_mini_stress_test.go b/go/test/endtoend/onlineddl/vrepl_stress/onlineddl_vrepl_mini_stress_test.go index 93d66ad7ccb..e0dd9701cf8 100644 --- a/go/test/endtoend/onlineddl/vrepl_stress/onlineddl_vrepl_mini_stress_test.go +++ b/go/test/endtoend/onlineddl/vrepl_stress/onlineddl_vrepl_mini_stress_test.go @@ -38,7 +38,7 @@ import ( "vitess.io/vitess/go/test/endtoend/throttler" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/schema" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" ) type WriteMetrics struct { @@ -229,7 +229,7 @@ func TestMain(m *testing.M) { } -func TestSchemaChange(t *testing.T) { +func TestVreplMiniStressSchemaChanges(t *testing.T) { defer cluster.PanicHandler(t) ctx := context.Background() diff --git a/go/test/endtoend/onlineddl/vrepl_stress_suite/onlineddl_vrepl_stress_suite_test.go b/go/test/endtoend/onlineddl/vrepl_stress_suite/onlineddl_vrepl_stress_suite_test.go index 2492d30788d..440b921f9ba 100644 --- a/go/test/endtoend/onlineddl/vrepl_stress_suite/onlineddl_vrepl_stress_suite_test.go +++ b/go/test/endtoend/onlineddl/vrepl_stress_suite/onlineddl_vrepl_stress_suite_test.go @@ -51,7 +51,7 @@ import ( "vitess.io/vitess/go/timer" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/schema" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" ) type testcase struct { @@ -481,7 +481,7 @@ func TestMain(m *testing.M) { } -func TestSchemaChange(t *testing.T) { +func TestVreplStressSchemaChanges(t *testing.T) { defer cluster.PanicHandler(t) shards = clusterInstance.Keyspaces[0].Shards diff --git a/go/test/endtoend/onlineddl/vrepl_suite/onlineddl_vrepl_suite_test.go b/go/test/endtoend/onlineddl/vrepl_suite/onlineddl_vrepl_suite_test.go index 57397ec64dd..972421c96da 100644 --- a/go/test/endtoend/onlineddl/vrepl_suite/onlineddl_vrepl_suite_test.go +++ b/go/test/endtoend/onlineddl/vrepl_suite/onlineddl_vrepl_suite_test.go @@ -65,6 +65,7 @@ const ( testFilterEnvVar = "ONLINEDDL_SUITE_TEST_FILTER" ) +// Use $VREPL_SUITE_TEST_FILTER environment variable to filter tests by name. func TestMain(m *testing.M) { defer cluster.PanicHandler(nil) flag.Parse() @@ -131,7 +132,7 @@ func TestMain(m *testing.M) { } -func TestSchemaChange(t *testing.T) { +func TestVreplSuiteSchemaChanges(t *testing.T) { defer cluster.PanicHandler(t) shards := clusterInstance.Keyspaces[0].Shards diff --git a/vitess-mixin/e2e/cypress/fixtures/.keep b/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/allow_schemadiff_normalization similarity index 100% rename from vitess-mixin/e2e/cypress/fixtures/.keep rename to go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/allow_schemadiff_normalization diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/alter b/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/alter new file mode 100644 index 00000000000..b5ec82b1a8b --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/alter @@ -0,0 +1 @@ +MODIFY `t1` varchar(128) CHARACTER SET utf8mb4 NOT NULL, MODIFY `t2` varchar(128) CHARACTER SET latin2 NOT NULL, MODIFY `tutf8` varchar(128) CHARACTER SET latin1 NOT NULL diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/create.sql b/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/create.sql new file mode 100644 index 00000000000..79e8fda23ee --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/create.sql @@ -0,0 +1,19 @@ +drop table if exists onlineddl_test; +create table onlineddl_test ( + id int auto_increment, + t1 varchar(128) charset latin1 collate latin1_swedish_ci, + t2 varchar(128) charset latin1 collate latin1_swedish_ci, + tutf8 varchar(128) charset utf8, + tutf8mb4 varchar(128) charset utf8mb4, + tlatin1 varchar(128) charset latin1 collate latin1_swedish_ci, + primary key(id) +) auto_increment=1; + +insert into onlineddl_test values (null, md5(rand()), md5(rand()), md5(rand()), md5(rand()), md5(rand())); +insert into onlineddl_test values (null, 'átesting', 'átesting', 'átesting', 'átesting', 'átesting'); +insert into onlineddl_test values (null, 'testátest', 'testátest', 'testátest', '🍻😀', 'átesting'); +insert into onlineddl_test values (null, 'átesting-binlog', 'átesting-binlog', 'átesting-binlog', 'átesting-binlog', 'átesting-binlog'); +insert into onlineddl_test values (null, 'testátest-binlog', 'testátest-binlog', 'testátest-binlog', '🍻😀', 'átesting-binlog'); +insert into onlineddl_test values (null, 'átesting-bnull', 'átesting-bnull', 'átesting-bnull', null, null); + +drop event if exists onlineddl_test; diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/ignore_versions b/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/ignore_versions new file mode 100644 index 00000000000..0790a1e68fd --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/alter-charset-non-utf8-80-vcopier/ignore_versions @@ -0,0 +1 @@ +(5.5|5.6|5.7) diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-different-pk-new-pk-column/expect_failure b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-different-pk-new-pk-column/expect_failure index ae3584915dd..5e227f16a3c 100644 --- a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-different-pk-new-pk-column/expect_failure +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-different-pk-new-pk-column/expect_failure @@ -1 +1 @@ -Found no possible +found no possible diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-drop-pk/expect_failure b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-drop-pk/expect_failure index ae3584915dd..5e227f16a3c 100644 --- a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-drop-pk/expect_failure +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-drop-pk/expect_failure @@ -1 +1 @@ -Found no possible +found no possible diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-float-unique-key/create.sql b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-float-unique-key/create.sql index abd7fbd4266..3712a673838 100644 --- a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-float-unique-key/create.sql +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-float-unique-key/create.sql @@ -1,6 +1,6 @@ drop table if exists onlineddl_test; create table onlineddl_test ( - f float, + f float not null, i int not null, ts timestamp default current_timestamp, dt datetime, diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-float-unique-key/expect_failure b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-float-unique-key/expect_failure index ae3584915dd..5e227f16a3c 100644 --- a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-float-unique-key/expect_failure +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-float-unique-key/expect_failure @@ -1 +1 @@ -Found no possible +found no possible diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-no-unique-key/expect_failure b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-no-unique-key/expect_failure index ae3584915dd..5e227f16a3c 100644 --- a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-no-unique-key/expect_failure +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-no-unique-key/expect_failure @@ -1 +1 @@ -Found no possible +found no possible diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-nullable-unique-key/alter b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-nullable-unique-key/alter new file mode 100644 index 00000000000..0d2477f5801 --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-nullable-unique-key/alter @@ -0,0 +1 @@ +add column v varchar(32) diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-nullable-unique-key/create.sql b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-nullable-unique-key/create.sql new file mode 100644 index 00000000000..71f112d33c2 --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-nullable-unique-key/create.sql @@ -0,0 +1,11 @@ +drop table if exists onlineddl_test; +create table onlineddl_test ( + id int, + i int not null, + ts timestamp default current_timestamp, + dt datetime, + key i_idx(i), + unique key id_uidx(id) +) auto_increment=1; + +drop event if exists onlineddl_test; diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-nullable-unique-key/expect_failure b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-nullable-unique-key/expect_failure new file mode 100644 index 00000000000..5e227f16a3c --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/fail-nullable-unique-key/expect_failure @@ -0,0 +1 @@ +found no possible diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/non-utf8-charset-pk/allow_schemadiff_normalization b/go/test/endtoend/onlineddl/vrepl_suite/testdata/non-utf8-charset-pk/allow_schemadiff_normalization new file mode 100644 index 00000000000..e69de29bb2d diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/non-utf8-charset-pk/create.sql b/go/test/endtoend/onlineddl/vrepl_suite/testdata/non-utf8-charset-pk/create.sql new file mode 100644 index 00000000000..c0313e62c8d --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/non-utf8-charset-pk/create.sql @@ -0,0 +1,30 @@ +drop table if exists onlineddl_test; +create table onlineddl_test ( + id varchar(128) charset latin1 collate latin1_swedish_ci, + t1 varchar(128) charset latin1 collate latin1_swedish_ci, + t2 varchar(128) charset latin1 collate latin1_swedish_ci, + tutf8 varchar(128) charset utf8, + tutf8mb4 varchar(128) charset utf8mb4, + tlatin1 varchar(128) charset latin1 collate latin1_swedish_ci, + primary key(id) +) auto_increment=1; + +insert into onlineddl_test values (concat('átesting-', md5(rand())), md5(rand()), md5(rand()), md5(rand()), md5(rand()), md5(rand())); +insert into onlineddl_test values (concat('átesting-', md5(rand())), 'átesting', 'átesting', 'átesting', 'átesting', 'átesting'); +insert into onlineddl_test values (concat('átesting-', md5(rand())), 'testátest', 'testátest', 'testátest', '🍻😀', 'átesting'); + +drop event if exists onlineddl_test; +delimiter ;; +create event onlineddl_test + on schedule every 1 second + starts current_timestamp + ends current_timestamp + interval 60 second + on completion not preserve + enable + do +begin + insert into onlineddl_test values (concat('átesting-', md5(rand())), md5(rand()), md5(rand()), md5(rand()), md5(rand()), md5(rand())); + insert into onlineddl_test values (concat('átesting-', md5(rand())), 'átesting-binlog', 'átesting-binlog', 'átesting-binlog', 'átesting-binlog', 'átesting-binlog'); + insert into onlineddl_test values (concat('átesting-', md5(rand())), 'testátest-binlog', 'testátest-binlog', 'testátest-binlog', '🍻😀', 'átesting-binlog'); + insert into onlineddl_test values (concat('átesting-', md5(rand())), 'átesting-bnull', 'átesting-bnull', 'átesting-bnull', null, null); +end ;; diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/non-utf8-charset-pk/ignore_versions b/go/test/endtoend/onlineddl/vrepl_suite/testdata/non-utf8-charset-pk/ignore_versions new file mode 100644 index 00000000000..0790a1e68fd --- /dev/null +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/non-utf8-charset-pk/ignore_versions @@ -0,0 +1 @@ +(5.5|5.6|5.7) diff --git a/go/test/endtoend/onlineddl/vrepl_suite/testdata/swap-uk-uk/alter b/go/test/endtoend/onlineddl/vrepl_suite/testdata/swap-uk-uk/alter index 6286a960e61..7e914680519 100644 --- a/go/test/endtoend/onlineddl/vrepl_suite/testdata/swap-uk-uk/alter +++ b/go/test/endtoend/onlineddl/vrepl_suite/testdata/swap-uk-uk/alter @@ -1 +1 @@ -drop key id_uidx, drop key its_uidx, add unique key its2_uidx(i, ts), add unique key id2_uidx(id) +drop key id_uidx, drop key its_uidx, add unique key id2_uidx(id), add unique key its2_uidx(i, ts) diff --git a/go/test/endtoend/onlineddl/vtgate_util.go b/go/test/endtoend/onlineddl/vtgate_util.go index 2cbdbebc2f3..639b3ce8eb4 100644 --- a/go/test/endtoend/onlineddl/vtgate_util.go +++ b/go/test/endtoend/onlineddl/vtgate_util.go @@ -66,6 +66,29 @@ func VtgateExecQuery(t *testing.T, vtParams *mysql.ConnParams, query string, exp return qr } +// VtgateExecQueryInTransaction runs a query on VTGate using given query params, inside a transaction +func VtgateExecQueryInTransaction(t *testing.T, vtParams *mysql.ConnParams, query string, expectError string) *sqltypes.Result { + t.Helper() + + ctx := context.Background() + conn, err := mysql.Connect(ctx, vtParams) + require.Nil(t, err) + defer conn.Close() + + _, err = conn.ExecuteFetch("begin", -1, true) + require.NoError(t, err) + qr, err := conn.ExecuteFetch(query, -1, true) + if expectError == "" { + require.NoError(t, err) + } else { + require.Error(t, err, "error should not be nil") + assert.Contains(t, err.Error(), expectError, "Unexpected error") + } + _, err = conn.ExecuteFetch("commit", -1, true) + require.NoError(t, err) + return qr +} + // VtgateExecDDL executes a DDL query with given strategy func VtgateExecDDL(t *testing.T, vtParams *mysql.ConnParams, ddlStrategy string, query string, expectError string) *sqltypes.Result { t.Helper() @@ -194,6 +217,18 @@ func CheckCancelAllMigrations(t *testing.T, vtParams *mysql.ConnParams, expectCo } } +// CheckCleanupAllMigrations cleans up all applicable migrations and expect number of affected rows +// A negative value for expectCount indicates "don't care, no need to check" +func CheckCleanupAllMigrations(t *testing.T, vtParams *mysql.ConnParams, expectCount int) uint64 { + cleanupQuery := "alter vitess_migration cleanup all" + r := VtgateExecQuery(t, vtParams, cleanupQuery, "") + + if expectCount >= 0 { + assert.Equal(t, expectCount, int(r.RowsAffected)) + } + return r.RowsAffected +} + // CheckLaunchAllMigrations launches all queued posponed migrations and expect number of affected rows // A negative value for expectCount indicates "don't care, no need to check" func CheckLaunchAllMigrations(t *testing.T, vtParams *mysql.ConnParams, expectCount int) { @@ -222,7 +257,8 @@ func CheckForceMigrationCutOver(t *testing.T, vtParams *mysql.ConnParams, shards // CheckMigrationStatus verifies that the migration indicated by given UUID has the given expected status func CheckMigrationStatus(t *testing.T, vtParams *mysql.ConnParams, shards []cluster.Shard, uuid string, expectStatuses ...schema.OnlineDDLStatus) bool { - query, err := sqlparser.ParseAndBind("show vitess_migrations like %a", + ksName := shards[0].PrimaryTablet().VttabletProcess.Keyspace + query, err := sqlparser.ParseAndBind(fmt.Sprintf("show vitess_migrations from %s like %%a", ksName), sqltypes.StringBindVariable(uuid), ) require.NoError(t, err) diff --git a/go/test/endtoend/reparent/plannedreparent/reparent_test.go b/go/test/endtoend/reparent/plannedreparent/reparent_test.go index ae9bd6bbc9b..d3907b0bc5b 100644 --- a/go/test/endtoend/reparent/plannedreparent/reparent_test.go +++ b/go/test/endtoend/reparent/plannedreparent/reparent_test.go @@ -125,14 +125,8 @@ func TestReparentReplicaOffline(t *testing.T) { require.Error(t, err) // Assert that PRS failed - if clusterInstance.VtctlMajorVersion <= 17 { - assert.True(t, utils.SetReplicationSourceFailed(tablets[3], out)) - utils.CheckPrimaryTablet(t, clusterInstance, tablets[1]) - } else { - assert.Contains(t, out, "rpc error: code = DeadlineExceeded desc") - utils.CheckPrimaryTablet(t, clusterInstance, tablets[0]) - } - + assert.Contains(t, out, "rpc error: code = DeadlineExceeded desc") + utils.CheckPrimaryTablet(t, clusterInstance, tablets[0]) } func TestReparentAvoid(t *testing.T) { @@ -155,20 +149,32 @@ func TestReparentAvoid(t *testing.T) { require.NoError(t, err) utils.ValidateTopology(t, clusterInstance, false) - // tablets[1 is in the same cell and tablets[3] is in a different cell, so we must land on tablets[1 + // tablets[1] is in the same cell and tablets[3] is in a different cell, so we must land on tablets[1] utils.CheckPrimaryTablet(t, clusterInstance, tablets[1]) // If we kill the tablet in the same cell as primary then reparent --avoid_tablet will fail. utils.StopTablet(t, tablets[0], true) out, err := utils.PrsAvoid(t, clusterInstance, tablets[1]) require.Error(t, err) - if clusterInstance.VtctlMajorVersion <= 17 { - assert.Contains(t, out, "cannot find a tablet to reparent to in the same cell as the current primary") - } else { - assert.Contains(t, out, "rpc error: code = DeadlineExceeded desc = latest balancer error") - } + assert.Contains(t, out, "rpc error: code = DeadlineExceeded desc = latest balancer error") utils.ValidateTopology(t, clusterInstance, false) utils.CheckPrimaryTablet(t, clusterInstance, tablets[1]) + + t.Run("Allow cross cell promotion", func(t *testing.T) { + if clusterInstance.VtctlMajorVersion <= 20 { + t.Skip("Allow Cross Cell Promotion was added in v21") + } + utils.DeleteTablet(t, clusterInstance, tablets[0]) + // Perform a graceful reparent operation and verify it fails because we have no replicas in the same cell as the primary. + out, err = utils.PrsAvoid(t, clusterInstance, tablets[1]) + require.Error(t, err) + assert.Contains(t, out, "is not in the same cell as the previous primary") + + // If we run PRS with allow cross cell promotion then it should succeed and should promote the replica in another cell. + _, err = utils.PrsAvoid(t, clusterInstance, tablets[1], "--allow-cross-cell-promotion") + require.NoError(t, err) + utils.CheckPrimaryTablet(t, clusterInstance, tablets[3]) + }) } func TestReparentFromOutside(t *testing.T) { @@ -199,13 +205,13 @@ func TestReparentFromOutsideWithNoPrimary(t *testing.T) { } func reparentFromOutside(t *testing.T, clusterInstance *cluster.LocalProcessCluster, downPrimary bool) { - //This test will start a primary and 3 replicas. - //Then: - //- one replica will be the new primary - //- one replica will be reparented to that new primary - //- one replica will be busted and dead in the water and we'll call TabletExternallyReparented. - //Args: - //downPrimary: kills the old primary first + // This test will start a primary and 3 replicas. + // Then: + // - one replica will be the new primary + // - one replica will be reparented to that new primary + // - one replica will be busted and dead in the water and we'll call TabletExternallyReparented. + // Args: + // downPrimary: kills the old primary first ctx := context.Background() tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets @@ -218,7 +224,7 @@ func reparentFromOutside(t *testing.T, clusterInstance *cluster.LocalProcessClus demoteCommands := []string{"SET GLOBAL read_only = ON", "FLUSH TABLES WITH READ LOCK", "UNLOCK TABLES"} utils.RunSQLs(ctx, t, demoteCommands, tablets[0]) - //Get the position of the old primary and wait for the new one to catch up. + // Get the position of the old primary and wait for the new one to catch up. err := utils.WaitForReplicationPosition(t, tablets[0], tablets[1]) require.NoError(t, err) } @@ -297,17 +303,14 @@ func TestReparentWithDownReplica(t *testing.T) { // Perform a graceful reparent operation. It will fail as one tablet is down. out, err := utils.Prs(t, clusterInstance, tablets[1]) require.Error(t, err) - var insertVal int // Assert that PRS failed - if clusterInstance.VtctlMajorVersion <= 17 { - assert.True(t, utils.SetReplicationSourceFailed(tablets[2], out)) - // insert data into the new primary, check the connected replica work - insertVal = utils.ConfirmReplication(t, tablets[1], []*cluster.Vttablet{tablets[0], tablets[3]}) - } else { + if clusterInstance.VtctlMajorVersion <= 20 { assert.Contains(t, out, fmt.Sprintf("TabletManager.PrimaryStatus on %s", tablets[2].Alias)) - // insert data into the old primary, check the connected replica works. The primary tablet shouldn't have changed. - insertVal = utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[3]}) + } else { + assert.Contains(t, out, fmt.Sprintf("TabletManager.GetGlobalStatusVars on %s", tablets[2].Alias)) } + // insert data into the old primary, check the connected replica works. The primary tablet shouldn't have changed. + insertVal := utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[3]}) // restart mysql on the old replica, should still be connecting to the old primary tablets[2].MysqlctlProcess.InitMysql = false @@ -457,14 +460,7 @@ func TestFullStatus(t *testing.T) { assert.Contains(t, primaryStatus.PrimaryStatus.String(), "vt-0000000101-bin") assert.Equal(t, primaryStatus.GtidPurged, "MySQL56/") assert.False(t, primaryStatus.ReadOnly) - vtTabletVersion, err := cluster.GetMajorVersion("vttablet") - require.NoError(t, err) - vtcltlVersion, err := cluster.GetMajorVersion("vtctl") - require.NoError(t, err) - // For all version at or above v17.0.0, each replica will start in super_read_only mode. - if vtTabletVersion >= 17 && vtcltlVersion >= 17 { - assert.False(t, primaryStatus.SuperReadOnly) - } + assert.False(t, primaryStatus.SuperReadOnly) assert.True(t, primaryStatus.SemiSyncPrimaryEnabled) assert.True(t, primaryStatus.SemiSyncReplicaEnabled) assert.True(t, primaryStatus.SemiSyncPrimaryStatus) @@ -477,7 +473,7 @@ func TestFullStatus(t *testing.T) { assert.Equal(t, "ON", primaryStatus.GtidMode) assert.True(t, primaryStatus.LogReplicaUpdates) assert.True(t, primaryStatus.LogBinEnabled) - assert.Regexp(t, `[58]\.[07].*`, primaryStatus.Version) + assert.Regexp(t, `[58]\.[074].*`, primaryStatus.Version) assert.NotEmpty(t, primaryStatus.VersionComment) replicaTablet := tablets[1] @@ -518,10 +514,7 @@ func TestFullStatus(t *testing.T) { assert.Contains(t, replicaStatus.PrimaryStatus.String(), "vt-0000000102-bin") assert.Equal(t, replicaStatus.GtidPurged, "MySQL56/") assert.True(t, replicaStatus.ReadOnly) - // For all version at or above v17.0.0, each replica will start in super_read_only mode. - if vtTabletVersion >= 17 && vtcltlVersion >= 17 { - assert.True(t, replicaStatus.SuperReadOnly) - } + assert.True(t, replicaStatus.SuperReadOnly) assert.False(t, replicaStatus.SemiSyncPrimaryEnabled) assert.True(t, replicaStatus.SemiSyncReplicaEnabled) assert.False(t, replicaStatus.SemiSyncPrimaryStatus) @@ -534,7 +527,7 @@ func TestFullStatus(t *testing.T) { assert.Equal(t, "ON", replicaStatus.GtidMode) assert.True(t, replicaStatus.LogReplicaUpdates) assert.True(t, replicaStatus.LogBinEnabled) - assert.Regexp(t, `[58]\.[07].*`, replicaStatus.Version) + assert.Regexp(t, `[58]\.[074].*`, replicaStatus.Version) assert.NotEmpty(t, replicaStatus.VersionComment) } diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index 5038352d721..0d3eddc0464 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -293,17 +293,17 @@ func execute(t *testing.T, conn *mysql.Conn, query string) *sqltypes.Result { // region ers, prs // Prs runs PRS -func Prs(t *testing.T, clusterInstance *cluster.LocalProcessCluster, tab *cluster.Vttablet) (string, error) { - return PrsWithTimeout(t, clusterInstance, tab, false, "", "") +func Prs(t *testing.T, clusterInstance *cluster.LocalProcessCluster, tab *cluster.Vttablet, extraArgs ...string) (string, error) { + return PrsWithTimeout(t, clusterInstance, tab, false, "", "", extraArgs...) } // PrsAvoid runs PRS -func PrsAvoid(t *testing.T, clusterInstance *cluster.LocalProcessCluster, tab *cluster.Vttablet) (string, error) { - return PrsWithTimeout(t, clusterInstance, tab, true, "", "") +func PrsAvoid(t *testing.T, clusterInstance *cluster.LocalProcessCluster, tab *cluster.Vttablet, extraArgs ...string) (string, error) { + return PrsWithTimeout(t, clusterInstance, tab, true, "", "", extraArgs...) } // PrsWithTimeout runs PRS -func PrsWithTimeout(t *testing.T, clusterInstance *cluster.LocalProcessCluster, tab *cluster.Vttablet, avoid bool, actionTimeout, waitTimeout string) (string, error) { +func PrsWithTimeout(t *testing.T, clusterInstance *cluster.LocalProcessCluster, tab *cluster.Vttablet, avoid bool, actionTimeout, waitTimeout string, extraArgs ...string) (string, error) { args := []string{ "PlannedReparentShard", fmt.Sprintf("%s/%s", KeyspaceName, ShardName)} @@ -319,6 +319,7 @@ func PrsWithTimeout(t *testing.T, clusterInstance *cluster.LocalProcessCluster, args = append(args, "--new-primary") } args = append(args, tab.Alias) + args = append(args, extraArgs...) out, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput(args...) return out, err } diff --git a/go/test/endtoend/schemadiff/vrepl/schemadiff_vrepl_suite_test.go b/go/test/endtoend/schemadiff/vrepl/schemadiff_vrepl_suite_test.go index 496956f2838..b4ecb367e8b 100644 --- a/go/test/endtoend/schemadiff/vrepl/schemadiff_vrepl_suite_test.go +++ b/go/test/endtoend/schemadiff/vrepl/schemadiff_vrepl_suite_test.go @@ -131,7 +131,7 @@ func TestMain(m *testing.M) { } -func TestSchemaChange(t *testing.T) { +func TestSchemadiffSchemaChanges(t *testing.T) { defer cluster.PanicHandler(t) shards := clusterInstance.Keyspaces[0].Shards diff --git a/go/test/endtoend/sharded/sharded_keyspace_test.go b/go/test/endtoend/sharded/sharded_keyspace_test.go index f311404ad7e..192355fa6ef 100644 --- a/go/test/endtoend/sharded/sharded_keyspace_test.go +++ b/go/test/endtoend/sharded/sharded_keyspace_test.go @@ -84,7 +84,7 @@ func TestMain(m *testing.M) { if err := clusterInstance.StartTopo(); err != nil { return 1, err } - if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName); err != nil { + if err := clusterInstance.VtctlProcess.CreateKeyspace(keyspaceName, sidecar.DefaultName, ""); err != nil { return 1, err } diff --git a/go/test/endtoend/tabletmanager/commands_test.go b/go/test/endtoend/tabletmanager/commands_test.go index e89a471b1e4..d5d946a164c 100644 --- a/go/test/endtoend/tabletmanager/commands_test.go +++ b/go/test/endtoend/tabletmanager/commands_test.go @@ -75,6 +75,24 @@ func TestTabletCommands(t *testing.T) { require.Nil(t, err) assertExecuteMultiFetch(t, result) }) + + t.Run("GetUnresolvedTransactions", func(t *testing.T) { + _, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("DistributedTransaction", "unresolved-list", + "--keyspace", keyspaceName) + require.NoError(t, err) + }) + t.Run("GetUnresolvedTransactions with age threshold", func(t *testing.T) { + _, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("DistributedTransaction", "unresolved-list", + "--keyspace", keyspaceName, + "--abandon-age", "32") + require.NoError(t, err) + }) + t.Run("ConcludeTransaction", func(t *testing.T) { + output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("DistributedTransaction", "conclude", "--dtid", "ks:0:1234") + assert.NoError(t, err) + assert.Contains(t, output, "Successfully concluded the distributed transaction") + }) + // check Ping / RefreshState / RefreshStateByShard err = clusterInstance.VtctldClientProcess.ExecuteCommand("PingTablet", primaryTablet.Alias) require.Nil(t, err, "error should be Nil") diff --git a/go/test/endtoend/tabletmanager/main_test.go b/go/test/endtoend/tabletmanager/main_test.go index 52feaec0e17..3c2eb68df5e 100644 --- a/go/test/endtoend/tabletmanager/main_test.go +++ b/go/test/endtoend/tabletmanager/main_test.go @@ -105,6 +105,8 @@ func TestMain(m *testing.M) { "--heartbeat_enable", "--health_check_interval", tabletHealthcheckRefreshInterval.String(), "--unhealthy_threshold", tabletUnhealthyThreshold.String(), + "--twopc_enable", + "--twopc_abandon_age", "200", } // Start keyspace diff --git a/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go b/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go index 86b02244762..df8c1f26c4e 100644 --- a/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go +++ b/go/test/endtoend/tabletmanager/replication_manager/tablet_test.go @@ -205,3 +205,13 @@ func TestReplicationRepairAfterPrimaryTabletChange(t *testing.T) { // sidecardb should find the desired _vt schema and not apply any new creates or upgrades when the tablet comes up again require.Equal(t, sidecarDDLCount, int64(0)) } + +func TestReparentJournalInfo(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + for _, vttablet := range clusterInstance.Keyspaces[0].Shards[0].Vttablets { + length, err := tmClient.ReadReparentJournalInfo(ctx, getTablet(vttablet.GrpcPort)) + require.NoError(t, err) + require.EqualValues(t, 1, length) + } +} diff --git a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go index 89649f2ce4c..08cea643940 100644 --- a/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go +++ b/go/test/endtoend/tabletmanager/throttler_topo/throttler_test.go @@ -38,6 +38,7 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) @@ -203,18 +204,18 @@ func throttleStatus(t *testing.T, tablet *cluster.Vttablet) string { return string(b) } -func warmUpHeartbeat(t *testing.T) (respStatus int) { +func warmUpHeartbeat(t *testing.T) tabletmanagerdatapb.CheckThrottlerResponseCode { // because we run with -heartbeat_on_demand_duration=5s, the heartbeat is "cold" right now. // Let's warm it up. resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) time.Sleep(time.Second) - return int(resp.Check.StatusCode) + return throttle.ResponseCodeFromStatus(resp.Check.ResponseCode, int(resp.Check.StatusCode)) } // waitForThrottleCheckStatus waits for the tablet to return the provided HTTP code in a throttle check -func waitForThrottleCheckStatus(t *testing.T, tablet *cluster.Vttablet, wantCode int) bool { +func waitForThrottleCheckStatus(t *testing.T, tablet *cluster.Vttablet, wantCode tabletmanagerdatapb.CheckThrottlerResponseCode) bool { _ = warmUpHeartbeat(t) ctx, cancel := context.WithTimeout(context.Background(), onDemandHeartbeatDuration*4) defer cancel() @@ -225,7 +226,7 @@ func waitForThrottleCheckStatus(t *testing.T, tablet *cluster.Vttablet, wantCode resp, err := throttleCheck(tablet, true) require.NoError(t, err) - if wantCode == int(resp.Check.StatusCode) { + if wantCode == resp.Check.ResponseCode { // Wait for any cached check values to be cleared and the new // status value to be in effect everywhere before returning. return true @@ -260,7 +261,7 @@ func TestInitialThrottler(t *testing.T) { defer cluster.PanicHandler(t) t.Run("validating OK response from disabled throttler", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("enabling throttler with very low threshold", func(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Enable: true, Threshold: unreasonablyLowThreshold.Seconds()} @@ -273,7 +274,7 @@ func TestInitialThrottler(t *testing.T) { } }) t.Run("validating pushback response from throttler", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) t.Run("disabling throttler", func(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Disable: true, Threshold: unreasonablyLowThreshold.Seconds()} @@ -286,7 +287,7 @@ func TestInitialThrottler(t *testing.T) { } }) t.Run("validating OK response from disabled throttler, again", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("enabling throttler, again", func(t *testing.T) { // Enable the throttler again with the default query which also moves us back @@ -301,7 +302,7 @@ func TestInitialThrottler(t *testing.T) { } }) t.Run("validating pushback response from throttler, again", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) t.Run("setting high threshold", func(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Threshold: extremelyHighThreshold.Seconds()} @@ -314,7 +315,7 @@ func TestInitialThrottler(t *testing.T) { } }) t.Run("validating OK response from throttler with high threshold", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("setting low threshold", func(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Threshold: throttler.DefaultThreshold.Seconds()} @@ -327,11 +328,11 @@ func TestInitialThrottler(t *testing.T) { } }) t.Run("validating pushback response from throttler on low threshold", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) t.Run("requesting heartbeats", func(t *testing.T) { respStatus := warmUpHeartbeat(t) - assert.NotEqual(t, http.StatusOK, respStatus) + assert.NotEqual(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, respStatus) }) t.Run("validating OK response from throttler with low threshold, heartbeats running", func(t *testing.T) { time.Sleep(1 * time.Second) @@ -350,6 +351,13 @@ func TestInitialThrottler(t *testing.T) { t.Logf("throttler primary status: %+v", throttleStatus(t, primaryTablet)) t.Logf("throttler replica status: %+v", throttleStatus(t, replicaTablet)) } + if !assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) { + rs, err := replicaTablet.VttabletProcess.QueryTablet("show replica status", keyspaceName, false) + assert.NoError(t, err) + t.Logf("Seconds_Behind_Source: %s", rs.Named().Row()["Seconds_Behind_Source"].ToString()) + t.Logf("throttler primary status: %+v", throttleStatus(t, primaryTablet)) + t.Logf("throttler replica status: %+v", throttleStatus(t, replicaTablet)) + } }) t.Run("validating OK response from throttler with low threshold, heartbeats running still", func(t *testing.T) { @@ -368,10 +376,17 @@ func TestInitialThrottler(t *testing.T) { t.Logf("throttler primary status: %+v", throttleStatus(t, primaryTablet)) t.Logf("throttler replica status: %+v", throttleStatus(t, replicaTablet)) } + if !assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) { + rs, err := replicaTablet.VttabletProcess.QueryTablet("show replica status", keyspaceName, false) + assert.NoError(t, err) + t.Logf("Seconds_Behind_Source: %s", rs.Named().Row()["Seconds_Behind_Source"].ToString()) + t.Logf("throttler primary status: %+v", throttleStatus(t, primaryTablet)) + t.Logf("throttler replica status: %+v", throttleStatus(t, replicaTablet)) + } }) t.Run("validating pushback response from throttler on low threshold once heartbeats go stale", func(t *testing.T) { time.Sleep(2 * onDemandHeartbeatDuration) // just... really wait long enough, make sure on-demand stops - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) } @@ -424,7 +439,7 @@ func TestThrottlerAfterMetricsCollected(t *testing.T) { // By this time metrics will have been collected. We expect no lag, and something like: // {"StatusCode":200,"Value":0.282278,"Threshold":1,"Message":""} t.Run("validating throttler OK", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("validating throttled apps", func(t *testing.T) { resp, body, err := throttledApps(primaryTablet) @@ -437,11 +452,13 @@ func TestThrottlerAfterMetricsCollected(t *testing.T) { resp, err := throttleCheckSelf(primaryTablet) require.NoError(t, err) assert.EqualValues(t, http.StatusOK, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) }) t.Run("validating replica check self", func(t *testing.T) { resp, err := throttleCheckSelf(replicaTablet) require.NoError(t, err) assert.EqualValues(t, http.StatusOK, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) }) } @@ -469,6 +486,7 @@ func TestLag(t *testing.T) { resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) assert.EqualValues(t, http.StatusTooManyRequests, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) }) t.Run("primary self-check should still be fine", func(t *testing.T) { resp, err := throttleCheckSelf(primaryTablet) @@ -482,6 +500,10 @@ func TestLag(t *testing.T) { t.Logf("throttler primary status: %+v", throttleStatus(t, primaryTablet)) t.Logf("throttler replica status: %+v", throttleStatus(t, replicaTablet)) } + if !assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) { + t.Logf("throttler primary status: %+v", throttleStatus(t, primaryTablet)) + t.Logf("throttler replica status: %+v", throttleStatus(t, replicaTablet)) + } }) t.Run("replica self-check should show error", func(t *testing.T) { resp, err := throttleCheckSelf(replicaTablet) @@ -491,6 +513,7 @@ func TestLag(t *testing.T) { assert.Equal(t, base.SelfScope.String(), metrics.Scope) } assert.EqualValues(t, http.StatusTooManyRequests, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) }) t.Run("exempting test app", func(t *testing.T) { appRule := &topodatapb.ThrottledAppRule{ @@ -501,7 +524,7 @@ func TestLag(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Threshold: throttler.DefaultThreshold.Seconds()} _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, req, appRule, nil) assert.NoError(t, err) - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("unexempting test app", func(t *testing.T) { appRule := &topodatapb.ThrottledAppRule{ @@ -511,7 +534,7 @@ func TestLag(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Threshold: throttler.DefaultThreshold.Seconds()} _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, req, appRule, nil) assert.NoError(t, err) - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) t.Run("exempting all apps", func(t *testing.T) { appRule := &topodatapb.ThrottledAppRule{ @@ -522,7 +545,7 @@ func TestLag(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Threshold: throttler.DefaultThreshold.Seconds()} _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, req, appRule, nil) assert.NoError(t, err) - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("throttling test app", func(t *testing.T) { appRule := &topodatapb.ThrottledAppRule{ @@ -533,7 +556,7 @@ func TestLag(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Threshold: throttler.DefaultThreshold.Seconds()} _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, req, appRule, nil) assert.NoError(t, err) - waitForThrottleCheckStatus(t, primaryTablet, http.StatusExpectationFailed) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_APP_DENIED) }) t.Run("unthrottling test app", func(t *testing.T) { appRule := &topodatapb.ThrottledAppRule{ @@ -543,7 +566,7 @@ func TestLag(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Threshold: throttler.DefaultThreshold.Seconds()} _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, req, appRule, nil) assert.NoError(t, err) - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("unexempting all apps", func(t *testing.T) { appRule := &topodatapb.ThrottledAppRule{ @@ -553,7 +576,7 @@ func TestLag(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Threshold: throttler.DefaultThreshold.Seconds()} _, err := throttler.UpdateThrottlerTopoConfig(clusterInstance, req, appRule, nil) assert.NoError(t, err) - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) t.Run("starting replication", func(t *testing.T) { @@ -561,18 +584,20 @@ func TestLag(t *testing.T) { assert.NoError(t, err) }) t.Run("expecting replication to catch up and throttler check to return OK", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("primary self-check should be fine", func(t *testing.T) { resp, err := throttleCheckSelf(primaryTablet) require.NoError(t, err) // self (on primary) is unaffected by replication lag assert.EqualValues(t, http.StatusOK, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) }) t.Run("replica self-check should be fine", func(t *testing.T) { resp, err := throttleCheckSelf(replicaTablet) require.NoError(t, err) assert.EqualValues(t, http.StatusOK, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) }) } @@ -584,13 +609,13 @@ func TestNoReplicas(t *testing.T) { // This makes no REPLICA servers available. We expect something like: // {"StatusCode":200,"Value":0,"Threshold":1,"Message":""} - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("restoring to REPLICA", func(t *testing.T) { err := clusterInstance.VtctldClientProcess.ExecuteCommand("ChangeTabletType", replicaTablet.Alias, "REPLICA") assert.NoError(t, err) - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) } @@ -617,6 +642,7 @@ func TestCustomQuery(t *testing.T) { resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) assert.EqualValues(t, http.StatusOK, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) }) t.Run("test threads running", func(t *testing.T) { sleepDuration := 20 * time.Second @@ -638,22 +664,24 @@ func TestCustomQuery(t *testing.T) { // Now we should be reporting ~ customThreshold+1 threads_running, and we should // hit the threshold. For example: // {"StatusCode":429,"Value":6,"Threshold":5,"Message":"Threshold exceeded"} - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) { resp, err := throttleCheckSelf(primaryTablet) require.NoError(t, err) assert.EqualValues(t, http.StatusTooManyRequests, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) } }) t.Run("wait for queries to terminate", func(t *testing.T) { wg.Wait() }) t.Run("restored below threshold", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) { resp, err := throttleCheckSelf(primaryTablet) require.NoError(t, err) assert.EqualValues(t, http.StatusOK, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) } }) }) @@ -677,10 +705,11 @@ func TestRestoreDefaultQuery(t *testing.T) { resp, err := throttleCheck(primaryTablet, false) require.NoError(t, err) assert.EqualValues(t, http.StatusOK, resp.Check.StatusCode, "Unexpected response from throttler: %+v", resp) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, resp.Check.ResponseCode, "Unexpected response from throttler: %+v", resp) }) t.Run("validating pushback response from throttler on default threshold once heartbeats go stale", func(t *testing.T) { time.Sleep(2 * onDemandHeartbeatDuration) // just... really wait long enough, make sure on-demand stops - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) } @@ -693,7 +722,7 @@ func TestUpdateMetricThresholds(t *testing.T) { for _, tablet := range []cluster.Vttablet{*primaryTablet, *replicaTablet} { throttler.WaitForThrottlerStatusEnabled(t, &clusterInstance.VtctldClientProcess, &tablet, true, &throttler.Config{Query: throttler.DefaultQuery, Threshold: throttler.DefaultThreshold.Seconds()}, throttlerEnabledTimeout) } - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) t.Run("setting low general threshold, and high threshold for 'lag' metric", func(t *testing.T) { { @@ -713,7 +742,7 @@ func TestUpdateMetricThresholds(t *testing.T) { }) t.Run("validating OK response from throttler thanks to high 'lag' threshold", func(t *testing.T) { // Note that the default threshold is extremely low, but gets overriden. - waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) }) t.Run("removing explicit 'lag' threshold", func(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{MetricName: "lag", Threshold: 0} @@ -721,7 +750,7 @@ func TestUpdateMetricThresholds(t *testing.T) { assert.NoError(t, err) }) t.Run("validating pushback from throttler again", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) t.Run("restoring standard threshold", func(t *testing.T) { req := &vtctldatapb.UpdateThrottlerConfigRequest{Threshold: throttler.DefaultThreshold.Seconds()} @@ -731,7 +760,7 @@ func TestUpdateMetricThresholds(t *testing.T) { for _, tablet := range []cluster.Vttablet{*primaryTablet, *replicaTablet} { throttler.WaitForThrottlerStatusEnabled(t, &clusterInstance.VtctldClientProcess, &tablet, true, &throttler.Config{Query: throttler.DefaultQuery, Threshold: throttler.DefaultThreshold.Seconds()}, throttlerEnabledTimeout) } - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) } @@ -748,7 +777,7 @@ func TestUpdateAppCheckedMetrics(t *testing.T) { for _, tablet := range []cluster.Vttablet{*primaryTablet, *replicaTablet} { throttler.WaitForThrottlerStatusEnabled(t, &clusterInstance.VtctldClientProcess, &tablet, true, &throttler.Config{Query: throttler.DefaultQuery, Threshold: throttler.DefaultThreshold.Seconds()}, throttlerEnabledTimeout) } - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) t.Run("assigning 'loadavg' metrics to 'test' app", func(t *testing.T) { { @@ -774,7 +803,7 @@ func TestUpdateAppCheckedMetrics(t *testing.T) { throttler.WaitForThrottlerStatusEnabled(t, &clusterInstance.VtctldClientProcess, &tablet, true, &throttler.Config{Query: throttler.DefaultQuery, Threshold: unreasonablyLowThreshold.Seconds()}, throttlerEnabledTimeout) } t.Run("validating OK response from throttler since it's checking loadavg", func(t *testing.T) { - if !waitForThrottleCheckStatus(t, primaryTablet, http.StatusOK) { + if !waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_OK) { t.Logf("throttler primary status: %+v", throttleStatus(t, primaryTablet)) t.Logf("throttler replica status: %+v", throttleStatus(t, replicaTablet)) } @@ -799,7 +828,7 @@ func TestUpdateAppCheckedMetrics(t *testing.T) { throttler.WaitForThrottlerStatusEnabled(t, &clusterInstance.VtctldClientProcess, &tablet, true, &throttler.Config{Query: throttler.DefaultQuery, Threshold: unreasonablyLowThreshold.Seconds()}, throttlerEnabledTimeout) } t.Run("validating pushback from throttler since lag is above threshold", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) }) t.Run("removing assignment from 'test' app and restoring defaults", func(t *testing.T) { @@ -826,7 +855,7 @@ func TestUpdateAppCheckedMetrics(t *testing.T) { throttler.WaitForThrottlerStatusEnabled(t, &clusterInstance.VtctldClientProcess, &tablet, true, &throttler.Config{Query: throttler.DefaultQuery, Threshold: throttler.DefaultThreshold.Seconds()}, throttlerEnabledTimeout) } t.Run("validating error response from throttler since lag is still high", func(t *testing.T) { - waitForThrottleCheckStatus(t, primaryTablet, http.StatusTooManyRequests) + waitForThrottleCheckStatus(t, primaryTablet, tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED) }) }) } diff --git a/go/test/endtoend/vtgate/transaction/restart/main_test.go b/go/test/endtoend/transaction/restart/main_test.go similarity index 100% rename from go/test/endtoend/vtgate/transaction/restart/main_test.go rename to go/test/endtoend/transaction/restart/main_test.go diff --git a/go/test/endtoend/vtgate/transaction/restart/schema.sql b/go/test/endtoend/transaction/restart/schema.sql similarity index 100% rename from go/test/endtoend/vtgate/transaction/restart/schema.sql rename to go/test/endtoend/transaction/restart/schema.sql diff --git a/go/test/endtoend/vtgate/transaction/rollback/txn_rollback_shutdown_test.go b/go/test/endtoend/transaction/rollback/txn_rollback_shutdown_test.go similarity index 100% rename from go/test/endtoend/vtgate/transaction/rollback/txn_rollback_shutdown_test.go rename to go/test/endtoend/transaction/rollback/txn_rollback_shutdown_test.go diff --git a/go/test/endtoend/vtgate/transaction/schema.sql b/go/test/endtoend/transaction/schema.sql similarity index 100% rename from go/test/endtoend/vtgate/transaction/schema.sql rename to go/test/endtoend/transaction/schema.sql diff --git a/go/test/endtoend/vtgate/transaction/single/main_test.go b/go/test/endtoend/transaction/single/main_test.go similarity index 100% rename from go/test/endtoend/vtgate/transaction/single/main_test.go rename to go/test/endtoend/transaction/single/main_test.go diff --git a/go/test/endtoend/vtgate/transaction/single/schema.sql b/go/test/endtoend/transaction/single/schema.sql similarity index 100% rename from go/test/endtoend/vtgate/transaction/single/schema.sql rename to go/test/endtoend/transaction/single/schema.sql diff --git a/go/test/endtoend/vtgate/transaction/single/vschema.json b/go/test/endtoend/transaction/single/vschema.json similarity index 100% rename from go/test/endtoend/vtgate/transaction/single/vschema.json rename to go/test/endtoend/transaction/single/vschema.json diff --git a/go/test/endtoend/transaction/twopc/fuzz/fuzzer_test.go b/go/test/endtoend/transaction/twopc/fuzz/fuzzer_test.go new file mode 100644 index 00000000000..75bc46bacab --- /dev/null +++ b/go/test/endtoend/transaction/twopc/fuzz/fuzzer_test.go @@ -0,0 +1,581 @@ +/* +Copyright 2024 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 fuzz + +import ( + "context" + "fmt" + "os" + "path" + "slices" + "strconv" + "strings" + "sync" + "sync/atomic" + "syscall" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/exp/rand" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/syscallutil" + "vitess.io/vitess/go/test/endtoend/cluster" + twopcutil "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" + "vitess.io/vitess/go/vt/log" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/schema" +) + +var ( + // updateRowBaseVals is the base row values that we use to ensure 1 update on each shard with the same increment. + updateRowBaseVals = [3]int{ + 4, // 4 maps to 0x20 and ends up in the first shard (-40) + 6, // 6 maps to 0x60 and ends up in the second shard (40-80) + 9, // 9 maps to 0x90 and ends up in the third shard (80-) + // We can increment all of these values by multiples of 16 and they'll always be in the same shard. + } + + insertIntoFuzzUpdate = "INSERT INTO twopc_fuzzer_update (id, col) VALUES (%d, %d)" + updateFuzzUpdate = "UPDATE twopc_fuzzer_update SET col = col + %d WHERE id = %d" + insertIntoFuzzInsert = "INSERT INTO twopc_fuzzer_insert (id, updateSet, threadId) VALUES (%d, %d, %d)" + selectFromFuzzUpdate = "SELECT col FROM twopc_fuzzer_update WHERE id = %d" + selectIdFromFuzzInsert = "SELECT threadId FROM twopc_fuzzer_insert WHERE updateSet = %d AND id = %d ORDER BY col" +) + +// TestTwoPCFuzzTest tests 2PC transactions in a fuzzer environment. +// The testing strategy involves running many transactions and checking that they all must be atomic. +// To this end, we have a very unique strategy. We have two sharded tables `twopc_fuzzer_update`, and `twopc_fuzzer_insert` with the following columns. +// - id: This is the sharding column. We use reverse_bits as the sharding vindex because it is easy to reason about where a row will end up. +// - col in `twopc_fuzzer_insert`: An auto-increment column. +// - col in `twopc_fuzzer_update`: This is a bigint value that we will use to increment on updates. +// - updateSet: This column will store which update set the inserts where done for. +// - threadId: It stores the thread id of the fuzzer thread that inserted the row. +// +// The testing strategy is as follows - +// Every transaction will do 2 things - +// - One, it will increment the `col` on 1 row in each of the shards of the `twopc_fuzzer_update` table. +// To do this, we have sets of rows that each map to one shard. We prepopulate this before the test starts. +// These sets are stored in the fuzzer in updateRowsVals. +// - Two, it will insert one row in each of the shards of the `twopc_fuzzer_insert` table and it will also store the update set that it updated the rows off. +// +// We can check that a transaction was atomic by basically checking that the `col` value for all the rows that were updated together should match. +// If any transaction was partially successful, then it would have missed an increment on one of the rows. +// Moreover, the threadIDs of rows for a given update set in the 3 shards should be the same to ensure that conflicting transactions got committed in the same exact order. +func TestTwoPCFuzzTest(t *testing.T) { + testcases := []struct { + name string + threads int + updateSets int + timeForTesting time.Duration + clusterDisruptions []func(t *testing.T) + disruptionProbability []int + }{ + { + name: "Single Thread - Single Set", + threads: 1, + updateSets: 1, + timeForTesting: 5 * time.Second, + }, + { + name: "Multiple Threads - Single Set", + threads: 2, + updateSets: 1, + timeForTesting: 5 * time.Second, + }, + { + name: "Multiple Threads - Multiple Set", + threads: 15, + updateSets: 15, + timeForTesting: 5 * time.Second, + }, + { + name: "Multiple Threads - Multiple Set - PRS, ERS, and MySQL & Vttablet restart, OnlineDDL, MoveTables, Reshard disruptions", + threads: 4, + updateSets: 4, + timeForTesting: 5 * time.Second, + clusterDisruptions: []func(t *testing.T){prs, ers, mysqlRestarts, vttabletRestarts, onlineDDLFuzzer, moveTablesFuzzer, reshardFuzzer}, + disruptionProbability: []int{5, 5, 5, 5, 5, 5, 5}, + }, + } + + for _, tt := range testcases { + t.Run(tt.name, func(t *testing.T) { + conn, closer := start(t) + defer closer() + fz := newFuzzer(t, tt.threads, tt.updateSets, tt.clusterDisruptions, tt.disruptionProbability) + + fz.initialize(t, conn) + conn.Close() + // Start the fuzzer. + fz.start(t) + + // Wait for the timeForTesting so that the threads continue to run. + timeout := time.After(tt.timeForTesting) + loop := true + for loop { + select { + case <-timeout: + loop = false + case <-time.After(1 * time.Second): + if t.Failed() { + loop = false + } + } + } + + // Signal the fuzzer to stop. + fz.stop() + + // Wait for all transactions to be resolved. + twopcutil.WaitForResults(t, &vtParams, fmt.Sprintf(`show unresolved transactions for %v`, keyspaceName), "[]", 30*time.Second) + // Verify that all the transactions run were actually atomic and no data issues have occurred. + fz.verifyTransactionsWereAtomic(t) + + log.Errorf("Verification complete. All good!") + }) + } +} + +// verifyTransactionsWereAtomic verifies that the invariants of test are held. +// It checks the heuristics to ensure that the transactions run were atomic. +func (fz *fuzzer) verifyTransactionsWereAtomic(t *testing.T) { + conn, err := mysql.Connect(context.Background(), &vtParams) + require.NoError(t, err) + for updateSetIdx, updateSet := range fz.updateRowsVals { + // All the three values of the update set must be equal. + shard1Val := getColValueForIdFromFuzzUpdate(t, conn, updateSet[0]) + shard2Val := getColValueForIdFromFuzzUpdate(t, conn, updateSet[1]) + shard3Val := getColValueForIdFromFuzzUpdate(t, conn, updateSet[2]) + require.EqualValues(t, shard1Val, shard2Val) + require.EqualValues(t, shard3Val, shard2Val) + + // Next we get the IDs from all the three shards for the given update set index. + shard1IDs := getThreadIDsForUpdateSetFromFuzzInsert(t, conn, updateSetIdx, 1) + shard2IDs := getThreadIDsForUpdateSetFromFuzzInsert(t, conn, updateSetIdx, 2) + shard3IDs := getThreadIDsForUpdateSetFromFuzzInsert(t, conn, updateSetIdx, 3) + require.EqualValues(t, shard1IDs, shard2IDs) + require.EqualValues(t, shard3IDs, shard2IDs) + } +} + +// getColValueForIdFromFuzzUpdate gets the col column value for the given id in the twopc_fuzzer_update table. +func getColValueForIdFromFuzzUpdate(t *testing.T, conn *mysql.Conn, id int) uint64 { + res, err := conn.ExecuteFetch(fmt.Sprintf(selectFromFuzzUpdate, id), 1, false) + require.NoError(t, err) + require.Len(t, res.Rows, 1) + require.Len(t, res.Rows[0], 1) + val, err := res.Rows[0][0].ToUint64() + require.NoError(t, err) + return val +} + +// getThreadIDsForUpdateSetFromFuzzInsert gets the thread IDs for the given update set ordered by the col column from the twopc_fuzzer_insert table. +func getThreadIDsForUpdateSetFromFuzzInsert(t *testing.T, conn *mysql.Conn, updateSet int, shard int) []int { + // We will select all the rows for the given update set for the given shard. To get all the rows for the given shard, + // we can use the id column for filtering, since we know that the first shard will have all the values of id as 4, second shard as 6 and the last one as 9. + res, err := conn.ExecuteFetch(fmt.Sprintf(selectIdFromFuzzInsert, updateSet, updateRowBaseVals[shard-1]), 10000, false) + require.NoError(t, err) + var ids []int + for _, row := range res.Rows { + require.Len(t, row, 1) + threadId, err := row[0].ToInt() + require.NoError(t, err) + ids = append(ids, threadId) + } + return ids +} + +// fuzzer runs threads that runs queries against the databases. +// It has parameters that define the way the queries are constructed. +type fuzzer struct { + threads int + updateSets int + t *testing.T + + // shouldStop is an internal state variable, that tells the fuzzer + // whether it should stop or not. + shouldStop atomic.Bool + // wg is an internal state variable, that used to know whether the fuzzer threads are running or not. + wg sync.WaitGroup + // updateRowVals are the rows that we use to ensure 1 update on each shard with the same increment. + updateRowsVals [][]int + // clusterDisruptions are the cluster level disruptions that can happen in a running cluster. + clusterDisruptions []func(t *testing.T) + // disruptionProbability is the chance for the disruption to happen. We check this every 100 milliseconds. + disruptionProbability []int +} + +// newFuzzer creates a new fuzzer struct. +func newFuzzer(t *testing.T, threads int, updateSets int, clusterDisruptions []func(t *testing.T), disruptionProbability []int) *fuzzer { + fz := &fuzzer{ + t: t, + threads: threads, + updateSets: updateSets, + wg: sync.WaitGroup{}, + clusterDisruptions: clusterDisruptions, + disruptionProbability: disruptionProbability, + } + // Initially the fuzzer thread is stopped. + fz.shouldStop.Store(true) + return fz +} + +// stop stops the fuzzer and waits for it to finish execution. +func (fz *fuzzer) stop() { + // Mark the thread to be stopped. + fz.shouldStop.Store(true) + // Wait for the fuzzer thread to stop. + fz.wg.Wait() +} + +// start starts running the fuzzer. +func (fz *fuzzer) start(t *testing.T) { + // We mark the fuzzer thread to be running now. + fz.shouldStop.Store(false) + // fz.threads is the count of fuzzer threads, and one disruption thread. + fz.wg.Add(fz.threads + 1) + for i := 0; i < fz.threads; i++ { + go func() { + fz.runFuzzerThread(t, i) + }() + } + go func() { + fz.runClusterDisruptionThread(t) + }() +} + +// runFuzzerThread is used to run a thread of the fuzzer. +func (fz *fuzzer) runFuzzerThread(t *testing.T, threadId int) { + // Whenever we finish running this thread, we should mark the thread has stopped. + defer func() { + fz.wg.Done() + }() + + for { + // If fuzzer thread is marked to be stopped, then we should exit this go routine. + if fz.shouldStop.Load() == true { + return + } + // Run an atomic transaction + fz.generateAndExecuteTransaction(threadId) + } + +} + +// initialize initializes all the variables that will be needed for running the fuzzer. +// It also creates the rows for the `twopc_fuzzer_update` table. +func (fz *fuzzer) initialize(t *testing.T, conn *mysql.Conn) { + for i := 0; i < fz.updateSets; i++ { + fz.updateRowsVals = append(fz.updateRowsVals, []int{ + updateRowBaseVals[0] + i*16, + updateRowBaseVals[1] + i*16, + updateRowBaseVals[2] + i*16, + }) + } + + for _, updateSet := range fz.updateRowsVals { + for _, id := range updateSet { + _, err := conn.ExecuteFetch(fmt.Sprintf(insertIntoFuzzUpdate, id, 0), 0, false) + require.NoError(t, err) + } + } +} + +// generateAndExecuteTransaction generates the queries of the transaction and then executes them. +func (fz *fuzzer) generateAndExecuteTransaction(threadId int) { + // Create a connection to the vtgate to run transactions. + conn, err := mysql.Connect(context.Background(), &vtParams) + if err != nil { + return + } + defer conn.Close() + // randomly generate an update set to use and the value to increment it by. + updateSetVal := rand.Intn(fz.updateSets) + incrementVal := rand.Int31() + // We have to generate the update queries first. We can run the inserts only after the update queries. + // Otherwise, our check to see that the ids in the twopc_fuzzer_insert table in all the shards are the exact same + // for each update set ordered by the auto increment column will not be true. + // That assertion depends on all the transactions running updates first to ensure that for any given update set, + // no two transactions are running the insert queries. + var queries []string + queries = append(queries, fz.generateUpdateQueries(updateSetVal, incrementVal)...) + queries = append(queries, fz.generateInsertQueries(updateSetVal, threadId)...) + queries = fz.addRandomSavePoints(queries) + queries = append([]string{"begin"}, queries...) + finalCommand := "commit" + for _, query := range queries { + _, err := conn.ExecuteFetch(query, 0, false) + // If any command fails because of deadlocks or timeout or whatever, then we need to rollback the transaction. + if err != nil { + finalCommand = "rollback" + break + } + } + _, _ = conn.ExecuteFetch(finalCommand, 0, false) +} + +// generateUpdateQueries generates the queries to run updates on the twopc_fuzzer_update table. +// It takes the update set index and the value to increment the set by. +func (fz *fuzzer) generateUpdateQueries(updateSet int, incrementVal int32) []string { + var queries []string + for _, id := range fz.updateRowsVals[updateSet] { + queries = append(queries, fmt.Sprintf(updateFuzzUpdate, incrementVal, id)) + } + rand.Shuffle(len(queries), func(i, j int) { + queries[i], queries[j] = queries[j], queries[i] + }) + return queries +} + +// generateInsertQueries generates the queries to run inserts on the twopc_fuzzer_insert table. +// It takes the update set index and the thread id that is generating these inserts. +func (fz *fuzzer) generateInsertQueries(updateSet int, threadId int) []string { + var queries []string + for _, baseVal := range updateRowBaseVals { + // In the twopc_fuzzer_insert table we are going to be inserting the following values - + // - id: We use the updateRowBaseVals to ensure that the 3 insertions happen on 3 different shards. + // This also allows us to read rows any of the shards without shard targeting by just filtering by this column. + // - updateSet: The update set index that these insertions correspond too. + // - threadId: The thread ID of the fuzzer thread that is running the transaction. + queries = append(queries, fmt.Sprintf(insertIntoFuzzInsert, baseVal, updateSet, threadId)) + } + rand.Shuffle(len(queries), func(i, j int) { + queries[i], queries[j] = queries[j], queries[i] + }) + return queries +} + +// runClusterDisruptionThread runs the cluster level disruptions in a separate thread. +func (fz *fuzzer) runClusterDisruptionThread(t *testing.T) { + // Whenever we finish running this thread, we should mark the thread has stopped. + defer func() { + fz.wg.Done() + }() + + for { + // If disruption thread is marked to be stopped, then we should exit this go routine. + if fz.shouldStop.Load() == true { + return + } + // Run a potential disruption + fz.runClusterDisruption(t) + time.Sleep(100 * time.Millisecond) + } + +} + +// runClusterDisruption tries to run a single cluster disruption. +func (fz *fuzzer) runClusterDisruption(t *testing.T) { + for idx, prob := range fz.disruptionProbability { + if rand.Intn(100) < prob { + fz.clusterDisruptions[idx](fz.t) + return + } + } +} + +// addRandomSavePoints will add random savepoints and queries to the list of queries. +// It still ensures that all the new queries added are rolledback so that the assertions of queries +// don't change. +func (fz *fuzzer) addRandomSavePoints(queries []string) []string { + savePointCount := 1 + for { + shouldAddSavePoint := rand.Intn(2) + if shouldAddSavePoint == 0 { + return queries + } + + savePointQueries := []string{"SAVEPOINT sp" + strconv.Itoa(savePointCount)} + randomDmlCount := rand.Intn(2) + 1 + for i := 0; i < randomDmlCount; i++ { + savePointQueries = append(savePointQueries, fz.randomDML()) + } + savePointQueries = append(savePointQueries, "ROLLBACK TO sp"+strconv.Itoa(savePointCount)) + savePointCount++ + + savePointPosition := rand.Intn(len(queries)) + newQueries := slices.Clone(queries[:savePointPosition]) + newQueries = append(newQueries, savePointQueries...) + newQueries = append(newQueries, queries[savePointPosition:]...) + queries = newQueries + } +} + +// randomDML generates a random DML to be used. +func (fz *fuzzer) randomDML() string { + queryType := rand.Intn(2) + if queryType == 0 { + // Generate INSERT + return fmt.Sprintf(insertIntoFuzzInsert, updateRowBaseVals[rand.Intn(len(updateRowBaseVals))], rand.Intn(fz.updateSets), rand.Intn(fz.threads)) + } + // Generate UPDATE + updateId := fz.updateRowsVals[rand.Intn(len(fz.updateRowsVals))][rand.Intn(len(updateRowBaseVals))] + return fmt.Sprintf(updateFuzzUpdate, rand.Intn(100000), updateId) +} + +/* +Cluster Level Disruptions for the fuzzer +*/ + +func prs(t *testing.T) { + shards := clusterInstance.Keyspaces[0].Shards + shard := shards[rand.Intn(len(shards))] + vttablets := shard.Vttablets + newPrimary := vttablets[rand.Intn(len(vttablets))] + log.Errorf("Running PRS for - %v/%v with new primary - %v", keyspaceName, shard.Name, newPrimary.Alias) + err := clusterInstance.VtctldClientProcess.PlannedReparentShard(keyspaceName, shard.Name, newPrimary.Alias) + if err != nil { + log.Errorf("error running PRS - %v", err) + } +} + +func ers(t *testing.T) { + shards := clusterInstance.Keyspaces[0].Shards + shard := shards[rand.Intn(len(shards))] + vttablets := shard.Vttablets + newPrimary := vttablets[rand.Intn(len(vttablets))] + log.Errorf("Running ERS for - %v/%v with new primary - %v", keyspaceName, shard.Name, newPrimary.Alias) + _, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("EmergencyReparentShard", fmt.Sprintf("%s/%s", keyspaceName, shard.Name), "--new-primary", newPrimary.Alias) + if err != nil { + log.Errorf("error running ERS - %v", err) + } +} + +func vttabletRestarts(t *testing.T) { + shards := clusterInstance.Keyspaces[0].Shards + shard := shards[rand.Intn(len(shards))] + vttablets := shard.Vttablets + tablet := vttablets[rand.Intn(len(vttablets))] + log.Errorf("Restarting vttablet for - %v/%v - %v", keyspaceName, shard.Name, tablet.Alias) + err := tablet.VttabletProcess.TearDown() + if err != nil { + log.Errorf("error stopping vttablet - %v", err) + return + } + tablet.VttabletProcess.ServingStatus = "SERVING" + for { + err = tablet.VttabletProcess.Setup() + if err == nil { + return + } + // Sometimes vttablets fail to connect to the topo server due to a minor blip there. + // We don't want to fail the test, so we retry setting up the vttablet. + log.Errorf("error restarting vttablet - %v", err) + time.Sleep(1 * time.Second) + } +} + +var ( + count = 0 + + orderedDDLFuzzer = []string{ + "alter table twopc_fuzzer_insert add column extra_col1 varchar(20)", + "alter table twopc_fuzzer_insert add column extra_col2 varchar(20)", + "alter table twopc_fuzzer_insert drop column extra_col1", + "alter table twopc_fuzzer_insert drop column extra_col2", + } +) + +// onlineDDLFuzzer runs an online DDL statement while ignoring any errors for the fuzzer. +func onlineDDLFuzzer(t *testing.T) { + output, err := clusterInstance.VtctldClientProcess.ApplySchemaWithOutput(keyspaceName, orderedDDLFuzzer[count%len(orderedDDLFuzzer)], cluster.ApplySchemaParams{ + DDLStrategy: "vitess --force-cut-over-after=1ms", + }) + count++ + if err != nil { + return + } + fmt.Println("Running online DDL with uuid: ", output) + twopcutil.WaitForMigrationStatus(t, &vtParams, keyspaceName, clusterInstance.Keyspaces[0].Shards, + strings.TrimSpace(output), 2*time.Minute, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed) +} + +var moveTablesCount int + +// moveTablesFuzzer runs a MoveTables workflow. +func moveTablesFuzzer(t *testing.T) { + workflow := "TestTwoPCFuzzTest" + srcKeyspace := keyspaceName + targetKeyspace := unshardedKeyspaceName + if moveTablesCount%2 == 1 { + srcKeyspace = unshardedKeyspaceName + targetKeyspace = keyspaceName + // We apply the vschema again because previous move tables would have removed the entry for `twopc_fuzzer_update`. + err := clusterInstance.VtctldClientProcess.ApplyVSchema(keyspaceName, VSchema) + require.NoError(t, err) + } + log.Errorf("MoveTables from - %v to %v", srcKeyspace, targetKeyspace) + mtw := cluster.NewMoveTables(t, clusterInstance, workflow, targetKeyspace, srcKeyspace, "twopc_fuzzer_update", []string{topodatapb.TabletType_REPLICA.String()}) + // Initiate MoveTables for twopc_fuzzer_update. + output, err := mtw.Create() + if err != nil { + log.Errorf("error creating MoveTables - %v, output - %v", err, output) + return + } + moveTablesCount++ + // Wait for vreplication to catchup. Should be very fast since we don't have a lot of rows. + mtw.WaitForVreplCatchup(1 * time.Minute) + // SwitchTraffic + output, err = mtw.SwitchReadsAndWrites() + assert.NoError(t, err, output) + output, err = mtw.Complete() + assert.NoError(t, err, output) +} + +// reshardFuzzer runs a Reshard workflow. +func reshardFuzzer(t *testing.T) { + var srcShards, targetShards string + shardCount := len(clusterInstance.Keyspaces[0].Shards) + if shardCount == 2 { + srcShards = "40-" + targetShards = "40-80,80-" + } else { + srcShards = "40-80,80-" + targetShards = "40-" + } + log.Errorf("Reshard from - \"%v\" to \"%v\"", srcShards, targetShards) + twopcutil.AddShards(t, clusterInstance, keyspaceName, strings.Split(targetShards, ",")) + err := twopcutil.RunReshard(t, clusterInstance, "TestTwoPCFuzzTest", keyspaceName, srcShards, targetShards) + require.NoError(t, err) +} + +func mysqlRestarts(t *testing.T) { + shards := clusterInstance.Keyspaces[0].Shards + shard := shards[rand.Intn(len(shards))] + vttablets := shard.Vttablets + tablet := vttablets[rand.Intn(len(vttablets))] + log.Errorf("Restarting MySQL for - %v/%v tablet - %v", keyspaceName, shard.Name, tablet.Alias) + pidFile := path.Join(os.Getenv("VTDATAROOT"), fmt.Sprintf("/vt_%010d/mysql.pid", tablet.TabletUID)) + pidBytes, err := os.ReadFile(pidFile) + if err != nil { + // We can't read the file which means the PID file does not exist + // The server must have stopped + return + } + pid, err := strconv.Atoi(strings.TrimSpace(string(pidBytes))) + if err != nil { + log.Errorf("Error in conversion to integer: %v", err) + return + } + err = syscallutil.Kill(pid, syscall.SIGKILL) + if err != nil { + log.Errorf("Error in killing process: %v", err) + } +} diff --git a/go/test/endtoend/transaction/twopc/fuzz/main_test.go b/go/test/endtoend/transaction/twopc/fuzz/main_test.go new file mode 100644 index 00000000000..1b05615d51a --- /dev/null +++ b/go/test/endtoend/transaction/twopc/fuzz/main_test.go @@ -0,0 +1,130 @@ +/* +Copyright 2024 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 fuzz + +import ( + "context" + _ "embed" + "flag" + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" +) + +var ( + clusterInstance *cluster.LocalProcessCluster + vtParams mysql.ConnParams + vtgateGrpcAddress string + keyspaceName = "ks" + unshardedKeyspaceName = "uks" + cell = "zone1" + hostname = "localhost" + + //go:embed schema.sql + SchemaSQL string + + //go:embed vschema.json + VSchema string +) + +func TestMain(m *testing.M) { + defer cluster.PanicHandler(nil) + flag.Parse() + + exitcode := func() int { + clusterInstance = cluster.NewCluster(cell, hostname) + defer clusterInstance.Teardown() + + // Start topo server + if err := clusterInstance.StartTopo(); err != nil { + return 1 + } + + // Reserve vtGate port in order to pass it to vtTablet + clusterInstance.VtgateGrpcPort = clusterInstance.GetAndReservePort() + + // Set extra args for twopc + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, + "--transaction_mode", "TWOPC", + "--grpc_use_effective_callerid", + "--tablet_refresh_interval", "2s", + ) + clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, + "--twopc_enable", + "--twopc_abandon_age", "1", + "--migration_check_interval", "2s", + ) + + // Start keyspace + keyspace := &cluster.Keyspace{ + Name: keyspaceName, + SchemaSQL: SchemaSQL, + VSchema: VSchema, + DurabilityPolicy: "semi_sync", + } + if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-"}, 2, false); err != nil { + return 1 + } + + // Start an unsharded keyspace + unshardedKeyspace := &cluster.Keyspace{ + Name: unshardedKeyspaceName, + SchemaSQL: "", + VSchema: "{}", + DurabilityPolicy: "semi_sync", + } + if err := clusterInstance.StartUnshardedKeyspace(*unshardedKeyspace, 2, false); err != nil { + return 1 + } + + // Start Vtgate + if err := clusterInstance.StartVtgate(); err != nil { + return 1 + } + vtParams = clusterInstance.GetVTParams("") + vtgateGrpcAddress = fmt.Sprintf("%s:%d", clusterInstance.Hostname, clusterInstance.VtgateGrpcPort) + + return m.Run() + }() + os.Exit(exitcode) +} + +func start(t *testing.T) (*mysql.Conn, func()) { + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + cleanup(t) + + return conn, func() { + conn.Close() + cleanup(t) + } +} + +func cleanup(t *testing.T) { + cluster.PanicHandler(t) + + utils.ClearOutTable(t, vtParams, "twopc_fuzzer_insert") + utils.ClearOutTable(t, vtParams, "twopc_fuzzer_update") + utils.ClearOutTable(t, vtParams, "twopc_t1") +} diff --git a/go/test/endtoend/transaction/twopc/fuzz/schema.sql b/go/test/endtoend/transaction/twopc/fuzz/schema.sql new file mode 100644 index 00000000000..5173166bfd4 --- /dev/null +++ b/go/test/endtoend/transaction/twopc/fuzz/schema.sql @@ -0,0 +1,20 @@ +create table twopc_fuzzer_update ( + id bigint, + col bigint, + primary key (id) +) Engine=InnoDB; + +create table twopc_fuzzer_insert ( + id bigint, + updateSet bigint, + threadId bigint, + col bigint auto_increment, + key(col), + primary key (id, col) +) Engine=InnoDB; + +create table twopc_t1 ( + id bigint, + col bigint, + primary key (id) +) Engine=InnoDB; diff --git a/go/test/endtoend/transaction/twopc/fuzz/vschema.json b/go/test/endtoend/transaction/twopc/fuzz/vschema.json new file mode 100644 index 00000000000..415b5958f54 --- /dev/null +++ b/go/test/endtoend/transaction/twopc/fuzz/vschema.json @@ -0,0 +1,34 @@ +{ + "sharded":true, + "vindexes": { + "reverse_bits": { + "type": "reverse_bits" + } + }, + "tables": { + "twopc_fuzzer_update": { + "column_vindexes": [ + { + "column": "id", + "name": "reverse_bits" + } + ] + }, + "twopc_fuzzer_insert": { + "column_vindexes": [ + { + "column": "id", + "name": "reverse_bits" + } + ] + }, + "twopc_t1": { + "column_vindexes": [ + { + "column": "id", + "name": "reverse_bits" + } + ] + } + } +} \ No newline at end of file diff --git a/go/test/endtoend/vtgate/transaction/twopc/main_test.go b/go/test/endtoend/transaction/twopc/main_test.go similarity index 70% rename from go/test/endtoend/vtgate/transaction/twopc/main_test.go rename to go/test/endtoend/transaction/twopc/main_test.go index af5c1a395ad..e7818e3088d 100644 --- a/go/test/endtoend/vtgate/transaction/twopc/main_test.go +++ b/go/test/endtoend/transaction/twopc/main_test.go @@ -24,16 +24,19 @@ import ( "fmt" "io" "os" + "strings" "sync" "testing" "time" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/test/endtoend/cluster" - "vitess.io/vitess/go/test/endtoend/utils" + twopcutil "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -42,6 +45,7 @@ import ( var ( clusterInstance *cluster.LocalProcessCluster + mysqlParams mysql.ConnParams vtParams mysql.ConnParams vtgateGrpcAddress string keyspaceName = "ks" @@ -75,21 +79,25 @@ func TestMain(m *testing.M) { // Set extra args for twopc clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, "--transaction_mode", "TWOPC", + "--grpc_use_effective_callerid", ) clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--twopc_enable", - "--twopc_abandon_age", "3600", + "--twopc_abandon_age", "1", "--queryserver-config-transaction-cap", "3", + "--queryserver-config-transaction-timeout", "400s", + "--queryserver-config-query-timeout", "9000s", ) // Start keyspace keyspace := &cluster.Keyspace{ - Name: keyspaceName, - SchemaSQL: SchemaSQL, - VSchema: VSchema, - SidecarDBName: sidecarDBName, + Name: keyspaceName, + SchemaSQL: SchemaSQL, + VSchema: VSchema, + SidecarDBName: sidecarDBName, + DurabilityPolicy: "semi_sync", } - if err := clusterInstance.StartKeyspace(*keyspace, []string{"-80", "80-"}, 1, false); err != nil { + if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-"}, 2, false); err != nil { return 1 } @@ -100,6 +108,15 @@ func TestMain(m *testing.M) { vtParams = clusterInstance.GetVTParams(keyspaceName) vtgateGrpcAddress = fmt.Sprintf("%s:%d", clusterInstance.Hostname, clusterInstance.VtgateGrpcPort) + // create mysql instance and connection parameters + conn, closer, err := utils.NewMySQL(clusterInstance, keyspaceName, SchemaSQL) + if err != nil { + fmt.Println(err) + return 1 + } + defer closer() + mysqlParams = conn + return m.Run() }() os.Exit(exitcode) @@ -109,19 +126,37 @@ func start(t *testing.T) (*mysql.Conn, func()) { ctx := context.Background() conn, err := mysql.Connect(ctx, &vtParams) require.NoError(t, err) + cleanup(t) + + return conn, func() { + conn.Close() + cleanup(t) + } +} + +func cleanup(t *testing.T) { + cluster.PanicHandler(t) + twopcutil.ClearOutTable(t, vtParams, "twopc_user") + twopcutil.ClearOutTable(t, vtParams, "twopc_t1") + sm.reset() +} + +func startWithMySQL(t *testing.T) (utils.MySQLCompare, func()) { + mcmp, err := utils.NewMySQLCompare(t, vtParams, mysqlParams) + require.NoError(t, err) deleteAll := func() { tables := []string{"twopc_user"} for _, table := range tables { - _, _ = utils.ExecAllowError(t, conn, "delete from "+table) + _, _ = mcmp.ExecAndIgnore("delete from " + table) } } deleteAll() - return conn, func() { + return mcmp, func() { deleteAll() - conn.Close() + mcmp.Close() cluster.PanicHandler(t) } } @@ -148,7 +183,8 @@ var tables = map[string]extractInterestingValues{ }, "ks.redo_statement": func(dtidMap map[string]string, vals []sqltypes.Value) (out []sqltypes.Value) { dtid := getDTID(dtidMap, vals[0].ToString()) - out = append([]sqltypes.Value{sqltypes.NewVarChar(dtid)}, vals[1:]...) + stmt := getStatement(vals[2].ToString()) + out = append([]sqltypes.Value{sqltypes.NewVarChar(dtid)}, vals[1], sqltypes.TestValue(sqltypes.Blob, stmt)) return }, "ks.twopc_user": func(_ map[string]string, vals []sqltypes.Value) []sqltypes.Value { return vals }, @@ -168,24 +204,44 @@ func getDTID(dtidMap map[string]string, dtKey string) string { return dtid } +func getStatement(stmt string) string { + var sKey string + var prefix string + switch { + case strings.HasPrefix(stmt, "savepoint"): + prefix = "savepoint-" + sKey = stmt[9:] + case strings.HasPrefix(stmt, "rollback to"): + prefix = "rollback-" + sKey = stmt[11:] + default: + return stmt + } + + sid, exists := sm.stmt[sKey] + if !exists { + sid = fmt.Sprintf("%d", len(sm.stmt)+1) + sm.stmt[sKey] = sid + } + return prefix + sid +} + func runVStream(t *testing.T, ctx context.Context, ch chan *binlogdatapb.VEvent, vtgateConn *vtgateconn.VTGateConn) { - vgtid := &binlogdatapb.VGtid{ - ShardGtids: []*binlogdatapb.ShardGtid{ - {Keyspace: keyspaceName, Shard: "-80", Gtid: "current"}, - {Keyspace: keyspaceName, Shard: "80-", Gtid: "current"}, - }} - filter := &binlogdatapb.Filter{ - Rules: []*binlogdatapb.Rule{{ - Match: "/.*/", - }}, + shards := []string{"-40", "40-80", "80-"} + shardGtids := make([]*binlogdatapb.ShardGtid, 0, len(shards)) + var seen = make(map[string]bool, len(shards)) + var wg sync.WaitGroup + for _, shard := range shards { + shardGtids = append(shardGtids, &binlogdatapb.ShardGtid{Keyspace: keyspaceName, Shard: shard, Gtid: "current"}) + seen[shard] = false + wg.Add(1) } + vgtid := &binlogdatapb.VGtid{ShardGtids: shardGtids} + filter := &binlogdatapb.Filter{Rules: []*binlogdatapb.Rule{{Match: "/.*/"}}} + vReader, err := vtgateConn.VStream(ctx, topodatapb.TabletType_PRIMARY, vgtid, filter, nil) require.NoError(t, err) - // Use a channel to signal that the first VGTID event has been processed - firstEventProcessed := make(chan struct{}) - var once sync.Once - go func() { for { evs, err := vReader.Recv() @@ -195,9 +251,12 @@ func runVStream(t *testing.T, ctx context.Context, ch chan *binlogdatapb.VEvent, require.NoError(t, err) for _, ev := range evs { - // Signal the first event has been processed using sync.Once + // Mark VGTID event from each shard seen. if ev.Type == binlogdatapb.VEventType_VGTID { - once.Do(func() { close(firstEventProcessed) }) + if !seen[ev.Shard] { + seen[ev.Shard] = true + wg.Done() + } } if ev.Type == binlogdatapb.VEventType_ROW || ev.Type == binlogdatapb.VEventType_FIELD { ch <- ev @@ -206,11 +265,15 @@ func runVStream(t *testing.T, ctx context.Context, ch chan *binlogdatapb.VEvent, } }() - // Wait for the first event to be processed - <-firstEventProcessed + // Wait for VGTID event from all shards + wg.Wait() } func retrieveTransitions(t *testing.T, ch chan *binlogdatapb.VEvent, tableMap map[string][]*querypb.Field, dtMap map[string]string) map[string][]string { + return retrieveTransitionsWithTimeout(t, ch, tableMap, dtMap, 1*time.Second) +} + +func retrieveTransitionsWithTimeout(t *testing.T, ch chan *binlogdatapb.VEvent, tableMap map[string][]*querypb.Field, dtMap map[string]string, timeout time.Duration) map[string][]string { logTable := make(map[string][]string) keepWaiting := true @@ -229,7 +292,7 @@ func retrieveTransitions(t *testing.T, ch chan *binlogdatapb.VEvent, tableMap ma if re.FieldEvent != nil { tableMap[re.FieldEvent.TableName] = re.FieldEvent.Fields } - case <-time.After(1 * time.Second): + case <-time.After(timeout): keepWaiting = false } } @@ -268,3 +331,13 @@ func prettyPrint(v interface{}) string { } return string(b) } + +type stmtMapper struct { + stmt map[string]string +} + +var sm = &stmtMapper{stmt: make(map[string]string)} + +func (sm *stmtMapper) reset() { + sm.stmt = make(map[string]string) +} diff --git a/go/test/endtoend/transaction/twopc/metric/main_test.go b/go/test/endtoend/transaction/twopc/metric/main_test.go new file mode 100644 index 00000000000..73cc380a900 --- /dev/null +++ b/go/test/endtoend/transaction/twopc/metric/main_test.go @@ -0,0 +1,117 @@ +/* +Copyright 2024 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 transaction + +import ( + "context" + _ "embed" + "flag" + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/test/endtoend/cluster" + twopcutil "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" +) + +var ( + clusterInstance *cluster.LocalProcessCluster + vtParams mysql.ConnParams + vtgateGrpcAddress string + keyspaceName = "ks" + cell = "zone1" + hostname = "localhost" + sidecarDBName = "vt_ks" + + //go:embed schema.sql + SchemaSQL string + + //go:embed vschema.json + VSchema string +) + +func TestMain(m *testing.M) { + defer cluster.PanicHandler(nil) + flag.Parse() + + exitcode := func() int { + clusterInstance = cluster.NewCluster(cell, hostname) + defer clusterInstance.Teardown() + + // Start topo server + if err := clusterInstance.StartTopo(); err != nil { + return 1 + } + + // Reserve vtGate port in order to pass it to vtTablet + clusterInstance.VtgateGrpcPort = clusterInstance.GetAndReservePort() + + // Set extra args for twopc + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, + "--transaction_mode", "TWOPC", + "--grpc_use_effective_callerid", + ) + clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, + "--twopc_enable", + "--twopc_abandon_age", "1", + "--queryserver-config-transaction-cap", "100", + ) + + // Start keyspace + keyspace := &cluster.Keyspace{ + Name: keyspaceName, + SchemaSQL: SchemaSQL, + VSchema: VSchema, + SidecarDBName: sidecarDBName, + DurabilityPolicy: "semi_sync", + } + if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-"}, 2, false); err != nil { + return 1 + } + + // Start Vtgate + if err := clusterInstance.StartVtgate(); err != nil { + return 1 + } + vtParams = clusterInstance.GetVTParams(keyspaceName) + vtgateGrpcAddress = fmt.Sprintf("%s:%d", clusterInstance.Hostname, clusterInstance.VtgateGrpcPort) + + return m.Run() + }() + os.Exit(exitcode) +} + +func start(t *testing.T) (*mysql.Conn, func()) { + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + cleanup(t) + + return conn, func() { + conn.Close() + cleanup(t) + } +} + +func cleanup(t *testing.T) { + cluster.PanicHandler(t) + twopcutil.ClearOutTable(t, vtParams, "twopc_user") + twopcutil.ClearOutTable(t, vtParams, "twopc_t1") +} diff --git a/go/test/endtoend/transaction/twopc/metric/metric_test.go b/go/test/endtoend/transaction/twopc/metric/metric_test.go new file mode 100644 index 00000000000..40645628f45 --- /dev/null +++ b/go/test/endtoend/transaction/twopc/metric/metric_test.go @@ -0,0 +1,396 @@ +/* +Copyright 2024 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 transaction + +import ( + "context" + "fmt" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/test/endtoend/cluster" + twopcutil "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" + "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/vt/callerid" + "vitess.io/vitess/go/vt/vtgate/vtgateconn" +) + +// TestTransactionModes tests transactions using twopc mode +func TestTransactionModeMetrics(t *testing.T) { + conn, closer := start(t) + defer closer() + + tcases := []struct { + name string + stmts []string + want commitMetric + }{{ + name: "nothing to commit: so no change on vars", + stmts: []string{"commit"}, + }, { + name: "begin commit - no dml: so no change on vars", + stmts: []string{"begin", "commit"}, + }, { + name: "single shard", + stmts: []string{ + "begin", + "insert into twopc_user(id) values (1)", + "commit", + }, + want: commitMetric{TotalCount: 1, SingleCount: 1}, + }, { + name: "multi shard insert", + stmts: []string{ + "begin", + "insert into twopc_user(id) values (7),(8)", + "commit", + }, + want: commitMetric{TotalCount: 1, MultiCount: 1, TwoPCCount: 1}, + }, { + name: "multi shard delete", + stmts: []string{ + "begin", + "delete from twopc_user", + "commit", + }, + want: commitMetric{TotalCount: 1, MultiCount: 1, TwoPCCount: 1}, + }} + + initial := getCommitMetric(t) + utils.Exec(t, conn, "set transaction_mode = multi") + for _, tc := range tcases { + t.Run(tc.name, func(t *testing.T) { + for _, stmt := range tc.stmts { + utils.Exec(t, conn, stmt) + } + updatedMetric := getCommitMetric(t) + assert.EqualValues(t, tc.want.TotalCount, updatedMetric.TotalCount-initial.TotalCount, "TotalCount") + assert.EqualValues(t, tc.want.SingleCount, updatedMetric.SingleCount-initial.SingleCount, "SingleCount") + assert.EqualValues(t, tc.want.MultiCount, updatedMetric.MultiCount-initial.MultiCount, "MultiCount") + assert.Zero(t, updatedMetric.TwoPCCount-initial.TwoPCCount, "TwoPCCount") + initial = updatedMetric + }) + } + + utils.Exec(t, conn, "set transaction_mode = twopc") + for _, tc := range tcases { + t.Run(tc.name, func(t *testing.T) { + for _, stmt := range tc.stmts { + utils.Exec(t, conn, stmt) + } + updatedMetric := getCommitMetric(t) + assert.EqualValues(t, tc.want.TotalCount, updatedMetric.TotalCount-initial.TotalCount, "TotalCount") + assert.EqualValues(t, tc.want.SingleCount, updatedMetric.SingleCount-initial.SingleCount, "SingleCount") + assert.Zero(t, updatedMetric.MultiCount-initial.MultiCount, "MultiCount") + assert.EqualValues(t, tc.want.TwoPCCount, updatedMetric.TwoPCCount-initial.TwoPCCount, "TwoPCCount") + initial = updatedMetric + }) + } +} + +// TestVTGate2PCCommitMetricOnFailure tests unresolved commit metrics on VTGate. +func TestVTGate2PCCommitMetricOnFailure(t *testing.T) { + defer cleanup(t) + + initialCount := getVarValue[float64](t, "CommitUnresolved", clusterInstance.VtgateProcess.GetVars) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + conn := vtgateConn.Session("", nil) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + _, err = conn.Execute(ctx, "begin", nil) + require.NoError(t, err) + _, err = conn.Execute(ctx, "insert into twopc_user(id, name) values(7,'foo'), (8,'bar')", nil) + require.NoError(t, err) + + // fail after mm commit. + newCtx := callerid.NewContext(ctx, callerid.NewEffectiveCallerID("MMCommitted_FailNow", "", ""), nil) + _, err = conn.Execute(newCtx, "commit", nil) + require.ErrorContains(t, err, "Fail After MM commit") + + updatedCount := getVarValue[float64](t, "CommitUnresolved", clusterInstance.VtgateProcess.GetVars) + assert.EqualValues(t, 1, updatedCount-initialCount, "CommitUnresolved") + + waitForResolve(ctx, t, conn, 5*time.Second) + + _, err = conn.Execute(ctx, "begin", nil) + require.NoError(t, err) + _, err = conn.Execute(ctx, "insert into twopc_user(id, name) values(9,'foo')", nil) + require.NoError(t, err) + _, err = conn.Execute(ctx, "insert into twopc_user(id, name) values(10,'apa')", nil) + require.NoError(t, err) + + // fail during rm commit. + newCtx = callerid.NewContext(ctx, callerid.NewEffectiveCallerID("RMCommit_-40_FailNow", "", ""), nil) + _, err = conn.Execute(newCtx, "commit", nil) + require.ErrorContains(t, err, "Fail During RM commit") + + updatedCount = getVarValue[float64](t, "CommitUnresolved", clusterInstance.VtgateProcess.GetVars) + assert.EqualValues(t, 2, updatedCount-initialCount, "CommitUnresolved") + + waitForResolve(ctx, t, conn, 5*time.Second) +} + +// TestVTTablet2PCMetrics tests 2pc metrics on VTTablet. +func TestVTTablet2PCMetrics(t *testing.T) { + defer cleanup(t) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + conn := vtgateConn.Session("", nil) + ctx, cancel := context.WithCancel(context.Background()) + ctx = callerid.NewContext(ctx, callerid.NewEffectiveCallerID("MMCommitted_FailNow", "", ""), nil) + defer cancel() + + for i := 1; i <= 20; i++ { + _, err = conn.Execute(ctx, "begin", nil) + require.NoError(t, err) + query := fmt.Sprintf("insert into twopc_user(id, name) values(%d,'foo'), (%d,'bar'), (%d,'baz')", i, i*101, i+53) + _, err = conn.Execute(ctx, query, nil) + require.NoError(t, err) + + multi := len(conn.SessionPb().ShardSessions) > 1 + + // fail after mm commit. + _, err = conn.Execute(ctx, "commit", nil) + if multi { + assert.ErrorContains(t, err, "Fail After MM commit") + } else { + assert.NoError(t, err) + } + } + + waitForResolve(ctx, t, conn, 5*time.Second) + + // at least 1 unresolved transaction should be seen by the gauge. + unresolvedCount := getUnresolvedTxCount(t) + assert.Greater(t, unresolvedCount, 1.0) + + // after next ticker should be become zero. + timeout := time.After(3 * time.Second) + for { + select { + case <-timeout: + t.Errorf("unresolved transaction not reduced to zero within the time limit") + return + case <-time.After(500 * time.Millisecond): + unresolvedCount = getUnresolvedTxCount(t) + if unresolvedCount == 0 { + return + } + fmt.Printf("unresolved tx count: %f\n", unresolvedCount) + } + } +} + +// TestVTTablet2PCMetricsFailCommitPrepared tests 2pc metrics on VTTablet on commit prepared failure..';;/ +func TestVTTablet2PCMetricsFailCommitPrepared(t *testing.T) { + defer cleanup(t) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + conn := vtgateConn.Session("", nil) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + newCtx := callerid.NewContext(ctx, callerid.NewEffectiveCallerID("CP_80-_R", "", ""), nil) + execute(t, newCtx, conn, "begin") + execute(t, newCtx, conn, "insert into twopc_t1(id, col) values (4, 1)") + execute(t, newCtx, conn, "insert into twopc_t1(id, col) values (6, 2)") + execute(t, newCtx, conn, "insert into twopc_t1(id, col) values (9, 3)") + _, err = conn.Execute(newCtx, "commit", nil) + require.ErrorContains(t, err, "commit prepared: retryable error") + dtidRetryable := getDTIDFromWarnings(ctx, t, conn) + require.NotEmpty(t, dtidRetryable) + + cpFail := getVarValue[map[string]any](t, "CommitPreparedFail", clusterInstance.Keyspaces[0].Shards[2].FindPrimaryTablet().VttabletProcess.GetVars) + require.EqualValues(t, 1, cpFail["Retryable"]) + require.Nil(t, cpFail["NonRetryable"]) + + newCtx = callerid.NewContext(ctx, callerid.NewEffectiveCallerID("CP_80-_NR", "", ""), nil) + execute(t, newCtx, conn, "begin") + execute(t, newCtx, conn, "insert into twopc_t1(id, col) values (20, 11)") + execute(t, newCtx, conn, "insert into twopc_t1(id, col) values (22, 21)") + execute(t, newCtx, conn, "insert into twopc_t1(id, col) values (25, 31)") + _, err = conn.Execute(newCtx, "commit", nil) + require.ErrorContains(t, err, "commit prepared: non retryable error") + dtidNonRetryable := getDTIDFromWarnings(ctx, t, conn) + require.NotEmpty(t, dtidNonRetryable) + + cpFail = getVarValue[map[string]any](t, "CommitPreparedFail", clusterInstance.Keyspaces[0].Shards[2].FindPrimaryTablet().VttabletProcess.GetVars) + require.EqualValues(t, 1, cpFail["Retryable"]) // old counter value + require.EqualValues(t, 1, cpFail["NonRetryable"]) + + // restart to trigger unresolved transactions + err = clusterInstance.Keyspaces[0].Shards[2].FindPrimaryTablet().RestartOnlyTablet() + require.NoError(t, err) + + // dtid with retryable error should be resolved. + waitForDTIDResolve(ctx, t, conn, dtidRetryable, 5*time.Second) + + // dtid with non retryable error should remain unresolved. + qr, err := conn.Execute(ctx, fmt.Sprintf(`show transaction status for '%s'`, dtidNonRetryable), nil) + require.NoError(t, err) + require.NotZero(t, qr.Rows, "should remain unresolved") + + // running conclude transaction for it. + out, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput( + "DistributedTransaction", "conclude", "--dtid", dtidNonRetryable) + require.NoError(t, err) + require.Contains(t, out, "Successfully concluded the distributed transaction") + // now verifying + qr, err = conn.Execute(ctx, fmt.Sprintf(`show transaction status for '%s'`, dtidNonRetryable), nil) + require.NoError(t, err) + require.Empty(t, qr.Rows) +} + +func execute(t *testing.T, ctx context.Context, conn *vtgateconn.VTGateSession, query string) { + t.Helper() + + _, err := conn.Execute(ctx, query, nil) + require.NoError(t, err) +} + +func getUnresolvedTxCount(t *testing.T) float64 { + unresolvedCount := 0.0 + for _, shard := range clusterInstance.Keyspaces[0].Shards { + unresolvedTx := getVarValue[map[string]any](t, "UnresolvedTransaction", shard.FindPrimaryTablet().VttabletProcess.GetVars) + if mmCount, exists := unresolvedTx["MetadataManager"]; exists { + unresolvedCount += mmCount.(float64) + } + if rmCount, exists := unresolvedTx["ResourceManager"]; exists { + unresolvedCount += rmCount.(float64) + } + } + return unresolvedCount +} + +type commitMetric struct { + TotalCount float64 + SingleCount float64 + MultiCount float64 + TwoPCCount float64 +} + +func getCommitMetric(t *testing.T) commitMetric { + t.Helper() + + vars := clusterInstance.VtgateProcess.GetVars() + require.NotNil(t, vars) + + cm := commitMetric{} + commitVars, exists := vars["CommitModeTimings"] + if !exists { + return cm + } + + commitMap, ok := commitVars.(map[string]any) + require.True(t, ok, "commit vars is not a map") + + cm.TotalCount = commitMap["TotalCount"].(float64) + + histogram, ok := commitMap["Histograms"].(map[string]any) + require.True(t, ok, "commit histogram is not a map") + + if single, ok := histogram["Single"]; ok { + singleMap, ok := single.(map[string]any) + require.True(t, ok, "single histogram is not a map") + cm.SingleCount = singleMap["Count"].(float64) + } + + if multi, ok := histogram["Multi"]; ok { + multiMap, ok := multi.(map[string]any) + require.True(t, ok, "multi histogram is not a map") + cm.MultiCount = multiMap["Count"].(float64) + } + + if twopc, ok := histogram["TwoPC"]; ok { + twopcMap, ok := twopc.(map[string]any) + require.True(t, ok, "twopc histogram is not a map") + cm.TwoPCCount = twopcMap["Count"].(float64) + } + + return cm +} + +func getVarValue[T any](t *testing.T, key string, varFunc func() map[string]any) T { + t.Helper() + + vars := varFunc() + require.NotNil(t, vars) + + value, exists := vars[key] + if !exists { + return *new(T) + } + castValue, ok := value.(T) + if !ok { + t.Errorf("unexpected type, want: %T, got %T", new(T), value) + } + return castValue +} + +func waitForResolve(ctx context.Context, t *testing.T, conn *vtgateconn.VTGateSession, waitTime time.Duration) { + t.Helper() + + dtid := getDTIDFromWarnings(ctx, t, conn) + waitForDTIDResolve(ctx, t, conn, dtid, waitTime) +} + +func getDTIDFromWarnings(ctx context.Context, t *testing.T, conn *vtgateconn.VTGateSession) string { + qr, err := conn.Execute(ctx, "show warnings", nil) + require.NoError(t, err) + require.Len(t, qr.Rows, 1) + + // validate warning output + w := twopcutil.ToWarn(qr.Rows[0]) + assert.Equal(t, "Warning", w.Level) + assert.EqualValues(t, 302, w.Code) + + // extract transaction ID + indx := strings.Index(w.Msg, " ") + require.Greater(t, indx, 0) + return w.Msg[:indx] +} + +func waitForDTIDResolve(ctx context.Context, t *testing.T, conn *vtgateconn.VTGateSession, dtid string, waitTime time.Duration) { + unresolved := true + totalTime := time.After(waitTime) + for unresolved { + select { + case <-totalTime: + t.Errorf("transaction resolution exceeded wait time of %v", waitTime) + unresolved = false // break the loop. + case <-time.After(100 * time.Millisecond): + qr, err := conn.Execute(ctx, fmt.Sprintf(`show transaction status for '%s'`, dtid), nil) + require.NoError(t, err) + unresolved = len(qr.Rows) != 0 + } + } +} diff --git a/go/test/endtoend/transaction/twopc/metric/schema.sql b/go/test/endtoend/transaction/twopc/metric/schema.sql new file mode 100644 index 00000000000..da6e5cf289a --- /dev/null +++ b/go/test/endtoend/transaction/twopc/metric/schema.sql @@ -0,0 +1,13 @@ +create table twopc_user +( + id bigint, + name varchar(64), + primary key (id) +) Engine=InnoDB; + +create table twopc_t1 +( + id bigint, + col bigint, + primary key (id) +) Engine=InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/transaction/twopc/vschema.json b/go/test/endtoend/transaction/twopc/metric/vschema.json similarity index 68% rename from go/test/endtoend/vtgate/transaction/twopc/vschema.json rename to go/test/endtoend/transaction/twopc/metric/vschema.json index 4ff62df6808..c6be1426a87 100644 --- a/go/test/endtoend/vtgate/transaction/twopc/vschema.json +++ b/go/test/endtoend/transaction/twopc/metric/vschema.json @@ -3,6 +3,9 @@ "vindexes": { "xxhash": { "type": "xxhash" + }, + "reverse_bits": { + "type": "reverse_bits" } }, "tables": { @@ -14,11 +17,11 @@ } ] }, - "twopc_music": { + "twopc_t1": { "column_vindexes": [ { - "column": "user_id", - "name": "xxhash" + "column": "id", + "name": "reverse_bits" } ] } diff --git a/go/test/endtoend/transaction/twopc/schema.sql b/go/test/endtoend/transaction/twopc/schema.sql new file mode 100644 index 00000000000..7c289a03c2a --- /dev/null +++ b/go/test/endtoend/transaction/twopc/schema.sql @@ -0,0 +1,21 @@ +create table twopc_user +( + id bigint, + name varchar(64), + primary key (id) +) Engine=InnoDB; + +create table twopc_music +( + id varchar(64), + user_id bigint, + title varchar(64), + primary key (id) +) Engine=InnoDB; + +create table twopc_t1 +( + id bigint, + col bigint, + primary key (id) +) Engine=InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/transaction/twopc/stress/main_test.go b/go/test/endtoend/transaction/twopc/stress/main_test.go new file mode 100644 index 00000000000..76cd05df50a --- /dev/null +++ b/go/test/endtoend/transaction/twopc/stress/main_test.go @@ -0,0 +1,130 @@ +/* +Copyright 2024 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 stress + +import ( + "context" + _ "embed" + "flag" + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" +) + +var ( + clusterInstance *cluster.LocalProcessCluster + vtParams mysql.ConnParams + vtgateGrpcAddress string + keyspaceName = "ks" + unshardedKeyspaceName = "uks" + cell = "zone1" + hostname = "localhost" + + //go:embed schema.sql + SchemaSQL string + + //go:embed vschema.json + VSchema string +) + +func TestMain(m *testing.M) { + defer cluster.PanicHandler(nil) + flag.Parse() + + exitcode := func() int { + clusterInstance = cluster.NewCluster(cell, hostname) + defer clusterInstance.Teardown() + + // Start topo server + if err := clusterInstance.StartTopo(); err != nil { + return 1 + } + + // Reserve vtGate port in order to pass it to vtTablet + clusterInstance.VtgateGrpcPort = clusterInstance.GetAndReservePort() + + // Set extra args for twopc + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, + "--transaction_mode", "TWOPC", + "--grpc_use_effective_callerid", + "--tablet_refresh_interval", "2s", + ) + clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, + "--twopc_enable", + "--twopc_abandon_age", "1", + "--migration_check_interval", "2s", + "--onterm_timeout", "1s", + "--onclose_timeout", "1s", + ) + + // Start keyspace + keyspace := &cluster.Keyspace{ + Name: keyspaceName, + SchemaSQL: SchemaSQL, + VSchema: VSchema, + DurabilityPolicy: "semi_sync", + } + if err := clusterInstance.StartKeyspace(*keyspace, []string{"-40", "40-80", "80-"}, 2, false); err != nil { + return 1 + } + + // Start an unsharded keyspace + unshardedKeyspace := &cluster.Keyspace{ + Name: unshardedKeyspaceName, + SchemaSQL: "", + VSchema: "{}", + DurabilityPolicy: "semi_sync", + } + if err := clusterInstance.StartUnshardedKeyspace(*unshardedKeyspace, 2, false); err != nil { + return 1 + } + + // Start Vtgate + if err := clusterInstance.StartVtgate(); err != nil { + return 1 + } + vtParams = clusterInstance.GetVTParams("") + vtgateGrpcAddress = fmt.Sprintf("%s:%d", clusterInstance.Hostname, clusterInstance.VtgateGrpcPort) + + return m.Run() + }() + os.Exit(exitcode) +} + +func start(t *testing.T) (*mysql.Conn, func()) { + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + cleanup(t) + + return conn, func() { + conn.Close() + cleanup(t) + } +} + +func cleanup(t *testing.T) { + cluster.PanicHandler(t) + utils.ClearOutTable(t, vtParams, "twopc_t1") + utils.ClearOutTable(t, vtParams, "twopc_settings") +} diff --git a/go/test/endtoend/transaction/twopc/stress/schema.sql b/go/test/endtoend/transaction/twopc/stress/schema.sql new file mode 100644 index 00000000000..81f28d21340 --- /dev/null +++ b/go/test/endtoend/transaction/twopc/stress/schema.sql @@ -0,0 +1,11 @@ +create table twopc_t1 ( + id bigint, + col bigint, + primary key (id) +) Engine=InnoDB; + +create table twopc_settings ( + id bigint, + col varchar(50), + primary key (id) +) Engine=InnoDB; diff --git a/go/test/endtoend/transaction/twopc/stress/stress_test.go b/go/test/endtoend/transaction/twopc/stress/stress_test.go new file mode 100644 index 00000000000..05a89b780dc --- /dev/null +++ b/go/test/endtoend/transaction/twopc/stress/stress_test.go @@ -0,0 +1,454 @@ +/* +Copyright 2024 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 stress + +import ( + "context" + "fmt" + "os" + "path" + "strconv" + "strings" + "sync" + "syscall" + "testing" + "time" + + "github.com/stretchr/testify/require" + "golang.org/x/exp/rand" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/syscallutil" + "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/test/endtoend/onlineddl" + twopcutil "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" + "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/vt/log" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/schema" +) + +var ( + // idVals are the primary key values to use while creating insert queries that ensures all the three shards get an insert. + idVals = [3]int{ + 4, // 4 maps to 0x20 and ends up in the first shard (-40) + 6, // 6 maps to 0x60 and ends up in the second shard (40-80) + 9, // 9 maps to 0x90 and ends up in the third shard (80-) + } +) + +func TestSettings(t *testing.T) { + testcases := []struct { + name string + commitDelayTime string + queries []string + verifyFunc func(t *testing.T, vtParams *mysql.ConnParams) + }{ + { + name: "No settings changes", + commitDelayTime: "5", + queries: append([]string{"begin"}, getMultiShardInsertQueries()...), + verifyFunc: func(t *testing.T, vtParams *mysql.ConnParams) { + // There is nothing to verify. + }, + }, + { + name: "Settings changes before begin", + commitDelayTime: "5", + queries: append( + append([]string{`set @@time_zone="+10:30"`, "begin"}, getMultiShardInsertQueries()...), + "insert into twopc_settings(id, col) values(9, now())"), + verifyFunc: func(t *testing.T, vtParams *mysql.ConnParams) { + // We can check that the time_zone setting was taken into account by checking the diff with the time by using a different time_zone. + ctx := context.Background() + conn, err := mysql.Connect(ctx, vtParams) + require.NoError(t, err) + defer conn.Close() + utils.Exec(t, conn, `set @@time_zone="+7:00"`) + utils.AssertMatches(t, conn, `select HOUR(TIMEDIFF((select col from twopc_settings where id = 9),now()))`, `[[INT64(3)]]`) + }, + }, + { + name: "Settings changes during transaction", + commitDelayTime: "5", + queries: append( + append([]string{"begin"}, getMultiShardInsertQueries()...), + `set @@time_zone="+10:30"`, + "insert into twopc_settings(id, col) values(9, now())"), + verifyFunc: func(t *testing.T, vtParams *mysql.ConnParams) { + // We can check that the time_zone setting was taken into account by checking the diff with the time by using a different time_zone. + ctx := context.Background() + conn, err := mysql.Connect(ctx, vtParams) + require.NoError(t, err) + defer conn.Close() + utils.Exec(t, conn, `set @@time_zone="+7:00"`) + utils.AssertMatches(t, conn, `select HOUR(TIMEDIFF((select col from twopc_settings where id = 9),now()))`, `[[INT64(3)]]`) + }, + }, + { + name: "Settings changes before begin and during transaction", + commitDelayTime: "5", + queries: append( + append([]string{`set @@time_zone="+10:30"`, "begin"}, getMultiShardInsertQueries()...), + "insert into twopc_settings(id, col) values(9, now())", + `set @@time_zone="+7:00"`, + "insert into twopc_settings(id, col) values(25, now())"), + verifyFunc: func(t *testing.T, vtParams *mysql.ConnParams) { + // We can check that the time_zone setting was taken into account by checking the diff with the time by using a different time_zone. + ctx := context.Background() + conn, err := mysql.Connect(ctx, vtParams) + require.NoError(t, err) + defer conn.Close() + utils.AssertMatches(t, conn, `select HOUR(TIMEDIFF((select col from twopc_settings where id = 9),(select col from twopc_settings where id = 25)))`, `[[INT64(3)]]`) + }, + }, + } + + for _, tt := range testcases { + t.Run(tt.name, func(t *testing.T) { + // Reparent all the shards to first tablet being the primary. + reparentToFirstTablet(t) + // cleanup all the old data. + conn, closer := start(t) + defer closer() + defer twopcutil.DeleteFile(twopcutil.DebugDelayCommitShard) + defer twopcutil.DeleteFile(twopcutil.DebugDelayCommitTime) + var wg sync.WaitGroup + runMultiShardCommitWithDelay(t, conn, tt.commitDelayTime, &wg, tt.queries) + // Allow enough time for the commit to have started. + time.Sleep(1 * time.Second) + // Run the vttablet restart to ensure that the transaction needs to be redone. + err := vttabletRestartShard3(t) + require.NoError(t, err) + // Wait for the commit to have returned. We don't actually check for an error in the commit because the user might receive an error. + // But since we are waiting in CommitPrepared, the decision to commit the transaction should have already been taken. + wg.Wait() + // Wair for the data in the table to see that the transaction was committed. + twopcutil.WaitForResults(t, &vtParams, "select id, col from twopc_t1 where col = 4 order by id", `[[INT64(4) INT64(4)] [INT64(6) INT64(4)] [INT64(9) INT64(4)]]`, 30*time.Second) + tt.verifyFunc(t, &vtParams) + }) + } + +} + +// TestDisruptions tests that atomic transactions persevere through various disruptions. +func TestDisruptions(t *testing.T) { + testcases := []struct { + disruptionName string + commitDelayTime string + setupFunc func(t *testing.T) + disruption func(t *testing.T) error + resetFunc func(t *testing.T) + }{ + { + disruptionName: "No Disruption", + commitDelayTime: "1", + disruption: func(t *testing.T) error { + return nil + }, + }, + { + disruptionName: "Resharding", + commitDelayTime: "20", + setupFunc: createShard, + disruption: mergeShards, + resetFunc: splitShardsBack, + }, + { + disruptionName: "PlannedReparentShard", + commitDelayTime: "5", + disruption: prsShard3, + }, + { + disruptionName: "MySQL Restart", + commitDelayTime: "5", + disruption: mysqlRestartShard3, + }, + { + disruptionName: "Vttablet Restart", + commitDelayTime: "5", + disruption: vttabletRestartShard3, + }, + { + disruptionName: "OnlineDDL", + commitDelayTime: "20", + disruption: onlineDDL, + }, + { + disruptionName: "MoveTables - Complete", + commitDelayTime: "10", + disruption: moveTablesComplete, + resetFunc: moveTablesReset, + }, + { + disruptionName: "MoveTables - Cancel", + commitDelayTime: "10", + disruption: moveTablesCancel, + }, + { + disruptionName: "EmergencyReparentShard", + commitDelayTime: "5", + disruption: ersShard3, + }, + } + for _, tt := range testcases { + t.Run(fmt.Sprintf("%s-%ss delay", tt.disruptionName, tt.commitDelayTime), func(t *testing.T) { + // Reparent all the shards to first tablet being the primary. + reparentToFirstTablet(t) + if tt.setupFunc != nil { + tt.setupFunc(t) + } + // cleanup all the old data. + conn, closer := start(t) + defer closer() + defer twopcutil.DeleteFile(twopcutil.DebugDelayCommitShard) + defer twopcutil.DeleteFile(twopcutil.DebugDelayCommitTime) + var wg sync.WaitGroup + runMultiShardCommitWithDelay(t, conn, tt.commitDelayTime, &wg, append([]string{"begin"}, getMultiShardInsertQueries()...)) + // Allow enough time for the commit to have started. + time.Sleep(1 * time.Second) + writeCtx, writeCancel := context.WithCancel(context.Background()) + var writerWg sync.WaitGroup + // Run multiple threads to try to write to the database on the same values of id to ensure that we don't + // allow any writes while the transaction is prepared and not committed. + for i := 0; i < 10; i++ { + writerWg.Add(1) + go func() { + defer writerWg.Done() + threadToWrite(t, writeCtx, idVals[i%3]) + }() + } + // Run the disruption. + err := tt.disruption(t) + require.NoError(t, err) + // Wait for the commit to have returned. We don't actually check for an error in the commit because the user might receive an error. + // But since we are waiting in CommitPrepared, the decision to commit the transaction should have already been taken. + wg.Wait() + // Check the data in the table. + twopcutil.WaitForResults(t, &vtParams, "select id, col from twopc_t1 where col = 4 order by id", `[[INT64(4) INT64(4)] [INT64(6) INT64(4)] [INT64(9) INT64(4)]]`, 30*time.Second) + writeCancel() + writerWg.Wait() + + if tt.resetFunc != nil { + tt.resetFunc(t) + } + }) + } +} + +// getMultiShardInsertQueries gets the queries that will cause one insert on all the shards. +func getMultiShardInsertQueries() []string { + var queries []string + // Insert rows such that they go to all the three shards. Given that we have sharded the table `twopc_t1` on reverse_bits + // it is very easy to figure out what value will end up in which shard. + for _, val := range idVals { + queries = append(queries, fmt.Sprintf("insert into twopc_t1(id, col) values(%d, 4)", val)) + } + return queries +} + +// runMultiShardCommitWithDelay runs a multi shard commit and configures it to wait for a certain amount of time in the commit phase. +func runMultiShardCommitWithDelay(t *testing.T, conn *mysql.Conn, commitDelayTime string, wg *sync.WaitGroup, queries []string) { + // Run all the queries to start the transaction. + for _, query := range queries { + utils.Exec(t, conn, query) + } + // We want to delay the commit on one of the shards to simulate slow commits on a shard. + twopcutil.WriteTestCommunicationFile(t, twopcutil.DebugDelayCommitShard, "80-") + twopcutil.WriteTestCommunicationFile(t, twopcutil.DebugDelayCommitTime, commitDelayTime) + // We will execute a commit in a go routine, because we know it will take some time to complete. + // While the commit is ongoing, we would like to run the disruption. + wg.Add(1) + go func() { + defer wg.Done() + _, err := utils.ExecAllowError(t, conn, "commit") + if err != nil { + log.Errorf("Error in commit - %v", err) + } + }() +} + +func mergeShards(t *testing.T) error { + return twopcutil.RunReshard(t, clusterInstance, "TestDisruptions", keyspaceName, "40-80,80-", "40-") +} + +func splitShardsBack(t *testing.T) { + t.Helper() + twopcutil.AddShards(t, clusterInstance, keyspaceName, []string{"40-80", "80-"}) + err := twopcutil.RunReshard(t, clusterInstance, "TestDisruptions", keyspaceName, "40-", "40-80,80-") + require.NoError(t, err) +} + +// createShard creates a new shard in the keyspace that we'll use for Resharding. +func createShard(t *testing.T) { + t.Helper() + twopcutil.AddShards(t, clusterInstance, keyspaceName, []string{"40-"}) +} + +// threadToWrite is a helper function to write to the database in a loop. +func threadToWrite(t *testing.T, ctx context.Context, id int) { + for { + select { + case <-ctx.Done(): + return + default: + } + conn, err := mysql.Connect(ctx, &vtParams) + if err != nil { + continue + } + _, _ = utils.ExecAllowError(t, conn, fmt.Sprintf("insert into twopc_t1(id, col) values(%d, %d)", id, rand.Intn(10000))) + conn.Close() + } +} + +// reparentToFirstTablet reparents all the shards to first tablet being the primary. +func reparentToFirstTablet(t *testing.T) { + ks := clusterInstance.Keyspaces[0] + for _, shard := range ks.Shards { + primary := shard.Vttablets[0] + err := clusterInstance.VtctldClientProcess.PlannedReparentShard(keyspaceName, shard.Name, primary.Alias) + require.NoError(t, err) + } +} + +/* +Cluster Level Disruptions for the fuzzer +*/ + +// prsShard3 runs a PRS in shard 3 of the keyspace. It promotes the second tablet to be the new primary. +func prsShard3(t *testing.T) error { + shard := clusterInstance.Keyspaces[0].Shards[2] + newPrimary := shard.Vttablets[1] + return clusterInstance.VtctldClientProcess.PlannedReparentShard(keyspaceName, shard.Name, newPrimary.Alias) +} + +// ersShard3 runs a ERS in shard 3 of the keyspace. It promotes the second tablet to be the new primary. +func ersShard3(t *testing.T) error { + shard := clusterInstance.Keyspaces[0].Shards[2] + newPrimary := shard.Vttablets[1] + _, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("EmergencyReparentShard", fmt.Sprintf("%s/%s", keyspaceName, shard.Name), "--new-primary", newPrimary.Alias) + return err +} + +// vttabletRestartShard3 restarts the first vttablet of the third shard. +func vttabletRestartShard3(t *testing.T) error { + shard := clusterInstance.Keyspaces[0].Shards[2] + tablet := shard.Vttablets[0] + _ = tablet.VttabletProcess.TearDownWithTimeout(2 * time.Second) + tablet.VttabletProcess.ServingStatus = "SERVING" + return tablet.VttabletProcess.Setup() +} + +// mysqlRestartShard3 restarts MySQL on the first tablet of the third shard. +func mysqlRestartShard3(t *testing.T) error { + shard := clusterInstance.Keyspaces[0].Shards[2] + vttablets := shard.Vttablets + tablet := vttablets[0] + log.Errorf("Restarting MySQL for - %v/%v tablet - %v", keyspaceName, shard.Name, tablet.Alias) + pidFile := path.Join(os.Getenv("VTDATAROOT"), fmt.Sprintf("/vt_%010d/mysql.pid", tablet.TabletUID)) + pidBytes, err := os.ReadFile(pidFile) + if err != nil { + // We can't read the file which means the PID file does not exist + // The server must have stopped + return err + } + pid, err := strconv.Atoi(strings.TrimSpace(string(pidBytes))) + if err != nil { + return err + } + return syscallutil.Kill(pid, syscall.SIGKILL) +} + +// moveTablesCancel runs a move tables command that we cancel in the end. +func moveTablesCancel(t *testing.T) error { + workflow := "TestDisruptions" + mtw := cluster.NewMoveTables(t, clusterInstance, workflow, unshardedKeyspaceName, keyspaceName, "twopc_t1", []string{topodatapb.TabletType_REPLICA.String()}) + // Initiate MoveTables for twopc_t1. + output, err := mtw.Create() + require.NoError(t, err, output) + // Wait for vreplication to catchup. Should be very fast since we don't have a lot of rows. + mtw.WaitForVreplCatchup(10 * time.Second) + // SwitchTraffic + output, err = mtw.SwitchReadsAndWrites() + require.NoError(t, err, output) + output, err = mtw.ReverseReadsAndWrites() + require.NoError(t, err, output) + output, err = mtw.Cancel() + require.NoError(t, err, output) + return nil +} + +// moveTablesComplete runs a move tables command that we complete in the end. +func moveTablesComplete(t *testing.T) error { + workflow := "TestDisruptions" + mtw := cluster.NewMoveTables(t, clusterInstance, workflow, unshardedKeyspaceName, keyspaceName, "twopc_t1", []string{topodatapb.TabletType_REPLICA.String()}) + // Initiate MoveTables for twopc_t1. + output, err := mtw.Create() + require.NoError(t, err, output) + // Wait for vreplication to catchup. Should be very fast since we don't have a lot of rows. + mtw.WaitForVreplCatchup(10 * time.Second) + // SwitchTraffic + output, err = mtw.SwitchReadsAndWrites() + require.NoError(t, err, output) + output, err = mtw.Complete() + require.NoError(t, err, output) + return nil +} + +// moveTablesReset moves the table back from the unsharded keyspace to sharded +func moveTablesReset(t *testing.T) { + // We apply the vschema again because previous move tables would have removed the entry for `twopc_t1`. + err := clusterInstance.VtctldClientProcess.ApplyVSchema(keyspaceName, VSchema) + require.NoError(t, err) + workflow := "TestDisruptions" + mtw := cluster.NewMoveTables(t, clusterInstance, workflow, keyspaceName, unshardedKeyspaceName, "twopc_t1", []string{topodatapb.TabletType_REPLICA.String()}) + // Initiate MoveTables for twopc_t1. + output, err := mtw.Create() + require.NoError(t, err, output) + // Wait for vreplication to catchup. Should be very fast since we don't have a lot of rows. + mtw.WaitForVreplCatchup(10 * time.Second) + // SwitchTraffic + output, err = mtw.SwitchReadsAndWrites() + require.NoError(t, err, output) + output, err = mtw.Complete() + require.NoError(t, err, output) +} + +var orderedDDL = []string{ + "alter table twopc_t1 add column extra_col1 varchar(20)", + "alter table twopc_t1 add column extra_col2 varchar(20)", + "alter table twopc_t1 add column extra_col3 varchar(20)", + "alter table twopc_t1 add column extra_col4 varchar(20)", +} + +var count = 0 + +// onlineDDL runs a DDL statement. +func onlineDDL(t *testing.T) error { + output, err := clusterInstance.VtctldClientProcess.ApplySchemaWithOutput(keyspaceName, orderedDDL[count%len(orderedDDL)], cluster.ApplySchemaParams{ + DDLStrategy: "vitess --force-cut-over-after=1ms", + }) + require.NoError(t, err) + count++ + fmt.Println("uuid: ", output) + status := twopcutil.WaitForMigrationStatus(t, &vtParams, keyspaceName, clusterInstance.Keyspaces[0].Shards, + strings.TrimSpace(output), 2*time.Minute, schema.OnlineDDLStatusComplete, schema.OnlineDDLStatusFailed) + onlineddl.CheckMigrationStatus(t, &vtParams, clusterInstance.Keyspaces[0].Shards, strings.TrimSpace(output), status) + require.Equal(t, schema.OnlineDDLStatusComplete, status) + return nil +} diff --git a/go/test/endtoend/transaction/twopc/stress/vschema.json b/go/test/endtoend/transaction/twopc/stress/vschema.json new file mode 100644 index 00000000000..6873b233e61 --- /dev/null +++ b/go/test/endtoend/transaction/twopc/stress/vschema.json @@ -0,0 +1,26 @@ +{ + "sharded":true, + "vindexes": { + "reverse_bits": { + "type": "reverse_bits" + } + }, + "tables": { + "twopc_t1": { + "column_vindexes": [ + { + "column": "id", + "name": "reverse_bits" + } + ] + }, + "twopc_settings": { + "column_vindexes": [ + { + "column": "id", + "name": "reverse_bits" + } + ] + } + } +} \ No newline at end of file diff --git a/go/test/endtoend/transaction/twopc/twopc_test.go b/go/test/endtoend/transaction/twopc/twopc_test.go new file mode 100644 index 00000000000..95d962655ba --- /dev/null +++ b/go/test/endtoend/transaction/twopc/twopc_test.go @@ -0,0 +1,1371 @@ +/* +Copyright 2024 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 transaction + +import ( + "context" + _ "embed" + "fmt" + "reflect" + "sort" + "strings" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/test/endtoend/cluster" + twopcutil "vitess.io/vitess/go/test/endtoend/transaction/twopc/utils" + "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/vt/callerid" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/vtgate/vtgateconn" +) + +// TestDTCommit tests distributed transaction commit for insert, update and delete operations +// It verifies the binlog events for the same with transaction state changes and redo statements. +func TestDTCommit(t *testing.T) { + conn, closer := start(t) + defer closer() + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + // Insert into multiple shards + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo')") + utils.Exec(t, conn, "insert into twopc_user(id, name) values(8,'bar')") + utils.Exec(t, conn, `set @@time_zone="+10:30"`) + utils.Exec(t, conn, "insert into twopc_user(id, name) values(9,'baz')") + utils.Exec(t, conn, "insert into twopc_user(id, name) values(10,'apa')") + utils.Exec(t, conn, "commit") + + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitions(t, ch, tableMap, dtMap) + expectations := map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "insert:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + }, + "ks.redo_state:-40": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_state:40-80": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:-40": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"set @@time_zone = '+10:30'\")]", + "insert:[VARCHAR(\"dtid-1\") INT64(2) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"set @@time_zone = '+10:30'\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(2) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", + }, + "ks.redo_statement:40-80": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + "insert:[VARCHAR(\"dtid-1\") INT64(2) BLOB(\"set @@time_zone = '+10:30'\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(2) BLOB(\"set @@time_zone = '+10:30'\")]", + }, + "ks.twopc_user:-40": { + `insert:[INT64(10) VARCHAR("apa")]`, + }, + "ks.twopc_user:40-80": { + `insert:[INT64(8) VARCHAR("bar")]`, + }, + "ks.twopc_user:80-": { + `insert:[INT64(7) VARCHAR("foo")]`, + `insert:[INT64(9) VARCHAR("baz")]`, + }, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // Update from multiple shard + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 7") + utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 8") + utils.Exec(t, conn, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + }, + "ks.redo_state:40-80": { + "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:40-80": { + "insert:[VARCHAR(\"dtid-2\") INT64(1) BLOB(\"set @@time_zone = '+10:30'\")]", + "insert:[VARCHAR(\"dtid-2\") INT64(2) BLOB(\"update twopc_user set `name` = 'newfoo' where id = 8 limit 10001 /* INT64 */\")]", + "delete:[VARCHAR(\"dtid-2\") INT64(1) BLOB(\"set @@time_zone = '+10:30'\")]", + "delete:[VARCHAR(\"dtid-2\") INT64(2) BLOB(\"update twopc_user set `name` = 'newfoo' where id = 8 limit 10001 /* INT64 */\")]", + }, + "ks.twopc_user:40-80": {"update:[INT64(8) VARCHAR(\"newfoo\")]"}, + "ks.twopc_user:80-": {"update:[INT64(7) VARCHAR(\"newfoo\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // DELETE from multiple shard + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "delete from twopc_user where id = 9") + utils.Exec(t, conn, "delete from twopc_user where id = 10") + utils.Exec(t, conn, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + "delete:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + }, + "ks.redo_state:-40": { + "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:-40": { + "insert:[VARCHAR(\"dtid-3\") INT64(1) BLOB(\"set @@time_zone = '+10:30'\")]", + "insert:[VARCHAR(\"dtid-3\") INT64(2) BLOB(\"delete from twopc_user where id = 10 limit 10001 /* INT64 */\")]", + "delete:[VARCHAR(\"dtid-3\") INT64(1) BLOB(\"set @@time_zone = '+10:30'\")]", + "delete:[VARCHAR(\"dtid-3\") INT64(2) BLOB(\"delete from twopc_user where id = 10 limit 10001 /* INT64 */\")]", + }, + "ks.twopc_user:-40": {"delete:[INT64(10) VARCHAR(\"apa\")]"}, + "ks.twopc_user:80-": {"delete:[INT64(9) VARCHAR(\"baz\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +// TestDTRollback tests distributed transaction rollback for insert, update and delete operations +// There would not be any binlog events for rollback +func TestDTRollback(t *testing.T) { + conn, closer := start(t) + defer closer() + + // Insert initial Data + utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo'), (8,'bar')") + + // run vstream to stream binlogs + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + // Insert into multiple shards + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "insert into twopc_user(id, name) values(9,'baz')") + utils.Exec(t, conn, "insert into twopc_user(id, name) values(10,'apa')") + utils.Exec(t, conn, "rollback") + + tableMap := make(map[string][]*querypb.Field) + logTable := retrieveTransitions(t, ch, tableMap, nil) + assert.Zero(t, len(logTable), + "no change in binlog expected: got: %s", prettyPrint(logTable)) + + // Update from multiple shard + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 7") + utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 8") + utils.Exec(t, conn, "rollback") + + logTable = retrieveTransitions(t, ch, tableMap, nil) + assert.Zero(t, len(logTable), + "no change in binlog expected: got: %s", prettyPrint(logTable)) + + // DELETE from multiple shard + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "delete from twopc_user where id = 7") + utils.Exec(t, conn, "delete from twopc_user where id = 8") + utils.Exec(t, conn, "rollback") + + logTable = retrieveTransitions(t, ch, tableMap, nil) + assert.Zero(t, len(logTable), + "no change in binlog expected: got: %s", prettyPrint(logTable)) +} + +// TestDTCommitMultiShardTxSingleShardDML tests distributed transaction commit for insert, update and delete operations +// There is DML operation only on single shard but transaction open on multiple shards. +// Metdata Manager is the one which executed the DML operation on the shard. +func TestDTCommitDMLOnlyOnMM(t *testing.T) { + conn, closer := start(t) + defer closer() + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + // Insert into multiple shards + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo')") + utils.Exec(t, conn, "select * from twopc_user where id = 8") + utils.Exec(t, conn, "select * from twopc_user where id = 10") + utils.Exec(t, conn, "commit") + + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitions(t, ch, tableMap, dtMap) + expectations := map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "insert:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + }, + "ks.twopc_user:80-": {"insert:[INT64(7) VARCHAR(\"foo\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // Update from multiple shard + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 7") + utils.Exec(t, conn, "select * from twopc_user where id = 8") + utils.Exec(t, conn, "select * from twopc_user where id = 10") + utils.Exec(t, conn, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "insert:[VARCHAR(\"dtid-2\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + "delete:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-2\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + }, + "ks.twopc_user:80-": {"update:[INT64(7) VARCHAR(\"newfoo\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // DELETE from multiple shard + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "delete from twopc_user where id = 7") + utils.Exec(t, conn, "select * from twopc_user where id = 8") + utils.Exec(t, conn, "select * from twopc_user where id = 10") + utils.Exec(t, conn, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "insert:[VARCHAR(\"dtid-3\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + "delete:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-3\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + }, + "ks.twopc_user:80-": {"delete:[INT64(7) VARCHAR(\"newfoo\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +// TestDTCommitMultiShardTxSingleShardDML tests distributed transaction commit for insert, update and delete operations +// There is DML operation only on single shard but transaction open on multiple shards. +// Resource Manager is the one which executed the DML operation on the shard. +func TestDTCommitDMLOnlyOnRM(t *testing.T) { + conn, closer := start(t) + defer closer() + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + // Insert into multiple shards + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "select * from twopc_user where id = 8") + utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo')") + utils.Exec(t, conn, "commit") + + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitions(t, ch, tableMap, dtMap) + expectations := map[string][]string{ + "ks.dt_state:40-80": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:40-80": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + }, + "ks.redo_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (7, 'foo')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (7, 'foo')\")]", + }, + "ks.twopc_user:80-": {"insert:[INT64(7) VARCHAR(\"foo\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // Update from multiple shard + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "select * from twopc_user where id = 8") + utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 7") + utils.Exec(t, conn, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.dt_state:40-80": { + "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:40-80": { + "insert:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + "delete:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + }, + "ks.redo_state:80-": { + "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:80-": { + "insert:[VARCHAR(\"dtid-2\") INT64(1) BLOB(\"update twopc_user set `name` = 'newfoo' where id = 7 limit 10001 /* INT64 */\")]", + "delete:[VARCHAR(\"dtid-2\") INT64(1) BLOB(\"update twopc_user set `name` = 'newfoo' where id = 7 limit 10001 /* INT64 */\")]", + }, + "ks.twopc_user:80-": {"update:[INT64(7) VARCHAR(\"newfoo\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // DELETE from multiple shard + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "select * from twopc_user where id = 8") + utils.Exec(t, conn, "delete from twopc_user where id = 7") + utils.Exec(t, conn, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.dt_state:40-80": { + "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:40-80": { + "insert:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + "delete:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + }, + "ks.redo_state:80-": { + "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:80-": { + "insert:[VARCHAR(\"dtid-3\") INT64(1) BLOB(\"delete from twopc_user where id = 7 limit 10001 /* INT64 */\")]", + "delete:[VARCHAR(\"dtid-3\") INT64(1) BLOB(\"delete from twopc_user where id = 7 limit 10001 /* INT64 */\")]", + }, + "ks.twopc_user:80-": {"delete:[INT64(7) VARCHAR(\"newfoo\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +// TestDTPrepareFailOnRM tests distributed transaction prepare failure on resource manager +func TestDTPrepareFailOnRM(t *testing.T) { + conn, closer := start(t) + defer closer() + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + // Insert into multiple shards + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo')") + utils.Exec(t, conn, "insert into twopc_user(id, name) values(8,'bar')") + + ctx2 := context.Background() + conn2, err := mysql.Connect(ctx2, &vtParams) + require.NoError(t, err) + + utils.Exec(t, conn2, "begin") + utils.Exec(t, conn2, "insert into twopc_user(id, name) values(9,'baz')") + utils.Exec(t, conn2, "insert into twopc_user(id, name) values(18,'apa')") + + var wg sync.WaitGroup + wg.Add(2) + var commitErr error + go func() { + _, err := utils.ExecAllowError(t, conn, "commit") + if err != nil { + commitErr = err + } + wg.Done() + }() + go func() { + _, err := utils.ExecAllowError(t, conn2, "commit") + wg.Done() + if err != nil { + commitErr = err + } + }() + wg.Wait() + require.ErrorContains(t, commitErr, "ResourceExhausted desc = prepare failed") + + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitions(t, ch, tableMap, dtMap) + expectations := map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + "update:[VARCHAR(\"dtid-2\") VARCHAR(\"ROLLBACK\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"ROLLBACK\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "insert:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + }, + "ks.redo_state:40-80": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:40-80": { /* flexi Expectation */ }, + "ks.twopc_user:40-80": { /* flexi Expectation */ }, + "ks.twopc_user:80-": { /* flexi Expectation */ }, + } + flexiExpectations := map[string][2][]string{ + "ks.redo_statement:40-80": {{ + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + }, { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (18, 'apa')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (18, 'apa')\")]", + }}, + "ks.twopc_user:40-80": {{ + "insert:[INT64(8) VARCHAR(\"bar\")]", + }, { + "insert:[INT64(18) VARCHAR(\"apa\")]", + }}, + "ks.twopc_user:80-": {{ + "insert:[INT64(7) VARCHAR(\"foo\")]", + }, { + "insert:[INT64(9) VARCHAR(\"baz\")]", + }}, + } + + compareMaps(t, expectations, logTable, flexiExpectations) +} + +func compareMaps(t *testing.T, expected, actual map[string][]string, flexibleExp map[string][2][]string) { + assert.Equal(t, len(expected), len(actual), "mismatch in number of keys: expected: %d, got: %d", len(expected), len(actual)) + + for key, expectedValue := range expected { + actualValue, ok := actual[key] + require.Truef(t, ok, "key %s not found in actual map", key) + + if validValues, isFlexi := flexibleExp[key]; isFlexi { + // For the flexible key, check if the actual value matches one of the valid values + if !reflect.DeepEqual(actualValue, validValues[0]) && !reflect.DeepEqual(actualValue, validValues[1]) { + t.Fatalf("mismatch in values for key '%s': expected one of: %v, got: %v", key, validValues, actualValue) + } + } else { + // Sort the slices before comparison + sort.Strings(expectedValue) + sort.Strings(actualValue) + assert.Equal(t, expectedValue, actualValue, "mismatch in values for key %s: expected: %v, got: %v", key, expectedValue, actualValue) + } + } +} + +// TestDTResolveAfterMMCommit tests that transaction is committed on recovery +// failure after MM commit. +func TestDTResolveAfterMMCommit(t *testing.T) { + defer cleanup(t) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + conn := vtgateConn.Session("", nil) + qCtx, cancel := context.WithCancel(context.Background()) + defer cancel() + // Insert into multiple shards + _, err = conn.Execute(qCtx, "begin", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(7,'foo')", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(8,'bar')", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(9,'baz')", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(10,'apa')", nil) + require.NoError(t, err) + + // The caller ID is used to simulate the failure at the desired point. + newCtx := callerid.NewContext(qCtx, callerid.NewEffectiveCallerID("MMCommitted_FailNow", "", ""), nil) + _, err = conn.Execute(newCtx, "commit", nil) + require.ErrorContains(t, err, "Fail After MM commit") + + testWarningAndTransactionStatus(t, conn, + "distributed transaction ID failed during metadata manager commit; transaction will be committed/rollbacked based on the state on recovery", + false, "COMMIT", "ks:40-80,ks:-40") + + // Below check ensures that the transaction is resolved by the resolver on receiving unresolved transaction signal from MM. + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitionsWithTimeout(t, ch, tableMap, dtMap, 2*time.Second) + expectations := map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "insert:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + }, + "ks.redo_state:-40": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_state:40-80": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:-40": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", + }, + "ks.redo_statement:40-80": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + }, + "ks.twopc_user:-40": { + `insert:[INT64(10) VARCHAR("apa")]`, + }, + "ks.twopc_user:40-80": { + `insert:[INT64(8) VARCHAR("bar")]`, + }, + "ks.twopc_user:80-": { + `insert:[INT64(7) VARCHAR("foo")]`, + `insert:[INT64(9) VARCHAR("baz")]`, + }, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +// TestDTResolveAfterRMPrepare tests that transaction is rolled back on recovery +// failure after RM prepare and before MM commit. +func TestDTResolveAfterRMPrepare(t *testing.T) { + defer cleanup(t) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + conn := vtgateConn.Session("", nil) + qCtx, cancel := context.WithCancel(context.Background()) + defer cancel() + // Insert into multiple shards + _, err = conn.Execute(qCtx, "begin", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(7,'foo')", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(8,'bar')", nil) + require.NoError(t, err) + + // The caller ID is used to simulate the failure at the desired point. + newCtx := callerid.NewContext(qCtx, callerid.NewEffectiveCallerID("RMPrepared_FailNow", "", ""), nil) + _, err = conn.Execute(newCtx, "commit", nil) + require.ErrorContains(t, err, "Fail After RM prepared") + + testWarningAndTransactionStatus(t, conn, + "distributed transaction ID failed during transaction prepare phase; prepare transaction rollback attempted; conclude on recovery", + true /* transaction concluded */, "", "") + + // Below check ensures that the transaction is resolved by the resolver on receiving unresolved transaction signal from MM. + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitionsWithTimeout(t, ch, tableMap, dtMap, 2*time.Second) + expectations := map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"ROLLBACK\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"ROLLBACK\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + }, + "ks.redo_state:40-80": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:40-80": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + }, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +// TestDTResolveDuringRMPrepare tests that transaction is rolled back on recovery +// failure after semi RM prepare. +func TestDTResolveDuringRMPrepare(t *testing.T) { + defer cleanup(t) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + conn := vtgateConn.Session("", nil) + qCtx, cancel := context.WithCancel(context.Background()) + defer cancel() + // Insert into multiple shards + _, err = conn.Execute(qCtx, "begin", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(7,'foo')", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(8,'bar')", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(10,'bar')", nil) + require.NoError(t, err) + + // The caller ID is used to simulate the failure at the desired point. + newCtx := callerid.NewContext(qCtx, callerid.NewEffectiveCallerID("RMPrepare_-40_FailNow", "", ""), nil) + _, err = conn.Execute(newCtx, "commit", nil) + require.ErrorContains(t, err, "Fail During RM prepare") + + testWarningAndTransactionStatus(t, conn, + "distributed transaction ID failed during transaction prepare phase; prepare transaction rollback attempted; conclude on recovery", + true, "", "") + + // Below check ensures that the transaction is resolved by the resolver on receiving unresolved transaction signal from MM. + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitionsWithTimeout(t, ch, tableMap, dtMap, 2*time.Second) + expectations := map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"ROLLBACK\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"ROLLBACK\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "insert:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + }, + "ks.redo_state:40-80": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:40-80": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + }, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +// TestDTResolveDuringRMCommit tests that transaction is committed on recovery +// failure after semi RM commit. +func TestDTResolveDuringRMCommit(t *testing.T) { + defer cleanup(t) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + conn := vtgateConn.Session("", nil) + qCtx, cancel := context.WithCancel(context.Background()) + defer cancel() + // Insert into multiple shards + _, err = conn.Execute(qCtx, "begin", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(7,'foo')", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(8,'bar')", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(10,'apa')", nil) + require.NoError(t, err) + + // The caller ID is used to simulate the failure at the desired point. + newCtx := callerid.NewContext(qCtx, callerid.NewEffectiveCallerID("RMCommit_-40_FailNow", "", ""), nil) + _, err = conn.Execute(newCtx, "commit", nil) + require.ErrorContains(t, err, "Fail During RM commit") + + testWarningAndTransactionStatus(t, conn, + "distributed transaction ID failed during resource manager commit; transaction will be committed on recovery", + false, "COMMIT", "ks:40-80,ks:-40") + + // Below check ensures that the transaction is resolved by the resolver on receiving unresolved transaction signal from MM. + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitionsWithTimeout(t, ch, tableMap, dtMap, 2*time.Second) + expectations := map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "insert:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"-40\")]", + }, + "ks.redo_state:-40": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_state:40-80": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:-40": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", + }, + "ks.redo_statement:40-80": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + }, + "ks.twopc_user:-40": { + `insert:[INT64(10) VARCHAR("apa")]`, + }, + "ks.twopc_user:40-80": { + `insert:[INT64(8) VARCHAR("bar")]`, + }, + "ks.twopc_user:80-": { + `insert:[INT64(7) VARCHAR("foo")]`, + }, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +// TestDTResolveAfterTransactionRecord tests that transaction is rolled back on recovery +// failure after TR created and before RM prepare. +func TestDTResolveAfterTransactionRecord(t *testing.T) { + defer cleanup(t) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + conn := vtgateConn.Session("", nil) + qCtx, cancel := context.WithCancel(context.Background()) + defer cancel() + // Insert into multiple shards + _, err = conn.Execute(qCtx, "begin", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(7,'foo')", nil) + require.NoError(t, err) + _, err = conn.Execute(qCtx, "insert into twopc_user(id, name) values(8,'bar')", nil) + require.NoError(t, err) + + // The caller ID is used to simulate the failure at the desired point. + newCtx := callerid.NewContext(qCtx, callerid.NewEffectiveCallerID("TRCreated_FailNow", "", ""), nil) + _, err = conn.Execute(newCtx, "commit", nil) + require.ErrorContains(t, err, "Fail After TR created") + + testWarningAndTransactionStatus(t, conn, + "distributed transaction ID failed during transaction record creation; rollback attempted; conclude on recovery", + false, "PREPARE", "ks:40-80") + + // Below check ensures that the transaction is resolved by the resolver on receiving unresolved transaction signal from MM. + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitionsWithTimeout(t, ch, tableMap, dtMap, 2*time.Second) + expectations := map[string][]string{ + "ks.dt_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"ROLLBACK\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"ROLLBACK\")]", + }, + "ks.dt_participant:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + }, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +type txStatus struct { + dtid string + state string + rTime string + participants string +} + +func toTxStatus(row sqltypes.Row) txStatus { + return txStatus{ + dtid: row[0].ToString(), + state: row[1].ToString(), + rTime: row[2].ToString(), + participants: row[3].ToString(), + } +} + +func testWarningAndTransactionStatus(t *testing.T, conn *vtgateconn.VTGateSession, warnMsg string, + txConcluded bool, txState string, txParticipants string) { + t.Helper() + + qr, err := conn.Execute(context.Background(), "show warnings", nil) + require.NoError(t, err) + require.Len(t, qr.Rows, 1) + + // validate warning output + w := twopcutil.ToWarn(qr.Rows[0]) + assert.Equal(t, "Warning", w.Level) + assert.EqualValues(t, 302, w.Code) + assert.Contains(t, w.Msg, warnMsg) + + // extract transaction ID + indx := strings.Index(w.Msg, " ") + require.Greater(t, indx, 0) + dtid := w.Msg[:indx] + + qr, err = conn.Execute(context.Background(), fmt.Sprintf(`show transaction status for '%v'`, dtid), nil) + require.NoError(t, err) + + // validate transaction status + if txConcluded { + require.Empty(t, qr.Rows) + } else { + tx := toTxStatus(qr.Rows[0]) + assert.Equal(t, dtid, tx.dtid) + assert.Equal(t, txState, tx.state) + assert.Equal(t, txParticipants, tx.participants) + } +} + +// TestReadingUnresolvedTransactions tests the reading of unresolved transactions +func TestReadingUnresolvedTransactions(t *testing.T) { + defer cleanup(t) + + testcases := []struct { + name string + queries []string + }{ + { + name: "show transaction status for explicit keyspace", + queries: []string{ + fmt.Sprintf("show unresolved transactions for %v", keyspaceName), + }, + }, + { + name: "show transaction status with use command", + queries: []string{ + fmt.Sprintf("use %v", keyspaceName), + "show unresolved transactions", + }, + }, + } + for _, testcase := range testcases { + t.Run(testcase.name, func(t *testing.T) { + conn, closer := start(t) + defer closer() + // Start an atomic transaction. + utils.Exec(t, conn, "begin") + // Insert rows such that they go to all the three shards. Given that we have sharded the table `twopc_t1` on reverse_bits + // it is very easy to figure out what value will end up in which shard. + utils.Exec(t, conn, "insert into twopc_t1(id, col) values(4, 4)") + utils.Exec(t, conn, "insert into twopc_t1(id, col) values(6, 4)") + utils.Exec(t, conn, "insert into twopc_t1(id, col) values(9, 4)") + // We want to delay the commit on one of the shards to simulate slow commits on a shard. + twopcutil.WriteTestCommunicationFile(t, twopcutil.DebugDelayCommitShard, "80-") + defer twopcutil.DeleteFile(twopcutil.DebugDelayCommitShard) + twopcutil.WriteTestCommunicationFile(t, twopcutil.DebugDelayCommitTime, "5") + defer twopcutil.DeleteFile(twopcutil.DebugDelayCommitTime) + // We will execute a commit in a go routine, because we know it will take some time to complete. + // While the commit is ongoing, we would like to check that we see the unresolved transaction. + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + _, err := utils.ExecAllowError(t, conn, "commit") + if err != nil { + fmt.Println("Error in commit: ", err.Error()) + } + }() + // Allow enough time for the commit to have started. + time.Sleep(1 * time.Second) + var lastRes *sqltypes.Result + newConn, err := mysql.Connect(context.Background(), &vtParams) + require.NoError(t, err) + defer newConn.Close() + for _, query := range testcase.queries { + lastRes = utils.Exec(t, newConn, query) + } + require.NotNil(t, lastRes) + require.Len(t, lastRes.Rows, 1) + // This verifies that we already decided to commit the transaction, but it is still unresolved. + assert.Contains(t, fmt.Sprintf("%v", lastRes.Rows), `VARCHAR("COMMIT")`) + // Wait for the commit to have returned. + wg.Wait() + }) + } +} + +// TestDTSavepointWithVanilaMySQL ensures that distributed transactions should work with savepoint as with vanila MySQL +func TestDTSavepointWithVanilaMySQL(t *testing.T) { + mcmp, closer := startWithMySQL(t) + defer closer() + + // internal savepoint + mcmp.Exec("begin") + mcmp.Exec("insert into twopc_user(id, name) values(7,'foo'), (8,'bar')") + mcmp.Exec("commit") + mcmp.Exec("select * from twopc_user order by id") + + // external savepoint, single shard transaction. + mcmp.Exec("begin") + mcmp.Exec("savepoint a") + mcmp.Exec("insert into twopc_user(id, name) values(9,'baz')") + mcmp.Exec("savepoint b") + mcmp.Exec("rollback to b") + mcmp.Exec("commit") + mcmp.Exec("select * from twopc_user order by id") + + // external savepoint, multi-shard transaction. + mcmp.Exec("begin") + mcmp.Exec("savepoint a") + mcmp.Exec("insert into twopc_user(id, name) values(10,'apa')") + mcmp.Exec("savepoint b") + mcmp.Exec("update twopc_user set name = 'temp' where id = 7") + mcmp.Exec("rollback to a") + mcmp.Exec("commit") + mcmp.Exec("select * from twopc_user order by id") + + // external savepoint, multi-shard transaction. + mcmp.Exec("begin") + mcmp.Exec("savepoint a") + mcmp.Exec("insert into twopc_user(id, name) values(10,'apa')") + mcmp.Exec("savepoint b") + mcmp.Exec("update twopc_user set name = 'temp' where id = 7") + mcmp.Exec("rollback to b") + mcmp.Exec("commit") + mcmp.Exec("select * from twopc_user order by id") + + // external savepoint, multi-shard transaction. + mcmp.Exec("begin") + mcmp.Exec("update twopc_user set name = 'temp1' where id = 10") + mcmp.Exec("savepoint b") + mcmp.Exec("update twopc_user set name = 'temp2' where id = 7") + mcmp.Exec("commit") + mcmp.Exec("select * from twopc_user order by id") +} + +// TestDTSavepoint tests distributed transaction should work with savepoint. +func TestDTSavepoint(t *testing.T) { + defer cleanup(t) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + ss := vtgateConn.Session("", nil) + + // internal savepoint + execute(ctx, t, ss, "begin") + execute(ctx, t, ss, "insert into twopc_user(id, name) values(7,'foo'), (8,'bar')") + execute(ctx, t, ss, "commit") + + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + logTable := retrieveTransitions(t, ch, tableMap, dtMap) + expectations := map[string][]string{ + "ks.dt_participant:40-80": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + }, + "ks.dt_state:40-80": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + }, + "ks.redo_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (7, 'foo')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (7, 'foo')\")]", + }, + "ks.twopc_user:40-80": {"insert:[INT64(8) VARCHAR(\"bar\")]"}, + "ks.twopc_user:80-": {"insert:[INT64(7) VARCHAR(\"foo\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // external savepoint, single shard transaction. + execute(ctx, t, ss, "begin") + execute(ctx, t, ss, "savepoint a") + execute(ctx, t, ss, "insert into twopc_user(id, name) values(9,'baz')") + execute(ctx, t, ss, "savepoint b") + execute(ctx, t, ss, "rollback to b") + execute(ctx, t, ss, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.twopc_user:80-": {"insert:[INT64(9) VARCHAR(\"baz\")]"}} + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // external savepoint, multi-shard transaction - rollback to a savepoint that leaves no change. + execute(ctx, t, ss, "begin") + execute(ctx, t, ss, "savepoint a") + execute(ctx, t, ss, "insert into twopc_user(id, name) values(10,'apa')") + execute(ctx, t, ss, "savepoint b") + execute(ctx, t, ss, "update twopc_user set name = 'temp' where id = 7") + execute(ctx, t, ss, "rollback to a") + execute(ctx, t, ss, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.dt_participant:-40": { + "insert:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + "delete:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + }, + "ks.dt_state:-40": { + "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", + }, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // external savepoint, multi-shard transaction - rollback to a savepoint that leaves a change. + execute(ctx, t, ss, "begin") + execute(ctx, t, ss, "savepoint a") + execute(ctx, t, ss, "insert into twopc_user(id, name) values(10,'apa')") + execute(ctx, t, ss, "savepoint b") + execute(ctx, t, ss, "update twopc_user set name = 'temp' where id = 7") + execute(ctx, t, ss, "rollback to b") + execute(ctx, t, ss, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.dt_participant:-40": { + "insert:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + "delete:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + }, + "ks.dt_state:-40": { + "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", + }, + "ks.twopc_user:-40": {"insert:[INT64(10) VARCHAR(\"apa\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) + + // external savepoint, multi-shard transaction - savepoint added later and rollback to it. + execute(ctx, t, ss, "begin") + execute(ctx, t, ss, "update twopc_user set name = 'temp1' where id = 7") + execute(ctx, t, ss, "savepoint c") + execute(ctx, t, ss, "update twopc_user set name = 'temp2' where id = 8") + execute(ctx, t, ss, "rollback to c") + execute(ctx, t, ss, "commit") + + logTable = retrieveTransitions(t, ch, tableMap, dtMap) + expectations = map[string][]string{ + "ks.dt_participant:40-80": { + "insert:[VARCHAR(\"dtid-4\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + "delete:[VARCHAR(\"dtid-4\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + }, + "ks.dt_state:40-80": { + "insert:[VARCHAR(\"dtid-4\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-4\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-4\") VARCHAR(\"COMMIT\")]", + }, + "ks.redo_state:80-": { + "insert:[VARCHAR(\"dtid-4\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-4\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:80-": { + "insert:[VARCHAR(\"dtid-4\") INT64(1) BLOB(\"update twopc_user set `name` = 'temp1' where id = 7 limit 10001 /* INT64 */\")]", + "delete:[VARCHAR(\"dtid-4\") INT64(1) BLOB(\"update twopc_user set `name` = 'temp1' where id = 7 limit 10001 /* INT64 */\")]", + }, + "ks.twopc_user:80-": {"update:[INT64(7) VARCHAR(\"temp1\")]"}, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +func execute(ctx context.Context, t *testing.T, ss *vtgateconn.VTGateSession, sql string) { + t.Helper() + + err := executeReturnError(ctx, t, ss, sql) + require.NoError(t, err) +} + +func executeReturnError(ctx context.Context, t *testing.T, ss *vtgateconn.VTGateSession, sql string) error { + t.Helper() + + if sql == "commit" { + // sort by shard + sortShard(ss) + } + _, err := ss.Execute(ctx, sql, nil) + return err +} + +func sortShard(ss *vtgateconn.VTGateSession) { + sort.Slice(ss.SessionPb().ShardSessions, func(i, j int) bool { + return ss.SessionPb().ShardSessions[i].Target.Shard < ss.SessionPb().ShardSessions[j].Target.Shard + }) +} + +// TestDTSavepointResolveAfterMMCommit tests that transaction is committed on recovery +// failure after MM commit involving savepoint. +func TestDTSavepointResolveAfterMMCommit(t *testing.T) { + defer cleanup(t) + + vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "dt_user", "") + require.NoError(t, err) + defer vtgateConn.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ch := make(chan *binlogdatapb.VEvent) + runVStream(t, ctx, ch, vtgateConn) + + conn := vtgateConn.Session("", nil) + qCtx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // initial insert + for i := 1; i <= 100; i++ { + execute(qCtx, t, conn, fmt.Sprintf("insert into twopc_user(id, name) values(%d,'foo')", 10*i)) + } + + // ignore initial change + tableMap := make(map[string][]*querypb.Field) + dtMap := make(map[string]string) + _ = retrieveTransitionsWithTimeout(t, ch, tableMap, dtMap, 2*time.Second) + + // Insert into multiple shards + execute(qCtx, t, conn, "begin") + execute(qCtx, t, conn, "insert into twopc_user(id, name) values(7,'foo'),(8,'bar')") + execute(qCtx, t, conn, "savepoint a") + for i := 1; i <= 100; i++ { + execute(qCtx, t, conn, fmt.Sprintf("insert ignore into twopc_user(id, name) values(%d,'baz')", 12+i)) + } + execute(qCtx, t, conn, "savepoint b") + execute(qCtx, t, conn, "insert into twopc_user(id, name) values(11,'apa')") + execute(qCtx, t, conn, "rollback to a") + + // The caller ID is used to simulate the failure at the desired point. + newCtx := callerid.NewContext(qCtx, callerid.NewEffectiveCallerID("MMCommitted_FailNow", "", ""), nil) + err = executeReturnError(newCtx, t, conn, "commit") + require.ErrorContains(t, err, "Fail After MM commit") + + testWarningAndTransactionStatus(t, conn, + "distributed transaction ID failed during metadata manager commit; transaction will be committed/rollbacked based on the state on recovery", + false, "COMMIT", "ks:40-80,ks:80-") + + // 2nd session to write something on different primary key, this should continue to work. + conn2 := vtgateConn.Session("", nil) + execute(qCtx, t, conn2, "insert into twopc_user(id, name) values(190001,'mysession')") + execute(qCtx, t, conn2, "insert into twopc_user(id, name) values(290001,'mysession')") + + // Below check ensures that the transaction is resolved by the resolver on receiving unresolved transaction signal from MM. + logTable := retrieveTransitionsWithTimeout(t, ch, tableMap, dtMap, 2*time.Second) + expectations := map[string][]string{ + "ks.dt_participant:-40": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "insert:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"40-80\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(2) VARCHAR(\"ks\") VARCHAR(\"80-\")]", + }, + "ks.dt_state:-40": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", + }, + "ks.redo_state:40-80": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_state:80-": { + "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", + }, + "ks.redo_statement:40-80": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", + }, + "ks.redo_statement:80-": { + "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (7, 'foo')\")]", + "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (7, 'foo')\")]", + }, + "ks.twopc_user:-40": { + "insert:[INT64(290001) VARCHAR(\"mysession\")]", + }, + "ks.twopc_user:40-80": { + "insert:[INT64(190001) VARCHAR(\"mysession\")]", + "insert:[INT64(8) VARCHAR(\"bar\")]", + }, + "ks.twopc_user:80-": { + "insert:[INT64(7) VARCHAR(\"foo\")]", + }, + } + assert.Equal(t, expectations, logTable, + "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) +} + +// TestSemiSyncRequiredWithTwoPC tests that semi-sync is required when using two-phase commit. +func TestSemiSyncRequiredWithTwoPC(t *testing.T) { + // cleanup all the old data. + conn, closer := start(t) + defer closer() + + out, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=none") + require.NoError(t, err, out) + defer clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput("SetKeyspaceDurabilityPolicy", keyspaceName, "--durability-policy=semi_sync") + + // After changing the durability policy for the given keyspace to none, we run PRS. + shard := clusterInstance.Keyspaces[0].Shards[2] + newPrimary := shard.Vttablets[1] + _, err = clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput( + "PlannedReparentShard", + fmt.Sprintf("%s/%s", keyspaceName, shard.Name), + "--new-primary", newPrimary.Alias) + require.NoError(t, err) + + // A new distributed transaction should fail. + utils.Exec(t, conn, "begin") + utils.Exec(t, conn, "insert into twopc_t1(id, col) values(4, 4)") + utils.Exec(t, conn, "insert into twopc_t1(id, col) values(6, 4)") + utils.Exec(t, conn, "insert into twopc_t1(id, col) values(9, 4)") + _, err = utils.ExecAllowError(t, conn, "commit") + require.Error(t, err) + require.ErrorContains(t, err, "two-pc is enabled, but semi-sync is not") +} diff --git a/go/test/endtoend/transaction/twopc/utils/utils.go b/go/test/endtoend/transaction/twopc/utils/utils.go new file mode 100644 index 00000000000..067877c4ece --- /dev/null +++ b/go/test/endtoend/transaction/twopc/utils/utils.go @@ -0,0 +1,240 @@ +/* +Copyright 2024 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 utils + +import ( + "context" + "fmt" + "os" + "path" + "slices" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/schema" +) + +const ( + DebugDelayCommitShard = "VT_DELAY_COMMIT_SHARD" + DebugDelayCommitTime = "VT_DELAY_COMMIT_TIME" +) + +// ClearOutTable deletes everything from a table. Sometimes the table might have more rows than allowed in a single delete query, +// so we have to do the deletions iteratively. +func ClearOutTable(t *testing.T, vtParams mysql.ConnParams, tableName string) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + for { + select { + case <-ctx.Done(): + t.Fatalf("Timeout out waiting for table to be cleared - %v", tableName) + return + default: + } + conn, err := mysql.Connect(ctx, &vtParams) + if err != nil { + log.Errorf("Error in connection - %v\n", err) + time.Sleep(100 * time.Millisecond) + continue + } + + res, err := conn.ExecuteFetch(fmt.Sprintf("SELECT count(*) FROM %v", tableName), 1, false) + if err != nil { + log.Errorf("Error in selecting - %v\n", err) + conn.Close() + time.Sleep(100 * time.Millisecond) + continue + } + require.Len(t, res.Rows, 1) + require.Len(t, res.Rows[0], 1) + rowCount, err := res.Rows[0][0].ToInt() + require.NoError(t, err) + if rowCount == 0 { + conn.Close() + return + } + _, err = conn.ExecuteFetch(fmt.Sprintf("DELETE FROM %v LIMIT 10000", tableName), 10000, false) + conn.Close() + if err != nil { + log.Errorf("Error in cleanup deletion - %v\n", err) + time.Sleep(100 * time.Millisecond) + continue + } + } +} + +// WriteTestCommunicationFile writes the content to the file with the given name. +// We use these files to coordinate with the vttablets running in the debug mode. +func WriteTestCommunicationFile(t *testing.T, fileName string, content string) { + // Delete the file just to make sure it doesn't exist before we write to it. + DeleteFile(fileName) + err := os.WriteFile(path.Join(os.Getenv("VTDATAROOT"), fileName), []byte(content), 0644) + require.NoError(t, err) +} + +// DeleteFile deletes the file specified. +func DeleteFile(fileName string) { + _ = os.Remove(path.Join(os.Getenv("VTDATAROOT"), fileName)) +} + +// WaitForResults waits for the results of the query to be as expected. +func WaitForResults(t *testing.T, vtParams *mysql.ConnParams, query string, resultExpected string, waitTime time.Duration) { + timeout := time.After(waitTime) + var prevRes []sqltypes.Row + for { + select { + case <-timeout: + t.Fatalf("didn't reach expected results for %s. Last results - %v", query, prevRes) + default: + ctx := context.Background() + conn, err := mysql.Connect(ctx, vtParams) + if err == nil { + res, _ := utils.ExecAllowError(t, conn, query) + conn.Close() + if res != nil { + prevRes = res.Rows + if fmt.Sprintf("%v", res.Rows) == resultExpected { + return + } + } + } + time.Sleep(100 * time.Millisecond) + } + } +} + +func WaitForMigrationStatus(t *testing.T, vtParams *mysql.ConnParams, ks string, shards []cluster.Shard, uuid string, timeout time.Duration, expectStatuses ...schema.OnlineDDLStatus) schema.OnlineDDLStatus { + shardNames := map[string]bool{} + for _, shard := range shards { + shardNames[shard.Name] = true + } + query := fmt.Sprintf("show vitess_migrations from %s like '%s'", ks, uuid) + + statusesMap := map[string]bool{} + for _, status := range expectStatuses { + statusesMap[string(status)] = true + } + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + lastKnownStatus := "" + for { + select { + case <-ctx.Done(): + return schema.OnlineDDLStatus(lastKnownStatus) + case <-ticker.C: + } + countMatchedShards := 0 + conn, err := mysql.Connect(ctx, vtParams) + if err != nil { + continue + } + r, err := utils.ExecAllowError(t, conn, query) + conn.Close() + if err != nil { + continue + } + for _, row := range r.Named().Rows { + shardName := row["shard"].ToString() + if !shardNames[shardName] { + // irrelevant shard + continue + } + lastKnownStatus = row["migration_status"].ToString() + if row["migration_uuid"].ToString() == uuid && statusesMap[lastKnownStatus] { + countMatchedShards++ + } + } + if countMatchedShards == len(shards) { + return schema.OnlineDDLStatus(lastKnownStatus) + } + } +} + +func RunReshard(t *testing.T, clusterInstance *cluster.LocalProcessCluster, workflowName, keyspaceName string, sourceShards, targetShards string) error { + rw := cluster.NewReshard(t, clusterInstance, workflowName, keyspaceName, targetShards, sourceShards) + // Initiate Reshard. + output, err := rw.Create() + require.NoError(t, err, output) + // Wait for vreplication to catchup. Should be very fast since we don't have a lot of rows. + rw.WaitForVreplCatchup(10 * time.Second) + // SwitchTraffic + output, err = rw.SwitchReadsAndWrites() + require.NoError(t, err, output) + output, err = rw.Complete() + require.NoError(t, err, output) + + // When Reshard completes, it has already deleted the source shards from the topo server. + // We just need to shutdown the vttablets, and remove them from the cluster. + removeShards(t, clusterInstance, keyspaceName, sourceShards) + return nil +} + +func removeShards(t *testing.T, clusterInstance *cluster.LocalProcessCluster, keyspaceName string, shards string) { + sourceShardsList := strings.Split(shards, ",") + var remainingShards []cluster.Shard + for idx, keyspace := range clusterInstance.Keyspaces { + if keyspace.Name != keyspaceName { + continue + } + for _, shard := range keyspace.Shards { + if slices.Contains(sourceShardsList, shard.Name) { + for _, vttablet := range shard.Vttablets { + err := vttablet.VttabletProcess.TearDown() + require.NoError(t, err) + } + continue + } + remainingShards = append(remainingShards, shard) + } + clusterInstance.Keyspaces[idx].Shards = remainingShards + } +} + +func AddShards(t *testing.T, clusterInstance *cluster.LocalProcessCluster, keyspaceName string, shardNames []string) { + for _, shardName := range shardNames { + t.Helper() + shard, err := clusterInstance.AddShard(keyspaceName, shardName, 3, false, nil) + require.NoError(t, err) + clusterInstance.Keyspaces[0].Shards = append(clusterInstance.Keyspaces[0].Shards, *shard) + } +} + +type Warn struct { + Level string + Code uint16 + Msg string +} + +func ToWarn(row sqltypes.Row) Warn { + code, _ := row[1].ToUint16() + return Warn{ + Level: row[0].ToString(), + Code: code, + Msg: row[2].ToString(), + } +} diff --git a/go/test/endtoend/vtgate/queries/benchmark/vschema.json b/go/test/endtoend/transaction/twopc/vschema.json similarity index 65% rename from go/test/endtoend/vtgate/queries/benchmark/vschema.json rename to go/test/endtoend/transaction/twopc/vschema.json index efc854af8ff..bca58b05c1e 100644 --- a/go/test/endtoend/vtgate/queries/benchmark/vschema.json +++ b/go/test/endtoend/transaction/twopc/vschema.json @@ -1,12 +1,15 @@ { - "sharded": true, + "sharded":true, "vindexes": { "xxhash": { "type": "xxhash" + }, + "reverse_bits": { + "type": "reverse_bits" } }, "tables": { - "tbl_no_lkp_vdx": { + "twopc_user":{ "column_vindexes": [ { "column": "id", @@ -14,19 +17,19 @@ } ] }, - "user": { + "twopc_music": { "column_vindexes": [ { - "column": "id", + "column": "user_id", "name": "xxhash" } ] }, - "user_extra": { + "twopc_t1": { "column_vindexes": [ { "column": "id", - "name": "xxhash" + "name": "reverse_bits" } ] } diff --git a/go/test/endtoend/vtgate/transaction/tx_test.go b/go/test/endtoend/transaction/tx_test.go similarity index 98% rename from go/test/endtoend/vtgate/transaction/tx_test.go rename to go/test/endtoend/transaction/tx_test.go index 40621a1d84b..753dcfb46bd 100644 --- a/go/test/endtoend/vtgate/transaction/tx_test.go +++ b/go/test/endtoend/transaction/tx_test.go @@ -24,12 +24,11 @@ import ( "os" "testing" - "vitess.io/vitess/go/test/endtoend/utils" - "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/test/endtoend/utils" ) var ( @@ -69,9 +68,10 @@ func TestMain(m *testing.M) { // Start keyspace keyspace := &cluster.Keyspace{ - Name: keyspaceName, - SchemaSQL: SchemaSQL, - VSchema: VSchema, + Name: keyspaceName, + SchemaSQL: SchemaSQL, + VSchema: VSchema, + DurabilityPolicy: "semi_sync", } if err := clusterInstance.StartKeyspace(*keyspace, []string{"-80", "80-"}, 1, false); err != nil { return 1, err diff --git a/go/test/endtoend/vtgate/transaction/vschema.json b/go/test/endtoend/transaction/vschema.json similarity index 100% rename from go/test/endtoend/vtgate/transaction/vschema.json rename to go/test/endtoend/transaction/vschema.json diff --git a/go/test/endtoend/utils/cmp.go b/go/test/endtoend/utils/cmp.go index 32c90a27a5b..3b47e1f68dc 100644 --- a/go/test/endtoend/utils/cmp.go +++ b/go/test/endtoend/utils/cmp.go @@ -138,7 +138,7 @@ func (mcmp *MySQLCompare) AssertContainsError(query, expected string) { mcmp.t.Helper() _, err := mcmp.ExecAllowAndCompareError(query, CompareOptions{}) require.Error(mcmp.t, err) - assert.Contains(mcmp.t, err.Error(), expected, "actual error: %s", err.Error()) + assert.ErrorContains(mcmp.t, err, expected, "actual error: %s", err.Error()) } // AssertMatchesNoOrder executes the given query against both Vitess and MySQL. diff --git a/go/test/endtoend/utils/mysql_test.go b/go/test/endtoend/utils/mysql_test.go index d2b10f1d0a8..41b74583f69 100644 --- a/go/test/endtoend/utils/mysql_test.go +++ b/go/test/endtoend/utils/mysql_test.go @@ -233,6 +233,13 @@ func TestPrimaryStatus(t *testing.T) { assert.NoError(t, err) assert.True(t, res.Position.Equal(r.Position), "primary replication status should be same as replication status here") + + suuid, err := mysqld.GetServerUUID(context.Background()) + assert.NoError(t, err) + assert.NotEmpty(t, suuid) + + // The server UUID read from primary status and GetServerUUID should match + assert.Equal(t, suuid, res.ServerUUID) } func TestReplicationConfiguration(t *testing.T) { diff --git a/go/test/endtoend/utils/utils.go b/go/test/endtoend/utils/utils.go index 345f1e787b4..35404981164 100644 --- a/go/test/endtoend/utils/utils.go +++ b/go/test/endtoend/utils/utils.go @@ -114,7 +114,7 @@ func AssertContainsError(t *testing.T, conn *mysql.Conn, query, expected string) t.Helper() _, err := ExecAllowError(t, conn, query) require.Error(t, err) - assert.Contains(t, err.Error(), expected, "actual error: %s", err.Error()) + assert.ErrorContains(t, err, expected, "actual error: %s", err.Error()) } // AssertMatchesNoOrder executes the given query and makes sure it matches the given `expected` string. diff --git a/go/test/endtoend/vreplication/cluster_test.go b/go/test/endtoend/vreplication/cluster_test.go index 218fc2b768a..13268fc749c 100644 --- a/go/test/endtoend/vreplication/cluster_test.go +++ b/go/test/endtoend/vreplication/cluster_test.go @@ -37,7 +37,7 @@ import ( "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" @@ -87,6 +87,9 @@ type ClusterConfig struct { vtorcPort int vreplicationCompressGTID bool + // Set overrideHeartbeatOptions to true to override the default heartbeat options: + // which are set to only on demand (5s) and 250ms interval. + overrideHeartbeatOptions bool } // enableGTIDCompression enables GTID compression for the cluster and returns a function @@ -471,9 +474,8 @@ func (vc *VitessCluster) AddKeyspace(t *testing.T, cells []*Cell, ksName string, SidecarDBName: sidecarDBName, } - if err := vc.VtctldClient.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName); err != nil { - t.Fatalf(err.Error()) - } + err := vc.VtctldClient.CreateKeyspace(keyspace.Name, keyspace.SidecarDBName) + require.NoError(t, err) log.Infof("Applying throttler config for keyspace %s", keyspace.Name) req := &vtctldatapb.UpdateThrottlerConfigRequest{Enable: true, Threshold: throttlerConfig.Threshold, CustomQuery: throttlerConfig.Query} @@ -497,15 +499,13 @@ func (vc *VitessCluster) AddKeyspace(t *testing.T, cells []*Cell, ksName string, require.NoError(t, vc.AddShards(t, cells, keyspace, shards, numReplicas, numRdonly, tabletIDBase, opts)) if schema != "" { - if err := vc.VtctlClient.ApplySchema(ksName, schema); err != nil { - t.Fatalf(err.Error()) - } + err := vc.VtctlClient.ApplySchema(ksName, schema) + require.NoError(t, err) } keyspace.Schema = schema if vschema != "" { - if err := vc.VtctlClient.ApplyVSchema(ksName, vschema); err != nil { - t.Fatalf(err.Error()) - } + err := vc.VtctlClient.ApplyVSchema(ksName, vschema) + require.NoError(t, err) } keyspace.VSchema = vschema @@ -517,11 +517,15 @@ func (vc *VitessCluster) AddKeyspace(t *testing.T, cells []*Cell, ksName string, // AddTablet creates new tablet with specified attributes func (vc *VitessCluster) AddTablet(t testing.TB, cell *Cell, keyspace *Keyspace, shard *Shard, tabletType string, tabletID int) (*Tablet, *exec.Cmd, error) { tablet := &Tablet{} - - options := []string{ + var options []string + defaultHeartbeatOptions := []string{ "--heartbeat_on_demand_duration", "5s", "--heartbeat_interval", "250ms", } + if !mainClusterConfig.overrideHeartbeatOptions { + options = append(options, defaultHeartbeatOptions...) + } + options = append(options, extraVTTabletArgs...) if mainClusterConfig.vreplicationCompressGTID { @@ -681,9 +685,8 @@ func (vc *VitessCluster) AddShards(t *testing.T, cells []*Cell, keyspace *Keyspa } for ind, tablet := range tablets { log.Infof("Running Setup() for vttablet %s", tablets[ind].Name) - if err := tablet.Vttablet.Setup(); err != nil { - t.Fatalf(err.Error()) - } + err := tablet.Vttablet.Setup() + require.NoError(t, err) // Set time_zone to UTC for all tablets. Without this it fails locally on some MacOS setups. query := "SET GLOBAL time_zone = '+00:00';" qr, err := tablet.Vttablet.QueryTablet(query, tablet.Vttablet.Keyspace, false) @@ -781,9 +784,8 @@ func (vc *VitessCluster) StartVtgate(t testing.TB, cell *Cell, cellsToWatch stri extraVTGateArgs, vc.ClusterConfig.vtgatePlannerVersion) require.NotNil(t, vtgate) - if err := vtgate.Setup(); err != nil { - t.Fatalf(err.Error()) - } + err := vtgate.Setup() + require.NoError(t, err) cell.Vtgates = append(cell.Vtgates, vtgate) } diff --git a/go/test/endtoend/vreplication/fk_test.go b/go/test/endtoend/vreplication/fk_test.go index 72cd278002f..34881cbcd1a 100644 --- a/go/test/endtoend/vreplication/fk_test.go +++ b/go/test/endtoend/vreplication/fk_test.go @@ -29,7 +29,7 @@ import ( "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" ) diff --git a/go/test/endtoend/vreplication/helper_test.go b/go/test/endtoend/vreplication/helper_test.go index b45c09837c9..3795b6f52d5 100644 --- a/go/test/endtoend/vreplication/helper_test.go +++ b/go/test/endtoend/vreplication/helper_test.go @@ -35,6 +35,8 @@ import ( "testing" "time" + "golang.org/x/exp/maps" + "github.com/buger/jsonparser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -329,8 +331,11 @@ func executeOnTablet(t *testing.T, conn *mysql.Conn, tablet *cluster.VttabletPro func assertQueryExecutesOnTablet(t *testing.T, conn *mysql.Conn, tablet *cluster.VttabletProcess, ksName string, query string, matchQuery string) { t.Helper() + rr, err := vc.VtctldClient.ExecuteCommandWithOutput("GetRoutingRules") + require.NoError(t, err) count0, body0, count1, body1 := executeOnTablet(t, conn, tablet, ksName, query, matchQuery) - assert.Equalf(t, count0+1, count1, "query %q did not execute in target;\ntried to match %q\nbefore:\n%s\n\nafter:\n%s\n\n", query, matchQuery, body0, body1) + require.Equalf(t, count0+1, count1, "query %q did not execute on destination %s (%s-%d);\ntried to match %q\nbefore:\n%s\n\nafter:\n%s\n\nrouting rules:\n%s\n\n", + query, ksName, tablet.Cell, tablet.TabletUID, matchQuery, body0, body1, rr) } func assertQueryDoesNotExecutesOnTablet(t *testing.T, conn *mysql.Conn, tablet *cluster.VttabletProcess, ksName string, query string, matchQuery string) { @@ -1022,3 +1027,47 @@ func confirmKeyspacesRoutedTo(t *testing.T, keyspace string, routedKeyspace, tab require.Equalf(t, routedKeyspace, plan.Keyspace.Name, "for database %s, keyspace %v, tabletType %s", database, keyspace, tt) } } + +// getVReplicationConfig returns the vreplication config for one random workflow for a given tablet. Currently, this is +// used when there is only one workflow, so we are using this simple method to get the config. +func getVReplicationConfig(t *testing.T, tab *cluster.VttabletProcess) map[string]string { + configJson, err := getDebugVar(t, tab.Port, []string{"VReplicationConfig"}) + require.NoError(t, err) + + var config map[string]string + err = json2.Unmarshal([]byte(configJson), &config) + require.NoError(t, err) + require.Equal(t, 1, len(config)) + + configJson = config[maps.Keys(config)[0]] + config = nil + err = json2.Unmarshal([]byte(configJson), &config) + require.NoError(t, err) + + return config +} + +// mapToCSV converts a golang map to a CSV string for use in defining the config overrides in vrep CLI commands. +func mapToCSV(m map[string]string) string { + csv := "" + if len(m) == 0 { + return csv + } + for k, v := range m { + csv += fmt.Sprintf("%s=%s,", k, v) + } + if len(csv) == 0 { + return csv + } + return csv[:len(csv)-1] +} + +// validateOverrides validates that the given vttablets have the expected config overrides. +func validateOverrides(t *testing.T, tabs map[string]*cluster.VttabletProcess, want map[string]string) { + for _, tab := range tabs { + config := getVReplicationConfig(t, tab) + for k, v := range want { + require.EqualValues(t, v, config[k]) + } + } +} diff --git a/go/test/endtoend/vreplication/materialize_test.go b/go/test/endtoend/vreplication/materialize_test.go index 486692a58ba..c62099a5894 100644 --- a/go/test/endtoend/vreplication/materialize_test.go +++ b/go/test/endtoend/vreplication/materialize_test.go @@ -17,6 +17,7 @@ limitations under the License. package vreplication import ( + "strings" "testing" "github.com/stretchr/testify/require" @@ -108,7 +109,6 @@ const smMaterializeSchemaSource = ` const smMaterializeVSchemaSource = ` { - "sharded": true, "tables": { "mat": { "column_vindexes": [ @@ -197,6 +197,8 @@ func testMaterialize(t *testing.T, useVtctldClient bool) { _, err = ks2Primary.QueryTablet(customFunc, targetKs, true) require.NoError(t, err) + testMaterializeWithNonExistentTable(t) + materialize(t, smMaterializeSpec2, useVtctldClient) catchup(t, ks2Primary, "wf1", "Materialize") @@ -234,3 +236,101 @@ func TestMaterializeVtctldClient(t *testing.T) { testShardedMaterialize(t, true) }) } + +const ( + refSchema = ` + create table ref1 ( + id bigint not null, + val varbinary(10) not null, + primary key (id) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci; + create table ref2 ( + id bigint not null, + id2 bigint not null, + primary key (id) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci; +` + refSourceVSchema = ` +{ + "tables": { + "ref1": { + "type": "reference" + }, + "ref2": { + "type": "reference" + } + } +} +` + refTargetVSchema = ` +{ + "tables": { + "ref1": { + "type": "reference", + "source": "ks1.ref1" + }, + "ref2": { + "type": "reference", + "source": "ks1.ref2" + } + } +} +` + initRef1DataQuery = `insert into ks1.ref1(id, val) values (1, 'abc'), (2, 'def'), (3, 'ghi')` + initRef2DataQuery = `insert into ks1.ref2(id, id2) values (1, 1), (2, 2), (3, 3)` +) + +// TestReferenceTableMaterialize tests materializing reference tables. +func TestReferenceTableMaterialize(t *testing.T) { + vc = NewVitessCluster(t, nil) + require.NotNil(t, vc) + shards := []string{"-80", "80-"} + defer vc.TearDown() + defaultCell := vc.Cells[vc.CellNames[0]] + _, err := vc.AddKeyspace(t, []*Cell{defaultCell}, "ks1", "0", refSourceVSchema, refSchema, 0, 0, 100, nil) + require.NoError(t, err) + _, err = vc.AddKeyspace(t, []*Cell{defaultCell}, "ks2", strings.Join(shards, ","), refTargetVSchema, "", 0, 0, 200, nil) + require.NoError(t, err) + vtgateConn := getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) + defer vtgateConn.Close() + verifyClusterHealth(t, vc) + _, err = vtgateConn.ExecuteFetch(initRef1DataQuery, 0, false) + require.NoError(t, err) + _, err = vtgateConn.ExecuteFetch(initRef2DataQuery, 0, false) + require.NoError(t, err) + + err = vc.VtctldClient.ExecuteCommand("Materialize", "--target-keyspace", "ks2", "--workflow", "wf1", "create", + "--source-keyspace", "ks1", "--reference-tables", "ref1,ref2") + require.NoError(t, err, "Materialize") + for _, shard := range shards { + tab := vc.getPrimaryTablet(t, "ks2", shard) + catchup(t, tab, "wf1", "Materialize") + } + + for _, shard := range shards { + waitForRowCount(t, vtgateConn, "ks2:"+shard, "ref1", 3) + waitForQueryResult(t, vtgateConn, "ks2:"+shard, "select id, val from ref1", + `[[INT64(1) VARBINARY("abc")] [INT64(2) VARBINARY("def")] [INT64(3) VARBINARY("ghi")]]`) + waitForRowCount(t, vtgateConn, "ks2:"+shard, "ref2", 3) + waitForQueryResult(t, vtgateConn, "ks2:"+shard, "select id, id2 from ref2", + `[[INT64(1) INT64(1)] [INT64(2) INT64(2)] [INT64(3) INT64(3)]]`) + } + vdiff(t, "ks2", "wf1", defaultCellName, false, true, nil) + + queries := []string{ + "update ks1.ref1 set val='xyz'", + "update ks1.ref2 set id2=3 where id=2", + "delete from ks1.ref1 where id=1", + "delete from ks1.ref2 where id=1", + "insert into ks1.ref1(id, val) values (4, 'jkl'), (5, 'mno')", + "insert into ks1.ref2(id, id2) values (4, 4), (5, 5)", + } + for _, query := range queries { + execVtgateQuery(t, vtgateConn, "ks1", query) + } + for _, shard := range shards { + waitForRowCount(t, vtgateConn, "ks2:"+shard, "ref1", 4) + waitForRowCount(t, vtgateConn, "ks2:"+shard, "ref2", 4) + } + vdiff(t, "ks2", "wf1", defaultCellName, false, true, nil) +} diff --git a/go/test/endtoend/vreplication/migrate_test.go b/go/test/endtoend/vreplication/migrate_test.go index 57ec8238d2b..2ccb3158fd9 100644 --- a/go/test/endtoend/vreplication/migrate_test.go +++ b/go/test/endtoend/vreplication/migrate_test.go @@ -18,13 +18,15 @@ package vreplication import ( "fmt" + "strings" "testing" - "github.com/tidwall/gjson" - "github.com/stretchr/testify/require" + "github.com/tidwall/gjson" "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/test/endtoend/cluster" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" ) @@ -48,8 +50,15 @@ func insertInitialDataIntoExternalCluster(t *testing.T, conn *mysql.Conn) { func TestVtctlMigrate(t *testing.T) { vc = NewVitessCluster(t, nil) + oldDefaultReplicas := defaultReplicas + oldDefaultRdonly := defaultRdonly defaultReplicas = 0 defaultRdonly = 0 + defer func() { + defaultReplicas = oldDefaultReplicas + defaultRdonly = oldDefaultRdonly + }() + defer vc.TearDown() defaultCell := vc.Cells[vc.CellNames[0]] @@ -165,11 +174,18 @@ func TestVtctlMigrate(t *testing.T) { // However now we need to create an external Vitess cluster. For this we need a different VTDATAROOT and // hence the VTDATAROOT env variable gets overwritten. // Each time we need to create vt processes in the "other" cluster we need to set the appropriate VTDATAROOT -func TestVtctldMigrate(t *testing.T) { +func TestVtctldMigrateUnsharded(t *testing.T) { vc = NewVitessCluster(t, nil) + oldDefaultReplicas := defaultReplicas + oldDefaultRdonly := defaultRdonly defaultReplicas = 0 defaultRdonly = 0 + defer func() { + defaultReplicas = oldDefaultReplicas + defaultRdonly = oldDefaultRdonly + }() + defer vc.TearDown() defaultCell := vc.Cells[vc.CellNames[0]] @@ -299,3 +315,82 @@ func TestVtctldMigrate(t *testing.T) { require.Errorf(t, err, "there is no vitess cluster named ext1") }) } + +// TestVtctldMigrate adds a test for a sharded cluster to validate a fix for a bug where the target keyspace name +// doesn't match that of the source cluster. The test migrates from a cluster with keyspace customer to an "external" +// cluster with keyspace rating. +func TestVtctldMigrateSharded(t *testing.T) { + setSidecarDBName("_vt") + currentWorkflowType = binlogdatapb.VReplicationWorkflowType_MoveTables + oldDefaultReplicas := defaultReplicas + oldDefaultRdonly := defaultRdonly + defaultReplicas = 0 + defaultRdonly = 0 + defer func() { + defaultReplicas = oldDefaultReplicas + defaultRdonly = oldDefaultRdonly + }() + + vc = setupCluster(t) + defer vc.TearDown() + + vtgateConn := getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) + defer vtgateConn.Close() + + setupCustomerKeyspace(t) + createMoveTablesWorkflow(t, "customer,Lead,datze,customer2") + tstWorkflowSwitchReadsAndWrites(t) + tstWorkflowComplete(t) + + var err error + // create external cluster + extCell := "extcell1" + extCells := []string{extCell} + extVc := NewVitessCluster(t, &clusterOptions{ + cells: extCells, + clusterConfig: externalClusterConfig, + }) + defer extVc.TearDown() + + setupExtKeyspace(t, extVc, "rating", extCell) + err = cluster.WaitForHealthyShard(extVc.VtctldClient, "rating", "-80") + require.NoError(t, err) + err = cluster.WaitForHealthyShard(extVc.VtctldClient, "rating", "80-") + require.NoError(t, err) + verifyClusterHealth(t, extVc) + extVtgateConn := getConnection(t, extVc.ClusterConfig.hostname, extVc.ClusterConfig.vtgateMySQLPort) + defer extVtgateConn.Close() + + currentWorkflowType = binlogdatapb.VReplicationWorkflowType_Migrate + var output string + if output, err = extVc.VtctldClient.ExecuteCommandWithOutput("Mount", "register", "--name=external", "--topo-type=etcd2", + fmt.Sprintf("--topo-server=localhost:%d", vc.ClusterConfig.topoPort), "--topo-root=/vitess/global"); err != nil { + require.FailNow(t, "Mount command failed with %+v : %s\n", err, output) + } + ksWorkflow := "rating.e1" + if output, err = extVc.VtctldClient.ExecuteCommandWithOutput("Migrate", + "--target-keyspace", "rating", "--workflow", "e1", + "create", "--source-keyspace", "customer", "--mount-name", "external", "--all-tables", "--cells=zone1", + "--tablet-types=primary"); err != nil { + require.FailNow(t, "Migrate command failed with %+v : %s\n", err, output) + } + waitForWorkflowState(t, extVc, ksWorkflow, binlogdatapb.VReplicationWorkflowState_Running.String()) + // this is because currently doVtctldclientVDiff is using the global vc :-( and we want to run a diff on the extVc cluster + vc = extVc + doVtctldclientVDiff(t, "rating", "e1", "zone1", nil) +} + +func setupExtKeyspace(t *testing.T, vc *VitessCluster, ksName, cellName string) { + numReplicas := 1 + shards := []string{"-80", "80-"} + if _, err := vc.AddKeyspace(t, []*Cell{vc.Cells[cellName]}, ksName, strings.Join(shards, ","), + customerVSchema, customerSchema, numReplicas, 0, 1200, nil); err != nil { + t.Fatal(err) + } + vtgate := vc.Cells[cellName].Vtgates[0] + for _, shard := range shards { + err := cluster.WaitForHealthyShard(vc.VtctldClient, ksName, shard) + require.NoError(t, err) + require.NoError(t, vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.replica", ksName, shard), numReplicas, waitTimeout)) + } +} diff --git a/go/test/endtoend/vreplication/movetables_buffering_test.go b/go/test/endtoend/vreplication/movetables_buffering_test.go index f456c32bfd5..eed96768fc5 100644 --- a/go/test/endtoend/vreplication/movetables_buffering_test.go +++ b/go/test/endtoend/vreplication/movetables_buffering_test.go @@ -12,7 +12,14 @@ import ( ) func TestMoveTablesBuffering(t *testing.T) { - defaultRdonly = 1 + ogReplicas := defaultReplicas + ogRdOnly := defaultRdonly + defer func() { + defaultReplicas = ogReplicas + defaultRdonly = ogRdOnly + }() + defaultRdonly = 0 + defaultReplicas = 0 vc = setupMinimalCluster(t) defer vc.TearDown() diff --git a/go/test/endtoend/vreplication/movetables_mirrortraffic_test.go b/go/test/endtoend/vreplication/movetables_mirrortraffic_test.go index 54e648de6b4..e0e7dbfc148 100644 --- a/go/test/endtoend/vreplication/movetables_mirrortraffic_test.go +++ b/go/test/endtoend/vreplication/movetables_mirrortraffic_test.go @@ -25,6 +25,14 @@ import ( func testMoveTablesMirrorTraffic(t *testing.T, flavor workflowFlavor) { setSidecarDBName("_vt") + ogReplicas := defaultReplicas + ogRdOnly := defaultRdonly + defer func() { + defaultReplicas = ogReplicas + defaultRdonly = ogRdOnly + }() + defaultRdonly = 0 + defaultReplicas = 0 vc = setupMinimalCluster(t) defer vc.TearDown() diff --git a/go/test/endtoend/vreplication/multi_tenant_test.go b/go/test/endtoend/vreplication/multi_tenant_test.go index eda245ee597..c82ee8a620f 100644 --- a/go/test/endtoend/vreplication/multi_tenant_test.go +++ b/go/test/endtoend/vreplication/multi_tenant_test.go @@ -196,13 +196,28 @@ func TestMultiTenantSimple(t *testing.T) { require.Zero(t, len(getKeyspaceRoutingRules(t, vc).Rules)) - mt.Create() - confirmKeyspacesRoutedTo(t, sourceKeyspace, "s1", "t1", nil) - validateKeyspaceRoutingRules(t, vc, initialRules) + createFunc := func() { + mt.Create() + confirmKeyspacesRoutedTo(t, sourceKeyspace, "s1", "t1", nil) + validateKeyspaceRoutingRules(t, vc, initialRules) - lastIndex = insertRows(lastIndex, sourceKeyspace) - waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", targetKeyspace, mt.workflowName), binlogdatapb.VReplicationWorkflowState_Running.String()) + lastIndex = insertRows(lastIndex, sourceKeyspace) + waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", targetKeyspace, mt.workflowName), binlogdatapb.VReplicationWorkflowState_Running.String()) + } + + t.Run("cancel", func(t *testing.T) { + // First let's test canceling the workflow to ensure that it properly + // cleans up all of the data. + createFunc() + mt.Cancel() + rowCount := getRowCount(t, vtgateConn, fmt.Sprintf("%s.%s", targetKeyspace, "t1")) + require.Zero(t, rowCount) + }) + + // Create again and run it to completion. + createFunc() + vdiff(t, targetKeyspace, workflowName, defaultCellName, false, true, nil) mt.SwitchReads() confirmOnlyReadsSwitched(t) @@ -362,6 +377,7 @@ func TestMultiTenantSharded(t *testing.T) { // Note: we cannot insert into the target keyspace since that is never routed to the source keyspace. lastIndex = insertRows(lastIndex, sourceKeyspace) waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", targetKeyspace, mt.workflowName), binlogdatapb.VReplicationWorkflowState_Running.String()) + vdiff(t, targetKeyspace, workflowName, defaultCellName, false, true, nil) mt.SwitchReadsAndWrites() // Note: here we have already switched, and we can insert into the target keyspace, and it should get reverse // replicated to the source keyspace. The source keyspace is routed to the target keyspace at this point. @@ -558,6 +574,7 @@ func (mtm *multiTenantMigration) switchTraffic(tenantId int64) { mt := mtm.getActiveMoveTables(tenantId) ksWorkflow := fmt.Sprintf("%s.%s", mtm.targetKeyspace, mt.workflowName) waitForWorkflowState(t, vc, ksWorkflow, binlogdatapb.VReplicationWorkflowState_Running.String()) + vdiff(t, mt.targetKeyspace, mt.workflowName, defaultCellName, false, true, nil) mtm.insertSomeData(t, tenantId, sourceKeyspaceName, numAdditionalRowsPerTenant) mt.SwitchReadsAndWrites() mtm.insertSomeData(t, tenantId, sourceKeyspaceName, numAdditionalRowsPerTenant) diff --git a/go/test/endtoend/vreplication/partial_movetables_test.go b/go/test/endtoend/vreplication/partial_movetables_test.go index b971a05a467..7ae8f83416d 100644 --- a/go/test/endtoend/vreplication/partial_movetables_test.go +++ b/go/test/endtoend/vreplication/partial_movetables_test.go @@ -83,10 +83,13 @@ func testCancel(t *testing.T) { func testPartialMoveTablesBasic(t *testing.T, flavor workflowFlavor) { setSidecarDBName("_vt") + origDefaultReplicas := defaultReplicas origDefaultRdonly := defaultRdonly defer func() { + defaultReplicas = origDefaultReplicas defaultRdonly = origDefaultRdonly }() + defaultReplicas = 0 defaultRdonly = 0 origExtraVTGateArgs := extraVTGateArgs // We need to enable shard routing for partial movetables routing. diff --git a/go/test/endtoend/vreplication/resharding_workflows_v2_test.go b/go/test/endtoend/vreplication/resharding_workflows_v2_test.go index 1e93a54b850..28ffc762ecd 100644 --- a/go/test/endtoend/vreplication/resharding_workflows_v2_test.go +++ b/go/test/endtoend/vreplication/resharding_workflows_v2_test.go @@ -22,6 +22,7 @@ import ( "fmt" "math/rand/v2" "net" + "slices" "strconv" "strings" "sync" @@ -35,9 +36,11 @@ import ( "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/throttler" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/wrangler" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) @@ -169,9 +172,7 @@ func tstWorkflowExec(t *testing.T, cells, workflow, sourceKs, targetKs, tables, args = append(args, "--tablet-types", tabletTypes) } args = append(args, "--action_timeout=10m") // At this point something is up so fail the test - if debugMode { - t.Logf("Executing workflow command: vtctldclient %v", strings.Join(args, " ")) - } + t.Logf("Executing workflow command: vtctldclient %s", strings.Join(args, " ")) output, err := vc.VtctldClient.ExecuteCommandWithOutput(args...) lastOutput = output if err != nil { @@ -334,27 +335,45 @@ func tstWorkflowCancel(t *testing.T) error { return tstWorkflowAction(t, workflowActionCancel, "", "") } -func validateReadsRoute(t *testing.T, tabletTypes string, tablet *cluster.VttabletProcess) { - if tabletTypes == "" { - tabletTypes = "replica,rdonly" +func validateReadsRoute(t *testing.T, tabletType string, tablet *cluster.VttabletProcess) { + if tablet == nil { + return } vtgateConn, closeConn := getVTGateConn() defer closeConn() - for _, tt := range []string{"replica", "rdonly"} { - destination := fmt.Sprintf("%s:%s@%s", tablet.Keyspace, tablet.Shard, tt) - if strings.Contains(tabletTypes, tt) { - readQuery := "select cid from customer limit 10" - assertQueryExecutesOnTablet(t, vtgateConn, tablet, destination, readQuery, "select cid from customer limit :vtg1") - } - } + // We do NOT want to target a shard as that goes around the routing rules and + // defeats the purpose here. We are using a query w/o a WHERE clause so for + // sharded keyspaces it should hit all shards as a SCATTER query. So all we + // care about is the keyspace and tablet type. + destination := fmt.Sprintf("%s@%s", tablet.Keyspace, strings.ToLower(tabletType)) + readQuery := "select cid from customer limit 50" + assertQueryExecutesOnTablet(t, vtgateConn, tablet, destination, readQuery, "select cid from customer limit :vtg1") } func validateReadsRouteToSource(t *testing.T, tabletTypes string) { - validateReadsRoute(t, tabletTypes, sourceReplicaTab) + tt, err := topoproto.ParseTabletTypes(tabletTypes) + require.NoError(t, err) + if slices.Contains(tt, topodatapb.TabletType_REPLICA) { + require.NotNil(t, sourceReplicaTab) + validateReadsRoute(t, topodatapb.TabletType_REPLICA.String(), sourceReplicaTab) + } + if slices.Contains(tt, topodatapb.TabletType_RDONLY) { + require.NotNil(t, sourceRdonlyTab) + validateReadsRoute(t, topodatapb.TabletType_RDONLY.String(), sourceRdonlyTab) + } } func validateReadsRouteToTarget(t *testing.T, tabletTypes string) { - validateReadsRoute(t, tabletTypes, targetReplicaTab1) + tt, err := topoproto.ParseTabletTypes(tabletTypes) + require.NoError(t, err) + if slices.Contains(tt, topodatapb.TabletType_REPLICA) { + require.NotNil(t, targetReplicaTab1) + validateReadsRoute(t, topodatapb.TabletType_REPLICA.String(), targetReplicaTab1) + } + if slices.Contains(tt, topodatapb.TabletType_RDONLY) { + require.NotNil(t, targetRdonlyTab1) + validateReadsRoute(t, topodatapb.TabletType_RDONLY.String(), targetRdonlyTab1) + } } func validateWritesRouteToSource(t *testing.T) { @@ -404,6 +423,13 @@ func getCurrentStatus(t *testing.T) string { // but CI currently fails on creating multiple clusters even after the previous ones are torn down func TestBasicV2Workflows(t *testing.T) { + ogReplicas := defaultReplicas + ogRdOnly := defaultRdonly + defer func() { + defaultReplicas = ogReplicas + defaultRdonly = ogRdOnly + }() + defaultReplicas = 1 defaultRdonly = 1 extraVTTabletArgs = []string{ parallelInsertWorkers, @@ -657,7 +683,7 @@ func testMoveTablesV2Workflow(t *testing.T) { // If it's not then we'll get an error as the table doesn't exist in the vschema createMoveTablesWorkflow(t, "customer,loadtest,vdiff_order,reftable,_vt_PURGE_4f9194b43b2011eb8a0104ed332e05c2_20221210194431") waitForWorkflowState(t, vc, ksWorkflow, binlogdatapb.VReplicationWorkflowState_Running.String()) - validateReadsRouteToSource(t, "replica") + validateReadsRouteToSource(t, "replica,rdonly") validateWritesRouteToSource(t) // Verify that we've properly ignored any internal operational tables @@ -718,6 +744,12 @@ func testPartialSwitches(t *testing.T) { tstWorkflowSwitchReads(t, "", "") checkStates(t, nextState, nextState) // idempotency + tstWorkflowReverseReads(t, "replica,rdonly", "") + checkStates(t, wrangler.WorkflowStateReadsSwitched, wrangler.WorkflowStateNotSwitched) + + tstWorkflowSwitchReads(t, "", "") + checkStates(t, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateReadsSwitched) + tstWorkflowSwitchWrites(t) currentState = nextState nextState = wrangler.WorkflowStateAllSwitched @@ -764,12 +796,12 @@ func testRestOfWorkflow(t *testing.T) { waitForLowLag(t, "customer", "wf1") tstWorkflowSwitchReads(t, "", "") checkStates(t, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateReadsSwitched) - validateReadsRouteToTarget(t, "replica") + validateReadsRouteToTarget(t, "replica,rdonly") validateWritesRouteToSource(t) tstWorkflowSwitchWrites(t) checkStates(t, wrangler.WorkflowStateReadsSwitched, wrangler.WorkflowStateAllSwitched) - validateReadsRouteToTarget(t, "replica") + validateReadsRouteToTarget(t, "replica,rdonly") validateWritesRouteToTarget(t) // this function is called for both MoveTables and Reshard, so the reverse workflows exist in different keyspaces @@ -780,42 +812,45 @@ func testRestOfWorkflow(t *testing.T) { waitForLowLag(t, keyspace, "wf1_reverse") tstWorkflowReverseReads(t, "", "") checkStates(t, wrangler.WorkflowStateAllSwitched, wrangler.WorkflowStateWritesSwitched) - validateReadsRouteToSource(t, "replica") + validateReadsRouteToSource(t, "replica,rdonly") validateWritesRouteToTarget(t) tstWorkflowReverseWrites(t) checkStates(t, wrangler.WorkflowStateWritesSwitched, wrangler.WorkflowStateNotSwitched) - validateReadsRouteToSource(t, "replica") + validateReadsRouteToSource(t, "replica,rdonly") validateWritesRouteToSource(t) waitForLowLag(t, "customer", "wf1") tstWorkflowSwitchWrites(t) checkStates(t, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateWritesSwitched) - validateReadsRouteToSource(t, "replica") + validateReadsRouteToSource(t, "replica,rdonly") validateWritesRouteToTarget(t) waitForLowLag(t, keyspace, "wf1_reverse") tstWorkflowReverseWrites(t) - validateReadsRouteToSource(t, "replica") + checkStates(t, wrangler.WorkflowStateWritesSwitched, wrangler.WorkflowStateNotSwitched) + validateReadsRouteToSource(t, "replica,rdonly") validateWritesRouteToSource(t) waitForLowLag(t, "customer", "wf1") tstWorkflowSwitchReads(t, "", "") - validateReadsRouteToTarget(t, "replica") + checkStates(t, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateReadsSwitched) + validateReadsRouteToTarget(t, "replica,rdonly") validateWritesRouteToSource(t) tstWorkflowReverseReads(t, "", "") - validateReadsRouteToSource(t, "replica") + checkStates(t, wrangler.WorkflowStateReadsSwitched, wrangler.WorkflowStateNotSwitched) + validateReadsRouteToSource(t, "replica,rdonly") validateWritesRouteToSource(t) tstWorkflowSwitchReadsAndWrites(t) - validateReadsRouteToTarget(t, "replica") - validateReadsRoute(t, "rdonly", targetRdonlyTab1) + checkStates(t, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) + validateReadsRouteToTarget(t, "replica,rdonly") validateWritesRouteToTarget(t) waitForLowLag(t, keyspace, "wf1_reverse") tstWorkflowReverseReadsAndWrites(t) - validateReadsRoute(t, "rdonly", sourceRdonlyTab) - validateReadsRouteToSource(t, "replica") + checkStates(t, wrangler.WorkflowStateAllSwitched, wrangler.WorkflowStateNotSwitched) + validateReadsRouteToSource(t, "replica,rdonly") validateWritesRouteToSource(t) // trying to complete an unswitched workflow should error @@ -828,8 +863,7 @@ func testRestOfWorkflow(t *testing.T) { waitForLowLag(t, "customer", "customer_name") waitForLowLag(t, "customer", "enterprise_customer") tstWorkflowSwitchReadsAndWrites(t) - validateReadsRoute(t, "rdonly", targetRdonlyTab1) - validateReadsRouteToTarget(t, "replica") + validateReadsRouteToTarget(t, "replica,rdonly") validateWritesRouteToTarget(t) err = tstWorkflowComplete(t) @@ -849,8 +883,12 @@ func setupCluster(t *testing.T) *VitessCluster { insertInitialData(t) defaultCell := vc.Cells[vc.CellNames[0]] sourceTab = vc.Cells[defaultCell.Name].Keyspaces["product"].Shards["0"].Tablets["zone1-100"].Vttablet - sourceReplicaTab = vc.Cells[defaultCell.Name].Keyspaces["product"].Shards["0"].Tablets["zone1-101"].Vttablet - sourceRdonlyTab = vc.Cells[defaultCell.Name].Keyspaces["product"].Shards["0"].Tablets["zone1-102"].Vttablet + if defaultReplicas > 0 { + sourceReplicaTab = vc.Cells[defaultCell.Name].Keyspaces["product"].Shards["0"].Tablets["zone1-101"].Vttablet + } + if defaultRdonly > 0 { + sourceRdonlyTab = vc.Cells[defaultCell.Name].Keyspaces["product"].Shards["0"].Tablets["zone1-102"].Vttablet + } return vc } @@ -864,8 +902,12 @@ func setupCustomerKeyspace(t *testing.T) { custKs := vc.Cells[defaultCell.Name].Keyspaces["customer"] targetTab1 = custKs.Shards["-80"].Tablets["zone1-200"].Vttablet targetTab2 = custKs.Shards["80-"].Tablets["zone1-300"].Vttablet - targetReplicaTab1 = custKs.Shards["-80"].Tablets["zone1-201"].Vttablet - targetRdonlyTab1 = custKs.Shards["-80"].Tablets["zone1-202"].Vttablet + if defaultReplicas > 0 { + targetReplicaTab1 = custKs.Shards["-80"].Tablets["zone1-201"].Vttablet + } + if defaultRdonly > 0 { + targetRdonlyTab1 = custKs.Shards["-80"].Tablets["zone1-202"].Vttablet + } } func setupCustomer2Keyspace(t *testing.T) { @@ -884,7 +926,7 @@ func setupMinimalCluster(t *testing.T) *VitessCluster { zone1 := vc.Cells["zone1"] - vc.AddKeyspace(t, []*Cell{zone1}, "product", "0", initialProductVSchema, initialProductSchema, 0, 0, 100, nil) + vc.AddKeyspace(t, []*Cell{zone1}, "product", "0", initialProductVSchema, initialProductSchema, defaultReplicas, defaultRdonly, 100, nil) verifyClusterHealth(t, vc) insertInitialData(t) @@ -897,7 +939,7 @@ func setupMinimalCluster(t *testing.T) *VitessCluster { func setupMinimalCustomerKeyspace(t *testing.T) map[string]*cluster.VttabletProcess { tablets := make(map[string]*cluster.VttabletProcess) if _, err := vc.AddKeyspace(t, []*Cell{vc.Cells["zone1"]}, "customer", "-80,80-", - customerVSchema, customerSchema, 0, 0, 200, nil); err != nil { + customerVSchema, customerSchema, defaultReplicas, defaultRdonly, 200, nil); err != nil { t.Fatal(err) } defaultCell := vc.Cells[vc.CellNames[0]] @@ -1033,6 +1075,7 @@ func createAdditionalCustomerShards(t *testing.T, shards string) { targetTab2 = custKs.Shards["80-c0"].Tablets["zone1-600"].Vttablet targetTab1 = custKs.Shards["40-80"].Tablets["zone1-500"].Vttablet targetReplicaTab1 = custKs.Shards["-40"].Tablets["zone1-401"].Vttablet + targetRdonlyTab1 = custKs.Shards["-40"].Tablets["zone1-402"].Vttablet sourceTab = custKs.Shards["-80"].Tablets["zone1-200"].Vttablet sourceReplicaTab = custKs.Shards["-80"].Tablets["zone1-201"].Vttablet @@ -1044,3 +1087,34 @@ func tstApplySchemaOnlineDDL(t *testing.T, sql string, keyspace string) { "--sql", sql, keyspace) require.NoError(t, err, fmt.Sprintf("ApplySchema Error: %s", err)) } + +func validateTableRoutingRule(t *testing.T, table, tabletType, fromKeyspace, toKeyspace string) { + tabletType = strings.ToLower(strings.TrimSpace(tabletType)) + rr := getRoutingRules(t) + // We set matched = true by default because it is possible, if --no-routing-rules is set while creating + // a workflow, that the routing rules are empty when the workflow starts. + // We set it to false below when the rule is found, but before matching the routed keyspace. + matched := true + for _, r := range rr.GetRules() { + fromRule := fmt.Sprintf("%s.%s", fromKeyspace, table) + if tabletType != "" && tabletType != "primary" { + fromRule = fmt.Sprintf("%s@%s", fromRule, tabletType) + } + if r.FromTable == fromRule { + // We found the rule, so we can set matched to false here and check for the routed keyspace below. + matched = false + require.NotEmpty(t, r.ToTables) + toTable := r.ToTables[0] + // The ToTables value is of the form "routedKeyspace.table". + routedKeyspace, routedTable, ok := strings.Cut(toTable, ".") + require.True(t, ok) + require.Equal(t, table, routedTable) + if routedKeyspace == toKeyspace { + // We found the rule, the table and keyspace matches, so our search is done. + matched = true + break + } + } + } + require.Truef(t, matched, "routing rule for %s.%s from %s to %s not found", fromKeyspace, table, tabletType, toKeyspace) +} diff --git a/go/test/endtoend/vreplication/sidecardb_test.go b/go/test/endtoend/vreplication/sidecardb_test.go index 391f7d60246..be9ce67a626 100644 --- a/go/test/endtoend/vreplication/sidecardb_test.go +++ b/go/test/endtoend/vreplication/sidecardb_test.go @@ -91,7 +91,7 @@ func TestSidecarDB(t *testing.T) { prs(t, keyspace, shard) currentPrimary = tablet101 - expectedChanges100 += numChanges + expectedChanges101 += numChanges validateSidecarDBTables(t, tablet100, sidecarDBTables) validateSidecarDBTables(t, tablet101, sidecarDBTables) require.Equal(t, expectedChanges100, getNumExecutedDDLQueries(t, tablet100Port)) @@ -100,7 +100,7 @@ func TestSidecarDB(t *testing.T) { t.Run("modify schema, prs, and self heal on new primary", func(t *testing.T) { numChanges := modifySidecarDBSchema(t, vc, currentPrimary, ddls1) - expectedChanges101 += numChanges + expectedChanges100 += numChanges prs(t, keyspace, shard) // nolint currentPrimary = tablet100 diff --git a/go/test/endtoend/vreplication/testdata/config/init_testserver_db.sql b/go/test/endtoend/vreplication/testdata/config/init_testserver_db.sql index fc78f6b414a..71bfba11ed8 100644 --- a/go/test/endtoend/vreplication/testdata/config/init_testserver_db.sql +++ b/go/test/endtoend/vreplication/testdata/config/init_testserver_db.sql @@ -38,6 +38,7 @@ DROP DATABASE IF EXISTS test; CREATE USER 'vt_dba'@'localhost'; GRANT ALL ON *.* TO 'vt_dba'@'localhost'; GRANT GRANT OPTION ON *.* TO 'vt_dba'@'localhost'; +GRANT PROXY ON ''@'' TO 'vt_dba'@'localhost' WITH GRANT OPTION; # User for app traffic, with global read-write access. CREATE USER 'vt_app'@'localhost'; diff --git a/go/test/endtoend/vreplication/vdiff2_test.go b/go/test/endtoend/vreplication/vdiff2_test.go index f4128b5c036..aaf4cae5375 100644 --- a/go/test/endtoend/vreplication/vdiff2_test.go +++ b/go/test/endtoend/vreplication/vdiff2_test.go @@ -32,10 +32,11 @@ import ( "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" @@ -321,8 +322,8 @@ func testWorkflow(t *testing.T, vc *VitessCluster, tc *testCase, tks *Keyspace, testCLIErrors(t, ksWorkflow, allCellNames) } if tc.testCLIFlagHandling { + // This creates and then deletes the vdiff so we don't increment the count. testCLIFlagHandling(t, tc.targetKs, tc.workflow, cells[0]) - tc.vdiffCount++ // We did either vtctlclient OR vtctldclient vdiff create } checkVDiffCountStat(t, statsTablet, tc.vdiffCount) @@ -378,6 +379,7 @@ func testCLIFlagHandling(t *testing.T, targetKs, workflowName string, cell *Cell UpdateTableStats: true, TimeoutSeconds: 60, MaxDiffSeconds: 333, + AutoStart: ptr.Of(false), }, PickerOptions: &tabletmanagerdatapb.VDiffPickerOptions{ SourceCell: "zone1,zone2,zone3,zonefoosource", @@ -385,8 +387,9 @@ func testCLIFlagHandling(t *testing.T, targetKs, workflowName string, cell *Cell TabletTypes: "replica,primary,rdonly", }, ReportOptions: &tabletmanagerdatapb.VDiffReportOptions{ - MaxSampleRows: 888, - OnlyPks: true, + MaxSampleRows: 888, + OnlyPks: true, + RowDiffColumnTruncateAt: 444, }, } @@ -404,6 +407,8 @@ func testCLIFlagHandling(t *testing.T, targetKs, workflowName string, cell *Cell fmt.Sprintf("--update-table-stats=%t", expectedOptions.CoreOptions.UpdateTableStats), fmt.Sprintf("--auto-retry=%t", expectedOptions.CoreOptions.AutoRetry), fmt.Sprintf("--only-pks=%t", expectedOptions.ReportOptions.OnlyPks), + fmt.Sprintf("--row-diff-column-truncate-at=%d", expectedOptions.ReportOptions.RowDiffColumnTruncateAt), + fmt.Sprintf("--auto-start=%t", *expectedOptions.CoreOptions.AutoStart), "--tablet-types-in-preference-order=false", // So tablet_types should not start with "in_order:", which is the default "--format=json") // So we can easily grab the UUID require.NoError(t, err, "vdiff command failed: %s", res) @@ -428,6 +433,11 @@ func testCLIFlagHandling(t *testing.T, targetKs, workflowName string, cell *Cell err = protojson.Unmarshal(bytes, storedOptions) require.NoError(t, err, "failed to unmarshal result %s to a %T: %v", string(bytes), storedOptions, err) require.True(t, proto.Equal(expectedOptions, storedOptions), "stored options %v != expected options %v", storedOptions, expectedOptions) + + // Delete this vdiff as we used --auto-start=false and thus it never starts and + // does not provide the normally expected show --verbose --format=json output. + _, output := performVDiff2Action(t, false, fmt.Sprintf("%s.%s", targetKs, workflowName), "", "delete", vduuid.String(), false) + require.Equal(t, "completed", gjson.Get(output, "Status").String()) }) } diff --git a/go/test/endtoend/vreplication/vdiff_online_ddl_test.go b/go/test/endtoend/vreplication/vdiff_online_ddl_test.go index 92977111294..0f3cda66ce6 100644 --- a/go/test/endtoend/vreplication/vdiff_online_ddl_test.go +++ b/go/test/endtoend/vreplication/vdiff_online_ddl_test.go @@ -23,13 +23,12 @@ func TestOnlineDDLVDiff(t *testing.T) { setSidecarDBName("_vt") originalRdonly := defaultRdonly originalReplicas := defaultReplicas - defaultRdonly = 0 - defaultReplicas = 0 defer func() { defaultRdonly = originalRdonly defaultReplicas = originalReplicas }() - + defaultRdonly = 0 + defaultReplicas = 0 vc = setupMinimalCluster(t) defer vc.TearDown() keyspace := "product" diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index 52874b5839c..519bf8d0ce5 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "io" + "maps" "net/http" "runtime" "strconv" @@ -58,7 +59,7 @@ var ( targetKsOpts = make(map[string]string) httpClient = throttlebase.SetupHTTPClient(time.Second) sourceThrottlerAppName = throttlerapp.VStreamerName - targetThrottlerAppName = throttlerapp.VReplicationName + targetThrottlerAppName = throttlerapp.VPlayerName ) const ( @@ -797,6 +798,11 @@ func shardCustomer(t *testing.T, testReverse bool, cells []*Cell, sourceCellOrAl commit, _ = vc.startQuery(t, openTxQuery) } switchWritesDryRun(t, workflowType, ksWorkflow, dryRunResultsSwitchWritesCustomerShard) + shardNames := make([]string, 0, len(vc.Cells[defaultCell.Name].Keyspaces[sourceKs].Shards)) + for shardName := range maps.Keys(vc.Cells[defaultCell.Name].Keyspaces[sourceKs].Shards) { + shardNames = append(shardNames, shardName) + } + testSwitchTrafficPermissionChecks(t, workflowType, sourceKs, shardNames, targetKs, workflow) switchWrites(t, workflowType, ksWorkflow, false) checkThatVDiffFails(t, targetKs, workflow) @@ -1183,6 +1189,18 @@ func materialize(t *testing.T, spec string, useVtctldClient bool) { } } +func testMaterializeWithNonExistentTable(t *testing.T) { + t.Run("vtctldclient materialize with nonexistent table", func(t *testing.T) { + tableSettings := `[{"target_table": "table_that_doesnt_exist", "create_ddl": "create table mat_val_counts (mat_val varbinary(10), cnt int unsigned, primary key (mat_val))", "source_expression": "select val, count(*) as cnt from mat group by val"}]` + output, err := vc.VtctldClient.ExecuteCommandWithOutput("materialize", "--workflow=tablenogood", "--target-keyspace=source", + "create", "--source-keyspace=source", "--table-settings", tableSettings) + require.NoError(t, err, "Materialize create failed, err: %v, output: %s", err, output) + waitForWorkflowState(t, vc, "source.tablenogood", binlogdatapb.VReplicationWorkflowState_Stopped.String()) + output, err = vc.VtctldClient.ExecuteCommandWithOutput("materialize", "--workflow=tablenogood", "--target-keyspace=source", "cancel") + require.NoError(t, err, "Materialize cancel failed, err: %v, output: %s", err, output) + }) +} + func materializeProduct(t *testing.T, useVtctldClient bool) { t.Run("materializeProduct", func(t *testing.T) { // Materializing from "product" keyspace to "customer" keyspace. @@ -1216,18 +1234,7 @@ func materializeProduct(t *testing.T, useVtctldClient bool) { for _, tab := range customerTablets { waitForRowCountInTablet(t, tab, keyspace, workflow, 5) // Confirm that we updated the stats on the target tablets as expected. - jsVal, err := getDebugVar(t, tab.Port, []string{"VReplicationThrottledCounts"}) - require.NoError(t, err) - require.NotEqual(t, "{}", jsVal) - // The JSON value looks like this: {"cproduct.4.tablet.vstreamer": 2} - vstreamerThrottledCount := gjson.Get(jsVal, fmt.Sprintf(`%s\.*\.tablet\.vstreamer`, workflow)).Int() - require.Greater(t, vstreamerThrottledCount, int64(0)) - // We only need to do this stat check once. - val, err := getDebugVar(t, tab.Port, []string{"VReplicationThrottledCountTotal"}) - require.NoError(t, err) - throttledCount, err := strconv.ParseInt(val, 10, 64) - require.NoError(t, err) - require.GreaterOrEqual(t, throttledCount, vstreamerThrottledCount) + confirmVReplicationThrottling(t, tab, sourceKs, workflow, sourceThrottlerAppName) } }) t.Run("unthrottle-app-product", func(t *testing.T) { @@ -1262,12 +1269,7 @@ func materializeProduct(t *testing.T, useVtctldClient bool) { for _, tab := range customerTablets { waitForRowCountInTablet(t, tab, keyspace, workflow, 8) // Confirm that we updated the stats on the target tablets as expected. - jsVal, err := getDebugVar(t, tab.Port, []string{"VReplicationThrottledCounts"}) - require.NoError(t, err) - require.NotEqual(t, "{}", jsVal) - // The JSON value now looks like this: {"cproduct.4.tablet.vstreamer": 2, "cproduct.4.tablet.vplayer": 4} - vplayerThrottledCount := gjson.Get(jsVal, fmt.Sprintf(`%s\.*\.tablet\.vplayer`, workflow)).Int() - require.Greater(t, vplayerThrottledCount, int64(0)) + confirmVReplicationThrottling(t, tab, sourceKs, workflow, targetThrottlerAppName) } }) t.Run("unthrottle-app-customer", func(t *testing.T) { @@ -1593,6 +1595,60 @@ func switchWritesDryRun(t *testing.T, workflowType, ksWorkflow string, dryRunRes validateDryRunResults(t, output, dryRunResults) } +// testSwitchTrafficPermissionsChecks confirms that for the SwitchTraffic command, the +// necessary permissions are checked properly on the source keyspace's primary tablets. +// This ensures that we can create and manage the reverse vreplication workflow. +func testSwitchTrafficPermissionChecks(t *testing.T, workflowType, sourceKeyspace string, sourceShards []string, targetKeyspace, workflow string) { + applyPrivileges := func(query string) { + for _, shard := range sourceShards { + primary := vc.getPrimaryTablet(t, sourceKeyspace, shard) + _, err := primary.QueryTablet(query, primary.Keyspace, false) + require.NoError(t, err) + } + } + runDryRunCmd := func(expectErr bool) { + _, err := vc.VtctldClient.ExecuteCommandWithOutput(workflowType, "--workflow", workflow, "--target-keyspace", targetKeyspace, + "SwitchTraffic", "--tablet-types=primary", "--dry-run") + require.True(t, ((err != nil) == expectErr), "expected error: %t, got: %v", expectErr, err) + } + + defer func() { + // Put the default global privs back in place. + applyPrivileges("grant select,insert,update,delete on *.* to vt_filtered@localhost") + }() + + t.Run("test switch traffic permission checks", func(t *testing.T) { + t.Run("test without global privileges", func(t *testing.T) { + applyPrivileges("revoke select,insert,update,delete on *.* from vt_filtered@localhost") + runDryRunCmd(true) + }) + + t.Run("test with db level privileges", func(t *testing.T) { + applyPrivileges(fmt.Sprintf("grant select,insert,update,delete on %s.* to vt_filtered@localhost", + sidecarDBIdentifier)) + runDryRunCmd(false) + }) + + t.Run("test without global or db level privileges", func(t *testing.T) { + applyPrivileges(fmt.Sprintf("revoke select,insert,update,delete on %s.* from vt_filtered@localhost", + sidecarDBIdentifier)) + runDryRunCmd(true) + }) + + t.Run("test with table level privileges", func(t *testing.T) { + applyPrivileges(fmt.Sprintf("grant select,insert,update,delete on %s.vreplication to vt_filtered@localhost", + sidecarDBIdentifier)) + runDryRunCmd(false) + }) + + t.Run("test without global, db, or table level privileges", func(t *testing.T) { + applyPrivileges(fmt.Sprintf("revoke select,insert,update,delete on %s.vreplication from vt_filtered@localhost", + sidecarDBIdentifier)) + runDryRunCmd(true) + }) + }) +} + // restartWorkflow confirms that a workflow can be successfully // stopped and started. func restartWorkflow(t *testing.T, ksWorkflow string) { @@ -1697,3 +1753,52 @@ func waitForInnoDBHistoryLength(t *testing.T, tablet *cluster.VttabletProcess, e func releaseInnoDBRowHistory(t *testing.T, dbConn *mysql.Conn) { execQuery(t, dbConn, "rollback") } + +// confirmVReplicationThrottling confirms that the throttling related metrics reflect that +// the workflow is being throttled as expected, via the expected app name, and that this +// is impacting the lag as expected. +// The tablet passed should be a target tablet for the given workflow while the keyspace +// name provided should be the source keyspace as the target tablet stats note the stream's +// source keyspace and shard. +func confirmVReplicationThrottling(t *testing.T, tab *cluster.VttabletProcess, keyspace, workflow string, appname throttlerapp.Name) { + const ( + sleepTime = 5 * time.Second + zv = int64(0) + ) + time.Sleep(sleepTime) // To be sure that we accrue some lag + + jsVal, err := getDebugVar(t, tab.Port, []string{"VReplicationThrottledCounts"}) + require.NoError(t, err) + require.NotEqual(t, "{}", jsVal) + // The JSON value looks like this: {"cproduct.4.tablet.vstreamer": 2, "cproduct.4.tablet.vplayer": 4} + throttledCount := gjson.Get(jsVal, fmt.Sprintf(`%s\.*\.tablet\.%s`, workflow, appname)).Int() + require.Greater(t, throttledCount, zv, "JSON value: %s", jsVal) + + val, err := getDebugVar(t, tab.Port, []string{"VReplicationThrottledCountTotal"}) + require.NoError(t, err) + require.NotEqual(t, "", val) + throttledCountTotal, err := strconv.ParseInt(val, 10, 64) + require.NoError(t, err) + require.GreaterOrEqual(t, throttledCountTotal, throttledCount, "Value: %s", val) + + // We do not calculate replication lag for the vcopier as it's not replicating + // events. + if appname != throttlerapp.VCopierName { + jsVal, err = getDebugVar(t, tab.Port, []string{"VReplicationLagSeconds"}) + require.NoError(t, err) + require.NotEqual(t, "{}", jsVal) + // The JSON value looks like this: {"product.0.cproduct.4": 6} + vreplLagSeconds := gjson.Get(jsVal, fmt.Sprintf(`%s\.*\.%s\.*`, keyspace, workflow)).Int() + require.NoError(t, err) + // Take off 1 second to deal with timing issues in the test. + minLagSecs := int64(int64(sleepTime.Seconds()) - 1) + require.GreaterOrEqual(t, vreplLagSeconds, minLagSecs, "JSON value: %s", jsVal) + + val, err = getDebugVar(t, tab.Port, []string{"VReplicationLagSecondsMax"}) + require.NoError(t, err) + require.NotEqual(t, "", val) + vreplLagSecondsMax, err := strconv.ParseInt(val, 10, 64) + require.NoError(t, err) + require.GreaterOrEqual(t, vreplLagSecondsMax, vreplLagSeconds, "Value: %s", val) + } +} diff --git a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go index a69d55c3417..4b556955815 100644 --- a/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go +++ b/go/test/endtoend/vreplication/vreplication_vtctldclient_cli_test.go @@ -30,13 +30,15 @@ import ( "vitess.io/vitess/go/json2" "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/wrangler" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vschemapb "vitess.io/vitess/go/vt/proto/vschema" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" - "vitess.io/vitess/go/vt/topo/topoproto" + vttablet "vitess.io/vitess/go/vt/vttablet/common" ) // TestVtctldclientCLI tests the vreplication vtctldclient CLI commands, primarily to check that non-standard flags @@ -44,12 +46,16 @@ import ( func TestVtctldclientCLI(t *testing.T) { setSidecarDBName("_vt") var err error + origDefaultReplicas := defaultReplicas origDefaultRdonly := defaultRdonly defer func() { + defaultReplicas = origDefaultReplicas defaultRdonly = origDefaultRdonly }() + defaultReplicas = 1 defaultRdonly = 0 vc = setupMinimalCluster(t) + vttablet.InitVReplicationConfigDefaults() err = vc.Vtctl.AddCellInfo("zone2") require.NoError(t, err) @@ -62,7 +68,19 @@ func TestVtctldclientCLI(t *testing.T) { targetKeyspaceName := "customer" var mt iMoveTables workflowName := "wf1" + + sourceReplicaTab = vc.Cells["zone1"].Keyspaces[sourceKeyspaceName].Shards["0"].Tablets["zone1-101"].Vttablet + require.NotNil(t, sourceReplicaTab) + sourceTab = vc.Cells["zone1"].Keyspaces[sourceKeyspaceName].Shards["0"].Tablets["zone1-100"].Vttablet + require.NotNil(t, sourceTab) + targetTabs := setupMinimalCustomerKeyspace(t) + targetTab1 = targetTabs["-80"] + require.NotNil(t, targetTab1) + targetTab2 = targetTabs["80-"] + require.NotNil(t, targetTab2) + targetReplicaTab1 = vc.Cells["zone1"].Keyspaces[targetKeyspaceName].Shards["-80"].Tablets["zone1-201"].Vttablet + require.NotNil(t, targetReplicaTab1) t.Run("RoutingRulesApply", func(t *testing.T) { testRoutingRulesApplyCommands(t) @@ -73,6 +91,9 @@ func TestVtctldclientCLI(t *testing.T) { t.Run("MoveTablesCreateFlags1", func(t *testing.T) { testMoveTablesFlags1(t, &mt, sourceKeyspaceName, targetKeyspaceName, workflowName, targetTabs) }) + t.Run("testWorkflowUpdateConfig", func(t *testing.T) { + testWorkflowUpdateConfig(t, &mt, targetTabs, targetKeyspaceName, workflowName) + }) t.Run("MoveTablesCreateFlags2", func(t *testing.T) { testMoveTablesFlags2(t, &mt, sourceKeyspaceName, targetKeyspaceName, workflowName, targetTabs) }) @@ -90,6 +111,19 @@ func TestVtctldclientCLI(t *testing.T) { "-40": targetKeyspace.Shards["-40"].Tablets["zone1-400"].Vttablet, "40-80": targetKeyspace.Shards["40-80"].Tablets["zone1-500"].Vttablet, } + + sourceReplicaTab = vc.Cells["zone1"].Keyspaces[targetKeyspaceName].Shards["-80"].Tablets["zone1-201"].Vttablet + require.NotNil(t, sourceReplicaTab) + sourceTab = vc.Cells["zone1"].Keyspaces[targetKeyspaceName].Shards["-80"].Tablets["zone1-200"].Vttablet + require.NotNil(t, sourceTab) + + targetTab1 = tablets["-40"] + require.NotNil(t, targetTab1) + targetTab2 = tablets["40-80"] + require.NotNil(t, targetTab2) + targetReplicaTab1 = vc.Cells["zone1"].Keyspaces[targetKeyspaceName].Shards["-40"].Tablets["zone1-401"].Vttablet + require.NotNil(t, targetReplicaTab1) + splitShard(t, targetKeyspaceName, reshardWorkflowName, sourceShard, newShards, tablets) }) } @@ -97,10 +131,16 @@ func TestVtctldclientCLI(t *testing.T) { // Tests several create flags and some complete flags and validates that some of them are set correctly for the workflow. func testMoveTablesFlags1(t *testing.T, mt *iMoveTables, sourceKeyspace, targetKeyspace, workflowName string, targetTabs map[string]*cluster.VttabletProcess) { tables := "customer,customer2" + overrides := map[string]string{ + "vreplication_net_read_timeout": "6000", + "relay_log_max_items": "10000", + "vreplication-parallel-insert-workers": "10", + } createFlags := []string{"--auto-start=false", "--defer-secondary-keys=false", "--stop-after-copy", "--no-routing-rules", "--on-ddl", "STOP", "--exclude-tables", "customer2", "--tablet-types", "primary,rdonly", "--tablet-types-in-preference-order=true", - "--all-cells", + "--all-cells", "--config-overrides", mapToCSV(overrides), + "--sharded-auto-increment-handling=REPLACE", fmt.Sprintf("--global-keyspace=%s", sourceKeyspace), } completeFlags := []string{"--keep-routing-rules", "--keep-data"} switchFlags := []string{} @@ -117,6 +157,7 @@ func testMoveTablesFlags1(t *testing.T, mt *iMoveTables, sourceKeyspace, targetK validateMoveTablesWorkflow(t, workflowResponse.Workflows) // Since we used --no-routing-rules, there should be no routing rules. confirmNoRoutingRules(t) + validateOverrides(t, targetTabs, overrides) } func getMoveTablesShowResponse(mt *iMoveTables) *vtctldatapb.GetWorkflowsResponse { @@ -132,6 +173,7 @@ func getMoveTablesShowResponse(mt *iMoveTables) *vtctldatapb.GetWorkflowsRespons // Validates some of the flags created from the previous test. func testMoveTablesFlags2(t *testing.T, mt *iMoveTables, sourceKeyspace, targetKeyspace, workflowName string, targetTabs map[string]*cluster.VttabletProcess) { ksWorkflow := fmt.Sprintf("%s.%s", targetKeyspace, workflowName) + wf := (*mt).(iWorkflow) (*mt).Start() // Need to start because we set auto-start to false. waitForWorkflowState(t, vc, ksWorkflow, binlogdatapb.VReplicationWorkflowState_Stopped.String()) confirmNoRoutingRules(t) @@ -151,7 +193,85 @@ func testMoveTablesFlags2(t *testing.T, mt *iMoveTables, sourceKeyspace, targetK for _, tab := range targetTabs { catchup(t, tab, workflowName, "MoveTables") } + + (*mt).SwitchReads() + validateReadsRouteToTarget(t, "replica") + validateTableRoutingRule(t, "customer", "replica", sourceKs, targetKs) + validateTableRoutingRule(t, "customer", "", targetKs, sourceKs) + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateReadsSwitched) + + (*mt).ReverseReads() + validateReadsRouteToSource(t, "replica") + validateTableRoutingRule(t, "customer", "replica", targetKs, sourceKs) + validateTableRoutingRule(t, "customer", "", targetKs, sourceKs) + confirmStates(t, &wf, wrangler.WorkflowStateReadsSwitched, wrangler.WorkflowStateNotSwitched) + + (*mt).SwitchReadsAndWrites() + validateReadsRouteToTarget(t, "replica") + validateTableRoutingRule(t, "customer", "replica", sourceKs, targetKs) + validateWritesRouteToTarget(t) + validateTableRoutingRule(t, "customer", "", sourceKs, targetKs) + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) + + (*mt).ReverseReadsAndWrites() + validateReadsRouteToSource(t, "replica") + validateTableRoutingRule(t, "customer", "replica", targetKs, sourceKs) + validateWritesRouteToSource(t) + validateTableRoutingRule(t, "customer", "", targetKs, sourceKs) + confirmStates(t, &wf, wrangler.WorkflowStateAllSwitched, wrangler.WorkflowStateNotSwitched) + + (*mt).SwitchReadsAndWrites() + validateReadsRouteToTarget(t, "replica") + validateTableRoutingRule(t, "customer", "replica", sourceKs, targetKs) + validateWritesRouteToTarget(t) + validateTableRoutingRule(t, "customer", "", sourceKs, targetKs) + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) + + (*mt).ReverseReads() + validateReadsRouteToSource(t, "replica") + validateTableRoutingRule(t, "customer", "replica", targetKs, sourceKs) + validateWritesRouteToTarget(t) + validateTableRoutingRule(t, "customer", "", sourceKs, targetKs) + confirmStates(t, &wf, wrangler.WorkflowStateAllSwitched, wrangler.WorkflowStateWritesSwitched) + + (*mt).ReverseWrites() + validateReadsRouteToSource(t, "replica") + validateTableRoutingRule(t, "customer", "replica", targetKs, sourceKs) + validateWritesRouteToSource(t) + validateTableRoutingRule(t, "customer", "", targetKs, sourceKs) + confirmStates(t, &wf, wrangler.WorkflowStateWritesSwitched, wrangler.WorkflowStateNotSwitched) + (*mt).SwitchReadsAndWrites() + validateReadsRouteToTarget(t, "replica") + validateTableRoutingRule(t, "customer", "replica", sourceKs, targetKs) + validateWritesRouteToTarget(t) + validateTableRoutingRule(t, "customer", "", sourceKs, targetKs) + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) + + (*mt).ReverseWrites() + validateReadsRouteToTarget(t, "replica") + validateTableRoutingRule(t, "customer", "replica", sourceKs, targetKs) + validateWritesRouteToSource(t) + validateTableRoutingRule(t, "customer", "", targetKs, sourceKs) + confirmStates(t, &wf, wrangler.WorkflowStateAllSwitched, wrangler.WorkflowStateReadsSwitched) + + (*mt).ReverseReads() + validateReadsRouteToSource(t, "replica") + validateTableRoutingRule(t, "customer", "replica", targetKs, sourceKs) + validateWritesRouteToSource(t) + validateTableRoutingRule(t, "customer", "", targetKs, sourceKs) + confirmStates(t, &wf, wrangler.WorkflowStateReadsSwitched, wrangler.WorkflowStateNotSwitched) + + // Confirm that everything is still in sync after our switch fest. + vdiff(t, targetKeyspace, workflowName, "zone1", false, true, nil) + + (*mt).SwitchReadsAndWrites() + validateReadsRouteToTarget(t, "replica") + validateTableRoutingRule(t, "customer", "replica", sourceKs, targetKs) + validateWritesRouteToTarget(t) + validateTableRoutingRule(t, "customer", "", sourceKs, targetKs) + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) + (*mt).Complete() confirmRoutingRulesExist(t) // Confirm that --keep-data was honored. @@ -212,6 +332,91 @@ func testWorkflowList(t *testing.T, sourceKeyspace, targetKeyspace string) { require.EqualValues(t, wfNames, workflowNames) } +func testWorkflowUpdateConfig(t *testing.T, mt *iMoveTables, targetTabs map[string]*cluster.VttabletProcess, targetKeyspace, workflow string) { + updateConfig := func(t *testing.T, overrides map[string]string) error { + overridesCSV := mapToCSV(overrides) + _, err := vc.VtctldClient.ExecuteCommandWithOutput("workflow", "--keyspace", targetKeyspace, "update", + "--workflow", workflow, "--config-overrides", overridesCSV) + return err + } + require.GreaterOrEqual(t, len(targetTabs), 1) + tab := maps.Values(targetTabs)[0] + require.NotNil(t, tab) + defaultConfig := vttablet.InitVReplicationConfigDefaults() + type testCase struct { + name string + config map[string]string + needError bool + clears bool + } + testCases := []testCase{ + { + name: "reset flags", + config: defaultConfig.Map(), + clears: true, + }, + { + name: "one value", + config: map[string]string{ + "vreplication_heartbeat_update_interval": "10", + }, + }, + { + name: "two values", + config: map[string]string{ + "vreplication_heartbeat_update_interval": "100", + "vreplication_store_compressed_gtid": "true", + }, + }, + { + name: "invalid value", + config: map[string]string{ + "vreplication_heartbeat_update_interval": "12s", + "vreplication_store_compressed_gtid": "true", + }, + needError: true, + }, + { + name: "unknown flag", + config: map[string]string{ + "vreplication_heartbeat_update_interval": "1", + "vreplication_store_compressed_gtid": "true", + "unknown": "value", + }, + needError: true, + }, + { + name: "clear flags", + config: map[string]string{ + "vreplication_heartbeat_update_interval": "", + "vreplication_store_compressed_gtid": "", + }, + clears: true, + }, + } + + expectedConfig, err := vttablet.NewVReplicationConfig(nil) + require.NoError(t, err) + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := updateConfig(t, tc.config) + if tc.needError { + require.Error(t, err) + } else { + require.NoError(t, err) + expectedConfig, err = vttablet.NewVReplicationConfig(tc.config) + require.NoError(t, err) + } + config := getVReplicationConfig(t, tab) + if tc.clears { + expectedConfig, err = vttablet.NewVReplicationConfig(nil) + require.NoError(t, err) + } + require.EqualValues(t, expectedConfig.Map(), config) + }) + } +} + func createMoveTables(t *testing.T, sourceKeyspace, targetKeyspace, workflowName, tables string, createFlags, completeFlags, switchFlags []string) iMoveTables { mt := newMoveTables(vc, &moveTablesWorkflow{ @@ -233,9 +438,17 @@ func createMoveTables(t *testing.T, sourceKeyspace, targetKeyspace, workflowName // reshard helpers func splitShard(t *testing.T, keyspace, workflowName, sourceShards, targetShards string, targetTabs map[string]*cluster.VttabletProcess) { + overrides := map[string]string{ + "vreplication_copy_phase_duration": "10h11m12s", + "vreplication_experimental_flags": "7", + "vreplication-parallel-insert-workers": "4", + "vreplication_net_read_timeout": "6000", + "relay_log_max_items": "10000", + } createFlags := []string{"--auto-start=false", "--defer-secondary-keys=false", "--stop-after-copy", "--on-ddl", "STOP", "--tablet-types", "primary,rdonly", "--tablet-types-in-preference-order=true", "--all-cells", "--format=json", + "--config-overrides", mapToCSV(overrides), } rs := newReshard(vc, &reshardWorkflow{ workflowInfo: &workflowInfo{ @@ -249,8 +462,10 @@ func splitShard(t *testing.T, keyspace, workflowName, sourceShards, targetShards }, workflowFlavorVtctld) ksWorkflow := fmt.Sprintf("%s.%s", keyspace, workflowName) + wf := rs.(iWorkflow) rs.Create() validateReshardResponse(rs) + validateOverrides(t, targetTabs, overrides) workflowResponse := getWorkflow(keyspace, workflowName) reshardShowResponse := getReshardShowResponse(&rs) require.EqualValues(t, reshardShowResponse, workflowResponse) @@ -275,17 +490,123 @@ func splitShard(t *testing.T, keyspace, workflowName, sourceShards, targetShards } vdiff(t, keyspace, workflowName, "zone1", false, true, nil) + shardReadsRouteToSource := func() { + require.True(t, getShardRoute(t, keyspace, "-80", "replica")) + } + + shardReadsRouteToTarget := func() { + require.True(t, getShardRoute(t, keyspace, "-40", "replica")) + } + + shardWritesRouteToSource := func() { + require.True(t, getShardRoute(t, keyspace, "-80", "primary")) + } + + shardWritesRouteToTarget := func() { + require.True(t, getShardRoute(t, keyspace, "-40", "primary")) + } + rs.SwitchReadsAndWrites() waitForLowLag(t, keyspace, workflowName+"_reverse") vdiff(t, keyspace, workflowName+"_reverse", "zone1", true, false, nil) + shardReadsRouteToTarget() + shardWritesRouteToTarget() + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) rs.ReverseReadsAndWrites() waitForLowLag(t, keyspace, workflowName) vdiff(t, keyspace, workflowName, "zone1", false, true, nil) + shardReadsRouteToSource() + shardWritesRouteToSource() + confirmStates(t, &wf, wrangler.WorkflowStateAllSwitched, wrangler.WorkflowStateNotSwitched) + + rs.SwitchReads() + shardReadsRouteToTarget() + shardWritesRouteToSource() + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateReadsSwitched) + + rs.ReverseReads() + shardReadsRouteToSource() + shardWritesRouteToSource() + confirmStates(t, &wf, wrangler.WorkflowStateReadsSwitched, wrangler.WorkflowStateNotSwitched) + + rs.SwitchReadsAndWrites() + shardReadsRouteToTarget() + shardWritesRouteToTarget() + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) + + rs.ReverseReadsAndWrites() + shardReadsRouteToSource() + shardWritesRouteToSource() + confirmStates(t, &wf, wrangler.WorkflowStateAllSwitched, wrangler.WorkflowStateNotSwitched) + + rs.SwitchReadsAndWrites() + shardReadsRouteToTarget() + shardWritesRouteToTarget() + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) + + rs.ReverseReads() + shardReadsRouteToSource() + shardWritesRouteToTarget() + confirmStates(t, &wf, wrangler.WorkflowStateAllSwitched, wrangler.WorkflowStateWritesSwitched) + + rs.ReverseWrites() + shardReadsRouteToSource() + shardWritesRouteToSource() + confirmStates(t, &wf, wrangler.WorkflowStateWritesSwitched, wrangler.WorkflowStateNotSwitched) + + rs.SwitchReadsAndWrites() + shardReadsRouteToTarget() + shardWritesRouteToTarget() + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) + + rs.ReverseWrites() + shardReadsRouteToTarget() + shardWritesRouteToSource() + confirmStates(t, &wf, wrangler.WorkflowStateAllSwitched, wrangler.WorkflowStateReadsSwitched) + + rs.ReverseReads() + shardReadsRouteToSource() + shardWritesRouteToSource() + confirmStates(t, &wf, wrangler.WorkflowStateReadsSwitched, wrangler.WorkflowStateNotSwitched) + + // Confirm that everything is still in sync after our switch fest. + vdiff(t, keyspace, workflowName, "zone1", false, true, nil) + rs.SwitchReadsAndWrites() + shardReadsRouteToTarget() + shardWritesRouteToTarget() + confirmStates(t, &wf, wrangler.WorkflowStateNotSwitched, wrangler.WorkflowStateAllSwitched) + rs.Complete() } +func getSrvKeyspace(t *testing.T, keyspace string) *topodatapb.SrvKeyspace { + output, err := vc.VtctldClient.ExecuteCommandWithOutput("GetSrvKeyspaces", keyspace, "zone1") + require.NoError(t, err) + var srvKeyspaces map[string]*topodatapb.SrvKeyspace + err = json2.Unmarshal([]byte(output), &srvKeyspaces) + require.NoError(t, err) + require.Equal(t, 1, len(srvKeyspaces)) + return srvKeyspaces["zone1"] +} + +func getShardRoute(t *testing.T, keyspace, shard string, tabletType string) bool { + srvKeyspace := getSrvKeyspace(t, keyspace) + for _, partition := range srvKeyspace.Partitions { + tt, err := topoproto.ParseTabletType(tabletType) + require.NoError(t, err) + if partition.ServedType == tt { + for _, shardReference := range partition.ShardReferences { + if shardReference.Name == shard { + return true + } + } + } + } + return false +} + func getReshardShowResponse(rs *iReshard) *vtctldatapb.GetWorkflowsResponse { (*rs).Show() reshardOutput := (*rs).GetLastOutput() @@ -485,6 +806,10 @@ func validateMoveTablesWorkflow(t *testing.T, workflows []*vtctldatapb.Workflow) require.Equalf(t, 1, len(bls.Filter.Rules), "Rules are %+v", bls.Filter.Rules) // only customer, customer2 should be excluded require.Equal(t, binlogdatapb.OnDDLAction_STOP, bls.OnDdl) require.True(t, bls.StopAfterCopy) + + // Validate the sharded-auto-increment-handling related value handling. + require.Equal(t, vtctldatapb.ShardedAutoIncrementHandling_REPLACE, vtctldatapb.ShardedAutoIncrementHandling(wf.Options.ShardedAutoIncrementHandling)) + require.Equal(t, wf.Source.Keyspace, wf.Options.GlobalKeyspace) } // Test that routing rules can be applied using the vtctldclient CLI for all types of routing rules. @@ -621,3 +946,8 @@ func testOneRoutingRulesCommand(t *testing.T, typ string, rules string, validate }) } } + +func confirmStates(t *testing.T, workflow *iWorkflow, startState, endState string) { + require.Contains(t, (*workflow).GetLastOutput(), fmt.Sprintf("Start State: %s", startState)) + require.Contains(t, (*workflow).GetLastOutput(), fmt.Sprintf("Current State: %s", endState)) +} diff --git a/go/test/endtoend/vreplication/vstream_test.go b/go/test/endtoend/vreplication/vstream_test.go index e13c3e24e80..3f79a35b569 100644 --- a/go/test/endtoend/vreplication/vstream_test.go +++ b/go/test/endtoend/vreplication/vstream_test.go @@ -28,13 +28,13 @@ import ( "github.com/stretchr/testify/require" "vitess.io/vitess/go/vt/log" - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" - vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" _ "vitess.io/vitess/go/vt/vtctl/grpcvtctlclient" _ "vitess.io/vitess/go/vt/vtgate/grpcvtgateconn" - "vitess.io/vitess/go/vt/vtgate/vtgateconn" + + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" ) // Validates that we have a working VStream API @@ -598,13 +598,15 @@ func TestMultiVStreamsKeyspaceReshard(t *testing.T) { Match: "/customer.*", }}, } - flags := &vtgatepb.VStreamFlags{} + flags := &vtgatepb.VStreamFlags{ + IncludeReshardJournalEvents: true, + } + journalEvents := 0 // Stream events but stop once we have a VGTID with positions for the old/original shards. var newVGTID *binlogdatapb.VGtid func() { - var reader vtgateconn.VStreamReader - reader, err = vstreamConn.VStream(ctx, topodatapb.TabletType_PRIMARY, vgtid, filter, flags) + reader, err := vstreamConn.VStream(ctx, topodatapb.TabletType_PRIMARY, vgtid, filter, flags) require.NoError(t, err) for { evs, err := reader.Recv() @@ -658,8 +660,7 @@ func TestMultiVStreamsKeyspaceReshard(t *testing.T) { // Now start a new VStream from our previous VGTID which only has the old/original shards. func() { - var reader vtgateconn.VStreamReader - reader, err = vstreamConn.VStream(ctx, topodatapb.TabletType_PRIMARY, newVGTID, filter, flags) + reader, err := vstreamConn.VStream(ctx, topodatapb.TabletType_PRIMARY, newVGTID, filter, flags) require.NoError(t, err) for { evs, err := reader.Recv() @@ -680,6 +681,9 @@ func TestMultiVStreamsKeyspaceReshard(t *testing.T) { default: require.FailNow(t, fmt.Sprintf("received event for unexpected shard: %s", shard)) } + case binlogdatapb.VEventType_JOURNAL: + require.True(t, ev.Journal.MigrationType == binlogdatapb.MigrationType_SHARDS) + journalEvents++ } } default: @@ -694,8 +698,10 @@ func TestMultiVStreamsKeyspaceReshard(t *testing.T) { }() // We should have a mix of events across the old and new shards. - require.NotZero(t, oldShardRowEvents) - require.NotZero(t, newShardRowEvents) + require.Greater(t, oldShardRowEvents, 0) + require.Greater(t, newShardRowEvents, 0) + // We should have seen a reshard journal event. + require.Greater(t, journalEvents, 0) // The number of row events streamed by the VStream API should match the number of rows inserted. customerResult := execVtgateQuery(t, vtgateConn, ks, "select count(*) from customer") @@ -704,6 +710,206 @@ func TestMultiVStreamsKeyspaceReshard(t *testing.T) { require.Equal(t, customerCount, int64(oldShardRowEvents+newShardRowEvents)) } +// TestMultiVStreamsKeyspaceStopOnReshard confirms that journal events are received +// when resuming a VStream after a reshard. +func TestMultiVStreamsKeyspaceStopOnReshard(t *testing.T) { + ctx := context.Background() + ks := "testks" + wf := "multiVStreamsKeyspaceReshard" + baseTabletID := 100 + tabletType := topodatapb.TabletType_PRIMARY.String() + oldShards := "-80,80-" + newShards := "-40,40-80,80-c0,c0-" + oldShardRowEvents, journalEvents := 0, 0 + vc = NewVitessCluster(t, nil) + defer vc.TearDown() + defaultCell := vc.Cells[vc.CellNames[0]] + ogdr := defaultReplicas + defaultReplicas = 0 // Because of CI resource constraints we can only run this test with primary tablets + defer func(dr int) { defaultReplicas = dr }(ogdr) + + // For our sequences etc. + _, err := vc.AddKeyspace(t, []*Cell{defaultCell}, "global", "0", vschemaUnsharded, schemaUnsharded, defaultReplicas, defaultRdonly, baseTabletID, nil) + require.NoError(t, err) + + // Setup the keyspace with our old/original shards. + keyspace, err := vc.AddKeyspace(t, []*Cell{defaultCell}, ks, oldShards, vschemaSharded, schemaSharded, defaultReplicas, defaultRdonly, baseTabletID+1000, nil) + require.NoError(t, err) + + // Add the new shards. + err = vc.AddShards(t, []*Cell{defaultCell}, keyspace, newShards, defaultReplicas, defaultRdonly, baseTabletID+2000, targetKsOpts) + require.NoError(t, err) + + vtgateConn := getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) + defer vtgateConn.Close() + verifyClusterHealth(t, vc) + + vstreamConn, err := vtgateconn.Dial(ctx, fmt.Sprintf("%s:%d", vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateGrpcPort)) + require.NoError(t, err) + defer vstreamConn.Close() + + // Ensure that we're starting with a clean slate. + _, err = vtgateConn.ExecuteFetch(fmt.Sprintf("delete from %s.customer", ks), 1000, false) + require.NoError(t, err) + + // Coordinate go-routines. + streamCtx, streamCancel := context.WithTimeout(ctx, 1*time.Minute) + defer streamCancel() + done := make(chan struct{}) + + // First goroutine that keeps inserting rows into the table being streamed until the + // stream context is cancelled. + go func() { + id := 1 + for { + select { + case <-streamCtx.Done(): + // Give the VStream a little catch-up time before telling it to stop + // via the done channel. + time.Sleep(10 * time.Second) + close(done) + return + default: + insertRow(ks, "customer", id) + time.Sleep(250 * time.Millisecond) + id++ + } + } + }() + + // Create the Reshard workflow and wait for it to finish the copy phase. + reshardAction(t, "Create", wf, ks, oldShards, newShards, defaultCellName, tabletType) + waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", ks, wf), binlogdatapb.VReplicationWorkflowState_Running.String()) + + vgtid := &binlogdatapb.VGtid{ + ShardGtids: []*binlogdatapb.ShardGtid{{ + // Only stream the keyspace that we're resharding. Otherwise the client stream + // will continue to run with only the tablet stream from the global keyspace. + Keyspace: ks, + }}} + + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + // Stream all tables. + Match: "/.*", + }}, + } + flags := &vtgatepb.VStreamFlags{ + StopOnReshard: true, + } + + // Stream events but stop once we have a VGTID with positions for the old/original shards. + var newVGTID *binlogdatapb.VGtid + func() { + reader, err := vstreamConn.VStream(ctx, topodatapb.TabletType_PRIMARY, vgtid, filter, flags) + require.NoError(t, err) + for { + evs, err := reader.Recv() + + switch err { + case nil: + for _, ev := range evs { + switch ev.Type { + case binlogdatapb.VEventType_ROW: + shard := ev.GetRowEvent().GetShard() + switch shard { + case "-80", "80-": + oldShardRowEvents++ + default: + require.FailNow(t, fmt.Sprintf("received event for unexpected shard: %s", shard)) + } + case binlogdatapb.VEventType_VGTID: + newVGTID = ev.GetVgtid() + // We want a VGTID with a ShardGtid for both of the old shards. + if len(newVGTID.GetShardGtids()) == 2 { + canStop := true + for _, sg := range newVGTID.GetShardGtids() { + if sg.GetGtid() == "" { + canStop = false + } + } + if canStop { + return + } + } + } + } + default: + require.FailNow(t, fmt.Sprintf("VStream returned unexpected error: %v", err)) + } + select { + case <-streamCtx.Done(): + return + default: + } + } + }() + + // Confirm that we have shard GTIDs for the old/original shards. + require.Len(t, newVGTID.GetShardGtids(), 2) + t.Logf("Position at end of first stream: %+v", newVGTID.GetShardGtids()) + + // Switch the traffic to the new shards. + reshardAction(t, "SwitchTraffic", wf, ks, oldShards, newShards, defaultCellName, tabletType) + + // Now start a new VStream from our previous VGTID which only has the old/original shards. + expectedJournalEvents := 2 // One for each old shard: -80,80- + var streamStopped bool // We expect the stream to end with io.EOF from the reshard + runResumeStream := func() { + journalEvents = 0 + streamStopped = false + t.Logf("Streaming from position: %+v", newVGTID.GetShardGtids()) + reader, err := vstreamConn.VStream(ctx, topodatapb.TabletType_PRIMARY, newVGTID, filter, flags) + require.NoError(t, err) + for { + evs, err := reader.Recv() + + switch err { + case nil: + for i, ev := range evs { + switch ev.Type { + case binlogdatapb.VEventType_ROW: + shard := ev.RowEvent.Shard + switch shard { + case "-80", "80-": + default: + require.FailNow(t, fmt.Sprintf("received event for unexpected shard: %s", shard)) + } + case binlogdatapb.VEventType_JOURNAL: + t.Logf("Journal event: %+v", ev) + journalEvents++ + require.Equal(t, binlogdatapb.VEventType_BEGIN, evs[i-1].Type, "JOURNAL event not preceded by BEGIN event") + require.Equal(t, binlogdatapb.VEventType_VGTID, evs[i+1].Type, "JOURNAL event not followed by VGTID event") + require.Equal(t, binlogdatapb.VEventType_COMMIT, evs[i+2].Type, "JOURNAL event not followed by COMMIT event") + } + } + case io.EOF: + streamStopped = true + return + default: + require.FailNow(t, fmt.Sprintf("VStream returned unexpected error: %v", err)) + } + select { + case <-done: + return + default: + } + } + } + + // Multiple VStream clients should be able to resume from where they left off and + // get the reshard journal event. + for i := 1; i <= expectedJournalEvents; i++ { + runResumeStream() + // We should have seen the journal event for each shard in the stream due to + // using StopOnReshard. + require.Equal(t, expectedJournalEvents, journalEvents, + "did not get expected journal events on resume vstream #%d", i) + // Confirm that the stream stopped on the reshard. + require.True(t, streamStopped, "the vstream did not stop with io.EOF as expected") + } +} + func TestVStreamFailover(t *testing.T) { testVStreamWithFailover(t, true) } @@ -747,3 +953,139 @@ func TestVStreamCopyMultiKeyspaceReshard(t *testing.T) { require.NotZero(t, ne.numDash40Events) require.NotZero(t, ne.num40DashEvents) } + +const ( + vstreamHeartbeatsTestContextTimeout = 20 * time.Second + // Expect a reasonable number of heartbeats to be received in the test duration, should ideally be ~ timeout + // since the heartbeat interval is set to 1s. But we set it to 10 to be conservative to avoid CI flakiness. + numExpectedHeartbeats = 10 +) + +func doVStream(t *testing.T, vc *VitessCluster, flags *vtgatepb.VStreamFlags) (numRowEvents map[string]int, numFieldEvents map[string]int) { + // Stream for a while to ensure heartbeats are sent. + ctx, cancel := context.WithTimeout(context.Background(), vstreamHeartbeatsTestContextTimeout) + defer cancel() + + numRowEvents = make(map[string]int) + numFieldEvents = make(map[string]int) + vstreamConn, err := vtgateconn.Dial(ctx, fmt.Sprintf("%s:%d", vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateGrpcPort)) + require.NoError(t, err) + defer vstreamConn.Close() + + done := false + vgtid := &binlogdatapb.VGtid{ + ShardGtids: []*binlogdatapb.ShardGtid{{ + Keyspace: "product", + Shard: "0", + Gtid: "", + }}} + + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "customer", + Filter: "select * from customer", + }}, + } + // Stream events from the VStream API. + reader, err := vstreamConn.VStream(ctx, topodatapb.TabletType_PRIMARY, vgtid, filter, flags) + require.NoError(t, err) + for !done { + evs, err := reader.Recv() + switch err { + case nil: + for _, ev := range evs { + switch ev.Type { + case binlogdatapb.VEventType_ROW: + rowEvent := ev.RowEvent + arr := strings.Split(rowEvent.TableName, ".") + require.Equal(t, len(arr), 2) + tableName := arr[1] + require.Equal(t, "product", rowEvent.Keyspace) + require.Equal(t, "0", rowEvent.Shard) + numRowEvents[tableName]++ + + case binlogdatapb.VEventType_FIELD: + fieldEvent := ev.FieldEvent + arr := strings.Split(fieldEvent.TableName, ".") + require.Equal(t, len(arr), 2) + tableName := arr[1] + require.Equal(t, "product", fieldEvent.Keyspace) + require.Equal(t, "0", fieldEvent.Shard) + numFieldEvents[tableName]++ + default: + } + } + case io.EOF: + log.Infof("Stream Ended") + done = true + default: + log.Errorf("remote error: %v", err) + done = true + } + } + return numRowEvents, numFieldEvents +} + +// TestVStreamHeartbeats enables streaming of the internal Vitess heartbeat tables in the VStream API and +// ensures that the heartbeat events are received as expected by the client. +func TestVStreamHeartbeats(t *testing.T) { + // Enable continuous heartbeats. + extraVTTabletArgs = append(extraVTTabletArgs, + "--heartbeat_enable", + "--heartbeat_interval", "1s", + "--heartbeat_on_demand_duration", "0", + ) + setSidecarDBName("_vt") + config := *mainClusterConfig + config.overrideHeartbeatOptions = true + vc = NewVitessCluster(t, &clusterOptions{ + clusterConfig: &config, + }) + defer vc.TearDown() + + require.NotNil(t, vc) + defaultReplicas = 0 + defaultRdonly = 0 + + defaultCell := vc.Cells[vc.CellNames[0]] + vc.AddKeyspace(t, []*Cell{defaultCell}, "product", "0", initialProductVSchema, initialProductSchema, + defaultReplicas, defaultRdonly, 100, nil) + verifyClusterHealth(t, vc) + insertInitialData(t) + + expectedNumRowEvents := make(map[string]int) + expectedNumRowEvents["customer"] = 3 // 3 rows inserted in the customer table in insertInitialData() + + type testCase struct { + name string + flags *vtgatepb.VStreamFlags + expectedHeartbeats int + } + testCases := []testCase{ + { + name: "With Keyspace Heartbeats On", + flags: &vtgatepb.VStreamFlags{ + StreamKeyspaceHeartbeats: true, + }, + expectedHeartbeats: numExpectedHeartbeats, + }, + { + name: "With Keyspace Heartbeats Off", + flags: nil, + expectedHeartbeats: 0, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + gotNumRowEvents, gotNumFieldEvents := doVStream(t, vc, tc.flags) + for k := range expectedNumRowEvents { + require.Equalf(t, 1, gotNumFieldEvents[k], "incorrect number of field events for table %s, got %d", k, gotNumFieldEvents[k]) + } + require.GreaterOrEqual(t, gotNumRowEvents["heartbeat"], tc.expectedHeartbeats, "incorrect number of heartbeat events received") + log.Infof("Total number of heartbeat events received: %v", gotNumRowEvents["heartbeat"]) + delete(gotNumRowEvents, "heartbeat") + require.Equal(t, expectedNumRowEvents, gotNumRowEvents) + }) + } +} diff --git a/go/test/endtoend/vreplication/wrappers_test.go b/go/test/endtoend/vreplication/wrappers_test.go index 96c54b89fe8..d1fff1af1c6 100644 --- a/go/test/endtoend/vreplication/wrappers_test.go +++ b/go/test/endtoend/vreplication/wrappers_test.go @@ -19,6 +19,7 @@ package vreplication import ( "math/rand/v2" "strconv" + "strings" "github.com/stretchr/testify/require" @@ -33,12 +34,15 @@ type iWorkflow interface { SwitchReads() SwitchWrites() SwitchReadsAndWrites() + ReverseReads() + ReverseWrites() ReverseReadsAndWrites() Cancel() Complete() Flavor() string GetLastOutput() string Start() + Status() Stop() } @@ -146,6 +150,11 @@ func (vmt *VtctlMoveTables) Show() { panic("implement me") } +func (vmt *VtctlMoveTables) Status() { + currentWorkflowType = binlogdatapb.VReplicationWorkflowType_MoveTables + vmt.exec("Status") +} + func (vmt *VtctlMoveTables) exec(action string) { options := &workflowExecOptions{ deferSecondaryKeys: false, @@ -156,13 +165,26 @@ func (vmt *VtctlMoveTables) exec(action string) { require.NoError(vmt.vc.t, err) } func (vmt *VtctlMoveTables) SwitchReads() { - // TODO implement me - panic("implement me") + err := tstWorkflowExecVtctl(vmt.vc.t, "", vmt.workflowName, vmt.sourceKeyspace, vmt.targetKeyspace, + vmt.tables, workflowActionSwitchTraffic, "replica,rdonly", "", "", defaultWorkflowExecOptions) + require.NoError(vmt.vc.t, err) } func (vmt *VtctlMoveTables) SwitchWrites() { - // TODO implement me - panic("implement me") + err := tstWorkflowExecVtctl(vmt.vc.t, "", vmt.workflowName, vmt.sourceKeyspace, vmt.targetKeyspace, + vmt.tables, workflowActionSwitchTraffic, "primary", "", "", defaultWorkflowExecOptions) + require.NoError(vmt.vc.t, err) +} +func (vmt *VtctlMoveTables) ReverseReads() { + err := tstWorkflowExecVtctl(vmt.vc.t, "", vmt.workflowName, vmt.sourceKeyspace, vmt.targetKeyspace, + vmt.tables, workflowActionReverseTraffic, "replica,rdonly", "", "", defaultWorkflowExecOptions) + require.NoError(vmt.vc.t, err) +} + +func (vmt *VtctlMoveTables) ReverseWrites() { + err := tstWorkflowExecVtctl(vmt.vc.t, "", vmt.workflowName, vmt.sourceKeyspace, vmt.targetKeyspace, + vmt.tables, workflowActionReverseTraffic, "primary", "", "", defaultWorkflowExecOptions) + require.NoError(vmt.vc.t, err) } func (vmt *VtctlMoveTables) Cancel() { @@ -203,9 +225,9 @@ func (v VtctldMoveTables) exec(args ...string) { args2 := []string{"MoveTables", "--workflow=" + v.workflowName, "--target-keyspace=" + v.targetKeyspace} args2 = append(args2, args...) var err error - if v.lastOutput, err = vc.VtctldClient.ExecuteCommandWithOutput(args2...); err != nil { - require.FailNowf(v.vc.t, "failed MoveTables action", "%v: %s", err, v.lastOutput) - } + v.vc.t.Logf("Executing workflow command: vtctldclient %s", strings.Join(args2, " ")) + v.lastOutput, err = vc.VtctldClient.ExecuteCommandWithOutput(args2...) + require.NoError(v.vc.t, err, "failed MoveTables action, error: %v: output: %s", err, v.lastOutput) } func (v VtctldMoveTables) Create() { @@ -247,6 +269,10 @@ func (v VtctldMoveTables) Show() { v.exec(args...) } +func (v VtctldMoveTables) Status() { + v.exec("Status") +} + func (v VtctldMoveTables) SwitchReads() { args := []string{"SwitchTraffic", "--tablet-types=rdonly,replica"} args = append(args, v.switchFlags...) @@ -259,8 +285,21 @@ func (v VtctldMoveTables) SwitchWrites() { v.exec(args...) } +func (v VtctldMoveTables) ReverseReads() { + args := []string{"ReverseTraffic", "--tablet-types=rdonly,replica"} + args = append(args, v.switchFlags...) + v.exec(args...) +} + +func (v VtctldMoveTables) ReverseWrites() { + args := []string{"ReverseTraffic", "--tablet-types=primary"} + args = append(args, v.switchFlags...) + v.exec(args...) +} + func (v VtctldMoveTables) Cancel() { - v.exec("Cancel") + args := []string{"Cancel", "--delete-batch-size=500"} + v.exec(args...) } func (v VtctldMoveTables) Complete() { @@ -323,6 +362,16 @@ type VtctlReshard struct { *reshardWorkflow } +func (vrs *VtctlReshard) ReverseReads() { + //TODO implement me + panic("implement me") +} + +func (vrs *VtctlReshard) ReverseWrites() { + //TODO implement me + panic("implement me") +} + func (vrs *VtctlReshard) Flavor() string { return "vtctl" } @@ -341,6 +390,11 @@ func (vrs *VtctlReshard) MirrorTraffic() { panic("implement me") } +func (vrs *VtctlReshard) Status() { + currentWorkflowType = binlogdatapb.VReplicationWorkflowType_Reshard + vrs.exec("Status") +} + func (vrs *VtctlReshard) SwitchReadsAndWrites() { vrs.exec(workflowActionSwitchTraffic) } @@ -409,9 +463,9 @@ func (v VtctldReshard) exec(args ...string) { args2 := []string{"Reshard", "--workflow=" + v.workflowName, "--target-keyspace=" + v.targetKeyspace} args2 = append(args2, args...) var err error - if v.lastOutput, err = vc.VtctldClient.ExecuteCommandWithOutput(args2...); err != nil { - v.vc.t.Fatalf("failed to create Reshard workflow: %v: %s", err, v.lastOutput) - } + v.vc.t.Logf("Executing command: vtctldclient %s", strings.Join(args2, " ")) + v.lastOutput, err = vc.VtctldClient.ExecuteCommandWithOutput(args2...) + require.NoError(v.vc.t, err, "failed Reshard action, error: %v: output: %s", err, v.lastOutput) } func (v VtctldReshard) Create() { @@ -448,14 +502,36 @@ func (v VtctldReshard) Show() { v.exec("Show") } +func (v *VtctldReshard) Status() { + v.exec("Status") +} + func (v VtctldReshard) SwitchReads() { - // TODO implement me - panic("implement me") + args := []string{"SwitchTraffic"} + args = append(args, v.switchFlags...) + args = append(args, "--tablet-types=rdonly,replica") + v.exec(args...) } func (v VtctldReshard) SwitchWrites() { - // TODO implement me - panic("implement me") + args := []string{"SwitchTraffic"} + args = append(args, v.switchFlags...) + args = append(args, "--tablet-types=primary") + v.exec(args...) +} + +func (v VtctldReshard) ReverseReads() { + args := []string{"ReverseTraffic"} + args = append(args, v.switchFlags...) + args = append(args, "--tablet-types=rdonly,replica") + v.exec(args...) +} + +func (v VtctldReshard) ReverseWrites() { + args := []string{"ReverseTraffic"} + args = append(args, v.switchFlags...) + args = append(args, "--tablet-types=primary") + v.exec(args...) } func (v VtctldReshard) Cancel() { diff --git a/go/test/endtoend/vtcombo/recreate/recreate_test.go b/go/test/endtoend/vtcombo/recreate/recreate_test.go index e66edb7688a..15cb63c3d7d 100644 --- a/go/test/endtoend/vtcombo/recreate/recreate_test.go +++ b/go/test/endtoend/vtcombo/recreate/recreate_test.go @@ -22,6 +22,7 @@ import ( "fmt" "os" "os/exec" + "strconv" "strings" "testing" @@ -101,6 +102,9 @@ func TestDropAndRecreateWithSameShards(t *testing.T) { cur := conn.Session(ks1+"@primary", nil) + mysqlConnCountBefore, err := getMySQLConnectionCount(ctx, cur) + require.Nil(t, err) + _, err = cur.Execute(ctx, "DROP DATABASE "+ks1, nil) require.Nil(t, err) @@ -108,6 +112,23 @@ func TestDropAndRecreateWithSameShards(t *testing.T) { require.Nil(t, err) assertTabletsPresent(t) + + // Check the connection count after the CREATE. There will be zero connections after the DROP as the database + // no longer exists, but after it gets recreated any open pools will be able to reestablish connections. + mysqlConnCountAfter, err := getMySQLConnectionCount(ctx, cur) + require.Nil(t, err) + + // Assert that we're not leaking mysql connections, but allow for some wiggle room due to transient connections + assert.InDelta(t, mysqlConnCountBefore, mysqlConnCountAfter, 5, + "not within allowable delta: mysqlConnCountBefore=%d, mysqlConnCountAfter=%d", mysqlConnCountBefore, mysqlConnCountAfter) +} + +func getMySQLConnectionCount(ctx context.Context, session *vtgateconn.VTGateSession) (int, error) { + result, err := session.Execute(ctx, "select variable_value from performance_schema.global_status where variable_name='threads_connected'", nil) + if err != nil { + return 0, err + } + return strconv.Atoi(result.Rows[0][0].ToString()) } func assertTabletsPresent(t *testing.T) { diff --git a/go/test/endtoend/vtgate/gen4/system_schema_test.go b/go/test/endtoend/vtgate/gen4/system_schema_test.go index fba953d51ae..fc4983935e9 100644 --- a/go/test/endtoend/vtgate/gen4/system_schema_test.go +++ b/go/test/endtoend/vtgate/gen4/system_schema_test.go @@ -213,7 +213,7 @@ func TestMultipleSchemaPredicates(t *testing.T) { "where t.table_schema = '%s' and c.table_schema = '%s' and c.table_schema = '%s'", shardedKs, shardedKs, "a") _, err = conn.ExecuteFetch(query, 1000, true) require.Error(t, err) - require.Contains(t, err.Error(), "specifying two different database in the query is not supported") + require.ErrorContains(t, err, "specifying two different database in the query is not supported") } func TestQuerySystemTables(t *testing.T) { diff --git a/go/test/endtoend/vtgate/grpc_api/acl_test.go b/go/test/endtoend/vtgate/grpc_api/acl_test.go index 2819a3e41d1..d0ac003169d 100644 --- a/go/test/endtoend/vtgate/grpc_api/acl_test.go +++ b/go/test/endtoend/vtgate/grpc_api/acl_test.go @@ -57,8 +57,8 @@ func TestEffectiveCallerIDWithNoAccess(t *testing.T) { ctx = callerid.NewContext(ctx, callerid.NewEffectiveCallerID("user_no_access", "", ""), nil) _, err = session.Execute(ctx, query, nil) require.Error(t, err) - assert.Contains(t, err.Error(), "Select command denied to user") - assert.Contains(t, err.Error(), "for table 'test_table' (ACL check error)") + assert.ErrorContains(t, err, "Select command denied to user") + assert.ErrorContains(t, err, "for table 'test_table' (ACL check error)") } // TestAuthenticatedUserWithAccess verifies that an authenticated gRPC static user with ACL access can execute queries @@ -89,8 +89,8 @@ func TestAuthenticatedUserNoAccess(t *testing.T) { query := "SELECT id FROM test_table" _, err = session.Execute(ctx, query, nil) require.Error(t, err) - assert.Contains(t, err.Error(), "Select command denied to user") - assert.Contains(t, err.Error(), "for table 'test_table' (ACL check error)") + assert.ErrorContains(t, err, "Select command denied to user") + assert.ErrorContains(t, err, "for table 'test_table' (ACL check error)") } // TestUnauthenticatedUser verifies that an unauthenticated gRPC user cannot execute queries @@ -106,5 +106,5 @@ func TestUnauthenticatedUser(t *testing.T) { query := "SELECT id FROM test_table" _, err = session.Execute(ctx, query, nil) require.Error(t, err) - assert.Contains(t, err.Error(), "invalid credentials") + assert.ErrorContains(t, err, "invalid credentials") } diff --git a/go/test/endtoend/vtgate/lookup_test.go b/go/test/endtoend/vtgate/lookup_test.go index b4b53295d8d..82cd63e5401 100644 --- a/go/test/endtoend/vtgate/lookup_test.go +++ b/go/test/endtoend/vtgate/lookup_test.go @@ -131,7 +131,7 @@ func TestConsistentLookup(t *testing.T) { mysqlErr := err.(*sqlerror.SQLError) assert.Equal(t, sqlerror.ERDupEntry, mysqlErr.Num) assert.Equal(t, "23000", mysqlErr.State) - assert.Contains(t, mysqlErr.Message, "reverted partial DML execution") + assert.ErrorContains(t, mysqlErr, "reverted partial DML execution") // Simple delete. utils.Exec(t, conn, "begin") @@ -552,6 +552,22 @@ func TestConsistentLookupUpdate(t *testing.T) { require.Empty(t, qr.Rows) } +func TestSelectMultiEqualLookup(t *testing.T) { + conn, closer := start(t) + defer closer() + + utils.Exec(t, conn, "insert into t10 (id, sharding_key, col1) values (1, 1, 'bar'), (2, 1, 'bar'), (3, 1, 'bar'), (4, 2, 'bar'), (5, 2, 'bar')") + + for _, workload := range []string{"oltp", "olap"} { + t.Run(workload, func(t *testing.T) { + utils.Exec(t, conn, "set workload = "+workload) + + utils.AssertMatches(t, conn, "select id from t10 WHERE (col1, id) IN (('bar', 1), ('baz', 2), ('qux', 3), ('barbar', 4))", "[[INT64(1)]]") + utils.AssertMatches(t, conn, "select id from t10 WHERE (col1 = 'bar' AND id = 1) OR (col1 = 'baz' AND id = 2) OR (col1 = 'qux' AND id = 3) OR (col1 = 'barbar' AND id = 4)", "[[INT64(1)]]") + }) + } +} + func TestSelectNullLookup(t *testing.T) { conn, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/misc_test.go b/go/test/endtoend/vtgate/misc_test.go index 128d930718c..f3804a2a45f 100644 --- a/go/test/endtoend/vtgate/misc_test.go +++ b/go/test/endtoend/vtgate/misc_test.go @@ -95,10 +95,13 @@ func TestShowTables(t *testing.T) { conn, closer := start(t) defer closer() - query := "show tables;" - qr := utils.Exec(t, conn, query) - + qr := utils.Exec(t, conn, "show tables") assert.Equal(t, "Tables_in_ks", qr.Fields[0].Name) + + // no error on executing `show tables` on system schema + utils.Exec(t, conn, `use mysql`) + utils.Exec(t, conn, "show tables") + utils.Exec(t, conn, "show tables from information_schema") } func TestCastConvert(t *testing.T) { @@ -753,7 +756,7 @@ func TestDescribeVindex(t *testing.T) { mysqlErr := err.(*sqlerror.SQLError) assert.Equal(t, sqlerror.ERNoSuchTable, mysqlErr.Num) assert.Equal(t, "42S02", mysqlErr.State) - assert.Contains(t, mysqlErr.Message, "NotFound desc") + assert.ErrorContains(t, mysqlErr, "NotFound desc") } func TestEmptyQuery(t *testing.T) { @@ -795,6 +798,24 @@ func TestRowCountExceed(t *testing.T) { utils.AssertContainsError(t, conn, "select id1 from t1 where id1 < 1000", `Row count exceeded 100`) } +func TestDDLTargeted(t *testing.T) { + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + defer conn.Close() + + utils.Exec(t, conn, "use `ks/-80`") + utils.Exec(t, conn, `begin`) + utils.Exec(t, conn, `create table ddl_targeted (id bigint primary key)`) + // implicit commit on ddl would have closed the open transaction + // so this execution should happen as autocommit. + utils.Exec(t, conn, `insert into ddl_targeted (id) values (1)`) + // this will have not impact and the row would have inserted. + utils.Exec(t, conn, `rollback`) + // validating the row + utils.AssertMatches(t, conn, `select id from ddl_targeted`, `[[INT64(1)]]`) +} + func TestLookupErrorMetric(t *testing.T) { conn, closer := start(t) defer closer() @@ -823,8 +844,8 @@ func getVtgateApiErrorCounts(t *testing.T) float64 { } func getVar(t *testing.T, key string) interface{} { - vars, err := clusterInstance.VtgateProcess.GetVars() - require.NoError(t, err) + vars := clusterInstance.VtgateProcess.GetVars() + require.NotNil(t, vars) val, exists := vars[key] if !exists { diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index 9a6ad90cc5b..d206f58e17c 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -71,7 +71,6 @@ func start(t *testing.T) (utils.MySQLCompare, func()) { } func TestAggrWithLimit(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 21, "vtgate") mcmp, closer := start(t) defer closer() @@ -101,11 +100,9 @@ func TestAggregateTypes(t *testing.T) { mcmp.AssertMatches("select val1 as a, count(*) from aggr_test group by a order by 2, a", `[[VARCHAR("b") INT64(1)] [VARCHAR("d") INT64(1)] [VARCHAR("a") INT64(2)] [VARCHAR("c") INT64(2)] [VARCHAR("e") INT64(2)]]`) mcmp.AssertMatches("select sum(val1) from aggr_test", `[[FLOAT64(0)]]`) mcmp.Run("Average for sharded keyspaces", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(19, "vtgate") mcmp.AssertMatches("select avg(val1) from aggr_test", `[[FLOAT64(0)]]`) }) mcmp.Run("Average with group by without selecting the grouped columns", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(20, "vtgate") mcmp.AssertMatches("select avg(val2) from aggr_test group by val1 order by val1", `[[DECIMAL(1.0000)] [DECIMAL(1.0000)] [DECIMAL(3.5000)] [NULL] [DECIMAL(1.0000)]]`) }) } @@ -214,7 +211,6 @@ func TestAggrOnJoin(t *testing.T) { `[[VARCHAR("a")]]`) mcmp.Run("Average in join for sharded", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(19, "vtgate") mcmp.AssertMatches(`select avg(a1.val2), avg(a2.val2) from aggr_test a1 join aggr_test a2 on a1.val2 = a2.id join t3 t on a2.val2 = t.id7`, "[[DECIMAL(1.5000) DECIMAL(1.0000)]]") @@ -372,7 +368,6 @@ func TestAggOnTopOfLimit(t *testing.T) { mcmp.AssertMatches("select val1, count(*) from (select id, val1 from aggr_test where val2 < 4 order by val1 limit 2) as x group by val1", `[[NULL INT64(1)] [VARCHAR("a") INT64(1)]]`) mcmp.AssertMatchesNoOrder("select val1, count(val2) from (select val1, val2 from aggr_test limit 8) as x group by val1", `[[NULL INT64(1)] [VARCHAR("a") INT64(2)] [VARCHAR("b") INT64(1)] [VARCHAR("c") INT64(2)]]`) mcmp.Run("Average in sharded query", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(19, "vtgate") mcmp.AssertMatches("select avg(val2) from (select id, val2 from aggr_test where val2 is null limit 2) as x", "[[NULL]]") mcmp.AssertMatchesNoOrder("select val1, avg(val2) from (select val1, val2 from aggr_test limit 8) as x group by val1", `[[NULL DECIMAL(2.0000)] [VARCHAR("a") DECIMAL(3.5000)] [VARCHAR("b") DECIMAL(1.0000)] [VARCHAR("c") DECIMAL(3.5000)]]`) }) @@ -384,7 +379,6 @@ func TestAggOnTopOfLimit(t *testing.T) { mcmp.AssertMatches("select count(val2), sum(val2) from (select id, val2 from aggr_test where val2 is null limit 2) as x", "[[INT64(0) NULL]]") mcmp.AssertMatches("select val1, count(*), sum(id) from (select id, val1 from aggr_test where val2 < 4 order by val1 limit 2) as x group by val1", `[[NULL INT64(1) DECIMAL(7)] [VARCHAR("a") INT64(1) DECIMAL(2)]]`) mcmp.Run("Average in sharded query", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(19, "vtgate") mcmp.AssertMatches("select count(*), sum(val1), avg(val1) from (select id, val1 from aggr_test where val2 < 4 order by val1 desc limit 2) as x", "[[INT64(2) FLOAT64(0) FLOAT64(0)]]") mcmp.AssertMatches("select count(val1), sum(id), avg(id) from (select id, val1 from aggr_test where val2 < 4 order by val1 desc limit 2) as x", "[[INT64(2) DECIMAL(7) DECIMAL(3.5000)]]") mcmp.AssertMatchesNoOrder("select val1, count(val2), sum(val2), avg(val2) from (select val1, val2 from aggr_test limit 8) as x group by val1", @@ -406,7 +400,6 @@ func TestEmptyTableAggr(t *testing.T) { mcmp.AssertMatches(" select t1.`name`, count(*) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo' group by t1.`name`", "[]") mcmp.AssertMatches(" select t1.`name`, count(*) from t1 inner join t2 on (t1.t1_id = t2.id) where t1.value = 'foo' group by t1.`name`", "[]") mcmp.Run("Average in sharded query", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(19, "vtgate") mcmp.AssertMatches(" select count(t1.value) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[INT64(0)]]") mcmp.AssertMatches(" select avg(t1.value) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[NULL]]") }) @@ -422,7 +415,6 @@ func TestEmptyTableAggr(t *testing.T) { mcmp.AssertMatches(" select count(*) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[INT64(0)]]") mcmp.AssertMatches(" select t1.`name`, count(*) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo' group by t1.`name`", "[]") mcmp.Run("Average in sharded query", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(19, "vtgate") mcmp.AssertMatches(" select count(t1.value) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[INT64(0)]]") mcmp.AssertMatches(" select avg(t1.value) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[NULL]]") mcmp.AssertMatches(" select t1.`name`, count(*) from t1 inner join t2 on (t1.t1_id = t2.id) where t1.value = 'foo' group by t1.`name`", "[]") @@ -471,7 +463,6 @@ func TestAggregateLeftJoin(t *testing.T) { mcmp.AssertMatches("SELECT count(*) FROM t2 LEFT JOIN t1 ON t1.t1_id = t2.id WHERE IFNULL(t1.name, 'NOTSET') = 'r'", `[[INT64(1)]]`) mcmp.Run("Average in sharded query", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(19, "vtgate") mcmp.AssertMatches("SELECT avg(t1.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[DECIMAL(0.5000)]]`) mcmp.AssertMatches("SELECT avg(t2.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[DECIMAL(1.0000)]]`) aggregations := []string{ @@ -528,7 +519,6 @@ func TestScalarAggregate(t *testing.T) { mcmp.Exec("insert into aggr_test(id, val1, val2) values(1,'a',1), (2,'A',1), (3,'b',1), (4,'c',3), (5,'c',4)") mcmp.AssertMatches("select count(distinct val1) from aggr_test", `[[INT64(3)]]`) mcmp.Run("Average in sharded query", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(19, "vtgate") mcmp.AssertMatches("select avg(val1) from aggr_test", `[[FLOAT64(0)]]`) }) } @@ -588,15 +578,11 @@ func TestComplexAggregation(t *testing.T) { mcmp.Exec(`SELECT name+COUNT(t1_id)+1 FROM t1 GROUP BY name`) mcmp.Exec(`SELECT COUNT(*)+shardkey+MIN(t1_id)+1+MAX(t1_id)*SUM(t1_id)+1+name FROM t1 GROUP BY shardkey, name`) mcmp.Run("Average in sharded query", func(mcmp *utils.MySQLCompare) { - mcmp.SkipIfBinaryIsBelowVersion(19, "vtgate") mcmp.Exec(`SELECT COUNT(t1_id)+MAX(shardkey)+AVG(t1_id) FROM t1`) }) } func TestJoinAggregation(t *testing.T) { - // This is new functionality in Vitess 20 - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -793,7 +779,6 @@ func TestHavingQueries(t *testing.T) { // TestJsonAggregation tests that json aggregation works for single sharded queries. func TestJsonAggregation(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 21, "vtgate") mcmp, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/queries/benchmark/benchmark_test.go b/go/test/endtoend/vtgate/queries/benchmark/benchmark_test.go index b76ae5a35c7..5e3be7c7eff 100644 --- a/go/test/endtoend/vtgate/queries/benchmark/benchmark_test.go +++ b/go/test/endtoend/vtgate/queries/benchmark/benchmark_test.go @@ -18,12 +18,20 @@ package dml import ( "fmt" + "maps" "math/rand/v2" "strconv" "strings" + "sync" "testing" + "time" + + "github.com/stretchr/testify/require" + mapsx "golang.org/x/exp/maps" + "google.golang.org/protobuf/encoding/protojson" "vitess.io/vitess/go/test/endtoend/utils" + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) type testQuery struct { @@ -127,7 +135,7 @@ func BenchmarkShardedTblNoLookup(b *testing.B) { } for _, rows := range []int{1, 10, 100, 500, 1000, 5000, 10000} { insStmt := tq.getInsertQuery(rows) - b.Run(fmt.Sprintf("16-shards-%d-rows", rows), func(b *testing.B) { + b.Run(fmt.Sprintf("4-shards-%d-rows", rows), func(b *testing.B) { for i := 0; i < b.N; i++ { _ = utils.Exec(b, conn, insStmt) } @@ -150,7 +158,7 @@ func BenchmarkShardedTblUpdateIn(b *testing.B) { _ = utils.Exec(b, conn, insStmt) for _, rows := range []int{1, 10, 100, 500, 1000, 5000, 10000} { updStmt := tq.getUpdateQuery(rows) - b.Run(fmt.Sprintf("16-shards-%d-rows", rows), func(b *testing.B) { + b.Run(fmt.Sprintf("4-shards-%d-rows", rows), func(b *testing.B) { for i := 0; i < b.N; i++ { _ = utils.Exec(b, conn, updStmt) } @@ -168,7 +176,7 @@ func BenchmarkShardedTblDeleteIn(b *testing.B) { insStmt := tq.getInsertQuery(rows) _ = utils.Exec(b, conn, insStmt) delStmt := tq.getDeleteQuery(rows) - b.Run(fmt.Sprintf("16-shards-%d-rows", rows), func(b *testing.B) { + b.Run(fmt.Sprintf("4-shards-%d-rows", rows), func(b *testing.B) { for i := 0; i < b.N; i++ { _ = utils.Exec(b, conn, delStmt) } @@ -197,3 +205,175 @@ func BenchmarkShardedAggrPushDown(b *testing.B) { } } } + +var mirrorInitOnce sync.Once + +func BenchmarkMirror(b *testing.B) { + const numRows = 10000 + + conn, closer := start(b) + defer closer() + + // Each time this BenchmarkMirror runs, use a different source of + // randomness. But use the same source of randomness across test cases and + // mirror percentages sub test cases. + pcg := rand.NewPCG(rand.Uint64(), rand.Uint64()) + + ksTables := map[string]string{ + sKs2: "mirror_tbl1", + sKs3: "mirror_tbl2", + } + targetKeyspaces := mapsx.Keys(ksTables) + + mirrorInitOnce.Do(func() { + b.Logf("seeding database for benchmark...") + + for i := 0; i < numRows; i++ { + _, err := conn.ExecuteFetch( + fmt.Sprintf("INSERT INTO %s.mirror_tbl1(id) VALUES(%d)", sKs1, i), -1, false) + require.NoError(b, err) + + _, err = conn.ExecuteFetch( + fmt.Sprintf("INSERT INTO %s.mirror_tbl2(id) VALUES(%d)", sKs1, i), -1, false) + require.NoError(b, err) + } + + _, err := conn.ExecuteFetch( + fmt.Sprintf("SELECT COUNT(id) FROM %s.%s", sKs1, "mirror_tbl1"), 1, false) + require.NoError(b, err) + + b.Logf("finished (inserted %d rows)", numRows) + + b.Logf("using MoveTables to copy data from source keyspace to target keyspaces") + + // Set up MoveTables workflows, which is (at present) the only way to set up + // mirror rules. + for tks, tbl := range ksTables { + output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput( + "MoveTables", "--target-keyspace", tks, "--workflow", fmt.Sprintf("%s2%s", sKs1, tks), + "create", "--source-keyspace", sKs1, "--tables", tbl) + require.NoError(b, err, output) + } + + // Wait for tables to be copied from source to targets. + pending := make(map[string]string, len(ksTables)) + maps.Copy(pending, ksTables) + for len(pending) > 0 { + for tks := range ksTables { + output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput( + "Workflow", "--keyspace", tks, "show", "--workflow", fmt.Sprintf("%s2%s", sKs1, tks)) + require.NoError(b, err, output) + + var response vtctldatapb.GetWorkflowsResponse + require.NoError(b, protojson.Unmarshal([]byte(output), &response)) + + require.Len(b, response.Workflows, 1) + workflow := response.Workflows[0] + + require.Len(b, workflow.ShardStreams, 4 /*shards*/) + for _, ss := range workflow.ShardStreams { + for _, s := range ss.Streams { + if s.State == "Running" { + delete(pending, tks) + } else { + b.Logf("waiting for workflow %s.%s stream %s=>%s to be running; last state: %s", + workflow.Target, workflow.Name, s.BinlogSource.Shard, s.Shard, s.State) + time.Sleep(1 * time.Second) + } + } + } + } + } + }) + + testCases := []struct { + name string + run func(*testing.B, *rand.Rand) + }{ + { + name: "point select, { sks1 => sks2 }.mirror_tbl1", + run: func(b *testing.B, rnd *rand.Rand) { + for i := 0; i < b.N; i++ { + id := rnd.Int32N(numRows) + _, err := conn.ExecuteFetch(fmt.Sprintf( + "SELECT t1.id FROM %s.mirror_tbl1 AS t1 WHERE t1.id = %d", + sKs1, id, + ), 1, false) + if err != nil { + b.Error(err) + } + } + }, + }, + { + name: "point select, { sks1 => sks2 }.mirror_tbl1, { sks1 => sks3 }.mirror_tbl2", + run: func(b *testing.B, rnd *rand.Rand) { + for i := 0; i < b.N; i++ { + id := rnd.Int32N(numRows) + _, err := conn.ExecuteFetch(fmt.Sprintf( + "SELECT t1.id, t2.id FROM %s.mirror_tbl1 AS t1, %s.mirror_tbl2 AS t2 WHERE t1.id = %d AND t2.id = %d", + sKs1, sKs1, id, id, + ), 1, false) + if err != nil { + b.Error(err) + } + } + }, + }, + } + + for _, tc := range testCases { + b.Run(tc.name, func(b *testing.B) { + b.Run("mirror 0%", func(b *testing.B) { + mirrorTraffic(b, targetKeyspaces, 0) + b.ResetTimer() + tc.run(b, rand.New(pcg)) + }) + + b.Run("mirror 1%", func(b *testing.B) { + mirrorTraffic(b, targetKeyspaces, 1) + b.ResetTimer() + tc.run(b, rand.New(pcg)) + }) + + b.Run("mirror 5%", func(b *testing.B) { + mirrorTraffic(b, targetKeyspaces, 5) + b.ResetTimer() + tc.run(b, rand.New(pcg)) + }) + + b.Run("mirror 10%", func(b *testing.B) { + mirrorTraffic(b, targetKeyspaces, 10) + b.ResetTimer() + tc.run(b, rand.New(pcg)) + }) + + b.Run("mirror 25%", func(b *testing.B) { + mirrorTraffic(b, targetKeyspaces, 25) + b.ResetTimer() + tc.run(b, rand.New(pcg)) + }) + + b.Run("mirror 50%", func(b *testing.B) { + mirrorTraffic(b, targetKeyspaces, 50) + b.ResetTimer() + tc.run(b, rand.New(pcg)) + }) + + b.Run("mirror 100%", func(b *testing.B) { + mirrorTraffic(b, targetKeyspaces, 100) + b.ResetTimer() + tc.run(b, rand.New(pcg)) + }) + }) + } +} + +func mirrorTraffic(b *testing.B, targetKeyspaces []string, percent float32) { + for _, tks := range targetKeyspaces { + output, err := clusterInstance.VtctldClientProcess.ExecuteCommandWithOutput( + "MoveTables", "--target-keyspace", tks, "--workflow", fmt.Sprintf("%s2%s", sKs1, tks), + "mirrortraffic", "--percent", fmt.Sprintf("%.02f", percent)) + require.NoError(b, err, output) + } +} diff --git a/go/test/endtoend/vtgate/queries/benchmark/main_test.go b/go/test/endtoend/vtgate/queries/benchmark/main_test.go index 6978d0b9428..40a215c8007 100644 --- a/go/test/endtoend/vtgate/queries/benchmark/main_test.go +++ b/go/test/endtoend/vtgate/queries/benchmark/main_test.go @@ -20,8 +20,10 @@ import ( "context" _ "embed" "flag" + "fmt" "os" "testing" + "time" "github.com/stretchr/testify/require" @@ -34,36 +36,34 @@ var ( clusterInstance *cluster.LocalProcessCluster vtParams mysql.ConnParams mysqlParams mysql.ConnParams - sKs = "sks" - uKs = "uks" + sKs1 = "sks1" + sKs2 = "sks2" + sKs3 = "sks3" cell = "test" - //go:embed sharded_schema.sql - sSchemaSQL string + //go:embed sharded_schema1.sql + sSchemaSQL1 string - //go:embed vschema.json - sVSchema string -) + //go:embed vschema1.json + sVSchema1 string -var ( - shards4 = []string{ - "-40", "40-80", "80-c0", "c0-", - } + //go:embed sharded_schema2.sql + sSchemaSQL2 string - shards8 = []string{ - "-20", "20-40", "40-60", "60-80", "80-a0", "a0-c0", "c0-e0", "e0-", - } + //go:embed vschema2.json + sVSchema2 string - shards16 = []string{ - "-10", "10-20", "20-30", "30-40", "40-50", "50-60", "60-70", "70-80", "80-90", "90-a0", "a0-b0", "b0-c0", "c0-d0", "d0-e0", "e0-f0", "f0-", - } + //go:embed sharded_schema3.sql + sSchemaSQL3 string - shards32 = []string{ - "-05", "05-10", "10-15", "15-20", "20-25", "25-30", "30-35", "35-40", "40-45", "45-50", "50-55", "55-60", "60-65", "65-70", "70-75", "75-80", - "80-85", "85-90", "90-95", "95-a0", "a0-a5", "a5-b0", "b0-b5", "b5-c0", "c0-c5", "c5-d0", "d0-d5", "d5-e0", "e0-e5", "e5-f0", "f0-f5", "f5-", - } + //go:embed vschema3.json + sVSchema3 string ) +var shards4 = []string{ + "-40", "40-80", "80-c0", "c0-", +} + func TestMain(m *testing.M) { defer cluster.PanicHandler(nil) flag.Parse() @@ -78,14 +78,38 @@ func TestMain(m *testing.M) { return 1 } - // Start sharded keyspace - sKeyspace := &cluster.Keyspace{ - Name: sKs, - SchemaSQL: sSchemaSQL, - VSchema: sVSchema, + // Start sharded keyspace 1 + sKeyspace1 := &cluster.Keyspace{ + Name: sKs1, + SchemaSQL: sSchemaSQL1, + VSchema: sVSchema1, } - err = clusterInstance.StartKeyspace(*sKeyspace, shards4, 0, false) + err = clusterInstance.StartKeyspace(*sKeyspace1, shards4, 0, false) + if err != nil { + return 1 + } + + // Start sharded keyspace 2 + sKeyspace2 := &cluster.Keyspace{ + Name: sKs2, + SchemaSQL: sSchemaSQL2, + VSchema: sVSchema2, + } + + err = clusterInstance.StartKeyspace(*sKeyspace2, shards4, 0, false) + if err != nil { + return 1 + } + + // Start sharded keyspace 3 + sKeyspace3 := &cluster.Keyspace{ + Name: sKs3, + SchemaSQL: sSchemaSQL3, + VSchema: sVSchema3, + } + + err = clusterInstance.StartKeyspace(*sKeyspace3, shards4, 0, false) if err != nil { return 1 } @@ -96,7 +120,7 @@ func TestMain(m *testing.M) { return 1 } - vtParams = clusterInstance.GetVTParams(sKs) + vtParams = clusterInstance.GetVTParams("@primary") return m.Run() }() @@ -108,12 +132,38 @@ func start(b *testing.B) (*mysql.Conn, func()) { require.NoError(b, err) deleteAll := func() { - tables := []string{"tbl_no_lkp_vdx"} + tables := []string{ + fmt.Sprintf("%s.tbl_no_lkp_vdx", sKs1), + fmt.Sprintf("%s.mirror_tbl1", sKs1), + fmt.Sprintf("%s.mirror_tbl2", sKs1), + fmt.Sprintf("%s.mirror_tbl1", sKs2), + fmt.Sprintf("%s.mirror_tbl2", sKs3), + } for _, table := range tables { _, _ = utils.ExecAllowError(b, conn, "delete from "+table) } } + // Make sure all keyspaces are serving. + pending := map[string]string{ + sKs1: "mirror_tbl1", + sKs2: "mirror_tbl1", + sKs3: "mirror_tbl2", + } + for len(pending) > 0 { + for ks, tbl := range pending { + _, err := conn.ExecuteFetch( + fmt.Sprintf("SELECT COUNT(id) FROM %s.%s", ks, tbl), 1, false) + if err != nil { + b.Logf("waiting for keyspace %s to be serving; last error: %v", ks, err) + time.Sleep(1 * time.Second) + } else { + delete(pending, ks) + } + } + } + + // Delete any pre-existing data. deleteAll() return conn, func() { diff --git a/go/test/endtoend/vtgate/queries/benchmark/sharded_schema.sql b/go/test/endtoend/vtgate/queries/benchmark/sharded_schema1.sql similarity index 76% rename from go/test/endtoend/vtgate/queries/benchmark/sharded_schema.sql rename to go/test/endtoend/vtgate/queries/benchmark/sharded_schema1.sql index 92f63c40f0f..d83ffefa7ec 100644 --- a/go/test/endtoend/vtgate/queries/benchmark/sharded_schema.sql +++ b/go/test/endtoend/vtgate/queries/benchmark/sharded_schema1.sql @@ -30,4 +30,16 @@ create table user_extra not_sharding_key bigint, col varchar(50), primary key (id) -); \ No newline at end of file +); + +create table mirror_tbl1 +( + id bigint not null, + primary key(id) +) Engine = InnoDB; + +create table mirror_tbl2 +( + id bigint not null, + primary key(id) +) Engine = InnoDB; diff --git a/go/test/endtoend/vtgate/queries/benchmark/sharded_schema2.sql b/go/test/endtoend/vtgate/queries/benchmark/sharded_schema2.sql new file mode 100644 index 00000000000..4cba88b68ab --- /dev/null +++ b/go/test/endtoend/vtgate/queries/benchmark/sharded_schema2.sql @@ -0,0 +1,5 @@ +create table mirror_tbl1 +( + id bigint not null, + primary key(id) +) Engine = InnoDB; diff --git a/go/test/endtoend/vtgate/queries/benchmark/sharded_schema3.sql b/go/test/endtoend/vtgate/queries/benchmark/sharded_schema3.sql new file mode 100644 index 00000000000..e7e96f30357 --- /dev/null +++ b/go/test/endtoend/vtgate/queries/benchmark/sharded_schema3.sql @@ -0,0 +1,5 @@ +create table mirror_tbl2 +( + id bigint not null, + primary key(id) +) Engine = InnoDB; diff --git a/go/test/endtoend/vtgate/queries/benchmark/vschema1.json b/go/test/endtoend/vtgate/queries/benchmark/vschema1.json new file mode 100644 index 00000000000..0e5366ba89f --- /dev/null +++ b/go/test/endtoend/vtgate/queries/benchmark/vschema1.json @@ -0,0 +1,50 @@ +{ + "sharded": true, + "vindexes": { + "xxhash": { + "type": "xxhash" + } + }, + "tables": { + "tbl_no_lkp_vdx": { + "column_vindexes": [ + { + "column": "id", + "name": "xxhash" + } + ] + }, + "user": { + "column_vindexes": [ + { + "column": "id", + "name": "xxhash" + } + ] + }, + "user_extra": { + "column_vindexes": [ + { + "column": "id", + "name": "xxhash" + } + ] + }, + "mirror_tbl1": { + "column_vindexes": [ + { + "column": "id", + "name": "xxhash" + } + ] + }, + "mirror_tbl2": { + "column_vindexes": [ + { + "column": "id", + "name": "xxhash" + } + ] + } + } +} diff --git a/go/test/endtoend/vtgate/queries/benchmark/vschema2.json b/go/test/endtoend/vtgate/queries/benchmark/vschema2.json new file mode 100644 index 00000000000..2ae87ad2ae4 --- /dev/null +++ b/go/test/endtoend/vtgate/queries/benchmark/vschema2.json @@ -0,0 +1,18 @@ +{ + "sharded": true, + "vindexes": { + "xxhash": { + "type": "xxhash" + } + }, + "tables": { + "mirror_tbl1": { + "column_vindexes": [ + { + "column": "id", + "name": "xxhash" + } + ] + } + } +} diff --git a/go/test/endtoend/vtgate/queries/benchmark/vschema3.json b/go/test/endtoend/vtgate/queries/benchmark/vschema3.json new file mode 100644 index 00000000000..6e71d6bc157 --- /dev/null +++ b/go/test/endtoend/vtgate/queries/benchmark/vschema3.json @@ -0,0 +1,18 @@ +{ + "sharded": true, + "vindexes": { + "xxhash": { + "type": "xxhash" + } + }, + "tables": { + "mirror_tbl2": { + "column_vindexes": [ + { + "column": "id", + "name": "xxhash" + } + ] + } + } +} diff --git a/go/test/endtoend/vtgate/queries/derived/cte_test.go b/go/test/endtoend/vtgate/queries/derived/cte_test.go index 54d97261ae6..131342a8562 100644 --- a/go/test/endtoend/vtgate/queries/derived/cte_test.go +++ b/go/test/endtoend/vtgate/queries/derived/cte_test.go @@ -18,12 +18,9 @@ package misc import ( "testing" - - "vitess.io/vitess/go/test/endtoend/utils" ) func TestCTEWithOrderByLimit(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") mcmp, closer := start(t) defer closer() @@ -31,7 +28,6 @@ func TestCTEWithOrderByLimit(t *testing.T) { } func TestCTEAggregationOnRHS(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") mcmp, closer := start(t) defer closer() @@ -40,7 +36,6 @@ func TestCTEAggregationOnRHS(t *testing.T) { } func TestCTERemoveInnerOrderBy(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") mcmp, closer := start(t) defer closer() @@ -48,7 +43,6 @@ func TestCTERemoveInnerOrderBy(t *testing.T) { } func TestCTEWithHaving(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") mcmp, closer := start(t) defer closer() @@ -59,7 +53,6 @@ func TestCTEWithHaving(t *testing.T) { } func TestCTEColumns(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") mcmp, closer := start(t) defer closer() @@ -68,7 +61,6 @@ func TestCTEColumns(t *testing.T) { } func TestCTEAggregationsInUnion(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") mcmp, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/queries/derived/derived_test.go b/go/test/endtoend/vtgate/queries/derived/derived_test.go index c41161d9bcf..cb106564b2f 100644 --- a/go/test/endtoend/vtgate/queries/derived/derived_test.go +++ b/go/test/endtoend/vtgate/queries/derived/derived_test.go @@ -92,7 +92,6 @@ func TestDerivedTableColumns(t *testing.T) { // We do this by not using the apply join we usually use, and instead use the hash join engine primitive // These tests exercise these situations func TestDerivedTablesWithLimit(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") // We need full type info before planning this, so we wait for the schema tracker require.NoError(t, utils.WaitForAuthoritative(t, keyspaceName, "user", clusterInstance.VtgateProcess.ReadVSchema)) @@ -116,7 +115,6 @@ func TestDerivedTablesWithLimit(t *testing.T) { // TestDerivedTableColumnAliasWithJoin tests the derived table having alias column and using it in the join condition func TestDerivedTableColumnAliasWithJoin(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") mcmp, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/queries/dml/dml_test.go b/go/test/endtoend/vtgate/queries/dml/dml_test.go index 4383f59e6c4..061cc4b9b36 100644 --- a/go/test/endtoend/vtgate/queries/dml/dml_test.go +++ b/go/test/endtoend/vtgate/queries/dml/dml_test.go @@ -47,8 +47,6 @@ func TestMultiEqual(t *testing.T) { // TestMultiTableDelete executed multi-table delete queries func TestMultiTableDelete(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") - mcmp, closer := start(t) defer closer() @@ -78,8 +76,6 @@ func TestMultiTableDelete(t *testing.T) { // TestDeleteWithLimit executed delete queries with limit func TestDeleteWithLimit(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") - mcmp, closer := start(t) defer closer() @@ -133,8 +129,6 @@ func TestDeleteWithLimit(t *testing.T) { // TestUpdateWithLimit executed update queries with limit func TestUpdateWithLimit(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -191,8 +185,6 @@ func TestUpdateWithLimit(t *testing.T) { // TestMultiTableUpdate executed multi-table update queries func TestMultiTableUpdate(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -222,8 +214,6 @@ func TestMultiTableUpdate(t *testing.T) { // TestDeleteWithSubquery executed delete queries with subqueries func TestDeleteWithSubquery(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -268,8 +258,6 @@ func TestDeleteWithSubquery(t *testing.T) { // TestMultiTargetDelete executed multi-target delete queries func TestMultiTargetDelete(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -299,8 +287,6 @@ func TestMultiTargetDelete(t *testing.T) { // TestMultiTargetDeleteMore executed multi-target delete queries with additional cases func TestMultiTargetDeleteMore(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -337,8 +323,6 @@ func TestMultiTargetDeleteMore(t *testing.T) { // TestMultiTargetUpdate executed multi-target update queries func TestMultiTargetUpdate(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -368,8 +352,6 @@ func TestMultiTargetUpdate(t *testing.T) { // TestMultiTargetNonLiteralUpdate executed multi-target update queries with non-literal values. func TestMultiTargetNonLiteralUpdate(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -400,8 +382,6 @@ func TestMultiTargetNonLiteralUpdate(t *testing.T) { // TestDMLInUnique for update/delete statement using an IN clause with the Vindexes, // the query is correctly split according to the corresponding values in the IN list. func TestDMLInUnique(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/queries/dml/insert_test.go b/go/test/endtoend/vtgate/queries/dml/insert_test.go index 026f53fe961..b4d12de2573 100644 --- a/go/test/endtoend/vtgate/queries/dml/insert_test.go +++ b/go/test/endtoend/vtgate/queries/dml/insert_test.go @@ -21,9 +21,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/utils" ) @@ -56,8 +54,6 @@ func TestSimpleInsertSelect(t *testing.T) { // TestInsertOnDup test the insert on duplicate key update feature with argument and list argument. func TestInsertOnDup(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -92,19 +88,10 @@ func TestFailureInsertSelect(t *testing.T) { // primary key same mcmp.AssertContainsError("insert into s_tbl(id, num) select id, num*20 from s_tbl where id = 1", `AlreadyExists desc = Duplicate entry '1' for key`) // lookup key same (does not fail on MySQL as there is no lookup, and we have not put unique constraint on num column) - vtgateVersion, err := cluster.GetMajorVersion("vtgate") - require.NoError(t, err) - if vtgateVersion >= 19 { - utils.AssertContainsError(t, mcmp.VtConn, "insert into s_tbl(id, num) select id*20, num from s_tbl where id = 1", `(errno 1062) (sqlstate 23000)`) - // mismatch column count - mcmp.AssertContainsError("insert into s_tbl(id, num) select 100,200,300", `column count does not match value count with the row`) - mcmp.AssertContainsError("insert into s_tbl(id, num) select 100", `column count does not match value count with the row`) - } else { - utils.AssertContainsError(t, mcmp.VtConn, "insert into s_tbl(id, num) select id*20, num from s_tbl where id = 1", `lookup.Create: Code: ALREADY_EXISTS`) - // mismatch column count - mcmp.AssertContainsError("insert into s_tbl(id, num) select 100,200,300", `column count does not match value count at row 1`) - mcmp.AssertContainsError("insert into s_tbl(id, num) select 100", `column count does not match value count at row 1`) - } + utils.AssertContainsError(t, mcmp.VtConn, "insert into s_tbl(id, num) select id*20, num from s_tbl where id = 1", `(errno 1062) (sqlstate 23000)`) + // mismatch column count + mcmp.AssertContainsError("insert into s_tbl(id, num) select 100,200,300", `column count does not match value count with the row`) + mcmp.AssertContainsError("insert into s_tbl(id, num) select 100", `column count does not match value count with the row`) }) } } @@ -486,9 +473,6 @@ func TestMixedCases(t *testing.T) { // TestInsertAlias test the alias feature in insert statement. func TestInsertAlias(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - utils.SkipIfBinaryIsBelowVersion(t, 20, "vttablet") - mcmp, closer := start(t) defer closer() @@ -507,3 +491,28 @@ func TestInsertAlias(t *testing.T) { // this validates the record. mcmp.Exec("select id, region_id, name from user_tbl order by id") } + +// TestInsertJson tests that selected json values are encoded correctly. +func TestInsertJson(t *testing.T) { + utils.SkipIfBinaryIsBelowVersion(t, 21, "vttablet") + utils.SkipIfBinaryIsBelowVersion(t, 21, "vtgate") + mcmp, closer := start(t) + defer closer() + + mcmp.Exec(`insert into j_tbl(id, jdoc) values (1, '{}'), (2, '{"a": 1, "b": 2}')`) + mcmp.Exec(`select * from j_tbl order by id`) + + mcmp.Exec(`insert into j_tbl(id, jdoc) select 3, json_object("k", "a")`) + mcmp.Exec(`select * from j_tbl order by id`) + + mcmp.Exec(`insert into j_tbl(id, jdoc) select 4,JSON_OBJECT( + 'date', CAST(1629849600 AS UNSIGNED), + 'keywordSourceId', CAST(930701976723823 AS UNSIGNED), + 'keywordSourceVersionId', CAST(210825230433 AS UNSIGNED) + )`) + mcmp.Exec(`select * from j_tbl order by id`) + + utils.Exec(t, mcmp.VtConn, `insert into uks.j_utbl(id, jdoc) select * from sks.j_tbl`) + utils.AssertMatches(t, mcmp.VtConn, `select * from uks.j_utbl order by id`, + `[[INT64(1) JSON("{}")] [INT64(2) JSON("{\"a\": 1, \"b\": 2}")] [INT64(3) JSON("{\"k\": \"a\"}")] [INT64(4) JSON("{\"date\": 1629849600, \"keywordSourceId\": 930701976723823, \"keywordSourceVersionId\": 210825230433}")]]`) +} diff --git a/go/test/endtoend/vtgate/queries/dml/main_test.go b/go/test/endtoend/vtgate/queries/dml/main_test.go index c00e27fe3a0..0c4d58aa614 100644 --- a/go/test/endtoend/vtgate/queries/dml/main_test.go +++ b/go/test/endtoend/vtgate/queries/dml/main_test.go @@ -133,7 +133,7 @@ func start(t *testing.T) (utils.MySQLCompare, func()) { tables := []string{ "s_tbl", "num_vdx_tbl", "user_tbl", "order_tbl", "oevent_tbl", "oextra_tbl", - "auto_tbl", "oid_vdx_tbl", "unq_idx", "nonunq_idx", "u_tbl", "mixed_tbl", "lkp_map_idx", + "auto_tbl", "oid_vdx_tbl", "unq_idx", "nonunq_idx", "u_tbl", "mixed_tbl", "lkp_map_idx", "j_tbl", "j_utbl", } for _, table := range tables { // TODO (@frouioui): following assertions produce different results between MySQL and Vitess diff --git a/go/test/endtoend/vtgate/queries/dml/sharded_schema.sql b/go/test/endtoend/vtgate/queries/dml/sharded_schema.sql index 8ddf9250e45..cd129bd779a 100644 --- a/go/test/endtoend/vtgate/queries/dml/sharded_schema.sql +++ b/go/test/endtoend/vtgate/queries/dml/sharded_schema.sql @@ -87,3 +87,10 @@ create table lkp_mixed_idx keyspace_id varbinary(20), primary key (lkp_key) ) Engine = InnoDB; + +create table j_tbl +( + id bigint, + jdoc json, + primary key (id) +) Engine = InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/dml/unsharded_schema.sql b/go/test/endtoend/vtgate/queries/dml/unsharded_schema.sql index 4d2ad06618a..cd64605ad20 100644 --- a/go/test/endtoend/vtgate/queries/dml/unsharded_schema.sql +++ b/go/test/endtoend/vtgate/queries/dml/unsharded_schema.sql @@ -34,4 +34,11 @@ values (0, 1, 1000); insert into auto_seq(id, next_id, cache) values (0, 666, 1000); insert into mixed_seq(id, next_id, cache) -values (0, 1, 1000); \ No newline at end of file +values (0, 1, 1000); + +create table j_utbl +( + id bigint, + jdoc json, + primary key (id) +) Engine = InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/dml/vschema.json b/go/test/endtoend/vtgate/queries/dml/vschema.json index a42a93d7403..72a949a49e4 100644 --- a/go/test/endtoend/vtgate/queries/dml/vschema.json +++ b/go/test/endtoend/vtgate/queries/dml/vschema.json @@ -188,6 +188,14 @@ "name": "hash" } ] + }, + "j_tbl": { + "column_vindexes": [ + { + "column": "id", + "name": "hash" + } + ] } } } \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/informationschema/informationschema_test.go b/go/test/endtoend/vtgate/queries/informationschema/informationschema_test.go index ec55711a31f..c5568b2db49 100644 --- a/go/test/endtoend/vtgate/queries/informationschema/informationschema_test.go +++ b/go/test/endtoend/vtgate/queries/informationschema/informationschema_test.go @@ -200,7 +200,7 @@ func TestMultipleSchemaPredicates(t *testing.T) { "where t.table_schema = '%s' and c.table_schema = '%s' and c.table_schema = '%s'", keyspaceName, keyspaceName, "a") _, err := mcmp.VtConn.ExecuteFetch(query, 1000, true) require.Error(t, err) - require.Contains(t, err.Error(), "specifying two different database in the query is not supported") + require.ErrorContains(t, err, "specifying two different database in the query is not supported") if utils.BinaryIsAtLeastAtVersion(20, "vtgate") { _, _ = mcmp.ExecNoCompare("select * from information_schema.columns where table_schema = '' limit 1") @@ -225,8 +225,6 @@ func TestInfrSchemaAndUnionAll(t *testing.T) { } func TestInfoschemaTypes(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") - require.NoError(t, utils.WaitForAuthoritative(t, "ks", "t1", clusterInstance.VtgateProcess.ReadVSchema)) @@ -245,9 +243,7 @@ func TestInfoschemaTypes(t *testing.T) { } func TestTypeORMQuery(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") // This test checks that we can run queries similar to the ones that the TypeORM framework uses - require.NoError(t, utils.WaitForAuthoritative(t, "ks", "t1", clusterInstance.VtgateProcess.ReadVSchema)) @@ -294,7 +290,6 @@ WHERE TABLE_SCHEMA = 'ks' AND TABLE_NAME = 't2'; } func TestJoinWithSingleShardQueryOnRHS(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") // This test checks that we can run queries like this, where the RHS is a single shard query mcmp, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/queries/misc/misc_test.go b/go/test/endtoend/vtgate/queries/misc/misc_test.go index e43171b6701..fd869c4ba5b 100644 --- a/go/test/endtoend/vtgate/queries/misc/misc_test.go +++ b/go/test/endtoend/vtgate/queries/misc/misc_test.go @@ -17,13 +17,15 @@ limitations under the License. package misc import ( + "context" "database/sql" "fmt" - "strconv" "strings" "testing" "time" + "vitess.io/vitess/go/mysql" + _ "github.com/go-sql-driver/mysql" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -60,15 +62,8 @@ func TestBitVals(t *testing.T) { mcmp.AssertMatches(`select b'1001', 0x9, B'010011011010'`, `[[VARBINARY("\t") VARBINARY("\t") VARBINARY("\x04\xda")]]`) mcmp.AssertMatches(`select b'1001', 0x9, B'010011011010' from t1`, `[[VARBINARY("\t") VARBINARY("\t") VARBINARY("\x04\xda")]]`) - vtgateVersion, err := cluster.GetMajorVersion("vtgate") - require.NoError(t, err) - if vtgateVersion >= 19 { - mcmp.AssertMatchesNoCompare(`select 1 + b'1001', 2 + 0x9, 3 + B'010011011010'`, `[[INT64(10) UINT64(11) INT64(1245)]]`, `[[INT64(10) UINT64(11) INT64(1245)]]`) - mcmp.AssertMatchesNoCompare(`select 1 + b'1001', 2 + 0x9, 3 + B'010011011010' from t1`, `[[INT64(10) UINT64(11) INT64(1245)]]`, `[[INT64(10) UINT64(11) INT64(1245)]]`) - } else { - mcmp.AssertMatchesNoCompare(`select 1 + b'1001', 2 + 0x9, 3 + B'010011011010'`, `[[INT64(10) UINT64(11) INT64(1245)]]`, `[[UINT64(10) UINT64(11) UINT64(1245)]]`) - mcmp.AssertMatchesNoCompare(`select 1 + b'1001', 2 + 0x9, 3 + B'010011011010' from t1`, `[[INT64(10) UINT64(11) INT64(1245)]]`, `[[UINT64(10) UINT64(11) UINT64(1245)]]`) - } + mcmp.AssertMatchesNoCompare(`select 1 + b'1001', 2 + 0x9, 3 + B'010011011010'`, `[[INT64(10) UINT64(11) INT64(1245)]]`, `[[INT64(10) UINT64(11) INT64(1245)]]`) + mcmp.AssertMatchesNoCompare(`select 1 + b'1001', 2 + 0x9, 3 + B'010011011010' from t1`, `[[INT64(10) UINT64(11) INT64(1245)]]`, `[[INT64(10) UINT64(11) INT64(1245)]]`) } // TestTimeFunctionWithPrecision tests that inserting data with NOW(1) works as intended. @@ -140,7 +135,6 @@ func TestCast(t *testing.T) { // TestVindexHints tests that vindex hints work as intended. func TestVindexHints(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") mcmp, closer := start(t) defer closer() @@ -205,7 +199,7 @@ func TestHighNumberOfParams(t *testing.T) { var vals []any var params []string for i := 0; i < paramCount; i++ { - vals = append(vals, strconv.Itoa(i)) + vals = append(vals, i) params = append(params, "?") } @@ -323,8 +317,6 @@ func TestAnalyze(t *testing.T) { // TestTransactionModeVar executes SELECT on `transaction_mode` variable func TestTransactionModeVar(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") - mcmp, closer := start(t) defer closer() @@ -356,8 +348,6 @@ func TestTransactionModeVar(t *testing.T) { // TestAliasesInOuterJoinQueries tests that aliases work in queries that have outer join clauses. func TestAliasesInOuterJoinQueries(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -371,10 +361,12 @@ func TestAliasesInOuterJoinQueries(t *testing.T) { mcmp.ExecWithColumnCompare("select t1.id1 as t0, t1.id1 as t1, tbl.unq_col as col from t1 left outer join tbl on t1.id2 = tbl.nonunq_col order by t1.id2 limit 2 offset 2") mcmp.ExecWithColumnCompare("select t1.id1 as t0, t1.id1 as t1, count(*) as leCount from t1 left outer join tbl on t1.id2 = tbl.nonunq_col group by 1, t1") mcmp.ExecWithColumnCompare("select t.id1, t.id2, derived.unq_col from t1 t join (select id, unq_col, nonunq_col from tbl) as derived on t.id2 = derived.nonunq_col") + if utils.BinaryIsAtLeastAtVersion(21, "vtgate") { + mcmp.ExecWithColumnCompare("select * from t1 t left join tbl on t.id1 = 666 and t.id2 = tbl.id") + } } func TestAlterTableWithView(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") mcmp, closer := start(t) defer closer() @@ -428,7 +420,6 @@ func TestAlterTableWithView(t *testing.T) { // TestStraightJoin tests that Vitess respects the ordering of join in a STRAIGHT JOIN query. func TestStraightJoin(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") mcmp, closer := start(t) defer closer() @@ -454,7 +445,6 @@ func TestStraightJoin(t *testing.T) { } func TestColumnAliases(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") mcmp, closer := start(t) defer closer() @@ -463,7 +453,6 @@ func TestColumnAliases(t *testing.T) { } func TestHandleNullableColumn(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 21, "vtgate") require.NoError(t, utils.WaitForAuthoritative(t, keyspaceName, "tbl", clusterInstance.VtgateProcess.ReadVSchema)) mcmp, closer := start(t) @@ -477,8 +466,6 @@ func TestHandleNullableColumn(t *testing.T) { } func TestEnumSetVals(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() require.NoError(t, utils.WaitForAuthoritative(t, keyspaceName, "tbl_enum_set", clusterInstance.VtgateProcess.ReadVSchema)) @@ -488,3 +475,49 @@ func TestEnumSetVals(t *testing.T) { mcmp.AssertMatches("select id, enum_col, cast(enum_col as signed) from tbl_enum_set order by enum_col, id", `[[INT64(4) ENUM("xsmall") INT64(1)] [INT64(2) ENUM("small") INT64(2)] [INT64(1) ENUM("medium") INT64(3)] [INT64(5) ENUM("medium") INT64(3)] [INT64(3) ENUM("large") INT64(4)]]`) mcmp.AssertMatches("select id, set_col, cast(set_col as unsigned) from tbl_enum_set order by set_col, id", `[[INT64(4) SET("a,b") UINT64(3)] [INT64(3) SET("c") UINT64(4)] [INT64(5) SET("a,d") UINT64(9)] [INT64(1) SET("a,b,e") UINT64(19)] [INT64(2) SET("e,f,g") UINT64(112)]]`) } + +func TestTimeZones(t *testing.T) { + testCases := []struct { + name string + targetTZ string + expectedDiff time.Duration + }{ + {"UTC to +08:00", "+08:00", 8 * time.Hour}, + {"UTC to -08:00", "-08:00", -8 * time.Hour}, + {"UTC to +05:30", "+05:30", 5*time.Hour + 30*time.Minute}, + {"UTC to -05:45", "-05:45", -(5*time.Hour + 45*time.Minute)}, + {"UTC to +09:00", "+09:00", 9 * time.Hour}, + {"UTC to -12:00", "-12:00", -12 * time.Hour}, + } + + // Connect to Vitess + conn, err := mysql.Connect(context.Background(), &vtParams) + require.NoError(t, err) + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Set the initial time zone and get the time + utils.Exec(t, conn, "set time_zone = '+00:00'") + rs1 := utils.Exec(t, conn, "select now()") + + // Set the target time zone and get the time + utils.Exec(t, conn, fmt.Sprintf("set time_zone = '%s'", tc.targetTZ)) + rs2 := utils.Exec(t, conn, "select now()") + + // Parse the times from the query result + layout := "2006-01-02 15:04:05" // MySQL default datetime format + time1, err := time.Parse(layout, rs1.Rows[0][0].ToString()) + require.NoError(t, err) + time2, err := time.Parse(layout, rs2.Rows[0][0].ToString()) + require.NoError(t, err) + + // Calculate the actual difference between time2 and time1 + actualDiff := time2.Sub(time1) + allowableDeviation := time.Second // allow up to 1-second difference + + // Use a range to allow for slight variations + require.InDeltaf(t, tc.expectedDiff.Seconds(), actualDiff.Seconds(), allowableDeviation.Seconds(), + "time2 should be approximately %v after time1, within 1 second tolerance\n%v vs %v", tc.expectedDiff, time1, time2) + }) + } +} diff --git a/go/test/endtoend/vtgate/queries/orderby/orderby_test.go b/go/test/endtoend/vtgate/queries/orderby/orderby_test.go index e8d8d4bfef1..c36b52a4e6a 100644 --- a/go/test/endtoend/vtgate/queries/orderby/orderby_test.go +++ b/go/test/endtoend/vtgate/queries/orderby/orderby_test.go @@ -86,8 +86,6 @@ func TestOrderBy(t *testing.T) { func TestOrderByComplex(t *testing.T) { // tests written to try to trick the ORDER BY engine and planner - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/queries/reference/main_test.go b/go/test/endtoend/vtgate/queries/reference/main_test.go index 4c9440ca4ff..c350038bf6e 100644 --- a/go/test/endtoend/vtgate/queries/reference/main_test.go +++ b/go/test/endtoend/vtgate/queries/reference/main_test.go @@ -18,6 +18,7 @@ package reference import ( "context" + _ "embed" "flag" "fmt" "os" @@ -39,68 +40,16 @@ var ( vtParams mysql.ConnParams unshardedKeyspaceName = "uks" - unshardedSQLSchema = ` - CREATE TABLE IF NOT EXISTS zip( - id BIGINT NOT NULL AUTO_INCREMENT, - code5 INT(5) NOT NULL, - PRIMARY KEY(id) - ) ENGINE=InnoDB; + //go:embed uschema.sql + unshardedSQLSchema string + //go:embed uvschema.json + unshardedVSchema string - INSERT INTO zip(id, code5) - VALUES (1, 47107), - (2, 82845), - (3, 11237); - - CREATE TABLE IF NOT EXISTS zip_detail( - id BIGINT NOT NULL AUTO_INCREMENT, - zip_id BIGINT NOT NULL, - discontinued_at DATE, - PRIMARY KEY(id) - ) ENGINE=InnoDB; - - ` - unshardedVSchema = ` - { - "sharded":false, - "tables": { - "zip": {}, - "zip_detail": {} - } - } - ` shardedKeyspaceName = "sks" - shardedSQLSchema = ` - CREATE TABLE IF NOT EXISTS delivery_failure ( - id BIGINT NOT NULL, - zip_detail_id BIGINT NOT NULL, - reason VARCHAR(255), - PRIMARY KEY(id) - ) ENGINE=InnoDB; - ` - shardedVSchema = ` - { - "sharded": true, - "vindexes": { - "hash": { - "type": "hash" - } - }, - "tables": { - "delivery_failure": { - "columnVindexes": [ - { - "column": "id", - "name": "hash" - } - ] - }, - "zip_detail": { - "type": "reference", - "source": "` + unshardedKeyspaceName + `.zip_detail" - } - } - } - ` + //go:embed sschema.sql + shardedSQLSchema string + //go:embed svschema.json + shardedVSchema string ) func TestMain(m *testing.M) { diff --git a/go/test/endtoend/vtgate/queries/reference/reference_test.go b/go/test/endtoend/vtgate/queries/reference/reference_test.go index 0e3096e6064..08e9cbe13b1 100644 --- a/go/test/endtoend/vtgate/queries/reference/reference_test.go +++ b/go/test/endtoend/vtgate/queries/reference/reference_test.go @@ -84,20 +84,19 @@ func TestReferenceRouting(t *testing.T) { ) t.Run("Complex reference query", func(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") // Verify a complex query using reference tables with a left join having a derived table with an order by clause works as intended. utils.AssertMatches( t, conn, `SELECT t.id FROM ( - SELECT zd.id, zd.zip_id - FROM `+shardedKeyspaceName+`.zip_detail AS zd - WHERE zd.id IN (2) - ORDER BY zd.discontinued_at - LIMIT 1 - ) AS t - LEFT JOIN `+shardedKeyspaceName+`.zip_detail AS t0 ON t.zip_id = t0.zip_id - ORDER BY t.id`, + SELECT zd.id, zd.zip_id + FROM `+shardedKeyspaceName+`.zip_detail AS zd + WHERE zd.id IN (2) + ORDER BY zd.discontinued_at + LIMIT 1 + ) AS t + LEFT JOIN `+shardedKeyspaceName+`.zip_detail AS t0 ON t.zip_id = t0.zip_id + ORDER BY t.id`, `[[INT64(2)]]`, ) }) @@ -156,3 +155,19 @@ func TestReferenceRouting(t *testing.T) { `[[INT64(2)]]`, ) } + +// TestMultiReferenceQuery tests that a query with multiple references with unsharded keyspace and sharded keyspace works with join. +func TestMultiReferenceQuery(t *testing.T) { + utils.SkipIfBinaryIsBelowVersion(t, 21, "vtgate") + conn, closer := start(t) + defer closer() + + query := + `select 1 + from delivery_failure df1 + join delivery_failure df2 on df1.id = df2.id + join uks.zip_detail zd1 on df1.zip_detail_id = zd1.zip_id + join uks.zip_detail zd2 on zd1.zip_id = zd2.zip_id` + + utils.Exec(t, conn, query) +} diff --git a/go/test/endtoend/vtgate/queries/reference/sschema.sql b/go/test/endtoend/vtgate/queries/reference/sschema.sql new file mode 100644 index 00000000000..0fcaf63a422 --- /dev/null +++ b/go/test/endtoend/vtgate/queries/reference/sschema.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS delivery_failure ( + id BIGINT NOT NULL, + zip_detail_id BIGINT NOT NULL, + reason VARCHAR(255), + PRIMARY KEY(id) +) ENGINE=InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/reference/svschema.json b/go/test/endtoend/vtgate/queries/reference/svschema.json new file mode 100644 index 00000000000..815e0e8d21c --- /dev/null +++ b/go/test/endtoend/vtgate/queries/reference/svschema.json @@ -0,0 +1,22 @@ +{ + "sharded": true, + "vindexes": { + "hash": { + "type": "hash" + } + }, + "tables": { + "delivery_failure": { + "columnVindexes": [ + { + "column": "id", + "name": "hash" + } + ] + }, + "zip_detail": { + "type": "reference", + "source": "uks.zip_detail" + } + } +} \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/reference/uschema.sql b/go/test/endtoend/vtgate/queries/reference/uschema.sql new file mode 100644 index 00000000000..52737928469 --- /dev/null +++ b/go/test/endtoend/vtgate/queries/reference/uschema.sql @@ -0,0 +1,17 @@ +CREATE TABLE IF NOT EXISTS zip( + id BIGINT NOT NULL AUTO_INCREMENT, + code5 INT(5) NOT NULL, + PRIMARY KEY(id) +) ENGINE=InnoDB; + +INSERT INTO zip(id, code5) +VALUES (1, 47107), + (2, 82845), + (3, 11237); + +CREATE TABLE IF NOT EXISTS zip_detail( + id BIGINT NOT NULL AUTO_INCREMENT, + zip_id BIGINT NOT NULL, + discontinued_at DATE, + PRIMARY KEY(id) +) ENGINE=InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/reference/uvschema.json b/go/test/endtoend/vtgate/queries/reference/uvschema.json new file mode 100644 index 00000000000..fdcfca0d7a9 --- /dev/null +++ b/go/test/endtoend/vtgate/queries/reference/uvschema.json @@ -0,0 +1,6 @@ +{ + "tables": { + "zip": {}, + "zip_detail": {} + } +} \ No newline at end of file diff --git a/go/test/endtoend/vtgate/queries/subquery/subquery_test.go b/go/test/endtoend/vtgate/queries/subquery/subquery_test.go index eb949e1c697..4298bbe80fc 100644 --- a/go/test/endtoend/vtgate/queries/subquery/subquery_test.go +++ b/go/test/endtoend/vtgate/queries/subquery/subquery_test.go @@ -162,7 +162,6 @@ func TestSubqueryInReference(t *testing.T) { // TestSubqueryInAggregation validates that subquery work inside aggregation functions. func TestSubqueryInAggregation(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vtgate") mcmp, closer := start(t) defer closer() @@ -180,7 +179,6 @@ func TestSubqueryInAggregation(t *testing.T) { // TestSubqueryInDerivedTable tests that subqueries and derived tables // are handled correctly when there are joins inside the derived table func TestSubqueryInDerivedTable(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") mcmp, closer := start(t) defer closer() @@ -191,10 +189,9 @@ func TestSubqueryInDerivedTable(t *testing.T) { } func TestSubqueries(t *testing.T) { - // This method tests many types of subqueries. The queries should move to a vitess-tester test file once we have a way to run them. + // This method tests many types of subqueries. The queries should move to a vt tester test file once we have a way to run them. // The commented out queries are failing because of wrong types being returned. // The tests are commented out until the issue is fixed. - utils.SkipIfBinaryIsBelowVersion(t, 21, "vtgate") mcmp, closer := start(t) defer closer() queries := []string{ @@ -234,8 +231,6 @@ func TestSubqueries(t *testing.T) { } func TestProperTypesOfPullOutValue(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 21, "vtgate") - query := "select (select sum(id) from user) from user_extra" mcmp, closer := start(t) diff --git a/go/test/endtoend/vtgate/queries/timeout/main_test.go b/go/test/endtoend/vtgate/queries/timeout/main_test.go index c265e824e88..06e8a786469 100644 --- a/go/test/endtoend/vtgate/queries/timeout/main_test.go +++ b/go/test/endtoend/vtgate/queries/timeout/main_test.go @@ -63,8 +63,9 @@ func TestMain(m *testing.M) { clusterInstance.VtTabletExtraArgs = append(clusterInstance.VtTabletExtraArgs, "--queryserver-config-max-result-size", "1000000", - "--queryserver-config-query-timeout", "200s", - "--queryserver-config-query-pool-timeout", "200s") + "--queryserver-config-query-timeout", "2s", + "--queryserver-config-transaction-timeout", "3s", + "--queryserver-config-query-pool-timeout", "2s") // Start Unsharded keyspace ukeyspace := &cluster.Keyspace{ Name: uks, diff --git a/go/test/endtoend/vtgate/queries/timeout/timeout_test.go b/go/test/endtoend/vtgate/queries/timeout/timeout_test.go index f7bd96dca13..565c3c07a4f 100644 --- a/go/test/endtoend/vtgate/queries/timeout/timeout_test.go +++ b/go/test/endtoend/vtgate/queries/timeout/timeout_test.go @@ -17,11 +17,14 @@ limitations under the License. package misc import ( + "context" + "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/utils" ) @@ -66,6 +69,10 @@ func TestQueryTimeoutWithDual(t *testing.T) { assert.Error(t, err) _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=15 */ sleep(0.001) from dual") assert.NoError(t, err) + // infinite query timeout overriding all defaults + utils.SkipIfBinaryIsBelowVersion(t, 21, "vttablet") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=0 */ sleep(5) from dual") + assert.NoError(t, err) } func TestQueryTimeoutWithTables(t *testing.T) { @@ -84,8 +91,8 @@ func TestQueryTimeoutWithTables(t *testing.T) { // the query usually takes more than 5ms to return. So this should fail. _, err := utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=1 */ count(*) from uks.unsharded where id1 > 31") require.Error(t, err) - assert.Contains(t, err.Error(), "context deadline exceeded") - assert.Contains(t, err.Error(), "(errno 1317) (sqlstate 70100)") + assert.ErrorContains(t, err, "context deadline exceeded") + assert.ErrorContains(t, err, "(errno 1317) (sqlstate 70100)") // sharded utils.Exec(t, mcmp.VtConn, "insert /*vt+ QUERY_TIMEOUT_MS=1000 */ into ks_misc.t1(id1, id2) values (1,2),(2,4),(3,6),(4,8),(5,10)") @@ -94,14 +101,12 @@ func TestQueryTimeoutWithTables(t *testing.T) { utils.Exec(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=500 */ sleep(0.1) from t1 where id1 = 1") _, err = utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=20 */ sleep(0.1) from t1 where id1 = 1") require.Error(t, err) - assert.Contains(t, err.Error(), "context deadline exceeded") - assert.Contains(t, err.Error(), "(errno 1317) (sqlstate 70100)") + assert.ErrorContains(t, err, "context deadline exceeded") + assert.ErrorContains(t, err, "(errno 1317) (sqlstate 70100)") } // TestQueryTimeoutWithShardTargeting tests the query timeout with shard targeting. func TestQueryTimeoutWithShardTargeting(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") - mcmp, closer := start(t) defer closer() @@ -126,3 +131,87 @@ func TestQueryTimeoutWithShardTargeting(t *testing.T) { }) } } + +func TestQueryTimeoutWithoutVTGateDefault(t *testing.T) { + utils.SkipIfBinaryIsBelowVersion(t, 21, "vttablet") + // disable query timeout + clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs, + "--query-timeout", "0") + require.NoError(t, + clusterInstance.RestartVtgate()) + + // update vtgate params + vtParams = clusterInstance.GetVTParams(keyspaceName) + + mcmp, closer := start(t) + defer closer() + + // tablet query timeout of 2s + _, err := utils.ExecAllowError(t, mcmp.VtConn, "select sleep(5) from dual") + assert.Error(t, err) + + // infinite timeout using query hint + utils.Exec(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=0 */ sleep(5) from dual") + + // checking again without query hint, tablet query timeout of 2s should be applied + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(5) from dual") + assert.Error(t, err) + + // set timeout of 20ms + utils.Exec(t, mcmp.VtConn, "set query_timeout=20") + + // query timeout of 20ms should be applied + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(1) from dual") + assert.Error(t, err) + + // infinite timeout using query hint will override session timeout. + utils.Exec(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=0 */ sleep(5) from dual") + + // open second session + conn2, err := mysql.Connect(context.Background(), &vtParams) + require.NoError(t, err) + defer conn2.Close() + + // tablet query timeout of 2s should be applied, as session timeout is not set on this connection. + utils.Exec(t, conn2, "select sleep(1) from dual") + _, err = utils.ExecAllowError(t, conn2, "select sleep(5) from dual") + assert.Error(t, err) + + // reset session on first connection, tablet query timeout of 2s should be applied. + utils.Exec(t, mcmp.VtConn, "set query_timeout=0") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(5) from dual") + assert.Error(t, err) +} + +// TestOverallQueryTimeout tests that the query timeout is applied to the overall execution of a query +// and not just individual routes. +func TestOverallQueryTimeout(t *testing.T) { + utils.SkipIfBinaryIsBelowVersion(t, 21, "vtgate") + utils.SkipIfBinaryIsBelowVersion(t, 21, "vttablet") + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into t1(id1, id2) values (2,2),(3,3)") + + // After inserting the rows above, if we run the following query, we will end up doing join on vtgate + // that issues one select query on the left side and 2 on the right side. The queries on the right side + // take 2 and 3 seconds each to run. If we have an overall timeout for 4 seconds, then it should fail. + _, err := utils.ExecAllowError(t, mcmp.VtConn, "select /*vt+ QUERY_TIMEOUT_MS=4000 */ sleep(u2.id2), u1.id2 from t1 u1 join t1 u2 where u1.id2 = u2.id1") + assert.Error(t, err) + // We can get two different error messages based on whether it is coming from vttablet or vtgate + if !strings.Contains(err.Error(), "Query execution was interrupted, maximum statement execution time exceeded") { + assert.ErrorContains(t, err, "DeadlineExceeded desc = context deadline exceeded (errno 1317) (sqlstate 70100)") + } + + // Let's also check that setting the session variable also works. + utils.Exec(t, mcmp.VtConn, "set query_timeout=4000") + _, err = utils.ExecAllowError(t, mcmp.VtConn, "select sleep(u2.id2), u1.id2 from t1 u1 join t1 u2 where u1.id2 = u2.id1") + assert.Error(t, err) + if !strings.Contains(err.Error(), "Query execution was interrupted, maximum statement execution time exceeded") { + assert.ErrorContains(t, err, "DeadlineExceeded desc = context deadline exceeded (errno 1317) (sqlstate 70100)") + } + + // Increasing the timeout should pass the query. + utils.Exec(t, mcmp.VtConn, "set query_timeout=10000") + _ = utils.Exec(t, mcmp.VtConn, "select sleep(u2.id2), u1.id2 from t1 u1 join t1 u2 where u1.id2 = u2.id1") +} diff --git a/go/test/endtoend/vtgate/queries/tpch/tpch_test.go b/go/test/endtoend/vtgate/queries/tpch/tpch_test.go index bd35fe3f67c..c4bf71cafa1 100644 --- a/go/test/endtoend/vtgate/queries/tpch/tpch_test.go +++ b/go/test/endtoend/vtgate/queries/tpch/tpch_test.go @@ -48,7 +48,6 @@ func start(t *testing.T) (utils.MySQLCompare, func()) { } func TestTPCHQueries(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 20, "vtgate") mcmp, closer := start(t) defer closer() err := utils.WaitForColumn(t, clusterInstance.VtgateProcess, keyspaceName, "region", `R_COMMENT`) diff --git a/go/test/endtoend/vtgate/queries/vexplain/vexplain_test.go b/go/test/endtoend/vtgate/queries/vexplain/vexplain_test.go index ed43d57b578..45baf7af903 100644 --- a/go/test/endtoend/vtgate/queries/vexplain/vexplain_test.go +++ b/go/test/endtoend/vtgate/queries/vexplain/vexplain_test.go @@ -18,6 +18,7 @@ package vexplain import ( "context" + "fmt" "testing" "github.com/stretchr/testify/require" @@ -75,24 +76,29 @@ func TestVtGateVExplain(t *testing.T) { `vexplain queries insert into user (id,lookup,lookup_unique) values (4,'apa','foo'),(5,'apa','bar'),(6,'monkey','nobar')`, "vexplain queries/all will actually run queries") - expected := `[ + binaryPrefix := "" + if utils.BinaryIsAtLeastAtVersion(22, "vtgate") { + binaryPrefix = "_binary" + } + + expected := fmt.Sprintf(`[ [VARCHAR("ks") VARCHAR("-40") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into lookup(lookup, id, keyspace_id) values ('apa', 1, '\x16k@\xb4J\xbaK\xd6') on duplicate key update lookup = values(lookup), id = values(id), keyspace_id = values(keyspace_id)")] + [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into lookup(lookup, id, keyspace_id) values ('apa', 1, %s'\x16k@\xb4J\xbaK\xd6') on duplicate key update lookup = values(lookup), id = values(id), keyspace_id = values(keyspace_id)")] [VARCHAR("ks") VARCHAR("40-80") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into lookup(lookup, id, keyspace_id) values ('monkey', 3, 'N\xb1\x90ɢ\xfa\x16\x9c') on duplicate key update lookup = values(lookup), id = values(id), keyspace_id = values(keyspace_id)")] + [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into lookup(lookup, id, keyspace_id) values ('monkey', 3, %s'N\xb1\x90ɢ\xfa\x16\x9c') on duplicate key update lookup = values(lookup), id = values(id), keyspace_id = values(keyspace_id)")] [VARCHAR("ks") VARCHAR("-40") VARCHAR("commit")] [VARCHAR("ks") VARCHAR("40-80") VARCHAR("commit")] [VARCHAR("ks") VARCHAR("40-80") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('monkey', 'N\xb1\x90ɢ\xfa\x16\x9c')")] + [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('monkey', %s'N\xb1\x90ɢ\xfa\x16\x9c')")] [VARCHAR("ks") VARCHAR("-40") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('apa', '\x16k@\xb4J\xbaK\xd6')")] + [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('apa', %s'\x16k@\xb4J\xbaK\xd6')")] [VARCHAR("ks") VARCHAR("40-80") VARCHAR("commit")] [VARCHAR("ks") VARCHAR("-40") VARCHAR("commit")] [VARCHAR("ks") VARCHAR("40-80") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into ` + "`user`" + `(id, lookup, lookup_unique) values (3, 'monkey', 'monkey')")] + [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into `+"`user`"+`(id, lookup, lookup_unique) values (3, 'monkey', 'monkey')")] [VARCHAR("ks") VARCHAR("-40") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into ` + "`user`" + `(id, lookup, lookup_unique) values (1, 'apa', 'apa')")] - ]` + [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into `+"`user`"+`(id, lookup, lookup_unique) values (1, 'apa', 'apa')")] + ]`, binaryPrefix, binaryPrefix, binaryPrefix, binaryPrefix) assertVExplainEquals(t, conn, `vexplain /*vt+ EXECUTE_DML_QUERIES */ queries insert into user (id,lookup,lookup_unique) values (1,'apa','apa'),(3,'monkey','monkey')`, expected) // Assert that the output of vexplain all doesn't have begin queries because they aren't explainable @@ -109,27 +115,27 @@ func TestVtGateVExplain(t *testing.T) { // transaction explicitly started to no commit in the end. utils.Exec(t, conn, "begin") - expected = `[ + expected = fmt.Sprintf(`[ [VARCHAR("ks") VARCHAR("-40") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into lookup(lookup, id, keyspace_id) values ('apa', 4, '\xd2\xfd\x88g\xd5\\r-\xfe'), ('apa', 5, 'p\xbb\x02<\x81\f\xa8z') on duplicate key update lookup = values(lookup), id = values(id), keyspace_id = values(keyspace_id)")] + [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into lookup(lookup, id, keyspace_id) values ('apa', 4, %s'\xd2\xfd\x88g\xd5\\r-\xfe'), ('apa', 5, %s'p\xbb\x02<\x81\f\xa8z') on duplicate key update lookup = values(lookup), id = values(id), keyspace_id = values(keyspace_id)")] [VARCHAR("ks") VARCHAR("40-80") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into lookup(lookup, id, keyspace_id) values ('monkey', 6, '\xf0\x98H\\n\xc4ľq') on duplicate key update lookup = values(lookup), id = values(id), keyspace_id = values(keyspace_id)")] + [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into lookup(lookup, id, keyspace_id) values ('monkey', 6, %s'\xf0\x98H\\n\xc4ľq') on duplicate key update lookup = values(lookup), id = values(id), keyspace_id = values(keyspace_id)")] [VARCHAR("ks") VARCHAR("-40") VARCHAR("commit")] [VARCHAR("ks") VARCHAR("40-80") VARCHAR("commit")] [VARCHAR("ks") VARCHAR("-40") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('foo', '\xd2\xfd\x88g\xd5\\r-\xfe')")] + [VARCHAR("ks") VARCHAR("-40") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('foo', %s'\xd2\xfd\x88g\xd5\\r-\xfe')")] [VARCHAR("ks") VARCHAR("80-c0") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("80-c0") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('bar', 'p\xbb\x02<\x81\f\xa8z')")] + [VARCHAR("ks") VARCHAR("80-c0") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('bar', %s'p\xbb\x02<\x81\f\xa8z')")] [VARCHAR("ks") VARCHAR("c0-") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("c0-") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('nobar', '\xf0\x98H\\n\xc4ľq')")] + [VARCHAR("ks") VARCHAR("c0-") VARCHAR("insert into lookup_unique(lookup_unique, keyspace_id) values ('nobar', %s'\xf0\x98H\\n\xc4ľq')")] [VARCHAR("ks") VARCHAR("-40") VARCHAR("commit")] [VARCHAR("ks") VARCHAR("80-c0") VARCHAR("commit")] [VARCHAR("ks") VARCHAR("c0-") VARCHAR("commit")] [VARCHAR("ks") VARCHAR("40-80") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into ` + "`user`" + `(id, lookup, lookup_unique) values (5, 'apa', 'bar')")] + [VARCHAR("ks") VARCHAR("40-80") VARCHAR("insert into `+"`user`"+`(id, lookup, lookup_unique) values (5, 'apa', 'bar')")] [VARCHAR("ks") VARCHAR("c0-") VARCHAR("begin")] - [VARCHAR("ks") VARCHAR("c0-") VARCHAR("insert into ` + "`user`" + `(id, lookup, lookup_unique) values (4, 'apa', 'foo'), (6, 'monkey', 'nobar')")] - ]` + [VARCHAR("ks") VARCHAR("c0-") VARCHAR("insert into `+"`user`"+`(id, lookup, lookup_unique) values (4, 'apa', 'foo'), (6, 'monkey', 'nobar')")] + ]`, binaryPrefix, binaryPrefix, binaryPrefix, binaryPrefix, binaryPrefix, binaryPrefix) assertVExplainEquals(t, conn, `vexplain /*vt+ EXECUTE_DML_QUERIES */ queries insert into user (id,lookup,lookup_unique) values (4,'apa','foo'),(5,'apa','bar'),(6,'monkey','nobar')`, expected) utils.Exec(t, conn, "rollback") diff --git a/go/test/endtoend/vtgate/reservedconn/sysvar_test.go b/go/test/endtoend/vtgate/reservedconn/sysvar_test.go index 564cc671d5f..e7e0cfb0259 100644 --- a/go/test/endtoend/vtgate/reservedconn/sysvar_test.go +++ b/go/test/endtoend/vtgate/reservedconn/sysvar_test.go @@ -461,3 +461,35 @@ func TestSysVarTxIsolation(t *testing.T) { // second run, to ensuring the setting is applied on the session and not just on next query after settings. utils.AssertContains(t, conn, "select @@transaction_isolation, connection_id()", `SERIALIZABLE`) } + +// TestSysVarInnodbWaitTimeout tests the innodb_lock_wait_timeout system variable +func TestSysVarInnodbWaitTimeout(t *testing.T) { + conn, err := mysql.Connect(context.Background(), &vtParams) + require.NoError(t, err) + defer conn.Close() + + // default from mysql + utils.AssertMatches(t, conn, "select @@innodb_lock_wait_timeout", `[[UINT64(20)]]`) + utils.AssertMatches(t, conn, "select @@global.innodb_lock_wait_timeout", `[[UINT64(20)]]`) + // ensuring it goes to mysql + utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout", `UINT64(20)`) + utils.AssertContains(t, conn, "select @@global.innodb_lock_wait_timeout", `UINT64(20)`) + + // setting to different value. + utils.Exec(t, conn, "set @@innodb_lock_wait_timeout = 120") + utils.AssertMatches(t, conn, "select @@innodb_lock_wait_timeout", `[[INT64(120)]]`) + // ensuring it goes to mysql + utils.AssertContains(t, conn, "select @@global.innodb_lock_wait_timeout, connection_id()", `UINT64(20)`) + utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout, connection_id()", `INT64(120)`) + // second run, to ensuring the setting is applied on the session and not just on next query after settings. + utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout, connection_id()", `INT64(120)`) + + // changing setting to different value. + utils.Exec(t, conn, "set @@innodb_lock_wait_timeout = 240") + utils.AssertMatches(t, conn, "select @@innodb_lock_wait_timeout", `[[INT64(240)]]`) + // ensuring it goes to mysql + utils.AssertContains(t, conn, "select @@global.innodb_lock_wait_timeout, connection_id()", `UINT64(20)`) + utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout, connection_id()", `INT64(240)`) + // second run, to ensuring the setting is applied on the session and not just on next query after settings. + utils.AssertContains(t, conn, "select @@innodb_lock_wait_timeout, connection_id()", `INT64(240)`) +} diff --git a/go/test/endtoend/vtgate/schema.sql b/go/test/endtoend/vtgate/schema.sql index 4c9ed46fe9a..8e7eed0b594 100644 --- a/go/test/endtoend/vtgate/schema.sql +++ b/go/test/endtoend/vtgate/schema.sql @@ -164,4 +164,4 @@ create table t11 col2 int, col3 int, primary key (id) -) Engine = InnoDB; \ No newline at end of file +) Engine = InnoDB; diff --git a/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go b/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go index 4c495d257b5..50042f3142a 100644 --- a/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go +++ b/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go @@ -178,13 +178,7 @@ func TestInitAndUpdate(t *testing.T) { require.NoError(t, err) defer conn.Close() - vtgateVersion, err := cluster.GetMajorVersion("vtgate") - require.NoError(t, err) - - expected := `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` - if vtgateVersion >= 17 { - expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` - } + expected := `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", expected, @@ -192,18 +186,13 @@ func TestInitAndUpdate(t *testing.T) { 30*time.Second, "initial table list not complete") - if vtgateVersion >= 19 { - utils.AssertMatches(t, conn, - "SHOW VSCHEMA KEYSPACES", - `[[VARCHAR("ks") VARCHAR("true") VARCHAR("unmanaged") VARCHAR("")]]`) - } + utils.AssertMatches(t, conn, + "SHOW VSCHEMA KEYSPACES", + `[[VARCHAR("ks") VARCHAR("true") VARCHAR("unmanaged") VARCHAR("")]]`) // Init _ = utils.Exec(t, conn, "create table test_sc (id bigint primary key)") - expected = `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")]]` - if vtgateVersion >= 17 { - expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")]]` - } + expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")]]` utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", expected, @@ -213,10 +202,7 @@ func TestInitAndUpdate(t *testing.T) { // Tables Update via health check. _ = utils.Exec(t, conn, "create table test_sc1 (id bigint primary key)") - expected = `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")] [VARCHAR("test_sc1")]]` - if vtgateVersion >= 17 { - expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")] [VARCHAR("test_sc1")]]` - } + expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")] [VARCHAR("test_sc1")]]` utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", expected, @@ -225,10 +211,7 @@ func TestInitAndUpdate(t *testing.T) { "test_sc1 not in vschema tables") _ = utils.Exec(t, conn, "drop table test_sc, test_sc1") - expected = `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` - if vtgateVersion >= 17 { - expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` - } + expected = `[[VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", expected, @@ -247,12 +230,7 @@ func TestDMLOnNewTable(t *testing.T) { // create a new table which is not part of the VSchema utils.Exec(t, conn, `create table new_table_tracked(id bigint, name varchar(100), primary key(id)) Engine=InnoDB`) - vtgateVersion, err := cluster.GetMajorVersion("vtgate") - require.NoError(t, err) - expected := `[[VARCHAR("dual")] [VARCHAR("new_table_tracked")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` - if vtgateVersion >= 17 { - expected = `[[VARCHAR("new_table_tracked")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` - } + expected := `[[VARCHAR("new_table_tracked")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")]]` // wait for vttablet's schema reload interval to pass utils.AssertMatchesWithTimeout(t, conn, "SHOW VSCHEMA TABLES", diff --git a/go/test/endtoend/vtgate/schematracker/unsharded/st_unsharded_test.go b/go/test/endtoend/vtgate/schematracker/unsharded/st_unsharded_test.go index 257dd7238f3..5ecf89a5db7 100644 --- a/go/test/endtoend/vtgate/schematracker/unsharded/st_unsharded_test.go +++ b/go/test/endtoend/vtgate/schematracker/unsharded/st_unsharded_test.go @@ -182,7 +182,6 @@ func TestNewUnshardedTable(t *testing.T) { // creating two tables having the same name differing only in casing, but other operating systems don't. // More information at https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html#:~:text=Table%20names%20are%20stored%20in,lowercase%20on%20storage%20and%20lookup. func TestCaseSensitiveSchemaTracking(t *testing.T) { - utils.SkipIfBinaryIsBelowVersion(t, 19, "vttablet") defer cluster.PanicHandler(t) // create a sql connection diff --git a/go/test/endtoend/vtgate/sequence/seq_test.go b/go/test/endtoend/vtgate/sequence/seq_test.go index dd7542becc5..1bda37094b2 100644 --- a/go/test/endtoend/vtgate/sequence/seq_test.go +++ b/go/test/endtoend/vtgate/sequence/seq_test.go @@ -293,7 +293,7 @@ func TestDotTableSeq(t *testing.T) { mysqlErr := err.(*sqlerror.SQLError) assert.Equal(t, sqlerror.ERDupEntry, mysqlErr.Num) assert.Equal(t, "23000", mysqlErr.State) - assert.Contains(t, mysqlErr.Message, "Duplicate entry") + assert.ErrorContains(t, mysqlErr, "Duplicate entry") } func TestInsertAllDefaults(t *testing.T) { diff --git a/go/test/endtoend/vtgate/transaction/twopc/schema.sql b/go/test/endtoend/vtgate/transaction/twopc/schema.sql deleted file mode 100644 index 60a7c19837c..00000000000 --- a/go/test/endtoend/vtgate/transaction/twopc/schema.sql +++ /dev/null @@ -1,12 +0,0 @@ -create table twopc_user ( - id bigint, - name varchar(64), - primary key (id) -) Engine=InnoDB; - -create table twopc_music ( - id varchar(64), - user_id bigint, - title varchar(64), - primary key (id) -) Engine=InnoDB; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/transaction/twopc/twopc_test.go b/go/test/endtoend/vtgate/transaction/twopc/twopc_test.go deleted file mode 100644 index f18073c5827..00000000000 --- a/go/test/endtoend/vtgate/transaction/twopc/twopc_test.go +++ /dev/null @@ -1,523 +0,0 @@ -/* -Copyright 2024 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 transaction - -import ( - "context" - _ "embed" - "reflect" - "sort" - "sync" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "vitess.io/vitess/go/mysql" - "vitess.io/vitess/go/test/endtoend/cluster" - "vitess.io/vitess/go/test/endtoend/utils" - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - querypb "vitess.io/vitess/go/vt/proto/query" -) - -// TestDTCommit tests distributed transaction commit for insert, update and delete operations -// It verifies the binlog events for the same with transaction state changes and redo statements. -func TestDTCommit(t *testing.T) { - conn, closer := start(t) - defer closer() - - vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "fk_user", "") - require.NoError(t, err) - defer vtgateConn.Close() - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - ch := make(chan *binlogdatapb.VEvent) - runVStream(t, ctx, ch, vtgateConn) - - // Insert into multiple shards - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo')") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(8,'bar')") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(9,'baz')") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(10,'apa')") - utils.Exec(t, conn, "commit") - - tableMap := make(map[string][]*querypb.Field) - dtMap := make(map[string]string) - logTable := retrieveTransitions(t, ch, tableMap, dtMap) - expectations := map[string][]string{ - "ks.dt_state:80-": { - "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", - }, - "ks.dt_participant:80-": { - "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - }, - "ks.redo_state:-80": { - "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - }, - "ks.redo_statement:-80": { - "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", - "insert:[VARCHAR(\"dtid-1\") INT64(2) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", - "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", - "delete:[VARCHAR(\"dtid-1\") INT64(2) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", - }, - "ks.twopc_user:-80": { - `insert:[INT64(8) VARCHAR("bar")]`, - `insert:[INT64(10) VARCHAR("apa")]`, - }, - "ks.twopc_user:80-": { - `insert:[INT64(7) VARCHAR("foo")]`, - `insert:[INT64(9) VARCHAR("baz")]`, - }, - } - assert.Equal(t, expectations, logTable, - "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) - - // Update from multiple shard - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 7") - utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 8") - utils.Exec(t, conn, "commit") - - logTable = retrieveTransitions(t, ch, tableMap, dtMap) - expectations = map[string][]string{ - "ks.dt_state:80-": { - "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", - }, - "ks.dt_participant:80-": { - "insert:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - "delete:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - }, - "ks.redo_state:-80": { - "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", - "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", - }, - "ks.redo_statement:-80": { - "insert:[VARCHAR(\"dtid-2\") INT64(1) BLOB(\"update twopc_user set `name` = 'newfoo' where id = 8 limit 10001 /* INT64 */\")]", - "delete:[VARCHAR(\"dtid-2\") INT64(1) BLOB(\"update twopc_user set `name` = 'newfoo' where id = 8 limit 10001 /* INT64 */\")]", - }, - "ks.twopc_user:-80": {"update:[INT64(8) VARCHAR(\"newfoo\")]"}, - "ks.twopc_user:80-": {"update:[INT64(7) VARCHAR(\"newfoo\")]"}, - } - assert.Equal(t, expectations, logTable, - "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) - - // DELETE from multiple shard - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "delete from twopc_user where id = 9") - utils.Exec(t, conn, "delete from twopc_user where id = 10") - utils.Exec(t, conn, "commit") - - logTable = retrieveTransitions(t, ch, tableMap, dtMap) - expectations = map[string][]string{ - "ks.dt_state:80-": { - "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", - }, - "ks.dt_participant:80-": { - "insert:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - "delete:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - }, - "ks.redo_state:-80": { - "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", - "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", - }, - "ks.redo_statement:-80": { - "insert:[VARCHAR(\"dtid-3\") INT64(1) BLOB(\"delete from twopc_user where id = 10 limit 10001 /* INT64 */\")]", - "delete:[VARCHAR(\"dtid-3\") INT64(1) BLOB(\"delete from twopc_user where id = 10 limit 10001 /* INT64 */\")]", - }, - "ks.twopc_user:-80": {"delete:[INT64(10) VARCHAR(\"apa\")]"}, - "ks.twopc_user:80-": {"delete:[INT64(9) VARCHAR(\"baz\")]"}, - } - assert.Equal(t, expectations, logTable, - "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) -} - -// TestDTRollback tests distributed transaction rollback for insert, update and delete operations -// There would not be any binlog events for rollback -func TestDTRollback(t *testing.T) { - conn, closer := start(t) - defer closer() - - // Insert initial Data - utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo'), (8,'bar')") - - // run vstream to stream binlogs - vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "fk_user", "") - require.NoError(t, err) - defer vtgateConn.Close() - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - ch := make(chan *binlogdatapb.VEvent) - runVStream(t, ctx, ch, vtgateConn) - - // Insert into multiple shards - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(9,'baz')") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(10,'apa')") - utils.Exec(t, conn, "rollback") - - tableMap := make(map[string][]*querypb.Field) - logTable := retrieveTransitions(t, ch, tableMap, nil) - assert.Zero(t, len(logTable), - "no change in binlog expected: got: %s", prettyPrint(logTable)) - - // Update from multiple shard - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 7") - utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 8") - utils.Exec(t, conn, "rollback") - - logTable = retrieveTransitions(t, ch, tableMap, nil) - assert.Zero(t, len(logTable), - "no change in binlog expected: got: %s", prettyPrint(logTable)) - - // DELETE from multiple shard - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "delete from twopc_user where id = 7") - utils.Exec(t, conn, "delete from twopc_user where id = 8") - utils.Exec(t, conn, "rollback") - - logTable = retrieveTransitions(t, ch, tableMap, nil) - assert.Zero(t, len(logTable), - "no change in binlog expected: got: %s", prettyPrint(logTable)) -} - -// TestDTCommitMultiShardTxSingleShardDML tests distributed transaction commit for insert, update and delete operations -// There is DML operation only on single shard but transaction open on multiple shards. -// Metdata Manager is the one which executed the DML operation on the shard. -func TestDTCommitDMLOnlyOnMM(t *testing.T) { - conn, closer := start(t) - defer closer() - - vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "fk_user", "") - require.NoError(t, err) - defer vtgateConn.Close() - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - ch := make(chan *binlogdatapb.VEvent) - runVStream(t, ctx, ch, vtgateConn) - - // Insert into multiple shards - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo')") - utils.Exec(t, conn, "select * from twopc_user") - utils.Exec(t, conn, "commit") - - tableMap := make(map[string][]*querypb.Field) - dtMap := make(map[string]string) - logTable := retrieveTransitions(t, ch, tableMap, dtMap) - expectations := map[string][]string{ - "ks.dt_state:80-": { - "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", - }, - "ks.dt_participant:80-": { - "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - }, - "ks.twopc_user:80-": {"insert:[INT64(7) VARCHAR(\"foo\")]"}, - } - assert.Equal(t, expectations, logTable, - "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) - - // Update from multiple shard - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 7") - utils.Exec(t, conn, "select * from twopc_user") - utils.Exec(t, conn, "commit") - - logTable = retrieveTransitions(t, ch, tableMap, dtMap) - expectations = map[string][]string{ - "ks.dt_state:80-": { - "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", - }, - "ks.dt_participant:80-": { - "insert:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - "delete:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - }, - "ks.twopc_user:80-": {"update:[INT64(7) VARCHAR(\"newfoo\")]"}, - } - assert.Equal(t, expectations, logTable, - "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) - - // DELETE from multiple shard - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "delete from twopc_user where id = 7") - utils.Exec(t, conn, "select * from twopc_user") - utils.Exec(t, conn, "commit") - - logTable = retrieveTransitions(t, ch, tableMap, dtMap) - expectations = map[string][]string{ - "ks.dt_state:80-": { - "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", - }, - "ks.dt_participant:80-": { - "insert:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - "delete:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - }, - "ks.twopc_user:80-": {"delete:[INT64(7) VARCHAR(\"newfoo\")]"}, - } - assert.Equal(t, expectations, logTable, - "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) -} - -// TestDTCommitMultiShardTxSingleShardDML tests distributed transaction commit for insert, update and delete operations -// There is DML operation only on single shard but transaction open on multiple shards. -// Resource Manager is the one which executed the DML operation on the shard. -func TestDTCommitDMLOnlyOnRM(t *testing.T) { - conn, closer := start(t) - defer closer() - - vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "fk_user", "") - require.NoError(t, err) - defer vtgateConn.Close() - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - ch := make(chan *binlogdatapb.VEvent) - runVStream(t, ctx, ch, vtgateConn) - - // Insert into multiple shards - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "select * from twopc_user where id = 8") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo')") - utils.Exec(t, conn, "commit") - - tableMap := make(map[string][]*querypb.Field) - dtMap := make(map[string]string) - logTable := retrieveTransitions(t, ch, tableMap, dtMap) - expectations := map[string][]string{ - "ks.dt_state:-80": { - "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", - }, - "ks.dt_participant:-80": { - "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", - "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", - }, - "ks.redo_state:80-": { - "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - }, - "ks.redo_statement:80-": { - "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (7, 'foo')\")]", - "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (7, 'foo')\")]", - }, - "ks.twopc_user:80-": {"insert:[INT64(7) VARCHAR(\"foo\")]"}, - } - assert.Equal(t, expectations, logTable, - "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) - - // Update from multiple shard - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "select * from twopc_user where id = 8") - utils.Exec(t, conn, "update twopc_user set name='newfoo' where id = 7") - utils.Exec(t, conn, "commit") - - logTable = retrieveTransitions(t, ch, tableMap, dtMap) - expectations = map[string][]string{ - "ks.dt_state:-80": { - "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"COMMIT\")]", - }, - "ks.dt_participant:-80": { - "insert:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", - "delete:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", - }, - "ks.redo_state:80-": { - "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", - "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", - }, - "ks.redo_statement:80-": { - "insert:[VARCHAR(\"dtid-2\") INT64(1) BLOB(\"update twopc_user set `name` = 'newfoo' where id = 7 limit 10001 /* INT64 */\")]", - "delete:[VARCHAR(\"dtid-2\") INT64(1) BLOB(\"update twopc_user set `name` = 'newfoo' where id = 7 limit 10001 /* INT64 */\")]", - }, - "ks.twopc_user:80-": {"update:[INT64(7) VARCHAR(\"newfoo\")]"}, - } - assert.Equal(t, expectations, logTable, - "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) - - // DELETE from multiple shard - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "select * from twopc_user where id = 8") - utils.Exec(t, conn, "delete from twopc_user where id = 7") - utils.Exec(t, conn, "commit") - - logTable = retrieveTransitions(t, ch, tableMap, dtMap) - expectations = map[string][]string{ - "ks.dt_state:-80": { - "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"COMMIT\")]", - }, - "ks.dt_participant:-80": { - "insert:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", - "delete:[VARCHAR(\"dtid-3\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"80-\")]", - }, - "ks.redo_state:80-": { - "insert:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", - "delete:[VARCHAR(\"dtid-3\") VARCHAR(\"PREPARE\")]", - }, - "ks.redo_statement:80-": { - "insert:[VARCHAR(\"dtid-3\") INT64(1) BLOB(\"delete from twopc_user where id = 7 limit 10001 /* INT64 */\")]", - "delete:[VARCHAR(\"dtid-3\") INT64(1) BLOB(\"delete from twopc_user where id = 7 limit 10001 /* INT64 */\")]", - }, - "ks.twopc_user:80-": {"delete:[INT64(7) VARCHAR(\"newfoo\")]"}, - } - assert.Equal(t, expectations, logTable, - "mismatch expected: \n got: %s, want: %s", prettyPrint(logTable), prettyPrint(expectations)) -} - -// TestDTPrepareFailOnRM tests distributed transaction prepare failure on resource manager -func TestDTPrepareFailOnRM(t *testing.T) { - conn, closer := start(t) - defer closer() - - vtgateConn, err := cluster.DialVTGate(context.Background(), t.Name(), vtgateGrpcAddress, "fk_user", "") - require.NoError(t, err) - defer vtgateConn.Close() - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - ch := make(chan *binlogdatapb.VEvent) - runVStream(t, ctx, ch, vtgateConn) - - // Insert into multiple shards - utils.Exec(t, conn, "begin") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(7,'foo')") - utils.Exec(t, conn, "insert into twopc_user(id, name) values(8,'bar')") - - ctx2 := context.Background() - conn2, err := mysql.Connect(ctx2, &vtParams) - require.NoError(t, err) - - utils.Exec(t, conn2, "begin") - utils.Exec(t, conn2, "insert into twopc_user(id, name) values(9,'baz')") - utils.Exec(t, conn2, "insert into twopc_user(id, name) values(10,'apa')") - - var wg sync.WaitGroup - wg.Add(2) - var commitErr error - go func() { - _, err := utils.ExecAllowError(t, conn, "commit") - if err != nil { - commitErr = err - } - wg.Done() - }() - go func() { - _, err := utils.ExecAllowError(t, conn2, "commit") - wg.Done() - if err != nil { - commitErr = err - } - }() - wg.Wait() - require.ErrorContains(t, commitErr, "ResourceExhausted desc = prepare failed") - - tableMap := make(map[string][]*querypb.Field) - dtMap := make(map[string]string) - logTable := retrieveTransitions(t, ch, tableMap, dtMap) - expectations := map[string][]string{ - "ks.dt_state:80-": { - "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - "insert:[VARCHAR(\"dtid-2\") VARCHAR(\"PREPARE\")]", - "update:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", - "update:[VARCHAR(\"dtid-2\") VARCHAR(\"ROLLBACK\")]", - "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"COMMIT\")]", - "delete:[VARCHAR(\"dtid-2\") VARCHAR(\"ROLLBACK\")]", - }, - "ks.dt_participant:80-": { - "insert:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - "insert:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - "delete:[VARCHAR(\"dtid-1\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - "delete:[VARCHAR(\"dtid-2\") INT64(1) VARCHAR(\"ks\") VARCHAR(\"-80\")]", - }, - "ks.redo_state:-80": { - "insert:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - "delete:[VARCHAR(\"dtid-1\") VARCHAR(\"PREPARE\")]", - }, - "ks.redo_statement:-80": { /* flexi Expectation */ }, - "ks.twopc_user:-80": { /* flexi Expectation */ }, - "ks.twopc_user:80-": { /* flexi Expectation */ }, - } - flexiExpectations := map[string][2][]string{ - "ks.redo_statement:-80": {{ - "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", - "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (8, 'bar')\")]", - }, { - "insert:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", - "delete:[VARCHAR(\"dtid-1\") INT64(1) BLOB(\"insert into twopc_user(id, `name`) values (10, 'apa')\")]", - }}, - "ks.twopc_user:-80": {{ - "insert:[INT64(8) VARCHAR(\"bar\")]", - }, { - "insert:[INT64(10) VARCHAR(\"apa\")]", - }}, - "ks.twopc_user:80-": {{ - "insert:[INT64(7) VARCHAR(\"foo\")]", - }, { - "insert:[INT64(9) VARCHAR(\"baz\")]", - }}, - } - - compareMaps(t, expectations, logTable, flexiExpectations) -} - -func compareMaps(t *testing.T, expected, actual map[string][]string, flexibleExp map[string][2][]string) { - assert.Equal(t, len(expected), len(actual), "mismatch in number of keys: expected: %d, got: %d", len(expected), len(actual)) - - for key, expectedValue := range expected { - actualValue, ok := actual[key] - require.Truef(t, ok, "key %s not found in actual map", key) - - if validValues, isFlexi := flexibleExp[key]; isFlexi { - // For the flexible key, check if the actual value matches one of the valid values - if !reflect.DeepEqual(actualValue, validValues[0]) && !reflect.DeepEqual(actualValue, validValues[1]) { - t.Fatalf("mismatch in values for key '%s': expected one of: %v, got: %v", key, validValues, actualValue) - } - } else { - // Sort the slices before comparison - sort.Strings(expectedValue) - sort.Strings(actualValue) - assert.Equal(t, expectedValue, actualValue, "mismatch in values for key %s: expected: %v, got: %v", key, expectedValue, actualValue) - } - } -} diff --git a/go/test/endtoend/vtgate/unsharded/main_test.go b/go/test/endtoend/vtgate/unsharded/main_test.go index 91326acce4d..e1818735ed1 100644 --- a/go/test/endtoend/vtgate/unsharded/main_test.go +++ b/go/test/endtoend/vtgate/unsharded/main_test.go @@ -343,7 +343,7 @@ func TestCallProcedure(t *testing.T) { _, err = conn.ExecuteFetch(`CALL out_parameter(@foo)`, 100, true) require.Error(t, err) - require.Contains(t, err.Error(), "OUT and INOUT parameters are not supported") + require.ErrorContains(t, err, "OUT and INOUT parameters are not supported") } func TestTempTable(t *testing.T) { diff --git a/go/test/endtoend/vtgate/vitess_tester/aggregation/aggregation.test b/go/test/endtoend/vtgate/vitess_tester/aggregation/aggregation.test index f4c82933d91..8b0997eed1a 100644 --- a/go/test/endtoend/vtgate/vitess_tester/aggregation/aggregation.test +++ b/go/test/endtoend/vtgate/vitess_tester/aggregation/aggregation.test @@ -61,4 +61,7 @@ from (select 1 as one select u.id, u.t1_id, t.num_segments from (select id, count(*) as num_segments from t1 group by 1 order by 2 desc limit 20) t - join t2 u on u.id = t.id; \ No newline at end of file + join t2 u on u.id = t.id; + +select name +from (select name from t1 group by name having count(t1.id) > 1) t1; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/vitess_tester/cte/queries.test b/go/test/endtoend/vtgate/vitess_tester/cte/queries.test new file mode 100644 index 00000000000..173dcaeb6ba --- /dev/null +++ b/go/test/endtoend/vtgate/vitess_tester/cte/queries.test @@ -0,0 +1,226 @@ +# Create tables +CREATE TABLE employees +( + id INT PRIMARY KEY, + name VARCHAR(100), + manager_id INT +); + +# Simple recursive CTE using a real table. Select everything from empty table +with recursive cte as (select * from employees union all select * from cte) +select * +from cte; + +# Insert data into the tables +INSERT INTO employees (id, name, manager_id) +VALUES (1, 'CEO', NULL), + (2, 'CTO', 1), + (3, 'CFO', 1), + (4, 'Engineer1', 2), + (5, 'Engineer2', 2), + (6, 'Accountant1', 3), + (7, 'Accountant2', 3); + +# Simple recursive CTE using literal values +WITH RECURSIVE numbers AS (SELECT 1 AS n + UNION ALL + SELECT n + 1 + FROM numbers + WHERE n < 5) +SELECT * +FROM numbers; + +# Recursive CTE joined with a normal table +WITH RECURSIVE emp_cte AS (SELECT id, name, manager_id + FROM employees + WHERE manager_id IS NULL + UNION ALL + SELECT e.id, e.name, e.manager_id + FROM employees e + INNER JOIN emp_cte cte ON e.manager_id = cte.id) +SELECT * +FROM emp_cte; + +# Recursive CTE used in a derived table outside the CTE definition +WITH RECURSIVE emp_cte AS (SELECT id, name, manager_id + FROM employees + WHERE manager_id IS NULL + UNION ALL + SELECT e.id, e.name, e.manager_id + FROM employees e + INNER JOIN emp_cte cte ON e.manager_id = cte.id) +SELECT derived.id, derived.name, derived.manager_id +FROM (SELECT * FROM emp_cte) AS derived; + +# Recursive CTE with additional computation +WITH RECURSIVE emp_cte AS (SELECT id, name, manager_id, 1 AS level + FROM employees + WHERE manager_id IS NULL + UNION ALL + SELECT e.id, e.name, e.manager_id, cte.level + 1 + FROM employees e + INNER JOIN emp_cte cte ON e.manager_id = cte.id) +SELECT * +FROM emp_cte; + +# Recursive CTE with filtering in the recursive part +WITH RECURSIVE emp_cte AS (SELECT id, name, manager_id + FROM employees + WHERE manager_id IS NULL + UNION ALL + SELECT e.id, e.name, e.manager_id + FROM employees e + INNER JOIN emp_cte cte ON e.manager_id = cte.id + WHERE e.name LIKE 'Engineer%') +SELECT * +FROM emp_cte; + +# Recursive CTE with limit +WITH RECURSIVE emp_cte AS (SELECT id, name, manager_id + FROM employees + WHERE manager_id IS NULL + UNION ALL + SELECT e.id, e.name, e.manager_id + FROM employees e + INNER JOIN emp_cte cte ON e.manager_id = cte.id) +SELECT * +FROM emp_cte +LIMIT 5; + +# Recursive CTE using literal values and joined with a real table on the outside +WITH RECURSIVE literal_cte AS (SELECT 1 AS id, 100 AS value, 1 AS manager_id + UNION ALL + SELECT id + 1, value * 2, id + FROM literal_cte + WHERE id < 5) +SELECT l.id, l.value, l.manager_id, e.name AS employee_name +FROM literal_cte l + LEFT JOIN employees e ON l.id = e.id; + +# Recursive CTE with aggregation outside the CTE +WITH RECURSIVE emp_cte AS (SELECT id, name, manager_id + FROM employees + WHERE manager_id IS NULL + UNION ALL + SELECT e.id, e.name, e.manager_id + FROM employees e + INNER JOIN emp_cte cte ON e.manager_id = cte.id) +SELECT manager_id, COUNT(*) AS employee_count +FROM emp_cte +GROUP BY manager_id; + +--error infinite recursion +with recursive cte as (select 1 as n union all select n+1 from cte) +select * +from cte; + +# Define recursive CTE and then use it on the RHS of UNION +WITH RECURSIVE foo AS (SELECT id + FROM employees + WHERE id = 1 + UNION ALL + SELECT id + 1 + FROM foo + WHERE id < 5) +SELECT id +FROM foo; + +# Recursive CTE with UNION DISTINCT +WITH RECURSIVE hierarchy AS (SELECT id, name, manager_id + FROM employees + UNION ALL + SELECT id, name, manager_id + FROM employees + UNION + DISTINCT + SELECT id * 2, name, manager_id + from hierarchy + WHERE id < 10) +SELECT * +FROM hierarchy; + +# Select with false condition +with recursive cte as (select * from employees where false union all select * from cte) +select * +from cte; + +# Select with no matching rows +with recursive cte as (select * from employees where id > 100 union all select * from cte) +select * +from cte; + +# Recursive CTE joined with a normal table. Predicate on the outside should not be pushed in +WITH RECURSIVE emp_cte AS (SELECT id, name, manager_id + FROM employees + WHERE manager_id IS NULL + UNION ALL + SELECT e.id, e.name, e.manager_id + FROM employees e + INNER JOIN emp_cte cte ON e.manager_id = cte.id) +SELECT * +FROM emp_cte +where name = 'Engineer1'; + +# Query with a recursive CTE in a subquery +SELECT * +FROM (SELECT 1 UNION ALL SELECT 2) AS dt(a) +WHERE EXISTS(WITH RECURSIVE qn AS (SELECT a * 0 AS b UNION ALL SELECT b + 1 FROM qn WHERE b = 0) + SELECT * + FROM qn + WHERE b = a); + +# Join with recursive CTE inside a derived table using data from DUAL +SELECT e.id, e.name, e.manager_id, d.id AS cte_id +FROM employees e + JOIN (WITH RECURSIVE foo AS (SELECT 1 AS id + UNION ALL + SELECT id + 1 + FROM foo + WHERE id < 5) + SELECT id + FROM foo) d ON e.id = d.id; + +# Join with recursive CTE inside a derived table using data from employees table +SELECT e.id, e.name, e.manager_id, d.id AS cte_id +FROM employees e + JOIN (WITH RECURSIVE foo AS (SELECT id + FROM employees + WHERE manager_id IS NULL + UNION ALL + SELECT e.id + FROM employees e + JOIN foo f ON e.manager_id = f.id) + SELECT id + FROM foo) d ON e.id = d.id; + +# Recursive CTE within an uncorrelated subquery as a select expression +SELECT e.id, + e.name, + e.manager_id, + (SELECT MAX(cte_id) + FROM (WITH RECURSIVE foo AS (SELECT 1 AS cte_id + UNION ALL + SELECT cte_id + 1 + FROM foo + WHERE cte_id < e.id) + SELECT cte_id + FROM foo) AS recursive_result) AS max_cte_id +FROM employees e; + +# Recursive CTE used twice in the same query +WITH RECURSIVE employee_hierarchy AS (SELECT id, name, manager_id, 1 AS level + FROM employees + WHERE manager_id IS NULL + UNION ALL + SELECT e.id, e.name, e.manager_id, h.level + 1 + FROM employees e + JOIN employee_hierarchy h ON e.manager_id = h.id) +SELECT h1.id AS employee_id, + h1.name AS employee_name, + h1.level AS employee_level, + h2.name AS manager_name, + h2.level AS manager_level +FROM employee_hierarchy h1 + LEFT JOIN + employee_hierarchy h2 ON h1.manager_id = h2.id +ORDER BY h1.level, h1.id; \ No newline at end of file diff --git a/go/test/endtoend/vtgate/vitess_tester/dual/queries.test b/go/test/endtoend/vtgate/vitess_tester/dual/queries.test new file mode 100644 index 00000000000..77a6e1595e0 --- /dev/null +++ b/go/test/endtoend/vtgate/vitess_tester/dual/queries.test @@ -0,0 +1,4 @@ +# file with tests that only use the dual table + +# Dual query that is using tilda operator in a complex expression +SELECT 1 WHERE (~ (1||0)) IS NULL; diff --git a/go/test/endtoend/vtgate/vitess_tester/expressions/expressions.test b/go/test/endtoend/vtgate/vitess_tester/expressions/expressions.test new file mode 100644 index 00000000000..60c1e641463 --- /dev/null +++ b/go/test/endtoend/vtgate/vitess_tester/expressions/expressions.test @@ -0,0 +1,30 @@ +# This file contains queries that test expressions in Vitess. +# We've found a number of bugs around precedences that we want to test. +CREATE TABLE t0 +( + c1 BIT, + INDEX idx_c1 (c1) +); + +INSERT INTO t0(c1) +VALUES (''); + + +SELECT * +FROM t0; + +SELECT ((t0.c1 = 'a')) +FROM t0; + +SELECT * +FROM t0 +WHERE ((t0.c1 = 'a')); + + +SELECT (1 LIKE ('a' IS NULL)); +SELECT (NOT (1 LIKE ('a' IS NULL))); + +SELECT (~ (1 || 0)) IS NULL; + +SELECT 1 +WHERE (~ (1 || 0)) IS NULL; diff --git a/go/test/endtoend/vtgate/vitess_tester/join/join.test b/go/test/endtoend/vtgate/vitess_tester/join/join.test index cffd3a1b3aa..e550145f8d5 100644 --- a/go/test/endtoend/vtgate/vitess_tester/join/join.test +++ b/go/test/endtoend/vtgate/vitess_tester/join/join.test @@ -25,6 +25,15 @@ CREATE TABLE `t3` CHARSET utf8mb4, COLLATE utf8mb4_unicode_ci; +CREATE TABLE `t4` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `col` int unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE InnoDB, + CHARSET utf8mb4, + COLLATE utf8mb4_unicode_ci; + insert into t1 (id, name) values (1, 'A'), (2, 'B'), @@ -43,7 +52,27 @@ values (1, 'A'), (4, 'B'), (5, 'B'); +insert into t4 (id, col) +values (1, 1), + (2, 2), + (3, 3); + -- wait_authoritative t1 -- wait_authoritative t2 -- wait_authoritative t3 -select 42 from t1 join t2 on t1.id = t2.t1_id join t3 on t1.id = t3.id where t1.name or t2.id or t3.name; +select 42 +from t1 + join t2 on t1.id = t2.t1_id + join t3 on t1.id = t3.id +where t1.name + or t2.id + or t3.name; + +# Complex query that requires hash join underneath a memory sort and ordered aggregate +select 1 +from t1 + join t2 on t1.id = t2.t1_id + join t4 on t4.col = t2.id + left join (select t4.col, count(*) as count from t4 group by t4.col) t3 on t3.col = t2.id +where t1.id IN (1, 2) +group by t2.id, t4.col; diff --git a/go/test/endtoend/vtgate/vitess_tester/join/vschema.json b/go/test/endtoend/vtgate/vitess_tester/join/vschema.json index b922d3f760c..1105b951e61 100644 --- a/go/test/endtoend/vtgate/vitess_tester/join/vschema.json +++ b/go/test/endtoend/vtgate/vitess_tester/join/vschema.json @@ -31,6 +31,14 @@ "name": "hash" } ] + }, + "t4": { + "column_vindexes": [ + { + "column": "id", + "name": "hash" + } + ] } } } diff --git a/go/test/endtoend/vtgate/vitess_tester/subquery/subquery.test b/go/test/endtoend/vtgate/vitess_tester/subquery/subquery.test new file mode 100644 index 00000000000..8f86f2a2cf1 --- /dev/null +++ b/go/test/endtoend/vtgate/vitess_tester/subquery/subquery.test @@ -0,0 +1,42 @@ +create table t1 +( + id1 bigint, + id2 bigint, + primary key (id1) +) Engine = InnoDB; + +create table t2 +( + id3 bigint, + id4 bigint, + primary key (id3) +) Engine = InnoDB; + +INSERT INTO t1 (id1, id2) VALUES +(0, 0), +(1, 1), +(2, 2), +(3, 3), +(4, 4); + +INSERT INTO t2 (id3, id4) VALUES +(0, 0), +(1, 1); + +# Aggregation query with multiple expressions one of which is an IN subquery. +SELECT count(*) FROM t1 WHERE id1 = 0 AND id1 IN (SELECT id4 FROM t2); +# Aggregation query with a complex expression that has an IN subquery. +SELECT count(*) FROM t1 WHERE id1 = 2 OR id1 IN (SELECT id4 FROM t2); +# Aggregation query with multiple expressions one of which is an IN subquery that returns empty results. +SELECT count(*) FROM t1 WHERE id1 = 0 AND id1 IN (SELECT id4 FROM t2 where id4 = 3); +# Aggregation query with a complex expression that has an IN subquery that returns empty results. +SELECT count(*) FROM t1 WHERE id1 = 2 OR id1 IN (SELECT id4 FROM t2 where id4 = 3); + +# Aggregation query with multiple expressions one of which is an NOT IN subquery. +SELECT count(*) FROM t1 WHERE id1 = 2 AND id1 NOT IN (SELECT id4 FROM t2); +# Aggregation query with a complex expression that has an NOT IN subquery. +SELECT count(*) FROM t1 WHERE id1 = 0 OR id1 NOT IN (SELECT id4 FROM t2); +# Aggregation query with multiple expressions one of which is an NOT IN subquery that returns empty results. +SELECT count(*) FROM t1 WHERE id1 = 2 AND id1 NOT IN (SELECT id4 FROM t2 where id4 = 3); +# Aggregation query with a complex expression that has an NOT IN subquery that returns empty results. +SELECT count(*) FROM t1 WHERE id1 = 0 OR id1 NOT IN (SELECT id4 FROM t2 where id4 = 3); \ No newline at end of file diff --git a/go/test/endtoend/vtgate/vitess_tester/two_sharded_keyspaces/queries.test b/go/test/endtoend/vtgate/vitess_tester/two_sharded_keyspaces/queries.test new file mode 100644 index 00000000000..28c55e559c9 --- /dev/null +++ b/go/test/endtoend/vtgate/vitess_tester/two_sharded_keyspaces/queries.test @@ -0,0 +1,39 @@ +use customer; +create table if not exists customer +( + customer_id bigint not null, + email varbinary(128), + primary key (customer_id) +) ENGINE = InnoDB; + +insert into customer.customer(customer_id, email) +values (1, '[alice@domain.com](mailto:alice@domain.com)'), + (2, '[bob@domain.com](mailto:bob@domain.com)'), + (3, '[charlie@domain.com](mailto:charlie@domain.com)'), + (4, '[dan@domain.com](mailto:dan@domain.com)'), + (5, '[eve@domain.com](mailto:eve@domain.com)'); +use corder; +create table if not exists corder +( + order_id bigint not null, + customer_id bigint, + sku varbinary(128), + price bigint, + primary key (order_id) +) ENGINE = InnoDB; +insert into corder.corder(order_id, customer_id, sku, price) +values (1, 1, 'SKU-1001', 100), + (2, 2, 'SKU-1002', 30), + (3, 3, 'SKU-1002', 30), + (4, 4, 'SKU-1002', 30), + (5, 5, 'SKU-1002', 30); + +select co.order_id, co.customer_id, co.price +from corder.corder co + left join customer.customer cu on co.customer_id = cu.customer_id +where cu.customer_id = 1; + +# This query was accidentally disallowed by https://github.com/vitessio/vitess/pull/16520 +select 1 +from customer.customer +where customer_id in (select customer_id from corder.corder where price > 50); \ No newline at end of file diff --git a/go/test/endtoend/vtgate/vitess_tester/two_sharded_keyspaces/vschema.json b/go/test/endtoend/vtgate/vitess_tester/two_sharded_keyspaces/vschema.json new file mode 100644 index 00000000000..5672042bace --- /dev/null +++ b/go/test/endtoend/vtgate/vitess_tester/two_sharded_keyspaces/vschema.json @@ -0,0 +1,72 @@ +{ + "keyspaces": { + "customer": { + "sharded": true, + "vindexes": { + "hash": { + "type": "hash", + "params": {}, + "owner": "" + } + }, + "tables": { + "customer": { + "type": "", + "column_vindexes": [ + { + "column": "customer_id", + "name": "hash", + "columns": [] + } + ], + "columns": [], + "pinned": "", + "column_list_authoritative": false, + "source": "" + } + }, + "require_explicit_routing": false, + "foreign_key_mode": 0, + "multi_tenant_spec": null + }, + "corder": { + "sharded": true, + "vindexes": { + "hash": { + "type": "hash", + "params": {}, + "owner": "" + } + }, + "tables": { + "corder": { + "type": "", + "column_vindexes": [ + { + "column": "customer_id", + "name": "hash", + "columns": [] + } + ], + "columns": [], + "pinned": "", + "column_list_authoritative": false, + "source": "" + } + }, + "require_explicit_routing": false, + "foreign_key_mode": 0, + "multi_tenant_spec": null + } + }, + "routing_rules": { + "rules": [] + }, + "shard_routing_rules": { + "rules": [] + }, + "keyspace_routing_rules": null, + "mirror_rules": { + "rules": [] + } +} \ No newline at end of file diff --git a/go/test/endtoend/vtgate/vschema/vschema_test.go b/go/test/endtoend/vtgate/vschema/vschema_test.go index 92863ff7dc8..eec54f8f47f 100644 --- a/go/test/endtoend/vtgate/vschema/vschema_test.go +++ b/go/test/endtoend/vtgate/vschema/vschema_test.go @@ -110,16 +110,7 @@ func TestVSchema(t *testing.T) { `[[INT64(1) VARCHAR("test1")] [INT64(2) VARCHAR("test2")] [INT64(3) VARCHAR("test3")] [INT64(4) VARCHAR("test4")]]`) utils.AssertMatches(t, conn, "delete from vt_user", `[]`) - - vtgateVersion, err := cluster.GetMajorVersion("vtgate") - require.NoError(t, err) - - // Test empty vschema - if vtgateVersion >= 17 { - utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[]`) - } else { - utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("dual")]]`) - } + utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[]`) // Use the DDL to create an unsharded vschema and test again @@ -135,11 +126,7 @@ func TestVSchema(t *testing.T) { utils.Exec(t, conn, "commit") // Test Showing Tables - if vtgateVersion >= 17 { - utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("main")] [VARCHAR("vt_user")]]`) - } else { - utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("dual")] [VARCHAR("main")] [VARCHAR("vt_user")]]`) - } + utils.AssertMatches(t, conn, "SHOW VSCHEMA TABLES", `[[VARCHAR("main")] [VARCHAR("vt_user")]]`) // Test Showing Vindexes utils.AssertMatches(t, conn, "SHOW VSCHEMA VINDEXES", `[]`) diff --git a/go/test/endtoend/vtorc/api/api_test.go b/go/test/endtoend/vtorc/api/api_test.go index 174ee5ea914..670e8c803fa 100644 --- a/go/test/endtoend/vtorc/api/api_test.go +++ b/go/test/endtoend/vtorc/api/api_test.go @@ -268,11 +268,13 @@ func TestAPIEndpoints(t *testing.T) { assert.Equal(t, "Filtering by shard without keyspace isn't supported\n", resp) // Also verify that the metric for errant GTIDs is reporting the correct count. - waitForErrantGTIDCount(t, vtorc, 1) + waitForErrantGTIDTabletCount(t, vtorc, 1) + // Now we check the errant GTID count for the tablet + verifyErrantGTIDCount(t, vtorc, replica.Alias, 1) }) } -func waitForErrantGTIDCount(t *testing.T, vtorc *cluster.VTOrcProcess, errantGTIDCountWanted int) { +func waitForErrantGTIDTabletCount(t *testing.T, vtorc *cluster.VTOrcProcess, errantGTIDCountWanted int) { timeout := time.After(15 * time.Second) for { select { @@ -293,3 +295,12 @@ func waitForErrantGTIDCount(t *testing.T, vtorc *cluster.VTOrcProcess, errantGTI } } } + +func verifyErrantGTIDCount(t *testing.T, vtorc *cluster.VTOrcProcess, tabletAlias string, countWanted int) { + vars := vtorc.GetVars() + errantGTIDCounts := vars["CurrentErrantGTIDCount"].(map[string]interface{}) + gtidCountVal, isPresent := errantGTIDCounts[tabletAlias] + require.True(t, isPresent, "Tablet %s not found in errant GTID counts", tabletAlias) + gtidCount := utils.GetIntFromValue(gtidCountVal) + require.EqualValues(t, countWanted, gtidCount, "Tablet %s has %d errant GTIDs, wanted %d", tabletAlias, gtidCount, countWanted) +} diff --git a/go/test/endtoend/vtorc/general/vtorc_test.go b/go/test/endtoend/vtorc/general/vtorc_test.go index 88cd7b65d63..329601deb0c 100644 --- a/go/test/endtoend/vtorc/general/vtorc_test.go +++ b/go/test/endtoend/vtorc/general/vtorc_test.go @@ -492,6 +492,46 @@ func TestMultipleDurabilities(t *testing.T) { assert.NotNil(t, primary, "should have elected a primary") } +// TestDrainedTablet tests that we don't forget drained tablets and they still show up in the vtorc output. +func TestDrainedTablet(t *testing.T) { + defer utils.PrintVTOrcLogsOnFailure(t, clusterInfo.ClusterInstance) + defer cluster.PanicHandler(t) + + // Setup a normal cluster and start vtorc + utils.SetupVttabletsAndVTOrcs(t, clusterInfo, 2, 0, nil, cluster.VTOrcConfiguration{}, 1, "") + keyspace := &clusterInfo.ClusterInstance.Keyspaces[0] + shard0 := &keyspace.Shards[0] + + // find primary from topo + curPrimary := utils.ShardPrimaryTablet(t, clusterInfo, keyspace, shard0) + assert.NotNil(t, curPrimary, "should have elected a primary") + vtOrcProcess := clusterInfo.ClusterInstance.VTOrcProcesses[0] + + // find any replica tablet other than the current primary + var replica *cluster.Vttablet + for _, tablet := range shard0.Vttablets { + if tablet.Alias != curPrimary.Alias { + replica = tablet + break + } + } + require.NotNil(t, replica, "could not find any replica tablet") + + output, err := clusterInfo.ClusterInstance.VtctldClientProcess.ExecuteCommandWithOutput( + "ChangeTabletType", replica.Alias, "DRAINED") + require.NoError(t, err, "error in changing tablet type output - %s", output) + + // Make sure VTOrc sees the drained tablets and doesn't forget them. + utils.WaitForDrainedTabletInVTOrc(t, vtOrcProcess, 1) + + output, err = clusterInfo.ClusterInstance.VtctldClientProcess.ExecuteCommandWithOutput( + "ChangeTabletType", replica.Alias, "REPLICA") + require.NoError(t, err, "error in changing tablet type output - %s", output) + + // We have no drained tablets anymore. Wait for VTOrc to have processed that. + utils.WaitForDrainedTabletInVTOrc(t, vtOrcProcess, 0) +} + // TestDurabilityPolicySetLater tests that VTOrc works even if the durability policy of the keyspace is // set after VTOrc has been started. func TestDurabilityPolicySetLater(t *testing.T) { diff --git a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go index 98bf16ec596..fa8dc116782 100644 --- a/go/test/endtoend/vtorc/readtopologyinstance/main_test.go +++ b/go/test/endtoend/vtorc/readtopologyinstance/main_test.go @@ -78,7 +78,7 @@ func TestReadTopologyInstanceBufferable(t *testing.T) { assert.Contains(t, primaryInstance.InstanceAlias, "zone1") assert.NotEqual(t, 0, primaryInstance.ServerID) assert.Greater(t, len(primaryInstance.ServerUUID), 10) - assert.Regexp(t, "[58].[70].*", primaryInstance.Version) + assert.Regexp(t, "[58].[704].*", primaryInstance.Version) assert.NotEmpty(t, primaryInstance.VersionComment) assert.False(t, primaryInstance.ReadOnly) assert.True(t, primaryInstance.LogBinEnabled) @@ -128,7 +128,7 @@ func TestReadTopologyInstanceBufferable(t *testing.T) { assert.Contains(t, replicaInstance.InstanceAlias, "zone1") assert.NotEqual(t, 0, replicaInstance.ServerID) assert.Greater(t, len(replicaInstance.ServerUUID), 10) - assert.Regexp(t, "[58].[70].*", replicaInstance.Version) + assert.Regexp(t, "[58].[704].*", replicaInstance.Version) assert.NotEmpty(t, replicaInstance.VersionComment) assert.True(t, replicaInstance.ReadOnly) assert.True(t, replicaInstance.LogBinEnabled) diff --git a/go/test/endtoend/vtorc/utils/utils.go b/go/test/endtoend/vtorc/utils/utils.go index 63500377f47..680d1bfa39a 100644 --- a/go/test/endtoend/vtorc/utils/utils.go +++ b/go/test/endtoend/vtorc/utils/utils.go @@ -998,7 +998,7 @@ func WaitForSuccessfulRecoveryCount(t *testing.T, vtorcInstance *cluster.VTOrcPr for time.Since(startTime) < timeout { vars := vtorcInstance.GetVars() successfulRecoveriesMap := vars["SuccessfulRecoveries"].(map[string]interface{}) - successCount := getIntFromValue(successfulRecoveriesMap[recoveryName]) + successCount := GetIntFromValue(successfulRecoveriesMap[recoveryName]) if successCount == countExpected { return } @@ -1006,7 +1006,7 @@ func WaitForSuccessfulRecoveryCount(t *testing.T, vtorcInstance *cluster.VTOrcPr } vars := vtorcInstance.GetVars() successfulRecoveriesMap := vars["SuccessfulRecoveries"].(map[string]interface{}) - successCount := getIntFromValue(successfulRecoveriesMap[recoveryName]) + successCount := GetIntFromValue(successfulRecoveriesMap[recoveryName]) assert.EqualValues(t, countExpected, successCount) } @@ -1019,7 +1019,7 @@ func WaitForSuccessfulPRSCount(t *testing.T, vtorcInstance *cluster.VTOrcProcess for time.Since(startTime) < timeout { vars := vtorcInstance.GetVars() prsCountsMap := vars["PlannedReparentCounts"].(map[string]interface{}) - successCount := getIntFromValue(prsCountsMap[mapKey]) + successCount := GetIntFromValue(prsCountsMap[mapKey]) if successCount == countExpected { return } @@ -1027,7 +1027,7 @@ func WaitForSuccessfulPRSCount(t *testing.T, vtorcInstance *cluster.VTOrcProcess } vars := vtorcInstance.GetVars() prsCountsMap := vars["PlannedReparentCounts"].(map[string]interface{}) - successCount := getIntFromValue(prsCountsMap[mapKey]) + successCount := GetIntFromValue(prsCountsMap[mapKey]) assert.EqualValues(t, countExpected, successCount) } @@ -1040,7 +1040,7 @@ func WaitForSuccessfulERSCount(t *testing.T, vtorcInstance *cluster.VTOrcProcess for time.Since(startTime) < timeout { vars := vtorcInstance.GetVars() ersCountsMap := vars["EmergencyReparentCounts"].(map[string]interface{}) - successCount := getIntFromValue(ersCountsMap[mapKey]) + successCount := GetIntFromValue(ersCountsMap[mapKey]) if successCount == countExpected { return } @@ -1048,7 +1048,7 @@ func WaitForSuccessfulERSCount(t *testing.T, vtorcInstance *cluster.VTOrcProcess } vars := vtorcInstance.GetVars() ersCountsMap := vars["EmergencyReparentCounts"].(map[string]interface{}) - successCount := getIntFromValue(ersCountsMap[mapKey]) + successCount := GetIntFromValue(ersCountsMap[mapKey]) assert.EqualValues(t, countExpected, successCount) } @@ -1067,10 +1067,10 @@ func CheckMetricExists(t *testing.T, vtorcInstance *cluster.VTOrcProcess, metric assert.Contains(t, metrics, metricName) } -// getIntFromValue is a helper function to get an integer from the given value. +// GetIntFromValue is a helper function to get an integer from the given value. // If it is convertible to a float, then we round the number to the nearest integer. // If the value is not numeric at all, we return 0. -func getIntFromValue(val any) int { +func GetIntFromValue(val any) int { value := reflect.ValueOf(val) if value.CanFloat() { return int(math.Round(value.Float())) @@ -1091,7 +1091,7 @@ func WaitForDetectedProblems(t *testing.T, vtorcInstance *cluster.VTOrcProcess, for time.Since(startTime) < timeout { vars := vtorcInstance.GetVars() problems := vars["DetectedProblems"].(map[string]interface{}) - actual := getIntFromValue(problems[key]) + actual := GetIntFromValue(problems[key]) if actual == expect { return } @@ -1101,7 +1101,7 @@ func WaitForDetectedProblems(t *testing.T, vtorcInstance *cluster.VTOrcProcess, vars := vtorcInstance.GetVars() problems := vars["DetectedProblems"].(map[string]interface{}) actual, ok := problems[key] - actual = getIntFromValue(actual) + actual = GetIntFromValue(actual) assert.True(t, ok, "The metric DetectedProblems[%s] should exist but does not (all problems: %+v)", @@ -1204,3 +1204,29 @@ func SemiSyncExtensionLoaded(t *testing.T, tablet *cluster.Vttablet) (mysql.Semi return conn.SemiSyncExtensionLoaded() } + +// WaitForDrainedTabletInVTOrc waits for VTOrc to see the specified number of drained tablet. +func WaitForDrainedTabletInVTOrc(t *testing.T, vtorcInstance *cluster.VTOrcProcess, count int) { + t.Helper() + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + t.Errorf("timed out waiting for drained tablet in VTOrc") + return + case <-ticker.C: + statusCode, res, err := vtorcInstance.MakeAPICall("api/database-state") + if err != nil || statusCode != 200 { + continue + } + found := strings.Count(res, fmt.Sprintf(`"tablet_type": "%d"`, topodatapb.TabletType_DRAINED)) + if found == count { + return + } + } + } +} diff --git a/go/test/vschemawrapper/vschema_wrapper.go b/go/test/vschemawrapper/vschema_wrapper.go index 4d1c424dda8..a1b87f5569c 100644 --- a/go/test/vschemawrapper/vschema_wrapper.go +++ b/go/test/vschemawrapper/vschema_wrapper.go @@ -213,7 +213,6 @@ func (vw *VSchemaWrapper) TargetDestination(qualifier string) (key.Destination, return nil, nil, 0, vterrors.VT05003(keyspaceName) } return vw.Dest, keyspace.Keyspace, vw.TabletType_, nil - } func (vw *VSchemaWrapper) TabletType() topodatapb.TabletType { @@ -317,7 +316,6 @@ func (vw *VSchemaWrapper) TargetString() string { } func (vw *VSchemaWrapper) WarnUnshardedOnly(_ string, _ ...any) { - } func (vw *VSchemaWrapper) ErrorIfShardedF(keyspace *vindexes.Keyspace, _, errFmt string, params ...any) error { @@ -342,3 +340,17 @@ func (vw *VSchemaWrapper) FindRoutedShard(keyspace, shard string) (string, error func (vw *VSchemaWrapper) IsViewsEnabled() bool { return vw.EnableViews } + +// FindMirrorRule finds the mirror rule for the requested keyspace, table +// name, and the tablet type in the VSchema. +func (vs *VSchemaWrapper) FindMirrorRule(tab sqlparser.TableName) (*vindexes.MirrorRule, error) { + destKeyspace, destTabletType, _, err := topoproto.ParseDestination(tab.Qualifier.String(), topodatapb.TabletType_PRIMARY) + if err != nil { + return nil, err + } + mirrorRule, err := vs.V.FindMirrorRule(destKeyspace, tab.Name.String(), destTabletType) + if err != nil { + return nil, err + } + return mirrorRule, err +} diff --git a/go/textutil/strings.go b/go/textutil/strings.go index 616366f0083..2a923cd3259 100644 --- a/go/textutil/strings.go +++ b/go/textutil/strings.go @@ -25,7 +25,6 @@ import ( "vitess.io/vitess/go/sqltypes" - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) @@ -37,10 +36,10 @@ const ( ) var ( - delimitedListRegexp = regexp.MustCompile(`[ ,;]+`) - SimulatedNullString = sqltypes.NULL.String() - SimulatedNullStringSlice = []string{sqltypes.NULL.String()} - SimulatedNullInt = -1 + delimitedListRegexp = regexp.MustCompile(`[ ,;]+`) + SimulatedNullStringSlice = []string{sqltypes.NULL.String()} + SimulatedNullTabletTypeSlice = []topodatapb.TabletType{topodatapb.TabletType(SimulatedNullInt)} + SimulatedNullInt = -1 ) // SplitDelimitedList splits a given string by comma, semi-colon or space, and returns non-empty strings @@ -91,29 +90,16 @@ func SingleWordCamel(w string) string { return strings.ToUpper(w[0:1]) + strings.ToLower(w[1:]) } -// ValueIsSimulatedNull returns true if the value represents -// a NULL or unknown/unspecified value. This is used to -// distinguish between a zero value / default and a user -// provided value that is equivalent (e.g. an empty string -// or slice). +// ValueIsSimulatedNull returns true if the slice value represents +// a NULL or unknown/unspecified value. This is used to distinguish +// between a zero value empty slice and a user provided value of an +// empty slice. func ValueIsSimulatedNull(val any) bool { switch cval := val.(type) { - case string: - return cval == SimulatedNullString case []string: return len(cval) == 1 && cval[0] == sqltypes.NULL.String() - case binlogdatapb.OnDDLAction: - return int32(cval) == int32(SimulatedNullInt) - case int: - return cval == SimulatedNullInt - case int32: - return int32(cval) == int32(SimulatedNullInt) - case int64: - return int64(cval) == int64(SimulatedNullInt) case []topodatapb.TabletType: return len(cval) == 1 && cval[0] == topodatapb.TabletType(SimulatedNullInt) - case binlogdatapb.VReplicationWorkflowState: - return int32(cval) == int32(SimulatedNullInt) default: return false } diff --git a/go/textutil/strings_test.go b/go/textutil/strings_test.go index 2ba9851b71c..d65c187c4cb 100644 --- a/go/textutil/strings_test.go +++ b/go/textutil/strings_test.go @@ -23,6 +23,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/sqltypes" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) @@ -131,40 +133,25 @@ func TestValueIsSimulatedNull(t *testing.T) { val: "test", isNull: false, }, - { - name: "case string true", - val: SimulatedNullString, - isNull: true, - }, { name: "case []string true", - val: []string{SimulatedNullString}, + val: []string{sqltypes.NULL.String()}, isNull: true, }, { name: "case []string false", - val: []string{SimulatedNullString, SimulatedNullString}, + val: []string{sqltypes.NULL.String(), sqltypes.NULL.String()}, isNull: false, }, { - name: "case binlogdatapb.OnDDLAction true", - val: binlogdatapb.OnDDLAction(SimulatedNullInt), - isNull: true, - }, - { - name: "case int true", - val: SimulatedNullInt, - isNull: true, - }, - { - name: "case int32 true", - val: int32(SimulatedNullInt), - isNull: true, + name: "case binlogdatapb.OnDDLAction exec", + val: binlogdatapb.OnDDLAction_EXEC, + isNull: false, }, { - name: "case int64 true", - val: int64(SimulatedNullInt), - isNull: true, + name: "case int false", + val: 1, + isNull: false, }, { name: "case []topodatapb.TabletType true", @@ -172,12 +159,12 @@ func TestValueIsSimulatedNull(t *testing.T) { isNull: true, }, { - name: "case binlogdatapb.VReplicationWorkflowState true", - val: binlogdatapb.VReplicationWorkflowState(SimulatedNullInt), - isNull: true, + name: "case binlogdatapb.VReplicationWorkflowState running", + val: binlogdatapb.VReplicationWorkflowState_Running, + isNull: false, }, { - name: "case default", + name: "case float false", val: float64(1), isNull: false, }, diff --git a/go/tools/go-upgrade/go-upgrade.go b/go/tools/go-upgrade/go-upgrade.go index 34543120202..3ca5f4aeb8b 100644 --- a/go/tools/go-upgrade/go-upgrade.go +++ b/go/tools/go-upgrade/go-upgrade.go @@ -63,10 +63,6 @@ const ( // to match the entire flag name + the default value (being the current bootstrap version) // Example input: "flag.String("bootstrap-version", "20", "the version identifier to use for the docker images")" regexpReplaceTestGoBootstrapVersion = `\"bootstrap-version\",[[:space:]]*\"([0-9.]+)\"` - - // regexpReplaceGolangVersionInWorkflow matches the golang version increment in the string `go-version: 1.20.5` - // which is used to replace the golang version we use inside our workflows - regexpReplaceGolangVersionInWorkflow = `go-version:[[:space:]]*([0-9.]+).*` ) type ( @@ -81,7 +77,6 @@ type ( ) var ( - workflowUpdate = true allowMajorUpgrade = false isMainBranch = false goTo = "" @@ -137,22 +132,11 @@ The latest available version of Golang will be fetched and used instead of the o By default, we do not allow major Golang version upgrade such as 1.20 to 1.21 but this can be overridden using the --allow-major-upgrade CLI flag. Usually, we only allow such upgrade on the main branch of the repository. -In CI, particularly, we do not want to modify the workflow files before automatically creating a Pull Request to -avoid permission issues. The rewrite of workflow files can be disabled using the --workflow-update=false CLI flag. - Moreover, this command automatically bumps the bootstrap version of our codebase. If we are on the main branch, we want to use the CLI flag --main to remember to increment the bootstrap version by 1 instead of 0.1.`, Run: runUpgradeCmd, Args: cobra.NoArgs, } - - upgradeWorkflowsCmd = &cobra.Command{ - Use: "workflows", - Short: "workflows will upgrade the Golang version used in our CI workflows files.", - Long: "This step is omitted by the bot since. We let the maintainers of Vitess manually upgrade the version used by the workflows using this command.", - Run: runUpgradeWorkflowsCmd, - Args: cobra.NoArgs, - } ) func init() { @@ -162,13 +146,8 @@ func init() { getCmd.AddCommand(getGoCmd) getCmd.AddCommand(getBootstrapCmd) - upgradeCmd.AddCommand(upgradeWorkflowsCmd) - - upgradeCmd.Flags().BoolVar(&workflowUpdate, "workflow-update", workflowUpdate, "Whether or not the workflow files should be updated. Useful when using this script to auto-create PRs.") upgradeCmd.Flags().BoolVar(&allowMajorUpgrade, "allow-major-upgrade", allowMajorUpgrade, "Defines if Golang major version upgrade are allowed.") upgradeCmd.Flags().BoolVar(&isMainBranch, "main", isMainBranch, "Defines if the current branch is the main branch.") - - upgradeWorkflowsCmd.Flags().StringVar(&goTo, "go-to", goTo, "The Golang version we want to upgrade to.") } func main() { @@ -191,44 +170,14 @@ func runGetBootstrapCmd(_ *cobra.Command, _ []string) { fmt.Println(currentVersion.toString()) } -func runUpgradeWorkflowsCmd(_ *cobra.Command, _ []string) { - err := updateWorkflowFilesOnly(goTo) - if err != nil { - log.Fatal(err) - } -} - func runUpgradeCmd(_ *cobra.Command, _ []string) { - err := upgradePath(allowMajorUpgrade, workflowUpdate, isMainBranch) + err := upgradePath(allowMajorUpgrade, isMainBranch) if err != nil { log.Fatal(err) } } -func updateWorkflowFilesOnly(goTo string) error { - newV, err := version.NewVersion(goTo) - if err != nil { - return err - } - filesToChange, err := getListOfFilesInPaths([]string{"./.github/workflows"}) - if err != nil { - return err - } - - for _, fileToChange := range filesToChange { - err = replaceInFile( - []*regexp.Regexp{regexp.MustCompile(regexpReplaceGolangVersionInWorkflow)}, - []string{"go-version: " + newV.String()}, - fileToChange, - ) - if err != nil { - return err - } - } - return nil -} - -func upgradePath(allowMajorUpgrade, workflowUpdate, isMainBranch bool) error { +func upgradePath(allowMajorUpgrade, isMainBranch bool) error { currentVersion, err := currentGolangVersion() if err != nil { return err @@ -244,7 +193,7 @@ func upgradePath(allowMajorUpgrade, workflowUpdate, isMainBranch bool) error { return nil } - err = replaceGoVersionInCodebase(currentVersion, upgradeTo, workflowUpdate) + err = replaceGoVersionInCodebase(currentVersion, upgradeTo) if err != nil { return err } @@ -385,7 +334,7 @@ func chooseNewVersion(curVersion *version.Version, latestVersions version.Collec // replaceGoVersionInCodebase goes through all the files in the codebase where the // Golang version must be updated -func replaceGoVersionInCodebase(old, new *version.Version, workflowUpdate bool) error { +func replaceGoVersionInCodebase(old, new *version.Version) error { if old.Equal(new) { return nil } @@ -397,9 +346,6 @@ func replaceGoVersionInCodebase(old, new *version.Version, workflowUpdate bool) "./docker/lite/Dockerfile.percona80", "./docker/vttestserver/Dockerfile.mysql80", } - if workflowUpdate { - explore = append(explore, "./.github/workflows") - } filesToChange, err := getListOfFilesInPaths(explore) if err != nil { return err @@ -418,7 +364,7 @@ func replaceGoVersionInCodebase(old, new *version.Version, workflowUpdate bool) } if !isSameMajorMinorVersion(old, new) { - goModFiles := []string{"./go.mod", "./vitess-mixin/go.mod"} + goModFiles := []string{"./go.mod"} for _, file := range goModFiles { err = replaceInFile( []*regexp.Regexp{regexp.MustCompile(regexpReplaceGoModGoVersion)}, diff --git a/go/tools/go-upgrade/go-upgrade_test.go b/go/tools/go-upgrade/go-upgrade_test.go index 378672d544f..6995ccb4002 100644 --- a/go/tools/go-upgrade/go-upgrade_test.go +++ b/go/tools/go-upgrade/go-upgrade_test.go @@ -87,14 +87,6 @@ func TestRegularExpressions(t *testing.T) { require.Equal(t, `flag.String("bootstrap-version", "18.2", "the version identifier to use for the docker images")`, res) }, }, - { - regexp: regexpReplaceGolangVersionInWorkflow, - input: "go-version: 1.20.5", - checkF: func(t *testing.T, regexp *regexp.Regexp, input string) { - res := regexp.ReplaceAllString(input, "go-version: 1.20.6") - require.Equal(t, `go-version: 1.20.6`, res) - }, - }, } for _, list := range lists { diff --git a/go/tools/sizegen/sizegen.go b/go/tools/sizegen/sizegen.go index a8fbcb1add4..7ecd50e3d8c 100644 --- a/go/tools/sizegen/sizegen.go +++ b/go/tools/sizegen/sizegen.go @@ -149,7 +149,7 @@ func (sizegen *sizegen) generateType(pkg *types.Package, file *codeFile, named * case *types.Interface: findImplementations(pkg.Scope(), tt, func(tt types.Type) { if _, isStruct := tt.Underlying().(*types.Struct); isStruct { - sizegen.generateKnownType(tt.(*types.Named)) + sizegen.generateTyp(tt) } }) default: @@ -157,6 +157,15 @@ func (sizegen *sizegen) generateType(pkg *types.Package, file *codeFile, named * } } +func (sizegen *sizegen) generateTyp(tt types.Type) { + switch tt := tt.(type) { + case *types.Named: + sizegen.generateKnownType(tt) + case *types.Alias: + sizegen.generateTyp(types.Unalias(tt)) + } +} + func (sizegen *sizegen) generateKnownType(named *types.Named) { pkgInfo := named.Obj().Pkg() file := sizegen.codegen[pkgInfo.Path()] diff --git a/go/trace/trace.go b/go/trace/trace.go index 7c43b4afedc..bcfe39eeefa 100644 --- a/go/trace/trace.go +++ b/go/trace/trace.go @@ -189,7 +189,7 @@ func StartTracing(serviceName string) io.Closer { } func fail(serviceName string) io.Closer { - options := make([]string, len(tracingBackendFactories)) + options := make([]string, 0, len(tracingBackendFactories)) for k := range tracingBackendFactories { options = append(options, k) } diff --git a/go/vt/binlog/binlogplayer/binlog_player.go b/go/vt/binlog/binlogplayer/binlog_player.go index 05685a54d3e..92718a4b5ed 100644 --- a/go/vt/binlog/binlogplayer/binlog_player.go +++ b/go/vt/binlog/binlogplayer/binlog_player.go @@ -25,6 +25,7 @@ import ( "context" "encoding/binary" "encoding/hex" + "encoding/json" "fmt" "io" "math" @@ -45,6 +46,7 @@ import ( "vitess.io/vitess/go/stats" "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/proto/vtctldata" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/throttler" @@ -53,6 +55,8 @@ import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) +const GetWorkflowQuery = "select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys, options from _vt.vreplication where id=%v" + var ( // SlowQueryThreshold will cause we logging anything that's higher than it. SlowQueryThreshold = time.Duration(100 * time.Millisecond) @@ -70,10 +74,12 @@ var ( // Truncate values in the middle to preserve the end of the message which // typically contains the error text. - TruncationLocation = textutil.TruncationLocationMiddle -) + TruncationLocation = textutil.TruncationLocationMiddle + TruncationIndicator = fmt.Sprintf(" ... %s ... ", sqlparser.TruncationText) -var TruncationIndicator = fmt.Sprintf(" ... %s ... ", sqlparser.TruncationText) + // TestGetWorkflowQueryId1 is only used in tests. + TestGetWorkflowQueryId1 = fmt.Sprintf(GetWorkflowQuery, 1) +) // Stats is the internal stats of a player. It is a different // structure that is passed in so stats can be collected over the life @@ -117,6 +123,8 @@ type Stats struct { ThrottledCounts *stats.CountersWithMultiLabels // By throttler and component DDLEventActions *stats.CountersWithSingleLabel + + WorkflowConfig string } // RecordHeartbeat updates the time the last heartbeat from vstreamer was seen @@ -559,11 +567,12 @@ type VRSettings struct { WorkflowSubType binlogdatapb.VReplicationWorkflowSubType WorkflowName string DeferSecondaryKeys bool + WorkflowOptions *vtctldata.WorkflowOptions } // ReadVRSettings retrieves the settings for a vreplication stream. func ReadVRSettings(dbClient DBClient, uid int32) (VRSettings, error) { - query := fmt.Sprintf("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=%v", uid) + query := fmt.Sprintf(GetWorkflowQuery, uid) qr, err := dbClient.ExecuteFetch(query, 1) if err != nil { return VRSettings{}, fmt.Errorf("error %v in selecting vreplication settings %v", err, query) @@ -602,6 +611,11 @@ func ReadVRSettings(dbClient DBClient, uid int32) (VRSettings, error) { if err != nil { return VRSettings{}, fmt.Errorf("failed to parse defer_secondary_keys column: %v", err) } + options := vrRow.AsString("options", "{}") + var workflowOptions vtctldata.WorkflowOptions + if err := json.Unmarshal([]byte(options), &workflowOptions); err != nil { + return VRSettings{}, fmt.Errorf("failed to parse options column: %v", err) + } return VRSettings{ StartPos: startPos, StopPos: stopPos, @@ -612,6 +626,7 @@ func ReadVRSettings(dbClient DBClient, uid int32) (VRSettings, error) { WorkflowName: vrRow.AsString("workflow", ""), WorkflowSubType: binlogdatapb.VReplicationWorkflowSubType(workflowSubType), DeferSecondaryKeys: deferSecondaryKeys, + WorkflowOptions: &workflowOptions, }, nil } @@ -669,11 +684,11 @@ func GenerateUpdateHeartbeat(uid int32, timeUpdated int64) (string, error) { } // GenerateUpdateTimeThrottled returns a statement to record the latest throttle time in the _vt.vreplication table. -func GenerateUpdateTimeThrottled(uid int32, timeThrottledUnix int64, componentThrottled string) (string, error) { +func GenerateUpdateTimeThrottled(uid int32, timeThrottledUnix int64, componentThrottled string, reasonThrottled string) (string, error) { if timeThrottledUnix == 0 { return "", fmt.Errorf("timeUpdated cannot be zero") } - return fmt.Sprintf("update _vt.vreplication set time_updated=%v, time_throttled=%v, component_throttled='%v' where id=%v", timeThrottledUnix, timeThrottledUnix, componentThrottled, uid), nil + return fmt.Sprintf("update _vt.vreplication set time_updated=%v, time_throttled=%v, component_throttled='%v', reason_throttled=%v where id=%v", timeThrottledUnix, timeThrottledUnix, componentThrottled, encodeString(MessageTruncate(reasonThrottled)), uid), nil } // StartVReplicationUntil returns a statement to start the replication with a stop position. diff --git a/go/vt/binlog/binlogplayer/binlog_player_test.go b/go/vt/binlog/binlogplayer/binlog_player_test.go index 99b0ef496b3..79aa9d0fa65 100644 --- a/go/vt/binlog/binlogplayer/binlog_player_test.go +++ b/go/vt/binlog/binlogplayer/binlog_player_test.go @@ -22,6 +22,8 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" + "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/mysql/sqlerror" querypb "vitess.io/vitess/go/vt/proto/query" @@ -69,7 +71,7 @@ var ( func TestNewBinlogPlayerKeyRange(t *testing.T) { dbClient := NewMockDBClient(t) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -102,7 +104,7 @@ func TestNewBinlogPlayerKeyRange(t *testing.T) { func TestNewBinlogPlayerTables(t *testing.T) { dbClient := NewMockDBClient(t) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -136,7 +138,7 @@ func TestNewBinlogPlayerTables(t *testing.T) { func TestApplyEventsFail(t *testing.T) { dbClient := NewMockDBClient(t) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, errors.New("err")) dbClient.ExpectRequest("update _vt.vreplication set state='Error', message='error in processing binlog event failed query BEGIN, err: err' where id=1", testDMLResponse, nil) @@ -189,7 +191,7 @@ func TestStopPosEqual(t *testing.T) { }, }, } - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", posEqual, nil) + dbClient.ExpectRequest(TestGetWorkflowQueryId1, posEqual, nil) dbClient.ExpectRequest(`update _vt.vreplication set state='Stopped', message='not starting BinlogPlayer, we\'re already at the desired position 0-1-1083' where id=1`, testDMLResponse, nil) _ = newFakeBinlogClient() @@ -228,7 +230,7 @@ func TestStopPosLess(t *testing.T) { }, }, } - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", posEqual, nil) + dbClient.ExpectRequest(TestGetWorkflowQueryId1, posEqual, nil) dbClient.ExpectRequest(`update _vt.vreplication set state='Stopped', message='starting point 0-1-1083 greater than stopping point 0-1-1082' where id=1`, testDMLResponse, nil) _ = newFakeBinlogClient() @@ -267,7 +269,7 @@ func TestStopPosGreater(t *testing.T) { }, }, } - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", posEqual, nil) + dbClient.ExpectRequest(TestGetWorkflowQueryId1, posEqual, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -310,7 +312,7 @@ func TestContextCancel(t *testing.T) { }, }, } - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", posEqual, nil) + dbClient.ExpectRequest(TestGetWorkflowQueryId1, posEqual, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -339,7 +341,7 @@ func TestContextCancel(t *testing.T) { func TestRetryOnDeadlock(t *testing.T) { dbClient := NewMockDBClient(t) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(TestGetWorkflowQueryId1, testSettingsResponse, nil) deadlocked := &sqlerror.SQLError{Num: 1213, Message: "deadlocked"} dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", nil, deadlocked) @@ -454,3 +456,36 @@ func TestReadVReplicationStatus(t *testing.T) { t.Errorf("ReadVReplicationStatus(482821) = %#v, want %#v", got, want) } } + +func TestEncodeString(t *testing.T) { + tcases := []struct { + in, out string + }{ + { + in: "", + out: "''", + }, + { + in: "a", + out: "'a'", + }, + { + in: "here's", + out: "'here\\'s'", + }, + { + in: "online-ddl is denied access due to lag metric value 94.821447 exceeding threshold 5", + out: "'online-ddl is denied access due to lag metric value 94.821447 exceeding threshold 5'", + }, + { + in: "'a','b','c'", + out: "'\\'a\\',\\'b\\',\\'c\\''", + }, + } + for _, tcase := range tcases { + t.Run(tcase.in, func(t *testing.T) { + out := encodeString(tcase.in) + assert.Equal(t, tcase.out, out) + }) + } +} diff --git a/go/vt/binlog/binlogplayer/dbclient.go b/go/vt/binlog/binlogplayer/dbclient.go index 61789f345c7..c3463b4cc2c 100644 --- a/go/vt/binlog/binlogplayer/dbclient.go +++ b/go/vt/binlog/binlogplayer/dbclient.go @@ -23,6 +23,7 @@ import ( "vitess.io/vitess/go/constants/sidecar" "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/mysql/capabilities" "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/textutil" @@ -41,6 +42,7 @@ type DBClient interface { Close() ExecuteFetch(query string, maxrows int) (qr *sqltypes.Result, err error) ExecuteFetchMulti(query string, maxrows int) (qrs []*sqltypes.Result, err error) + SupportsCapability(capability capabilities.FlavorCapability) (bool, error) } // dbClientImpl is a real DBClient backed by a mysql connection. @@ -123,6 +125,10 @@ func (dc *dbClientImpl) Close() { dc.dbConn.Close() } +func (dc *dbClientImpl) SupportsCapability(capability capabilities.FlavorCapability) (bool, error) { + return dc.dbConn.SupportsCapability(capability) +} + // LogError logs a message after truncating it to avoid spamming logs func LogError(msg string, err error) { log.Errorf("%s: %s", msg, MessageTruncate(err.Error())) diff --git a/go/vt/binlog/binlogplayer/fake_dbclient.go b/go/vt/binlog/binlogplayer/fake_dbclient.go index 750f35b3fe3..234dfd528e0 100644 --- a/go/vt/binlog/binlogplayer/fake_dbclient.go +++ b/go/vt/binlog/binlogplayer/fake_dbclient.go @@ -20,6 +20,7 @@ import ( "fmt" "strings" + "vitess.io/vitess/go/mysql/capabilities" "vitess.io/vitess/go/sqltypes" ) @@ -84,3 +85,7 @@ func (dc *fakeDBClient) ExecuteFetch(query string, maxrows int) (qr *sqltypes.Re func (dc *fakeDBClient) ExecuteFetchMulti(query string, maxrows int) ([]*sqltypes.Result, error) { return make([]*sqltypes.Result, 0), nil } + +func (dc *fakeDBClient) SupportsCapability(capability capabilities.FlavorCapability) (bool, error) { + return false, nil +} diff --git a/go/vt/binlog/binlogplayer/mock_dbclient.go b/go/vt/binlog/binlogplayer/mock_dbclient.go index 02e7ea28d7b..f0a811a30cf 100644 --- a/go/vt/binlog/binlogplayer/mock_dbclient.go +++ b/go/vt/binlog/binlogplayer/mock_dbclient.go @@ -24,6 +24,7 @@ import ( "testing" "time" + "vitess.io/vitess/go/mysql/capabilities" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/sqlparser" ) @@ -102,13 +103,13 @@ func NewMockDbaClient(t *testing.T) *MockDBClient { // ExpectRequest adds an expected result to the mock. // This function should not be called conncurrently with other commands. func (dc *MockDBClient) ExpectRequest(query string, result *sqltypes.Result, err error) { + dc.expectMu.Lock() + defer dc.expectMu.Unlock() select { case <-dc.done: dc.done = make(chan struct{}) default: } - dc.expectMu.Lock() - defer dc.expectMu.Unlock() dc.expect = append(dc.expect, &mockExpect{ query: query, result: result, @@ -120,13 +121,13 @@ func (dc *MockDBClient) ExpectRequest(query string, result *sqltypes.Result, err // queryRE is a regular expression. // This function should not be called conncurrently with other commands. func (dc *MockDBClient) ExpectRequestRE(queryRE string, result *sqltypes.Result, err error) { + dc.expectMu.Lock() + defer dc.expectMu.Unlock() select { case <-dc.done: dc.done = make(chan struct{}) default: } - dc.expectMu.Lock() - defer dc.expectMu.Unlock() dc.expect = append(dc.expect, &mockExpect{ query: queryRE, re: regexp.MustCompile(queryRE), @@ -209,7 +210,7 @@ func (dc *MockDBClient) ExecuteFetch(query string, maxrows int) (qr *sqltypes.Re result := dc.expect[dc.currentResult] if result.re == nil { if query != result.query { - msg := "DBClientMock: query: %s, want %s" + msg := "DBClientMock: query: \n%s, want \n%s" if dc.Tag != "" { msg = fmt.Sprintf("[%s] %s", dc.Tag, msg) } @@ -260,3 +261,16 @@ func (dc *MockDBClient) RemoveInvariant(query string) { defer dc.expectMu.Unlock() delete(dc.invariants, query) } + +// RemoveInvariant can be used to customize the behavior of the mock client. +func (dc *MockDBClient) RemoveInvariants(queries ...string) { + dc.expectMu.Lock() + defer dc.expectMu.Unlock() + for _, query := range queries { + delete(dc.invariants, query) + } +} + +func (dc *MockDBClient) SupportsCapability(capability capabilities.FlavorCapability) (bool, error) { + return false, nil +} diff --git a/go/vt/dbconfigs/dbconfigs.go b/go/vt/dbconfigs/dbconfigs.go index 82c322e7ae9..32fb2435286 100644 --- a/go/vt/dbconfigs/dbconfigs.go +++ b/go/vt/dbconfigs/dbconfigs.go @@ -133,7 +133,7 @@ func registerBaseFlags(fs *pflag.FlagSet) { fs.StringVar(&GlobalDBConfigs.Socket, "db_socket", "", "The unix socket to connect on. If this is specified, host and port will not be used.") fs.StringVar(&GlobalDBConfigs.Host, "db_host", "", "The host name for the tcp connection.") fs.IntVar(&GlobalDBConfigs.Port, "db_port", 0, "tcp port") - fs.StringVar(&GlobalDBConfigs.Charset, "db_charset", "utf8mb4", "Character set used for this tablet.") + fs.StringVar(&GlobalDBConfigs.Charset, "db_charset", "utf8mb4", "Character set/collation used for this tablet. Make sure to configure this to a charset/collation supported by the lowest MySQL version in your environment.") fs.Uint64Var(&GlobalDBConfigs.Flags, "db_flags", 0, "Flag values as defined by MySQL.") fs.StringVar(&GlobalDBConfigs.Flavor, "db_flavor", "", "Flavor overrid. Valid value is FilePos.") fs.Var(&GlobalDBConfigs.SslMode, "db_ssl_mode", "SSL mode to connect with. One of disabled, preferred, required, verify_ca & verify_identity.") diff --git a/go/vt/discovery/healthcheck.go b/go/vt/discovery/healthcheck.go index 70799b0f6bc..cea972e35a7 100644 --- a/go/vt/discovery/healthcheck.go +++ b/go/vt/discovery/healthcheck.go @@ -35,6 +35,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "hash/crc32" "net/http" @@ -46,7 +47,6 @@ import ( "github.com/google/safehtml/template" "github.com/google/safehtml/template/uncheckedconversions" "github.com/spf13/pflag" - "golang.org/x/sync/semaphore" "vitess.io/vitess/go/flagutil" "vitess.io/vitess/go/netutil" @@ -92,9 +92,6 @@ var ( // refreshKnownTablets tells us whether to process all tablets or only new tablets. refreshKnownTablets = true - // healthCheckDialConcurrency tells us how many healthcheck connections can be opened to tablets at once. This should be less than the golang max thread limit of 10000. - healthCheckDialConcurrency int64 = 1024 - // How much to sleep between each check. waitAvailableTabletInterval = 100 * time.Millisecond @@ -105,6 +102,9 @@ var ( // HealthCheckHealthyTemplate uses healthCheckTemplate with the `HealthCheck Tablet - Healthy Tablets` title to // create the HTML code required to render the list of healthy tablets from the HealthCheck. HealthCheckHealthyTemplate = fmt.Sprintf(healthCheckTemplate, "HealthCheck - Healthy Tablets") + + // errKeyspacesToWatchAndTabletFilters is an error for cases where incompatible filters are defined. + errKeyspacesToWatchAndTabletFilters = errors.New("only one of --keyspaces_to_watch and --tablet_filters may be specified at a time") ) // See the documentation for NewHealthCheck below for an explanation of these parameters. @@ -177,7 +177,6 @@ func registerWebUIFlags(fs *pflag.FlagSet) { fs.StringVar(&TabletURLTemplateString, "tablet_url_template", "http://{{.GetTabletHostPort}}", "Format string describing debug tablet url formatting. See getTabletDebugURL() for how to customize this.") fs.DurationVar(&refreshInterval, "tablet_refresh_interval", 1*time.Minute, "Tablet refresh interval.") fs.BoolVar(&refreshKnownTablets, "tablet_refresh_known_tablets", true, "Whether to reload the tablet's address/port map from topo in case they change.") - fs.Int64Var(&healthCheckDialConcurrency, "healthcheck-dial-concurrency", 1024, "Maximum concurrency of new healthcheck connections. This should be less than the golang max thread limit of 10000.") ParseTabletURLTemplateFromFlag() } @@ -297,8 +296,27 @@ type HealthCheckImpl struct { subscribers map[chan *TabletHealth]struct{} // loadTablets trigger is used to immediately load a new primary tablet when the current one has been demoted loadTabletsTrigger chan struct{} - // healthCheckDialSem is used to limit how many healthcheck connections can be opened to tablets at once. - healthCheckDialSem *semaphore.Weighted +} + +// NewVTGateHealthCheckFilters returns healthcheck filters for vtgate. +func NewVTGateHealthCheckFilters() (filters TabletFilters, err error) { + if len(tabletFilters) > 0 { + if len(KeyspacesToWatch) > 0 { + return nil, errKeyspacesToWatchAndTabletFilters + } + + fbs, err := NewFilterByShard(tabletFilters) + if err != nil { + return nil, fmt.Errorf("failed to parse tablet_filters value %q: %v", strings.Join(tabletFilters, ","), err) + } + filters = append(filters, fbs) + } else if len(KeyspacesToWatch) > 0 { + filters = append(filters, NewFilterByKeyspace(KeyspacesToWatch)) + } + if len(tabletFilterTags) > 0 { + filters = append(filters, NewFilterByTabletTags(tabletFilterTags)) + } + return filters, nil } // NewHealthCheck creates a new HealthCheck object. @@ -322,10 +340,14 @@ type HealthCheckImpl struct { // // The localCell for this healthcheck // -// callback. +// cellsToWatch. +// +// Is a list of cells to watch for tablets. // -// A function to call when there is a primary change. Used to notify vtgate's buffer to stop buffering. -func NewHealthCheck(ctx context.Context, retryDelay, healthCheckTimeout time.Duration, topoServer *topo.Server, localCell, cellsToWatch string) *HealthCheckImpl { +// filters. +// +// Is one or more filters to apply when determining what tablets we want to stream healthchecks from. +func NewHealthCheck(ctx context.Context, retryDelay, healthCheckTimeout time.Duration, topoServer *topo.Server, localCell, cellsToWatch string, filters TabletFilter) *HealthCheckImpl { log.Infof("loading tablets for cells: %v", cellsToWatch) hc := &HealthCheckImpl{ @@ -333,13 +355,12 @@ func NewHealthCheck(ctx context.Context, retryDelay, healthCheckTimeout time.Dur cell: localCell, retryDelay: retryDelay, healthCheckTimeout: healthCheckTimeout, - healthCheckDialSem: semaphore.NewWeighted(healthCheckDialConcurrency), healthByAlias: make(map[tabletAliasString]*tabletHealthCheck), healthData: make(map[KeyspaceShardTabletType]map[tabletAliasString]*TabletHealth), healthy: make(map[KeyspaceShardTabletType][]*TabletHealth), subscribers: make(map[chan *TabletHealth]struct{}), cellAliases: make(map[string]string), - loadTabletsTrigger: make(chan struct{}), + loadTabletsTrigger: make(chan struct{}, 1), } var topoWatchers []*TopologyWatcher cells := strings.Split(cellsToWatch, ",") @@ -348,27 +369,10 @@ func NewHealthCheck(ctx context.Context, retryDelay, healthCheckTimeout time.Dur } for _, c := range cells { - var filters TabletFilters log.Infof("Setting up healthcheck for cell: %v", c) if c == "" { continue } - if len(tabletFilters) > 0 { - if len(KeyspacesToWatch) > 0 { - log.Exitf("Only one of -keyspaces_to_watch and -tablet_filters may be specified at a time") - } - - fbs, err := NewFilterByShard(tabletFilters) - if err != nil { - log.Exitf("Cannot parse tablet_filters parameter: %v", err) - } - filters = append(filters, fbs) - } else if len(KeyspacesToWatch) > 0 { - filters = append(filters, NewFilterByKeyspace(KeyspacesToWatch)) - } - if len(tabletFilterTags) > 0 { - filters = append(filters, NewFilterByTabletTags(tabletFilterTags)) - } topoWatchers = append(topoWatchers, NewTopologyWatcher(ctx, topoServer, hc, filters, c, refreshInterval, refreshKnownTablets, topo.DefaultConcurrency)) } @@ -470,7 +474,20 @@ func (hc *HealthCheckImpl) deleteTablet(tablet *topodata.Tablet) { // delete from healthy list healthy, ok := hc.healthy[key] if ok && len(healthy) > 0 { - hc.recomputeHealthy(key) + if tabletType == topodata.TabletType_PRIMARY { + // If the deleted tablet was a primary, + // and it matches what we think is the current active primary, + // clear the healthy list for the primary. + // + // See the logic in `updateHealth` for more details. + alias := tabletAliasString(topoproto.TabletAliasString(healthy[0].Tablet.Alias)) + if alias == tabletAlias { + hc.healthy[key] = []*TabletHealth{} + } + } else { + // Simply recompute the list of healthy tablets for all other tablet types. + hc.recomputeHealthy(key) + } } } }() @@ -522,7 +539,13 @@ func (hc *HealthCheckImpl) updateHealth(th *TabletHealth, prevTarget *query.Targ if prevTarget.TabletType == topodata.TabletType_PRIMARY { if primaries := hc.healthData[oldTargetKey]; len(primaries) == 0 { log.Infof("We will have no health data for the next new primary tablet after demoting the tablet: %v, so start loading tablets now", topotools.TabletIdent(th.Tablet)) - hc.loadTabletsTrigger <- struct{}{} + // We want to trigger a loadTablets call, but if the channel is not empty + // then a trigger is already scheduled, we don't need to trigger another one. + // This also prevents the code from deadlocking as described in https://github.com/vitessio/vitess/issues/16994. + select { + case hc.loadTabletsTrigger <- struct{}{}: + default: + } } } } @@ -586,6 +609,13 @@ func (hc *HealthCheckImpl) updateHealth(th *TabletHealth, prevTarget *query.Targ hc.broadcast(th) } +// recomputeHealthy recomputes the healthy tablets for the given key. +// +// This filters out tablets that might be healthy, but are not part of the current +// cell or cell alias. It also performs filtering of tablets based on replication lag, +// if configured to do so. +// +// This should not be called for primary tablets. func (hc *HealthCheckImpl) recomputeHealthy(key KeyspaceShardTabletType) { all := hc.healthData[key] allArray := make([]*TabletHealth, 0, len(all)) @@ -844,7 +874,7 @@ func (hc *HealthCheckImpl) TabletConnection(ctx context.Context, alias *topodata // TODO: test that throws this error return nil, vterrors.Errorf(vtrpc.Code_NOT_FOUND, "tablet: %v is either down or nonexistent", alias) } - return thc.Connection(ctx, hc), nil + return thc.Connection(ctx), nil } // getAliasByCell should only be called while holding hc.mu diff --git a/go/vt/discovery/healthcheck_test.go b/go/vt/discovery/healthcheck_test.go index c87ba699234..6a03e1589dd 100644 --- a/go/vt/discovery/healthcheck_test.go +++ b/go/vt/discovery/healthcheck_test.go @@ -63,6 +63,77 @@ func init() { refreshInterval = time.Minute } +func TestNewVTGateHealthCheckFilters(t *testing.T) { + defer func() { + KeyspacesToWatch = nil + tabletFilters = nil + tabletFilterTags = nil + }() + + testCases := []struct { + name string + keyspacesToWatch []string + tabletFilters []string + tabletFilterTags map[string]string + expectedError string + expectedFilterTypes []any + }{ + { + name: "noFilters", + }, + { + name: "tabletFilters", + tabletFilters: []string{"ks1|-80"}, + expectedFilterTypes: []any{&FilterByShard{}}, + }, + { + name: "keyspacesToWatch", + keyspacesToWatch: []string{"ks1"}, + expectedFilterTypes: []any{&FilterByKeyspace{}}, + }, + { + name: "tabletFiltersAndTags", + tabletFilters: []string{"ks1|-80"}, + tabletFilterTags: map[string]string{"test": "true"}, + expectedFilterTypes: []any{&FilterByShard{}, &FilterByTabletTags{}}, + }, + { + name: "keyspacesToWatchAndTags", + tabletFilterTags: map[string]string{"test": "true"}, + keyspacesToWatch: []string{"ks1"}, + expectedFilterTypes: []any{&FilterByKeyspace{}, &FilterByTabletTags{}}, + }, + { + name: "failKeyspacesToWatchAndFilters", + tabletFilters: []string{"ks1|-80"}, + keyspacesToWatch: []string{"ks1"}, + expectedError: errKeyspacesToWatchAndTabletFilters.Error(), + }, + { + name: "failInvalidTabletFilters", + tabletFilters: []string{"shouldfail|"}, + expectedError: "failed to parse tablet_filters value \"shouldfail|\": error parsing shard name : Code: INVALID_ARGUMENT\nempty name\n", + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + KeyspacesToWatch = testCase.keyspacesToWatch + tabletFilters = testCase.tabletFilters + tabletFilterTags = testCase.tabletFilterTags + + filters, err := NewVTGateHealthCheckFilters() + if testCase.expectedError != "" { + assert.EqualError(t, err, testCase.expectedError) + } + assert.Len(t, filters, len(testCase.expectedFilterTypes)) + for i, filter := range filters { + assert.IsType(t, testCase.expectedFilterTypes[i], filter) + } + }) + } +} + func TestHealthCheck(t *testing.T) { ctx := utils.LeakCheckContext(t) // reset error counters @@ -784,6 +855,127 @@ func TestRemoveTablet(t *testing.T) { assert.Empty(t, a, "wrong result, expected empty list") } +// When an external primary failover is performed, +// the demoted primary will advertise itself as a `PRIMARY` +// tablet until it recognizes that it was demoted, +// and until all in-flight operations have either finished +// (successfully or unsuccessfully, see `--shutdown_grace_period` flag). +// +// During this time, operations like `RemoveTablet` should not lead +// to multiple tablets becoming valid targets for `PRIMARY`. +func TestRemoveTabletDuringExternalReparenting(t *testing.T) { + ctx := utils.LeakCheckContext(t) + + // reset error counters + hcErrorCounters.ResetAll() + ts := memorytopo.NewServer(ctx, "cell") + defer ts.Close() + hc := createTestHc(ctx, ts) + // close healthcheck + defer hc.Close() + + firstTablet := createTestTablet(0, "cell", "a") + firstTablet.Type = topodatapb.TabletType_PRIMARY + + secondTablet := createTestTablet(1, "cell", "b") + secondTablet.Type = topodatapb.TabletType_REPLICA + + thirdTablet := createTestTablet(2, "cell", "c") + thirdTablet.Type = topodatapb.TabletType_REPLICA + + firstTabletHealthStream := make(chan *querypb.StreamHealthResponse) + firstTabletConn := createFakeConn(firstTablet, firstTabletHealthStream) + firstTabletConn.errCh = make(chan error) + + secondTabletHealthStream := make(chan *querypb.StreamHealthResponse) + secondTabletConn := createFakeConn(secondTablet, secondTabletHealthStream) + secondTabletConn.errCh = make(chan error) + + thirdTabletHealthStream := make(chan *querypb.StreamHealthResponse) + thirdTabletConn := createFakeConn(thirdTablet, thirdTabletHealthStream) + thirdTabletConn.errCh = make(chan error) + + resultChan := hc.Subscribe() + + hc.AddTablet(firstTablet) + <-resultChan + + hc.AddTablet(secondTablet) + <-resultChan + + hc.AddTablet(thirdTablet) + <-resultChan + + firstTabletPrimaryTermStartTimestamp := time.Now().Unix() - 10 + + firstTabletHealthStream <- &querypb.StreamHealthResponse{ + TabletAlias: firstTablet.Alias, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_PRIMARY}, + Serving: true, + + PrimaryTermStartTimestamp: firstTabletPrimaryTermStartTimestamp, + RealtimeStats: &querypb.RealtimeStats{ReplicationLagSeconds: 0, CpuUsage: 0.5}, + } + <-resultChan + + secondTabletHealthStream <- &querypb.StreamHealthResponse{ + TabletAlias: secondTablet.Alias, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}, + Serving: true, + + PrimaryTermStartTimestamp: 0, + RealtimeStats: &querypb.RealtimeStats{ReplicationLagSeconds: 1, CpuUsage: 0.5}, + } + <-resultChan + + thirdTabletHealthStream <- &querypb.StreamHealthResponse{ + TabletAlias: thirdTablet.Alias, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}, + Serving: true, + + PrimaryTermStartTimestamp: 0, + RealtimeStats: &querypb.RealtimeStats{ReplicationLagSeconds: 1, CpuUsage: 0.5}, + } + <-resultChan + + secondTabletPrimaryTermStartTimestamp := time.Now().Unix() + + // Simulate a failover + firstTabletHealthStream <- &querypb.StreamHealthResponse{ + TabletAlias: firstTablet.Alias, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_PRIMARY}, + Serving: true, + + PrimaryTermStartTimestamp: firstTabletPrimaryTermStartTimestamp, + RealtimeStats: &querypb.RealtimeStats{ReplicationLagSeconds: 0, CpuUsage: 0.5}, + } + <-resultChan + + secondTabletHealthStream <- &querypb.StreamHealthResponse{ + TabletAlias: secondTablet.Alias, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_PRIMARY}, + Serving: true, + + PrimaryTermStartTimestamp: secondTabletPrimaryTermStartTimestamp, + RealtimeStats: &querypb.RealtimeStats{ReplicationLagSeconds: 0, CpuUsage: 0.5}, + } + <-resultChan + + hc.RemoveTablet(thirdTablet) + + // `secondTablet` should be the primary now + expectedTabletStats := []*TabletHealth{{ + Tablet: secondTablet, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_PRIMARY}, + Serving: true, + Stats: &querypb.RealtimeStats{ReplicationLagSeconds: 0, CpuUsage: 0.5}, + PrimaryTermStartTime: secondTabletPrimaryTermStartTimestamp, + }} + + actualTabletStats := hc.GetHealthyTabletStats(&querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_PRIMARY}) + mustMatch(t, expectedTabletStats, actualTabletStats, "unexpected result") +} + // TestGetHealthyTablets tests the functionality of GetHealthyTabletStats. func TestGetHealthyTablets(t *testing.T) { ctx := utils.LeakCheckContext(t) @@ -979,7 +1171,7 @@ func TestPrimaryInOtherCell(t *testing.T) { ts := memorytopo.NewServer(ctx, "cell1", "cell2") defer ts.Close() - hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, "cell1", "cell1, cell2") + hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, "cell1", "cell1, cell2", nil) defer hc.Close() // add a tablet as primary in different cell @@ -1039,7 +1231,7 @@ func TestReplicaInOtherCell(t *testing.T) { ts := memorytopo.NewServer(ctx, "cell1", "cell2") defer ts.Close() - hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, "cell1", "cell1, cell2") + hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, "cell1", "cell1, cell2", nil) defer hc.Close() // add a tablet as replica @@ -1144,7 +1336,7 @@ func TestCellAliases(t *testing.T) { ts := memorytopo.NewServer(ctx, "cell1", "cell2") defer ts.Close() - hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, "cell1", "cell1, cell2") + hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, "cell1", "cell1, cell2", nil) defer hc.Close() cellsAlias := &topodatapb.CellsAlias{ @@ -1295,7 +1487,7 @@ func tabletDialer(ctx context.Context, tablet *topodatapb.Tablet, _ grpcclient.F } func createTestHc(ctx context.Context, ts *topo.Server) *HealthCheckImpl { - return NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, "cell", "") + return NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, "cell", "", nil) } type fakeConn struct { diff --git a/go/vt/discovery/keyspace_events.go b/go/vt/discovery/keyspace_events.go index 9fa457c1589..3de31ea6d9a 100644 --- a/go/vt/discovery/keyspace_events.go +++ b/go/vt/discovery/keyspace_events.go @@ -19,7 +19,9 @@ package discovery import ( "context" "fmt" + "slices" "sync" + "time" "golang.org/x/sync/errgroup" "google.golang.org/protobuf/proto" @@ -37,6 +39,11 @@ import ( vschemapb "vitess.io/vitess/go/vt/proto/vschema" ) +var ( + // waitConsistentKeyspacesCheck is the amount of time to wait for between checks to verify the keyspace is consistent. + waitConsistentKeyspacesCheck = 100 * time.Millisecond +) + // KeyspaceEventWatcher is an auxiliary watcher that watches all availability incidents // for all keyspaces in a Vitess cell and notifies listeners when the events have been resolved. // Right now this is capable of detecting the end of failovers, both planned and unplanned, @@ -111,6 +118,13 @@ type keyspaceState struct { moveTablesState *MoveTablesState } +// isConsistent returns whether the keyspace is currently consistent or not. +func (kss *keyspaceState) isConsistent() bool { + kss.mu.Lock() + defer kss.mu.Unlock() + return kss.consistent +} + // Format prints the internal state for this keyspace for debug purposes. func (kss *keyspaceState) Format(f fmt.State, verb rune) { kss.mu.Lock() @@ -662,29 +676,53 @@ func (kew *KeyspaceEventWatcher) TargetIsBeingResharded(ctx context.Context, tar return ks.beingResharded(target.Shard) } -// PrimaryIsNotServing checks if the reason why the given target is not accessible right now is -// that the primary tablet for that shard is not serving. This is possible during a Planned -// Reparent Shard operation. Just as the operation completes, a new primary will be elected, and +// ShouldStartBufferingForTarget checks if we should be starting buffering for the given target. +// We check the following things before we start buffering - +// 1. The shard must have a primary. +// 2. The primary must be non-serving. +// 3. The keyspace must be marked inconsistent. +// +// This buffering is meant to kick in during a Planned Reparent Shard operation. +// As part of that operation the old primary will become non-serving. At that point +// this code should return true to start buffering requests. +// Just as the PRS operation completes, a new primary will be elected, and // it will send its own healthcheck stating that it is serving. We should buffer requests until -// that point. There are use cases where people do not run with a Primary server at all, so we must +// that point. +// +// There are use cases where people do not run with a Primary server at all, so we must // verify that we only start buffering when a primary was present, and it went not serving. // The shard state keeps track of the current primary and the last externally reparented time, which // we can use to determine that there was a serving primary which now became non serving. This is // only possible in a DemotePrimary RPC which are only called from ERS and PRS. So buffering will -// stop when these operations succeed. We return the tablet alias of the primary if it is serving. -func (kew *KeyspaceEventWatcher) PrimaryIsNotServing(ctx context.Context, target *querypb.Target) (*topodatapb.TabletAlias, bool) { +// stop when these operations succeed. We also return the tablet alias of the primary if it is serving. +func (kew *KeyspaceEventWatcher) ShouldStartBufferingForTarget(ctx context.Context, target *querypb.Target) (*topodatapb.TabletAlias, bool) { if target.TabletType != topodatapb.TabletType_PRIMARY { + // We don't support buffering for any target tablet type other than the primary. return nil, false } ks := kew.getKeyspaceStatus(ctx, target.Keyspace) if ks == nil { + // If the keyspace status is nil, then the keyspace must be deleted. + // The user query is trying to access a keyspace that has been deleted. + // There is no reason to buffer this query. return nil, false } ks.mu.Lock() defer ks.mu.Unlock() if state, ok := ks.shards[target.Shard]; ok { - // If the primary tablet was present then externallyReparented will be non-zero and - // currentPrimary will be not nil. + // As described in the function comment, we only want to start buffering when all the following conditions are met - + // 1. The shard must have a primary. We check this by checking the currentPrimary and externallyReparented fields being non-empty. + // They are set the first time the shard registers an update from a serving primary and are never cleared out after that. + // If the user has configured vtgates to wait for the primary tablet healthchecks before starting query service, this condition + // will always be true. + // 2. The primary must be non-serving. We check this by checking the serving field in the shard state. + // When a primary becomes non-serving, it also marks the keyspace inconsistent. So the next check is only added + // for being defensive against any bugs. + // 3. The keyspace must be marked inconsistent. We check this by checking the consistent field in the keyspace state. + // + // The reason we need all the three checks is that we want to be very defensive in when we start buffering. + // We don't want to start buffering when we don't know for sure if the primary + // is not serving and we will receive an update that stops buffering soon. return state.currentPrimary, !state.serving && !ks.consistent && state.externallyReparented != 0 && state.currentPrimary != nil } return nil, false @@ -703,3 +741,46 @@ func (kew *KeyspaceEventWatcher) GetServingKeyspaces() []string { } return servingKeyspaces } + +// WaitForConsistentKeyspaces waits for the given set of keyspaces to be marked consistent. +func (kew *KeyspaceEventWatcher) WaitForConsistentKeyspaces(ctx context.Context, ksList []string) error { + // We don't want to change the original keyspace list that we receive so we clone it + // before we empty it elements down below. + keyspaces := slices.Clone(ksList) + for { + // We empty keyspaces as we find them to be consistent. + allConsistent := true + for i, ks := range keyspaces { + if ks == "" { + continue + } + + // Get the keyspace status and see it is consistent yet or not. + kss := kew.getKeyspaceStatus(ctx, ks) + // If kss is nil, then it must be deleted. In that case too it is fine for us to consider + // it consistent since the keyspace has been deleted. + if kss == nil || kss.isConsistent() { + keyspaces[i] = "" + } else { + allConsistent = false + } + } + + if allConsistent { + // all the keyspaces are consistent. + return nil + } + + // Unblock after the sleep or when the context has expired. + select { + case <-ctx.Done(): + for _, ks := range keyspaces { + if ks != "" { + log.Infof("keyspace %v didn't become consistent", ks) + } + } + return ctx.Err() + case <-time.After(waitConsistentKeyspacesCheck): + } + } +} diff --git a/go/vt/discovery/keyspace_events_test.go b/go/vt/discovery/keyspace_events_test.go index bcaf48b62a8..df5696841f7 100644 --- a/go/vt/discovery/keyspace_events_test.go +++ b/go/vt/discovery/keyspace_events_test.go @@ -43,7 +43,7 @@ func TestSrvKeyspaceWithNilNewKeyspace(t *testing.T) { factory.AddCell(cell) ts := faketopo.NewFakeTopoServer(ctx, factory) ts2 := &fakeTopoServer{} - hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, cell, "") + hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, cell, "", nil) defer hc.Close() kew := NewKeyspaceEventWatcher(ctx, ts2, hc, cell) kss := &keyspaceState{ @@ -143,16 +143,16 @@ func TestKeyspaceEventTypes(t *testing.T) { factory.AddCell(cell) ts := faketopo.NewFakeTopoServer(ctx, factory) ts2 := &fakeTopoServer{} - hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, cell, "") + hc := NewHealthCheck(ctx, 1*time.Millisecond, time.Hour, ts, cell, "", nil) defer hc.Close() kew := NewKeyspaceEventWatcher(ctx, ts2, hc, cell) type testCase struct { - name string - kss *keyspaceState - shardToCheck string - expectResharding bool - expectPrimaryNotServing bool + name string + kss *keyspaceState + shardToCheck string + expectResharding bool + expectShouldBuffer bool } testCases := []testCase{ @@ -189,9 +189,9 @@ func TestKeyspaceEventTypes(t *testing.T) { }, consistent: false, }, - shardToCheck: "-", - expectResharding: true, - expectPrimaryNotServing: false, + shardToCheck: "-", + expectResharding: true, + expectShouldBuffer: false, }, { name: "two to four resharding in progress", @@ -250,9 +250,9 @@ func TestKeyspaceEventTypes(t *testing.T) { }, consistent: false, }, - shardToCheck: "-80", - expectResharding: true, - expectPrimaryNotServing: false, + shardToCheck: "-80", + expectResharding: true, + expectShouldBuffer: false, }, { name: "unsharded primary not serving", @@ -276,9 +276,9 @@ func TestKeyspaceEventTypes(t *testing.T) { }, consistent: false, }, - shardToCheck: "-", - expectResharding: false, - expectPrimaryNotServing: true, + shardToCheck: "-", + expectResharding: false, + expectShouldBuffer: true, }, { name: "sharded primary not serving", @@ -310,9 +310,9 @@ func TestKeyspaceEventTypes(t *testing.T) { }, consistent: false, }, - shardToCheck: "-80", - expectResharding: false, - expectPrimaryNotServing: true, + shardToCheck: "-80", + expectResharding: false, + expectShouldBuffer: true, }, } @@ -327,8 +327,89 @@ func TestKeyspaceEventTypes(t *testing.T) { resharding := kew.TargetIsBeingResharded(ctx, tc.kss.shards[tc.shardToCheck].target) require.Equal(t, resharding, tc.expectResharding, "TargetIsBeingResharded should return %t", tc.expectResharding) - _, primaryDown := kew.PrimaryIsNotServing(ctx, tc.kss.shards[tc.shardToCheck].target) - require.Equal(t, primaryDown, tc.expectPrimaryNotServing, "PrimaryIsNotServing should return %t", tc.expectPrimaryNotServing) + _, shouldBuffer := kew.ShouldStartBufferingForTarget(ctx, tc.kss.shards[tc.shardToCheck].target) + require.Equal(t, shouldBuffer, tc.expectShouldBuffer, "ShouldStartBufferingForTarget should return %t", tc.expectShouldBuffer) + }) + } +} + +// TestWaitForConsistentKeyspaces tests the behaviour of WaitForConsistent for different scenarios. +func TestWaitForConsistentKeyspaces(t *testing.T) { + testcases := []struct { + name string + ksMap map[string]*keyspaceState + ksList []string + errExpected string + }{ + { + name: "Empty keyspace list", + ksList: nil, + ksMap: map[string]*keyspaceState{ + "ks1": {}, + }, + errExpected: "", + }, + { + name: "All keyspaces consistent", + ksList: []string{"ks1", "ks2"}, + ksMap: map[string]*keyspaceState{ + "ks1": { + consistent: true, + }, + "ks2": { + consistent: true, + }, + }, + errExpected: "", + }, + { + name: "One keyspace inconsistent", + ksList: []string{"ks1", "ks2"}, + ksMap: map[string]*keyspaceState{ + "ks1": { + consistent: true, + }, + "ks2": { + consistent: false, + }, + }, + errExpected: "context canceled", + }, + { + name: "One deleted keyspace - consistent", + ksList: []string{"ks1", "ks2"}, + ksMap: map[string]*keyspaceState{ + "ks1": { + consistent: true, + }, + "ks2": { + deleted: true, + }, + }, + errExpected: "", + }, + } + + for _, tt := range testcases { + t.Run(tt.name, func(t *testing.T) { + // We create a cancelable context and immediately cancel it. + // We don't want the unit tests to wait, so we only test the first + // iteration of whether the keyspace event watcher returns + // that the keyspaces are consistent or not. + ctx, cancel := context.WithCancel(context.Background()) + cancel() + kew := KeyspaceEventWatcher{ + keyspaces: tt.ksMap, + mu: sync.Mutex{}, + ts: &fakeTopoServer{}, + } + err := kew.WaitForConsistentKeyspaces(ctx, tt.ksList) + if tt.errExpected != "" { + require.ErrorContains(t, err, tt.errExpected) + } else { + require.NoError(t, err) + } + }) } } diff --git a/go/vt/discovery/tablet_health_check.go b/go/vt/discovery/tablet_health_check.go index 64450f4c8c6..ecadeefdf78 100644 --- a/go/vt/discovery/tablet_health_check.go +++ b/go/vt/discovery/tablet_health_check.go @@ -19,7 +19,6 @@ package discovery import ( "context" "fmt" - "net" "strings" "sync" "sync/atomic" @@ -34,16 +33,12 @@ import ( "vitess.io/vitess/go/vt/vttablet/queryservice" "vitess.io/vitess/go/vt/vttablet/tabletconn" - "google.golang.org/grpc" "google.golang.org/protobuf/proto" "vitess.io/vitess/go/vt/proto/query" "vitess.io/vitess/go/vt/proto/topodata" ) -// withDialerContextOnce ensures grpc.WithDialContext() is added once to the options. -var withDialerContextOnce sync.Once - // tabletHealthCheck maintains the health status of a tablet. A map of this // structure is maintained in HealthCheck. type tabletHealthCheck struct { @@ -127,8 +122,8 @@ func (thc *tabletHealthCheck) setServingState(serving bool, reason string) { } // stream streams healthcheck responses to callback. -func (thc *tabletHealthCheck) stream(ctx context.Context, hc *HealthCheckImpl, callback func(*query.StreamHealthResponse) error) error { - conn := thc.Connection(ctx, hc) +func (thc *tabletHealthCheck) stream(ctx context.Context, callback func(*query.StreamHealthResponse) error) error { + conn := thc.Connection(ctx) if conn == nil { // This signals the caller to retry return nil @@ -141,34 +136,14 @@ func (thc *tabletHealthCheck) stream(ctx context.Context, hc *HealthCheckImpl, c return err } -func (thc *tabletHealthCheck) Connection(ctx context.Context, hc *HealthCheckImpl) queryservice.QueryService { +func (thc *tabletHealthCheck) Connection(ctx context.Context) queryservice.QueryService { thc.connMu.Lock() defer thc.connMu.Unlock() - return thc.connectionLocked(ctx, hc) -} - -func healthCheckDialerFactory(hc *HealthCheckImpl) func(ctx context.Context, addr string) (net.Conn, error) { - return func(ctx context.Context, addr string) (net.Conn, error) { - // Limit the number of healthcheck connections opened in parallel to avoid high OS-thread - // usage due to blocking networking syscalls (eg: DNS lookups, TCP connection opens, - // etc). Without this limit it is possible for vtgates watching >10k tablets to hit - // the panic: 'runtime: program exceeds 10000-thread limit'. - if err := hc.healthCheckDialSem.Acquire(ctx, 1); err != nil { - return nil, err - } - defer hc.healthCheckDialSem.Release(1) - var dialer net.Dialer - return dialer.DialContext(ctx, "tcp", addr) - } + return thc.connectionLocked(ctx) } -func (thc *tabletHealthCheck) connectionLocked(ctx context.Context, hc *HealthCheckImpl) queryservice.QueryService { +func (thc *tabletHealthCheck) connectionLocked(ctx context.Context) queryservice.QueryService { if thc.Conn == nil { - withDialerContextOnce.Do(func() { - grpcclient.RegisterGRPCDialOptions(func(opts []grpc.DialOption) ([]grpc.DialOption, error) { - return append(opts, grpc.WithContextDialer(healthCheckDialerFactory(hc))), nil - }) - }) conn, err := tabletconn.GetDialer()(ctx, thc.Tablet, grpcclient.FailFast(true)) if err != nil { thc.LastError = err @@ -297,7 +272,7 @@ func (thc *tabletHealthCheck) checkConn(hc *HealthCheckImpl) { }() // Read stream health responses. - err := thc.stream(streamCtx, hc, func(shr *query.StreamHealthResponse) error { + err := thc.stream(streamCtx, func(shr *query.StreamHealthResponse) error { // We received a message. Reset the back-off. retryDelay = hc.retryDelay // Don't block on send to avoid deadlocks. diff --git a/go/vt/discovery/tablet_picker.go b/go/vt/discovery/tablet_picker.go index fd1ff64a3ce..c48905be948 100644 --- a/go/vt/discovery/tablet_picker.go +++ b/go/vt/discovery/tablet_picker.go @@ -18,7 +18,6 @@ package discovery import ( "context" - "fmt" "io" "math/rand/v2" "sort" @@ -181,7 +180,7 @@ func NewTabletPicker( } if len(missingFields) > 0 { return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, - fmt.Sprintf("Missing required field(s) for tablet picker: %s", strings.Join(missingFields, ", "))) + "Missing required field(s) for tablet picker: %s", strings.Join(missingFields, ", ")) } // Resolve tablet picker options diff --git a/go/vt/discovery/topology_watcher_test.go b/go/vt/discovery/topology_watcher_test.go index ad45ef92ebe..cef367c9b74 100644 --- a/go/vt/discovery/topology_watcher_test.go +++ b/go/vt/discovery/topology_watcher_test.go @@ -28,6 +28,7 @@ import ( "google.golang.org/protobuf/proto" "vitess.io/vitess/go/test/utils" + querypb "vitess.io/vitess/go/vt/proto/query" "vitess.io/vitess/go/vt/logutil" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -122,10 +123,11 @@ func checkWatcher(t *testing.T, refreshKnownTablets bool) { defer ts.Close() fhc := NewFakeHealthCheck(nil) defer fhc.Close() + filter := NewFilterByKeyspace([]string{"keyspace"}) logger := logutil.NewMemoryLogger() topologyWatcherOperations.ZeroAll() counts := topologyWatcherOperations.Counts() - tw := NewTopologyWatcher(context.Background(), ts, fhc, nil, "aa", 10*time.Minute, refreshKnownTablets, 5) + tw := NewTopologyWatcher(context.Background(), ts, fhc, filter, "aa", 10*time.Minute, refreshKnownTablets, 5) counts = checkOpCounts(t, counts, map[string]int64{}) checkChecksum(t, tw, 0) @@ -172,10 +174,31 @@ func checkWatcher(t *testing.T, refreshKnownTablets bool) { require.NoError(t, ts.CreateTablet(context.Background(), tablet2), "CreateTablet failed for %v", tablet2.Alias) tw.loadTablets() + // Confirm second tablet triggers ListTablets + AddTablet calls. counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "GetTablet": 0, "AddTablet": 1}) checkChecksum(t, tw, 2762153755) - // Check the new tablet is returned by GetAllTablets(). + // Add a third tablet in a filtered keyspace to the topology. + tablet3 := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "aa", + Uid: 3, + }, + Hostname: "host3", + PortMap: map[string]int32{ + "vt": 789, + }, + Keyspace: "excluded", + Shard: "shard", + } + require.NoError(t, ts.CreateTablet(context.Background(), tablet3), "CreateTablet failed for %v", tablet3.Alias) + tw.loadTablets() + + // Confirm filtered tablet did not trigger an AddTablet call. + counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "GetTablet": 0, "AddTablet": 0}) + checkChecksum(t, tw, 3177315266) + + // Check the second tablet is returned by GetAllTablets(). This should not contain the filtered tablet. allTablets = fhc.GetAllTablets() key = TabletToMapKey(tablet2) assert.Len(t, allTablets, 2) @@ -207,14 +230,14 @@ func checkWatcher(t *testing.T, refreshKnownTablets bool) { assert.Contains(t, allTablets, key) assert.True(t, proto.Equal(tablet, allTablets[key])) assert.NotContains(t, allTablets, origKey) - checkChecksum(t, tw, 2762153755) + checkChecksum(t, tw, 3177315266) } else { counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "GetTablet": 0, "ReplaceTablet": 0}) assert.Len(t, allTablets, 2) assert.Contains(t, allTablets, origKey) assert.True(t, proto.Equal(origTablet, allTablets[origKey])) assert.NotContains(t, allTablets, key) - checkChecksum(t, tw, 2762153755) + checkChecksum(t, tw, 3177315266) } // Both tablets restart on different hosts. @@ -269,7 +292,7 @@ func checkWatcher(t *testing.T, refreshKnownTablets bool) { require.Nil(t, err, "FixShardReplication failed") tw.loadTablets() counts = checkOpCounts(t, counts, map[string]int64{"ListTablets": 1, "GetTablet": 0, "RemoveTablet": 1}) - checkChecksum(t, tw, 789108290) + checkChecksum(t, tw, 852159264) allTablets = fhc.GetAllTablets() assert.Len(t, allTablets, 1) @@ -280,8 +303,10 @@ func checkWatcher(t *testing.T, refreshKnownTablets bool) { assert.Contains(t, allTablets, key) assert.True(t, proto.Equal(tablet2, allTablets[key])) - // Remove the other and check that it is detected as being gone. + // Remove the other tablets and check that it is detected as being gone. + // Deleting the filtered tablet should not trigger a RemoveTablet call. require.NoError(t, ts.DeleteTablet(context.Background(), tablet2.Alias)) + require.NoError(t, ts.DeleteTablet(context.Background(), tablet3.Alias)) _, err = topo.FixShardReplication(context.Background(), ts, logger, "aa", "keyspace", "shard") require.Nil(t, err, "FixShardReplication failed") tw.loadTablets() @@ -685,3 +710,67 @@ func TestGetTabletErrorDoesNotRemoveFromHealthcheck(t *testing.T) { assert.True(t, proto.Equal(tablet1, allTablets[key1])) assert.True(t, proto.Equal(tablet2, allTablets[key2])) } + +// TestDeadlockBetweenTopologyWatcherAndHealthCheck tests the possibility of a deadlock +// between the topology watcher and the health check. +// The issue https://github.com/vitessio/vitess/issues/16994 has more details on the deadlock. +func TestDeadlockBetweenTopologyWatcherAndHealthCheck(t *testing.T) { + ctx := utils.LeakCheckContext(t) + + // create a new memory topo server and an health check instance. + ts, _ := memorytopo.NewServerAndFactory(ctx, "zone-1") + hc := NewHealthCheck(ctx, time.Hour, time.Hour, ts, "zone-1", "", nil) + defer hc.Close() + defer hc.topoWatchers[0].Stop() + + // Add a tablet to the topology. + tablet1 := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone-1", + Uid: 100, + }, + Type: topodatapb.TabletType_REPLICA, + Hostname: "host1", + PortMap: map[string]int32{ + "grpc": 123, + }, + Keyspace: "keyspace", + Shard: "shard", + } + err := ts.CreateTablet(ctx, tablet1) + // Run the first loadTablets call to ensure the tablet is present in the topology watcher. + hc.topoWatchers[0].loadTablets() + require.NoError(t, err) + + // We want to run updateHealth with arguments that always + // make it trigger load Tablets. + th := &TabletHealth{ + Tablet: tablet1, + Target: &querypb.Target{ + Keyspace: "keyspace", + Shard: "shard", + TabletType: topodatapb.TabletType_REPLICA, + }, + } + prevTarget := &querypb.Target{ + Keyspace: "keyspace", + Shard: "shard", + TabletType: topodatapb.TabletType_PRIMARY, + } + + // If we run the updateHealth function often enough, then we + // will see the deadlock where the topology watcher is trying to replace + // the tablet in the health check, but health check has the mutex acquired + // already because it is calling updateHealth. + // updateHealth itself will be stuck trying to send on the shared channel. + for i := 0; i < 10; i++ { + // Update the port of the tablet so that when update Health asks topo watcher to + // refresh the tablets, it finds an update and tries to replace it. + _, err = ts.UpdateTabletFields(ctx, tablet1.Alias, func(t *topodatapb.Tablet) error { + t.PortMap["testing_port"] = int32(i + 1) + return nil + }) + require.NoError(t, err) + hc.updateHealth(th, prevTarget, false, false) + } +} diff --git a/go/vt/grpcclient/client.go b/go/vt/grpcclient/client.go index b8a8847ac4f..938da95bce6 100644 --- a/go/vt/grpcclient/client.go +++ b/go/vt/grpcclient/client.go @@ -21,12 +21,14 @@ package grpcclient import ( "context" "crypto/tls" + "net" "sync" "time" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/spf13/pflag" + "golang.org/x/sync/semaphore" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" @@ -46,6 +48,10 @@ var ( initialConnWindowSize int initialWindowSize int + // `dialConcurrencyLimit` tells us how many tablet grpc connections can be dialed concurrently. + // This should be less than the golang max thread limit of 10000. + dialConcurrencyLimit int64 = 1024 + // every vitess binary that makes grpc client-side calls. grpcclientBinaries = []string{ "mysqlctld", @@ -74,10 +80,33 @@ func RegisterFlags(fs *pflag.FlagSet) { fs.StringVar(&credsFile, "grpc_auth_static_client_creds", credsFile, "When using grpc_static_auth in the server, this file provides the credentials to use to authenticate with server.") } +func RegisterDeprecatedDialConcurrencyFlagsHealthcheck(fs *pflag.FlagSet) { + fs.Int64Var(&dialConcurrencyLimit, "healthcheck-dial-concurrency", 1024, "Maximum concurrency of new healthcheck connections. This should be less than the golang max thread limit of 10000.") + fs.MarkDeprecated("healthcheck-dial-concurrency", "This option is deprecated and will be removed in a future release. Use --grpc-dial-concurrency-limit instead.") +} + +func RegisterDeprecatedDialConcurrencyFlagsHealthcheckForVtcombo(fs *pflag.FlagSet) { + fs.Int64Var(&dialConcurrencyLimit, "healthcheck-dial-concurrency", 1024, "Maximum concurrency of new healthcheck connections. This should be less than the golang max thread limit of 10000.") + fs.MarkDeprecated("healthcheck-dial-concurrency", "This option is deprecated and will be removed in a future release.") +} + +func RegisterDialConcurrencyFlags(fs *pflag.FlagSet) { + fs.Int64Var(&dialConcurrencyLimit, "grpc-dial-concurrency-limit", 1024, "Maximum concurrency of grpc dial operations. This should be less than the golang max thread limit of 10000.") +} + func init() { for _, cmd := range grpcclientBinaries { servenv.OnParseFor(cmd, RegisterFlags) + + if cmd == "vtgate" || cmd == "vtctld" { + servenv.OnParseFor(cmd, RegisterDeprecatedDialConcurrencyFlagsHealthcheck) + } + + servenv.OnParseFor(cmd, RegisterDialConcurrencyFlags) } + + // vtcombo doesn't really use grpc, but we need to expose this flag for backwards compat + servenv.OnParseFor("vtcombo", RegisterDeprecatedDialConcurrencyFlagsHealthcheckForVtcombo) } // FailFast is a self-documenting type for the grpc.FailFast. @@ -129,6 +158,10 @@ func DialContext(ctx context.Context, target string, failFast FailFast, opts ... newopts = append(newopts, grpc.WithInitialWindowSize(int32(initialWindowSize))) } + if dialConcurrencyLimit > 0 { + newopts = append(newopts, dialConcurrencyLimitOption()) + } + newopts = append(newopts, opts...) var err error grpcDialOptionsMu.Lock() @@ -175,6 +208,35 @@ func SecureDialOption(cert, key, ca, crl, name string) (grpc.DialOption, error) return grpc.WithTransportCredentials(creds), nil } +var dialConcurrencyLimitOpt grpc.DialOption + +// withDialerContextOnce ensures grpc.WithDialContext() is added once to the options. +var dialConcurrencyLimitOnce sync.Once + +func dialConcurrencyLimitOption() grpc.DialOption { + dialConcurrencyLimitOnce.Do(func() { + // This semaphore is used to limit how many grpc connections can be dialed to tablets simultanously. + // This does not limit how many tablet connections can be open at the same time. + sem := semaphore.NewWeighted(dialConcurrencyLimit) + + dialConcurrencyLimitOpt = grpc.WithContextDialer(func(ctx context.Context, addr string) (net.Conn, error) { + // Limit the number of grpc connections opened in parallel to avoid high OS-thread + // usage due to blocking networking syscalls (eg: DNS lookups, TCP connection opens, + // etc). Without this limit it is possible for vtgates watching >10k tablets to hit + // the panic: 'runtime: program exceeds 10000-thread limit'. + if err := sem.Acquire(ctx, 1); err != nil { + return nil, err + } + defer sem.Release(1) + + var dialer net.Dialer + return dialer.DialContext(ctx, "tcp", addr) + }) + }) + + return dialConcurrencyLimitOpt +} + // Allows for building a chain of interceptors without knowing the total size up front type clientInterceptorBuilder struct { unaryInterceptors []grpc.UnaryClientInterceptor diff --git a/go/vt/logutil/throttled.go b/go/vt/logutil/throttled.go index 4ee11912e71..fa63be328bc 100644 --- a/go/vt/logutil/throttled.go +++ b/go/vt/logutil/throttled.go @@ -54,6 +54,11 @@ var ( errorDepth = log.ErrorDepth ) +// GetLastLogTime gets the last log time for the throttled logger. +func (tl *ThrottledLogger) GetLastLogTime() time.Time { + return tl.lastlogTime +} + func (tl *ThrottledLogger) log(logF logFunc, format string, v ...any) { now := time.Now() diff --git a/go/vt/mysqlctl/backup.go b/go/vt/mysqlctl/backup.go index 7052dcbdf87..1cde68b28b7 100644 --- a/go/vt/mysqlctl/backup.go +++ b/go/vt/mysqlctl/backup.go @@ -17,9 +17,11 @@ limitations under the License. package mysqlctl import ( + "bufio" "context" "errors" "fmt" + "io" "os" "path/filepath" "strings" @@ -29,6 +31,7 @@ import ( "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/backupstats" "vitess.io/vitess/go/vt/mysqlctl/backupstorage" "vitess.io/vitess/go/vt/proto/vtrpc" @@ -163,12 +166,14 @@ func Backup(ctx context.Context, params BackupParams) error { // appropriate binlog files. be = BackupRestoreEngineMap[builtinBackupEngineName] } else { - be, err = GetBackupEngine() + be, err = GetBackupEngine(params.BackupEngine) if err != nil { return vterrors.Wrap(err, "failed to find backup engine") } } + params.Logger.Infof("Using backup engine %q", be.Name()) + // Take the backup, and either AbortBackup or EndBackup. backupResult, err := be.ExecuteBackup(ctx, beParams, bh) logger := params.Logger @@ -444,17 +449,19 @@ func Restore(ctx context.Context, params RestoreParams) (*BackupManifest, error) return nil, err } - // mysqld needs to be running in order for mysql_upgrade to work. - // If we've just restored from a backup from previous MySQL version then mysqld - // may fail to start due to a different structure of mysql.* tables. The flag - // --skip-grant-tables ensures that these tables are not read until mysql_upgrade - // is executed. And since with --skip-grant-tables anyone can connect to MySQL - // without password, we are passing --skip-networking to greatly reduce the set - // of those who can connect. - params.Logger.Infof("Restore: starting mysqld for mysql_upgrade") - // Note Start will use dba user for waiting, this is fine, it will be allowed. - if err := params.Mysqld.Start(context.Background(), params.Cnf, "--skip-grant-tables", "--skip-networking"); err != nil { - return nil, err + if re.ShouldStartMySQLAfterRestore() { // all engines except mysqlshell since MySQL is always running there + // mysqld needs to be running in order for mysql_upgrade to work. + // If we've just restored from a backup from previous MySQL version then mysqld + // may fail to start due to a different structure of mysql.* tables. The flag + // --skip-grant-tables ensures that these tables are not read until mysql_upgrade + // is executed. And since with --skip-grant-tables anyone can connect to MySQL + // without password, we are passing --skip-networking to greatly reduce the set + // of those who can connect. + params.Logger.Infof("Restore: starting mysqld for mysql_upgrade") + // Note Start will use dba user for waiting, this is fine, it will be allowed. + if err := params.Mysqld.Start(context.Background(), params.Cnf, "--skip-grant-tables", "--skip-networking"); err != nil { + return nil, err + } } params.Logger.Infof("Restore: running mysql_upgrade") @@ -500,3 +507,20 @@ func Restore(ctx context.Context, params RestoreParams) (*BackupManifest, error) params.Logger.Infof("Restore: complete") return manifest, nil } + +// scanLinesToLogger scans full lines from the given Reader and sends them to +// the given Logger until EOF. +func scanLinesToLogger(prefix string, reader io.Reader, logger logutil.Logger, doneFunc func()) { + defer doneFunc() + + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + line := scanner.Text() + logger.Infof("%s: %s", prefix, line) + } + if err := scanner.Err(); err != nil { + // This is usually run in a background goroutine, so there's no point + // returning an error. Just log it. + logger.Warningf("error scanning lines from %s: %v", prefix, err) + } +} diff --git a/go/vt/mysqlctl/backup_blackbox_race_test.go b/go/vt/mysqlctl/backup_blackbox_race_test.go new file mode 100644 index 00000000000..5414ebc5fa6 --- /dev/null +++ b/go/vt/mysqlctl/backup_blackbox_race_test.go @@ -0,0 +1,152 @@ +//go:build !race + +/* +Copyright 2024 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package mysqlctl_test is the blackbox tests for package mysqlctl. +package mysqlctl_test + +import ( + "fmt" + "os" + "path" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/mysql/fakesqldb" + "vitess.io/vitess/go/test/utils" + "vitess.io/vitess/go/vt/logutil" + "vitess.io/vitess/go/vt/mysqlctl" + "vitess.io/vitess/go/vt/mysqlctl/backupstats" + "vitess.io/vitess/go/vt/mysqlctl/filebackupstorage" + "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/proto/vttime" + "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/topo/memorytopo" +) + +// This test triggers a certain code path that only happens when a backup file fails to be backed up, +// only and only if, all the other backup files have either started or finished. When we reach +// this scenario, files no longer try to acquire the semaphore and thus the backup cannot fail +// because of context deadline when acquiring it. At this point, the only place where the backup +// can fail, is if the return of be.backupFiles fails, and we record the error correctly. +// This test specifically test this scenario and arose because of issue https://github.com/vitessio/vitess/issues/17063 +// The test does: +// 1. Create the backup and data directory +// 2. Create a keyspace and shard +// 3. Already create the last backup file that would be created +// 4. Remove all permissions on this file +// 5. Execute the restore +// 6. The restore must fail due to an error on file number 3 ("cannot add file: 3") +// +// This test is extracted into its own file that won't be run if we do 'go test -race' as this test +// exposes an old race condition that will be fixed after https://github.com/vitessio/vitess/pull/17062 +// Link to the race condition issue: https://github.com/vitessio/vitess/issues/17065 +func TestExecuteBackupWithFailureOnLastFile(t *testing.T) { + ctx := utils.LeakCheckContext(t) + + // Set up local backup directory + id := fmt.Sprintf("%d", time.Now().UnixNano()) + backupRoot := fmt.Sprintf("testdata/builtinbackup_test_%s", id) + filebackupstorage.FileBackupStorageRoot = backupRoot + require.NoError(t, createBackupDir(backupRoot, "innodb", "log", "datadir")) + dataDir := path.Join(backupRoot, "datadir") + // Add some files under data directory to force backup to execute semaphore acquire inside + // backupFiles() method (https://github.com/vitessio/vitess/blob/main/go/vt/mysqlctl/builtinbackupengine.go#L483). + require.NoError(t, createBackupDir(dataDir, "test1")) + require.NoError(t, createBackupDir(dataDir, "test2")) + require.NoError(t, createBackupFiles(path.Join(dataDir, "test1"), 2, "ibd")) + require.NoError(t, createBackupFiles(path.Join(dataDir, "test2"), 2, "ibd")) + defer os.RemoveAll(backupRoot) + + needIt, err := needInnoDBRedoLogSubdir() + require.NoError(t, err) + if needIt { + fpath := path.Join("log", mysql.DynamicRedoLogSubdir) + if err := createBackupDir(backupRoot, fpath); err != nil { + require.Failf(t, err.Error(), "failed to create directory: %s", fpath) + } + } + + // Set up topo + keyspace, shard := "mykeyspace", "-" + ts := memorytopo.NewServer(ctx, "cell1") + defer ts.Close() + + require.NoError(t, ts.CreateKeyspace(ctx, keyspace, &topodata.Keyspace{})) + require.NoError(t, ts.CreateShard(ctx, keyspace, shard)) + + tablet := topo.NewTablet(100, "cell1", "mykeyspace-00-80-0100") + tablet.Keyspace = keyspace + tablet.Shard = shard + + require.NoError(t, ts.CreateTablet(ctx, tablet)) + + _, err = ts.UpdateShardFields(ctx, keyspace, shard, func(si *topo.ShardInfo) error { + si.PrimaryAlias = &topodata.TabletAlias{Uid: 100, Cell: "cell1"} + + now := time.Now() + si.PrimaryTermStartTime = &vttime.Time{Seconds: int64(now.Second()), Nanoseconds: int32(now.Nanosecond())} + + return nil + }) + + require.NoError(t, err) + + be := &mysqlctl.BuiltinBackupEngine{} + bh := filebackupstorage.NewBackupHandle(nil, "", "", false) + // Spin up a fake daemon to be used in backups. It needs to be allowed to receive: + // "STOP REPLICA", "START REPLICA", in that order. + fakedb := fakesqldb.New(t) + defer fakedb.Close() + mysqld := mysqlctl.NewFakeMysqlDaemon(fakedb) + defer mysqld.Close() + mysqld.ExpectedExecuteSuperQueryList = []string{"STOP REPLICA", "START REPLICA"} + + // With this setup, 4 backup files will be created (0, 1, 2, 3). For the last file (3), we create + // it in advance and remove all permission on the file so that the backup be.ExecuteBackup will not + // be able to override the file and thus will fail. Triggering the error mechanism after calling be.backupFile. + lastBackupFile := path.Join(backupRoot, "3") + f, err := os.Create(lastBackupFile) + require.NoError(t, err) + _, err = f.Write(make([]byte, 1024)) + require.NoError(t, err) + require.NoError(t, f.Chmod(0444)) + require.NoError(t, f.Close()) + + backupResult, err := be.ExecuteBackup(ctx, mysqlctl.BackupParams{ + Logger: logutil.NewConsoleLogger(), + Mysqld: mysqld, + Cnf: &mysqlctl.Mycnf{ + InnodbDataHomeDir: path.Join(backupRoot, "innodb"), + InnodbLogGroupHomeDir: path.Join(backupRoot, "log"), + DataDir: path.Join(backupRoot, "datadir"), + }, + Stats: backupstats.NewFakeStats(), + Concurrency: 4, + HookExtraEnv: map[string]string{}, + TopoServer: ts, + Keyspace: keyspace, + Shard: shard, + MysqlShutdownTimeout: mysqlShutdownTimeout, + }, bh) + + require.ErrorContains(t, err, "cannot add file: 3") + require.Equal(t, mysqlctl.BackupUnusable, backupResult) +} diff --git a/go/vt/mysqlctl/backup_test.go b/go/vt/mysqlctl/backup_test.go index d1d6a73b7bd..465e77a005b 100644 --- a/go/vt/mysqlctl/backup_test.go +++ b/go/vt/mysqlctl/backup_test.go @@ -26,19 +26,18 @@ import ( "path" "reflect" "sort" + "sync" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "vitess.io/vitess/go/sqltypes" - "vitess.io/vitess/go/test/utils" - - "vitess.io/vitess/go/mysql/replication" - "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/mysql/fakesqldb" + "vitess.io/vitess/go/mysql/replication" + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/backupstats" "vitess.io/vitess/go/vt/mysqlctl/backupstorage" @@ -498,7 +497,7 @@ func TestRestoreManifestMySQLVersionValidation(t *testing.T) { manifest := BackupManifest{ BackupTime: time.Now().Add(-1 * time.Hour).Format(time.RFC3339), - BackupMethod: "fake", + BackupMethod: fakeBackupEngineName, Keyspace: "test", Shard: "-", MySQLVersion: tc.fromVersion, @@ -599,7 +598,7 @@ func createFakeBackupRestoreEnv(t *testing.T) *fakeBackupRestoreEnv { manifest := BackupManifest{ BackupTime: FormatRFC3339(time.Now().Add(-1 * time.Hour)), - BackupMethod: "fake", + BackupMethod: fakeBackupEngineName, Keyspace: "test", Shard: "-", MySQLVersion: "8.0.32", @@ -612,8 +611,8 @@ func createFakeBackupRestoreEnv(t *testing.T) *fakeBackupRestoreEnv { testBackupEngine.ExecuteRestoreReturn = FakeBackupEngineExecuteRestoreReturn{&manifest, nil} previousBackupEngineImplementation := backupEngineImplementation - BackupRestoreEngineMap["fake"] = &testBackupEngine - backupEngineImplementation = "fake" + BackupRestoreEngineMap[fakeBackupEngineName] = &testBackupEngine + backupEngineImplementation = fakeBackupEngineName testBackupStorage := FakeBackupStorage{} testBackupStorage.ListBackupsReturn = FakeBackupStorageListBackupsReturn{ @@ -628,9 +627,9 @@ func createFakeBackupRestoreEnv(t *testing.T) *fakeBackupRestoreEnv { testBackupStorage.StartBackupReturn = FakeBackupStorageStartBackupReturn{&FakeBackupHandle{}, nil} testBackupStorage.WithParamsReturn = &testBackupStorage - backupstorage.BackupStorageMap["fake"] = &testBackupStorage + backupstorage.BackupStorageMap[fakeBackupEngineName] = &testBackupStorage previousBackupStorageImplementation := backupstorage.BackupStorageImplementation - backupstorage.BackupStorageImplementation = "fake" + backupstorage.BackupStorageImplementation = fakeBackupEngineName // all restore integration tests must be leak checked t.Cleanup(func() { @@ -641,10 +640,10 @@ func createFakeBackupRestoreEnv(t *testing.T) *fakeBackupRestoreEnv { backupstats.DeprecatedBackupDurationS.Reset() backupstats.DeprecatedRestoreDurationS.Reset() - delete(BackupRestoreEngineMap, "fake") + delete(BackupRestoreEngineMap, fakeBackupEngineName) backupEngineImplementation = previousBackupEngineImplementation - delete(backupstorage.BackupStorageMap, "fake") + delete(backupstorage.BackupStorageMap, fakeBackupEngineName) backupstorage.BackupStorageImplementation = previousBackupStorageImplementation mysqld.Close() sqldb.Close() @@ -714,3 +713,26 @@ func TestShouldRestore(t *testing.T) { assert.False(t, b) assert.NoError(t, err) } + +func TestScanLinesToLogger(t *testing.T) { + reader, writer := io.Pipe() + logger := logutil.NewMemoryLogger() + var wg sync.WaitGroup + + wg.Add(1) + go scanLinesToLogger("test", reader, logger, wg.Done) + + for i := range 100 { + _, err := writer.Write([]byte(fmt.Sprintf("foobar %d\n", i))) + require.NoError(t, err) + } + + writer.Close() + wg.Wait() + + require.Equal(t, 100, len(logger.Events)) + + for i, event := range logger.Events { + require.Equal(t, fmt.Sprintf("test: foobar %d", i), event.Value) + } +} diff --git a/go/vt/mysqlctl/backupengine.go b/go/vt/mysqlctl/backupengine.go index c483aff3d78..fb3d0e2d125 100644 --- a/go/vt/mysqlctl/backupengine.go +++ b/go/vt/mysqlctl/backupengine.go @@ -23,6 +23,7 @@ import ( "os" "path" "path/filepath" + "slices" "strings" "time" @@ -57,6 +58,7 @@ const ( type BackupEngine interface { ExecuteBackup(ctx context.Context, params BackupParams, bh backupstorage.BackupHandle) (BackupResult, error) ShouldDrainForBackup(req *tabletmanagerdatapb.BackupRequest) bool + Name() string } // BackupParams is the struct that holds all params passed to ExecuteBackup @@ -87,6 +89,8 @@ type BackupParams struct { UpgradeSafe bool // MysqlShutdownTimeout defines how long we wait during MySQL shutdown if that is part of the backup process. MysqlShutdownTimeout time.Duration + // BackupEngine allows us to override which backup engine should be used for a request + BackupEngine string } func (b *BackupParams) Copy() BackupParams { @@ -143,6 +147,8 @@ type RestoreParams struct { Stats backupstats.Stats // MysqlShutdownTimeout defines how long we wait during MySQL shutdown if that is part of the backup process. MysqlShutdownTimeout time.Duration + // AllowedBackupEngines if present will filter out any backups taken with engines not included in the list + AllowedBackupEngines []string } func (p *RestoreParams) Copy() RestoreParams { @@ -179,6 +185,7 @@ func (p *RestoreParams) IsIncrementalRecovery() bool { // Returns the manifest of a backup if successful, otherwise returns an error type RestoreEngine interface { ExecuteRestore(ctx context.Context, params RestoreParams, bh backupstorage.BackupHandle) (*BackupManifest, error) + ShouldStartMySQLAfterRestore() bool } // BackupRestoreEngine is a combination of BackupEngine and RestoreEngine. @@ -213,8 +220,12 @@ func registerBackupEngineFlags(fs *pflag.FlagSet) { // a particular backup by calling GetRestoreEngine(). // // This must only be called after flags have been parsed. -func GetBackupEngine() (BackupEngine, error) { +func GetBackupEngine(backupEngine string) (BackupEngine, error) { name := backupEngineImplementation + if backupEngine != "" { + name = backupEngine + } + be, ok := BackupRestoreEngineMap[name] if !ok { return nil, vterrors.Errorf(vtrpc.Code_NOT_FOUND, "unknown BackupEngine implementation %q", name) @@ -514,6 +525,13 @@ func FindBackupToRestore(ctx context.Context, params RestoreParams, bhs []backup params.Logger.Warningf("Possibly incomplete backup %v in directory %v on BackupStorage: can't read MANIFEST: %v)", bh.Name(), backupDir, err) continue } + + // if allowed backup engine is not empty, we only try to restore from backups taken with the specified backup engines + if len(params.AllowedBackupEngines) > 0 && !slices.Contains(params.AllowedBackupEngines, bm.BackupMethod) { + params.Logger.Warningf("Ignoring backup %v because it is using %q backup engine", bh.Name(), bm.BackupMethod) + continue + } + // the manifest is valid manifests[i] = bm // manifests's order is insignificant, it will be sorted later on manifestHandleMap.Map(bm, bh) diff --git a/go/vt/mysqlctl/builtinbackupengine.go b/go/vt/mysqlctl/builtinbackupengine.go index 3bc39e45e72..f3cbe5364a0 100644 --- a/go/vt/mysqlctl/builtinbackupengine.go +++ b/go/vt/mysqlctl/builtinbackupengine.go @@ -92,8 +92,7 @@ var ( // it implements the BackupEngine interface and contains all the logic // required to implement a backup/restore by copying files from and to // the correct location / storage bucket -type BuiltinBackupEngine struct { -} +type BuiltinBackupEngine struct{} // builtinBackupManifest represents the backup. It lists all the files, the // Position that the backup was taken at, the compression engine used, etc. @@ -186,7 +185,7 @@ func (fe *FileEntry) fullPath(cnf *Mycnf) (string, error) { return path.Join(fe.ParentPath, root, fe.Name), nil } -// open attempts t oopen the file +// open attempts to open the file func (fe *FileEntry) open(cnf *Mycnf, readOnly bool) (*os.File, error) { name, err := fe.fullPath(cnf) if err != nil { @@ -194,7 +193,7 @@ func (fe *FileEntry) open(cnf *Mycnf, readOnly bool) (*os.File, error) { } var fd *os.File if readOnly { - if fd, err = os.Open(name); err != nil { + if fd, err = openForSequential(name); err != nil { return nil, vterrors.Wrapf(err, "cannot open source file %v", name) } } else { @@ -393,7 +392,6 @@ func (be *BuiltinBackupEngine) executeIncrementalBackup(ctx context.Context, par // executeFullBackup returns a BackupResult that indicates the usability of the backup, // and an overall error. func (be *BuiltinBackupEngine) executeFullBackup(ctx context.Context, params BackupParams, bh backupstorage.BackupHandle) (BackupResult, error) { - if params.IncrementalFromPos != "" { return be.executeIncrementalBackup(ctx, params, bh) } @@ -401,8 +399,8 @@ func (be *BuiltinBackupEngine) executeFullBackup(ctx context.Context, params Bac // Save initial state so we can restore. replicaStartRequired := false sourceIsPrimary := false - superReadOnly := true //nolint - readOnly := true //nolint + superReadOnly := true // nolint + readOnly := true // nolint var replicationPosition replication.Position semiSyncSource, semiSyncReplica := params.Mysqld.SemiSyncEnabled(ctx) @@ -604,39 +602,51 @@ func (be *BuiltinBackupEngine) backupFiles( // Backup with the provided concurrency. sema := semaphore.NewWeighted(int64(params.Concurrency)) wg := sync.WaitGroup{} + + ctxCancel, cancel := context.WithCancel(ctx) + defer cancel() + for i := range fes { wg.Add(1) go func(i int) { defer wg.Done() fe := &fes[i] // Wait until we are ready to go, return if we encounter an error - acqErr := sema.Acquire(ctx, 1) + acqErr := sema.Acquire(ctxCancel, 1) if acqErr != nil { log.Errorf("Unable to acquire semaphore needed to backup file: %s, err: %s", fe.Name, acqErr.Error()) bh.RecordError(acqErr) + cancel() return } defer sema.Release(1) + + // First check if we have any error, if we have, there is no point trying backing up this file. + // We check for errors before checking if the context is canceled on purpose, if there was an + // error, the context would have been canceled already. + if bh.HasErrors() { + params.Logger.Errorf("Failed to restore files due to error: %v", bh.Error()) + return + } + // Check for context cancellation explicitly because, the way semaphore code is written, theoretically we might // end up not throwing an error even after cancellation. Please see https://cs.opensource.google/go/x/sync/+/refs/tags/v0.1.0:semaphore/semaphore.go;l=66, // which suggests that if the context is already done, `Acquire()` may still succeed without blocking. This introduces // unpredictability in my test cases, so in order to avoid that, I am adding this cancellation check. select { - case <-ctx.Done(): + case <-ctxCancel.Done(): log.Errorf("Context canceled or timed out during %q backup", fe.Name) bh.RecordError(vterrors.Errorf(vtrpc.Code_CANCELED, "context canceled")) return default: } - if bh.HasErrors() { - params.Logger.Infof("failed to backup files due to error.") - return - } - // Backup the individual file. name := fmt.Sprintf("%v", i) - bh.RecordError(be.backupFile(ctx, params, bh, fe, name)) + if err := be.backupFile(ctxCancel, params, bh, fe, name); err != nil { + bh.RecordError(err) + cancel() + } }(i) } @@ -768,21 +778,28 @@ func (bp *backupPipe) HashString() string { return hex.EncodeToString(bp.crc32.Sum(nil)) } -func (bp *backupPipe) ReportProgress(period time.Duration, logger logutil.Logger) { +func (bp *backupPipe) ReportProgress(ctx context.Context, period time.Duration, logger logutil.Logger, restore bool) { + messageStr := "restoring " + if !restore { + messageStr = "backing up " + } tick := time.NewTicker(period) defer tick.Stop() for { select { + case <-ctx.Done(): + logger.Infof("Canceled %s of %q file", messageStr, bp.filename) + return case <-bp.done: - logger.Infof("Done taking Backup %q", bp.filename) + logger.Infof("Completed %s %q", messageStr, bp.filename) return case <-tick.C: written := float64(atomic.LoadInt64(&bp.nn)) if bp.maxSize == 0 { - logger.Infof("Backup %q: %.02fkb", bp.filename, written/1024.0) + logger.Infof("%s %q: %.02fkb", messageStr, bp.filename, written/1024.0) } else { maxSize := float64(bp.maxSize) - logger.Infof("Backup %q: %.02f%% (%.02f/%.02fkb)", bp.filename, 100.0*written/maxSize, written/1024.0, maxSize/1024.0) + logger.Infof("%s %q: %.02f%% (%.02f/%.02fkb)", messageStr, bp.filename, 100.0*written/maxSize, written/1024.0, maxSize/1024.0) } } } @@ -791,7 +808,11 @@ func (bp *backupPipe) ReportProgress(period time.Duration, logger logutil.Logger // backupFile backs up an individual file. func (be *BuiltinBackupEngine) backupFile(ctx context.Context, params BackupParams, bh backupstorage.BackupHandle, fe *FileEntry, name string) (finalErr error) { ctx, cancel := context.WithCancel(ctx) - defer cancel() + defer func() { + if finalErr != nil { + cancel() + } + }() // Open the source file for reading. openSourceAt := time.Now() source, err := fe.open(params.Cnf, true) @@ -815,7 +836,7 @@ func (be *BuiltinBackupEngine) backupFile(ctx context.Context, params BackupPara } br := newBackupReader(fe.Name, fi.Size(), timedSource) - go br.ReportProgress(builtinBackupProgress, params.Logger) + go br.ReportProgress(ctx, builtinBackupProgress, params.Logger, false /*restore*/) // Open the destination file for writing, and a buffer. params.Logger.Infof("Backing up file: %v", fe.Name) @@ -968,7 +989,6 @@ func (be *BuiltinBackupEngine) executeRestoreIncrementalBackup(ctx context.Conte // we return the position from which replication should start // otherwise an error is returned func (be *BuiltinBackupEngine) ExecuteRestore(ctx context.Context, params RestoreParams, bh backupstorage.BackupHandle) (*BackupManifest, error) { - var bm builtinBackupManifest if err := getBackupManifestInto(ctx, bh, &bm); err != nil { return nil, err @@ -1015,43 +1035,53 @@ func (be *BuiltinBackupEngine) restoreFiles(ctx context.Context, params RestoreP sema := semaphore.NewWeighted(int64(params.Concurrency)) rec := concurrency.AllErrorRecorder{} wg := sync.WaitGroup{} + + ctxCancel, cancel := context.WithCancel(ctx) + defer cancel() + for i := range fes { wg.Add(1) go func(i int) { defer wg.Done() fe := &fes[i] // Wait until we are ready to go, return if we encounter an error - acqErr := sema.Acquire(ctx, 1) + acqErr := sema.Acquire(ctxCancel, 1) if acqErr != nil { log.Errorf("Unable to acquire semaphore needed to restore file: %s, err: %s", fe.Name, acqErr.Error()) rec.RecordError(acqErr) + cancel() return } defer sema.Release(1) + + // First check if we have any error, if we have, there is no point trying to restore this file. + // We check for errors before checking if the context is canceled on purpose, if there was an + // error, the context would have been canceled already. + if rec.HasErrors() { + params.Logger.Errorf("Failed to restore files due to error: %v", bh.Error()) + return + } + // Check for context cancellation explicitly because, the way semaphore code is written, theoretically we might // end up not throwing an error even after cancellation. Please see https://cs.opensource.google/go/x/sync/+/refs/tags/v0.1.0:semaphore/semaphore.go;l=66, // which suggests that if the context is already done, `Acquire()` may still succeed without blocking. This introduces // unpredictability in my test cases, so in order to avoid that, I am adding this cancellation check. select { - case <-ctx.Done(): + case <-ctxCancel.Done(): log.Errorf("Context canceled or timed out during %q restore", fe.Name) rec.RecordError(vterrors.Errorf(vtrpc.Code_CANCELED, "context canceled")) return default: } - if rec.HasErrors() { - params.Logger.Infof("Failed to restore files due to error.") - return - } - fe.ParentPath = createdDir // And restore the file. name := fmt.Sprintf("%v", i) params.Logger.Infof("Copying file %v: %v", name, fe.Name) - err := be.restoreFile(ctx, params, bh, fe, bm, name) + err := be.restoreFile(ctxCancel, params, bh, fe, bm, name) if err != nil { rec.RecordError(vterrors.Wrapf(err, "can't restore file %v to %v", name, fe.Name)) + cancel() } }(i) } @@ -1081,7 +1111,7 @@ func (be *BuiltinBackupEngine) restoreFile(ctx context.Context, params RestorePa }() br := newBackupReader(name, 0, timedSource) - go br.ReportProgress(builtinBackupProgress, params.Logger) + go br.ReportProgress(ctx, builtinBackupProgress, params.Logger, true) var reader io.Reader = br // Open the destination file for writing. @@ -1108,7 +1138,7 @@ func (be *BuiltinBackupEngine) restoreFile(ctx context.Context, params RestorePa // Create the uncompresser if needed. if !bm.SkipCompress { var decompressor io.ReadCloser - var deCompressionEngine = bm.CompressionEngine + deCompressionEngine := bm.CompressionEngine if deCompressionEngine == "" { // for backward compatibility @@ -1184,6 +1214,13 @@ func (be *BuiltinBackupEngine) ShouldDrainForBackup(req *tabletmanagerdatapb.Bac return true } +// ShouldStartMySQLAfterRestore signifies if this backup engine needs to restart MySQL once the restore is completed. +func (be *BuiltinBackupEngine) ShouldStartMySQLAfterRestore() bool { + return true +} + +func (be *BuiltinBackupEngine) Name() string { return builtinBackupEngineName } + func getPrimaryPosition(ctx context.Context, tmc tmclient.TabletManagerClient, ts *topo.Server, keyspace, shard string) (replication.Position, error) { si, err := ts.GetShard(ctx, keyspace, shard) if err != nil { diff --git a/go/vt/mysqlctl/builtinbackupengine_linux.go b/go/vt/mysqlctl/builtinbackupengine_linux.go new file mode 100644 index 00000000000..0185e091deb --- /dev/null +++ b/go/vt/mysqlctl/builtinbackupengine_linux.go @@ -0,0 +1,44 @@ +/* +Copyright 2024 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 +li*/ + +package mysqlctl + +import ( + "os" + + "golang.org/x/sys/unix" +) + +// openForSequential opens a file and hints to the kernel that this file +// is intended to be read sequentially, setting the FADV_SEQUENTIAL flag. +// See: https://linux.die.net/man/2/fadvise +func openForSequential(name string) (*os.File, error) { + f, err := os.Open(name) + if err != nil { + return nil, err + } + // XXX: beyond this path, if we error, we need to close + // our File since we're not returning it anymore. + fstat, err := f.Stat() + if err != nil { + f.Close() + return nil, err + } + if err := unix.Fadvise(int(f.Fd()), 0, fstat.Size(), unix.FADV_SEQUENTIAL); err != nil { + f.Close() + return nil, err + } + return f, nil +} diff --git a/go/vt/mysqlctl/builtinbackupengine_stub.go b/go/vt/mysqlctl/builtinbackupengine_stub.go new file mode 100644 index 00000000000..0c0ae9b9ef5 --- /dev/null +++ b/go/vt/mysqlctl/builtinbackupengine_stub.go @@ -0,0 +1,24 @@ +//go:build !linux + +/* +Copyright 2024 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 +li*/ + +package mysqlctl + +import "os" + +func openForSequential(name string) (*os.File, error) { + return os.Open(name) +} diff --git a/go/vt/mysqlctl/fakebackupengine.go b/go/vt/mysqlctl/fakebackupengine.go index d78282e6aff..bda2bf4c311 100644 --- a/go/vt/mysqlctl/fakebackupengine.go +++ b/go/vt/mysqlctl/fakebackupengine.go @@ -24,6 +24,8 @@ import ( tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" ) +const fakeBackupEngineName = "fake" + type FakeBackupEngine struct { ExecuteBackupCalls []FakeBackupEngineExecuteBackupCall ExecuteBackupDuration time.Duration @@ -91,3 +93,9 @@ func (be *FakeBackupEngine) ShouldDrainForBackup(req *tabletmanagerdatapb.Backup be.ShouldDrainForBackupCalls = be.ShouldDrainForBackupCalls + 1 return be.ShouldDrainForBackupReturn } + +func (be *FakeBackupEngine) Name() string { return fakeBackupEngineName } + +func (be *FakeBackupEngine) ShouldStartMySQLAfterRestore() bool { + return true +} diff --git a/go/vt/mysqlctl/fakemysqldaemon.go b/go/vt/mysqlctl/fakemysqldaemon.go index 317aed4f578..e6afe7917f1 100644 --- a/go/vt/mysqlctl/fakemysqldaemon.go +++ b/go/vt/mysqlctl/fakemysqldaemon.go @@ -18,6 +18,7 @@ package mysqlctl import ( "context" + "errors" "fmt" "reflect" "regexp" @@ -66,6 +67,9 @@ type FakeMysqlDaemon struct { // return an error. MysqlPort atomic.Int32 + // ServerUUID is the server's UUID. + ServerUUID string + // Replicating is updated when calling StartReplication / // StopReplication (it is not used at all when calling // ReplicationStatus, it is the test owner responsibility @@ -80,6 +84,9 @@ type FakeMysqlDaemon struct { // and ReplicationStatus. CurrentPrimaryPosition replication.Position + // CurrentRelayLogPosition is returned by ReplicationStatus. + CurrentRelayLogPosition replication.Position + // CurrentSourceFilePosition is used to determine the executed // file based positioning of the replication source. CurrentSourceFilePosition replication.Position @@ -96,6 +103,9 @@ type FakeMysqlDaemon struct { // PrimaryStatusError is used by PrimaryStatus. PrimaryStatusError error + // GlobalStatusVars is used by GetGlobalStatusVars. + GlobalStatusVars map[string]string + // CurrentSourceHost is returned by ReplicationStatus. CurrentSourceHost string @@ -178,6 +188,9 @@ type FakeMysqlDaemon struct { // SemiSyncReplicaEnabled represents the state of rpl_semi_sync_replica_enabled. SemiSyncReplicaEnabled bool + // GlobalReadLock is used to test if a lock has been acquired already or not + GlobalReadLock bool + // TimeoutHook is a func that can be called at the beginning of // any method to fake a timeout. // All a test needs to do is make it { return context.DeadlineExceeded }. @@ -289,14 +302,10 @@ func (fmd *FakeMysqlDaemon) GetServerID(ctx context.Context) (uint32, error) { // GetServerUUID is part of the MysqlDaemon interface. func (fmd *FakeMysqlDaemon) GetServerUUID(ctx context.Context) (string, error) { - return "000000", nil -} - -// CurrentPrimaryPositionLocked is thread-safe. -func (fmd *FakeMysqlDaemon) CurrentPrimaryPositionLocked(pos replication.Position) { - fmd.mu.Lock() - defer fmd.mu.Unlock() - fmd.CurrentPrimaryPosition = pos + if fmd.ServerUUID != "" { + return fmd.ServerUUID, nil + } + return "00000000-0000-0000-0000-000000000000", nil } // ReplicationStatus is part of the MysqlDaemon interface. @@ -309,6 +318,7 @@ func (fmd *FakeMysqlDaemon) ReplicationStatus(ctx context.Context) (replication. return replication.ReplicationStatus{ Position: fmd.CurrentPrimaryPosition, FilePosition: fmd.CurrentSourceFilePosition, + RelayLogPosition: fmd.CurrentRelayLogPosition, RelayLogSourceBinlogEquivalentPosition: fmd.CurrentSourceFilePosition, ReplicationLagSeconds: fmd.ReplicationLagSeconds, // Implemented as AND to avoid changing all tests that were @@ -322,12 +332,16 @@ func (fmd *FakeMysqlDaemon) ReplicationStatus(ctx context.Context) (replication. // PrimaryStatus is part of the MysqlDaemon interface. func (fmd *FakeMysqlDaemon) PrimaryStatus(ctx context.Context) (replication.PrimaryStatus, error) { + fmd.mu.Lock() + defer fmd.mu.Unlock() if fmd.PrimaryStatusError != nil { return replication.PrimaryStatus{}, fmd.PrimaryStatusError } + serverUUID, _ := fmd.GetServerUUID(ctx) return replication.PrimaryStatus{ Position: fmd.CurrentPrimaryPosition, FilePosition: fmd.CurrentSourceFilePosition, + ServerUUID: serverUUID, }, nil } @@ -391,7 +405,21 @@ func (fmd *FakeMysqlDaemon) GetPreviousGTIDs(ctx context.Context, binlog string) // PrimaryPosition is part of the MysqlDaemon interface. func (fmd *FakeMysqlDaemon) PrimaryPosition(ctx context.Context) (replication.Position, error) { - return fmd.CurrentPrimaryPosition, nil + return fmd.GetPrimaryPositionLocked(), nil +} + +// GetPrimaryPositionLocked gets the primary position while holding the lock. +func (fmd *FakeMysqlDaemon) GetPrimaryPositionLocked() replication.Position { + fmd.mu.Lock() + defer fmd.mu.Unlock() + return fmd.CurrentPrimaryPosition +} + +// SetPrimaryPositionLocked is thread-safe. +func (fmd *FakeMysqlDaemon) SetPrimaryPositionLocked(pos replication.Position) { + fmd.mu.Lock() + defer fmd.mu.Unlock() + fmd.CurrentPrimaryPosition = pos } // IsReadOnly is part of the MysqlDaemon interface. @@ -419,9 +447,7 @@ func (fmd *FakeMysqlDaemon) SetSuperReadOnly(ctx context.Context, on bool) (Rese // GetGlobalStatusVars is part of the MysqlDaemon interface. func (fmd *FakeMysqlDaemon) GetGlobalStatusVars(ctx context.Context, variables []string) (map[string]string, error) { - return make(map[string]string), fmd.ExecuteSuperQueryList(ctx, []string{ - "FAKE " + getGlobalStatusQuery, - }) + return fmd.GlobalStatusVars, nil } // StartReplication is part of the MysqlDaemon interface. @@ -544,6 +570,11 @@ func (fmd *FakeMysqlDaemon) Promote(ctx context.Context, hookExtraEnv map[string return fmd.PromoteResult, nil } +// ExecuteSuperQuery is part of the MysqlDaemon interface +func (fmd *FakeMysqlDaemon) ExecuteSuperQuery(ctx context.Context, query string) error { + return fmd.ExecuteSuperQueryList(ctx, []string{query}) +} + // ExecuteSuperQueryList is part of the MysqlDaemon interface func (fmd *FakeMysqlDaemon) ExecuteSuperQueryList(ctx context.Context, queryList []string) error { for _, query := range queryList { @@ -736,3 +767,36 @@ func (fmd *FakeMysqlDaemon) GetVersionString(ctx context.Context) (string, error func (fmd *FakeMysqlDaemon) GetVersionComment(ctx context.Context) (string, error) { return "", nil } + +func (fmd *FakeMysqlDaemon) HostMetrics(ctx context.Context, cnf *Mycnf) (*mysqlctlpb.HostMetricsResponse, error) { + return &mysqlctlpb.HostMetricsResponse{ + Metrics: map[string]*mysqlctlpb.HostMetricsResponse_Metric{ + "loadavg": { + Value: 1.0, + }, + "datadir-used-ratio": { + Value: 0.2, + }, + }, + }, nil +} + +// AcquireGlobalReadLock is part of the MysqlDaemon interface. +func (fmd *FakeMysqlDaemon) AcquireGlobalReadLock(ctx context.Context) error { + if fmd.GlobalReadLock { + return errors.New("lock already acquired") + } + + fmd.GlobalReadLock = true + return nil +} + +// ReleaseGlobalReadLock is part of the MysqlDaemon interface. +func (fmd *FakeMysqlDaemon) ReleaseGlobalReadLock(ctx context.Context) error { + if fmd.GlobalReadLock { + fmd.GlobalReadLock = false + return nil + } + + return errors.New("no read locks acquired yet") +} diff --git a/go/vt/mysqlctl/grpcmysqlctlserver/server.go b/go/vt/mysqlctl/grpcmysqlctlserver/server.go index 2a703a50a84..dfbab137afe 100644 --- a/go/vt/mysqlctl/grpcmysqlctlserver/server.go +++ b/go/vt/mysqlctl/grpcmysqlctlserver/server.go @@ -88,6 +88,10 @@ func (s *server) VersionString(ctx context.Context, request *mysqlctlpb.VersionS return &mysqlctlpb.VersionStringResponse{Version: version}, nil } +func (s *server) HostMetrics(ctx context.Context, request *mysqlctlpb.HostMetricsRequest) (*mysqlctlpb.HostMetricsResponse, error) { + return s.mysqld.HostMetrics(ctx, s.cnf) +} + // StartServer registers the Server for RPCs. func StartServer(s *grpc.Server, cnf *mysqlctl.Mycnf, mysqld *mysqlctl.Mysqld) { mysqlctlpb.RegisterMysqlCtlServer(s, &server{cnf: cnf, mysqld: mysqld}) diff --git a/go/vt/mysqlctl/mysql_daemon.go b/go/vt/mysqlctl/mysql_daemon.go index 6c7df04786c..f7a564c7bec 100644 --- a/go/vt/mysqlctl/mysql_daemon.go +++ b/go/vt/mysqlctl/mysql_daemon.go @@ -119,12 +119,25 @@ type MysqlDaemon interface { // GetVersionComment returns the version comment GetVersionComment(ctx context.Context) (string, error) + // HostMetrics returns some OS metrics + HostMetrics(ctx context.Context, cnf *Mycnf) (*mysqlctlpb.HostMetricsResponse, error) + + // ExecuteSuperQuery executes a single query, no result + ExecuteSuperQuery(ctx context.Context, query string) error + // ExecuteSuperQueryList executes a list of queries, no result ExecuteSuperQueryList(ctx context.Context, queryList []string) error // FetchSuperQuery executes one query, returns the result FetchSuperQuery(ctx context.Context, query string) (*sqltypes.Result, error) + // AcquireGlobalReadLock acquires a global read lock and keeps the connection so + // as to release it with the function below. + AcquireGlobalReadLock(ctx context.Context) error + + // ReleaseGlobalReadLock release a lock acquired with the connection from the above function. + ReleaseGlobalReadLock(ctx context.Context) error + // Close will close this instance of Mysqld. It will wait for all dba // queries to be finished. Close() diff --git a/go/vt/mysqlctl/mysqld.go b/go/vt/mysqlctl/mysqld.go index f23e3bafec5..d6a6513d3c1 100644 --- a/go/vt/mysqlctl/mysqld.go +++ b/go/vt/mysqlctl/mysqld.go @@ -35,6 +35,7 @@ import ( "path" "path/filepath" "regexp" + "runtime" "strconv" "strings" "sync" @@ -108,9 +109,10 @@ var ( // Mysqld is the object that represents a mysqld daemon running on this server. type Mysqld struct { - dbcfgs *dbconfigs.DBConfigs - dbaPool *dbconnpool.ConnectionPool - appPool *dbconnpool.ConnectionPool + dbcfgs *dbconfigs.DBConfigs + dbaPool *dbconnpool.ConnectionPool + appPool *dbconnpool.ConnectionPool + lockConn *dbconnpool.PooledDBConnection capabilities capabilitySet @@ -1296,6 +1298,71 @@ func (mysqld *Mysqld) GetVersionComment(ctx context.Context) (string, error) { return res.ToString("@@global.version_comment") } +// hostMetrics returns several OS metrics to be used by the tablet throttler. +func hostMetrics(ctx context.Context, cnf *Mycnf) (*mysqlctlpb.HostMetricsResponse, error) { + resp := &mysqlctlpb.HostMetricsResponse{ + Metrics: make(map[string]*mysqlctlpb.HostMetricsResponse_Metric), + } + newMetric := func(name string) *mysqlctlpb.HostMetricsResponse_Metric { + metric := &mysqlctlpb.HostMetricsResponse_Metric{ + Name: name, + } + resp.Metrics[name] = metric + return metric + } + withError := func(metric *mysqlctlpb.HostMetricsResponse_Metric, err error) error { + if err != nil { + metric.Error = &vtrpcpb.RPCError{ + Message: err.Error(), + Code: vtrpcpb.Code_FAILED_PRECONDITION, + } + } + return err + } + + _ = func() error { + metric := newMetric("datadir-used-ratio") + // 0.0 for empty mount, 1.0 for completely full mount + var st syscall.Statfs_t + if err := syscall.Statfs(cnf.DataDir, &st); err != nil { + return withError(metric, err) + } + if st.Blocks == 0 { + return withError(metric, fmt.Errorf("unexpected zero blocks in %s", cnf.DataDir)) + } + metric.Value = float64(st.Blocks-st.Bfree) / float64(st.Blocks) + return nil + }() + + _ = func() error { + metric := newMetric("loadavg") + if runtime.GOOS != "linux" { + return withError(metric, fmt.Errorf("loadavg metric is only available on Linux")) + } + content, err := os.ReadFile("/proc/loadavg") + if err != nil { + return withError(metric, err) + } + fields := strings.Fields(string(content)) + if len(fields) == 0 { + return withError(metric, fmt.Errorf("unexpected /proc/loadavg content")) + } + loadAvg, err := strconv.ParseFloat(fields[0], 64) + if err != nil { + return withError(metric, err) + } + metric.Value = loadAvg / float64(runtime.NumCPU()) + return nil + }() + + return resp, nil +} + +// HostMetrics returns several OS metrics to be used by the tablet throttler. +func (mysqld *Mysqld) HostMetrics(ctx context.Context, cnf *Mycnf) (*mysqlctlpb.HostMetricsResponse, error) { + return hostMetrics(ctx, cnf) +} + // ApplyBinlogFile extracts a binary log file and applies it to MySQL. It is the equivalent of: // $ mysqlbinlog --include-gtids binlog.file | mysql func (mysqld *Mysqld) ApplyBinlogFile(ctx context.Context, req *mysqlctlpb.ApplyBinlogFileRequest) error { diff --git a/go/vt/mysqlctl/mysqld_test.go b/go/vt/mysqlctl/mysqld_test.go index cc31206aa0c..e2a0c4acadc 100644 --- a/go/vt/mysqlctl/mysqld_test.go +++ b/go/vt/mysqlctl/mysqld_test.go @@ -307,3 +307,18 @@ func TestGetVersionComment(t *testing.T) { assert.NoError(t, err) assert.Equal(t, ver, str) } + +func TestHostMetrics(t *testing.T) { + ctx := context.Background() + cnf := &Mycnf{ + DataDir: os.TempDir(), + } + resp, err := hostMetrics(ctx, cnf) + require.NoError(t, err) + assert.NotEmpty(t, resp.Metrics) + assert.Contains(t, resp.Metrics, "loadavg") + assert.Contains(t, resp.Metrics, "datadir-used-ratio") + metric := resp.Metrics["datadir-used-ratio"] + assert.Equal(t, "datadir-used-ratio", metric.Name) + assert.Empty(t, metric.Error) +} diff --git a/go/vt/mysqlctl/mysqlshellbackupengine.go b/go/vt/mysqlctl/mysqlshellbackupengine.go new file mode 100644 index 00000000000..b7405ce7eaa --- /dev/null +++ b/go/vt/mysqlctl/mysqlshellbackupengine.go @@ -0,0 +1,596 @@ +/* +Copyright 2024 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package mysqlctl + +import ( + "bufio" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "os" + "os/exec" + "path" + "slices" + "strings" + "sync" + "time" + + "github.com/spf13/pflag" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/mysql/capabilities" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/mysqlctl/backupstorage" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + "vitess.io/vitess/go/vt/servenv" + "vitess.io/vitess/go/vt/vterrors" +) + +var ( + // location to store the mysql shell backup + mysqlShellBackupLocation = "" + // flags passed to the mysql shell utility, used both on dump/restore + mysqlShellFlags = "--defaults-file=/dev/null --js -h localhost" + // flags passed to the Dump command, as a JSON string + mysqlShellDumpFlags = `{"threads": 4}` + // flags passed to the Load command, as a JSON string + mysqlShellLoadFlags = `{"threads": 4, "loadUsers": true, "updateGtidSet": "replace", "skipBinlog": true, "progressFile": ""}` + // drain a tablet when taking a backup + mysqlShellBackupShouldDrain = false + // disable redo logging and double write buffer + mysqlShellSpeedUpRestore = false + + mysqlShellBackupBinaryName = "mysqlsh" + + // use when checking if we need to create the directory on the local filesystem or not. + knownObjectStoreParams = []string{"s3BucketName", "osBucketName", "azureContainerName"} + + MySQLShellPreCheckError = errors.New("MySQLShellPreCheckError") + + // internal databases not backed up by MySQL Shell + internalDBs = []string{ + "information_schema", "mysql", "ndbinfo", "performance_schema", "sys", + } + // reserved MySQL users https://dev.mysql.com/doc/refman/8.0/en/reserved-accounts.html + reservedUsers = []string{ + "mysql.sys@localhost", "mysql.session@localhost", "mysql.infoschema@localhost", + } +) + +// MySQLShellBackupManifest represents a backup. +type MySQLShellBackupManifest struct { + // BackupManifest is an anonymous embedding of the base manifest struct. + // Note that the manifest itself doesn't fill the Position field, as we have + // no way of fetching that information from mysqlsh at the moment. + BackupManifest + + // Location of the backup directory + BackupLocation string + // Params are the parameters that backup was created with + Params string +} + +func init() { + BackupRestoreEngineMap[mysqlShellBackupEngineName] = &MySQLShellBackupEngine{} + + for _, cmd := range []string{"vtcombo", "vttablet", "vtbackup", "vttestserver", "vtctldclient"} { + servenv.OnParseFor(cmd, registerMysqlShellBackupEngineFlags) + } +} + +func registerMysqlShellBackupEngineFlags(fs *pflag.FlagSet) { + fs.StringVar(&mysqlShellBackupLocation, "mysql-shell-backup-location", mysqlShellBackupLocation, "location where the backup will be stored") + fs.StringVar(&mysqlShellFlags, "mysql-shell-flags", mysqlShellFlags, "execution flags to pass to mysqlsh binary to be used during dump/load") + fs.StringVar(&mysqlShellDumpFlags, "mysql-shell-dump-flags", mysqlShellDumpFlags, "flags to pass to mysql shell dump utility. This should be a JSON string and will be saved in the MANIFEST") + fs.StringVar(&mysqlShellLoadFlags, "mysql-shell-load-flags", mysqlShellLoadFlags, "flags to pass to mysql shell load utility. This should be a JSON string") + fs.BoolVar(&mysqlShellBackupShouldDrain, "mysql-shell-should-drain", mysqlShellBackupShouldDrain, "decide if we should drain while taking a backup or continue to serving traffic") + fs.BoolVar(&mysqlShellSpeedUpRestore, "mysql-shell-speedup-restore", mysqlShellSpeedUpRestore, "speed up restore by disabling redo logging and double write buffer during the restore process") +} + +// MySQLShellBackupEngine encapsulates the logic to implement the restoration +// of a mysql-shell based backup. +type MySQLShellBackupEngine struct { +} + +const ( + mysqlShellBackupEngineName = "mysqlshell" + mysqlShellLockMessage = "Global read lock has been released" +) + +func (be *MySQLShellBackupEngine) ExecuteBackup(ctx context.Context, params BackupParams, bh backupstorage.BackupHandle) (result BackupResult, finalErr error) { + params.Logger.Infof("Starting ExecuteBackup in %s", params.TabletAlias) + + location := path.Join(mysqlShellBackupLocation, bh.Directory(), bh.Name()) + + err := be.backupPreCheck(location) + if err != nil { + return BackupUnusable, vterrors.Wrap(err, "failed backup precheck") + } + + serverUUID, err := params.Mysqld.GetServerUUID(ctx) + if err != nil { + return BackupUnusable, vterrors.Wrap(err, "can't get server uuid") + } + + mysqlVersion, err := params.Mysqld.GetVersionString(ctx) + if err != nil { + return BackupUnusable, vterrors.Wrap(err, "can't get MySQL version") + } + + args := []string{} + if mysqlShellFlags != "" { + args = append(args, strings.Fields(mysqlShellFlags)...) + } + + args = append(args, "-e", fmt.Sprintf("util.dumpInstance(%q, %s)", + location, + mysqlShellDumpFlags, + )) + + // to be able to get the consistent GTID sets, we will acquire a global read lock before starting mysql shell. + // oncce we have the lock, we start it and wait unti it has acquired and release its global read lock, which + // should guarantee that both use and mysql shell are seeing the same executed GTID sets. + // after this we release the lock so that replication can continue. this usually should take just a few seconds. + params.Logger.Infof("acquiring a global read lock before fetching the executed GTID sets") + err = params.Mysqld.AcquireGlobalReadLock(ctx) + if err != nil { + return BackupUnusable, vterrors.Wrap(err, "failed to acquire read lock to start backup") + } + lockAcquired := time.Now() // we will report how long we hold the lock for + + // we need to release the global read lock in case the backup fails to start and + // the lock wasn't released by releaseReadLock() yet. context might be expired, + // so we pass a new one. + defer func() { _ = params.Mysqld.ReleaseGlobalReadLock(context.Background()) }() + + posBeforeBackup, err := params.Mysqld.PrimaryPosition(ctx) + if err != nil { + return BackupUnusable, vterrors.Wrap(err, "failed to fetch position") + } + + cmd := exec.CommandContext(ctx, mysqlShellBackupBinaryName, args...) + + params.Logger.Infof("running %s", cmd.String()) + + cmdOut, err := cmd.StdoutPipe() + if err != nil { + return BackupUnusable, vterrors.Wrap(err, "cannot create stdout pipe") + } + cmdOriginalErr, err := cmd.StderrPipe() + if err != nil { + return BackupUnusable, vterrors.Wrap(err, "cannot create stderr pipe") + } + if err := cmd.Start(); err != nil { + return BackupUnusable, vterrors.Wrap(err, "can't start mysqlshell") + } + + pipeReader, pipeWriter := io.Pipe() + cmdErr := io.TeeReader(cmdOriginalErr, pipeWriter) + + cmdWg := &sync.WaitGroup{} + cmdWg.Add(3) + go releaseReadLock(ctx, pipeReader, params, cmdWg, lockAcquired) + go scanLinesToLogger(mysqlShellBackupEngineName+" stdout", cmdOut, params.Logger, cmdWg.Done) + go scanLinesToLogger(mysqlShellBackupEngineName+" stderr", cmdErr, params.Logger, cmdWg.Done) + + // Get exit status. + if err := cmd.Wait(); err != nil { + pipeWriter.Close() // make sure we close the writer so the goroutines above will complete. + return BackupUnusable, vterrors.Wrap(err, mysqlShellBackupEngineName+" failed") + } + + // close the pipeWriter and wait for the goroutines to have read all the logs + pipeWriter.Close() + cmdWg.Wait() + + // open the MANIFEST + params.Logger.Infof("Writing backup MANIFEST") + mwc, err := bh.AddFile(ctx, backupManifestFileName, backupstorage.FileSizeUnknown) + if err != nil { + return BackupUnusable, vterrors.Wrapf(err, "cannot add %v to backup", backupManifestFileName) + } + defer closeFile(mwc, backupManifestFileName, params.Logger, &finalErr) + + // JSON-encode and write the MANIFEST + bm := &MySQLShellBackupManifest{ + // Common base fields + BackupManifest: BackupManifest{ + BackupMethod: mysqlShellBackupEngineName, + // the position is empty here because we have no way of capturing it from mysqlsh + // we will capture it when doing the restore as mysqlsh can replace the GTIDs with + // what it has stored in the backup. + Position: posBeforeBackup, + PurgedPosition: posBeforeBackup, + BackupTime: FormatRFC3339(params.BackupTime.UTC()), + FinishedTime: FormatRFC3339(time.Now().UTC()), + ServerUUID: serverUUID, + TabletAlias: params.TabletAlias, + Keyspace: params.Keyspace, + Shard: params.Shard, + MySQLVersion: mysqlVersion, + UpgradeSafe: true, + }, + + // mysql shell backup specific fields + BackupLocation: location, + Params: mysqlShellLoadFlags, + } + + data, err := json.MarshalIndent(bm, "", " ") + if err != nil { + return BackupUnusable, vterrors.Wrapf(err, "cannot JSON encode %v", backupManifestFileName) + } + if _, err := mwc.Write([]byte(data)); err != nil { + return BackupUnusable, vterrors.Wrapf(err, "cannot write %v", backupManifestFileName) + } + + params.Logger.Infof("Backup completed") + return BackupUsable, nil +} + +func (be *MySQLShellBackupEngine) ExecuteRestore(ctx context.Context, params RestoreParams, bh backupstorage.BackupHandle) (*BackupManifest, error) { + params.Logger.Infof("Calling ExecuteRestore for %s (DeleteBeforeRestore: %v)", params.DbName, params.DeleteBeforeRestore) + + shouldDeleteUsers, err := be.restorePreCheck(ctx, params) + if err != nil { + return nil, vterrors.Wrap(err, "failed restore precheck") + } + + var bm MySQLShellBackupManifest + if err := getBackupManifestInto(ctx, bh, &bm); err != nil { + return nil, err + } + + // mark restore as in progress + if err := createStateFile(params.Cnf); err != nil { + return nil, err + } + + // make sure semi-sync is disabled, otherwise we will wait forever for acknowledgements + err = params.Mysqld.SetSemiSyncEnabled(ctx, false, false) + if err != nil { + return nil, vterrors.Wrap(err, "disable semi-sync failed") + } + + params.Logger.Infof("restoring on an existing tablet, so dropping database %q", params.DbName) + + readonly, err := params.Mysqld.IsSuperReadOnly(ctx) + if err != nil { + return nil, vterrors.Wrap(err, fmt.Sprintf("checking if mysqld has super_read_only=enable: %v", err)) + } + + if readonly { + resetFunc, err := params.Mysqld.SetSuperReadOnly(ctx, false) + if err != nil { + return nil, vterrors.Wrap(err, fmt.Sprintf("unable to disable super-read-only: %v", err)) + } + + defer func() { + err := resetFunc() + if err != nil { + params.Logger.Errorf("Not able to set super_read_only to its original value after restore") + } + }() + } + + err = cleanupMySQL(ctx, params, shouldDeleteUsers) + if err != nil { + log.Errorf(err.Error()) + // time.Sleep(time.Minute * 2) + return nil, vterrors.Wrap(err, "error cleaning MySQL") + } + + // we need to get rid of all the current replication information on the host. + err = params.Mysqld.ResetReplication(ctx) + if err != nil { + return nil, vterrors.Wrap(err, "unable to reset replication") + } + + // this is required so we can load the backup generated by MySQL Shell. we will disable it afterwards. + err = params.Mysqld.ExecuteSuperQuery(ctx, "SET GLOBAL LOCAL_INFILE=1") + if err != nil { + return nil, vterrors.Wrap(err, "unable to set local_infile=1") + } + + if mysqlShellSpeedUpRestore { + // disable redo logging and double write buffer if we are configured to do so. + err = params.Mysqld.ExecuteSuperQuery(ctx, "ALTER INSTANCE DISABLE INNODB REDO_LOG") + if err != nil { + return nil, vterrors.Wrap(err, "unable to disable REDO_LOG") + } + params.Logger.Infof("Disabled REDO_LOG") + + defer func() { // re-enable once we are done with the restore. + err := params.Mysqld.ExecuteSuperQuery(ctx, "ALTER INSTANCE ENABLE INNODB REDO_LOG") + if err != nil { + params.Logger.Errorf("unable to re-enable REDO_LOG: %v", err) + } else { + params.Logger.Infof("Disabled REDO_LOG") + } + }() + } + + // we need to disable SuperReadOnly otherwise we won't be able to restore the backup properly. + // once the backups is complete, we will restore it to its previous state. + resetFunc, err := be.handleSuperReadOnly(ctx, params) + if err != nil { + return nil, vterrors.Wrap(err, "unable to disable super-read-only") + } + defer resetFunc() + + args := []string{} + + if mysqlShellFlags != "" { + args = append(args, strings.Fields(mysqlShellFlags)...) + } + + args = append(args, "-e", fmt.Sprintf("util.loadDump(%q, %s)", + bm.BackupLocation, + mysqlShellLoadFlags, + )) + + cmd := exec.CommandContext(ctx, "mysqlsh", args...) + + params.Logger.Infof("running %s", cmd.String()) + + cmdOut, err := cmd.StdoutPipe() + if err != nil { + return nil, vterrors.Wrap(err, "cannot create stdout pipe") + } + cmdErr, err := cmd.StderrPipe() + if err != nil { + return nil, vterrors.Wrap(err, "cannot create stderr pipe") + } + if err := cmd.Start(); err != nil { + return nil, vterrors.Wrap(err, "can't start xbstream") + } + + cmdWg := &sync.WaitGroup{} + cmdWg.Add(2) + go scanLinesToLogger(mysqlShellBackupEngineName+" stdout", cmdOut, params.Logger, cmdWg.Done) + go scanLinesToLogger(mysqlShellBackupEngineName+" stderr", cmdErr, params.Logger, cmdWg.Done) + cmdWg.Wait() + + // Get the exit status. + if err := cmd.Wait(); err != nil { + return nil, vterrors.Wrap(err, mysqlShellBackupEngineName+" failed") + } + params.Logger.Infof("%s completed successfully", mysqlShellBackupBinaryName) + + // disable local_infile now that the restore is done. + err = params.Mysqld.ExecuteSuperQuery(ctx, "SET GLOBAL LOCAL_INFILE=0") + if err != nil { + return nil, vterrors.Wrap(err, "unable to set local_infile=0") + } + params.Logger.Infof("set local_infile=0") + + params.Logger.Infof("Restore completed") + + return &bm.BackupManifest, nil +} + +// ShouldDrainForBackup satisfies the BackupEngine interface +// MySQL Shell backups can be taken while MySQL is running so we can control this via a flag. +func (be *MySQLShellBackupEngine) ShouldDrainForBackup(req *tabletmanagerdatapb.BackupRequest) bool { + return mysqlShellBackupShouldDrain +} + +// ShouldStartMySQLAfterRestore signifies if this backup engine needs to restart MySQL once the restore is completed. +// Since MySQL Shell operates on a live MySQL instance, there is no need to start it once the restore is completed +func (be *MySQLShellBackupEngine) ShouldStartMySQLAfterRestore() bool { + return false +} + +func (be *MySQLShellBackupEngine) Name() string { return mysqlShellBackupEngineName } + +func (be *MySQLShellBackupEngine) backupPreCheck(location string) error { + if mysqlShellBackupLocation == "" { + return fmt.Errorf("%w: no backup location set via --mysql-shell-backup-location", MySQLShellPreCheckError) + } + + if mysqlShellFlags == "" || !strings.Contains(mysqlShellFlags, "--js") { + return fmt.Errorf("%w: at least the --js flag is required in the value of the flag --mysql-shell-flags", MySQLShellPreCheckError) + } + + // make sure the targe directory exists if the target location for the backup is not an object store + // (e.g. is the local filesystem) as MySQL Shell doesn't create the entire path beforehand: + isObjectStorage := false + for _, objStore := range knownObjectStoreParams { + if strings.Contains(mysqlShellDumpFlags, objStore) { + isObjectStorage = true + break + } + } + + if !isObjectStorage { + err := os.MkdirAll(location, 0o750) + if err != nil { + return fmt.Errorf("failure creating directory %s: %w", location, err) + } + } + + return nil +} + +func (be *MySQLShellBackupEngine) restorePreCheck(ctx context.Context, params RestoreParams) (shouldDeleteUsers bool, err error) { + if mysqlShellFlags == "" { + return shouldDeleteUsers, fmt.Errorf("%w: at least the --js flag is required in the value of the flag --mysql-shell-flags", MySQLShellPreCheckError) + } + + loadFlags := map[string]interface{}{} + err = json.Unmarshal([]byte(mysqlShellLoadFlags), &loadFlags) + if err != nil { + return false, fmt.Errorf("%w: unable to parse JSON of load flags", MySQLShellPreCheckError) + } + + if val, ok := loadFlags["updateGtidSet"]; !ok || val != "replace" { + return false, fmt.Errorf("%w: mysql-shell needs to restore with updateGtidSet set to \"replace\" to work with Vitess", MySQLShellPreCheckError) + } + + if val, ok := loadFlags["progressFile"]; !ok || val != "" { + return false, fmt.Errorf("%w: \"progressFile\" needs to be empty as vitess always starts a restore from scratch", MySQLShellPreCheckError) + } + + if val, ok := loadFlags["skipBinlog"]; !ok || val != true { + return false, fmt.Errorf("%w: \"skipBinlog\" needs to set to true", MySQLShellPreCheckError) + } + + if val, ok := loadFlags["loadUsers"]; ok && val == true { + shouldDeleteUsers = true + } + + if mysqlShellSpeedUpRestore { + version, err := params.Mysqld.GetVersionString(ctx) + if err != nil { + return false, fmt.Errorf("%w: failed to fetch MySQL version: %v", MySQLShellPreCheckError, err) + } + + capableOf := mysql.ServerVersionCapableOf(version) + capable, err := capableOf(capabilities.DisableRedoLogFlavorCapability) + if err != nil { + return false, fmt.Errorf("%w: error checking if server supports disabling redo log: %v", MySQLShellPreCheckError, err) + } + + if !capable { + return false, fmt.Errorf("%w: MySQL version doesn't support disabling the redo log (must be >=8.0.21)", MySQLShellPreCheckError) + } + } + + return shouldDeleteUsers, nil +} + +func (be *MySQLShellBackupEngine) handleSuperReadOnly(ctx context.Context, params RestoreParams) (func(), error) { + readonly, err := params.Mysqld.IsSuperReadOnly(ctx) + if err != nil { + return nil, vterrors.Wrap(err, fmt.Sprintf("checking if mysqld has super_read_only=enable: %v", err)) + } + + params.Logger.Infof("Is Super Read Only: %v", readonly) + + if readonly { + resetFunc, err := params.Mysqld.SetSuperReadOnly(ctx, false) + if err != nil { + return nil, vterrors.Wrap(err, fmt.Sprintf("unable to disable super-read-only: %v", err)) + } + + return func() { + err := resetFunc() + if err != nil { + params.Logger.Errorf("Not able to set super_read_only to its original value after restore") + } + }, nil + } + + return func() {}, nil +} + +// releaseReadLock will keep reading the MySQL Shell STDERR waiting until the point it has acquired its lock +func releaseReadLock(ctx context.Context, reader io.Reader, params BackupParams, wg *sync.WaitGroup, lockAcquired time.Time) { + defer wg.Done() + + scanner := bufio.NewScanner(reader) + released := false + for scanner.Scan() { + line := scanner.Text() + + if !released { + + if !strings.Contains(line, mysqlShellLockMessage) { + continue + } + released = true + + params.Logger.Infof("mysql shell released its global read lock, doing the same") + + err := params.Mysqld.ReleaseGlobalReadLock(ctx) + if err != nil { + params.Logger.Errorf("unable to release global read lock: %v", err) + } + + params.Logger.Infof("global read lock released after %v", time.Since(lockAcquired)) + } + } + if err := scanner.Err(); err != nil { + params.Logger.Errorf("error reading from reader: %v", err) + } + + if !released { + params.Logger.Errorf("could not release global lock earlier") + } +} + +func cleanupMySQL(ctx context.Context, params RestoreParams, shouldDeleteUsers bool) error { + params.Logger.Infof("Cleaning up MySQL ahead of a restore") + result, err := params.Mysqld.FetchSuperQuery(ctx, "SHOW DATABASES") + if err != nil { + return err + } + + // drop all databases + for _, row := range result.Rows { + dbName := row[0].ToString() + if slices.Contains(internalDBs, dbName) { + continue // not dropping internal DBs + } + + params.Logger.Infof("Dropping DB %q", dbName) + err = params.Mysqld.ExecuteSuperQuery(ctx, fmt.Sprintf("DROP DATABASE IF EXISTS `%s`", row[0].ToString())) + if err != nil { + return fmt.Errorf("error droppping database %q: %w", row[0].ToString(), err) + } + } + + if shouldDeleteUsers { + // get current user + var currentUser string + result, err = params.Mysqld.FetchSuperQuery(ctx, "SELECT user()") + if err != nil { + return fmt.Errorf("error fetching current user: %w", err) + } + + for _, row := range result.Rows { + currentUser = row[0].ToString() + } + + // drop all users except reserved ones + result, err = params.Mysqld.FetchSuperQuery(ctx, "SELECT user, host FROM mysql.user") + if err != nil { + return err + } + + for _, row := range result.Rows { + user := fmt.Sprintf("%s@%s", row[0].ToString(), row[1].ToString()) + + if user == currentUser { + continue // we don't drop the current user + } + if slices.Contains(reservedUsers, user) { + continue // we skip reserved MySQL users + } + + params.Logger.Infof("Dropping User %q", user) + err = params.Mysqld.ExecuteSuperQuery(ctx, fmt.Sprintf("DROP USER '%s'@'%s'", row[0].ToString(), row[1].ToString())) + if err != nil { + return fmt.Errorf("error droppping user %q: %w", user, err) + } + } + } + + return err +} diff --git a/go/vt/mysqlctl/mysqlshellbackupengine_test.go b/go/vt/mysqlctl/mysqlshellbackupengine_test.go new file mode 100644 index 00000000000..67f27b5382e --- /dev/null +++ b/go/vt/mysqlctl/mysqlshellbackupengine_test.go @@ -0,0 +1,429 @@ +/* +Copyright 2024 The Vitess Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package mysqlctl + +import ( + "context" + "encoding/json" + "fmt" + "os" + "path" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/ioutil" + "vitess.io/vitess/go/mysql/fakesqldb" + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/logutil" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" +) + +func TestMySQLShellBackupBackupPreCheck(t *testing.T) { + originalLocation := mysqlShellBackupLocation + originalFlags := mysqlShellFlags + defer func() { + mysqlShellBackupLocation = originalLocation + mysqlShellFlags = originalFlags + }() + + engine := MySQLShellBackupEngine{} + tests := []struct { + name string + location string + flags string + err error + }{ + { + "empty flags", + "", + `{}`, + MySQLShellPreCheckError, + }, + { + "only location", + "/dev/null", + "", + MySQLShellPreCheckError, + }, + { + "only flags", + "", + "--js", + MySQLShellPreCheckError, + }, + { + "both values present but without --js", + "", + "-h localhost", + MySQLShellPreCheckError, + }, + { + "supported values", + t.TempDir(), + "--js -h localhost", + nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + mysqlShellBackupLocation = tt.location + mysqlShellFlags = tt.flags + assert.ErrorIs(t, engine.backupPreCheck(path.Join(mysqlShellBackupLocation, "test")), tt.err) + }) + } + +} + +func TestMySQLShellBackupRestorePreCheck(t *testing.T) { + original := mysqlShellLoadFlags + defer func() { mysqlShellLoadFlags = original }() + + engine := MySQLShellBackupEngine{} + tests := []struct { + name string + flags string + err error + shouldDeleteUsers bool + }{ + { + "empty load flags", + `{}`, + MySQLShellPreCheckError, + false, + }, + { + "only updateGtidSet", + `{"updateGtidSet": "replace"}`, + MySQLShellPreCheckError, + false, + }, + { + "only progressFile", + `{"progressFile": ""}`, + MySQLShellPreCheckError, + false, + }, + { + "both values but unsupported values", + `{"updateGtidSet": "append", "progressFile": "/tmp/test1"}`, + MySQLShellPreCheckError, + false, + }, + { + "supported values", + `{"updateGtidSet": "replace", "progressFile": "", "skipBinlog": true, "loadUsers": false}`, + nil, + false, + }, + { + "should delete users", + `{"updateGtidSet": "replace", "progressFile": "", "skipBinlog": true, "loadUsers": true}`, + nil, + true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mysqlShellLoadFlags = tt.flags + shouldDeleteUsers, err := engine.restorePreCheck(context.Background(), RestoreParams{}) + assert.ErrorIs(t, err, tt.err) + assert.Equal(t, tt.shouldDeleteUsers, shouldDeleteUsers) + }) + } + +} + +func TestMySQLShellBackupRestorePreCheckDisableRedolog(t *testing.T) { + original := mysqlShellSpeedUpRestore + defer func() { mysqlShellSpeedUpRestore = original }() + + mysqlShellSpeedUpRestore = true + engine := MySQLShellBackupEngine{} + + fakedb := fakesqldb.New(t) + defer fakedb.Close() + fakeMysqld := NewFakeMysqlDaemon(fakedb) // defaults to 8.0.32 + defer fakeMysqld.Close() + + params := RestoreParams{ + Mysqld: fakeMysqld, + } + + // this should work as it is supported since 8.0.21 + _, err := engine.restorePreCheck(context.Background(), params) + require.NoError(t, err, params) + + // it should error out if we change to an older version + fakeMysqld.Version = "8.0.20" + + _, err = engine.restorePreCheck(context.Background(), params) + require.ErrorIs(t, err, MySQLShellPreCheckError) + require.ErrorContains(t, err, "doesn't support disabling the redo log") +} + +func TestShouldDrainForBackupMySQLShell(t *testing.T) { + original := mysqlShellBackupShouldDrain + defer func() { mysqlShellBackupShouldDrain = original }() + + engine := MySQLShellBackupEngine{} + + mysqlShellBackupShouldDrain = false + + assert.False(t, engine.ShouldDrainForBackup(nil)) + assert.False(t, engine.ShouldDrainForBackup(&tabletmanagerdatapb.BackupRequest{})) + + mysqlShellBackupShouldDrain = true + + assert.True(t, engine.ShouldDrainForBackup(nil)) + assert.True(t, engine.ShouldDrainForBackup(&tabletmanagerdatapb.BackupRequest{})) +} + +func TestCleanupMySQL(t *testing.T) { + type userRecord struct { + user, host string + } + + tests := []struct { + name string + existingDBs []string + expectedDropDBs []string + currentUser string + existingUsers []userRecord + expectedDropUsers []string + shouldDeleteUsers bool + }{ + { + name: "testing only specific DBs", + existingDBs: []string{"_vt", "vt_test"}, + expectedDropDBs: []string{"_vt", "vt_test"}, + }, + { + name: "testing with internal dbs", + existingDBs: []string{"_vt", "mysql", "vt_test", "performance_schema"}, + expectedDropDBs: []string{"_vt", "vt_test"}, + }, + { + name: "with users but without delete", + existingDBs: []string{"_vt", "mysql", "vt_test", "performance_schema"}, + expectedDropDBs: []string{"_vt", "vt_test"}, + existingUsers: []userRecord{ + {"test", "localhost"}, + {"app", "10.0.0.1"}, + }, + expectedDropUsers: []string{}, + shouldDeleteUsers: false, + }, + { + name: "with users and delete", + existingDBs: []string{"_vt", "mysql", "vt_test", "performance_schema"}, + expectedDropDBs: []string{"_vt", "vt_test"}, + existingUsers: []userRecord{ + {"test", "localhost"}, + {"app", "10.0.0.1"}, + }, + expectedDropUsers: []string{"'test'@'localhost'", "'app'@'10.0.0.1'"}, + shouldDeleteUsers: true, + }, + { + name: "with reserved users", + existingDBs: []string{"_vt", "mysql", "vt_test", "performance_schema"}, + expectedDropDBs: []string{"_vt", "vt_test"}, + existingUsers: []userRecord{ + {"mysql.sys", "localhost"}, + {"mysql.infoschema", "localhost"}, + {"mysql.session", "localhost"}, + {"test", "localhost"}, + {"app", "10.0.0.1"}, + }, + expectedDropUsers: []string{"'test'@'localhost'", "'app'@'10.0.0.1'"}, + shouldDeleteUsers: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fakedb := fakesqldb.New(t) + defer fakedb.Close() + mysql := NewFakeMysqlDaemon(fakedb) + defer mysql.Close() + + databases := [][]sqltypes.Value{} + for _, db := range tt.existingDBs { + databases = append(databases, []sqltypes.Value{sqltypes.NewVarChar(db)}) + } + + users := [][]sqltypes.Value{} + for _, record := range tt.existingUsers { + users = append(users, []sqltypes.Value{sqltypes.NewVarChar(record.user), sqltypes.NewVarChar(record.host)}) + } + + mysql.FetchSuperQueryMap = map[string]*sqltypes.Result{ + "SHOW DATABASES": {Rows: databases}, + "SELECT user()": {Rows: [][]sqltypes.Value{{sqltypes.NewVarChar(tt.currentUser)}}}, + "SELECT user, host FROM mysql.user": {Rows: users}, + } + + for _, drop := range tt.expectedDropDBs { + mysql.ExpectedExecuteSuperQueryList = append(mysql.ExpectedExecuteSuperQueryList, + fmt.Sprintf("DROP DATABASE IF EXISTS `%s`", drop), + ) + } + + if tt.shouldDeleteUsers { + for _, drop := range tt.expectedDropUsers { + mysql.ExpectedExecuteSuperQueryList = append(mysql.ExpectedExecuteSuperQueryList, + fmt.Sprintf("DROP USER %s", drop), + ) + } + } + + params := RestoreParams{ + Mysqld: mysql, + Logger: logutil.NewMemoryLogger(), + } + + err := cleanupMySQL(context.Background(), params, tt.shouldDeleteUsers) + require.NoError(t, err) + + require.Equal(t, len(tt.expectedDropDBs)+len(tt.expectedDropUsers), mysql.ExpectedExecuteSuperQueryCurrent, + "unexpected number of queries executed") + }) + } + +} + +// this is a helper to write files in a temporary directory +func generateTestFile(t *testing.T, name, contents string) { + f, err := os.OpenFile(name, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0700) + require.NoError(t, err) + defer f.Close() + _, err = f.WriteString(contents) + require.NoError(t, err) + require.NoError(t, f.Close()) +} + +// This tests if we are properly releasing the global read lock we acquire +// during ExecuteBackup(), even if the backup didn't succeed. +func TestMySQLShellBackupEngine_ExecuteBackup_ReleaseLock(t *testing.T) { + originalLocation := mysqlShellBackupLocation + originalBinary := mysqlShellBackupBinaryName + mysqlShellBackupLocation = "logical" + mysqlShellBackupBinaryName = path.Join(t.TempDir(), "test.sh") + + defer func() { // restore the original values. + mysqlShellBackupLocation = originalLocation + mysqlShellBackupBinaryName = originalBinary + }() + + logger := logutil.NewMemoryLogger() + fakedb := fakesqldb.New(t) + defer fakedb.Close() + mysql := NewFakeMysqlDaemon(fakedb) + defer mysql.Close() + + be := &MySQLShellBackupEngine{} + params := BackupParams{ + TabletAlias: "test", + Logger: logger, + Mysqld: mysql, + } + bs := FakeBackupStorage{ + StartBackupReturn: FakeBackupStorageStartBackupReturn{}, + } + + t.Run("lock released if we see the mysqlsh lock being acquired", func(t *testing.T) { + logger.Clear() + manifestBuffer := ioutil.NewBytesBufferWriter() + bs.StartBackupReturn.BackupHandle = &FakeBackupHandle{ + Dir: t.TempDir(), + AddFileReturn: FakeBackupHandleAddFileReturn{WriteCloser: manifestBuffer}, + } + + // this simulates mysql shell completing without any issues. + generateTestFile(t, mysqlShellBackupBinaryName, fmt.Sprintf("#!/bin/bash\n>&2 echo %s", mysqlShellLockMessage)) + + bh, err := bs.StartBackup(context.Background(), t.TempDir(), t.Name()) + require.NoError(t, err) + + _, err = be.ExecuteBackup(context.Background(), params, bh) + require.NoError(t, err) + require.False(t, mysql.GlobalReadLock) // lock must be released. + + // check the manifest is valid. + var manifest MySQLShellBackupManifest + err = json.Unmarshal(manifestBuffer.Bytes(), &manifest) + require.NoError(t, err) + + require.Equal(t, mysqlShellBackupEngineName, manifest.BackupMethod) + + // did we notice the lock was release and did we release it ours as well? + require.Contains(t, logger.String(), "global read lock released after", + "failed to release the global lock after mysqlsh") + }) + + t.Run("lock released if when we don't see mysqlsh released it", func(t *testing.T) { + mysql.GlobalReadLock = false // clear lock status. + logger.Clear() + manifestBuffer := ioutil.NewBytesBufferWriter() + bs.StartBackupReturn.BackupHandle = &FakeBackupHandle{ + Dir: t.TempDir(), + AddFileReturn: FakeBackupHandleAddFileReturn{WriteCloser: manifestBuffer}, + } + + // this simulates mysqlshell completing, but we don't see the message that is released its lock. + generateTestFile(t, mysqlShellBackupBinaryName, "#!/bin/bash\nexit 0") + + bh, err := bs.StartBackup(context.Background(), t.TempDir(), t.Name()) + require.NoError(t, err) + + // in this case the backup was successful, but even if we didn't see mysqlsh release its lock + // we make sure it is released at the end. + _, err = be.ExecuteBackup(context.Background(), params, bh) + require.NoError(t, err) + require.False(t, mysql.GlobalReadLock) // lock must be released. + + // make sure we are at least logging the lock wasn't able to be released earlier. + require.Contains(t, logger.String(), "could not release global lock earlier", + "failed to log error message when unable to release lock during backup") + }) + + t.Run("lock released when backup fails", func(t *testing.T) { + mysql.GlobalReadLock = false // clear lock status. + logger.Clear() + manifestBuffer := ioutil.NewBytesBufferWriter() + bs.StartBackupReturn.BackupHandle = &FakeBackupHandle{ + Dir: t.TempDir(), + AddFileReturn: FakeBackupHandleAddFileReturn{WriteCloser: manifestBuffer}, + } + + // this simulates the backup process failing. + generateTestFile(t, mysqlShellBackupBinaryName, "#!/bin/bash\nexit 1") + + bh, err := bs.StartBackup(context.Background(), t.TempDir(), t.Name()) + require.NoError(t, err) + + _, err = be.ExecuteBackup(context.Background(), params, bh) + require.ErrorContains(t, err, "mysqlshell failed") + require.False(t, mysql.GlobalReadLock) // lock must be released. + }) + +} diff --git a/go/vt/mysqlctl/query.go b/go/vt/mysqlctl/query.go index 7a1816e3cfb..7b1e1f0094b 100644 --- a/go/vt/mysqlctl/query.go +++ b/go/vt/mysqlctl/query.go @@ -18,6 +18,7 @@ package mysqlctl import ( "context" + "errors" "fmt" "strings" "time" @@ -226,6 +227,42 @@ func (mysqld *Mysqld) fetchStatuses(ctx context.Context, pattern string) (map[st return varMap, nil } +// ExecuteSuperQuery allows the user to execute a query as a super user. +func (mysqld *Mysqld) AcquireGlobalReadLock(ctx context.Context) error { + if mysqld.lockConn != nil { + return errors.New("lock already acquired") + } + + conn, err := getPoolReconnect(ctx, mysqld.dbaPool) + if err != nil { + return err + } + + err = mysqld.executeSuperQueryListConn(ctx, conn, []string{"FLUSH TABLES WITH READ LOCK"}) + if err != nil { + conn.Recycle() + return err + } + + mysqld.lockConn = conn + return nil +} + +func (mysqld *Mysqld) ReleaseGlobalReadLock(ctx context.Context) error { + if mysqld.lockConn == nil { + return errors.New("no read locks acquired yet") + } + + err := mysqld.executeSuperQueryListConn(ctx, mysqld.lockConn, []string{"UNLOCK TABLES"}) + if err != nil { + return err + } + + mysqld.lockConn.Recycle() + mysqld.lockConn = nil + return nil +} + const ( sourcePasswordStart = " SOURCE_PASSWORD = '" sourcePasswordEnd = "',\n" diff --git a/go/vt/mysqlctl/reparent.go b/go/vt/mysqlctl/reparent.go index 08326390f97..9c7e0f91361 100644 --- a/go/vt/mysqlctl/reparent.go +++ b/go/vt/mysqlctl/reparent.go @@ -22,6 +22,7 @@ This file contains the reparenting methods for mysqlctl. import ( "context" + "fmt" "time" "vitess.io/vitess/go/constants/sidecar" @@ -53,6 +54,11 @@ func PopulateReparentJournal(timeCreatedNS int64, actionName, primaryAlias strin timeCreatedNS, actionName, primaryAlias, posStr).Query } +// ReadReparentJournalInfoQuery returns the query we use to read information required from Reparent Journal. +func ReadReparentJournalInfoQuery() string { + return fmt.Sprintf("SELECT COUNT(*) FROM %s.reparent_journal", sidecar.GetIdentifier()) +} + // queryReparentJournal returns the SQL query to use to query the database // for a reparent_journal row. func queryReparentJournal(timeCreatedNS int64) string { diff --git a/go/vt/mysqlctl/replication.go b/go/vt/mysqlctl/replication.go index dd82794b42c..bd244d4f5c7 100644 --- a/go/vt/mysqlctl/replication.go +++ b/go/vt/mysqlctl/replication.go @@ -434,7 +434,15 @@ func (mysqld *Mysqld) PrimaryStatus(ctx context.Context) (replication.PrimarySta } defer conn.Recycle() - return conn.Conn.ShowPrimaryStatus() + primaryStatus, err := conn.Conn.ShowPrimaryStatus() + if err != nil { + return replication.PrimaryStatus{}, err + } + primaryStatus.ServerUUID, err = conn.Conn.GetServerUUID() + if err != nil { + return replication.PrimaryStatus{}, err + } + return primaryStatus, nil } func (mysqld *Mysqld) ReplicationConfiguration(ctx context.Context) (*replicationdata.Configuration, error) { diff --git a/go/vt/mysqlctl/replication_test.go b/go/vt/mysqlctl/replication_test.go index 1ca41437ea7..d3745bff88c 100644 --- a/go/vt/mysqlctl/replication_test.go +++ b/go/vt/mysqlctl/replication_test.go @@ -287,6 +287,7 @@ func TestPrimaryStatus(t *testing.T) { db.AddQuery("SELECT 1", &sqltypes.Result{}) db.AddQuery("SHOW MASTER STATUS", sqltypes.MakeTestResult(sqltypes.MakeTestFields("test_field", "varchar"), "test_status")) + db.AddQuery("SELECT @@global.server_uuid", sqltypes.MakeTestResult(sqltypes.MakeTestFields("test_field", "varchar"), "test_uuid")) testMysqld := NewMysqld(dbc) defer testMysqld.Close() @@ -295,6 +296,7 @@ func TestPrimaryStatus(t *testing.T) { res, err := testMysqld.PrimaryStatus(ctx) assert.NoError(t, err) assert.NotNil(t, res) + assert.EqualValues(t, "test_uuid", res.ServerUUID) db.AddQuery("SHOW MASTER STATUS", &sqltypes.Result{}) _, err = testMysqld.PrimaryStatus(ctx) diff --git a/go/vt/mysqlctl/s3backupstorage/retryer.go b/go/vt/mysqlctl/s3backupstorage/retryer.go index 052b1ef26d1..9e4e87da702 100644 --- a/go/vt/mysqlctl/s3backupstorage/retryer.go +++ b/go/vt/mysqlctl/s3backupstorage/retryer.go @@ -1,51 +1,75 @@ +/* +Copyright 2024 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 s3backupstorage import ( + "context" "strings" "time" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go-v2/aws" ) -// ClosedConnectionRetryer implements the aws request.Retryer interface +// ClosedConnectionRetryer implements the aws.Retryer interface // and is used to retry closed connection errors during MultipartUpload -// operations. +// operations. It is a simplified version of the RetryableConnectionError +// implementation, which always retry on any type of connection error. type ClosedConnectionRetryer struct { - awsRetryer request.Retryer + awsRetryer aws.Retryer } -// RetryRules is part of the Retryer interface. It defers to the underlying -// aws Retryer to compute backoff rules. -func (retryer *ClosedConnectionRetryer) RetryRules(r *request.Request) time.Duration { - return retryer.awsRetryer.RetryRules(r) -} - -// ShouldRetry is part of the Retryer interface. It retries on errors that occur -// due to a closed network connection, and then falls back to the underlying aws -// Retryer for checking additional retry conditions. -func (retryer *ClosedConnectionRetryer) ShouldRetry(r *request.Request) bool { - if retryer.MaxRetries() == 0 { +// IsErrorRetryable returns true if the error should be retried. We first try +// to see if the error is due to the use of a closed connection, if it is, +// we retry, and if not, we default to what the aws.Retryer would do. +func (retryer *ClosedConnectionRetryer) IsErrorRetryable(err error) bool { + if retryer.MaxAttempts() == 0 { return false } - if r.Retryable != nil { - return *r.Retryable - } - - if r.Error != nil { - if awsErr, ok := r.Error.(awserr.Error); ok { - if strings.Contains(awsErr.Error(), "use of closed network connection") { - return true - } + if err != nil { + if strings.Contains(err.Error(), "use of closed network connection") { + return true } } - return retryer.awsRetryer.ShouldRetry(r) + return retryer.awsRetryer.IsErrorRetryable(err) +} + +// MaxAttempts returns the maximum number of attempts that can be made for +// an attempt before failing. A value of 0 implies that the attempt should +// be retried until it succeeds if the errors are retryable. +func (retryer *ClosedConnectionRetryer) MaxAttempts() int { + return retryer.awsRetryer.MaxAttempts() +} + +// RetryDelay returns the delay that should be used before retrying the +// attempt. Will return error if the delay could not be determined. +func (retryer *ClosedConnectionRetryer) RetryDelay(attempt int, opErr error) (time.Duration, error) { + return retryer.awsRetryer.RetryDelay(attempt, opErr) +} + +// GetRetryToken attempts to deduct the retry cost from the retry token pool. +// Returning the token release function, or error. +func (retryer *ClosedConnectionRetryer) GetRetryToken(ctx context.Context, opErr error) (releaseToken func(error) error, err error) { + return retryer.awsRetryer.GetRetryToken(ctx, opErr) } -// MaxRetries is part of the Retryer interface. It defers to the -// underlying aws Retryer for the max number of retries. -func (retryer *ClosedConnectionRetryer) MaxRetries() int { - return retryer.awsRetryer.MaxRetries() +// GetInitialToken returns the initial attempt token that can increment the +// retry token pool if the attempt is successful. +func (retryer *ClosedConnectionRetryer) GetInitialToken() (releaseToken func(error) error) { + return retryer.awsRetryer.GetInitialToken() } diff --git a/go/vt/mysqlctl/s3backupstorage/retryer_test.go b/go/vt/mysqlctl/s3backupstorage/retryer_test.go index 9fe3004e6ff..666f565e7e4 100644 --- a/go/vt/mysqlctl/s3backupstorage/retryer_test.go +++ b/go/vt/mysqlctl/s3backupstorage/retryer_test.go @@ -1,79 +1,69 @@ +/* +Copyright 2024 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 s3backupstorage import ( + "context" "errors" "testing" "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" "github.com/stretchr/testify/assert" ) type testRetryer struct{ retry bool } -func (r *testRetryer) MaxRetries() int { return 5 } -func (r *testRetryer) RetryRules(req *request.Request) time.Duration { return time.Second } -func (r *testRetryer) ShouldRetry(req *request.Request) bool { return r.retry } +func (r *testRetryer) GetInitialToken() (releaseToken func(error) error) { panic("implement me") } +func (r *testRetryer) GetRetryToken(ctx context.Context, opErr error) (releaseToken func(error) error, err error) { + panic("implement me") +} +func (r *testRetryer) IsErrorRetryable(err error) bool { return r.retry } +func (r *testRetryer) MaxAttempts() int { return 5 } +func (r *testRetryer) RetryDelay(attempt int, opErr error) (time.Duration, error) { + return time.Second, nil +} func TestShouldRetry(t *testing.T) { tests := []struct { name string - r *request.Request + err error fallbackPolicy bool expected bool }{ - { - name: "non retryable request", - r: &request.Request{ - Retryable: aws.Bool(false), - }, + name: "no error", fallbackPolicy: false, expected: false, }, { - name: "retryable request", - r: &request.Request{ - Retryable: aws.Bool(true), - }, - fallbackPolicy: false, - expected: true, - }, - { - name: "non aws error", - r: &request.Request{ - Retryable: nil, - Error: errors.New("some error"), - }, + name: "non aws error", + err: errors.New("some error"), fallbackPolicy: false, expected: false, }, { - name: "closed connection error", - r: &request.Request{ - Retryable: nil, - Error: awserr.New("5xx", "use of closed network connection", nil), - }, - fallbackPolicy: false, - expected: true, - }, - { - name: "closed connection error (non nil origError)", - r: &request.Request{ - Retryable: nil, - Error: awserr.New("5xx", "use of closed network connection", errors.New("some error")), - }, + name: "closed connection error", + err: errors.New("use of closed network connection"), fallbackPolicy: false, expected: true, }, { - name: "other aws error hits fallback policy", - r: &request.Request{ - Retryable: nil, - Error: awserr.New("code", "not a closed network connectionn", errors.New("some error")), - }, + name: "other aws error hits fallback policy", + err: errors.New("not a closed network connection"), fallbackPolicy: true, expected: true, }, @@ -82,13 +72,7 @@ func TestShouldRetry(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { retryer := &ClosedConnectionRetryer{&testRetryer{test.fallbackPolicy}} - msg := "" - if test.r.Error != nil { - if awsErr, ok := test.r.Error.(awserr.Error); ok { - msg = awsErr.Error() - } - } - assert.Equal(t, test.expected, retryer.ShouldRetry(test.r), msg) + assert.Equal(t, test.expected, retryer.IsErrorRetryable(test.err)) }) } } diff --git a/go/vt/mysqlctl/s3backupstorage/s3.go b/go/vt/mysqlctl/s3backupstorage/s3.go index cdc4e355d45..b3a8117aafa 100644 --- a/go/vt/mysqlctl/s3backupstorage/s3.go +++ b/go/vt/mysqlctl/s3backupstorage/s3.go @@ -28,6 +28,7 @@ import ( "crypto/md5" "crypto/tls" "encoding/base64" + "errors" "fmt" "io" "math" @@ -38,13 +39,13 @@ import ( "sync" "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/client" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" - "github.com/aws/aws-sdk-go/service/s3/s3iface" - "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" + transport "github.com/aws/smithy-go/endpoints" + "github.com/aws/smithy-go/middleware" "github.com/spf13/pflag" "vitess.io/vitess/go/vt/concurrency" @@ -104,15 +105,41 @@ func init() { servenv.OnParseFor("vttablet", registerFlags) } -type logNameToLogLevel map[string]aws.LogLevelType +type logNameToLogLevel map[string]aws.ClientLogMode var logNameMap logNameToLogLevel const sseCustomerPrefix = "sse_c:" +type endpointResolver struct { + r s3.EndpointResolverV2 + endpoint *string +} + +func (er *endpointResolver) ResolveEndpoint(ctx context.Context, params s3.EndpointParameters) (transport.Endpoint, error) { + params.Endpoint = er.endpoint + return er.r.ResolveEndpoint(ctx, params) +} + +func newEndpointResolver() *endpointResolver { + return &endpointResolver{ + r: s3.NewDefaultEndpointResolverV2(), + endpoint: &endpoint, + } +} + +type iClient interface { + manager.UploadAPIClient + manager.DownloadAPIClient +} + +type clientWrapper struct { + *s3.Client +} + // S3BackupHandle implements the backupstorage.BackupHandle interface. type S3BackupHandle struct { - client s3iface.S3API + client iClient bs *S3BackupStorage dir string name string @@ -153,9 +180,9 @@ func (bh *S3BackupHandle) AddFile(ctx context.Context, filename string, filesize } // Calculate s3 upload part size using the source filesize - partSizeBytes := s3manager.DefaultUploadPartSize + partSizeBytes := manager.DefaultUploadPartSize if filesize > 0 { - minimumPartSize := float64(filesize) / float64(s3manager.MaxUploadParts) + minimumPartSize := float64(filesize) / float64(manager.MaxUploadParts) // Round up to ensure large enough partsize calculatedPartSizeBytes := int64(math.Ceil(minimumPartSize)) if calculatedPartSizeBytes > partSizeBytes { @@ -168,25 +195,31 @@ func (bh *S3BackupHandle) AddFile(ctx context.Context, filename string, filesize go func() { defer bh.waitGroup.Done() - uploader := s3manager.NewUploaderWithClient(bh.client, func(u *s3manager.Uploader) { + uploader := manager.NewUploader(bh.client, func(u *manager.Uploader) { u.PartSize = partSizeBytes }) object := objName(bh.dir, bh.name, filename) sendStats := bh.bs.params.Stats.Scope(stats.Operation("AWS:Request:Send")) - // Using UploadWithContext breaks uploading to Minio and Ceph https://github.com/vitessio/vitess/issues/14188 - _, err := uploader.Upload(&s3manager.UploadInput{ + _, err := uploader.Upload(ctx, &s3.PutObjectInput{ Bucket: &bucket, - Key: object, + Key: &object, Body: reader, ServerSideEncryption: bh.bs.s3SSE.awsAlg, SSECustomerAlgorithm: bh.bs.s3SSE.customerAlg, SSECustomerKey: bh.bs.s3SSE.customerKey, SSECustomerKeyMD5: bh.bs.s3SSE.customerMd5, - }, s3manager.WithUploaderRequestOptions(func(r *request.Request) { - r.Handlers.CompleteAttempt.PushBack(func(r *request.Request) { - sendStats.TimedIncrement(time.Since(r.AttemptTime)) + }, func(u *manager.Uploader) { + u.ClientOptions = append(u.ClientOptions, func(o *s3.Options) { + o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { + return stack.Finalize.Add(middleware.FinalizeMiddlewareFunc("CompleteAttemptMiddleware", func(ctx context.Context, input middleware.FinalizeInput, next middleware.FinalizeHandler) (middleware.FinalizeOutput, middleware.Metadata, error) { + start := time.Now() + output, metadata, err := next.HandleFinalize(ctx, input) + sendStats.TimedIncrement(time.Since(start)) + return output, metadata, err + }), middleware.Before) + }) }) - })) + }) if err != nil { reader.CloseWithError(err) bh.RecordError(err) @@ -220,15 +253,20 @@ func (bh *S3BackupHandle) ReadFile(ctx context.Context, filename string) (io.Rea } object := objName(bh.dir, bh.name, filename) sendStats := bh.bs.params.Stats.Scope(stats.Operation("AWS:Request:Send")) - out, err := bh.client.GetObjectWithContext(ctx, &s3.GetObjectInput{ + out, err := bh.client.GetObject(ctx, &s3.GetObjectInput{ Bucket: &bucket, - Key: object, + Key: &object, SSECustomerAlgorithm: bh.bs.s3SSE.customerAlg, SSECustomerKey: bh.bs.s3SSE.customerKey, SSECustomerKeyMD5: bh.bs.s3SSE.customerMd5, - }, func(r *request.Request) { - r.Handlers.CompleteAttempt.PushBack(func(r *request.Request) { - sendStats.TimedIncrement(time.Since(r.AttemptTime)) + }, func(o *s3.Options) { + o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { + return stack.Finalize.Add(middleware.FinalizeMiddlewareFunc("CompleteAttemptMiddleware", func(ctx context.Context, input middleware.FinalizeInput, next middleware.FinalizeHandler) (middleware.FinalizeOutput, middleware.Metadata, error) { + start := time.Now() + output, metadata, err := next.HandleFinalize(ctx, input) + sendStats.TimedIncrement(time.Since(start)) + return output, metadata, err + }), middleware.Before) }) }) if err != nil { @@ -240,7 +278,7 @@ func (bh *S3BackupHandle) ReadFile(ctx context.Context, filename string) (io.Rea var _ backupstorage.BackupHandle = (*S3BackupHandle)(nil) type S3ServerSideEncryption struct { - awsAlg *string + awsAlg types.ServerSideEncryption customerAlg *string customerKey *string customerMd5 *string @@ -267,13 +305,13 @@ func (s3ServerSideEncryption *S3ServerSideEncryption) init() error { s3ServerSideEncryption.customerKey = aws.String(string(decodedKey)) s3ServerSideEncryption.customerMd5 = aws.String(base64.StdEncoding.EncodeToString(md5Hash[:])) } else if sse != "" { - s3ServerSideEncryption.awsAlg = &sse + s3ServerSideEncryption.awsAlg = types.ServerSideEncryption(sse) } return nil } func (s3ServerSideEncryption *S3ServerSideEncryption) reset() { - s3ServerSideEncryption.awsAlg = nil + s3ServerSideEncryption.awsAlg = "" s3ServerSideEncryption.customerAlg = nil s3ServerSideEncryption.customerKey = nil s3ServerSideEncryption.customerMd5 = nil @@ -281,7 +319,7 @@ func (s3ServerSideEncryption *S3ServerSideEncryption) reset() { // S3BackupStorage implements the backupstorage.BackupStorage interface. type S3BackupStorage struct { - _client *s3.S3 + _client *s3.Client mu sync.Mutex s3SSE S3ServerSideEncryption params backupstorage.Params @@ -306,28 +344,28 @@ func (bs *S3BackupStorage) ListBackups(ctx context.Context, dir string) ([]backu return nil, err } - var searchPrefix *string + var searchPrefix string if dir == "/" { searchPrefix = objName("") } else { searchPrefix = objName(dir, "") } - log.Infof("objName: %v", *searchPrefix) + log.Infof("objName: %s", searchPrefix) query := &s3.ListObjectsV2Input{ Bucket: &bucket, Delimiter: &delimiter, - Prefix: searchPrefix, + Prefix: &searchPrefix, } var subdirs []string for { - objs, err := c.ListObjectsV2(query) + objs, err := c.ListObjectsV2(ctx, query) if err != nil { return nil, err } for _, prefix := range objs.CommonPrefixes { - subdir := strings.TrimPrefix(*prefix.Prefix, *searchPrefix) + subdir := strings.TrimPrefix(*prefix.Prefix, searchPrefix) subdir = strings.TrimSuffix(subdir, delimiter) subdirs = append(subdirs, subdir) } @@ -344,7 +382,7 @@ func (bs *S3BackupStorage) ListBackups(ctx context.Context, dir string) ([]backu result := make([]backupstorage.BackupHandle, 0, len(subdirs)) for _, subdir := range subdirs { result = append(result, &S3BackupHandle{ - client: c, + client: &clientWrapper{Client: c}, bs: bs, dir: dir, name: subdir, @@ -363,7 +401,7 @@ func (bs *S3BackupStorage) StartBackup(ctx context.Context, dir, name string) (b } return &S3BackupHandle{ - client: c, + client: &clientWrapper{Client: c}, bs: bs, dir: dir, name: name, @@ -380,28 +418,29 @@ func (bs *S3BackupStorage) RemoveBackup(ctx context.Context, dir, name string) e return err } + path := objName(dir, name) query := &s3.ListObjectsV2Input{ Bucket: &bucket, - Prefix: objName(dir, name), + Prefix: &path, } for { - objs, err := c.ListObjectsV2(query) + objs, err := c.ListObjectsV2(ctx, query) if err != nil { return err } - objIds := make([]*s3.ObjectIdentifier, 0, len(objs.Contents)) + objIds := make([]types.ObjectIdentifier, 0, len(objs.Contents)) for _, obj := range objs.Contents { - objIds = append(objIds, &s3.ObjectIdentifier{ + objIds = append(objIds, types.ObjectIdentifier{ Key: obj.Key, }) } quiet := true // return less in the Delete response - out, err := c.DeleteObjects(&s3.DeleteObjectsInput{ + out, err := c.DeleteObjects(ctx, &s3.DeleteObjectsInput{ Bucket: &bucket, - Delete: &s3.Delete{ + Delete: &types.Delete{ Objects: objIds, Quiet: &quiet, }, @@ -412,7 +451,7 @@ func (bs *S3BackupStorage) RemoveBackup(ctx context.Context, dir, name string) e } for _, objError := range out.Errors { - return fmt.Errorf(objError.String()) + return errors.New(*objError.Message) } if objs.NextContinuationToken == nil { @@ -441,16 +480,15 @@ func (bs *S3BackupStorage) WithParams(params backupstorage.Params) backupstorage var _ backupstorage.BackupStorage = (*S3BackupStorage)(nil) // getLogLevel converts the string loglevel to an aws.LogLevelType -func getLogLevel() *aws.LogLevelType { - l := new(aws.LogLevelType) - *l = aws.LogOff // default setting +func getLogLevel() aws.ClientLogMode { + var l aws.ClientLogMode if level, found := logNameMap[requiredLogLevel]; found { - *l = level // adjust as required + l = level // adjust as required } return l } -func (bs *S3BackupStorage) client() (*s3.S3, error) { +func (bs *S3BackupStorage) client() (*s3.Client, error) { bs.mu.Lock() defer bs.mu.Unlock() if bs._client == nil { @@ -458,34 +496,28 @@ func (bs *S3BackupStorage) client() (*s3.S3, error) { httpClient := &http.Client{Transport: bs.transport} - session, err := session.NewSession() + cfg, err := config.LoadDefaultConfig(context.Background(), + config.WithRegion(region), + config.WithClientLogMode(logLevel), + config.WithHTTPClient(httpClient), + ) if err != nil { return nil, err } - awsConfig := aws.Config{ - HTTPClient: httpClient, - LogLevel: logLevel, - Endpoint: aws.String(endpoint), - Region: aws.String(region), - S3ForcePathStyle: aws.Bool(forcePath), - } - - if retryCount >= 0 { - awsConfig = *request.WithRetryer(&awsConfig, &ClosedConnectionRetryer{ - awsRetryer: &client.DefaultRetryer{ - NumMaxRetries: retryCount, - }, - }) - } - - bs._client = s3.New(session, &awsConfig) + bs._client = s3.NewFromConfig(cfg, func(o *s3.Options) { + o.UsePathStyle = forcePath + if retryCount >= 0 { + o.RetryMaxAttempts = retryCount + o.Retryer = &ClosedConnectionRetryer{} + } + }, s3.WithEndpointResolverV2(newEndpointResolver())) if len(bucket) == 0 { return nil, fmt.Errorf("--s3_backup_storage_bucket required") } - if _, err := bs._client.HeadBucket(&s3.HeadBucketInput{Bucket: &bucket}); err != nil { + if _, err := bs._client.HeadBucket(context.Background(), &s3.HeadBucketInput{Bucket: &bucket}); err != nil { return nil, err } @@ -496,24 +528,24 @@ func (bs *S3BackupStorage) client() (*s3.S3, error) { return bs._client, nil } -func objName(parts ...string) *string { +func objName(parts ...string) string { res := "" if root != "" { res += root + delimiter } res += strings.Join(parts, delimiter) - return &res + return res } func init() { backupstorage.BackupStorageMap["s3"] = newS3BackupStorage() logNameMap = logNameToLogLevel{ - "LogOff": aws.LogOff, - "LogDebug": aws.LogDebug, - "LogDebugWithSigning": aws.LogDebugWithSigning, - "LogDebugWithHTTPBody": aws.LogDebugWithHTTPBody, - "LogDebugWithRequestRetries": aws.LogDebugWithRequestRetries, - "LogDebugWithRequestErrors": aws.LogDebugWithRequestErrors, + "LogOff": 0, + "LogDebug": aws.LogRequest, + "LogDebugWithSigning": aws.LogSigning, + "LogDebugWithHTTPBody": aws.LogRequestWithBody, + "LogDebugWithRequestRetries": aws.LogRetries, + "LogDebugWithRequestErrors": aws.LogRequest | aws.LogRetries, } } diff --git a/go/vt/mysqlctl/s3backupstorage/s3_test.go b/go/vt/mysqlctl/s3backupstorage/s3_test.go index 6f4207a645f..1acfddcce1e 100644 --- a/go/vt/mysqlctl/s3backupstorage/s3_test.go +++ b/go/vt/mysqlctl/s3backupstorage/s3_test.go @@ -1,22 +1,22 @@ package s3backupstorage import ( + "context" "crypto/md5" "crypto/rand" "encoding/base64" "errors" "fmt" "net/http" - "net/url" "os" "testing" "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/client" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/s3" - "github.com/aws/aws-sdk-go/service/s3/s3iface" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -26,29 +26,46 @@ import ( ) type s3FakeClient struct { - s3iface.S3API + *s3.Client err error delay time.Duration } -func (sfc *s3FakeClient) PutObjectRequest(in *s3.PutObjectInput) (*request.Request, *s3.PutObjectOutput) { - u, _ := url.Parse("http://localhost:1234") - req := request.Request{ - HTTPRequest: &http.Request{ // without this we segfault \_(ツ)_/¯ (see https://github.com/aws/aws-sdk-go/blob/v1.28.8/aws/request/request_context.go#L13) - Header: make(http.Header), - URL: u, - }, - Retryer: client.DefaultRetryer{}, +type fakeClientDo struct { + delay time.Duration +} + +func (fcd fakeClientDo) Do(request *http.Request) (*http.Response, error) { + if fcd.delay > 0 { + time.Sleep(fcd.delay) + } + return nil, nil +} + +func (sfc *s3FakeClient) PutObject(ctx context.Context, in *s3.PutObjectInput, optFns ...func(*s3.Options)) (*s3.PutObjectOutput, error) { + var o s3.Options + for _, fn := range optFns { + fn(&o) } - req.Handlers.Send.PushBack(func(r *request.Request) { - r.Error = sfc.err - if sfc.delay > 0 { - time.Sleep(sfc.delay) - } - }) + stack := middleware.NewStack("PutObject", smithyhttp.NewStackRequest) + for _, apiOption := range o.APIOptions { + _ = apiOption(stack) + } - return &req, &s3.PutObjectOutput{} + handler := middleware.DecorateHandler(smithyhttp.NewClientHandler(&fakeClientDo{delay: sfc.delay}), stack) + _, _, err := handler.Handle(ctx, in) + if err != nil { + return nil, err + } + + if sfc.err != nil { + return nil, sfc.err + } + + return &s3.PutObjectOutput{ + ETag: aws.String("fake-etag"), + }, nil } func TestAddFileError(t *testing.T) { @@ -56,11 +73,16 @@ func TestAddFileError(t *testing.T) { client: &s3FakeClient{err: errors.New("some error")}, bs: &S3BackupStorage{ params: backupstorage.NoParams(), + s3SSE: S3ServerSideEncryption{ + customerAlg: new(string), + customerKey: new(string), + customerMd5: new(string), + }, }, readOnly: false, } - wc, err := bh.AddFile(aws.BackgroundContext(), "somefile", 100000) + wc, err := bh.AddFile(context.Background(), "somefile", 100000) require.NoErrorf(t, err, "AddFile() expected no error, got %s", err) assert.NotNil(t, wc, "AddFile() expected non-nil WriteCloser") @@ -87,12 +109,17 @@ func TestAddFileStats(t *testing.T) { Logger: logutil.NewMemoryLogger(), Stats: fakeStats, }, + s3SSE: S3ServerSideEncryption{ + customerAlg: new(string), + customerKey: new(string), + customerMd5: new(string), + }, }, readOnly: false, } for i := 0; i < 4; i++ { - wc, err := bh.AddFile(aws.BackgroundContext(), fmt.Sprintf("somefile-%d", i), 100000) + wc, err := bh.AddFile(context.Background(), fmt.Sprintf("somefile-%d", i), 100000) require.NoErrorf(t, err, "AddFile() expected no error, got %s", err) assert.NotNil(t, wc, "AddFile() expected non-nil WriteCloser") @@ -131,11 +158,16 @@ func TestAddFileErrorStats(t *testing.T) { Logger: logutil.NewMemoryLogger(), Stats: fakeStats, }, + s3SSE: S3ServerSideEncryption{ + customerAlg: new(string), + customerKey: new(string), + customerMd5: new(string), + }, }, readOnly: false, } - wc, err := bh.AddFile(aws.BackgroundContext(), "somefile", 100000) + wc, err := bh.AddFile(context.Background(), "somefile", 100000) require.NoErrorf(t, err, "AddFile() expected no error, got %s", err) assert.NotNil(t, wc, "AddFile() expected non-nil WriteCloser") @@ -163,7 +195,7 @@ func TestNoSSE(t *testing.T) { err := sseData.init() require.NoErrorf(t, err, "init() expected to succeed") - assert.Nil(t, sseData.awsAlg, "awsAlg expected to be nil") + assert.Empty(t, sseData.awsAlg, "awsAlg expected to be empty") assert.Nil(t, sseData.customerAlg, "customerAlg expected to be nil") assert.Nil(t, sseData.customerKey, "customerKey expected to be nil") assert.Nil(t, sseData.customerMd5, "customerMd5 expected to be nil") @@ -178,7 +210,7 @@ func TestSSEAws(t *testing.T) { err := sseData.init() require.NoErrorf(t, err, "init() expected to succeed") - assert.Equal(t, aws.String("aws:kms"), sseData.awsAlg, "awsAlg expected to be aws:kms") + assert.Equal(t, types.ServerSideEncryption("aws:kms"), sseData.awsAlg, "awsAlg expected to be aws:kms") assert.Nil(t, sseData.customerAlg, "customerAlg expected to be nil") assert.Nil(t, sseData.customerKey, "customerKey expected to be nil") assert.Nil(t, sseData.customerMd5, "customerMd5 expected to be nil") @@ -186,7 +218,7 @@ func TestSSEAws(t *testing.T) { sseData.reset() require.NoErrorf(t, err, "reset() expected to succeed") - assert.Nil(t, sseData.awsAlg, "awsAlg expected to be nil") + assert.Empty(t, sseData.awsAlg, "awsAlg expected to be empty") assert.Nil(t, sseData.customerAlg, "customerAlg expected to be nil") assert.Nil(t, sseData.customerKey, "customerKey expected to be nil") assert.Nil(t, sseData.customerMd5, "customerMd5 expected to be nil") @@ -227,7 +259,7 @@ func TestSSECustomerFileBinaryKey(t *testing.T) { err = sseData.init() require.NoErrorf(t, err, "init() expected to succeed") - assert.Nil(t, sseData.awsAlg, "awsAlg expected to be nil") + assert.Empty(t, sseData.awsAlg, "awsAlg expected to be empty") assert.Equal(t, aws.String("AES256"), sseData.customerAlg, "customerAlg expected to be AES256") assert.Equal(t, aws.String(string(randomKey)), sseData.customerKey, "customerKey expected to be equal to the generated randomKey") md5Hash := md5.Sum(randomKey) @@ -236,7 +268,7 @@ func TestSSECustomerFileBinaryKey(t *testing.T) { sseData.reset() require.NoErrorf(t, err, "reset() expected to succeed") - assert.Nil(t, sseData.awsAlg, "awsAlg expected to be nil") + assert.Empty(t, sseData.awsAlg, "awsAlg expected to be empty") assert.Nil(t, sseData.customerAlg, "customerAlg expected to be nil") assert.Nil(t, sseData.customerKey, "customerKey expected to be nil") assert.Nil(t, sseData.customerMd5, "customerMd5 expected to be nil") @@ -262,7 +294,7 @@ func TestSSECustomerFileBase64Key(t *testing.T) { err = sseData.init() require.NoErrorf(t, err, "init() expected to succeed") - assert.Nil(t, sseData.awsAlg, "awsAlg expected to be nil") + assert.Empty(t, sseData.awsAlg, "awsAlg expected to be empty") assert.Equal(t, aws.String("AES256"), sseData.customerAlg, "customerAlg expected to be AES256") assert.Equal(t, aws.String(string(randomKey)), sseData.customerKey, "customerKey expected to be equal to the generated randomKey") md5Hash := md5.Sum(randomKey) @@ -271,7 +303,7 @@ func TestSSECustomerFileBase64Key(t *testing.T) { sseData.reset() require.NoErrorf(t, err, "reset() expected to succeed") - assert.Nil(t, sseData.awsAlg, "awsAlg expected to be nil") + assert.Empty(t, sseData.awsAlg, "awsAlg expected to be empty") assert.Nil(t, sseData.customerAlg, "customerAlg expected to be nil") assert.Nil(t, sseData.customerKey, "customerKey expected to be nil") assert.Nil(t, sseData.customerMd5, "customerMd5 expected to be nil") diff --git a/go/vt/mysqlctl/xtrabackupengine.go b/go/vt/mysqlctl/xtrabackupengine.go index e6d02eedc1d..32d54a19a4b 100644 --- a/go/vt/mysqlctl/xtrabackupengine.go +++ b/go/vt/mysqlctl/xtrabackupengine.go @@ -277,7 +277,7 @@ func (be *XtrabackupEngine) executeFullBackup(ctx context.Context, params Backup if err != nil { return BackupUnusable, vterrors.Wrapf(err, "cannot JSON encode %v", backupManifestFileName) } - if _, err := mwc.Write([]byte(data)); err != nil { + if _, err := mwc.Write(data); err != nil { return BackupUnusable, vterrors.Wrapf(err, "cannot write %v", backupManifestFileName) } @@ -316,8 +316,15 @@ func (be *XtrabackupEngine) backupFiles( // would impose a timeout that starts counting right now, so it would // include the time spent uploading the file content. We only want to impose // a timeout on the final Close() step. + // This context also allows us to immediately abort AddFiles if we encountered + // an error in this function. addFilesCtx, cancelAddFiles := context.WithCancel(ctx) - defer cancelAddFiles() + defer func() { + if finalErr != nil { + cancelAddFiles() + } + }() + destFiles, err := addStripeFiles(addFilesCtx, params, bh, backupFileName, numStripes) if err != nil { return replicationPosition, vterrors.Wrapf(err, "cannot create backup file %v", backupFileName) @@ -779,23 +786,6 @@ func findReplicationPosition(input, flavor string, logger logutil.Logger) (repli return replicationPosition, nil } -// scanLinesToLogger scans full lines from the given Reader and sends them to -// the given Logger until EOF. -func scanLinesToLogger(prefix string, reader io.Reader, logger logutil.Logger, doneFunc func()) { - defer doneFunc() - - scanner := bufio.NewScanner(reader) - for scanner.Scan() { - line := scanner.Text() - logger.Infof("%s: %s", prefix, line) - } - if err := scanner.Err(); err != nil { - // This is usually run in a background goroutine, so there's no point - // returning an error. Just log it. - logger.Warningf("error scanning lines from %s: %v", prefix, err) - } -} - func stripeFileName(baseFileName string, index int) string { return fmt.Sprintf("%s-%03d", baseFileName, index) } @@ -959,6 +949,13 @@ func (be *XtrabackupEngine) ShouldDrainForBackup(req *tabletmanagerdatapb.Backup return false } +// ShouldStartMySQLAfterRestore signifies if this backup engine needs to restart MySQL once the restore is completed. +func (be *XtrabackupEngine) ShouldStartMySQLAfterRestore() bool { + return true +} + +func (be *XtrabackupEngine) Name() string { return xtrabackupEngineName } + func init() { BackupRestoreEngineMap[xtrabackupEngineName] = &XtrabackupEngine{} } diff --git a/go/vt/proto/binlogdata/binlogdata.pb.go b/go/vt/proto/binlogdata/binlogdata.pb.go index aade1d049f8..544a45d3656 100644 --- a/go/vt/proto/binlogdata/binlogdata.pb.go +++ b/go/vt/proto/binlogdata/binlogdata.pb.go @@ -1416,11 +1416,12 @@ type RowEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TableName string `protobuf:"bytes,1,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` - RowChanges []*RowChange `protobuf:"bytes,2,rep,name=row_changes,json=rowChanges,proto3" json:"row_changes,omitempty"` - Keyspace string `protobuf:"bytes,3,opt,name=keyspace,proto3" json:"keyspace,omitempty"` - Shard string `protobuf:"bytes,4,opt,name=shard,proto3" json:"shard,omitempty"` - Flags uint32 `protobuf:"varint,5,opt,name=flags,proto3" json:"flags,omitempty"` // https://dev.mysql.com/doc/dev/mysql-server/latest/classbinary__log_1_1Rows__event.html + TableName string `protobuf:"bytes,1,opt,name=table_name,json=tableName,proto3" json:"table_name,omitempty"` + RowChanges []*RowChange `protobuf:"bytes,2,rep,name=row_changes,json=rowChanges,proto3" json:"row_changes,omitempty"` + Keyspace string `protobuf:"bytes,3,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + Shard string `protobuf:"bytes,4,opt,name=shard,proto3" json:"shard,omitempty"` + Flags uint32 `protobuf:"varint,5,opt,name=flags,proto3" json:"flags,omitempty"` // https://dev.mysql.com/doc/dev/mysql-server/latest/classbinary__log_1_1Rows__event.html + IsInternalTable bool `protobuf:"varint,6,opt,name=is_internal_table,json=isInternalTable,proto3" json:"is_internal_table,omitempty"` // set for sidecardb tables } func (x *RowEvent) Reset() { @@ -1490,6 +1491,13 @@ func (x *RowEvent) GetFlags() uint32 { return 0 } +func (x *RowEvent) GetIsInternalTable() bool { + if x != nil { + return x.IsInternalTable + } + return false +} + // FieldEvent represents the field info for a table. type FieldEvent struct { state protoimpl.MessageState @@ -1508,6 +1516,7 @@ type FieldEvent struct { // NOTE: because this is the use case, this is ONLY ever set today in // vstreams managed by the vstreamManager. EnumSetStringValues bool `protobuf:"varint,25,opt,name=enum_set_string_values,json=enumSetStringValues,proto3" json:"enum_set_string_values,omitempty"` + IsInternalTable bool `protobuf:"varint,26,opt,name=is_internal_table,json=isInternalTable,proto3" json:"is_internal_table,omitempty"` // set for sidecardb tables } func (x *FieldEvent) Reset() { @@ -1577,6 +1586,13 @@ func (x *FieldEvent) GetEnumSetStringValues() bool { return false } +func (x *FieldEvent) GetIsInternalTable() bool { + if x != nil { + return x.IsInternalTable + } + return false +} + // ShardGtid contains the GTID position for one shard. // It's used in a request for requesting a starting position. // It's used in a response to transmit the current position @@ -1913,6 +1929,8 @@ type VEvent struct { Shard string `protobuf:"bytes,23,opt,name=shard,proto3" json:"shard,omitempty"` // indicate that we are being throttled right now Throttled bool `protobuf:"varint,24,opt,name=throttled,proto3" json:"throttled,omitempty"` + // ThrottledReason is a human readable string that explains why the stream is throttled + ThrottledReason string `protobuf:"bytes,25,opt,name=throttled_reason,json=throttledReason,proto3" json:"throttled_reason,omitempty"` } func (x *VEvent) Reset() { @@ -2045,6 +2063,13 @@ func (x *VEvent) GetThrottled() bool { return false } +func (x *VEvent) GetThrottledReason() string { + if x != nil { + return x.ThrottledReason + } + return "" +} + type MinimalTable struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2166,6 +2191,61 @@ func (x *MinimalSchema) GetTables() []*MinimalTable { return nil } +type VStreamOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InternalTables []string `protobuf:"bytes,1,rep,name=internal_tables,json=internalTables,proto3" json:"internal_tables,omitempty"` + ConfigOverrides map[string]string `protobuf:"bytes,2,rep,name=config_overrides,json=configOverrides,proto3" json:"config_overrides,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *VStreamOptions) Reset() { + *x = VStreamOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_binlogdata_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VStreamOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VStreamOptions) ProtoMessage() {} + +func (x *VStreamOptions) ProtoReflect() protoreflect.Message { + mi := &file_binlogdata_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VStreamOptions.ProtoReflect.Descriptor instead. +func (*VStreamOptions) Descriptor() ([]byte, []int) { + return file_binlogdata_proto_rawDescGZIP(), []int{20} +} + +func (x *VStreamOptions) GetInternalTables() []string { + if x != nil { + return x.InternalTables + } + return nil +} + +func (x *VStreamOptions) GetConfigOverrides() map[string]string { + if x != nil { + return x.ConfigOverrides + } + return nil +} + // VStreamRequest is the payload for VStreamer type VStreamRequest struct { state protoimpl.MessageState @@ -2178,12 +2258,13 @@ type VStreamRequest struct { Position string `protobuf:"bytes,4,opt,name=position,proto3" json:"position,omitempty"` Filter *Filter `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` TableLastPKs []*TableLastPK `protobuf:"bytes,6,rep,name=table_last_p_ks,json=tableLastPKs,proto3" json:"table_last_p_ks,omitempty"` + Options *VStreamOptions `protobuf:"bytes,7,opt,name=options,proto3" json:"options,omitempty"` } func (x *VStreamRequest) Reset() { *x = VStreamRequest{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[20] + mi := &file_binlogdata_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2196,7 +2277,7 @@ func (x *VStreamRequest) String() string { func (*VStreamRequest) ProtoMessage() {} func (x *VStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[20] + mi := &file_binlogdata_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2209,7 +2290,7 @@ func (x *VStreamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VStreamRequest.ProtoReflect.Descriptor instead. func (*VStreamRequest) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{20} + return file_binlogdata_proto_rawDescGZIP(), []int{21} } func (x *VStreamRequest) GetEffectiveCallerId() *vtrpc.CallerID { @@ -2254,6 +2335,13 @@ func (x *VStreamRequest) GetTableLastPKs() []*TableLastPK { return nil } +func (x *VStreamRequest) GetOptions() *VStreamOptions { + if x != nil { + return x.Options + } + return nil +} + // VStreamResponse is the response from VStreamer type VStreamResponse struct { state protoimpl.MessageState @@ -2266,7 +2354,7 @@ type VStreamResponse struct { func (x *VStreamResponse) Reset() { *x = VStreamResponse{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[21] + mi := &file_binlogdata_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2279,7 +2367,7 @@ func (x *VStreamResponse) String() string { func (*VStreamResponse) ProtoMessage() {} func (x *VStreamResponse) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[21] + mi := &file_binlogdata_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2292,7 +2380,7 @@ func (x *VStreamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VStreamResponse.ProtoReflect.Descriptor instead. func (*VStreamResponse) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{21} + return file_binlogdata_proto_rawDescGZIP(), []int{22} } func (x *VStreamResponse) GetEvents() []*VEvent { @@ -2313,12 +2401,13 @@ type VStreamRowsRequest struct { 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"` Lastpk *query.QueryResult `protobuf:"bytes,5,opt,name=lastpk,proto3" json:"lastpk,omitempty"` + Options *VStreamOptions `protobuf:"bytes,6,opt,name=options,proto3" json:"options,omitempty"` } func (x *VStreamRowsRequest) Reset() { *x = VStreamRowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[22] + mi := &file_binlogdata_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2331,7 +2420,7 @@ func (x *VStreamRowsRequest) String() string { func (*VStreamRowsRequest) ProtoMessage() {} func (x *VStreamRowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[22] + mi := &file_binlogdata_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2344,7 +2433,7 @@ func (x *VStreamRowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VStreamRowsRequest.ProtoReflect.Descriptor instead. func (*VStreamRowsRequest) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{22} + return file_binlogdata_proto_rawDescGZIP(), []int{23} } func (x *VStreamRowsRequest) GetEffectiveCallerId() *vtrpc.CallerID { @@ -2382,6 +2471,13 @@ func (x *VStreamRowsRequest) GetLastpk() *query.QueryResult { return nil } +func (x *VStreamRowsRequest) GetOptions() *VStreamOptions { + if x != nil { + return x.Options + } + return nil +} + // VStreamRowsResponse is the response from VStreamRows type VStreamRowsResponse struct { state protoimpl.MessageState @@ -2397,12 +2493,14 @@ type VStreamRowsResponse struct { Throttled bool `protobuf:"varint,6,opt,name=throttled,proto3" json:"throttled,omitempty"` // Heartbeat indicates that this is a heartbeat message Heartbeat bool `protobuf:"varint,7,opt,name=heartbeat,proto3" json:"heartbeat,omitempty"` + // ThrottledReason is a human readable string that explains why the stream is throttled + ThrottledReason string `protobuf:"bytes,8,opt,name=throttled_reason,json=throttledReason,proto3" json:"throttled_reason,omitempty"` } func (x *VStreamRowsResponse) Reset() { *x = VStreamRowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[23] + mi := &file_binlogdata_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2415,7 +2513,7 @@ func (x *VStreamRowsResponse) String() string { func (*VStreamRowsResponse) ProtoMessage() {} func (x *VStreamRowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[23] + mi := &file_binlogdata_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2428,7 +2526,7 @@ func (x *VStreamRowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VStreamRowsResponse.ProtoReflect.Descriptor instead. func (*VStreamRowsResponse) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{23} + return file_binlogdata_proto_rawDescGZIP(), []int{24} } func (x *VStreamRowsResponse) GetFields() []*query.Field { @@ -2480,6 +2578,13 @@ func (x *VStreamRowsResponse) GetHeartbeat() bool { return false } +func (x *VStreamRowsResponse) GetThrottledReason() string { + if x != nil { + return x.ThrottledReason + } + return "" +} + // VStreamTablesRequest is the payload for VStreamTables type VStreamTablesRequest struct { state protoimpl.MessageState @@ -2489,12 +2594,13 @@ type VStreamTablesRequest 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"` + Options *VStreamOptions `protobuf:"bytes,4,opt,name=options,proto3" json:"options,omitempty"` } func (x *VStreamTablesRequest) Reset() { *x = VStreamTablesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[24] + mi := &file_binlogdata_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2507,7 +2613,7 @@ func (x *VStreamTablesRequest) String() string { func (*VStreamTablesRequest) ProtoMessage() {} func (x *VStreamTablesRequest) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[24] + mi := &file_binlogdata_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2520,7 +2626,7 @@ func (x *VStreamTablesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VStreamTablesRequest.ProtoReflect.Descriptor instead. func (*VStreamTablesRequest) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{24} + return file_binlogdata_proto_rawDescGZIP(), []int{25} } func (x *VStreamTablesRequest) GetEffectiveCallerId() *vtrpc.CallerID { @@ -2544,6 +2650,13 @@ func (x *VStreamTablesRequest) GetTarget() *query.Target { return nil } +func (x *VStreamTablesRequest) GetOptions() *VStreamOptions { + if x != nil { + return x.Options + } + return nil +} + // VStreamTablesResponse is the response from VStreamTables type VStreamTablesResponse struct { state protoimpl.MessageState @@ -2561,7 +2674,7 @@ type VStreamTablesResponse struct { func (x *VStreamTablesResponse) Reset() { *x = VStreamTablesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[25] + mi := &file_binlogdata_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2574,7 +2687,7 @@ func (x *VStreamTablesResponse) String() string { func (*VStreamTablesResponse) ProtoMessage() {} func (x *VStreamTablesResponse) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[25] + mi := &file_binlogdata_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2587,7 +2700,7 @@ func (x *VStreamTablesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VStreamTablesResponse.ProtoReflect.Descriptor instead. func (*VStreamTablesResponse) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{25} + return file_binlogdata_proto_rawDescGZIP(), []int{26} } func (x *VStreamTablesResponse) GetTableName() string { @@ -2644,7 +2757,7 @@ type LastPKEvent struct { func (x *LastPKEvent) Reset() { *x = LastPKEvent{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[26] + mi := &file_binlogdata_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2657,7 +2770,7 @@ func (x *LastPKEvent) String() string { func (*LastPKEvent) ProtoMessage() {} func (x *LastPKEvent) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[26] + mi := &file_binlogdata_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2670,7 +2783,7 @@ func (x *LastPKEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use LastPKEvent.ProtoReflect.Descriptor instead. func (*LastPKEvent) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{26} + return file_binlogdata_proto_rawDescGZIP(), []int{27} } func (x *LastPKEvent) GetTableLastPK() *TableLastPK { @@ -2699,7 +2812,7 @@ type TableLastPK struct { func (x *TableLastPK) Reset() { *x = TableLastPK{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[27] + mi := &file_binlogdata_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2712,7 +2825,7 @@ func (x *TableLastPK) String() string { func (*TableLastPK) ProtoMessage() {} func (x *TableLastPK) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[27] + mi := &file_binlogdata_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2725,7 +2838,7 @@ func (x *TableLastPK) ProtoReflect() protoreflect.Message { // Deprecated: Use TableLastPK.ProtoReflect.Descriptor instead. func (*TableLastPK) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{27} + return file_binlogdata_proto_rawDescGZIP(), []int{28} } func (x *TableLastPK) GetTableName() string { @@ -2759,7 +2872,7 @@ type VStreamResultsRequest struct { func (x *VStreamResultsRequest) Reset() { *x = VStreamResultsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[28] + mi := &file_binlogdata_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2772,7 +2885,7 @@ func (x *VStreamResultsRequest) String() string { func (*VStreamResultsRequest) ProtoMessage() {} func (x *VStreamResultsRequest) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[28] + mi := &file_binlogdata_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2785,7 +2898,7 @@ func (x *VStreamResultsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VStreamResultsRequest.ProtoReflect.Descriptor instead. func (*VStreamResultsRequest) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{28} + return file_binlogdata_proto_rawDescGZIP(), []int{29} } func (x *VStreamResultsRequest) GetEffectiveCallerId() *vtrpc.CallerID { @@ -2831,7 +2944,7 @@ type VStreamResultsResponse struct { func (x *VStreamResultsResponse) Reset() { *x = VStreamResultsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[29] + mi := &file_binlogdata_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2844,7 +2957,7 @@ func (x *VStreamResultsResponse) String() string { func (*VStreamResultsResponse) ProtoMessage() {} func (x *VStreamResultsResponse) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[29] + mi := &file_binlogdata_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2857,7 +2970,7 @@ func (x *VStreamResultsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VStreamResultsResponse.ProtoReflect.Descriptor instead. func (*VStreamResultsResponse) Descriptor() ([]byte, []int) { - return file_binlogdata_proto_rawDescGZIP(), []int{29} + return file_binlogdata_proto_rawDescGZIP(), []int{30} } func (x *VStreamResultsResponse) GetFields() []*query.Field { @@ -2897,7 +3010,7 @@ type BinlogTransaction_Statement struct { func (x *BinlogTransaction_Statement) Reset() { *x = BinlogTransaction_Statement{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[30] + mi := &file_binlogdata_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2910,7 +3023,7 @@ func (x *BinlogTransaction_Statement) String() string { func (*BinlogTransaction_Statement) ProtoMessage() {} func (x *BinlogTransaction_Statement) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[30] + mi := &file_binlogdata_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2959,7 +3072,7 @@ type RowChange_Bitmap struct { func (x *RowChange_Bitmap) Reset() { *x = RowChange_Bitmap{} if protoimpl.UnsafeEnabled { - mi := &file_binlogdata_proto_msgTypes[34] + mi := &file_binlogdata_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2972,7 +3085,7 @@ func (x *RowChange_Bitmap) String() string { func (*RowChange_Bitmap) ProtoMessage() {} func (x *RowChange_Bitmap) ProtoReflect() protoreflect.Message { - mi := &file_binlogdata_proto_msgTypes[34] + mi := &file_binlogdata_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3188,7 +3301,7 @@ var file_binlogdata_proto_rawDesc = []byte{ 0x75, 0x6d, 0x6e, 0x73, 0x1a, 0x32, 0x0a, 0x06, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x63, 0x6f, 0x6c, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x52, 0x6f, 0x77, + 0x28, 0x0c, 0x52, 0x04, 0x63, 0x6f, 0x6c, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x08, 0x52, 0x6f, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x5f, 0x63, 0x68, 0x61, 0x6e, @@ -3199,198 +3312,152 @@ var file_binlogdata_proto_rawDesc = []byte{ 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x66, - 0x6c, 0x61, 0x67, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x65, 0x6e, - 0x75, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x75, 0x6d, - 0x53, 0x65, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, - 0x88, 0x01, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, - 0x74, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x5f, 0x6b, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, - 0x52, 0x08, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x4b, 0x73, 0x22, 0x3f, 0x0a, 0x05, 0x56, 0x47, - 0x74, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x74, 0x69, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, - 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x52, - 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x73, 0x22, 0x41, 0x0a, 0x0d, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xbc, - 0x02, 0x0a, 0x07, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x6d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0b, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x74, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x6c, 0x61, 0x67, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0xe4, 0x01, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, + 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x73, + 0x65, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x74, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x69, + 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x47, 0x74, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x0a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x52, 0x08, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x4b, 0x73, 0x22, 0x3f, 0x0a, 0x05, 0x56, 0x47, 0x74, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x74, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x52, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, - 0x69, 0x64, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x69, 0x6e, 0x6c, - 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x8b, 0x04, - 0x0a, 0x06, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x09, 0x72, 0x6f, 0x77, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x72, - 0x6f, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x27, 0x0a, 0x05, 0x76, 0x67, 0x74, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x47, 0x74, - 0x69, 0x64, 0x52, 0x05, 0x76, 0x67, 0x74, 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x6a, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x69, 0x6e, - 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x52, - 0x07, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x6d, 0x6c, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x6d, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3c, 0x0a, - 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x5f, 0x6b, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0b, - 0x6c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x22, 0x8d, 0x01, 0x0a, 0x0c, - 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x70, 0x5f, 0x6b, 0x5f, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x70, 0x4b, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0e, 0x70, 0x5f, 0x6b, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x4b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x41, 0x0a, 0x0d, 0x4d, - 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x30, 0x0a, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, - 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0xc7, - 0x02, 0x0a, 0x0e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, - 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, - 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, - 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, - 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x52, 0x0c, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x73, 0x22, 0x3d, 0x0a, 0x0f, 0x56, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x69, - 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x85, 0x02, 0x0a, 0x12, 0x56, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, - 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, - 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, - 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x22, - 0xf9, 0x01, 0x0a, 0x13, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x28, 0x0a, - 0x08, 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x08, 0x70, - 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x72, - 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x22, 0x0a, 0x06, 0x6c, - 0x61, 0x73, 0x74, 0x70, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x14, - 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, - 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, - 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, - 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, - 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0xde, 0x01, 0x0a, 0x15, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x06, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x52, 0x08, 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x67, 0x74, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, - 0x12, 0x1e, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, - 0x12, 0x22, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x06, 0x6c, 0x61, - 0x73, 0x74, 0x70, 0x6b, 0x22, 0x69, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x70, 0x5f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, - 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, - 0x73, 0x74, 0x50, 0x4b, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, - 0x4b, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, - 0x58, 0x0a, 0x0b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x12, 0x1d, - 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, - 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x22, 0xdc, 0x01, 0x0a, 0x15, 0x56, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x64, 0x73, 0x22, 0x41, 0x0a, 0x0d, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xbc, 0x02, 0x0a, 0x07, 0x4a, 0x6f, 0x75, 0x72, 0x6e, + 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x62, 0x69, 0x6e, + 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x74, 0x69, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, + 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x52, + 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x0c, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xb6, 0x04, 0x0a, 0x06, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, + 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x09, + 0x72, 0x6f, 0x77, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x6f, 0x77, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x72, 0x6f, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x37, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x67, 0x74, 0x69, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x47, 0x74, 0x69, 0x64, 0x52, 0x05, 0x76, 0x67, 0x74, 0x69, + 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x07, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, + 0x12, 0x10, 0x0a, 0x03, 0x64, 0x6d, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, + 0x6d, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x5f, + 0x6b, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x50, + 0x4b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, + 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x8d, + 0x01, 0x0a, 0x0c, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x70, 0x5f, 0x6b, + 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, + 0x70, 0x4b, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0e, 0x70, 0x5f, 0x6b, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x70, 0x4b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x41, + 0x0a, 0x0d, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, + 0x30, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x69, 0x6e, + 0x69, 0x6d, 0x61, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x22, 0xd9, 0x01, 0x0a, 0x0e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x5a, 0x0a, + 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfd, 0x02, + 0x0a, 0x0e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, + 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x52, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, + 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3d, 0x0a, + 0x0f, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2a, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbb, 0x02, 0x0a, + 0x12, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, @@ -3403,60 +3470,141 @@ var file_binlogdata_proto_rawDesc = []byte{ 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x72, 0x0a, 0x16, 0x56, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, + 0x70, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x6c, 0x61, + 0x73, 0x74, 0x70, 0x6b, 0x12, 0x34, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa4, 0x02, 0x0a, 0x13, 0x56, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, - 0x72, 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x2a, 0x3e, 0x0a, 0x0b, - 0x4f, 0x6e, 0x44, 0x44, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x49, - 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, - 0x01, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x58, 0x45, 0x43, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x45, - 0x58, 0x45, 0x43, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x03, 0x2a, 0x7b, 0x0a, 0x18, - 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x61, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x6f, 0x76, - 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x10, 0x02, - 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x10, 0x03, 0x12, 0x0b, 0x0a, - 0x07, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x6e, - 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x44, 0x4c, 0x10, 0x05, 0x2a, 0x44, 0x0a, 0x1b, 0x56, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x10, 0x01, 0x12, - 0x0e, 0x0a, 0x0a, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x70, 0x79, 0x10, 0x02, 0x2a, - 0x71, 0x0a, 0x19, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x6e, 0x69, - 0x74, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x10, 0x02, - 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x6f, 0x70, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x12, 0x0b, 0x0a, - 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, - 0x10, 0x06, 0x2a, 0x8d, 0x02, 0x0a, 0x0a, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x04, 0x47, 0x54, 0x49, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x45, 0x47, 0x49, - 0x4e, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, 0x12, 0x07, 0x0a, - 0x03, 0x44, 0x44, 0x4c, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, - 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x07, 0x12, - 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x0a, - 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x52, - 0x4f, 0x57, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x0d, 0x12, - 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x0e, 0x12, 0x09, - 0x0a, 0x05, 0x56, 0x47, 0x54, 0x49, 0x44, 0x10, 0x0f, 0x12, 0x0b, 0x0a, 0x07, 0x4a, 0x4f, 0x55, - 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x10, 0x12, 0x0b, 0x0a, 0x07, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, - 0x4e, 0x10, 0x11, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x41, 0x53, 0x54, 0x50, 0x4b, 0x10, 0x12, 0x12, - 0x0d, 0x0a, 0x09, 0x53, 0x41, 0x56, 0x45, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x13, 0x12, 0x12, - 0x0a, 0x0e, 0x43, 0x4f, 0x50, 0x59, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, - 0x10, 0x14, 0x2a, 0x27, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x53, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x41, 0x52, 0x44, 0x53, 0x10, 0x01, 0x42, 0x29, 0x5a, 0x27, 0x76, - 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, - 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x69, 0x6e, 0x6c, - 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6b, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x08, 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, + 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x22, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, + 0x6f, 0x77, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x74, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x68, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x22, 0xfb, 0x01, 0x0a, 0x14, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, + 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, + 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x69, 0x6e, + 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0xde, 0x01, 0x0a, 0x15, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x28, + 0x0a, 0x08, 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x08, + 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, + 0x72, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x22, 0x0a, 0x06, + 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, + 0x22, 0x69, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x5f, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, + 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x58, 0x0a, 0x0b, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x6c, 0x61, 0x73, + 0x74, 0x70, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x6c, + 0x61, 0x73, 0x74, 0x70, 0x6b, 0x22, 0xdc, 0x01, 0x0a, 0x15, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, + 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, + 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x72, 0x0a, 0x16, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, + 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, + 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x2a, 0x3e, 0x0a, 0x0b, 0x4f, 0x6e, 0x44, 0x44, + 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x47, 0x4e, 0x4f, 0x52, + 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x45, 0x58, 0x45, 0x43, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x58, 0x45, 0x43, 0x5f, + 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x03, 0x2a, 0x7b, 0x0a, 0x18, 0x56, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x65, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x44, 0x44, 0x4c, 0x10, 0x05, 0x2a, 0x44, 0x0a, 0x1b, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x41, + 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x70, 0x79, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x56, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x6e, 0x69, 0x74, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, + 0x43, 0x6f, 0x70, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, + 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x06, 0x2a, 0x8d, + 0x02, 0x0a, 0x0a, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x54, + 0x49, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x10, 0x02, 0x12, + 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x52, + 0x4f, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x44, 0x4c, + 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, 0x10, 0x06, 0x12, 0x0b, + 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x55, + 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, + 0x45, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x0a, 0x12, 0x09, 0x0a, 0x05, + 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x4f, 0x57, 0x10, 0x0c, + 0x12, 0x09, 0x0a, 0x05, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x48, + 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x0e, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x47, + 0x54, 0x49, 0x44, 0x10, 0x0f, 0x12, 0x0b, 0x0a, 0x07, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x41, 0x4c, + 0x10, 0x10, 0x12, 0x0b, 0x0a, 0x07, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x11, 0x12, + 0x0a, 0x0a, 0x06, 0x4c, 0x41, 0x53, 0x54, 0x50, 0x4b, 0x10, 0x12, 0x12, 0x0d, 0x0a, 0x09, 0x53, + 0x41, 0x56, 0x45, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x13, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, + 0x50, 0x59, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x14, 0x2a, 0x27, + 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0a, 0x0a, 0x06, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, + 0x48, 0x41, 0x52, 0x44, 0x53, 0x10, 0x01, 0x42, 0x29, 0x5a, 0x27, 0x76, 0x69, 0x74, 0x65, 0x73, + 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, + 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3472,7 +3620,7 @@ func file_binlogdata_proto_rawDescGZIP() []byte { } var file_binlogdata_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_binlogdata_proto_msgTypes = make([]protoimpl.MessageInfo, 35) +var file_binlogdata_proto_msgTypes = make([]protoimpl.MessageInfo, 37) var file_binlogdata_proto_goTypes = []any{ (OnDDLAction)(0), // 0: binlogdata.OnDDLAction (VReplicationWorkflowType)(0), // 1: binlogdata.VReplicationWorkflowType @@ -3502,54 +3650,56 @@ var file_binlogdata_proto_goTypes = []any{ (*VEvent)(nil), // 25: binlogdata.VEvent (*MinimalTable)(nil), // 26: binlogdata.MinimalTable (*MinimalSchema)(nil), // 27: binlogdata.MinimalSchema - (*VStreamRequest)(nil), // 28: binlogdata.VStreamRequest - (*VStreamResponse)(nil), // 29: binlogdata.VStreamResponse - (*VStreamRowsRequest)(nil), // 30: binlogdata.VStreamRowsRequest - (*VStreamRowsResponse)(nil), // 31: binlogdata.VStreamRowsResponse - (*VStreamTablesRequest)(nil), // 32: binlogdata.VStreamTablesRequest - (*VStreamTablesResponse)(nil), // 33: binlogdata.VStreamTablesResponse - (*LastPKEvent)(nil), // 34: binlogdata.LastPKEvent - (*TableLastPK)(nil), // 35: binlogdata.TableLastPK - (*VStreamResultsRequest)(nil), // 36: binlogdata.VStreamResultsRequest - (*VStreamResultsResponse)(nil), // 37: binlogdata.VStreamResultsResponse - (*BinlogTransaction_Statement)(nil), // 38: binlogdata.BinlogTransaction.Statement - nil, // 39: binlogdata.Rule.ConvertEnumToTextEntry - nil, // 40: binlogdata.Rule.ConvertCharsetEntry - nil, // 41: binlogdata.Rule.ConvertIntToEnumEntry - (*RowChange_Bitmap)(nil), // 42: binlogdata.RowChange.Bitmap - (*query.EventToken)(nil), // 43: query.EventToken - (*topodata.KeyRange)(nil), // 44: topodata.KeyRange - (topodata.TabletType)(0), // 45: topodata.TabletType - (*query.Row)(nil), // 46: query.Row - (*query.Field)(nil), // 47: query.Field - (*vtrpc.CallerID)(nil), // 48: vtrpc.CallerID - (*query.VTGateCallerID)(nil), // 49: query.VTGateCallerID - (*query.Target)(nil), // 50: query.Target - (*query.QueryResult)(nil), // 51: query.QueryResult + (*VStreamOptions)(nil), // 28: binlogdata.VStreamOptions + (*VStreamRequest)(nil), // 29: binlogdata.VStreamRequest + (*VStreamResponse)(nil), // 30: binlogdata.VStreamResponse + (*VStreamRowsRequest)(nil), // 31: binlogdata.VStreamRowsRequest + (*VStreamRowsResponse)(nil), // 32: binlogdata.VStreamRowsResponse + (*VStreamTablesRequest)(nil), // 33: binlogdata.VStreamTablesRequest + (*VStreamTablesResponse)(nil), // 34: binlogdata.VStreamTablesResponse + (*LastPKEvent)(nil), // 35: binlogdata.LastPKEvent + (*TableLastPK)(nil), // 36: binlogdata.TableLastPK + (*VStreamResultsRequest)(nil), // 37: binlogdata.VStreamResultsRequest + (*VStreamResultsResponse)(nil), // 38: binlogdata.VStreamResultsResponse + (*BinlogTransaction_Statement)(nil), // 39: binlogdata.BinlogTransaction.Statement + nil, // 40: binlogdata.Rule.ConvertEnumToTextEntry + nil, // 41: binlogdata.Rule.ConvertCharsetEntry + nil, // 42: binlogdata.Rule.ConvertIntToEnumEntry + (*RowChange_Bitmap)(nil), // 43: binlogdata.RowChange.Bitmap + nil, // 44: binlogdata.VStreamOptions.ConfigOverridesEntry + (*query.EventToken)(nil), // 45: query.EventToken + (*topodata.KeyRange)(nil), // 46: topodata.KeyRange + (topodata.TabletType)(0), // 47: topodata.TabletType + (*query.Row)(nil), // 48: query.Row + (*query.Field)(nil), // 49: query.Field + (*vtrpc.CallerID)(nil), // 50: vtrpc.CallerID + (*query.VTGateCallerID)(nil), // 51: query.VTGateCallerID + (*query.Target)(nil), // 52: query.Target + (*query.QueryResult)(nil), // 53: query.QueryResult } var file_binlogdata_proto_depIdxs = []int32{ - 38, // 0: binlogdata.BinlogTransaction.statements:type_name -> binlogdata.BinlogTransaction.Statement - 43, // 1: binlogdata.BinlogTransaction.event_token:type_name -> query.EventToken - 44, // 2: binlogdata.StreamKeyRangeRequest.key_range:type_name -> topodata.KeyRange + 39, // 0: binlogdata.BinlogTransaction.statements:type_name -> binlogdata.BinlogTransaction.Statement + 45, // 1: binlogdata.BinlogTransaction.event_token:type_name -> query.EventToken + 46, // 2: binlogdata.StreamKeyRangeRequest.key_range:type_name -> topodata.KeyRange 8, // 3: binlogdata.StreamKeyRangeRequest.charset:type_name -> binlogdata.Charset 9, // 4: binlogdata.StreamKeyRangeResponse.binlog_transaction:type_name -> binlogdata.BinlogTransaction 8, // 5: binlogdata.StreamTablesRequest.charset:type_name -> binlogdata.Charset 9, // 6: binlogdata.StreamTablesResponse.binlog_transaction:type_name -> binlogdata.BinlogTransaction - 39, // 7: binlogdata.Rule.convert_enum_to_text:type_name -> binlogdata.Rule.ConvertEnumToTextEntry - 40, // 8: binlogdata.Rule.convert_charset:type_name -> binlogdata.Rule.ConvertCharsetEntry - 41, // 9: binlogdata.Rule.convert_int_to_enum:type_name -> binlogdata.Rule.ConvertIntToEnumEntry + 40, // 7: binlogdata.Rule.convert_enum_to_text:type_name -> binlogdata.Rule.ConvertEnumToTextEntry + 41, // 8: binlogdata.Rule.convert_charset:type_name -> binlogdata.Rule.ConvertCharsetEntry + 42, // 9: binlogdata.Rule.convert_int_to_enum:type_name -> binlogdata.Rule.ConvertIntToEnumEntry 15, // 10: binlogdata.Filter.rules:type_name -> binlogdata.Rule 7, // 11: binlogdata.Filter.field_event_mode:type_name -> binlogdata.Filter.FieldEventMode - 45, // 12: binlogdata.BinlogSource.tablet_type:type_name -> topodata.TabletType - 44, // 13: binlogdata.BinlogSource.key_range:type_name -> topodata.KeyRange + 47, // 12: binlogdata.BinlogSource.tablet_type:type_name -> topodata.TabletType + 46, // 13: binlogdata.BinlogSource.key_range:type_name -> topodata.KeyRange 16, // 14: binlogdata.BinlogSource.filter:type_name -> binlogdata.Filter 0, // 15: binlogdata.BinlogSource.on_ddl:type_name -> binlogdata.OnDDLAction - 46, // 16: binlogdata.RowChange.before:type_name -> query.Row - 46, // 17: binlogdata.RowChange.after:type_name -> query.Row - 42, // 18: binlogdata.RowChange.data_columns:type_name -> binlogdata.RowChange.Bitmap + 48, // 16: binlogdata.RowChange.before:type_name -> query.Row + 48, // 17: binlogdata.RowChange.after:type_name -> query.Row + 43, // 18: binlogdata.RowChange.data_columns:type_name -> binlogdata.RowChange.Bitmap 18, // 19: binlogdata.RowEvent.row_changes:type_name -> binlogdata.RowChange - 47, // 20: binlogdata.FieldEvent.fields:type_name -> query.Field - 35, // 21: binlogdata.ShardGtid.table_p_ks:type_name -> binlogdata.TableLastPK + 49, // 20: binlogdata.FieldEvent.fields:type_name -> query.Field + 36, // 21: binlogdata.ShardGtid.table_p_ks:type_name -> binlogdata.TableLastPK 21, // 22: binlogdata.VGtid.shard_gtids:type_name -> binlogdata.ShardGtid 5, // 23: binlogdata.Journal.migration_type:type_name -> binlogdata.MigrationType 21, // 24: binlogdata.Journal.shard_gtids:type_name -> binlogdata.ShardGtid @@ -3559,45 +3709,49 @@ var file_binlogdata_proto_depIdxs = []int32{ 20, // 28: binlogdata.VEvent.field_event:type_name -> binlogdata.FieldEvent 22, // 29: binlogdata.VEvent.vgtid:type_name -> binlogdata.VGtid 24, // 30: binlogdata.VEvent.journal:type_name -> binlogdata.Journal - 34, // 31: binlogdata.VEvent.last_p_k_event:type_name -> binlogdata.LastPKEvent - 47, // 32: binlogdata.MinimalTable.fields:type_name -> query.Field + 35, // 31: binlogdata.VEvent.last_p_k_event:type_name -> binlogdata.LastPKEvent + 49, // 32: binlogdata.MinimalTable.fields:type_name -> query.Field 26, // 33: binlogdata.MinimalSchema.tables:type_name -> binlogdata.MinimalTable - 48, // 34: binlogdata.VStreamRequest.effective_caller_id:type_name -> vtrpc.CallerID - 49, // 35: binlogdata.VStreamRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 50, // 36: binlogdata.VStreamRequest.target:type_name -> query.Target - 16, // 37: binlogdata.VStreamRequest.filter:type_name -> binlogdata.Filter - 35, // 38: binlogdata.VStreamRequest.table_last_p_ks:type_name -> binlogdata.TableLastPK - 25, // 39: binlogdata.VStreamResponse.events:type_name -> binlogdata.VEvent - 48, // 40: binlogdata.VStreamRowsRequest.effective_caller_id:type_name -> vtrpc.CallerID - 49, // 41: binlogdata.VStreamRowsRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 50, // 42: binlogdata.VStreamRowsRequest.target:type_name -> query.Target - 51, // 43: binlogdata.VStreamRowsRequest.lastpk:type_name -> query.QueryResult - 47, // 44: binlogdata.VStreamRowsResponse.fields:type_name -> query.Field - 47, // 45: binlogdata.VStreamRowsResponse.pkfields:type_name -> query.Field - 46, // 46: binlogdata.VStreamRowsResponse.rows:type_name -> query.Row - 46, // 47: binlogdata.VStreamRowsResponse.lastpk:type_name -> query.Row - 48, // 48: binlogdata.VStreamTablesRequest.effective_caller_id:type_name -> vtrpc.CallerID - 49, // 49: binlogdata.VStreamTablesRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 50, // 50: binlogdata.VStreamTablesRequest.target:type_name -> query.Target - 47, // 51: binlogdata.VStreamTablesResponse.fields:type_name -> query.Field - 47, // 52: binlogdata.VStreamTablesResponse.pkfields:type_name -> query.Field - 46, // 53: binlogdata.VStreamTablesResponse.rows:type_name -> query.Row - 46, // 54: binlogdata.VStreamTablesResponse.lastpk:type_name -> query.Row - 35, // 55: binlogdata.LastPKEvent.table_last_p_k:type_name -> binlogdata.TableLastPK - 51, // 56: binlogdata.TableLastPK.lastpk:type_name -> query.QueryResult - 48, // 57: binlogdata.VStreamResultsRequest.effective_caller_id:type_name -> vtrpc.CallerID - 49, // 58: binlogdata.VStreamResultsRequest.immediate_caller_id:type_name -> query.VTGateCallerID - 50, // 59: binlogdata.VStreamResultsRequest.target:type_name -> query.Target - 47, // 60: binlogdata.VStreamResultsResponse.fields:type_name -> query.Field - 46, // 61: binlogdata.VStreamResultsResponse.rows:type_name -> query.Row - 6, // 62: binlogdata.BinlogTransaction.Statement.category:type_name -> binlogdata.BinlogTransaction.Statement.Category - 8, // 63: binlogdata.BinlogTransaction.Statement.charset:type_name -> binlogdata.Charset - 14, // 64: binlogdata.Rule.ConvertCharsetEntry.value:type_name -> binlogdata.CharsetConversion - 65, // [65:65] is the sub-list for method output_type - 65, // [65:65] is the sub-list for method input_type - 65, // [65:65] is the sub-list for extension type_name - 65, // [65:65] is the sub-list for extension extendee - 0, // [0:65] is the sub-list for field type_name + 44, // 34: binlogdata.VStreamOptions.config_overrides:type_name -> binlogdata.VStreamOptions.ConfigOverridesEntry + 50, // 35: binlogdata.VStreamRequest.effective_caller_id:type_name -> vtrpc.CallerID + 51, // 36: binlogdata.VStreamRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 52, // 37: binlogdata.VStreamRequest.target:type_name -> query.Target + 16, // 38: binlogdata.VStreamRequest.filter:type_name -> binlogdata.Filter + 36, // 39: binlogdata.VStreamRequest.table_last_p_ks:type_name -> binlogdata.TableLastPK + 28, // 40: binlogdata.VStreamRequest.options:type_name -> binlogdata.VStreamOptions + 25, // 41: binlogdata.VStreamResponse.events:type_name -> binlogdata.VEvent + 50, // 42: binlogdata.VStreamRowsRequest.effective_caller_id:type_name -> vtrpc.CallerID + 51, // 43: binlogdata.VStreamRowsRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 52, // 44: binlogdata.VStreamRowsRequest.target:type_name -> query.Target + 53, // 45: binlogdata.VStreamRowsRequest.lastpk:type_name -> query.QueryResult + 28, // 46: binlogdata.VStreamRowsRequest.options:type_name -> binlogdata.VStreamOptions + 49, // 47: binlogdata.VStreamRowsResponse.fields:type_name -> query.Field + 49, // 48: binlogdata.VStreamRowsResponse.pkfields:type_name -> query.Field + 48, // 49: binlogdata.VStreamRowsResponse.rows:type_name -> query.Row + 48, // 50: binlogdata.VStreamRowsResponse.lastpk:type_name -> query.Row + 50, // 51: binlogdata.VStreamTablesRequest.effective_caller_id:type_name -> vtrpc.CallerID + 51, // 52: binlogdata.VStreamTablesRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 52, // 53: binlogdata.VStreamTablesRequest.target:type_name -> query.Target + 28, // 54: binlogdata.VStreamTablesRequest.options:type_name -> binlogdata.VStreamOptions + 49, // 55: binlogdata.VStreamTablesResponse.fields:type_name -> query.Field + 49, // 56: binlogdata.VStreamTablesResponse.pkfields:type_name -> query.Field + 48, // 57: binlogdata.VStreamTablesResponse.rows:type_name -> query.Row + 48, // 58: binlogdata.VStreamTablesResponse.lastpk:type_name -> query.Row + 36, // 59: binlogdata.LastPKEvent.table_last_p_k:type_name -> binlogdata.TableLastPK + 53, // 60: binlogdata.TableLastPK.lastpk:type_name -> query.QueryResult + 50, // 61: binlogdata.VStreamResultsRequest.effective_caller_id:type_name -> vtrpc.CallerID + 51, // 62: binlogdata.VStreamResultsRequest.immediate_caller_id:type_name -> query.VTGateCallerID + 52, // 63: binlogdata.VStreamResultsRequest.target:type_name -> query.Target + 49, // 64: binlogdata.VStreamResultsResponse.fields:type_name -> query.Field + 48, // 65: binlogdata.VStreamResultsResponse.rows:type_name -> query.Row + 6, // 66: binlogdata.BinlogTransaction.Statement.category:type_name -> binlogdata.BinlogTransaction.Statement.Category + 8, // 67: binlogdata.BinlogTransaction.Statement.charset:type_name -> binlogdata.Charset + 14, // 68: binlogdata.Rule.ConvertCharsetEntry.value:type_name -> binlogdata.CharsetConversion + 69, // [69:69] is the sub-list for method output_type + 69, // [69:69] is the sub-list for method input_type + 69, // [69:69] is the sub-list for extension type_name + 69, // [69:69] is the sub-list for extension extendee + 0, // [0:69] is the sub-list for field type_name } func init() { file_binlogdata_proto_init() } @@ -3847,7 +4001,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*VStreamRequest); i { + switch v := v.(*VStreamOptions); i { case 0: return &v.state case 1: @@ -3859,7 +4013,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*VStreamResponse); i { + switch v := v.(*VStreamRequest); i { case 0: return &v.state case 1: @@ -3871,7 +4025,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*VStreamRowsRequest); i { + switch v := v.(*VStreamResponse); i { case 0: return &v.state case 1: @@ -3883,7 +4037,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*VStreamRowsResponse); i { + switch v := v.(*VStreamRowsRequest); i { case 0: return &v.state case 1: @@ -3895,7 +4049,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*VStreamTablesRequest); i { + switch v := v.(*VStreamRowsResponse); i { case 0: return &v.state case 1: @@ -3907,7 +4061,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[25].Exporter = func(v any, i int) any { - switch v := v.(*VStreamTablesResponse); i { + switch v := v.(*VStreamTablesRequest); i { case 0: return &v.state case 1: @@ -3919,7 +4073,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[26].Exporter = func(v any, i int) any { - switch v := v.(*LastPKEvent); i { + switch v := v.(*VStreamTablesResponse); i { case 0: return &v.state case 1: @@ -3931,7 +4085,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[27].Exporter = func(v any, i int) any { - switch v := v.(*TableLastPK); i { + switch v := v.(*LastPKEvent); i { case 0: return &v.state case 1: @@ -3943,7 +4097,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[28].Exporter = func(v any, i int) any { - switch v := v.(*VStreamResultsRequest); i { + switch v := v.(*TableLastPK); i { case 0: return &v.state case 1: @@ -3955,7 +4109,7 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[29].Exporter = func(v any, i int) any { - switch v := v.(*VStreamResultsResponse); i { + switch v := v.(*VStreamResultsRequest); i { case 0: return &v.state case 1: @@ -3967,6 +4121,18 @@ func file_binlogdata_proto_init() { } } file_binlogdata_proto_msgTypes[30].Exporter = func(v any, i int) any { + switch v := v.(*VStreamResultsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_binlogdata_proto_msgTypes[31].Exporter = func(v any, i int) any { switch v := v.(*BinlogTransaction_Statement); i { case 0: return &v.state @@ -3978,7 +4144,7 @@ func file_binlogdata_proto_init() { return nil } } - file_binlogdata_proto_msgTypes[34].Exporter = func(v any, i int) any { + file_binlogdata_proto_msgTypes[35].Exporter = func(v any, i int) any { switch v := v.(*RowChange_Bitmap); i { case 0: return &v.state @@ -3997,7 +4163,7 @@ func file_binlogdata_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_binlogdata_proto_rawDesc, NumEnums: 8, - NumMessages: 35, + NumMessages: 37, NumExtensions: 0, NumServices: 0, }, diff --git a/go/vt/proto/binlogdata/binlogdata_vtproto.pb.go b/go/vt/proto/binlogdata/binlogdata_vtproto.pb.go index 1332681a976..fd76576fcb5 100644 --- a/go/vt/proto/binlogdata/binlogdata_vtproto.pb.go +++ b/go/vt/proto/binlogdata/binlogdata_vtproto.pb.go @@ -1,15 +1,15 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: binlogdata.proto package binlogdata import ( fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" - bits "math/bits" sync "sync" query "vitess.io/vitess/go/vt/proto/query" topodata "vitess.io/vitess/go/vt/proto/topodata" @@ -27,11 +27,10 @@ func (m *Charset) CloneVT() *Charset { if m == nil { return (*Charset)(nil) } - r := &Charset{ - Client: m.Client, - Conn: m.Conn, - Server: m.Server, - } + r := new(Charset) + r.Client = m.Client + r.Conn = m.Conn + r.Server = m.Server if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -47,10 +46,9 @@ func (m *BinlogTransaction_Statement) CloneVT() *BinlogTransaction_Statement { if m == nil { return (*BinlogTransaction_Statement)(nil) } - r := &BinlogTransaction_Statement{ - Category: m.Category, - Charset: m.Charset.CloneVT(), - } + r := new(BinlogTransaction_Statement) + r.Category = m.Category + r.Charset = m.Charset.CloneVT() if rhs := m.Sql; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -71,9 +69,8 @@ func (m *BinlogTransaction) CloneVT() *BinlogTransaction { if m == nil { return (*BinlogTransaction)(nil) } - r := &BinlogTransaction{ - EventToken: m.EventToken.CloneVT(), - } + r := new(BinlogTransaction) + r.EventToken = m.EventToken.CloneVT() if rhs := m.Statements; rhs != nil { tmpContainer := make([]*BinlogTransaction_Statement, len(rhs)) for k, v := range rhs { @@ -96,11 +93,10 @@ func (m *StreamKeyRangeRequest) CloneVT() *StreamKeyRangeRequest { if m == nil { return (*StreamKeyRangeRequest)(nil) } - r := &StreamKeyRangeRequest{ - Position: m.Position, - KeyRange: m.KeyRange.CloneVT(), - Charset: m.Charset.CloneVT(), - } + r := new(StreamKeyRangeRequest) + r.Position = m.Position + r.KeyRange = m.KeyRange.CloneVT() + r.Charset = m.Charset.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -116,9 +112,8 @@ func (m *StreamKeyRangeResponse) CloneVT() *StreamKeyRangeResponse { if m == nil { return (*StreamKeyRangeResponse)(nil) } - r := &StreamKeyRangeResponse{ - BinlogTransaction: m.BinlogTransaction.CloneVT(), - } + r := new(StreamKeyRangeResponse) + r.BinlogTransaction = m.BinlogTransaction.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -134,10 +129,9 @@ func (m *StreamTablesRequest) CloneVT() *StreamTablesRequest { if m == nil { return (*StreamTablesRequest)(nil) } - r := &StreamTablesRequest{ - Position: m.Position, - Charset: m.Charset.CloneVT(), - } + r := new(StreamTablesRequest) + r.Position = m.Position + r.Charset = m.Charset.CloneVT() if rhs := m.Tables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -158,9 +152,8 @@ func (m *StreamTablesResponse) CloneVT() *StreamTablesResponse { if m == nil { return (*StreamTablesResponse)(nil) } - r := &StreamTablesResponse{ - BinlogTransaction: m.BinlogTransaction.CloneVT(), - } + r := new(StreamTablesResponse) + r.BinlogTransaction = m.BinlogTransaction.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -176,10 +169,9 @@ func (m *CharsetConversion) CloneVT() *CharsetConversion { if m == nil { return (*CharsetConversion)(nil) } - r := &CharsetConversion{ - FromCharset: m.FromCharset, - ToCharset: m.ToCharset, - } + r := new(CharsetConversion) + r.FromCharset = m.FromCharset + r.ToCharset = m.ToCharset if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -195,14 +187,13 @@ func (m *Rule) CloneVT() *Rule { if m == nil { return (*Rule)(nil) } - r := &Rule{ - Match: m.Match, - Filter: m.Filter, - SourceUniqueKeyColumns: m.SourceUniqueKeyColumns, - TargetUniqueKeyColumns: m.TargetUniqueKeyColumns, - SourceUniqueKeyTargetColumns: m.SourceUniqueKeyTargetColumns, - ForceUniqueKey: m.ForceUniqueKey, - } + r := new(Rule) + r.Match = m.Match + r.Filter = m.Filter + r.SourceUniqueKeyColumns = m.SourceUniqueKeyColumns + r.TargetUniqueKeyColumns = m.TargetUniqueKeyColumns + r.SourceUniqueKeyTargetColumns = m.SourceUniqueKeyTargetColumns + r.ForceUniqueKey = m.ForceUniqueKey if rhs := m.ConvertEnumToText; rhs != nil { tmpContainer := make(map[string]string, len(rhs)) for k, v := range rhs { @@ -239,11 +230,10 @@ func (m *Filter) CloneVT() *Filter { if m == nil { return (*Filter)(nil) } - r := &Filter{ - FieldEventMode: m.FieldEventMode, - WorkflowType: m.WorkflowType, - WorkflowName: m.WorkflowName, - } + r := new(Filter) + r.FieldEventMode = m.FieldEventMode + r.WorkflowType = m.WorkflowType + r.WorkflowName = m.WorkflowName if rhs := m.Rules; rhs != nil { tmpContainer := make([]*Rule, len(rhs)) for k, v := range rhs { @@ -266,19 +256,18 @@ func (m *BinlogSource) CloneVT() *BinlogSource { if m == nil { return (*BinlogSource)(nil) } - r := &BinlogSource{ - Keyspace: m.Keyspace, - Shard: m.Shard, - TabletType: m.TabletType, - KeyRange: m.KeyRange.CloneVT(), - Filter: m.Filter.CloneVT(), - OnDdl: m.OnDdl, - ExternalMysql: m.ExternalMysql, - StopAfterCopy: m.StopAfterCopy, - ExternalCluster: m.ExternalCluster, - SourceTimeZone: m.SourceTimeZone, - TargetTimeZone: m.TargetTimeZone, - } + r := new(BinlogSource) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.TabletType = m.TabletType + r.KeyRange = m.KeyRange.CloneVT() + r.Filter = m.Filter.CloneVT() + r.OnDdl = m.OnDdl + r.ExternalMysql = m.ExternalMysql + r.StopAfterCopy = m.StopAfterCopy + r.ExternalCluster = m.ExternalCluster + r.SourceTimeZone = m.SourceTimeZone + r.TargetTimeZone = m.TargetTimeZone if rhs := m.Tables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -299,9 +288,8 @@ func (m *RowChange_Bitmap) CloneVT() *RowChange_Bitmap { if m == nil { return (*RowChange_Bitmap)(nil) } - r := &RowChange_Bitmap{ - Count: m.Count, - } + r := new(RowChange_Bitmap) + r.Count = m.Count if rhs := m.Cols; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -322,11 +310,10 @@ func (m *RowChange) CloneVT() *RowChange { if m == nil { return (*RowChange)(nil) } - r := &RowChange{ - Before: m.Before.CloneVT(), - After: m.After.CloneVT(), - DataColumns: m.DataColumns.CloneVT(), - } + r := new(RowChange) + r.Before = m.Before.CloneVT() + r.After = m.After.CloneVT() + r.DataColumns = m.DataColumns.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -342,12 +329,12 @@ func (m *RowEvent) CloneVT() *RowEvent { if m == nil { return (*RowEvent)(nil) } - r := &RowEvent{ - TableName: m.TableName, - Keyspace: m.Keyspace, - Shard: m.Shard, - Flags: m.Flags, - } + r := new(RowEvent) + r.TableName = m.TableName + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Flags = m.Flags + r.IsInternalTable = m.IsInternalTable if rhs := m.RowChanges; rhs != nil { tmpContainer := make([]*RowChange, len(rhs)) for k, v := range rhs { @@ -370,12 +357,12 @@ func (m *FieldEvent) CloneVT() *FieldEvent { if m == nil { return (*FieldEvent)(nil) } - r := &FieldEvent{ - TableName: m.TableName, - Keyspace: m.Keyspace, - Shard: m.Shard, - EnumSetStringValues: m.EnumSetStringValues, - } + r := new(FieldEvent) + r.TableName = m.TableName + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.EnumSetStringValues = m.EnumSetStringValues + r.IsInternalTable = m.IsInternalTable if rhs := m.Fields; rhs != nil { tmpContainer := make([]*query.Field, len(rhs)) for k, v := range rhs { @@ -398,11 +385,10 @@ func (m *ShardGtid) CloneVT() *ShardGtid { if m == nil { return (*ShardGtid)(nil) } - r := &ShardGtid{ - Keyspace: m.Keyspace, - Shard: m.Shard, - Gtid: m.Gtid, - } + r := new(ShardGtid) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Gtid = m.Gtid if rhs := m.TablePKs; rhs != nil { tmpContainer := make([]*TableLastPK, len(rhs)) for k, v := range rhs { @@ -425,7 +411,7 @@ func (m *VGtid) CloneVT() *VGtid { if m == nil { return (*VGtid)(nil) } - r := &VGtid{} + r := new(VGtid) if rhs := m.ShardGtids; rhs != nil { tmpContainer := make([]*ShardGtid, len(rhs)) for k, v := range rhs { @@ -448,10 +434,9 @@ func (m *KeyspaceShard) CloneVT() *KeyspaceShard { if m == nil { return (*KeyspaceShard)(nil) } - r := &KeyspaceShard{ - Keyspace: m.Keyspace, - Shard: m.Shard, - } + r := new(KeyspaceShard) + r.Keyspace = m.Keyspace + r.Shard = m.Shard if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -467,11 +452,10 @@ func (m *Journal) CloneVT() *Journal { if m == nil { return (*Journal)(nil) } - r := &Journal{ - Id: m.Id, - MigrationType: m.MigrationType, - LocalPosition: m.LocalPosition, - } + r := new(Journal) + r.Id = m.Id + r.MigrationType = m.MigrationType + r.LocalPosition = m.LocalPosition if rhs := m.Tables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -511,22 +495,22 @@ func (m *VEvent) CloneVT() *VEvent { if m == nil { return (*VEvent)(nil) } - r := &VEvent{ - Type: m.Type, - Timestamp: m.Timestamp, - Gtid: m.Gtid, - Statement: m.Statement, - RowEvent: m.RowEvent.CloneVT(), - FieldEvent: m.FieldEvent.CloneVT(), - Vgtid: m.Vgtid.CloneVT(), - Journal: m.Journal.CloneVT(), - Dml: m.Dml, - CurrentTime: m.CurrentTime, - LastPKEvent: m.LastPKEvent.CloneVT(), - Keyspace: m.Keyspace, - Shard: m.Shard, - Throttled: m.Throttled, - } + r := new(VEvent) + r.Type = m.Type + r.Timestamp = m.Timestamp + r.Gtid = m.Gtid + r.Statement = m.Statement + r.RowEvent = m.RowEvent.CloneVT() + r.FieldEvent = m.FieldEvent.CloneVT() + r.Vgtid = m.Vgtid.CloneVT() + r.Journal = m.Journal.CloneVT() + r.Dml = m.Dml + r.CurrentTime = m.CurrentTime + r.LastPKEvent = m.LastPKEvent.CloneVT() + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Throttled = m.Throttled + r.ThrottledReason = m.ThrottledReason if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -542,10 +526,9 @@ func (m *MinimalTable) CloneVT() *MinimalTable { if m == nil { return (*MinimalTable)(nil) } - r := &MinimalTable{ - Name: m.Name, - PKIndexName: m.PKIndexName, - } + r := new(MinimalTable) + r.Name = m.Name + r.PKIndexName = m.PKIndexName if rhs := m.Fields; rhs != nil { tmpContainer := make([]*query.Field, len(rhs)) for k, v := range rhs { @@ -573,7 +556,7 @@ func (m *MinimalSchema) CloneVT() *MinimalSchema { if m == nil { return (*MinimalSchema)(nil) } - r := &MinimalSchema{} + r := new(MinimalSchema) if rhs := m.Tables; rhs != nil { tmpContainer := make([]*MinimalTable, len(rhs)) for k, v := range rhs { @@ -592,17 +575,45 @@ func (m *MinimalSchema) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *VStreamOptions) CloneVT() *VStreamOptions { + if m == nil { + return (*VStreamOptions)(nil) + } + r := new(VStreamOptions) + if rhs := m.InternalTables; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.InternalTables = tmpContainer + } + if rhs := m.ConfigOverrides; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.ConfigOverrides = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *VStreamOptions) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *VStreamRequest) CloneVT() *VStreamRequest { if m == nil { return (*VStreamRequest)(nil) } - r := &VStreamRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Position: m.Position, - Filter: m.Filter.CloneVT(), - } + r := new(VStreamRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Position = m.Position + r.Filter = m.Filter.CloneVT() + r.Options = m.Options.CloneVT() if rhs := m.TableLastPKs; rhs != nil { tmpContainer := make([]*TableLastPK, len(rhs)) for k, v := range rhs { @@ -625,7 +636,7 @@ func (m *VStreamResponse) CloneVT() *VStreamResponse { if m == nil { return (*VStreamResponse)(nil) } - r := &VStreamResponse{} + r := new(VStreamResponse) if rhs := m.Events; rhs != nil { tmpContainer := make([]*VEvent, len(rhs)) for k, v := range rhs { @@ -648,13 +659,13 @@ func (m *VStreamRowsRequest) CloneVT() *VStreamRowsRequest { if m == nil { return (*VStreamRowsRequest)(nil) } - r := &VStreamRowsRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query, - Lastpk: m.Lastpk.CloneVT(), - } + r := new(VStreamRowsRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query + r.Lastpk = m.Lastpk.CloneVT() + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -670,12 +681,12 @@ func (m *VStreamRowsResponse) CloneVT() *VStreamRowsResponse { if m == nil { return (*VStreamRowsResponse)(nil) } - r := &VStreamRowsResponse{ - Gtid: m.Gtid, - Lastpk: m.Lastpk.CloneVT(), - Throttled: m.Throttled, - Heartbeat: m.Heartbeat, - } + r := VStreamRowsResponseFromVTPool() + r.Gtid = m.Gtid + r.Lastpk = m.Lastpk.CloneVT() + r.Throttled = m.Throttled + r.Heartbeat = m.Heartbeat + r.ThrottledReason = m.ThrottledReason if rhs := m.Fields; rhs != nil { tmpContainer := make([]*query.Field, len(rhs)) for k, v := range rhs { @@ -712,11 +723,11 @@ func (m *VStreamTablesRequest) CloneVT() *VStreamTablesRequest { if m == nil { return (*VStreamTablesRequest)(nil) } - r := &VStreamTablesRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - } + r := new(VStreamTablesRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -732,11 +743,10 @@ func (m *VStreamTablesResponse) CloneVT() *VStreamTablesResponse { if m == nil { return (*VStreamTablesResponse)(nil) } - r := &VStreamTablesResponse{ - TableName: m.TableName, - Gtid: m.Gtid, - Lastpk: m.Lastpk.CloneVT(), - } + r := VStreamTablesResponseFromVTPool() + r.TableName = m.TableName + r.Gtid = m.Gtid + r.Lastpk = m.Lastpk.CloneVT() if rhs := m.Fields; rhs != nil { tmpContainer := make([]*query.Field, len(rhs)) for k, v := range rhs { @@ -773,10 +783,9 @@ func (m *LastPKEvent) CloneVT() *LastPKEvent { if m == nil { return (*LastPKEvent)(nil) } - r := &LastPKEvent{ - TableLastPK: m.TableLastPK.CloneVT(), - Completed: m.Completed, - } + r := new(LastPKEvent) + r.TableLastPK = m.TableLastPK.CloneVT() + r.Completed = m.Completed if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -792,10 +801,9 @@ func (m *TableLastPK) CloneVT() *TableLastPK { if m == nil { return (*TableLastPK)(nil) } - r := &TableLastPK{ - TableName: m.TableName, - Lastpk: m.Lastpk.CloneVT(), - } + r := new(TableLastPK) + r.TableName = m.TableName + r.Lastpk = m.Lastpk.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -811,12 +819,11 @@ func (m *VStreamResultsRequest) CloneVT() *VStreamResultsRequest { if m == nil { return (*VStreamResultsRequest)(nil) } - r := &VStreamResultsRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query, - } + r := new(VStreamResultsRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -832,9 +839,8 @@ func (m *VStreamResultsResponse) CloneVT() *VStreamResultsResponse { if m == nil { return (*VStreamResultsResponse)(nil) } - r := &VStreamResultsResponse{ - Gtid: m.Gtid, - } + r := new(VStreamResultsResponse) + r.Gtid = m.Gtid if rhs := m.Fields; rhs != nil { tmpContainer := make([]*query.Field, len(rhs)) for k, v := range rhs { @@ -891,17 +897,17 @@ func (m *Charset) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Server != 0 { - i = encodeVarint(dAtA, i, uint64(m.Server)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Server)) i-- dAtA[i] = 0x18 } if m.Conn != 0 { - i = encodeVarint(dAtA, i, uint64(m.Conn)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Conn)) i-- dAtA[i] = 0x10 } if m.Client != 0 { - i = encodeVarint(dAtA, i, uint64(m.Client)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Client)) i-- dAtA[i] = 0x8 } @@ -941,7 +947,7 @@ func (m *BinlogTransaction_Statement) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Sql) > 0 { i -= len(m.Sql) copy(dAtA[i:], m.Sql) - i = encodeVarint(dAtA, i, uint64(len(m.Sql))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sql))) i-- dAtA[i] = 0x1a } @@ -951,12 +957,12 @@ func (m *BinlogTransaction_Statement) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if m.Category != 0 { - i = encodeVarint(dAtA, i, uint64(m.Category)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Category)) i-- dAtA[i] = 0x8 } @@ -999,7 +1005,7 @@ func (m *BinlogTransaction) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -1010,7 +1016,7 @@ func (m *BinlogTransaction) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1054,7 +1060,7 @@ func (m *StreamKeyRangeRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1064,14 +1070,14 @@ func (m *StreamKeyRangeRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- dAtA[i] = 0xa } @@ -1114,7 +1120,7 @@ func (m *StreamKeyRangeResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1157,7 +1163,7 @@ func (m *StreamTablesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1165,7 +1171,7 @@ func (m *StreamTablesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Tables[iNdEx]) copy(dAtA[i:], m.Tables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -1173,7 +1179,7 @@ func (m *StreamTablesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- dAtA[i] = 0xa } @@ -1216,7 +1222,7 @@ func (m *StreamTablesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1256,14 +1262,14 @@ func (m *CharsetConversion) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ToCharset) > 0 { i -= len(m.ToCharset) copy(dAtA[i:], m.ToCharset) - i = encodeVarint(dAtA, i, uint64(len(m.ToCharset))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ToCharset))) i-- dAtA[i] = 0x12 } if len(m.FromCharset) > 0 { i -= len(m.FromCharset) copy(dAtA[i:], m.FromCharset) - i = encodeVarint(dAtA, i, uint64(len(m.FromCharset))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FromCharset))) i-- dAtA[i] = 0xa } @@ -1303,7 +1309,7 @@ func (m *Rule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ForceUniqueKey) > 0 { i -= len(m.ForceUniqueKey) copy(dAtA[i:], m.ForceUniqueKey) - i = encodeVarint(dAtA, i, uint64(len(m.ForceUniqueKey))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ForceUniqueKey))) i-- dAtA[i] = 0x4a } @@ -1321,10 +1327,10 @@ func (m *Rule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x42 } @@ -1332,21 +1338,21 @@ func (m *Rule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.SourceUniqueKeyTargetColumns) > 0 { i -= len(m.SourceUniqueKeyTargetColumns) copy(dAtA[i:], m.SourceUniqueKeyTargetColumns) - i = encodeVarint(dAtA, i, uint64(len(m.SourceUniqueKeyTargetColumns))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceUniqueKeyTargetColumns))) i-- dAtA[i] = 0x3a } if len(m.TargetUniqueKeyColumns) > 0 { i -= len(m.TargetUniqueKeyColumns) copy(dAtA[i:], m.TargetUniqueKeyColumns) - i = encodeVarint(dAtA, i, uint64(len(m.TargetUniqueKeyColumns))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetUniqueKeyColumns))) i-- dAtA[i] = 0x32 } if len(m.SourceUniqueKeyColumns) > 0 { i -= len(m.SourceUniqueKeyColumns) copy(dAtA[i:], m.SourceUniqueKeyColumns) - i = encodeVarint(dAtA, i, uint64(len(m.SourceUniqueKeyColumns))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceUniqueKeyColumns))) i-- dAtA[i] = 0x2a } @@ -1359,15 +1365,15 @@ func (m *Rule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x22 } @@ -1378,15 +1384,15 @@ func (m *Rule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x1a } @@ -1394,14 +1400,14 @@ func (m *Rule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Filter) > 0 { i -= len(m.Filter) copy(dAtA[i:], m.Filter) - i = encodeVarint(dAtA, i, uint64(len(m.Filter))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Filter))) i-- dAtA[i] = 0x12 } if len(m.Match) > 0 { i -= len(m.Match) copy(dAtA[i:], m.Match) - i = encodeVarint(dAtA, i, uint64(len(m.Match))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Match))) i-- dAtA[i] = 0xa } @@ -1441,17 +1447,17 @@ func (m *Filter) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.WorkflowName) > 0 { i -= len(m.WorkflowName) copy(dAtA[i:], m.WorkflowName) - i = encodeVarint(dAtA, i, uint64(len(m.WorkflowName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WorkflowName))) i-- dAtA[i] = 0x22 } if m.WorkflowType != 0 { - i = encodeVarint(dAtA, i, uint64(m.WorkflowType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.WorkflowType)) i-- dAtA[i] = 0x18 } if m.FieldEventMode != 0 { - i = encodeVarint(dAtA, i, uint64(m.FieldEventMode)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.FieldEventMode)) i-- dAtA[i] = 0x10 } @@ -1462,7 +1468,7 @@ func (m *Filter) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1503,21 +1509,21 @@ func (m *BinlogSource) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.TargetTimeZone) > 0 { i -= len(m.TargetTimeZone) copy(dAtA[i:], m.TargetTimeZone) - i = encodeVarint(dAtA, i, uint64(len(m.TargetTimeZone))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetTimeZone))) i-- dAtA[i] = 0x62 } if len(m.SourceTimeZone) > 0 { i -= len(m.SourceTimeZone) copy(dAtA[i:], m.SourceTimeZone) - i = encodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) i-- dAtA[i] = 0x5a } if len(m.ExternalCluster) > 0 { i -= len(m.ExternalCluster) copy(dAtA[i:], m.ExternalCluster) - i = encodeVarint(dAtA, i, uint64(len(m.ExternalCluster))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExternalCluster))) i-- dAtA[i] = 0x52 } @@ -1534,12 +1540,12 @@ func (m *BinlogSource) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ExternalMysql) > 0 { i -= len(m.ExternalMysql) copy(dAtA[i:], m.ExternalMysql) - i = encodeVarint(dAtA, i, uint64(len(m.ExternalMysql))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExternalMysql))) i-- dAtA[i] = 0x42 } if m.OnDdl != 0 { - i = encodeVarint(dAtA, i, uint64(m.OnDdl)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.OnDdl)) i-- dAtA[i] = 0x38 } @@ -1549,7 +1555,7 @@ func (m *BinlogSource) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -1557,7 +1563,7 @@ func (m *BinlogSource) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Tables[iNdEx]) copy(dAtA[i:], m.Tables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -1568,26 +1574,26 @@ func (m *BinlogSource) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if m.TabletType != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletType)) i-- dAtA[i] = 0x18 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -1627,12 +1633,12 @@ func (m *RowChange_Bitmap) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Cols) > 0 { i -= len(m.Cols) copy(dAtA[i:], m.Cols) - i = encodeVarint(dAtA, i, uint64(len(m.Cols))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cols))) i-- dAtA[i] = 0x12 } if m.Count != 0 { - i = encodeVarint(dAtA, i, uint64(m.Count)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Count)) i-- dAtA[i] = 0x8 } @@ -1675,7 +1681,7 @@ func (m *RowChange) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1685,7 +1691,7 @@ func (m *RowChange) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1695,7 +1701,7 @@ func (m *RowChange) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1732,22 +1738,32 @@ func (m *RowEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.IsInternalTable { + i-- + if m.IsInternalTable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } if m.Flags != 0 { - i = encodeVarint(dAtA, i, uint64(m.Flags)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Flags)) i-- dAtA[i] = 0x28 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x22 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x1a } @@ -1758,7 +1774,7 @@ func (m *RowEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1766,7 +1782,7 @@ func (m *RowEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.TableName) > 0 { i -= len(m.TableName) copy(dAtA[i:], m.TableName) - i = encodeVarint(dAtA, i, uint64(len(m.TableName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableName))) i-- dAtA[i] = 0xa } @@ -1803,6 +1819,18 @@ func (m *FieldEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.IsInternalTable { + i-- + if m.IsInternalTable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xd0 + } if m.EnumSetStringValues { i-- if m.EnumSetStringValues { @@ -1818,14 +1846,14 @@ func (m *FieldEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x22 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x1a } @@ -1836,7 +1864,7 @@ func (m *FieldEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1844,7 +1872,7 @@ func (m *FieldEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.TableName) > 0 { i -= len(m.TableName) copy(dAtA[i:], m.TableName) - i = encodeVarint(dAtA, i, uint64(len(m.TableName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableName))) i-- dAtA[i] = 0xa } @@ -1888,7 +1916,7 @@ func (m *ShardGtid) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -1896,21 +1924,21 @@ func (m *ShardGtid) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Gtid) > 0 { i -= len(m.Gtid) copy(dAtA[i:], m.Gtid) - i = encodeVarint(dAtA, i, uint64(len(m.Gtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Gtid))) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -1954,7 +1982,7 @@ func (m *VGtid) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1995,14 +2023,14 @@ func (m *KeyspaceShard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -2043,7 +2071,7 @@ func (m *Journal) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.SourceWorkflows) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SourceWorkflows[iNdEx]) copy(dAtA[i:], m.SourceWorkflows[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.SourceWorkflows[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceWorkflows[iNdEx]))) i-- dAtA[i] = 0x3a } @@ -2055,7 +2083,7 @@ func (m *Journal) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -2067,7 +2095,7 @@ func (m *Journal) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -2075,7 +2103,7 @@ func (m *Journal) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.LocalPosition) > 0 { i -= len(m.LocalPosition) copy(dAtA[i:], m.LocalPosition) - i = encodeVarint(dAtA, i, uint64(len(m.LocalPosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LocalPosition))) i-- dAtA[i] = 0x22 } @@ -2083,18 +2111,18 @@ func (m *Journal) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Tables[iNdEx]) copy(dAtA[i:], m.Tables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) i-- dAtA[i] = 0x1a } } if m.MigrationType != 0 { - i = encodeVarint(dAtA, i, uint64(m.MigrationType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MigrationType)) i-- dAtA[i] = 0x10 } if m.Id != 0 { - i = encodeVarint(dAtA, i, uint64(m.Id)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Id)) i-- dAtA[i] = 0x8 } @@ -2131,6 +2159,15 @@ func (m *VEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.ThrottledReason) > 0 { + i -= len(m.ThrottledReason) + copy(dAtA[i:], m.ThrottledReason) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ThrottledReason))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + } if m.Throttled { i-- if m.Throttled { @@ -2146,7 +2183,7 @@ func (m *VEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1 i-- @@ -2155,7 +2192,7 @@ func (m *VEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x1 i-- @@ -2167,14 +2204,14 @@ func (m *VEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xaa } if m.CurrentTime != 0 { - i = encodeVarint(dAtA, i, uint64(m.CurrentTime)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.CurrentTime)) i-- dAtA[i] = 0x1 i-- @@ -2183,7 +2220,7 @@ func (m *VEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Dml) > 0 { i -= len(m.Dml) copy(dAtA[i:], m.Dml) - i = encodeVarint(dAtA, i, uint64(len(m.Dml))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dml))) i-- dAtA[i] = 0x4a } @@ -2193,7 +2230,7 @@ func (m *VEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x42 } @@ -2203,7 +2240,7 @@ func (m *VEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x3a } @@ -2213,7 +2250,7 @@ func (m *VEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -2223,31 +2260,31 @@ func (m *VEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } if len(m.Statement) > 0 { i -= len(m.Statement) copy(dAtA[i:], m.Statement) - i = encodeVarint(dAtA, i, uint64(len(m.Statement))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Statement))) i-- dAtA[i] = 0x22 } if len(m.Gtid) > 0 { i -= len(m.Gtid) copy(dAtA[i:], m.Gtid) - i = encodeVarint(dAtA, i, uint64(len(m.Gtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Gtid))) i-- dAtA[i] = 0x1a } if m.Timestamp != 0 { - i = encodeVarint(dAtA, i, uint64(m.Timestamp)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Timestamp)) i-- dAtA[i] = 0x10 } if m.Type != 0 { - i = encodeVarint(dAtA, i, uint64(m.Type)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Type)) i-- dAtA[i] = 0x8 } @@ -2287,14 +2324,14 @@ func (m *MinimalTable) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.PKIndexName) > 0 { i -= len(m.PKIndexName) copy(dAtA[i:], m.PKIndexName) - i = encodeVarint(dAtA, i, uint64(len(m.PKIndexName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PKIndexName))) i-- dAtA[i] = 0x22 } if len(m.PKColumns) > 0 { var pksize2 int for _, num := range m.PKColumns { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -2308,7 +2345,7 @@ func (m *MinimalTable) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x1a } @@ -2319,7 +2356,7 @@ func (m *MinimalTable) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2327,7 +2364,7 @@ func (m *MinimalTable) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -2371,7 +2408,68 @@ func (m *MinimalSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *VStreamOptions) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VStreamOptions) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *VStreamOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.ConfigOverrides) > 0 { + for k := range m.ConfigOverrides { + v := m.ConfigOverrides[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.InternalTables) > 0 { + for iNdEx := len(m.InternalTables) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.InternalTables[iNdEx]) + copy(dAtA[i:], m.InternalTables[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.InternalTables[iNdEx]))) i-- dAtA[i] = 0xa } @@ -2409,6 +2507,16 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.Options != nil { + size, err := m.Options.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x3a + } if len(m.TableLastPKs) > 0 { for iNdEx := len(m.TableLastPKs) - 1; iNdEx >= 0; iNdEx-- { size, err := m.TableLastPKs[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) @@ -2416,7 +2524,7 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -2427,14 +2535,14 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- dAtA[i] = 0x22 } @@ -2444,7 +2552,7 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -2454,7 +2562,7 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2464,7 +2572,7 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2508,7 +2616,7 @@ func (m *VStreamResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2546,20 +2654,30 @@ func (m *VStreamRowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.Options != nil { + size, err := m.Options.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x32 + } if m.Lastpk != nil { size, err := m.Lastpk.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } if len(m.Query) > 0 { i -= len(m.Query) copy(dAtA[i:], m.Query) - i = encodeVarint(dAtA, i, uint64(len(m.Query))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Query))) i-- dAtA[i] = 0x22 } @@ -2569,7 +2687,7 @@ func (m *VStreamRowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -2579,7 +2697,7 @@ func (m *VStreamRowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2589,7 +2707,7 @@ func (m *VStreamRowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2626,6 +2744,13 @@ func (m *VStreamRowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.ThrottledReason) > 0 { + i -= len(m.ThrottledReason) + copy(dAtA[i:], m.ThrottledReason) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ThrottledReason))) + i-- + dAtA[i] = 0x42 + } if m.Heartbeat { i-- if m.Heartbeat { @@ -2652,7 +2777,7 @@ func (m *VStreamRowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -2663,7 +2788,7 @@ func (m *VStreamRowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -2671,7 +2796,7 @@ func (m *VStreamRowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Gtid) > 0 { i -= len(m.Gtid) copy(dAtA[i:], m.Gtid) - i = encodeVarint(dAtA, i, uint64(len(m.Gtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Gtid))) i-- dAtA[i] = 0x1a } @@ -2682,7 +2807,7 @@ func (m *VStreamRowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2694,7 +2819,7 @@ func (m *VStreamRowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2732,13 +2857,23 @@ func (m *VStreamTablesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.Options != nil { + size, err := m.Options.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } if m.Target != nil { size, err := m.Target.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -2748,7 +2883,7 @@ func (m *VStreamTablesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2758,7 +2893,7 @@ func (m *VStreamTablesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2801,7 +2936,7 @@ func (m *VStreamTablesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -2812,7 +2947,7 @@ func (m *VStreamTablesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -2820,7 +2955,7 @@ func (m *VStreamTablesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Gtid) > 0 { i -= len(m.Gtid) copy(dAtA[i:], m.Gtid) - i = encodeVarint(dAtA, i, uint64(len(m.Gtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Gtid))) i-- dAtA[i] = 0x22 } @@ -2831,7 +2966,7 @@ func (m *VStreamTablesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -2843,7 +2978,7 @@ func (m *VStreamTablesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2851,7 +2986,7 @@ func (m *VStreamTablesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.TableName) > 0 { i -= len(m.TableName) copy(dAtA[i:], m.TableName) - i = encodeVarint(dAtA, i, uint64(len(m.TableName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableName))) i-- dAtA[i] = 0xa } @@ -2904,7 +3039,7 @@ func (m *LastPKEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2947,14 +3082,14 @@ func (m *TableLastPK) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.TableName) > 0 { i -= len(m.TableName) copy(dAtA[i:], m.TableName) - i = encodeVarint(dAtA, i, uint64(len(m.TableName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableName))) i-- dAtA[i] = 0xa } @@ -2994,7 +3129,7 @@ func (m *VStreamResultsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Query) > 0 { i -= len(m.Query) copy(dAtA[i:], m.Query) - i = encodeVarint(dAtA, i, uint64(len(m.Query))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Query))) i-- dAtA[i] = 0x22 } @@ -3004,7 +3139,7 @@ func (m *VStreamResultsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3014,7 +3149,7 @@ func (m *VStreamResultsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3024,7 +3159,7 @@ func (m *VStreamResultsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3068,7 +3203,7 @@ func (m *VStreamResultsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -3076,7 +3211,7 @@ func (m *VStreamResultsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.Gtid) > 0 { i -= len(m.Gtid) copy(dAtA[i:], m.Gtid) - i = encodeVarint(dAtA, i, uint64(len(m.Gtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Gtid))) i-- dAtA[i] = 0x1a } @@ -3087,7 +3222,7 @@ func (m *VStreamResultsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3095,18 +3230,6 @@ func (m *VStreamResultsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - var vtprotoPool_VStreamRowsResponse = sync.Pool{ New: func() interface{} { return &VStreamRowsResponse{} @@ -3114,23 +3237,25 @@ var vtprotoPool_VStreamRowsResponse = sync.Pool{ } func (m *VStreamRowsResponse) ResetVT() { - for _, mm := range m.Fields { - mm.Reset() - } - f0 := m.Fields[:0] - for _, mm := range m.Pkfields { - mm.Reset() - } - f1 := m.Pkfields[:0] - for _, mm := range m.Rows { - mm.ResetVT() + if m != nil { + for _, mm := range m.Fields { + mm.Reset() + } + f0 := m.Fields[:0] + for _, mm := range m.Pkfields { + mm.Reset() + } + f1 := m.Pkfields[:0] + for _, mm := range m.Rows { + mm.ResetVT() + } + f2 := m.Rows[:0] + m.Lastpk.ReturnToVTPool() + m.Reset() + m.Fields = f0 + m.Pkfields = f1 + m.Rows = f2 } - f2 := m.Rows[:0] - m.Lastpk.ReturnToVTPool() - m.Reset() - m.Fields = f0 - m.Pkfields = f1 - m.Rows = f2 } func (m *VStreamRowsResponse) ReturnToVTPool() { if m != nil { @@ -3149,23 +3274,25 @@ var vtprotoPool_VStreamTablesResponse = sync.Pool{ } func (m *VStreamTablesResponse) ResetVT() { - for _, mm := range m.Fields { - mm.Reset() - } - f0 := m.Fields[:0] - for _, mm := range m.Pkfields { - mm.Reset() - } - f1 := m.Pkfields[:0] - for _, mm := range m.Rows { - mm.ResetVT() + if m != nil { + for _, mm := range m.Fields { + mm.Reset() + } + f0 := m.Fields[:0] + for _, mm := range m.Pkfields { + mm.Reset() + } + f1 := m.Pkfields[:0] + for _, mm := range m.Rows { + mm.ResetVT() + } + f2 := m.Rows[:0] + m.Lastpk.ReturnToVTPool() + m.Reset() + m.Fields = f0 + m.Pkfields = f1 + m.Rows = f2 } - f2 := m.Rows[:0] - m.Lastpk.ReturnToVTPool() - m.Reset() - m.Fields = f0 - m.Pkfields = f1 - m.Rows = f2 } func (m *VStreamTablesResponse) ReturnToVTPool() { if m != nil { @@ -3183,13 +3310,13 @@ func (m *Charset) SizeVT() (n int) { var l int _ = l if m.Client != 0 { - n += 1 + sov(uint64(m.Client)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Client)) } if m.Conn != 0 { - n += 1 + sov(uint64(m.Conn)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Conn)) } if m.Server != 0 { - n += 1 + sov(uint64(m.Server)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Server)) } n += len(m.unknownFields) return n @@ -3202,15 +3329,15 @@ func (m *BinlogTransaction_Statement) SizeVT() (n int) { var l int _ = l if m.Category != 0 { - n += 1 + sov(uint64(m.Category)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Category)) } if m.Charset != nil { l = m.Charset.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Sql) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3225,12 +3352,12 @@ func (m *BinlogTransaction) SizeVT() (n int) { if len(m.Statements) > 0 { for _, e := range m.Statements { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.EventToken != nil { l = m.EventToken.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3244,15 +3371,15 @@ func (m *StreamKeyRangeRequest) SizeVT() (n int) { _ = l l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeyRange != nil { l = m.KeyRange.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Charset != nil { l = m.Charset.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3266,7 +3393,7 @@ func (m *StreamKeyRangeResponse) SizeVT() (n int) { _ = l if m.BinlogTransaction != nil { l = m.BinlogTransaction.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3280,17 +3407,17 @@ func (m *StreamTablesRequest) SizeVT() (n int) { _ = l l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Tables) > 0 { for _, s := range m.Tables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Charset != nil { l = m.Charset.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3304,7 +3431,7 @@ func (m *StreamTablesResponse) SizeVT() (n int) { _ = l if m.BinlogTransaction != nil { l = m.BinlogTransaction.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3318,11 +3445,11 @@ func (m *CharsetConversion) SizeVT() (n int) { _ = l l = len(m.FromCharset) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ToCharset) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3336,18 +3463,18 @@ func (m *Rule) SizeVT() (n int) { _ = l l = len(m.Match) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Filter) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ConvertEnumToText) > 0 { for k, v := range m.ConvertEnumToText { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if len(m.ConvertCharset) > 0 { @@ -3358,34 +3485,34 @@ func (m *Rule) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } l = len(m.SourceUniqueKeyColumns) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetUniqueKeyColumns) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceUniqueKeyTargetColumns) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ConvertIntToEnum) > 0 { for k, v := range m.ConvertIntToEnum { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + 1 - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + 1 + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } l = len(m.ForceUniqueKey) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3400,18 +3527,18 @@ func (m *Filter) SizeVT() (n int) { if len(m.Rules) > 0 { for _, e := range m.Rules { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.FieldEventMode != 0 { - n += 1 + sov(uint64(m.FieldEventMode)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.FieldEventMode)) } if m.WorkflowType != 0 { - n += 1 + sov(uint64(m.WorkflowType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.WorkflowType)) } l = len(m.WorkflowName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3425,50 +3552,50 @@ func (m *BinlogSource) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletType != 0 { - n += 1 + sov(uint64(m.TabletType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletType)) } if m.KeyRange != nil { l = m.KeyRange.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Tables) > 0 { for _, s := range m.Tables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Filter != nil { l = m.Filter.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.OnDdl != 0 { - n += 1 + sov(uint64(m.OnDdl)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.OnDdl)) } l = len(m.ExternalMysql) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.StopAfterCopy { n += 2 } l = len(m.ExternalCluster) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceTimeZone) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetTimeZone) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3481,11 +3608,11 @@ func (m *RowChange_Bitmap) SizeVT() (n int) { var l int _ = l if m.Count != 0 { - n += 1 + sov(uint64(m.Count)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Count)) } l = len(m.Cols) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3499,15 +3626,15 @@ func (m *RowChange) SizeVT() (n int) { _ = l if m.Before != nil { l = m.Before.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.After != nil { l = m.After.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.DataColumns != nil { l = m.DataColumns.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3521,24 +3648,27 @@ func (m *RowEvent) SizeVT() (n int) { _ = l l = len(m.TableName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.RowChanges) > 0 { for _, e := range m.RowChanges { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Flags != 0 { - n += 1 + sov(uint64(m.Flags)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Flags)) + } + if m.IsInternalTable { + n += 2 } n += len(m.unknownFields) return n @@ -3552,25 +3682,28 @@ func (m *FieldEvent) SizeVT() (n int) { _ = l l = len(m.TableName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Fields) > 0 { for _, e := range m.Fields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.EnumSetStringValues { n += 3 } + if m.IsInternalTable { + n += 3 + } n += len(m.unknownFields) return n } @@ -3583,20 +3716,20 @@ func (m *ShardGtid) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Gtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.TablePKs) > 0 { for _, e := range m.TablePKs { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -3612,7 +3745,7 @@ func (m *VGtid) SizeVT() (n int) { if len(m.ShardGtids) > 0 { for _, e := range m.ShardGtids { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -3627,11 +3760,11 @@ func (m *KeyspaceShard) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3644,37 +3777,37 @@ func (m *Journal) SizeVT() (n int) { var l int _ = l if m.Id != 0 { - n += 1 + sov(uint64(m.Id)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Id)) } if m.MigrationType != 0 { - n += 1 + sov(uint64(m.MigrationType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MigrationType)) } if len(m.Tables) > 0 { for _, s := range m.Tables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.LocalPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ShardGtids) > 0 { for _, e := range m.ShardGtids { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Participants) > 0 { for _, e := range m.Participants { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.SourceWorkflows) > 0 { for _, s := range m.SourceWorkflows { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -3688,57 +3821,61 @@ func (m *VEvent) SizeVT() (n int) { var l int _ = l if m.Type != 0 { - n += 1 + sov(uint64(m.Type)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Type)) } if m.Timestamp != 0 { - n += 1 + sov(uint64(m.Timestamp)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Timestamp)) } l = len(m.Gtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Statement) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.RowEvent != nil { l = m.RowEvent.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.FieldEvent != nil { l = m.FieldEvent.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Vgtid != nil { l = m.Vgtid.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Journal != nil { l = m.Journal.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Dml) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CurrentTime != 0 { - n += 2 + sov(uint64(m.CurrentTime)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.CurrentTime)) } if m.LastPKEvent != nil { l = m.LastPKEvent.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Throttled { n += 3 } + l = len(m.ThrottledReason) + if l > 0 { + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } @@ -3751,24 +3888,24 @@ func (m *MinimalTable) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Fields) > 0 { for _, e := range m.Fields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.PKColumns) > 0 { l = 0 for _, e := range m.PKColumns { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } l = len(m.PKIndexName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3783,7 +3920,31 @@ func (m *MinimalSchema) SizeVT() (n int) { if len(m.Tables) > 0 { for _, e := range m.Tables { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *VStreamOptions) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.InternalTables) > 0 { + for _, s := range m.InternalTables { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.ConfigOverrides) > 0 { + for k, v := range m.ConfigOverrides { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -3798,30 +3959,34 @@ func (m *VStreamRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Filter != nil { l = m.Filter.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.TableLastPKs) > 0 { for _, e := range m.TableLastPKs { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } + if m.Options != nil { + l = m.Options.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } @@ -3835,7 +4000,7 @@ func (m *VStreamResponse) SizeVT() (n int) { if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -3850,23 +4015,27 @@ func (m *VStreamRowsRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Query) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Lastpk != nil { l = m.Lastpk.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Options != nil { + l = m.Options.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3881,28 +4050,28 @@ func (m *VStreamRowsResponse) SizeVT() (n int) { if len(m.Fields) > 0 { for _, e := range m.Fields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Pkfields) > 0 { for _, e := range m.Pkfields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.Gtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Rows) > 0 { for _, e := range m.Rows { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Lastpk != nil { l = m.Lastpk.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Throttled { n += 2 @@ -3910,6 +4079,10 @@ func (m *VStreamRowsResponse) SizeVT() (n int) { if m.Heartbeat { n += 2 } + l = len(m.ThrottledReason) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } @@ -3922,15 +4095,19 @@ func (m *VStreamTablesRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Options != nil { + l = m.Options.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3944,33 +4121,33 @@ func (m *VStreamTablesResponse) SizeVT() (n int) { _ = l l = len(m.TableName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Fields) > 0 { for _, e := range m.Fields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Pkfields) > 0 { for _, e := range m.Pkfields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.Gtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Rows) > 0 { for _, e := range m.Rows { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Lastpk != nil { l = m.Lastpk.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -3984,7 +4161,7 @@ func (m *LastPKEvent) SizeVT() (n int) { _ = l if m.TableLastPK != nil { l = m.TableLastPK.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Completed { n += 2 @@ -4001,11 +4178,11 @@ func (m *TableLastPK) SizeVT() (n int) { _ = l l = len(m.TableName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Lastpk != nil { l = m.Lastpk.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -4019,19 +4196,19 @@ func (m *VStreamResultsRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Query) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -4046,29 +4223,23 @@ func (m *VStreamResultsResponse) SizeVT() (n int) { if len(m.Fields) > 0 { for _, e := range m.Fields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.Gtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Rows) > 0 { for _, e := range m.Rows { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *Charset) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -4077,7 +4248,7 @@ func (m *Charset) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4105,7 +4276,7 @@ func (m *Charset) UnmarshalVT(dAtA []byte) error { m.Client = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4124,7 +4295,7 @@ func (m *Charset) UnmarshalVT(dAtA []byte) error { m.Conn = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4143,7 +4314,7 @@ func (m *Charset) UnmarshalVT(dAtA []byte) error { m.Server = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4157,12 +4328,12 @@ func (m *Charset) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4185,7 +4356,7 @@ func (m *BinlogTransaction_Statement) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4213,7 +4384,7 @@ func (m *BinlogTransaction_Statement) UnmarshalVT(dAtA []byte) error { m.Category = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4232,7 +4403,7 @@ func (m *BinlogTransaction_Statement) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4245,11 +4416,11 @@ func (m *BinlogTransaction_Statement) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4268,7 +4439,7 @@ func (m *BinlogTransaction_Statement) UnmarshalVT(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4281,11 +4452,11 @@ func (m *BinlogTransaction_Statement) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4297,12 +4468,12 @@ func (m *BinlogTransaction_Statement) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4325,7 +4496,7 @@ func (m *BinlogTransaction) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4353,7 +4524,7 @@ func (m *BinlogTransaction) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4366,11 +4537,11 @@ func (m *BinlogTransaction) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4387,7 +4558,7 @@ func (m *BinlogTransaction) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4400,11 +4571,11 @@ func (m *BinlogTransaction) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4418,12 +4589,12 @@ func (m *BinlogTransaction) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4446,7 +4617,7 @@ func (m *StreamKeyRangeRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4474,7 +4645,7 @@ func (m *StreamKeyRangeRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4488,11 +4659,11 @@ func (m *StreamKeyRangeRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4506,7 +4677,7 @@ func (m *StreamKeyRangeRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4519,11 +4690,11 @@ func (m *StreamKeyRangeRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4542,7 +4713,7 @@ func (m *StreamKeyRangeRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4555,11 +4726,11 @@ func (m *StreamKeyRangeRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4573,12 +4744,12 @@ func (m *StreamKeyRangeRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4601,7 +4772,7 @@ func (m *StreamKeyRangeResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4629,7 +4800,7 @@ func (m *StreamKeyRangeResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4642,11 +4813,11 @@ func (m *StreamKeyRangeResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4660,12 +4831,12 @@ func (m *StreamKeyRangeResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4688,7 +4859,7 @@ func (m *StreamTablesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4716,7 +4887,7 @@ func (m *StreamTablesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4730,11 +4901,11 @@ func (m *StreamTablesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4748,7 +4919,7 @@ func (m *StreamTablesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4762,11 +4933,11 @@ func (m *StreamTablesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4780,7 +4951,7 @@ func (m *StreamTablesRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4793,11 +4964,11 @@ func (m *StreamTablesRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4811,12 +4982,12 @@ func (m *StreamTablesRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4839,7 +5010,7 @@ func (m *StreamTablesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4867,7 +5038,7 @@ func (m *StreamTablesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4880,11 +5051,11 @@ func (m *StreamTablesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4898,12 +5069,12 @@ func (m *StreamTablesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4926,7 +5097,7 @@ func (m *CharsetConversion) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4954,7 +5125,7 @@ func (m *CharsetConversion) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4968,11 +5139,11 @@ func (m *CharsetConversion) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4986,7 +5157,7 @@ func (m *CharsetConversion) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5000,11 +5171,11 @@ func (m *CharsetConversion) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5013,12 +5184,12 @@ func (m *CharsetConversion) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5041,7 +5212,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5069,7 +5240,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5083,11 +5254,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5101,7 +5272,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5115,11 +5286,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5133,7 +5304,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5146,11 +5317,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5165,7 +5336,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5182,7 +5353,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5196,11 +5367,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -5211,7 +5382,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5225,11 +5396,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLenmapvalue := int(stringLenmapvalue) if intStringLenmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapvalue := iNdEx + intStringLenmapvalue if postStringIndexmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF @@ -5238,12 +5409,12 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -5260,7 +5431,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5273,11 +5444,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5292,7 +5463,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5309,7 +5480,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5323,11 +5494,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -5338,7 +5509,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5351,11 +5522,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -5367,12 +5538,12 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -5389,7 +5560,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5403,11 +5574,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5421,7 +5592,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5435,11 +5606,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5453,7 +5624,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5467,11 +5638,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5485,7 +5656,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5498,11 +5669,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5517,7 +5688,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5534,7 +5705,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5548,11 +5719,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -5563,7 +5734,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var mapvaluetemp int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5578,12 +5749,12 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { mapvalue = bool(mapvaluetemp != 0) } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -5600,7 +5771,7 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5614,11 +5785,11 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5627,12 +5798,12 @@ func (m *Rule) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5655,7 +5826,7 @@ func (m *Filter) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5683,7 +5854,7 @@ func (m *Filter) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5696,11 +5867,11 @@ func (m *Filter) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5717,7 +5888,7 @@ func (m *Filter) UnmarshalVT(dAtA []byte) error { m.FieldEventMode = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5736,7 +5907,7 @@ func (m *Filter) UnmarshalVT(dAtA []byte) error { m.WorkflowType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5755,7 +5926,7 @@ func (m *Filter) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5769,11 +5940,11 @@ func (m *Filter) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5782,12 +5953,12 @@ func (m *Filter) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5810,7 +5981,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5838,7 +6009,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5852,11 +6023,11 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5870,7 +6041,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5884,11 +6055,11 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5902,7 +6073,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { m.TabletType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5921,7 +6092,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5934,11 +6105,11 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5957,7 +6128,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5971,11 +6142,11 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5989,7 +6160,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6002,11 +6173,11 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6025,7 +6196,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { m.OnDdl = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6044,7 +6215,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6058,11 +6229,11 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6076,7 +6247,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6096,7 +6267,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6110,11 +6281,11 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6128,7 +6299,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6142,11 +6313,11 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6160,7 +6331,7 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6174,11 +6345,11 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6187,12 +6358,12 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -6215,7 +6386,7 @@ func (m *RowChange_Bitmap) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6243,7 +6414,7 @@ func (m *RowChange_Bitmap) UnmarshalVT(dAtA []byte) error { m.Count = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6262,7 +6433,7 @@ func (m *RowChange_Bitmap) UnmarshalVT(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6275,11 +6446,11 @@ func (m *RowChange_Bitmap) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6291,12 +6462,12 @@ func (m *RowChange_Bitmap) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -6319,7 +6490,7 @@ func (m *RowChange) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6347,7 +6518,7 @@ func (m *RowChange) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6360,11 +6531,11 @@ func (m *RowChange) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6383,7 +6554,7 @@ func (m *RowChange) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6396,11 +6567,11 @@ func (m *RowChange) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6419,7 +6590,7 @@ func (m *RowChange) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6432,11 +6603,11 @@ func (m *RowChange) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6450,12 +6621,12 @@ func (m *RowChange) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -6478,7 +6649,7 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6506,7 +6677,7 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6520,11 +6691,11 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6538,7 +6709,7 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6551,11 +6722,11 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6572,7 +6743,7 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6586,11 +6757,11 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6604,7 +6775,7 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6618,11 +6789,11 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6636,7 +6807,7 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { m.Flags = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6648,14 +6819,34 @@ func (m *RowEvent) UnmarshalVT(dAtA []byte) error { break } } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsInternalTable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsInternalTable = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -6678,7 +6869,7 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6706,7 +6897,7 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6720,11 +6911,11 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6738,7 +6929,7 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6751,11 +6942,11 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6772,7 +6963,7 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6786,11 +6977,11 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6804,7 +6995,7 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6818,11 +7009,11 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6836,7 +7027,7 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6849,14 +7040,34 @@ func (m *FieldEvent) UnmarshalVT(dAtA []byte) error { } } m.EnumSetStringValues = bool(v != 0) + case 26: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsInternalTable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsInternalTable = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -6879,7 +7090,7 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6907,7 +7118,7 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6921,11 +7132,11 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6939,7 +7150,7 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6953,11 +7164,11 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6971,7 +7182,7 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6985,11 +7196,11 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7003,7 +7214,7 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7016,11 +7227,11 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7032,12 +7243,12 @@ func (m *ShardGtid) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -7060,7 +7271,7 @@ func (m *VGtid) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7088,7 +7299,7 @@ func (m *VGtid) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7101,11 +7312,11 @@ func (m *VGtid) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7117,12 +7328,12 @@ func (m *VGtid) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -7145,7 +7356,7 @@ func (m *KeyspaceShard) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7173,7 +7384,7 @@ func (m *KeyspaceShard) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7187,11 +7398,11 @@ func (m *KeyspaceShard) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7205,7 +7416,7 @@ func (m *KeyspaceShard) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7219,11 +7430,11 @@ func (m *KeyspaceShard) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7232,12 +7443,12 @@ func (m *KeyspaceShard) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -7260,7 +7471,7 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7288,7 +7499,7 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { m.Id = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7307,7 +7518,7 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { m.MigrationType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7326,7 +7537,7 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7340,11 +7551,11 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7358,7 +7569,7 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7372,11 +7583,11 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7390,7 +7601,7 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7403,11 +7614,11 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7424,7 +7635,7 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7437,11 +7648,11 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7458,7 +7669,7 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7472,11 +7683,11 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7485,12 +7696,12 @@ func (m *Journal) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -7513,7 +7724,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7541,7 +7752,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7560,7 +7771,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { m.Timestamp = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7579,7 +7790,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7593,11 +7804,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7611,7 +7822,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7625,11 +7836,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7643,7 +7854,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7656,11 +7867,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7679,7 +7890,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7692,11 +7903,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7715,7 +7926,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7728,11 +7939,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7751,7 +7962,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7764,11 +7975,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7787,7 +7998,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7801,11 +8012,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7819,7 +8030,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { m.CurrentTime = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7838,7 +8049,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7851,11 +8062,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7874,7 +8085,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7888,11 +8099,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7906,7 +8117,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7920,11 +8131,11 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7938,7 +8149,7 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7951,14 +8162,46 @@ func (m *VEvent) UnmarshalVT(dAtA []byte) error { } } m.Throttled = bool(v != 0) + case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ThrottledReason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ThrottledReason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -7981,7 +8224,7 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8009,7 +8252,7 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8023,11 +8266,11 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8041,7 +8284,7 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8054,11 +8297,11 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8073,7 +8316,7 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { var v int64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8090,7 +8333,7 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8103,11 +8346,11 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8127,7 +8370,7 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { var v int64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8151,7 +8394,7 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8165,11 +8408,11 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8178,12 +8421,12 @@ func (m *MinimalTable) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8206,7 +8449,7 @@ func (m *MinimalSchema) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8234,7 +8477,7 @@ func (m *MinimalSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8247,11 +8490,11 @@ func (m *MinimalSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8263,12 +8506,12 @@ func (m *MinimalSchema) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8283,7 +8526,7 @@ func (m *MinimalSchema) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { +func (m *VStreamOptions) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8291,7 +8534,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8306,37 +8549,247 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: VStreamRequest: wiretype end group for non-group") + return fmt.Errorf("proto: VStreamOptions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: VStreamRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: VStreamOptions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EffectiveCallerId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field InternalTables", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InternalTables = append(m.InternalTables, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigOverrides", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConfigOverrides == nil { + m.ConfigOverrides = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ConfigOverrides[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VStreamRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VStreamRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EffectiveCallerId", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8355,7 +8808,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8368,11 +8821,11 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8391,7 +8844,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8404,11 +8857,11 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8427,7 +8880,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8441,11 +8894,11 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8459,7 +8912,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8472,11 +8925,11 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8495,7 +8948,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8508,11 +8961,11 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8522,14 +8975,50 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Options == nil { + m.Options = &VStreamOptions{} + } + if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8552,7 +9041,7 @@ func (m *VStreamResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8580,7 +9069,7 @@ func (m *VStreamResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8593,11 +9082,11 @@ func (m *VStreamResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8609,12 +9098,12 @@ func (m *VStreamResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8637,7 +9126,7 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8665,7 +9154,7 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8678,11 +9167,11 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8701,7 +9190,7 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8714,11 +9203,11 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8737,7 +9226,7 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8750,11 +9239,11 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8773,7 +9262,7 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8787,11 +9276,11 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8805,7 +9294,7 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8818,11 +9307,11 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8834,14 +9323,50 @@ func (m *VStreamRowsRequest) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Options == nil { + m.Options = &VStreamOptions{} + } + if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8864,7 +9389,7 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8892,7 +9417,7 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8905,11 +9430,11 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8933,7 +9458,7 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8946,11 +9471,11 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8974,7 +9499,7 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8988,11 +9513,11 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9006,7 +9531,7 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9019,11 +9544,11 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9047,7 +9572,7 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9060,11 +9585,11 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9083,7 +9608,7 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9103,7 +9628,7 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9116,14 +9641,46 @@ func (m *VStreamRowsResponse) UnmarshalVT(dAtA []byte) error { } } m.Heartbeat = bool(v != 0) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ThrottledReason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ThrottledReason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9146,7 +9703,7 @@ func (m *VStreamTablesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9174,7 +9731,7 @@ func (m *VStreamTablesRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9187,11 +9744,11 @@ func (m *VStreamTablesRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9210,7 +9767,7 @@ func (m *VStreamTablesRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9223,11 +9780,11 @@ func (m *VStreamTablesRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9246,7 +9803,7 @@ func (m *VStreamTablesRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9259,11 +9816,11 @@ func (m *VStreamTablesRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9275,14 +9832,50 @@ func (m *VStreamTablesRequest) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Options == nil { + m.Options = &VStreamOptions{} + } + if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9305,7 +9898,7 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9333,7 +9926,7 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9347,11 +9940,11 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9365,7 +9958,7 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9378,11 +9971,11 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9406,7 +9999,7 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9419,11 +10012,11 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9447,7 +10040,7 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9461,11 +10054,11 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9479,7 +10072,7 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9492,11 +10085,11 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9520,7 +10113,7 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9533,11 +10126,11 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9551,12 +10144,12 @@ func (m *VStreamTablesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9579,7 +10172,7 @@ func (m *LastPKEvent) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9607,7 +10200,7 @@ func (m *LastPKEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9620,11 +10213,11 @@ func (m *LastPKEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9643,7 +10236,7 @@ func (m *LastPKEvent) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9658,12 +10251,12 @@ func (m *LastPKEvent) UnmarshalVT(dAtA []byte) error { m.Completed = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9686,7 +10279,7 @@ func (m *TableLastPK) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9714,7 +10307,7 @@ func (m *TableLastPK) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9728,11 +10321,11 @@ func (m *TableLastPK) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9746,7 +10339,7 @@ func (m *TableLastPK) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9759,11 +10352,11 @@ func (m *TableLastPK) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9777,12 +10370,12 @@ func (m *TableLastPK) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9805,7 +10398,7 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9833,7 +10426,7 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9846,11 +10439,11 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9869,7 +10462,7 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9882,11 +10475,11 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9905,7 +10498,7 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9918,11 +10511,11 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9941,7 +10534,7 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9955,11 +10548,11 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9968,12 +10561,12 @@ func (m *VStreamResultsRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9996,7 +10589,7 @@ func (m *VStreamResultsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10024,7 +10617,7 @@ func (m *VStreamResultsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10037,11 +10630,11 @@ func (m *VStreamResultsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10058,7 +10651,7 @@ func (m *VStreamResultsResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10072,11 +10665,11 @@ func (m *VStreamResultsResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10090,7 +10683,7 @@ func (m *VStreamResultsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10103,11 +10696,11 @@ func (m *VStreamResultsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10119,12 +10712,12 @@ func (m *VStreamResultsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -10139,88 +10732,3 @@ func (m *VStreamResultsResponse) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/logutil/logutil_vtproto.pb.go b/go/vt/proto/logutil/logutil_vtproto.pb.go index 1d3ccb74271..aeca94981f9 100644 --- a/go/vt/proto/logutil/logutil_vtproto.pb.go +++ b/go/vt/proto/logutil/logutil_vtproto.pb.go @@ -1,15 +1,15 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: logutil.proto package logutil import ( fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" - bits "math/bits" vttime "vitess.io/vitess/go/vt/proto/vttime" ) @@ -24,13 +24,12 @@ func (m *Event) CloneVT() *Event { if m == nil { return (*Event)(nil) } - r := &Event{ - Time: m.Time.CloneVT(), - Level: m.Level, - File: m.File, - Line: m.Line, - Value: m.Value, - } + r := new(Event) + r.Time = m.Time.CloneVT() + r.Level = m.Level + r.File = m.File + r.Line = m.Line + r.Value = m.Value if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -75,24 +74,24 @@ func (m *Event) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Value) > 0 { i -= len(m.Value) copy(dAtA[i:], m.Value) - i = encodeVarint(dAtA, i, uint64(len(m.Value))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Value))) i-- dAtA[i] = 0x2a } if m.Line != 0 { - i = encodeVarint(dAtA, i, uint64(m.Line)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Line)) i-- dAtA[i] = 0x20 } if len(m.File) > 0 { i -= len(m.File) copy(dAtA[i:], m.File) - i = encodeVarint(dAtA, i, uint64(len(m.File))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.File))) i-- dAtA[i] = 0x1a } if m.Level != 0 { - i = encodeVarint(dAtA, i, uint64(m.Level)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Level)) i-- dAtA[i] = 0x10 } @@ -102,24 +101,13 @@ func (m *Event) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *Event) SizeVT() (n int) { if m == nil { return 0 @@ -128,32 +116,26 @@ func (m *Event) SizeVT() (n int) { _ = l if m.Time != nil { l = m.Time.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Level != 0 { - n += 1 + sov(uint64(m.Level)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Level)) } l = len(m.File) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Line != 0 { - n += 1 + sov(uint64(m.Line)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Line)) } l = len(m.Value) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *Event) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -162,7 +144,7 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -190,7 +172,7 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -203,11 +185,11 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -226,7 +208,7 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { m.Level = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -245,7 +227,7 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -259,11 +241,11 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -277,7 +259,7 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { m.Line = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -296,7 +278,7 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -310,11 +292,11 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -323,12 +305,12 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -343,88 +325,3 @@ func (m *Event) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/mysqlctl/mysqlctl.pb.go b/go/vt/proto/mysqlctl/mysqlctl.pb.go index 35ddd2a640a..eaceeabad3e 100644 --- a/go/vt/proto/mysqlctl/mysqlctl.pb.go +++ b/go/vt/proto/mysqlctl/mysqlctl.pb.go @@ -30,6 +30,7 @@ import ( reflect "reflect" sync "sync" topodata "vitess.io/vitess/go/vt/proto/topodata" + vtrpc "vitess.io/vitess/go/vt/proto/vtrpc" vttime "vitess.io/vitess/go/vt/proto/vttime" ) @@ -97,7 +98,7 @@ func (x BackupInfo_Status) Number() protoreflect.EnumNumber { // Deprecated: Use BackupInfo_Status.Descriptor instead. func (BackupInfo_Status) EnumDescriptor() ([]byte, []int) { - return file_mysqlctl_proto_rawDescGZIP(), []int{16, 0} + return file_mysqlctl_proto_rawDescGZIP(), []int{18, 0} } type StartRequest struct { @@ -814,6 +815,93 @@ func (x *VersionStringResponse) GetVersion() string { return "" } +type HostMetricsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *HostMetricsRequest) Reset() { + *x = HostMetricsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mysqlctl_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HostMetricsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HostMetricsRequest) ProtoMessage() {} + +func (x *HostMetricsRequest) ProtoReflect() protoreflect.Message { + mi := &file_mysqlctl_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HostMetricsRequest.ProtoReflect.Descriptor instead. +func (*HostMetricsRequest) Descriptor() ([]byte, []int) { + return file_mysqlctl_proto_rawDescGZIP(), []int{16} +} + +type HostMetricsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Metrics is a map (metric name -> metric value/error) so that the client has as much + // information as possible about all the checked metrics. + Metrics map[string]*HostMetricsResponse_Metric `protobuf:"bytes,1,rep,name=metrics,proto3" json:"metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *HostMetricsResponse) Reset() { + *x = HostMetricsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_mysqlctl_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HostMetricsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HostMetricsResponse) ProtoMessage() {} + +func (x *HostMetricsResponse) ProtoReflect() protoreflect.Message { + mi := &file_mysqlctl_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HostMetricsResponse.ProtoReflect.Descriptor instead. +func (*HostMetricsResponse) Descriptor() ([]byte, []int) { + return file_mysqlctl_proto_rawDescGZIP(), []int{17} +} + +func (x *HostMetricsResponse) GetMetrics() map[string]*HostMetricsResponse_Metric { + if x != nil { + return x.Metrics + } + return nil +} + // BackupInfo is the read-only attributes of a mysqlctl/backupstorage.BackupHandle. type BackupInfo struct { state protoimpl.MessageState @@ -835,7 +923,7 @@ type BackupInfo struct { func (x *BackupInfo) Reset() { *x = BackupInfo{} if protoimpl.UnsafeEnabled { - mi := &file_mysqlctl_proto_msgTypes[16] + mi := &file_mysqlctl_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -848,7 +936,7 @@ func (x *BackupInfo) String() string { func (*BackupInfo) ProtoMessage() {} func (x *BackupInfo) ProtoReflect() protoreflect.Message { - mi := &file_mysqlctl_proto_msgTypes[16] + mi := &file_mysqlctl_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -861,7 +949,7 @@ func (x *BackupInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BackupInfo.ProtoReflect.Descriptor instead. func (*BackupInfo) Descriptor() ([]byte, []int) { - return file_mysqlctl_proto_rawDescGZIP(), []int{16} + return file_mysqlctl_proto_rawDescGZIP(), []int{18} } func (x *BackupInfo) GetName() string { @@ -920,144 +1008,235 @@ func (x *BackupInfo) GetStatus() BackupInfo_Status { return BackupInfo_UNKNOWN } +type HostMetricsResponse_Metric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name of the metric + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Value is the metric value + Value float64 `protobuf:"fixed64,2,opt,name=value,proto3" json:"value,omitempty"` + // Error indicates an error retrieving the value + Error *vtrpc.RPCError `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *HostMetricsResponse_Metric) Reset() { + *x = HostMetricsResponse_Metric{} + if protoimpl.UnsafeEnabled { + mi := &file_mysqlctl_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HostMetricsResponse_Metric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HostMetricsResponse_Metric) ProtoMessage() {} + +func (x *HostMetricsResponse_Metric) ProtoReflect() protoreflect.Message { + mi := &file_mysqlctl_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HostMetricsResponse_Metric.ProtoReflect.Descriptor instead. +func (*HostMetricsResponse_Metric) Descriptor() ([]byte, []int) { + return file_mysqlctl_proto_rawDescGZIP(), []int{17, 0} +} + +func (x *HostMetricsResponse_Metric) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *HostMetricsResponse_Metric) GetValue() float64 { + if x != nil { + return x.Value + } + return 0 +} + +func (x *HostMetricsResponse_Metric) GetError() *vtrpc.RPCError { + if x != nil { + return x.Error + } + return nil +} + var File_mysqlctl_proto protoreflect.FileDescriptor var file_mysqlctl_proto_rawDesc = []byte{ 0x0a, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x1a, 0x0e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x76, 0x74, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2f, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x0f, 0x53, - 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, - 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, - 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x12, 0x46, 0x0a, 0x16, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, - 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x12, - 0x0a, 0x10, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x55, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x19, 0x0a, 0x17, + 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0b, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2f, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, + 0x61, 0x72, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x77, + 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x4d, 0x79, 0x73, + 0x71, 0x6c, 0x64, 0x12, 0x46, 0x0a, 0x16, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x68, 0x75, + 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x68, 0x75, 0x74, + 0x64, 0x6f, 0x77, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x12, 0x0a, 0x10, 0x53, + 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x75, 0x6e, + 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x42, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x28, 0x0a, 0x10, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, + 0x67, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x62, 0x69, 0x6e, + 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x62, 0x69, 0x6e, 0x6c, + 0x6f, 0x67, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x44, 0x0a, 0x17, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x52, 0x15, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, + 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x41, 0x70, 0x70, 0x6c, 0x79, + 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4e, 0x0a, 0x20, 0x52, 0x65, 0x61, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x22, 0xf9, 0x01, 0x0a, 0x21, 0x52, 0x65, 0x61, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, + 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, + 0x0e, 0x66, 0x69, 0x72, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x34, 0x0a, 0x16, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x14, 0x66, 0x69, 0x72, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, + 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x12, 0x33, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x73, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x32, 0x0a, 0x15, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x62, 0x69, 0x6e, + 0x6c, 0x6f, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x22, 0x15, + 0x0a, 0x13, 0x52, 0x65, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x69, 0x6e, 0x69, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x0a, + 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, + 0x0a, 0x14, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x31, 0x0a, 0x15, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x14, 0x0a, 0x12, 0x48, 0x6f, 0x73, + 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x98, 0x02, 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, + 0x63, 0x74, 0x6c, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x1a, 0x59, 0x0a, + 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x60, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe6, 0x02, 0x0a, 0x0a, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1b, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, + 0x0a, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0c, 0x0a, + 0x08, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x10, 0x04, 0x32, 0xfe, 0x05, 0x0a, 0x08, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x43, 0x74, 0x6c, + 0x12, 0x3a, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x08, + 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x19, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, + 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x53, + 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x69, - 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x17, - 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x17, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x52, 0x15, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x41, 0x70, - 0x70, 0x6c, 0x79, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x0a, 0x20, 0x52, 0x65, 0x61, 0x64, 0x42, 0x69, 0x6e, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, + 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x20, + 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x42, + 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x76, 0x0a, 0x19, 0x52, 0x65, 0x61, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x69, 0x6e, - 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xf9, 0x01, 0x0a, 0x21, 0x52, 0x65, 0x61, 0x64, 0x42, 0x69, + 0x70, 0x73, 0x12, 0x2a, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, + 0x61, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0f, 0x66, - 0x69, 0x72, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x52, 0x0e, 0x66, 0x69, 0x72, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x16, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x14, 0x66, 0x69, 0x72, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x12, 0x33, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, - 0x6c, 0x61, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x32, 0x0a, - 0x15, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, - 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, 0x61, - 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x69, 0x6e, 0x6c, 0x6f, - 0x67, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x69, 0x6e, - 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x16, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x31, 0x0a, 0x15, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe6, 0x02, 0x0a, - 0x0a, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, - 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x10, 0x04, 0x32, 0xb0, 0x05, 0x0a, 0x08, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x43, - 0x74, 0x6c, 0x12, 0x3a, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, - 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x19, 0x2e, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, - 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x55, - 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, - 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x75, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x55, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, - 0x0f, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, - 0x12, 0x20, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x41, 0x70, - 0x70, 0x6c, 0x79, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x76, 0x0a, 0x19, 0x52, 0x65, 0x61, 0x64, 0x42, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x73, 0x12, 0x2a, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, - 0x52, 0x65, 0x61, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x61, 0x64, - 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4f, 0x0a, 0x0c, 0x52, 0x65, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x1d, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x69, 0x6e, 0x69, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x69, 0x6e, 0x69, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x52, 0x0a, 0x0d, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x1e, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, - 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, - 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x27, 0x5a, 0x25, 0x76, 0x69, 0x74, 0x65, - 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, - 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, - 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, + 0x0c, 0x52, 0x65, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x2e, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x69, 0x6e, 0x69, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, + 0x0a, 0x0d, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x1e, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, + 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x27, 0x5a, 0x25, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, + 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1073,7 +1252,7 @@ func file_mysqlctl_proto_rawDescGZIP() []byte { } var file_mysqlctl_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_mysqlctl_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_mysqlctl_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_mysqlctl_proto_goTypes = []any{ (BackupInfo_Status)(0), // 0: mysqlctl.BackupInfo.Status (*StartRequest)(nil), // 1: mysqlctl.StartRequest @@ -1092,40 +1271,50 @@ var file_mysqlctl_proto_goTypes = []any{ (*RefreshConfigResponse)(nil), // 14: mysqlctl.RefreshConfigResponse (*VersionStringRequest)(nil), // 15: mysqlctl.VersionStringRequest (*VersionStringResponse)(nil), // 16: mysqlctl.VersionStringResponse - (*BackupInfo)(nil), // 17: mysqlctl.BackupInfo - (*vttime.Duration)(nil), // 18: vttime.Duration - (*vttime.Time)(nil), // 19: vttime.Time - (*topodata.TabletAlias)(nil), // 20: topodata.TabletAlias + (*HostMetricsRequest)(nil), // 17: mysqlctl.HostMetricsRequest + (*HostMetricsResponse)(nil), // 18: mysqlctl.HostMetricsResponse + (*BackupInfo)(nil), // 19: mysqlctl.BackupInfo + (*HostMetricsResponse_Metric)(nil), // 20: mysqlctl.HostMetricsResponse.Metric + nil, // 21: mysqlctl.HostMetricsResponse.MetricsEntry + (*vttime.Duration)(nil), // 22: vttime.Duration + (*vttime.Time)(nil), // 23: vttime.Time + (*topodata.TabletAlias)(nil), // 24: topodata.TabletAlias + (*vtrpc.RPCError)(nil), // 25: vtrpc.RPCError } var file_mysqlctl_proto_depIdxs = []int32{ - 18, // 0: mysqlctl.ShutdownRequest.mysql_shutdown_timeout:type_name -> vttime.Duration - 19, // 1: mysqlctl.ApplyBinlogFileRequest.binlog_restore_datetime:type_name -> vttime.Time - 19, // 2: mysqlctl.ReadBinlogFilesTimestampsResponse.first_timestamp:type_name -> vttime.Time - 19, // 3: mysqlctl.ReadBinlogFilesTimestampsResponse.last_timestamp:type_name -> vttime.Time - 20, // 4: mysqlctl.BackupInfo.tablet_alias:type_name -> topodata.TabletAlias - 19, // 5: mysqlctl.BackupInfo.time:type_name -> vttime.Time - 0, // 6: mysqlctl.BackupInfo.status:type_name -> mysqlctl.BackupInfo.Status - 1, // 7: mysqlctl.MysqlCtl.Start:input_type -> mysqlctl.StartRequest - 3, // 8: mysqlctl.MysqlCtl.Shutdown:input_type -> mysqlctl.ShutdownRequest - 5, // 9: mysqlctl.MysqlCtl.RunMysqlUpgrade:input_type -> mysqlctl.RunMysqlUpgradeRequest - 7, // 10: mysqlctl.MysqlCtl.ApplyBinlogFile:input_type -> mysqlctl.ApplyBinlogFileRequest - 9, // 11: mysqlctl.MysqlCtl.ReadBinlogFilesTimestamps:input_type -> mysqlctl.ReadBinlogFilesTimestampsRequest - 11, // 12: mysqlctl.MysqlCtl.ReinitConfig:input_type -> mysqlctl.ReinitConfigRequest - 13, // 13: mysqlctl.MysqlCtl.RefreshConfig:input_type -> mysqlctl.RefreshConfigRequest - 15, // 14: mysqlctl.MysqlCtl.VersionString:input_type -> mysqlctl.VersionStringRequest - 2, // 15: mysqlctl.MysqlCtl.Start:output_type -> mysqlctl.StartResponse - 4, // 16: mysqlctl.MysqlCtl.Shutdown:output_type -> mysqlctl.ShutdownResponse - 6, // 17: mysqlctl.MysqlCtl.RunMysqlUpgrade:output_type -> mysqlctl.RunMysqlUpgradeResponse - 8, // 18: mysqlctl.MysqlCtl.ApplyBinlogFile:output_type -> mysqlctl.ApplyBinlogFileResponse - 10, // 19: mysqlctl.MysqlCtl.ReadBinlogFilesTimestamps:output_type -> mysqlctl.ReadBinlogFilesTimestampsResponse - 12, // 20: mysqlctl.MysqlCtl.ReinitConfig:output_type -> mysqlctl.ReinitConfigResponse - 14, // 21: mysqlctl.MysqlCtl.RefreshConfig:output_type -> mysqlctl.RefreshConfigResponse - 16, // 22: mysqlctl.MysqlCtl.VersionString:output_type -> mysqlctl.VersionStringResponse - 15, // [15:23] is the sub-list for method output_type - 7, // [7:15] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 22, // 0: mysqlctl.ShutdownRequest.mysql_shutdown_timeout:type_name -> vttime.Duration + 23, // 1: mysqlctl.ApplyBinlogFileRequest.binlog_restore_datetime:type_name -> vttime.Time + 23, // 2: mysqlctl.ReadBinlogFilesTimestampsResponse.first_timestamp:type_name -> vttime.Time + 23, // 3: mysqlctl.ReadBinlogFilesTimestampsResponse.last_timestamp:type_name -> vttime.Time + 21, // 4: mysqlctl.HostMetricsResponse.metrics:type_name -> mysqlctl.HostMetricsResponse.MetricsEntry + 24, // 5: mysqlctl.BackupInfo.tablet_alias:type_name -> topodata.TabletAlias + 23, // 6: mysqlctl.BackupInfo.time:type_name -> vttime.Time + 0, // 7: mysqlctl.BackupInfo.status:type_name -> mysqlctl.BackupInfo.Status + 25, // 8: mysqlctl.HostMetricsResponse.Metric.error:type_name -> vtrpc.RPCError + 20, // 9: mysqlctl.HostMetricsResponse.MetricsEntry.value:type_name -> mysqlctl.HostMetricsResponse.Metric + 1, // 10: mysqlctl.MysqlCtl.Start:input_type -> mysqlctl.StartRequest + 3, // 11: mysqlctl.MysqlCtl.Shutdown:input_type -> mysqlctl.ShutdownRequest + 5, // 12: mysqlctl.MysqlCtl.RunMysqlUpgrade:input_type -> mysqlctl.RunMysqlUpgradeRequest + 7, // 13: mysqlctl.MysqlCtl.ApplyBinlogFile:input_type -> mysqlctl.ApplyBinlogFileRequest + 9, // 14: mysqlctl.MysqlCtl.ReadBinlogFilesTimestamps:input_type -> mysqlctl.ReadBinlogFilesTimestampsRequest + 11, // 15: mysqlctl.MysqlCtl.ReinitConfig:input_type -> mysqlctl.ReinitConfigRequest + 13, // 16: mysqlctl.MysqlCtl.RefreshConfig:input_type -> mysqlctl.RefreshConfigRequest + 15, // 17: mysqlctl.MysqlCtl.VersionString:input_type -> mysqlctl.VersionStringRequest + 17, // 18: mysqlctl.MysqlCtl.HostMetrics:input_type -> mysqlctl.HostMetricsRequest + 2, // 19: mysqlctl.MysqlCtl.Start:output_type -> mysqlctl.StartResponse + 4, // 20: mysqlctl.MysqlCtl.Shutdown:output_type -> mysqlctl.ShutdownResponse + 6, // 21: mysqlctl.MysqlCtl.RunMysqlUpgrade:output_type -> mysqlctl.RunMysqlUpgradeResponse + 8, // 22: mysqlctl.MysqlCtl.ApplyBinlogFile:output_type -> mysqlctl.ApplyBinlogFileResponse + 10, // 23: mysqlctl.MysqlCtl.ReadBinlogFilesTimestamps:output_type -> mysqlctl.ReadBinlogFilesTimestampsResponse + 12, // 24: mysqlctl.MysqlCtl.ReinitConfig:output_type -> mysqlctl.ReinitConfigResponse + 14, // 25: mysqlctl.MysqlCtl.RefreshConfig:output_type -> mysqlctl.RefreshConfigResponse + 16, // 26: mysqlctl.MysqlCtl.VersionString:output_type -> mysqlctl.VersionStringResponse + 18, // 27: mysqlctl.MysqlCtl.HostMetrics:output_type -> mysqlctl.HostMetricsResponse + 19, // [19:28] is the sub-list for method output_type + 10, // [10:19] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_mysqlctl_proto_init() } @@ -1327,6 +1516,30 @@ func file_mysqlctl_proto_init() { } } file_mysqlctl_proto_msgTypes[16].Exporter = func(v any, i int) any { + switch v := v.(*HostMetricsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mysqlctl_proto_msgTypes[17].Exporter = func(v any, i int) any { + switch v := v.(*HostMetricsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mysqlctl_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*BackupInfo); i { case 0: return &v.state @@ -1338,6 +1551,18 @@ func file_mysqlctl_proto_init() { return nil } } + file_mysqlctl_proto_msgTypes[19].Exporter = func(v any, i int) any { + switch v := v.(*HostMetricsResponse_Metric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1345,7 +1570,7 @@ func file_mysqlctl_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mysqlctl_proto_rawDesc, NumEnums: 1, - NumMessages: 17, + NumMessages: 21, NumExtensions: 0, NumServices: 1, }, diff --git a/go/vt/proto/mysqlctl/mysqlctl_grpc.pb.go b/go/vt/proto/mysqlctl/mysqlctl_grpc.pb.go index 6d0fd1a28e8..06d58f62169 100644 --- a/go/vt/proto/mysqlctl/mysqlctl_grpc.pb.go +++ b/go/vt/proto/mysqlctl/mysqlctl_grpc.pb.go @@ -30,6 +30,7 @@ type MysqlCtlClient interface { ReinitConfig(ctx context.Context, in *ReinitConfigRequest, opts ...grpc.CallOption) (*ReinitConfigResponse, error) RefreshConfig(ctx context.Context, in *RefreshConfigRequest, opts ...grpc.CallOption) (*RefreshConfigResponse, error) VersionString(ctx context.Context, in *VersionStringRequest, opts ...grpc.CallOption) (*VersionStringResponse, error) + HostMetrics(ctx context.Context, in *HostMetricsRequest, opts ...grpc.CallOption) (*HostMetricsResponse, error) } type mysqlCtlClient struct { @@ -112,6 +113,15 @@ func (c *mysqlCtlClient) VersionString(ctx context.Context, in *VersionStringReq return out, nil } +func (c *mysqlCtlClient) HostMetrics(ctx context.Context, in *HostMetricsRequest, opts ...grpc.CallOption) (*HostMetricsResponse, error) { + out := new(HostMetricsResponse) + err := c.cc.Invoke(ctx, "/mysqlctl.MysqlCtl/HostMetrics", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MysqlCtlServer is the server API for MysqlCtl service. // All implementations must embed UnimplementedMysqlCtlServer // for forward compatibility @@ -124,6 +134,7 @@ type MysqlCtlServer interface { ReinitConfig(context.Context, *ReinitConfigRequest) (*ReinitConfigResponse, error) RefreshConfig(context.Context, *RefreshConfigRequest) (*RefreshConfigResponse, error) VersionString(context.Context, *VersionStringRequest) (*VersionStringResponse, error) + HostMetrics(context.Context, *HostMetricsRequest) (*HostMetricsResponse, error) mustEmbedUnimplementedMysqlCtlServer() } @@ -155,6 +166,9 @@ func (UnimplementedMysqlCtlServer) RefreshConfig(context.Context, *RefreshConfig func (UnimplementedMysqlCtlServer) VersionString(context.Context, *VersionStringRequest) (*VersionStringResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VersionString not implemented") } +func (UnimplementedMysqlCtlServer) HostMetrics(context.Context, *HostMetricsRequest) (*HostMetricsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method HostMetrics not implemented") +} func (UnimplementedMysqlCtlServer) mustEmbedUnimplementedMysqlCtlServer() {} // UnsafeMysqlCtlServer may be embedded to opt out of forward compatibility for this service. @@ -312,6 +326,24 @@ func _MysqlCtl_VersionString_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _MysqlCtl_HostMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HostMetricsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MysqlCtlServer).HostMetrics(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/mysqlctl.MysqlCtl/HostMetrics", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MysqlCtlServer).HostMetrics(ctx, req.(*HostMetricsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // MysqlCtl_ServiceDesc is the grpc.ServiceDesc for MysqlCtl service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -351,6 +383,10 @@ var MysqlCtl_ServiceDesc = grpc.ServiceDesc{ MethodName: "VersionString", Handler: _MysqlCtl_VersionString_Handler, }, + { + MethodName: "HostMetrics", + Handler: _MysqlCtl_HostMetrics_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "mysqlctl.proto", diff --git a/go/vt/proto/mysqlctl/mysqlctl_vtproto.pb.go b/go/vt/proto/mysqlctl/mysqlctl_vtproto.pb.go index fab1af2f471..656ace2bf36 100644 --- a/go/vt/proto/mysqlctl/mysqlctl_vtproto.pb.go +++ b/go/vt/proto/mysqlctl/mysqlctl_vtproto.pb.go @@ -1,16 +1,19 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: mysqlctl.proto package mysqlctl import ( + binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" - bits "math/bits" + math "math" topodata "vitess.io/vitess/go/vt/proto/topodata" + vtrpc "vitess.io/vitess/go/vt/proto/vtrpc" vttime "vitess.io/vitess/go/vt/proto/vttime" ) @@ -25,7 +28,7 @@ func (m *StartRequest) CloneVT() *StartRequest { if m == nil { return (*StartRequest)(nil) } - r := &StartRequest{} + r := new(StartRequest) if rhs := m.MysqldArgs; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -46,7 +49,7 @@ func (m *StartResponse) CloneVT() *StartResponse { if m == nil { return (*StartResponse)(nil) } - r := &StartResponse{} + r := new(StartResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -62,10 +65,9 @@ func (m *ShutdownRequest) CloneVT() *ShutdownRequest { if m == nil { return (*ShutdownRequest)(nil) } - r := &ShutdownRequest{ - WaitForMysqld: m.WaitForMysqld, - MysqlShutdownTimeout: m.MysqlShutdownTimeout.CloneVT(), - } + r := new(ShutdownRequest) + r.WaitForMysqld = m.WaitForMysqld + r.MysqlShutdownTimeout = m.MysqlShutdownTimeout.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -81,7 +83,7 @@ func (m *ShutdownResponse) CloneVT() *ShutdownResponse { if m == nil { return (*ShutdownResponse)(nil) } - r := &ShutdownResponse{} + r := new(ShutdownResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -97,7 +99,7 @@ func (m *RunMysqlUpgradeRequest) CloneVT() *RunMysqlUpgradeRequest { if m == nil { return (*RunMysqlUpgradeRequest)(nil) } - r := &RunMysqlUpgradeRequest{} + r := new(RunMysqlUpgradeRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -113,7 +115,7 @@ func (m *RunMysqlUpgradeResponse) CloneVT() *RunMysqlUpgradeResponse { if m == nil { return (*RunMysqlUpgradeResponse)(nil) } - r := &RunMysqlUpgradeResponse{} + r := new(RunMysqlUpgradeResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -129,11 +131,10 @@ func (m *ApplyBinlogFileRequest) CloneVT() *ApplyBinlogFileRequest { if m == nil { return (*ApplyBinlogFileRequest)(nil) } - r := &ApplyBinlogFileRequest{ - BinlogFileName: m.BinlogFileName, - BinlogRestorePosition: m.BinlogRestorePosition, - BinlogRestoreDatetime: m.BinlogRestoreDatetime.CloneVT(), - } + r := new(ApplyBinlogFileRequest) + r.BinlogFileName = m.BinlogFileName + r.BinlogRestorePosition = m.BinlogRestorePosition + r.BinlogRestoreDatetime = m.BinlogRestoreDatetime.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -149,7 +150,7 @@ func (m *ApplyBinlogFileResponse) CloneVT() *ApplyBinlogFileResponse { if m == nil { return (*ApplyBinlogFileResponse)(nil) } - r := &ApplyBinlogFileResponse{} + r := new(ApplyBinlogFileResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -165,7 +166,7 @@ func (m *ReadBinlogFilesTimestampsRequest) CloneVT() *ReadBinlogFilesTimestampsR if m == nil { return (*ReadBinlogFilesTimestampsRequest)(nil) } - r := &ReadBinlogFilesTimestampsRequest{} + r := new(ReadBinlogFilesTimestampsRequest) if rhs := m.BinlogFileNames; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -186,12 +187,11 @@ func (m *ReadBinlogFilesTimestampsResponse) CloneVT() *ReadBinlogFilesTimestamps if m == nil { return (*ReadBinlogFilesTimestampsResponse)(nil) } - r := &ReadBinlogFilesTimestampsResponse{ - FirstTimestamp: m.FirstTimestamp.CloneVT(), - FirstTimestampBinlog: m.FirstTimestampBinlog, - LastTimestamp: m.LastTimestamp.CloneVT(), - LastTimestampBinlog: m.LastTimestampBinlog, - } + r := new(ReadBinlogFilesTimestampsResponse) + r.FirstTimestamp = m.FirstTimestamp.CloneVT() + r.FirstTimestampBinlog = m.FirstTimestampBinlog + r.LastTimestamp = m.LastTimestamp.CloneVT() + r.LastTimestampBinlog = m.LastTimestampBinlog if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -207,7 +207,7 @@ func (m *ReinitConfigRequest) CloneVT() *ReinitConfigRequest { if m == nil { return (*ReinitConfigRequest)(nil) } - r := &ReinitConfigRequest{} + r := new(ReinitConfigRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -223,7 +223,7 @@ func (m *ReinitConfigResponse) CloneVT() *ReinitConfigResponse { if m == nil { return (*ReinitConfigResponse)(nil) } - r := &ReinitConfigResponse{} + r := new(ReinitConfigResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -239,7 +239,7 @@ func (m *RefreshConfigRequest) CloneVT() *RefreshConfigRequest { if m == nil { return (*RefreshConfigRequest)(nil) } - r := &RefreshConfigRequest{} + r := new(RefreshConfigRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -255,7 +255,7 @@ func (m *RefreshConfigResponse) CloneVT() *RefreshConfigResponse { if m == nil { return (*RefreshConfigResponse)(nil) } - r := &RefreshConfigResponse{} + r := new(RefreshConfigResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -271,7 +271,7 @@ func (m *VersionStringRequest) CloneVT() *VersionStringRequest { if m == nil { return (*VersionStringRequest)(nil) } - r := &VersionStringRequest{} + r := new(VersionStringRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -287,9 +287,8 @@ func (m *VersionStringResponse) CloneVT() *VersionStringResponse { if m == nil { return (*VersionStringResponse)(nil) } - r := &VersionStringResponse{ - Version: m.Version, - } + r := new(VersionStringResponse) + r.Version = m.Version if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -301,20 +300,77 @@ func (m *VersionStringResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *HostMetricsRequest) CloneVT() *HostMetricsRequest { + if m == nil { + return (*HostMetricsRequest)(nil) + } + r := new(HostMetricsRequest) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *HostMetricsRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *HostMetricsResponse_Metric) CloneVT() *HostMetricsResponse_Metric { + if m == nil { + return (*HostMetricsResponse_Metric)(nil) + } + r := new(HostMetricsResponse_Metric) + r.Name = m.Name + r.Value = m.Value + r.Error = m.Error.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *HostMetricsResponse_Metric) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *HostMetricsResponse) CloneVT() *HostMetricsResponse { + if m == nil { + return (*HostMetricsResponse)(nil) + } + r := new(HostMetricsResponse) + if rhs := m.Metrics; rhs != nil { + tmpContainer := make(map[string]*HostMetricsResponse_Metric, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Metrics = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *HostMetricsResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *BackupInfo) CloneVT() *BackupInfo { if m == nil { return (*BackupInfo)(nil) } - r := &BackupInfo{ - Name: m.Name, - Directory: m.Directory, - Keyspace: m.Keyspace, - Shard: m.Shard, - TabletAlias: m.TabletAlias.CloneVT(), - Time: m.Time.CloneVT(), - Engine: m.Engine, - Status: m.Status, - } + r := new(BackupInfo) + r.Name = m.Name + r.Directory = m.Directory + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.TabletAlias = m.TabletAlias.CloneVT() + r.Time = m.Time.CloneVT() + r.Engine = m.Engine + r.Status = m.Status if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -360,7 +416,7 @@ func (m *StartRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.MysqldArgs) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.MysqldArgs[iNdEx]) copy(dAtA[i:], m.MysqldArgs[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.MysqldArgs[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MysqldArgs[iNdEx]))) i-- dAtA[i] = 0xa } @@ -437,7 +493,7 @@ func (m *ShutdownRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -589,21 +645,21 @@ func (m *ApplyBinlogFileRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.BinlogRestorePosition) > 0 { i -= len(m.BinlogRestorePosition) copy(dAtA[i:], m.BinlogRestorePosition) - i = encodeVarint(dAtA, i, uint64(len(m.BinlogRestorePosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BinlogRestorePosition))) i-- dAtA[i] = 0x12 } if len(m.BinlogFileName) > 0 { i -= len(m.BinlogFileName) copy(dAtA[i:], m.BinlogFileName) - i = encodeVarint(dAtA, i, uint64(len(m.BinlogFileName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BinlogFileName))) i-- dAtA[i] = 0xa } @@ -677,7 +733,7 @@ func (m *ReadBinlogFilesTimestampsRequest) MarshalToSizedBufferVT(dAtA []byte) ( for iNdEx := len(m.BinlogFileNames) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.BinlogFileNames[iNdEx]) copy(dAtA[i:], m.BinlogFileNames[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.BinlogFileNames[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BinlogFileNames[iNdEx]))) i-- dAtA[i] = 0xa } @@ -718,7 +774,7 @@ func (m *ReadBinlogFilesTimestampsResponse) MarshalToSizedBufferVT(dAtA []byte) if len(m.LastTimestampBinlog) > 0 { i -= len(m.LastTimestampBinlog) copy(dAtA[i:], m.LastTimestampBinlog) - i = encodeVarint(dAtA, i, uint64(len(m.LastTimestampBinlog))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastTimestampBinlog))) i-- dAtA[i] = 0x22 } @@ -728,14 +784,14 @@ func (m *ReadBinlogFilesTimestampsResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.FirstTimestampBinlog) > 0 { i -= len(m.FirstTimestampBinlog) copy(dAtA[i:], m.FirstTimestampBinlog) - i = encodeVarint(dAtA, i, uint64(len(m.FirstTimestampBinlog))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FirstTimestampBinlog))) i-- dAtA[i] = 0x12 } @@ -745,7 +801,7 @@ func (m *ReadBinlogFilesTimestampsResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -950,13 +1006,157 @@ func (m *VersionStringResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Version) > 0 { i -= len(m.Version) copy(dAtA[i:], m.Version) - i = encodeVarint(dAtA, i, uint64(len(m.Version))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Version))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } +func (m *HostMetricsRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HostMetricsRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *HostMetricsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + +func (m *HostMetricsResponse_Metric) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HostMetricsResponse_Metric) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *HostMetricsResponse_Metric) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Error != nil { + size, err := m.Error.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if m.Value != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + i-- + dAtA[i] = 0x11 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *HostMetricsResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HostMetricsResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *HostMetricsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Metrics) > 0 { + for k := range m.Metrics { + v := m.Metrics[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *BackupInfo) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -988,14 +1188,14 @@ func (m *BackupInfo) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Status != 0 { - i = encodeVarint(dAtA, i, uint64(m.Status)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Status)) i-- dAtA[i] = 0x40 } if len(m.Engine) > 0 { i -= len(m.Engine) copy(dAtA[i:], m.Engine) - i = encodeVarint(dAtA, i, uint64(len(m.Engine))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Engine))) i-- dAtA[i] = 0x3a } @@ -1005,7 +1205,7 @@ func (m *BackupInfo) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -1015,52 +1215,41 @@ func (m *BackupInfo) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x22 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x1a } if len(m.Directory) > 0 { i -= len(m.Directory) copy(dAtA[i:], m.Directory) - i = encodeVarint(dAtA, i, uint64(len(m.Directory))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Directory))) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *StartRequest) SizeVT() (n int) { if m == nil { return 0 @@ -1070,7 +1259,7 @@ func (m *StartRequest) SizeVT() (n int) { if len(m.MysqldArgs) > 0 { for _, s := range m.MysqldArgs { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1098,7 +1287,7 @@ func (m *ShutdownRequest) SizeVT() (n int) { } if m.MysqlShutdownTimeout != nil { l = m.MysqlShutdownTimeout.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1142,15 +1331,15 @@ func (m *ApplyBinlogFileRequest) SizeVT() (n int) { _ = l l = len(m.BinlogFileName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.BinlogRestorePosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.BinlogRestoreDatetime != nil { l = m.BinlogRestoreDatetime.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1175,7 +1364,7 @@ func (m *ReadBinlogFilesTimestampsRequest) SizeVT() (n int) { if len(m.BinlogFileNames) > 0 { for _, s := range m.BinlogFileNames { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1190,19 +1379,19 @@ func (m *ReadBinlogFilesTimestampsResponse) SizeVT() (n int) { _ = l if m.FirstTimestamp != nil { l = m.FirstTimestamp.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.FirstTimestampBinlog) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.LastTimestamp != nil { l = m.LastTimestamp.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.LastTimestampBinlog) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1266,7 +1455,61 @@ func (m *VersionStringResponse) SizeVT() (n int) { _ = l l = len(m.Version) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *HostMetricsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *HostMetricsResponse_Metric) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Value != 0 { + n += 9 + } + if m.Error != nil { + l = m.Error.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *HostMetricsResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Metrics) > 0 { + for k, v := range m.Metrics { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } } n += len(m.unknownFields) return n @@ -1280,45 +1523,39 @@ func (m *BackupInfo) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Directory) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Time != nil { l = m.Time.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Engine) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Status != 0 { - n += 1 + sov(uint64(m.Status)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Status)) } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *StartRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1327,7 +1564,7 @@ func (m *StartRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1355,7 +1592,7 @@ func (m *StartRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1369,11 +1606,11 @@ func (m *StartRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1382,12 +1619,12 @@ func (m *StartRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1410,7 +1647,7 @@ func (m *StartResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1433,12 +1670,12 @@ func (m *StartResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1461,7 +1698,7 @@ func (m *ShutdownRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1489,7 +1726,7 @@ func (m *ShutdownRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1509,7 +1746,7 @@ func (m *ShutdownRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1522,11 +1759,11 @@ func (m *ShutdownRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1540,12 +1777,12 @@ func (m *ShutdownRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1568,7 +1805,7 @@ func (m *ShutdownResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1591,12 +1828,12 @@ func (m *ShutdownResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1619,7 +1856,7 @@ func (m *RunMysqlUpgradeRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1642,12 +1879,12 @@ func (m *RunMysqlUpgradeRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1670,7 +1907,7 @@ func (m *RunMysqlUpgradeResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1693,12 +1930,12 @@ func (m *RunMysqlUpgradeResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1721,7 +1958,7 @@ func (m *ApplyBinlogFileRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1749,7 +1986,7 @@ func (m *ApplyBinlogFileRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1763,11 +2000,11 @@ func (m *ApplyBinlogFileRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1781,7 +2018,7 @@ func (m *ApplyBinlogFileRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1795,11 +2032,11 @@ func (m *ApplyBinlogFileRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1813,7 +2050,7 @@ func (m *ApplyBinlogFileRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1826,11 +2063,11 @@ func (m *ApplyBinlogFileRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1844,12 +2081,12 @@ func (m *ApplyBinlogFileRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1872,7 +2109,7 @@ func (m *ApplyBinlogFileResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1895,12 +2132,12 @@ func (m *ApplyBinlogFileResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1923,7 +2160,7 @@ func (m *ReadBinlogFilesTimestampsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1951,7 +2188,7 @@ func (m *ReadBinlogFilesTimestampsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1965,11 +2202,11 @@ func (m *ReadBinlogFilesTimestampsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1978,12 +2215,12 @@ func (m *ReadBinlogFilesTimestampsRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2006,7 +2243,7 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2034,7 +2271,7 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2047,11 +2284,11 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2070,7 +2307,7 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2084,11 +2321,11 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2102,7 +2339,7 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2115,11 +2352,11 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2138,7 +2375,7 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2152,11 +2389,11 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2165,12 +2402,12 @@ func (m *ReadBinlogFilesTimestampsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2193,7 +2430,7 @@ func (m *ReinitConfigRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2216,12 +2453,12 @@ func (m *ReinitConfigRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2244,7 +2481,7 @@ func (m *ReinitConfigResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2267,12 +2504,12 @@ func (m *ReinitConfigResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2295,7 +2532,7 @@ func (m *RefreshConfigRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2318,12 +2555,12 @@ func (m *RefreshConfigRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2346,7 +2583,7 @@ func (m *RefreshConfigResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2369,12 +2606,12 @@ func (m *RefreshConfigResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2397,7 +2634,7 @@ func (m *VersionStringRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2420,12 +2657,12 @@ func (m *VersionStringRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2448,7 +2685,7 @@ func (m *VersionStringResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2476,7 +2713,7 @@ func (m *VersionStringResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2490,11 +2727,11 @@ func (m *VersionStringResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2503,12 +2740,373 @@ func (m *VersionStringResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HostMetricsRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HostMetricsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HostMetricsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HostMetricsResponse_Metric) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HostMetricsResponse_Metric: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HostMetricsResponse_Metric: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Value = float64(math.Float64frombits(v)) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &vtrpc.RPCError{} + } + if err := m.Error.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HostMetricsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HostMetricsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HostMetricsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metrics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Metrics == nil { + m.Metrics = make(map[string]*HostMetricsResponse_Metric) + } + var mapkey string + var mapvalue *HostMetricsResponse_Metric + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &HostMetricsResponse_Metric{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Metrics[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2531,7 +3129,7 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2559,7 +3157,7 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2573,11 +3171,11 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2591,7 +3189,7 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2605,11 +3203,11 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2623,7 +3221,7 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2637,11 +3235,11 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2655,7 +3253,7 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2669,11 +3267,11 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2687,7 +3285,7 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2700,11 +3298,11 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2723,7 +3321,7 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2736,11 +3334,11 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2759,7 +3357,7 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2773,11 +3371,11 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2791,7 +3389,7 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { m.Status = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2805,12 +3403,12 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2825,88 +3423,3 @@ func (m *BackupInfo) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/query/cached_size.go b/go/vt/proto/query/cached_size.go index 735bd555e55..5b613317294 100644 --- a/go/vt/proto/query/cached_size.go +++ b/go/vt/proto/query/cached_size.go @@ -27,10 +27,6 @@ func (cached *BindVariable) CachedSize(alloc bool) int64 { if alloc { size += int64(96) } - // field unknownFields []byte - { - size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) - } // field Value []byte { size += hack.RuntimeAllocSize(int64(cap(cached.Value))) @@ -52,10 +48,6 @@ func (cached *Field) CachedSize(alloc bool) int64 { if alloc { size += int64(160) } - // field unknownFields []byte - { - size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) - } // field Name string size += hack.RuntimeAllocSize(int64(len(cached.Name))) // field Table string @@ -78,10 +70,6 @@ func (cached *QueryWarning) CachedSize(alloc bool) int64 { if alloc { size += int64(64) } - // field unknownFields []byte - { - size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) - } // field Message string size += hack.RuntimeAllocSize(int64(len(cached.Message))) return size @@ -94,10 +82,6 @@ func (cached *Target) CachedSize(alloc bool) int64 { if alloc { size += int64(96) } - // field unknownFields []byte - { - size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) - } // field Keyspace string size += hack.RuntimeAllocSize(int64(len(cached.Keyspace))) // field Shard string @@ -114,10 +98,6 @@ func (cached *Value) CachedSize(alloc bool) int64 { if alloc { size += int64(80) } - // field unknownFields []byte - { - size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) - } // field Value []byte { size += hack.RuntimeAllocSize(int64(cap(cached.Value))) diff --git a/go/vt/proto/query/query.pb.go b/go/vt/proto/query/query.pb.go index c10568cc69b..cc2f7c160f5 100644 --- a/go/vt/proto/query/query.pb.go +++ b/go/vt/proto/query/query.pb.go @@ -315,6 +315,11 @@ const ( // BITNUM specifies a base 2 binary type (unquoted varbinary). // Properties: 34, IsText. Type_BITNUM Type = 4130 + // VECTOR specifies a VECTOR type + // Properties: 35, IsQuoted. + Type_VECTOR Type = 2083 + // RAW specifies a type which won't be quoted but the value used as-is while encoding. + Type_RAW Type = 2084 ) // Enum value maps for Type. @@ -355,6 +360,8 @@ var ( 4128: "HEXNUM", 4129: "HEXVAL", 4130: "BITNUM", + 2083: "VECTOR", + 2084: "RAW", } Type_value = map[string]int32{ "NULL_TYPE": 0, @@ -392,6 +399,8 @@ var ( "HEXNUM": 4128, "HEXVAL": 4129, "BITNUM": 4130, + "VECTOR": 2083, + "RAW": 2084, } ) @@ -1345,6 +1354,12 @@ type ExecuteOptions struct { // priority specifies the priority of the query, between 0 and 100. This is leveraged by the transaction // throttler to determine whether, under resource contention, a query should or should not be throttled. Priority string `protobuf:"bytes,16,opt,name=priority,proto3" json:"priority,omitempty"` + // timeout specifies the query timeout in milliseconds. If not set, the default timeout is used. + // + // Types that are assignable to Timeout: + // + // *ExecuteOptions_AuthoritativeTimeout + Timeout isExecuteOptions_Timeout `protobuf_oneof:"timeout"` } func (x *ExecuteOptions) Reset() { @@ -1463,6 +1478,30 @@ func (x *ExecuteOptions) GetPriority() string { return "" } +func (m *ExecuteOptions) GetTimeout() isExecuteOptions_Timeout { + if m != nil { + return m.Timeout + } + return nil +} + +func (x *ExecuteOptions) GetAuthoritativeTimeout() int64 { + if x, ok := x.GetTimeout().(*ExecuteOptions_AuthoritativeTimeout); ok { + return x.AuthoritativeTimeout + } + return 0 +} + +type isExecuteOptions_Timeout interface { + isExecuteOptions_Timeout() +} + +type ExecuteOptions_AuthoritativeTimeout struct { + AuthoritativeTimeout int64 `protobuf:"varint,17,opt,name=authoritative_timeout,json=authoritativeTimeout,proto3,oneof"` +} + +func (*ExecuteOptions_AuthoritativeTimeout) isExecuteOptions_Timeout() {} + // Field describes a single column returned by a query type Field struct { state protoimpl.MessageState @@ -3547,6 +3586,7 @@ type UnresolvedTransactionsRequest struct { EffectiveCallerId *vtrpc.CallerID `protobuf:"bytes,1,opt,name=effective_caller_id,json=effectiveCallerId,proto3" json:"effective_caller_id,omitempty"` ImmediateCallerId *VTGateCallerID `protobuf:"bytes,2,opt,name=immediate_caller_id,json=immediateCallerId,proto3" json:"immediate_caller_id,omitempty"` Target *Target `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` + AbandonAge int64 `protobuf:"varint,4,opt,name=abandon_age,json=abandonAge,proto3" json:"abandon_age,omitempty"` // Unresolved Transactions older than this (in seconds). } func (x *UnresolvedTransactionsRequest) Reset() { @@ -3602,6 +3642,13 @@ func (x *UnresolvedTransactionsRequest) GetTarget() *Target { return nil } +func (x *UnresolvedTransactionsRequest) GetAbandonAge() int64 { + if x != nil { + return x.AbandonAge + } + return 0 +} + // UnresolvedTransactionsResponse is the returned value from UnresolvedTransactions type UnresolvedTransactionsResponse struct { state protoimpl.MessageState @@ -5886,7 +5933,7 @@ var file_query_proto_rawDesc = []byte{ 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x98, 0x0b, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0xda, 0x0b, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, @@ -5933,220 +5980,242 @@ var file_query_proto_rawDesc = []byte{ 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x3b, 0x0a, 0x0e, 0x49, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x11, 0x0a, 0x0d, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x07, - 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x22, 0x38, 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x4c, 0x54, 0x50, 0x10, 0x01, 0x12, 0x08, - 0x0a, 0x04, 0x4f, 0x4c, 0x41, 0x50, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x42, 0x41, 0x10, - 0x03, 0x22, 0xa7, 0x01, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, - 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x50, 0x45, 0x41, - 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, - 0x52, 0x45, 0x41, 0x44, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, - 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x55, 0x4e, 0x43, 0x4f, 0x4d, 0x4d, 0x49, - 0x54, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x45, 0x52, 0x49, 0x41, 0x4c, - 0x49, 0x5a, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4e, 0x53, - 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, - 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x41, - 0x55, 0x54, 0x4f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x06, 0x22, 0x92, 0x01, 0x0a, 0x0e, - 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x13, - 0x0a, 0x0f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x45, - 0x52, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x56, 0x33, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x47, - 0x65, 0x6e, 0x34, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x47, 0x65, 0x6e, 0x34, 0x47, 0x72, 0x65, - 0x65, 0x64, 0x79, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x34, 0x4c, 0x65, 0x66, - 0x74, 0x32, 0x52, 0x69, 0x67, 0x68, 0x74, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x47, 0x65, 0x6e, - 0x34, 0x57, 0x69, 0x74, 0x68, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x10, 0x05, 0x12, - 0x11, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x34, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x56, 0x33, - 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x33, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x10, 0x07, - 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, - 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x19, 0x0a, 0x15, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, - 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, - 0x4e, 0x53, 0x4f, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, - 0x45, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x49, 0x44, - 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x50, - 0x4c, 0x49, 0x43, 0x41, 0x53, 0x10, 0x03, 0x22, 0x4f, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x53, - 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x41, - 0x44, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x41, - 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, - 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x67, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x72, - 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x61, 0x72, 0x73, - 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x66, - 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x37, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, 0x0a, 0x07, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x12, 0x52, 0x07, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xe3, - 0x01, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x24, - 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x72, 0x6f, 0x77, - 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, - 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x4a, 0x04, - 0x08, 0x05, 0x10, 0x06, 0x22, 0x3c, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x61, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0xa0, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x53, + 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x15, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x14, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x22, 0x3b, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, + 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, + 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x22, 0x38, + 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4f, + 0x4c, 0x54, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x4c, 0x41, 0x50, 0x10, 0x02, 0x12, + 0x07, 0x0a, 0x03, 0x44, 0x42, 0x41, 0x10, 0x03, 0x22, 0xa7, 0x01, 0x0a, 0x14, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x13, + 0x0a, 0x0f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x41, + 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, + 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x41, 0x44, 0x5f, + 0x55, 0x4e, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x10, 0x0a, + 0x0c, 0x53, 0x45, 0x52, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x12, + 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x4e, + 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, + 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x55, 0x54, 0x4f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, + 0x10, 0x06, 0x22, 0x92, 0x01, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, + 0x5f, 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x56, 0x33, + 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x65, 0x6e, 0x34, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, + 0x47, 0x65, 0x6e, 0x34, 0x47, 0x72, 0x65, 0x65, 0x64, 0x79, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, + 0x47, 0x65, 0x6e, 0x34, 0x4c, 0x65, 0x66, 0x74, 0x32, 0x52, 0x69, 0x67, 0x68, 0x74, 0x10, 0x04, + 0x12, 0x14, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x34, 0x57, 0x69, 0x74, 0x68, 0x46, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x34, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x65, 0x56, 0x33, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x33, 0x49, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x10, 0x07, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x4e, 0x53, + 0x4f, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, + 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, + 0x01, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, + 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x43, + 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x42, + 0x4c, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x53, 0x10, 0x03, 0x22, 0x4f, + 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x4e, 0x53, 0x49, + 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x10, 0x00, + 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x42, + 0x09, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xb8, 0x02, 0x0a, + 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, + 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, + 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x61, + 0x72, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x37, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x18, + 0x0a, 0x07, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x12, 0x52, + 0x07, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x22, 0xe3, 0x01, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x72, + 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, + 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x32, 0x0a, 0x15, + 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x3c, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0xa0, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x32, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x9e, 0x02, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x32, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x9e, 0x02, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, - 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x10, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x12, 0x38, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x10, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, - 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x22, 0x27, 0x0a, 0x08, - 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4d, 0x4c, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, - 0x44, 0x44, 0x4c, 0x10, 0x02, 0x22, 0xe1, 0x02, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, - 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, - 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, - 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, - 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x0f, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x64, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x57, 0x69, 0x74, 0x68, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, - 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xe7, - 0x02, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, - 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x52, 0x10, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x12, 0x38, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x10, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x71, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x22, 0x27, + 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4d, 0x4c, 0x10, 0x01, 0x12, 0x07, + 0x0a, 0x03, 0x44, 0x44, 0x4c, 0x10, 0x02, 0x22, 0xe1, 0x02, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, + 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, + 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x0f, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, + 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x64, 0x0a, 0x0f, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x57, 0x69, 0x74, 0x68, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, + 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0xe7, 0x02, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, + 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x22, 0x43, 0x0a, 0x15, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0xee, 0x01, 0x0a, 0x0c, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, + 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x22, 0x43, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xee, 0x01, - 0x0a, 0x0c, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, - 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, - 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, - 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2f, 0x0a, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa4, - 0x01, 0x0a, 0x0d, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, - 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x31, 0x0a, - 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, - 0x22, 0xe7, 0x01, 0x0a, 0x0f, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x22, 0xa4, 0x01, 0x0a, 0x0d, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, + 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, + 0x31, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x49, 0x64, 0x22, 0xe7, 0x01, 0x0a, 0x0f, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, + 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, + 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x10, + 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, + 0x64, 0x22, 0xfa, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, @@ -6160,132 +6229,26 @@ var file_query_proto_rawDesc = []byte{ 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x10, 0x52, 0x6f, - 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x22, - 0xfa, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, - 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, - 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, - 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x11, 0x0a, 0x0f, - 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xda, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, - 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x18, 0x0a, 0x16, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x02, 0x0a, 0x17, 0x52, 0x6f, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, - 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, - 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, - 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x1a, 0x0a, 0x18, - 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x90, 0x02, 0x0a, 0x18, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, - 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, - 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, - 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0c, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, - 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, - 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, - 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, - 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, - 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, - 0x64, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x1a, 0x43, 0x6f, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, - 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x43, 0x6f, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x01, 0x0a, 0x16, 0x52, 0x65, - 0x61, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x11, + 0x0a, 0x0f, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xda, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, + 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, + 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, + 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x18, + 0x0a, 0x16, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x02, 0x0a, 0x17, 0x52, 0x6f, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, @@ -6297,148 +6260,13 @@ var file_query_proto_rawDesc = []byte{ 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x17, 0x52, 0x65, 0x61, 0x64, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xce, 0x01, 0x0a, 0x1d, 0x55, - 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, - 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, - 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, - 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, - 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x60, 0x0a, 0x1e, 0x55, - 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, - 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe0, 0x02, - 0x0a, 0x13, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, - 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, - 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, - 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, - 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x22, 0xfe, 0x01, 0x0a, 0x14, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, - 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x0e, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x32, 0x0a, - 0x15, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x22, 0xe6, 0x02, 0x0a, 0x19, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, - 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, - 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, - 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x5f, - 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x22, 0x84, 0x02, 0x0a, 0x1a, 0x42, - 0x65, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, - 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x0e, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x32, 0x0a, - 0x15, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x22, 0xd9, 0x01, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, - 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, - 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, - 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, - 0x15, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x63, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, - 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, - 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, - 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x03, 0x69, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x40, 0x0a, 0x12, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xe8, 0x02, - 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x1a, + 0x0a, 0x18, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x90, 0x02, 0x0a, 0x18, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, @@ -6450,31 +6278,14 @@ var file_query_proto_rawDesc = []byte{ 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x22, 0xee, 0x02, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x22, 0x1b, 0x0a, + 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, @@ -6486,73 +6297,46 @@ var file_query_proto_rawDesc = []byte{ 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x22, 0xf4, 0x02, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x42, 0x65, 0x67, - 0x69, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, - 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, - 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, - 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, - 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, - 0x70, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6f, - 0x73, 0x74, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x42, 0x65, 0x67, 0x69, - 0x6e, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xa6, 0x02, 0x0a, 0x1b, 0x52, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, - 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x32, 0x0a, - 0x15, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x22, 0xfa, 0x02, 0x0a, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x42, 0x65, 0x67, - 0x69, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, + 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, + 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, + 0x74, 0x69, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x1a, 0x43, + 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, + 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x1d, 0x0a, 0x1b, + 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x01, 0x0a, 0x16, + 0x52, 0x65, 0x61, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, @@ -6564,230 +6348,501 @@ var file_query_proto_rawDesc = []byte{ 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, - 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x70, 0x6f, - 0x73, 0x74, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xac, - 0x02, 0x0a, 0x21, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x87, 0x02, - 0x0a, 0x0e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, - 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, - 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x17, 0x52, 0x65, 0x61, + 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xef, 0x01, 0x0a, + 0x1d, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, + 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, + 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, + 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, + 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x22, 0x60, + 0x0a, 0x1e, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0xe0, 0x02, 0x0a, 0x13, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, + 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, + 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, + 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x14, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, + 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x22, 0xe6, 0x02, 0x0a, 0x19, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, + 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, + 0x72, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0a, 0x70, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x22, 0x84, 0x02, + 0x0a, 0x1a, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, + 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x52, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x30, - 0x0a, 0x14, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x62, 0x69, - 0x6e, 0x6c, 0x6f, 0x67, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x47, 0x0a, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x22, 0xd9, 0x01, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, + 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, + 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, + 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, + 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x43, 0x0a, 0x15, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xf6, 0x01, 0x0a, 0x11, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, + 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, + 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, + 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, + 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x40, + 0x0a, 0x12, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0xe8, 0x02, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, + 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, + 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, + 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x70, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x16, + 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, + 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x22, 0xee, 0x02, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, + 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, + 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x51, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, + 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x22, 0xf4, 0x02, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x42, 0x65, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, + 0x70, 0x72, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x42, + 0x65, 0x67, 0x69, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xa6, 0x02, 0x0a, 0x1b, + 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, + 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, + 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x22, 0xfa, 0x02, 0x0a, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x42, 0x65, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, + 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x67, 0x69, + 0x6e, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x10, 0x70, 0x6f, 0x73, 0x74, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x22, 0xac, 0x02, 0x0a, 0x21, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x42, 0x65, 0x67, + 0x69, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, + 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, + 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x32, 0x0a, 0x15, + 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x22, 0x87, 0x02, 0x0a, 0x0e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x0a, + 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x61, 0x67, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, - 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x63, 0x70, - 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x71, 0x70, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x70, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x69, - 0x65, 0x77, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x76, 0x69, 0x65, 0x77, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x64, - 0x66, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x75, 0x64, 0x66, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x74, 0x78, 0x5f, 0x75, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x74, 0x78, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x0e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, - 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x12, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x75, 0x6e, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x79, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, - 0x1b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x18, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x61, 0x67, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x3d, 0x0a, 0x1b, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x12, 0x30, 0x0a, 0x14, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x12, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x18, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, - 0x67, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4d, 0x61, 0x78, 0x22, 0x95, 0x02, 0x0a, 0x14, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x54, 0x65, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3b, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x4a, 0x04, 0x08, - 0x06, 0x10, 0x07, 0x22, 0xae, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x12, - 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x6d, 0x0a, 0x07, 0x55, 0x44, 0x46, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x0b, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0xd5, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, - 0x04, 0x75, 0x64, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x55, 0x44, 0x46, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x75, 0x64, 0x66, - 0x73, 0x12, 0x58, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x42, 0x0a, 0x14, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, - 0x92, 0x03, 0x0a, 0x09, 0x4d, 0x79, 0x53, 0x71, 0x6c, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x09, 0x0a, - 0x05, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x54, 0x5f, - 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, - 0x52, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, - 0x0f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, - 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45, 0x5f, 0x4b, - 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x4c, 0x4f, - 0x42, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x10, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x53, 0x49, - 0x47, 0x4e, 0x45, 0x44, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x20, 0x12, 0x11, 0x0a, 0x0d, 0x5a, - 0x45, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x4c, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x40, 0x12, 0x10, - 0x0a, 0x0b, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x01, - 0x12, 0x0e, 0x0a, 0x09, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x02, - 0x12, 0x18, 0x0a, 0x13, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45, - 0x4e, 0x54, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x04, 0x12, 0x13, 0x0a, 0x0e, 0x54, 0x49, - 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x08, 0x12, - 0x0d, 0x0a, 0x08, 0x53, 0x45, 0x54, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x10, 0x12, 0x1a, - 0x0a, 0x15, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x56, 0x41, 0x4c, - 0x55, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x20, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x4e, - 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x57, 0x5f, 0x46, 0x4c, 0x41, 0x47, - 0x10, 0x80, 0x40, 0x12, 0x0e, 0x0a, 0x08, 0x4e, 0x55, 0x4d, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, - 0x80, 0x80, 0x02, 0x12, 0x13, 0x0a, 0x0d, 0x50, 0x41, 0x52, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, - 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x47, 0x52, 0x4f, 0x55, - 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x02, 0x12, 0x11, 0x0a, 0x0b, 0x55, 0x4e, - 0x49, 0x51, 0x55, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x04, 0x12, 0x11, 0x0a, - 0x0b, 0x42, 0x49, 0x4e, 0x43, 0x4d, 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x08, - 0x1a, 0x02, 0x10, 0x01, 0x2a, 0x6b, 0x0a, 0x04, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x49, 0x4e, 0x54, 0x45, - 0x47, 0x52, 0x41, 0x4c, 0x10, 0x80, 0x02, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x55, 0x4e, 0x53, - 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x80, 0x04, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x53, 0x46, 0x4c, - 0x4f, 0x41, 0x54, 0x10, 0x80, 0x08, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x53, 0x51, 0x55, 0x4f, 0x54, - 0x45, 0x44, 0x10, 0x80, 0x10, 0x12, 0x0b, 0x0a, 0x06, 0x49, 0x53, 0x54, 0x45, 0x58, 0x54, 0x10, - 0x80, 0x20, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x53, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x80, - 0x40, 0x2a, 0xc0, 0x03, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x55, - 0x4c, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x04, 0x49, 0x4e, 0x54, - 0x38, 0x10, 0x81, 0x02, 0x12, 0x0a, 0x0a, 0x05, 0x55, 0x49, 0x4e, 0x54, 0x38, 0x10, 0x82, 0x06, - 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x31, 0x36, 0x10, 0x83, 0x02, 0x12, 0x0b, 0x0a, 0x06, - 0x55, 0x49, 0x4e, 0x54, 0x31, 0x36, 0x10, 0x84, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, - 0x32, 0x34, 0x10, 0x85, 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x32, 0x34, 0x10, - 0x86, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x87, 0x02, 0x12, 0x0b, - 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x88, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, - 0x4e, 0x54, 0x36, 0x34, 0x10, 0x89, 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x36, - 0x34, 0x10, 0x8a, 0x06, 0x12, 0x0c, 0x0a, 0x07, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x33, 0x32, 0x10, - 0x8b, 0x08, 0x12, 0x0c, 0x0a, 0x07, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x36, 0x34, 0x10, 0x8c, 0x08, - 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x8d, 0x10, - 0x12, 0x09, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x45, 0x10, 0x8e, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x54, - 0x49, 0x4d, 0x45, 0x10, 0x8f, 0x10, 0x12, 0x0d, 0x0a, 0x08, 0x44, 0x41, 0x54, 0x45, 0x54, 0x49, - 0x4d, 0x45, 0x10, 0x90, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x59, 0x45, 0x41, 0x52, 0x10, 0x91, 0x06, - 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, 0x4c, 0x10, 0x12, 0x12, 0x09, 0x0a, - 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x93, 0x30, 0x12, 0x09, 0x0a, 0x04, 0x42, 0x4c, 0x4f, 0x42, - 0x10, 0x94, 0x50, 0x12, 0x0c, 0x0a, 0x07, 0x56, 0x41, 0x52, 0x43, 0x48, 0x41, 0x52, 0x10, 0x95, - 0x30, 0x12, 0x0e, 0x0a, 0x09, 0x56, 0x41, 0x52, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x96, - 0x50, 0x12, 0x09, 0x0a, 0x04, 0x43, 0x48, 0x41, 0x52, 0x10, 0x97, 0x30, 0x12, 0x0b, 0x0a, 0x06, - 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x98, 0x50, 0x12, 0x08, 0x0a, 0x03, 0x42, 0x49, 0x54, - 0x10, 0x99, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x9a, 0x10, 0x12, 0x08, - 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x9b, 0x10, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x55, 0x50, 0x4c, - 0x45, 0x10, 0x1c, 0x12, 0x0d, 0x0a, 0x08, 0x47, 0x45, 0x4f, 0x4d, 0x45, 0x54, 0x52, 0x59, 0x10, - 0x9d, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x9e, 0x10, 0x12, 0x0e, 0x0a, - 0x0a, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x1f, 0x12, 0x0b, 0x0a, - 0x06, 0x48, 0x45, 0x58, 0x4e, 0x55, 0x4d, 0x10, 0xa0, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x48, 0x45, - 0x58, 0x56, 0x41, 0x4c, 0x10, 0xa1, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x42, 0x49, 0x54, 0x4e, 0x55, - 0x4d, 0x10, 0xa2, 0x20, 0x2a, 0x46, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, - 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x02, - 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x03, 0x2a, 0x3b, 0x0a, 0x0f, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x09, 0x0a, 0x05, 0x56, 0x49, 0x45, 0x57, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, - 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x55, 0x44, 0x46, 0x53, 0x10, 0x03, 0x42, 0x35, 0x0a, 0x0f, 0x69, 0x6f, 0x2e, - 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x22, 0x76, 0x69, - 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, - 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x71, 0x70, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x71, 0x70, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x2e, 0x0a, + 0x13, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x76, 0x69, 0x65, 0x77, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x75, 0x64, 0x66, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x64, 0x66, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x78, 0x5f, 0x75, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x74, 0x78, 0x55, 0x6e, 0x72, 0x65, 0x73, + 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x22, 0xf6, 0x01, 0x0a, 0x0e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x75, 0x6e, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x75, 0x6e, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x79, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x3d, 0x0a, 0x1b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4d, 0x69, 0x6e, 0x12, + 0x3d, 0x0a, 0x1b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, + 0x61, 0x67, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x61, 0x67, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4d, 0x61, 0x78, 0x22, 0x95, + 0x02, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x54, 0x65, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3b, 0x0a, 0x0e, 0x72, 0x65, 0x61, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0xae, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, + 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x17, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x6d, 0x0a, 0x07, 0x55, + 0x44, 0x46, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x0b, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0b, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0xd5, 0x01, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x22, 0x0a, 0x04, 0x75, 0x64, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x55, 0x44, 0x46, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, + 0x75, 0x64, 0x66, 0x73, 0x12, 0x58, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x42, + 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x2a, 0x92, 0x03, 0x0a, 0x09, 0x4d, 0x79, 0x53, 0x71, 0x6c, 0x46, 0x6c, 0x61, 0x67, + 0x12, 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, + 0x4f, 0x54, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x01, 0x12, 0x10, + 0x0a, 0x0c, 0x50, 0x52, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x02, + 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, + 0x4c, 0x41, 0x47, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, + 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, + 0x42, 0x4c, 0x4f, 0x42, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x10, 0x12, 0x11, 0x0a, 0x0d, 0x55, + 0x4e, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x20, 0x12, 0x11, + 0x0a, 0x0d, 0x5a, 0x45, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x4c, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, + 0x40, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, + 0x10, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x46, 0x4c, 0x41, 0x47, + 0x10, 0x80, 0x02, 0x12, 0x18, 0x0a, 0x13, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x49, 0x4e, 0x43, 0x52, + 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x04, 0x12, 0x13, 0x0a, + 0x0e, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, + 0x80, 0x08, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x45, 0x54, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, + 0x10, 0x12, 0x1a, 0x0a, 0x15, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, + 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x20, 0x12, 0x17, 0x0a, + 0x12, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x57, 0x5f, 0x46, + 0x4c, 0x41, 0x47, 0x10, 0x80, 0x40, 0x12, 0x0e, 0x0a, 0x08, 0x4e, 0x55, 0x4d, 0x5f, 0x46, 0x4c, + 0x41, 0x47, 0x10, 0x80, 0x80, 0x02, 0x12, 0x13, 0x0a, 0x0d, 0x50, 0x41, 0x52, 0x54, 0x5f, 0x4b, + 0x45, 0x59, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x47, + 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x02, 0x12, 0x11, 0x0a, + 0x0b, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x80, 0x80, 0x04, + 0x12, 0x11, 0x0a, 0x0b, 0x42, 0x49, 0x4e, 0x43, 0x4d, 0x50, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x10, + 0x80, 0x80, 0x08, 0x1a, 0x02, 0x10, 0x01, 0x2a, 0x6b, 0x0a, 0x04, 0x46, 0x6c, 0x61, 0x67, 0x12, + 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x49, + 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x4c, 0x10, 0x80, 0x02, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, + 0x55, 0x4e, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x80, 0x04, 0x12, 0x0c, 0x0a, 0x07, 0x49, + 0x53, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x80, 0x08, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x53, 0x51, + 0x55, 0x4f, 0x54, 0x45, 0x44, 0x10, 0x80, 0x10, 0x12, 0x0b, 0x0a, 0x06, 0x49, 0x53, 0x54, 0x45, + 0x58, 0x54, 0x10, 0x80, 0x20, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x53, 0x42, 0x49, 0x4e, 0x41, 0x52, + 0x59, 0x10, 0x80, 0x40, 0x2a, 0xd7, 0x03, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, + 0x09, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x04, + 0x49, 0x4e, 0x54, 0x38, 0x10, 0x81, 0x02, 0x12, 0x0a, 0x0a, 0x05, 0x55, 0x49, 0x4e, 0x54, 0x38, + 0x10, 0x82, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x31, 0x36, 0x10, 0x83, 0x02, 0x12, + 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x31, 0x36, 0x10, 0x84, 0x06, 0x12, 0x0a, 0x0a, 0x05, + 0x49, 0x4e, 0x54, 0x32, 0x34, 0x10, 0x85, 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, + 0x32, 0x34, 0x10, 0x86, 0x06, 0x12, 0x0a, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x87, + 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x88, 0x06, 0x12, 0x0a, + 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x89, 0x02, 0x12, 0x0b, 0x0a, 0x06, 0x55, 0x49, + 0x4e, 0x54, 0x36, 0x34, 0x10, 0x8a, 0x06, 0x12, 0x0c, 0x0a, 0x07, 0x46, 0x4c, 0x4f, 0x41, 0x54, + 0x33, 0x32, 0x10, 0x8b, 0x08, 0x12, 0x0c, 0x0a, 0x07, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x36, 0x34, + 0x10, 0x8c, 0x08, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, + 0x10, 0x8d, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x45, 0x10, 0x8e, 0x10, 0x12, 0x09, + 0x0a, 0x04, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x8f, 0x10, 0x12, 0x0d, 0x0a, 0x08, 0x44, 0x41, 0x54, + 0x45, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x90, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x59, 0x45, 0x41, 0x52, + 0x10, 0x91, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, 0x4c, 0x10, 0x12, + 0x12, 0x09, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x93, 0x30, 0x12, 0x09, 0x0a, 0x04, 0x42, + 0x4c, 0x4f, 0x42, 0x10, 0x94, 0x50, 0x12, 0x0c, 0x0a, 0x07, 0x56, 0x41, 0x52, 0x43, 0x48, 0x41, + 0x52, 0x10, 0x95, 0x30, 0x12, 0x0e, 0x0a, 0x09, 0x56, 0x41, 0x52, 0x42, 0x49, 0x4e, 0x41, 0x52, + 0x59, 0x10, 0x96, 0x50, 0x12, 0x09, 0x0a, 0x04, 0x43, 0x48, 0x41, 0x52, 0x10, 0x97, 0x30, 0x12, + 0x0b, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x98, 0x50, 0x12, 0x08, 0x0a, 0x03, + 0x42, 0x49, 0x54, 0x10, 0x99, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x9a, + 0x10, 0x12, 0x08, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x9b, 0x10, 0x12, 0x09, 0x0a, 0x05, 0x54, + 0x55, 0x50, 0x4c, 0x45, 0x10, 0x1c, 0x12, 0x0d, 0x0a, 0x08, 0x47, 0x45, 0x4f, 0x4d, 0x45, 0x54, + 0x52, 0x59, 0x10, 0x9d, 0x10, 0x12, 0x09, 0x0a, 0x04, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x9e, 0x10, + 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x1f, + 0x12, 0x0b, 0x0a, 0x06, 0x48, 0x45, 0x58, 0x4e, 0x55, 0x4d, 0x10, 0xa0, 0x20, 0x12, 0x0b, 0x0a, + 0x06, 0x48, 0x45, 0x58, 0x56, 0x41, 0x4c, 0x10, 0xa1, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x42, 0x49, + 0x54, 0x4e, 0x55, 0x4d, 0x10, 0xa2, 0x20, 0x12, 0x0b, 0x0a, 0x06, 0x56, 0x45, 0x43, 0x54, 0x4f, + 0x52, 0x10, 0xa3, 0x10, 0x12, 0x08, 0x0a, 0x03, 0x52, 0x41, 0x57, 0x10, 0xa4, 0x10, 0x2a, 0x46, + 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, + 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, + 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x03, 0x2a, 0x3b, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x49, 0x45, + 0x57, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, + 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x44, 0x46, + 0x53, 0x10, 0x03, 0x42, 0x35, 0x0a, 0x0f, 0x69, 0x6f, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x22, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, + 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -7868,6 +7923,9 @@ func file_query_proto_init() { } } } + file_query_proto_msgTypes[6].OneofWrappers = []any{ + (*ExecuteOptions_AuthoritativeTimeout)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/go/vt/proto/query/query_vtproto.pb.go b/go/vt/proto/query/query_vtproto.pb.go index c7069cfd6d7..e4118ca8b65 100644 --- a/go/vt/proto/query/query_vtproto.pb.go +++ b/go/vt/proto/query/query_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: query.proto package query @@ -7,11 +7,11 @@ package query import ( binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" math "math" - bits "math/bits" sync "sync" topodata "vitess.io/vitess/go/vt/proto/topodata" vtrpc "vitess.io/vitess/go/vt/proto/vtrpc" @@ -28,12 +28,11 @@ func (m *Target) CloneVT() *Target { if m == nil { return (*Target)(nil) } - r := &Target{ - Keyspace: m.Keyspace, - Shard: m.Shard, - TabletType: m.TabletType, - Cell: m.Cell, - } + r := new(Target) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.TabletType = m.TabletType + r.Cell = m.Cell if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -49,9 +48,8 @@ func (m *VTGateCallerID) CloneVT() *VTGateCallerID { if m == nil { return (*VTGateCallerID)(nil) } - r := &VTGateCallerID{ - Username: m.Username, - } + r := new(VTGateCallerID) + r.Username = m.Username if rhs := m.Groups; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -72,11 +70,10 @@ func (m *EventToken) CloneVT() *EventToken { if m == nil { return (*EventToken)(nil) } - r := &EventToken{ - Timestamp: m.Timestamp, - Shard: m.Shard, - Position: m.Position, - } + r := new(EventToken) + r.Timestamp = m.Timestamp + r.Shard = m.Shard + r.Position = m.Position if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -92,9 +89,8 @@ func (m *Value) CloneVT() *Value { if m == nil { return (*Value)(nil) } - r := &Value{ - Type: m.Type, - } + r := new(Value) + r.Type = m.Type if rhs := m.Value; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -115,9 +111,8 @@ func (m *BindVariable) CloneVT() *BindVariable { if m == nil { return (*BindVariable)(nil) } - r := &BindVariable{ - Type: m.Type, - } + r := new(BindVariable) + r.Type = m.Type if rhs := m.Value; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -145,9 +140,8 @@ func (m *BoundQuery) CloneVT() *BoundQuery { if m == nil { return (*BoundQuery)(nil) } - r := &BoundQuery{ - Sql: m.Sql, - } + r := new(BoundQuery) + r.Sql = m.Sql if rhs := m.BindVariables; rhs != nil { tmpContainer := make(map[string]*BindVariable, len(rhs)) for k, v := range rhs { @@ -170,24 +164,28 @@ func (m *ExecuteOptions) CloneVT() *ExecuteOptions { if m == nil { return (*ExecuteOptions)(nil) } - r := &ExecuteOptions{ - IncludedFields: m.IncludedFields, - ClientFoundRows: m.ClientFoundRows, - Workload: m.Workload, - SqlSelectLimit: m.SqlSelectLimit, - TransactionIsolation: m.TransactionIsolation, - SkipQueryPlanCache: m.SkipQueryPlanCache, - PlannerVersion: m.PlannerVersion, - HasCreatedTempTables: m.HasCreatedTempTables, - Consolidator: m.Consolidator, - WorkloadName: m.WorkloadName, - Priority: m.Priority, - } + r := new(ExecuteOptions) + r.IncludedFields = m.IncludedFields + r.ClientFoundRows = m.ClientFoundRows + r.Workload = m.Workload + r.SqlSelectLimit = m.SqlSelectLimit + r.TransactionIsolation = m.TransactionIsolation + r.SkipQueryPlanCache = m.SkipQueryPlanCache + r.PlannerVersion = m.PlannerVersion + r.HasCreatedTempTables = m.HasCreatedTempTables + r.Consolidator = m.Consolidator + r.WorkloadName = m.WorkloadName + r.Priority = m.Priority if rhs := m.TransactionAccessMode; rhs != nil { tmpContainer := make([]ExecuteOptions_TransactionAccessMode, len(rhs)) copy(tmpContainer, rhs) r.TransactionAccessMode = tmpContainer } + if m.Timeout != nil { + r.Timeout = m.Timeout.(interface { + CloneVT() isExecuteOptions_Timeout + }).CloneVT() + } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -199,23 +197,31 @@ func (m *ExecuteOptions) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *ExecuteOptions_AuthoritativeTimeout) CloneVT() isExecuteOptions_Timeout { + if m == nil { + return (*ExecuteOptions_AuthoritativeTimeout)(nil) + } + r := new(ExecuteOptions_AuthoritativeTimeout) + r.AuthoritativeTimeout = m.AuthoritativeTimeout + return r +} + func (m *Field) CloneVT() *Field { if m == nil { return (*Field)(nil) } - r := &Field{ - Name: m.Name, - Type: m.Type, - Table: m.Table, - OrgTable: m.OrgTable, - Database: m.Database, - OrgName: m.OrgName, - ColumnLength: m.ColumnLength, - Charset: m.Charset, - Decimals: m.Decimals, - Flags: m.Flags, - ColumnType: m.ColumnType, - } + r := new(Field) + r.Name = m.Name + r.Type = m.Type + r.Table = m.Table + r.OrgTable = m.OrgTable + r.Database = m.Database + r.OrgName = m.OrgName + r.ColumnLength = m.ColumnLength + r.Charset = m.Charset + r.Decimals = m.Decimals + r.Flags = m.Flags + r.ColumnType = m.ColumnType if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -231,7 +237,7 @@ func (m *Row) CloneVT() *Row { if m == nil { return (*Row)(nil) } - r := &Row{} + r := RowFromVTPool() if rhs := m.Lengths; rhs != nil { tmpContainer := make([]int64, len(rhs)) copy(tmpContainer, rhs) @@ -257,12 +263,11 @@ func (m *QueryResult) CloneVT() *QueryResult { if m == nil { return (*QueryResult)(nil) } - r := &QueryResult{ - RowsAffected: m.RowsAffected, - InsertId: m.InsertId, - Info: m.Info, - SessionStateChanges: m.SessionStateChanges, - } + r := new(QueryResult) + r.RowsAffected = m.RowsAffected + r.InsertId = m.InsertId + r.Info = m.Info + r.SessionStateChanges = m.SessionStateChanges if rhs := m.Fields; rhs != nil { tmpContainer := make([]*Field, len(rhs)) for k, v := range rhs { @@ -292,10 +297,9 @@ func (m *QueryWarning) CloneVT() *QueryWarning { if m == nil { return (*QueryWarning)(nil) } - r := &QueryWarning{ - Code: m.Code, - Message: m.Message, - } + r := new(QueryWarning) + r.Code = m.Code + r.Message = m.Message if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -311,10 +315,9 @@ func (m *StreamEvent_Statement) CloneVT() *StreamEvent_Statement { if m == nil { return (*StreamEvent_Statement)(nil) } - r := &StreamEvent_Statement{ - Category: m.Category, - TableName: m.TableName, - } + r := new(StreamEvent_Statement) + r.Category = m.Category + r.TableName = m.TableName if rhs := m.PrimaryKeyFields; rhs != nil { tmpContainer := make([]*Field, len(rhs)) for k, v := range rhs { @@ -349,9 +352,8 @@ func (m *StreamEvent) CloneVT() *StreamEvent { if m == nil { return (*StreamEvent)(nil) } - r := &StreamEvent{ - EventToken: m.EventToken.CloneVT(), - } + r := new(StreamEvent) + r.EventToken = m.EventToken.CloneVT() if rhs := m.Statements; rhs != nil { tmpContainer := make([]*StreamEvent_Statement, len(rhs)) for k, v := range rhs { @@ -374,15 +376,14 @@ func (m *ExecuteRequest) CloneVT() *ExecuteRequest { if m == nil { return (*ExecuteRequest)(nil) } - r := &ExecuteRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query.CloneVT(), - TransactionId: m.TransactionId, - Options: m.Options.CloneVT(), - ReservedId: m.ReservedId, - } + r := new(ExecuteRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query.CloneVT() + r.TransactionId = m.TransactionId + r.Options = m.Options.CloneVT() + r.ReservedId = m.ReservedId if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -398,9 +399,8 @@ func (m *ExecuteResponse) CloneVT() *ExecuteResponse { if m == nil { return (*ExecuteResponse)(nil) } - r := &ExecuteResponse{ - Result: m.Result.CloneVT(), - } + r := new(ExecuteResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -416,10 +416,9 @@ func (m *ResultWithError) CloneVT() *ResultWithError { if m == nil { return (*ResultWithError)(nil) } - r := &ResultWithError{ - Error: m.Error.CloneVT(), - Result: m.Result.CloneVT(), - } + r := new(ResultWithError) + r.Error = m.Error.CloneVT() + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -435,15 +434,14 @@ func (m *StreamExecuteRequest) CloneVT() *StreamExecuteRequest { if m == nil { return (*StreamExecuteRequest)(nil) } - r := &StreamExecuteRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query.CloneVT(), - Options: m.Options.CloneVT(), - TransactionId: m.TransactionId, - ReservedId: m.ReservedId, - } + r := new(StreamExecuteRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query.CloneVT() + r.Options = m.Options.CloneVT() + r.TransactionId = m.TransactionId + r.ReservedId = m.ReservedId if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -459,9 +457,8 @@ func (m *StreamExecuteResponse) CloneVT() *StreamExecuteResponse { if m == nil { return (*StreamExecuteResponse)(nil) } - r := &StreamExecuteResponse{ - Result: m.Result.CloneVT(), - } + r := new(StreamExecuteResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -477,12 +474,11 @@ func (m *BeginRequest) CloneVT() *BeginRequest { if m == nil { return (*BeginRequest)(nil) } - r := &BeginRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Options: m.Options.CloneVT(), - } + r := new(BeginRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -498,11 +494,10 @@ func (m *BeginResponse) CloneVT() *BeginResponse { if m == nil { return (*BeginResponse)(nil) } - r := &BeginResponse{ - TransactionId: m.TransactionId, - TabletAlias: m.TabletAlias.CloneVT(), - SessionStateChanges: m.SessionStateChanges, - } + r := new(BeginResponse) + r.TransactionId = m.TransactionId + r.TabletAlias = m.TabletAlias.CloneVT() + r.SessionStateChanges = m.SessionStateChanges if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -518,12 +513,11 @@ func (m *CommitRequest) CloneVT() *CommitRequest { if m == nil { return (*CommitRequest)(nil) } - r := &CommitRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - TransactionId: m.TransactionId, - } + r := new(CommitRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.TransactionId = m.TransactionId if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -539,9 +533,8 @@ func (m *CommitResponse) CloneVT() *CommitResponse { if m == nil { return (*CommitResponse)(nil) } - r := &CommitResponse{ - ReservedId: m.ReservedId, - } + r := new(CommitResponse) + r.ReservedId = m.ReservedId if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -557,12 +550,11 @@ func (m *RollbackRequest) CloneVT() *RollbackRequest { if m == nil { return (*RollbackRequest)(nil) } - r := &RollbackRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - TransactionId: m.TransactionId, - } + r := new(RollbackRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.TransactionId = m.TransactionId if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -578,9 +570,8 @@ func (m *RollbackResponse) CloneVT() *RollbackResponse { if m == nil { return (*RollbackResponse)(nil) } - r := &RollbackResponse{ - ReservedId: m.ReservedId, - } + r := new(RollbackResponse) + r.ReservedId = m.ReservedId if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -596,13 +587,12 @@ func (m *PrepareRequest) CloneVT() *PrepareRequest { if m == nil { return (*PrepareRequest)(nil) } - r := &PrepareRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - TransactionId: m.TransactionId, - Dtid: m.Dtid, - } + r := new(PrepareRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.TransactionId = m.TransactionId + r.Dtid = m.Dtid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -618,7 +608,7 @@ func (m *PrepareResponse) CloneVT() *PrepareResponse { if m == nil { return (*PrepareResponse)(nil) } - r := &PrepareResponse{} + r := new(PrepareResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -634,12 +624,11 @@ func (m *CommitPreparedRequest) CloneVT() *CommitPreparedRequest { if m == nil { return (*CommitPreparedRequest)(nil) } - r := &CommitPreparedRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Dtid: m.Dtid, - } + r := new(CommitPreparedRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Dtid = m.Dtid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -655,7 +644,7 @@ func (m *CommitPreparedResponse) CloneVT() *CommitPreparedResponse { if m == nil { return (*CommitPreparedResponse)(nil) } - r := &CommitPreparedResponse{} + r := new(CommitPreparedResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -671,13 +660,12 @@ func (m *RollbackPreparedRequest) CloneVT() *RollbackPreparedRequest { if m == nil { return (*RollbackPreparedRequest)(nil) } - r := &RollbackPreparedRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - TransactionId: m.TransactionId, - Dtid: m.Dtid, - } + r := new(RollbackPreparedRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.TransactionId = m.TransactionId + r.Dtid = m.Dtid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -693,7 +681,7 @@ func (m *RollbackPreparedResponse) CloneVT() *RollbackPreparedResponse { if m == nil { return (*RollbackPreparedResponse)(nil) } - r := &RollbackPreparedResponse{} + r := new(RollbackPreparedResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -709,12 +697,11 @@ func (m *CreateTransactionRequest) CloneVT() *CreateTransactionRequest { if m == nil { return (*CreateTransactionRequest)(nil) } - r := &CreateTransactionRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Dtid: m.Dtid, - } + r := new(CreateTransactionRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Dtid = m.Dtid if rhs := m.Participants; rhs != nil { tmpContainer := make([]*Target, len(rhs)) for k, v := range rhs { @@ -737,7 +724,7 @@ func (m *CreateTransactionResponse) CloneVT() *CreateTransactionResponse { if m == nil { return (*CreateTransactionResponse)(nil) } - r := &CreateTransactionResponse{} + r := new(CreateTransactionResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -753,13 +740,12 @@ func (m *StartCommitRequest) CloneVT() *StartCommitRequest { if m == nil { return (*StartCommitRequest)(nil) } - r := &StartCommitRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - TransactionId: m.TransactionId, - Dtid: m.Dtid, - } + r := new(StartCommitRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.TransactionId = m.TransactionId + r.Dtid = m.Dtid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -775,7 +761,7 @@ func (m *StartCommitResponse) CloneVT() *StartCommitResponse { if m == nil { return (*StartCommitResponse)(nil) } - r := &StartCommitResponse{} + r := new(StartCommitResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -791,13 +777,12 @@ func (m *SetRollbackRequest) CloneVT() *SetRollbackRequest { if m == nil { return (*SetRollbackRequest)(nil) } - r := &SetRollbackRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - TransactionId: m.TransactionId, - Dtid: m.Dtid, - } + r := new(SetRollbackRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.TransactionId = m.TransactionId + r.Dtid = m.Dtid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -813,7 +798,7 @@ func (m *SetRollbackResponse) CloneVT() *SetRollbackResponse { if m == nil { return (*SetRollbackResponse)(nil) } - r := &SetRollbackResponse{} + r := new(SetRollbackResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -829,12 +814,11 @@ func (m *ConcludeTransactionRequest) CloneVT() *ConcludeTransactionRequest { if m == nil { return (*ConcludeTransactionRequest)(nil) } - r := &ConcludeTransactionRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Dtid: m.Dtid, - } + r := new(ConcludeTransactionRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Dtid = m.Dtid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -850,7 +834,7 @@ func (m *ConcludeTransactionResponse) CloneVT() *ConcludeTransactionResponse { if m == nil { return (*ConcludeTransactionResponse)(nil) } - r := &ConcludeTransactionResponse{} + r := new(ConcludeTransactionResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -866,12 +850,11 @@ func (m *ReadTransactionRequest) CloneVT() *ReadTransactionRequest { if m == nil { return (*ReadTransactionRequest)(nil) } - r := &ReadTransactionRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Dtid: m.Dtid, - } + r := new(ReadTransactionRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Dtid = m.Dtid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -887,9 +870,8 @@ func (m *ReadTransactionResponse) CloneVT() *ReadTransactionResponse { if m == nil { return (*ReadTransactionResponse)(nil) } - r := &ReadTransactionResponse{ - Metadata: m.Metadata.CloneVT(), - } + r := new(ReadTransactionResponse) + r.Metadata = m.Metadata.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -905,11 +887,11 @@ func (m *UnresolvedTransactionsRequest) CloneVT() *UnresolvedTransactionsRequest if m == nil { return (*UnresolvedTransactionsRequest)(nil) } - r := &UnresolvedTransactionsRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - } + r := new(UnresolvedTransactionsRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.AbandonAge = m.AbandonAge if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -925,7 +907,7 @@ func (m *UnresolvedTransactionsResponse) CloneVT() *UnresolvedTransactionsRespon if m == nil { return (*UnresolvedTransactionsResponse)(nil) } - r := &UnresolvedTransactionsResponse{} + r := new(UnresolvedTransactionsResponse) if rhs := m.Transactions; rhs != nil { tmpContainer := make([]*TransactionMetadata, len(rhs)) for k, v := range rhs { @@ -948,14 +930,13 @@ func (m *BeginExecuteRequest) CloneVT() *BeginExecuteRequest { if m == nil { return (*BeginExecuteRequest)(nil) } - r := &BeginExecuteRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query.CloneVT(), - Options: m.Options.CloneVT(), - ReservedId: m.ReservedId, - } + r := new(BeginExecuteRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query.CloneVT() + r.Options = m.Options.CloneVT() + r.ReservedId = m.ReservedId if rhs := m.PreQueries; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -976,13 +957,12 @@ func (m *BeginExecuteResponse) CloneVT() *BeginExecuteResponse { if m == nil { return (*BeginExecuteResponse)(nil) } - r := &BeginExecuteResponse{ - Error: m.Error.CloneVT(), - Result: m.Result.CloneVT(), - TransactionId: m.TransactionId, - TabletAlias: m.TabletAlias.CloneVT(), - SessionStateChanges: m.SessionStateChanges, - } + r := new(BeginExecuteResponse) + r.Error = m.Error.CloneVT() + r.Result = m.Result.CloneVT() + r.TransactionId = m.TransactionId + r.TabletAlias = m.TabletAlias.CloneVT() + r.SessionStateChanges = m.SessionStateChanges if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -998,14 +978,13 @@ func (m *BeginStreamExecuteRequest) CloneVT() *BeginStreamExecuteRequest { if m == nil { return (*BeginStreamExecuteRequest)(nil) } - r := &BeginStreamExecuteRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query.CloneVT(), - Options: m.Options.CloneVT(), - ReservedId: m.ReservedId, - } + r := new(BeginStreamExecuteRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query.CloneVT() + r.Options = m.Options.CloneVT() + r.ReservedId = m.ReservedId if rhs := m.PreQueries; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1026,13 +1005,12 @@ func (m *BeginStreamExecuteResponse) CloneVT() *BeginStreamExecuteResponse { if m == nil { return (*BeginStreamExecuteResponse)(nil) } - r := &BeginStreamExecuteResponse{ - Error: m.Error.CloneVT(), - Result: m.Result.CloneVT(), - TransactionId: m.TransactionId, - TabletAlias: m.TabletAlias.CloneVT(), - SessionStateChanges: m.SessionStateChanges, - } + r := new(BeginStreamExecuteResponse) + r.Error = m.Error.CloneVT() + r.Result = m.Result.CloneVT() + r.TransactionId = m.TransactionId + r.TabletAlias = m.TabletAlias.CloneVT() + r.SessionStateChanges = m.SessionStateChanges if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1048,12 +1026,11 @@ func (m *MessageStreamRequest) CloneVT() *MessageStreamRequest { if m == nil { return (*MessageStreamRequest)(nil) } - r := &MessageStreamRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Name: m.Name, - } + r := new(MessageStreamRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Name = m.Name if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1069,9 +1046,8 @@ func (m *MessageStreamResponse) CloneVT() *MessageStreamResponse { if m == nil { return (*MessageStreamResponse)(nil) } - r := &MessageStreamResponse{ - Result: m.Result.CloneVT(), - } + r := new(MessageStreamResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1087,12 +1063,11 @@ func (m *MessageAckRequest) CloneVT() *MessageAckRequest { if m == nil { return (*MessageAckRequest)(nil) } - r := &MessageAckRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Name: m.Name, - } + r := new(MessageAckRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Name = m.Name if rhs := m.Ids; rhs != nil { tmpContainer := make([]*Value, len(rhs)) for k, v := range rhs { @@ -1115,9 +1090,8 @@ func (m *MessageAckResponse) CloneVT() *MessageAckResponse { if m == nil { return (*MessageAckResponse)(nil) } - r := &MessageAckResponse{ - Result: m.Result.CloneVT(), - } + r := new(MessageAckResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1133,14 +1107,13 @@ func (m *ReserveExecuteRequest) CloneVT() *ReserveExecuteRequest { if m == nil { return (*ReserveExecuteRequest)(nil) } - r := &ReserveExecuteRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query.CloneVT(), - TransactionId: m.TransactionId, - Options: m.Options.CloneVT(), - } + r := new(ReserveExecuteRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query.CloneVT() + r.TransactionId = m.TransactionId + r.Options = m.Options.CloneVT() if rhs := m.PreQueries; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1161,12 +1134,11 @@ func (m *ReserveExecuteResponse) CloneVT() *ReserveExecuteResponse { if m == nil { return (*ReserveExecuteResponse)(nil) } - r := &ReserveExecuteResponse{ - Error: m.Error.CloneVT(), - Result: m.Result.CloneVT(), - ReservedId: m.ReservedId, - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(ReserveExecuteResponse) + r.Error = m.Error.CloneVT() + r.Result = m.Result.CloneVT() + r.ReservedId = m.ReservedId + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1182,14 +1154,13 @@ func (m *ReserveStreamExecuteRequest) CloneVT() *ReserveStreamExecuteRequest { if m == nil { return (*ReserveStreamExecuteRequest)(nil) } - r := &ReserveStreamExecuteRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query.CloneVT(), - Options: m.Options.CloneVT(), - TransactionId: m.TransactionId, - } + r := new(ReserveStreamExecuteRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query.CloneVT() + r.Options = m.Options.CloneVT() + r.TransactionId = m.TransactionId if rhs := m.PreQueries; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1210,12 +1181,11 @@ func (m *ReserveStreamExecuteResponse) CloneVT() *ReserveStreamExecuteResponse { if m == nil { return (*ReserveStreamExecuteResponse)(nil) } - r := &ReserveStreamExecuteResponse{ - Error: m.Error.CloneVT(), - Result: m.Result.CloneVT(), - ReservedId: m.ReservedId, - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(ReserveStreamExecuteResponse) + r.Error = m.Error.CloneVT() + r.Result = m.Result.CloneVT() + r.ReservedId = m.ReservedId + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1231,13 +1201,12 @@ func (m *ReserveBeginExecuteRequest) CloneVT() *ReserveBeginExecuteRequest { if m == nil { return (*ReserveBeginExecuteRequest)(nil) } - r := &ReserveBeginExecuteRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query.CloneVT(), - Options: m.Options.CloneVT(), - } + r := new(ReserveBeginExecuteRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query.CloneVT() + r.Options = m.Options.CloneVT() if rhs := m.PreQueries; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1263,14 +1232,13 @@ func (m *ReserveBeginExecuteResponse) CloneVT() *ReserveBeginExecuteResponse { if m == nil { return (*ReserveBeginExecuteResponse)(nil) } - r := &ReserveBeginExecuteResponse{ - Error: m.Error.CloneVT(), - Result: m.Result.CloneVT(), - TransactionId: m.TransactionId, - ReservedId: m.ReservedId, - TabletAlias: m.TabletAlias.CloneVT(), - SessionStateChanges: m.SessionStateChanges, - } + r := new(ReserveBeginExecuteResponse) + r.Error = m.Error.CloneVT() + r.Result = m.Result.CloneVT() + r.TransactionId = m.TransactionId + r.ReservedId = m.ReservedId + r.TabletAlias = m.TabletAlias.CloneVT() + r.SessionStateChanges = m.SessionStateChanges if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1286,13 +1254,12 @@ func (m *ReserveBeginStreamExecuteRequest) CloneVT() *ReserveBeginStreamExecuteR if m == nil { return (*ReserveBeginStreamExecuteRequest)(nil) } - r := &ReserveBeginStreamExecuteRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - Query: m.Query.CloneVT(), - Options: m.Options.CloneVT(), - } + r := new(ReserveBeginStreamExecuteRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.Query = m.Query.CloneVT() + r.Options = m.Options.CloneVT() if rhs := m.PreQueries; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1318,14 +1285,13 @@ func (m *ReserveBeginStreamExecuteResponse) CloneVT() *ReserveBeginStreamExecute if m == nil { return (*ReserveBeginStreamExecuteResponse)(nil) } - r := &ReserveBeginStreamExecuteResponse{ - Error: m.Error.CloneVT(), - Result: m.Result.CloneVT(), - TransactionId: m.TransactionId, - ReservedId: m.ReservedId, - TabletAlias: m.TabletAlias.CloneVT(), - SessionStateChanges: m.SessionStateChanges, - } + r := new(ReserveBeginStreamExecuteResponse) + r.Error = m.Error.CloneVT() + r.Result = m.Result.CloneVT() + r.TransactionId = m.TransactionId + r.ReservedId = m.ReservedId + r.TabletAlias = m.TabletAlias.CloneVT() + r.SessionStateChanges = m.SessionStateChanges if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1341,13 +1307,12 @@ func (m *ReleaseRequest) CloneVT() *ReleaseRequest { if m == nil { return (*ReleaseRequest)(nil) } - r := &ReleaseRequest{ - EffectiveCallerId: m.EffectiveCallerId.CloneVT(), - ImmediateCallerId: m.ImmediateCallerId.CloneVT(), - Target: m.Target.CloneVT(), - TransactionId: m.TransactionId, - ReservedId: m.ReservedId, - } + r := new(ReleaseRequest) + r.EffectiveCallerId = m.EffectiveCallerId.CloneVT() + r.ImmediateCallerId = m.ImmediateCallerId.CloneVT() + r.Target = m.Target.CloneVT() + r.TransactionId = m.TransactionId + r.ReservedId = m.ReservedId if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1363,7 +1328,7 @@ func (m *ReleaseResponse) CloneVT() *ReleaseResponse { if m == nil { return (*ReleaseResponse)(nil) } - r := &ReleaseResponse{} + r := new(ReleaseResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1379,7 +1344,7 @@ func (m *StreamHealthRequest) CloneVT() *StreamHealthRequest { if m == nil { return (*StreamHealthRequest)(nil) } - r := &StreamHealthRequest{} + r := new(StreamHealthRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1395,16 +1360,15 @@ func (m *RealtimeStats) CloneVT() *RealtimeStats { if m == nil { return (*RealtimeStats)(nil) } - r := &RealtimeStats{ - HealthError: m.HealthError, - ReplicationLagSeconds: m.ReplicationLagSeconds, - BinlogPlayersCount: m.BinlogPlayersCount, - FilteredReplicationLagSeconds: m.FilteredReplicationLagSeconds, - CpuUsage: m.CpuUsage, - Qps: m.Qps, - UdfsChanged: m.UdfsChanged, - TxUnresolved: m.TxUnresolved, - } + r := new(RealtimeStats) + r.HealthError = m.HealthError + r.ReplicationLagSeconds = m.ReplicationLagSeconds + r.BinlogPlayersCount = m.BinlogPlayersCount + r.FilteredReplicationLagSeconds = m.FilteredReplicationLagSeconds + r.CpuUsage = m.CpuUsage + r.Qps = m.Qps + r.UdfsChanged = m.UdfsChanged + r.TxUnresolved = m.TxUnresolved if rhs := m.TableSchemaChanged; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1430,12 +1394,11 @@ func (m *AggregateStats) CloneVT() *AggregateStats { if m == nil { return (*AggregateStats)(nil) } - r := &AggregateStats{ - HealthyTabletCount: m.HealthyTabletCount, - UnhealthyTabletCount: m.UnhealthyTabletCount, - ReplicationLagSecondsMin: m.ReplicationLagSecondsMin, - ReplicationLagSecondsMax: m.ReplicationLagSecondsMax, - } + r := new(AggregateStats) + r.HealthyTabletCount = m.HealthyTabletCount + r.UnhealthyTabletCount = m.UnhealthyTabletCount + r.ReplicationLagSecondsMin = m.ReplicationLagSecondsMin + r.ReplicationLagSecondsMax = m.ReplicationLagSecondsMax if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1451,13 +1414,12 @@ func (m *StreamHealthResponse) CloneVT() *StreamHealthResponse { if m == nil { return (*StreamHealthResponse)(nil) } - r := &StreamHealthResponse{ - Target: m.Target.CloneVT(), - Serving: m.Serving, - PrimaryTermStartTimestamp: m.PrimaryTermStartTimestamp, - RealtimeStats: m.RealtimeStats.CloneVT(), - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(StreamHealthResponse) + r.Target = m.Target.CloneVT() + r.Serving = m.Serving + r.PrimaryTermStartTimestamp = m.PrimaryTermStartTimestamp + r.RealtimeStats = m.RealtimeStats.CloneVT() + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1473,11 +1435,10 @@ func (m *TransactionMetadata) CloneVT() *TransactionMetadata { if m == nil { return (*TransactionMetadata)(nil) } - r := &TransactionMetadata{ - Dtid: m.Dtid, - State: m.State, - TimeCreated: m.TimeCreated, - } + r := new(TransactionMetadata) + r.Dtid = m.Dtid + r.State = m.State + r.TimeCreated = m.TimeCreated if rhs := m.Participants; rhs != nil { tmpContainer := make([]*Target, len(rhs)) for k, v := range rhs { @@ -1500,10 +1461,9 @@ func (m *GetSchemaRequest) CloneVT() *GetSchemaRequest { if m == nil { return (*GetSchemaRequest)(nil) } - r := &GetSchemaRequest{ - Target: m.Target.CloneVT(), - TableType: m.TableType, - } + r := new(GetSchemaRequest) + r.Target = m.Target.CloneVT() + r.TableType = m.TableType if rhs := m.TableNames; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1524,11 +1484,10 @@ func (m *UDFInfo) CloneVT() *UDFInfo { if m == nil { return (*UDFInfo)(nil) } - r := &UDFInfo{ - Name: m.Name, - Aggregating: m.Aggregating, - ReturnType: m.ReturnType, - } + r := new(UDFInfo) + r.Name = m.Name + r.Aggregating = m.Aggregating + r.ReturnType = m.ReturnType if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1544,7 +1503,7 @@ func (m *GetSchemaResponse) CloneVT() *GetSchemaResponse { if m == nil { return (*GetSchemaResponse)(nil) } - r := &GetSchemaResponse{} + r := new(GetSchemaResponse) if rhs := m.Udfs; rhs != nil { tmpContainer := make([]*UDFInfo, len(rhs)) for k, v := range rhs { @@ -1603,26 +1562,26 @@ func (m *Target) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0x22 } if m.TabletType != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletType)) i-- dAtA[i] = 0x18 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -1663,7 +1622,7 @@ func (m *VTGateCallerID) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Groups) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Groups[iNdEx]) copy(dAtA[i:], m.Groups[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Groups[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Groups[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -1671,7 +1630,7 @@ func (m *VTGateCallerID) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Username) > 0 { i -= len(m.Username) copy(dAtA[i:], m.Username) - i = encodeVarint(dAtA, i, uint64(len(m.Username))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Username))) i-- dAtA[i] = 0xa } @@ -1711,19 +1670,19 @@ func (m *EventToken) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if m.Timestamp != 0 { - i = encodeVarint(dAtA, i, uint64(m.Timestamp)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Timestamp)) i-- dAtA[i] = 0x8 } @@ -1763,12 +1722,12 @@ func (m *Value) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Value) > 0 { i -= len(m.Value) copy(dAtA[i:], m.Value) - i = encodeVarint(dAtA, i, uint64(len(m.Value))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Value))) i-- dAtA[i] = 0x12 } if m.Type != 0 { - i = encodeVarint(dAtA, i, uint64(m.Type)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Type)) i-- dAtA[i] = 0x8 } @@ -1812,7 +1771,7 @@ func (m *BindVariable) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1820,12 +1779,12 @@ func (m *BindVariable) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Value) > 0 { i -= len(m.Value) copy(dAtA[i:], m.Value) - i = encodeVarint(dAtA, i, uint64(len(m.Value))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Value))) i-- dAtA[i] = 0x12 } if m.Type != 0 { - i = encodeVarint(dAtA, i, uint64(m.Type)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Type)) i-- dAtA[i] = 0x8 } @@ -1871,15 +1830,15 @@ func (m *BoundQuery) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -1887,7 +1846,7 @@ func (m *BoundQuery) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Sql) > 0 { i -= len(m.Sql) copy(dAtA[i:], m.Sql) - i = encodeVarint(dAtA, i, uint64(len(m.Sql))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sql))) i-- dAtA[i] = 0xa } @@ -1924,10 +1883,19 @@ func (m *ExecuteOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if vtmsg, ok := m.Timeout.(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + } if len(m.Priority) > 0 { i -= len(m.Priority) copy(dAtA[i:], m.Priority) - i = encodeVarint(dAtA, i, uint64(len(m.Priority))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Priority))) i-- dAtA[i] = 0x1 i-- @@ -1936,14 +1904,14 @@ func (m *ExecuteOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.WorkloadName) > 0 { i -= len(m.WorkloadName) copy(dAtA[i:], m.WorkloadName) - i = encodeVarint(dAtA, i, uint64(len(m.WorkloadName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WorkloadName))) i-- dAtA[i] = 0x7a } if len(m.TransactionAccessMode) > 0 { var pksize2 int for _, num := range m.TransactionAccessMode { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -1957,12 +1925,12 @@ func (m *ExecuteOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x72 } if m.Consolidator != 0 { - i = encodeVarint(dAtA, i, uint64(m.Consolidator)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Consolidator)) i-- dAtA[i] = 0x68 } @@ -1977,7 +1945,7 @@ func (m *ExecuteOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x60 } if m.PlannerVersion != 0 { - i = encodeVarint(dAtA, i, uint64(m.PlannerVersion)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.PlannerVersion)) i-- dAtA[i] = 0x58 } @@ -1992,17 +1960,17 @@ func (m *ExecuteOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x50 } if m.TransactionIsolation != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionIsolation)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionIsolation)) i-- dAtA[i] = 0x48 } if m.SqlSelectLimit != 0 { - i = encodeVarint(dAtA, i, uint64(m.SqlSelectLimit)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SqlSelectLimit)) i-- dAtA[i] = 0x40 } if m.Workload != 0 { - i = encodeVarint(dAtA, i, uint64(m.Workload)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Workload)) i-- dAtA[i] = 0x30 } @@ -2017,13 +1985,27 @@ func (m *ExecuteOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x28 } if m.IncludedFields != 0 { - i = encodeVarint(dAtA, i, uint64(m.IncludedFields)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.IncludedFields)) i-- dAtA[i] = 0x20 } return len(dAtA) - i, nil } +func (m *ExecuteOptions_AuthoritativeTimeout) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ExecuteOptions_AuthoritativeTimeout) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.AuthoritativeTimeout)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x88 + return len(dAtA) - i, nil +} func (m *Field) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -2057,67 +2039,67 @@ func (m *Field) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ColumnType) > 0 { i -= len(m.ColumnType) copy(dAtA[i:], m.ColumnType) - i = encodeVarint(dAtA, i, uint64(len(m.ColumnType))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ColumnType))) i-- dAtA[i] = 0x5a } if m.Flags != 0 { - i = encodeVarint(dAtA, i, uint64(m.Flags)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Flags)) i-- dAtA[i] = 0x50 } if m.Decimals != 0 { - i = encodeVarint(dAtA, i, uint64(m.Decimals)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Decimals)) i-- dAtA[i] = 0x48 } if m.Charset != 0 { - i = encodeVarint(dAtA, i, uint64(m.Charset)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Charset)) i-- dAtA[i] = 0x40 } if m.ColumnLength != 0 { - i = encodeVarint(dAtA, i, uint64(m.ColumnLength)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ColumnLength)) i-- dAtA[i] = 0x38 } if len(m.OrgName) > 0 { i -= len(m.OrgName) copy(dAtA[i:], m.OrgName) - i = encodeVarint(dAtA, i, uint64(len(m.OrgName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.OrgName))) i-- dAtA[i] = 0x32 } if len(m.Database) > 0 { i -= len(m.Database) copy(dAtA[i:], m.Database) - i = encodeVarint(dAtA, i, uint64(len(m.Database))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Database))) i-- dAtA[i] = 0x2a } if len(m.OrgTable) > 0 { i -= len(m.OrgTable) copy(dAtA[i:], m.OrgTable) - i = encodeVarint(dAtA, i, uint64(len(m.OrgTable))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.OrgTable))) i-- dAtA[i] = 0x22 } if len(m.Table) > 0 { i -= len(m.Table) copy(dAtA[i:], m.Table) - i = encodeVarint(dAtA, i, uint64(len(m.Table))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Table))) i-- dAtA[i] = 0x1a } if m.Type != 0 { - i = encodeVarint(dAtA, i, uint64(m.Type)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Type)) i-- dAtA[i] = 0x10 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -2157,14 +2139,14 @@ func (m *Row) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Values) > 0 { i -= len(m.Values) copy(dAtA[i:], m.Values) - i = encodeVarint(dAtA, i, uint64(len(m.Values))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Values))) i-- dAtA[i] = 0x12 } if len(m.Lengths) > 0 { var pksize2 int for _, num := range m.Lengths { - pksize2 += soz(uint64(num)) + pksize2 += protohelpers.SizeOfZigzag(uint64(num)) } i -= pksize2 j1 := i @@ -2178,7 +2160,7 @@ func (m *Row) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[j1] = uint8(x3) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0xa } @@ -2218,14 +2200,14 @@ func (m *QueryResult) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.SessionStateChanges) > 0 { i -= len(m.SessionStateChanges) copy(dAtA[i:], m.SessionStateChanges) - i = encodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) i-- dAtA[i] = 0x3a } if len(m.Info) > 0 { i -= len(m.Info) copy(dAtA[i:], m.Info) - i = encodeVarint(dAtA, i, uint64(len(m.Info))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Info))) i-- dAtA[i] = 0x32 } @@ -2236,18 +2218,18 @@ func (m *QueryResult) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } } if m.InsertId != 0 { - i = encodeVarint(dAtA, i, uint64(m.InsertId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.InsertId)) i-- dAtA[i] = 0x18 } if m.RowsAffected != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowsAffected)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowsAffected)) i-- dAtA[i] = 0x10 } @@ -2258,7 +2240,7 @@ func (m *QueryResult) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2299,12 +2281,12 @@ func (m *QueryWarning) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Message) > 0 { i -= len(m.Message) copy(dAtA[i:], m.Message) - i = encodeVarint(dAtA, i, uint64(len(m.Message))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Message))) i-- dAtA[i] = 0x12 } if m.Code != 0 { - i = encodeVarint(dAtA, i, uint64(m.Code)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Code)) i-- dAtA[i] = 0x8 } @@ -2344,7 +2326,7 @@ func (m *StreamEvent_Statement) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Sql) > 0 { i -= len(m.Sql) copy(dAtA[i:], m.Sql) - i = encodeVarint(dAtA, i, uint64(len(m.Sql))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sql))) i-- dAtA[i] = 0x2a } @@ -2355,7 +2337,7 @@ func (m *StreamEvent_Statement) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -2367,7 +2349,7 @@ func (m *StreamEvent_Statement) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -2375,12 +2357,12 @@ func (m *StreamEvent_Statement) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.TableName) > 0 { i -= len(m.TableName) copy(dAtA[i:], m.TableName) - i = encodeVarint(dAtA, i, uint64(len(m.TableName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableName))) i-- dAtA[i] = 0x12 } if m.Category != 0 { - i = encodeVarint(dAtA, i, uint64(m.Category)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Category)) i-- dAtA[i] = 0x8 } @@ -2423,7 +2405,7 @@ func (m *StreamEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2434,7 +2416,7 @@ func (m *StreamEvent) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2473,7 +2455,7 @@ func (m *ExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x38 } @@ -2483,12 +2465,12 @@ func (m *ExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x28 } @@ -2498,7 +2480,7 @@ func (m *ExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -2508,7 +2490,7 @@ func (m *ExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -2518,7 +2500,7 @@ func (m *ExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2528,7 +2510,7 @@ func (m *ExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2571,7 +2553,7 @@ func (m *ExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2614,7 +2596,7 @@ func (m *ResultWithError) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2624,7 +2606,7 @@ func (m *ResultWithError) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2662,12 +2644,12 @@ func (m *StreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) copy(dAtA[i:], m.unknownFields) } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x38 } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x30 } @@ -2677,7 +2659,7 @@ func (m *StreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -2687,7 +2669,7 @@ func (m *StreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -2697,7 +2679,7 @@ func (m *StreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -2707,7 +2689,7 @@ func (m *StreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2717,7 +2699,7 @@ func (m *StreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2760,7 +2742,7 @@ func (m *StreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2803,7 +2785,7 @@ func (m *BeginRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -2813,7 +2795,7 @@ func (m *BeginRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -2823,7 +2805,7 @@ func (m *BeginRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2833,7 +2815,7 @@ func (m *BeginRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2873,7 +2855,7 @@ func (m *BeginResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.SessionStateChanges) > 0 { i -= len(m.SessionStateChanges) copy(dAtA[i:], m.SessionStateChanges) - i = encodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) i-- dAtA[i] = 0x1a } @@ -2883,12 +2865,12 @@ func (m *BeginResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x8 } @@ -2926,7 +2908,7 @@ func (m *CommitRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x20 } @@ -2936,7 +2918,7 @@ func (m *CommitRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -2946,7 +2928,7 @@ func (m *CommitRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2956,7 +2938,7 @@ func (m *CommitRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2994,7 +2976,7 @@ func (m *CommitResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x8 } @@ -3032,7 +3014,7 @@ func (m *RollbackRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x20 } @@ -3042,7 +3024,7 @@ func (m *RollbackRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3052,7 +3034,7 @@ func (m *RollbackRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3062,7 +3044,7 @@ func (m *RollbackRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3100,7 +3082,7 @@ func (m *RollbackResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x8 } @@ -3140,12 +3122,12 @@ func (m *PrepareRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x2a } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x20 } @@ -3155,7 +3137,7 @@ func (m *PrepareRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3165,7 +3147,7 @@ func (m *PrepareRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3175,7 +3157,7 @@ func (m *PrepareRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3248,7 +3230,7 @@ func (m *CommitPreparedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x22 } @@ -3258,7 +3240,7 @@ func (m *CommitPreparedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3268,7 +3250,7 @@ func (m *CommitPreparedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3278,7 +3260,7 @@ func (m *CommitPreparedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3351,12 +3333,12 @@ func (m *RollbackPreparedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x2a } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x20 } @@ -3366,7 +3348,7 @@ func (m *RollbackPreparedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3376,7 +3358,7 @@ func (m *RollbackPreparedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3386,7 +3368,7 @@ func (m *RollbackPreparedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3463,7 +3445,7 @@ func (m *CreateTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -3471,7 +3453,7 @@ func (m *CreateTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x22 } @@ -3481,7 +3463,7 @@ func (m *CreateTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3491,7 +3473,7 @@ func (m *CreateTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3501,7 +3483,7 @@ func (m *CreateTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3574,12 +3556,12 @@ func (m *StartCommitRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x2a } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x20 } @@ -3589,7 +3571,7 @@ func (m *StartCommitRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3599,7 +3581,7 @@ func (m *StartCommitRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3609,7 +3591,7 @@ func (m *StartCommitRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3682,12 +3664,12 @@ func (m *SetRollbackRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x2a } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x20 } @@ -3697,7 +3679,7 @@ func (m *SetRollbackRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3707,7 +3689,7 @@ func (m *SetRollbackRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3717,7 +3699,7 @@ func (m *SetRollbackRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3790,7 +3772,7 @@ func (m *ConcludeTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x22 } @@ -3800,7 +3782,7 @@ func (m *ConcludeTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3810,7 +3792,7 @@ func (m *ConcludeTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3820,7 +3802,7 @@ func (m *ConcludeTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3893,7 +3875,7 @@ func (m *ReadTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x22 } @@ -3903,7 +3885,7 @@ func (m *ReadTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3913,7 +3895,7 @@ func (m *ReadTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3923,7 +3905,7 @@ func (m *ReadTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3966,7 +3948,7 @@ func (m *ReadTransactionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4003,13 +3985,18 @@ func (m *UnresolvedTransactionsRequest) MarshalToSizedBufferVT(dAtA []byte) (int i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.AbandonAge != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.AbandonAge)) + i-- + dAtA[i] = 0x20 + } if m.Target != nil { size, err := m.Target.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -4019,7 +4006,7 @@ func (m *UnresolvedTransactionsRequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4029,7 +4016,7 @@ func (m *UnresolvedTransactionsRequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4073,7 +4060,7 @@ func (m *UnresolvedTransactionsResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4115,13 +4102,13 @@ func (m *BeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.PreQueries) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.PreQueries[iNdEx]) copy(dAtA[i:], m.PreQueries[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) i-- dAtA[i] = 0x3a } } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x30 } @@ -4131,7 +4118,7 @@ func (m *BeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -4141,7 +4128,7 @@ func (m *BeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -4151,7 +4138,7 @@ func (m *BeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -4161,7 +4148,7 @@ func (m *BeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4171,7 +4158,7 @@ func (m *BeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4211,7 +4198,7 @@ func (m *BeginExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.SessionStateChanges) > 0 { i -= len(m.SessionStateChanges) copy(dAtA[i:], m.SessionStateChanges) - i = encodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) i-- dAtA[i] = 0x2a } @@ -4221,12 +4208,12 @@ func (m *BeginExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x18 } @@ -4236,7 +4223,7 @@ func (m *BeginExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4246,7 +4233,7 @@ func (m *BeginExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4284,7 +4271,7 @@ func (m *BeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er copy(dAtA[i:], m.unknownFields) } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x38 } @@ -4292,7 +4279,7 @@ func (m *BeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er for iNdEx := len(m.PreQueries) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.PreQueries[iNdEx]) copy(dAtA[i:], m.PreQueries[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) i-- dAtA[i] = 0x32 } @@ -4303,7 +4290,7 @@ func (m *BeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -4313,7 +4300,7 @@ func (m *BeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -4323,7 +4310,7 @@ func (m *BeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -4333,7 +4320,7 @@ func (m *BeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4343,7 +4330,7 @@ func (m *BeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4383,7 +4370,7 @@ func (m *BeginStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e if len(m.SessionStateChanges) > 0 { i -= len(m.SessionStateChanges) copy(dAtA[i:], m.SessionStateChanges) - i = encodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) i-- dAtA[i] = 0x2a } @@ -4393,12 +4380,12 @@ func (m *BeginStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x18 } @@ -4408,7 +4395,7 @@ func (m *BeginStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4418,7 +4405,7 @@ func (m *BeginStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4458,7 +4445,7 @@ func (m *MessageStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x22 } @@ -4468,7 +4455,7 @@ func (m *MessageStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -4478,7 +4465,7 @@ func (m *MessageStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4488,7 +4475,7 @@ func (m *MessageStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4531,7 +4518,7 @@ func (m *MessageStreamResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4575,7 +4562,7 @@ func (m *MessageAckRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -4583,7 +4570,7 @@ func (m *MessageAckRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x22 } @@ -4593,7 +4580,7 @@ func (m *MessageAckRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -4603,7 +4590,7 @@ func (m *MessageAckRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4613,7 +4600,7 @@ func (m *MessageAckRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4656,7 +4643,7 @@ func (m *MessageAckResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4697,7 +4684,7 @@ func (m *ReserveExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.PreQueries) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.PreQueries[iNdEx]) copy(dAtA[i:], m.PreQueries[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) i-- dAtA[i] = 0x3a } @@ -4708,12 +4695,12 @@ func (m *ReserveExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x28 } @@ -4723,7 +4710,7 @@ func (m *ReserveExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -4733,7 +4720,7 @@ func (m *ReserveExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -4743,7 +4730,7 @@ func (m *ReserveExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4753,7 +4740,7 @@ func (m *ReserveExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4796,12 +4783,12 @@ func (m *ReserveExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x18 } @@ -4811,7 +4798,7 @@ func (m *ReserveExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4821,7 +4808,7 @@ func (m *ReserveExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4862,13 +4849,13 @@ func (m *ReserveStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.PreQueries) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.PreQueries[iNdEx]) copy(dAtA[i:], m.PreQueries[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) i-- dAtA[i] = 0x3a } } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x30 } @@ -4878,7 +4865,7 @@ func (m *ReserveStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -4888,7 +4875,7 @@ func (m *ReserveStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -4898,7 +4885,7 @@ func (m *ReserveStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -4908,7 +4895,7 @@ func (m *ReserveStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4918,7 +4905,7 @@ func (m *ReserveStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4961,12 +4948,12 @@ func (m *ReserveStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x18 } @@ -4976,7 +4963,7 @@ func (m *ReserveStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4986,7 +4973,7 @@ func (m *ReserveStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5027,7 +5014,7 @@ func (m *ReserveBeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.PostBeginQueries) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.PostBeginQueries[iNdEx]) copy(dAtA[i:], m.PostBeginQueries[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.PostBeginQueries[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PostBeginQueries[iNdEx]))) i-- dAtA[i] = 0x3a } @@ -5036,7 +5023,7 @@ func (m *ReserveBeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.PreQueries) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.PreQueries[iNdEx]) copy(dAtA[i:], m.PreQueries[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) i-- dAtA[i] = 0x32 } @@ -5047,7 +5034,7 @@ func (m *ReserveBeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -5057,7 +5044,7 @@ func (m *ReserveBeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -5067,7 +5054,7 @@ func (m *ReserveBeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -5077,7 +5064,7 @@ func (m *ReserveBeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -5087,7 +5074,7 @@ func (m *ReserveBeginExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5127,7 +5114,7 @@ func (m *ReserveBeginExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.SessionStateChanges) > 0 { i -= len(m.SessionStateChanges) copy(dAtA[i:], m.SessionStateChanges) - i = encodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) i-- dAtA[i] = 0x32 } @@ -5137,17 +5124,17 @@ func (m *ReserveBeginExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x20 } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x18 } @@ -5157,7 +5144,7 @@ func (m *ReserveBeginExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -5167,7 +5154,7 @@ func (m *ReserveBeginExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5208,7 +5195,7 @@ func (m *ReserveBeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) ( for iNdEx := len(m.PostBeginQueries) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.PostBeginQueries[iNdEx]) copy(dAtA[i:], m.PostBeginQueries[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.PostBeginQueries[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PostBeginQueries[iNdEx]))) i-- dAtA[i] = 0x3a } @@ -5217,7 +5204,7 @@ func (m *ReserveBeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) ( for iNdEx := len(m.PreQueries) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.PreQueries[iNdEx]) copy(dAtA[i:], m.PreQueries[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PreQueries[iNdEx]))) i-- dAtA[i] = 0x32 } @@ -5228,7 +5215,7 @@ func (m *ReserveBeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -5238,7 +5225,7 @@ func (m *ReserveBeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -5248,7 +5235,7 @@ func (m *ReserveBeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -5258,7 +5245,7 @@ func (m *ReserveBeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -5268,7 +5255,7 @@ func (m *ReserveBeginStreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5308,7 +5295,7 @@ func (m *ReserveBeginStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) if len(m.SessionStateChanges) > 0 { i -= len(m.SessionStateChanges) copy(dAtA[i:], m.SessionStateChanges) - i = encodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SessionStateChanges))) i-- dAtA[i] = 0x32 } @@ -5318,17 +5305,17 @@ func (m *ReserveBeginStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x20 } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x18 } @@ -5338,7 +5325,7 @@ func (m *ReserveBeginStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -5348,7 +5335,7 @@ func (m *ReserveBeginStreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5386,12 +5373,12 @@ func (m *ReleaseRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x28 } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x20 } @@ -5401,7 +5388,7 @@ func (m *ReleaseRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -5411,7 +5398,7 @@ func (m *ReleaseRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -5421,7 +5408,7 @@ func (m *ReleaseRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5548,7 +5535,7 @@ func (m *RealtimeStats) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ViewSchemaChanged) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ViewSchemaChanged[iNdEx]) copy(dAtA[i:], m.ViewSchemaChanged[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ViewSchemaChanged[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ViewSchemaChanged[iNdEx]))) i-- dAtA[i] = 0x42 } @@ -5557,7 +5544,7 @@ func (m *RealtimeStats) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.TableSchemaChanged) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.TableSchemaChanged[iNdEx]) copy(dAtA[i:], m.TableSchemaChanged[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.TableSchemaChanged[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableSchemaChanged[iNdEx]))) i-- dAtA[i] = 0x3a } @@ -5575,24 +5562,24 @@ func (m *RealtimeStats) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x29 } if m.FilteredReplicationLagSeconds != 0 { - i = encodeVarint(dAtA, i, uint64(m.FilteredReplicationLagSeconds)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.FilteredReplicationLagSeconds)) i-- dAtA[i] = 0x20 } if m.BinlogPlayersCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.BinlogPlayersCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.BinlogPlayersCount)) i-- dAtA[i] = 0x18 } if m.ReplicationLagSeconds != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReplicationLagSeconds)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReplicationLagSeconds)) i-- dAtA[i] = 0x10 } if len(m.HealthError) > 0 { i -= len(m.HealthError) copy(dAtA[i:], m.HealthError) - i = encodeVarint(dAtA, i, uint64(len(m.HealthError))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.HealthError))) i-- dAtA[i] = 0xa } @@ -5630,22 +5617,22 @@ func (m *AggregateStats) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.ReplicationLagSecondsMax != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReplicationLagSecondsMax)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReplicationLagSecondsMax)) i-- dAtA[i] = 0x20 } if m.ReplicationLagSecondsMin != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReplicationLagSecondsMin)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReplicationLagSecondsMin)) i-- dAtA[i] = 0x18 } if m.UnhealthyTabletCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.UnhealthyTabletCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.UnhealthyTabletCount)) i-- dAtA[i] = 0x10 } if m.HealthyTabletCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.HealthyTabletCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.HealthyTabletCount)) i-- dAtA[i] = 0x8 } @@ -5688,7 +5675,7 @@ func (m *StreamHealthResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -5698,12 +5685,12 @@ func (m *StreamHealthResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if m.PrimaryTermStartTimestamp != 0 { - i = encodeVarint(dAtA, i, uint64(m.PrimaryTermStartTimestamp)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.PrimaryTermStartTimestamp)) i-- dAtA[i] = 0x18 } @@ -5723,7 +5710,7 @@ func (m *StreamHealthResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5767,25 +5754,25 @@ func (m *TransactionMetadata) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } } if m.TimeCreated != 0 { - i = encodeVarint(dAtA, i, uint64(m.TimeCreated)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TimeCreated)) i-- dAtA[i] = 0x18 } if m.State != 0 { - i = encodeVarint(dAtA, i, uint64(m.State)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.State)) i-- dAtA[i] = 0x10 } if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0xa } @@ -5826,13 +5813,13 @@ func (m *GetSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.TableNames) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.TableNames[iNdEx]) copy(dAtA[i:], m.TableNames[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.TableNames[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableNames[iNdEx]))) i-- dAtA[i] = 0x1a } } if m.TableType != 0 { - i = encodeVarint(dAtA, i, uint64(m.TableType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TableType)) i-- dAtA[i] = 0x10 } @@ -5842,7 +5829,7 @@ func (m *GetSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5880,7 +5867,7 @@ func (m *UDFInfo) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.ReturnType != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReturnType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReturnType)) i-- dAtA[i] = 0x18 } @@ -5897,7 +5884,7 @@ func (m *UDFInfo) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -5940,15 +5927,15 @@ func (m *GetSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -5960,7 +5947,7 @@ func (m *GetSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5968,18 +5955,6 @@ func (m *GetSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} - var vtprotoPool_Row = sync.Pool{ New: func() interface{} { return &Row{} @@ -5987,11 +5962,13 @@ var vtprotoPool_Row = sync.Pool{ } func (m *Row) ResetVT() { - f0 := m.Lengths[:0] - f1 := m.Values[:0] - m.Reset() - m.Lengths = f0 - m.Values = f1 + if m != nil { + f0 := m.Lengths[:0] + f1 := m.Values[:0] + m.Reset() + m.Lengths = f0 + m.Values = f1 + } } func (m *Row) ReturnToVTPool() { if m != nil { @@ -6010,18 +5987,18 @@ func (m *Target) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletType != 0 { - n += 1 + sov(uint64(m.TabletType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletType)) } l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6035,12 +6012,12 @@ func (m *VTGateCallerID) SizeVT() (n int) { _ = l l = len(m.Username) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Groups) > 0 { for _, s := range m.Groups { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -6054,15 +6031,15 @@ func (m *EventToken) SizeVT() (n int) { var l int _ = l if m.Timestamp != 0 { - n += 1 + sov(uint64(m.Timestamp)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Timestamp)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6075,11 +6052,11 @@ func (m *Value) SizeVT() (n int) { var l int _ = l if m.Type != 0 { - n += 1 + sov(uint64(m.Type)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Type)) } l = len(m.Value) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6092,16 +6069,16 @@ func (m *BindVariable) SizeVT() (n int) { var l int _ = l if m.Type != 0 { - n += 1 + sov(uint64(m.Type)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Type)) } l = len(m.Value) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Values) > 0 { for _, e := range m.Values { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -6116,7 +6093,7 @@ func (m *BoundQuery) SizeVT() (n int) { _ = l l = len(m.Sql) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.BindVariables) > 0 { for k, v := range m.BindVariables { @@ -6126,9 +6103,9 @@ func (m *BoundQuery) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -6142,51 +6119,63 @@ func (m *ExecuteOptions) SizeVT() (n int) { var l int _ = l if m.IncludedFields != 0 { - n += 1 + sov(uint64(m.IncludedFields)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.IncludedFields)) } if m.ClientFoundRows { n += 2 } if m.Workload != 0 { - n += 1 + sov(uint64(m.Workload)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Workload)) } if m.SqlSelectLimit != 0 { - n += 1 + sov(uint64(m.SqlSelectLimit)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.SqlSelectLimit)) } if m.TransactionIsolation != 0 { - n += 1 + sov(uint64(m.TransactionIsolation)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionIsolation)) } if m.SkipQueryPlanCache { n += 2 } if m.PlannerVersion != 0 { - n += 1 + sov(uint64(m.PlannerVersion)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.PlannerVersion)) } if m.HasCreatedTempTables { n += 2 } if m.Consolidator != 0 { - n += 1 + sov(uint64(m.Consolidator)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Consolidator)) } if len(m.TransactionAccessMode) > 0 { l = 0 for _, e := range m.TransactionAccessMode { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } l = len(m.WorkloadName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Priority) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if vtmsg, ok := m.Timeout.(interface{ SizeVT() int }); ok { + n += vtmsg.SizeVT() } n += len(m.unknownFields) return n } +func (m *ExecuteOptions_AuthoritativeTimeout) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + protohelpers.SizeOfVarint(uint64(m.AuthoritativeTimeout)) + return n +} func (m *Field) SizeVT() (n int) { if m == nil { return 0 @@ -6195,42 +6184,42 @@ func (m *Field) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Type != 0 { - n += 1 + sov(uint64(m.Type)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Type)) } l = len(m.Table) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.OrgTable) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Database) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.OrgName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ColumnLength != 0 { - n += 1 + sov(uint64(m.ColumnLength)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ColumnLength)) } if m.Charset != 0 { - n += 1 + sov(uint64(m.Charset)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Charset)) } if m.Decimals != 0 { - n += 1 + sov(uint64(m.Decimals)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Decimals)) } if m.Flags != 0 { - n += 1 + sov(uint64(m.Flags)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Flags)) } l = len(m.ColumnType) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6245,13 +6234,13 @@ func (m *Row) SizeVT() (n int) { if len(m.Lengths) > 0 { l = 0 for _, e := range m.Lengths { - l += soz(uint64(e)) + l += protohelpers.SizeOfZigzag(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } l = len(m.Values) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6266,28 +6255,28 @@ func (m *QueryResult) SizeVT() (n int) { if len(m.Fields) > 0 { for _, e := range m.Fields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.RowsAffected != 0 { - n += 1 + sov(uint64(m.RowsAffected)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowsAffected)) } if m.InsertId != 0 { - n += 1 + sov(uint64(m.InsertId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.InsertId)) } if len(m.Rows) > 0 { for _, e := range m.Rows { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.Info) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SessionStateChanges) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6300,11 +6289,11 @@ func (m *QueryWarning) SizeVT() (n int) { var l int _ = l if m.Code != 0 { - n += 1 + sov(uint64(m.Code)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Code)) } l = len(m.Message) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6317,27 +6306,27 @@ func (m *StreamEvent_Statement) SizeVT() (n int) { var l int _ = l if m.Category != 0 { - n += 1 + sov(uint64(m.Category)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Category)) } l = len(m.TableName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.PrimaryKeyFields) > 0 { for _, e := range m.PrimaryKeyFields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.PrimaryKeyValues) > 0 { for _, e := range m.PrimaryKeyValues { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.Sql) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6352,12 +6341,12 @@ func (m *StreamEvent) SizeVT() (n int) { if len(m.Statements) > 0 { for _, e := range m.Statements { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.EventToken != nil { l = m.EventToken.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6371,29 +6360,29 @@ func (m *ExecuteRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } n += len(m.unknownFields) return n @@ -6407,7 +6396,7 @@ func (m *ExecuteResponse) SizeVT() (n int) { _ = l if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6421,11 +6410,11 @@ func (m *ResultWithError) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6439,29 +6428,29 @@ func (m *StreamExecuteRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } n += len(m.unknownFields) return n @@ -6475,7 +6464,7 @@ func (m *StreamExecuteResponse) SizeVT() (n int) { _ = l if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6489,19 +6478,19 @@ func (m *BeginRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6514,15 +6503,15 @@ func (m *BeginResponse) SizeVT() (n int) { var l int _ = l if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SessionStateChanges) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6536,18 +6525,18 @@ func (m *CommitRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } n += len(m.unknownFields) return n @@ -6560,7 +6549,7 @@ func (m *CommitResponse) SizeVT() (n int) { var l int _ = l if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } n += len(m.unknownFields) return n @@ -6574,18 +6563,18 @@ func (m *RollbackRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } n += len(m.unknownFields) return n @@ -6598,7 +6587,7 @@ func (m *RollbackResponse) SizeVT() (n int) { var l int _ = l if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } n += len(m.unknownFields) return n @@ -6612,22 +6601,22 @@ func (m *PrepareRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6651,19 +6640,19 @@ func (m *CommitPreparedRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6687,22 +6676,22 @@ func (m *RollbackPreparedRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6726,24 +6715,24 @@ func (m *CreateTransactionRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Participants) > 0 { for _, e := range m.Participants { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -6768,22 +6757,22 @@ func (m *StartCommitRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6807,22 +6796,22 @@ func (m *SetRollbackRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6846,19 +6835,19 @@ func (m *ConcludeTransactionRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6882,19 +6871,19 @@ func (m *ReadTransactionRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6908,7 +6897,7 @@ func (m *ReadTransactionResponse) SizeVT() (n int) { _ = l if m.Metadata != nil { l = m.Metadata.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -6922,15 +6911,18 @@ func (m *UnresolvedTransactionsRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.AbandonAge != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.AbandonAge)) } n += len(m.unknownFields) return n @@ -6945,7 +6937,7 @@ func (m *UnresolvedTransactionsResponse) SizeVT() (n int) { if len(m.Transactions) > 0 { for _, e := range m.Transactions { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -6960,31 +6952,31 @@ func (m *BeginExecuteRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } if len(m.PreQueries) > 0 { for _, s := range m.PreQueries { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -6999,22 +6991,22 @@ func (m *BeginExecuteResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SessionStateChanges) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7028,32 +7020,32 @@ func (m *BeginStreamExecuteRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.PreQueries) > 0 { for _, s := range m.PreQueries { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } n += len(m.unknownFields) return n @@ -7067,22 +7059,22 @@ func (m *BeginStreamExecuteResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SessionStateChanges) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7096,19 +7088,19 @@ func (m *MessageStreamRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7122,7 +7114,7 @@ func (m *MessageStreamResponse) SizeVT() (n int) { _ = l if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7136,24 +7128,24 @@ func (m *MessageAckRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Ids) > 0 { for _, e := range m.Ids { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -7168,7 +7160,7 @@ func (m *MessageAckResponse) SizeVT() (n int) { _ = l if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7182,31 +7174,31 @@ func (m *ReserveExecuteRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.PreQueries) > 0 { for _, s := range m.PreQueries { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -7221,18 +7213,18 @@ func (m *ReserveExecuteResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7246,31 +7238,31 @@ func (m *ReserveStreamExecuteRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if len(m.PreQueries) > 0 { for _, s := range m.PreQueries { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -7285,18 +7277,18 @@ func (m *ReserveStreamExecuteResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7310,34 +7302,34 @@ func (m *ReserveBeginExecuteRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.PreQueries) > 0 { for _, s := range m.PreQueries { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.PostBeginQueries) > 0 { for _, s := range m.PostBeginQueries { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -7352,25 +7344,25 @@ func (m *ReserveBeginExecuteResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SessionStateChanges) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7384,34 +7376,34 @@ func (m *ReserveBeginStreamExecuteRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.PreQueries) > 0 { for _, s := range m.PreQueries { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.PostBeginQueries) > 0 { for _, s := range m.PostBeginQueries { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -7426,25 +7418,25 @@ func (m *ReserveBeginStreamExecuteResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SessionStateChanges) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7458,21 +7450,21 @@ func (m *ReleaseRequest) SizeVT() (n int) { _ = l if m.EffectiveCallerId != nil { l = m.EffectiveCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ImmediateCallerId != nil { l = m.ImmediateCallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } n += len(m.unknownFields) return n @@ -7506,16 +7498,16 @@ func (m *RealtimeStats) SizeVT() (n int) { _ = l l = len(m.HealthError) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReplicationLagSeconds != 0 { - n += 1 + sov(uint64(m.ReplicationLagSeconds)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReplicationLagSeconds)) } if m.BinlogPlayersCount != 0 { - n += 1 + sov(uint64(m.BinlogPlayersCount)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.BinlogPlayersCount)) } if m.FilteredReplicationLagSeconds != 0 { - n += 1 + sov(uint64(m.FilteredReplicationLagSeconds)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.FilteredReplicationLagSeconds)) } if m.CpuUsage != 0 { n += 9 @@ -7526,13 +7518,13 @@ func (m *RealtimeStats) SizeVT() (n int) { if len(m.TableSchemaChanged) > 0 { for _, s := range m.TableSchemaChanged { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ViewSchemaChanged) > 0 { for _, s := range m.ViewSchemaChanged { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.UdfsChanged { @@ -7552,16 +7544,16 @@ func (m *AggregateStats) SizeVT() (n int) { var l int _ = l if m.HealthyTabletCount != 0 { - n += 1 + sov(uint64(m.HealthyTabletCount)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.HealthyTabletCount)) } if m.UnhealthyTabletCount != 0 { - n += 1 + sov(uint64(m.UnhealthyTabletCount)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.UnhealthyTabletCount)) } if m.ReplicationLagSecondsMin != 0 { - n += 1 + sov(uint64(m.ReplicationLagSecondsMin)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReplicationLagSecondsMin)) } if m.ReplicationLagSecondsMax != 0 { - n += 1 + sov(uint64(m.ReplicationLagSecondsMax)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReplicationLagSecondsMax)) } n += len(m.unknownFields) return n @@ -7575,21 +7567,21 @@ func (m *StreamHealthResponse) SizeVT() (n int) { _ = l if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Serving { n += 2 } if m.PrimaryTermStartTimestamp != 0 { - n += 1 + sov(uint64(m.PrimaryTermStartTimestamp)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.PrimaryTermStartTimestamp)) } if m.RealtimeStats != nil { l = m.RealtimeStats.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -7603,18 +7595,18 @@ func (m *TransactionMetadata) SizeVT() (n int) { _ = l l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.State != 0 { - n += 1 + sov(uint64(m.State)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.State)) } if m.TimeCreated != 0 { - n += 1 + sov(uint64(m.TimeCreated)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TimeCreated)) } if len(m.Participants) > 0 { for _, e := range m.Participants { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -7629,15 +7621,15 @@ func (m *GetSchemaRequest) SizeVT() (n int) { _ = l if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TableType != 0 { - n += 1 + sov(uint64(m.TableType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TableType)) } if len(m.TableNames) > 0 { for _, s := range m.TableNames { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -7652,13 +7644,13 @@ func (m *UDFInfo) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Aggregating { n += 2 } if m.ReturnType != 0 { - n += 1 + sov(uint64(m.ReturnType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReturnType)) } n += len(m.unknownFields) return n @@ -7673,27 +7665,21 @@ func (m *GetSchemaResponse) SizeVT() (n int) { if len(m.Udfs) > 0 { for _, e := range m.Udfs { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TableDefinition) > 0 { for k, v := range m.TableDefinition { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *Target) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -7702,7 +7688,7 @@ func (m *Target) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7730,7 +7716,7 @@ func (m *Target) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7744,11 +7730,11 @@ func (m *Target) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7762,7 +7748,7 @@ func (m *Target) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7776,11 +7762,11 @@ func (m *Target) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7794,7 +7780,7 @@ func (m *Target) UnmarshalVT(dAtA []byte) error { m.TabletType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7813,7 +7799,7 @@ func (m *Target) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7827,11 +7813,11 @@ func (m *Target) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7840,12 +7826,12 @@ func (m *Target) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -7868,7 +7854,7 @@ func (m *VTGateCallerID) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7896,7 +7882,7 @@ func (m *VTGateCallerID) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7910,11 +7896,11 @@ func (m *VTGateCallerID) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7928,7 +7914,7 @@ func (m *VTGateCallerID) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -7942,11 +7928,11 @@ func (m *VTGateCallerID) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -7955,12 +7941,12 @@ func (m *VTGateCallerID) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -7983,7 +7969,7 @@ func (m *EventToken) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8011,7 +7997,7 @@ func (m *EventToken) UnmarshalVT(dAtA []byte) error { m.Timestamp = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8030,7 +8016,7 @@ func (m *EventToken) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8044,11 +8030,11 @@ func (m *EventToken) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8062,7 +8048,7 @@ func (m *EventToken) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8076,11 +8062,11 @@ func (m *EventToken) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8089,12 +8075,12 @@ func (m *EventToken) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8117,7 +8103,7 @@ func (m *Value) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8145,7 +8131,7 @@ func (m *Value) UnmarshalVT(dAtA []byte) error { m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8164,7 +8150,7 @@ func (m *Value) UnmarshalVT(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8177,11 +8163,11 @@ func (m *Value) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8193,12 +8179,12 @@ func (m *Value) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8221,7 +8207,7 @@ func (m *BindVariable) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8249,7 +8235,7 @@ func (m *BindVariable) UnmarshalVT(dAtA []byte) error { m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8268,7 +8254,7 @@ func (m *BindVariable) UnmarshalVT(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8281,11 +8267,11 @@ func (m *BindVariable) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8302,7 +8288,7 @@ func (m *BindVariable) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8315,11 +8301,11 @@ func (m *BindVariable) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8331,12 +8317,12 @@ func (m *BindVariable) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8359,7 +8345,7 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8387,7 +8373,7 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8401,11 +8387,11 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8419,7 +8405,7 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8432,11 +8418,11 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8451,7 +8437,7 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8468,7 +8454,7 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8482,11 +8468,11 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -8497,7 +8483,7 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8510,11 +8496,11 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -8526,12 +8512,12 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -8543,12 +8529,12 @@ func (m *BoundQuery) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8571,7 +8557,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8599,7 +8585,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { m.IncludedFields = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8618,7 +8604,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8638,7 +8624,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { m.Workload = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8657,7 +8643,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { m.SqlSelectLimit = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8676,7 +8662,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { m.TransactionIsolation = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8695,7 +8681,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8715,7 +8701,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { m.PlannerVersion = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8734,7 +8720,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8754,7 +8740,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { m.Consolidator = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8771,7 +8757,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { var v ExecuteOptions_TransactionAccessMode for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8788,7 +8774,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8801,11 +8787,11 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8818,7 +8804,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { var v ExecuteOptions_TransactionAccessMode for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8842,7 +8828,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8856,11 +8842,11 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8874,7 +8860,7 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8888,25 +8874,45 @@ func (m *ExecuteOptions) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.Priority = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthoritativeTimeout", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Timeout = &ExecuteOptions_AuthoritativeTimeout{AuthoritativeTimeout: v} default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -8929,7 +8935,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8957,7 +8963,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -8971,11 +8977,11 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -8989,7 +8995,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9008,7 +9014,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9022,11 +9028,11 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9040,7 +9046,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9054,11 +9060,11 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9072,7 +9078,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9086,11 +9092,11 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9104,7 +9110,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9118,11 +9124,11 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9136,7 +9142,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { m.ColumnLength = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9155,7 +9161,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { m.Charset = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9174,7 +9180,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { m.Decimals = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9193,7 +9199,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { m.Flags = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9212,7 +9218,7 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9226,11 +9232,11 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9239,12 +9245,12 @@ func (m *Field) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9267,7 +9273,7 @@ func (m *Row) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9293,7 +9299,7 @@ func (m *Row) UnmarshalVT(dAtA []byte) error { var v uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9311,7 +9317,7 @@ func (m *Row) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9324,11 +9330,11 @@ func (m *Row) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9348,7 +9354,7 @@ func (m *Row) UnmarshalVT(dAtA []byte) error { var v uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9373,7 +9379,7 @@ func (m *Row) UnmarshalVT(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9386,11 +9392,11 @@ func (m *Row) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9402,12 +9408,12 @@ func (m *Row) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9430,7 +9436,7 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9458,7 +9464,7 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9471,11 +9477,11 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9492,7 +9498,7 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { m.RowsAffected = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9511,7 +9517,7 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { m.InsertId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9530,7 +9536,7 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9543,11 +9549,11 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9564,7 +9570,7 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9578,11 +9584,11 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9596,7 +9602,7 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9610,11 +9616,11 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9623,12 +9629,12 @@ func (m *QueryResult) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9651,7 +9657,7 @@ func (m *QueryWarning) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9679,7 +9685,7 @@ func (m *QueryWarning) UnmarshalVT(dAtA []byte) error { m.Code = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9698,7 +9704,7 @@ func (m *QueryWarning) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9712,11 +9718,11 @@ func (m *QueryWarning) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9725,12 +9731,12 @@ func (m *QueryWarning) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9753,7 +9759,7 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9781,7 +9787,7 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { m.Category = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9800,7 +9806,7 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9814,11 +9820,11 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9832,7 +9838,7 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9845,11 +9851,11 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9866,7 +9872,7 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9879,11 +9885,11 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9900,7 +9906,7 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9913,11 +9919,11 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -9929,12 +9935,12 @@ func (m *StreamEvent_Statement) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -9957,7 +9963,7 @@ func (m *StreamEvent) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9985,7 +9991,7 @@ func (m *StreamEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -9998,11 +10004,11 @@ func (m *StreamEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10019,7 +10025,7 @@ func (m *StreamEvent) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10032,11 +10038,11 @@ func (m *StreamEvent) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10050,12 +10056,12 @@ func (m *StreamEvent) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -10078,7 +10084,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10106,7 +10112,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10119,11 +10125,11 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10142,7 +10148,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10155,11 +10161,11 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10178,7 +10184,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10191,11 +10197,11 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10214,7 +10220,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10227,11 +10233,11 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10250,7 +10256,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10269,7 +10275,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10282,11 +10288,11 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10305,7 +10311,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10319,12 +10325,12 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -10347,7 +10353,7 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10375,7 +10381,7 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10388,11 +10394,11 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10406,12 +10412,12 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -10434,7 +10440,7 @@ func (m *ResultWithError) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10462,7 +10468,7 @@ func (m *ResultWithError) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10475,11 +10481,11 @@ func (m *ResultWithError) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10498,7 +10504,7 @@ func (m *ResultWithError) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10511,11 +10517,11 @@ func (m *ResultWithError) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10529,12 +10535,12 @@ func (m *ResultWithError) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -10557,7 +10563,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10585,7 +10591,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10598,11 +10604,11 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10621,7 +10627,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10634,11 +10640,11 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10657,7 +10663,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10670,11 +10676,11 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10693,7 +10699,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10706,11 +10712,11 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10729,7 +10735,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10742,11 +10748,11 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10765,7 +10771,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10784,7 +10790,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10798,12 +10804,12 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -10826,7 +10832,7 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10854,7 +10860,7 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10867,11 +10873,11 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10885,12 +10891,12 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -10913,7 +10919,7 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10941,7 +10947,7 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10954,11 +10960,11 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -10977,7 +10983,7 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -10990,11 +10996,11 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11013,7 +11019,7 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11026,11 +11032,11 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11049,7 +11055,7 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11062,11 +11068,11 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11080,12 +11086,12 @@ func (m *BeginRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11108,7 +11114,7 @@ func (m *BeginResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11136,7 +11142,7 @@ func (m *BeginResponse) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11155,7 +11161,7 @@ func (m *BeginResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11168,11 +11174,11 @@ func (m *BeginResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11191,7 +11197,7 @@ func (m *BeginResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11205,11 +11211,11 @@ func (m *BeginResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11218,12 +11224,12 @@ func (m *BeginResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11246,7 +11252,7 @@ func (m *CommitRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11274,7 +11280,7 @@ func (m *CommitRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11287,11 +11293,11 @@ func (m *CommitRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11310,7 +11316,7 @@ func (m *CommitRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11323,11 +11329,11 @@ func (m *CommitRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11346,7 +11352,7 @@ func (m *CommitRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11359,11 +11365,11 @@ func (m *CommitRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11382,7 +11388,7 @@ func (m *CommitRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11396,12 +11402,12 @@ func (m *CommitRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11424,7 +11430,7 @@ func (m *CommitResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11452,7 +11458,7 @@ func (m *CommitResponse) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11466,12 +11472,12 @@ func (m *CommitResponse) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11494,7 +11500,7 @@ func (m *RollbackRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11522,7 +11528,7 @@ func (m *RollbackRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11535,11 +11541,11 @@ func (m *RollbackRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11558,7 +11564,7 @@ func (m *RollbackRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11571,11 +11577,11 @@ func (m *RollbackRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11594,7 +11600,7 @@ func (m *RollbackRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11607,11 +11613,11 @@ func (m *RollbackRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11630,7 +11636,7 @@ func (m *RollbackRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11644,12 +11650,12 @@ func (m *RollbackRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11672,7 +11678,7 @@ func (m *RollbackResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11700,7 +11706,7 @@ func (m *RollbackResponse) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11714,12 +11720,12 @@ func (m *RollbackResponse) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11742,7 +11748,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11770,7 +11776,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11783,11 +11789,11 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11806,7 +11812,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11819,11 +11825,11 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11842,7 +11848,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11855,11 +11861,11 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11878,7 +11884,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11897,7 +11903,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11911,11 +11917,11 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11924,12 +11930,12 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11952,7 +11958,7 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11975,12 +11981,12 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12003,7 +12009,7 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12031,7 +12037,7 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12044,11 +12050,11 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12067,7 +12073,7 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12080,11 +12086,11 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12103,7 +12109,7 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12116,11 +12122,11 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12139,7 +12145,7 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12153,11 +12159,11 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12166,12 +12172,12 @@ func (m *CommitPreparedRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12194,7 +12200,7 @@ func (m *CommitPreparedResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12217,12 +12223,12 @@ func (m *CommitPreparedResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12245,7 +12251,7 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12273,7 +12279,7 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12286,11 +12292,11 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12309,7 +12315,7 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12322,11 +12328,11 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12345,7 +12351,7 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12358,11 +12364,11 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12381,7 +12387,7 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12400,7 +12406,7 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12414,11 +12420,11 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12427,12 +12433,12 @@ func (m *RollbackPreparedRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12455,7 +12461,7 @@ func (m *RollbackPreparedResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12478,12 +12484,12 @@ func (m *RollbackPreparedResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12506,7 +12512,7 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12534,7 +12540,7 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12547,11 +12553,11 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12570,7 +12576,7 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12583,11 +12589,11 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12606,7 +12612,7 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12619,11 +12625,11 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12642,7 +12648,7 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12656,11 +12662,11 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12674,7 +12680,7 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12687,11 +12693,11 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12703,12 +12709,12 @@ func (m *CreateTransactionRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12731,7 +12737,7 @@ func (m *CreateTransactionResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12754,12 +12760,12 @@ func (m *CreateTransactionResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12782,7 +12788,7 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12810,7 +12816,7 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12823,11 +12829,11 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12846,7 +12852,7 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12859,11 +12865,11 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12882,7 +12888,7 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12895,11 +12901,11 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12918,7 +12924,7 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12937,7 +12943,7 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12951,11 +12957,11 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12964,12 +12970,12 @@ func (m *StartCommitRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12992,7 +12998,7 @@ func (m *StartCommitResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13015,12 +13021,12 @@ func (m *StartCommitResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13043,7 +13049,7 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13071,7 +13077,7 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13084,11 +13090,11 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13107,7 +13113,7 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13120,11 +13126,11 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13143,7 +13149,7 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13156,11 +13162,11 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13179,7 +13185,7 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13198,7 +13204,7 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13212,11 +13218,11 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13225,12 +13231,12 @@ func (m *SetRollbackRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13253,7 +13259,7 @@ func (m *SetRollbackResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13276,12 +13282,12 @@ func (m *SetRollbackResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13304,7 +13310,7 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13332,7 +13338,7 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13345,11 +13351,11 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13368,7 +13374,7 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13381,11 +13387,11 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13404,7 +13410,7 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13417,11 +13423,11 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13440,7 +13446,7 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13454,11 +13460,11 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13467,12 +13473,12 @@ func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13495,7 +13501,7 @@ func (m *ConcludeTransactionResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13518,12 +13524,12 @@ func (m *ConcludeTransactionResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13546,7 +13552,7 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13574,7 +13580,7 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13587,11 +13593,11 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13610,7 +13616,7 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13623,11 +13629,11 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13646,7 +13652,7 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13659,11 +13665,11 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13682,7 +13688,7 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13696,11 +13702,11 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13709,12 +13715,12 @@ func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13737,7 +13743,7 @@ func (m *ReadTransactionResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13765,7 +13771,7 @@ func (m *ReadTransactionResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13778,11 +13784,11 @@ func (m *ReadTransactionResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13796,12 +13802,12 @@ func (m *ReadTransactionResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13824,7 +13830,7 @@ func (m *UnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13852,7 +13858,7 @@ func (m *UnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13865,11 +13871,11 @@ func (m *UnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13888,7 +13894,7 @@ func (m *UnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13901,11 +13907,11 @@ func (m *UnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13924,7 +13930,7 @@ func (m *UnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13937,11 +13943,11 @@ func (m *UnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13953,14 +13959,33 @@ func (m *UnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AbandonAge", wireType) + } + m.AbandonAge = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AbandonAge |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13983,7 +14008,7 @@ func (m *UnresolvedTransactionsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14011,7 +14036,7 @@ func (m *UnresolvedTransactionsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14024,11 +14049,11 @@ func (m *UnresolvedTransactionsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14040,12 +14065,12 @@ func (m *UnresolvedTransactionsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14068,7 +14093,7 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14096,7 +14121,7 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14109,11 +14134,11 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14132,7 +14157,7 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14145,11 +14170,11 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14168,7 +14193,7 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14181,11 +14206,11 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14204,7 +14229,7 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14217,11 +14242,11 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14240,7 +14265,7 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14253,11 +14278,11 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14276,7 +14301,7 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14295,7 +14320,7 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14309,11 +14334,11 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14322,12 +14347,12 @@ func (m *BeginExecuteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14350,7 +14375,7 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14378,7 +14403,7 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14391,11 +14416,11 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14414,7 +14439,7 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14427,11 +14452,11 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14450,7 +14475,7 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14469,7 +14494,7 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14482,11 +14507,11 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14505,7 +14530,7 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14519,11 +14544,11 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14532,12 +14557,12 @@ func (m *BeginExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14560,7 +14585,7 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14588,7 +14613,7 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14601,11 +14626,11 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14624,7 +14649,7 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14637,11 +14662,11 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14660,7 +14685,7 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14673,11 +14698,11 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14696,7 +14721,7 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14709,11 +14734,11 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14732,7 +14757,7 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14745,11 +14770,11 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14768,7 +14793,7 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14782,11 +14807,11 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14800,7 +14825,7 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14814,12 +14839,12 @@ func (m *BeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14842,7 +14867,7 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14870,7 +14895,7 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14883,11 +14908,11 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14906,7 +14931,7 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14919,11 +14944,11 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14942,7 +14967,7 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14961,7 +14986,7 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14974,11 +14999,11 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14997,7 +15022,7 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15011,11 +15036,11 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15024,12 +15049,12 @@ func (m *BeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15052,7 +15077,7 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15080,7 +15105,7 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15093,11 +15118,11 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15116,7 +15141,7 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15129,11 +15154,11 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15152,7 +15177,7 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15165,11 +15190,11 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15188,7 +15213,7 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15202,11 +15227,11 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15215,12 +15240,12 @@ func (m *MessageStreamRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15243,7 +15268,7 @@ func (m *MessageStreamResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15271,7 +15296,7 @@ func (m *MessageStreamResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15284,11 +15309,11 @@ func (m *MessageStreamResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15302,12 +15327,12 @@ func (m *MessageStreamResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15330,7 +15355,7 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15358,7 +15383,7 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15371,11 +15396,11 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15394,7 +15419,7 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15407,11 +15432,11 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15430,7 +15455,7 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15443,11 +15468,11 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15466,7 +15491,7 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15480,11 +15505,11 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15498,7 +15523,7 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15511,11 +15536,11 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15527,12 +15552,12 @@ func (m *MessageAckRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15555,7 +15580,7 @@ func (m *MessageAckResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15583,7 +15608,7 @@ func (m *MessageAckResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15596,11 +15621,11 @@ func (m *MessageAckResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15614,12 +15639,12 @@ func (m *MessageAckResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15642,7 +15667,7 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15670,7 +15695,7 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15683,11 +15708,11 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15706,7 +15731,7 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15719,11 +15744,11 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15742,7 +15767,7 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15755,11 +15780,11 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15778,7 +15803,7 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15791,11 +15816,11 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15814,7 +15839,7 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15833,7 +15858,7 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15846,11 +15871,11 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15869,7 +15894,7 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15883,11 +15908,11 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15896,12 +15921,12 @@ func (m *ReserveExecuteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15924,7 +15949,7 @@ func (m *ReserveExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15952,7 +15977,7 @@ func (m *ReserveExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15965,11 +15990,11 @@ func (m *ReserveExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15988,7 +16013,7 @@ func (m *ReserveExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16001,11 +16026,11 @@ func (m *ReserveExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16024,7 +16049,7 @@ func (m *ReserveExecuteResponse) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16043,7 +16068,7 @@ func (m *ReserveExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16056,11 +16081,11 @@ func (m *ReserveExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16074,12 +16099,12 @@ func (m *ReserveExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16102,7 +16127,7 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16130,7 +16155,7 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16143,11 +16168,11 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16166,7 +16191,7 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16179,11 +16204,11 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16202,7 +16227,7 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16215,11 +16240,11 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16238,7 +16263,7 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16251,11 +16276,11 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16274,7 +16299,7 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16287,11 +16312,11 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16310,7 +16335,7 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16329,7 +16354,7 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16343,11 +16368,11 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16356,12 +16381,12 @@ func (m *ReserveStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16384,7 +16409,7 @@ func (m *ReserveStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16412,7 +16437,7 @@ func (m *ReserveStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16425,11 +16450,11 @@ func (m *ReserveStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16448,7 +16473,7 @@ func (m *ReserveStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16461,11 +16486,11 @@ func (m *ReserveStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16484,7 +16509,7 @@ func (m *ReserveStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16503,7 +16528,7 @@ func (m *ReserveStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16516,11 +16541,11 @@ func (m *ReserveStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16534,12 +16559,12 @@ func (m *ReserveStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16562,7 +16587,7 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16590,7 +16615,7 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16603,11 +16628,11 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16626,7 +16651,7 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16639,11 +16664,11 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16662,7 +16687,7 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16675,11 +16700,11 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16698,7 +16723,7 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16711,11 +16736,11 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16734,7 +16759,7 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16747,11 +16772,11 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16770,7 +16795,7 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16784,11 +16809,11 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16802,7 +16827,7 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16816,11 +16841,11 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16829,12 +16854,12 @@ func (m *ReserveBeginExecuteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16857,7 +16882,7 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16885,7 +16910,7 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16898,11 +16923,11 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16921,7 +16946,7 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16934,11 +16959,11 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16957,7 +16982,7 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16976,7 +17001,7 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16995,7 +17020,7 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17008,11 +17033,11 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17031,7 +17056,7 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17045,11 +17070,11 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17058,12 +17083,12 @@ func (m *ReserveBeginExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17086,7 +17111,7 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17114,7 +17139,7 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17127,11 +17152,11 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17150,7 +17175,7 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17163,11 +17188,11 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17186,7 +17211,7 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17199,11 +17224,11 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17222,7 +17247,7 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17235,11 +17260,11 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17258,7 +17283,7 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17271,11 +17296,11 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17294,7 +17319,7 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17308,11 +17333,11 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17326,7 +17351,7 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17340,11 +17365,11 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17353,12 +17378,12 @@ func (m *ReserveBeginStreamExecuteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17381,7 +17406,7 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17409,7 +17434,7 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17422,11 +17447,11 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17445,7 +17470,7 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17458,11 +17483,11 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17481,7 +17506,7 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17500,7 +17525,7 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17519,7 +17544,7 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17532,11 +17557,11 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17555,7 +17580,7 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17569,11 +17594,11 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17582,12 +17607,12 @@ func (m *ReserveBeginStreamExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17610,7 +17635,7 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17638,7 +17663,7 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17651,11 +17676,11 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17674,7 +17699,7 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17687,11 +17712,11 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17710,7 +17735,7 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17723,11 +17748,11 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17746,7 +17771,7 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17765,7 +17790,7 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17779,12 +17804,12 @@ func (m *ReleaseRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17807,7 +17832,7 @@ func (m *ReleaseResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17830,12 +17855,12 @@ func (m *ReleaseResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17858,7 +17883,7 @@ func (m *StreamHealthRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17881,12 +17906,12 @@ func (m *StreamHealthRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17909,7 +17934,7 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17937,7 +17962,7 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17951,11 +17976,11 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17969,7 +17994,7 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { m.ReplicationLagSeconds = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17988,7 +18013,7 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { m.BinlogPlayersCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18007,7 +18032,7 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { m.FilteredReplicationLagSeconds = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18048,7 +18073,7 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18062,11 +18087,11 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18080,7 +18105,7 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18094,11 +18119,11 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18112,7 +18137,7 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18132,7 +18157,7 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18147,12 +18172,12 @@ func (m *RealtimeStats) UnmarshalVT(dAtA []byte) error { m.TxUnresolved = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18175,7 +18200,7 @@ func (m *AggregateStats) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18203,7 +18228,7 @@ func (m *AggregateStats) UnmarshalVT(dAtA []byte) error { m.HealthyTabletCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18222,7 +18247,7 @@ func (m *AggregateStats) UnmarshalVT(dAtA []byte) error { m.UnhealthyTabletCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18241,7 +18266,7 @@ func (m *AggregateStats) UnmarshalVT(dAtA []byte) error { m.ReplicationLagSecondsMin = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18260,7 +18285,7 @@ func (m *AggregateStats) UnmarshalVT(dAtA []byte) error { m.ReplicationLagSecondsMax = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18274,12 +18299,12 @@ func (m *AggregateStats) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18302,7 +18327,7 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18330,7 +18355,7 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18343,11 +18368,11 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18366,7 +18391,7 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18386,7 +18411,7 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { m.PrimaryTermStartTimestamp = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18405,7 +18430,7 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18418,11 +18443,11 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18441,7 +18466,7 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18454,11 +18479,11 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18472,12 +18497,12 @@ func (m *StreamHealthResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18500,7 +18525,7 @@ func (m *TransactionMetadata) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18528,7 +18553,7 @@ func (m *TransactionMetadata) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18542,11 +18567,11 @@ func (m *TransactionMetadata) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18560,7 +18585,7 @@ func (m *TransactionMetadata) UnmarshalVT(dAtA []byte) error { m.State = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18579,7 +18604,7 @@ func (m *TransactionMetadata) UnmarshalVT(dAtA []byte) error { m.TimeCreated = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18598,7 +18623,7 @@ func (m *TransactionMetadata) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18611,11 +18636,11 @@ func (m *TransactionMetadata) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18627,12 +18652,12 @@ func (m *TransactionMetadata) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18655,7 +18680,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18683,7 +18708,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18696,11 +18721,11 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18719,7 +18744,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { m.TableType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18738,7 +18763,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18752,11 +18777,11 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18765,12 +18790,12 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18793,7 +18818,7 @@ func (m *UDFInfo) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18821,7 +18846,7 @@ func (m *UDFInfo) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18835,11 +18860,11 @@ func (m *UDFInfo) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18853,7 +18878,7 @@ func (m *UDFInfo) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18873,7 +18898,7 @@ func (m *UDFInfo) UnmarshalVT(dAtA []byte) error { m.ReturnType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18887,12 +18912,12 @@ func (m *UDFInfo) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18915,7 +18940,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18943,7 +18968,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18956,11 +18981,11 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18977,7 +19002,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18990,11 +19015,11 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19009,7 +19034,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19026,7 +19051,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19040,11 +19065,11 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -19055,7 +19080,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19069,11 +19094,11 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapvalue := int(stringLenmapvalue) if intStringLenmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapvalue := iNdEx + intStringLenmapvalue if postStringIndexmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF @@ -19082,12 +19107,12 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -19099,12 +19124,12 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19119,88 +19144,3 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/replicationdata/replicationdata.pb.go b/go/vt/proto/replicationdata/replicationdata.pb.go index 10a0406d851..29ee0e5b67e 100644 --- a/go/vt/proto/replicationdata/replicationdata.pb.go +++ b/go/vt/proto/replicationdata/replicationdata.pb.go @@ -425,6 +425,7 @@ type PrimaryStatus struct { Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` FilePosition string `protobuf:"bytes,2,opt,name=file_position,json=filePosition,proto3" json:"file_position,omitempty"` + ServerUuid string `protobuf:"bytes,3,opt,name=server_uuid,json=serverUuid,proto3" json:"server_uuid,omitempty"` } func (x *PrimaryStatus) Reset() { @@ -473,6 +474,13 @@ func (x *PrimaryStatus) GetFilePosition() string { return "" } +func (x *PrimaryStatus) GetServerUuid() string { + if x != nil { + return x.ServerUuid + } + return "" +} + // FullStatus contains the full status of MySQL including the replication information, semi-sync information, GTID information among others type FullStatus struct { state protoimpl.MessageState @@ -766,88 +774,90 @@ var file_replicationdata_proto_rawDesc = []byte{ 0x74, 0x75, 0x73, 0x52, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x50, 0x0a, 0x0d, 0x50, 0x72, + 0x74, 0x75, 0x73, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x71, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x66, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc8, 0x08, 0x0a, - 0x0a, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x12, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x11, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x74, 0x69, 0x64, - 0x5f, 0x70, 0x75, 0x72, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x67, - 0x74, 0x69, 0x64, 0x50, 0x75, 0x72, 0x67, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x74, 0x69, - 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x74, - 0x69, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, - 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x6f, 0x77, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x6f, 0x77, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x6f, 0x67, 0x5f, 0x62, 0x69, 0x6e, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x6c, 0x6f, 0x67, 0x42, 0x69, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2e, 0x0a, - 0x13, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6c, 0x6f, 0x67, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x39, 0x0a, - 0x19, 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x16, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x73, 0x65, 0x6d, 0x69, - 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x65, 0x6d, - 0x69, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, - 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x18, - 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, - 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, - 0x6e, 0x63, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, - 0x6e, 0x63, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x39, 0x0a, 0x19, 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x16, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x45, 0x0a, 0x20, 0x73, - 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, - 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1b, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x57, - 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x64, - 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x75, 0x70, - 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x5b, 0x0a, 0x19, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x3b, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x12, - 0x0a, 0x0e, 0x49, 0x4f, 0x41, 0x4e, 0x44, 0x53, 0x51, 0x4c, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, - 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x4f, 0x4e, - 0x4c, 0x59, 0x10, 0x01, 0x42, 0x2e, 0x5a, 0x2c, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, - 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x22, 0xc8, 0x08, + 0x0a, 0x0a, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x12, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x74, 0x69, + 0x64, 0x5f, 0x70, 0x75, 0x72, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x67, 0x74, 0x69, 0x64, 0x50, 0x75, 0x72, 0x67, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x74, + 0x69, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, + 0x74, 0x69, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6c, 0x6f, + 0x67, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x28, 0x0a, 0x10, + 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x6f, 0x77, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x6f, + 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x6f, 0x67, 0x5f, 0x62, 0x69, + 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x6c, 0x6f, 0x67, 0x42, 0x69, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2e, + 0x0a, 0x13, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6c, 0x6f, 0x67, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x39, + 0x0a, 0x19, 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x16, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x73, 0x65, 0x6d, + 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x65, + 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, + 0x63, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, + 0x18, 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, + 0x79, 0x6e, 0x63, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x73, 0x65, 0x6d, 0x69, 0x53, + 0x79, 0x6e, 0x63, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x39, 0x0a, 0x19, 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x45, 0x0a, 0x20, + 0x73, 0x65, 0x6d, 0x69, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, + 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1b, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, + 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x61, + 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x5b, 0x0a, 0x19, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x3b, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x12, 0x0a, 0x0e, 0x49, 0x4f, 0x41, 0x4e, 0x44, 0x53, 0x51, 0x4c, 0x54, 0x48, 0x52, 0x45, 0x41, + 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x4f, + 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x42, 0x2e, 0x5a, 0x2c, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, + 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go index c5bc6e385fb..b81b2125566 100644 --- a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go +++ b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: replicationdata.proto package replicationdata @@ -7,11 +7,11 @@ package replicationdata import ( binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" math "math" - bits "math/bits" ) const ( @@ -25,30 +25,29 @@ func (m *Status) CloneVT() *Status { if m == nil { return (*Status)(nil) } - r := &Status{ - Position: m.Position, - ReplicationLagSeconds: m.ReplicationLagSeconds, - SourceHost: m.SourceHost, - SourcePort: m.SourcePort, - ConnectRetry: m.ConnectRetry, - RelayLogPosition: m.RelayLogPosition, - FilePosition: m.FilePosition, - RelayLogSourceBinlogEquivalentPosition: m.RelayLogSourceBinlogEquivalentPosition, - SourceServerId: m.SourceServerId, - SourceUuid: m.SourceUuid, - IoState: m.IoState, - LastIoError: m.LastIoError, - SqlState: m.SqlState, - LastSqlError: m.LastSqlError, - RelayLogFilePosition: m.RelayLogFilePosition, - SourceUser: m.SourceUser, - SqlDelay: m.SqlDelay, - AutoPosition: m.AutoPosition, - UsingGtid: m.UsingGtid, - HasReplicationFilters: m.HasReplicationFilters, - SslAllowed: m.SslAllowed, - ReplicationLagUnknown: m.ReplicationLagUnknown, - } + r := new(Status) + r.Position = m.Position + r.ReplicationLagSeconds = m.ReplicationLagSeconds + r.SourceHost = m.SourceHost + r.SourcePort = m.SourcePort + r.ConnectRetry = m.ConnectRetry + r.RelayLogPosition = m.RelayLogPosition + r.FilePosition = m.FilePosition + r.RelayLogSourceBinlogEquivalentPosition = m.RelayLogSourceBinlogEquivalentPosition + r.SourceServerId = m.SourceServerId + r.SourceUuid = m.SourceUuid + r.IoState = m.IoState + r.LastIoError = m.LastIoError + r.SqlState = m.SqlState + r.LastSqlError = m.LastSqlError + r.RelayLogFilePosition = m.RelayLogFilePosition + r.SourceUser = m.SourceUser + r.SqlDelay = m.SqlDelay + r.AutoPosition = m.AutoPosition + r.UsingGtid = m.UsingGtid + r.HasReplicationFilters = m.HasReplicationFilters + r.SslAllowed = m.SslAllowed + r.ReplicationLagUnknown = m.ReplicationLagUnknown if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -64,10 +63,9 @@ func (m *Configuration) CloneVT() *Configuration { if m == nil { return (*Configuration)(nil) } - r := &Configuration{ - HeartbeatInterval: m.HeartbeatInterval, - ReplicaNetTimeout: m.ReplicaNetTimeout, - } + r := new(Configuration) + r.HeartbeatInterval = m.HeartbeatInterval + r.ReplicaNetTimeout = m.ReplicaNetTimeout if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -83,10 +81,9 @@ func (m *StopReplicationStatus) CloneVT() *StopReplicationStatus { if m == nil { return (*StopReplicationStatus)(nil) } - r := &StopReplicationStatus{ - Before: m.Before.CloneVT(), - After: m.After.CloneVT(), - } + r := new(StopReplicationStatus) + r.Before = m.Before.CloneVT() + r.After = m.After.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -102,10 +99,10 @@ func (m *PrimaryStatus) CloneVT() *PrimaryStatus { if m == nil { return (*PrimaryStatus)(nil) } - r := &PrimaryStatus{ - Position: m.Position, - FilePosition: m.FilePosition, - } + r := new(PrimaryStatus) + r.Position = m.Position + r.FilePosition = m.FilePosition + r.ServerUuid = m.ServerUuid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -121,30 +118,29 @@ func (m *FullStatus) CloneVT() *FullStatus { if m == nil { return (*FullStatus)(nil) } - r := &FullStatus{ - ServerId: m.ServerId, - ServerUuid: m.ServerUuid, - ReplicationStatus: m.ReplicationStatus.CloneVT(), - PrimaryStatus: m.PrimaryStatus.CloneVT(), - GtidPurged: m.GtidPurged, - Version: m.Version, - VersionComment: m.VersionComment, - ReadOnly: m.ReadOnly, - GtidMode: m.GtidMode, - BinlogFormat: m.BinlogFormat, - BinlogRowImage: m.BinlogRowImage, - LogBinEnabled: m.LogBinEnabled, - LogReplicaUpdates: m.LogReplicaUpdates, - SemiSyncPrimaryEnabled: m.SemiSyncPrimaryEnabled, - SemiSyncReplicaEnabled: m.SemiSyncReplicaEnabled, - SemiSyncPrimaryStatus: m.SemiSyncPrimaryStatus, - SemiSyncReplicaStatus: m.SemiSyncReplicaStatus, - SemiSyncPrimaryClients: m.SemiSyncPrimaryClients, - SemiSyncPrimaryTimeout: m.SemiSyncPrimaryTimeout, - SemiSyncWaitForReplicaCount: m.SemiSyncWaitForReplicaCount, - SuperReadOnly: m.SuperReadOnly, - ReplicationConfiguration: m.ReplicationConfiguration.CloneVT(), - } + r := new(FullStatus) + r.ServerId = m.ServerId + r.ServerUuid = m.ServerUuid + r.ReplicationStatus = m.ReplicationStatus.CloneVT() + r.PrimaryStatus = m.PrimaryStatus.CloneVT() + r.GtidPurged = m.GtidPurged + r.Version = m.Version + r.VersionComment = m.VersionComment + r.ReadOnly = m.ReadOnly + r.GtidMode = m.GtidMode + r.BinlogFormat = m.BinlogFormat + r.BinlogRowImage = m.BinlogRowImage + r.LogBinEnabled = m.LogBinEnabled + r.LogReplicaUpdates = m.LogReplicaUpdates + r.SemiSyncPrimaryEnabled = m.SemiSyncPrimaryEnabled + r.SemiSyncReplicaEnabled = m.SemiSyncReplicaEnabled + r.SemiSyncPrimaryStatus = m.SemiSyncPrimaryStatus + r.SemiSyncReplicaStatus = m.SemiSyncReplicaStatus + r.SemiSyncPrimaryClients = m.SemiSyncPrimaryClients + r.SemiSyncPrimaryTimeout = m.SemiSyncPrimaryTimeout + r.SemiSyncWaitForReplicaCount = m.SemiSyncWaitForReplicaCount + r.SuperReadOnly = m.SuperReadOnly + r.ReplicationConfiguration = m.ReplicationConfiguration.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -247,7 +243,7 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0xa0 } if m.SqlDelay != 0 { - i = encodeVarint(dAtA, i, uint64(m.SqlDelay)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SqlDelay)) i-- dAtA[i] = 0x1 i-- @@ -256,7 +252,7 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.SourceUser) > 0 { i -= len(m.SourceUser) copy(dAtA[i:], m.SourceUser) - i = encodeVarint(dAtA, i, uint64(len(m.SourceUser))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceUser))) i-- dAtA[i] = 0x1 i-- @@ -265,7 +261,7 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.RelayLogFilePosition) > 0 { i -= len(m.RelayLogFilePosition) copy(dAtA[i:], m.RelayLogFilePosition) - i = encodeVarint(dAtA, i, uint64(len(m.RelayLogFilePosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RelayLogFilePosition))) i-- dAtA[i] = 0x1 i-- @@ -274,88 +270,88 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.LastSqlError) > 0 { i -= len(m.LastSqlError) copy(dAtA[i:], m.LastSqlError) - i = encodeVarint(dAtA, i, uint64(len(m.LastSqlError))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastSqlError))) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0x82 } if m.SqlState != 0 { - i = encodeVarint(dAtA, i, uint64(m.SqlState)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SqlState)) i-- dAtA[i] = 0x78 } if len(m.LastIoError) > 0 { i -= len(m.LastIoError) copy(dAtA[i:], m.LastIoError) - i = encodeVarint(dAtA, i, uint64(len(m.LastIoError))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastIoError))) i-- dAtA[i] = 0x72 } if m.IoState != 0 { - i = encodeVarint(dAtA, i, uint64(m.IoState)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.IoState)) i-- dAtA[i] = 0x68 } if len(m.SourceUuid) > 0 { i -= len(m.SourceUuid) copy(dAtA[i:], m.SourceUuid) - i = encodeVarint(dAtA, i, uint64(len(m.SourceUuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceUuid))) i-- dAtA[i] = 0x62 } if m.SourceServerId != 0 { - i = encodeVarint(dAtA, i, uint64(m.SourceServerId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SourceServerId)) i-- dAtA[i] = 0x58 } if len(m.RelayLogSourceBinlogEquivalentPosition) > 0 { i -= len(m.RelayLogSourceBinlogEquivalentPosition) copy(dAtA[i:], m.RelayLogSourceBinlogEquivalentPosition) - i = encodeVarint(dAtA, i, uint64(len(m.RelayLogSourceBinlogEquivalentPosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RelayLogSourceBinlogEquivalentPosition))) i-- dAtA[i] = 0x52 } if len(m.FilePosition) > 0 { i -= len(m.FilePosition) copy(dAtA[i:], m.FilePosition) - i = encodeVarint(dAtA, i, uint64(len(m.FilePosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FilePosition))) i-- dAtA[i] = 0x4a } if len(m.RelayLogPosition) > 0 { i -= len(m.RelayLogPosition) copy(dAtA[i:], m.RelayLogPosition) - i = encodeVarint(dAtA, i, uint64(len(m.RelayLogPosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RelayLogPosition))) i-- dAtA[i] = 0x42 } if m.ConnectRetry != 0 { - i = encodeVarint(dAtA, i, uint64(m.ConnectRetry)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ConnectRetry)) i-- dAtA[i] = 0x38 } if m.SourcePort != 0 { - i = encodeVarint(dAtA, i, uint64(m.SourcePort)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SourcePort)) i-- dAtA[i] = 0x30 } if len(m.SourceHost) > 0 { i -= len(m.SourceHost) copy(dAtA[i:], m.SourceHost) - i = encodeVarint(dAtA, i, uint64(len(m.SourceHost))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceHost))) i-- dAtA[i] = 0x2a } if m.ReplicationLagSeconds != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReplicationLagSeconds)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReplicationLagSeconds)) i-- dAtA[i] = 0x20 } if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- dAtA[i] = 0xa } @@ -393,7 +389,7 @@ func (m *Configuration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.ReplicaNetTimeout != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReplicaNetTimeout)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReplicaNetTimeout)) i-- dAtA[i] = 0x10 } @@ -442,7 +438,7 @@ func (m *StopReplicationStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -452,7 +448,7 @@ func (m *StopReplicationStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -489,17 +485,24 @@ func (m *PrimaryStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.ServerUuid) > 0 { + i -= len(m.ServerUuid) + copy(dAtA[i:], m.ServerUuid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ServerUuid))) + i-- + dAtA[i] = 0x1a + } if len(m.FilePosition) > 0 { i -= len(m.FilePosition) copy(dAtA[i:], m.FilePosition) - i = encodeVarint(dAtA, i, uint64(len(m.FilePosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FilePosition))) i-- dAtA[i] = 0x12 } if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- dAtA[i] = 0xa } @@ -542,7 +545,7 @@ func (m *FullStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- @@ -561,21 +564,21 @@ func (m *FullStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0xa8 } if m.SemiSyncWaitForReplicaCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.SemiSyncWaitForReplicaCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SemiSyncWaitForReplicaCount)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xa0 } if m.SemiSyncPrimaryTimeout != 0 { - i = encodeVarint(dAtA, i, uint64(m.SemiSyncPrimaryTimeout)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SemiSyncPrimaryTimeout)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0x98 } if m.SemiSyncPrimaryClients != 0 { - i = encodeVarint(dAtA, i, uint64(m.SemiSyncPrimaryClients)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SemiSyncPrimaryClients)) i-- dAtA[i] = 0x1 i-- @@ -648,21 +651,21 @@ func (m *FullStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.BinlogRowImage) > 0 { i -= len(m.BinlogRowImage) copy(dAtA[i:], m.BinlogRowImage) - i = encodeVarint(dAtA, i, uint64(len(m.BinlogRowImage))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BinlogRowImage))) i-- dAtA[i] = 0x5a } if len(m.BinlogFormat) > 0 { i -= len(m.BinlogFormat) copy(dAtA[i:], m.BinlogFormat) - i = encodeVarint(dAtA, i, uint64(len(m.BinlogFormat))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BinlogFormat))) i-- dAtA[i] = 0x52 } if len(m.GtidMode) > 0 { i -= len(m.GtidMode) copy(dAtA[i:], m.GtidMode) - i = encodeVarint(dAtA, i, uint64(len(m.GtidMode))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.GtidMode))) i-- dAtA[i] = 0x4a } @@ -679,21 +682,21 @@ func (m *FullStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.VersionComment) > 0 { i -= len(m.VersionComment) copy(dAtA[i:], m.VersionComment) - i = encodeVarint(dAtA, i, uint64(len(m.VersionComment))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.VersionComment))) i-- dAtA[i] = 0x3a } if len(m.Version) > 0 { i -= len(m.Version) copy(dAtA[i:], m.Version) - i = encodeVarint(dAtA, i, uint64(len(m.Version))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Version))) i-- dAtA[i] = 0x32 } if len(m.GtidPurged) > 0 { i -= len(m.GtidPurged) copy(dAtA[i:], m.GtidPurged) - i = encodeVarint(dAtA, i, uint64(len(m.GtidPurged))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.GtidPurged))) i-- dAtA[i] = 0x2a } @@ -703,7 +706,7 @@ func (m *FullStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -713,36 +716,25 @@ func (m *FullStatus) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.ServerUuid) > 0 { i -= len(m.ServerUuid) copy(dAtA[i:], m.ServerUuid) - i = encodeVarint(dAtA, i, uint64(len(m.ServerUuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ServerUuid))) i-- dAtA[i] = 0x12 } if m.ServerId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ServerId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ServerId)) i-- dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *Status) SizeVT() (n int) { if m == nil { return 0 @@ -751,64 +743,64 @@ func (m *Status) SizeVT() (n int) { _ = l l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReplicationLagSeconds != 0 { - n += 1 + sov(uint64(m.ReplicationLagSeconds)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReplicationLagSeconds)) } l = len(m.SourceHost) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SourcePort != 0 { - n += 1 + sov(uint64(m.SourcePort)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.SourcePort)) } if m.ConnectRetry != 0 { - n += 1 + sov(uint64(m.ConnectRetry)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ConnectRetry)) } l = len(m.RelayLogPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.FilePosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.RelayLogSourceBinlogEquivalentPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SourceServerId != 0 { - n += 1 + sov(uint64(m.SourceServerId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.SourceServerId)) } l = len(m.SourceUuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.IoState != 0 { - n += 1 + sov(uint64(m.IoState)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.IoState)) } l = len(m.LastIoError) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SqlState != 0 { - n += 1 + sov(uint64(m.SqlState)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.SqlState)) } l = len(m.LastSqlError) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.RelayLogFilePosition) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceUser) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SqlDelay != 0 { - n += 2 + sov(uint64(m.SqlDelay)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.SqlDelay)) } if m.AutoPosition { n += 3 @@ -839,7 +831,7 @@ func (m *Configuration) SizeVT() (n int) { n += 9 } if m.ReplicaNetTimeout != 0 { - n += 1 + sov(uint64(m.ReplicaNetTimeout)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReplicaNetTimeout)) } n += len(m.unknownFields) return n @@ -853,11 +845,11 @@ func (m *StopReplicationStatus) SizeVT() (n int) { _ = l if m.Before != nil { l = m.Before.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.After != nil { l = m.After.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -871,11 +863,15 @@ func (m *PrimaryStatus) SizeVT() (n int) { _ = l l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.FilePosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ServerUuid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -888,46 +884,46 @@ func (m *FullStatus) SizeVT() (n int) { var l int _ = l if m.ServerId != 0 { - n += 1 + sov(uint64(m.ServerId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ServerId)) } l = len(m.ServerUuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReplicationStatus != nil { l = m.ReplicationStatus.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PrimaryStatus != nil { l = m.PrimaryStatus.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.GtidPurged) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Version) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.VersionComment) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReadOnly { n += 2 } l = len(m.GtidMode) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.BinlogFormat) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.BinlogRowImage) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.LogBinEnabled { n += 2 @@ -948,31 +944,25 @@ func (m *FullStatus) SizeVT() (n int) { n += 3 } if m.SemiSyncPrimaryClients != 0 { - n += 2 + sov(uint64(m.SemiSyncPrimaryClients)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.SemiSyncPrimaryClients)) } if m.SemiSyncPrimaryTimeout != 0 { - n += 2 + sov(uint64(m.SemiSyncPrimaryTimeout)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.SemiSyncPrimaryTimeout)) } if m.SemiSyncWaitForReplicaCount != 0 { - n += 2 + sov(uint64(m.SemiSyncWaitForReplicaCount)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.SemiSyncWaitForReplicaCount)) } if m.SuperReadOnly { n += 3 } if m.ReplicationConfiguration != nil { l = m.ReplicationConfiguration.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *Status) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -981,7 +971,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1009,7 +999,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1023,11 +1013,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1041,7 +1031,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.ReplicationLagSeconds = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1060,7 +1050,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1074,11 +1064,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1092,7 +1082,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.SourcePort = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1111,7 +1101,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.ConnectRetry = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1130,7 +1120,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1144,11 +1134,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1162,7 +1152,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1176,11 +1166,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1194,7 +1184,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1208,11 +1198,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1226,7 +1216,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.SourceServerId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1245,7 +1235,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1259,11 +1249,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1277,7 +1267,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.IoState = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1296,7 +1286,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1310,11 +1300,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1328,7 +1318,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.SqlState = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1347,7 +1337,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1361,11 +1351,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1379,7 +1369,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1393,11 +1383,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1411,7 +1401,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1425,11 +1415,11 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1443,7 +1433,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.SqlDelay = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1462,7 +1452,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1482,7 +1472,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1502,7 +1492,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1522,7 +1512,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1542,7 +1532,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1557,12 +1547,12 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.ReplicationLagUnknown = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1585,7 +1575,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1624,7 +1614,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.ReplicaNetTimeout = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1638,12 +1628,12 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1666,7 +1656,7 @@ func (m *StopReplicationStatus) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1694,7 +1684,7 @@ func (m *StopReplicationStatus) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1707,11 +1697,11 @@ func (m *StopReplicationStatus) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1730,7 +1720,7 @@ func (m *StopReplicationStatus) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1743,11 +1733,11 @@ func (m *StopReplicationStatus) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1761,12 +1751,12 @@ func (m *StopReplicationStatus) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1789,7 +1779,7 @@ func (m *PrimaryStatus) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1817,7 +1807,7 @@ func (m *PrimaryStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1831,11 +1821,11 @@ func (m *PrimaryStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1849,7 +1839,7 @@ func (m *PrimaryStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1863,25 +1853,57 @@ func (m *PrimaryStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.FilePosition = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServerUuid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServerUuid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1904,7 +1926,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1932,7 +1954,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { m.ServerId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1951,7 +1973,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1965,11 +1987,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1983,7 +2005,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1996,11 +2018,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2019,7 +2041,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2032,11 +2054,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2055,7 +2077,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2069,11 +2091,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2087,7 +2109,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2101,11 +2123,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2119,7 +2141,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2133,11 +2155,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2151,7 +2173,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2171,7 +2193,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2185,11 +2207,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2203,7 +2225,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2217,11 +2239,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2235,7 +2257,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2249,11 +2271,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2267,7 +2289,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2287,7 +2309,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2307,7 +2329,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2327,7 +2349,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2347,7 +2369,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2367,7 +2389,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2387,7 +2409,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { m.SemiSyncPrimaryClients = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2406,7 +2428,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { m.SemiSyncPrimaryTimeout = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2425,7 +2447,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { m.SemiSyncWaitForReplicaCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2444,7 +2466,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2464,7 +2486,7 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2477,11 +2499,11 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2495,12 +2517,12 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2515,88 +2537,3 @@ func (m *FullStatus) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/tableacl/tableacl_vtproto.pb.go b/go/vt/proto/tableacl/tableacl_vtproto.pb.go index 8c9c9a97856..acf8b28b71c 100644 --- a/go/vt/proto/tableacl/tableacl_vtproto.pb.go +++ b/go/vt/proto/tableacl/tableacl_vtproto.pb.go @@ -1,15 +1,15 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: tableacl.proto package tableacl import ( fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" - bits "math/bits" ) const ( @@ -23,9 +23,8 @@ func (m *TableGroupSpec) CloneVT() *TableGroupSpec { if m == nil { return (*TableGroupSpec)(nil) } - r := &TableGroupSpec{ - Name: m.Name, - } + r := new(TableGroupSpec) + r.Name = m.Name if rhs := m.TableNamesOrPrefixes; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -61,7 +60,7 @@ func (m *Config) CloneVT() *Config { if m == nil { return (*Config)(nil) } - r := &Config{} + r := new(Config) if rhs := m.TableGroups; rhs != nil { tmpContainer := make([]*TableGroupSpec, len(rhs)) for k, v := range rhs { @@ -114,7 +113,7 @@ func (m *TableGroupSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Admins) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Admins[iNdEx]) copy(dAtA[i:], m.Admins[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Admins[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Admins[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -123,7 +122,7 @@ func (m *TableGroupSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Writers) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Writers[iNdEx]) copy(dAtA[i:], m.Writers[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Writers[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Writers[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -132,7 +131,7 @@ func (m *TableGroupSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Readers) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Readers[iNdEx]) copy(dAtA[i:], m.Readers[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Readers[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Readers[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -141,7 +140,7 @@ func (m *TableGroupSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.TableNamesOrPrefixes) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.TableNamesOrPrefixes[iNdEx]) copy(dAtA[i:], m.TableNamesOrPrefixes[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.TableNamesOrPrefixes[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableNamesOrPrefixes[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -149,7 +148,7 @@ func (m *TableGroupSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -193,7 +192,7 @@ func (m *Config) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -201,17 +200,6 @@ func (m *Config) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *TableGroupSpec) SizeVT() (n int) { if m == nil { return 0 @@ -220,30 +208,30 @@ func (m *TableGroupSpec) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.TableNamesOrPrefixes) > 0 { for _, s := range m.TableNamesOrPrefixes { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Readers) > 0 { for _, s := range m.Readers { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Writers) > 0 { for _, s := range m.Writers { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Admins) > 0 { for _, s := range m.Admins { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -259,19 +247,13 @@ func (m *Config) SizeVT() (n int) { if len(m.TableGroups) > 0 { for _, e := range m.TableGroups { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -280,7 +262,7 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -308,7 +290,7 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -322,11 +304,11 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -340,7 +322,7 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -354,11 +336,11 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -372,7 +354,7 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -386,11 +368,11 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -404,7 +386,7 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -418,11 +400,11 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -436,7 +418,7 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -450,11 +432,11 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -463,12 +445,12 @@ func (m *TableGroupSpec) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -491,7 +473,7 @@ func (m *Config) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -519,7 +501,7 @@ func (m *Config) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -532,11 +514,11 @@ func (m *Config) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -548,12 +530,12 @@ func (m *Config) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -568,88 +550,3 @@ func (m *Config) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index c0896882735..13aeac113c4 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -31,6 +31,7 @@ import ( sync "sync" binlogdata "vitess.io/vitess/go/vt/proto/binlogdata" logutil "vitess.io/vitess/go/vt/proto/logutil" + mysqlctl "vitess.io/vitess/go/vt/proto/mysqlctl" query "vitess.io/vitess/go/vt/proto/query" replicationdata "vitess.io/vitess/go/vt/proto/replicationdata" topodata "vitess.io/vitess/go/vt/proto/topodata" @@ -96,6 +97,64 @@ func (TabletSelectionPreference) EnumDescriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{0} } +type CheckThrottlerResponseCode int32 + +const ( + CheckThrottlerResponseCode_UNDEFINED CheckThrottlerResponseCode = 0 + CheckThrottlerResponseCode_OK CheckThrottlerResponseCode = 1 + CheckThrottlerResponseCode_THRESHOLD_EXCEEDED CheckThrottlerResponseCode = 2 + CheckThrottlerResponseCode_APP_DENIED CheckThrottlerResponseCode = 3 + CheckThrottlerResponseCode_UNKNOWN_METRIC CheckThrottlerResponseCode = 4 + CheckThrottlerResponseCode_INTERNAL_ERROR CheckThrottlerResponseCode = 5 +) + +// Enum value maps for CheckThrottlerResponseCode. +var ( + CheckThrottlerResponseCode_name = map[int32]string{ + 0: "UNDEFINED", + 1: "OK", + 2: "THRESHOLD_EXCEEDED", + 3: "APP_DENIED", + 4: "UNKNOWN_METRIC", + 5: "INTERNAL_ERROR", + } + CheckThrottlerResponseCode_value = map[string]int32{ + "UNDEFINED": 0, + "OK": 1, + "THRESHOLD_EXCEEDED": 2, + "APP_DENIED": 3, + "UNKNOWN_METRIC": 4, + "INTERNAL_ERROR": 5, + } +) + +func (x CheckThrottlerResponseCode) Enum() *CheckThrottlerResponseCode { + p := new(CheckThrottlerResponseCode) + *p = x + return p +} + +func (x CheckThrottlerResponseCode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CheckThrottlerResponseCode) Descriptor() protoreflect.EnumDescriptor { + return file_tabletmanagerdata_proto_enumTypes[1].Descriptor() +} + +func (CheckThrottlerResponseCode) Type() protoreflect.EnumType { + return &file_tabletmanagerdata_proto_enumTypes[1] +} + +func (x CheckThrottlerResponseCode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CheckThrottlerResponseCode.Descriptor instead. +func (CheckThrottlerResponseCode) EnumDescriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{1} +} + type TableDefinition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2630,14 +2689,16 @@ func (x *ExecuteFetchAsAppResponse) GetResult() *query.QueryResult { return nil } -type ReplicationStatusRequest struct { +type GetUnresolvedTransactionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + AbandonAge int64 `protobuf:"varint,1,opt,name=abandon_age,json=abandonAge,proto3" json:"abandon_age,omitempty"` } -func (x *ReplicationStatusRequest) Reset() { - *x = ReplicationStatusRequest{} +func (x *GetUnresolvedTransactionsRequest) Reset() { + *x = GetUnresolvedTransactionsRequest{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2645,13 +2706,13 @@ func (x *ReplicationStatusRequest) Reset() { } } -func (x *ReplicationStatusRequest) String() string { +func (x *GetUnresolvedTransactionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReplicationStatusRequest) ProtoMessage() {} +func (*GetUnresolvedTransactionsRequest) ProtoMessage() {} -func (x *ReplicationStatusRequest) ProtoReflect() protoreflect.Message { +func (x *GetUnresolvedTransactionsRequest) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2663,21 +2724,28 @@ func (x *ReplicationStatusRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReplicationStatusRequest.ProtoReflect.Descriptor instead. -func (*ReplicationStatusRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetUnresolvedTransactionsRequest.ProtoReflect.Descriptor instead. +func (*GetUnresolvedTransactionsRequest) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{48} } -type ReplicationStatusResponse struct { +func (x *GetUnresolvedTransactionsRequest) GetAbandonAge() int64 { + if x != nil { + return x.AbandonAge + } + return 0 +} + +type GetUnresolvedTransactionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Status *replicationdata.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + Transactions []*query.TransactionMetadata `protobuf:"bytes,1,rep,name=transactions,proto3" json:"transactions,omitempty"` } -func (x *ReplicationStatusResponse) Reset() { - *x = ReplicationStatusResponse{} +func (x *GetUnresolvedTransactionsResponse) Reset() { + *x = GetUnresolvedTransactionsResponse{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2685,13 +2753,13 @@ func (x *ReplicationStatusResponse) Reset() { } } -func (x *ReplicationStatusResponse) String() string { +func (x *GetUnresolvedTransactionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReplicationStatusResponse) ProtoMessage() {} +func (*GetUnresolvedTransactionsResponse) ProtoMessage() {} -func (x *ReplicationStatusResponse) ProtoReflect() protoreflect.Message { +func (x *GetUnresolvedTransactionsResponse) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2703,26 +2771,28 @@ func (x *ReplicationStatusResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReplicationStatusResponse.ProtoReflect.Descriptor instead. -func (*ReplicationStatusResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetUnresolvedTransactionsResponse.ProtoReflect.Descriptor instead. +func (*GetUnresolvedTransactionsResponse) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{49} } -func (x *ReplicationStatusResponse) GetStatus() *replicationdata.Status { +func (x *GetUnresolvedTransactionsResponse) GetTransactions() []*query.TransactionMetadata { if x != nil { - return x.Status + return x.Transactions } return nil } -type PrimaryStatusRequest struct { +type ReadTransactionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Dtid string `protobuf:"bytes,1,opt,name=dtid,proto3" json:"dtid,omitempty"` } -func (x *PrimaryStatusRequest) Reset() { - *x = PrimaryStatusRequest{} +func (x *ReadTransactionRequest) Reset() { + *x = ReadTransactionRequest{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2730,13 +2800,13 @@ func (x *PrimaryStatusRequest) Reset() { } } -func (x *PrimaryStatusRequest) String() string { +func (x *ReadTransactionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PrimaryStatusRequest) ProtoMessage() {} +func (*ReadTransactionRequest) ProtoMessage() {} -func (x *PrimaryStatusRequest) ProtoReflect() protoreflect.Message { +func (x *ReadTransactionRequest) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2748,21 +2818,28 @@ func (x *PrimaryStatusRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PrimaryStatusRequest.ProtoReflect.Descriptor instead. -func (*PrimaryStatusRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ReadTransactionRequest.ProtoReflect.Descriptor instead. +func (*ReadTransactionRequest) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{50} } -type PrimaryStatusResponse struct { +func (x *ReadTransactionRequest) GetDtid() string { + if x != nil { + return x.Dtid + } + return "" +} + +type ReadTransactionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Status *replicationdata.PrimaryStatus `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + Transaction *query.TransactionMetadata `protobuf:"bytes,1,opt,name=transaction,proto3" json:"transaction,omitempty"` } -func (x *PrimaryStatusResponse) Reset() { - *x = PrimaryStatusResponse{} +func (x *ReadTransactionResponse) Reset() { + *x = ReadTransactionResponse{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2770,13 +2847,13 @@ func (x *PrimaryStatusResponse) Reset() { } } -func (x *PrimaryStatusResponse) String() string { +func (x *ReadTransactionResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PrimaryStatusResponse) ProtoMessage() {} +func (*ReadTransactionResponse) ProtoMessage() {} -func (x *PrimaryStatusResponse) ProtoReflect() protoreflect.Message { +func (x *ReadTransactionResponse) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2788,26 +2865,29 @@ func (x *PrimaryStatusResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PrimaryStatusResponse.ProtoReflect.Descriptor instead. -func (*PrimaryStatusResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ReadTransactionResponse.ProtoReflect.Descriptor instead. +func (*ReadTransactionResponse) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{51} } -func (x *PrimaryStatusResponse) GetStatus() *replicationdata.PrimaryStatus { +func (x *ReadTransactionResponse) GetTransaction() *query.TransactionMetadata { if x != nil { - return x.Status + return x.Transaction } return nil } -type PrimaryPositionRequest struct { +type ConcludeTransactionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Dtid string `protobuf:"bytes,1,opt,name=dtid,proto3" json:"dtid,omitempty"` + Mm bool `protobuf:"varint,2,opt,name=mm,proto3" json:"mm,omitempty"` } -func (x *PrimaryPositionRequest) Reset() { - *x = PrimaryPositionRequest{} +func (x *ConcludeTransactionRequest) Reset() { + *x = ConcludeTransactionRequest{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2815,13 +2895,13 @@ func (x *PrimaryPositionRequest) Reset() { } } -func (x *PrimaryPositionRequest) String() string { +func (x *ConcludeTransactionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PrimaryPositionRequest) ProtoMessage() {} +func (*ConcludeTransactionRequest) ProtoMessage() {} -func (x *PrimaryPositionRequest) ProtoReflect() protoreflect.Message { +func (x *ConcludeTransactionRequest) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2833,21 +2913,33 @@ func (x *PrimaryPositionRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PrimaryPositionRequest.ProtoReflect.Descriptor instead. -func (*PrimaryPositionRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ConcludeTransactionRequest.ProtoReflect.Descriptor instead. +func (*ConcludeTransactionRequest) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{52} } -type PrimaryPositionResponse struct { +func (x *ConcludeTransactionRequest) GetDtid() string { + if x != nil { + return x.Dtid + } + return "" +} + +func (x *ConcludeTransactionRequest) GetMm() bool { + if x != nil { + return x.Mm + } + return false +} + +type ConcludeTransactionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` } -func (x *PrimaryPositionResponse) Reset() { - *x = PrimaryPositionResponse{} +func (x *ConcludeTransactionResponse) Reset() { + *x = ConcludeTransactionResponse{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2855,13 +2947,13 @@ func (x *PrimaryPositionResponse) Reset() { } } -func (x *PrimaryPositionResponse) String() string { +func (x *ConcludeTransactionResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PrimaryPositionResponse) ProtoMessage() {} +func (*ConcludeTransactionResponse) ProtoMessage() {} -func (x *PrimaryPositionResponse) ProtoReflect() protoreflect.Message { +func (x *ConcludeTransactionResponse) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2873,28 +2965,19 @@ func (x *PrimaryPositionResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PrimaryPositionResponse.ProtoReflect.Descriptor instead. -func (*PrimaryPositionResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ConcludeTransactionResponse.ProtoReflect.Descriptor instead. +func (*ConcludeTransactionResponse) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{53} } -func (x *PrimaryPositionResponse) GetPosition() string { - if x != nil { - return x.Position - } - return "" -} - -type WaitForPositionRequest struct { +type MysqlHostMetricsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` } -func (x *WaitForPositionRequest) Reset() { - *x = WaitForPositionRequest{} +func (x *MysqlHostMetricsRequest) Reset() { + *x = MysqlHostMetricsRequest{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2902,13 +2985,13 @@ func (x *WaitForPositionRequest) Reset() { } } -func (x *WaitForPositionRequest) String() string { +func (x *MysqlHostMetricsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WaitForPositionRequest) ProtoMessage() {} +func (*MysqlHostMetricsRequest) ProtoMessage() {} -func (x *WaitForPositionRequest) ProtoReflect() protoreflect.Message { +func (x *MysqlHostMetricsRequest) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2920,26 +3003,21 @@ func (x *WaitForPositionRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WaitForPositionRequest.ProtoReflect.Descriptor instead. -func (*WaitForPositionRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use MysqlHostMetricsRequest.ProtoReflect.Descriptor instead. +func (*MysqlHostMetricsRequest) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{54} } -func (x *WaitForPositionRequest) GetPosition() string { - if x != nil { - return x.Position - } - return "" -} - -type WaitForPositionResponse struct { +type MysqlHostMetricsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + HostMetrics *mysqlctl.HostMetricsResponse `protobuf:"bytes,1,opt,name=HostMetrics,proto3" json:"HostMetrics,omitempty"` } -func (x *WaitForPositionResponse) Reset() { - *x = WaitForPositionResponse{} +func (x *MysqlHostMetricsResponse) Reset() { + *x = MysqlHostMetricsResponse{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2947,13 +3025,13 @@ func (x *WaitForPositionResponse) Reset() { } } -func (x *WaitForPositionResponse) String() string { +func (x *MysqlHostMetricsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WaitForPositionResponse) ProtoMessage() {} +func (*MysqlHostMetricsResponse) ProtoMessage() {} -func (x *WaitForPositionResponse) ProtoReflect() protoreflect.Message { +func (x *MysqlHostMetricsResponse) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2965,19 +3043,26 @@ func (x *WaitForPositionResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WaitForPositionResponse.ProtoReflect.Descriptor instead. -func (*WaitForPositionResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use MysqlHostMetricsResponse.ProtoReflect.Descriptor instead. +func (*MysqlHostMetricsResponse) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{55} } -type StopReplicationRequest struct { +func (x *MysqlHostMetricsResponse) GetHostMetrics() *mysqlctl.HostMetricsResponse { + if x != nil { + return x.HostMetrics + } + return nil +} + +type ReplicationStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *StopReplicationRequest) Reset() { - *x = StopReplicationRequest{} +func (x *ReplicationStatusRequest) Reset() { + *x = ReplicationStatusRequest{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2985,13 +3070,13 @@ func (x *StopReplicationRequest) Reset() { } } -func (x *StopReplicationRequest) String() string { +func (x *ReplicationStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StopReplicationRequest) ProtoMessage() {} +func (*ReplicationStatusRequest) ProtoMessage() {} -func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { +func (x *ReplicationStatusRequest) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3003,19 +3088,21 @@ func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StopReplicationRequest.ProtoReflect.Descriptor instead. -func (*StopReplicationRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ReplicationStatusRequest.ProtoReflect.Descriptor instead. +func (*ReplicationStatusRequest) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{56} } -type StopReplicationResponse struct { +type ReplicationStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Status *replicationdata.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` } -func (x *StopReplicationResponse) Reset() { - *x = StopReplicationResponse{} +func (x *ReplicationStatusResponse) Reset() { + *x = ReplicationStatusResponse{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3023,13 +3110,13 @@ func (x *StopReplicationResponse) Reset() { } } -func (x *StopReplicationResponse) String() string { +func (x *ReplicationStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StopReplicationResponse) ProtoMessage() {} +func (*ReplicationStatusResponse) ProtoMessage() {} -func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { +func (x *ReplicationStatusResponse) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3041,22 +3128,26 @@ func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StopReplicationResponse.ProtoReflect.Descriptor instead. -func (*StopReplicationResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use ReplicationStatusResponse.ProtoReflect.Descriptor instead. +func (*ReplicationStatusResponse) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{57} } -type StopReplicationMinimumRequest struct { +func (x *ReplicationStatusResponse) GetStatus() *replicationdata.Status { + if x != nil { + return x.Status + } + return nil +} + +type PrimaryStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` - WaitTimeout int64 `protobuf:"varint,2,opt,name=wait_timeout,json=waitTimeout,proto3" json:"wait_timeout,omitempty"` } -func (x *StopReplicationMinimumRequest) Reset() { - *x = StopReplicationMinimumRequest{} +func (x *PrimaryStatusRequest) Reset() { + *x = PrimaryStatusRequest{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3064,13 +3155,13 @@ func (x *StopReplicationMinimumRequest) Reset() { } } -func (x *StopReplicationMinimumRequest) String() string { +func (x *PrimaryStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StopReplicationMinimumRequest) ProtoMessage() {} +func (*PrimaryStatusRequest) ProtoMessage() {} -func (x *StopReplicationMinimumRequest) ProtoReflect() protoreflect.Message { +func (x *PrimaryStatusRequest) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3082,35 +3173,21 @@ func (x *StopReplicationMinimumRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StopReplicationMinimumRequest.ProtoReflect.Descriptor instead. -func (*StopReplicationMinimumRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use PrimaryStatusRequest.ProtoReflect.Descriptor instead. +func (*PrimaryStatusRequest) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{58} } -func (x *StopReplicationMinimumRequest) GetPosition() string { - if x != nil { - return x.Position - } - return "" -} - -func (x *StopReplicationMinimumRequest) GetWaitTimeout() int64 { - if x != nil { - return x.WaitTimeout - } - return 0 -} - -type StopReplicationMinimumResponse struct { +type PrimaryStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + Status *replicationdata.PrimaryStatus `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` } -func (x *StopReplicationMinimumResponse) Reset() { - *x = StopReplicationMinimumResponse{} +func (x *PrimaryStatusResponse) Reset() { + *x = PrimaryStatusResponse{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3118,13 +3195,13 @@ func (x *StopReplicationMinimumResponse) Reset() { } } -func (x *StopReplicationMinimumResponse) String() string { +func (x *PrimaryStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StopReplicationMinimumResponse) ProtoMessage() {} +func (*PrimaryStatusResponse) ProtoMessage() {} -func (x *StopReplicationMinimumResponse) ProtoReflect() protoreflect.Message { +func (x *PrimaryStatusResponse) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3136,28 +3213,26 @@ func (x *StopReplicationMinimumResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StopReplicationMinimumResponse.ProtoReflect.Descriptor instead. -func (*StopReplicationMinimumResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use PrimaryStatusResponse.ProtoReflect.Descriptor instead. +func (*PrimaryStatusResponse) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{59} } -func (x *StopReplicationMinimumResponse) GetPosition() string { +func (x *PrimaryStatusResponse) GetStatus() *replicationdata.PrimaryStatus { if x != nil { - return x.Position + return x.Status } - return "" + return nil } -type StartReplicationRequest struct { +type PrimaryPositionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - SemiSync bool `protobuf:"varint,1,opt,name=semiSync,proto3" json:"semiSync,omitempty"` } -func (x *StartReplicationRequest) Reset() { - *x = StartReplicationRequest{} +func (x *PrimaryPositionRequest) Reset() { + *x = PrimaryPositionRequest{} if protoimpl.UnsafeEnabled { mi := &file_tabletmanagerdata_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3165,13 +3240,13 @@ func (x *StartReplicationRequest) Reset() { } } -func (x *StartReplicationRequest) String() string { +func (x *PrimaryPositionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StartReplicationRequest) ProtoMessage() {} +func (*PrimaryPositionRequest) ProtoMessage() {} -func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { +func (x *PrimaryPositionRequest) ProtoReflect() protoreflect.Message { mi := &file_tabletmanagerdata_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3183,11 +3258,361 @@ func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StartReplicationRequest.ProtoReflect.Descriptor instead. -func (*StartReplicationRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use PrimaryPositionRequest.ProtoReflect.Descriptor instead. +func (*PrimaryPositionRequest) Descriptor() ([]byte, []int) { return file_tabletmanagerdata_proto_rawDescGZIP(), []int{60} } +type PrimaryPositionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` +} + +func (x *PrimaryPositionResponse) Reset() { + *x = PrimaryPositionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrimaryPositionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrimaryPositionResponse) ProtoMessage() {} + +func (x *PrimaryPositionResponse) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PrimaryPositionResponse.ProtoReflect.Descriptor instead. +func (*PrimaryPositionResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{61} +} + +func (x *PrimaryPositionResponse) GetPosition() string { + if x != nil { + return x.Position + } + return "" +} + +type WaitForPositionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` +} + +func (x *WaitForPositionRequest) Reset() { + *x = WaitForPositionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WaitForPositionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WaitForPositionRequest) ProtoMessage() {} + +func (x *WaitForPositionRequest) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WaitForPositionRequest.ProtoReflect.Descriptor instead. +func (*WaitForPositionRequest) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{62} +} + +func (x *WaitForPositionRequest) GetPosition() string { + if x != nil { + return x.Position + } + return "" +} + +type WaitForPositionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *WaitForPositionResponse) Reset() { + *x = WaitForPositionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WaitForPositionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WaitForPositionResponse) ProtoMessage() {} + +func (x *WaitForPositionResponse) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WaitForPositionResponse.ProtoReflect.Descriptor instead. +func (*WaitForPositionResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{63} +} + +type StopReplicationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *StopReplicationRequest) Reset() { + *x = StopReplicationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StopReplicationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StopReplicationRequest) ProtoMessage() {} + +func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StopReplicationRequest.ProtoReflect.Descriptor instead. +func (*StopReplicationRequest) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{64} +} + +type StopReplicationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *StopReplicationResponse) Reset() { + *x = StopReplicationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StopReplicationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StopReplicationResponse) ProtoMessage() {} + +func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StopReplicationResponse.ProtoReflect.Descriptor instead. +func (*StopReplicationResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{65} +} + +type StopReplicationMinimumRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + WaitTimeout int64 `protobuf:"varint,2,opt,name=wait_timeout,json=waitTimeout,proto3" json:"wait_timeout,omitempty"` +} + +func (x *StopReplicationMinimumRequest) Reset() { + *x = StopReplicationMinimumRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StopReplicationMinimumRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StopReplicationMinimumRequest) ProtoMessage() {} + +func (x *StopReplicationMinimumRequest) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StopReplicationMinimumRequest.ProtoReflect.Descriptor instead. +func (*StopReplicationMinimumRequest) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{66} +} + +func (x *StopReplicationMinimumRequest) GetPosition() string { + if x != nil { + return x.Position + } + return "" +} + +func (x *StopReplicationMinimumRequest) GetWaitTimeout() int64 { + if x != nil { + return x.WaitTimeout + } + return 0 +} + +type StopReplicationMinimumResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` +} + +func (x *StopReplicationMinimumResponse) Reset() { + *x = StopReplicationMinimumResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StopReplicationMinimumResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StopReplicationMinimumResponse) ProtoMessage() {} + +func (x *StopReplicationMinimumResponse) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StopReplicationMinimumResponse.ProtoReflect.Descriptor instead. +func (*StopReplicationMinimumResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{67} +} + +func (x *StopReplicationMinimumResponse) GetPosition() string { + if x != nil { + return x.Position + } + return "" +} + +type StartReplicationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SemiSync bool `protobuf:"varint,1,opt,name=semiSync,proto3" json:"semiSync,omitempty"` +} + +func (x *StartReplicationRequest) Reset() { + *x = StartReplicationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartReplicationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartReplicationRequest) ProtoMessage() {} + +func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[68] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartReplicationRequest.ProtoReflect.Descriptor instead. +func (*StartReplicationRequest) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{68} +} + func (x *StartReplicationRequest) GetSemiSync() bool { if x != nil { return x.SemiSync @@ -3204,7 +3629,7 @@ type StartReplicationResponse struct { func (x *StartReplicationResponse) Reset() { *x = StartReplicationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[61] + mi := &file_tabletmanagerdata_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3217,7 +3642,7 @@ func (x *StartReplicationResponse) String() string { func (*StartReplicationResponse) ProtoMessage() {} func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[61] + mi := &file_tabletmanagerdata_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3230,7 +3655,7 @@ func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationResponse.ProtoReflect.Descriptor instead. func (*StartReplicationResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{61} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{69} } type StartReplicationUntilAfterRequest struct { @@ -3245,7 +3670,7 @@ type StartReplicationUntilAfterRequest struct { func (x *StartReplicationUntilAfterRequest) Reset() { *x = StartReplicationUntilAfterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[62] + mi := &file_tabletmanagerdata_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3258,7 +3683,7 @@ func (x *StartReplicationUntilAfterRequest) String() string { func (*StartReplicationUntilAfterRequest) ProtoMessage() {} func (x *StartReplicationUntilAfterRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[62] + mi := &file_tabletmanagerdata_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3271,7 +3696,7 @@ func (x *StartReplicationUntilAfterRequest) ProtoReflect() protoreflect.Message // Deprecated: Use StartReplicationUntilAfterRequest.ProtoReflect.Descriptor instead. func (*StartReplicationUntilAfterRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{62} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{70} } func (x *StartReplicationUntilAfterRequest) GetPosition() string { @@ -3297,7 +3722,7 @@ type StartReplicationUntilAfterResponse struct { func (x *StartReplicationUntilAfterResponse) Reset() { *x = StartReplicationUntilAfterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[63] + mi := &file_tabletmanagerdata_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3310,7 +3735,7 @@ func (x *StartReplicationUntilAfterResponse) String() string { func (*StartReplicationUntilAfterResponse) ProtoMessage() {} func (x *StartReplicationUntilAfterResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[63] + mi := &file_tabletmanagerdata_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3323,7 +3748,7 @@ func (x *StartReplicationUntilAfterResponse) ProtoReflect() protoreflect.Message // Deprecated: Use StartReplicationUntilAfterResponse.ProtoReflect.Descriptor instead. func (*StartReplicationUntilAfterResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{63} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{71} } type GetReplicasRequest struct { @@ -3335,7 +3760,7 @@ type GetReplicasRequest struct { func (x *GetReplicasRequest) Reset() { *x = GetReplicasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[64] + mi := &file_tabletmanagerdata_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3348,7 +3773,7 @@ func (x *GetReplicasRequest) String() string { func (*GetReplicasRequest) ProtoMessage() {} func (x *GetReplicasRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[64] + mi := &file_tabletmanagerdata_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3361,7 +3786,7 @@ func (x *GetReplicasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetReplicasRequest.ProtoReflect.Descriptor instead. func (*GetReplicasRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{64} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{72} } type GetReplicasResponse struct { @@ -3375,7 +3800,7 @@ type GetReplicasResponse struct { func (x *GetReplicasResponse) Reset() { *x = GetReplicasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[65] + mi := &file_tabletmanagerdata_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3388,7 +3813,7 @@ func (x *GetReplicasResponse) String() string { func (*GetReplicasResponse) ProtoMessage() {} func (x *GetReplicasResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[65] + mi := &file_tabletmanagerdata_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3401,7 +3826,7 @@ func (x *GetReplicasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetReplicasResponse.ProtoReflect.Descriptor instead. func (*GetReplicasResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{65} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{73} } func (x *GetReplicasResponse) GetAddrs() []string { @@ -3420,7 +3845,7 @@ type ResetReplicationRequest struct { func (x *ResetReplicationRequest) Reset() { *x = ResetReplicationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[66] + mi := &file_tabletmanagerdata_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3433,7 +3858,7 @@ func (x *ResetReplicationRequest) String() string { func (*ResetReplicationRequest) ProtoMessage() {} func (x *ResetReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[66] + mi := &file_tabletmanagerdata_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3446,7 +3871,7 @@ func (x *ResetReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetReplicationRequest.ProtoReflect.Descriptor instead. func (*ResetReplicationRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{66} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{74} } type ResetReplicationResponse struct { @@ -3458,7 +3883,7 @@ type ResetReplicationResponse struct { func (x *ResetReplicationResponse) Reset() { *x = ResetReplicationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[67] + mi := &file_tabletmanagerdata_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3471,7 +3896,7 @@ func (x *ResetReplicationResponse) String() string { func (*ResetReplicationResponse) ProtoMessage() {} func (x *ResetReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[67] + mi := &file_tabletmanagerdata_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3484,7 +3909,7 @@ func (x *ResetReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetReplicationResponse.ProtoReflect.Descriptor instead. func (*ResetReplicationResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{67} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{75} } type VReplicationExecRequest struct { @@ -3498,7 +3923,7 @@ type VReplicationExecRequest struct { func (x *VReplicationExecRequest) Reset() { *x = VReplicationExecRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[68] + mi := &file_tabletmanagerdata_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3511,7 +3936,7 @@ func (x *VReplicationExecRequest) String() string { func (*VReplicationExecRequest) ProtoMessage() {} func (x *VReplicationExecRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[68] + mi := &file_tabletmanagerdata_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3524,7 +3949,7 @@ func (x *VReplicationExecRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VReplicationExecRequest.ProtoReflect.Descriptor instead. func (*VReplicationExecRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{68} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{76} } func (x *VReplicationExecRequest) GetQuery() string { @@ -3545,7 +3970,7 @@ type VReplicationExecResponse struct { func (x *VReplicationExecResponse) Reset() { *x = VReplicationExecResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[69] + mi := &file_tabletmanagerdata_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3558,7 +3983,7 @@ func (x *VReplicationExecResponse) String() string { func (*VReplicationExecResponse) ProtoMessage() {} func (x *VReplicationExecResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[69] + mi := &file_tabletmanagerdata_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3571,7 +3996,7 @@ func (x *VReplicationExecResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VReplicationExecResponse.ProtoReflect.Descriptor instead. func (*VReplicationExecResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{69} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{77} } func (x *VReplicationExecResponse) GetResult() *query.QueryResult { @@ -3593,7 +4018,7 @@ type VReplicationWaitForPosRequest struct { func (x *VReplicationWaitForPosRequest) Reset() { *x = VReplicationWaitForPosRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[70] + mi := &file_tabletmanagerdata_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3606,7 +4031,7 @@ func (x *VReplicationWaitForPosRequest) String() string { func (*VReplicationWaitForPosRequest) ProtoMessage() {} func (x *VReplicationWaitForPosRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[70] + mi := &file_tabletmanagerdata_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3619,7 +4044,7 @@ func (x *VReplicationWaitForPosRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VReplicationWaitForPosRequest.ProtoReflect.Descriptor instead. func (*VReplicationWaitForPosRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{70} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{78} } func (x *VReplicationWaitForPosRequest) GetId() int32 { @@ -3645,7 +4070,7 @@ type VReplicationWaitForPosResponse struct { func (x *VReplicationWaitForPosResponse) Reset() { *x = VReplicationWaitForPosResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[71] + mi := &file_tabletmanagerdata_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3658,7 +4083,7 @@ func (x *VReplicationWaitForPosResponse) String() string { func (*VReplicationWaitForPosResponse) ProtoMessage() {} func (x *VReplicationWaitForPosResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[71] + mi := &file_tabletmanagerdata_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3671,7 +4096,7 @@ func (x *VReplicationWaitForPosResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VReplicationWaitForPosResponse.ProtoReflect.Descriptor instead. func (*VReplicationWaitForPosResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{71} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{79} } type InitPrimaryRequest struct { @@ -3685,7 +4110,7 @@ type InitPrimaryRequest struct { func (x *InitPrimaryRequest) Reset() { *x = InitPrimaryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[72] + mi := &file_tabletmanagerdata_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3698,7 +4123,7 @@ func (x *InitPrimaryRequest) String() string { func (*InitPrimaryRequest) ProtoMessage() {} func (x *InitPrimaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[72] + mi := &file_tabletmanagerdata_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3711,7 +4136,7 @@ func (x *InitPrimaryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InitPrimaryRequest.ProtoReflect.Descriptor instead. func (*InitPrimaryRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{72} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{80} } func (x *InitPrimaryRequest) GetSemiSync() bool { @@ -3732,7 +4157,7 @@ type InitPrimaryResponse struct { func (x *InitPrimaryResponse) Reset() { *x = InitPrimaryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[73] + mi := &file_tabletmanagerdata_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3745,7 +4170,7 @@ func (x *InitPrimaryResponse) String() string { func (*InitPrimaryResponse) ProtoMessage() {} func (x *InitPrimaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[73] + mi := &file_tabletmanagerdata_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3758,7 +4183,7 @@ func (x *InitPrimaryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InitPrimaryResponse.ProtoReflect.Descriptor instead. func (*InitPrimaryResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{73} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{81} } func (x *InitPrimaryResponse) GetPosition() string { @@ -3782,7 +4207,7 @@ type PopulateReparentJournalRequest struct { func (x *PopulateReparentJournalRequest) Reset() { *x = PopulateReparentJournalRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[74] + mi := &file_tabletmanagerdata_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3795,7 +4220,7 @@ func (x *PopulateReparentJournalRequest) String() string { func (*PopulateReparentJournalRequest) ProtoMessage() {} func (x *PopulateReparentJournalRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[74] + mi := &file_tabletmanagerdata_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3808,7 +4233,7 @@ func (x *PopulateReparentJournalRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PopulateReparentJournalRequest.ProtoReflect.Descriptor instead. func (*PopulateReparentJournalRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{74} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{82} } func (x *PopulateReparentJournalRequest) GetTimeCreatedNs() int64 { @@ -3848,7 +4273,7 @@ type PopulateReparentJournalResponse struct { func (x *PopulateReparentJournalResponse) Reset() { *x = PopulateReparentJournalResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[75] + mi := &file_tabletmanagerdata_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3861,7 +4286,45 @@ func (x *PopulateReparentJournalResponse) String() string { func (*PopulateReparentJournalResponse) ProtoMessage() {} func (x *PopulateReparentJournalResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[75] + mi := &file_tabletmanagerdata_proto_msgTypes[83] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PopulateReparentJournalResponse.ProtoReflect.Descriptor instead. +func (*PopulateReparentJournalResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{83} +} + +type ReadReparentJournalInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ReadReparentJournalInfoRequest) Reset() { + *x = ReadReparentJournalInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadReparentJournalInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadReparentJournalInfoRequest) ProtoMessage() {} + +func (x *ReadReparentJournalInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3872,9 +4335,56 @@ func (x *PopulateReparentJournalResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PopulateReparentJournalResponse.ProtoReflect.Descriptor instead. -func (*PopulateReparentJournalResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{75} +// Deprecated: Use ReadReparentJournalInfoRequest.ProtoReflect.Descriptor instead. +func (*ReadReparentJournalInfoRequest) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{84} +} + +type ReadReparentJournalInfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Length int32 `protobuf:"varint,1,opt,name=length,proto3" json:"length,omitempty"` +} + +func (x *ReadReparentJournalInfoResponse) Reset() { + *x = ReadReparentJournalInfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[85] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadReparentJournalInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadReparentJournalInfoResponse) ProtoMessage() {} + +func (x *ReadReparentJournalInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[85] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReadReparentJournalInfoResponse.ProtoReflect.Descriptor instead. +func (*ReadReparentJournalInfoResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{85} +} + +func (x *ReadReparentJournalInfoResponse) GetLength() int32 { + if x != nil { + return x.Length + } + return 0 } type InitReplicaRequest struct { @@ -3891,7 +4401,7 @@ type InitReplicaRequest struct { func (x *InitReplicaRequest) Reset() { *x = InitReplicaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[76] + mi := &file_tabletmanagerdata_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3904,7 +4414,7 @@ func (x *InitReplicaRequest) String() string { func (*InitReplicaRequest) ProtoMessage() {} func (x *InitReplicaRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[76] + mi := &file_tabletmanagerdata_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3917,7 +4427,7 @@ func (x *InitReplicaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InitReplicaRequest.ProtoReflect.Descriptor instead. func (*InitReplicaRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{76} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{86} } func (x *InitReplicaRequest) GetParent() *topodata.TabletAlias { @@ -3957,7 +4467,7 @@ type InitReplicaResponse struct { func (x *InitReplicaResponse) Reset() { *x = InitReplicaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[77] + mi := &file_tabletmanagerdata_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3970,7 +4480,7 @@ func (x *InitReplicaResponse) String() string { func (*InitReplicaResponse) ProtoMessage() {} func (x *InitReplicaResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[77] + mi := &file_tabletmanagerdata_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3983,7 +4493,7 @@ func (x *InitReplicaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InitReplicaResponse.ProtoReflect.Descriptor instead. func (*InitReplicaResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{77} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{87} } type DemotePrimaryRequest struct { @@ -3995,7 +4505,7 @@ type DemotePrimaryRequest struct { func (x *DemotePrimaryRequest) Reset() { *x = DemotePrimaryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[78] + mi := &file_tabletmanagerdata_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4008,7 +4518,7 @@ func (x *DemotePrimaryRequest) String() string { func (*DemotePrimaryRequest) ProtoMessage() {} func (x *DemotePrimaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[78] + mi := &file_tabletmanagerdata_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4021,7 +4531,7 @@ func (x *DemotePrimaryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DemotePrimaryRequest.ProtoReflect.Descriptor instead. func (*DemotePrimaryRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{78} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{88} } type DemotePrimaryResponse struct { @@ -4036,7 +4546,7 @@ type DemotePrimaryResponse struct { func (x *DemotePrimaryResponse) Reset() { *x = DemotePrimaryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[79] + mi := &file_tabletmanagerdata_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4049,7 +4559,7 @@ func (x *DemotePrimaryResponse) String() string { func (*DemotePrimaryResponse) ProtoMessage() {} func (x *DemotePrimaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[79] + mi := &file_tabletmanagerdata_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4062,7 +4572,7 @@ func (x *DemotePrimaryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DemotePrimaryResponse.ProtoReflect.Descriptor instead. func (*DemotePrimaryResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{79} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{89} } func (x *DemotePrimaryResponse) GetPrimaryStatus() *replicationdata.PrimaryStatus { @@ -4083,7 +4593,7 @@ type UndoDemotePrimaryRequest struct { func (x *UndoDemotePrimaryRequest) Reset() { *x = UndoDemotePrimaryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[80] + mi := &file_tabletmanagerdata_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4096,7 +4606,7 @@ func (x *UndoDemotePrimaryRequest) String() string { func (*UndoDemotePrimaryRequest) ProtoMessage() {} func (x *UndoDemotePrimaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[80] + mi := &file_tabletmanagerdata_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4109,7 +4619,7 @@ func (x *UndoDemotePrimaryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UndoDemotePrimaryRequest.ProtoReflect.Descriptor instead. func (*UndoDemotePrimaryRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{80} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{90} } func (x *UndoDemotePrimaryRequest) GetSemiSync() bool { @@ -4128,7 +4638,7 @@ type UndoDemotePrimaryResponse struct { func (x *UndoDemotePrimaryResponse) Reset() { *x = UndoDemotePrimaryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[81] + mi := &file_tabletmanagerdata_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4141,7 +4651,7 @@ func (x *UndoDemotePrimaryResponse) String() string { func (*UndoDemotePrimaryResponse) ProtoMessage() {} func (x *UndoDemotePrimaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[81] + mi := &file_tabletmanagerdata_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4154,7 +4664,7 @@ func (x *UndoDemotePrimaryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UndoDemotePrimaryResponse.ProtoReflect.Descriptor instead. func (*UndoDemotePrimaryResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{81} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{91} } type ReplicaWasPromotedRequest struct { @@ -4166,7 +4676,7 @@ type ReplicaWasPromotedRequest struct { func (x *ReplicaWasPromotedRequest) Reset() { *x = ReplicaWasPromotedRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[82] + mi := &file_tabletmanagerdata_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4179,7 +4689,7 @@ func (x *ReplicaWasPromotedRequest) String() string { func (*ReplicaWasPromotedRequest) ProtoMessage() {} func (x *ReplicaWasPromotedRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[82] + mi := &file_tabletmanagerdata_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4192,7 +4702,7 @@ func (x *ReplicaWasPromotedRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicaWasPromotedRequest.ProtoReflect.Descriptor instead. func (*ReplicaWasPromotedRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{82} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{92} } type ReplicaWasPromotedResponse struct { @@ -4204,7 +4714,7 @@ type ReplicaWasPromotedResponse struct { func (x *ReplicaWasPromotedResponse) Reset() { *x = ReplicaWasPromotedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[83] + mi := &file_tabletmanagerdata_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4217,7 +4727,7 @@ func (x *ReplicaWasPromotedResponse) String() string { func (*ReplicaWasPromotedResponse) ProtoMessage() {} func (x *ReplicaWasPromotedResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[83] + mi := &file_tabletmanagerdata_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4230,7 +4740,7 @@ func (x *ReplicaWasPromotedResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicaWasPromotedResponse.ProtoReflect.Descriptor instead. func (*ReplicaWasPromotedResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{83} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{93} } type ResetReplicationParametersRequest struct { @@ -4242,7 +4752,7 @@ type ResetReplicationParametersRequest struct { func (x *ResetReplicationParametersRequest) Reset() { *x = ResetReplicationParametersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[84] + mi := &file_tabletmanagerdata_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4255,7 +4765,7 @@ func (x *ResetReplicationParametersRequest) String() string { func (*ResetReplicationParametersRequest) ProtoMessage() {} func (x *ResetReplicationParametersRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[84] + mi := &file_tabletmanagerdata_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4268,7 +4778,7 @@ func (x *ResetReplicationParametersRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ResetReplicationParametersRequest.ProtoReflect.Descriptor instead. func (*ResetReplicationParametersRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{84} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{94} } type ResetReplicationParametersResponse struct { @@ -4280,7 +4790,7 @@ type ResetReplicationParametersResponse struct { func (x *ResetReplicationParametersResponse) Reset() { *x = ResetReplicationParametersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[85] + mi := &file_tabletmanagerdata_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4293,7 +4803,7 @@ func (x *ResetReplicationParametersResponse) String() string { func (*ResetReplicationParametersResponse) ProtoMessage() {} func (x *ResetReplicationParametersResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[85] + mi := &file_tabletmanagerdata_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4306,7 +4816,7 @@ func (x *ResetReplicationParametersResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ResetReplicationParametersResponse.ProtoReflect.Descriptor instead. func (*ResetReplicationParametersResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{85} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{95} } type FullStatusRequest struct { @@ -4318,7 +4828,7 @@ type FullStatusRequest struct { func (x *FullStatusRequest) Reset() { *x = FullStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[86] + mi := &file_tabletmanagerdata_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4331,7 +4841,7 @@ func (x *FullStatusRequest) String() string { func (*FullStatusRequest) ProtoMessage() {} func (x *FullStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[86] + mi := &file_tabletmanagerdata_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4344,7 +4854,7 @@ func (x *FullStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FullStatusRequest.ProtoReflect.Descriptor instead. func (*FullStatusRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{86} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{96} } type FullStatusResponse struct { @@ -4358,7 +4868,7 @@ type FullStatusResponse struct { func (x *FullStatusResponse) Reset() { *x = FullStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[87] + mi := &file_tabletmanagerdata_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4371,7 +4881,7 @@ func (x *FullStatusResponse) String() string { func (*FullStatusResponse) ProtoMessage() {} func (x *FullStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[87] + mi := &file_tabletmanagerdata_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4384,7 +4894,7 @@ func (x *FullStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FullStatusResponse.ProtoReflect.Descriptor instead. func (*FullStatusResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{87} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{97} } func (x *FullStatusResponse) GetStatus() *replicationdata.FullStatus { @@ -4410,7 +4920,7 @@ type SetReplicationSourceRequest struct { func (x *SetReplicationSourceRequest) Reset() { *x = SetReplicationSourceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[88] + mi := &file_tabletmanagerdata_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4423,7 +4933,7 @@ func (x *SetReplicationSourceRequest) String() string { func (*SetReplicationSourceRequest) ProtoMessage() {} func (x *SetReplicationSourceRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[88] + mi := &file_tabletmanagerdata_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4436,7 +4946,7 @@ func (x *SetReplicationSourceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetReplicationSourceRequest.ProtoReflect.Descriptor instead. func (*SetReplicationSourceRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{88} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{98} } func (x *SetReplicationSourceRequest) GetParent() *topodata.TabletAlias { @@ -4490,7 +5000,7 @@ type SetReplicationSourceResponse struct { func (x *SetReplicationSourceResponse) Reset() { *x = SetReplicationSourceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[89] + mi := &file_tabletmanagerdata_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4503,7 +5013,7 @@ func (x *SetReplicationSourceResponse) String() string { func (*SetReplicationSourceResponse) ProtoMessage() {} func (x *SetReplicationSourceResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[89] + mi := &file_tabletmanagerdata_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4516,7 +5026,7 @@ func (x *SetReplicationSourceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetReplicationSourceResponse.ProtoReflect.Descriptor instead. func (*SetReplicationSourceResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{89} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{99} } type ReplicaWasRestartedRequest struct { @@ -4531,7 +5041,7 @@ type ReplicaWasRestartedRequest struct { func (x *ReplicaWasRestartedRequest) Reset() { *x = ReplicaWasRestartedRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[90] + mi := &file_tabletmanagerdata_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4544,7 +5054,7 @@ func (x *ReplicaWasRestartedRequest) String() string { func (*ReplicaWasRestartedRequest) ProtoMessage() {} func (x *ReplicaWasRestartedRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[90] + mi := &file_tabletmanagerdata_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4557,7 +5067,7 @@ func (x *ReplicaWasRestartedRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicaWasRestartedRequest.ProtoReflect.Descriptor instead. func (*ReplicaWasRestartedRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{90} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{100} } func (x *ReplicaWasRestartedRequest) GetParent() *topodata.TabletAlias { @@ -4576,7 +5086,7 @@ type ReplicaWasRestartedResponse struct { func (x *ReplicaWasRestartedResponse) Reset() { *x = ReplicaWasRestartedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[91] + mi := &file_tabletmanagerdata_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4589,7 +5099,7 @@ func (x *ReplicaWasRestartedResponse) String() string { func (*ReplicaWasRestartedResponse) ProtoMessage() {} func (x *ReplicaWasRestartedResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[91] + mi := &file_tabletmanagerdata_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4602,7 +5112,7 @@ func (x *ReplicaWasRestartedResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicaWasRestartedResponse.ProtoReflect.Descriptor instead. func (*ReplicaWasRestartedResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{91} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{101} } type StopReplicationAndGetStatusRequest struct { @@ -4616,7 +5126,7 @@ type StopReplicationAndGetStatusRequest struct { func (x *StopReplicationAndGetStatusRequest) Reset() { *x = StopReplicationAndGetStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[92] + mi := &file_tabletmanagerdata_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4629,7 +5139,7 @@ func (x *StopReplicationAndGetStatusRequest) String() string { func (*StopReplicationAndGetStatusRequest) ProtoMessage() {} func (x *StopReplicationAndGetStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[92] + mi := &file_tabletmanagerdata_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4642,7 +5152,7 @@ func (x *StopReplicationAndGetStatusRequest) ProtoReflect() protoreflect.Message // Deprecated: Use StopReplicationAndGetStatusRequest.ProtoReflect.Descriptor instead. func (*StopReplicationAndGetStatusRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{92} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{102} } func (x *StopReplicationAndGetStatusRequest) GetStopReplicationMode() replicationdata.StopReplicationMode { @@ -4664,7 +5174,7 @@ type StopReplicationAndGetStatusResponse struct { func (x *StopReplicationAndGetStatusResponse) Reset() { *x = StopReplicationAndGetStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[93] + mi := &file_tabletmanagerdata_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4677,7 +5187,7 @@ func (x *StopReplicationAndGetStatusResponse) String() string { func (*StopReplicationAndGetStatusResponse) ProtoMessage() {} func (x *StopReplicationAndGetStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[93] + mi := &file_tabletmanagerdata_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4690,7 +5200,7 @@ func (x *StopReplicationAndGetStatusResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use StopReplicationAndGetStatusResponse.ProtoReflect.Descriptor instead. func (*StopReplicationAndGetStatusResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{93} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{103} } func (x *StopReplicationAndGetStatusResponse) GetStatus() *replicationdata.StopReplicationStatus { @@ -4711,7 +5221,7 @@ type PromoteReplicaRequest struct { func (x *PromoteReplicaRequest) Reset() { *x = PromoteReplicaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[94] + mi := &file_tabletmanagerdata_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4724,7 +5234,7 @@ func (x *PromoteReplicaRequest) String() string { func (*PromoteReplicaRequest) ProtoMessage() {} func (x *PromoteReplicaRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[94] + mi := &file_tabletmanagerdata_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4737,7 +5247,7 @@ func (x *PromoteReplicaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PromoteReplicaRequest.ProtoReflect.Descriptor instead. func (*PromoteReplicaRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{94} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{104} } func (x *PromoteReplicaRequest) GetSemiSync() bool { @@ -4758,7 +5268,7 @@ type PromoteReplicaResponse struct { func (x *PromoteReplicaResponse) Reset() { *x = PromoteReplicaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[95] + mi := &file_tabletmanagerdata_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4771,7 +5281,7 @@ func (x *PromoteReplicaResponse) String() string { func (*PromoteReplicaResponse) ProtoMessage() {} func (x *PromoteReplicaResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[95] + mi := &file_tabletmanagerdata_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4784,7 +5294,7 @@ func (x *PromoteReplicaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PromoteReplicaResponse.ProtoReflect.Descriptor instead. func (*PromoteReplicaResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{95} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{105} } func (x *PromoteReplicaResponse) GetPosition() string { @@ -4807,12 +5317,14 @@ type BackupRequest struct { // UpgradeSafe indicates if the backup should be taken with innodb_fast_shutdown=0 // so that it's a backup that can be used for an upgrade. UpgradeSafe bool `protobuf:"varint,4,opt,name=upgrade_safe,json=upgradeSafe,proto3" json:"upgrade_safe,omitempty"` + // BackupEngine specifies if we want to use a particular backup engine for this backup request + BackupEngine *string `protobuf:"bytes,5,opt,name=backup_engine,json=backupEngine,proto3,oneof" json:"backup_engine,omitempty"` } func (x *BackupRequest) Reset() { *x = BackupRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[96] + mi := &file_tabletmanagerdata_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4825,7 +5337,7 @@ func (x *BackupRequest) String() string { func (*BackupRequest) ProtoMessage() {} func (x *BackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[96] + mi := &file_tabletmanagerdata_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4838,7 +5350,7 @@ func (x *BackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BackupRequest.ProtoReflect.Descriptor instead. func (*BackupRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{96} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{106} } func (x *BackupRequest) GetConcurrency() int32 { @@ -4869,6 +5381,13 @@ func (x *BackupRequest) GetUpgradeSafe() bool { return false } +func (x *BackupRequest) GetBackupEngine() string { + if x != nil && x.BackupEngine != nil { + return *x.BackupEngine + } + return "" +} + type BackupResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4880,7 +5399,7 @@ type BackupResponse struct { func (x *BackupResponse) Reset() { *x = BackupResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[97] + mi := &file_tabletmanagerdata_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4893,7 +5412,7 @@ func (x *BackupResponse) String() string { func (*BackupResponse) ProtoMessage() {} func (x *BackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[97] + mi := &file_tabletmanagerdata_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4906,7 +5425,7 @@ func (x *BackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BackupResponse.ProtoReflect.Descriptor instead. func (*BackupResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{97} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{107} } func (x *BackupResponse) GetEvent() *logutil.Event { @@ -4931,12 +5450,14 @@ type RestoreFromBackupRequest struct { // RestoreToTimestamp, if given, requested an inremental restore up to (and excluding) the given timestamp. // RestoreToTimestamp and RestoreToPos are mutually exclusive. RestoreToTimestamp *vttime.Time `protobuf:"bytes,4,opt,name=restore_to_timestamp,json=restoreToTimestamp,proto3" json:"restore_to_timestamp,omitempty"` + // AllowedBackupEngines, if present will filter out any backups taken with engines not included in the list + AllowedBackupEngines []string `protobuf:"bytes,5,rep,name=allowed_backup_engines,json=allowedBackupEngines,proto3" json:"allowed_backup_engines,omitempty"` } func (x *RestoreFromBackupRequest) Reset() { *x = RestoreFromBackupRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[98] + mi := &file_tabletmanagerdata_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4949,7 +5470,7 @@ func (x *RestoreFromBackupRequest) String() string { func (*RestoreFromBackupRequest) ProtoMessage() {} func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[98] + mi := &file_tabletmanagerdata_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4962,7 +5483,7 @@ func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupRequest.ProtoReflect.Descriptor instead. func (*RestoreFromBackupRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{98} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{108} } func (x *RestoreFromBackupRequest) GetBackupTime() *vttime.Time { @@ -4993,6 +5514,13 @@ func (x *RestoreFromBackupRequest) GetRestoreToTimestamp() *vttime.Time { return nil } +func (x *RestoreFromBackupRequest) GetAllowedBackupEngines() []string { + if x != nil { + return x.AllowedBackupEngines + } + return nil +} + type RestoreFromBackupResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5004,7 +5532,7 @@ type RestoreFromBackupResponse struct { func (x *RestoreFromBackupResponse) Reset() { *x = RestoreFromBackupResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[99] + mi := &file_tabletmanagerdata_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5017,7 +5545,7 @@ func (x *RestoreFromBackupResponse) String() string { func (*RestoreFromBackupResponse) ProtoMessage() {} func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[99] + mi := &file_tabletmanagerdata_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5030,7 +5558,7 @@ func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupResponse.ProtoReflect.Descriptor instead. func (*RestoreFromBackupResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{99} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{109} } func (x *RestoreFromBackupResponse) GetEvent() *logutil.Event { @@ -5067,7 +5595,7 @@ type CreateVReplicationWorkflowRequest struct { func (x *CreateVReplicationWorkflowRequest) Reset() { *x = CreateVReplicationWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[100] + mi := &file_tabletmanagerdata_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5080,7 +5608,7 @@ func (x *CreateVReplicationWorkflowRequest) String() string { func (*CreateVReplicationWorkflowRequest) ProtoMessage() {} func (x *CreateVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[100] + mi := &file_tabletmanagerdata_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5093,7 +5621,7 @@ func (x *CreateVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message // Deprecated: Use CreateVReplicationWorkflowRequest.ProtoReflect.Descriptor instead. func (*CreateVReplicationWorkflowRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{100} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{110} } func (x *CreateVReplicationWorkflowRequest) GetWorkflow() string { @@ -5159,45 +5687,149 @@ func (x *CreateVReplicationWorkflowRequest) GetAutoStart() bool { return false } -func (x *CreateVReplicationWorkflowRequest) GetStopAfterCopy() bool { +func (x *CreateVReplicationWorkflowRequest) GetStopAfterCopy() bool { + if x != nil { + return x.StopAfterCopy + } + return false +} + +func (x *CreateVReplicationWorkflowRequest) GetOptions() string { + if x != nil { + return x.Options + } + return "" +} + +type CreateVReplicationWorkflowResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Result *query.QueryResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` +} + +func (x *CreateVReplicationWorkflowResponse) Reset() { + *x = CreateVReplicationWorkflowResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[111] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateVReplicationWorkflowResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateVReplicationWorkflowResponse) ProtoMessage() {} + +func (x *CreateVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[111] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateVReplicationWorkflowResponse.ProtoReflect.Descriptor instead. +func (*CreateVReplicationWorkflowResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{111} +} + +func (x *CreateVReplicationWorkflowResponse) GetResult() *query.QueryResult { + if x != nil { + return x.Result + } + return nil +} + +type DeleteTableDataRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The key is the table that we want to delete data from. + // The value is the filter or WHERE clause to use when deleting + // data in the table. + TableFilters map[string]string `protobuf:"bytes,1,rep,name=table_filters,json=tableFilters,proto3" json:"table_filters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // BatchSize is the number of rows to delete in a single batch. + BatchSize int64 `protobuf:"varint,2,opt,name=batch_size,json=batchSize,proto3" json:"batch_size,omitempty"` +} + +func (x *DeleteTableDataRequest) Reset() { + *x = DeleteTableDataRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteTableDataRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteTableDataRequest) ProtoMessage() {} + +func (x *DeleteTableDataRequest) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[112] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteTableDataRequest.ProtoReflect.Descriptor instead. +func (*DeleteTableDataRequest) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{112} +} + +func (x *DeleteTableDataRequest) GetTableFilters() map[string]string { if x != nil { - return x.StopAfterCopy + return x.TableFilters } - return false + return nil } -func (x *CreateVReplicationWorkflowRequest) GetOptions() string { +func (x *DeleteTableDataRequest) GetBatchSize() int64 { if x != nil { - return x.Options + return x.BatchSize } - return "" + return 0 } -type CreateVReplicationWorkflowResponse struct { +type DeleteTableDataResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Result *query.QueryResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` } -func (x *CreateVReplicationWorkflowResponse) Reset() { - *x = CreateVReplicationWorkflowResponse{} +func (x *DeleteTableDataResponse) Reset() { + *x = DeleteTableDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[101] + mi := &file_tabletmanagerdata_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateVReplicationWorkflowResponse) String() string { +func (x *DeleteTableDataResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateVReplicationWorkflowResponse) ProtoMessage() {} +func (*DeleteTableDataResponse) ProtoMessage() {} -func (x *CreateVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[101] +func (x *DeleteTableDataResponse) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5208,16 +5840,9 @@ func (x *CreateVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use CreateVReplicationWorkflowResponse.ProtoReflect.Descriptor instead. -func (*CreateVReplicationWorkflowResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{101} -} - -func (x *CreateVReplicationWorkflowResponse) GetResult() *query.QueryResult { - if x != nil { - return x.Result - } - return nil +// Deprecated: Use DeleteTableDataResponse.ProtoReflect.Descriptor instead. +func (*DeleteTableDataResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{113} } type DeleteVReplicationWorkflowRequest struct { @@ -5231,7 +5856,7 @@ type DeleteVReplicationWorkflowRequest struct { func (x *DeleteVReplicationWorkflowRequest) Reset() { *x = DeleteVReplicationWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[102] + mi := &file_tabletmanagerdata_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5244,7 +5869,7 @@ func (x *DeleteVReplicationWorkflowRequest) String() string { func (*DeleteVReplicationWorkflowRequest) ProtoMessage() {} func (x *DeleteVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[102] + mi := &file_tabletmanagerdata_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5257,7 +5882,7 @@ func (x *DeleteVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message // Deprecated: Use DeleteVReplicationWorkflowRequest.ProtoReflect.Descriptor instead. func (*DeleteVReplicationWorkflowRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{102} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{114} } func (x *DeleteVReplicationWorkflowRequest) GetWorkflow() string { @@ -5278,7 +5903,7 @@ type DeleteVReplicationWorkflowResponse struct { func (x *DeleteVReplicationWorkflowResponse) Reset() { *x = DeleteVReplicationWorkflowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[103] + mi := &file_tabletmanagerdata_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5291,7 +5916,7 @@ func (x *DeleteVReplicationWorkflowResponse) String() string { func (*DeleteVReplicationWorkflowResponse) ProtoMessage() {} func (x *DeleteVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[103] + mi := &file_tabletmanagerdata_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5304,7 +5929,7 @@ func (x *DeleteVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message // Deprecated: Use DeleteVReplicationWorkflowResponse.ProtoReflect.Descriptor instead. func (*DeleteVReplicationWorkflowResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{103} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{115} } func (x *DeleteVReplicationWorkflowResponse) GetResult() *query.QueryResult { @@ -5323,7 +5948,7 @@ type HasVReplicationWorkflowsRequest struct { func (x *HasVReplicationWorkflowsRequest) Reset() { *x = HasVReplicationWorkflowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[104] + mi := &file_tabletmanagerdata_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5336,7 +5961,7 @@ func (x *HasVReplicationWorkflowsRequest) String() string { func (*HasVReplicationWorkflowsRequest) ProtoMessage() {} func (x *HasVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[104] + mi := &file_tabletmanagerdata_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5349,7 +5974,7 @@ func (x *HasVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HasVReplicationWorkflowsRequest.ProtoReflect.Descriptor instead. func (*HasVReplicationWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{104} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{116} } type HasVReplicationWorkflowsResponse struct { @@ -5363,7 +5988,7 @@ type HasVReplicationWorkflowsResponse struct { func (x *HasVReplicationWorkflowsResponse) Reset() { *x = HasVReplicationWorkflowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[105] + mi := &file_tabletmanagerdata_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5376,7 +6001,7 @@ func (x *HasVReplicationWorkflowsResponse) String() string { func (*HasVReplicationWorkflowsResponse) ProtoMessage() {} func (x *HasVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[105] + mi := &file_tabletmanagerdata_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5389,7 +6014,7 @@ func (x *HasVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HasVReplicationWorkflowsResponse.ProtoReflect.Descriptor instead. func (*HasVReplicationWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{105} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{117} } func (x *HasVReplicationWorkflowsResponse) GetHas() bool { @@ -5415,7 +6040,7 @@ type ReadVReplicationWorkflowsRequest struct { func (x *ReadVReplicationWorkflowsRequest) Reset() { *x = ReadVReplicationWorkflowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[106] + mi := &file_tabletmanagerdata_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5428,7 +6053,7 @@ func (x *ReadVReplicationWorkflowsRequest) String() string { func (*ReadVReplicationWorkflowsRequest) ProtoMessage() {} func (x *ReadVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[106] + mi := &file_tabletmanagerdata_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5441,7 +6066,7 @@ func (x *ReadVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadVReplicationWorkflowsRequest.ProtoReflect.Descriptor instead. func (*ReadVReplicationWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{106} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{118} } func (x *ReadVReplicationWorkflowsRequest) GetIncludeIds() []int32 { @@ -5497,7 +6122,7 @@ type ReadVReplicationWorkflowsResponse struct { func (x *ReadVReplicationWorkflowsResponse) Reset() { *x = ReadVReplicationWorkflowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[107] + mi := &file_tabletmanagerdata_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5510,7 +6135,7 @@ func (x *ReadVReplicationWorkflowsResponse) String() string { func (*ReadVReplicationWorkflowsResponse) ProtoMessage() {} func (x *ReadVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[107] + mi := &file_tabletmanagerdata_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5523,7 +6148,7 @@ func (x *ReadVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ReadVReplicationWorkflowsResponse.ProtoReflect.Descriptor instead. func (*ReadVReplicationWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{107} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{119} } func (x *ReadVReplicationWorkflowsResponse) GetWorkflows() []*ReadVReplicationWorkflowResponse { @@ -5544,7 +6169,7 @@ type ReadVReplicationWorkflowRequest struct { func (x *ReadVReplicationWorkflowRequest) Reset() { *x = ReadVReplicationWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[108] + mi := &file_tabletmanagerdata_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5557,7 +6182,7 @@ func (x *ReadVReplicationWorkflowRequest) String() string { func (*ReadVReplicationWorkflowRequest) ProtoMessage() {} func (x *ReadVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[108] + mi := &file_tabletmanagerdata_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5570,7 +6195,7 @@ func (x *ReadVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadVReplicationWorkflowRequest.ProtoReflect.Descriptor instead. func (*ReadVReplicationWorkflowRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{108} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{120} } func (x *ReadVReplicationWorkflowRequest) GetWorkflow() string { @@ -5596,12 +6221,13 @@ type ReadVReplicationWorkflowResponse struct { DeferSecondaryKeys bool `protobuf:"varint,10,opt,name=defer_secondary_keys,json=deferSecondaryKeys,proto3" json:"defer_secondary_keys,omitempty"` Streams []*ReadVReplicationWorkflowResponse_Stream `protobuf:"bytes,11,rep,name=streams,proto3" json:"streams,omitempty"` Options string `protobuf:"bytes,12,opt,name=options,proto3" json:"options,omitempty"` + ConfigOverrides map[string]string `protobuf:"bytes,13,rep,name=config_overrides,json=configOverrides,proto3" json:"config_overrides,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *ReadVReplicationWorkflowResponse) Reset() { *x = ReadVReplicationWorkflowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[109] + mi := &file_tabletmanagerdata_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5614,7 +6240,7 @@ func (x *ReadVReplicationWorkflowResponse) String() string { func (*ReadVReplicationWorkflowResponse) ProtoMessage() {} func (x *ReadVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[109] + mi := &file_tabletmanagerdata_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5627,7 +6253,7 @@ func (x *ReadVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadVReplicationWorkflowResponse.ProtoReflect.Descriptor instead. func (*ReadVReplicationWorkflowResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{109} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{121} } func (x *ReadVReplicationWorkflowResponse) GetWorkflow() string { @@ -5707,6 +6333,109 @@ func (x *ReadVReplicationWorkflowResponse) GetOptions() string { return "" } +func (x *ReadVReplicationWorkflowResponse) GetConfigOverrides() map[string]string { + if x != nil { + return x.ConfigOverrides + } + return nil +} + +type ValidateVReplicationPermissionsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ValidateVReplicationPermissionsRequest) Reset() { + *x = ValidateVReplicationPermissionsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[122] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateVReplicationPermissionsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateVReplicationPermissionsRequest) ProtoMessage() {} + +func (x *ValidateVReplicationPermissionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[122] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateVReplicationPermissionsRequest.ProtoReflect.Descriptor instead. +func (*ValidateVReplicationPermissionsRequest) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{122} +} + +type ValidateVReplicationPermissionsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The --db_filtered_user on the tablet. + User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + // Does the user have the minimum privileges needed to manage + // vreplication metadata. + Ok bool `protobuf:"varint,2,opt,name=ok,proto3" json:"ok,omitempty"` +} + +func (x *ValidateVReplicationPermissionsResponse) Reset() { + *x = ValidateVReplicationPermissionsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[123] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateVReplicationPermissionsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateVReplicationPermissionsResponse) ProtoMessage() {} + +func (x *ValidateVReplicationPermissionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[123] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateVReplicationPermissionsResponse.ProtoReflect.Descriptor instead. +func (*ValidateVReplicationPermissionsResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{123} +} + +func (x *ValidateVReplicationPermissionsResponse) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *ValidateVReplicationPermissionsResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + type VDiffRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5723,7 +6452,7 @@ type VDiffRequest struct { func (x *VDiffRequest) Reset() { *x = VDiffRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[110] + mi := &file_tabletmanagerdata_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5736,7 +6465,7 @@ func (x *VDiffRequest) String() string { func (*VDiffRequest) ProtoMessage() {} func (x *VDiffRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[110] + mi := &file_tabletmanagerdata_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5749,7 +6478,7 @@ func (x *VDiffRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffRequest.ProtoReflect.Descriptor instead. func (*VDiffRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{110} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{124} } func (x *VDiffRequest) GetKeyspace() string { @@ -5807,7 +6536,7 @@ type VDiffResponse struct { func (x *VDiffResponse) Reset() { *x = VDiffResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[111] + mi := &file_tabletmanagerdata_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5820,7 +6549,7 @@ func (x *VDiffResponse) String() string { func (*VDiffResponse) ProtoMessage() {} func (x *VDiffResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[111] + mi := &file_tabletmanagerdata_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5833,7 +6562,7 @@ func (x *VDiffResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffResponse.ProtoReflect.Descriptor instead. func (*VDiffResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{111} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{125} } func (x *VDiffResponse) GetId() int64 { @@ -5871,7 +6600,7 @@ type VDiffPickerOptions struct { func (x *VDiffPickerOptions) Reset() { *x = VDiffPickerOptions{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[112] + mi := &file_tabletmanagerdata_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5884,7 +6613,7 @@ func (x *VDiffPickerOptions) String() string { func (*VDiffPickerOptions) ProtoMessage() {} func (x *VDiffPickerOptions) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[112] + mi := &file_tabletmanagerdata_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5897,7 +6626,7 @@ func (x *VDiffPickerOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffPickerOptions.ProtoReflect.Descriptor instead. func (*VDiffPickerOptions) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{112} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{126} } func (x *VDiffPickerOptions) GetTabletTypes() string { @@ -5927,16 +6656,17 @@ type VDiffReportOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OnlyPks bool `protobuf:"varint,1,opt,name=only_pks,json=onlyPks,proto3" json:"only_pks,omitempty"` - DebugQuery bool `protobuf:"varint,2,opt,name=debug_query,json=debugQuery,proto3" json:"debug_query,omitempty"` - Format string `protobuf:"bytes,3,opt,name=format,proto3" json:"format,omitempty"` - MaxSampleRows int64 `protobuf:"varint,4,opt,name=max_sample_rows,json=maxSampleRows,proto3" json:"max_sample_rows,omitempty"` + OnlyPks bool `protobuf:"varint,1,opt,name=only_pks,json=onlyPks,proto3" json:"only_pks,omitempty"` + DebugQuery bool `protobuf:"varint,2,opt,name=debug_query,json=debugQuery,proto3" json:"debug_query,omitempty"` + Format string `protobuf:"bytes,3,opt,name=format,proto3" json:"format,omitempty"` + MaxSampleRows int64 `protobuf:"varint,4,opt,name=max_sample_rows,json=maxSampleRows,proto3" json:"max_sample_rows,omitempty"` + RowDiffColumnTruncateAt int64 `protobuf:"varint,5,opt,name=row_diff_column_truncate_at,json=rowDiffColumnTruncateAt,proto3" json:"row_diff_column_truncate_at,omitempty"` } func (x *VDiffReportOptions) Reset() { *x = VDiffReportOptions{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[113] + mi := &file_tabletmanagerdata_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5949,7 +6679,7 @@ func (x *VDiffReportOptions) String() string { func (*VDiffReportOptions) ProtoMessage() {} func (x *VDiffReportOptions) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[113] + mi := &file_tabletmanagerdata_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5962,7 +6692,7 @@ func (x *VDiffReportOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffReportOptions.ProtoReflect.Descriptor instead. func (*VDiffReportOptions) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{113} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{127} } func (x *VDiffReportOptions) GetOnlyPks() bool { @@ -5993,6 +6723,13 @@ func (x *VDiffReportOptions) GetMaxSampleRows() int64 { return 0 } +func (x *VDiffReportOptions) GetRowDiffColumnTruncateAt() int64 { + if x != nil { + return x.RowDiffColumnTruncateAt + } + return 0 +} + type VDiffCoreOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6007,12 +6744,13 @@ type VDiffCoreOptions struct { MaxExtraRowsToCompare int64 `protobuf:"varint,7,opt,name=max_extra_rows_to_compare,json=maxExtraRowsToCompare,proto3" json:"max_extra_rows_to_compare,omitempty"` UpdateTableStats bool `protobuf:"varint,8,opt,name=update_table_stats,json=updateTableStats,proto3" json:"update_table_stats,omitempty"` MaxDiffSeconds int64 `protobuf:"varint,9,opt,name=max_diff_seconds,json=maxDiffSeconds,proto3" json:"max_diff_seconds,omitempty"` + AutoStart *bool `protobuf:"varint,10,opt,name=auto_start,json=autoStart,proto3,oneof" json:"auto_start,omitempty"` } func (x *VDiffCoreOptions) Reset() { *x = VDiffCoreOptions{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[114] + mi := &file_tabletmanagerdata_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6025,7 +6763,7 @@ func (x *VDiffCoreOptions) String() string { func (*VDiffCoreOptions) ProtoMessage() {} func (x *VDiffCoreOptions) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[114] + mi := &file_tabletmanagerdata_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6038,7 +6776,7 @@ func (x *VDiffCoreOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffCoreOptions.ProtoReflect.Descriptor instead. func (*VDiffCoreOptions) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{114} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{128} } func (x *VDiffCoreOptions) GetTables() string { @@ -6104,6 +6842,13 @@ func (x *VDiffCoreOptions) GetMaxDiffSeconds() int64 { return 0 } +func (x *VDiffCoreOptions) GetAutoStart() bool { + if x != nil && x.AutoStart != nil { + return *x.AutoStart + } + return false +} + type VDiffOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6117,7 +6862,7 @@ type VDiffOptions struct { func (x *VDiffOptions) Reset() { *x = VDiffOptions{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[115] + mi := &file_tabletmanagerdata_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6130,7 +6875,7 @@ func (x *VDiffOptions) String() string { func (*VDiffOptions) ProtoMessage() {} func (x *VDiffOptions) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[115] + mi := &file_tabletmanagerdata_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6143,7 +6888,7 @@ func (x *VDiffOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffOptions.ProtoReflect.Descriptor instead. func (*VDiffOptions) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{115} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{129} } func (x *VDiffOptions) GetPickerOptions() *VDiffPickerOptions { @@ -6178,18 +6923,19 @@ type UpdateVReplicationWorkflowRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Workflow string `protobuf:"bytes,1,opt,name=workflow,proto3" json:"workflow,omitempty"` - Cells []string `protobuf:"bytes,2,rep,name=cells,proto3" json:"cells,omitempty"` - TabletTypes []topodata.TabletType `protobuf:"varint,3,rep,packed,name=tablet_types,json=tabletTypes,proto3,enum=topodata.TabletType" json:"tablet_types,omitempty"` - TabletSelectionPreference TabletSelectionPreference `protobuf:"varint,4,opt,name=tablet_selection_preference,json=tabletSelectionPreference,proto3,enum=tabletmanagerdata.TabletSelectionPreference" json:"tablet_selection_preference,omitempty"` - OnDdl binlogdata.OnDDLAction `protobuf:"varint,5,opt,name=on_ddl,json=onDdl,proto3,enum=binlogdata.OnDDLAction" json:"on_ddl,omitempty"` - State binlogdata.VReplicationWorkflowState `protobuf:"varint,6,opt,name=state,proto3,enum=binlogdata.VReplicationWorkflowState" json:"state,omitempty"` + Workflow string `protobuf:"bytes,1,opt,name=workflow,proto3" json:"workflow,omitempty"` + Cells []string `protobuf:"bytes,2,rep,name=cells,proto3" json:"cells,omitempty"` + TabletTypes []topodata.TabletType `protobuf:"varint,3,rep,packed,name=tablet_types,json=tabletTypes,proto3,enum=topodata.TabletType" json:"tablet_types,omitempty"` + TabletSelectionPreference *TabletSelectionPreference `protobuf:"varint,4,opt,name=tablet_selection_preference,json=tabletSelectionPreference,proto3,enum=tabletmanagerdata.TabletSelectionPreference,oneof" json:"tablet_selection_preference,omitempty"` + OnDdl *binlogdata.OnDDLAction `protobuf:"varint,5,opt,name=on_ddl,json=onDdl,proto3,enum=binlogdata.OnDDLAction,oneof" json:"on_ddl,omitempty"` + State *binlogdata.VReplicationWorkflowState `protobuf:"varint,6,opt,name=state,proto3,enum=binlogdata.VReplicationWorkflowState,oneof" json:"state,omitempty"` + ConfigOverrides map[string]string `protobuf:"bytes,8,rep,name=config_overrides,json=configOverrides,proto3" json:"config_overrides,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *UpdateVReplicationWorkflowRequest) Reset() { *x = UpdateVReplicationWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[116] + mi := &file_tabletmanagerdata_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6202,7 +6948,7 @@ func (x *UpdateVReplicationWorkflowRequest) String() string { func (*UpdateVReplicationWorkflowRequest) ProtoMessage() {} func (x *UpdateVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[116] + mi := &file_tabletmanagerdata_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6215,7 +6961,7 @@ func (x *UpdateVReplicationWorkflowRequest) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateVReplicationWorkflowRequest.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{116} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{130} } func (x *UpdateVReplicationWorkflowRequest) GetWorkflow() string { @@ -6240,26 +6986,33 @@ func (x *UpdateVReplicationWorkflowRequest) GetTabletTypes() []topodata.TabletTy } func (x *UpdateVReplicationWorkflowRequest) GetTabletSelectionPreference() TabletSelectionPreference { - if x != nil { - return x.TabletSelectionPreference + if x != nil && x.TabletSelectionPreference != nil { + return *x.TabletSelectionPreference } return TabletSelectionPreference_ANY } func (x *UpdateVReplicationWorkflowRequest) GetOnDdl() binlogdata.OnDDLAction { - if x != nil { - return x.OnDdl + if x != nil && x.OnDdl != nil { + return *x.OnDdl } return binlogdata.OnDDLAction(0) } func (x *UpdateVReplicationWorkflowRequest) GetState() binlogdata.VReplicationWorkflowState { - if x != nil { - return x.State + if x != nil && x.State != nil { + return *x.State } return binlogdata.VReplicationWorkflowState(0) } +func (x *UpdateVReplicationWorkflowRequest) GetConfigOverrides() map[string]string { + if x != nil { + return x.ConfigOverrides + } + return nil +} + type UpdateVReplicationWorkflowResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6271,7 +7024,7 @@ type UpdateVReplicationWorkflowResponse struct { func (x *UpdateVReplicationWorkflowResponse) Reset() { *x = UpdateVReplicationWorkflowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[117] + mi := &file_tabletmanagerdata_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6284,7 +7037,7 @@ func (x *UpdateVReplicationWorkflowResponse) String() string { func (*UpdateVReplicationWorkflowResponse) ProtoMessage() {} func (x *UpdateVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[117] + mi := &file_tabletmanagerdata_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6297,7 +7050,7 @@ func (x *UpdateVReplicationWorkflowResponse) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateVReplicationWorkflowResponse.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{117} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{131} } func (x *UpdateVReplicationWorkflowResponse) GetResult() *query.QueryResult { @@ -6318,18 +7071,18 @@ type UpdateVReplicationWorkflowsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AllWorkflows bool `protobuf:"varint,1,opt,name=all_workflows,json=allWorkflows,proto3" json:"all_workflows,omitempty"` - IncludeWorkflows []string `protobuf:"bytes,2,rep,name=include_workflows,json=includeWorkflows,proto3" json:"include_workflows,omitempty"` - ExcludeWorkflows []string `protobuf:"bytes,3,rep,name=exclude_workflows,json=excludeWorkflows,proto3" json:"exclude_workflows,omitempty"` - State binlogdata.VReplicationWorkflowState `protobuf:"varint,4,opt,name=state,proto3,enum=binlogdata.VReplicationWorkflowState" json:"state,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` - StopPosition string `protobuf:"bytes,6,opt,name=stop_position,json=stopPosition,proto3" json:"stop_position,omitempty"` + AllWorkflows bool `protobuf:"varint,1,opt,name=all_workflows,json=allWorkflows,proto3" json:"all_workflows,omitempty"` + IncludeWorkflows []string `protobuf:"bytes,2,rep,name=include_workflows,json=includeWorkflows,proto3" json:"include_workflows,omitempty"` + ExcludeWorkflows []string `protobuf:"bytes,3,rep,name=exclude_workflows,json=excludeWorkflows,proto3" json:"exclude_workflows,omitempty"` + State *binlogdata.VReplicationWorkflowState `protobuf:"varint,4,opt,name=state,proto3,enum=binlogdata.VReplicationWorkflowState,oneof" json:"state,omitempty"` + Message *string `protobuf:"bytes,5,opt,name=message,proto3,oneof" json:"message,omitempty"` + StopPosition *string `protobuf:"bytes,6,opt,name=stop_position,json=stopPosition,proto3,oneof" json:"stop_position,omitempty"` } func (x *UpdateVReplicationWorkflowsRequest) Reset() { *x = UpdateVReplicationWorkflowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[118] + mi := &file_tabletmanagerdata_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6342,7 +7095,7 @@ func (x *UpdateVReplicationWorkflowsRequest) String() string { func (*UpdateVReplicationWorkflowsRequest) ProtoMessage() {} func (x *UpdateVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[118] + mi := &file_tabletmanagerdata_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6355,7 +7108,7 @@ func (x *UpdateVReplicationWorkflowsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateVReplicationWorkflowsRequest.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{118} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{132} } func (x *UpdateVReplicationWorkflowsRequest) GetAllWorkflows() bool { @@ -6380,22 +7133,22 @@ func (x *UpdateVReplicationWorkflowsRequest) GetExcludeWorkflows() []string { } func (x *UpdateVReplicationWorkflowsRequest) GetState() binlogdata.VReplicationWorkflowState { - if x != nil { - return x.State + if x != nil && x.State != nil { + return *x.State } return binlogdata.VReplicationWorkflowState(0) } func (x *UpdateVReplicationWorkflowsRequest) GetMessage() string { - if x != nil { - return x.Message + if x != nil && x.Message != nil { + return *x.Message } return "" } func (x *UpdateVReplicationWorkflowsRequest) GetStopPosition() string { - if x != nil { - return x.StopPosition + if x != nil && x.StopPosition != nil { + return *x.StopPosition } return "" } @@ -6411,7 +7164,7 @@ type UpdateVReplicationWorkflowsResponse struct { func (x *UpdateVReplicationWorkflowsResponse) Reset() { *x = UpdateVReplicationWorkflowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[119] + mi := &file_tabletmanagerdata_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6424,7 +7177,7 @@ func (x *UpdateVReplicationWorkflowsResponse) String() string { func (*UpdateVReplicationWorkflowsResponse) ProtoMessage() {} func (x *UpdateVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[119] + mi := &file_tabletmanagerdata_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6437,7 +7190,7 @@ func (x *UpdateVReplicationWorkflowsResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use UpdateVReplicationWorkflowsResponse.ProtoReflect.Descriptor instead. func (*UpdateVReplicationWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{119} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{133} } func (x *UpdateVReplicationWorkflowsResponse) GetResult() *query.QueryResult { @@ -6458,7 +7211,7 @@ type ResetSequencesRequest struct { func (x *ResetSequencesRequest) Reset() { *x = ResetSequencesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[120] + mi := &file_tabletmanagerdata_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6471,7 +7224,7 @@ func (x *ResetSequencesRequest) String() string { func (*ResetSequencesRequest) ProtoMessage() {} func (x *ResetSequencesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[120] + mi := &file_tabletmanagerdata_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6484,7 +7237,7 @@ func (x *ResetSequencesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetSequencesRequest.ProtoReflect.Descriptor instead. func (*ResetSequencesRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{120} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{134} } func (x *ResetSequencesRequest) GetTables() []string { @@ -6503,7 +7256,7 @@ type ResetSequencesResponse struct { func (x *ResetSequencesResponse) Reset() { *x = ResetSequencesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[121] + mi := &file_tabletmanagerdata_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6516,7 +7269,7 @@ func (x *ResetSequencesResponse) String() string { func (*ResetSequencesResponse) ProtoMessage() {} func (x *ResetSequencesResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[121] + mi := &file_tabletmanagerdata_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6529,7 +7282,7 @@ func (x *ResetSequencesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetSequencesResponse.ProtoReflect.Descriptor instead. func (*ResetSequencesResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{121} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{135} } type CheckThrottlerRequest struct { @@ -6551,7 +7304,7 @@ type CheckThrottlerRequest struct { func (x *CheckThrottlerRequest) Reset() { *x = CheckThrottlerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[122] + mi := &file_tabletmanagerdata_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6564,7 +7317,7 @@ func (x *CheckThrottlerRequest) String() string { func (*CheckThrottlerRequest) ProtoMessage() {} func (x *CheckThrottlerRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[122] + mi := &file_tabletmanagerdata_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6577,7 +7330,7 @@ func (x *CheckThrottlerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerRequest.ProtoReflect.Descriptor instead. func (*CheckThrottlerRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{122} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{136} } func (x *CheckThrottlerRequest) GetAppName() string { @@ -6636,12 +7389,18 @@ type CheckThrottlerResponse struct { // Metrics is a map (metric name -> metric value/error) so that the client has as much // information as possible about all the checked metrics. Metrics map[string]*CheckThrottlerResponse_Metric `protobuf:"bytes,7,rep,name=metrics,proto3" json:"metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // AppName is the name of app that was matched by the throttler + AppName string `protobuf:"bytes,8,opt,name=app_name,json=appName,proto3" json:"app_name,omitempty"` + // Summary is a human readable analysis of the result + Summary string `protobuf:"bytes,9,opt,name=summary,proto3" json:"summary,omitempty"` + // ResponseCode is the enum representation of the response + ResponseCode CheckThrottlerResponseCode `protobuf:"varint,10,opt,name=response_code,json=responseCode,proto3,enum=tabletmanagerdata.CheckThrottlerResponseCode" json:"response_code,omitempty"` } func (x *CheckThrottlerResponse) Reset() { *x = CheckThrottlerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[123] + mi := &file_tabletmanagerdata_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6654,7 +7413,7 @@ func (x *CheckThrottlerResponse) String() string { func (*CheckThrottlerResponse) ProtoMessage() {} func (x *CheckThrottlerResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[123] + mi := &file_tabletmanagerdata_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6667,7 +7426,7 @@ func (x *CheckThrottlerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerResponse.ProtoReflect.Descriptor instead. func (*CheckThrottlerResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{123} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{137} } func (x *CheckThrottlerResponse) GetStatusCode() int32 { @@ -6719,6 +7478,27 @@ func (x *CheckThrottlerResponse) GetMetrics() map[string]*CheckThrottlerResponse return nil } +func (x *CheckThrottlerResponse) GetAppName() string { + if x != nil { + return x.AppName + } + return "" +} + +func (x *CheckThrottlerResponse) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *CheckThrottlerResponse) GetResponseCode() CheckThrottlerResponseCode { + if x != nil { + return x.ResponseCode + } + return CheckThrottlerResponseCode_UNDEFINED +} + type GetThrottlerStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6728,7 +7508,7 @@ type GetThrottlerStatusRequest struct { func (x *GetThrottlerStatusRequest) Reset() { *x = GetThrottlerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[124] + mi := &file_tabletmanagerdata_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6741,7 +7521,7 @@ func (x *GetThrottlerStatusRequest) String() string { func (*GetThrottlerStatusRequest) ProtoMessage() {} func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[124] + mi := &file_tabletmanagerdata_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6754,7 +7534,7 @@ func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusRequest.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusRequest) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{124} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{138} } type GetThrottlerStatusResponse struct { @@ -6803,7 +7583,7 @@ type GetThrottlerStatusResponse struct { func (x *GetThrottlerStatusResponse) Reset() { *x = GetThrottlerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[125] + mi := &file_tabletmanagerdata_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6816,7 +7596,7 @@ func (x *GetThrottlerStatusResponse) String() string { func (*GetThrottlerStatusResponse) ProtoMessage() {} func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[125] + mi := &file_tabletmanagerdata_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6829,7 +7609,7 @@ func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusResponse.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{125} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139} } func (x *GetThrottlerStatusResponse) GetTabletAlias() string { @@ -6958,6 +7738,108 @@ func (x *GetThrottlerStatusResponse) GetRecentApps() map[string]*GetThrottlerSta return nil } +type ChangeTagsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Replace bool `protobuf:"varint,2,opt,name=replace,proto3" json:"replace,omitempty"` +} + +func (x *ChangeTagsRequest) Reset() { + *x = ChangeTagsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[140] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeTagsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeTagsRequest) ProtoMessage() {} + +func (x *ChangeTagsRequest) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[140] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeTagsRequest.ProtoReflect.Descriptor instead. +func (*ChangeTagsRequest) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{140} +} + +func (x *ChangeTagsRequest) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *ChangeTagsRequest) GetReplace() bool { + if x != nil { + return x.Replace + } + return false +} + +type ChangeTagsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ChangeTagsResponse) Reset() { + *x = ChangeTagsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_tabletmanagerdata_proto_msgTypes[141] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeTagsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeTagsResponse) ProtoMessage() {} + +func (x *ChangeTagsResponse) ProtoReflect() protoreflect.Message { + mi := &file_tabletmanagerdata_proto_msgTypes[141] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeTagsResponse.ProtoReflect.Descriptor instead. +func (*ChangeTagsResponse) Descriptor() ([]byte, []int) { + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{141} +} + +func (x *ChangeTagsResponse) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + type ReadVReplicationWorkflowResponse_Stream struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6982,7 +7864,7 @@ type ReadVReplicationWorkflowResponse_Stream struct { func (x *ReadVReplicationWorkflowResponse_Stream) Reset() { *x = ReadVReplicationWorkflowResponse_Stream{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[130] + mi := &file_tabletmanagerdata_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6995,7 +7877,7 @@ func (x *ReadVReplicationWorkflowResponse_Stream) String() string { func (*ReadVReplicationWorkflowResponse_Stream) ProtoMessage() {} func (x *ReadVReplicationWorkflowResponse_Stream) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[130] + mi := &file_tabletmanagerdata_proto_msgTypes[147] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7008,7 +7890,7 @@ func (x *ReadVReplicationWorkflowResponse_Stream) ProtoReflect() protoreflect.Me // Deprecated: Use ReadVReplicationWorkflowResponse_Stream.ProtoReflect.Descriptor instead. func (*ReadVReplicationWorkflowResponse_Stream) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{109, 0} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{121, 0} } func (x *ReadVReplicationWorkflowResponse_Stream) GetId() int32 { @@ -7128,12 +8010,14 @@ type CheckThrottlerResponse_Metric struct { Message string `protobuf:"bytes,6,opt,name=message,proto3" json:"message,omitempty"` // Scope used in this check Scope string `protobuf:"bytes,7,opt,name=scope,proto3" json:"scope,omitempty"` + // ResponseCode is the enum representation of the response + ResponseCode CheckThrottlerResponseCode `protobuf:"varint,8,opt,name=response_code,json=responseCode,proto3,enum=tabletmanagerdata.CheckThrottlerResponseCode" json:"response_code,omitempty"` } func (x *CheckThrottlerResponse_Metric) Reset() { *x = CheckThrottlerResponse_Metric{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[131] + mi := &file_tabletmanagerdata_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7146,7 +8030,7 @@ func (x *CheckThrottlerResponse_Metric) String() string { func (*CheckThrottlerResponse_Metric) ProtoMessage() {} func (x *CheckThrottlerResponse_Metric) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[131] + mi := &file_tabletmanagerdata_proto_msgTypes[150] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7159,7 +8043,7 @@ func (x *CheckThrottlerResponse_Metric) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerResponse_Metric.ProtoReflect.Descriptor instead. func (*CheckThrottlerResponse_Metric) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{123, 0} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{137, 0} } func (x *CheckThrottlerResponse_Metric) GetName() string { @@ -7211,6 +8095,13 @@ func (x *CheckThrottlerResponse_Metric) GetScope() string { return "" } +func (x *CheckThrottlerResponse_Metric) GetResponseCode() CheckThrottlerResponseCode { + if x != nil { + return x.ResponseCode + } + return CheckThrottlerResponseCode_UNDEFINED +} + type GetThrottlerStatusResponse_MetricResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -7223,7 +8114,7 @@ type GetThrottlerStatusResponse_MetricResult struct { func (x *GetThrottlerStatusResponse_MetricResult) Reset() { *x = GetThrottlerStatusResponse_MetricResult{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[133] + mi := &file_tabletmanagerdata_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7236,7 +8127,7 @@ func (x *GetThrottlerStatusResponse_MetricResult) String() string { func (*GetThrottlerStatusResponse_MetricResult) ProtoMessage() {} func (x *GetThrottlerStatusResponse_MetricResult) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[133] + mi := &file_tabletmanagerdata_proto_msgTypes[152] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7249,7 +8140,7 @@ func (x *GetThrottlerStatusResponse_MetricResult) ProtoReflect() protoreflect.Me // Deprecated: Use GetThrottlerStatusResponse_MetricResult.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse_MetricResult) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{125, 0} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139, 0} } func (x *GetThrottlerStatusResponse_MetricResult) GetValue() float64 { @@ -7278,7 +8169,7 @@ type GetThrottlerStatusResponse_MetricHealth struct { func (x *GetThrottlerStatusResponse_MetricHealth) Reset() { *x = GetThrottlerStatusResponse_MetricHealth{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[136] + mi := &file_tabletmanagerdata_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7291,7 +8182,7 @@ func (x *GetThrottlerStatusResponse_MetricHealth) String() string { func (*GetThrottlerStatusResponse_MetricHealth) ProtoMessage() {} func (x *GetThrottlerStatusResponse_MetricHealth) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[136] + mi := &file_tabletmanagerdata_proto_msgTypes[155] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7304,7 +8195,7 @@ func (x *GetThrottlerStatusResponse_MetricHealth) ProtoReflect() protoreflect.Me // Deprecated: Use GetThrottlerStatusResponse_MetricHealth.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse_MetricHealth) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{125, 3} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139, 3} } func (x *GetThrottlerStatusResponse_MetricHealth) GetLastHealthyAt() *vttime.Time { @@ -7328,12 +8219,14 @@ type GetThrottlerStatusResponse_RecentApp struct { CheckedAt *vttime.Time `protobuf:"bytes,1,opt,name=checked_at,json=checkedAt,proto3" json:"checked_at,omitempty"` StatusCode int32 `protobuf:"varint,2,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` + // ResponseCode is the enum representation of the response + ResponseCode CheckThrottlerResponseCode `protobuf:"varint,3,opt,name=response_code,json=responseCode,proto3,enum=tabletmanagerdata.CheckThrottlerResponseCode" json:"response_code,omitempty"` } func (x *GetThrottlerStatusResponse_RecentApp) Reset() { *x = GetThrottlerStatusResponse_RecentApp{} if protoimpl.UnsafeEnabled { - mi := &file_tabletmanagerdata_proto_msgTypes[140] + mi := &file_tabletmanagerdata_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7346,7 +8239,7 @@ func (x *GetThrottlerStatusResponse_RecentApp) String() string { func (*GetThrottlerStatusResponse_RecentApp) ProtoMessage() {} func (x *GetThrottlerStatusResponse_RecentApp) ProtoReflect() protoreflect.Message { - mi := &file_tabletmanagerdata_proto_msgTypes[140] + mi := &file_tabletmanagerdata_proto_msgTypes[159] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7359,7 +8252,7 @@ func (x *GetThrottlerStatusResponse_RecentApp) ProtoReflect() protoreflect.Messa // Deprecated: Use GetThrottlerStatusResponse_RecentApp.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse_RecentApp) Descriptor() ([]byte, []int) { - return file_tabletmanagerdata_proto_rawDescGZIP(), []int{125, 7} + return file_tabletmanagerdata_proto_rawDescGZIP(), []int{139, 7} } func (x *GetThrottlerStatusResponse_RecentApp) GetCheckedAt() *vttime.Time { @@ -7376,6 +8269,13 @@ func (x *GetThrottlerStatusResponse_RecentApp) GetStatusCode() int32 { return 0 } +func (x *GetThrottlerStatusResponse_RecentApp) GetResponseCode() CheckThrottlerResponseCode { + if x != nil { + return x.ResponseCode + } + return CheckThrottlerResponseCode_UNDEFINED +} + var File_tabletmanagerdata_proto protoreflect.FileDescriptor var file_tabletmanagerdata_proto_rawDesc = []byte{ @@ -7388,7 +8288,8 @@ var file_tabletmanagerdata_proto_rawDesc = []byte{ 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0d, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x0b, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xff, 0x01, 0x0a, + 0x0b, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xff, 0x01, 0x0a, 0x0f, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, @@ -7684,319 +8585,276 @@ var file_tabletmanagerdata_proto_rawDesc = []byte{ 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x19, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4f, 0x0a, 0x15, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x18, 0x0a, 0x16, - 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x35, 0x0a, 0x17, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x34, 0x0a, - 0x16, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, - 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x77, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x22, 0x3c, 0x0a, 0x1e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x35, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x0a, 0x21, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x77, 0x61, 0x69, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x24, 0x0a, 0x22, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x74, 0x69, - 0x6c, 0x41, 0x66, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x2b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, - 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, - 0x73, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1a, 0x0a, 0x18, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x17, 0x56, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x46, 0x0a, 0x18, 0x56, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x4b, 0x0a, 0x1d, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, - 0x0a, 0x1e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x30, 0x0a, 0x12, 0x49, 0x6e, 0x69, 0x74, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, + 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x43, 0x0a, 0x20, 0x47, 0x65, 0x74, + 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x22, 0x63, + 0x0a, 0x21, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x2c, 0x0a, 0x16, 0x52, 0x65, 0x61, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, + 0x64, 0x22, 0x57, 0x0a, 0x17, 0x52, 0x65, 0x61, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x40, 0x0a, 0x1a, 0x43, 0x6f, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x12, 0x0e, 0x0a, 0x02, + 0x6d, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6d, 0x6d, 0x22, 0x1d, 0x0a, 0x1b, + 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x4d, + 0x79, 0x73, 0x71, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5b, 0x0a, 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x48, + 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, + 0x74, 0x6c, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0b, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x4c, 0x0a, 0x19, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x16, 0x0a, + 0x14, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4f, 0x0a, 0x15, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x35, 0x0a, 0x17, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x34, 0x0a, 0x16, 0x57, 0x61, 0x69, 0x74, 0x46, + 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x19, 0x0a, + 0x17, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x0a, + 0x1d, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x61, + 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x77, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x3c, 0x0a, + 0x1e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x17, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, - 0x6e, 0x63, 0x22, 0x31, 0x0a, 0x13, 0x49, 0x6e, 0x69, 0x74, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd8, 0x01, 0x0a, 0x1e, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0c, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x31, 0x0a, - 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x12, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x4e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, - 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x64, 0x0a, 0x15, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, - 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x36, 0x0a, 0x18, 0x55, 0x6e, 0x64, 0x6f, 0x44, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x1b, 0x0a, - 0x19, 0x55, 0x6e, 0x64, 0x6f, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x0a, 0x21, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x24, 0x0a, 0x22, 0x52, 0x65, - 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x13, 0x0a, 0x11, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x12, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, - 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x9c, 0x02, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, - 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, - 0x12, 0x2d, 0x0a, 0x12, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x68, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, - 0x1e, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4b, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x52, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x1d, 0x0a, 0x1b, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7e, 0x0a, 0x22, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, - 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x58, 0x0a, 0x15, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x24, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x13, 0x73, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x6b, 0x0a, 0x23, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, - 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x33, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6d, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x34, 0x0a, - 0x16, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xab, 0x01, 0x0a, 0x0d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x14, - 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, 0x61, 0x66, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x61, 0x66, - 0x65, 0x22, 0x36, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x18, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, - 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, - 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x74, 0x6f, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x12, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0x41, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, - 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xee, 0x04, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x3d, 0x0a, 0x0d, 0x62, 0x69, 0x6e, - 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, 0x69, - 0x6e, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x69, 0x6e, 0x6c, - 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, - 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x53, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x75, 0x62, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x62, 0x69, - 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, - 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, - 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x50, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, - 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3f, 0x0a, 0x21, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x50, 0x0a, 0x22, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x21, 0x0a, - 0x1f, 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x34, 0x0a, 0x20, 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x03, 0x68, 0x61, 0x73, 0x22, 0xe0, 0x02, 0x0a, 0x20, 0x52, 0x65, 0x61, 0x64, 0x56, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, - 0x52, 0x0a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x49, 0x64, 0x73, 0x12, 0x2b, 0x0a, 0x11, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x4c, 0x0a, 0x0e, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x4c, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66, 0x72, - 0x6f, 0x7a, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x46, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x22, 0x76, 0x0a, 0x21, 0x52, 0x65, 0x61, - 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, - 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x22, 0x3d, 0x0a, 0x1f, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x22, 0xae, 0x09, 0x0a, 0x20, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x6e, 0x63, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, + 0x0a, 0x21, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x41, 0x66, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x21, 0x0a, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x77, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x22, 0x24, 0x0a, 0x22, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2b, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x52, + 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x17, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x46, 0x0a, 0x18, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x4b, 0x0a, 0x1d, 0x56, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x69, 0x74, 0x46, + 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x1e, 0x56, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, + 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x0a, 0x12, 0x49, 0x6e, + 0x69, 0x74, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x31, 0x0a, 0x13, + 0x49, 0x6e, 0x69, 0x74, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xd8, 0x01, 0x0a, 0x1e, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, + 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x6f, + 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x6f, + 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x0a, + 0x1e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x6f, 0x75, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x39, 0x0a, 0x1f, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4a, + 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0xba, 0x01, 0x0a, 0x12, 0x49, + 0x6e, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, + 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, + 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x15, 0x0a, 0x13, 0x49, 0x6e, 0x69, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, + 0x0a, 0x14, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x64, 0x0a, 0x15, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x45, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x36, 0x0a, 0x18, + 0x55, 0x6e, 0x64, 0x6f, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x69, + 0x53, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x69, + 0x53, 0x79, 0x6e, 0x63, 0x22, 0x1b, 0x0a, 0x19, 0x55, 0x6e, 0x64, 0x6f, 0x44, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x50, + 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1c, + 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6d, + 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x0a, 0x21, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x24, 0x0a, 0x22, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x0a, 0x11, 0x46, 0x75, 0x6c, 0x6c, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x12, + 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x9c, 0x02, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x73, 0x12, 0x36, + 0x0a, 0x17, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, + 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, + 0x65, 0x6d, 0x69, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x2d, 0x0a, 0x12, 0x68, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x11, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x1e, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x57, 0x61, 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, + 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x7e, 0x0a, 0x22, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x15, 0x73, 0x74, 0x6f, 0x70, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x13, 0x73, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, + 0x64, 0x65, 0x22, 0x6b, 0x0a, 0x23, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, + 0x33, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x69, + 0x53, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x69, + 0x53, 0x79, 0x6e, 0x63, 0x22, 0x34, 0x0a, 0x16, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe7, 0x01, 0x0a, 0x0d, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x23, + 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x72, + 0x6f, 0x6d, 0x50, 0x6f, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x5f, 0x73, 0x61, 0x66, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x53, 0x61, 0x66, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x22, 0x36, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xfe, 0x01, 0x0a, + 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, 0x12, 0x17, + 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x41, 0x0a, + 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, + 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0xee, 0x04, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x3d, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, 0x6e, 0x6c, + 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, @@ -8007,383 +8865,580 @@ var file_tabletmanagerdata_proto_rawDesc = []byte{ 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x49, 0x0a, 0x0d, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x49, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x53, 0x0a, 0x11, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, + 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, + 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, + 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, + 0x70, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, + 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x50, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0xda, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x60, + 0x0a, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x1a, + 0x3f, 0x0a, 0x11, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x21, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x50, 0x0a, 0x22, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x21, + 0x0a, 0x1f, 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x34, 0x0a, 0x20, 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x03, 0x68, 0x61, 0x73, 0x22, 0xe0, 0x02, 0x0a, 0x20, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x53, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x5f, 0x73, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x27, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x64, - 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, - 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x54, 0x0a, - 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xc1, 0x04, - 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x03, 0x62, 0x6c, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x03, 0x62, 0x6c, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x70, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, - 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, - 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x70, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x54, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x61, - 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, - 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x2f, 0x0a, 0x0c, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, - 0x74, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x15, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3b, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x49, 0x64, 0x73, 0x12, 0x2b, 0x0a, + 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x4c, 0x0a, 0x0e, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x4c, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, - 0x70, 0x69, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, - 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x68, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x74, 0x69, - 0x6d, 0x65, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x33, 0x0a, 0x0e, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x64, 0x22, 0xd7, 0x01, 0x0a, 0x0c, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x72, 0x67, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, - 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x64, 0x69, 0x66, 0x66, 0x55, 0x75, 0x69, 0x64, - 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6a, 0x0a, 0x0d, 0x56, - 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x64, 0x69, 0x66, - 0x66, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x64, - 0x69, 0x66, 0x66, 0x55, 0x75, 0x69, 0x64, 0x22, 0x79, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, - 0x50, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x65, 0x6c, - 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x65, 0x6c, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x65, - 0x6c, 0x6c, 0x22, 0x90, 0x01, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6e, 0x6c, - 0x79, 0x5f, 0x70, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, 0x6e, 0x6c, - 0x79, 0x50, 0x6b, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x26, 0x0a, - 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x53, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x52, 0x6f, 0x77, 0x73, 0x22, 0xda, 0x02, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, - 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x63, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x72, 0x6f, - 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x6f, 0x77, - 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, - 0x64, 0x69, 0x66, 0x66, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x53, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x22, 0xf2, 0x01, 0x0a, 0x0c, 0x56, 0x44, 0x69, 0x66, 0x66, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x4c, 0x0a, 0x0e, 0x70, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x44, 0x69, 0x66, 0x66, 0x50, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x0d, 0x70, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x46, 0x0a, 0x0c, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, - 0x66, 0x43, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x63, 0x6f, - 0x72, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4c, 0x0a, 0x0e, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xef, 0x02, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, - 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x4f, 0x6e, 0x44, 0x44, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x50, 0x0a, 0x22, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66, + 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x46, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x22, 0x76, 0x0a, 0x21, 0x52, 0x65, + 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x51, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x22, 0x3d, 0x0a, 0x1f, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x22, 0xe7, 0x0a, 0x0a, 0x20, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x49, 0x0a, 0x0d, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x53, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x14, + 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, + 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x54, + 0x0a, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x73, + 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, + 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, + 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x73, 0x1a, 0xc1, 0x04, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, + 0x0a, 0x03, 0x62, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x62, 0x6c, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x6f, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x74, + 0x70, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x54, 0x70, 0x73, + 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, + 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, + 0x12, 0x2f, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x41, 0x0a, 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x14, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, + 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x0e, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x12, 0x33, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x1a, 0x42, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x28, 0x0a, 0x26, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4d, 0x0a, 0x27, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x6f, 0x6b, 0x22, 0xd7, 0x01, 0x0a, 0x0c, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x61, 0x72, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x41, 0x72, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x75, 0x75, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x64, 0x69, 0x66, 0x66, 0x55, + 0x75, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6a, + 0x0a, 0x0d, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x2a, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x9f, 0x02, 0x0a, 0x22, + 0x75, 0x6c, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x76, 0x64, 0x69, 0x66, 0x66, 0x55, 0x75, 0x69, 0x64, 0x22, 0x79, 0x0a, 0x12, 0x56, 0x44, + 0x69, 0x66, 0x66, 0x50, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x65, + 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, + 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x19, 0x0a, 0x08, + 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x70, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x6f, 0x6e, 0x6c, 0x79, 0x50, 0x6b, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x72, + 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x3c, 0x0a, 0x1b, 0x72, 0x6f, 0x77, 0x5f, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x72, + 0x6f, 0x77, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x41, 0x74, 0x22, 0x8d, 0x03, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x43, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, + 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x63, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x72, + 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x6f, + 0x77, 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, + 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0xf2, 0x01, 0x0a, 0x0c, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4c, 0x0a, 0x0e, 0x70, 0x69, 0x63, 0x6b, 0x65, + 0x72, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x50, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x70, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x0c, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x0b, 0x63, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4c, 0x0a, + 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x04, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, - 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x2f, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x15, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x27, - 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, - 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x6b, 0x49, 0x66, 0x4e, 0x6f, - 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xc2, 0x04, 0x0a, 0x16, + 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x1b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, + 0x00, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x33, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4f, 0x6e, 0x44, + 0x44, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, + 0x6c, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x02, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x74, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x49, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x1a, 0x42, 0x0a, 0x14, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x50, 0x0a, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd6, 0x02, + 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x5f, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x73, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x73, + 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x08, + 0x0a, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x0a, 0x15, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, + 0x36, 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, 0x66, + 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x6f, 0x6b, 0x49, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x22, 0x9f, 0x06, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, + 0x50, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x8b, 0x02, 0x0a, 0x06, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, - 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x50, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x1a, 0xb7, 0x01, 0x0a, 0x06, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe1, 0x0f, - 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x17, - 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x6f, 0x72, - 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x6f, - 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x67, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x1b, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, - 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, - 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x73, 0x0a, 0x12, 0x61, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xb6, 0x10, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x1d, 0x0a, + 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x69, 0x73, 0x5f, 0x64, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x69, 0x73, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6c, + 0x61, 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x67, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, + 0x61, 0x6d, 0x65, 0x55, 0x73, 0x65, 0x64, 0x41, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x12, 0x73, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, + 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x43, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x12, 0x67, 0x0a, 0x0e, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, + 0x70, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x64, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, 0x61, 0x70, 0x70, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, - 0x70, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x73, 0x12, 0x67, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x67, 0x0a, 0x0e, 0x74, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x0f, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x70, + 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, + 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, + 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x0b, 0x72, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x73, 0x12, 0x74, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x44, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, - 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x61, - 0x70, 0x70, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x81, + 0x01, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, + 0x34, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, + 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x79, 0x1a, 0x7c, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, - 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x41, 0x70, 0x70, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x1a, 0x80, 0x01, 0x0a, 0x16, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x81, 0x01, 0x0a, 0x0c, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x0f, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x41, 0x74, 0x12, - 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, - 0x65, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x1a, 0x7c, 0x0a, 0x12, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x12, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x5c, 0x0a, 0x12, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, + 0x0a, 0x16, 0x41, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xad, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, + 0x70, 0x70, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x52, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x76, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, + 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, + 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x01, 0x0a, + 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x92, 0x01, 0x0a, 0x12, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x43, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x59, - 0x0a, 0x09, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x12, 0x2b, 0x0a, 0x0a, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x1a, 0x76, 0x0a, 0x0f, 0x52, 0x65, 0x63, - 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4d, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x63, - 0x65, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x2a, 0x3e, 0x0a, 0x19, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, - 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x03, 0x42, 0x30, 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, - 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x3e, + 0x0a, 0x19, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, + 0x4e, 0x59, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x83, + 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0d, 0x0a, + 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, + 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, + 0x44, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, + 0x41, 0x50, 0x50, 0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x10, 0x04, + 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x05, 0x42, 0x30, 0x5a, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, + 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -8398,263 +9453,298 @@ func file_tabletmanagerdata_proto_rawDescGZIP() []byte { return file_tabletmanagerdata_proto_rawDescData } -var file_tabletmanagerdata_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_tabletmanagerdata_proto_msgTypes = make([]protoimpl.MessageInfo, 142) +var file_tabletmanagerdata_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_tabletmanagerdata_proto_msgTypes = make([]protoimpl.MessageInfo, 163) var file_tabletmanagerdata_proto_goTypes = []any{ (TabletSelectionPreference)(0), // 0: tabletmanagerdata.TabletSelectionPreference - (*TableDefinition)(nil), // 1: tabletmanagerdata.TableDefinition - (*SchemaDefinition)(nil), // 2: tabletmanagerdata.SchemaDefinition - (*SchemaChangeResult)(nil), // 3: tabletmanagerdata.SchemaChangeResult - (*UserPermission)(nil), // 4: tabletmanagerdata.UserPermission - (*DbPermission)(nil), // 5: tabletmanagerdata.DbPermission - (*Permissions)(nil), // 6: tabletmanagerdata.Permissions - (*PingRequest)(nil), // 7: tabletmanagerdata.PingRequest - (*PingResponse)(nil), // 8: tabletmanagerdata.PingResponse - (*SleepRequest)(nil), // 9: tabletmanagerdata.SleepRequest - (*SleepResponse)(nil), // 10: tabletmanagerdata.SleepResponse - (*ExecuteHookRequest)(nil), // 11: tabletmanagerdata.ExecuteHookRequest - (*ExecuteHookResponse)(nil), // 12: tabletmanagerdata.ExecuteHookResponse - (*GetSchemaRequest)(nil), // 13: tabletmanagerdata.GetSchemaRequest - (*GetSchemaResponse)(nil), // 14: tabletmanagerdata.GetSchemaResponse - (*GetPermissionsRequest)(nil), // 15: tabletmanagerdata.GetPermissionsRequest - (*GetPermissionsResponse)(nil), // 16: tabletmanagerdata.GetPermissionsResponse - (*GetGlobalStatusVarsRequest)(nil), // 17: tabletmanagerdata.GetGlobalStatusVarsRequest - (*GetGlobalStatusVarsResponse)(nil), // 18: tabletmanagerdata.GetGlobalStatusVarsResponse - (*SetReadOnlyRequest)(nil), // 19: tabletmanagerdata.SetReadOnlyRequest - (*SetReadOnlyResponse)(nil), // 20: tabletmanagerdata.SetReadOnlyResponse - (*SetReadWriteRequest)(nil), // 21: tabletmanagerdata.SetReadWriteRequest - (*SetReadWriteResponse)(nil), // 22: tabletmanagerdata.SetReadWriteResponse - (*ChangeTypeRequest)(nil), // 23: tabletmanagerdata.ChangeTypeRequest - (*ChangeTypeResponse)(nil), // 24: tabletmanagerdata.ChangeTypeResponse - (*RefreshStateRequest)(nil), // 25: tabletmanagerdata.RefreshStateRequest - (*RefreshStateResponse)(nil), // 26: tabletmanagerdata.RefreshStateResponse - (*RunHealthCheckRequest)(nil), // 27: tabletmanagerdata.RunHealthCheckRequest - (*RunHealthCheckResponse)(nil), // 28: tabletmanagerdata.RunHealthCheckResponse - (*ReloadSchemaRequest)(nil), // 29: tabletmanagerdata.ReloadSchemaRequest - (*ReloadSchemaResponse)(nil), // 30: tabletmanagerdata.ReloadSchemaResponse - (*PreflightSchemaRequest)(nil), // 31: tabletmanagerdata.PreflightSchemaRequest - (*PreflightSchemaResponse)(nil), // 32: tabletmanagerdata.PreflightSchemaResponse - (*ApplySchemaRequest)(nil), // 33: tabletmanagerdata.ApplySchemaRequest - (*ApplySchemaResponse)(nil), // 34: tabletmanagerdata.ApplySchemaResponse - (*LockTablesRequest)(nil), // 35: tabletmanagerdata.LockTablesRequest - (*LockTablesResponse)(nil), // 36: tabletmanagerdata.LockTablesResponse - (*UnlockTablesRequest)(nil), // 37: tabletmanagerdata.UnlockTablesRequest - (*UnlockTablesResponse)(nil), // 38: tabletmanagerdata.UnlockTablesResponse - (*ExecuteQueryRequest)(nil), // 39: tabletmanagerdata.ExecuteQueryRequest - (*ExecuteQueryResponse)(nil), // 40: tabletmanagerdata.ExecuteQueryResponse - (*ExecuteFetchAsDbaRequest)(nil), // 41: tabletmanagerdata.ExecuteFetchAsDbaRequest - (*ExecuteFetchAsDbaResponse)(nil), // 42: tabletmanagerdata.ExecuteFetchAsDbaResponse - (*ExecuteMultiFetchAsDbaRequest)(nil), // 43: tabletmanagerdata.ExecuteMultiFetchAsDbaRequest - (*ExecuteMultiFetchAsDbaResponse)(nil), // 44: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse - (*ExecuteFetchAsAllPrivsRequest)(nil), // 45: tabletmanagerdata.ExecuteFetchAsAllPrivsRequest - (*ExecuteFetchAsAllPrivsResponse)(nil), // 46: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse - (*ExecuteFetchAsAppRequest)(nil), // 47: tabletmanagerdata.ExecuteFetchAsAppRequest - (*ExecuteFetchAsAppResponse)(nil), // 48: tabletmanagerdata.ExecuteFetchAsAppResponse - (*ReplicationStatusRequest)(nil), // 49: tabletmanagerdata.ReplicationStatusRequest - (*ReplicationStatusResponse)(nil), // 50: tabletmanagerdata.ReplicationStatusResponse - (*PrimaryStatusRequest)(nil), // 51: tabletmanagerdata.PrimaryStatusRequest - (*PrimaryStatusResponse)(nil), // 52: tabletmanagerdata.PrimaryStatusResponse - (*PrimaryPositionRequest)(nil), // 53: tabletmanagerdata.PrimaryPositionRequest - (*PrimaryPositionResponse)(nil), // 54: tabletmanagerdata.PrimaryPositionResponse - (*WaitForPositionRequest)(nil), // 55: tabletmanagerdata.WaitForPositionRequest - (*WaitForPositionResponse)(nil), // 56: tabletmanagerdata.WaitForPositionResponse - (*StopReplicationRequest)(nil), // 57: tabletmanagerdata.StopReplicationRequest - (*StopReplicationResponse)(nil), // 58: tabletmanagerdata.StopReplicationResponse - (*StopReplicationMinimumRequest)(nil), // 59: tabletmanagerdata.StopReplicationMinimumRequest - (*StopReplicationMinimumResponse)(nil), // 60: tabletmanagerdata.StopReplicationMinimumResponse - (*StartReplicationRequest)(nil), // 61: tabletmanagerdata.StartReplicationRequest - (*StartReplicationResponse)(nil), // 62: tabletmanagerdata.StartReplicationResponse - (*StartReplicationUntilAfterRequest)(nil), // 63: tabletmanagerdata.StartReplicationUntilAfterRequest - (*StartReplicationUntilAfterResponse)(nil), // 64: tabletmanagerdata.StartReplicationUntilAfterResponse - (*GetReplicasRequest)(nil), // 65: tabletmanagerdata.GetReplicasRequest - (*GetReplicasResponse)(nil), // 66: tabletmanagerdata.GetReplicasResponse - (*ResetReplicationRequest)(nil), // 67: tabletmanagerdata.ResetReplicationRequest - (*ResetReplicationResponse)(nil), // 68: tabletmanagerdata.ResetReplicationResponse - (*VReplicationExecRequest)(nil), // 69: tabletmanagerdata.VReplicationExecRequest - (*VReplicationExecResponse)(nil), // 70: tabletmanagerdata.VReplicationExecResponse - (*VReplicationWaitForPosRequest)(nil), // 71: tabletmanagerdata.VReplicationWaitForPosRequest - (*VReplicationWaitForPosResponse)(nil), // 72: tabletmanagerdata.VReplicationWaitForPosResponse - (*InitPrimaryRequest)(nil), // 73: tabletmanagerdata.InitPrimaryRequest - (*InitPrimaryResponse)(nil), // 74: tabletmanagerdata.InitPrimaryResponse - (*PopulateReparentJournalRequest)(nil), // 75: tabletmanagerdata.PopulateReparentJournalRequest - (*PopulateReparentJournalResponse)(nil), // 76: tabletmanagerdata.PopulateReparentJournalResponse - (*InitReplicaRequest)(nil), // 77: tabletmanagerdata.InitReplicaRequest - (*InitReplicaResponse)(nil), // 78: tabletmanagerdata.InitReplicaResponse - (*DemotePrimaryRequest)(nil), // 79: tabletmanagerdata.DemotePrimaryRequest - (*DemotePrimaryResponse)(nil), // 80: tabletmanagerdata.DemotePrimaryResponse - (*UndoDemotePrimaryRequest)(nil), // 81: tabletmanagerdata.UndoDemotePrimaryRequest - (*UndoDemotePrimaryResponse)(nil), // 82: tabletmanagerdata.UndoDemotePrimaryResponse - (*ReplicaWasPromotedRequest)(nil), // 83: tabletmanagerdata.ReplicaWasPromotedRequest - (*ReplicaWasPromotedResponse)(nil), // 84: tabletmanagerdata.ReplicaWasPromotedResponse - (*ResetReplicationParametersRequest)(nil), // 85: tabletmanagerdata.ResetReplicationParametersRequest - (*ResetReplicationParametersResponse)(nil), // 86: tabletmanagerdata.ResetReplicationParametersResponse - (*FullStatusRequest)(nil), // 87: tabletmanagerdata.FullStatusRequest - (*FullStatusResponse)(nil), // 88: tabletmanagerdata.FullStatusResponse - (*SetReplicationSourceRequest)(nil), // 89: tabletmanagerdata.SetReplicationSourceRequest - (*SetReplicationSourceResponse)(nil), // 90: tabletmanagerdata.SetReplicationSourceResponse - (*ReplicaWasRestartedRequest)(nil), // 91: tabletmanagerdata.ReplicaWasRestartedRequest - (*ReplicaWasRestartedResponse)(nil), // 92: tabletmanagerdata.ReplicaWasRestartedResponse - (*StopReplicationAndGetStatusRequest)(nil), // 93: tabletmanagerdata.StopReplicationAndGetStatusRequest - (*StopReplicationAndGetStatusResponse)(nil), // 94: tabletmanagerdata.StopReplicationAndGetStatusResponse - (*PromoteReplicaRequest)(nil), // 95: tabletmanagerdata.PromoteReplicaRequest - (*PromoteReplicaResponse)(nil), // 96: tabletmanagerdata.PromoteReplicaResponse - (*BackupRequest)(nil), // 97: tabletmanagerdata.BackupRequest - (*BackupResponse)(nil), // 98: tabletmanagerdata.BackupResponse - (*RestoreFromBackupRequest)(nil), // 99: tabletmanagerdata.RestoreFromBackupRequest - (*RestoreFromBackupResponse)(nil), // 100: tabletmanagerdata.RestoreFromBackupResponse - (*CreateVReplicationWorkflowRequest)(nil), // 101: tabletmanagerdata.CreateVReplicationWorkflowRequest - (*CreateVReplicationWorkflowResponse)(nil), // 102: tabletmanagerdata.CreateVReplicationWorkflowResponse - (*DeleteVReplicationWorkflowRequest)(nil), // 103: tabletmanagerdata.DeleteVReplicationWorkflowRequest - (*DeleteVReplicationWorkflowResponse)(nil), // 104: tabletmanagerdata.DeleteVReplicationWorkflowResponse - (*HasVReplicationWorkflowsRequest)(nil), // 105: tabletmanagerdata.HasVReplicationWorkflowsRequest - (*HasVReplicationWorkflowsResponse)(nil), // 106: tabletmanagerdata.HasVReplicationWorkflowsResponse - (*ReadVReplicationWorkflowsRequest)(nil), // 107: tabletmanagerdata.ReadVReplicationWorkflowsRequest - (*ReadVReplicationWorkflowsResponse)(nil), // 108: tabletmanagerdata.ReadVReplicationWorkflowsResponse - (*ReadVReplicationWorkflowRequest)(nil), // 109: tabletmanagerdata.ReadVReplicationWorkflowRequest - (*ReadVReplicationWorkflowResponse)(nil), // 110: tabletmanagerdata.ReadVReplicationWorkflowResponse - (*VDiffRequest)(nil), // 111: tabletmanagerdata.VDiffRequest - (*VDiffResponse)(nil), // 112: tabletmanagerdata.VDiffResponse - (*VDiffPickerOptions)(nil), // 113: tabletmanagerdata.VDiffPickerOptions - (*VDiffReportOptions)(nil), // 114: tabletmanagerdata.VDiffReportOptions - (*VDiffCoreOptions)(nil), // 115: tabletmanagerdata.VDiffCoreOptions - (*VDiffOptions)(nil), // 116: tabletmanagerdata.VDiffOptions - (*UpdateVReplicationWorkflowRequest)(nil), // 117: tabletmanagerdata.UpdateVReplicationWorkflowRequest - (*UpdateVReplicationWorkflowResponse)(nil), // 118: tabletmanagerdata.UpdateVReplicationWorkflowResponse - (*UpdateVReplicationWorkflowsRequest)(nil), // 119: tabletmanagerdata.UpdateVReplicationWorkflowsRequest - (*UpdateVReplicationWorkflowsResponse)(nil), // 120: tabletmanagerdata.UpdateVReplicationWorkflowsResponse - (*ResetSequencesRequest)(nil), // 121: tabletmanagerdata.ResetSequencesRequest - (*ResetSequencesResponse)(nil), // 122: tabletmanagerdata.ResetSequencesResponse - (*CheckThrottlerRequest)(nil), // 123: tabletmanagerdata.CheckThrottlerRequest - (*CheckThrottlerResponse)(nil), // 124: tabletmanagerdata.CheckThrottlerResponse - (*GetThrottlerStatusRequest)(nil), // 125: tabletmanagerdata.GetThrottlerStatusRequest - (*GetThrottlerStatusResponse)(nil), // 126: tabletmanagerdata.GetThrottlerStatusResponse - nil, // 127: tabletmanagerdata.UserPermission.PrivilegesEntry - nil, // 128: tabletmanagerdata.DbPermission.PrivilegesEntry - nil, // 129: tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry - nil, // 130: tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry - (*ReadVReplicationWorkflowResponse_Stream)(nil), // 131: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream - (*CheckThrottlerResponse_Metric)(nil), // 132: tabletmanagerdata.CheckThrottlerResponse.Metric - nil, // 133: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry - (*GetThrottlerStatusResponse_MetricResult)(nil), // 134: tabletmanagerdata.GetThrottlerStatusResponse.MetricResult - nil, // 135: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry - nil, // 136: tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry - (*GetThrottlerStatusResponse_MetricHealth)(nil), // 137: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth - nil, // 138: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry - nil, // 139: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry - nil, // 140: tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry - (*GetThrottlerStatusResponse_RecentApp)(nil), // 141: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp - nil, // 142: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry - (*query.Field)(nil), // 143: query.Field - (topodata.TabletType)(0), // 144: topodata.TabletType - (*vtrpc.CallerID)(nil), // 145: vtrpc.CallerID - (*query.QueryResult)(nil), // 146: query.QueryResult - (*replicationdata.Status)(nil), // 147: replicationdata.Status - (*replicationdata.PrimaryStatus)(nil), // 148: replicationdata.PrimaryStatus - (*topodata.TabletAlias)(nil), // 149: topodata.TabletAlias - (*replicationdata.FullStatus)(nil), // 150: replicationdata.FullStatus - (replicationdata.StopReplicationMode)(0), // 151: replicationdata.StopReplicationMode - (*replicationdata.StopReplicationStatus)(nil), // 152: replicationdata.StopReplicationStatus - (*logutil.Event)(nil), // 153: logutil.Event - (*vttime.Time)(nil), // 154: vttime.Time - (*binlogdata.BinlogSource)(nil), // 155: binlogdata.BinlogSource - (binlogdata.VReplicationWorkflowType)(0), // 156: binlogdata.VReplicationWorkflowType - (binlogdata.VReplicationWorkflowSubType)(0), // 157: binlogdata.VReplicationWorkflowSubType - (binlogdata.VReplicationWorkflowState)(0), // 158: binlogdata.VReplicationWorkflowState - (binlogdata.OnDDLAction)(0), // 159: binlogdata.OnDDLAction - (*topodata.ThrottledAppRule)(nil), // 160: topodata.ThrottledAppRule + (CheckThrottlerResponseCode)(0), // 1: tabletmanagerdata.CheckThrottlerResponseCode + (*TableDefinition)(nil), // 2: tabletmanagerdata.TableDefinition + (*SchemaDefinition)(nil), // 3: tabletmanagerdata.SchemaDefinition + (*SchemaChangeResult)(nil), // 4: tabletmanagerdata.SchemaChangeResult + (*UserPermission)(nil), // 5: tabletmanagerdata.UserPermission + (*DbPermission)(nil), // 6: tabletmanagerdata.DbPermission + (*Permissions)(nil), // 7: tabletmanagerdata.Permissions + (*PingRequest)(nil), // 8: tabletmanagerdata.PingRequest + (*PingResponse)(nil), // 9: tabletmanagerdata.PingResponse + (*SleepRequest)(nil), // 10: tabletmanagerdata.SleepRequest + (*SleepResponse)(nil), // 11: tabletmanagerdata.SleepResponse + (*ExecuteHookRequest)(nil), // 12: tabletmanagerdata.ExecuteHookRequest + (*ExecuteHookResponse)(nil), // 13: tabletmanagerdata.ExecuteHookResponse + (*GetSchemaRequest)(nil), // 14: tabletmanagerdata.GetSchemaRequest + (*GetSchemaResponse)(nil), // 15: tabletmanagerdata.GetSchemaResponse + (*GetPermissionsRequest)(nil), // 16: tabletmanagerdata.GetPermissionsRequest + (*GetPermissionsResponse)(nil), // 17: tabletmanagerdata.GetPermissionsResponse + (*GetGlobalStatusVarsRequest)(nil), // 18: tabletmanagerdata.GetGlobalStatusVarsRequest + (*GetGlobalStatusVarsResponse)(nil), // 19: tabletmanagerdata.GetGlobalStatusVarsResponse + (*SetReadOnlyRequest)(nil), // 20: tabletmanagerdata.SetReadOnlyRequest + (*SetReadOnlyResponse)(nil), // 21: tabletmanagerdata.SetReadOnlyResponse + (*SetReadWriteRequest)(nil), // 22: tabletmanagerdata.SetReadWriteRequest + (*SetReadWriteResponse)(nil), // 23: tabletmanagerdata.SetReadWriteResponse + (*ChangeTypeRequest)(nil), // 24: tabletmanagerdata.ChangeTypeRequest + (*ChangeTypeResponse)(nil), // 25: tabletmanagerdata.ChangeTypeResponse + (*RefreshStateRequest)(nil), // 26: tabletmanagerdata.RefreshStateRequest + (*RefreshStateResponse)(nil), // 27: tabletmanagerdata.RefreshStateResponse + (*RunHealthCheckRequest)(nil), // 28: tabletmanagerdata.RunHealthCheckRequest + (*RunHealthCheckResponse)(nil), // 29: tabletmanagerdata.RunHealthCheckResponse + (*ReloadSchemaRequest)(nil), // 30: tabletmanagerdata.ReloadSchemaRequest + (*ReloadSchemaResponse)(nil), // 31: tabletmanagerdata.ReloadSchemaResponse + (*PreflightSchemaRequest)(nil), // 32: tabletmanagerdata.PreflightSchemaRequest + (*PreflightSchemaResponse)(nil), // 33: tabletmanagerdata.PreflightSchemaResponse + (*ApplySchemaRequest)(nil), // 34: tabletmanagerdata.ApplySchemaRequest + (*ApplySchemaResponse)(nil), // 35: tabletmanagerdata.ApplySchemaResponse + (*LockTablesRequest)(nil), // 36: tabletmanagerdata.LockTablesRequest + (*LockTablesResponse)(nil), // 37: tabletmanagerdata.LockTablesResponse + (*UnlockTablesRequest)(nil), // 38: tabletmanagerdata.UnlockTablesRequest + (*UnlockTablesResponse)(nil), // 39: tabletmanagerdata.UnlockTablesResponse + (*ExecuteQueryRequest)(nil), // 40: tabletmanagerdata.ExecuteQueryRequest + (*ExecuteQueryResponse)(nil), // 41: tabletmanagerdata.ExecuteQueryResponse + (*ExecuteFetchAsDbaRequest)(nil), // 42: tabletmanagerdata.ExecuteFetchAsDbaRequest + (*ExecuteFetchAsDbaResponse)(nil), // 43: tabletmanagerdata.ExecuteFetchAsDbaResponse + (*ExecuteMultiFetchAsDbaRequest)(nil), // 44: tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + (*ExecuteMultiFetchAsDbaResponse)(nil), // 45: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + (*ExecuteFetchAsAllPrivsRequest)(nil), // 46: tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + (*ExecuteFetchAsAllPrivsResponse)(nil), // 47: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + (*ExecuteFetchAsAppRequest)(nil), // 48: tabletmanagerdata.ExecuteFetchAsAppRequest + (*ExecuteFetchAsAppResponse)(nil), // 49: tabletmanagerdata.ExecuteFetchAsAppResponse + (*GetUnresolvedTransactionsRequest)(nil), // 50: tabletmanagerdata.GetUnresolvedTransactionsRequest + (*GetUnresolvedTransactionsResponse)(nil), // 51: tabletmanagerdata.GetUnresolvedTransactionsResponse + (*ReadTransactionRequest)(nil), // 52: tabletmanagerdata.ReadTransactionRequest + (*ReadTransactionResponse)(nil), // 53: tabletmanagerdata.ReadTransactionResponse + (*ConcludeTransactionRequest)(nil), // 54: tabletmanagerdata.ConcludeTransactionRequest + (*ConcludeTransactionResponse)(nil), // 55: tabletmanagerdata.ConcludeTransactionResponse + (*MysqlHostMetricsRequest)(nil), // 56: tabletmanagerdata.MysqlHostMetricsRequest + (*MysqlHostMetricsResponse)(nil), // 57: tabletmanagerdata.MysqlHostMetricsResponse + (*ReplicationStatusRequest)(nil), // 58: tabletmanagerdata.ReplicationStatusRequest + (*ReplicationStatusResponse)(nil), // 59: tabletmanagerdata.ReplicationStatusResponse + (*PrimaryStatusRequest)(nil), // 60: tabletmanagerdata.PrimaryStatusRequest + (*PrimaryStatusResponse)(nil), // 61: tabletmanagerdata.PrimaryStatusResponse + (*PrimaryPositionRequest)(nil), // 62: tabletmanagerdata.PrimaryPositionRequest + (*PrimaryPositionResponse)(nil), // 63: tabletmanagerdata.PrimaryPositionResponse + (*WaitForPositionRequest)(nil), // 64: tabletmanagerdata.WaitForPositionRequest + (*WaitForPositionResponse)(nil), // 65: tabletmanagerdata.WaitForPositionResponse + (*StopReplicationRequest)(nil), // 66: tabletmanagerdata.StopReplicationRequest + (*StopReplicationResponse)(nil), // 67: tabletmanagerdata.StopReplicationResponse + (*StopReplicationMinimumRequest)(nil), // 68: tabletmanagerdata.StopReplicationMinimumRequest + (*StopReplicationMinimumResponse)(nil), // 69: tabletmanagerdata.StopReplicationMinimumResponse + (*StartReplicationRequest)(nil), // 70: tabletmanagerdata.StartReplicationRequest + (*StartReplicationResponse)(nil), // 71: tabletmanagerdata.StartReplicationResponse + (*StartReplicationUntilAfterRequest)(nil), // 72: tabletmanagerdata.StartReplicationUntilAfterRequest + (*StartReplicationUntilAfterResponse)(nil), // 73: tabletmanagerdata.StartReplicationUntilAfterResponse + (*GetReplicasRequest)(nil), // 74: tabletmanagerdata.GetReplicasRequest + (*GetReplicasResponse)(nil), // 75: tabletmanagerdata.GetReplicasResponse + (*ResetReplicationRequest)(nil), // 76: tabletmanagerdata.ResetReplicationRequest + (*ResetReplicationResponse)(nil), // 77: tabletmanagerdata.ResetReplicationResponse + (*VReplicationExecRequest)(nil), // 78: tabletmanagerdata.VReplicationExecRequest + (*VReplicationExecResponse)(nil), // 79: tabletmanagerdata.VReplicationExecResponse + (*VReplicationWaitForPosRequest)(nil), // 80: tabletmanagerdata.VReplicationWaitForPosRequest + (*VReplicationWaitForPosResponse)(nil), // 81: tabletmanagerdata.VReplicationWaitForPosResponse + (*InitPrimaryRequest)(nil), // 82: tabletmanagerdata.InitPrimaryRequest + (*InitPrimaryResponse)(nil), // 83: tabletmanagerdata.InitPrimaryResponse + (*PopulateReparentJournalRequest)(nil), // 84: tabletmanagerdata.PopulateReparentJournalRequest + (*PopulateReparentJournalResponse)(nil), // 85: tabletmanagerdata.PopulateReparentJournalResponse + (*ReadReparentJournalInfoRequest)(nil), // 86: tabletmanagerdata.ReadReparentJournalInfoRequest + (*ReadReparentJournalInfoResponse)(nil), // 87: tabletmanagerdata.ReadReparentJournalInfoResponse + (*InitReplicaRequest)(nil), // 88: tabletmanagerdata.InitReplicaRequest + (*InitReplicaResponse)(nil), // 89: tabletmanagerdata.InitReplicaResponse + (*DemotePrimaryRequest)(nil), // 90: tabletmanagerdata.DemotePrimaryRequest + (*DemotePrimaryResponse)(nil), // 91: tabletmanagerdata.DemotePrimaryResponse + (*UndoDemotePrimaryRequest)(nil), // 92: tabletmanagerdata.UndoDemotePrimaryRequest + (*UndoDemotePrimaryResponse)(nil), // 93: tabletmanagerdata.UndoDemotePrimaryResponse + (*ReplicaWasPromotedRequest)(nil), // 94: tabletmanagerdata.ReplicaWasPromotedRequest + (*ReplicaWasPromotedResponse)(nil), // 95: tabletmanagerdata.ReplicaWasPromotedResponse + (*ResetReplicationParametersRequest)(nil), // 96: tabletmanagerdata.ResetReplicationParametersRequest + (*ResetReplicationParametersResponse)(nil), // 97: tabletmanagerdata.ResetReplicationParametersResponse + (*FullStatusRequest)(nil), // 98: tabletmanagerdata.FullStatusRequest + (*FullStatusResponse)(nil), // 99: tabletmanagerdata.FullStatusResponse + (*SetReplicationSourceRequest)(nil), // 100: tabletmanagerdata.SetReplicationSourceRequest + (*SetReplicationSourceResponse)(nil), // 101: tabletmanagerdata.SetReplicationSourceResponse + (*ReplicaWasRestartedRequest)(nil), // 102: tabletmanagerdata.ReplicaWasRestartedRequest + (*ReplicaWasRestartedResponse)(nil), // 103: tabletmanagerdata.ReplicaWasRestartedResponse + (*StopReplicationAndGetStatusRequest)(nil), // 104: tabletmanagerdata.StopReplicationAndGetStatusRequest + (*StopReplicationAndGetStatusResponse)(nil), // 105: tabletmanagerdata.StopReplicationAndGetStatusResponse + (*PromoteReplicaRequest)(nil), // 106: tabletmanagerdata.PromoteReplicaRequest + (*PromoteReplicaResponse)(nil), // 107: tabletmanagerdata.PromoteReplicaResponse + (*BackupRequest)(nil), // 108: tabletmanagerdata.BackupRequest + (*BackupResponse)(nil), // 109: tabletmanagerdata.BackupResponse + (*RestoreFromBackupRequest)(nil), // 110: tabletmanagerdata.RestoreFromBackupRequest + (*RestoreFromBackupResponse)(nil), // 111: tabletmanagerdata.RestoreFromBackupResponse + (*CreateVReplicationWorkflowRequest)(nil), // 112: tabletmanagerdata.CreateVReplicationWorkflowRequest + (*CreateVReplicationWorkflowResponse)(nil), // 113: tabletmanagerdata.CreateVReplicationWorkflowResponse + (*DeleteTableDataRequest)(nil), // 114: tabletmanagerdata.DeleteTableDataRequest + (*DeleteTableDataResponse)(nil), // 115: tabletmanagerdata.DeleteTableDataResponse + (*DeleteVReplicationWorkflowRequest)(nil), // 116: tabletmanagerdata.DeleteVReplicationWorkflowRequest + (*DeleteVReplicationWorkflowResponse)(nil), // 117: tabletmanagerdata.DeleteVReplicationWorkflowResponse + (*HasVReplicationWorkflowsRequest)(nil), // 118: tabletmanagerdata.HasVReplicationWorkflowsRequest + (*HasVReplicationWorkflowsResponse)(nil), // 119: tabletmanagerdata.HasVReplicationWorkflowsResponse + (*ReadVReplicationWorkflowsRequest)(nil), // 120: tabletmanagerdata.ReadVReplicationWorkflowsRequest + (*ReadVReplicationWorkflowsResponse)(nil), // 121: tabletmanagerdata.ReadVReplicationWorkflowsResponse + (*ReadVReplicationWorkflowRequest)(nil), // 122: tabletmanagerdata.ReadVReplicationWorkflowRequest + (*ReadVReplicationWorkflowResponse)(nil), // 123: tabletmanagerdata.ReadVReplicationWorkflowResponse + (*ValidateVReplicationPermissionsRequest)(nil), // 124: tabletmanagerdata.ValidateVReplicationPermissionsRequest + (*ValidateVReplicationPermissionsResponse)(nil), // 125: tabletmanagerdata.ValidateVReplicationPermissionsResponse + (*VDiffRequest)(nil), // 126: tabletmanagerdata.VDiffRequest + (*VDiffResponse)(nil), // 127: tabletmanagerdata.VDiffResponse + (*VDiffPickerOptions)(nil), // 128: tabletmanagerdata.VDiffPickerOptions + (*VDiffReportOptions)(nil), // 129: tabletmanagerdata.VDiffReportOptions + (*VDiffCoreOptions)(nil), // 130: tabletmanagerdata.VDiffCoreOptions + (*VDiffOptions)(nil), // 131: tabletmanagerdata.VDiffOptions + (*UpdateVReplicationWorkflowRequest)(nil), // 132: tabletmanagerdata.UpdateVReplicationWorkflowRequest + (*UpdateVReplicationWorkflowResponse)(nil), // 133: tabletmanagerdata.UpdateVReplicationWorkflowResponse + (*UpdateVReplicationWorkflowsRequest)(nil), // 134: tabletmanagerdata.UpdateVReplicationWorkflowsRequest + (*UpdateVReplicationWorkflowsResponse)(nil), // 135: tabletmanagerdata.UpdateVReplicationWorkflowsResponse + (*ResetSequencesRequest)(nil), // 136: tabletmanagerdata.ResetSequencesRequest + (*ResetSequencesResponse)(nil), // 137: tabletmanagerdata.ResetSequencesResponse + (*CheckThrottlerRequest)(nil), // 138: tabletmanagerdata.CheckThrottlerRequest + (*CheckThrottlerResponse)(nil), // 139: tabletmanagerdata.CheckThrottlerResponse + (*GetThrottlerStatusRequest)(nil), // 140: tabletmanagerdata.GetThrottlerStatusRequest + (*GetThrottlerStatusResponse)(nil), // 141: tabletmanagerdata.GetThrottlerStatusResponse + (*ChangeTagsRequest)(nil), // 142: tabletmanagerdata.ChangeTagsRequest + (*ChangeTagsResponse)(nil), // 143: tabletmanagerdata.ChangeTagsResponse + nil, // 144: tabletmanagerdata.UserPermission.PrivilegesEntry + nil, // 145: tabletmanagerdata.DbPermission.PrivilegesEntry + nil, // 146: tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry + nil, // 147: tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry + nil, // 148: tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry + (*ReadVReplicationWorkflowResponse_Stream)(nil), // 149: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream + nil, // 150: tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry + nil, // 151: tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry + (*CheckThrottlerResponse_Metric)(nil), // 152: tabletmanagerdata.CheckThrottlerResponse.Metric + nil, // 153: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry + (*GetThrottlerStatusResponse_MetricResult)(nil), // 154: tabletmanagerdata.GetThrottlerStatusResponse.MetricResult + nil, // 155: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry + nil, // 156: tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry + (*GetThrottlerStatusResponse_MetricHealth)(nil), // 157: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth + nil, // 158: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry + nil, // 159: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry + nil, // 160: tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry + (*GetThrottlerStatusResponse_RecentApp)(nil), // 161: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp + nil, // 162: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry + nil, // 163: tabletmanagerdata.ChangeTagsRequest.TagsEntry + nil, // 164: tabletmanagerdata.ChangeTagsResponse.TagsEntry + (*query.Field)(nil), // 165: query.Field + (topodata.TabletType)(0), // 166: topodata.TabletType + (*vtrpc.CallerID)(nil), // 167: vtrpc.CallerID + (*query.QueryResult)(nil), // 168: query.QueryResult + (*query.TransactionMetadata)(nil), // 169: query.TransactionMetadata + (*mysqlctl.HostMetricsResponse)(nil), // 170: mysqlctl.HostMetricsResponse + (*replicationdata.Status)(nil), // 171: replicationdata.Status + (*replicationdata.PrimaryStatus)(nil), // 172: replicationdata.PrimaryStatus + (*topodata.TabletAlias)(nil), // 173: topodata.TabletAlias + (*replicationdata.FullStatus)(nil), // 174: replicationdata.FullStatus + (replicationdata.StopReplicationMode)(0), // 175: replicationdata.StopReplicationMode + (*replicationdata.StopReplicationStatus)(nil), // 176: replicationdata.StopReplicationStatus + (*logutil.Event)(nil), // 177: logutil.Event + (*vttime.Time)(nil), // 178: vttime.Time + (*binlogdata.BinlogSource)(nil), // 179: binlogdata.BinlogSource + (binlogdata.VReplicationWorkflowType)(0), // 180: binlogdata.VReplicationWorkflowType + (binlogdata.VReplicationWorkflowSubType)(0), // 181: binlogdata.VReplicationWorkflowSubType + (binlogdata.VReplicationWorkflowState)(0), // 182: binlogdata.VReplicationWorkflowState + (binlogdata.OnDDLAction)(0), // 183: binlogdata.OnDDLAction + (*topodata.ThrottledAppRule)(nil), // 184: topodata.ThrottledAppRule } var file_tabletmanagerdata_proto_depIdxs = []int32{ - 143, // 0: tabletmanagerdata.TableDefinition.fields:type_name -> query.Field - 1, // 1: tabletmanagerdata.SchemaDefinition.table_definitions:type_name -> tabletmanagerdata.TableDefinition - 2, // 2: tabletmanagerdata.SchemaChangeResult.before_schema:type_name -> tabletmanagerdata.SchemaDefinition - 2, // 3: tabletmanagerdata.SchemaChangeResult.after_schema:type_name -> tabletmanagerdata.SchemaDefinition - 127, // 4: tabletmanagerdata.UserPermission.privileges:type_name -> tabletmanagerdata.UserPermission.PrivilegesEntry - 128, // 5: tabletmanagerdata.DbPermission.privileges:type_name -> tabletmanagerdata.DbPermission.PrivilegesEntry - 4, // 6: tabletmanagerdata.Permissions.user_permissions:type_name -> tabletmanagerdata.UserPermission - 5, // 7: tabletmanagerdata.Permissions.db_permissions:type_name -> tabletmanagerdata.DbPermission - 129, // 8: tabletmanagerdata.ExecuteHookRequest.extra_env:type_name -> tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry - 2, // 9: tabletmanagerdata.GetSchemaResponse.schema_definition:type_name -> tabletmanagerdata.SchemaDefinition - 6, // 10: tabletmanagerdata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions - 130, // 11: tabletmanagerdata.GetGlobalStatusVarsResponse.status_values:type_name -> tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry - 144, // 12: tabletmanagerdata.ChangeTypeRequest.tablet_type:type_name -> topodata.TabletType - 3, // 13: tabletmanagerdata.PreflightSchemaResponse.change_results:type_name -> tabletmanagerdata.SchemaChangeResult - 2, // 14: tabletmanagerdata.ApplySchemaRequest.before_schema:type_name -> tabletmanagerdata.SchemaDefinition - 2, // 15: tabletmanagerdata.ApplySchemaRequest.after_schema:type_name -> tabletmanagerdata.SchemaDefinition - 2, // 16: tabletmanagerdata.ApplySchemaResponse.before_schema:type_name -> tabletmanagerdata.SchemaDefinition - 2, // 17: tabletmanagerdata.ApplySchemaResponse.after_schema:type_name -> tabletmanagerdata.SchemaDefinition - 145, // 18: tabletmanagerdata.ExecuteQueryRequest.caller_id:type_name -> vtrpc.CallerID - 146, // 19: tabletmanagerdata.ExecuteQueryResponse.result:type_name -> query.QueryResult - 146, // 20: tabletmanagerdata.ExecuteFetchAsDbaResponse.result:type_name -> query.QueryResult - 146, // 21: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results:type_name -> query.QueryResult - 146, // 22: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.result:type_name -> query.QueryResult - 146, // 23: tabletmanagerdata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult - 147, // 24: tabletmanagerdata.ReplicationStatusResponse.status:type_name -> replicationdata.Status - 148, // 25: tabletmanagerdata.PrimaryStatusResponse.status:type_name -> replicationdata.PrimaryStatus - 146, // 26: tabletmanagerdata.VReplicationExecResponse.result:type_name -> query.QueryResult - 149, // 27: tabletmanagerdata.PopulateReparentJournalRequest.primary_alias:type_name -> topodata.TabletAlias - 149, // 28: tabletmanagerdata.InitReplicaRequest.parent:type_name -> topodata.TabletAlias - 148, // 29: tabletmanagerdata.DemotePrimaryResponse.primary_status:type_name -> replicationdata.PrimaryStatus - 150, // 30: tabletmanagerdata.FullStatusResponse.status:type_name -> replicationdata.FullStatus - 149, // 31: tabletmanagerdata.SetReplicationSourceRequest.parent:type_name -> topodata.TabletAlias - 149, // 32: tabletmanagerdata.ReplicaWasRestartedRequest.parent:type_name -> topodata.TabletAlias - 151, // 33: tabletmanagerdata.StopReplicationAndGetStatusRequest.stop_replication_mode:type_name -> replicationdata.StopReplicationMode - 152, // 34: tabletmanagerdata.StopReplicationAndGetStatusResponse.status:type_name -> replicationdata.StopReplicationStatus - 153, // 35: tabletmanagerdata.BackupResponse.event:type_name -> logutil.Event - 154, // 36: tabletmanagerdata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time - 154, // 37: tabletmanagerdata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time - 153, // 38: tabletmanagerdata.RestoreFromBackupResponse.event:type_name -> logutil.Event - 155, // 39: tabletmanagerdata.CreateVReplicationWorkflowRequest.binlog_source:type_name -> binlogdata.BinlogSource - 144, // 40: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType - 0, // 41: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 156, // 42: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_type:type_name -> binlogdata.VReplicationWorkflowType - 157, // 43: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType - 146, // 44: tabletmanagerdata.CreateVReplicationWorkflowResponse.result:type_name -> query.QueryResult - 146, // 45: tabletmanagerdata.DeleteVReplicationWorkflowResponse.result:type_name -> query.QueryResult - 158, // 46: tabletmanagerdata.ReadVReplicationWorkflowsRequest.include_states:type_name -> binlogdata.VReplicationWorkflowState - 158, // 47: tabletmanagerdata.ReadVReplicationWorkflowsRequest.exclude_states:type_name -> binlogdata.VReplicationWorkflowState - 110, // 48: tabletmanagerdata.ReadVReplicationWorkflowsResponse.workflows:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse - 144, // 49: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_types:type_name -> topodata.TabletType - 0, // 50: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 156, // 51: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_type:type_name -> binlogdata.VReplicationWorkflowType - 157, // 52: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType - 131, // 53: tabletmanagerdata.ReadVReplicationWorkflowResponse.streams:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream - 116, // 54: tabletmanagerdata.VDiffRequest.options:type_name -> tabletmanagerdata.VDiffOptions - 146, // 55: tabletmanagerdata.VDiffResponse.output:type_name -> query.QueryResult - 113, // 56: tabletmanagerdata.VDiffOptions.picker_options:type_name -> tabletmanagerdata.VDiffPickerOptions - 115, // 57: tabletmanagerdata.VDiffOptions.core_options:type_name -> tabletmanagerdata.VDiffCoreOptions - 114, // 58: tabletmanagerdata.VDiffOptions.report_options:type_name -> tabletmanagerdata.VDiffReportOptions - 144, // 59: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType - 0, // 60: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 159, // 61: tabletmanagerdata.UpdateVReplicationWorkflowRequest.on_ddl:type_name -> binlogdata.OnDDLAction - 158, // 62: tabletmanagerdata.UpdateVReplicationWorkflowRequest.state:type_name -> binlogdata.VReplicationWorkflowState - 146, // 63: tabletmanagerdata.UpdateVReplicationWorkflowResponse.result:type_name -> query.QueryResult - 158, // 64: tabletmanagerdata.UpdateVReplicationWorkflowsRequest.state:type_name -> binlogdata.VReplicationWorkflowState - 146, // 65: tabletmanagerdata.UpdateVReplicationWorkflowsResponse.result:type_name -> query.QueryResult - 133, // 66: tabletmanagerdata.CheckThrottlerResponse.metrics:type_name -> tabletmanagerdata.CheckThrottlerResponse.MetricsEntry - 135, // 67: tabletmanagerdata.GetThrottlerStatusResponse.aggregated_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry - 136, // 68: tabletmanagerdata.GetThrottlerStatusResponse.metric_thresholds:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry - 138, // 69: tabletmanagerdata.GetThrottlerStatusResponse.metrics_health:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry - 139, // 70: tabletmanagerdata.GetThrottlerStatusResponse.throttled_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry - 140, // 71: tabletmanagerdata.GetThrottlerStatusResponse.app_checked_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry - 142, // 72: tabletmanagerdata.GetThrottlerStatusResponse.recent_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry - 155, // 73: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.bls:type_name -> binlogdata.BinlogSource - 154, // 74: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_updated:type_name -> vttime.Time - 154, // 75: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.transaction_timestamp:type_name -> vttime.Time - 158, // 76: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.state:type_name -> binlogdata.VReplicationWorkflowState - 154, // 77: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_heartbeat:type_name -> vttime.Time - 154, // 78: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_throttled:type_name -> vttime.Time - 132, // 79: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry.value:type_name -> tabletmanagerdata.CheckThrottlerResponse.Metric - 134, // 80: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricResult - 154, // 81: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth.last_healthy_at:type_name -> vttime.Time - 137, // 82: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth - 160, // 83: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry.value:type_name -> topodata.ThrottledAppRule - 154, // 84: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.checked_at:type_name -> vttime.Time - 141, // 85: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentApp - 86, // [86:86] is the sub-list for method output_type - 86, // [86:86] is the sub-list for method input_type - 86, // [86:86] is the sub-list for extension type_name - 86, // [86:86] is the sub-list for extension extendee - 0, // [0:86] is the sub-list for field type_name + 165, // 0: tabletmanagerdata.TableDefinition.fields:type_name -> query.Field + 2, // 1: tabletmanagerdata.SchemaDefinition.table_definitions:type_name -> tabletmanagerdata.TableDefinition + 3, // 2: tabletmanagerdata.SchemaChangeResult.before_schema:type_name -> tabletmanagerdata.SchemaDefinition + 3, // 3: tabletmanagerdata.SchemaChangeResult.after_schema:type_name -> tabletmanagerdata.SchemaDefinition + 144, // 4: tabletmanagerdata.UserPermission.privileges:type_name -> tabletmanagerdata.UserPermission.PrivilegesEntry + 145, // 5: tabletmanagerdata.DbPermission.privileges:type_name -> tabletmanagerdata.DbPermission.PrivilegesEntry + 5, // 6: tabletmanagerdata.Permissions.user_permissions:type_name -> tabletmanagerdata.UserPermission + 6, // 7: tabletmanagerdata.Permissions.db_permissions:type_name -> tabletmanagerdata.DbPermission + 146, // 8: tabletmanagerdata.ExecuteHookRequest.extra_env:type_name -> tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry + 3, // 9: tabletmanagerdata.GetSchemaResponse.schema_definition:type_name -> tabletmanagerdata.SchemaDefinition + 7, // 10: tabletmanagerdata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions + 147, // 11: tabletmanagerdata.GetGlobalStatusVarsResponse.status_values:type_name -> tabletmanagerdata.GetGlobalStatusVarsResponse.StatusValuesEntry + 166, // 12: tabletmanagerdata.ChangeTypeRequest.tablet_type:type_name -> topodata.TabletType + 4, // 13: tabletmanagerdata.PreflightSchemaResponse.change_results:type_name -> tabletmanagerdata.SchemaChangeResult + 3, // 14: tabletmanagerdata.ApplySchemaRequest.before_schema:type_name -> tabletmanagerdata.SchemaDefinition + 3, // 15: tabletmanagerdata.ApplySchemaRequest.after_schema:type_name -> tabletmanagerdata.SchemaDefinition + 3, // 16: tabletmanagerdata.ApplySchemaResponse.before_schema:type_name -> tabletmanagerdata.SchemaDefinition + 3, // 17: tabletmanagerdata.ApplySchemaResponse.after_schema:type_name -> tabletmanagerdata.SchemaDefinition + 167, // 18: tabletmanagerdata.ExecuteQueryRequest.caller_id:type_name -> vtrpc.CallerID + 168, // 19: tabletmanagerdata.ExecuteQueryResponse.result:type_name -> query.QueryResult + 168, // 20: tabletmanagerdata.ExecuteFetchAsDbaResponse.result:type_name -> query.QueryResult + 168, // 21: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results:type_name -> query.QueryResult + 168, // 22: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.result:type_name -> query.QueryResult + 168, // 23: tabletmanagerdata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult + 169, // 24: tabletmanagerdata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata + 169, // 25: tabletmanagerdata.ReadTransactionResponse.transaction:type_name -> query.TransactionMetadata + 170, // 26: tabletmanagerdata.MysqlHostMetricsResponse.HostMetrics:type_name -> mysqlctl.HostMetricsResponse + 171, // 27: tabletmanagerdata.ReplicationStatusResponse.status:type_name -> replicationdata.Status + 172, // 28: tabletmanagerdata.PrimaryStatusResponse.status:type_name -> replicationdata.PrimaryStatus + 168, // 29: tabletmanagerdata.VReplicationExecResponse.result:type_name -> query.QueryResult + 173, // 30: tabletmanagerdata.PopulateReparentJournalRequest.primary_alias:type_name -> topodata.TabletAlias + 173, // 31: tabletmanagerdata.InitReplicaRequest.parent:type_name -> topodata.TabletAlias + 172, // 32: tabletmanagerdata.DemotePrimaryResponse.primary_status:type_name -> replicationdata.PrimaryStatus + 174, // 33: tabletmanagerdata.FullStatusResponse.status:type_name -> replicationdata.FullStatus + 173, // 34: tabletmanagerdata.SetReplicationSourceRequest.parent:type_name -> topodata.TabletAlias + 173, // 35: tabletmanagerdata.ReplicaWasRestartedRequest.parent:type_name -> topodata.TabletAlias + 175, // 36: tabletmanagerdata.StopReplicationAndGetStatusRequest.stop_replication_mode:type_name -> replicationdata.StopReplicationMode + 176, // 37: tabletmanagerdata.StopReplicationAndGetStatusResponse.status:type_name -> replicationdata.StopReplicationStatus + 177, // 38: tabletmanagerdata.BackupResponse.event:type_name -> logutil.Event + 178, // 39: tabletmanagerdata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time + 178, // 40: tabletmanagerdata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time + 177, // 41: tabletmanagerdata.RestoreFromBackupResponse.event:type_name -> logutil.Event + 179, // 42: tabletmanagerdata.CreateVReplicationWorkflowRequest.binlog_source:type_name -> binlogdata.BinlogSource + 166, // 43: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType + 0, // 44: tabletmanagerdata.CreateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 180, // 45: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_type:type_name -> binlogdata.VReplicationWorkflowType + 181, // 46: tabletmanagerdata.CreateVReplicationWorkflowRequest.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType + 168, // 47: tabletmanagerdata.CreateVReplicationWorkflowResponse.result:type_name -> query.QueryResult + 148, // 48: tabletmanagerdata.DeleteTableDataRequest.table_filters:type_name -> tabletmanagerdata.DeleteTableDataRequest.TableFiltersEntry + 168, // 49: tabletmanagerdata.DeleteVReplicationWorkflowResponse.result:type_name -> query.QueryResult + 182, // 50: tabletmanagerdata.ReadVReplicationWorkflowsRequest.include_states:type_name -> binlogdata.VReplicationWorkflowState + 182, // 51: tabletmanagerdata.ReadVReplicationWorkflowsRequest.exclude_states:type_name -> binlogdata.VReplicationWorkflowState + 123, // 52: tabletmanagerdata.ReadVReplicationWorkflowsResponse.workflows:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse + 166, // 53: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_types:type_name -> topodata.TabletType + 0, // 54: tabletmanagerdata.ReadVReplicationWorkflowResponse.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 180, // 55: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_type:type_name -> binlogdata.VReplicationWorkflowType + 181, // 56: tabletmanagerdata.ReadVReplicationWorkflowResponse.workflow_sub_type:type_name -> binlogdata.VReplicationWorkflowSubType + 149, // 57: tabletmanagerdata.ReadVReplicationWorkflowResponse.streams:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream + 150, // 58: tabletmanagerdata.ReadVReplicationWorkflowResponse.config_overrides:type_name -> tabletmanagerdata.ReadVReplicationWorkflowResponse.ConfigOverridesEntry + 131, // 59: tabletmanagerdata.VDiffRequest.options:type_name -> tabletmanagerdata.VDiffOptions + 168, // 60: tabletmanagerdata.VDiffResponse.output:type_name -> query.QueryResult + 128, // 61: tabletmanagerdata.VDiffOptions.picker_options:type_name -> tabletmanagerdata.VDiffPickerOptions + 130, // 62: tabletmanagerdata.VDiffOptions.core_options:type_name -> tabletmanagerdata.VDiffCoreOptions + 129, // 63: tabletmanagerdata.VDiffOptions.report_options:type_name -> tabletmanagerdata.VDiffReportOptions + 166, // 64: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_types:type_name -> topodata.TabletType + 0, // 65: tabletmanagerdata.UpdateVReplicationWorkflowRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 183, // 66: tabletmanagerdata.UpdateVReplicationWorkflowRequest.on_ddl:type_name -> binlogdata.OnDDLAction + 182, // 67: tabletmanagerdata.UpdateVReplicationWorkflowRequest.state:type_name -> binlogdata.VReplicationWorkflowState + 151, // 68: tabletmanagerdata.UpdateVReplicationWorkflowRequest.config_overrides:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest.ConfigOverridesEntry + 168, // 69: tabletmanagerdata.UpdateVReplicationWorkflowResponse.result:type_name -> query.QueryResult + 182, // 70: tabletmanagerdata.UpdateVReplicationWorkflowsRequest.state:type_name -> binlogdata.VReplicationWorkflowState + 168, // 71: tabletmanagerdata.UpdateVReplicationWorkflowsResponse.result:type_name -> query.QueryResult + 153, // 72: tabletmanagerdata.CheckThrottlerResponse.metrics:type_name -> tabletmanagerdata.CheckThrottlerResponse.MetricsEntry + 1, // 73: tabletmanagerdata.CheckThrottlerResponse.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode + 155, // 74: tabletmanagerdata.GetThrottlerStatusResponse.aggregated_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry + 156, // 75: tabletmanagerdata.GetThrottlerStatusResponse.metric_thresholds:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricThresholdsEntry + 158, // 76: tabletmanagerdata.GetThrottlerStatusResponse.metrics_health:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry + 159, // 77: tabletmanagerdata.GetThrottlerStatusResponse.throttled_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry + 160, // 78: tabletmanagerdata.GetThrottlerStatusResponse.app_checked_metrics:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.AppCheckedMetricsEntry + 162, // 79: tabletmanagerdata.GetThrottlerStatusResponse.recent_apps:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry + 163, // 80: tabletmanagerdata.ChangeTagsRequest.tags:type_name -> tabletmanagerdata.ChangeTagsRequest.TagsEntry + 164, // 81: tabletmanagerdata.ChangeTagsResponse.tags:type_name -> tabletmanagerdata.ChangeTagsResponse.TagsEntry + 179, // 82: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.bls:type_name -> binlogdata.BinlogSource + 178, // 83: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_updated:type_name -> vttime.Time + 178, // 84: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.transaction_timestamp:type_name -> vttime.Time + 182, // 85: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.state:type_name -> binlogdata.VReplicationWorkflowState + 178, // 86: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_heartbeat:type_name -> vttime.Time + 178, // 87: tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.time_throttled:type_name -> vttime.Time + 1, // 88: tabletmanagerdata.CheckThrottlerResponse.Metric.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode + 152, // 89: tabletmanagerdata.CheckThrottlerResponse.MetricsEntry.value:type_name -> tabletmanagerdata.CheckThrottlerResponse.Metric + 154, // 90: tabletmanagerdata.GetThrottlerStatusResponse.AggregatedMetricsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricResult + 178, // 91: tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth.last_healthy_at:type_name -> vttime.Time + 157, // 92: tabletmanagerdata.GetThrottlerStatusResponse.MetricsHealthEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.MetricHealth + 184, // 93: tabletmanagerdata.GetThrottlerStatusResponse.ThrottledAppsEntry.value:type_name -> topodata.ThrottledAppRule + 178, // 94: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.checked_at:type_name -> vttime.Time + 1, // 95: tabletmanagerdata.GetThrottlerStatusResponse.RecentApp.response_code:type_name -> tabletmanagerdata.CheckThrottlerResponseCode + 161, // 96: tabletmanagerdata.GetThrottlerStatusResponse.RecentAppsEntry.value:type_name -> tabletmanagerdata.GetThrottlerStatusResponse.RecentApp + 97, // [97:97] is the sub-list for method output_type + 97, // [97:97] is the sub-list for method input_type + 97, // [97:97] is the sub-list for extension type_name + 97, // [97:97] is the sub-list for extension extendee + 0, // [0:97] is the sub-list for field type_name } func init() { file_tabletmanagerdata_proto_init() } @@ -9167,8 +10257,104 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[42].Exporter = func(v any, i int) any { - switch v := v.(*ExecuteMultiFetchAsDbaRequest); i { + file_tabletmanagerdata_proto_msgTypes[42].Exporter = func(v any, i int) any { + switch v := v.(*ExecuteMultiFetchAsDbaRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[43].Exporter = func(v any, i int) any { + switch v := v.(*ExecuteMultiFetchAsDbaResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[44].Exporter = func(v any, i int) any { + switch v := v.(*ExecuteFetchAsAllPrivsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[45].Exporter = func(v any, i int) any { + switch v := v.(*ExecuteFetchAsAllPrivsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[46].Exporter = func(v any, i int) any { + switch v := v.(*ExecuteFetchAsAppRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[47].Exporter = func(v any, i int) any { + switch v := v.(*ExecuteFetchAsAppResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[48].Exporter = func(v any, i int) any { + switch v := v.(*GetUnresolvedTransactionsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[49].Exporter = func(v any, i int) any { + switch v := v.(*GetUnresolvedTransactionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[50].Exporter = func(v any, i int) any { + switch v := v.(*ReadTransactionRequest); i { case 0: return &v.state case 1: @@ -9179,8 +10365,8 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*ExecuteMultiFetchAsDbaResponse); i { + file_tabletmanagerdata_proto_msgTypes[51].Exporter = func(v any, i int) any { + switch v := v.(*ReadTransactionResponse); i { case 0: return &v.state case 1: @@ -9191,8 +10377,8 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[44].Exporter = func(v any, i int) any { - switch v := v.(*ExecuteFetchAsAllPrivsRequest); i { + file_tabletmanagerdata_proto_msgTypes[52].Exporter = func(v any, i int) any { + switch v := v.(*ConcludeTransactionRequest); i { case 0: return &v.state case 1: @@ -9203,8 +10389,8 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[45].Exporter = func(v any, i int) any { - switch v := v.(*ExecuteFetchAsAllPrivsResponse); i { + file_tabletmanagerdata_proto_msgTypes[53].Exporter = func(v any, i int) any { + switch v := v.(*ConcludeTransactionResponse); i { case 0: return &v.state case 1: @@ -9215,8 +10401,8 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[46].Exporter = func(v any, i int) any { - switch v := v.(*ExecuteFetchAsAppRequest); i { + file_tabletmanagerdata_proto_msgTypes[54].Exporter = func(v any, i int) any { + switch v := v.(*MysqlHostMetricsRequest); i { case 0: return &v.state case 1: @@ -9227,8 +10413,8 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[47].Exporter = func(v any, i int) any { - switch v := v.(*ExecuteFetchAsAppResponse); i { + file_tabletmanagerdata_proto_msgTypes[55].Exporter = func(v any, i int) any { + switch v := v.(*MysqlHostMetricsResponse); i { case 0: return &v.state case 1: @@ -9239,7 +10425,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[48].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[56].Exporter = func(v any, i int) any { switch v := v.(*ReplicationStatusRequest); i { case 0: return &v.state @@ -9251,7 +10437,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[49].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[57].Exporter = func(v any, i int) any { switch v := v.(*ReplicationStatusResponse); i { case 0: return &v.state @@ -9263,7 +10449,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[50].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[58].Exporter = func(v any, i int) any { switch v := v.(*PrimaryStatusRequest); i { case 0: return &v.state @@ -9275,7 +10461,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[51].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[59].Exporter = func(v any, i int) any { switch v := v.(*PrimaryStatusResponse); i { case 0: return &v.state @@ -9287,7 +10473,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[52].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[60].Exporter = func(v any, i int) any { switch v := v.(*PrimaryPositionRequest); i { case 0: return &v.state @@ -9299,7 +10485,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[53].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[61].Exporter = func(v any, i int) any { switch v := v.(*PrimaryPositionResponse); i { case 0: return &v.state @@ -9311,7 +10497,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[54].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[62].Exporter = func(v any, i int) any { switch v := v.(*WaitForPositionRequest); i { case 0: return &v.state @@ -9323,7 +10509,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[55].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[63].Exporter = func(v any, i int) any { switch v := v.(*WaitForPositionResponse); i { case 0: return &v.state @@ -9335,7 +10521,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[56].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[64].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationRequest); i { case 0: return &v.state @@ -9347,7 +10533,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[57].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[65].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationResponse); i { case 0: return &v.state @@ -9359,7 +10545,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[58].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[66].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationMinimumRequest); i { case 0: return &v.state @@ -9371,7 +10557,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[59].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[67].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationMinimumResponse); i { case 0: return &v.state @@ -9383,7 +10569,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[60].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[68].Exporter = func(v any, i int) any { switch v := v.(*StartReplicationRequest); i { case 0: return &v.state @@ -9395,7 +10581,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[61].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[69].Exporter = func(v any, i int) any { switch v := v.(*StartReplicationResponse); i { case 0: return &v.state @@ -9407,7 +10593,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[62].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[70].Exporter = func(v any, i int) any { switch v := v.(*StartReplicationUntilAfterRequest); i { case 0: return &v.state @@ -9419,7 +10605,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[63].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[71].Exporter = func(v any, i int) any { switch v := v.(*StartReplicationUntilAfterResponse); i { case 0: return &v.state @@ -9431,7 +10617,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[64].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[72].Exporter = func(v any, i int) any { switch v := v.(*GetReplicasRequest); i { case 0: return &v.state @@ -9443,7 +10629,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[65].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[73].Exporter = func(v any, i int) any { switch v := v.(*GetReplicasResponse); i { case 0: return &v.state @@ -9455,7 +10641,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[66].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[74].Exporter = func(v any, i int) any { switch v := v.(*ResetReplicationRequest); i { case 0: return &v.state @@ -9467,7 +10653,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[67].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[75].Exporter = func(v any, i int) any { switch v := v.(*ResetReplicationResponse); i { case 0: return &v.state @@ -9479,7 +10665,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[68].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[76].Exporter = func(v any, i int) any { switch v := v.(*VReplicationExecRequest); i { case 0: return &v.state @@ -9491,7 +10677,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[69].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[77].Exporter = func(v any, i int) any { switch v := v.(*VReplicationExecResponse); i { case 0: return &v.state @@ -9503,7 +10689,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[70].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[78].Exporter = func(v any, i int) any { switch v := v.(*VReplicationWaitForPosRequest); i { case 0: return &v.state @@ -9515,7 +10701,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[71].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[79].Exporter = func(v any, i int) any { switch v := v.(*VReplicationWaitForPosResponse); i { case 0: return &v.state @@ -9527,7 +10713,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[72].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[80].Exporter = func(v any, i int) any { switch v := v.(*InitPrimaryRequest); i { case 0: return &v.state @@ -9539,7 +10725,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[73].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[81].Exporter = func(v any, i int) any { switch v := v.(*InitPrimaryResponse); i { case 0: return &v.state @@ -9551,7 +10737,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[74].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[82].Exporter = func(v any, i int) any { switch v := v.(*PopulateReparentJournalRequest); i { case 0: return &v.state @@ -9563,7 +10749,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[75].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[83].Exporter = func(v any, i int) any { switch v := v.(*PopulateReparentJournalResponse); i { case 0: return &v.state @@ -9575,7 +10761,31 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[76].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[84].Exporter = func(v any, i int) any { + switch v := v.(*ReadReparentJournalInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[85].Exporter = func(v any, i int) any { + switch v := v.(*ReadReparentJournalInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[86].Exporter = func(v any, i int) any { switch v := v.(*InitReplicaRequest); i { case 0: return &v.state @@ -9587,7 +10797,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[77].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[87].Exporter = func(v any, i int) any { switch v := v.(*InitReplicaResponse); i { case 0: return &v.state @@ -9599,7 +10809,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[78].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[88].Exporter = func(v any, i int) any { switch v := v.(*DemotePrimaryRequest); i { case 0: return &v.state @@ -9611,7 +10821,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[79].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[89].Exporter = func(v any, i int) any { switch v := v.(*DemotePrimaryResponse); i { case 0: return &v.state @@ -9623,7 +10833,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[80].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[90].Exporter = func(v any, i int) any { switch v := v.(*UndoDemotePrimaryRequest); i { case 0: return &v.state @@ -9635,7 +10845,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[81].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[91].Exporter = func(v any, i int) any { switch v := v.(*UndoDemotePrimaryResponse); i { case 0: return &v.state @@ -9647,7 +10857,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[82].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[92].Exporter = func(v any, i int) any { switch v := v.(*ReplicaWasPromotedRequest); i { case 0: return &v.state @@ -9659,7 +10869,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[83].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[93].Exporter = func(v any, i int) any { switch v := v.(*ReplicaWasPromotedResponse); i { case 0: return &v.state @@ -9671,7 +10881,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[84].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[94].Exporter = func(v any, i int) any { switch v := v.(*ResetReplicationParametersRequest); i { case 0: return &v.state @@ -9683,7 +10893,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[85].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[95].Exporter = func(v any, i int) any { switch v := v.(*ResetReplicationParametersResponse); i { case 0: return &v.state @@ -9695,7 +10905,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[86].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[96].Exporter = func(v any, i int) any { switch v := v.(*FullStatusRequest); i { case 0: return &v.state @@ -9707,7 +10917,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[87].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[97].Exporter = func(v any, i int) any { switch v := v.(*FullStatusResponse); i { case 0: return &v.state @@ -9719,7 +10929,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[88].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[98].Exporter = func(v any, i int) any { switch v := v.(*SetReplicationSourceRequest); i { case 0: return &v.state @@ -9731,7 +10941,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[89].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[99].Exporter = func(v any, i int) any { switch v := v.(*SetReplicationSourceResponse); i { case 0: return &v.state @@ -9743,7 +10953,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[90].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[100].Exporter = func(v any, i int) any { switch v := v.(*ReplicaWasRestartedRequest); i { case 0: return &v.state @@ -9755,7 +10965,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[91].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[101].Exporter = func(v any, i int) any { switch v := v.(*ReplicaWasRestartedResponse); i { case 0: return &v.state @@ -9767,7 +10977,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[92].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[102].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationAndGetStatusRequest); i { case 0: return &v.state @@ -9779,7 +10989,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[93].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[103].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationAndGetStatusResponse); i { case 0: return &v.state @@ -9791,7 +11001,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[94].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[104].Exporter = func(v any, i int) any { switch v := v.(*PromoteReplicaRequest); i { case 0: return &v.state @@ -9803,7 +11013,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[95].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[105].Exporter = func(v any, i int) any { switch v := v.(*PromoteReplicaResponse); i { case 0: return &v.state @@ -9815,7 +11025,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[96].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[106].Exporter = func(v any, i int) any { switch v := v.(*BackupRequest); i { case 0: return &v.state @@ -9827,7 +11037,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[97].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[107].Exporter = func(v any, i int) any { switch v := v.(*BackupResponse); i { case 0: return &v.state @@ -9839,7 +11049,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[98].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[108].Exporter = func(v any, i int) any { switch v := v.(*RestoreFromBackupRequest); i { case 0: return &v.state @@ -9851,7 +11061,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[99].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[109].Exporter = func(v any, i int) any { switch v := v.(*RestoreFromBackupResponse); i { case 0: return &v.state @@ -9863,7 +11073,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[100].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[110].Exporter = func(v any, i int) any { switch v := v.(*CreateVReplicationWorkflowRequest); i { case 0: return &v.state @@ -9875,7 +11085,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[101].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[111].Exporter = func(v any, i int) any { switch v := v.(*CreateVReplicationWorkflowResponse); i { case 0: return &v.state @@ -9887,7 +11097,31 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[102].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[112].Exporter = func(v any, i int) any { + switch v := v.(*DeleteTableDataRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[113].Exporter = func(v any, i int) any { + switch v := v.(*DeleteTableDataResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[114].Exporter = func(v any, i int) any { switch v := v.(*DeleteVReplicationWorkflowRequest); i { case 0: return &v.state @@ -9899,7 +11133,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[103].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[115].Exporter = func(v any, i int) any { switch v := v.(*DeleteVReplicationWorkflowResponse); i { case 0: return &v.state @@ -9911,7 +11145,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[104].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[116].Exporter = func(v any, i int) any { switch v := v.(*HasVReplicationWorkflowsRequest); i { case 0: return &v.state @@ -9923,7 +11157,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[105].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[117].Exporter = func(v any, i int) any { switch v := v.(*HasVReplicationWorkflowsResponse); i { case 0: return &v.state @@ -9935,7 +11169,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[106].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[118].Exporter = func(v any, i int) any { switch v := v.(*ReadVReplicationWorkflowsRequest); i { case 0: return &v.state @@ -9947,7 +11181,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[107].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[119].Exporter = func(v any, i int) any { switch v := v.(*ReadVReplicationWorkflowsResponse); i { case 0: return &v.state @@ -9959,7 +11193,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[108].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[120].Exporter = func(v any, i int) any { switch v := v.(*ReadVReplicationWorkflowRequest); i { case 0: return &v.state @@ -9971,7 +11205,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[109].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[121].Exporter = func(v any, i int) any { switch v := v.(*ReadVReplicationWorkflowResponse); i { case 0: return &v.state @@ -9983,7 +11217,31 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[110].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[122].Exporter = func(v any, i int) any { + switch v := v.(*ValidateVReplicationPermissionsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[123].Exporter = func(v any, i int) any { + switch v := v.(*ValidateVReplicationPermissionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[124].Exporter = func(v any, i int) any { switch v := v.(*VDiffRequest); i { case 0: return &v.state @@ -9995,7 +11253,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[111].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[125].Exporter = func(v any, i int) any { switch v := v.(*VDiffResponse); i { case 0: return &v.state @@ -10007,7 +11265,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[112].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[126].Exporter = func(v any, i int) any { switch v := v.(*VDiffPickerOptions); i { case 0: return &v.state @@ -10019,7 +11277,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[113].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[127].Exporter = func(v any, i int) any { switch v := v.(*VDiffReportOptions); i { case 0: return &v.state @@ -10031,7 +11289,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[114].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[128].Exporter = func(v any, i int) any { switch v := v.(*VDiffCoreOptions); i { case 0: return &v.state @@ -10043,7 +11301,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[115].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[129].Exporter = func(v any, i int) any { switch v := v.(*VDiffOptions); i { case 0: return &v.state @@ -10055,7 +11313,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[116].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[130].Exporter = func(v any, i int) any { switch v := v.(*UpdateVReplicationWorkflowRequest); i { case 0: return &v.state @@ -10067,7 +11325,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[117].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[131].Exporter = func(v any, i int) any { switch v := v.(*UpdateVReplicationWorkflowResponse); i { case 0: return &v.state @@ -10079,7 +11337,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[118].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[132].Exporter = func(v any, i int) any { switch v := v.(*UpdateVReplicationWorkflowsRequest); i { case 0: return &v.state @@ -10091,7 +11349,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[119].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[133].Exporter = func(v any, i int) any { switch v := v.(*UpdateVReplicationWorkflowsResponse); i { case 0: return &v.state @@ -10103,7 +11361,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[120].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[134].Exporter = func(v any, i int) any { switch v := v.(*ResetSequencesRequest); i { case 0: return &v.state @@ -10115,7 +11373,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[121].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[135].Exporter = func(v any, i int) any { switch v := v.(*ResetSequencesResponse); i { case 0: return &v.state @@ -10127,7 +11385,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[122].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[136].Exporter = func(v any, i int) any { switch v := v.(*CheckThrottlerRequest); i { case 0: return &v.state @@ -10139,7 +11397,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[123].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[137].Exporter = func(v any, i int) any { switch v := v.(*CheckThrottlerResponse); i { case 0: return &v.state @@ -10151,7 +11409,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[124].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[138].Exporter = func(v any, i int) any { switch v := v.(*GetThrottlerStatusRequest); i { case 0: return &v.state @@ -10163,7 +11421,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[125].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[139].Exporter = func(v any, i int) any { switch v := v.(*GetThrottlerStatusResponse); i { case 0: return &v.state @@ -10175,7 +11433,31 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[130].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[140].Exporter = func(v any, i int) any { + switch v := v.(*ChangeTagsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[141].Exporter = func(v any, i int) any { + switch v := v.(*ChangeTagsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tabletmanagerdata_proto_msgTypes[147].Exporter = func(v any, i int) any { switch v := v.(*ReadVReplicationWorkflowResponse_Stream); i { case 0: return &v.state @@ -10187,7 +11469,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[131].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[150].Exporter = func(v any, i int) any { switch v := v.(*CheckThrottlerResponse_Metric); i { case 0: return &v.state @@ -10199,7 +11481,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[133].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[152].Exporter = func(v any, i int) any { switch v := v.(*GetThrottlerStatusResponse_MetricResult); i { case 0: return &v.state @@ -10211,7 +11493,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[136].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[155].Exporter = func(v any, i int) any { switch v := v.(*GetThrottlerStatusResponse_MetricHealth); i { case 0: return &v.state @@ -10223,7 +11505,7 @@ func file_tabletmanagerdata_proto_init() { return nil } } - file_tabletmanagerdata_proto_msgTypes[140].Exporter = func(v any, i int) any { + file_tabletmanagerdata_proto_msgTypes[159].Exporter = func(v any, i int) any { switch v := v.(*GetThrottlerStatusResponse_RecentApp); i { case 0: return &v.state @@ -10236,13 +11518,17 @@ func file_tabletmanagerdata_proto_init() { } } } + file_tabletmanagerdata_proto_msgTypes[106].OneofWrappers = []any{} + file_tabletmanagerdata_proto_msgTypes[128].OneofWrappers = []any{} + file_tabletmanagerdata_proto_msgTypes[130].OneofWrappers = []any{} + file_tabletmanagerdata_proto_msgTypes[132].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_tabletmanagerdata_proto_rawDesc, - NumEnums: 1, - NumMessages: 142, + NumEnums: 2, + NumMessages: 163, NumExtensions: 0, NumServices: 0, }, diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go index d48882613d1..d4ffe4ad655 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: tabletmanagerdata.proto package tabletmanagerdata @@ -7,13 +7,14 @@ package tabletmanagerdata import ( binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" math "math" - bits "math/bits" binlogdata "vitess.io/vitess/go/vt/proto/binlogdata" logutil "vitess.io/vitess/go/vt/proto/logutil" + mysqlctl "vitess.io/vitess/go/vt/proto/mysqlctl" query "vitess.io/vitess/go/vt/proto/query" replicationdata "vitess.io/vitess/go/vt/proto/replicationdata" topodata "vitess.io/vitess/go/vt/proto/topodata" @@ -32,13 +33,12 @@ func (m *TableDefinition) CloneVT() *TableDefinition { if m == nil { return (*TableDefinition)(nil) } - r := &TableDefinition{ - Name: m.Name, - Schema: m.Schema, - Type: m.Type, - DataLength: m.DataLength, - RowCount: m.RowCount, - } + r := new(TableDefinition) + r.Name = m.Name + r.Schema = m.Schema + r.Type = m.Type + r.DataLength = m.DataLength + r.RowCount = m.RowCount if rhs := m.Columns; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -71,9 +71,8 @@ func (m *SchemaDefinition) CloneVT() *SchemaDefinition { if m == nil { return (*SchemaDefinition)(nil) } - r := &SchemaDefinition{ - DatabaseSchema: m.DatabaseSchema, - } + r := new(SchemaDefinition) + r.DatabaseSchema = m.DatabaseSchema if rhs := m.TableDefinitions; rhs != nil { tmpContainer := make([]*TableDefinition, len(rhs)) for k, v := range rhs { @@ -96,10 +95,9 @@ func (m *SchemaChangeResult) CloneVT() *SchemaChangeResult { if m == nil { return (*SchemaChangeResult)(nil) } - r := &SchemaChangeResult{ - BeforeSchema: m.BeforeSchema.CloneVT(), - AfterSchema: m.AfterSchema.CloneVT(), - } + r := new(SchemaChangeResult) + r.BeforeSchema = m.BeforeSchema.CloneVT() + r.AfterSchema = m.AfterSchema.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -115,11 +113,10 @@ func (m *UserPermission) CloneVT() *UserPermission { if m == nil { return (*UserPermission)(nil) } - r := &UserPermission{ - Host: m.Host, - User: m.User, - PasswordChecksum: m.PasswordChecksum, - } + r := new(UserPermission) + r.Host = m.Host + r.User = m.User + r.PasswordChecksum = m.PasswordChecksum if rhs := m.Privileges; rhs != nil { tmpContainer := make(map[string]string, len(rhs)) for k, v := range rhs { @@ -142,11 +139,10 @@ func (m *DbPermission) CloneVT() *DbPermission { if m == nil { return (*DbPermission)(nil) } - r := &DbPermission{ - Host: m.Host, - Db: m.Db, - User: m.User, - } + r := new(DbPermission) + r.Host = m.Host + r.Db = m.Db + r.User = m.User if rhs := m.Privileges; rhs != nil { tmpContainer := make(map[string]string, len(rhs)) for k, v := range rhs { @@ -169,7 +165,7 @@ func (m *Permissions) CloneVT() *Permissions { if m == nil { return (*Permissions)(nil) } - r := &Permissions{} + r := new(Permissions) if rhs := m.UserPermissions; rhs != nil { tmpContainer := make([]*UserPermission, len(rhs)) for k, v := range rhs { @@ -199,9 +195,8 @@ func (m *PingRequest) CloneVT() *PingRequest { if m == nil { return (*PingRequest)(nil) } - r := &PingRequest{ - Payload: m.Payload, - } + r := new(PingRequest) + r.Payload = m.Payload if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -217,9 +212,8 @@ func (m *PingResponse) CloneVT() *PingResponse { if m == nil { return (*PingResponse)(nil) } - r := &PingResponse{ - Payload: m.Payload, - } + r := new(PingResponse) + r.Payload = m.Payload if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -235,9 +229,8 @@ func (m *SleepRequest) CloneVT() *SleepRequest { if m == nil { return (*SleepRequest)(nil) } - r := &SleepRequest{ - Duration: m.Duration, - } + r := new(SleepRequest) + r.Duration = m.Duration if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -253,7 +246,7 @@ func (m *SleepResponse) CloneVT() *SleepResponse { if m == nil { return (*SleepResponse)(nil) } - r := &SleepResponse{} + r := new(SleepResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -269,9 +262,8 @@ func (m *ExecuteHookRequest) CloneVT() *ExecuteHookRequest { if m == nil { return (*ExecuteHookRequest)(nil) } - r := &ExecuteHookRequest{ - Name: m.Name, - } + r := new(ExecuteHookRequest) + r.Name = m.Name if rhs := m.Parameters; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -299,11 +291,10 @@ func (m *ExecuteHookResponse) CloneVT() *ExecuteHookResponse { if m == nil { return (*ExecuteHookResponse)(nil) } - r := &ExecuteHookResponse{ - ExitStatus: m.ExitStatus, - Stdout: m.Stdout, - Stderr: m.Stderr, - } + r := new(ExecuteHookResponse) + r.ExitStatus = m.ExitStatus + r.Stdout = m.Stdout + r.Stderr = m.Stderr if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -319,10 +310,9 @@ func (m *GetSchemaRequest) CloneVT() *GetSchemaRequest { if m == nil { return (*GetSchemaRequest)(nil) } - r := &GetSchemaRequest{ - IncludeViews: m.IncludeViews, - TableSchemaOnly: m.TableSchemaOnly, - } + r := new(GetSchemaRequest) + r.IncludeViews = m.IncludeViews + r.TableSchemaOnly = m.TableSchemaOnly if rhs := m.Tables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -348,9 +338,8 @@ func (m *GetSchemaResponse) CloneVT() *GetSchemaResponse { if m == nil { return (*GetSchemaResponse)(nil) } - r := &GetSchemaResponse{ - SchemaDefinition: m.SchemaDefinition.CloneVT(), - } + r := new(GetSchemaResponse) + r.SchemaDefinition = m.SchemaDefinition.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -366,7 +355,7 @@ func (m *GetPermissionsRequest) CloneVT() *GetPermissionsRequest { if m == nil { return (*GetPermissionsRequest)(nil) } - r := &GetPermissionsRequest{} + r := new(GetPermissionsRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -382,9 +371,8 @@ func (m *GetPermissionsResponse) CloneVT() *GetPermissionsResponse { if m == nil { return (*GetPermissionsResponse)(nil) } - r := &GetPermissionsResponse{ - Permissions: m.Permissions.CloneVT(), - } + r := new(GetPermissionsResponse) + r.Permissions = m.Permissions.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -400,7 +388,7 @@ func (m *GetGlobalStatusVarsRequest) CloneVT() *GetGlobalStatusVarsRequest { if m == nil { return (*GetGlobalStatusVarsRequest)(nil) } - r := &GetGlobalStatusVarsRequest{} + r := new(GetGlobalStatusVarsRequest) if rhs := m.Variables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -421,7 +409,7 @@ func (m *GetGlobalStatusVarsResponse) CloneVT() *GetGlobalStatusVarsResponse { if m == nil { return (*GetGlobalStatusVarsResponse)(nil) } - r := &GetGlobalStatusVarsResponse{} + r := new(GetGlobalStatusVarsResponse) if rhs := m.StatusValues; rhs != nil { tmpContainer := make(map[string]string, len(rhs)) for k, v := range rhs { @@ -444,7 +432,7 @@ func (m *SetReadOnlyRequest) CloneVT() *SetReadOnlyRequest { if m == nil { return (*SetReadOnlyRequest)(nil) } - r := &SetReadOnlyRequest{} + r := new(SetReadOnlyRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -460,7 +448,7 @@ func (m *SetReadOnlyResponse) CloneVT() *SetReadOnlyResponse { if m == nil { return (*SetReadOnlyResponse)(nil) } - r := &SetReadOnlyResponse{} + r := new(SetReadOnlyResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -476,7 +464,7 @@ func (m *SetReadWriteRequest) CloneVT() *SetReadWriteRequest { if m == nil { return (*SetReadWriteRequest)(nil) } - r := &SetReadWriteRequest{} + r := new(SetReadWriteRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -492,7 +480,7 @@ func (m *SetReadWriteResponse) CloneVT() *SetReadWriteResponse { if m == nil { return (*SetReadWriteResponse)(nil) } - r := &SetReadWriteResponse{} + r := new(SetReadWriteResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -508,10 +496,9 @@ func (m *ChangeTypeRequest) CloneVT() *ChangeTypeRequest { if m == nil { return (*ChangeTypeRequest)(nil) } - r := &ChangeTypeRequest{ - TabletType: m.TabletType, - SemiSync: m.SemiSync, - } + r := new(ChangeTypeRequest) + r.TabletType = m.TabletType + r.SemiSync = m.SemiSync if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -527,7 +514,7 @@ func (m *ChangeTypeResponse) CloneVT() *ChangeTypeResponse { if m == nil { return (*ChangeTypeResponse)(nil) } - r := &ChangeTypeResponse{} + r := new(ChangeTypeResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -543,7 +530,7 @@ func (m *RefreshStateRequest) CloneVT() *RefreshStateRequest { if m == nil { return (*RefreshStateRequest)(nil) } - r := &RefreshStateRequest{} + r := new(RefreshStateRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -559,7 +546,7 @@ func (m *RefreshStateResponse) CloneVT() *RefreshStateResponse { if m == nil { return (*RefreshStateResponse)(nil) } - r := &RefreshStateResponse{} + r := new(RefreshStateResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -575,7 +562,7 @@ func (m *RunHealthCheckRequest) CloneVT() *RunHealthCheckRequest { if m == nil { return (*RunHealthCheckRequest)(nil) } - r := &RunHealthCheckRequest{} + r := new(RunHealthCheckRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -591,7 +578,7 @@ func (m *RunHealthCheckResponse) CloneVT() *RunHealthCheckResponse { if m == nil { return (*RunHealthCheckResponse)(nil) } - r := &RunHealthCheckResponse{} + r := new(RunHealthCheckResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -607,9 +594,8 @@ func (m *ReloadSchemaRequest) CloneVT() *ReloadSchemaRequest { if m == nil { return (*ReloadSchemaRequest)(nil) } - r := &ReloadSchemaRequest{ - WaitPosition: m.WaitPosition, - } + r := new(ReloadSchemaRequest) + r.WaitPosition = m.WaitPosition if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -625,7 +611,7 @@ func (m *ReloadSchemaResponse) CloneVT() *ReloadSchemaResponse { if m == nil { return (*ReloadSchemaResponse)(nil) } - r := &ReloadSchemaResponse{} + r := new(ReloadSchemaResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -641,7 +627,7 @@ func (m *PreflightSchemaRequest) CloneVT() *PreflightSchemaRequest { if m == nil { return (*PreflightSchemaRequest)(nil) } - r := &PreflightSchemaRequest{} + r := new(PreflightSchemaRequest) if rhs := m.Changes; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -662,7 +648,7 @@ func (m *PreflightSchemaResponse) CloneVT() *PreflightSchemaResponse { if m == nil { return (*PreflightSchemaResponse)(nil) } - r := &PreflightSchemaResponse{} + r := new(PreflightSchemaResponse) if rhs := m.ChangeResults; rhs != nil { tmpContainer := make([]*SchemaChangeResult, len(rhs)) for k, v := range rhs { @@ -685,16 +671,15 @@ func (m *ApplySchemaRequest) CloneVT() *ApplySchemaRequest { if m == nil { return (*ApplySchemaRequest)(nil) } - r := &ApplySchemaRequest{ - Sql: m.Sql, - Force: m.Force, - AllowReplication: m.AllowReplication, - BeforeSchema: m.BeforeSchema.CloneVT(), - AfterSchema: m.AfterSchema.CloneVT(), - SqlMode: m.SqlMode, - BatchSize: m.BatchSize, - DisableForeignKeyChecks: m.DisableForeignKeyChecks, - } + r := new(ApplySchemaRequest) + r.Sql = m.Sql + r.Force = m.Force + r.AllowReplication = m.AllowReplication + r.BeforeSchema = m.BeforeSchema.CloneVT() + r.AfterSchema = m.AfterSchema.CloneVT() + r.SqlMode = m.SqlMode + r.BatchSize = m.BatchSize + r.DisableForeignKeyChecks = m.DisableForeignKeyChecks if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -710,10 +695,9 @@ func (m *ApplySchemaResponse) CloneVT() *ApplySchemaResponse { if m == nil { return (*ApplySchemaResponse)(nil) } - r := &ApplySchemaResponse{ - BeforeSchema: m.BeforeSchema.CloneVT(), - AfterSchema: m.AfterSchema.CloneVT(), - } + r := new(ApplySchemaResponse) + r.BeforeSchema = m.BeforeSchema.CloneVT() + r.AfterSchema = m.AfterSchema.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -729,7 +713,7 @@ func (m *LockTablesRequest) CloneVT() *LockTablesRequest { if m == nil { return (*LockTablesRequest)(nil) } - r := &LockTablesRequest{} + r := new(LockTablesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -745,7 +729,7 @@ func (m *LockTablesResponse) CloneVT() *LockTablesResponse { if m == nil { return (*LockTablesResponse)(nil) } - r := &LockTablesResponse{} + r := new(LockTablesResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -761,7 +745,7 @@ func (m *UnlockTablesRequest) CloneVT() *UnlockTablesRequest { if m == nil { return (*UnlockTablesRequest)(nil) } - r := &UnlockTablesRequest{} + r := new(UnlockTablesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -777,7 +761,7 @@ func (m *UnlockTablesResponse) CloneVT() *UnlockTablesResponse { if m == nil { return (*UnlockTablesResponse)(nil) } - r := &UnlockTablesResponse{} + r := new(UnlockTablesResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -793,11 +777,10 @@ func (m *ExecuteQueryRequest) CloneVT() *ExecuteQueryRequest { if m == nil { return (*ExecuteQueryRequest)(nil) } - r := &ExecuteQueryRequest{ - DbName: m.DbName, - MaxRows: m.MaxRows, - CallerId: m.CallerId.CloneVT(), - } + r := new(ExecuteQueryRequest) + r.DbName = m.DbName + r.MaxRows = m.MaxRows + r.CallerId = m.CallerId.CloneVT() if rhs := m.Query; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -818,9 +801,8 @@ func (m *ExecuteQueryResponse) CloneVT() *ExecuteQueryResponse { if m == nil { return (*ExecuteQueryResponse)(nil) } - r := &ExecuteQueryResponse{ - Result: m.Result.CloneVT(), - } + r := new(ExecuteQueryResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -836,13 +818,12 @@ func (m *ExecuteFetchAsDbaRequest) CloneVT() *ExecuteFetchAsDbaRequest { if m == nil { return (*ExecuteFetchAsDbaRequest)(nil) } - r := &ExecuteFetchAsDbaRequest{ - DbName: m.DbName, - MaxRows: m.MaxRows, - DisableBinlogs: m.DisableBinlogs, - ReloadSchema: m.ReloadSchema, - DisableForeignKeyChecks: m.DisableForeignKeyChecks, - } + r := new(ExecuteFetchAsDbaRequest) + r.DbName = m.DbName + r.MaxRows = m.MaxRows + r.DisableBinlogs = m.DisableBinlogs + r.ReloadSchema = m.ReloadSchema + r.DisableForeignKeyChecks = m.DisableForeignKeyChecks if rhs := m.Query; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -863,9 +844,8 @@ func (m *ExecuteFetchAsDbaResponse) CloneVT() *ExecuteFetchAsDbaResponse { if m == nil { return (*ExecuteFetchAsDbaResponse)(nil) } - r := &ExecuteFetchAsDbaResponse{ - Result: m.Result.CloneVT(), - } + r := new(ExecuteFetchAsDbaResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -881,13 +861,12 @@ func (m *ExecuteMultiFetchAsDbaRequest) CloneVT() *ExecuteMultiFetchAsDbaRequest if m == nil { return (*ExecuteMultiFetchAsDbaRequest)(nil) } - r := &ExecuteMultiFetchAsDbaRequest{ - DbName: m.DbName, - MaxRows: m.MaxRows, - DisableBinlogs: m.DisableBinlogs, - ReloadSchema: m.ReloadSchema, - DisableForeignKeyChecks: m.DisableForeignKeyChecks, - } + r := new(ExecuteMultiFetchAsDbaRequest) + r.DbName = m.DbName + r.MaxRows = m.MaxRows + r.DisableBinlogs = m.DisableBinlogs + r.ReloadSchema = m.ReloadSchema + r.DisableForeignKeyChecks = m.DisableForeignKeyChecks if rhs := m.Sql; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -908,7 +887,7 @@ func (m *ExecuteMultiFetchAsDbaResponse) CloneVT() *ExecuteMultiFetchAsDbaRespon if m == nil { return (*ExecuteMultiFetchAsDbaResponse)(nil) } - r := &ExecuteMultiFetchAsDbaResponse{} + r := new(ExecuteMultiFetchAsDbaResponse) if rhs := m.Results; rhs != nil { tmpContainer := make([]*query.QueryResult, len(rhs)) for k, v := range rhs { @@ -931,11 +910,10 @@ func (m *ExecuteFetchAsAllPrivsRequest) CloneVT() *ExecuteFetchAsAllPrivsRequest if m == nil { return (*ExecuteFetchAsAllPrivsRequest)(nil) } - r := &ExecuteFetchAsAllPrivsRequest{ - DbName: m.DbName, - MaxRows: m.MaxRows, - ReloadSchema: m.ReloadSchema, - } + r := new(ExecuteFetchAsAllPrivsRequest) + r.DbName = m.DbName + r.MaxRows = m.MaxRows + r.ReloadSchema = m.ReloadSchema if rhs := m.Query; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -956,9 +934,8 @@ func (m *ExecuteFetchAsAllPrivsResponse) CloneVT() *ExecuteFetchAsAllPrivsRespon if m == nil { return (*ExecuteFetchAsAllPrivsResponse)(nil) } - r := &ExecuteFetchAsAllPrivsResponse{ - Result: m.Result.CloneVT(), - } + r := new(ExecuteFetchAsAllPrivsResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -974,9 +951,8 @@ func (m *ExecuteFetchAsAppRequest) CloneVT() *ExecuteFetchAsAppRequest { if m == nil { return (*ExecuteFetchAsAppRequest)(nil) } - r := &ExecuteFetchAsAppRequest{ - MaxRows: m.MaxRows, - } + r := new(ExecuteFetchAsAppRequest) + r.MaxRows = m.MaxRows if rhs := m.Query; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -997,9 +973,8 @@ func (m *ExecuteFetchAsAppResponse) CloneVT() *ExecuteFetchAsAppResponse { if m == nil { return (*ExecuteFetchAsAppResponse)(nil) } - r := &ExecuteFetchAsAppResponse{ - Result: m.Result.CloneVT(), - } + r := new(ExecuteFetchAsAppResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1011,11 +986,152 @@ func (m *ExecuteFetchAsAppResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *GetUnresolvedTransactionsRequest) CloneVT() *GetUnresolvedTransactionsRequest { + if m == nil { + return (*GetUnresolvedTransactionsRequest)(nil) + } + r := new(GetUnresolvedTransactionsRequest) + r.AbandonAge = m.AbandonAge + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *GetUnresolvedTransactionsRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *GetUnresolvedTransactionsResponse) CloneVT() *GetUnresolvedTransactionsResponse { + if m == nil { + return (*GetUnresolvedTransactionsResponse)(nil) + } + r := new(GetUnresolvedTransactionsResponse) + if rhs := m.Transactions; rhs != nil { + tmpContainer := make([]*query.TransactionMetadata, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Transactions = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *GetUnresolvedTransactionsResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ReadTransactionRequest) CloneVT() *ReadTransactionRequest { + if m == nil { + return (*ReadTransactionRequest)(nil) + } + r := new(ReadTransactionRequest) + r.Dtid = m.Dtid + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ReadTransactionRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ReadTransactionResponse) CloneVT() *ReadTransactionResponse { + if m == nil { + return (*ReadTransactionResponse)(nil) + } + r := new(ReadTransactionResponse) + r.Transaction = m.Transaction.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ReadTransactionResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ConcludeTransactionRequest) CloneVT() *ConcludeTransactionRequest { + if m == nil { + return (*ConcludeTransactionRequest)(nil) + } + r := new(ConcludeTransactionRequest) + r.Dtid = m.Dtid + r.Mm = m.Mm + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ConcludeTransactionRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ConcludeTransactionResponse) CloneVT() *ConcludeTransactionResponse { + if m == nil { + return (*ConcludeTransactionResponse)(nil) + } + r := new(ConcludeTransactionResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ConcludeTransactionResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MysqlHostMetricsRequest) CloneVT() *MysqlHostMetricsRequest { + if m == nil { + return (*MysqlHostMetricsRequest)(nil) + } + r := new(MysqlHostMetricsRequest) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MysqlHostMetricsRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MysqlHostMetricsResponse) CloneVT() *MysqlHostMetricsResponse { + if m == nil { + return (*MysqlHostMetricsResponse)(nil) + } + r := new(MysqlHostMetricsResponse) + r.HostMetrics = m.HostMetrics.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MysqlHostMetricsResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *ReplicationStatusRequest) CloneVT() *ReplicationStatusRequest { if m == nil { return (*ReplicationStatusRequest)(nil) } - r := &ReplicationStatusRequest{} + r := new(ReplicationStatusRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1031,9 +1147,8 @@ func (m *ReplicationStatusResponse) CloneVT() *ReplicationStatusResponse { if m == nil { return (*ReplicationStatusResponse)(nil) } - r := &ReplicationStatusResponse{ - Status: m.Status.CloneVT(), - } + r := new(ReplicationStatusResponse) + r.Status = m.Status.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1049,7 +1164,7 @@ func (m *PrimaryStatusRequest) CloneVT() *PrimaryStatusRequest { if m == nil { return (*PrimaryStatusRequest)(nil) } - r := &PrimaryStatusRequest{} + r := new(PrimaryStatusRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1065,9 +1180,8 @@ func (m *PrimaryStatusResponse) CloneVT() *PrimaryStatusResponse { if m == nil { return (*PrimaryStatusResponse)(nil) } - r := &PrimaryStatusResponse{ - Status: m.Status.CloneVT(), - } + r := new(PrimaryStatusResponse) + r.Status = m.Status.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1083,7 +1197,7 @@ func (m *PrimaryPositionRequest) CloneVT() *PrimaryPositionRequest { if m == nil { return (*PrimaryPositionRequest)(nil) } - r := &PrimaryPositionRequest{} + r := new(PrimaryPositionRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1099,9 +1213,8 @@ func (m *PrimaryPositionResponse) CloneVT() *PrimaryPositionResponse { if m == nil { return (*PrimaryPositionResponse)(nil) } - r := &PrimaryPositionResponse{ - Position: m.Position, - } + r := new(PrimaryPositionResponse) + r.Position = m.Position if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1117,9 +1230,8 @@ func (m *WaitForPositionRequest) CloneVT() *WaitForPositionRequest { if m == nil { return (*WaitForPositionRequest)(nil) } - r := &WaitForPositionRequest{ - Position: m.Position, - } + r := new(WaitForPositionRequest) + r.Position = m.Position if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1135,7 +1247,7 @@ func (m *WaitForPositionResponse) CloneVT() *WaitForPositionResponse { if m == nil { return (*WaitForPositionResponse)(nil) } - r := &WaitForPositionResponse{} + r := new(WaitForPositionResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1151,7 +1263,7 @@ func (m *StopReplicationRequest) CloneVT() *StopReplicationRequest { if m == nil { return (*StopReplicationRequest)(nil) } - r := &StopReplicationRequest{} + r := new(StopReplicationRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1167,7 +1279,7 @@ func (m *StopReplicationResponse) CloneVT() *StopReplicationResponse { if m == nil { return (*StopReplicationResponse)(nil) } - r := &StopReplicationResponse{} + r := new(StopReplicationResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1183,10 +1295,9 @@ func (m *StopReplicationMinimumRequest) CloneVT() *StopReplicationMinimumRequest if m == nil { return (*StopReplicationMinimumRequest)(nil) } - r := &StopReplicationMinimumRequest{ - Position: m.Position, - WaitTimeout: m.WaitTimeout, - } + r := new(StopReplicationMinimumRequest) + r.Position = m.Position + r.WaitTimeout = m.WaitTimeout if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1202,9 +1313,8 @@ func (m *StopReplicationMinimumResponse) CloneVT() *StopReplicationMinimumRespon if m == nil { return (*StopReplicationMinimumResponse)(nil) } - r := &StopReplicationMinimumResponse{ - Position: m.Position, - } + r := new(StopReplicationMinimumResponse) + r.Position = m.Position if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1220,9 +1330,8 @@ func (m *StartReplicationRequest) CloneVT() *StartReplicationRequest { if m == nil { return (*StartReplicationRequest)(nil) } - r := &StartReplicationRequest{ - SemiSync: m.SemiSync, - } + r := new(StartReplicationRequest) + r.SemiSync = m.SemiSync if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1238,7 +1347,7 @@ func (m *StartReplicationResponse) CloneVT() *StartReplicationResponse { if m == nil { return (*StartReplicationResponse)(nil) } - r := &StartReplicationResponse{} + r := new(StartReplicationResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1254,10 +1363,9 @@ func (m *StartReplicationUntilAfterRequest) CloneVT() *StartReplicationUntilAfte if m == nil { return (*StartReplicationUntilAfterRequest)(nil) } - r := &StartReplicationUntilAfterRequest{ - Position: m.Position, - WaitTimeout: m.WaitTimeout, - } + r := new(StartReplicationUntilAfterRequest) + r.Position = m.Position + r.WaitTimeout = m.WaitTimeout if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1273,7 +1381,7 @@ func (m *StartReplicationUntilAfterResponse) CloneVT() *StartReplicationUntilAft if m == nil { return (*StartReplicationUntilAfterResponse)(nil) } - r := &StartReplicationUntilAfterResponse{} + r := new(StartReplicationUntilAfterResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1289,7 +1397,7 @@ func (m *GetReplicasRequest) CloneVT() *GetReplicasRequest { if m == nil { return (*GetReplicasRequest)(nil) } - r := &GetReplicasRequest{} + r := new(GetReplicasRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1305,7 +1413,7 @@ func (m *GetReplicasResponse) CloneVT() *GetReplicasResponse { if m == nil { return (*GetReplicasResponse)(nil) } - r := &GetReplicasResponse{} + r := new(GetReplicasResponse) if rhs := m.Addrs; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1326,7 +1434,7 @@ func (m *ResetReplicationRequest) CloneVT() *ResetReplicationRequest { if m == nil { return (*ResetReplicationRequest)(nil) } - r := &ResetReplicationRequest{} + r := new(ResetReplicationRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1342,7 +1450,7 @@ func (m *ResetReplicationResponse) CloneVT() *ResetReplicationResponse { if m == nil { return (*ResetReplicationResponse)(nil) } - r := &ResetReplicationResponse{} + r := new(ResetReplicationResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1358,9 +1466,8 @@ func (m *VReplicationExecRequest) CloneVT() *VReplicationExecRequest { if m == nil { return (*VReplicationExecRequest)(nil) } - r := &VReplicationExecRequest{ - Query: m.Query, - } + r := new(VReplicationExecRequest) + r.Query = m.Query if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1376,9 +1483,8 @@ func (m *VReplicationExecResponse) CloneVT() *VReplicationExecResponse { if m == nil { return (*VReplicationExecResponse)(nil) } - r := &VReplicationExecResponse{ - Result: m.Result.CloneVT(), - } + r := new(VReplicationExecResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1394,10 +1500,9 @@ func (m *VReplicationWaitForPosRequest) CloneVT() *VReplicationWaitForPosRequest if m == nil { return (*VReplicationWaitForPosRequest)(nil) } - r := &VReplicationWaitForPosRequest{ - Id: m.Id, - Position: m.Position, - } + r := new(VReplicationWaitForPosRequest) + r.Id = m.Id + r.Position = m.Position if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1413,7 +1518,7 @@ func (m *VReplicationWaitForPosResponse) CloneVT() *VReplicationWaitForPosRespon if m == nil { return (*VReplicationWaitForPosResponse)(nil) } - r := &VReplicationWaitForPosResponse{} + r := new(VReplicationWaitForPosResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1429,9 +1534,8 @@ func (m *InitPrimaryRequest) CloneVT() *InitPrimaryRequest { if m == nil { return (*InitPrimaryRequest)(nil) } - r := &InitPrimaryRequest{ - SemiSync: m.SemiSync, - } + r := new(InitPrimaryRequest) + r.SemiSync = m.SemiSync if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1447,9 +1551,8 @@ func (m *InitPrimaryResponse) CloneVT() *InitPrimaryResponse { if m == nil { return (*InitPrimaryResponse)(nil) } - r := &InitPrimaryResponse{ - Position: m.Position, - } + r := new(InitPrimaryResponse) + r.Position = m.Position if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1465,12 +1568,11 @@ func (m *PopulateReparentJournalRequest) CloneVT() *PopulateReparentJournalReque if m == nil { return (*PopulateReparentJournalRequest)(nil) } - r := &PopulateReparentJournalRequest{ - TimeCreatedNs: m.TimeCreatedNs, - ActionName: m.ActionName, - PrimaryAlias: m.PrimaryAlias.CloneVT(), - ReplicationPosition: m.ReplicationPosition, - } + r := new(PopulateReparentJournalRequest) + r.TimeCreatedNs = m.TimeCreatedNs + r.ActionName = m.ActionName + r.PrimaryAlias = m.PrimaryAlias.CloneVT() + r.ReplicationPosition = m.ReplicationPosition if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1486,7 +1588,7 @@ func (m *PopulateReparentJournalResponse) CloneVT() *PopulateReparentJournalResp if m == nil { return (*PopulateReparentJournalResponse)(nil) } - r := &PopulateReparentJournalResponse{} + r := new(PopulateReparentJournalResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1498,16 +1600,48 @@ func (m *PopulateReparentJournalResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *ReadReparentJournalInfoRequest) CloneVT() *ReadReparentJournalInfoRequest { + if m == nil { + return (*ReadReparentJournalInfoRequest)(nil) + } + r := new(ReadReparentJournalInfoRequest) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ReadReparentJournalInfoRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ReadReparentJournalInfoResponse) CloneVT() *ReadReparentJournalInfoResponse { + if m == nil { + return (*ReadReparentJournalInfoResponse)(nil) + } + r := new(ReadReparentJournalInfoResponse) + r.Length = m.Length + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ReadReparentJournalInfoResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *InitReplicaRequest) CloneVT() *InitReplicaRequest { if m == nil { return (*InitReplicaRequest)(nil) } - r := &InitReplicaRequest{ - Parent: m.Parent.CloneVT(), - ReplicationPosition: m.ReplicationPosition, - TimeCreatedNs: m.TimeCreatedNs, - SemiSync: m.SemiSync, - } + r := new(InitReplicaRequest) + r.Parent = m.Parent.CloneVT() + r.ReplicationPosition = m.ReplicationPosition + r.TimeCreatedNs = m.TimeCreatedNs + r.SemiSync = m.SemiSync if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1523,7 +1657,7 @@ func (m *InitReplicaResponse) CloneVT() *InitReplicaResponse { if m == nil { return (*InitReplicaResponse)(nil) } - r := &InitReplicaResponse{} + r := new(InitReplicaResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1539,7 +1673,7 @@ func (m *DemotePrimaryRequest) CloneVT() *DemotePrimaryRequest { if m == nil { return (*DemotePrimaryRequest)(nil) } - r := &DemotePrimaryRequest{} + r := new(DemotePrimaryRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1555,9 +1689,8 @@ func (m *DemotePrimaryResponse) CloneVT() *DemotePrimaryResponse { if m == nil { return (*DemotePrimaryResponse)(nil) } - r := &DemotePrimaryResponse{ - PrimaryStatus: m.PrimaryStatus.CloneVT(), - } + r := new(DemotePrimaryResponse) + r.PrimaryStatus = m.PrimaryStatus.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1573,9 +1706,8 @@ func (m *UndoDemotePrimaryRequest) CloneVT() *UndoDemotePrimaryRequest { if m == nil { return (*UndoDemotePrimaryRequest)(nil) } - r := &UndoDemotePrimaryRequest{ - SemiSync: m.SemiSync, - } + r := new(UndoDemotePrimaryRequest) + r.SemiSync = m.SemiSync if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1591,7 +1723,7 @@ func (m *UndoDemotePrimaryResponse) CloneVT() *UndoDemotePrimaryResponse { if m == nil { return (*UndoDemotePrimaryResponse)(nil) } - r := &UndoDemotePrimaryResponse{} + r := new(UndoDemotePrimaryResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1607,7 +1739,7 @@ func (m *ReplicaWasPromotedRequest) CloneVT() *ReplicaWasPromotedRequest { if m == nil { return (*ReplicaWasPromotedRequest)(nil) } - r := &ReplicaWasPromotedRequest{} + r := new(ReplicaWasPromotedRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1623,7 +1755,7 @@ func (m *ReplicaWasPromotedResponse) CloneVT() *ReplicaWasPromotedResponse { if m == nil { return (*ReplicaWasPromotedResponse)(nil) } - r := &ReplicaWasPromotedResponse{} + r := new(ReplicaWasPromotedResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1639,7 +1771,7 @@ func (m *ResetReplicationParametersRequest) CloneVT() *ResetReplicationParameter if m == nil { return (*ResetReplicationParametersRequest)(nil) } - r := &ResetReplicationParametersRequest{} + r := new(ResetReplicationParametersRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1655,7 +1787,7 @@ func (m *ResetReplicationParametersResponse) CloneVT() *ResetReplicationParamete if m == nil { return (*ResetReplicationParametersResponse)(nil) } - r := &ResetReplicationParametersResponse{} + r := new(ResetReplicationParametersResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1671,7 +1803,7 @@ func (m *FullStatusRequest) CloneVT() *FullStatusRequest { if m == nil { return (*FullStatusRequest)(nil) } - r := &FullStatusRequest{} + r := new(FullStatusRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1687,9 +1819,8 @@ func (m *FullStatusResponse) CloneVT() *FullStatusResponse { if m == nil { return (*FullStatusResponse)(nil) } - r := &FullStatusResponse{ - Status: m.Status.CloneVT(), - } + r := new(FullStatusResponse) + r.Status = m.Status.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1705,14 +1836,13 @@ func (m *SetReplicationSourceRequest) CloneVT() *SetReplicationSourceRequest { if m == nil { return (*SetReplicationSourceRequest)(nil) } - r := &SetReplicationSourceRequest{ - Parent: m.Parent.CloneVT(), - TimeCreatedNs: m.TimeCreatedNs, - ForceStartReplication: m.ForceStartReplication, - WaitPosition: m.WaitPosition, - SemiSync: m.SemiSync, - HeartbeatInterval: m.HeartbeatInterval, - } + r := new(SetReplicationSourceRequest) + r.Parent = m.Parent.CloneVT() + r.TimeCreatedNs = m.TimeCreatedNs + r.ForceStartReplication = m.ForceStartReplication + r.WaitPosition = m.WaitPosition + r.SemiSync = m.SemiSync + r.HeartbeatInterval = m.HeartbeatInterval if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1728,7 +1858,7 @@ func (m *SetReplicationSourceResponse) CloneVT() *SetReplicationSourceResponse { if m == nil { return (*SetReplicationSourceResponse)(nil) } - r := &SetReplicationSourceResponse{} + r := new(SetReplicationSourceResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1744,9 +1874,8 @@ func (m *ReplicaWasRestartedRequest) CloneVT() *ReplicaWasRestartedRequest { if m == nil { return (*ReplicaWasRestartedRequest)(nil) } - r := &ReplicaWasRestartedRequest{ - Parent: m.Parent.CloneVT(), - } + r := new(ReplicaWasRestartedRequest) + r.Parent = m.Parent.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1762,7 +1891,7 @@ func (m *ReplicaWasRestartedResponse) CloneVT() *ReplicaWasRestartedResponse { if m == nil { return (*ReplicaWasRestartedResponse)(nil) } - r := &ReplicaWasRestartedResponse{} + r := new(ReplicaWasRestartedResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1778,9 +1907,8 @@ func (m *StopReplicationAndGetStatusRequest) CloneVT() *StopReplicationAndGetSta if m == nil { return (*StopReplicationAndGetStatusRequest)(nil) } - r := &StopReplicationAndGetStatusRequest{ - StopReplicationMode: m.StopReplicationMode, - } + r := new(StopReplicationAndGetStatusRequest) + r.StopReplicationMode = m.StopReplicationMode if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1796,9 +1924,8 @@ func (m *StopReplicationAndGetStatusResponse) CloneVT() *StopReplicationAndGetSt if m == nil { return (*StopReplicationAndGetStatusResponse)(nil) } - r := &StopReplicationAndGetStatusResponse{ - Status: m.Status.CloneVT(), - } + r := new(StopReplicationAndGetStatusResponse) + r.Status = m.Status.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1814,9 +1941,8 @@ func (m *PromoteReplicaRequest) CloneVT() *PromoteReplicaRequest { if m == nil { return (*PromoteReplicaRequest)(nil) } - r := &PromoteReplicaRequest{ - SemiSync: m.SemiSync, - } + r := new(PromoteReplicaRequest) + r.SemiSync = m.SemiSync if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1832,9 +1958,8 @@ func (m *PromoteReplicaResponse) CloneVT() *PromoteReplicaResponse { if m == nil { return (*PromoteReplicaResponse)(nil) } - r := &PromoteReplicaResponse{ - Position: m.Position, - } + r := new(PromoteReplicaResponse) + r.Position = m.Position if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1850,11 +1975,14 @@ func (m *BackupRequest) CloneVT() *BackupRequest { if m == nil { return (*BackupRequest)(nil) } - r := &BackupRequest{ - Concurrency: m.Concurrency, - AllowPrimary: m.AllowPrimary, - IncrementalFromPos: m.IncrementalFromPos, - UpgradeSafe: m.UpgradeSafe, + r := new(BackupRequest) + r.Concurrency = m.Concurrency + r.AllowPrimary = m.AllowPrimary + r.IncrementalFromPos = m.IncrementalFromPos + r.UpgradeSafe = m.UpgradeSafe + if rhs := m.BackupEngine; rhs != nil { + tmpVal := *rhs + r.BackupEngine = &tmpVal } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -1871,9 +1999,8 @@ func (m *BackupResponse) CloneVT() *BackupResponse { if m == nil { return (*BackupResponse)(nil) } - r := &BackupResponse{ - Event: m.Event.CloneVT(), - } + r := new(BackupResponse) + r.Event = m.Event.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1889,11 +2016,15 @@ func (m *RestoreFromBackupRequest) CloneVT() *RestoreFromBackupRequest { if m == nil { return (*RestoreFromBackupRequest)(nil) } - r := &RestoreFromBackupRequest{ - BackupTime: m.BackupTime.CloneVT(), - RestoreToPos: m.RestoreToPos, - DryRun: m.DryRun, - RestoreToTimestamp: m.RestoreToTimestamp.CloneVT(), + r := new(RestoreFromBackupRequest) + r.BackupTime = m.BackupTime.CloneVT() + r.RestoreToPos = m.RestoreToPos + r.DryRun = m.DryRun + r.RestoreToTimestamp = m.RestoreToTimestamp.CloneVT() + if rhs := m.AllowedBackupEngines; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.AllowedBackupEngines = tmpContainer } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -1910,9 +2041,8 @@ func (m *RestoreFromBackupResponse) CloneVT() *RestoreFromBackupResponse { if m == nil { return (*RestoreFromBackupResponse)(nil) } - r := &RestoreFromBackupResponse{ - Event: m.Event.CloneVT(), - } + r := new(RestoreFromBackupResponse) + r.Event = m.Event.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1928,16 +2058,15 @@ func (m *CreateVReplicationWorkflowRequest) CloneVT() *CreateVReplicationWorkflo if m == nil { return (*CreateVReplicationWorkflowRequest)(nil) } - r := &CreateVReplicationWorkflowRequest{ - Workflow: m.Workflow, - TabletSelectionPreference: m.TabletSelectionPreference, - WorkflowType: m.WorkflowType, - WorkflowSubType: m.WorkflowSubType, - DeferSecondaryKeys: m.DeferSecondaryKeys, - AutoStart: m.AutoStart, - StopAfterCopy: m.StopAfterCopy, - Options: m.Options, - } + r := new(CreateVReplicationWorkflowRequest) + r.Workflow = m.Workflow + r.TabletSelectionPreference = m.TabletSelectionPreference + r.WorkflowType = m.WorkflowType + r.WorkflowSubType = m.WorkflowSubType + r.DeferSecondaryKeys = m.DeferSecondaryKeys + r.AutoStart = m.AutoStart + r.StopAfterCopy = m.StopAfterCopy + r.Options = m.Options if rhs := m.BinlogSource; rhs != nil { tmpContainer := make([]*binlogdata.BinlogSource, len(rhs)) for k, v := range rhs { @@ -1970,9 +2099,8 @@ func (m *CreateVReplicationWorkflowResponse) CloneVT() *CreateVReplicationWorkfl if m == nil { return (*CreateVReplicationWorkflowResponse)(nil) } - r := &CreateVReplicationWorkflowResponse{ - Result: m.Result.CloneVT(), - } + r := new(CreateVReplicationWorkflowResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1984,13 +2112,52 @@ func (m *CreateVReplicationWorkflowResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *DeleteTableDataRequest) CloneVT() *DeleteTableDataRequest { + if m == nil { + return (*DeleteTableDataRequest)(nil) + } + r := new(DeleteTableDataRequest) + r.BatchSize = m.BatchSize + if rhs := m.TableFilters; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.TableFilters = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *DeleteTableDataRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *DeleteTableDataResponse) CloneVT() *DeleteTableDataResponse { + if m == nil { + return (*DeleteTableDataResponse)(nil) + } + r := new(DeleteTableDataResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *DeleteTableDataResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *DeleteVReplicationWorkflowRequest) CloneVT() *DeleteVReplicationWorkflowRequest { if m == nil { return (*DeleteVReplicationWorkflowRequest)(nil) } - r := &DeleteVReplicationWorkflowRequest{ - Workflow: m.Workflow, - } + r := new(DeleteVReplicationWorkflowRequest) + r.Workflow = m.Workflow if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2006,9 +2173,8 @@ func (m *DeleteVReplicationWorkflowResponse) CloneVT() *DeleteVReplicationWorkfl if m == nil { return (*DeleteVReplicationWorkflowResponse)(nil) } - r := &DeleteVReplicationWorkflowResponse{ - Result: m.Result.CloneVT(), - } + r := new(DeleteVReplicationWorkflowResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2024,7 +2190,7 @@ func (m *HasVReplicationWorkflowsRequest) CloneVT() *HasVReplicationWorkflowsReq if m == nil { return (*HasVReplicationWorkflowsRequest)(nil) } - r := &HasVReplicationWorkflowsRequest{} + r := new(HasVReplicationWorkflowsRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2040,9 +2206,8 @@ func (m *HasVReplicationWorkflowsResponse) CloneVT() *HasVReplicationWorkflowsRe if m == nil { return (*HasVReplicationWorkflowsResponse)(nil) } - r := &HasVReplicationWorkflowsResponse{ - Has: m.Has, - } + r := new(HasVReplicationWorkflowsResponse) + r.Has = m.Has if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2058,9 +2223,8 @@ func (m *ReadVReplicationWorkflowsRequest) CloneVT() *ReadVReplicationWorkflowsR if m == nil { return (*ReadVReplicationWorkflowsRequest)(nil) } - r := &ReadVReplicationWorkflowsRequest{ - ExcludeFrozen: m.ExcludeFrozen, - } + r := new(ReadVReplicationWorkflowsRequest) + r.ExcludeFrozen = m.ExcludeFrozen if rhs := m.IncludeIds; rhs != nil { tmpContainer := make([]int32, len(rhs)) copy(tmpContainer, rhs) @@ -2101,7 +2265,7 @@ func (m *ReadVReplicationWorkflowsResponse) CloneVT() *ReadVReplicationWorkflows if m == nil { return (*ReadVReplicationWorkflowsResponse)(nil) } - r := &ReadVReplicationWorkflowsResponse{} + r := new(ReadVReplicationWorkflowsResponse) if rhs := m.Workflows; rhs != nil { tmpContainer := make([]*ReadVReplicationWorkflowResponse, len(rhs)) for k, v := range rhs { @@ -2124,9 +2288,8 @@ func (m *ReadVReplicationWorkflowRequest) CloneVT() *ReadVReplicationWorkflowReq if m == nil { return (*ReadVReplicationWorkflowRequest)(nil) } - r := &ReadVReplicationWorkflowRequest{ - Workflow: m.Workflow, - } + r := new(ReadVReplicationWorkflowRequest) + r.Workflow = m.Workflow if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2142,22 +2305,21 @@ func (m *ReadVReplicationWorkflowResponse_Stream) CloneVT() *ReadVReplicationWor if m == nil { return (*ReadVReplicationWorkflowResponse_Stream)(nil) } - r := &ReadVReplicationWorkflowResponse_Stream{ - Id: m.Id, - Bls: m.Bls.CloneVT(), - Pos: m.Pos, - StopPos: m.StopPos, - MaxTps: m.MaxTps, - MaxReplicationLag: m.MaxReplicationLag, - TimeUpdated: m.TimeUpdated.CloneVT(), - TransactionTimestamp: m.TransactionTimestamp.CloneVT(), - State: m.State, - Message: m.Message, - RowsCopied: m.RowsCopied, - TimeHeartbeat: m.TimeHeartbeat.CloneVT(), - TimeThrottled: m.TimeThrottled.CloneVT(), - ComponentThrottled: m.ComponentThrottled, - } + r := new(ReadVReplicationWorkflowResponse_Stream) + r.Id = m.Id + r.Bls = m.Bls.CloneVT() + r.Pos = m.Pos + r.StopPos = m.StopPos + r.MaxTps = m.MaxTps + r.MaxReplicationLag = m.MaxReplicationLag + r.TimeUpdated = m.TimeUpdated.CloneVT() + r.TransactionTimestamp = m.TransactionTimestamp.CloneVT() + r.State = m.State + r.Message = m.Message + r.RowsCopied = m.RowsCopied + r.TimeHeartbeat = m.TimeHeartbeat.CloneVT() + r.TimeThrottled = m.TimeThrottled.CloneVT() + r.ComponentThrottled = m.ComponentThrottled if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2173,17 +2335,16 @@ func (m *ReadVReplicationWorkflowResponse) CloneVT() *ReadVReplicationWorkflowRe if m == nil { return (*ReadVReplicationWorkflowResponse)(nil) } - r := &ReadVReplicationWorkflowResponse{ - Workflow: m.Workflow, - Cells: m.Cells, - TabletSelectionPreference: m.TabletSelectionPreference, - DbName: m.DbName, - Tags: m.Tags, - WorkflowType: m.WorkflowType, - WorkflowSubType: m.WorkflowSubType, - DeferSecondaryKeys: m.DeferSecondaryKeys, - Options: m.Options, - } + r := new(ReadVReplicationWorkflowResponse) + r.Workflow = m.Workflow + r.Cells = m.Cells + r.TabletSelectionPreference = m.TabletSelectionPreference + r.DbName = m.DbName + r.Tags = m.Tags + r.WorkflowType = m.WorkflowType + r.WorkflowSubType = m.WorkflowSubType + r.DeferSecondaryKeys = m.DeferSecondaryKeys + r.Options = m.Options if rhs := m.TabletTypes; rhs != nil { tmpContainer := make([]topodata.TabletType, len(rhs)) copy(tmpContainer, rhs) @@ -2196,6 +2357,13 @@ func (m *ReadVReplicationWorkflowResponse) CloneVT() *ReadVReplicationWorkflowRe } r.Streams = tmpContainer } + if rhs := m.ConfigOverrides; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.ConfigOverrides = tmpContainer + } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2207,18 +2375,51 @@ func (m *ReadVReplicationWorkflowResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *ValidateVReplicationPermissionsRequest) CloneVT() *ValidateVReplicationPermissionsRequest { + if m == nil { + return (*ValidateVReplicationPermissionsRequest)(nil) + } + r := new(ValidateVReplicationPermissionsRequest) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ValidateVReplicationPermissionsRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ValidateVReplicationPermissionsResponse) CloneVT() *ValidateVReplicationPermissionsResponse { + if m == nil { + return (*ValidateVReplicationPermissionsResponse)(nil) + } + r := new(ValidateVReplicationPermissionsResponse) + r.User = m.User + r.Ok = m.Ok + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ValidateVReplicationPermissionsResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *VDiffRequest) CloneVT() *VDiffRequest { if m == nil { return (*VDiffRequest)(nil) } - r := &VDiffRequest{ - Keyspace: m.Keyspace, - Workflow: m.Workflow, - Action: m.Action, - ActionArg: m.ActionArg, - VdiffUuid: m.VdiffUuid, - Options: m.Options.CloneVT(), - } + r := new(VDiffRequest) + r.Keyspace = m.Keyspace + r.Workflow = m.Workflow + r.Action = m.Action + r.ActionArg = m.ActionArg + r.VdiffUuid = m.VdiffUuid + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2234,11 +2435,10 @@ func (m *VDiffResponse) CloneVT() *VDiffResponse { if m == nil { return (*VDiffResponse)(nil) } - r := &VDiffResponse{ - Id: m.Id, - Output: m.Output.CloneVT(), - VdiffUuid: m.VdiffUuid, - } + r := new(VDiffResponse) + r.Id = m.Id + r.Output = m.Output.CloneVT() + r.VdiffUuid = m.VdiffUuid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2254,11 +2454,10 @@ func (m *VDiffPickerOptions) CloneVT() *VDiffPickerOptions { if m == nil { return (*VDiffPickerOptions)(nil) } - r := &VDiffPickerOptions{ - TabletTypes: m.TabletTypes, - SourceCell: m.SourceCell, - TargetCell: m.TargetCell, - } + r := new(VDiffPickerOptions) + r.TabletTypes = m.TabletTypes + r.SourceCell = m.SourceCell + r.TargetCell = m.TargetCell if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2274,12 +2473,12 @@ func (m *VDiffReportOptions) CloneVT() *VDiffReportOptions { if m == nil { return (*VDiffReportOptions)(nil) } - r := &VDiffReportOptions{ - OnlyPks: m.OnlyPks, - DebugQuery: m.DebugQuery, - Format: m.Format, - MaxSampleRows: m.MaxSampleRows, - } + r := new(VDiffReportOptions) + r.OnlyPks = m.OnlyPks + r.DebugQuery = m.DebugQuery + r.Format = m.Format + r.MaxSampleRows = m.MaxSampleRows + r.RowDiffColumnTruncateAt = m.RowDiffColumnTruncateAt if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2295,16 +2494,19 @@ func (m *VDiffCoreOptions) CloneVT() *VDiffCoreOptions { if m == nil { return (*VDiffCoreOptions)(nil) } - r := &VDiffCoreOptions{ - Tables: m.Tables, - AutoRetry: m.AutoRetry, - MaxRows: m.MaxRows, - Checksum: m.Checksum, - SamplePct: m.SamplePct, - TimeoutSeconds: m.TimeoutSeconds, - MaxExtraRowsToCompare: m.MaxExtraRowsToCompare, - UpdateTableStats: m.UpdateTableStats, - MaxDiffSeconds: m.MaxDiffSeconds, + r := new(VDiffCoreOptions) + r.Tables = m.Tables + r.AutoRetry = m.AutoRetry + r.MaxRows = m.MaxRows + r.Checksum = m.Checksum + r.SamplePct = m.SamplePct + r.TimeoutSeconds = m.TimeoutSeconds + r.MaxExtraRowsToCompare = m.MaxExtraRowsToCompare + r.UpdateTableStats = m.UpdateTableStats + r.MaxDiffSeconds = m.MaxDiffSeconds + if rhs := m.AutoStart; rhs != nil { + tmpVal := *rhs + r.AutoStart = &tmpVal } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -2321,11 +2523,10 @@ func (m *VDiffOptions) CloneVT() *VDiffOptions { if m == nil { return (*VDiffOptions)(nil) } - r := &VDiffOptions{ - PickerOptions: m.PickerOptions.CloneVT(), - CoreOptions: m.CoreOptions.CloneVT(), - ReportOptions: m.ReportOptions.CloneVT(), - } + r := new(VDiffOptions) + r.PickerOptions = m.PickerOptions.CloneVT() + r.CoreOptions = m.CoreOptions.CloneVT() + r.ReportOptions = m.ReportOptions.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2341,12 +2542,8 @@ func (m *UpdateVReplicationWorkflowRequest) CloneVT() *UpdateVReplicationWorkflo if m == nil { return (*UpdateVReplicationWorkflowRequest)(nil) } - r := &UpdateVReplicationWorkflowRequest{ - Workflow: m.Workflow, - TabletSelectionPreference: m.TabletSelectionPreference, - OnDdl: m.OnDdl, - State: m.State, - } + r := new(UpdateVReplicationWorkflowRequest) + r.Workflow = m.Workflow if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2357,12 +2554,31 @@ func (m *UpdateVReplicationWorkflowRequest) CloneVT() *UpdateVReplicationWorkflo copy(tmpContainer, rhs) r.TabletTypes = tmpContainer } - if len(m.unknownFields) > 0 { - r.unknownFields = make([]byte, len(m.unknownFields)) - copy(r.unknownFields, m.unknownFields) + if rhs := m.TabletSelectionPreference; rhs != nil { + tmpVal := *rhs + r.TabletSelectionPreference = &tmpVal } - return r -} + if rhs := m.OnDdl; rhs != nil { + tmpVal := *rhs + r.OnDdl = &tmpVal + } + if rhs := m.State; rhs != nil { + tmpVal := *rhs + r.State = &tmpVal + } + if rhs := m.ConfigOverrides; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.ConfigOverrides = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} func (m *UpdateVReplicationWorkflowRequest) CloneMessageVT() proto.Message { return m.CloneVT() @@ -2372,9 +2588,8 @@ func (m *UpdateVReplicationWorkflowResponse) CloneVT() *UpdateVReplicationWorkfl if m == nil { return (*UpdateVReplicationWorkflowResponse)(nil) } - r := &UpdateVReplicationWorkflowResponse{ - Result: m.Result.CloneVT(), - } + r := new(UpdateVReplicationWorkflowResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2390,12 +2605,8 @@ func (m *UpdateVReplicationWorkflowsRequest) CloneVT() *UpdateVReplicationWorkfl if m == nil { return (*UpdateVReplicationWorkflowsRequest)(nil) } - r := &UpdateVReplicationWorkflowsRequest{ - AllWorkflows: m.AllWorkflows, - State: m.State, - Message: m.Message, - StopPosition: m.StopPosition, - } + r := new(UpdateVReplicationWorkflowsRequest) + r.AllWorkflows = m.AllWorkflows if rhs := m.IncludeWorkflows; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2406,6 +2617,18 @@ func (m *UpdateVReplicationWorkflowsRequest) CloneVT() *UpdateVReplicationWorkfl copy(tmpContainer, rhs) r.ExcludeWorkflows = tmpContainer } + if rhs := m.State; rhs != nil { + tmpVal := *rhs + r.State = &tmpVal + } + if rhs := m.Message; rhs != nil { + tmpVal := *rhs + r.Message = &tmpVal + } + if rhs := m.StopPosition; rhs != nil { + tmpVal := *rhs + r.StopPosition = &tmpVal + } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2421,9 +2644,8 @@ func (m *UpdateVReplicationWorkflowsResponse) CloneVT() *UpdateVReplicationWorkf if m == nil { return (*UpdateVReplicationWorkflowsResponse)(nil) } - r := &UpdateVReplicationWorkflowsResponse{ - Result: m.Result.CloneVT(), - } + r := new(UpdateVReplicationWorkflowsResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2439,7 +2661,7 @@ func (m *ResetSequencesRequest) CloneVT() *ResetSequencesRequest { if m == nil { return (*ResetSequencesRequest)(nil) } - r := &ResetSequencesRequest{} + r := new(ResetSequencesRequest) if rhs := m.Tables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2460,7 +2682,7 @@ func (m *ResetSequencesResponse) CloneVT() *ResetSequencesResponse { if m == nil { return (*ResetSequencesResponse)(nil) } - r := &ResetSequencesResponse{} + r := new(ResetSequencesResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2476,13 +2698,12 @@ func (m *CheckThrottlerRequest) CloneVT() *CheckThrottlerRequest { if m == nil { return (*CheckThrottlerRequest)(nil) } - r := &CheckThrottlerRequest{ - AppName: m.AppName, - Scope: m.Scope, - SkipRequestHeartbeats: m.SkipRequestHeartbeats, - OkIfNotExists: m.OkIfNotExists, - MultiMetricsEnabled: m.MultiMetricsEnabled, - } + r := new(CheckThrottlerRequest) + r.AppName = m.AppName + r.Scope = m.Scope + r.SkipRequestHeartbeats = m.SkipRequestHeartbeats + r.OkIfNotExists = m.OkIfNotExists + r.MultiMetricsEnabled = m.MultiMetricsEnabled if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2498,15 +2719,15 @@ func (m *CheckThrottlerResponse_Metric) CloneVT() *CheckThrottlerResponse_Metric if m == nil { return (*CheckThrottlerResponse_Metric)(nil) } - r := &CheckThrottlerResponse_Metric{ - Name: m.Name, - StatusCode: m.StatusCode, - Value: m.Value, - Threshold: m.Threshold, - Error: m.Error, - Message: m.Message, - Scope: m.Scope, - } + r := new(CheckThrottlerResponse_Metric) + r.Name = m.Name + r.StatusCode = m.StatusCode + r.Value = m.Value + r.Threshold = m.Threshold + r.Error = m.Error + r.Message = m.Message + r.Scope = m.Scope + r.ResponseCode = m.ResponseCode if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2522,14 +2743,16 @@ func (m *CheckThrottlerResponse) CloneVT() *CheckThrottlerResponse { if m == nil { return (*CheckThrottlerResponse)(nil) } - r := &CheckThrottlerResponse{ - StatusCode: m.StatusCode, - Value: m.Value, - Threshold: m.Threshold, - Error: m.Error, - Message: m.Message, - RecentlyChecked: m.RecentlyChecked, - } + r := new(CheckThrottlerResponse) + r.StatusCode = m.StatusCode + r.Value = m.Value + r.Threshold = m.Threshold + r.Error = m.Error + r.Message = m.Message + r.RecentlyChecked = m.RecentlyChecked + r.AppName = m.AppName + r.Summary = m.Summary + r.ResponseCode = m.ResponseCode if rhs := m.Metrics; rhs != nil { tmpContainer := make(map[string]*CheckThrottlerResponse_Metric, len(rhs)) for k, v := range rhs { @@ -2552,7 +2775,7 @@ func (m *GetThrottlerStatusRequest) CloneVT() *GetThrottlerStatusRequest { if m == nil { return (*GetThrottlerStatusRequest)(nil) } - r := &GetThrottlerStatusRequest{} + r := new(GetThrottlerStatusRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2568,10 +2791,9 @@ func (m *GetThrottlerStatusResponse_MetricResult) CloneVT() *GetThrottlerStatusR if m == nil { return (*GetThrottlerStatusResponse_MetricResult)(nil) } - r := &GetThrottlerStatusResponse_MetricResult{ - Value: m.Value, - Error: m.Error, - } + r := new(GetThrottlerStatusResponse_MetricResult) + r.Value = m.Value + r.Error = m.Error if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2587,10 +2809,9 @@ func (m *GetThrottlerStatusResponse_MetricHealth) CloneVT() *GetThrottlerStatusR if m == nil { return (*GetThrottlerStatusResponse_MetricHealth)(nil) } - r := &GetThrottlerStatusResponse_MetricHealth{ - LastHealthyAt: m.LastHealthyAt.CloneVT(), - SecondsSinceLastHealthy: m.SecondsSinceLastHealthy, - } + r := new(GetThrottlerStatusResponse_MetricHealth) + r.LastHealthyAt = m.LastHealthyAt.CloneVT() + r.SecondsSinceLastHealthy = m.SecondsSinceLastHealthy if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2606,10 +2827,10 @@ func (m *GetThrottlerStatusResponse_RecentApp) CloneVT() *GetThrottlerStatusResp if m == nil { return (*GetThrottlerStatusResponse_RecentApp)(nil) } - r := &GetThrottlerStatusResponse_RecentApp{ - CheckedAt: m.CheckedAt.CloneVT(), - StatusCode: m.StatusCode, - } + r := new(GetThrottlerStatusResponse_RecentApp) + r.CheckedAt = m.CheckedAt.CloneVT() + r.StatusCode = m.StatusCode + r.ResponseCode = m.ResponseCode if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2625,20 +2846,19 @@ func (m *GetThrottlerStatusResponse) CloneVT() *GetThrottlerStatusResponse { if m == nil { return (*GetThrottlerStatusResponse)(nil) } - r := &GetThrottlerStatusResponse{ - TabletAlias: m.TabletAlias, - Keyspace: m.Keyspace, - Shard: m.Shard, - IsLeader: m.IsLeader, - IsOpen: m.IsOpen, - IsEnabled: m.IsEnabled, - IsDormant: m.IsDormant, - LagMetricQuery: m.LagMetricQuery, - CustomMetricQuery: m.CustomMetricQuery, - DefaultThreshold: m.DefaultThreshold, - MetricNameUsedAsDefault: m.MetricNameUsedAsDefault, - RecentlyChecked: m.RecentlyChecked, - } + r := new(GetThrottlerStatusResponse) + r.TabletAlias = m.TabletAlias + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.IsLeader = m.IsLeader + r.IsOpen = m.IsOpen + r.IsEnabled = m.IsEnabled + r.IsDormant = m.IsDormant + r.LagMetricQuery = m.LagMetricQuery + r.CustomMetricQuery = m.CustomMetricQuery + r.DefaultThreshold = m.DefaultThreshold + r.MetricNameUsedAsDefault = m.MetricNameUsedAsDefault + r.RecentlyChecked = m.RecentlyChecked if rhs := m.AggregatedMetrics; rhs != nil { tmpContainer := make(map[string]*GetThrottlerStatusResponse_MetricResult, len(rhs)) for k, v := range rhs { @@ -2692,6 +2912,53 @@ func (m *GetThrottlerStatusResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *ChangeTagsRequest) CloneVT() *ChangeTagsRequest { + if m == nil { + return (*ChangeTagsRequest)(nil) + } + r := new(ChangeTagsRequest) + r.Replace = m.Replace + if rhs := m.Tags; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.Tags = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ChangeTagsRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ChangeTagsResponse) CloneVT() *ChangeTagsResponse { + if m == nil { + return (*ChangeTagsResponse)(nil) + } + r := new(ChangeTagsResponse) + if rhs := m.Tags; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.Tags = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ChangeTagsResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *TableDefinition) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -2729,25 +2996,25 @@ func (m *TableDefinition) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x42 } } if m.RowCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowCount)) i-- dAtA[i] = 0x38 } if m.DataLength != 0 { - i = encodeVarint(dAtA, i, uint64(m.DataLength)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.DataLength)) i-- dAtA[i] = 0x30 } if len(m.Type) > 0 { i -= len(m.Type) copy(dAtA[i:], m.Type) - i = encodeVarint(dAtA, i, uint64(len(m.Type))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Type))) i-- dAtA[i] = 0x2a } @@ -2755,7 +3022,7 @@ func (m *TableDefinition) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.PrimaryKeyColumns) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.PrimaryKeyColumns[iNdEx]) copy(dAtA[i:], m.PrimaryKeyColumns[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.PrimaryKeyColumns[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PrimaryKeyColumns[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -2764,7 +3031,7 @@ func (m *TableDefinition) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Columns) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Columns[iNdEx]) copy(dAtA[i:], m.Columns[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Columns[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Columns[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -2772,14 +3039,14 @@ func (m *TableDefinition) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Schema) > 0 { i -= len(m.Schema) copy(dAtA[i:], m.Schema) - i = encodeVarint(dAtA, i, uint64(len(m.Schema))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Schema))) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -2823,7 +3090,7 @@ func (m *SchemaDefinition) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2831,7 +3098,7 @@ func (m *SchemaDefinition) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.DatabaseSchema) > 0 { i -= len(m.DatabaseSchema) copy(dAtA[i:], m.DatabaseSchema) - i = encodeVarint(dAtA, i, uint64(len(m.DatabaseSchema))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DatabaseSchema))) i-- dAtA[i] = 0xa } @@ -2874,7 +3141,7 @@ func (m *SchemaChangeResult) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2884,7 +3151,7 @@ func (m *SchemaChangeResult) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2927,35 +3194,35 @@ func (m *UserPermission) MarshalToSizedBufferVT(dAtA []byte) (int, error) { baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x22 } } if m.PasswordChecksum != 0 { - i = encodeVarint(dAtA, i, uint64(m.PasswordChecksum)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.PasswordChecksum)) i-- dAtA[i] = 0x18 } if len(m.User) > 0 { i -= len(m.User) copy(dAtA[i:], m.User) - i = encodeVarint(dAtA, i, uint64(len(m.User))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.User))) i-- dAtA[i] = 0x12 } if len(m.Host) > 0 { i -= len(m.Host) copy(dAtA[i:], m.Host) - i = encodeVarint(dAtA, i, uint64(len(m.Host))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Host))) i-- dAtA[i] = 0xa } @@ -2998,15 +3265,15 @@ func (m *DbPermission) MarshalToSizedBufferVT(dAtA []byte) (int, error) { baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x22 } @@ -3014,21 +3281,21 @@ func (m *DbPermission) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.User) > 0 { i -= len(m.User) copy(dAtA[i:], m.User) - i = encodeVarint(dAtA, i, uint64(len(m.User))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.User))) i-- dAtA[i] = 0x1a } if len(m.Db) > 0 { i -= len(m.Db) copy(dAtA[i:], m.Db) - i = encodeVarint(dAtA, i, uint64(len(m.Db))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Db))) i-- dAtA[i] = 0x12 } if len(m.Host) > 0 { i -= len(m.Host) copy(dAtA[i:], m.Host) - i = encodeVarint(dAtA, i, uint64(len(m.Host))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Host))) i-- dAtA[i] = 0xa } @@ -3072,7 +3339,7 @@ func (m *Permissions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3084,7 +3351,7 @@ func (m *Permissions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3125,7 +3392,7 @@ func (m *PingRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Payload) > 0 { i -= len(m.Payload) copy(dAtA[i:], m.Payload) - i = encodeVarint(dAtA, i, uint64(len(m.Payload))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Payload))) i-- dAtA[i] = 0xa } @@ -3165,7 +3432,7 @@ func (m *PingResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Payload) > 0 { i -= len(m.Payload) copy(dAtA[i:], m.Payload) - i = encodeVarint(dAtA, i, uint64(len(m.Payload))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Payload))) i-- dAtA[i] = 0xa } @@ -3203,7 +3470,7 @@ func (m *SleepRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Duration != 0 { - i = encodeVarint(dAtA, i, uint64(m.Duration)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Duration)) i-- dAtA[i] = 0x8 } @@ -3279,15 +3546,15 @@ func (m *ExecuteHookRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x1a } @@ -3296,7 +3563,7 @@ func (m *ExecuteHookRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Parameters) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Parameters[iNdEx]) copy(dAtA[i:], m.Parameters[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Parameters[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Parameters[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -3304,7 +3571,7 @@ func (m *ExecuteHookRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -3344,19 +3611,19 @@ func (m *ExecuteHookResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Stderr) > 0 { i -= len(m.Stderr) copy(dAtA[i:], m.Stderr) - i = encodeVarint(dAtA, i, uint64(len(m.Stderr))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Stderr))) i-- dAtA[i] = 0x1a } if len(m.Stdout) > 0 { i -= len(m.Stdout) copy(dAtA[i:], m.Stdout) - i = encodeVarint(dAtA, i, uint64(len(m.Stdout))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Stdout))) i-- dAtA[i] = 0x12 } if m.ExitStatus != 0 { - i = encodeVarint(dAtA, i, uint64(m.ExitStatus)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ExitStatus)) i-- dAtA[i] = 0x8 } @@ -3407,7 +3674,7 @@ func (m *GetSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ExcludeTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ExcludeTables[iNdEx]) copy(dAtA[i:], m.ExcludeTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -3426,7 +3693,7 @@ func (m *GetSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Tables[iNdEx]) copy(dAtA[i:], m.Tables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) i-- dAtA[i] = 0xa } @@ -3470,7 +3737,7 @@ func (m *GetSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3546,7 +3813,7 @@ func (m *GetPermissionsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3587,7 +3854,7 @@ func (m *GetGlobalStatusVarsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.Variables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Variables[iNdEx]) copy(dAtA[i:], m.Variables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Variables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Variables[iNdEx]))) i-- dAtA[i] = 0xa } @@ -3631,15 +3898,15 @@ func (m *GetGlobalStatusVarsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -3820,7 +4087,7 @@ func (m *ChangeTypeRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x10 } if m.TabletType != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletType)) i-- dAtA[i] = 0x8 } @@ -4025,7 +4292,7 @@ func (m *ReloadSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.WaitPosition) > 0 { i -= len(m.WaitPosition) copy(dAtA[i:], m.WaitPosition) - i = encodeVarint(dAtA, i, uint64(len(m.WaitPosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WaitPosition))) i-- dAtA[i] = 0xa } @@ -4099,7 +4366,7 @@ func (m *PreflightSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Changes[iNdEx]) copy(dAtA[i:], m.Changes[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Changes[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Changes[iNdEx]))) i-- dAtA[i] = 0xa } @@ -4144,7 +4411,7 @@ func (m *PreflightSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4193,14 +4460,14 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x40 } if m.BatchSize != 0 { - i = encodeVarint(dAtA, i, uint64(m.BatchSize)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.BatchSize)) i-- dAtA[i] = 0x38 } if len(m.SqlMode) > 0 { i -= len(m.SqlMode) copy(dAtA[i:], m.SqlMode) - i = encodeVarint(dAtA, i, uint64(len(m.SqlMode))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SqlMode))) i-- dAtA[i] = 0x32 } @@ -4210,7 +4477,7 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -4220,7 +4487,7 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -4247,7 +4514,7 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Sql) > 0 { i -= len(m.Sql) copy(dAtA[i:], m.Sql) - i = encodeVarint(dAtA, i, uint64(len(m.Sql))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sql))) i-- dAtA[i] = 0xa } @@ -4290,7 +4557,7 @@ func (m *ApplySchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -4300,7 +4567,7 @@ func (m *ApplySchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4475,26 +4742,26 @@ func (m *ExecuteQueryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if m.MaxRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxRows)) i-- dAtA[i] = 0x18 } if len(m.DbName) > 0 { i -= len(m.DbName) copy(dAtA[i:], m.DbName) - i = encodeVarint(dAtA, i, uint64(len(m.DbName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DbName))) i-- dAtA[i] = 0x12 } if len(m.Query) > 0 { i -= len(m.Query) copy(dAtA[i:], m.Query) - i = encodeVarint(dAtA, i, uint64(len(m.Query))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Query))) i-- dAtA[i] = 0xa } @@ -4537,7 +4804,7 @@ func (m *ExecuteQueryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4605,21 +4872,21 @@ func (m *ExecuteFetchAsDbaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err dAtA[i] = 0x20 } if m.MaxRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxRows)) i-- dAtA[i] = 0x18 } if len(m.DbName) > 0 { i -= len(m.DbName) copy(dAtA[i:], m.DbName) - i = encodeVarint(dAtA, i, uint64(len(m.DbName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DbName))) i-- dAtA[i] = 0x12 } if len(m.Query) > 0 { i -= len(m.Query) copy(dAtA[i:], m.Query) - i = encodeVarint(dAtA, i, uint64(len(m.Query))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Query))) i-- dAtA[i] = 0xa } @@ -4662,7 +4929,7 @@ func (m *ExecuteFetchAsDbaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4730,21 +4997,21 @@ func (m *ExecuteMultiFetchAsDbaRequest) MarshalToSizedBufferVT(dAtA []byte) (int dAtA[i] = 0x20 } if m.MaxRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxRows)) i-- dAtA[i] = 0x18 } if len(m.DbName) > 0 { i -= len(m.DbName) copy(dAtA[i:], m.DbName) - i = encodeVarint(dAtA, i, uint64(len(m.DbName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DbName))) i-- dAtA[i] = 0x12 } if len(m.Sql) > 0 { i -= len(m.Sql) copy(dAtA[i:], m.Sql) - i = encodeVarint(dAtA, i, uint64(len(m.Sql))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sql))) i-- dAtA[i] = 0xa } @@ -4788,7 +5055,7 @@ func (m *ExecuteMultiFetchAsDbaResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4837,21 +5104,21 @@ func (m *ExecuteFetchAsAllPrivsRequest) MarshalToSizedBufferVT(dAtA []byte) (int dAtA[i] = 0x20 } if m.MaxRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxRows)) i-- dAtA[i] = 0x18 } if len(m.DbName) > 0 { i -= len(m.DbName) copy(dAtA[i:], m.DbName) - i = encodeVarint(dAtA, i, uint64(len(m.DbName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DbName))) i-- dAtA[i] = 0x12 } if len(m.Query) > 0 { i -= len(m.Query) copy(dAtA[i:], m.Query) - i = encodeVarint(dAtA, i, uint64(len(m.Query))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Query))) i-- dAtA[i] = 0xa } @@ -4894,7 +5161,7 @@ func (m *ExecuteFetchAsAllPrivsResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4932,14 +5199,14 @@ func (m *ExecuteFetchAsAppRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err copy(dAtA[i:], m.unknownFields) } if m.MaxRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxRows)) i-- dAtA[i] = 0x10 } if len(m.Query) > 0 { i -= len(m.Query) copy(dAtA[i:], m.Query) - i = encodeVarint(dAtA, i, uint64(len(m.Query))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Query))) i-- dAtA[i] = 0xa } @@ -4982,14 +5249,14 @@ func (m *ExecuteFetchAsAppResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ReplicationStatusRequest) MarshalVT() (dAtA []byte, err error) { +func (m *GetUnresolvedTransactionsRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5002,12 +5269,12 @@ func (m *ReplicationStatusRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ReplicationStatusRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *GetUnresolvedTransactionsRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReplicationStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *GetUnresolvedTransactionsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5019,10 +5286,15 @@ func (m *ReplicationStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.AbandonAge != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.AbandonAge)) + i-- + dAtA[i] = 0x8 + } return len(dAtA) - i, nil } -func (m *ReplicationStatusResponse) MarshalVT() (dAtA []byte, err error) { +func (m *GetUnresolvedTransactionsResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5035,12 +5307,12 @@ func (m *ReplicationStatusResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ReplicationStatusResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *GetUnresolvedTransactionsResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReplicationStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *GetUnresolvedTransactionsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5052,20 +5324,22 @@ func (m *ReplicationStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Status != nil { - size, err := m.Status.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Transactions) > 0 { + for iNdEx := len(m.Transactions) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Transactions[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *PrimaryStatusRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ReadTransactionRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5078,12 +5352,12 @@ func (m *PrimaryStatusRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PrimaryStatusRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReadTransactionRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PrimaryStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReadTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5095,10 +5369,17 @@ func (m *PrimaryStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.Dtid) > 0 { + i -= len(m.Dtid) + copy(dAtA[i:], m.Dtid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *PrimaryStatusResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ReadTransactionResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5111,12 +5392,12 @@ func (m *PrimaryStatusResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PrimaryStatusResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReadTransactionResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PrimaryStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReadTransactionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5128,20 +5409,20 @@ func (m *PrimaryStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Status != nil { - size, err := m.Status.MarshalToSizedBufferVT(dAtA[:i]) + if m.Transaction != nil { + size, err := m.Transaction.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *PrimaryPositionRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ConcludeTransactionRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5154,12 +5435,12 @@ func (m *PrimaryPositionRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PrimaryPositionRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ConcludeTransactionRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PrimaryPositionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ConcludeTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5171,10 +5452,27 @@ func (m *PrimaryPositionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.Mm { + i-- + if m.Mm { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Dtid) > 0 { + i -= len(m.Dtid) + copy(dAtA[i:], m.Dtid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *PrimaryPositionResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ConcludeTransactionResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5187,12 +5485,12 @@ func (m *PrimaryPositionResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PrimaryPositionResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ConcludeTransactionResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PrimaryPositionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ConcludeTransactionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5204,17 +5502,10 @@ func (m *PrimaryPositionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Position) > 0 { - i -= len(m.Position) - copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *WaitForPositionRequest) MarshalVT() (dAtA []byte, err error) { +func (m *MysqlHostMetricsRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5227,12 +5518,12 @@ func (m *WaitForPositionRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *WaitForPositionRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *MysqlHostMetricsRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *WaitForPositionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *MysqlHostMetricsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5244,17 +5535,10 @@ func (m *WaitForPositionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Position) > 0 { - i -= len(m.Position) - copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *WaitForPositionResponse) MarshalVT() (dAtA []byte, err error) { +func (m *MysqlHostMetricsResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5267,12 +5551,12 @@ func (m *WaitForPositionResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *WaitForPositionResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *MysqlHostMetricsResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *WaitForPositionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *MysqlHostMetricsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5284,10 +5568,20 @@ func (m *WaitForPositionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.HostMetrics != nil { + size, err := m.HostMetrics.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *StopReplicationRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ReplicationStatusRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5300,12 +5594,12 @@ func (m *StopReplicationRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StopReplicationRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReplicationStatusRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StopReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReplicationStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5320,7 +5614,7 @@ func (m *StopReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *StopReplicationResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ReplicationStatusResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5333,12 +5627,12 @@ func (m *StopReplicationResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StopReplicationResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReplicationStatusResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StopReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReplicationStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5350,10 +5644,20 @@ func (m *StopReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.Status != nil { + size, err := m.Status.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *StopReplicationMinimumRequest) MarshalVT() (dAtA []byte, err error) { +func (m *PrimaryStatusRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5366,12 +5670,12 @@ func (m *StopReplicationMinimumRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StopReplicationMinimumRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *PrimaryStatusRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StopReplicationMinimumRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *PrimaryStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5383,22 +5687,10 @@ func (m *StopReplicationMinimumRequest) MarshalToSizedBufferVT(dAtA []byte) (int i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.WaitTimeout != 0 { - i = encodeVarint(dAtA, i, uint64(m.WaitTimeout)) - i-- - dAtA[i] = 0x10 - } - if len(m.Position) > 0 { - i -= len(m.Position) - copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *StopReplicationMinimumResponse) MarshalVT() (dAtA []byte, err error) { +func (m *PrimaryStatusResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5411,12 +5703,12 @@ func (m *StopReplicationMinimumResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StopReplicationMinimumResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *PrimaryStatusResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StopReplicationMinimumResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *PrimaryStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5428,17 +5720,20 @@ func (m *StopReplicationMinimumResponse) MarshalToSizedBufferVT(dAtA []byte) (in i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Position) > 0 { - i -= len(m.Position) - copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + if m.Status != nil { + size, err := m.Status.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StartReplicationRequest) MarshalVT() (dAtA []byte, err error) { +func (m *PrimaryPositionRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5451,12 +5746,12 @@ func (m *StartReplicationRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StartReplicationRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *PrimaryPositionRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StartReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *PrimaryPositionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5468,20 +5763,10 @@ func (m *StartReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.SemiSync { - i-- - if m.SemiSync { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *StartReplicationResponse) MarshalVT() (dAtA []byte, err error) { +func (m *PrimaryPositionResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5494,12 +5779,12 @@ func (m *StartReplicationResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StartReplicationResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *PrimaryPositionResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StartReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *PrimaryPositionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5511,10 +5796,17 @@ func (m *StartReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.Position) > 0 { + i -= len(m.Position) + copy(dAtA[i:], m.Position) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *StartReplicationUntilAfterRequest) MarshalVT() (dAtA []byte, err error) { +func (m *WaitForPositionRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5527,12 +5819,12 @@ func (m *StartReplicationUntilAfterRequest) MarshalVT() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *StartReplicationUntilAfterRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *WaitForPositionRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StartReplicationUntilAfterRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *WaitForPositionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5544,22 +5836,17 @@ func (m *StartReplicationUntilAfterRequest) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.WaitTimeout != 0 { - i = encodeVarint(dAtA, i, uint64(m.WaitTimeout)) - i-- - dAtA[i] = 0x10 - } if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StartReplicationUntilAfterResponse) MarshalVT() (dAtA []byte, err error) { +func (m *WaitForPositionResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5572,12 +5859,12 @@ func (m *StartReplicationUntilAfterResponse) MarshalVT() (dAtA []byte, err error return dAtA[:n], nil } -func (m *StartReplicationUntilAfterResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *WaitForPositionResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StartReplicationUntilAfterResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *WaitForPositionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5592,7 +5879,7 @@ func (m *StartReplicationUntilAfterResponse) MarshalToSizedBufferVT(dAtA []byte) return len(dAtA) - i, nil } -func (m *GetReplicasRequest) MarshalVT() (dAtA []byte, err error) { +func (m *StopReplicationRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5605,12 +5892,12 @@ func (m *GetReplicasRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetReplicasRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *StopReplicationRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetReplicasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StopReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5625,7 +5912,7 @@ func (m *GetReplicasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GetReplicasResponse) MarshalVT() (dAtA []byte, err error) { +func (m *StopReplicationResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5638,12 +5925,12 @@ func (m *GetReplicasResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetReplicasResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *StopReplicationResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetReplicasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StopReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5655,19 +5942,10 @@ func (m *GetReplicasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Addrs) > 0 { - for iNdEx := len(m.Addrs) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Addrs[iNdEx]) - copy(dAtA[i:], m.Addrs[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Addrs[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } return len(dAtA) - i, nil } -func (m *ResetReplicationRequest) MarshalVT() (dAtA []byte, err error) { +func (m *StopReplicationMinimumRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5680,12 +5958,12 @@ func (m *ResetReplicationRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ResetReplicationRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *StopReplicationMinimumRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ResetReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StopReplicationMinimumRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5697,10 +5975,22 @@ func (m *ResetReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.WaitTimeout != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.WaitTimeout)) + i-- + dAtA[i] = 0x10 + } + if len(m.Position) > 0 { + i -= len(m.Position) + copy(dAtA[i:], m.Position) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *ResetReplicationResponse) MarshalVT() (dAtA []byte, err error) { +func (m *StopReplicationMinimumResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5713,12 +6003,12 @@ func (m *ResetReplicationResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ResetReplicationResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *StopReplicationMinimumResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ResetReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StopReplicationMinimumResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5730,10 +6020,17 @@ func (m *ResetReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.Position) > 0 { + i -= len(m.Position) + copy(dAtA[i:], m.Position) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *VReplicationExecRequest) MarshalVT() (dAtA []byte, err error) { +func (m *StartReplicationRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5746,12 +6043,12 @@ func (m *VReplicationExecRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VReplicationExecRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *StartReplicationRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VReplicationExecRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StartReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5763,17 +6060,20 @@ func (m *VReplicationExecRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Query) > 0 { - i -= len(m.Query) - copy(dAtA[i:], m.Query) - i = encodeVarint(dAtA, i, uint64(len(m.Query))) + if m.SemiSync { i-- - dAtA[i] = 0xa + if m.SemiSync { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *VReplicationExecResponse) MarshalVT() (dAtA []byte, err error) { +func (m *StartReplicationResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5786,12 +6086,12 @@ func (m *VReplicationExecResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VReplicationExecResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *StartReplicationResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VReplicationExecResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StartReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5803,20 +6103,10 @@ func (m *VReplicationExecResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Result != nil { - size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *VReplicationWaitForPosRequest) MarshalVT() (dAtA []byte, err error) { +func (m *StartReplicationUntilAfterRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5829,12 +6119,12 @@ func (m *VReplicationWaitForPosRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VReplicationWaitForPosRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *StartReplicationUntilAfterRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VReplicationWaitForPosRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StartReplicationUntilAfterRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5846,22 +6136,22 @@ func (m *VReplicationWaitForPosRequest) MarshalToSizedBufferVT(dAtA []byte) (int i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.WaitTimeout != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.WaitTimeout)) + i-- + dAtA[i] = 0x10 + } if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) - i-- - dAtA[i] = 0x12 - } - if m.Id != 0 { - i = encodeVarint(dAtA, i, uint64(m.Id)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *VReplicationWaitForPosResponse) MarshalVT() (dAtA []byte, err error) { +func (m *StartReplicationUntilAfterResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5874,12 +6164,12 @@ func (m *VReplicationWaitForPosResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VReplicationWaitForPosResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *StartReplicationUntilAfterResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VReplicationWaitForPosResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StartReplicationUntilAfterResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5894,7 +6184,7 @@ func (m *VReplicationWaitForPosResponse) MarshalToSizedBufferVT(dAtA []byte) (in return len(dAtA) - i, nil } -func (m *InitPrimaryRequest) MarshalVT() (dAtA []byte, err error) { +func (m *GetReplicasRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5907,12 +6197,12 @@ func (m *InitPrimaryRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *InitPrimaryRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *GetReplicasRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *InitPrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *GetReplicasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5924,20 +6214,10 @@ func (m *InitPrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.SemiSync { - i-- - if m.SemiSync { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *InitPrimaryResponse) MarshalVT() (dAtA []byte, err error) { +func (m *GetReplicasResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5950,12 +6230,12 @@ func (m *InitPrimaryResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *InitPrimaryResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *GetReplicasResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *InitPrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *GetReplicasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -5967,17 +6247,19 @@ func (m *InitPrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Position) > 0 { - i -= len(m.Position) - copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) - i-- - dAtA[i] = 0xa + if len(m.Addrs) > 0 { + for iNdEx := len(m.Addrs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addrs[iNdEx]) + copy(dAtA[i:], m.Addrs[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Addrs[iNdEx]))) + i-- + dAtA[i] = 0xa + } } return len(dAtA) - i, nil } -func (m *PopulateReparentJournalRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ResetReplicationRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -5990,12 +6272,12 @@ func (m *PopulateReparentJournalRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PopulateReparentJournalRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ResetReplicationRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PopulateReparentJournalRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ResetReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6007,39 +6289,10 @@ func (m *PopulateReparentJournalRequest) MarshalToSizedBufferVT(dAtA []byte) (in i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.ReplicationPosition) > 0 { - i -= len(m.ReplicationPosition) - copy(dAtA[i:], m.ReplicationPosition) - i = encodeVarint(dAtA, i, uint64(len(m.ReplicationPosition))) - i-- - dAtA[i] = 0x22 - } - if m.PrimaryAlias != nil { - size, err := m.PrimaryAlias.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x1a - } - if len(m.ActionName) > 0 { - i -= len(m.ActionName) - copy(dAtA[i:], m.ActionName) - i = encodeVarint(dAtA, i, uint64(len(m.ActionName))) - i-- - dAtA[i] = 0x12 - } - if m.TimeCreatedNs != 0 { - i = encodeVarint(dAtA, i, uint64(m.TimeCreatedNs)) - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *PopulateReparentJournalResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ResetReplicationResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6052,12 +6305,12 @@ func (m *PopulateReparentJournalResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PopulateReparentJournalResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ResetReplicationResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PopulateReparentJournalResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ResetReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6072,7 +6325,7 @@ func (m *PopulateReparentJournalResponse) MarshalToSizedBufferVT(dAtA []byte) (i return len(dAtA) - i, nil } -func (m *InitReplicaRequest) MarshalVT() (dAtA []byte, err error) { +func (m *VReplicationExecRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6085,12 +6338,12 @@ func (m *InitReplicaRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *InitReplicaRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *VReplicationExecRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *InitReplicaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VReplicationExecRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6102,42 +6355,17 @@ func (m *InitReplicaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.SemiSync { - i-- - if m.SemiSync { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.TimeCreatedNs != 0 { - i = encodeVarint(dAtA, i, uint64(m.TimeCreatedNs)) - i-- - dAtA[i] = 0x18 - } - if len(m.ReplicationPosition) > 0 { - i -= len(m.ReplicationPosition) - copy(dAtA[i:], m.ReplicationPosition) - i = encodeVarint(dAtA, i, uint64(len(m.ReplicationPosition))) - i-- - dAtA[i] = 0x12 - } - if m.Parent != nil { - size, err := m.Parent.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) + if len(m.Query) > 0 { + i -= len(m.Query) + copy(dAtA[i:], m.Query) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Query))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *InitReplicaResponse) MarshalVT() (dAtA []byte, err error) { +func (m *VReplicationExecResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6150,12 +6378,12 @@ func (m *InitReplicaResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *InitReplicaResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *VReplicationExecResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *InitReplicaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VReplicationExecResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6167,10 +6395,20 @@ func (m *InitReplicaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.Result != nil { + size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *DemotePrimaryRequest) MarshalVT() (dAtA []byte, err error) { +func (m *VReplicationWaitForPosRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6183,12 +6421,12 @@ func (m *DemotePrimaryRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DemotePrimaryRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *VReplicationWaitForPosRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *DemotePrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VReplicationWaitForPosRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6200,10 +6438,22 @@ func (m *DemotePrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.Position) > 0 { + i -= len(m.Position) + copy(dAtA[i:], m.Position) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) + i-- + dAtA[i] = 0x12 + } + if m.Id != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Id)) + i-- + dAtA[i] = 0x8 + } return len(dAtA) - i, nil } -func (m *DemotePrimaryResponse) MarshalVT() (dAtA []byte, err error) { +func (m *VReplicationWaitForPosResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6216,12 +6466,12 @@ func (m *DemotePrimaryResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DemotePrimaryResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *VReplicationWaitForPosResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *DemotePrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VReplicationWaitForPosResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6233,20 +6483,10 @@ func (m *DemotePrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.PrimaryStatus != nil { - size, err := m.PrimaryStatus.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 - } return len(dAtA) - i, nil } -func (m *UndoDemotePrimaryRequest) MarshalVT() (dAtA []byte, err error) { +func (m *InitPrimaryRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6259,12 +6499,12 @@ func (m *UndoDemotePrimaryRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *UndoDemotePrimaryRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *InitPrimaryRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *UndoDemotePrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *InitPrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6289,7 +6529,7 @@ func (m *UndoDemotePrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return len(dAtA) - i, nil } -func (m *UndoDemotePrimaryResponse) MarshalVT() (dAtA []byte, err error) { +func (m *InitPrimaryResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6302,12 +6542,12 @@ func (m *UndoDemotePrimaryResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *UndoDemotePrimaryResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *InitPrimaryResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *UndoDemotePrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *InitPrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6319,10 +6559,17 @@ func (m *UndoDemotePrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.Position) > 0 { + i -= len(m.Position) + copy(dAtA[i:], m.Position) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *ReplicaWasPromotedRequest) MarshalVT() (dAtA []byte, err error) { +func (m *PopulateReparentJournalRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6335,12 +6582,12 @@ func (m *ReplicaWasPromotedRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ReplicaWasPromotedRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *PopulateReparentJournalRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReplicaWasPromotedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *PopulateReparentJournalRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6352,10 +6599,39 @@ func (m *ReplicaWasPromotedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - return len(dAtA) - i, nil -} + if len(m.ReplicationPosition) > 0 { + i -= len(m.ReplicationPosition) + copy(dAtA[i:], m.ReplicationPosition) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ReplicationPosition))) + i-- + dAtA[i] = 0x22 + } + if m.PrimaryAlias != nil { + size, err := m.PrimaryAlias.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if len(m.ActionName) > 0 { + i -= len(m.ActionName) + copy(dAtA[i:], m.ActionName) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ActionName))) + i-- + dAtA[i] = 0x12 + } + if m.TimeCreatedNs != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TimeCreatedNs)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} -func (m *ReplicaWasPromotedResponse) MarshalVT() (dAtA []byte, err error) { +func (m *PopulateReparentJournalResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6368,12 +6644,12 @@ func (m *ReplicaWasPromotedResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ReplicaWasPromotedResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *PopulateReparentJournalResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReplicaWasPromotedResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *PopulateReparentJournalResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6388,7 +6664,7 @@ func (m *ReplicaWasPromotedResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e return len(dAtA) - i, nil } -func (m *ResetReplicationParametersRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ReadReparentJournalInfoRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6401,12 +6677,12 @@ func (m *ResetReplicationParametersRequest) MarshalVT() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *ResetReplicationParametersRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReadReparentJournalInfoRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ResetReplicationParametersRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReadReparentJournalInfoRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6421,7 +6697,7 @@ func (m *ResetReplicationParametersRequest) MarshalToSizedBufferVT(dAtA []byte) return len(dAtA) - i, nil } -func (m *ResetReplicationParametersResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ReadReparentJournalInfoResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6434,12 +6710,12 @@ func (m *ResetReplicationParametersResponse) MarshalVT() (dAtA []byte, err error return dAtA[:n], nil } -func (m *ResetReplicationParametersResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReadReparentJournalInfoResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ResetReplicationParametersResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReadReparentJournalInfoResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6451,10 +6727,15 @@ func (m *ResetReplicationParametersResponse) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.Length != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Length)) + i-- + dAtA[i] = 0x8 + } return len(dAtA) - i, nil } -func (m *FullStatusRequest) MarshalVT() (dAtA []byte, err error) { +func (m *InitReplicaRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6467,12 +6748,12 @@ func (m *FullStatusRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *FullStatusRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *InitReplicaRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *FullStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *InitReplicaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6484,10 +6765,42 @@ func (m *FullStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.SemiSync { + i-- + if m.SemiSync { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.TimeCreatedNs != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TimeCreatedNs)) + i-- + dAtA[i] = 0x18 + } + if len(m.ReplicationPosition) > 0 { + i -= len(m.ReplicationPosition) + copy(dAtA[i:], m.ReplicationPosition) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ReplicationPosition))) + i-- + dAtA[i] = 0x12 + } + if m.Parent != nil { + size, err := m.Parent.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *FullStatusResponse) MarshalVT() (dAtA []byte, err error) { +func (m *InitReplicaResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6500,12 +6813,12 @@ func (m *FullStatusResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *FullStatusResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *InitReplicaResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *FullStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *InitReplicaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6517,20 +6830,10 @@ func (m *FullStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Status != nil { - size, err := m.Status.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *SetReplicationSourceRequest) MarshalVT() (dAtA []byte, err error) { +func (m *DemotePrimaryRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6543,12 +6846,12 @@ func (m *SetReplicationSourceRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetReplicationSourceRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *DemotePrimaryRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *SetReplicationSourceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *DemotePrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6560,58 +6863,10 @@ func (m *SetReplicationSourceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.HeartbeatInterval != 0 { - i -= 8 - binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.HeartbeatInterval)))) - i-- - dAtA[i] = 0x31 - } - if m.SemiSync { - i-- - if m.SemiSync { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if len(m.WaitPosition) > 0 { - i -= len(m.WaitPosition) - copy(dAtA[i:], m.WaitPosition) - i = encodeVarint(dAtA, i, uint64(len(m.WaitPosition))) - i-- - dAtA[i] = 0x22 - } - if m.ForceStartReplication { - i-- - if m.ForceStartReplication { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.TimeCreatedNs != 0 { - i = encodeVarint(dAtA, i, uint64(m.TimeCreatedNs)) - i-- - dAtA[i] = 0x10 - } - if m.Parent != nil { - size, err := m.Parent.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *SetReplicationSourceResponse) MarshalVT() (dAtA []byte, err error) { +func (m *DemotePrimaryResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6624,12 +6879,12 @@ func (m *SetReplicationSourceResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetReplicationSourceResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *DemotePrimaryResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *SetReplicationSourceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *DemotePrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6641,10 +6896,20 @@ func (m *SetReplicationSourceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.PrimaryStatus != nil { + size, err := m.PrimaryStatus.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } return len(dAtA) - i, nil } -func (m *ReplicaWasRestartedRequest) MarshalVT() (dAtA []byte, err error) { +func (m *UndoDemotePrimaryRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6657,12 +6922,12 @@ func (m *ReplicaWasRestartedRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ReplicaWasRestartedRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *UndoDemotePrimaryRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReplicaWasRestartedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *UndoDemotePrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6674,20 +6939,20 @@ func (m *ReplicaWasRestartedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Parent != nil { - size, err := m.Parent.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err + if m.SemiSync { + i-- + if m.SemiSync { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *ReplicaWasRestartedResponse) MarshalVT() (dAtA []byte, err error) { +func (m *UndoDemotePrimaryResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6700,12 +6965,12 @@ func (m *ReplicaWasRestartedResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ReplicaWasRestartedResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *UndoDemotePrimaryResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReplicaWasRestartedResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *UndoDemotePrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6720,7 +6985,7 @@ func (m *ReplicaWasRestartedResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *StopReplicationAndGetStatusRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ReplicaWasPromotedRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6733,12 +6998,12 @@ func (m *StopReplicationAndGetStatusRequest) MarshalVT() (dAtA []byte, err error return dAtA[:n], nil } -func (m *StopReplicationAndGetStatusRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReplicaWasPromotedRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StopReplicationAndGetStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReplicaWasPromotedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6750,15 +7015,10 @@ func (m *StopReplicationAndGetStatusRequest) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.StopReplicationMode != 0 { - i = encodeVarint(dAtA, i, uint64(m.StopReplicationMode)) - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *StopReplicationAndGetStatusResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ReplicaWasPromotedResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6771,12 +7031,12 @@ func (m *StopReplicationAndGetStatusResponse) MarshalVT() (dAtA []byte, err erro return dAtA[:n], nil } -func (m *StopReplicationAndGetStatusResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReplicaWasPromotedResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *StopReplicationAndGetStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReplicaWasPromotedResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6788,20 +7048,10 @@ func (m *StopReplicationAndGetStatusResponse) MarshalToSizedBufferVT(dAtA []byte i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Status != nil { - size, err := m.Status.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 - } return len(dAtA) - i, nil } -func (m *PromoteReplicaRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ResetReplicationParametersRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6814,12 +7064,12 @@ func (m *PromoteReplicaRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PromoteReplicaRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ResetReplicationParametersRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PromoteReplicaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ResetReplicationParametersRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6831,20 +7081,10 @@ func (m *PromoteReplicaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.SemiSync { - i-- - if m.SemiSync { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *PromoteReplicaResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ResetReplicationParametersResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6857,12 +7097,12 @@ func (m *PromoteReplicaResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PromoteReplicaResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ResetReplicationParametersResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PromoteReplicaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ResetReplicationParametersResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6874,17 +7114,10 @@ func (m *PromoteReplicaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Position) > 0 { - i -= len(m.Position) - copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *BackupRequest) MarshalVT() (dAtA []byte, err error) { +func (m *FullStatusRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6897,12 +7130,12 @@ func (m *BackupRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *BackupRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *FullStatusRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *BackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *FullStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6914,42 +7147,10 @@ func (m *BackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.UpgradeSafe { - i-- - if m.UpgradeSafe { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if len(m.IncrementalFromPos) > 0 { - i -= len(m.IncrementalFromPos) - copy(dAtA[i:], m.IncrementalFromPos) - i = encodeVarint(dAtA, i, uint64(len(m.IncrementalFromPos))) - i-- - dAtA[i] = 0x1a - } - if m.AllowPrimary { - i-- - if m.AllowPrimary { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if m.Concurrency != 0 { - i = encodeVarint(dAtA, i, uint64(m.Concurrency)) - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *BackupResponse) MarshalVT() (dAtA []byte, err error) { +func (m *FullStatusResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6962,12 +7163,12 @@ func (m *BackupResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *BackupResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *FullStatusResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *BackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *FullStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6979,20 +7180,20 @@ func (m *BackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Event != nil { - size, err := m.Event.MarshalToSizedBufferVT(dAtA[:i]) + if m.Status != nil { + size, err := m.Status.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *RestoreFromBackupRequest) MarshalVT() (dAtA []byte, err error) { +func (m *SetReplicationSourceRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7005,12 +7206,12 @@ func (m *RestoreFromBackupRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RestoreFromBackupRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *SetReplicationSourceRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *RestoreFromBackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *SetReplicationSourceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7022,19 +7223,32 @@ func (m *RestoreFromBackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.RestoreToTimestamp != nil { - size, err := m.RestoreToTimestamp.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err + if m.HeartbeatInterval != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.HeartbeatInterval)))) + i-- + dAtA[i] = 0x31 + } + if m.SemiSync { + i-- + if m.SemiSync { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x28 + } + if len(m.WaitPosition) > 0 { + i -= len(m.WaitPosition) + copy(dAtA[i:], m.WaitPosition) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WaitPosition))) i-- dAtA[i] = 0x22 } - if m.DryRun { + if m.ForceStartReplication { i-- - if m.DryRun { + if m.ForceStartReplication { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -7042,27 +7256,25 @@ func (m *RestoreFromBackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err i-- dAtA[i] = 0x18 } - if len(m.RestoreToPos) > 0 { - i -= len(m.RestoreToPos) - copy(dAtA[i:], m.RestoreToPos) - i = encodeVarint(dAtA, i, uint64(len(m.RestoreToPos))) + if m.TimeCreatedNs != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TimeCreatedNs)) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x10 } - if m.BackupTime != nil { - size, err := m.BackupTime.MarshalToSizedBufferVT(dAtA[:i]) + if m.Parent != nil { + size, err := m.Parent.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *RestoreFromBackupResponse) MarshalVT() (dAtA []byte, err error) { +func (m *SetReplicationSourceResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7075,12 +7287,12 @@ func (m *RestoreFromBackupResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RestoreFromBackupResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *SetReplicationSourceResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *RestoreFromBackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *SetReplicationSourceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7092,20 +7304,10 @@ func (m *RestoreFromBackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Event != nil { - size, err := m.Event.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *CreateVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ReplicaWasRestartedRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7118,12 +7320,12 @@ func (m *CreateVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *CreateVReplicationWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReplicaWasRestartedRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *CreateVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReplicaWasRestartedRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7135,111 +7337,20 @@ func (m *CreateVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Options) > 0 { - i -= len(m.Options) - copy(dAtA[i:], m.Options) - i = encodeVarint(dAtA, i, uint64(len(m.Options))) - i-- - dAtA[i] = 0x5a - } - if m.StopAfterCopy { - i-- - if m.StopAfterCopy { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x50 - } - if m.AutoStart { - i-- - if m.AutoStart { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x48 - } - if m.DeferSecondaryKeys { - i-- - if m.DeferSecondaryKeys { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x40 - } - if m.WorkflowSubType != 0 { - i = encodeVarint(dAtA, i, uint64(m.WorkflowSubType)) - i-- - dAtA[i] = 0x38 - } - if m.WorkflowType != 0 { - i = encodeVarint(dAtA, i, uint64(m.WorkflowType)) - i-- - dAtA[i] = 0x30 - } - if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) - i-- - dAtA[i] = 0x28 - } - if len(m.TabletTypes) > 0 { - var pksize2 int - for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) - } - i -= pksize2 - j1 := i - for _, num1 := range m.TabletTypes { - num := uint64(num1) - for num >= 1<<7 { - dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j1++ - } - dAtA[j1] = uint8(num) - j1++ - } - i = encodeVarint(dAtA, i, uint64(pksize2)) - i-- - dAtA[i] = 0x22 - } - if len(m.Cells) > 0 { - for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Cells[iNdEx]) - copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.BinlogSource) > 0 { - for iNdEx := len(m.BinlogSource) - 1; iNdEx >= 0; iNdEx-- { - size, err := m.BinlogSource[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 + if m.Parent != nil { + size, err := m.Parent.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err } - } - if len(m.Workflow) > 0 { - i -= len(m.Workflow) - copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *CreateVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ReplicaWasRestartedResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7252,12 +7363,12 @@ func (m *CreateVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error return dAtA[:n], nil } -func (m *CreateVReplicationWorkflowResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReplicaWasRestartedResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *CreateVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReplicaWasRestartedResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7269,20 +7380,10 @@ func (m *CreateVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Result != nil { - size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *DeleteVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { +func (m *StopReplicationAndGetStatusRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7295,12 +7396,12 @@ func (m *DeleteVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *DeleteVReplicationWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *StopReplicationAndGetStatusRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *DeleteVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StopReplicationAndGetStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7312,17 +7413,15 @@ func (m *DeleteVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Workflow) > 0 { - i -= len(m.Workflow) - copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + if m.StopReplicationMode != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.StopReplicationMode)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *DeleteVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error) { +func (m *StopReplicationAndGetStatusResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7335,12 +7434,12 @@ func (m *DeleteVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error return dAtA[:n], nil } -func (m *DeleteVReplicationWorkflowResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *StopReplicationAndGetStatusResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *DeleteVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *StopReplicationAndGetStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7352,20 +7451,20 @@ func (m *DeleteVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Result != nil { - size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) + if m.Status != nil { + size, err := m.Status.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } return len(dAtA) - i, nil } -func (m *HasVReplicationWorkflowsRequest) MarshalVT() (dAtA []byte, err error) { +func (m *PromoteReplicaRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7378,12 +7477,12 @@ func (m *HasVReplicationWorkflowsRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *HasVReplicationWorkflowsRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *PromoteReplicaRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *HasVReplicationWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *PromoteReplicaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7395,10 +7494,20 @@ func (m *HasVReplicationWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (i i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.SemiSync { + i-- + if m.SemiSync { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } return len(dAtA) - i, nil } -func (m *HasVReplicationWorkflowsResponse) MarshalVT() (dAtA []byte, err error) { +func (m *PromoteReplicaResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7411,12 +7520,12 @@ func (m *HasVReplicationWorkflowsResponse) MarshalVT() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *HasVReplicationWorkflowsResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *PromoteReplicaResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *HasVReplicationWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *PromoteReplicaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7428,20 +7537,17 @@ func (m *HasVReplicationWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) ( i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Has { - i-- - if m.Has { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if len(m.Position) > 0 { + i -= len(m.Position) + copy(dAtA[i:], m.Position) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ReadVReplicationWorkflowsRequest) MarshalVT() (dAtA []byte, err error) { +func (m *BackupRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7454,12 +7560,12 @@ func (m *ReadVReplicationWorkflowsRequest) MarshalVT() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *ReadVReplicationWorkflowsRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *BackupRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReadVReplicationWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *BackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7471,101 +7577,49 @@ func (m *ReadVReplicationWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) ( i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.ExcludeFrozen { + if m.BackupEngine != nil { + i -= len(*m.BackupEngine) + copy(dAtA[i:], *m.BackupEngine) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(*m.BackupEngine))) i-- - if m.ExcludeFrozen { + dAtA[i] = 0x2a + } + if m.UpgradeSafe { + i-- + if m.UpgradeSafe { dAtA[i] = 1 } else { dAtA[i] = 0 } i-- - dAtA[i] = 0x30 - } - if len(m.ExcludeStates) > 0 { - var pksize2 int - for _, num := range m.ExcludeStates { - pksize2 += sov(uint64(num)) - } - i -= pksize2 - j1 := i - for _, num1 := range m.ExcludeStates { - num := uint64(num1) - for num >= 1<<7 { - dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j1++ - } - dAtA[j1] = uint8(num) - j1++ - } - i = encodeVarint(dAtA, i, uint64(pksize2)) - i-- - dAtA[i] = 0x2a - } - if len(m.ExcludeWorkflows) > 0 { - for iNdEx := len(m.ExcludeWorkflows) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ExcludeWorkflows[iNdEx]) - copy(dAtA[i:], m.ExcludeWorkflows[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ExcludeWorkflows[iNdEx]))) - i-- - dAtA[i] = 0x22 - } + dAtA[i] = 0x20 } - if len(m.IncludeStates) > 0 { - var pksize4 int - for _, num := range m.IncludeStates { - pksize4 += sov(uint64(num)) - } - i -= pksize4 - j3 := i - for _, num1 := range m.IncludeStates { - num := uint64(num1) - for num >= 1<<7 { - dAtA[j3] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j3++ - } - dAtA[j3] = uint8(num) - j3++ - } - i = encodeVarint(dAtA, i, uint64(pksize4)) + if len(m.IncrementalFromPos) > 0 { + i -= len(m.IncrementalFromPos) + copy(dAtA[i:], m.IncrementalFromPos) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IncrementalFromPos))) i-- dAtA[i] = 0x1a } - if len(m.IncludeWorkflows) > 0 { - for iNdEx := len(m.IncludeWorkflows) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.IncludeWorkflows[iNdEx]) - copy(dAtA[i:], m.IncludeWorkflows[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.IncludeWorkflows[iNdEx]))) - i-- - dAtA[i] = 0x12 + if m.AllowPrimary { + i-- + if m.AllowPrimary { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } + i-- + dAtA[i] = 0x10 } - if len(m.IncludeIds) > 0 { - var pksize6 int - for _, num := range m.IncludeIds { - pksize6 += sov(uint64(num)) - } - i -= pksize6 - j5 := i - for _, num1 := range m.IncludeIds { - num := uint64(num1) - for num >= 1<<7 { - dAtA[j5] = uint8(uint64(num)&0x7f | 0x80) - num >>= 7 - j5++ - } - dAtA[j5] = uint8(num) - j5++ - } - i = encodeVarint(dAtA, i, uint64(pksize6)) + if m.Concurrency != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Concurrency)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *ReadVReplicationWorkflowsResponse) MarshalVT() (dAtA []byte, err error) { +func (m *BackupResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7578,12 +7632,12 @@ func (m *ReadVReplicationWorkflowsResponse) MarshalVT() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *ReadVReplicationWorkflowsResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *BackupResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReadVReplicationWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *BackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7595,22 +7649,20 @@ func (m *ReadVReplicationWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Workflows) > 0 { - for iNdEx := len(m.Workflows) - 1; iNdEx >= 0; iNdEx-- { - size, err := m.Workflows[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa + if m.Event != nil { + size, err := m.Event.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ReadVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { +func (m *RestoreFromBackupRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7623,12 +7675,12 @@ func (m *ReadVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ReadVReplicationWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *RestoreFromBackupRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReadVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *RestoreFromBackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7640,17 +7692,56 @@ func (m *ReadVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (i i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Workflow) > 0 { - i -= len(m.Workflow) - copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + if len(m.AllowedBackupEngines) > 0 { + for iNdEx := len(m.AllowedBackupEngines) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AllowedBackupEngines[iNdEx]) + copy(dAtA[i:], m.AllowedBackupEngines[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AllowedBackupEngines[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if m.RestoreToTimestamp != nil { + size, err := m.RestoreToTimestamp.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + if m.DryRun { + i-- + if m.DryRun { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.RestoreToPos) > 0 { + i -= len(m.RestoreToPos) + copy(dAtA[i:], m.RestoreToPos) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RestoreToPos))) + i-- + dAtA[i] = 0x12 + } + if m.BackupTime != nil { + size, err := m.BackupTime.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ReadVReplicationWorkflowResponse_Stream) MarshalVT() (dAtA []byte, err error) { +func (m *RestoreFromBackupResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7663,12 +7754,12 @@ func (m *ReadVReplicationWorkflowResponse_Stream) MarshalVT() (dAtA []byte, err return dAtA[:n], nil } -func (m *ReadVReplicationWorkflowResponse_Stream) MarshalToVT(dAtA []byte) (int, error) { +func (m *RestoreFromBackupResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReadVReplicationWorkflowResponse_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *RestoreFromBackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7680,113 +7771,20 @@ func (m *ReadVReplicationWorkflowResponse_Stream) MarshalToSizedBufferVT(dAtA [] i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.ComponentThrottled) > 0 { - i -= len(m.ComponentThrottled) - copy(dAtA[i:], m.ComponentThrottled) - i = encodeVarint(dAtA, i, uint64(len(m.ComponentThrottled))) - i-- - dAtA[i] = 0x72 - } - if m.TimeThrottled != nil { - size, err := m.TimeThrottled.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x6a - } - if m.TimeHeartbeat != nil { - size, err := m.TimeHeartbeat.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x62 - } - if m.RowsCopied != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowsCopied)) - i-- - dAtA[i] = 0x58 - } - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarint(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x52 - } - if m.State != 0 { - i = encodeVarint(dAtA, i, uint64(m.State)) - i-- - dAtA[i] = 0x48 - } - if m.TransactionTimestamp != nil { - size, err := m.TransactionTimestamp.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x42 - } - if m.TimeUpdated != nil { - size, err := m.TimeUpdated.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x3a - } - if m.MaxReplicationLag != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxReplicationLag)) - i-- - dAtA[i] = 0x30 - } - if m.MaxTps != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxTps)) - i-- - dAtA[i] = 0x28 - } - if len(m.StopPos) > 0 { - i -= len(m.StopPos) - copy(dAtA[i:], m.StopPos) - i = encodeVarint(dAtA, i, uint64(len(m.StopPos))) - i-- - dAtA[i] = 0x22 - } - if len(m.Pos) > 0 { - i -= len(m.Pos) - copy(dAtA[i:], m.Pos) - i = encodeVarint(dAtA, i, uint64(len(m.Pos))) - i-- - dAtA[i] = 0x1a - } - if m.Bls != nil { - size, err := m.Bls.MarshalToSizedBufferVT(dAtA[:i]) + if m.Event != nil { + size, err := m.Event.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 - } - if m.Id != 0 { - i = encodeVarint(dAtA, i, uint64(m.Id)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ReadVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error) { +func (m *CreateVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7799,12 +7797,12 @@ func (m *ReadVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *ReadVReplicationWorkflowResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *CreateVReplicationWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReadVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *CreateVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7819,25 +7817,13 @@ func (m *ReadVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) ( if len(m.Options) > 0 { i -= len(m.Options) copy(dAtA[i:], m.Options) - i = encodeVarint(dAtA, i, uint64(len(m.Options))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Options))) i-- - dAtA[i] = 0x62 - } - if len(m.Streams) > 0 { - for iNdEx := len(m.Streams) - 1; iNdEx >= 0; iNdEx-- { - size, err := m.Streams[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x5a - } + dAtA[i] = 0x5a } - if m.DeferSecondaryKeys { + if m.StopAfterCopy { i-- - if m.DeferSecondaryKeys { + if m.StopAfterCopy { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -7845,39 +7831,45 @@ func (m *ReadVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) ( i-- dAtA[i] = 0x50 } - if m.WorkflowSubType != 0 { - i = encodeVarint(dAtA, i, uint64(m.WorkflowSubType)) + if m.AutoStart { + i-- + if m.AutoStart { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } i-- dAtA[i] = 0x48 } - if m.WorkflowType != 0 { - i = encodeVarint(dAtA, i, uint64(m.WorkflowType)) + if m.DeferSecondaryKeys { + i-- + if m.DeferSecondaryKeys { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } i-- dAtA[i] = 0x40 } - if len(m.Tags) > 0 { - i -= len(m.Tags) - copy(dAtA[i:], m.Tags) - i = encodeVarint(dAtA, i, uint64(len(m.Tags))) + if m.WorkflowSubType != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.WorkflowSubType)) i-- - dAtA[i] = 0x3a + dAtA[i] = 0x38 } - if len(m.DbName) > 0 { - i -= len(m.DbName) - copy(dAtA[i:], m.DbName) - i = encodeVarint(dAtA, i, uint64(len(m.DbName))) + if m.WorkflowType != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.WorkflowType)) i-- - dAtA[i] = 0x32 + dAtA[i] = 0x30 } if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) i-- dAtA[i] = 0x28 } if len(m.TabletTypes) > 0 { var pksize2 int for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -7891,28 +7883,42 @@ func (m *ReadVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) ( dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x22 } if len(m.Cells) > 0 { - i -= len(m.Cells) - copy(dAtA[i:], m.Cells) - i = encodeVarint(dAtA, i, uint64(len(m.Cells))) - i-- - dAtA[i] = 0x1a + for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Cells[iNdEx]) + copy(dAtA[i:], m.Cells[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.BinlogSource) > 0 { + for iNdEx := len(m.BinlogSource) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.BinlogSource[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *VDiffRequest) MarshalVT() (dAtA []byte, err error) { +func (m *CreateVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -7925,12 +7931,12 @@ func (m *VDiffRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VDiffRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *CreateVReplicationWorkflowResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VDiffRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *CreateVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -7942,55 +7948,20 @@ func (m *VDiffRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Options != nil { - size, err := m.Options.MarshalToSizedBufferVT(dAtA[:i]) + if m.Result != nil { + size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x32 - } - if len(m.VdiffUuid) > 0 { - i -= len(m.VdiffUuid) - copy(dAtA[i:], m.VdiffUuid) - i = encodeVarint(dAtA, i, uint64(len(m.VdiffUuid))) - i-- - dAtA[i] = 0x2a - } - if len(m.ActionArg) > 0 { - i -= len(m.ActionArg) - copy(dAtA[i:], m.ActionArg) - i = encodeVarint(dAtA, i, uint64(len(m.ActionArg))) - i-- - dAtA[i] = 0x22 - } - if len(m.Action) > 0 { - i -= len(m.Action) - copy(dAtA[i:], m.Action) - i = encodeVarint(dAtA, i, uint64(len(m.Action))) - i-- - dAtA[i] = 0x1a - } - if len(m.Workflow) > 0 { - i -= len(m.Workflow) - copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) - i-- - dAtA[i] = 0x12 - } - if len(m.Keyspace) > 0 { - i -= len(m.Keyspace) - copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *VDiffResponse) MarshalVT() (dAtA []byte, err error) { +func (m *DeleteTableDataRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8003,12 +7974,12 @@ func (m *VDiffResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VDiffResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *DeleteTableDataRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VDiffResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *DeleteTableDataRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8020,32 +7991,34 @@ func (m *VDiffResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.VdiffUuid) > 0 { - i -= len(m.VdiffUuid) - copy(dAtA[i:], m.VdiffUuid) - i = encodeVarint(dAtA, i, uint64(len(m.VdiffUuid))) + if m.BatchSize != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.BatchSize)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x10 } - if m.Output != nil { - size, err := m.Output.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err + if len(m.TableFilters) > 0 { + for k := range m.TableFilters { + v := m.TableFilters[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 - } - if m.Id != 0 { - i = encodeVarint(dAtA, i, uint64(m.Id)) - i-- - dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *VDiffPickerOptions) MarshalVT() (dAtA []byte, err error) { +func (m *DeleteTableDataResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8058,12 +8031,12 @@ func (m *VDiffPickerOptions) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VDiffPickerOptions) MarshalToVT(dAtA []byte) (int, error) { +func (m *DeleteTableDataResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VDiffPickerOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *DeleteTableDataResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8075,31 +8048,50 @@ func (m *VDiffPickerOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.TargetCell) > 0 { - i -= len(m.TargetCell) - copy(dAtA[i:], m.TargetCell) - i = encodeVarint(dAtA, i, uint64(len(m.TargetCell))) - i-- - dAtA[i] = 0x1a + return len(dAtA) - i, nil +} + +func (m *DeleteVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil } - if len(m.SourceCell) > 0 { - i -= len(m.SourceCell) - copy(dAtA[i:], m.SourceCell) - i = encodeVarint(dAtA, i, uint64(len(m.SourceCell))) - i-- - dAtA[i] = 0x12 + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - if len(m.TabletTypes) > 0 { - i -= len(m.TabletTypes) - copy(dAtA[i:], m.TabletTypes) - i = encodeVarint(dAtA, i, uint64(len(m.TabletTypes))) + return dAtA[:n], nil +} + +func (m *DeleteVReplicationWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *DeleteVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Workflow) > 0 { + i -= len(m.Workflow) + copy(dAtA[i:], m.Workflow) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *VDiffReportOptions) MarshalVT() (dAtA []byte, err error) { +func (m *DeleteVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8112,12 +8104,12 @@ func (m *VDiffReportOptions) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VDiffReportOptions) MarshalToVT(dAtA []byte) (int, error) { +func (m *DeleteVReplicationWorkflowResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VDiffReportOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *DeleteVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8129,42 +8121,20 @@ func (m *VDiffReportOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.MaxSampleRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxSampleRows)) - i-- - dAtA[i] = 0x20 - } - if len(m.Format) > 0 { - i -= len(m.Format) - copy(dAtA[i:], m.Format) - i = encodeVarint(dAtA, i, uint64(len(m.Format))) - i-- - dAtA[i] = 0x1a - } - if m.DebugQuery { - i-- - if m.DebugQuery { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if m.OnlyPks { - i-- - if m.OnlyPks { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.Result != nil { + size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *VDiffCoreOptions) MarshalVT() (dAtA []byte, err error) { +func (m *HasVReplicationWorkflowsRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8177,12 +8147,12 @@ func (m *VDiffCoreOptions) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VDiffCoreOptions) MarshalToVT(dAtA []byte) (int, error) { +func (m *HasVReplicationWorkflowsRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VDiffCoreOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *HasVReplicationWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8194,74 +8164,12 @@ func (m *VDiffCoreOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.MaxDiffSeconds != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxDiffSeconds)) - i-- - dAtA[i] = 0x48 - } - if m.UpdateTableStats { - i-- - if m.UpdateTableStats { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x40 - } - if m.MaxExtraRowsToCompare != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxExtraRowsToCompare)) - i-- - dAtA[i] = 0x38 - } - if m.TimeoutSeconds != 0 { - i = encodeVarint(dAtA, i, uint64(m.TimeoutSeconds)) - i-- - dAtA[i] = 0x30 - } - if m.SamplePct != 0 { - i = encodeVarint(dAtA, i, uint64(m.SamplePct)) - i-- - dAtA[i] = 0x28 - } - if m.Checksum { - i-- - if m.Checksum { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.MaxRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxRows)) - i-- - dAtA[i] = 0x18 - } - if m.AutoRetry { - i-- - if m.AutoRetry { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Tables) > 0 { - i -= len(m.Tables) - copy(dAtA[i:], m.Tables) - i = encodeVarint(dAtA, i, uint64(len(m.Tables))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *VDiffOptions) MarshalVT() (dAtA []byte, err error) { - if m == nil { - return nil, nil + return len(dAtA) - i, nil +} + +func (m *HasVReplicationWorkflowsResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil } size := m.SizeVT() dAtA = make([]byte, size) @@ -8272,12 +8180,12 @@ func (m *VDiffOptions) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VDiffOptions) MarshalToVT(dAtA []byte) (int, error) { +func (m *HasVReplicationWorkflowsResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VDiffOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *HasVReplicationWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8289,40 +8197,20 @@ func (m *VDiffOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.ReportOptions != nil { - size, err := m.ReportOptions.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x1a - } - if m.CoreOptions != nil { - size, err := m.CoreOptions.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) + if m.Has { i-- - dAtA[i] = 0x12 - } - if m.PickerOptions != nil { - size, err := m.PickerOptions.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err + if m.Has { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *UpdateVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ReadVReplicationWorkflowsRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8335,12 +8223,12 @@ func (m *UpdateVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *UpdateVReplicationWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowsRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *UpdateVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8352,29 +8240,24 @@ func (m *UpdateVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.State != 0 { - i = encodeVarint(dAtA, i, uint64(m.State)) - i-- - dAtA[i] = 0x30 - } - if m.OnDdl != 0 { - i = encodeVarint(dAtA, i, uint64(m.OnDdl)) + if m.ExcludeFrozen { i-- - dAtA[i] = 0x28 - } - if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + if m.ExcludeFrozen { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } i-- - dAtA[i] = 0x20 + dAtA[i] = 0x30 } - if len(m.TabletTypes) > 0 { + if len(m.ExcludeStates) > 0 { var pksize2 int - for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + for _, num := range m.ExcludeStates { + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i - for _, num1 := range m.TabletTypes { + for _, num1 := range m.ExcludeStates { num := uint64(num1) for num >= 1<<7 { dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) @@ -8384,30 +8267,74 @@ func (m *UpdateVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) + i-- + dAtA[i] = 0x2a + } + if len(m.ExcludeWorkflows) > 0 { + for iNdEx := len(m.ExcludeWorkflows) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ExcludeWorkflows[iNdEx]) + copy(dAtA[i:], m.ExcludeWorkflows[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeWorkflows[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.IncludeStates) > 0 { + var pksize4 int + for _, num := range m.IncludeStates { + pksize4 += protohelpers.SizeOfVarint(uint64(num)) + } + i -= pksize4 + j3 := i + for _, num1 := range m.IncludeStates { + num := uint64(num1) + for num >= 1<<7 { + dAtA[j3] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j3++ + } + dAtA[j3] = uint8(num) + j3++ + } + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize4)) i-- dAtA[i] = 0x1a } - if len(m.Cells) > 0 { - for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Cells[iNdEx]) - copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + if len(m.IncludeWorkflows) > 0 { + for iNdEx := len(m.IncludeWorkflows) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.IncludeWorkflows[iNdEx]) + copy(dAtA[i:], m.IncludeWorkflows[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IncludeWorkflows[iNdEx]))) i-- dAtA[i] = 0x12 } } - if len(m.Workflow) > 0 { - i -= len(m.Workflow) - copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + if len(m.IncludeIds) > 0 { + var pksize6 int + for _, num := range m.IncludeIds { + pksize6 += protohelpers.SizeOfVarint(uint64(num)) + } + i -= pksize6 + j5 := i + for _, num1 := range m.IncludeIds { + num := uint64(num1) + for num >= 1<<7 { + dAtA[j5] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j5++ + } + dAtA[j5] = uint8(num) + j5++ + } + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize6)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *UpdateVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ReadVReplicationWorkflowsResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8420,12 +8347,12 @@ func (m *UpdateVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error return dAtA[:n], nil } -func (m *UpdateVReplicationWorkflowResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowsResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *UpdateVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8437,20 +8364,22 @@ func (m *UpdateVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Result != nil { - size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Workflows) > 0 { + for iNdEx := len(m.Workflows) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Workflows[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *UpdateVReplicationWorkflowsRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ReadVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8463,12 +8392,12 @@ func (m *UpdateVReplicationWorkflowsRequest) MarshalVT() (dAtA []byte, err error return dAtA[:n], nil } -func (m *UpdateVReplicationWorkflowsRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *UpdateVReplicationWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8480,57 +8409,17 @@ func (m *UpdateVReplicationWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.StopPosition) > 0 { - i -= len(m.StopPosition) - copy(dAtA[i:], m.StopPosition) - i = encodeVarint(dAtA, i, uint64(len(m.StopPosition))) - i-- - dAtA[i] = 0x32 - } - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarint(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x2a - } - if m.State != 0 { - i = encodeVarint(dAtA, i, uint64(m.State)) - i-- - dAtA[i] = 0x20 - } - if len(m.ExcludeWorkflows) > 0 { - for iNdEx := len(m.ExcludeWorkflows) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ExcludeWorkflows[iNdEx]) - copy(dAtA[i:], m.ExcludeWorkflows[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ExcludeWorkflows[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.IncludeWorkflows) > 0 { - for iNdEx := len(m.IncludeWorkflows) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.IncludeWorkflows[iNdEx]) - copy(dAtA[i:], m.IncludeWorkflows[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.IncludeWorkflows[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if m.AllWorkflows { - i-- - if m.AllWorkflows { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if len(m.Workflow) > 0 { + i -= len(m.Workflow) + copy(dAtA[i:], m.Workflow) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *UpdateVReplicationWorkflowsResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ReadVReplicationWorkflowResponse_Stream) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8543,12 +8432,12 @@ func (m *UpdateVReplicationWorkflowsResponse) MarshalVT() (dAtA []byte, err erro return dAtA[:n], nil } -func (m *UpdateVReplicationWorkflowsResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowResponse_Stream) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *UpdateVReplicationWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowResponse_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8560,24 +8449,117 @@ func (m *UpdateVReplicationWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Result != nil { - size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) + if len(m.ComponentThrottled) > 0 { + i -= len(m.ComponentThrottled) + copy(dAtA[i:], m.ComponentThrottled) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ComponentThrottled))) + i-- + dAtA[i] = 0x72 + } + if m.TimeThrottled != nil { + size, err := m.TimeThrottled.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ResetSequencesRequest) MarshalVT() (dAtA []byte, err error) { - if m == nil { - return nil, nil + dAtA[i] = 0x6a } - size := m.SizeVT() + if m.TimeHeartbeat != nil { + size, err := m.TimeHeartbeat.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x62 + } + if m.RowsCopied != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowsCopied)) + i-- + dAtA[i] = 0x58 + } + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x52 + } + if m.State != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.State)) + i-- + dAtA[i] = 0x48 + } + if m.TransactionTimestamp != nil { + size, err := m.TransactionTimestamp.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x42 + } + if m.TimeUpdated != nil { + size, err := m.TimeUpdated.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x3a + } + if m.MaxReplicationLag != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxReplicationLag)) + i-- + dAtA[i] = 0x30 + } + if m.MaxTps != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxTps)) + i-- + dAtA[i] = 0x28 + } + if len(m.StopPos) > 0 { + i -= len(m.StopPos) + copy(dAtA[i:], m.StopPos) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.StopPos))) + i-- + dAtA[i] = 0x22 + } + if len(m.Pos) > 0 { + i -= len(m.Pos) + copy(dAtA[i:], m.Pos) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Pos))) + i-- + dAtA[i] = 0x1a + } + if m.Bls != nil { + size, err := m.Bls.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.Id != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Id)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ReadVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() dAtA = make([]byte, size) n, err := m.MarshalToSizedBufferVT(dAtA[:size]) if err != nil { @@ -8586,12 +8568,12 @@ func (m *ResetSequencesRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ResetSequencesRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ResetSequencesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ReadVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8603,19 +8585,122 @@ func (m *ResetSequencesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Tables) > 0 { - for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Tables[iNdEx]) - copy(dAtA[i:], m.Tables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + if len(m.ConfigOverrides) > 0 { + for k := range m.ConfigOverrides { + v := m.ConfigOverrides[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x6a + } + } + if len(m.Options) > 0 { + i -= len(m.Options) + copy(dAtA[i:], m.Options) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Options))) + i-- + dAtA[i] = 0x62 + } + if len(m.Streams) > 0 { + for iNdEx := len(m.Streams) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Streams[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x5a + } + } + if m.DeferSecondaryKeys { + i-- + if m.DeferSecondaryKeys { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x50 + } + if m.WorkflowSubType != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.WorkflowSubType)) + i-- + dAtA[i] = 0x48 + } + if m.WorkflowType != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.WorkflowType)) + i-- + dAtA[i] = 0x40 + } + if len(m.Tags) > 0 { + i -= len(m.Tags) + copy(dAtA[i:], m.Tags) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tags))) + i-- + dAtA[i] = 0x3a + } + if len(m.DbName) > 0 { + i -= len(m.DbName) + copy(dAtA[i:], m.DbName) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DbName))) + i-- + dAtA[i] = 0x32 + } + if m.TabletSelectionPreference != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + i-- + dAtA[i] = 0x28 + } + if len(m.TabletTypes) > 0 { + var pksize2 int + for _, num := range m.TabletTypes { + pksize2 += protohelpers.SizeOfVarint(uint64(num)) + } + i -= pksize2 + j1 := i + for _, num1 := range m.TabletTypes { + num := uint64(num1) + for num >= 1<<7 { + dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA[j1] = uint8(num) + j1++ } + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) + i-- + dAtA[i] = 0x22 + } + if len(m.Cells) > 0 { + i -= len(m.Cells) + copy(dAtA[i:], m.Cells) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells))) + i-- + dAtA[i] = 0x1a + } + if len(m.Workflow) > 0 { + i -= len(m.Workflow) + copy(dAtA[i:], m.Workflow) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) + i-- + dAtA[i] = 0x12 } return len(dAtA) - i, nil } -func (m *ResetSequencesResponse) MarshalVT() (dAtA []byte, err error) { +func (m *ValidateVReplicationPermissionsRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8628,12 +8713,12 @@ func (m *ResetSequencesResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ResetSequencesResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *ValidateVReplicationPermissionsRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ResetSequencesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ValidateVReplicationPermissionsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8648,7 +8733,7 @@ func (m *ResetSequencesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *CheckThrottlerRequest) MarshalVT() (dAtA []byte, err error) { +func (m *ValidateVReplicationPermissionsResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8661,12 +8746,12 @@ func (m *CheckThrottlerRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CheckThrottlerRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *ValidateVReplicationPermissionsResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *CheckThrottlerRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *ValidateVReplicationPermissionsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8678,54 +8763,27 @@ func (m *CheckThrottlerRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.MultiMetricsEnabled { - i-- - if m.MultiMetricsEnabled { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } - if m.OkIfNotExists { - i-- - if m.OkIfNotExists { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.SkipRequestHeartbeats { + if m.Ok { i-- - if m.SkipRequestHeartbeats { + if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } i-- - dAtA[i] = 0x18 - } - if len(m.Scope) > 0 { - i -= len(m.Scope) - copy(dAtA[i:], m.Scope) - i = encodeVarint(dAtA, i, uint64(len(m.Scope))) - i-- - dAtA[i] = 0x12 + dAtA[i] = 0x10 } - if len(m.AppName) > 0 { - i -= len(m.AppName) - copy(dAtA[i:], m.AppName) - i = encodeVarint(dAtA, i, uint64(len(m.AppName))) + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.User))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *CheckThrottlerResponse_Metric) MarshalVT() (dAtA []byte, err error) { +func (m *VDiffRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8738,12 +8796,12 @@ func (m *CheckThrottlerResponse_Metric) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CheckThrottlerResponse_Metric) MarshalToVT(dAtA []byte) (int, error) { +func (m *VDiffRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *CheckThrottlerResponse_Metric) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VDiffRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8755,55 +8813,55 @@ func (m *CheckThrottlerResponse_Metric) MarshalToSizedBufferVT(dAtA []byte) (int i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Scope) > 0 { - i -= len(m.Scope) - copy(dAtA[i:], m.Scope) - i = encodeVarint(dAtA, i, uint64(len(m.Scope))) - i-- - dAtA[i] = 0x3a - } - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarint(dAtA, i, uint64(len(m.Message))) + if m.Options != nil { + size, err := m.Options.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarint(dAtA, i, uint64(len(m.Error))) + if len(m.VdiffUuid) > 0 { + i -= len(m.VdiffUuid) + copy(dAtA[i:], m.VdiffUuid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.VdiffUuid))) i-- dAtA[i] = 0x2a } - if m.Threshold != 0 { - i -= 8 - binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Threshold)))) + if len(m.ActionArg) > 0 { + i -= len(m.ActionArg) + copy(dAtA[i:], m.ActionArg) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ActionArg))) i-- - dAtA[i] = 0x21 + dAtA[i] = 0x22 } - if m.Value != 0 { - i -= 8 - binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + if len(m.Action) > 0 { + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Action))) i-- - dAtA[i] = 0x19 + dAtA[i] = 0x1a } - if m.StatusCode != 0 { - i = encodeVarint(dAtA, i, uint64(m.StatusCode)) + if len(m.Workflow) > 0 { + i -= len(m.Workflow) + copy(dAtA[i:], m.Workflow) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x12 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *CheckThrottlerResponse) MarshalVT() (dAtA []byte, err error) { +func (m *VDiffResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8816,12 +8874,12 @@ func (m *CheckThrottlerResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CheckThrottlerResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *VDiffResponse) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *CheckThrottlerResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VDiffResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8833,73 +8891,32 @@ func (m *CheckThrottlerResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Metrics) > 0 { - for k := range m.Metrics { - v := m.Metrics[k] - baseI := i - size, err := v.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } - } - if m.RecentlyChecked { - i-- - if m.RecentlyChecked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x30 - } - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarint(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x2a - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarint(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0x22 - } - if m.Threshold != 0 { - i -= 8 - binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Threshold)))) + if len(m.VdiffUuid) > 0 { + i -= len(m.VdiffUuid) + copy(dAtA[i:], m.VdiffUuid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.VdiffUuid))) i-- - dAtA[i] = 0x19 + dAtA[i] = 0x1a } - if m.Value != 0 { - i -= 8 - binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + if m.Output != nil { + size, err := m.Output.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- - dAtA[i] = 0x11 + dAtA[i] = 0x12 } - if m.StatusCode != 0 { - i = encodeVarint(dAtA, i, uint64(m.StatusCode)) + if m.Id != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Id)) i-- dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *GetThrottlerStatusRequest) MarshalVT() (dAtA []byte, err error) { +func (m *VDiffPickerOptions) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8912,12 +8929,12 @@ func (m *GetThrottlerStatusRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetThrottlerStatusRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *VDiffPickerOptions) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetThrottlerStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VDiffPickerOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8929,10 +8946,31 @@ func (m *GetThrottlerStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.TargetCell) > 0 { + i -= len(m.TargetCell) + copy(dAtA[i:], m.TargetCell) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetCell))) + i-- + dAtA[i] = 0x1a + } + if len(m.SourceCell) > 0 { + i -= len(m.SourceCell) + copy(dAtA[i:], m.SourceCell) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceCell))) + i-- + dAtA[i] = 0x12 + } + if len(m.TabletTypes) > 0 { + i -= len(m.TabletTypes) + copy(dAtA[i:], m.TabletTypes) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TabletTypes))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *GetThrottlerStatusResponse_MetricResult) MarshalVT() (dAtA []byte, err error) { +func (m *VDiffReportOptions) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8945,12 +8983,12 @@ func (m *GetThrottlerStatusResponse_MetricResult) MarshalVT() (dAtA []byte, err return dAtA[:n], nil } -func (m *GetThrottlerStatusResponse_MetricResult) MarshalToVT(dAtA []byte) (int, error) { +func (m *VDiffReportOptions) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetThrottlerStatusResponse_MetricResult) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VDiffReportOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8962,23 +9000,47 @@ func (m *GetThrottlerStatusResponse_MetricResult) MarshalToSizedBufferVT(dAtA [] i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarint(dAtA, i, uint64(len(m.Error))) + if m.RowDiffColumnTruncateAt != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowDiffColumnTruncateAt)) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x28 } - if m.Value != 0 { - i -= 8 - binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + if m.MaxSampleRows != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxSampleRows)) i-- - dAtA[i] = 0x9 + dAtA[i] = 0x20 + } + if len(m.Format) > 0 { + i -= len(m.Format) + copy(dAtA[i:], m.Format) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Format))) + i-- + dAtA[i] = 0x1a + } + if m.DebugQuery { + i-- + if m.DebugQuery { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.OnlyPks { + i-- + if m.OnlyPks { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *GetThrottlerStatusResponse_MetricHealth) MarshalVT() (dAtA []byte, err error) { +func (m *VDiffCoreOptions) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8991,12 +9053,12 @@ func (m *GetThrottlerStatusResponse_MetricHealth) MarshalVT() (dAtA []byte, err return dAtA[:n], nil } -func (m *GetThrottlerStatusResponse_MetricHealth) MarshalToVT(dAtA []byte) (int, error) { +func (m *VDiffCoreOptions) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetThrottlerStatusResponse_MetricHealth) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VDiffCoreOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -9008,25 +9070,82 @@ func (m *GetThrottlerStatusResponse_MetricHealth) MarshalToSizedBufferVT(dAtA [] i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.SecondsSinceLastHealthy != 0 { - i = encodeVarint(dAtA, i, uint64(m.SecondsSinceLastHealthy)) + if m.AutoStart != nil { i-- - dAtA[i] = 0x10 + if *m.AutoStart { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x50 } - if m.LastHealthyAt != nil { - size, err := m.LastHealthyAt.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err + if m.MaxDiffSeconds != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxDiffSeconds)) + i-- + dAtA[i] = 0x48 + } + if m.UpdateTableStats { + i-- + if m.UpdateTableStats { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x40 + } + if m.MaxExtraRowsToCompare != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxExtraRowsToCompare)) + i-- + dAtA[i] = 0x38 + } + if m.TimeoutSeconds != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TimeoutSeconds)) + i-- + dAtA[i] = 0x30 + } + if m.SamplePct != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SamplePct)) + i-- + dAtA[i] = 0x28 + } + if m.Checksum { + i-- + if m.Checksum { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.MaxRows != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxRows)) + i-- + dAtA[i] = 0x18 + } + if m.AutoRetry { + i-- + if m.AutoRetry { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Tables) > 0 { + i -= len(m.Tables) + copy(dAtA[i:], m.Tables) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetThrottlerStatusResponse_RecentApp) MarshalVT() (dAtA []byte, err error) { +func (m *VDiffOptions) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -9039,12 +9158,12 @@ func (m *GetThrottlerStatusResponse_RecentApp) MarshalVT() (dAtA []byte, err err return dAtA[:n], nil } -func (m *GetThrottlerStatusResponse_RecentApp) MarshalToVT(dAtA []byte) (int, error) { +func (m *VDiffOptions) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetThrottlerStatusResponse_RecentApp) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VDiffOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -9056,25 +9175,40 @@ func (m *GetThrottlerStatusResponse_RecentApp) MarshalToSizedBufferVT(dAtA []byt i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.StatusCode != 0 { - i = encodeVarint(dAtA, i, uint64(m.StatusCode)) + if m.ReportOptions != nil { + size, err := m.ReportOptions.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x1a } - if m.CheckedAt != nil { - size, err := m.CheckedAt.MarshalToSizedBufferVT(dAtA[:i]) + if m.CoreOptions != nil { + size, err := m.CoreOptions.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if m.PickerOptions != nil { + size, err := m.PickerOptions.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetThrottlerStatusResponse) MarshalVT() (dAtA []byte, err error) { +func (m *UpdateVReplicationWorkflowRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -9087,12 +9221,12 @@ func (m *GetThrottlerStatusResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetThrottlerStatusResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *UpdateVReplicationWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetThrottlerStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *UpdateVReplicationWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -9104,1258 +9238,1528 @@ func (m *GetThrottlerStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.RecentApps) > 0 { - for k := range m.RecentApps { - v := m.RecentApps[k] - baseI := i - size, err := v.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x92 - } - } - if m.RecentlyChecked { - i-- - if m.RecentlyChecked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x88 - } - if len(m.AppCheckedMetrics) > 0 { - for k := range m.AppCheckedMetrics { - v := m.AppCheckedMetrics[k] + if len(m.ConfigOverrides) > 0 { + for k := range m.ConfigOverrides { + v := m.ConfigOverrides[k] baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x82 - } - } - if len(m.ThrottledApps) > 0 { - for k := range m.ThrottledApps { - v := m.ThrottledApps[k] - baseI := i - size, err := v.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x7a - } - } - if len(m.MetricsHealth) > 0 { - for k := range m.MetricsHealth { - v := m.MetricsHealth[k] - baseI := i - size, err := v.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x72 - } - } - if len(m.MetricThresholds) > 0 { - for k := range m.MetricThresholds { - v := m.MetricThresholds[k] - baseI := i - i -= 8 - binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(v)))) - i-- - dAtA[i] = 0x11 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x6a - } - } - if len(m.AggregatedMetrics) > 0 { - for k := range m.AggregatedMetrics { - v := m.AggregatedMetrics[k] - baseI := i - size, err := v.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- - dAtA[i] = 0x62 - } - } - if len(m.MetricNameUsedAsDefault) > 0 { - i -= len(m.MetricNameUsedAsDefault) - copy(dAtA[i:], m.MetricNameUsedAsDefault) - i = encodeVarint(dAtA, i, uint64(len(m.MetricNameUsedAsDefault))) - i-- - dAtA[i] = 0x5a - } - if m.DefaultThreshold != 0 { - i -= 8 - binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.DefaultThreshold)))) - i-- - dAtA[i] = 0x51 - } - if len(m.CustomMetricQuery) > 0 { - i -= len(m.CustomMetricQuery) - copy(dAtA[i:], m.CustomMetricQuery) - i = encodeVarint(dAtA, i, uint64(len(m.CustomMetricQuery))) - i-- - dAtA[i] = 0x4a - } - if len(m.LagMetricQuery) > 0 { - i -= len(m.LagMetricQuery) - copy(dAtA[i:], m.LagMetricQuery) - i = encodeVarint(dAtA, i, uint64(len(m.LagMetricQuery))) - i-- - dAtA[i] = 0x42 - } - if m.IsDormant { - i-- - if m.IsDormant { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + dAtA[i] = 0x42 } - i-- - dAtA[i] = 0x38 } - if m.IsEnabled { - i-- - if m.IsEnabled { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if m.State != nil { + i = protohelpers.EncodeVarint(dAtA, i, uint64(*m.State)) i-- dAtA[i] = 0x30 } - if m.IsOpen { - i-- - if m.IsOpen { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if m.OnDdl != nil { + i = protohelpers.EncodeVarint(dAtA, i, uint64(*m.OnDdl)) i-- dAtA[i] = 0x28 } - if m.IsLeader { - i-- - if m.IsLeader { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if m.TabletSelectionPreference != nil { + i = protohelpers.EncodeVarint(dAtA, i, uint64(*m.TabletSelectionPreference)) i-- dAtA[i] = 0x20 } - if len(m.Shard) > 0 { - i -= len(m.Shard) - copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + if len(m.TabletTypes) > 0 { + var pksize2 int + for _, num := range m.TabletTypes { + pksize2 += protohelpers.SizeOfVarint(uint64(num)) + } + i -= pksize2 + j1 := i + for _, num1 := range m.TabletTypes { + num := uint64(num1) + for num >= 1<<7 { + dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA[j1] = uint8(num) + j1++ + } + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x1a } - if len(m.Keyspace) > 0 { - i -= len(m.Keyspace) - copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) - i-- - dAtA[i] = 0x12 + if len(m.Cells) > 0 { + for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Cells[iNdEx]) + copy(dAtA[i:], m.Cells[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i-- + dAtA[i] = 0x12 + } } - if len(m.TabletAlias) > 0 { - i -= len(m.TabletAlias) - copy(dAtA[i:], m.TabletAlias) - i = encodeVarint(dAtA, i, uint64(len(m.TabletAlias))) + if len(m.Workflow) > 0 { + i -= len(m.Workflow) + copy(dAtA[i:], m.Workflow) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ +func (m *UpdateVReplicationWorkflowResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - dAtA[offset] = uint8(v) - return base + return dAtA[:n], nil } -func (m *TableDefinition) SizeVT() (n int) { + +func (m *UpdateVReplicationWorkflowResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *UpdateVReplicationWorkflowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Schema) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if len(m.Columns) > 0 { - for _, s := range m.Columns { - l = len(s) - n += 1 + l + sov(uint64(l)) - } + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - if len(m.PrimaryKeyColumns) > 0 { - for _, s := range m.PrimaryKeyColumns { - l = len(s) - n += 1 + l + sov(uint64(l)) + if m.Result != nil { + size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - l = len(m.Type) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.DataLength != 0 { - n += 1 + sov(uint64(m.DataLength)) - } - if m.RowCount != 0 { - n += 1 + sov(uint64(m.RowCount)) + return len(dAtA) - i, nil +} + +func (m *UpdateVReplicationWorkflowsRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil } - if len(m.Fields) > 0 { - for _, e := range m.Fields { - l = e.SizeVT() - n += 1 + l + sov(uint64(l)) - } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *SchemaDefinition) SizeVT() (n int) { +func (m *UpdateVReplicationWorkflowsRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *UpdateVReplicationWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - l = len(m.DatabaseSchema) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - if len(m.TableDefinitions) > 0 { - for _, e := range m.TableDefinitions { - l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.StopPosition != nil { + i -= len(*m.StopPosition) + copy(dAtA[i:], *m.StopPosition) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(*m.StopPosition))) + i-- + dAtA[i] = 0x32 + } + if m.Message != nil { + i -= len(*m.Message) + copy(dAtA[i:], *m.Message) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(*m.Message))) + i-- + dAtA[i] = 0x2a + } + if m.State != nil { + i = protohelpers.EncodeVarint(dAtA, i, uint64(*m.State)) + i-- + dAtA[i] = 0x20 + } + if len(m.ExcludeWorkflows) > 0 { + for iNdEx := len(m.ExcludeWorkflows) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ExcludeWorkflows[iNdEx]) + copy(dAtA[i:], m.ExcludeWorkflows[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeWorkflows[iNdEx]))) + i-- + dAtA[i] = 0x1a } } - n += len(m.unknownFields) - return n + if len(m.IncludeWorkflows) > 0 { + for iNdEx := len(m.IncludeWorkflows) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.IncludeWorkflows[iNdEx]) + copy(dAtA[i:], m.IncludeWorkflows[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IncludeWorkflows[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if m.AllWorkflows { + i-- + if m.AllWorkflows { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } -func (m *SchemaChangeResult) SizeVT() (n int) { +func (m *UpdateVReplicationWorkflowsResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 - } - var l int - _ = l - if m.BeforeSchema != nil { - l = m.BeforeSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + return nil, nil } - if m.AfterSchema != nil { - l = m.AfterSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *UserPermission) SizeVT() (n int) { +func (m *UpdateVReplicationWorkflowsResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *UpdateVReplicationWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Host) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.User) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.PasswordChecksum != 0 { - n += 1 + sov(uint64(m.PasswordChecksum)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - if len(m.Privileges) > 0 { - for k, v := range m.Privileges { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + if m.Result != nil { + size, err := m.Result.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - n += len(m.unknownFields) - return n + return len(dAtA) - i, nil } -func (m *DbPermission) SizeVT() (n int) { +func (m *ResetSequencesRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Host) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Db) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.User) - if l > 0 { - n += 1 + l + sov(uint64(l)) + return nil, nil } - if len(m.Privileges) > 0 { - for k, v := range m.Privileges { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) - } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *Permissions) SizeVT() (n int) { +func (m *ResetSequencesRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ResetSequencesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - if len(m.UserPermissions) > 0 { - for _, e := range m.UserPermissions { - l = e.SizeVT() - n += 1 + l + sov(uint64(l)) - } + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - if len(m.DbPermissions) > 0 { - for _, e := range m.DbPermissions { - l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + if len(m.Tables) > 0 { + for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Tables[iNdEx]) + copy(dAtA[i:], m.Tables[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i-- + dAtA[i] = 0xa } } - n += len(m.unknownFields) - return n + return len(dAtA) - i, nil } -func (m *PingRequest) SizeVT() (n int) { +func (m *ResetSequencesResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - l = len(m.Payload) - if l > 0 { - n += 1 + l + sov(uint64(l)) + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *PingResponse) SizeVT() (n int) { +func (m *ResetSequencesResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ResetSequencesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Payload) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - n += len(m.unknownFields) - return n + return len(dAtA) - i, nil } -func (m *SleepRequest) SizeVT() (n int) { +func (m *CheckThrottlerRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - if m.Duration != 0 { - n += 1 + sov(uint64(m.Duration)) + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *SleepResponse) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += len(m.unknownFields) - return n +func (m *CheckThrottlerRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ExecuteHookRequest) SizeVT() (n int) { +func (m *CheckThrottlerRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - if len(m.Parameters) > 0 { - for _, s := range m.Parameters { - l = len(s) - n += 1 + l + sov(uint64(l)) + if m.MultiMetricsEnabled { + i-- + if m.MultiMetricsEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } + i-- + dAtA[i] = 0x28 } - if len(m.ExtraEnv) > 0 { - for k, v := range m.ExtraEnv { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + if m.OkIfNotExists { + i-- + if m.OkIfNotExists { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } + i-- + dAtA[i] = 0x20 } - n += len(m.unknownFields) - return n -} - -func (m *ExecuteHookResponse) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ExitStatus != 0 { - n += 1 + sov(uint64(m.ExitStatus)) - } - l = len(m.Stdout) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Stderr) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - n += len(m.unknownFields) - return n -} - -func (m *GetSchemaRequest) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Tables) > 0 { - for _, s := range m.Tables { - l = len(s) - n += 1 + l + sov(uint64(l)) + if m.SkipRequestHeartbeats { + i-- + if m.SkipRequestHeartbeats { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } + i-- + dAtA[i] = 0x18 } - if m.IncludeViews { - n += 2 - } - if len(m.ExcludeTables) > 0 { - for _, s := range m.ExcludeTables { - l = len(s) - n += 1 + l + sov(uint64(l)) - } + if len(m.Scope) > 0 { + i -= len(m.Scope) + copy(dAtA[i:], m.Scope) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Scope))) + i-- + dAtA[i] = 0x12 } - if m.TableSchemaOnly { - n += 2 + if len(m.AppName) > 0 { + i -= len(m.AppName) + copy(dAtA[i:], m.AppName) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AppName))) + i-- + dAtA[i] = 0xa } - n += len(m.unknownFields) - return n + return len(dAtA) - i, nil } -func (m *GetSchemaResponse) SizeVT() (n int) { +func (m *CheckThrottlerResponse_Metric) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - if m.SchemaDefinition != nil { - l = m.SchemaDefinition.SizeVT() - n += 1 + l + sov(uint64(l)) + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *GetPermissionsRequest) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += len(m.unknownFields) - return n +func (m *CheckThrottlerResponse_Metric) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetPermissionsResponse) SizeVT() (n int) { +func (m *CheckThrottlerResponse_Metric) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - if m.Permissions != nil { - l = m.Permissions.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - n += len(m.unknownFields) - return n -} - -func (m *GetGlobalStatusVarsRequest) SizeVT() (n int) { - if m == nil { - return 0 + if m.ResponseCode != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ResponseCode)) + i-- + dAtA[i] = 0x40 } - var l int - _ = l - if len(m.Variables) > 0 { - for _, s := range m.Variables { - l = len(s) - n += 1 + l + sov(uint64(l)) - } + if len(m.Scope) > 0 { + i -= len(m.Scope) + copy(dAtA[i:], m.Scope) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Scope))) + i-- + dAtA[i] = 0x3a } - n += len(m.unknownFields) - return n -} - -func (m *GetGlobalStatusVarsResponse) SizeVT() (n int) { - if m == nil { - return 0 + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x32 } - var l int - _ = l - if len(m.StatusValues) > 0 { - for k, v := range m.StatusValues { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) - } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x2a } - n += len(m.unknownFields) - return n -} - -func (m *SetReadOnlyRequest) SizeVT() (n int) { - if m == nil { - return 0 + if m.Threshold != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Threshold)))) + i-- + dAtA[i] = 0x21 } - var l int - _ = l - n += len(m.unknownFields) - return n -} - -func (m *SetReadOnlyResponse) SizeVT() (n int) { - if m == nil { - return 0 + if m.Value != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + i-- + dAtA[i] = 0x19 } - var l int - _ = l - n += len(m.unknownFields) - return n + if m.StatusCode != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.StatusCode)) + i-- + dAtA[i] = 0x10 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *SetReadWriteRequest) SizeVT() (n int) { +func (m *CheckThrottlerResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - n += len(m.unknownFields) - return n + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil } -func (m *SetReadWriteResponse) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += len(m.unknownFields) - return n +func (m *CheckThrottlerResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ChangeTypeRequest) SizeVT() (n int) { +func (m *CheckThrottlerResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - if m.TabletType != 0 { - n += 1 + sov(uint64(m.TabletType)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - if m.SemiSync { - n += 2 + if m.ResponseCode != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ResponseCode)) + i-- + dAtA[i] = 0x50 } - n += len(m.unknownFields) - return n + if len(m.Summary) > 0 { + i -= len(m.Summary) + copy(dAtA[i:], m.Summary) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Summary))) + i-- + dAtA[i] = 0x4a + } + if len(m.AppName) > 0 { + i -= len(m.AppName) + copy(dAtA[i:], m.AppName) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AppName))) + i-- + dAtA[i] = 0x42 + } + if len(m.Metrics) > 0 { + for k := range m.Metrics { + v := m.Metrics[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x3a + } + } + if m.RecentlyChecked { + i-- + if m.RecentlyChecked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x2a + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x22 + } + if m.Threshold != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Threshold)))) + i-- + dAtA[i] = 0x19 + } + if m.Value != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + i-- + dAtA[i] = 0x11 + } + if m.StatusCode != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.StatusCode)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } -func (m *ChangeTypeResponse) SizeVT() (n int) { +func (m *GetThrottlerStatusRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - n += len(m.unknownFields) - return n + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil } -func (m *RefreshStateRequest) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += len(m.unknownFields) - return n +func (m *GetThrottlerStatusRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *RefreshStateResponse) SizeVT() (n int) { +func (m *GetThrottlerStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - n += len(m.unknownFields) - return n + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil } -func (m *RunHealthCheckRequest) SizeVT() (n int) { +func (m *GetThrottlerStatusResponse_MetricResult) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - n += len(m.unknownFields) - return n + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil } -func (m *RunHealthCheckResponse) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += len(m.unknownFields) - return n +func (m *GetThrottlerStatusResponse_MetricResult) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *ReloadSchemaRequest) SizeVT() (n int) { +func (m *GetThrottlerStatusResponse_MetricResult) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - l = len(m.WaitPosition) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - n += len(m.unknownFields) - return n + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x12 + } + if m.Value != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + i-- + dAtA[i] = 0x9 + } + return len(dAtA) - i, nil } -func (m *ReloadSchemaResponse) SizeVT() (n int) { +func (m *GetThrottlerStatusResponse_MetricHealth) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - n += len(m.unknownFields) - return n + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil } -func (m *PreflightSchemaRequest) SizeVT() (n int) { +func (m *GetThrottlerStatusResponse_MetricHealth) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetThrottlerStatusResponse_MetricHealth) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - if len(m.Changes) > 0 { - for _, s := range m.Changes { - l = len(s) - n += 1 + l + sov(uint64(l)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.SecondsSinceLastHealthy != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SecondsSinceLastHealthy)) + i-- + dAtA[i] = 0x10 + } + if m.LastHealthyAt != nil { + size, err := m.LastHealthyAt.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - n += len(m.unknownFields) - return n + return len(dAtA) - i, nil } -func (m *PreflightSchemaResponse) SizeVT() (n int) { +func (m *GetThrottlerStatusResponse_RecentApp) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - if len(m.ChangeResults) > 0 { - for _, e := range m.ChangeResults { - l = e.SizeVT() - n += 1 + l + sov(uint64(l)) - } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *ApplySchemaRequest) SizeVT() (n int) { +func (m *GetThrottlerStatusResponse_RecentApp) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetThrottlerStatusResponse_RecentApp) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Sql) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.Force { - n += 2 - } - if m.AllowReplication { - n += 2 + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - if m.BeforeSchema != nil { - l = m.BeforeSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.ResponseCode != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ResponseCode)) + i-- + dAtA[i] = 0x18 } - if m.AfterSchema != nil { - l = m.AfterSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.StatusCode != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.StatusCode)) + i-- + dAtA[i] = 0x10 } - l = len(m.SqlMode) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.BatchSize != 0 { - n += 1 + sov(uint64(m.BatchSize)) - } - if m.DisableForeignKeyChecks { - n += 2 - } - n += len(m.unknownFields) - return n -} - -func (m *ApplySchemaResponse) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.BeforeSchema != nil { - l = m.BeforeSchema.SizeVT() - n += 1 + l + sov(uint64(l)) - } - if m.AfterSchema != nil { - l = m.AfterSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.CheckedAt != nil { + size, err := m.CheckedAt.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - n += len(m.unknownFields) - return n + return len(dAtA) - i, nil } -func (m *LockTablesRequest) SizeVT() (n int) { +func (m *GetThrottlerStatusResponse) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - n += len(m.unknownFields) - return n -} - -func (m *LockTablesResponse) SizeVT() (n int) { - if m == nil { - return 0 + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - var l int - _ = l - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *UnlockTablesRequest) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += len(m.unknownFields) - return n +func (m *GetThrottlerStatusResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *UnlockTablesResponse) SizeVT() (n int) { +func (m *GetThrottlerStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - n += len(m.unknownFields) - return n -} - -func (m *ExecuteQueryRequest) SizeVT() (n int) { - if m == nil { - return 0 + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - var l int - _ = l - l = len(m.Query) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if len(m.RecentApps) > 0 { + for k := range m.RecentApps { + v := m.RecentApps[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } } - l = len(m.DbName) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.RecentlyChecked { + i-- + if m.RecentlyChecked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x88 } - if m.MaxRows != 0 { - n += 1 + sov(uint64(m.MaxRows)) + if len(m.AppCheckedMetrics) > 0 { + for k := range m.AppCheckedMetrics { + v := m.AppCheckedMetrics[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x82 + } } - if m.CallerId != nil { - l = m.CallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + if len(m.ThrottledApps) > 0 { + for k := range m.ThrottledApps { + v := m.ThrottledApps[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x7a + } } - n += len(m.unknownFields) - return n -} - -func (m *ExecuteQueryResponse) SizeVT() (n int) { - if m == nil { - return 0 + if len(m.MetricsHealth) > 0 { + for k := range m.MetricsHealth { + v := m.MetricsHealth[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x72 + } } - var l int - _ = l - if m.Result != nil { - l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + if len(m.MetricThresholds) > 0 { + for k := range m.MetricThresholds { + v := m.MetricThresholds[k] + baseI := i + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(v)))) + i-- + dAtA[i] = 0x11 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x6a + } } - n += len(m.unknownFields) - return n -} - -func (m *ExecuteFetchAsDbaRequest) SizeVT() (n int) { - if m == nil { - return 0 + if len(m.AggregatedMetrics) > 0 { + for k := range m.AggregatedMetrics { + v := m.AggregatedMetrics[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x62 + } } - var l int - _ = l - l = len(m.Query) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if len(m.MetricNameUsedAsDefault) > 0 { + i -= len(m.MetricNameUsedAsDefault) + copy(dAtA[i:], m.MetricNameUsedAsDefault) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MetricNameUsedAsDefault))) + i-- + dAtA[i] = 0x5a } - l = len(m.DbName) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.DefaultThreshold != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.DefaultThreshold)))) + i-- + dAtA[i] = 0x51 } - if m.MaxRows != 0 { - n += 1 + sov(uint64(m.MaxRows)) + if len(m.CustomMetricQuery) > 0 { + i -= len(m.CustomMetricQuery) + copy(dAtA[i:], m.CustomMetricQuery) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CustomMetricQuery))) + i-- + dAtA[i] = 0x4a } - if m.DisableBinlogs { - n += 2 + if len(m.LagMetricQuery) > 0 { + i -= len(m.LagMetricQuery) + copy(dAtA[i:], m.LagMetricQuery) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LagMetricQuery))) + i-- + dAtA[i] = 0x42 } - if m.ReloadSchema { - n += 2 + if m.IsDormant { + i-- + if m.IsDormant { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 } - if m.DisableForeignKeyChecks { - n += 2 + if m.IsEnabled { + i-- + if m.IsEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 } - n += len(m.unknownFields) - return n + if m.IsOpen { + i-- + if m.IsOpen { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.IsLeader { + i-- + if m.IsLeader { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.Shard) > 0 { + i -= len(m.Shard) + copy(dAtA[i:], m.Shard) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) + i-- + dAtA[i] = 0x1a + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0x12 + } + if len(m.TabletAlias) > 0 { + i -= len(m.TabletAlias) + copy(dAtA[i:], m.TabletAlias) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TabletAlias))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *ExecuteFetchAsDbaResponse) SizeVT() (n int) { +func (m *ChangeTagsRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - if m.Result != nil { - l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *ExecuteMultiFetchAsDbaRequest) SizeVT() (n int) { +func (m *ChangeTagsRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ChangeTagsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Sql) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.DbName) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - if m.MaxRows != 0 { - n += 1 + sov(uint64(m.MaxRows)) + if m.Replace { + i-- + if m.Replace { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 } - if m.DisableBinlogs { - n += 2 + if len(m.Tags) > 0 { + for k := range m.Tags { + v := m.Tags[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } } - if m.ReloadSchema { - n += 2 + return len(dAtA) - i, nil +} + +func (m *ChangeTagsResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil } - if m.DisableForeignKeyChecks { - n += 2 + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - n += len(m.unknownFields) - return n + return dAtA[:n], nil } -func (m *ExecuteMultiFetchAsDbaResponse) SizeVT() (n int) { +func (m *ChangeTagsResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ChangeTagsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - if len(m.Results) > 0 { - for _, e := range m.Results { - l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Tags) > 0 { + for k := range m.Tags { + v := m.Tags[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa } } - n += len(m.unknownFields) - return n + return len(dAtA) - i, nil } -func (m *ExecuteFetchAsAllPrivsRequest) SizeVT() (n int) { +func (m *TableDefinition) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Query) + l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - l = len(m.DbName) + l = len(m.Schema) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.MaxRows != 0 { - n += 1 + sov(uint64(m.MaxRows)) + if len(m.Columns) > 0 { + for _, s := range m.Columns { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } - if m.ReloadSchema { - n += 2 + if len(m.PrimaryKeyColumns) > 0 { + for _, s := range m.PrimaryKeyColumns { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + l = len(m.Type) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.DataLength != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.DataLength)) + } + if m.RowCount != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowCount)) + } + if len(m.Fields) > 0 { + for _, e := range m.Fields { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n } -func (m *ExecuteFetchAsAllPrivsResponse) SizeVT() (n int) { +func (m *SchemaDefinition) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Result != nil { - l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + l = len(m.DatabaseSchema) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.TableDefinitions) > 0 { + for _, e := range m.TableDefinitions { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n } -func (m *ExecuteFetchAsAppRequest) SizeVT() (n int) { +func (m *SchemaChangeResult) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Query) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.BeforeSchema != nil { + l = m.BeforeSchema.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.MaxRows != 0 { - n += 1 + sov(uint64(m.MaxRows)) + if m.AfterSchema != nil { + l = m.AfterSchema.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *ExecuteFetchAsAppResponse) SizeVT() (n int) { +func (m *UserPermission) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Result != nil { - l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + l = len(m.Host) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.User) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.PasswordChecksum != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.PasswordChecksum)) + } + if len(m.Privileges) > 0 { + for k, v := range m.Privileges { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } } n += len(m.unknownFields) return n } -func (m *ReplicationStatusRequest) SizeVT() (n int) { +func (m *DbPermission) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + l = len(m.Host) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Db) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.User) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Privileges) > 0 { + for k, v := range m.Privileges { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } n += len(m.unknownFields) return n } -func (m *ReplicationStatusResponse) SizeVT() (n int) { +func (m *Permissions) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Status != nil { - l = m.Status.SizeVT() - n += 1 + l + sov(uint64(l)) + if len(m.UserPermissions) > 0 { + for _, e := range m.UserPermissions { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.DbPermissions) > 0 { + for _, e := range m.DbPermissions { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n } -func (m *PrimaryStatusRequest) SizeVT() (n int) { +func (m *PingRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + l = len(m.Payload) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } -func (m *PrimaryStatusResponse) SizeVT() (n int) { +func (m *PingResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Status != nil { - l = m.Status.SizeVT() - n += 1 + l + sov(uint64(l)) + l = len(m.Payload) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *PrimaryPositionRequest) SizeVT() (n int) { +func (m *SleepRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if m.Duration != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Duration)) + } n += len(m.unknownFields) return n } -func (m *PrimaryPositionResponse) SizeVT() (n int) { +func (m *SleepResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Position) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *WaitForPositionRequest) SizeVT() (n int) { +func (m *ExecuteHookRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Position) + l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Parameters) > 0 { + for _, s := range m.Parameters { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.ExtraEnv) > 0 { + for k, v := range m.ExtraEnv { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } } n += len(m.unknownFields) return n } -func (m *WaitForPositionResponse) SizeVT() (n int) { +func (m *ExecuteHookResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if m.ExitStatus != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.ExitStatus)) + } + l = len(m.Stdout) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Stderr) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } -func (m *StopReplicationRequest) SizeVT() (n int) { +func (m *GetSchemaRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if len(m.Tables) > 0 { + for _, s := range m.Tables { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if m.IncludeViews { + n += 2 + } + if len(m.ExcludeTables) > 0 { + for _, s := range m.ExcludeTables { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if m.TableSchemaOnly { + n += 2 + } n += len(m.unknownFields) return n } -func (m *StopReplicationResponse) SizeVT() (n int) { +func (m *GetSchemaResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if m.SchemaDefinition != nil { + l = m.SchemaDefinition.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } -func (m *StopReplicationMinimumRequest) SizeVT() (n int) { +func (m *GetPermissionsRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Position) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.WaitTimeout != 0 { - n += 1 + sov(uint64(m.WaitTimeout)) - } n += len(m.unknownFields) return n } -func (m *StopReplicationMinimumResponse) SizeVT() (n int) { +func (m *GetPermissionsResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Position) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.Permissions != nil { + l = m.Permissions.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *StartReplicationRequest) SizeVT() (n int) { +func (m *GetGlobalStatusVarsRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.SemiSync { - n += 2 + if len(m.Variables) > 0 { + for _, s := range m.Variables { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n } -func (m *StartReplicationResponse) SizeVT() (n int) { +func (m *GetGlobalStatusVarsResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if len(m.StatusValues) > 0 { + for k, v := range m.StatusValues { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } n += len(m.unknownFields) return n } -func (m *StartReplicationUntilAfterRequest) SizeVT() (n int) { +func (m *SetReadOnlyRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Position) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.WaitTimeout != 0 { - n += 1 + sov(uint64(m.WaitTimeout)) - } n += len(m.unknownFields) return n } -func (m *StartReplicationUntilAfterResponse) SizeVT() (n int) { +func (m *SetReadOnlyResponse) SizeVT() (n int) { if m == nil { return 0 } @@ -10365,7 +10769,7 @@ func (m *StartReplicationUntilAfterResponse) SizeVT() (n int) { return n } -func (m *GetReplicasRequest) SizeVT() (n int) { +func (m *SetReadWriteRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -10375,33 +10779,33 @@ func (m *GetReplicasRequest) SizeVT() (n int) { return n } -func (m *GetReplicasResponse) SizeVT() (n int) { +func (m *SetReadWriteResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Addrs) > 0 { - for _, s := range m.Addrs { - l = len(s) - n += 1 + l + sov(uint64(l)) - } - } n += len(m.unknownFields) return n } -func (m *ResetReplicationRequest) SizeVT() (n int) { +func (m *ChangeTypeRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if m.TabletType != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletType)) + } + if m.SemiSync { + n += 2 + } n += len(m.unknownFields) return n } -func (m *ResetReplicationResponse) SizeVT() (n int) { +func (m *ChangeTypeResponse) SizeVT() (n int) { if m == nil { return 0 } @@ -10411,52 +10815,37 @@ func (m *ResetReplicationResponse) SizeVT() (n int) { return n } -func (m *VReplicationExecRequest) SizeVT() (n int) { +func (m *RefreshStateRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Query) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *VReplicationExecResponse) SizeVT() (n int) { +func (m *RefreshStateResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Result != nil { - l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *VReplicationWaitForPosRequest) SizeVT() (n int) { +func (m *RunHealthCheckRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Id != 0 { - n += 1 + sov(uint64(m.Id)) - } - l = len(m.Position) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *VReplicationWaitForPosResponse) SizeVT() (n int) { +func (m *RunHealthCheckResponse) SizeVT() (n int) { if m == nil { return 0 } @@ -10466,140 +10855,139 @@ func (m *VReplicationWaitForPosResponse) SizeVT() (n int) { return n } -func (m *InitPrimaryRequest) SizeVT() (n int) { +func (m *ReloadSchemaRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.SemiSync { - n += 2 + l = len(m.WaitPosition) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *InitPrimaryResponse) SizeVT() (n int) { +func (m *ReloadSchemaResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Position) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *PopulateReparentJournalRequest) SizeVT() (n int) { +func (m *PreflightSchemaRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.TimeCreatedNs != 0 { - n += 1 + sov(uint64(m.TimeCreatedNs)) - } - l = len(m.ActionName) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.PrimaryAlias != nil { - l = m.PrimaryAlias.SizeVT() - n += 1 + l + sov(uint64(l)) - } - l = len(m.ReplicationPosition) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if len(m.Changes) > 0 { + for _, s := range m.Changes { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n } -func (m *PopulateReparentJournalResponse) SizeVT() (n int) { +func (m *PreflightSchemaResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if len(m.ChangeResults) > 0 { + for _, e := range m.ChangeResults { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } n += len(m.unknownFields) return n } -func (m *InitReplicaRequest) SizeVT() (n int) { +func (m *ApplySchemaRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Parent != nil { - l = m.Parent.SizeVT() - n += 1 + l + sov(uint64(l)) + l = len(m.Sql) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - l = len(m.ReplicationPosition) + if m.Force { + n += 2 + } + if m.AllowReplication { + n += 2 + } + if m.BeforeSchema != nil { + l = m.BeforeSchema.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.AfterSchema != nil { + l = m.AfterSchema.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.SqlMode) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.TimeCreatedNs != 0 { - n += 1 + sov(uint64(m.TimeCreatedNs)) + if m.BatchSize != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.BatchSize)) } - if m.SemiSync { + if m.DisableForeignKeyChecks { n += 2 } n += len(m.unknownFields) return n } -func (m *InitReplicaResponse) SizeVT() (n int) { +func (m *ApplySchemaResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - n += len(m.unknownFields) - return n -} - -func (m *DemotePrimaryRequest) SizeVT() (n int) { - if m == nil { - return 0 + if m.BeforeSchema != nil { + l = m.BeforeSchema.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.AfterSchema != nil { + l = m.AfterSchema.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - var l int - _ = l n += len(m.unknownFields) return n } -func (m *DemotePrimaryResponse) SizeVT() (n int) { +func (m *LockTablesRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.PrimaryStatus != nil { - l = m.PrimaryStatus.SizeVT() - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *UndoDemotePrimaryRequest) SizeVT() (n int) { +func (m *LockTablesResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.SemiSync { - n += 2 - } n += len(m.unknownFields) return n } -func (m *UndoDemotePrimaryResponse) SizeVT() (n int) { +func (m *UnlockTablesRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -10609,7 +10997,7 @@ func (m *UndoDemotePrimaryResponse) SizeVT() (n int) { return n } -func (m *ReplicaWasPromotedRequest) SizeVT() (n int) { +func (m *UnlockTablesResponse) SizeVT() (n int) { if m == nil { return 0 } @@ -10619,352 +11007,361 @@ func (m *ReplicaWasPromotedRequest) SizeVT() (n int) { return n } -func (m *ReplicaWasPromotedResponse) SizeVT() (n int) { +func (m *ExecuteQueryRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + l = len(m.Query) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.DbName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MaxRows != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxRows)) + } + if m.CallerId != nil { + l = m.CallerId.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } -func (m *ResetReplicationParametersRequest) SizeVT() (n int) { +func (m *ExecuteQueryResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if m.Result != nil { + l = m.Result.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } -func (m *ResetReplicationParametersResponse) SizeVT() (n int) { +func (m *ExecuteFetchAsDbaRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + l = len(m.Query) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.DbName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MaxRows != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxRows)) + } + if m.DisableBinlogs { + n += 2 + } + if m.ReloadSchema { + n += 2 + } + if m.DisableForeignKeyChecks { + n += 2 + } n += len(m.unknownFields) return n } -func (m *FullStatusRequest) SizeVT() (n int) { +func (m *ExecuteFetchAsDbaResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if m.Result != nil { + l = m.Result.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } -func (m *FullStatusResponse) SizeVT() (n int) { +func (m *ExecuteMultiFetchAsDbaRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Status != nil { - l = m.Status.SizeVT() - n += 1 + l + sov(uint64(l)) + l = len(m.Sql) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.DbName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MaxRows != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxRows)) + } + if m.DisableBinlogs { + n += 2 + } + if m.ReloadSchema { + n += 2 + } + if m.DisableForeignKeyChecks { + n += 2 } n += len(m.unknownFields) return n } -func (m *SetReplicationSourceRequest) SizeVT() (n int) { +func (m *ExecuteMultiFetchAsDbaResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Parent != nil { - l = m.Parent.SizeVT() - n += 1 + l + sov(uint64(l)) + if len(m.Results) > 0 { + for _, e := range m.Results { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } - if m.TimeCreatedNs != 0 { - n += 1 + sov(uint64(m.TimeCreatedNs)) + n += len(m.unknownFields) + return n +} + +func (m *ExecuteFetchAsAllPrivsRequest) SizeVT() (n int) { + if m == nil { + return 0 } - if m.ForceStartReplication { - n += 2 + var l int + _ = l + l = len(m.Query) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - l = len(m.WaitPosition) + l = len(m.DbName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.SemiSync { - n += 2 + if m.MaxRows != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxRows)) } - if m.HeartbeatInterval != 0 { - n += 9 + if m.ReloadSchema { + n += 2 } n += len(m.unknownFields) return n } -func (m *SetReplicationSourceResponse) SizeVT() (n int) { +func (m *ExecuteFetchAsAllPrivsResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if m.Result != nil { + l = m.Result.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } -func (m *ReplicaWasRestartedRequest) SizeVT() (n int) { +func (m *ExecuteFetchAsAppRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Parent != nil { - l = m.Parent.SizeVT() - n += 1 + l + sov(uint64(l)) + l = len(m.Query) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MaxRows != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxRows)) } n += len(m.unknownFields) return n } -func (m *ReplicaWasRestartedResponse) SizeVT() (n int) { +func (m *ExecuteFetchAsAppResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l + if m.Result != nil { + l = m.Result.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } -func (m *StopReplicationAndGetStatusRequest) SizeVT() (n int) { +func (m *GetUnresolvedTransactionsRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.StopReplicationMode != 0 { - n += 1 + sov(uint64(m.StopReplicationMode)) + if m.AbandonAge != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.AbandonAge)) } n += len(m.unknownFields) return n } -func (m *StopReplicationAndGetStatusResponse) SizeVT() (n int) { +func (m *GetUnresolvedTransactionsResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Status != nil { - l = m.Status.SizeVT() - n += 1 + l + sov(uint64(l)) + if len(m.Transactions) > 0 { + for _, e := range m.Transactions { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n } -func (m *PromoteReplicaRequest) SizeVT() (n int) { +func (m *ReadTransactionRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.SemiSync { - n += 2 + l = len(m.Dtid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *PromoteReplicaResponse) SizeVT() (n int) { +func (m *ReadTransactionResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Position) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.Transaction != nil { + l = m.Transaction.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *BackupRequest) SizeVT() (n int) { +func (m *ConcludeTransactionRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Concurrency != 0 { - n += 1 + sov(uint64(m.Concurrency)) - } - if m.AllowPrimary { - n += 2 - } - l = len(m.IncrementalFromPos) + l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.UpgradeSafe { + if m.Mm { n += 2 } n += len(m.unknownFields) return n } -func (m *BackupResponse) SizeVT() (n int) { +func (m *ConcludeTransactionResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Event != nil { - l = m.Event.SizeVT() - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *RestoreFromBackupRequest) SizeVT() (n int) { +func (m *MysqlHostMetricsRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.BackupTime != nil { - l = m.BackupTime.SizeVT() - n += 1 + l + sov(uint64(l)) - } - l = len(m.RestoreToPos) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.DryRun { - n += 2 - } - if m.RestoreToTimestamp != nil { - l = m.RestoreToTimestamp.SizeVT() - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *RestoreFromBackupResponse) SizeVT() (n int) { +func (m *MysqlHostMetricsResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Event != nil { - l = m.Event.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.HostMetrics != nil { + l = m.HostMetrics.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *CreateVReplicationWorkflowRequest) SizeVT() (n int) { +func (m *ReplicationStatusRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Workflow) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if len(m.BinlogSource) > 0 { - for _, e := range m.BinlogSource { - l = e.SizeVT() - n += 1 + l + sov(uint64(l)) - } - } - if len(m.Cells) > 0 { - for _, s := range m.Cells { - l = len(s) - n += 1 + l + sov(uint64(l)) - } - } - if len(m.TabletTypes) > 0 { - l = 0 - for _, e := range m.TabletTypes { - l += sov(uint64(e)) - } - n += 1 + sov(uint64(l)) + l - } - if m.TabletSelectionPreference != 0 { - n += 1 + sov(uint64(m.TabletSelectionPreference)) - } - if m.WorkflowType != 0 { - n += 1 + sov(uint64(m.WorkflowType)) - } - if m.WorkflowSubType != 0 { - n += 1 + sov(uint64(m.WorkflowSubType)) - } - if m.DeferSecondaryKeys { - n += 2 - } - if m.AutoStart { - n += 2 - } - if m.StopAfterCopy { - n += 2 - } - l = len(m.Options) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *CreateVReplicationWorkflowResponse) SizeVT() (n int) { +func (m *ReplicationStatusResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Result != nil { - l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.Status != nil { + l = m.Status.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *DeleteVReplicationWorkflowRequest) SizeVT() (n int) { +func (m *PrimaryStatusRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Workflow) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *DeleteVReplicationWorkflowResponse) SizeVT() (n int) { +func (m *PrimaryStatusResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Result != nil { - l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.Status != nil { + l = m.Status.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *HasVReplicationWorkflowsRequest) SizeVT() (n int) { +func (m *PrimaryPositionRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -10974,458 +11371,206 @@ func (m *HasVReplicationWorkflowsRequest) SizeVT() (n int) { return n } -func (m *HasVReplicationWorkflowsResponse) SizeVT() (n int) { +func (m *PrimaryPositionResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Has { - n += 2 + l = len(m.Position) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *ReadVReplicationWorkflowsRequest) SizeVT() (n int) { +func (m *WaitForPositionRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.IncludeIds) > 0 { - l = 0 - for _, e := range m.IncludeIds { - l += sov(uint64(e)) - } - n += 1 + sov(uint64(l)) + l - } - if len(m.IncludeWorkflows) > 0 { - for _, s := range m.IncludeWorkflows { - l = len(s) - n += 1 + l + sov(uint64(l)) - } - } - if len(m.IncludeStates) > 0 { - l = 0 - for _, e := range m.IncludeStates { - l += sov(uint64(e)) - } - n += 1 + sov(uint64(l)) + l - } - if len(m.ExcludeWorkflows) > 0 { - for _, s := range m.ExcludeWorkflows { - l = len(s) - n += 1 + l + sov(uint64(l)) - } - } - if len(m.ExcludeStates) > 0 { - l = 0 - for _, e := range m.ExcludeStates { - l += sov(uint64(e)) - } - n += 1 + sov(uint64(l)) + l - } - if m.ExcludeFrozen { - n += 2 + l = len(m.Position) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *ReadVReplicationWorkflowsResponse) SizeVT() (n int) { +func (m *WaitForPositionResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Workflows) > 0 { - for _, e := range m.Workflows { - l = e.SizeVT() - n += 1 + l + sov(uint64(l)) - } - } n += len(m.unknownFields) return n } -func (m *ReadVReplicationWorkflowRequest) SizeVT() (n int) { +func (m *StopReplicationRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Workflow) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *ReadVReplicationWorkflowResponse_Stream) SizeVT() (n int) { +func (m *StopReplicationResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Id != 0 { - n += 1 + sov(uint64(m.Id)) - } - if m.Bls != nil { - l = m.Bls.SizeVT() - n += 1 + l + sov(uint64(l)) + n += len(m.unknownFields) + return n +} + +func (m *StopReplicationMinimumRequest) SizeVT() (n int) { + if m == nil { + return 0 } - l = len(m.Pos) + var l int + _ = l + l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - l = len(m.StopPos) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.MaxTps != 0 { - n += 1 + sov(uint64(m.MaxTps)) - } - if m.MaxReplicationLag != 0 { - n += 1 + sov(uint64(m.MaxReplicationLag)) - } - if m.TimeUpdated != nil { - l = m.TimeUpdated.SizeVT() - n += 1 + l + sov(uint64(l)) - } - if m.TransactionTimestamp != nil { - l = m.TransactionTimestamp.SizeVT() - n += 1 + l + sov(uint64(l)) - } - if m.State != 0 { - n += 1 + sov(uint64(m.State)) - } - l = len(m.Message) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.RowsCopied != 0 { - n += 1 + sov(uint64(m.RowsCopied)) - } - if m.TimeHeartbeat != nil { - l = m.TimeHeartbeat.SizeVT() - n += 1 + l + sov(uint64(l)) - } - if m.TimeThrottled != nil { - l = m.TimeThrottled.SizeVT() - n += 1 + l + sov(uint64(l)) - } - l = len(m.ComponentThrottled) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.WaitTimeout != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.WaitTimeout)) } n += len(m.unknownFields) return n } -func (m *ReadVReplicationWorkflowResponse) SizeVT() (n int) { +func (m *StopReplicationMinimumResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Workflow) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Cells) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if len(m.TabletTypes) > 0 { - l = 0 - for _, e := range m.TabletTypes { - l += sov(uint64(e)) - } - n += 1 + sov(uint64(l)) + l - } - if m.TabletSelectionPreference != 0 { - n += 1 + sov(uint64(m.TabletSelectionPreference)) - } - l = len(m.DbName) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Tags) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.WorkflowType != 0 { - n += 1 + sov(uint64(m.WorkflowType)) - } - if m.WorkflowSubType != 0 { - n += 1 + sov(uint64(m.WorkflowSubType)) - } - if m.DeferSecondaryKeys { - n += 2 - } - if len(m.Streams) > 0 { - for _, e := range m.Streams { - l = e.SizeVT() - n += 1 + l + sov(uint64(l)) - } - } - l = len(m.Options) + l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *VDiffRequest) SizeVT() (n int) { +func (m *StartReplicationRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Keyspace) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Workflow) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Action) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.ActionArg) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.VdiffUuid) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.Options != nil { - l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.SemiSync { + n += 2 } n += len(m.unknownFields) return n } -func (m *VDiffResponse) SizeVT() (n int) { +func (m *StartReplicationResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Id != 0 { - n += 1 + sov(uint64(m.Id)) - } - if m.Output != nil { - l = m.Output.SizeVT() - n += 1 + l + sov(uint64(l)) - } - l = len(m.VdiffUuid) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *VDiffPickerOptions) SizeVT() (n int) { +func (m *StartReplicationUntilAfterRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.TabletTypes) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.SourceCell) + l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - l = len(m.TargetCell) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.WaitTimeout != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.WaitTimeout)) } n += len(m.unknownFields) return n } -func (m *VDiffReportOptions) SizeVT() (n int) { +func (m *StartReplicationUntilAfterResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.OnlyPks { - n += 2 - } - if m.DebugQuery { - n += 2 - } - l = len(m.Format) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.MaxSampleRows != 0 { - n += 1 + sov(uint64(m.MaxSampleRows)) - } n += len(m.unknownFields) return n } -func (m *VDiffCoreOptions) SizeVT() (n int) { +func (m *GetReplicasRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Tables) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.AutoRetry { - n += 2 - } - if m.MaxRows != 0 { - n += 1 + sov(uint64(m.MaxRows)) - } - if m.Checksum { - n += 2 - } - if m.SamplePct != 0 { - n += 1 + sov(uint64(m.SamplePct)) - } - if m.TimeoutSeconds != 0 { - n += 1 + sov(uint64(m.TimeoutSeconds)) - } - if m.MaxExtraRowsToCompare != 0 { - n += 1 + sov(uint64(m.MaxExtraRowsToCompare)) - } - if m.UpdateTableStats { - n += 2 - } - if m.MaxDiffSeconds != 0 { - n += 1 + sov(uint64(m.MaxDiffSeconds)) - } n += len(m.unknownFields) return n } -func (m *VDiffOptions) SizeVT() (n int) { +func (m *GetReplicasResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.PickerOptions != nil { - l = m.PickerOptions.SizeVT() - n += 1 + l + sov(uint64(l)) - } - if m.CoreOptions != nil { - l = m.CoreOptions.SizeVT() - n += 1 + l + sov(uint64(l)) - } - if m.ReportOptions != nil { - l = m.ReportOptions.SizeVT() - n += 1 + l + sov(uint64(l)) + if len(m.Addrs) > 0 { + for _, s := range m.Addrs { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n } -func (m *UpdateVReplicationWorkflowRequest) SizeVT() (n int) { +func (m *ResetReplicationRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Workflow) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if len(m.Cells) > 0 { - for _, s := range m.Cells { - l = len(s) - n += 1 + l + sov(uint64(l)) - } - } - if len(m.TabletTypes) > 0 { - l = 0 - for _, e := range m.TabletTypes { - l += sov(uint64(e)) - } - n += 1 + sov(uint64(l)) + l - } - if m.TabletSelectionPreference != 0 { - n += 1 + sov(uint64(m.TabletSelectionPreference)) - } - if m.OnDdl != 0 { - n += 1 + sov(uint64(m.OnDdl)) - } - if m.State != 0 { - n += 1 + sov(uint64(m.State)) - } n += len(m.unknownFields) return n } -func (m *UpdateVReplicationWorkflowResponse) SizeVT() (n int) { +func (m *ResetReplicationResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Result != nil { - l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) - } n += len(m.unknownFields) return n } -func (m *UpdateVReplicationWorkflowsRequest) SizeVT() (n int) { +func (m *VReplicationExecRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.AllWorkflows { - n += 2 - } - if len(m.IncludeWorkflows) > 0 { - for _, s := range m.IncludeWorkflows { - l = len(s) - n += 1 + l + sov(uint64(l)) - } - } - if len(m.ExcludeWorkflows) > 0 { - for _, s := range m.ExcludeWorkflows { - l = len(s) - n += 1 + l + sov(uint64(l)) - } - } - if m.State != 0 { - n += 1 + sov(uint64(m.State)) - } - l = len(m.Message) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.StopPosition) + l = len(m.Query) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *UpdateVReplicationWorkflowsResponse) SizeVT() (n int) { +func (m *VReplicationExecResponse) SizeVT() (n int) { if m == nil { return 0 } @@ -11433,29 +11578,30 @@ func (m *UpdateVReplicationWorkflowsResponse) SizeVT() (n int) { _ = l if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *ResetSequencesRequest) SizeVT() (n int) { +func (m *VReplicationWaitForPosRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Tables) > 0 { - for _, s := range m.Tables { - l = len(s) - n += 1 + l + sov(uint64(l)) - } + if m.Id != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Id)) + } + l = len(m.Position) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *ResetSequencesResponse) SizeVT() (n int) { +func (m *VReplicationWaitForPosResponse) SizeVT() (n int) { if m == nil { return 0 } @@ -11465,112 +11611,116 @@ func (m *ResetSequencesResponse) SizeVT() (n int) { return n } -func (m *CheckThrottlerRequest) SizeVT() (n int) { +func (m *InitPrimaryRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.AppName) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Scope) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.SkipRequestHeartbeats { - n += 2 - } - if m.OkIfNotExists { - n += 2 - } - if m.MultiMetricsEnabled { + if m.SemiSync { n += 2 } n += len(m.unknownFields) return n } -func (m *CheckThrottlerResponse_Metric) SizeVT() (n int) { +func (m *InitPrimaryResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - if m.StatusCode != 0 { - n += 1 + sov(uint64(m.StatusCode)) - } - if m.Value != 0 { - n += 9 - } - if m.Threshold != 0 { - n += 9 - } - l = len(m.Error) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Message) - if l > 0 { - n += 1 + l + sov(uint64(l)) - } - l = len(m.Scope) + l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *CheckThrottlerResponse) SizeVT() (n int) { +func (m *PopulateReparentJournalRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.StatusCode != 0 { - n += 1 + sov(uint64(m.StatusCode)) + if m.TimeCreatedNs != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TimeCreatedNs)) } - if m.Value != 0 { - n += 9 + l = len(m.ActionName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.Threshold != 0 { - n += 9 + if m.PrimaryAlias != nil { + l = m.PrimaryAlias.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - l = len(m.Error) + l = len(m.ReplicationPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - l = len(m.Message) + n += len(m.unknownFields) + return n +} + +func (m *PopulateReparentJournalResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *ReadReparentJournalInfoRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *ReadReparentJournalInfoResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Length != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Length)) + } + n += len(m.unknownFields) + return n +} + +func (m *InitReplicaRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Parent != nil { + l = m.Parent.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ReplicationPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.RecentlyChecked { - n += 2 + if m.TimeCreatedNs != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TimeCreatedNs)) } - if len(m.Metrics) > 0 { - for k, v := range m.Metrics { - _ = k - _ = v - l = 0 - if v != nil { - l = v.SizeVT() - } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) - } + if m.SemiSync { + n += 2 } n += len(m.unknownFields) return n } -func (m *GetThrottlerStatusRequest) SizeVT() (n int) { +func (m *InitReplicaResponse) SizeVT() (n int) { if m == nil { return 0 } @@ -11580,184 +11730,1865 @@ func (m *GetThrottlerStatusRequest) SizeVT() (n int) { return n } -func (m *GetThrottlerStatusResponse_MetricResult) SizeVT() (n int) { +func (m *DemotePrimaryRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Value != 0 { - n += 9 + n += len(m.unknownFields) + return n +} + +func (m *DemotePrimaryResponse) SizeVT() (n int) { + if m == nil { + return 0 } - l = len(m.Error) - if l > 0 { - n += 1 + l + sov(uint64(l)) + var l int + _ = l + if m.PrimaryStatus != nil { + l = m.PrimaryStatus.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *GetThrottlerStatusResponse_MetricHealth) SizeVT() (n int) { +func (m *UndoDemotePrimaryRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.LastHealthyAt != nil { - l = m.LastHealthyAt.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.SemiSync { + n += 2 } - if m.SecondsSinceLastHealthy != 0 { - n += 1 + sov(uint64(m.SecondsSinceLastHealthy)) + n += len(m.unknownFields) + return n +} + +func (m *UndoDemotePrimaryResponse) SizeVT() (n int) { + if m == nil { + return 0 } + var l int + _ = l n += len(m.unknownFields) return n } -func (m *GetThrottlerStatusResponse_RecentApp) SizeVT() (n int) { +func (m *ReplicaWasPromotedRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.CheckedAt != nil { - l = m.CheckedAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += len(m.unknownFields) + return n +} + +func (m *ReplicaWasPromotedResponse) SizeVT() (n int) { + if m == nil { + return 0 } - if m.StatusCode != 0 { - n += 1 + sov(uint64(m.StatusCode)) + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *ResetReplicationParametersRequest) SizeVT() (n int) { + if m == nil { + return 0 } + var l int + _ = l n += len(m.unknownFields) return n } -func (m *GetThrottlerStatusResponse) SizeVT() (n int) { +func (m *ResetReplicationParametersResponse) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.TabletAlias) - if l > 0 { - n += 1 + l + sov(uint64(l)) + n += len(m.unknownFields) + return n +} + +func (m *FullStatusRequest) SizeVT() (n int) { + if m == nil { + return 0 } - l = len(m.Keyspace) - if l > 0 { - n += 1 + l + sov(uint64(l)) + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *FullStatusResponse) SizeVT() (n int) { + if m == nil { + return 0 } - l = len(m.Shard) - if l > 0 { - n += 1 + l + sov(uint64(l)) + var l int + _ = l + if m.Status != nil { + l = m.Status.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.IsLeader { - n += 2 + n += len(m.unknownFields) + return n +} + +func (m *SetReplicationSourceRequest) SizeVT() (n int) { + if m == nil { + return 0 } - if m.IsOpen { - n += 2 + var l int + _ = l + if m.Parent != nil { + l = m.Parent.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.IsEnabled { - n += 2 + if m.TimeCreatedNs != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TimeCreatedNs)) } - if m.IsDormant { + if m.ForceStartReplication { n += 2 } - l = len(m.LagMetricQuery) + l = len(m.WaitPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - l = len(m.CustomMetricQuery) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.SemiSync { + n += 2 } - if m.DefaultThreshold != 0 { + if m.HeartbeatInterval != 0 { n += 9 } - l = len(m.MetricNameUsedAsDefault) - if l > 0 { - n += 1 + l + sov(uint64(l)) + n += len(m.unknownFields) + return n +} + +func (m *SetReplicationSourceResponse) SizeVT() (n int) { + if m == nil { + return 0 } - if len(m.AggregatedMetrics) > 0 { - for k, v := range m.AggregatedMetrics { - _ = k - _ = v - l = 0 - if v != nil { - l = v.SizeVT() + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *ReplicaWasRestartedRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Parent != nil { + l = m.Parent.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ReplicaWasRestartedResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *StopReplicationAndGetStatusRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.StopReplicationMode != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.StopReplicationMode)) + } + n += len(m.unknownFields) + return n +} + +func (m *StopReplicationAndGetStatusResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Status != nil { + l = m.Status.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *PromoteReplicaRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SemiSync { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *PromoteReplicaResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Position) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *BackupRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Concurrency != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Concurrency)) + } + if m.AllowPrimary { + n += 2 + } + l = len(m.IncrementalFromPos) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.UpgradeSafe { + n += 2 + } + if m.BackupEngine != nil { + l = len(*m.BackupEngine) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *BackupResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Event != nil { + l = m.Event.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *RestoreFromBackupRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BackupTime != nil { + l = m.BackupTime.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.RestoreToPos) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.DryRun { + n += 2 + } + if m.RestoreToTimestamp != nil { + l = m.RestoreToTimestamp.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.AllowedBackupEngines) > 0 { + for _, s := range m.AllowedBackupEngines { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *RestoreFromBackupResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Event != nil { + l = m.Event.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *CreateVReplicationWorkflowRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Workflow) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.BinlogSource) > 0 { + for _, e := range m.BinlogSource { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.Cells) > 0 { + for _, s := range m.Cells { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.TabletTypes) > 0 { + l = 0 + for _, e := range m.TabletTypes { + l += protohelpers.SizeOfVarint(uint64(e)) + } + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l + } + if m.TabletSelectionPreference != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletSelectionPreference)) + } + if m.WorkflowType != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.WorkflowType)) + } + if m.WorkflowSubType != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.WorkflowSubType)) + } + if m.DeferSecondaryKeys { + n += 2 + } + if m.AutoStart { + n += 2 + } + if m.StopAfterCopy { + n += 2 + } + l = len(m.Options) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *CreateVReplicationWorkflowResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Result != nil { + l = m.Result.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *DeleteTableDataRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TableFilters) > 0 { + for k, v := range m.TableFilters { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if m.BatchSize != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.BatchSize)) + } + n += len(m.unknownFields) + return n +} + +func (m *DeleteTableDataResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *DeleteVReplicationWorkflowRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Workflow) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *DeleteVReplicationWorkflowResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Result != nil { + l = m.Result.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *HasVReplicationWorkflowsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *HasVReplicationWorkflowsResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Has { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *ReadVReplicationWorkflowsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.IncludeIds) > 0 { + l = 0 + for _, e := range m.IncludeIds { + l += protohelpers.SizeOfVarint(uint64(e)) + } + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l + } + if len(m.IncludeWorkflows) > 0 { + for _, s := range m.IncludeWorkflows { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.IncludeStates) > 0 { + l = 0 + for _, e := range m.IncludeStates { + l += protohelpers.SizeOfVarint(uint64(e)) + } + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l + } + if len(m.ExcludeWorkflows) > 0 { + for _, s := range m.ExcludeWorkflows { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.ExcludeStates) > 0 { + l = 0 + for _, e := range m.ExcludeStates { + l += protohelpers.SizeOfVarint(uint64(e)) + } + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l + } + if m.ExcludeFrozen { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *ReadVReplicationWorkflowsResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Workflows) > 0 { + for _, e := range m.Workflows { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ReadVReplicationWorkflowRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Workflow) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ReadVReplicationWorkflowResponse_Stream) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Id != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Id)) + } + if m.Bls != nil { + l = m.Bls.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Pos) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.StopPos) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MaxTps != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxTps)) + } + if m.MaxReplicationLag != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxReplicationLag)) + } + if m.TimeUpdated != nil { + l = m.TimeUpdated.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.TransactionTimestamp != nil { + l = m.TransactionTimestamp.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.State != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.State)) + } + l = len(m.Message) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.RowsCopied != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowsCopied)) + } + if m.TimeHeartbeat != nil { + l = m.TimeHeartbeat.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.TimeThrottled != nil { + l = m.TimeThrottled.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ComponentThrottled) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ReadVReplicationWorkflowResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Workflow) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Cells) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.TabletTypes) > 0 { + l = 0 + for _, e := range m.TabletTypes { + l += protohelpers.SizeOfVarint(uint64(e)) + } + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l + } + if m.TabletSelectionPreference != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletSelectionPreference)) + } + l = len(m.DbName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Tags) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.WorkflowType != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.WorkflowType)) + } + if m.WorkflowSubType != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.WorkflowSubType)) + } + if m.DeferSecondaryKeys { + n += 2 + } + if len(m.Streams) > 0 { + for _, e := range m.Streams { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + l = len(m.Options) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.ConfigOverrides) > 0 { + for k, v := range m.ConfigOverrides { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ValidateVReplicationPermissionsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *ValidateVReplicationPermissionsResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.User) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Ok { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Workflow) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Action) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.ActionArg) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.VdiffUuid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Options != nil { + l = m.Options.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Id != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Id)) + } + if m.Output != nil { + l = m.Output.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.VdiffUuid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffPickerOptions) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TabletTypes) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.SourceCell) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.TargetCell) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffReportOptions) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.OnlyPks { + n += 2 + } + if m.DebugQuery { + n += 2 + } + l = len(m.Format) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.MaxSampleRows != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxSampleRows)) + } + if m.RowDiffColumnTruncateAt != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowDiffColumnTruncateAt)) + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffCoreOptions) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Tables) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.AutoRetry { + n += 2 + } + if m.MaxRows != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxRows)) + } + if m.Checksum { + n += 2 + } + if m.SamplePct != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.SamplePct)) + } + if m.TimeoutSeconds != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.TimeoutSeconds)) + } + if m.MaxExtraRowsToCompare != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxExtraRowsToCompare)) + } + if m.UpdateTableStats { + n += 2 + } + if m.MaxDiffSeconds != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxDiffSeconds)) + } + if m.AutoStart != nil { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffOptions) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PickerOptions != nil { + l = m.PickerOptions.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.CoreOptions != nil { + l = m.CoreOptions.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.ReportOptions != nil { + l = m.ReportOptions.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *UpdateVReplicationWorkflowRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Workflow) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Cells) > 0 { + for _, s := range m.Cells { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.TabletTypes) > 0 { + l = 0 + for _, e := range m.TabletTypes { + l += protohelpers.SizeOfVarint(uint64(e)) + } + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l + } + if m.TabletSelectionPreference != nil { + n += 1 + protohelpers.SizeOfVarint(uint64(*m.TabletSelectionPreference)) + } + if m.OnDdl != nil { + n += 1 + protohelpers.SizeOfVarint(uint64(*m.OnDdl)) + } + if m.State != nil { + n += 1 + protohelpers.SizeOfVarint(uint64(*m.State)) + } + if len(m.ConfigOverrides) > 0 { + for k, v := range m.ConfigOverrides { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *UpdateVReplicationWorkflowResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Result != nil { + l = m.Result.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *UpdateVReplicationWorkflowsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AllWorkflows { + n += 2 + } + if len(m.IncludeWorkflows) > 0 { + for _, s := range m.IncludeWorkflows { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.ExcludeWorkflows) > 0 { + for _, s := range m.ExcludeWorkflows { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if m.State != nil { + n += 1 + protohelpers.SizeOfVarint(uint64(*m.State)) + } + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.StopPosition != nil { + l = len(*m.StopPosition) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *UpdateVReplicationWorkflowsResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Result != nil { + l = m.Result.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ResetSequencesRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Tables) > 0 { + for _, s := range m.Tables { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ResetSequencesResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *CheckThrottlerRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.AppName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Scope) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.SkipRequestHeartbeats { + n += 2 + } + if m.OkIfNotExists { + n += 2 + } + if m.MultiMetricsEnabled { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *CheckThrottlerResponse_Metric) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.StatusCode != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.StatusCode)) + } + if m.Value != 0 { + n += 9 + } + if m.Threshold != 0 { + n += 9 + } + l = len(m.Error) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Message) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Scope) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.ResponseCode != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.ResponseCode)) + } + n += len(m.unknownFields) + return n +} + +func (m *CheckThrottlerResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.StatusCode != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.StatusCode)) + } + if m.Value != 0 { + n += 9 + } + if m.Threshold != 0 { + n += 9 + } + l = len(m.Error) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Message) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.RecentlyChecked { + n += 2 + } + if len(m.Metrics) > 0 { + for k, v := range m.Metrics { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + l = len(m.AppName) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Summary) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.ResponseCode != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.ResponseCode)) + } + n += len(m.unknownFields) + return n +} + +func (m *GetThrottlerStatusRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + +func (m *GetThrottlerStatusResponse_MetricResult) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != 0 { + n += 9 + } + l = len(m.Error) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *GetThrottlerStatusResponse_MetricHealth) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.LastHealthyAt != nil { + l = m.LastHealthyAt.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.SecondsSinceLastHealthy != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.SecondsSinceLastHealthy)) + } + n += len(m.unknownFields) + return n +} + +func (m *GetThrottlerStatusResponse_RecentApp) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CheckedAt != nil { + l = m.CheckedAt.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.StatusCode != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.StatusCode)) + } + if m.ResponseCode != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.ResponseCode)) + } + n += len(m.unknownFields) + return n +} + +func (m *GetThrottlerStatusResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TabletAlias) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Shard) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.IsLeader { + n += 2 + } + if m.IsOpen { + n += 2 + } + if m.IsEnabled { + n += 2 + } + if m.IsDormant { + n += 2 + } + l = len(m.LagMetricQuery) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.CustomMetricQuery) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.DefaultThreshold != 0 { + n += 9 + } + l = len(m.MetricNameUsedAsDefault) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.AggregatedMetrics) > 0 { + for k, v := range m.AggregatedMetrics { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if len(m.MetricThresholds) > 0 { + for k, v := range m.MetricThresholds { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + 8 + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if len(m.MetricsHealth) > 0 { + for k, v := range m.MetricsHealth { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if len(m.ThrottledApps) > 0 { + for k, v := range m.ThrottledApps { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if len(m.AppCheckedMetrics) > 0 { + for k, v := range m.AppCheckedMetrics { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 2 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if m.RecentlyChecked { + n += 3 + } + if len(m.RecentApps) > 0 { + for k, v := range m.RecentApps { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 2 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ChangeTagsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Tags) > 0 { + for k, v := range m.Tags { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if m.Replace { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *ChangeTagsResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Tags) > 0 { + for k, v := range m.Tags { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *TableDefinition) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TableDefinition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TableDefinition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Schema", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Schema = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Columns", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Columns = append(m.Columns, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrimaryKeyColumns", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrimaryKeyColumns = append(m.PrimaryKeyColumns, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DataLength", wireType) + } + m.DataLength = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DataLength |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RowCount", wireType) + } + m.RowCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RowCount |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fields", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Fields = append(m.Fields, &query.Field{}) + if err := m.Fields[len(m.Fields)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SchemaDefinition) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SchemaDefinition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SchemaDefinition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseSchema", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DatabaseSchema = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TableDefinitions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TableDefinitions = append(m.TableDefinitions, &TableDefinition{}) + if err := m.TableDefinitions[len(m.TableDefinitions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SchemaChangeResult) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SchemaChangeResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SchemaChangeResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BeforeSchema", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BeforeSchema == nil { + m.BeforeSchema = &SchemaDefinition{} + } + if err := m.BeforeSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AfterSchema", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) - } - } - if len(m.MetricThresholds) > 0 { - for k, v := range m.MetricThresholds { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + 8 - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) - } - } - if len(m.MetricsHealth) > 0 { - for k, v := range m.MetricsHealth { - _ = k - _ = v - l = 0 - if v != nil { - l = v.SizeVT() + if msglen < 0 { + return protohelpers.ErrInvalidLength } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) - } - } - if len(m.ThrottledApps) > 0 { - for k, v := range m.ThrottledApps { - _ = k - _ = v - l = 0 - if v != nil { - l = v.SizeVT() + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) - } - } - if len(m.AppCheckedMetrics) > 0 { - for k, v := range m.AppCheckedMetrics { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 2 + sov(uint64(mapEntrySize)) - } - } - if m.RecentlyChecked { - n += 3 - } - if len(m.RecentApps) > 0 { - for k, v := range m.RecentApps { - _ = k - _ = v - l = 0 - if v != nil { - l = v.SizeVT() + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AfterSchema == nil { + m.AfterSchema = &SchemaDefinition{} + } + if err := m.AfterSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 2 + sov(uint64(mapEntrySize)) + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy } } - n += len(m.unknownFields) - return n -} -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil } -func (m *TableDefinition) UnmarshalVT(dAtA []byte) error { +func (m *UserPermission) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11765,7 +13596,7 @@ func (m *TableDefinition) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11780,20 +13611,20 @@ func (m *TableDefinition) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TableDefinition: wiretype end group for non-group") + return fmt.Errorf("proto: UserPermission: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TableDefinition: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserPermission: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Host", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11807,25 +13638,25 @@ func (m *TableDefinition) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Host = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Schema", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11839,57 +13670,222 @@ func (m *TableDefinition) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Schema = string(dAtA[iNdEx:postIndex]) + m.User = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PasswordChecksum", wireType) + } + m.PasswordChecksum = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PasswordChecksum |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Columns", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Privileges", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Columns = append(m.Columns, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 4: + if m.Privileges == nil { + m.Privileges = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Privileges[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DbPermission) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DbPermission: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DbPermission: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PrimaryKeyColumns", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Host", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11903,25 +13899,25 @@ func (m *TableDefinition) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.PrimaryKeyColumns = append(m.PrimaryKeyColumns, string(dAtA[iNdEx:postIndex])) + m.Host = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Db", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11935,148 +13931,25 @@ func (m *TableDefinition) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Type = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DataLength", wireType) - } - m.DataLength = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.DataLength |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RowCount", wireType) - } - m.RowCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RowCount |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fields", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Fields = append(m.Fields, &query.Field{}) - if err := m.Fields[len(m.Fields)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Db = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SchemaDefinition) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SchemaDefinition: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SchemaDefinition: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseSchema", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12090,25 +13963,25 @@ func (m *SchemaDefinition) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.DatabaseSchema = string(dAtA[iNdEx:postIndex]) + m.User = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TableDefinitions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Privileges", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12121,28 +13994,121 @@ func (m *SchemaDefinition) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.TableDefinitions = append(m.TableDefinitions, &TableDefinition{}) - if err := m.TableDefinitions[len(m.TableDefinitions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + if m.Privileges == nil { + m.Privileges = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } + m.Privileges[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12157,7 +14123,7 @@ func (m *SchemaDefinition) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SchemaChangeResult) UnmarshalVT(dAtA []byte) error { +func (m *Permissions) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12165,7 +14131,7 @@ func (m *SchemaChangeResult) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12180,20 +14146,20 @@ func (m *SchemaChangeResult) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SchemaChangeResult: wiretype end group for non-group") + return fmt.Errorf("proto: Permissions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SchemaChangeResult: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Permissions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BeforeSchema", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserPermissions", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12206,30 +14172,28 @@ func (m *SchemaChangeResult) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.BeforeSchema == nil { - m.BeforeSchema = &SchemaDefinition{} - } - if err := m.BeforeSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.UserPermissions = append(m.UserPermissions, &UserPermission{}) + if err := m.UserPermissions[len(m.UserPermissions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AfterSchema", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DbPermissions", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12242,30 +14206,28 @@ func (m *SchemaChangeResult) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.AfterSchema == nil { - m.AfterSchema = &SchemaDefinition{} - } - if err := m.AfterSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.DbPermissions = append(m.DbPermissions, &DbPermission{}) + if err := m.DbPermissions[len(m.DbPermissions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12280,7 +14242,7 @@ func (m *SchemaChangeResult) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UserPermission) UnmarshalVT(dAtA []byte) error { +func (m *PingRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12288,7 +14250,7 @@ func (m *UserPermission) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12303,20 +14265,20 @@ func (m *UserPermission) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserPermission: wiretype end group for non-group") + return fmt.Errorf("proto: PingRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserPermission: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PingRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Host", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12330,25 +14292,76 @@ func (m *UserPermission) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Host = string(dAtA[iNdEx:postIndex]) + m.Payload = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PingResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PingResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12362,171 +14375,146 @@ func (m *UserPermission) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.User = string(dAtA[iNdEx:postIndex]) + m.Payload = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PasswordChecksum", wireType) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - m.PasswordChecksum = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PasswordChecksum |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Privileges", wireType) + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - var msglen int + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SleepRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SleepRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SleepRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + } + m.Duration = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Duration |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - if m.Privileges == nil { - m.Privileges = make(map[string]string) - } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLength - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLength - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLength - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLength - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SleepResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } - m.Privileges[mapkey] = mapvalue - iNdEx = postIndex + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SleepResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SleepResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12541,7 +14529,7 @@ func (m *UserPermission) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *DbPermission) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12549,7 +14537,7 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12564,20 +14552,20 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DbPermission: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteHookRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DbPermission: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteHookRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Host", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12591,25 +14579,25 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Host = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Db", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12623,57 +14611,25 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Db = string(dAtA[iNdEx:postIndex]) + m.Parameters = append(m.Parameters, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.User = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Privileges", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ExtraEnv", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12686,17 +14642,17 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Privileges == nil { - m.Privileges = make(map[string]string) + if m.ExtraEnv == nil { + m.ExtraEnv = make(map[string]string) } var mapkey string var mapvalue string @@ -12705,7 +14661,7 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12722,7 +14678,7 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12736,11 +14692,11 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -12751,7 +14707,7 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12765,11 +14721,11 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { } intStringLenmapvalue := int(stringLenmapvalue) if intStringLenmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapvalue := iNdEx + intStringLenmapvalue if postStringIndexmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF @@ -12778,12 +14734,12 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -12791,16 +14747,16 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.Privileges[mapkey] = mapvalue + m.ExtraEnv[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12815,7 +14771,7 @@ func (m *DbPermission) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *Permissions) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteHookResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12823,7 +14779,7 @@ func (m *Permissions) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12838,88 +14794,103 @@ func (m *Permissions) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Permissions: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteHookResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Permissions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteHookResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExitStatus", wireType) + } + m.ExitStatus = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ExitStatus |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserPermissions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.UserPermissions = append(m.UserPermissions, &UserPermission{}) - if err := m.UserPermissions[len(m.UserPermissions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Stdout = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DbPermissions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.DbPermissions = append(m.DbPermissions, &DbPermission{}) - if err := m.DbPermissions[len(m.DbPermissions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Stderr = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12934,7 +14905,7 @@ func (m *Permissions) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *PingRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12942,7 +14913,7 @@ func (m *PingRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12957,20 +14928,20 @@ func (m *PingRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PingRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetSchemaRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PingRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Tables", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12984,25 +14955,97 @@ func (m *PingRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Payload = string(dAtA[iNdEx:postIndex]) + m.Tables = append(m.Tables, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IncludeViews", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IncludeViews = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExcludeTables", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExcludeTables = append(m.ExcludeTables, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TableSchemaOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TableSchemaOnly = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13017,7 +15060,7 @@ func (m *PingRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *PingResponse) UnmarshalVT(dAtA []byte) error { +func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13025,7 +15068,7 @@ func (m *PingResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13040,52 +15083,56 @@ func (m *PingResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PingResponse: wiretype end group for non-group") + return fmt.Errorf("proto: GetSchemaResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PingResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetSchemaResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SchemaDefinition", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Payload = string(dAtA[iNdEx:postIndex]) + if m.SchemaDefinition == nil { + m.SchemaDefinition = &SchemaDefinition{} + } + if err := m.SchemaDefinition.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13100,7 +15147,7 @@ func (m *PingResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SleepRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetPermissionsRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13108,7 +15155,7 @@ func (m *SleepRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13123,39 +15170,20 @@ func (m *SleepRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SleepRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetPermissionsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SleepRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) - } - m.Duration = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Duration |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } + return fmt.Errorf("proto: GetPermissionsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13170,7 +15198,7 @@ func (m *SleepRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SleepResponse) UnmarshalVT(dAtA []byte) error { +func (m *GetPermissionsResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13178,7 +15206,7 @@ func (m *SleepResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13193,20 +15221,56 @@ func (m *SleepResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SleepResponse: wiretype end group for non-group") + return fmt.Errorf("proto: GetPermissionsResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SleepResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetPermissionsResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Permissions == nil { + m.Permissions = &Permissions{} + } + if err := m.Permissions.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13221,7 +15285,7 @@ func (m *SleepResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetGlobalStatusVarsRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13229,7 +15293,7 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13244,20 +15308,20 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteHookRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetGlobalStatusVarsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteHookRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetGlobalStatusVarsRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Variables", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13271,57 +15335,76 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Variables = append(m.Variables, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetGlobalStatusVarsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - m.Parameters = append(m.Parameters, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetGlobalStatusVarsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetGlobalStatusVarsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExtraEnv", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StatusValues", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13334,17 +15417,17 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.ExtraEnv == nil { - m.ExtraEnv = make(map[string]string) + if m.StatusValues == nil { + m.StatusValues = make(map[string]string) } var mapkey string var mapvalue string @@ -13353,7 +15436,7 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13370,7 +15453,7 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13384,11 +15467,11 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -13399,7 +15482,7 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13413,11 +15496,11 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { } intStringLenmapvalue := int(stringLenmapvalue) if intStringLenmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapvalue := iNdEx + intStringLenmapvalue if postStringIndexmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF @@ -13426,163 +15509,29 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.ExtraEnv[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ExecuteHookResponse) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ExecuteHookResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteHookResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ExitStatus", wireType) - } - m.ExitStatus = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ExitStatus |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Stdout = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } - m.Stderr = string(dAtA[iNdEx:postIndex]) + m.StatusValues[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13597,7 +15546,7 @@ func (m *ExecuteHookResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { +func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13605,7 +15554,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13620,124 +15569,71 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetSchemaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: SetReadOnlyRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetReadOnlyRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tables", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.Tables = append(m.Tables, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IncludeViews", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IncludeViews = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExcludeTables", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - m.ExcludeTables = append(m.ExcludeTables, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TableSchemaOnly", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - m.TableSchemaOnly = bool(v != 0) + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SetReadOnlyResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetReadOnlyResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13752,7 +15648,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { +func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13760,7 +15656,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13775,56 +15671,20 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetSchemaResponse: wiretype end group for non-group") + return fmt.Errorf("proto: SetReadWriteRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetSchemaResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetReadWriteRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SchemaDefinition", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.SchemaDefinition == nil { - m.SchemaDefinition = &SchemaDefinition{} - } - if err := m.SchemaDefinition.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13839,7 +15699,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetPermissionsRequest) UnmarshalVT(dAtA []byte) error { +func (m *SetReadWriteResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13847,7 +15707,7 @@ func (m *GetPermissionsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13862,20 +15722,20 @@ func (m *GetPermissionsRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetPermissionsRequest: wiretype end group for non-group") + return fmt.Errorf("proto: SetReadWriteResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetPermissionsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetReadWriteResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13890,7 +15750,7 @@ func (m *GetPermissionsRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetPermissionsResponse) UnmarshalVT(dAtA []byte) error { +func (m *ChangeTypeRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13898,7 +15758,7 @@ func (m *GetPermissionsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13913,56 +15773,110 @@ func (m *GetPermissionsResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetPermissionsResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ChangeTypeRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetPermissionsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ChangeTypeRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TabletType", wireType) } - var msglen int + m.TabletType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.TabletType |= topodata.TabletType(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SemiSync", wireType) } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if postIndex > l { + m.SemiSync = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - if m.Permissions == nil { - m.Permissions = &Permissions{} + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeTypeResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } - if err := m.Permissions.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - iNdEx = postIndex + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeTypeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeTypeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13977,7 +15891,7 @@ func (m *GetPermissionsResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetGlobalStatusVarsRequest) UnmarshalVT(dAtA []byte) error { +func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13985,7 +15899,7 @@ func (m *GetGlobalStatusVarsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14000,52 +15914,20 @@ func (m *GetGlobalStatusVarsRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetGlobalStatusVarsRequest: wiretype end group for non-group") + return fmt.Errorf("proto: RefreshStateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetGlobalStatusVarsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RefreshStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Variables", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Variables = append(m.Variables, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14060,7 +15942,7 @@ func (m *GetGlobalStatusVarsRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetGlobalStatusVarsResponse) UnmarshalVT(dAtA []byte) error { +func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14068,7 +15950,7 @@ func (m *GetGlobalStatusVarsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14083,147 +15965,20 @@ func (m *GetGlobalStatusVarsResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetGlobalStatusVarsResponse: wiretype end group for non-group") + return fmt.Errorf("proto: RefreshStateResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetGlobalStatusVarsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RefreshStateResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StatusValues", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.StatusValues == nil { - m.StatusValues = make(map[string]string) - } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLength - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLength - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLength - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLength - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.StatusValues[mapkey] = mapvalue - iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14238,7 +15993,7 @@ func (m *GetGlobalStatusVarsResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { +func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14246,7 +16001,7 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14261,20 +16016,20 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetReadOnlyRequest: wiretype end group for non-group") + return fmt.Errorf("proto: RunHealthCheckRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetReadOnlyRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RunHealthCheckRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14289,7 +16044,7 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { +func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14297,7 +16052,7 @@ func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14312,20 +16067,20 @@ func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetReadOnlyResponse: wiretype end group for non-group") + return fmt.Errorf("proto: RunHealthCheckResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetReadOnlyResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RunHealthCheckResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14340,7 +16095,7 @@ func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { +func (m *ReloadSchemaRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14348,7 +16103,7 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14363,20 +16118,52 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetReadWriteRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ReloadSchemaRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetReadWriteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReloadSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WaitPosition", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WaitPosition = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14391,7 +16178,7 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SetReadWriteResponse) UnmarshalVT(dAtA []byte) error { +func (m *ReloadSchemaResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14399,7 +16186,7 @@ func (m *SetReadWriteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14414,20 +16201,20 @@ func (m *SetReadWriteResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetReadWriteResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ReloadSchemaResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetReadWriteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReloadSchemaResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14442,7 +16229,7 @@ func (m *SetReadWriteResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ChangeTypeRequest) UnmarshalVT(dAtA []byte) error { +func (m *PreflightSchemaRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14450,7 +16237,7 @@ func (m *ChangeTypeRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14465,59 +16252,52 @@ func (m *ChangeTypeRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ChangeTypeRequest: wiretype end group for non-group") + return fmt.Errorf("proto: PreflightSchemaRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ChangeTypeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PreflightSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TabletType", wireType) - } - m.TabletType = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TabletType |= topodata.TabletType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SemiSync", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.SemiSync = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14532,7 +16312,7 @@ func (m *ChangeTypeRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ChangeTypeResponse) UnmarshalVT(dAtA []byte) error { +func (m *PreflightSchemaResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14540,7 +16320,7 @@ func (m *ChangeTypeResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14555,20 +16335,54 @@ func (m *ChangeTypeResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ChangeTypeResponse: wiretype end group for non-group") + return fmt.Errorf("proto: PreflightSchemaResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ChangeTypeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PreflightSchemaResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChangeResults", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChangeResults = append(m.ChangeResults, &SchemaChangeResult{}) + if err := m.ChangeResults[len(m.ChangeResults)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14583,7 +16397,7 @@ func (m *ChangeTypeResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { +func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14591,7 +16405,7 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14606,71 +16420,235 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RefreshStateRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplySchemaRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplySchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sql", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sql = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Force = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowReplication", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllowReplication = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BeforeSchema", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BeforeSchema == nil { + m.BeforeSchema = &SchemaDefinition{} + } + if err := m.BeforeSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AfterSchema", wireType) } - if (iNdEx + skippy) > l { + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow + if m.AfterSchema == nil { + m.AfterSchema = &SchemaDefinition{} } - if iNdEx >= l { + if err := m.AfterSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SqlMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.SqlMode = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BatchSize", wireType) + } + m.BatchSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BatchSize |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisableForeignKeyChecks", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RefreshStateResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshStateResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + m.DisableForeignKeyChecks = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14685,7 +16663,7 @@ func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { +func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14693,7 +16671,7 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14708,71 +16686,92 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RunHealthCheckRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplySchemaResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RunHealthCheckRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplySchemaResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BeforeSchema", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow + if m.BeforeSchema == nil { + m.BeforeSchema = &SchemaDefinition{} } - if iNdEx >= l { + if err := m.BeforeSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AfterSchema", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + if m.AfterSchema == nil { + m.AfterSchema = &SchemaDefinition{} } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RunHealthCheckResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RunHealthCheckResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + if err := m.AfterSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14787,7 +16786,7 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ReloadSchemaRequest) UnmarshalVT(dAtA []byte) error { +func (m *LockTablesRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14795,7 +16794,7 @@ func (m *ReloadSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14810,52 +16809,20 @@ func (m *ReloadSchemaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ReloadSchemaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: LockTablesRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ReloadSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: LockTablesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WaitPosition", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WaitPosition = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14870,7 +16837,7 @@ func (m *ReloadSchemaRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ReloadSchemaResponse) UnmarshalVT(dAtA []byte) error { +func (m *LockTablesResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14878,7 +16845,7 @@ func (m *ReloadSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14893,20 +16860,20 @@ func (m *ReloadSchemaResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ReloadSchemaResponse: wiretype end group for non-group") + return fmt.Errorf("proto: LockTablesResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ReloadSchemaResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: LockTablesResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14921,7 +16888,7 @@ func (m *ReloadSchemaResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *PreflightSchemaRequest) UnmarshalVT(dAtA []byte) error { +func (m *UnlockTablesRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14929,7 +16896,7 @@ func (m *PreflightSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14944,52 +16911,20 @@ func (m *PreflightSchemaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PreflightSchemaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: UnlockTablesRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PreflightSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UnlockTablesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15004,7 +16939,7 @@ func (m *PreflightSchemaRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *PreflightSchemaResponse) UnmarshalVT(dAtA []byte) error { +func (m *UnlockTablesResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15012,69 +16947,35 @@ func (m *PreflightSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PreflightSchemaResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PreflightSchemaResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChangeResults", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChangeResults = append(m.ChangeResults, &SchemaChangeResult{}) - if err := m.ChangeResults[len(m.ChangeResults)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - iNdEx = postIndex + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UnlockTablesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UnlockTablesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15089,7 +16990,7 @@ func (m *PreflightSchemaResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15097,7 +16998,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15112,164 +17013,54 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplySchemaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteQueryRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplySchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteQueryRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sql", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sql = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Force = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowReplication", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllowReplication = bool(v != 0) - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BeforeSchema", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.BeforeSchema == nil { - m.BeforeSchema = &SchemaDefinition{} - } - if err := m.BeforeSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AfterSchema", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + if byteLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.AfterSchema == nil { - m.AfterSchema = &SchemaDefinition{} - } - if err := m.AfterSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Query = append(m.Query[:0], dAtA[iNdEx:postIndex]...) + if m.Query == nil { + m.Query = []byte{} } iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SqlMode", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DbName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15283,151 +17074,44 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.SqlMode = string(dAtA[iNdEx:postIndex]) + m.DbName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BatchSize", wireType) - } - m.BatchSize = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.BatchSize |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: + case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisableForeignKeyChecks", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DisableForeignKeyChecks = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ApplySchemaResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ApplySchemaResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BeforeSchema", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MaxRows", wireType) } - var msglen int + m.MaxRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.MaxRows |= uint64(b&0x7F) << shift if b < 0x80 { break } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.BeforeSchema == nil { - m.BeforeSchema = &SchemaDefinition{} - } - if err := m.BeforeSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: + } + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AfterSchema", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CallerId", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15440,30 +17124,30 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.AfterSchema == nil { - m.AfterSchema = &SchemaDefinition{} + if m.CallerId == nil { + m.CallerId = &vtrpc.CallerID{} } - if err := m.AfterSchema.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.CallerId.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15478,7 +17162,7 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *LockTablesRequest) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteQueryResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15486,7 +17170,7 @@ func (m *LockTablesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15501,20 +17185,56 @@ func (m *LockTablesRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: LockTablesRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteQueryResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: LockTablesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteQueryResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Result == nil { + m.Result = &query.QueryResult{} + } + if err := m.Result.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15529,7 +17249,7 @@ func (m *LockTablesRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *LockTablesResponse) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15537,7 +17257,7 @@ func (m *LockTablesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15552,71 +17272,165 @@ func (m *LockTablesResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: LockTablesResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteFetchAsDbaRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: LockTablesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteFetchAsDbaRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UnlockTablesRequest) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow + m.Query = append(m.Query[:0], dAtA[iNdEx:postIndex]...) + if m.Query == nil { + m.Query = []byte{} } - if iNdEx >= l { + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DbName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.DbName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxRows", wireType) } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: UnlockTablesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UnlockTablesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + m.MaxRows = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxRows |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisableBinlogs", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DisableBinlogs = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReloadSchema", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ReloadSchema = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisableForeignKeyChecks", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DisableForeignKeyChecks = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15631,7 +17445,7 @@ func (m *UnlockTablesRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *UnlockTablesResponse) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15639,7 +17453,7 @@ func (m *UnlockTablesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15654,20 +17468,56 @@ func (m *UnlockTablesResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UnlockTablesResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteFetchAsDbaResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UnlockTablesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteFetchAsDbaResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Result == nil { + m.Result = &query.QueryResult{} + } + if err := m.Result.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15682,7 +17532,7 @@ func (m *UnlockTablesResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteMultiFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15690,7 +17540,7 @@ func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15705,20 +17555,20 @@ func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteQueryRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteMultiFetchAsDbaRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteQueryRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteMultiFetchAsDbaRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Sql", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15731,18 +17581,18 @@ func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Query = append(m.Query[:0], dAtA[iNdEx:postIndex]...) - if m.Query == nil { - m.Query = []byte{} + m.Sql = append(m.Sql[:0], dAtA[iNdEx:postIndex]...) + if m.Sql == nil { + m.Sql = []byte{} } iNdEx = postIndex case 2: @@ -15752,7 +17602,7 @@ func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15766,11 +17616,11 @@ func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15784,7 +17634,7 @@ func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { m.MaxRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15797,49 +17647,73 @@ func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { } } case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CallerId", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisableBinlogs", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength + m.DisableBinlogs = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReloadSchema", wireType) } - if postIndex > l { - return io.ErrUnexpectedEOF + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if m.CallerId == nil { - m.CallerId = &vtrpc.CallerID{} + m.ReloadSchema = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisableForeignKeyChecks", wireType) } - if err := m.CallerId.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - iNdEx = postIndex + m.DisableForeignKeyChecks = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15854,7 +17728,7 @@ func (m *ExecuteQueryRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteQueryResponse) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteMultiFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15862,7 +17736,7 @@ func (m *ExecuteQueryResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15877,20 +17751,20 @@ func (m *ExecuteQueryResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteQueryResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteMultiFetchAsDbaResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteQueryResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteMultiFetchAsDbaResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15903,30 +17777,28 @@ func (m *ExecuteQueryResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Result == nil { - m.Result = &query.QueryResult{} - } - if err := m.Result.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.Results = append(m.Results, &query.QueryResult{}) + if err := m.Results[len(m.Results)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15941,7 +17813,7 @@ func (m *ExecuteQueryResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteFetchAsAllPrivsRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15949,7 +17821,7 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15964,10 +17836,10 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteFetchAsDbaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteFetchAsAllPrivsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteFetchAsDbaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteFetchAsAllPrivsRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -15977,7 +17849,7 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15990,11 +17862,11 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16011,7 +17883,7 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16025,11 +17897,11 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16043,7 +17915,7 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { m.MaxRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16057,12 +17929,12 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { } case 4: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisableBinlogs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ReloadSchema", wireType) } var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16074,55 +17946,206 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { break } } - m.DisableBinlogs = bool(v != 0) - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReloadSchema", wireType) + m.ReloadSchema = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - var v int + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExecuteFetchAsAllPrivsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExecuteFetchAsAllPrivsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExecuteFetchAsAllPrivsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + } + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - m.ReloadSchema = bool(v != 0) - case 6: + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Result == nil { + m.Result = &query.QueryResult{} + } + if err := m.Result.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExecuteFetchAsAppRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExecuteFetchAsAppRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Query = append(m.Query[:0], dAtA[iNdEx:postIndex]...) + if m.Query == nil { + m.Query = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisableForeignKeyChecks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MaxRows", wireType) } - var v int + m.MaxRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + m.MaxRows |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.DisableForeignKeyChecks = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16137,7 +18160,7 @@ func (m *ExecuteFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { +func (m *ExecuteFetchAsAppResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16145,7 +18168,7 @@ func (m *ExecuteFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16160,10 +18183,10 @@ func (m *ExecuteFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteFetchAsDbaResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ExecuteFetchAsAppResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteFetchAsDbaResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ExecuteFetchAsAppResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -16173,7 +18196,7 @@ func (m *ExecuteFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16186,11 +18209,11 @@ func (m *ExecuteFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -16204,12 +18227,12 @@ func (m *ExecuteFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16224,7 +18247,7 @@ func (m *ExecuteFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteMultiFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetUnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16232,7 +18255,7 @@ func (m *ExecuteMultiFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16247,165 +18270,207 @@ func (m *ExecuteMultiFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteMultiFetchAsDbaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetUnresolvedTransactionsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteMultiFetchAsDbaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetUnresolvedTransactionsRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sql", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AbandonAge", wireType) } - var byteLen int + m.AbandonAge = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + m.AbandonAge |= int64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLength + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLength + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.Sql = append(m.Sql[:0], dAtA[iNdEx:postIndex]...) - if m.Sql == nil { - m.Sql = []byte{} + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetUnresolvedTransactionsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } - iNdEx = postIndex - case 2: + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetUnresolvedTransactionsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetUnresolvedTransactionsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DbName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Transactions", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.DbName = string(dAtA[iNdEx:postIndex]) + m.Transactions = append(m.Transactions, &query.TransactionMetadata{}) + if err := m.Transactions[len(m.Transactions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxRows", wireType) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - m.MaxRows = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxRows |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisableBinlogs", wireType) + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ReadTransactionRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } - m.DisableBinlogs = bool(v != 0) - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReloadSchema", wireType) + if iNdEx >= l { + return io.ErrUnexpectedEOF } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - m.ReloadSchema = bool(v != 0) - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisableForeignKeyChecks", wireType) + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReadTransactionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReadTransactionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Dtid", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.DisableForeignKeyChecks = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Dtid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16420,7 +18485,7 @@ func (m *ExecuteMultiFetchAsDbaRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteMultiFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { +func (m *ReadTransactionResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16428,7 +18493,7 @@ func (m *ExecuteMultiFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16443,20 +18508,20 @@ func (m *ExecuteMultiFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteMultiFetchAsDbaResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ReadTransactionResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteMultiFetchAsDbaResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReadTransactionResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Transaction", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16469,28 +18534,30 @@ func (m *ExecuteMultiFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Results = append(m.Results, &query.QueryResult{}) - if err := m.Results[len(m.Results)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if m.Transaction == nil { + m.Transaction = &query.TransactionMetadata{} + } + if err := m.Transaction.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16505,7 +18572,7 @@ func (m *ExecuteMultiFetchAsDbaResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteFetchAsAllPrivsRequest) UnmarshalVT(dAtA []byte) error { +func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16513,7 +18580,7 @@ func (m *ExecuteFetchAsAllPrivsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16528,54 +18595,20 @@ func (m *ExecuteFetchAsAllPrivsRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteFetchAsAllPrivsRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ConcludeTransactionRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteFetchAsAllPrivsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ConcludeTransactionRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Query = append(m.Query[:0], dAtA[iNdEx:postIndex]...) - if m.Query == nil { - m.Query = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DbName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Dtid", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16589,44 +18622,25 @@ func (m *ExecuteFetchAsAllPrivsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DbName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxRows", wireType) + return protohelpers.ErrInvalidLength } - m.MaxRows = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxRows |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength } - case 4: + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Dtid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReloadSchema", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Mm", wireType) } var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16638,15 +18652,15 @@ func (m *ExecuteFetchAsAllPrivsRequest) UnmarshalVT(dAtA []byte) error { break } } - m.ReloadSchema = bool(v != 0) + m.Mm = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16661,7 +18675,7 @@ func (m *ExecuteFetchAsAllPrivsRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteFetchAsAllPrivsResponse) UnmarshalVT(dAtA []byte) error { +func (m *ConcludeTransactionResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16669,7 +18683,7 @@ func (m *ExecuteFetchAsAllPrivsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16684,56 +18698,20 @@ func (m *ExecuteFetchAsAllPrivsResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteFetchAsAllPrivsResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ConcludeTransactionResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteFetchAsAllPrivsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ConcludeTransactionResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Result == nil { - m.Result = &query.QueryResult{} - } - if err := m.Result.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16748,7 +18726,7 @@ func (m *ExecuteFetchAsAllPrivsResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { +func (m *MysqlHostMetricsRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16756,7 +18734,7 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16771,73 +18749,20 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteFetchAsAppRequest: wiretype end group for non-group") + return fmt.Errorf("proto: MysqlHostMetricsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteFetchAsAppRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MysqlHostMetricsRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Query = append(m.Query[:0], dAtA[iNdEx:postIndex]...) - if m.Query == nil { - m.Query = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxRows", wireType) - } - m.MaxRows = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxRows |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16852,7 +18777,7 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ExecuteFetchAsAppResponse) UnmarshalVT(dAtA []byte) error { +func (m *MysqlHostMetricsResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16860,7 +18785,7 @@ func (m *ExecuteFetchAsAppResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16875,20 +18800,20 @@ func (m *ExecuteFetchAsAppResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExecuteFetchAsAppResponse: wiretype end group for non-group") + return fmt.Errorf("proto: MysqlHostMetricsResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExecuteFetchAsAppResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MysqlHostMetricsResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field HostMetrics", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16901,30 +18826,30 @@ func (m *ExecuteFetchAsAppResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Result == nil { - m.Result = &query.QueryResult{} + if m.HostMetrics == nil { + m.HostMetrics = &mysqlctl.HostMetricsResponse{} } - if err := m.Result.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.HostMetrics.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16947,7 +18872,7 @@ func (m *ReplicationStatusRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16970,12 +18895,12 @@ func (m *ReplicationStatusRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16998,7 +18923,7 @@ func (m *ReplicationStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17026,7 +18951,7 @@ func (m *ReplicationStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17039,11 +18964,11 @@ func (m *ReplicationStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17057,12 +18982,12 @@ func (m *ReplicationStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17085,7 +19010,7 @@ func (m *PrimaryStatusRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17108,12 +19033,12 @@ func (m *PrimaryStatusRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17136,7 +19061,7 @@ func (m *PrimaryStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17164,7 +19089,7 @@ func (m *PrimaryStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17177,11 +19102,11 @@ func (m *PrimaryStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17195,12 +19120,12 @@ func (m *PrimaryStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17223,7 +19148,7 @@ func (m *PrimaryPositionRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17246,12 +19171,12 @@ func (m *PrimaryPositionRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17274,7 +19199,7 @@ func (m *PrimaryPositionResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17302,7 +19227,7 @@ func (m *PrimaryPositionResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17316,11 +19241,11 @@ func (m *PrimaryPositionResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17329,12 +19254,12 @@ func (m *PrimaryPositionResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17357,7 +19282,7 @@ func (m *WaitForPositionRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17385,7 +19310,7 @@ func (m *WaitForPositionRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17399,11 +19324,11 @@ func (m *WaitForPositionRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17412,12 +19337,12 @@ func (m *WaitForPositionRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17440,7 +19365,7 @@ func (m *WaitForPositionResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17463,12 +19388,12 @@ func (m *WaitForPositionResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17491,7 +19416,7 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17514,12 +19439,12 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17542,7 +19467,7 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17565,12 +19490,12 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17593,7 +19518,7 @@ func (m *StopReplicationMinimumRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17621,7 +19546,7 @@ func (m *StopReplicationMinimumRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17635,11 +19560,11 @@ func (m *StopReplicationMinimumRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17653,7 +19578,7 @@ func (m *StopReplicationMinimumRequest) UnmarshalVT(dAtA []byte) error { m.WaitTimeout = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17667,12 +19592,12 @@ func (m *StopReplicationMinimumRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17695,7 +19620,7 @@ func (m *StopReplicationMinimumResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17723,7 +19648,7 @@ func (m *StopReplicationMinimumResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17737,11 +19662,11 @@ func (m *StopReplicationMinimumResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17750,12 +19675,12 @@ func (m *StopReplicationMinimumResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17778,7 +19703,7 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17806,7 +19731,7 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17821,12 +19746,12 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { m.SemiSync = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17849,7 +19774,7 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17872,12 +19797,12 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17900,7 +19825,7 @@ func (m *StartReplicationUntilAfterRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17928,7 +19853,7 @@ func (m *StartReplicationUntilAfterRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17942,11 +19867,11 @@ func (m *StartReplicationUntilAfterRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17960,7 +19885,7 @@ func (m *StartReplicationUntilAfterRequest) UnmarshalVT(dAtA []byte) error { m.WaitTimeout = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17974,12 +19899,12 @@ func (m *StartReplicationUntilAfterRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18002,7 +19927,7 @@ func (m *StartReplicationUntilAfterResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18025,12 +19950,12 @@ func (m *StartReplicationUntilAfterResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18053,7 +19978,7 @@ func (m *GetReplicasRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18076,12 +20001,12 @@ func (m *GetReplicasRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18104,7 +20029,7 @@ func (m *GetReplicasResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18132,7 +20057,7 @@ func (m *GetReplicasResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18146,11 +20071,11 @@ func (m *GetReplicasResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18159,12 +20084,12 @@ func (m *GetReplicasResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18187,7 +20112,7 @@ func (m *ResetReplicationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18210,12 +20135,12 @@ func (m *ResetReplicationRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18238,7 +20163,7 @@ func (m *ResetReplicationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18261,12 +20186,12 @@ func (m *ResetReplicationResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18289,7 +20214,7 @@ func (m *VReplicationExecRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18317,7 +20242,7 @@ func (m *VReplicationExecRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18331,11 +20256,11 @@ func (m *VReplicationExecRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18344,12 +20269,12 @@ func (m *VReplicationExecRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18372,7 +20297,7 @@ func (m *VReplicationExecResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18400,7 +20325,7 @@ func (m *VReplicationExecResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18413,11 +20338,11 @@ func (m *VReplicationExecResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18431,12 +20356,12 @@ func (m *VReplicationExecResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18459,7 +20384,7 @@ func (m *VReplicationWaitForPosRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18487,7 +20412,7 @@ func (m *VReplicationWaitForPosRequest) UnmarshalVT(dAtA []byte) error { m.Id = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18506,7 +20431,7 @@ func (m *VReplicationWaitForPosRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18520,11 +20445,11 @@ func (m *VReplicationWaitForPosRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18533,12 +20458,12 @@ func (m *VReplicationWaitForPosRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18561,7 +20486,7 @@ func (m *VReplicationWaitForPosResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18584,12 +20509,12 @@ func (m *VReplicationWaitForPosResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18612,7 +20537,7 @@ func (m *InitPrimaryRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18640,7 +20565,7 @@ func (m *InitPrimaryRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18655,12 +20580,12 @@ func (m *InitPrimaryRequest) UnmarshalVT(dAtA []byte) error { m.SemiSync = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18683,7 +20608,7 @@ func (m *InitPrimaryResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18711,7 +20636,7 @@ func (m *InitPrimaryResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18725,11 +20650,11 @@ func (m *InitPrimaryResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18738,12 +20663,12 @@ func (m *InitPrimaryResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18766,7 +20691,7 @@ func (m *PopulateReparentJournalRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18794,7 +20719,7 @@ func (m *PopulateReparentJournalRequest) UnmarshalVT(dAtA []byte) error { m.TimeCreatedNs = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18813,7 +20738,7 @@ func (m *PopulateReparentJournalRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18827,11 +20752,11 @@ func (m *PopulateReparentJournalRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18845,7 +20770,7 @@ func (m *PopulateReparentJournalRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18858,11 +20783,11 @@ func (m *PopulateReparentJournalRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18881,7 +20806,7 @@ func (m *PopulateReparentJournalRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18895,11 +20820,11 @@ func (m *PopulateReparentJournalRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18908,12 +20833,12 @@ func (m *PopulateReparentJournalRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18936,7 +20861,7 @@ func (m *PopulateReparentJournalResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18959,12 +20884,133 @@ func (m *PopulateReparentJournalResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ReadReparentJournalInfoRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReadReparentJournalInfoRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReadReparentJournalInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ReadReparentJournalInfoResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReadReparentJournalInfoResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReadReparentJournalInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Length", wireType) + } + m.Length = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Length |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18987,7 +21033,7 @@ func (m *InitReplicaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19015,7 +21061,7 @@ func (m *InitReplicaRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19028,11 +21074,11 @@ func (m *InitReplicaRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19051,7 +21097,7 @@ func (m *InitReplicaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19065,11 +21111,11 @@ func (m *InitReplicaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19083,7 +21129,7 @@ func (m *InitReplicaRequest) UnmarshalVT(dAtA []byte) error { m.TimeCreatedNs = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19102,7 +21148,7 @@ func (m *InitReplicaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19117,12 +21163,12 @@ func (m *InitReplicaRequest) UnmarshalVT(dAtA []byte) error { m.SemiSync = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19145,7 +21191,7 @@ func (m *InitReplicaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19168,12 +21214,12 @@ func (m *InitReplicaResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19196,7 +21242,7 @@ func (m *DemotePrimaryRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19219,12 +21265,12 @@ func (m *DemotePrimaryRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19247,7 +21293,7 @@ func (m *DemotePrimaryResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19275,7 +21321,7 @@ func (m *DemotePrimaryResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19288,11 +21334,11 @@ func (m *DemotePrimaryResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19306,12 +21352,12 @@ func (m *DemotePrimaryResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19334,7 +21380,7 @@ func (m *UndoDemotePrimaryRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19362,7 +21408,7 @@ func (m *UndoDemotePrimaryRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19377,12 +21423,12 @@ func (m *UndoDemotePrimaryRequest) UnmarshalVT(dAtA []byte) error { m.SemiSync = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19405,7 +21451,7 @@ func (m *UndoDemotePrimaryResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19428,12 +21474,12 @@ func (m *UndoDemotePrimaryResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19456,7 +21502,7 @@ func (m *ReplicaWasPromotedRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19479,12 +21525,12 @@ func (m *ReplicaWasPromotedRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19507,7 +21553,7 @@ func (m *ReplicaWasPromotedResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19530,12 +21576,12 @@ func (m *ReplicaWasPromotedResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19558,7 +21604,7 @@ func (m *ResetReplicationParametersRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19581,12 +21627,12 @@ func (m *ResetReplicationParametersRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19609,7 +21655,7 @@ func (m *ResetReplicationParametersResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19632,12 +21678,12 @@ func (m *ResetReplicationParametersResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19660,7 +21706,7 @@ func (m *FullStatusRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19683,12 +21729,12 @@ func (m *FullStatusRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19711,7 +21757,7 @@ func (m *FullStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19739,7 +21785,7 @@ func (m *FullStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19752,11 +21798,11 @@ func (m *FullStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19770,12 +21816,12 @@ func (m *FullStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19798,7 +21844,7 @@ func (m *SetReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19826,7 +21872,7 @@ func (m *SetReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19839,11 +21885,11 @@ func (m *SetReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19862,7 +21908,7 @@ func (m *SetReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { m.TimeCreatedNs = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19881,7 +21927,7 @@ func (m *SetReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19901,7 +21947,7 @@ func (m *SetReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19915,11 +21961,11 @@ func (m *SetReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19933,7 +21979,7 @@ func (m *SetReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19959,12 +22005,12 @@ func (m *SetReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { m.HeartbeatInterval = float64(math.Float64frombits(v)) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19987,7 +22033,7 @@ func (m *SetReplicationSourceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20010,12 +22056,12 @@ func (m *SetReplicationSourceResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20038,7 +22084,7 @@ func (m *ReplicaWasRestartedRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20066,7 +22112,7 @@ func (m *ReplicaWasRestartedRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20079,11 +22125,11 @@ func (m *ReplicaWasRestartedRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20097,12 +22143,12 @@ func (m *ReplicaWasRestartedRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20125,7 +22171,7 @@ func (m *ReplicaWasRestartedResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20148,12 +22194,12 @@ func (m *ReplicaWasRestartedResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20176,7 +22222,7 @@ func (m *StopReplicationAndGetStatusRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20204,7 +22250,7 @@ func (m *StopReplicationAndGetStatusRequest) UnmarshalVT(dAtA []byte) error { m.StopReplicationMode = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20218,12 +22264,12 @@ func (m *StopReplicationAndGetStatusRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20246,7 +22292,7 @@ func (m *StopReplicationAndGetStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20274,7 +22320,7 @@ func (m *StopReplicationAndGetStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20287,11 +22333,11 @@ func (m *StopReplicationAndGetStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20305,12 +22351,12 @@ func (m *StopReplicationAndGetStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20333,7 +22379,7 @@ func (m *PromoteReplicaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20361,7 +22407,7 @@ func (m *PromoteReplicaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20376,12 +22422,12 @@ func (m *PromoteReplicaRequest) UnmarshalVT(dAtA []byte) error { m.SemiSync = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20404,7 +22450,7 @@ func (m *PromoteReplicaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20432,7 +22478,7 @@ func (m *PromoteReplicaResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20446,11 +22492,11 @@ func (m *PromoteReplicaResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20459,12 +22505,12 @@ func (m *PromoteReplicaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20487,7 +22533,7 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20515,7 +22561,7 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { m.Concurrency = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20534,7 +22580,7 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20549,12 +22595,64 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { m.AllowPrimary = bool(v != 0) case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IncrementalFromPos", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IncrementalFromPos", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IncrementalFromPos = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UpgradeSafe", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UpgradeSafe = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BackupEngine", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20568,45 +22666,26 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.IncrementalFromPos = string(dAtA[iNdEx:postIndex]) + s := string(dAtA[iNdEx:postIndex]) + m.BackupEngine = &s iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field UpgradeSafe", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.UpgradeSafe = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20629,7 +22708,7 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20657,7 +22736,7 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20670,11 +22749,11 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20688,12 +22767,12 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20716,7 +22795,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20744,7 +22823,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20757,11 +22836,11 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20780,7 +22859,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20794,11 +22873,11 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20812,7 +22891,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20832,7 +22911,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20845,11 +22924,11 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20861,14 +22940,46 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedBackupEngines", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedBackupEngines = append(m.AllowedBackupEngines, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20891,7 +23002,7 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20919,7 +23030,7 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20932,11 +23043,11 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20950,12 +23061,12 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20978,7 +23089,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21006,7 +23117,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21020,11 +23131,11 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21038,7 +23149,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21051,11 +23162,11 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21072,7 +23183,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21086,11 +23197,11 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21102,7 +23213,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21119,7 +23230,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21132,11 +23243,11 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21149,7 +23260,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21173,7 +23284,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { m.TabletSelectionPreference = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21192,7 +23303,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { m.WorkflowType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21211,7 +23322,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { m.WorkflowSubType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21230,7 +23341,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21250,7 +23361,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21270,7 +23381,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21290,7 +23401,7 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21304,11 +23415,11 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21317,12 +23428,12 @@ func (m *CreateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21345,7 +23456,7 @@ func (m *CreateVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21373,7 +23484,94 @@ func (m *CreateVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Result == nil { + m.Result = &query.QueryResult{} + } + if err := m.Result.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeleteTableDataRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeleteTableDataRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeleteTableDataRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TableFilters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21386,30 +23584,191 @@ func (m *CreateVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TableFilters == nil { + m.TableFilters = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.TableFilters[mapkey] = mapvalue + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BatchSize", wireType) + } + m.BatchSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BatchSize |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeleteTableDataResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - if m.Result == nil { - m.Result = &query.QueryResult{} - } - if err := m.Result.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - iNdEx = postIndex + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeleteTableDataResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeleteTableDataResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21432,7 +23791,7 @@ func (m *DeleteVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21460,7 +23819,7 @@ func (m *DeleteVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21474,11 +23833,11 @@ func (m *DeleteVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21487,12 +23846,12 @@ func (m *DeleteVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21515,7 +23874,7 @@ func (m *DeleteVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21543,7 +23902,7 @@ func (m *DeleteVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21556,11 +23915,11 @@ func (m *DeleteVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21574,12 +23933,12 @@ func (m *DeleteVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21602,7 +23961,7 @@ func (m *HasVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21625,12 +23984,12 @@ func (m *HasVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21653,7 +24012,7 @@ func (m *HasVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21681,7 +24040,7 @@ func (m *HasVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21696,12 +24055,12 @@ func (m *HasVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { m.Has = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21724,7 +24083,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21750,7 +24109,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21767,7 +24126,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21780,11 +24139,11 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21804,7 +24163,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21828,7 +24187,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21842,11 +24201,11 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21858,7 +24217,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v binlogdata.VReplicationWorkflowState for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21875,7 +24234,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21888,11 +24247,11 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21905,7 +24264,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v binlogdata.VReplicationWorkflowState for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21929,7 +24288,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21943,11 +24302,11 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21959,7 +24318,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v binlogdata.VReplicationWorkflowState for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21976,7 +24335,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21989,11 +24348,11 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22006,7 +24365,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v binlogdata.VReplicationWorkflowState for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22030,7 +24389,7 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22045,12 +24404,12 @@ func (m *ReadVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { m.ExcludeFrozen = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22073,7 +24432,7 @@ func (m *ReadVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22101,7 +24460,7 @@ func (m *ReadVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22114,11 +24473,11 @@ func (m *ReadVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22130,12 +24489,12 @@ func (m *ReadVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22158,7 +24517,7 @@ func (m *ReadVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22186,7 +24545,7 @@ func (m *ReadVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22200,11 +24559,11 @@ func (m *ReadVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22213,12 +24572,12 @@ func (m *ReadVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22241,7 +24600,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22269,7 +24628,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error m.Id = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22288,7 +24647,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22301,11 +24660,11 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22324,7 +24683,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22338,11 +24697,11 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22356,7 +24715,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22370,11 +24729,11 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22388,7 +24747,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error m.MaxTps = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22407,7 +24766,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error m.MaxReplicationLag = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22426,7 +24785,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22439,11 +24798,11 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22462,7 +24821,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22475,11 +24834,11 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22498,7 +24857,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error m.State = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22517,7 +24876,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22531,11 +24890,11 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22549,7 +24908,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error m.RowsCopied = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22568,7 +24927,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22581,11 +24940,11 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22604,7 +24963,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22617,11 +24976,11 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22640,7 +24999,7 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22654,11 +25013,11 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22667,12 +25026,12 @@ func (m *ReadVReplicationWorkflowResponse_Stream) UnmarshalVT(dAtA []byte) error iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22695,7 +25054,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22723,7 +25082,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22737,11 +25096,11 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22755,7 +25114,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22769,11 +25128,11 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22785,7 +25144,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22802,7 +25161,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22815,11 +25174,11 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22832,7 +25191,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22856,7 +25215,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { m.TabletSelectionPreference = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22875,7 +25234,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22889,11 +25248,11 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22907,7 +25266,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22921,11 +25280,11 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22939,7 +25298,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { m.WorkflowType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22958,7 +25317,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { m.WorkflowSubType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22977,7 +25336,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22997,7 +25356,7 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23010,11 +25369,11 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23026,12 +25385,273 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 12: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Options = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigOverrides", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConfigOverrides == nil { + m.ConfigOverrides = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ConfigOverrides[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidateVReplicationPermissionsRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidateVReplicationPermissionsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidateVReplicationPermissionsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidateVReplicationPermissionsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidateVReplicationPermissionsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidateVReplicationPermissionsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23045,25 +25665,45 @@ func (m *ReadVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Options = string(dAtA[iNdEx:postIndex]) + m.User = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ok", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Ok = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23086,7 +25726,7 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23114,7 +25754,7 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23128,11 +25768,11 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23146,7 +25786,7 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23160,11 +25800,11 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23178,7 +25818,7 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23192,11 +25832,11 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23210,7 +25850,7 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23224,11 +25864,11 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23242,7 +25882,7 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23256,11 +25896,11 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23274,7 +25914,7 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23287,11 +25927,11 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23305,12 +25945,12 @@ func (m *VDiffRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23333,7 +25973,7 @@ func (m *VDiffResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23361,7 +26001,7 @@ func (m *VDiffResponse) UnmarshalVT(dAtA []byte) error { m.Id = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23380,7 +26020,7 @@ func (m *VDiffResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23393,11 +26033,11 @@ func (m *VDiffResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23416,7 +26056,7 @@ func (m *VDiffResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23430,11 +26070,11 @@ func (m *VDiffResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23443,12 +26083,12 @@ func (m *VDiffResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23471,7 +26111,7 @@ func (m *VDiffPickerOptions) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23499,7 +26139,7 @@ func (m *VDiffPickerOptions) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23513,11 +26153,11 @@ func (m *VDiffPickerOptions) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23531,7 +26171,7 @@ func (m *VDiffPickerOptions) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23545,11 +26185,11 @@ func (m *VDiffPickerOptions) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23563,7 +26203,7 @@ func (m *VDiffPickerOptions) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23577,11 +26217,11 @@ func (m *VDiffPickerOptions) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23590,12 +26230,12 @@ func (m *VDiffPickerOptions) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23618,7 +26258,7 @@ func (m *VDiffReportOptions) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23646,7 +26286,7 @@ func (m *VDiffReportOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23666,7 +26306,7 @@ func (m *VDiffReportOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23686,7 +26326,7 @@ func (m *VDiffReportOptions) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23700,11 +26340,11 @@ func (m *VDiffReportOptions) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23718,7 +26358,7 @@ func (m *VDiffReportOptions) UnmarshalVT(dAtA []byte) error { m.MaxSampleRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23730,14 +26370,33 @@ func (m *VDiffReportOptions) UnmarshalVT(dAtA []byte) error { break } } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RowDiffColumnTruncateAt", wireType) + } + m.RowDiffColumnTruncateAt = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RowDiffColumnTruncateAt |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23760,7 +26419,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23788,7 +26447,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23802,11 +26461,11 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23820,7 +26479,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23840,7 +26499,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { m.MaxRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23859,7 +26518,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23879,7 +26538,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { m.SamplePct = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23898,7 +26557,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { m.TimeoutSeconds = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23917,7 +26576,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { m.MaxExtraRowsToCompare = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23936,7 +26595,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23956,7 +26615,7 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { m.MaxDiffSeconds = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23968,14 +26627,35 @@ func (m *VDiffCoreOptions) UnmarshalVT(dAtA []byte) error { break } } + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoStart", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AutoStart = &b default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23998,7 +26678,7 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24026,7 +26706,7 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24039,11 +26719,11 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24062,7 +26742,7 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24075,11 +26755,11 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24098,7 +26778,7 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24111,11 +26791,11 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24129,12 +26809,12 @@ func (m *VDiffOptions) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24157,7 +26837,7 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24185,7 +26865,7 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24199,11 +26879,11 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24217,7 +26897,7 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24231,11 +26911,11 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24247,7 +26927,7 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24264,7 +26944,7 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24277,11 +26957,11 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24294,7 +26974,7 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24315,67 +26995,197 @@ func (m *UpdateVReplicationWorkflowRequest) UnmarshalVT(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field TabletSelectionPreference", wireType) } - m.TabletSelectionPreference = 0 + var v TabletSelectionPreference for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - m.TabletSelectionPreference |= TabletSelectionPreference(b&0x7F) << shift + v |= TabletSelectionPreference(b&0x7F) << shift if b < 0x80 { break } } + m.TabletSelectionPreference = &v case 5: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field OnDdl", wireType) } - m.OnDdl = 0 + var v binlogdata.OnDDLAction for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - m.OnDdl |= binlogdata.OnDDLAction(b&0x7F) << shift + v |= binlogdata.OnDDLAction(b&0x7F) << shift if b < 0x80 { break } } + m.OnDdl = &v case 6: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - m.State = 0 + var v binlogdata.VReplicationWorkflowState for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - m.State |= binlogdata.VReplicationWorkflowState(b&0x7F) << shift + v |= binlogdata.VReplicationWorkflowState(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.State = &v + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigOverrides", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConfigOverrides == nil { + m.ConfigOverrides = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ConfigOverrides[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24398,7 +27208,7 @@ func (m *UpdateVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24426,7 +27236,7 @@ func (m *UpdateVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24439,11 +27249,11 @@ func (m *UpdateVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24457,12 +27267,12 @@ func (m *UpdateVReplicationWorkflowResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24485,7 +27295,7 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24513,7 +27323,7 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24533,7 +27343,7 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24547,11 +27357,11 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24565,7 +27375,7 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24579,11 +27389,11 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24594,21 +27404,22 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - m.State = 0 + var v binlogdata.VReplicationWorkflowState for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - m.State |= binlogdata.VReplicationWorkflowState(b&0x7F) << shift + v |= binlogdata.VReplicationWorkflowState(b&0x7F) << shift if b < 0x80 { break } } + m.State = &v case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) @@ -24616,7 +27427,7 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24630,16 +27441,17 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Message = string(dAtA[iNdEx:postIndex]) + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s iNdEx = postIndex case 6: if wireType != 2 { @@ -24648,7 +27460,7 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24662,25 +27474,26 @@ func (m *UpdateVReplicationWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.StopPosition = string(dAtA[iNdEx:postIndex]) + s := string(dAtA[iNdEx:postIndex]) + m.StopPosition = &s iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24703,7 +27516,7 @@ func (m *UpdateVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24731,7 +27544,7 @@ func (m *UpdateVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24744,11 +27557,11 @@ func (m *UpdateVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24762,12 +27575,12 @@ func (m *UpdateVReplicationWorkflowsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24790,7 +27603,7 @@ func (m *ResetSequencesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24818,7 +27631,7 @@ func (m *ResetSequencesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24832,11 +27645,11 @@ func (m *ResetSequencesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24845,12 +27658,12 @@ func (m *ResetSequencesRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24873,7 +27686,7 @@ func (m *ResetSequencesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24896,12 +27709,12 @@ func (m *ResetSequencesResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24924,7 +27737,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24952,7 +27765,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24966,11 +27779,11 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24984,7 +27797,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24998,11 +27811,11 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25016,7 +27829,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25036,7 +27849,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25056,7 +27869,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25071,12 +27884,12 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { m.MultiMetricsEnabled = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25099,7 +27912,7 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25127,7 +27940,7 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25141,11 +27954,11 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25159,7 +27972,7 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { m.StatusCode = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25200,7 +28013,7 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25214,11 +28027,11 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25232,7 +28045,7 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25246,11 +28059,11 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25264,7 +28077,7 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25278,25 +28091,44 @@ func (m *CheckThrottlerResponse_Metric) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.Scope = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseCode", wireType) + } + m.ResponseCode = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ResponseCode |= CheckThrottlerResponseCode(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25319,7 +28151,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25347,7 +28179,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { m.StatusCode = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25388,7 +28220,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25402,11 +28234,11 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25420,7 +28252,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25434,11 +28266,11 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25452,7 +28284,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25472,7 +28304,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25485,11 +28317,11 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25504,7 +28336,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25521,7 +28353,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25535,11 +28367,11 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -25550,7 +28382,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25563,11 +28395,11 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -25579,12 +28411,12 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -25592,16 +28424,99 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.Metrics[mapkey] = mapvalue - iNdEx = postIndex + m.Metrics[mapkey] = mapvalue + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Summary", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Summary = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseCode", wireType) + } + m.ResponseCode = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ResponseCode |= CheckThrottlerResponseCode(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25624,7 +28539,7 @@ func (m *GetThrottlerStatusRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25647,12 +28562,12 @@ func (m *GetThrottlerStatusRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25675,7 +28590,7 @@ func (m *GetThrottlerStatusResponse_MetricResult) UnmarshalVT(dAtA []byte) error var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25714,7 +28629,7 @@ func (m *GetThrottlerStatusResponse_MetricResult) UnmarshalVT(dAtA []byte) error var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25728,11 +28643,11 @@ func (m *GetThrottlerStatusResponse_MetricResult) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25741,12 +28656,12 @@ func (m *GetThrottlerStatusResponse_MetricResult) UnmarshalVT(dAtA []byte) error iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25769,7 +28684,7 @@ func (m *GetThrottlerStatusResponse_MetricHealth) UnmarshalVT(dAtA []byte) error var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25797,7 +28712,7 @@ func (m *GetThrottlerStatusResponse_MetricHealth) UnmarshalVT(dAtA []byte) error var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25810,11 +28725,11 @@ func (m *GetThrottlerStatusResponse_MetricHealth) UnmarshalVT(dAtA []byte) error } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25833,7 +28748,7 @@ func (m *GetThrottlerStatusResponse_MetricHealth) UnmarshalVT(dAtA []byte) error m.SecondsSinceLastHealthy = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25847,12 +28762,12 @@ func (m *GetThrottlerStatusResponse_MetricHealth) UnmarshalVT(dAtA []byte) error } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25875,7 +28790,7 @@ func (m *GetThrottlerStatusResponse_RecentApp) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25903,7 +28818,7 @@ func (m *GetThrottlerStatusResponse_RecentApp) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25916,11 +28831,11 @@ func (m *GetThrottlerStatusResponse_RecentApp) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25939,7 +28854,7 @@ func (m *GetThrottlerStatusResponse_RecentApp) UnmarshalVT(dAtA []byte) error { m.StatusCode = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25951,14 +28866,33 @@ func (m *GetThrottlerStatusResponse_RecentApp) UnmarshalVT(dAtA []byte) error { break } } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseCode", wireType) + } + m.ResponseCode = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ResponseCode |= CheckThrottlerResponseCode(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25981,7 +28915,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26009,7 +28943,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26023,11 +28957,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26041,7 +28975,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26055,11 +28989,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26073,7 +29007,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26087,11 +29021,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26105,7 +29039,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26125,7 +29059,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26145,7 +29079,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26165,7 +29099,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26185,7 +29119,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26199,11 +29133,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26217,7 +29151,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26231,11 +29165,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26260,7 +29194,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26274,11 +29208,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26292,7 +29226,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26305,11 +29239,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26324,7 +29258,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26341,7 +29275,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26355,11 +29289,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -26370,7 +29304,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26383,11 +29317,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -26399,12 +29333,12 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -26421,7 +29355,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26434,11 +29368,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26453,7 +29387,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26470,7 +29404,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26484,11 +29418,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -26500,17 +29434,275 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { if (iNdEx + 8) > l { return io.ErrUnexpectedEOF } - mapvaluetemp = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) - iNdEx += 8 - mapvalue = math.Float64frombits(mapvaluetemp) + mapvaluetemp = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + mapvalue = math.Float64frombits(mapvaluetemp) + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.MetricThresholds[mapkey] = mapvalue + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MetricsHealth", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MetricsHealth == nil { + m.MetricsHealth = make(map[string]*GetThrottlerStatusResponse_MetricHealth) + } + var mapkey string + var mapvalue *GetThrottlerStatusResponse_MetricHealth + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &GetThrottlerStatusResponse_MetricHealth{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.MetricsHealth[mapkey] = mapvalue + iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ThrottledApps", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ThrottledApps == nil { + m.ThrottledApps = make(map[string]*topodata.ThrottledAppRule) + } + var mapkey string + var mapvalue *topodata.ThrottledAppRule + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &topodata.ThrottledAppRule{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -26518,16 +29710,16 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.MetricThresholds[mapkey] = mapvalue + m.ThrottledApps[mapkey] = mapvalue iNdEx = postIndex - case 14: + case 16: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MetricsHealth", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppCheckedMetrics", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26540,26 +29732,26 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.MetricsHealth == nil { - m.MetricsHealth = make(map[string]*GetThrottlerStatusResponse_MetricHealth) + if m.AppCheckedMetrics == nil { + m.AppCheckedMetrics = make(map[string]string) } var mapkey string - var mapvalue *GetThrottlerStatusResponse_MetricHealth + var mapvalue string for iNdEx < postIndex { entryPreIndex := iNdEx var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26576,7 +29768,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26590,11 +29782,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -26602,44 +29794,42 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) iNdEx = postStringIndexmapkey } else if fieldNum == 2 { - var mapmsglen int + var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - mapmsglen |= int(b&0x7F) << shift + stringLenmapvalue |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if mapmsglen < 0 { - return ErrInvalidLength + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return ErrInvalidLength + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength } - if postmsgIndex > l { + if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF } - mapvalue = &GetThrottlerStatusResponse_MetricHealth{} - if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -26647,16 +29837,36 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.MetricsHealth[mapkey] = mapvalue + m.AppCheckedMetrics[mapkey] = mapvalue iNdEx = postIndex - case 15: + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RecentlyChecked", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.RecentlyChecked = bool(v != 0) + case 18: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ThrottledApps", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RecentApps", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26669,26 +29879,26 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.ThrottledApps == nil { - m.ThrottledApps = make(map[string]*topodata.ThrottledAppRule) + if m.RecentApps == nil { + m.RecentApps = make(map[string]*GetThrottlerStatusResponse_RecentApp) } var mapkey string - var mapvalue *topodata.ThrottledAppRule + var mapvalue *GetThrottlerStatusResponse_RecentApp for iNdEx < postIndex { entryPreIndex := iNdEx var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26705,7 +29915,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26719,11 +29929,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -26734,7 +29944,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26747,28 +29957,28 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF } - mapvalue = &topodata.ThrottledAppRule{} + mapvalue = &GetThrottlerStatusResponse_RecentApp{} if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { return err } iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -26776,16 +29986,67 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.ThrottledApps[mapkey] = mapvalue + m.RecentApps[mapkey] = mapvalue iNdEx = postIndex - case 16: + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeTagsRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeTagsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeTagsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppCheckedMetrics", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Tags", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26798,17 +30059,17 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.AppCheckedMetrics == nil { - m.AppCheckedMetrics = make(map[string]string) + if m.Tags == nil { + m.Tags = make(map[string]string) } var mapkey string var mapvalue string @@ -26817,7 +30078,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26834,7 +30095,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26848,11 +30109,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -26863,7 +30124,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26877,11 +30138,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapvalue := int(stringLenmapvalue) if intStringLenmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapvalue := iNdEx + intStringLenmapvalue if postStringIndexmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF @@ -26890,12 +30151,12 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -26903,16 +30164,16 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.AppCheckedMetrics[mapkey] = mapvalue + m.Tags[mapkey] = mapvalue iNdEx = postIndex - case 17: + case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RecentlyChecked", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Replace", wireType) } var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26924,15 +30185,66 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { break } } - m.RecentlyChecked = bool(v != 0) - case 18: + m.Replace = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeTagsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeTagsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeTagsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RecentApps", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Tags", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26945,26 +30257,26 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.RecentApps == nil { - m.RecentApps = make(map[string]*GetThrottlerStatusResponse_RecentApp) + if m.Tags == nil { + m.Tags = make(map[string]string) } var mapkey string - var mapvalue *GetThrottlerStatusResponse_RecentApp + var mapvalue string for iNdEx < postIndex { entryPreIndex := iNdEx var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26981,7 +30293,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26995,11 +30307,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -27007,44 +30319,42 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) iNdEx = postStringIndexmapkey } else if fieldNum == 2 { - var mapmsglen int + var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - mapmsglen |= int(b&0x7F) << shift + stringLenmapvalue |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if mapmsglen < 0 { - return ErrInvalidLength + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return ErrInvalidLength + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength } - if postmsgIndex > l { + if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF } - mapvalue = &GetThrottlerStatusResponse_RecentApp{} - if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -27052,16 +30362,16 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.RecentApps[mapkey] = mapvalue + m.Tags[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -27076,88 +30386,3 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go index 20901efac86..564c6f2e0ba 100644 --- a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go +++ b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go @@ -45,7 +45,7 @@ var file_tabletmanagerservice_proto_rawDesc = []byte{ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x17, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xdc, 0x32, 0x0a, 0x0d, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xa5, 0x3a, 0x0a, 0x0d, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, @@ -94,487 +94,563 @@ var file_tabletmanagerservice_proto_rawDesc = []byte{ 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x24, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x61, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, - 0x0c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x26, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6a, 0x0a, 0x0f, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, - 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x6e, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x5b, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x24, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, + 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0b, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x25, 0x2e, 0x74, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x67, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x0c, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x26, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, + 0x0f, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0e, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x28, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, + 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0b, 0x41, 0x70, 0x70, + 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, + 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0e, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x53, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0a, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x12, 0x24, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x61, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x61, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, - 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x0c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x62, 0x61, 0x12, 0x2b, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, - 0x44, 0x62, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x61, 0x62, + 0x22, 0x00, 0x12, 0x61, 0x0a, 0x0c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x62, 0x61, 0x12, 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x62, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7f, 0x0a, 0x16, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x44, 0x62, 0x61, 0x12, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x62, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x62, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7f, 0x0a, 0x16, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x6c, 0x6c, - 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x76, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x62, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7f, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x62, + 0x61, 0x12, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x62, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x62, 0x61, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7f, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x6c, 0x6c, 0x50, 0x72, 0x69, - 0x76, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, - 0x70, 0x12, 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x76, 0x73, 0x12, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x12, 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, - 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x64, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x0f, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, + 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x0f, 0x52, 0x65, 0x61, 0x64, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, + 0x61, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x76, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x10, 0x4d, 0x79, + 0x73, 0x71, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2a, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x79, 0x73, 0x71, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x0d, 0x50, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6a, 0x0a, 0x0f, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x0f, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, - 0x72, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, + 0x0f, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, - 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x0f, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7f, 0x0a, 0x16, 0x53, 0x74, - 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, - 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, - 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x10, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x1a, 0x53, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7f, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, + 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x41, + 0x66, 0x74, 0x65, 0x72, 0x12, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x41, 0x66, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, - 0x6e, 0x74, 0x69, 0x6c, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, - 0x74, 0x69, 0x6c, 0x41, 0x66, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x35, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x41, 0x66, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x41, 0x66, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, + 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x34, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x85, 0x01, 0x0a, 0x18, + 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x32, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x85, 0x01, 0x0a, 0x18, 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, 0x70, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x85, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x12, 0x32, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x48, 0x61, 0x73, 0x56, 0x52, 0x65, + 0x12, 0x32, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x85, 0x01, 0x0a, - 0x18, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x32, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x19, + 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x33, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x12, 0x33, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, - 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6d, 0x0a, 0x10, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x78, 0x65, 0x63, 0x12, 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7f, - 0x0a, 0x16, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x12, 0x30, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, - 0x50, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x69, 0x74, 0x46, - 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x8b, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x34, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x8e, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8e, 0x01, - 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x35, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x35, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, - 0x0a, 0x05, 0x56, 0x44, 0x69, 0x66, 0x66, 0x12, 0x1f, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, - 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, - 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x10, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, + 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9a, 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x10, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x12, 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x7f, 0x0a, 0x16, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x12, 0x30, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x69, 0x74, + 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, + 0x69, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x05, 0x56, 0x44, 0x69, 0x66, 0x66, 0x12, 0x1f, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0b, 0x49, - 0x6e, 0x69, 0x74, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, - 0x6e, 0x69, 0x74, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x82, 0x01, 0x0a, 0x17, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x6d, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5e, 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x25, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x82, 0x01, 0x0a, 0x17, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x31, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x31, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x70, 0x75, - 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, - 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4a, - 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5e, 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, - 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, + 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x82, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x31, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0b, 0x49, 0x6e, 0x69, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x64, 0x0a, 0x0d, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x12, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x61, 0x62, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x0d, 0x44, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x27, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, 0x55, 0x6e, 0x64, 0x6f, 0x44, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2b, 0x2e, 0x74, 0x61, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x70, 0x0a, 0x11, 0x55, 0x6e, 0x64, 0x6f, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x6e, 0x64, 0x6f, 0x44, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x6e, 0x64, 0x6f, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x73, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x50, + 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x55, 0x6e, 0x64, 0x6f, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x6e, 0x64, - 0x6f, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x73, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x2c, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, - 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6d, 0x6f, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8b, 0x01, - 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x34, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0a, 0x46, - 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, - 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x76, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, - 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x2d, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8e, 0x01, 0x0a, 0x1b, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x6e, 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x2e, 0x74, 0x61, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0a, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, 0x6c, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x79, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x76, 0x0a, 0x13, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x12, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, + 0x61, 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x57, 0x61, + 0x73, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x8e, 0x01, 0x0a, 0x1b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x6e, 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0e, - 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, - 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x06, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, - 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x72, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2b, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x67, 0x0a, 0x0e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x12, 0x28, - 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x73, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x2e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x33, 0x5a, 0x31, 0x76, 0x69, - 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, - 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x64, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x12, 0x28, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x6d, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, + 0x0a, 0x06, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x72, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2b, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, + 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x67, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x73, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0x33, 0x5a, 0x31, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, + 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_tabletmanagerservice_proto_goTypes = []any{ - (*tabletmanagerdata.PingRequest)(nil), // 0: tabletmanagerdata.PingRequest - (*tabletmanagerdata.SleepRequest)(nil), // 1: tabletmanagerdata.SleepRequest - (*tabletmanagerdata.ExecuteHookRequest)(nil), // 2: tabletmanagerdata.ExecuteHookRequest - (*tabletmanagerdata.GetSchemaRequest)(nil), // 3: tabletmanagerdata.GetSchemaRequest - (*tabletmanagerdata.GetPermissionsRequest)(nil), // 4: tabletmanagerdata.GetPermissionsRequest - (*tabletmanagerdata.GetGlobalStatusVarsRequest)(nil), // 5: tabletmanagerdata.GetGlobalStatusVarsRequest - (*tabletmanagerdata.SetReadOnlyRequest)(nil), // 6: tabletmanagerdata.SetReadOnlyRequest - (*tabletmanagerdata.SetReadWriteRequest)(nil), // 7: tabletmanagerdata.SetReadWriteRequest - (*tabletmanagerdata.ChangeTypeRequest)(nil), // 8: tabletmanagerdata.ChangeTypeRequest - (*tabletmanagerdata.RefreshStateRequest)(nil), // 9: tabletmanagerdata.RefreshStateRequest - (*tabletmanagerdata.RunHealthCheckRequest)(nil), // 10: tabletmanagerdata.RunHealthCheckRequest - (*tabletmanagerdata.ReloadSchemaRequest)(nil), // 11: tabletmanagerdata.ReloadSchemaRequest - (*tabletmanagerdata.PreflightSchemaRequest)(nil), // 12: tabletmanagerdata.PreflightSchemaRequest - (*tabletmanagerdata.ApplySchemaRequest)(nil), // 13: tabletmanagerdata.ApplySchemaRequest - (*tabletmanagerdata.ResetSequencesRequest)(nil), // 14: tabletmanagerdata.ResetSequencesRequest - (*tabletmanagerdata.LockTablesRequest)(nil), // 15: tabletmanagerdata.LockTablesRequest - (*tabletmanagerdata.UnlockTablesRequest)(nil), // 16: tabletmanagerdata.UnlockTablesRequest - (*tabletmanagerdata.ExecuteQueryRequest)(nil), // 17: tabletmanagerdata.ExecuteQueryRequest - (*tabletmanagerdata.ExecuteFetchAsDbaRequest)(nil), // 18: tabletmanagerdata.ExecuteFetchAsDbaRequest - (*tabletmanagerdata.ExecuteMultiFetchAsDbaRequest)(nil), // 19: tabletmanagerdata.ExecuteMultiFetchAsDbaRequest - (*tabletmanagerdata.ExecuteFetchAsAllPrivsRequest)(nil), // 20: tabletmanagerdata.ExecuteFetchAsAllPrivsRequest - (*tabletmanagerdata.ExecuteFetchAsAppRequest)(nil), // 21: tabletmanagerdata.ExecuteFetchAsAppRequest - (*tabletmanagerdata.ReplicationStatusRequest)(nil), // 22: tabletmanagerdata.ReplicationStatusRequest - (*tabletmanagerdata.PrimaryStatusRequest)(nil), // 23: tabletmanagerdata.PrimaryStatusRequest - (*tabletmanagerdata.PrimaryPositionRequest)(nil), // 24: tabletmanagerdata.PrimaryPositionRequest - (*tabletmanagerdata.WaitForPositionRequest)(nil), // 25: tabletmanagerdata.WaitForPositionRequest - (*tabletmanagerdata.StopReplicationRequest)(nil), // 26: tabletmanagerdata.StopReplicationRequest - (*tabletmanagerdata.StopReplicationMinimumRequest)(nil), // 27: tabletmanagerdata.StopReplicationMinimumRequest - (*tabletmanagerdata.StartReplicationRequest)(nil), // 28: tabletmanagerdata.StartReplicationRequest - (*tabletmanagerdata.StartReplicationUntilAfterRequest)(nil), // 29: tabletmanagerdata.StartReplicationUntilAfterRequest - (*tabletmanagerdata.GetReplicasRequest)(nil), // 30: tabletmanagerdata.GetReplicasRequest - (*tabletmanagerdata.CreateVReplicationWorkflowRequest)(nil), // 31: tabletmanagerdata.CreateVReplicationWorkflowRequest - (*tabletmanagerdata.DeleteVReplicationWorkflowRequest)(nil), // 32: tabletmanagerdata.DeleteVReplicationWorkflowRequest - (*tabletmanagerdata.HasVReplicationWorkflowsRequest)(nil), // 33: tabletmanagerdata.HasVReplicationWorkflowsRequest - (*tabletmanagerdata.ReadVReplicationWorkflowRequest)(nil), // 34: tabletmanagerdata.ReadVReplicationWorkflowRequest - (*tabletmanagerdata.ReadVReplicationWorkflowsRequest)(nil), // 35: tabletmanagerdata.ReadVReplicationWorkflowsRequest - (*tabletmanagerdata.VReplicationExecRequest)(nil), // 36: tabletmanagerdata.VReplicationExecRequest - (*tabletmanagerdata.VReplicationWaitForPosRequest)(nil), // 37: tabletmanagerdata.VReplicationWaitForPosRequest - (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 38: tabletmanagerdata.UpdateVReplicationWorkflowRequest - (*tabletmanagerdata.UpdateVReplicationWorkflowsRequest)(nil), // 39: tabletmanagerdata.UpdateVReplicationWorkflowsRequest - (*tabletmanagerdata.VDiffRequest)(nil), // 40: tabletmanagerdata.VDiffRequest - (*tabletmanagerdata.ResetReplicationRequest)(nil), // 41: tabletmanagerdata.ResetReplicationRequest - (*tabletmanagerdata.InitPrimaryRequest)(nil), // 42: tabletmanagerdata.InitPrimaryRequest - (*tabletmanagerdata.PopulateReparentJournalRequest)(nil), // 43: tabletmanagerdata.PopulateReparentJournalRequest - (*tabletmanagerdata.InitReplicaRequest)(nil), // 44: tabletmanagerdata.InitReplicaRequest - (*tabletmanagerdata.DemotePrimaryRequest)(nil), // 45: tabletmanagerdata.DemotePrimaryRequest - (*tabletmanagerdata.UndoDemotePrimaryRequest)(nil), // 46: tabletmanagerdata.UndoDemotePrimaryRequest - (*tabletmanagerdata.ReplicaWasPromotedRequest)(nil), // 47: tabletmanagerdata.ReplicaWasPromotedRequest - (*tabletmanagerdata.ResetReplicationParametersRequest)(nil), // 48: tabletmanagerdata.ResetReplicationParametersRequest - (*tabletmanagerdata.FullStatusRequest)(nil), // 49: tabletmanagerdata.FullStatusRequest - (*tabletmanagerdata.SetReplicationSourceRequest)(nil), // 50: tabletmanagerdata.SetReplicationSourceRequest - (*tabletmanagerdata.ReplicaWasRestartedRequest)(nil), // 51: tabletmanagerdata.ReplicaWasRestartedRequest - (*tabletmanagerdata.StopReplicationAndGetStatusRequest)(nil), // 52: tabletmanagerdata.StopReplicationAndGetStatusRequest - (*tabletmanagerdata.PromoteReplicaRequest)(nil), // 53: tabletmanagerdata.PromoteReplicaRequest - (*tabletmanagerdata.BackupRequest)(nil), // 54: tabletmanagerdata.BackupRequest - (*tabletmanagerdata.RestoreFromBackupRequest)(nil), // 55: tabletmanagerdata.RestoreFromBackupRequest - (*tabletmanagerdata.CheckThrottlerRequest)(nil), // 56: tabletmanagerdata.CheckThrottlerRequest - (*tabletmanagerdata.GetThrottlerStatusRequest)(nil), // 57: tabletmanagerdata.GetThrottlerStatusRequest - (*tabletmanagerdata.PingResponse)(nil), // 58: tabletmanagerdata.PingResponse - (*tabletmanagerdata.SleepResponse)(nil), // 59: tabletmanagerdata.SleepResponse - (*tabletmanagerdata.ExecuteHookResponse)(nil), // 60: tabletmanagerdata.ExecuteHookResponse - (*tabletmanagerdata.GetSchemaResponse)(nil), // 61: tabletmanagerdata.GetSchemaResponse - (*tabletmanagerdata.GetPermissionsResponse)(nil), // 62: tabletmanagerdata.GetPermissionsResponse - (*tabletmanagerdata.GetGlobalStatusVarsResponse)(nil), // 63: tabletmanagerdata.GetGlobalStatusVarsResponse - (*tabletmanagerdata.SetReadOnlyResponse)(nil), // 64: tabletmanagerdata.SetReadOnlyResponse - (*tabletmanagerdata.SetReadWriteResponse)(nil), // 65: tabletmanagerdata.SetReadWriteResponse - (*tabletmanagerdata.ChangeTypeResponse)(nil), // 66: tabletmanagerdata.ChangeTypeResponse - (*tabletmanagerdata.RefreshStateResponse)(nil), // 67: tabletmanagerdata.RefreshStateResponse - (*tabletmanagerdata.RunHealthCheckResponse)(nil), // 68: tabletmanagerdata.RunHealthCheckResponse - (*tabletmanagerdata.ReloadSchemaResponse)(nil), // 69: tabletmanagerdata.ReloadSchemaResponse - (*tabletmanagerdata.PreflightSchemaResponse)(nil), // 70: tabletmanagerdata.PreflightSchemaResponse - (*tabletmanagerdata.ApplySchemaResponse)(nil), // 71: tabletmanagerdata.ApplySchemaResponse - (*tabletmanagerdata.ResetSequencesResponse)(nil), // 72: tabletmanagerdata.ResetSequencesResponse - (*tabletmanagerdata.LockTablesResponse)(nil), // 73: tabletmanagerdata.LockTablesResponse - (*tabletmanagerdata.UnlockTablesResponse)(nil), // 74: tabletmanagerdata.UnlockTablesResponse - (*tabletmanagerdata.ExecuteQueryResponse)(nil), // 75: tabletmanagerdata.ExecuteQueryResponse - (*tabletmanagerdata.ExecuteFetchAsDbaResponse)(nil), // 76: tabletmanagerdata.ExecuteFetchAsDbaResponse - (*tabletmanagerdata.ExecuteMultiFetchAsDbaResponse)(nil), // 77: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse - (*tabletmanagerdata.ExecuteFetchAsAllPrivsResponse)(nil), // 78: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse - (*tabletmanagerdata.ExecuteFetchAsAppResponse)(nil), // 79: tabletmanagerdata.ExecuteFetchAsAppResponse - (*tabletmanagerdata.ReplicationStatusResponse)(nil), // 80: tabletmanagerdata.ReplicationStatusResponse - (*tabletmanagerdata.PrimaryStatusResponse)(nil), // 81: tabletmanagerdata.PrimaryStatusResponse - (*tabletmanagerdata.PrimaryPositionResponse)(nil), // 82: tabletmanagerdata.PrimaryPositionResponse - (*tabletmanagerdata.WaitForPositionResponse)(nil), // 83: tabletmanagerdata.WaitForPositionResponse - (*tabletmanagerdata.StopReplicationResponse)(nil), // 84: tabletmanagerdata.StopReplicationResponse - (*tabletmanagerdata.StopReplicationMinimumResponse)(nil), // 85: tabletmanagerdata.StopReplicationMinimumResponse - (*tabletmanagerdata.StartReplicationResponse)(nil), // 86: tabletmanagerdata.StartReplicationResponse - (*tabletmanagerdata.StartReplicationUntilAfterResponse)(nil), // 87: tabletmanagerdata.StartReplicationUntilAfterResponse - (*tabletmanagerdata.GetReplicasResponse)(nil), // 88: tabletmanagerdata.GetReplicasResponse - (*tabletmanagerdata.CreateVReplicationWorkflowResponse)(nil), // 89: tabletmanagerdata.CreateVReplicationWorkflowResponse - (*tabletmanagerdata.DeleteVReplicationWorkflowResponse)(nil), // 90: tabletmanagerdata.DeleteVReplicationWorkflowResponse - (*tabletmanagerdata.HasVReplicationWorkflowsResponse)(nil), // 91: tabletmanagerdata.HasVReplicationWorkflowsResponse - (*tabletmanagerdata.ReadVReplicationWorkflowResponse)(nil), // 92: tabletmanagerdata.ReadVReplicationWorkflowResponse - (*tabletmanagerdata.ReadVReplicationWorkflowsResponse)(nil), // 93: tabletmanagerdata.ReadVReplicationWorkflowsResponse - (*tabletmanagerdata.VReplicationExecResponse)(nil), // 94: tabletmanagerdata.VReplicationExecResponse - (*tabletmanagerdata.VReplicationWaitForPosResponse)(nil), // 95: tabletmanagerdata.VReplicationWaitForPosResponse - (*tabletmanagerdata.UpdateVReplicationWorkflowResponse)(nil), // 96: tabletmanagerdata.UpdateVReplicationWorkflowResponse - (*tabletmanagerdata.UpdateVReplicationWorkflowsResponse)(nil), // 97: tabletmanagerdata.UpdateVReplicationWorkflowsResponse - (*tabletmanagerdata.VDiffResponse)(nil), // 98: tabletmanagerdata.VDiffResponse - (*tabletmanagerdata.ResetReplicationResponse)(nil), // 99: tabletmanagerdata.ResetReplicationResponse - (*tabletmanagerdata.InitPrimaryResponse)(nil), // 100: tabletmanagerdata.InitPrimaryResponse - (*tabletmanagerdata.PopulateReparentJournalResponse)(nil), // 101: tabletmanagerdata.PopulateReparentJournalResponse - (*tabletmanagerdata.InitReplicaResponse)(nil), // 102: tabletmanagerdata.InitReplicaResponse - (*tabletmanagerdata.DemotePrimaryResponse)(nil), // 103: tabletmanagerdata.DemotePrimaryResponse - (*tabletmanagerdata.UndoDemotePrimaryResponse)(nil), // 104: tabletmanagerdata.UndoDemotePrimaryResponse - (*tabletmanagerdata.ReplicaWasPromotedResponse)(nil), // 105: tabletmanagerdata.ReplicaWasPromotedResponse - (*tabletmanagerdata.ResetReplicationParametersResponse)(nil), // 106: tabletmanagerdata.ResetReplicationParametersResponse - (*tabletmanagerdata.FullStatusResponse)(nil), // 107: tabletmanagerdata.FullStatusResponse - (*tabletmanagerdata.SetReplicationSourceResponse)(nil), // 108: tabletmanagerdata.SetReplicationSourceResponse - (*tabletmanagerdata.ReplicaWasRestartedResponse)(nil), // 109: tabletmanagerdata.ReplicaWasRestartedResponse - (*tabletmanagerdata.StopReplicationAndGetStatusResponse)(nil), // 110: tabletmanagerdata.StopReplicationAndGetStatusResponse - (*tabletmanagerdata.PromoteReplicaResponse)(nil), // 111: tabletmanagerdata.PromoteReplicaResponse - (*tabletmanagerdata.BackupResponse)(nil), // 112: tabletmanagerdata.BackupResponse - (*tabletmanagerdata.RestoreFromBackupResponse)(nil), // 113: tabletmanagerdata.RestoreFromBackupResponse - (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 114: tabletmanagerdata.CheckThrottlerResponse - (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 115: tabletmanagerdata.GetThrottlerStatusResponse + (*tabletmanagerdata.PingRequest)(nil), // 0: tabletmanagerdata.PingRequest + (*tabletmanagerdata.SleepRequest)(nil), // 1: tabletmanagerdata.SleepRequest + (*tabletmanagerdata.ExecuteHookRequest)(nil), // 2: tabletmanagerdata.ExecuteHookRequest + (*tabletmanagerdata.GetSchemaRequest)(nil), // 3: tabletmanagerdata.GetSchemaRequest + (*tabletmanagerdata.GetPermissionsRequest)(nil), // 4: tabletmanagerdata.GetPermissionsRequest + (*tabletmanagerdata.GetGlobalStatusVarsRequest)(nil), // 5: tabletmanagerdata.GetGlobalStatusVarsRequest + (*tabletmanagerdata.SetReadOnlyRequest)(nil), // 6: tabletmanagerdata.SetReadOnlyRequest + (*tabletmanagerdata.SetReadWriteRequest)(nil), // 7: tabletmanagerdata.SetReadWriteRequest + (*tabletmanagerdata.ChangeTagsRequest)(nil), // 8: tabletmanagerdata.ChangeTagsRequest + (*tabletmanagerdata.ChangeTypeRequest)(nil), // 9: tabletmanagerdata.ChangeTypeRequest + (*tabletmanagerdata.RefreshStateRequest)(nil), // 10: tabletmanagerdata.RefreshStateRequest + (*tabletmanagerdata.RunHealthCheckRequest)(nil), // 11: tabletmanagerdata.RunHealthCheckRequest + (*tabletmanagerdata.ReloadSchemaRequest)(nil), // 12: tabletmanagerdata.ReloadSchemaRequest + (*tabletmanagerdata.PreflightSchemaRequest)(nil), // 13: tabletmanagerdata.PreflightSchemaRequest + (*tabletmanagerdata.ApplySchemaRequest)(nil), // 14: tabletmanagerdata.ApplySchemaRequest + (*tabletmanagerdata.ResetSequencesRequest)(nil), // 15: tabletmanagerdata.ResetSequencesRequest + (*tabletmanagerdata.LockTablesRequest)(nil), // 16: tabletmanagerdata.LockTablesRequest + (*tabletmanagerdata.UnlockTablesRequest)(nil), // 17: tabletmanagerdata.UnlockTablesRequest + (*tabletmanagerdata.ExecuteQueryRequest)(nil), // 18: tabletmanagerdata.ExecuteQueryRequest + (*tabletmanagerdata.ExecuteFetchAsDbaRequest)(nil), // 19: tabletmanagerdata.ExecuteFetchAsDbaRequest + (*tabletmanagerdata.ExecuteMultiFetchAsDbaRequest)(nil), // 20: tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + (*tabletmanagerdata.ExecuteFetchAsAllPrivsRequest)(nil), // 21: tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + (*tabletmanagerdata.ExecuteFetchAsAppRequest)(nil), // 22: tabletmanagerdata.ExecuteFetchAsAppRequest + (*tabletmanagerdata.GetUnresolvedTransactionsRequest)(nil), // 23: tabletmanagerdata.GetUnresolvedTransactionsRequest + (*tabletmanagerdata.ReadTransactionRequest)(nil), // 24: tabletmanagerdata.ReadTransactionRequest + (*tabletmanagerdata.ConcludeTransactionRequest)(nil), // 25: tabletmanagerdata.ConcludeTransactionRequest + (*tabletmanagerdata.MysqlHostMetricsRequest)(nil), // 26: tabletmanagerdata.MysqlHostMetricsRequest + (*tabletmanagerdata.ReplicationStatusRequest)(nil), // 27: tabletmanagerdata.ReplicationStatusRequest + (*tabletmanagerdata.PrimaryStatusRequest)(nil), // 28: tabletmanagerdata.PrimaryStatusRequest + (*tabletmanagerdata.PrimaryPositionRequest)(nil), // 29: tabletmanagerdata.PrimaryPositionRequest + (*tabletmanagerdata.WaitForPositionRequest)(nil), // 30: tabletmanagerdata.WaitForPositionRequest + (*tabletmanagerdata.StopReplicationRequest)(nil), // 31: tabletmanagerdata.StopReplicationRequest + (*tabletmanagerdata.StopReplicationMinimumRequest)(nil), // 32: tabletmanagerdata.StopReplicationMinimumRequest + (*tabletmanagerdata.StartReplicationRequest)(nil), // 33: tabletmanagerdata.StartReplicationRequest + (*tabletmanagerdata.StartReplicationUntilAfterRequest)(nil), // 34: tabletmanagerdata.StartReplicationUntilAfterRequest + (*tabletmanagerdata.GetReplicasRequest)(nil), // 35: tabletmanagerdata.GetReplicasRequest + (*tabletmanagerdata.CreateVReplicationWorkflowRequest)(nil), // 36: tabletmanagerdata.CreateVReplicationWorkflowRequest + (*tabletmanagerdata.DeleteTableDataRequest)(nil), // 37: tabletmanagerdata.DeleteTableDataRequest + (*tabletmanagerdata.DeleteVReplicationWorkflowRequest)(nil), // 38: tabletmanagerdata.DeleteVReplicationWorkflowRequest + (*tabletmanagerdata.HasVReplicationWorkflowsRequest)(nil), // 39: tabletmanagerdata.HasVReplicationWorkflowsRequest + (*tabletmanagerdata.ReadVReplicationWorkflowRequest)(nil), // 40: tabletmanagerdata.ReadVReplicationWorkflowRequest + (*tabletmanagerdata.ReadVReplicationWorkflowsRequest)(nil), // 41: tabletmanagerdata.ReadVReplicationWorkflowsRequest + (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 42: tabletmanagerdata.UpdateVReplicationWorkflowRequest + (*tabletmanagerdata.UpdateVReplicationWorkflowsRequest)(nil), // 43: tabletmanagerdata.UpdateVReplicationWorkflowsRequest + (*tabletmanagerdata.ValidateVReplicationPermissionsRequest)(nil), // 44: tabletmanagerdata.ValidateVReplicationPermissionsRequest + (*tabletmanagerdata.VReplicationExecRequest)(nil), // 45: tabletmanagerdata.VReplicationExecRequest + (*tabletmanagerdata.VReplicationWaitForPosRequest)(nil), // 46: tabletmanagerdata.VReplicationWaitForPosRequest + (*tabletmanagerdata.VDiffRequest)(nil), // 47: tabletmanagerdata.VDiffRequest + (*tabletmanagerdata.ResetReplicationRequest)(nil), // 48: tabletmanagerdata.ResetReplicationRequest + (*tabletmanagerdata.InitPrimaryRequest)(nil), // 49: tabletmanagerdata.InitPrimaryRequest + (*tabletmanagerdata.PopulateReparentJournalRequest)(nil), // 50: tabletmanagerdata.PopulateReparentJournalRequest + (*tabletmanagerdata.ReadReparentJournalInfoRequest)(nil), // 51: tabletmanagerdata.ReadReparentJournalInfoRequest + (*tabletmanagerdata.InitReplicaRequest)(nil), // 52: tabletmanagerdata.InitReplicaRequest + (*tabletmanagerdata.DemotePrimaryRequest)(nil), // 53: tabletmanagerdata.DemotePrimaryRequest + (*tabletmanagerdata.UndoDemotePrimaryRequest)(nil), // 54: tabletmanagerdata.UndoDemotePrimaryRequest + (*tabletmanagerdata.ReplicaWasPromotedRequest)(nil), // 55: tabletmanagerdata.ReplicaWasPromotedRequest + (*tabletmanagerdata.ResetReplicationParametersRequest)(nil), // 56: tabletmanagerdata.ResetReplicationParametersRequest + (*tabletmanagerdata.FullStatusRequest)(nil), // 57: tabletmanagerdata.FullStatusRequest + (*tabletmanagerdata.SetReplicationSourceRequest)(nil), // 58: tabletmanagerdata.SetReplicationSourceRequest + (*tabletmanagerdata.ReplicaWasRestartedRequest)(nil), // 59: tabletmanagerdata.ReplicaWasRestartedRequest + (*tabletmanagerdata.StopReplicationAndGetStatusRequest)(nil), // 60: tabletmanagerdata.StopReplicationAndGetStatusRequest + (*tabletmanagerdata.PromoteReplicaRequest)(nil), // 61: tabletmanagerdata.PromoteReplicaRequest + (*tabletmanagerdata.BackupRequest)(nil), // 62: tabletmanagerdata.BackupRequest + (*tabletmanagerdata.RestoreFromBackupRequest)(nil), // 63: tabletmanagerdata.RestoreFromBackupRequest + (*tabletmanagerdata.CheckThrottlerRequest)(nil), // 64: tabletmanagerdata.CheckThrottlerRequest + (*tabletmanagerdata.GetThrottlerStatusRequest)(nil), // 65: tabletmanagerdata.GetThrottlerStatusRequest + (*tabletmanagerdata.PingResponse)(nil), // 66: tabletmanagerdata.PingResponse + (*tabletmanagerdata.SleepResponse)(nil), // 67: tabletmanagerdata.SleepResponse + (*tabletmanagerdata.ExecuteHookResponse)(nil), // 68: tabletmanagerdata.ExecuteHookResponse + (*tabletmanagerdata.GetSchemaResponse)(nil), // 69: tabletmanagerdata.GetSchemaResponse + (*tabletmanagerdata.GetPermissionsResponse)(nil), // 70: tabletmanagerdata.GetPermissionsResponse + (*tabletmanagerdata.GetGlobalStatusVarsResponse)(nil), // 71: tabletmanagerdata.GetGlobalStatusVarsResponse + (*tabletmanagerdata.SetReadOnlyResponse)(nil), // 72: tabletmanagerdata.SetReadOnlyResponse + (*tabletmanagerdata.SetReadWriteResponse)(nil), // 73: tabletmanagerdata.SetReadWriteResponse + (*tabletmanagerdata.ChangeTagsResponse)(nil), // 74: tabletmanagerdata.ChangeTagsResponse + (*tabletmanagerdata.ChangeTypeResponse)(nil), // 75: tabletmanagerdata.ChangeTypeResponse + (*tabletmanagerdata.RefreshStateResponse)(nil), // 76: tabletmanagerdata.RefreshStateResponse + (*tabletmanagerdata.RunHealthCheckResponse)(nil), // 77: tabletmanagerdata.RunHealthCheckResponse + (*tabletmanagerdata.ReloadSchemaResponse)(nil), // 78: tabletmanagerdata.ReloadSchemaResponse + (*tabletmanagerdata.PreflightSchemaResponse)(nil), // 79: tabletmanagerdata.PreflightSchemaResponse + (*tabletmanagerdata.ApplySchemaResponse)(nil), // 80: tabletmanagerdata.ApplySchemaResponse + (*tabletmanagerdata.ResetSequencesResponse)(nil), // 81: tabletmanagerdata.ResetSequencesResponse + (*tabletmanagerdata.LockTablesResponse)(nil), // 82: tabletmanagerdata.LockTablesResponse + (*tabletmanagerdata.UnlockTablesResponse)(nil), // 83: tabletmanagerdata.UnlockTablesResponse + (*tabletmanagerdata.ExecuteQueryResponse)(nil), // 84: tabletmanagerdata.ExecuteQueryResponse + (*tabletmanagerdata.ExecuteFetchAsDbaResponse)(nil), // 85: tabletmanagerdata.ExecuteFetchAsDbaResponse + (*tabletmanagerdata.ExecuteMultiFetchAsDbaResponse)(nil), // 86: tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + (*tabletmanagerdata.ExecuteFetchAsAllPrivsResponse)(nil), // 87: tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + (*tabletmanagerdata.ExecuteFetchAsAppResponse)(nil), // 88: tabletmanagerdata.ExecuteFetchAsAppResponse + (*tabletmanagerdata.GetUnresolvedTransactionsResponse)(nil), // 89: tabletmanagerdata.GetUnresolvedTransactionsResponse + (*tabletmanagerdata.ReadTransactionResponse)(nil), // 90: tabletmanagerdata.ReadTransactionResponse + (*tabletmanagerdata.ConcludeTransactionResponse)(nil), // 91: tabletmanagerdata.ConcludeTransactionResponse + (*tabletmanagerdata.MysqlHostMetricsResponse)(nil), // 92: tabletmanagerdata.MysqlHostMetricsResponse + (*tabletmanagerdata.ReplicationStatusResponse)(nil), // 93: tabletmanagerdata.ReplicationStatusResponse + (*tabletmanagerdata.PrimaryStatusResponse)(nil), // 94: tabletmanagerdata.PrimaryStatusResponse + (*tabletmanagerdata.PrimaryPositionResponse)(nil), // 95: tabletmanagerdata.PrimaryPositionResponse + (*tabletmanagerdata.WaitForPositionResponse)(nil), // 96: tabletmanagerdata.WaitForPositionResponse + (*tabletmanagerdata.StopReplicationResponse)(nil), // 97: tabletmanagerdata.StopReplicationResponse + (*tabletmanagerdata.StopReplicationMinimumResponse)(nil), // 98: tabletmanagerdata.StopReplicationMinimumResponse + (*tabletmanagerdata.StartReplicationResponse)(nil), // 99: tabletmanagerdata.StartReplicationResponse + (*tabletmanagerdata.StartReplicationUntilAfterResponse)(nil), // 100: tabletmanagerdata.StartReplicationUntilAfterResponse + (*tabletmanagerdata.GetReplicasResponse)(nil), // 101: tabletmanagerdata.GetReplicasResponse + (*tabletmanagerdata.CreateVReplicationWorkflowResponse)(nil), // 102: tabletmanagerdata.CreateVReplicationWorkflowResponse + (*tabletmanagerdata.DeleteTableDataResponse)(nil), // 103: tabletmanagerdata.DeleteTableDataResponse + (*tabletmanagerdata.DeleteVReplicationWorkflowResponse)(nil), // 104: tabletmanagerdata.DeleteVReplicationWorkflowResponse + (*tabletmanagerdata.HasVReplicationWorkflowsResponse)(nil), // 105: tabletmanagerdata.HasVReplicationWorkflowsResponse + (*tabletmanagerdata.ReadVReplicationWorkflowResponse)(nil), // 106: tabletmanagerdata.ReadVReplicationWorkflowResponse + (*tabletmanagerdata.ReadVReplicationWorkflowsResponse)(nil), // 107: tabletmanagerdata.ReadVReplicationWorkflowsResponse + (*tabletmanagerdata.UpdateVReplicationWorkflowResponse)(nil), // 108: tabletmanagerdata.UpdateVReplicationWorkflowResponse + (*tabletmanagerdata.UpdateVReplicationWorkflowsResponse)(nil), // 109: tabletmanagerdata.UpdateVReplicationWorkflowsResponse + (*tabletmanagerdata.ValidateVReplicationPermissionsResponse)(nil), // 110: tabletmanagerdata.ValidateVReplicationPermissionsResponse + (*tabletmanagerdata.VReplicationExecResponse)(nil), // 111: tabletmanagerdata.VReplicationExecResponse + (*tabletmanagerdata.VReplicationWaitForPosResponse)(nil), // 112: tabletmanagerdata.VReplicationWaitForPosResponse + (*tabletmanagerdata.VDiffResponse)(nil), // 113: tabletmanagerdata.VDiffResponse + (*tabletmanagerdata.ResetReplicationResponse)(nil), // 114: tabletmanagerdata.ResetReplicationResponse + (*tabletmanagerdata.InitPrimaryResponse)(nil), // 115: tabletmanagerdata.InitPrimaryResponse + (*tabletmanagerdata.PopulateReparentJournalResponse)(nil), // 116: tabletmanagerdata.PopulateReparentJournalResponse + (*tabletmanagerdata.ReadReparentJournalInfoResponse)(nil), // 117: tabletmanagerdata.ReadReparentJournalInfoResponse + (*tabletmanagerdata.InitReplicaResponse)(nil), // 118: tabletmanagerdata.InitReplicaResponse + (*tabletmanagerdata.DemotePrimaryResponse)(nil), // 119: tabletmanagerdata.DemotePrimaryResponse + (*tabletmanagerdata.UndoDemotePrimaryResponse)(nil), // 120: tabletmanagerdata.UndoDemotePrimaryResponse + (*tabletmanagerdata.ReplicaWasPromotedResponse)(nil), // 121: tabletmanagerdata.ReplicaWasPromotedResponse + (*tabletmanagerdata.ResetReplicationParametersResponse)(nil), // 122: tabletmanagerdata.ResetReplicationParametersResponse + (*tabletmanagerdata.FullStatusResponse)(nil), // 123: tabletmanagerdata.FullStatusResponse + (*tabletmanagerdata.SetReplicationSourceResponse)(nil), // 124: tabletmanagerdata.SetReplicationSourceResponse + (*tabletmanagerdata.ReplicaWasRestartedResponse)(nil), // 125: tabletmanagerdata.ReplicaWasRestartedResponse + (*tabletmanagerdata.StopReplicationAndGetStatusResponse)(nil), // 126: tabletmanagerdata.StopReplicationAndGetStatusResponse + (*tabletmanagerdata.PromoteReplicaResponse)(nil), // 127: tabletmanagerdata.PromoteReplicaResponse + (*tabletmanagerdata.BackupResponse)(nil), // 128: tabletmanagerdata.BackupResponse + (*tabletmanagerdata.RestoreFromBackupResponse)(nil), // 129: tabletmanagerdata.RestoreFromBackupResponse + (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 130: tabletmanagerdata.CheckThrottlerResponse + (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 131: tabletmanagerdata.GetThrottlerStatusResponse } var file_tabletmanagerservice_proto_depIdxs = []int32{ 0, // 0: tabletmanagerservice.TabletManager.Ping:input_type -> tabletmanagerdata.PingRequest @@ -585,116 +661,132 @@ var file_tabletmanagerservice_proto_depIdxs = []int32{ 5, // 5: tabletmanagerservice.TabletManager.GetGlobalStatusVars:input_type -> tabletmanagerdata.GetGlobalStatusVarsRequest 6, // 6: tabletmanagerservice.TabletManager.SetReadOnly:input_type -> tabletmanagerdata.SetReadOnlyRequest 7, // 7: tabletmanagerservice.TabletManager.SetReadWrite:input_type -> tabletmanagerdata.SetReadWriteRequest - 8, // 8: tabletmanagerservice.TabletManager.ChangeType:input_type -> tabletmanagerdata.ChangeTypeRequest - 9, // 9: tabletmanagerservice.TabletManager.RefreshState:input_type -> tabletmanagerdata.RefreshStateRequest - 10, // 10: tabletmanagerservice.TabletManager.RunHealthCheck:input_type -> tabletmanagerdata.RunHealthCheckRequest - 11, // 11: tabletmanagerservice.TabletManager.ReloadSchema:input_type -> tabletmanagerdata.ReloadSchemaRequest - 12, // 12: tabletmanagerservice.TabletManager.PreflightSchema:input_type -> tabletmanagerdata.PreflightSchemaRequest - 13, // 13: tabletmanagerservice.TabletManager.ApplySchema:input_type -> tabletmanagerdata.ApplySchemaRequest - 14, // 14: tabletmanagerservice.TabletManager.ResetSequences:input_type -> tabletmanagerdata.ResetSequencesRequest - 15, // 15: tabletmanagerservice.TabletManager.LockTables:input_type -> tabletmanagerdata.LockTablesRequest - 16, // 16: tabletmanagerservice.TabletManager.UnlockTables:input_type -> tabletmanagerdata.UnlockTablesRequest - 17, // 17: tabletmanagerservice.TabletManager.ExecuteQuery:input_type -> tabletmanagerdata.ExecuteQueryRequest - 18, // 18: tabletmanagerservice.TabletManager.ExecuteFetchAsDba:input_type -> tabletmanagerdata.ExecuteFetchAsDbaRequest - 19, // 19: tabletmanagerservice.TabletManager.ExecuteMultiFetchAsDba:input_type -> tabletmanagerdata.ExecuteMultiFetchAsDbaRequest - 20, // 20: tabletmanagerservice.TabletManager.ExecuteFetchAsAllPrivs:input_type -> tabletmanagerdata.ExecuteFetchAsAllPrivsRequest - 21, // 21: tabletmanagerservice.TabletManager.ExecuteFetchAsApp:input_type -> tabletmanagerdata.ExecuteFetchAsAppRequest - 22, // 22: tabletmanagerservice.TabletManager.ReplicationStatus:input_type -> tabletmanagerdata.ReplicationStatusRequest - 23, // 23: tabletmanagerservice.TabletManager.PrimaryStatus:input_type -> tabletmanagerdata.PrimaryStatusRequest - 24, // 24: tabletmanagerservice.TabletManager.PrimaryPosition:input_type -> tabletmanagerdata.PrimaryPositionRequest - 25, // 25: tabletmanagerservice.TabletManager.WaitForPosition:input_type -> tabletmanagerdata.WaitForPositionRequest - 26, // 26: tabletmanagerservice.TabletManager.StopReplication:input_type -> tabletmanagerdata.StopReplicationRequest - 27, // 27: tabletmanagerservice.TabletManager.StopReplicationMinimum:input_type -> tabletmanagerdata.StopReplicationMinimumRequest - 28, // 28: tabletmanagerservice.TabletManager.StartReplication:input_type -> tabletmanagerdata.StartReplicationRequest - 29, // 29: tabletmanagerservice.TabletManager.StartReplicationUntilAfter:input_type -> tabletmanagerdata.StartReplicationUntilAfterRequest - 30, // 30: tabletmanagerservice.TabletManager.GetReplicas:input_type -> tabletmanagerdata.GetReplicasRequest - 31, // 31: tabletmanagerservice.TabletManager.CreateVReplicationWorkflow:input_type -> tabletmanagerdata.CreateVReplicationWorkflowRequest - 32, // 32: tabletmanagerservice.TabletManager.DeleteVReplicationWorkflow:input_type -> tabletmanagerdata.DeleteVReplicationWorkflowRequest - 33, // 33: tabletmanagerservice.TabletManager.HasVReplicationWorkflows:input_type -> tabletmanagerdata.HasVReplicationWorkflowsRequest - 34, // 34: tabletmanagerservice.TabletManager.ReadVReplicationWorkflow:input_type -> tabletmanagerdata.ReadVReplicationWorkflowRequest - 35, // 35: tabletmanagerservice.TabletManager.ReadVReplicationWorkflows:input_type -> tabletmanagerdata.ReadVReplicationWorkflowsRequest - 36, // 36: tabletmanagerservice.TabletManager.VReplicationExec:input_type -> tabletmanagerdata.VReplicationExecRequest - 37, // 37: tabletmanagerservice.TabletManager.VReplicationWaitForPos:input_type -> tabletmanagerdata.VReplicationWaitForPosRequest - 38, // 38: tabletmanagerservice.TabletManager.UpdateVReplicationWorkflow:input_type -> tabletmanagerdata.UpdateVReplicationWorkflowRequest - 39, // 39: tabletmanagerservice.TabletManager.UpdateVReplicationWorkflows:input_type -> tabletmanagerdata.UpdateVReplicationWorkflowsRequest - 40, // 40: tabletmanagerservice.TabletManager.VDiff:input_type -> tabletmanagerdata.VDiffRequest - 41, // 41: tabletmanagerservice.TabletManager.ResetReplication:input_type -> tabletmanagerdata.ResetReplicationRequest - 42, // 42: tabletmanagerservice.TabletManager.InitPrimary:input_type -> tabletmanagerdata.InitPrimaryRequest - 43, // 43: tabletmanagerservice.TabletManager.PopulateReparentJournal:input_type -> tabletmanagerdata.PopulateReparentJournalRequest - 44, // 44: tabletmanagerservice.TabletManager.InitReplica:input_type -> tabletmanagerdata.InitReplicaRequest - 45, // 45: tabletmanagerservice.TabletManager.DemotePrimary:input_type -> tabletmanagerdata.DemotePrimaryRequest - 46, // 46: tabletmanagerservice.TabletManager.UndoDemotePrimary:input_type -> tabletmanagerdata.UndoDemotePrimaryRequest - 47, // 47: tabletmanagerservice.TabletManager.ReplicaWasPromoted:input_type -> tabletmanagerdata.ReplicaWasPromotedRequest - 48, // 48: tabletmanagerservice.TabletManager.ResetReplicationParameters:input_type -> tabletmanagerdata.ResetReplicationParametersRequest - 49, // 49: tabletmanagerservice.TabletManager.FullStatus:input_type -> tabletmanagerdata.FullStatusRequest - 50, // 50: tabletmanagerservice.TabletManager.SetReplicationSource:input_type -> tabletmanagerdata.SetReplicationSourceRequest - 51, // 51: tabletmanagerservice.TabletManager.ReplicaWasRestarted:input_type -> tabletmanagerdata.ReplicaWasRestartedRequest - 52, // 52: tabletmanagerservice.TabletManager.StopReplicationAndGetStatus:input_type -> tabletmanagerdata.StopReplicationAndGetStatusRequest - 53, // 53: tabletmanagerservice.TabletManager.PromoteReplica:input_type -> tabletmanagerdata.PromoteReplicaRequest - 54, // 54: tabletmanagerservice.TabletManager.Backup:input_type -> tabletmanagerdata.BackupRequest - 55, // 55: tabletmanagerservice.TabletManager.RestoreFromBackup:input_type -> tabletmanagerdata.RestoreFromBackupRequest - 56, // 56: tabletmanagerservice.TabletManager.CheckThrottler:input_type -> tabletmanagerdata.CheckThrottlerRequest - 57, // 57: tabletmanagerservice.TabletManager.GetThrottlerStatus:input_type -> tabletmanagerdata.GetThrottlerStatusRequest - 58, // 58: tabletmanagerservice.TabletManager.Ping:output_type -> tabletmanagerdata.PingResponse - 59, // 59: tabletmanagerservice.TabletManager.Sleep:output_type -> tabletmanagerdata.SleepResponse - 60, // 60: tabletmanagerservice.TabletManager.ExecuteHook:output_type -> tabletmanagerdata.ExecuteHookResponse - 61, // 61: tabletmanagerservice.TabletManager.GetSchema:output_type -> tabletmanagerdata.GetSchemaResponse - 62, // 62: tabletmanagerservice.TabletManager.GetPermissions:output_type -> tabletmanagerdata.GetPermissionsResponse - 63, // 63: tabletmanagerservice.TabletManager.GetGlobalStatusVars:output_type -> tabletmanagerdata.GetGlobalStatusVarsResponse - 64, // 64: tabletmanagerservice.TabletManager.SetReadOnly:output_type -> tabletmanagerdata.SetReadOnlyResponse - 65, // 65: tabletmanagerservice.TabletManager.SetReadWrite:output_type -> tabletmanagerdata.SetReadWriteResponse - 66, // 66: tabletmanagerservice.TabletManager.ChangeType:output_type -> tabletmanagerdata.ChangeTypeResponse - 67, // 67: tabletmanagerservice.TabletManager.RefreshState:output_type -> tabletmanagerdata.RefreshStateResponse - 68, // 68: tabletmanagerservice.TabletManager.RunHealthCheck:output_type -> tabletmanagerdata.RunHealthCheckResponse - 69, // 69: tabletmanagerservice.TabletManager.ReloadSchema:output_type -> tabletmanagerdata.ReloadSchemaResponse - 70, // 70: tabletmanagerservice.TabletManager.PreflightSchema:output_type -> tabletmanagerdata.PreflightSchemaResponse - 71, // 71: tabletmanagerservice.TabletManager.ApplySchema:output_type -> tabletmanagerdata.ApplySchemaResponse - 72, // 72: tabletmanagerservice.TabletManager.ResetSequences:output_type -> tabletmanagerdata.ResetSequencesResponse - 73, // 73: tabletmanagerservice.TabletManager.LockTables:output_type -> tabletmanagerdata.LockTablesResponse - 74, // 74: tabletmanagerservice.TabletManager.UnlockTables:output_type -> tabletmanagerdata.UnlockTablesResponse - 75, // 75: tabletmanagerservice.TabletManager.ExecuteQuery:output_type -> tabletmanagerdata.ExecuteQueryResponse - 76, // 76: tabletmanagerservice.TabletManager.ExecuteFetchAsDba:output_type -> tabletmanagerdata.ExecuteFetchAsDbaResponse - 77, // 77: tabletmanagerservice.TabletManager.ExecuteMultiFetchAsDba:output_type -> tabletmanagerdata.ExecuteMultiFetchAsDbaResponse - 78, // 78: tabletmanagerservice.TabletManager.ExecuteFetchAsAllPrivs:output_type -> tabletmanagerdata.ExecuteFetchAsAllPrivsResponse - 79, // 79: tabletmanagerservice.TabletManager.ExecuteFetchAsApp:output_type -> tabletmanagerdata.ExecuteFetchAsAppResponse - 80, // 80: tabletmanagerservice.TabletManager.ReplicationStatus:output_type -> tabletmanagerdata.ReplicationStatusResponse - 81, // 81: tabletmanagerservice.TabletManager.PrimaryStatus:output_type -> tabletmanagerdata.PrimaryStatusResponse - 82, // 82: tabletmanagerservice.TabletManager.PrimaryPosition:output_type -> tabletmanagerdata.PrimaryPositionResponse - 83, // 83: tabletmanagerservice.TabletManager.WaitForPosition:output_type -> tabletmanagerdata.WaitForPositionResponse - 84, // 84: tabletmanagerservice.TabletManager.StopReplication:output_type -> tabletmanagerdata.StopReplicationResponse - 85, // 85: tabletmanagerservice.TabletManager.StopReplicationMinimum:output_type -> tabletmanagerdata.StopReplicationMinimumResponse - 86, // 86: tabletmanagerservice.TabletManager.StartReplication:output_type -> tabletmanagerdata.StartReplicationResponse - 87, // 87: tabletmanagerservice.TabletManager.StartReplicationUntilAfter:output_type -> tabletmanagerdata.StartReplicationUntilAfterResponse - 88, // 88: tabletmanagerservice.TabletManager.GetReplicas:output_type -> tabletmanagerdata.GetReplicasResponse - 89, // 89: tabletmanagerservice.TabletManager.CreateVReplicationWorkflow:output_type -> tabletmanagerdata.CreateVReplicationWorkflowResponse - 90, // 90: tabletmanagerservice.TabletManager.DeleteVReplicationWorkflow:output_type -> tabletmanagerdata.DeleteVReplicationWorkflowResponse - 91, // 91: tabletmanagerservice.TabletManager.HasVReplicationWorkflows:output_type -> tabletmanagerdata.HasVReplicationWorkflowsResponse - 92, // 92: tabletmanagerservice.TabletManager.ReadVReplicationWorkflow:output_type -> tabletmanagerdata.ReadVReplicationWorkflowResponse - 93, // 93: tabletmanagerservice.TabletManager.ReadVReplicationWorkflows:output_type -> tabletmanagerdata.ReadVReplicationWorkflowsResponse - 94, // 94: tabletmanagerservice.TabletManager.VReplicationExec:output_type -> tabletmanagerdata.VReplicationExecResponse - 95, // 95: tabletmanagerservice.TabletManager.VReplicationWaitForPos:output_type -> tabletmanagerdata.VReplicationWaitForPosResponse - 96, // 96: tabletmanagerservice.TabletManager.UpdateVReplicationWorkflow:output_type -> tabletmanagerdata.UpdateVReplicationWorkflowResponse - 97, // 97: tabletmanagerservice.TabletManager.UpdateVReplicationWorkflows:output_type -> tabletmanagerdata.UpdateVReplicationWorkflowsResponse - 98, // 98: tabletmanagerservice.TabletManager.VDiff:output_type -> tabletmanagerdata.VDiffResponse - 99, // 99: tabletmanagerservice.TabletManager.ResetReplication:output_type -> tabletmanagerdata.ResetReplicationResponse - 100, // 100: tabletmanagerservice.TabletManager.InitPrimary:output_type -> tabletmanagerdata.InitPrimaryResponse - 101, // 101: tabletmanagerservice.TabletManager.PopulateReparentJournal:output_type -> tabletmanagerdata.PopulateReparentJournalResponse - 102, // 102: tabletmanagerservice.TabletManager.InitReplica:output_type -> tabletmanagerdata.InitReplicaResponse - 103, // 103: tabletmanagerservice.TabletManager.DemotePrimary:output_type -> tabletmanagerdata.DemotePrimaryResponse - 104, // 104: tabletmanagerservice.TabletManager.UndoDemotePrimary:output_type -> tabletmanagerdata.UndoDemotePrimaryResponse - 105, // 105: tabletmanagerservice.TabletManager.ReplicaWasPromoted:output_type -> tabletmanagerdata.ReplicaWasPromotedResponse - 106, // 106: tabletmanagerservice.TabletManager.ResetReplicationParameters:output_type -> tabletmanagerdata.ResetReplicationParametersResponse - 107, // 107: tabletmanagerservice.TabletManager.FullStatus:output_type -> tabletmanagerdata.FullStatusResponse - 108, // 108: tabletmanagerservice.TabletManager.SetReplicationSource:output_type -> tabletmanagerdata.SetReplicationSourceResponse - 109, // 109: tabletmanagerservice.TabletManager.ReplicaWasRestarted:output_type -> tabletmanagerdata.ReplicaWasRestartedResponse - 110, // 110: tabletmanagerservice.TabletManager.StopReplicationAndGetStatus:output_type -> tabletmanagerdata.StopReplicationAndGetStatusResponse - 111, // 111: tabletmanagerservice.TabletManager.PromoteReplica:output_type -> tabletmanagerdata.PromoteReplicaResponse - 112, // 112: tabletmanagerservice.TabletManager.Backup:output_type -> tabletmanagerdata.BackupResponse - 113, // 113: tabletmanagerservice.TabletManager.RestoreFromBackup:output_type -> tabletmanagerdata.RestoreFromBackupResponse - 114, // 114: tabletmanagerservice.TabletManager.CheckThrottler:output_type -> tabletmanagerdata.CheckThrottlerResponse - 115, // 115: tabletmanagerservice.TabletManager.GetThrottlerStatus:output_type -> tabletmanagerdata.GetThrottlerStatusResponse - 58, // [58:116] is the sub-list for method output_type - 0, // [0:58] is the sub-list for method input_type + 8, // 8: tabletmanagerservice.TabletManager.ChangeTags:input_type -> tabletmanagerdata.ChangeTagsRequest + 9, // 9: tabletmanagerservice.TabletManager.ChangeType:input_type -> tabletmanagerdata.ChangeTypeRequest + 10, // 10: tabletmanagerservice.TabletManager.RefreshState:input_type -> tabletmanagerdata.RefreshStateRequest + 11, // 11: tabletmanagerservice.TabletManager.RunHealthCheck:input_type -> tabletmanagerdata.RunHealthCheckRequest + 12, // 12: tabletmanagerservice.TabletManager.ReloadSchema:input_type -> tabletmanagerdata.ReloadSchemaRequest + 13, // 13: tabletmanagerservice.TabletManager.PreflightSchema:input_type -> tabletmanagerdata.PreflightSchemaRequest + 14, // 14: tabletmanagerservice.TabletManager.ApplySchema:input_type -> tabletmanagerdata.ApplySchemaRequest + 15, // 15: tabletmanagerservice.TabletManager.ResetSequences:input_type -> tabletmanagerdata.ResetSequencesRequest + 16, // 16: tabletmanagerservice.TabletManager.LockTables:input_type -> tabletmanagerdata.LockTablesRequest + 17, // 17: tabletmanagerservice.TabletManager.UnlockTables:input_type -> tabletmanagerdata.UnlockTablesRequest + 18, // 18: tabletmanagerservice.TabletManager.ExecuteQuery:input_type -> tabletmanagerdata.ExecuteQueryRequest + 19, // 19: tabletmanagerservice.TabletManager.ExecuteFetchAsDba:input_type -> tabletmanagerdata.ExecuteFetchAsDbaRequest + 20, // 20: tabletmanagerservice.TabletManager.ExecuteMultiFetchAsDba:input_type -> tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + 21, // 21: tabletmanagerservice.TabletManager.ExecuteFetchAsAllPrivs:input_type -> tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + 22, // 22: tabletmanagerservice.TabletManager.ExecuteFetchAsApp:input_type -> tabletmanagerdata.ExecuteFetchAsAppRequest + 23, // 23: tabletmanagerservice.TabletManager.GetUnresolvedTransactions:input_type -> tabletmanagerdata.GetUnresolvedTransactionsRequest + 24, // 24: tabletmanagerservice.TabletManager.ReadTransaction:input_type -> tabletmanagerdata.ReadTransactionRequest + 25, // 25: tabletmanagerservice.TabletManager.ConcludeTransaction:input_type -> tabletmanagerdata.ConcludeTransactionRequest + 26, // 26: tabletmanagerservice.TabletManager.MysqlHostMetrics:input_type -> tabletmanagerdata.MysqlHostMetricsRequest + 27, // 27: tabletmanagerservice.TabletManager.ReplicationStatus:input_type -> tabletmanagerdata.ReplicationStatusRequest + 28, // 28: tabletmanagerservice.TabletManager.PrimaryStatus:input_type -> tabletmanagerdata.PrimaryStatusRequest + 29, // 29: tabletmanagerservice.TabletManager.PrimaryPosition:input_type -> tabletmanagerdata.PrimaryPositionRequest + 30, // 30: tabletmanagerservice.TabletManager.WaitForPosition:input_type -> tabletmanagerdata.WaitForPositionRequest + 31, // 31: tabletmanagerservice.TabletManager.StopReplication:input_type -> tabletmanagerdata.StopReplicationRequest + 32, // 32: tabletmanagerservice.TabletManager.StopReplicationMinimum:input_type -> tabletmanagerdata.StopReplicationMinimumRequest + 33, // 33: tabletmanagerservice.TabletManager.StartReplication:input_type -> tabletmanagerdata.StartReplicationRequest + 34, // 34: tabletmanagerservice.TabletManager.StartReplicationUntilAfter:input_type -> tabletmanagerdata.StartReplicationUntilAfterRequest + 35, // 35: tabletmanagerservice.TabletManager.GetReplicas:input_type -> tabletmanagerdata.GetReplicasRequest + 36, // 36: tabletmanagerservice.TabletManager.CreateVReplicationWorkflow:input_type -> tabletmanagerdata.CreateVReplicationWorkflowRequest + 37, // 37: tabletmanagerservice.TabletManager.DeleteTableData:input_type -> tabletmanagerdata.DeleteTableDataRequest + 38, // 38: tabletmanagerservice.TabletManager.DeleteVReplicationWorkflow:input_type -> tabletmanagerdata.DeleteVReplicationWorkflowRequest + 39, // 39: tabletmanagerservice.TabletManager.HasVReplicationWorkflows:input_type -> tabletmanagerdata.HasVReplicationWorkflowsRequest + 40, // 40: tabletmanagerservice.TabletManager.ReadVReplicationWorkflow:input_type -> tabletmanagerdata.ReadVReplicationWorkflowRequest + 41, // 41: tabletmanagerservice.TabletManager.ReadVReplicationWorkflows:input_type -> tabletmanagerdata.ReadVReplicationWorkflowsRequest + 42, // 42: tabletmanagerservice.TabletManager.UpdateVReplicationWorkflow:input_type -> tabletmanagerdata.UpdateVReplicationWorkflowRequest + 43, // 43: tabletmanagerservice.TabletManager.UpdateVReplicationWorkflows:input_type -> tabletmanagerdata.UpdateVReplicationWorkflowsRequest + 44, // 44: tabletmanagerservice.TabletManager.ValidateVReplicationPermissions:input_type -> tabletmanagerdata.ValidateVReplicationPermissionsRequest + 45, // 45: tabletmanagerservice.TabletManager.VReplicationExec:input_type -> tabletmanagerdata.VReplicationExecRequest + 46, // 46: tabletmanagerservice.TabletManager.VReplicationWaitForPos:input_type -> tabletmanagerdata.VReplicationWaitForPosRequest + 47, // 47: tabletmanagerservice.TabletManager.VDiff:input_type -> tabletmanagerdata.VDiffRequest + 48, // 48: tabletmanagerservice.TabletManager.ResetReplication:input_type -> tabletmanagerdata.ResetReplicationRequest + 49, // 49: tabletmanagerservice.TabletManager.InitPrimary:input_type -> tabletmanagerdata.InitPrimaryRequest + 50, // 50: tabletmanagerservice.TabletManager.PopulateReparentJournal:input_type -> tabletmanagerdata.PopulateReparentJournalRequest + 51, // 51: tabletmanagerservice.TabletManager.ReadReparentJournalInfo:input_type -> tabletmanagerdata.ReadReparentJournalInfoRequest + 52, // 52: tabletmanagerservice.TabletManager.InitReplica:input_type -> tabletmanagerdata.InitReplicaRequest + 53, // 53: tabletmanagerservice.TabletManager.DemotePrimary:input_type -> tabletmanagerdata.DemotePrimaryRequest + 54, // 54: tabletmanagerservice.TabletManager.UndoDemotePrimary:input_type -> tabletmanagerdata.UndoDemotePrimaryRequest + 55, // 55: tabletmanagerservice.TabletManager.ReplicaWasPromoted:input_type -> tabletmanagerdata.ReplicaWasPromotedRequest + 56, // 56: tabletmanagerservice.TabletManager.ResetReplicationParameters:input_type -> tabletmanagerdata.ResetReplicationParametersRequest + 57, // 57: tabletmanagerservice.TabletManager.FullStatus:input_type -> tabletmanagerdata.FullStatusRequest + 58, // 58: tabletmanagerservice.TabletManager.SetReplicationSource:input_type -> tabletmanagerdata.SetReplicationSourceRequest + 59, // 59: tabletmanagerservice.TabletManager.ReplicaWasRestarted:input_type -> tabletmanagerdata.ReplicaWasRestartedRequest + 60, // 60: tabletmanagerservice.TabletManager.StopReplicationAndGetStatus:input_type -> tabletmanagerdata.StopReplicationAndGetStatusRequest + 61, // 61: tabletmanagerservice.TabletManager.PromoteReplica:input_type -> tabletmanagerdata.PromoteReplicaRequest + 62, // 62: tabletmanagerservice.TabletManager.Backup:input_type -> tabletmanagerdata.BackupRequest + 63, // 63: tabletmanagerservice.TabletManager.RestoreFromBackup:input_type -> tabletmanagerdata.RestoreFromBackupRequest + 64, // 64: tabletmanagerservice.TabletManager.CheckThrottler:input_type -> tabletmanagerdata.CheckThrottlerRequest + 65, // 65: tabletmanagerservice.TabletManager.GetThrottlerStatus:input_type -> tabletmanagerdata.GetThrottlerStatusRequest + 66, // 66: tabletmanagerservice.TabletManager.Ping:output_type -> tabletmanagerdata.PingResponse + 67, // 67: tabletmanagerservice.TabletManager.Sleep:output_type -> tabletmanagerdata.SleepResponse + 68, // 68: tabletmanagerservice.TabletManager.ExecuteHook:output_type -> tabletmanagerdata.ExecuteHookResponse + 69, // 69: tabletmanagerservice.TabletManager.GetSchema:output_type -> tabletmanagerdata.GetSchemaResponse + 70, // 70: tabletmanagerservice.TabletManager.GetPermissions:output_type -> tabletmanagerdata.GetPermissionsResponse + 71, // 71: tabletmanagerservice.TabletManager.GetGlobalStatusVars:output_type -> tabletmanagerdata.GetGlobalStatusVarsResponse + 72, // 72: tabletmanagerservice.TabletManager.SetReadOnly:output_type -> tabletmanagerdata.SetReadOnlyResponse + 73, // 73: tabletmanagerservice.TabletManager.SetReadWrite:output_type -> tabletmanagerdata.SetReadWriteResponse + 74, // 74: tabletmanagerservice.TabletManager.ChangeTags:output_type -> tabletmanagerdata.ChangeTagsResponse + 75, // 75: tabletmanagerservice.TabletManager.ChangeType:output_type -> tabletmanagerdata.ChangeTypeResponse + 76, // 76: tabletmanagerservice.TabletManager.RefreshState:output_type -> tabletmanagerdata.RefreshStateResponse + 77, // 77: tabletmanagerservice.TabletManager.RunHealthCheck:output_type -> tabletmanagerdata.RunHealthCheckResponse + 78, // 78: tabletmanagerservice.TabletManager.ReloadSchema:output_type -> tabletmanagerdata.ReloadSchemaResponse + 79, // 79: tabletmanagerservice.TabletManager.PreflightSchema:output_type -> tabletmanagerdata.PreflightSchemaResponse + 80, // 80: tabletmanagerservice.TabletManager.ApplySchema:output_type -> tabletmanagerdata.ApplySchemaResponse + 81, // 81: tabletmanagerservice.TabletManager.ResetSequences:output_type -> tabletmanagerdata.ResetSequencesResponse + 82, // 82: tabletmanagerservice.TabletManager.LockTables:output_type -> tabletmanagerdata.LockTablesResponse + 83, // 83: tabletmanagerservice.TabletManager.UnlockTables:output_type -> tabletmanagerdata.UnlockTablesResponse + 84, // 84: tabletmanagerservice.TabletManager.ExecuteQuery:output_type -> tabletmanagerdata.ExecuteQueryResponse + 85, // 85: tabletmanagerservice.TabletManager.ExecuteFetchAsDba:output_type -> tabletmanagerdata.ExecuteFetchAsDbaResponse + 86, // 86: tabletmanagerservice.TabletManager.ExecuteMultiFetchAsDba:output_type -> tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + 87, // 87: tabletmanagerservice.TabletManager.ExecuteFetchAsAllPrivs:output_type -> tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + 88, // 88: tabletmanagerservice.TabletManager.ExecuteFetchAsApp:output_type -> tabletmanagerdata.ExecuteFetchAsAppResponse + 89, // 89: tabletmanagerservice.TabletManager.GetUnresolvedTransactions:output_type -> tabletmanagerdata.GetUnresolvedTransactionsResponse + 90, // 90: tabletmanagerservice.TabletManager.ReadTransaction:output_type -> tabletmanagerdata.ReadTransactionResponse + 91, // 91: tabletmanagerservice.TabletManager.ConcludeTransaction:output_type -> tabletmanagerdata.ConcludeTransactionResponse + 92, // 92: tabletmanagerservice.TabletManager.MysqlHostMetrics:output_type -> tabletmanagerdata.MysqlHostMetricsResponse + 93, // 93: tabletmanagerservice.TabletManager.ReplicationStatus:output_type -> tabletmanagerdata.ReplicationStatusResponse + 94, // 94: tabletmanagerservice.TabletManager.PrimaryStatus:output_type -> tabletmanagerdata.PrimaryStatusResponse + 95, // 95: tabletmanagerservice.TabletManager.PrimaryPosition:output_type -> tabletmanagerdata.PrimaryPositionResponse + 96, // 96: tabletmanagerservice.TabletManager.WaitForPosition:output_type -> tabletmanagerdata.WaitForPositionResponse + 97, // 97: tabletmanagerservice.TabletManager.StopReplication:output_type -> tabletmanagerdata.StopReplicationResponse + 98, // 98: tabletmanagerservice.TabletManager.StopReplicationMinimum:output_type -> tabletmanagerdata.StopReplicationMinimumResponse + 99, // 99: tabletmanagerservice.TabletManager.StartReplication:output_type -> tabletmanagerdata.StartReplicationResponse + 100, // 100: tabletmanagerservice.TabletManager.StartReplicationUntilAfter:output_type -> tabletmanagerdata.StartReplicationUntilAfterResponse + 101, // 101: tabletmanagerservice.TabletManager.GetReplicas:output_type -> tabletmanagerdata.GetReplicasResponse + 102, // 102: tabletmanagerservice.TabletManager.CreateVReplicationWorkflow:output_type -> tabletmanagerdata.CreateVReplicationWorkflowResponse + 103, // 103: tabletmanagerservice.TabletManager.DeleteTableData:output_type -> tabletmanagerdata.DeleteTableDataResponse + 104, // 104: tabletmanagerservice.TabletManager.DeleteVReplicationWorkflow:output_type -> tabletmanagerdata.DeleteVReplicationWorkflowResponse + 105, // 105: tabletmanagerservice.TabletManager.HasVReplicationWorkflows:output_type -> tabletmanagerdata.HasVReplicationWorkflowsResponse + 106, // 106: tabletmanagerservice.TabletManager.ReadVReplicationWorkflow:output_type -> tabletmanagerdata.ReadVReplicationWorkflowResponse + 107, // 107: tabletmanagerservice.TabletManager.ReadVReplicationWorkflows:output_type -> tabletmanagerdata.ReadVReplicationWorkflowsResponse + 108, // 108: tabletmanagerservice.TabletManager.UpdateVReplicationWorkflow:output_type -> tabletmanagerdata.UpdateVReplicationWorkflowResponse + 109, // 109: tabletmanagerservice.TabletManager.UpdateVReplicationWorkflows:output_type -> tabletmanagerdata.UpdateVReplicationWorkflowsResponse + 110, // 110: tabletmanagerservice.TabletManager.ValidateVReplicationPermissions:output_type -> tabletmanagerdata.ValidateVReplicationPermissionsResponse + 111, // 111: tabletmanagerservice.TabletManager.VReplicationExec:output_type -> tabletmanagerdata.VReplicationExecResponse + 112, // 112: tabletmanagerservice.TabletManager.VReplicationWaitForPos:output_type -> tabletmanagerdata.VReplicationWaitForPosResponse + 113, // 113: tabletmanagerservice.TabletManager.VDiff:output_type -> tabletmanagerdata.VDiffResponse + 114, // 114: tabletmanagerservice.TabletManager.ResetReplication:output_type -> tabletmanagerdata.ResetReplicationResponse + 115, // 115: tabletmanagerservice.TabletManager.InitPrimary:output_type -> tabletmanagerdata.InitPrimaryResponse + 116, // 116: tabletmanagerservice.TabletManager.PopulateReparentJournal:output_type -> tabletmanagerdata.PopulateReparentJournalResponse + 117, // 117: tabletmanagerservice.TabletManager.ReadReparentJournalInfo:output_type -> tabletmanagerdata.ReadReparentJournalInfoResponse + 118, // 118: tabletmanagerservice.TabletManager.InitReplica:output_type -> tabletmanagerdata.InitReplicaResponse + 119, // 119: tabletmanagerservice.TabletManager.DemotePrimary:output_type -> tabletmanagerdata.DemotePrimaryResponse + 120, // 120: tabletmanagerservice.TabletManager.UndoDemotePrimary:output_type -> tabletmanagerdata.UndoDemotePrimaryResponse + 121, // 121: tabletmanagerservice.TabletManager.ReplicaWasPromoted:output_type -> tabletmanagerdata.ReplicaWasPromotedResponse + 122, // 122: tabletmanagerservice.TabletManager.ResetReplicationParameters:output_type -> tabletmanagerdata.ResetReplicationParametersResponse + 123, // 123: tabletmanagerservice.TabletManager.FullStatus:output_type -> tabletmanagerdata.FullStatusResponse + 124, // 124: tabletmanagerservice.TabletManager.SetReplicationSource:output_type -> tabletmanagerdata.SetReplicationSourceResponse + 125, // 125: tabletmanagerservice.TabletManager.ReplicaWasRestarted:output_type -> tabletmanagerdata.ReplicaWasRestartedResponse + 126, // 126: tabletmanagerservice.TabletManager.StopReplicationAndGetStatus:output_type -> tabletmanagerdata.StopReplicationAndGetStatusResponse + 127, // 127: tabletmanagerservice.TabletManager.PromoteReplica:output_type -> tabletmanagerdata.PromoteReplicaResponse + 128, // 128: tabletmanagerservice.TabletManager.Backup:output_type -> tabletmanagerdata.BackupResponse + 129, // 129: tabletmanagerservice.TabletManager.RestoreFromBackup:output_type -> tabletmanagerdata.RestoreFromBackupResponse + 130, // 130: tabletmanagerservice.TabletManager.CheckThrottler:output_type -> tabletmanagerdata.CheckThrottlerResponse + 131, // 131: tabletmanagerservice.TabletManager.GetThrottlerStatus:output_type -> tabletmanagerdata.GetThrottlerStatusResponse + 66, // [66:132] is the sub-list for method output_type + 0, // [0:66] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/go/vt/proto/tabletmanagerservice/tabletmanagerservice_grpc.pb.go b/go/vt/proto/tabletmanagerservice/tabletmanagerservice_grpc.pb.go index a9924d06adf..5899f24cd42 100644 --- a/go/vt/proto/tabletmanagerservice/tabletmanagerservice_grpc.pb.go +++ b/go/vt/proto/tabletmanagerservice/tabletmanagerservice_grpc.pb.go @@ -38,6 +38,8 @@ type TabletManagerClient interface { GetGlobalStatusVars(ctx context.Context, in *tabletmanagerdata.GetGlobalStatusVarsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetGlobalStatusVarsResponse, error) SetReadOnly(ctx context.Context, in *tabletmanagerdata.SetReadOnlyRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SetReadOnlyResponse, error) SetReadWrite(ctx context.Context, in *tabletmanagerdata.SetReadWriteRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SetReadWriteResponse, error) + // ChangeTags asks the remote tablet to change its tags + ChangeTags(ctx context.Context, in *tabletmanagerdata.ChangeTagsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ChangeTagsResponse, error) // ChangeType asks the remote tablet to change its type ChangeType(ctx context.Context, in *tabletmanagerdata.ChangeTypeRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ChangeTypeResponse, error) RefreshState(ctx context.Context, in *tabletmanagerdata.RefreshStateRequest, opts ...grpc.CallOption) (*tabletmanagerdata.RefreshStateResponse, error) @@ -53,6 +55,10 @@ type TabletManagerClient interface { ExecuteMultiFetchAsDba(ctx context.Context, in *tabletmanagerdata.ExecuteMultiFetchAsDbaRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ExecuteMultiFetchAsDbaResponse, error) ExecuteFetchAsAllPrivs(ctx context.Context, in *tabletmanagerdata.ExecuteFetchAsAllPrivsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ExecuteFetchAsAllPrivsResponse, error) ExecuteFetchAsApp(ctx context.Context, in *tabletmanagerdata.ExecuteFetchAsAppRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ExecuteFetchAsAppResponse, error) + GetUnresolvedTransactions(ctx context.Context, in *tabletmanagerdata.GetUnresolvedTransactionsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetUnresolvedTransactionsResponse, error) + ReadTransaction(ctx context.Context, in *tabletmanagerdata.ReadTransactionRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReadTransactionResponse, error) + ConcludeTransaction(ctx context.Context, in *tabletmanagerdata.ConcludeTransactionRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ConcludeTransactionResponse, error) + MysqlHostMetrics(ctx context.Context, in *tabletmanagerdata.MysqlHostMetricsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.MysqlHostMetricsResponse, error) // ReplicationStatus returns the current replication status. ReplicationStatus(ctx context.Context, in *tabletmanagerdata.ReplicationStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReplicationStatusResponse, error) // PrimaryStatus returns the current primary status. @@ -75,14 +81,16 @@ type TabletManagerClient interface { GetReplicas(ctx context.Context, in *tabletmanagerdata.GetReplicasRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetReplicasResponse, error) // VReplication API CreateVReplicationWorkflow(ctx context.Context, in *tabletmanagerdata.CreateVReplicationWorkflowRequest, opts ...grpc.CallOption) (*tabletmanagerdata.CreateVReplicationWorkflowResponse, error) + DeleteTableData(ctx context.Context, in *tabletmanagerdata.DeleteTableDataRequest, opts ...grpc.CallOption) (*tabletmanagerdata.DeleteTableDataResponse, error) DeleteVReplicationWorkflow(ctx context.Context, in *tabletmanagerdata.DeleteVReplicationWorkflowRequest, opts ...grpc.CallOption) (*tabletmanagerdata.DeleteVReplicationWorkflowResponse, error) HasVReplicationWorkflows(ctx context.Context, in *tabletmanagerdata.HasVReplicationWorkflowsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.HasVReplicationWorkflowsResponse, error) ReadVReplicationWorkflow(ctx context.Context, in *tabletmanagerdata.ReadVReplicationWorkflowRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReadVReplicationWorkflowResponse, error) ReadVReplicationWorkflows(ctx context.Context, in *tabletmanagerdata.ReadVReplicationWorkflowsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReadVReplicationWorkflowsResponse, error) - VReplicationExec(ctx context.Context, in *tabletmanagerdata.VReplicationExecRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationExecResponse, error) - VReplicationWaitForPos(ctx context.Context, in *tabletmanagerdata.VReplicationWaitForPosRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) UpdateVReplicationWorkflow(ctx context.Context, in *tabletmanagerdata.UpdateVReplicationWorkflowRequest, opts ...grpc.CallOption) (*tabletmanagerdata.UpdateVReplicationWorkflowResponse, error) UpdateVReplicationWorkflows(ctx context.Context, in *tabletmanagerdata.UpdateVReplicationWorkflowsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.UpdateVReplicationWorkflowsResponse, error) + ValidateVReplicationPermissions(ctx context.Context, in *tabletmanagerdata.ValidateVReplicationPermissionsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ValidateVReplicationPermissionsResponse, error) + VReplicationExec(ctx context.Context, in *tabletmanagerdata.VReplicationExecRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationExecResponse, error) + VReplicationWaitForPos(ctx context.Context, in *tabletmanagerdata.VReplicationWaitForPosRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) // VDiff API VDiff(ctx context.Context, in *tabletmanagerdata.VDiffRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VDiffResponse, error) // ResetReplication makes the target not replicating @@ -92,6 +100,8 @@ type TabletManagerClient interface { // PopulateReparentJournal tells the tablet to add an entry to its // reparent journal PopulateReparentJournal(ctx context.Context, in *tabletmanagerdata.PopulateReparentJournalRequest, opts ...grpc.CallOption) (*tabletmanagerdata.PopulateReparentJournalResponse, error) + // ReadReparentJournalInfo reads the information from reparent journal + ReadReparentJournalInfo(ctx context.Context, in *tabletmanagerdata.ReadReparentJournalInfoRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReadReparentJournalInfoResponse, error) // InitReplica tells the tablet to reparent to the primary unconditionally InitReplica(ctx context.Context, in *tabletmanagerdata.InitReplicaRequest, opts ...grpc.CallOption) (*tabletmanagerdata.InitReplicaResponse, error) // DemotePrimary tells the soon-to-be-former primary it's gonna change @@ -202,6 +212,15 @@ func (c *tabletManagerClient) SetReadWrite(ctx context.Context, in *tabletmanage return out, nil } +func (c *tabletManagerClient) ChangeTags(ctx context.Context, in *tabletmanagerdata.ChangeTagsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ChangeTagsResponse, error) { + out := new(tabletmanagerdata.ChangeTagsResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ChangeTags", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *tabletManagerClient) ChangeType(ctx context.Context, in *tabletmanagerdata.ChangeTypeRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ChangeTypeResponse, error) { out := new(tabletmanagerdata.ChangeTypeResponse) err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ChangeType", in, out, opts...) @@ -328,6 +347,42 @@ func (c *tabletManagerClient) ExecuteFetchAsApp(ctx context.Context, in *tabletm return out, nil } +func (c *tabletManagerClient) GetUnresolvedTransactions(ctx context.Context, in *tabletmanagerdata.GetUnresolvedTransactionsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.GetUnresolvedTransactionsResponse, error) { + out := new(tabletmanagerdata.GetUnresolvedTransactionsResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/GetUnresolvedTransactions", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) ReadTransaction(ctx context.Context, in *tabletmanagerdata.ReadTransactionRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReadTransactionResponse, error) { + out := new(tabletmanagerdata.ReadTransactionResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ReadTransaction", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) ConcludeTransaction(ctx context.Context, in *tabletmanagerdata.ConcludeTransactionRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ConcludeTransactionResponse, error) { + out := new(tabletmanagerdata.ConcludeTransactionResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ConcludeTransaction", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) MysqlHostMetrics(ctx context.Context, in *tabletmanagerdata.MysqlHostMetricsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.MysqlHostMetricsResponse, error) { + out := new(tabletmanagerdata.MysqlHostMetricsResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/MysqlHostMetrics", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *tabletManagerClient) ReplicationStatus(ctx context.Context, in *tabletmanagerdata.ReplicationStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReplicationStatusResponse, error) { out := new(tabletmanagerdata.ReplicationStatusResponse) err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ReplicationStatus", in, out, opts...) @@ -418,6 +473,15 @@ func (c *tabletManagerClient) CreateVReplicationWorkflow(ctx context.Context, in return out, nil } +func (c *tabletManagerClient) DeleteTableData(ctx context.Context, in *tabletmanagerdata.DeleteTableDataRequest, opts ...grpc.CallOption) (*tabletmanagerdata.DeleteTableDataResponse, error) { + out := new(tabletmanagerdata.DeleteTableDataResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/DeleteTableData", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *tabletManagerClient) DeleteVReplicationWorkflow(ctx context.Context, in *tabletmanagerdata.DeleteVReplicationWorkflowRequest, opts ...grpc.CallOption) (*tabletmanagerdata.DeleteVReplicationWorkflowResponse, error) { out := new(tabletmanagerdata.DeleteVReplicationWorkflowResponse) err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/DeleteVReplicationWorkflow", in, out, opts...) @@ -454,36 +518,45 @@ func (c *tabletManagerClient) ReadVReplicationWorkflows(ctx context.Context, in return out, nil } -func (c *tabletManagerClient) VReplicationExec(ctx context.Context, in *tabletmanagerdata.VReplicationExecRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationExecResponse, error) { - out := new(tabletmanagerdata.VReplicationExecResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/VReplicationExec", in, out, opts...) +func (c *tabletManagerClient) UpdateVReplicationWorkflow(ctx context.Context, in *tabletmanagerdata.UpdateVReplicationWorkflowRequest, opts ...grpc.CallOption) (*tabletmanagerdata.UpdateVReplicationWorkflowResponse, error) { + out := new(tabletmanagerdata.UpdateVReplicationWorkflowResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/UpdateVReplicationWorkflow", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *tabletManagerClient) VReplicationWaitForPos(ctx context.Context, in *tabletmanagerdata.VReplicationWaitForPosRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) { - out := new(tabletmanagerdata.VReplicationWaitForPosResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/VReplicationWaitForPos", in, out, opts...) +func (c *tabletManagerClient) UpdateVReplicationWorkflows(ctx context.Context, in *tabletmanagerdata.UpdateVReplicationWorkflowsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.UpdateVReplicationWorkflowsResponse, error) { + out := new(tabletmanagerdata.UpdateVReplicationWorkflowsResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/UpdateVReplicationWorkflows", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *tabletManagerClient) UpdateVReplicationWorkflow(ctx context.Context, in *tabletmanagerdata.UpdateVReplicationWorkflowRequest, opts ...grpc.CallOption) (*tabletmanagerdata.UpdateVReplicationWorkflowResponse, error) { - out := new(tabletmanagerdata.UpdateVReplicationWorkflowResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/UpdateVReplicationWorkflow", in, out, opts...) +func (c *tabletManagerClient) ValidateVReplicationPermissions(ctx context.Context, in *tabletmanagerdata.ValidateVReplicationPermissionsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ValidateVReplicationPermissionsResponse, error) { + out := new(tabletmanagerdata.ValidateVReplicationPermissionsResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ValidateVReplicationPermissions", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *tabletManagerClient) UpdateVReplicationWorkflows(ctx context.Context, in *tabletmanagerdata.UpdateVReplicationWorkflowsRequest, opts ...grpc.CallOption) (*tabletmanagerdata.UpdateVReplicationWorkflowsResponse, error) { - out := new(tabletmanagerdata.UpdateVReplicationWorkflowsResponse) - err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/UpdateVReplicationWorkflows", in, out, opts...) +func (c *tabletManagerClient) VReplicationExec(ctx context.Context, in *tabletmanagerdata.VReplicationExecRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationExecResponse, error) { + out := new(tabletmanagerdata.VReplicationExecResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/VReplicationExec", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tabletManagerClient) VReplicationWaitForPos(ctx context.Context, in *tabletmanagerdata.VReplicationWaitForPosRequest, opts ...grpc.CallOption) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) { + out := new(tabletmanagerdata.VReplicationWaitForPosResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/VReplicationWaitForPos", in, out, opts...) if err != nil { return nil, err } @@ -526,6 +599,15 @@ func (c *tabletManagerClient) PopulateReparentJournal(ctx context.Context, in *t return out, nil } +func (c *tabletManagerClient) ReadReparentJournalInfo(ctx context.Context, in *tabletmanagerdata.ReadReparentJournalInfoRequest, opts ...grpc.CallOption) (*tabletmanagerdata.ReadReparentJournalInfoResponse, error) { + out := new(tabletmanagerdata.ReadReparentJournalInfoResponse) + err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/ReadReparentJournalInfo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *tabletManagerClient) InitReplica(ctx context.Context, in *tabletmanagerdata.InitReplicaRequest, opts ...grpc.CallOption) (*tabletmanagerdata.InitReplicaResponse, error) { out := new(tabletmanagerdata.InitReplicaResponse) err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/InitReplica", in, out, opts...) @@ -717,6 +799,8 @@ type TabletManagerServer interface { GetGlobalStatusVars(context.Context, *tabletmanagerdata.GetGlobalStatusVarsRequest) (*tabletmanagerdata.GetGlobalStatusVarsResponse, error) SetReadOnly(context.Context, *tabletmanagerdata.SetReadOnlyRequest) (*tabletmanagerdata.SetReadOnlyResponse, error) SetReadWrite(context.Context, *tabletmanagerdata.SetReadWriteRequest) (*tabletmanagerdata.SetReadWriteResponse, error) + // ChangeTags asks the remote tablet to change its tags + ChangeTags(context.Context, *tabletmanagerdata.ChangeTagsRequest) (*tabletmanagerdata.ChangeTagsResponse, error) // ChangeType asks the remote tablet to change its type ChangeType(context.Context, *tabletmanagerdata.ChangeTypeRequest) (*tabletmanagerdata.ChangeTypeResponse, error) RefreshState(context.Context, *tabletmanagerdata.RefreshStateRequest) (*tabletmanagerdata.RefreshStateResponse, error) @@ -732,6 +816,10 @@ type TabletManagerServer interface { ExecuteMultiFetchAsDba(context.Context, *tabletmanagerdata.ExecuteMultiFetchAsDbaRequest) (*tabletmanagerdata.ExecuteMultiFetchAsDbaResponse, error) ExecuteFetchAsAllPrivs(context.Context, *tabletmanagerdata.ExecuteFetchAsAllPrivsRequest) (*tabletmanagerdata.ExecuteFetchAsAllPrivsResponse, error) ExecuteFetchAsApp(context.Context, *tabletmanagerdata.ExecuteFetchAsAppRequest) (*tabletmanagerdata.ExecuteFetchAsAppResponse, error) + GetUnresolvedTransactions(context.Context, *tabletmanagerdata.GetUnresolvedTransactionsRequest) (*tabletmanagerdata.GetUnresolvedTransactionsResponse, error) + ReadTransaction(context.Context, *tabletmanagerdata.ReadTransactionRequest) (*tabletmanagerdata.ReadTransactionResponse, error) + ConcludeTransaction(context.Context, *tabletmanagerdata.ConcludeTransactionRequest) (*tabletmanagerdata.ConcludeTransactionResponse, error) + MysqlHostMetrics(context.Context, *tabletmanagerdata.MysqlHostMetricsRequest) (*tabletmanagerdata.MysqlHostMetricsResponse, error) // ReplicationStatus returns the current replication status. ReplicationStatus(context.Context, *tabletmanagerdata.ReplicationStatusRequest) (*tabletmanagerdata.ReplicationStatusResponse, error) // PrimaryStatus returns the current primary status. @@ -754,14 +842,16 @@ type TabletManagerServer interface { GetReplicas(context.Context, *tabletmanagerdata.GetReplicasRequest) (*tabletmanagerdata.GetReplicasResponse, error) // VReplication API CreateVReplicationWorkflow(context.Context, *tabletmanagerdata.CreateVReplicationWorkflowRequest) (*tabletmanagerdata.CreateVReplicationWorkflowResponse, error) + DeleteTableData(context.Context, *tabletmanagerdata.DeleteTableDataRequest) (*tabletmanagerdata.DeleteTableDataResponse, error) DeleteVReplicationWorkflow(context.Context, *tabletmanagerdata.DeleteVReplicationWorkflowRequest) (*tabletmanagerdata.DeleteVReplicationWorkflowResponse, error) HasVReplicationWorkflows(context.Context, *tabletmanagerdata.HasVReplicationWorkflowsRequest) (*tabletmanagerdata.HasVReplicationWorkflowsResponse, error) ReadVReplicationWorkflow(context.Context, *tabletmanagerdata.ReadVReplicationWorkflowRequest) (*tabletmanagerdata.ReadVReplicationWorkflowResponse, error) ReadVReplicationWorkflows(context.Context, *tabletmanagerdata.ReadVReplicationWorkflowsRequest) (*tabletmanagerdata.ReadVReplicationWorkflowsResponse, error) - VReplicationExec(context.Context, *tabletmanagerdata.VReplicationExecRequest) (*tabletmanagerdata.VReplicationExecResponse, error) - VReplicationWaitForPos(context.Context, *tabletmanagerdata.VReplicationWaitForPosRequest) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) UpdateVReplicationWorkflow(context.Context, *tabletmanagerdata.UpdateVReplicationWorkflowRequest) (*tabletmanagerdata.UpdateVReplicationWorkflowResponse, error) UpdateVReplicationWorkflows(context.Context, *tabletmanagerdata.UpdateVReplicationWorkflowsRequest) (*tabletmanagerdata.UpdateVReplicationWorkflowsResponse, error) + ValidateVReplicationPermissions(context.Context, *tabletmanagerdata.ValidateVReplicationPermissionsRequest) (*tabletmanagerdata.ValidateVReplicationPermissionsResponse, error) + VReplicationExec(context.Context, *tabletmanagerdata.VReplicationExecRequest) (*tabletmanagerdata.VReplicationExecResponse, error) + VReplicationWaitForPos(context.Context, *tabletmanagerdata.VReplicationWaitForPosRequest) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) // VDiff API VDiff(context.Context, *tabletmanagerdata.VDiffRequest) (*tabletmanagerdata.VDiffResponse, error) // ResetReplication makes the target not replicating @@ -771,6 +861,8 @@ type TabletManagerServer interface { // PopulateReparentJournal tells the tablet to add an entry to its // reparent journal PopulateReparentJournal(context.Context, *tabletmanagerdata.PopulateReparentJournalRequest) (*tabletmanagerdata.PopulateReparentJournalResponse, error) + // ReadReparentJournalInfo reads the information from reparent journal + ReadReparentJournalInfo(context.Context, *tabletmanagerdata.ReadReparentJournalInfoRequest) (*tabletmanagerdata.ReadReparentJournalInfoResponse, error) // InitReplica tells the tablet to reparent to the primary unconditionally InitReplica(context.Context, *tabletmanagerdata.InitReplicaRequest) (*tabletmanagerdata.InitReplicaResponse, error) // DemotePrimary tells the soon-to-be-former primary it's gonna change @@ -830,6 +922,9 @@ func (UnimplementedTabletManagerServer) SetReadOnly(context.Context, *tabletmana func (UnimplementedTabletManagerServer) SetReadWrite(context.Context, *tabletmanagerdata.SetReadWriteRequest) (*tabletmanagerdata.SetReadWriteResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SetReadWrite not implemented") } +func (UnimplementedTabletManagerServer) ChangeTags(context.Context, *tabletmanagerdata.ChangeTagsRequest) (*tabletmanagerdata.ChangeTagsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangeTags not implemented") +} func (UnimplementedTabletManagerServer) ChangeType(context.Context, *tabletmanagerdata.ChangeTypeRequest) (*tabletmanagerdata.ChangeTypeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangeType not implemented") } @@ -872,6 +967,18 @@ func (UnimplementedTabletManagerServer) ExecuteFetchAsAllPrivs(context.Context, func (UnimplementedTabletManagerServer) ExecuteFetchAsApp(context.Context, *tabletmanagerdata.ExecuteFetchAsAppRequest) (*tabletmanagerdata.ExecuteFetchAsAppResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ExecuteFetchAsApp not implemented") } +func (UnimplementedTabletManagerServer) GetUnresolvedTransactions(context.Context, *tabletmanagerdata.GetUnresolvedTransactionsRequest) (*tabletmanagerdata.GetUnresolvedTransactionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUnresolvedTransactions not implemented") +} +func (UnimplementedTabletManagerServer) ReadTransaction(context.Context, *tabletmanagerdata.ReadTransactionRequest) (*tabletmanagerdata.ReadTransactionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReadTransaction not implemented") +} +func (UnimplementedTabletManagerServer) ConcludeTransaction(context.Context, *tabletmanagerdata.ConcludeTransactionRequest) (*tabletmanagerdata.ConcludeTransactionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ConcludeTransaction not implemented") +} +func (UnimplementedTabletManagerServer) MysqlHostMetrics(context.Context, *tabletmanagerdata.MysqlHostMetricsRequest) (*tabletmanagerdata.MysqlHostMetricsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MysqlHostMetrics not implemented") +} func (UnimplementedTabletManagerServer) ReplicationStatus(context.Context, *tabletmanagerdata.ReplicationStatusRequest) (*tabletmanagerdata.ReplicationStatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ReplicationStatus not implemented") } @@ -902,6 +1009,9 @@ func (UnimplementedTabletManagerServer) GetReplicas(context.Context, *tabletmana func (UnimplementedTabletManagerServer) CreateVReplicationWorkflow(context.Context, *tabletmanagerdata.CreateVReplicationWorkflowRequest) (*tabletmanagerdata.CreateVReplicationWorkflowResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateVReplicationWorkflow not implemented") } +func (UnimplementedTabletManagerServer) DeleteTableData(context.Context, *tabletmanagerdata.DeleteTableDataRequest) (*tabletmanagerdata.DeleteTableDataResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteTableData not implemented") +} func (UnimplementedTabletManagerServer) DeleteVReplicationWorkflow(context.Context, *tabletmanagerdata.DeleteVReplicationWorkflowRequest) (*tabletmanagerdata.DeleteVReplicationWorkflowResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteVReplicationWorkflow not implemented") } @@ -914,18 +1024,21 @@ func (UnimplementedTabletManagerServer) ReadVReplicationWorkflow(context.Context func (UnimplementedTabletManagerServer) ReadVReplicationWorkflows(context.Context, *tabletmanagerdata.ReadVReplicationWorkflowsRequest) (*tabletmanagerdata.ReadVReplicationWorkflowsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ReadVReplicationWorkflows not implemented") } -func (UnimplementedTabletManagerServer) VReplicationExec(context.Context, *tabletmanagerdata.VReplicationExecRequest) (*tabletmanagerdata.VReplicationExecResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method VReplicationExec not implemented") -} -func (UnimplementedTabletManagerServer) VReplicationWaitForPos(context.Context, *tabletmanagerdata.VReplicationWaitForPosRequest) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method VReplicationWaitForPos not implemented") -} func (UnimplementedTabletManagerServer) UpdateVReplicationWorkflow(context.Context, *tabletmanagerdata.UpdateVReplicationWorkflowRequest) (*tabletmanagerdata.UpdateVReplicationWorkflowResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateVReplicationWorkflow not implemented") } func (UnimplementedTabletManagerServer) UpdateVReplicationWorkflows(context.Context, *tabletmanagerdata.UpdateVReplicationWorkflowsRequest) (*tabletmanagerdata.UpdateVReplicationWorkflowsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateVReplicationWorkflows not implemented") } +func (UnimplementedTabletManagerServer) ValidateVReplicationPermissions(context.Context, *tabletmanagerdata.ValidateVReplicationPermissionsRequest) (*tabletmanagerdata.ValidateVReplicationPermissionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidateVReplicationPermissions not implemented") +} +func (UnimplementedTabletManagerServer) VReplicationExec(context.Context, *tabletmanagerdata.VReplicationExecRequest) (*tabletmanagerdata.VReplicationExecResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VReplicationExec not implemented") +} +func (UnimplementedTabletManagerServer) VReplicationWaitForPos(context.Context, *tabletmanagerdata.VReplicationWaitForPosRequest) (*tabletmanagerdata.VReplicationWaitForPosResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VReplicationWaitForPos not implemented") +} func (UnimplementedTabletManagerServer) VDiff(context.Context, *tabletmanagerdata.VDiffRequest) (*tabletmanagerdata.VDiffResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VDiff not implemented") } @@ -938,6 +1051,9 @@ func (UnimplementedTabletManagerServer) InitPrimary(context.Context, *tabletmana func (UnimplementedTabletManagerServer) PopulateReparentJournal(context.Context, *tabletmanagerdata.PopulateReparentJournalRequest) (*tabletmanagerdata.PopulateReparentJournalResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PopulateReparentJournal not implemented") } +func (UnimplementedTabletManagerServer) ReadReparentJournalInfo(context.Context, *tabletmanagerdata.ReadReparentJournalInfoRequest) (*tabletmanagerdata.ReadReparentJournalInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReadReparentJournalInfo not implemented") +} func (UnimplementedTabletManagerServer) InitReplica(context.Context, *tabletmanagerdata.InitReplicaRequest) (*tabletmanagerdata.InitReplicaResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method InitReplica not implemented") } @@ -1137,6 +1253,24 @@ func _TabletManager_SetReadWrite_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _TabletManager_ChangeTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.ChangeTagsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).ChangeTags(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/ChangeTags", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).ChangeTags(ctx, req.(*tabletmanagerdata.ChangeTagsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TabletManager_ChangeType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(tabletmanagerdata.ChangeTypeRequest) if err := dec(in); err != nil { @@ -1389,6 +1523,78 @@ func _TabletManager_ExecuteFetchAsApp_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _TabletManager_GetUnresolvedTransactions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.GetUnresolvedTransactionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).GetUnresolvedTransactions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/GetUnresolvedTransactions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).GetUnresolvedTransactions(ctx, req.(*tabletmanagerdata.GetUnresolvedTransactionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_ReadTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.ReadTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).ReadTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/ReadTransaction", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).ReadTransaction(ctx, req.(*tabletmanagerdata.ReadTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_ConcludeTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.ConcludeTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).ConcludeTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/ConcludeTransaction", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).ConcludeTransaction(ctx, req.(*tabletmanagerdata.ConcludeTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_MysqlHostMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.MysqlHostMetricsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).MysqlHostMetrics(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/MysqlHostMetrics", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).MysqlHostMetrics(ctx, req.(*tabletmanagerdata.MysqlHostMetricsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TabletManager_ReplicationStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(tabletmanagerdata.ReplicationStatusRequest) if err := dec(in); err != nil { @@ -1569,6 +1775,24 @@ func _TabletManager_CreateVReplicationWorkflow_Handler(srv interface{}, ctx cont return interceptor(ctx, in, info, handler) } +func _TabletManager_DeleteTableData_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.DeleteTableDataRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).DeleteTableData(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/DeleteTableData", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).DeleteTableData(ctx, req.(*tabletmanagerdata.DeleteTableDataRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TabletManager_DeleteVReplicationWorkflow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(tabletmanagerdata.DeleteVReplicationWorkflowRequest) if err := dec(in); err != nil { @@ -1641,74 +1865,92 @@ func _TabletManager_ReadVReplicationWorkflows_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -func _TabletManager_VReplicationExec_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.VReplicationExecRequest) +func _TabletManager_UpdateVReplicationWorkflow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.UpdateVReplicationWorkflowRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).VReplicationExec(ctx, in) + return srv.(TabletManagerServer).UpdateVReplicationWorkflow(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/VReplicationExec", + FullMethod: "/tabletmanagerservice.TabletManager/UpdateVReplicationWorkflow", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).VReplicationExec(ctx, req.(*tabletmanagerdata.VReplicationExecRequest)) + return srv.(TabletManagerServer).UpdateVReplicationWorkflow(ctx, req.(*tabletmanagerdata.UpdateVReplicationWorkflowRequest)) } return interceptor(ctx, in, info, handler) } -func _TabletManager_VReplicationWaitForPos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.VReplicationWaitForPosRequest) +func _TabletManager_UpdateVReplicationWorkflows_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.UpdateVReplicationWorkflowsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).VReplicationWaitForPos(ctx, in) + return srv.(TabletManagerServer).UpdateVReplicationWorkflows(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/VReplicationWaitForPos", + FullMethod: "/tabletmanagerservice.TabletManager/UpdateVReplicationWorkflows", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).VReplicationWaitForPos(ctx, req.(*tabletmanagerdata.VReplicationWaitForPosRequest)) + return srv.(TabletManagerServer).UpdateVReplicationWorkflows(ctx, req.(*tabletmanagerdata.UpdateVReplicationWorkflowsRequest)) } return interceptor(ctx, in, info, handler) } -func _TabletManager_UpdateVReplicationWorkflow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.UpdateVReplicationWorkflowRequest) +func _TabletManager_ValidateVReplicationPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.ValidateVReplicationPermissionsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).UpdateVReplicationWorkflow(ctx, in) + return srv.(TabletManagerServer).ValidateVReplicationPermissions(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/UpdateVReplicationWorkflow", + FullMethod: "/tabletmanagerservice.TabletManager/ValidateVReplicationPermissions", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).UpdateVReplicationWorkflow(ctx, req.(*tabletmanagerdata.UpdateVReplicationWorkflowRequest)) + return srv.(TabletManagerServer).ValidateVReplicationPermissions(ctx, req.(*tabletmanagerdata.ValidateVReplicationPermissionsRequest)) } return interceptor(ctx, in, info, handler) } -func _TabletManager_UpdateVReplicationWorkflows_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(tabletmanagerdata.UpdateVReplicationWorkflowsRequest) +func _TabletManager_VReplicationExec_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.VReplicationExecRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TabletManagerServer).UpdateVReplicationWorkflows(ctx, in) + return srv.(TabletManagerServer).VReplicationExec(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tabletmanagerservice.TabletManager/UpdateVReplicationWorkflows", + FullMethod: "/tabletmanagerservice.TabletManager/VReplicationExec", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TabletManagerServer).UpdateVReplicationWorkflows(ctx, req.(*tabletmanagerdata.UpdateVReplicationWorkflowsRequest)) + return srv.(TabletManagerServer).VReplicationExec(ctx, req.(*tabletmanagerdata.VReplicationExecRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TabletManager_VReplicationWaitForPos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.VReplicationWaitForPosRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).VReplicationWaitForPos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/VReplicationWaitForPos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).VReplicationWaitForPos(ctx, req.(*tabletmanagerdata.VReplicationWaitForPosRequest)) } return interceptor(ctx, in, info, handler) } @@ -1785,6 +2027,24 @@ func _TabletManager_PopulateReparentJournal_Handler(srv interface{}, ctx context return interceptor(ctx, in, info, handler) } +func _TabletManager_ReadReparentJournalInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(tabletmanagerdata.ReadReparentJournalInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TabletManagerServer).ReadReparentJournalInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tabletmanagerservice.TabletManager/ReadReparentJournalInfo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TabletManagerServer).ReadReparentJournalInfo(ctx, req.(*tabletmanagerdata.ReadReparentJournalInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TabletManager_InitReplica_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(tabletmanagerdata.InitReplicaRequest) if err := dec(in); err != nil { @@ -2082,6 +2342,10 @@ var TabletManager_ServiceDesc = grpc.ServiceDesc{ MethodName: "SetReadWrite", Handler: _TabletManager_SetReadWrite_Handler, }, + { + MethodName: "ChangeTags", + Handler: _TabletManager_ChangeTags_Handler, + }, { MethodName: "ChangeType", Handler: _TabletManager_ChangeType_Handler, @@ -2138,6 +2402,22 @@ var TabletManager_ServiceDesc = grpc.ServiceDesc{ MethodName: "ExecuteFetchAsApp", Handler: _TabletManager_ExecuteFetchAsApp_Handler, }, + { + MethodName: "GetUnresolvedTransactions", + Handler: _TabletManager_GetUnresolvedTransactions_Handler, + }, + { + MethodName: "ReadTransaction", + Handler: _TabletManager_ReadTransaction_Handler, + }, + { + MethodName: "ConcludeTransaction", + Handler: _TabletManager_ConcludeTransaction_Handler, + }, + { + MethodName: "MysqlHostMetrics", + Handler: _TabletManager_MysqlHostMetrics_Handler, + }, { MethodName: "ReplicationStatus", Handler: _TabletManager_ReplicationStatus_Handler, @@ -2178,6 +2458,10 @@ var TabletManager_ServiceDesc = grpc.ServiceDesc{ MethodName: "CreateVReplicationWorkflow", Handler: _TabletManager_CreateVReplicationWorkflow_Handler, }, + { + MethodName: "DeleteTableData", + Handler: _TabletManager_DeleteTableData_Handler, + }, { MethodName: "DeleteVReplicationWorkflow", Handler: _TabletManager_DeleteVReplicationWorkflow_Handler, @@ -2194,14 +2478,6 @@ var TabletManager_ServiceDesc = grpc.ServiceDesc{ MethodName: "ReadVReplicationWorkflows", Handler: _TabletManager_ReadVReplicationWorkflows_Handler, }, - { - MethodName: "VReplicationExec", - Handler: _TabletManager_VReplicationExec_Handler, - }, - { - MethodName: "VReplicationWaitForPos", - Handler: _TabletManager_VReplicationWaitForPos_Handler, - }, { MethodName: "UpdateVReplicationWorkflow", Handler: _TabletManager_UpdateVReplicationWorkflow_Handler, @@ -2210,6 +2486,18 @@ var TabletManager_ServiceDesc = grpc.ServiceDesc{ MethodName: "UpdateVReplicationWorkflows", Handler: _TabletManager_UpdateVReplicationWorkflows_Handler, }, + { + MethodName: "ValidateVReplicationPermissions", + Handler: _TabletManager_ValidateVReplicationPermissions_Handler, + }, + { + MethodName: "VReplicationExec", + Handler: _TabletManager_VReplicationExec_Handler, + }, + { + MethodName: "VReplicationWaitForPos", + Handler: _TabletManager_VReplicationWaitForPos_Handler, + }, { MethodName: "VDiff", Handler: _TabletManager_VDiff_Handler, @@ -2226,6 +2514,10 @@ var TabletManager_ServiceDesc = grpc.ServiceDesc{ MethodName: "PopulateReparentJournal", Handler: _TabletManager_PopulateReparentJournal_Handler, }, + { + MethodName: "ReadReparentJournalInfo", + Handler: _TabletManager_ReadReparentJournalInfo_Handler, + }, { MethodName: "InitReplica", Handler: _TabletManager_InitReplica_Handler, diff --git a/go/vt/proto/throttlerdata/throttlerdata_vtproto.pb.go b/go/vt/proto/throttlerdata/throttlerdata_vtproto.pb.go index e032b7db8e8..c7e3369b6cd 100644 --- a/go/vt/proto/throttlerdata/throttlerdata_vtproto.pb.go +++ b/go/vt/proto/throttlerdata/throttlerdata_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: throttlerdata.proto package throttlerdata @@ -7,11 +7,11 @@ package throttlerdata import ( binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" math "math" - bits "math/bits" ) const ( @@ -25,7 +25,7 @@ func (m *MaxRatesRequest) CloneVT() *MaxRatesRequest { if m == nil { return (*MaxRatesRequest)(nil) } - r := &MaxRatesRequest{} + r := new(MaxRatesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -41,7 +41,7 @@ func (m *MaxRatesResponse) CloneVT() *MaxRatesResponse { if m == nil { return (*MaxRatesResponse)(nil) } - r := &MaxRatesResponse{} + r := new(MaxRatesResponse) if rhs := m.Rates; rhs != nil { tmpContainer := make(map[string]int64, len(rhs)) for k, v := range rhs { @@ -64,9 +64,8 @@ func (m *SetMaxRateRequest) CloneVT() *SetMaxRateRequest { if m == nil { return (*SetMaxRateRequest)(nil) } - r := &SetMaxRateRequest{ - Rate: m.Rate, - } + r := new(SetMaxRateRequest) + r.Rate = m.Rate if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -82,7 +81,7 @@ func (m *SetMaxRateResponse) CloneVT() *SetMaxRateResponse { if m == nil { return (*SetMaxRateResponse)(nil) } - r := &SetMaxRateResponse{} + r := new(SetMaxRateResponse) if rhs := m.Names; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -103,22 +102,21 @@ func (m *Configuration) CloneVT() *Configuration { if m == nil { return (*Configuration)(nil) } - r := &Configuration{ - TargetReplicationLagSec: m.TargetReplicationLagSec, - MaxReplicationLagSec: m.MaxReplicationLagSec, - InitialRate: m.InitialRate, - MaxIncrease: m.MaxIncrease, - EmergencyDecrease: m.EmergencyDecrease, - MinDurationBetweenIncreasesSec: m.MinDurationBetweenIncreasesSec, - MaxDurationBetweenIncreasesSec: m.MaxDurationBetweenIncreasesSec, - MinDurationBetweenDecreasesSec: m.MinDurationBetweenDecreasesSec, - SpreadBacklogAcrossSec: m.SpreadBacklogAcrossSec, - IgnoreNSlowestReplicas: m.IgnoreNSlowestReplicas, - IgnoreNSlowestRdonlys: m.IgnoreNSlowestRdonlys, - AgeBadRateAfterSec: m.AgeBadRateAfterSec, - BadRateIncrease: m.BadRateIncrease, - MaxRateApproachThreshold: m.MaxRateApproachThreshold, - } + r := new(Configuration) + r.TargetReplicationLagSec = m.TargetReplicationLagSec + r.MaxReplicationLagSec = m.MaxReplicationLagSec + r.InitialRate = m.InitialRate + r.MaxIncrease = m.MaxIncrease + r.EmergencyDecrease = m.EmergencyDecrease + r.MinDurationBetweenIncreasesSec = m.MinDurationBetweenIncreasesSec + r.MaxDurationBetweenIncreasesSec = m.MaxDurationBetweenIncreasesSec + r.MinDurationBetweenDecreasesSec = m.MinDurationBetweenDecreasesSec + r.SpreadBacklogAcrossSec = m.SpreadBacklogAcrossSec + r.IgnoreNSlowestReplicas = m.IgnoreNSlowestReplicas + r.IgnoreNSlowestRdonlys = m.IgnoreNSlowestRdonlys + r.AgeBadRateAfterSec = m.AgeBadRateAfterSec + r.BadRateIncrease = m.BadRateIncrease + r.MaxRateApproachThreshold = m.MaxRateApproachThreshold if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -134,9 +132,8 @@ func (m *GetConfigurationRequest) CloneVT() *GetConfigurationRequest { if m == nil { return (*GetConfigurationRequest)(nil) } - r := &GetConfigurationRequest{ - ThrottlerName: m.ThrottlerName, - } + r := new(GetConfigurationRequest) + r.ThrottlerName = m.ThrottlerName if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -152,7 +149,7 @@ func (m *GetConfigurationResponse) CloneVT() *GetConfigurationResponse { if m == nil { return (*GetConfigurationResponse)(nil) } - r := &GetConfigurationResponse{} + r := new(GetConfigurationResponse) if rhs := m.Configurations; rhs != nil { tmpContainer := make(map[string]*Configuration, len(rhs)) for k, v := range rhs { @@ -175,11 +172,10 @@ func (m *UpdateConfigurationRequest) CloneVT() *UpdateConfigurationRequest { if m == nil { return (*UpdateConfigurationRequest)(nil) } - r := &UpdateConfigurationRequest{ - ThrottlerName: m.ThrottlerName, - Configuration: m.Configuration.CloneVT(), - CopyZeroValues: m.CopyZeroValues, - } + r := new(UpdateConfigurationRequest) + r.ThrottlerName = m.ThrottlerName + r.Configuration = m.Configuration.CloneVT() + r.CopyZeroValues = m.CopyZeroValues if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -195,7 +191,7 @@ func (m *UpdateConfigurationResponse) CloneVT() *UpdateConfigurationResponse { if m == nil { return (*UpdateConfigurationResponse)(nil) } - r := &UpdateConfigurationResponse{} + r := new(UpdateConfigurationResponse) if rhs := m.Names; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -216,9 +212,8 @@ func (m *ResetConfigurationRequest) CloneVT() *ResetConfigurationRequest { if m == nil { return (*ResetConfigurationRequest)(nil) } - r := &ResetConfigurationRequest{ - ThrottlerName: m.ThrottlerName, - } + r := new(ResetConfigurationRequest) + r.ThrottlerName = m.ThrottlerName if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -234,7 +229,7 @@ func (m *ResetConfigurationResponse) CloneVT() *ResetConfigurationResponse { if m == nil { return (*ResetConfigurationResponse)(nil) } - r := &ResetConfigurationResponse{} + r := new(ResetConfigurationResponse) if rhs := m.Names; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -318,15 +313,15 @@ func (m *MaxRatesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for k := range m.Rates { v := m.Rates[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -365,7 +360,7 @@ func (m *SetMaxRateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Rate != 0 { - i = encodeVarint(dAtA, i, uint64(m.Rate)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Rate)) i-- dAtA[i] = 0x8 } @@ -406,7 +401,7 @@ func (m *SetMaxRateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Names) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Names[iNdEx]) copy(dAtA[i:], m.Names[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) i-- dAtA[i] = 0xa } @@ -457,37 +452,37 @@ func (m *Configuration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x69 } if m.AgeBadRateAfterSec != 0 { - i = encodeVarint(dAtA, i, uint64(m.AgeBadRateAfterSec)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.AgeBadRateAfterSec)) i-- dAtA[i] = 0x60 } if m.IgnoreNSlowestRdonlys != 0 { - i = encodeVarint(dAtA, i, uint64(m.IgnoreNSlowestRdonlys)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.IgnoreNSlowestRdonlys)) i-- dAtA[i] = 0x58 } if m.IgnoreNSlowestReplicas != 0 { - i = encodeVarint(dAtA, i, uint64(m.IgnoreNSlowestReplicas)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.IgnoreNSlowestReplicas)) i-- dAtA[i] = 0x50 } if m.SpreadBacklogAcrossSec != 0 { - i = encodeVarint(dAtA, i, uint64(m.SpreadBacklogAcrossSec)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.SpreadBacklogAcrossSec)) i-- dAtA[i] = 0x48 } if m.MinDurationBetweenDecreasesSec != 0 { - i = encodeVarint(dAtA, i, uint64(m.MinDurationBetweenDecreasesSec)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MinDurationBetweenDecreasesSec)) i-- dAtA[i] = 0x40 } if m.MaxDurationBetweenIncreasesSec != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxDurationBetweenIncreasesSec)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxDurationBetweenIncreasesSec)) i-- dAtA[i] = 0x38 } if m.MinDurationBetweenIncreasesSec != 0 { - i = encodeVarint(dAtA, i, uint64(m.MinDurationBetweenIncreasesSec)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MinDurationBetweenIncreasesSec)) i-- dAtA[i] = 0x30 } @@ -504,17 +499,17 @@ func (m *Configuration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x21 } if m.InitialRate != 0 { - i = encodeVarint(dAtA, i, uint64(m.InitialRate)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.InitialRate)) i-- dAtA[i] = 0x18 } if m.MaxReplicationLagSec != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxReplicationLagSec)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxReplicationLagSec)) i-- dAtA[i] = 0x10 } if m.TargetReplicationLagSec != 0 { - i = encodeVarint(dAtA, i, uint64(m.TargetReplicationLagSec)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TargetReplicationLagSec)) i-- dAtA[i] = 0x8 } @@ -554,7 +549,7 @@ func (m *GetConfigurationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro if len(m.ThrottlerName) > 0 { i -= len(m.ThrottlerName) copy(dAtA[i:], m.ThrottlerName) - i = encodeVarint(dAtA, i, uint64(len(m.ThrottlerName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ThrottlerName))) i-- dAtA[i] = 0xa } @@ -600,15 +595,15 @@ func (m *GetConfigurationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -662,14 +657,14 @@ func (m *UpdateConfigurationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ThrottlerName) > 0 { i -= len(m.ThrottlerName) copy(dAtA[i:], m.ThrottlerName) - i = encodeVarint(dAtA, i, uint64(len(m.ThrottlerName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ThrottlerName))) i-- dAtA[i] = 0xa } @@ -710,7 +705,7 @@ func (m *UpdateConfigurationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.Names) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Names[iNdEx]) copy(dAtA[i:], m.Names[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) i-- dAtA[i] = 0xa } @@ -751,7 +746,7 @@ func (m *ResetConfigurationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er if len(m.ThrottlerName) > 0 { i -= len(m.ThrottlerName) copy(dAtA[i:], m.ThrottlerName) - i = encodeVarint(dAtA, i, uint64(len(m.ThrottlerName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ThrottlerName))) i-- dAtA[i] = 0xa } @@ -792,7 +787,7 @@ func (m *ResetConfigurationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.Names) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Names[iNdEx]) copy(dAtA[i:], m.Names[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) i-- dAtA[i] = 0xa } @@ -800,17 +795,6 @@ func (m *ResetConfigurationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *MaxRatesRequest) SizeVT() (n int) { if m == nil { return 0 @@ -831,8 +815,8 @@ func (m *MaxRatesResponse) SizeVT() (n int) { for k, v := range m.Rates { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -846,7 +830,7 @@ func (m *SetMaxRateRequest) SizeVT() (n int) { var l int _ = l if m.Rate != 0 { - n += 1 + sov(uint64(m.Rate)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Rate)) } n += len(m.unknownFields) return n @@ -861,7 +845,7 @@ func (m *SetMaxRateResponse) SizeVT() (n int) { if len(m.Names) > 0 { for _, s := range m.Names { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -875,13 +859,13 @@ func (m *Configuration) SizeVT() (n int) { var l int _ = l if m.TargetReplicationLagSec != 0 { - n += 1 + sov(uint64(m.TargetReplicationLagSec)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TargetReplicationLagSec)) } if m.MaxReplicationLagSec != 0 { - n += 1 + sov(uint64(m.MaxReplicationLagSec)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxReplicationLagSec)) } if m.InitialRate != 0 { - n += 1 + sov(uint64(m.InitialRate)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.InitialRate)) } if m.MaxIncrease != 0 { n += 9 @@ -890,25 +874,25 @@ func (m *Configuration) SizeVT() (n int) { n += 9 } if m.MinDurationBetweenIncreasesSec != 0 { - n += 1 + sov(uint64(m.MinDurationBetweenIncreasesSec)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MinDurationBetweenIncreasesSec)) } if m.MaxDurationBetweenIncreasesSec != 0 { - n += 1 + sov(uint64(m.MaxDurationBetweenIncreasesSec)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxDurationBetweenIncreasesSec)) } if m.MinDurationBetweenDecreasesSec != 0 { - n += 1 + sov(uint64(m.MinDurationBetweenDecreasesSec)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MinDurationBetweenDecreasesSec)) } if m.SpreadBacklogAcrossSec != 0 { - n += 1 + sov(uint64(m.SpreadBacklogAcrossSec)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.SpreadBacklogAcrossSec)) } if m.IgnoreNSlowestReplicas != 0 { - n += 1 + sov(uint64(m.IgnoreNSlowestReplicas)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.IgnoreNSlowestReplicas)) } if m.IgnoreNSlowestRdonlys != 0 { - n += 1 + sov(uint64(m.IgnoreNSlowestRdonlys)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.IgnoreNSlowestRdonlys)) } if m.AgeBadRateAfterSec != 0 { - n += 1 + sov(uint64(m.AgeBadRateAfterSec)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.AgeBadRateAfterSec)) } if m.BadRateIncrease != 0 { n += 9 @@ -928,7 +912,7 @@ func (m *GetConfigurationRequest) SizeVT() (n int) { _ = l l = len(m.ThrottlerName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -948,9 +932,9 @@ func (m *GetConfigurationResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -965,11 +949,11 @@ func (m *UpdateConfigurationRequest) SizeVT() (n int) { _ = l l = len(m.ThrottlerName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Configuration != nil { l = m.Configuration.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CopyZeroValues { n += 2 @@ -987,7 +971,7 @@ func (m *UpdateConfigurationResponse) SizeVT() (n int) { if len(m.Names) > 0 { for _, s := range m.Names { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1002,7 +986,7 @@ func (m *ResetConfigurationRequest) SizeVT() (n int) { _ = l l = len(m.ThrottlerName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1017,19 +1001,13 @@ func (m *ResetConfigurationResponse) SizeVT() (n int) { if len(m.Names) > 0 { for _, s := range m.Names { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *MaxRatesRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1038,7 +1016,7 @@ func (m *MaxRatesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1061,12 +1039,12 @@ func (m *MaxRatesRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1089,7 +1067,7 @@ func (m *MaxRatesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1117,7 +1095,7 @@ func (m *MaxRatesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1130,11 +1108,11 @@ func (m *MaxRatesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1149,7 +1127,7 @@ func (m *MaxRatesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1166,7 +1144,7 @@ func (m *MaxRatesResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1180,11 +1158,11 @@ func (m *MaxRatesResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -1194,7 +1172,7 @@ func (m *MaxRatesResponse) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1208,12 +1186,12 @@ func (m *MaxRatesResponse) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -1225,12 +1203,12 @@ func (m *MaxRatesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1253,7 +1231,7 @@ func (m *SetMaxRateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1281,7 +1259,7 @@ func (m *SetMaxRateRequest) UnmarshalVT(dAtA []byte) error { m.Rate = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1295,12 +1273,12 @@ func (m *SetMaxRateRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1323,7 +1301,7 @@ func (m *SetMaxRateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1351,7 +1329,7 @@ func (m *SetMaxRateResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1365,11 +1343,11 @@ func (m *SetMaxRateResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1378,12 +1356,12 @@ func (m *SetMaxRateResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1406,7 +1384,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1434,7 +1412,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.TargetReplicationLagSec = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1453,7 +1431,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.MaxReplicationLagSec = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1472,7 +1450,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.InitialRate = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1513,7 +1491,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.MinDurationBetweenIncreasesSec = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1532,7 +1510,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.MaxDurationBetweenIncreasesSec = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1551,7 +1529,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.MinDurationBetweenDecreasesSec = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1570,7 +1548,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.SpreadBacklogAcrossSec = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1589,7 +1567,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.IgnoreNSlowestReplicas = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1608,7 +1586,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.IgnoreNSlowestRdonlys = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1627,7 +1605,7 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.AgeBadRateAfterSec = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1663,12 +1641,12 @@ func (m *Configuration) UnmarshalVT(dAtA []byte) error { m.MaxRateApproachThreshold = float64(math.Float64frombits(v)) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1691,7 +1669,7 @@ func (m *GetConfigurationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1719,7 +1697,7 @@ func (m *GetConfigurationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1733,11 +1711,11 @@ func (m *GetConfigurationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1746,12 +1724,12 @@ func (m *GetConfigurationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1774,7 +1752,7 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1802,7 +1780,7 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1815,11 +1793,11 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1834,7 +1812,7 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1851,7 +1829,7 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1865,11 +1843,11 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -1880,7 +1858,7 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1893,11 +1871,11 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -1909,12 +1887,12 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -1926,12 +1904,12 @@ func (m *GetConfigurationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1954,7 +1932,7 @@ func (m *UpdateConfigurationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1982,7 +1960,7 @@ func (m *UpdateConfigurationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1996,11 +1974,11 @@ func (m *UpdateConfigurationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2014,7 +1992,7 @@ func (m *UpdateConfigurationRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2027,11 +2005,11 @@ func (m *UpdateConfigurationRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2050,7 +2028,7 @@ func (m *UpdateConfigurationRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2065,12 +2043,12 @@ func (m *UpdateConfigurationRequest) UnmarshalVT(dAtA []byte) error { m.CopyZeroValues = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2093,7 +2071,7 @@ func (m *UpdateConfigurationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2121,7 +2099,7 @@ func (m *UpdateConfigurationResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2135,11 +2113,11 @@ func (m *UpdateConfigurationResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2148,12 +2126,12 @@ func (m *UpdateConfigurationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2176,7 +2154,7 @@ func (m *ResetConfigurationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2204,7 +2182,7 @@ func (m *ResetConfigurationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2218,11 +2196,11 @@ func (m *ResetConfigurationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2231,12 +2209,12 @@ func (m *ResetConfigurationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2259,7 +2237,7 @@ func (m *ResetConfigurationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2287,7 +2265,7 @@ func (m *ResetConfigurationResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2301,11 +2279,11 @@ func (m *ResetConfigurationResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2314,12 +2292,12 @@ func (m *ResetConfigurationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2334,88 +2312,3 @@ func (m *ResetConfigurationResponse) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/topodata/cached_size.go b/go/vt/proto/topodata/cached_size.go index d06ebd0d3f0..94b7fc6818c 100644 --- a/go/vt/proto/topodata/cached_size.go +++ b/go/vt/proto/topodata/cached_size.go @@ -27,10 +27,6 @@ func (cached *KeyRange) CachedSize(alloc bool) int64 { if alloc { size += int64(96) } - // field unknownFields []byte - { - size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) - } // field Start []byte { size += hack.RuntimeAllocSize(int64(cap(cached.Start))) @@ -49,10 +45,6 @@ func (cached *ThrottledAppRule) CachedSize(alloc bool) int64 { if alloc { size += int64(80) } - // field unknownFields []byte - { - size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) - } // field Name string size += hack.RuntimeAllocSize(int64(len(cached.Name))) // field ExpiresAt *vitess.io/vitess/go/vt/proto/vttime.Time diff --git a/go/vt/proto/topodata/topodata_vtproto.pb.go b/go/vt/proto/topodata/topodata_vtproto.pb.go index 98a365e3bcd..9defb49a6be 100644 --- a/go/vt/proto/topodata/topodata_vtproto.pb.go +++ b/go/vt/proto/topodata/topodata_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: topodata.proto package topodata @@ -7,11 +7,11 @@ package topodata import ( binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" math "math" - bits "math/bits" vttime "vitess.io/vitess/go/vt/proto/vttime" ) @@ -26,7 +26,7 @@ func (m *KeyRange) CloneVT() *KeyRange { if m == nil { return (*KeyRange)(nil) } - r := &KeyRange{} + r := new(KeyRange) if rhs := m.Start; rhs != nil { tmpBytes := make([]byte, len(rhs)) copy(tmpBytes, rhs) @@ -52,10 +52,9 @@ func (m *TabletAlias) CloneVT() *TabletAlias { if m == nil { return (*TabletAlias)(nil) } - r := &TabletAlias{ - Cell: m.Cell, - Uid: m.Uid, - } + r := new(TabletAlias) + r.Cell = m.Cell + r.Uid = m.Uid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -71,19 +70,18 @@ func (m *Tablet) CloneVT() *Tablet { if m == nil { return (*Tablet)(nil) } - r := &Tablet{ - Alias: m.Alias.CloneVT(), - Hostname: m.Hostname, - Keyspace: m.Keyspace, - Shard: m.Shard, - KeyRange: m.KeyRange.CloneVT(), - Type: m.Type, - DbNameOverride: m.DbNameOverride, - MysqlHostname: m.MysqlHostname, - MysqlPort: m.MysqlPort, - PrimaryTermStartTime: m.PrimaryTermStartTime.CloneVT(), - DefaultConnCollation: m.DefaultConnCollation, - } + r := new(Tablet) + r.Alias = m.Alias.CloneVT() + r.Hostname = m.Hostname + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.KeyRange = m.KeyRange.CloneVT() + r.Type = m.Type + r.DbNameOverride = m.DbNameOverride + r.MysqlHostname = m.MysqlHostname + r.MysqlPort = m.MysqlPort + r.PrimaryTermStartTime = m.PrimaryTermStartTime.CloneVT() + r.DefaultConnCollation = m.DefaultConnCollation if rhs := m.PortMap; rhs != nil { tmpContainer := make(map[string]int32, len(rhs)) for k, v := range rhs { @@ -113,12 +111,11 @@ func (m *Shard_SourceShard) CloneVT() *Shard_SourceShard { if m == nil { return (*Shard_SourceShard)(nil) } - r := &Shard_SourceShard{ - Uid: m.Uid, - Keyspace: m.Keyspace, - Shard: m.Shard, - KeyRange: m.KeyRange.CloneVT(), - } + r := new(Shard_SourceShard) + r.Uid = m.Uid + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.KeyRange = m.KeyRange.CloneVT() if rhs := m.Tables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -139,10 +136,9 @@ func (m *Shard_TabletControl) CloneVT() *Shard_TabletControl { if m == nil { return (*Shard_TabletControl)(nil) } - r := &Shard_TabletControl{ - TabletType: m.TabletType, - Frozen: m.Frozen, - } + r := new(Shard_TabletControl) + r.TabletType = m.TabletType + r.Frozen = m.Frozen if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -168,12 +164,11 @@ func (m *Shard) CloneVT() *Shard { if m == nil { return (*Shard)(nil) } - r := &Shard{ - PrimaryAlias: m.PrimaryAlias.CloneVT(), - PrimaryTermStartTime: m.PrimaryTermStartTime.CloneVT(), - KeyRange: m.KeyRange.CloneVT(), - IsPrimaryServing: m.IsPrimaryServing, - } + r := new(Shard) + r.PrimaryAlias = m.PrimaryAlias.CloneVT() + r.PrimaryTermStartTime = m.PrimaryTermStartTime.CloneVT() + r.KeyRange = m.KeyRange.CloneVT() + r.IsPrimaryServing = m.IsPrimaryServing if rhs := m.SourceShards; rhs != nil { tmpContainer := make([]*Shard_SourceShard, len(rhs)) for k, v := range rhs { @@ -203,14 +198,13 @@ func (m *Keyspace) CloneVT() *Keyspace { if m == nil { return (*Keyspace)(nil) } - r := &Keyspace{ - KeyspaceType: m.KeyspaceType, - BaseKeyspace: m.BaseKeyspace, - SnapshotTime: m.SnapshotTime.CloneVT(), - DurabilityPolicy: m.DurabilityPolicy, - ThrottlerConfig: m.ThrottlerConfig.CloneVT(), - SidecarDbName: m.SidecarDbName, - } + r := new(Keyspace) + r.KeyspaceType = m.KeyspaceType + r.BaseKeyspace = m.BaseKeyspace + r.SnapshotTime = m.SnapshotTime.CloneVT() + r.DurabilityPolicy = m.DurabilityPolicy + r.ThrottlerConfig = m.ThrottlerConfig.CloneVT() + r.SidecarDbName = m.SidecarDbName if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -226,9 +220,8 @@ func (m *ShardReplication_Node) CloneVT() *ShardReplication_Node { if m == nil { return (*ShardReplication_Node)(nil) } - r := &ShardReplication_Node{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(ShardReplication_Node) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -244,7 +237,7 @@ func (m *ShardReplication) CloneVT() *ShardReplication { if m == nil { return (*ShardReplication)(nil) } - r := &ShardReplication{} + r := new(ShardReplication) if rhs := m.Nodes; rhs != nil { tmpContainer := make([]*ShardReplication_Node, len(rhs)) for k, v := range rhs { @@ -267,10 +260,9 @@ func (m *ShardReplicationError) CloneVT() *ShardReplicationError { if m == nil { return (*ShardReplicationError)(nil) } - r := &ShardReplicationError{ - Type: m.Type, - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(ShardReplicationError) + r.Type = m.Type + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -286,10 +278,9 @@ func (m *ShardReference) CloneVT() *ShardReference { if m == nil { return (*ShardReference)(nil) } - r := &ShardReference{ - Name: m.Name, - KeyRange: m.KeyRange.CloneVT(), - } + r := new(ShardReference) + r.Name = m.Name + r.KeyRange = m.KeyRange.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -305,11 +296,10 @@ func (m *ShardTabletControl) CloneVT() *ShardTabletControl { if m == nil { return (*ShardTabletControl)(nil) } - r := &ShardTabletControl{ - Name: m.Name, - KeyRange: m.KeyRange.CloneVT(), - QueryServiceDisabled: m.QueryServiceDisabled, - } + r := new(ShardTabletControl) + r.Name = m.Name + r.KeyRange = m.KeyRange.CloneVT() + r.QueryServiceDisabled = m.QueryServiceDisabled if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -325,12 +315,11 @@ func (m *ThrottledAppRule) CloneVT() *ThrottledAppRule { if m == nil { return (*ThrottledAppRule)(nil) } - r := &ThrottledAppRule{ - Name: m.Name, - Ratio: m.Ratio, - ExpiresAt: m.ExpiresAt.CloneVT(), - Exempt: m.Exempt, - } + r := new(ThrottledAppRule) + r.Name = m.Name + r.Ratio = m.Ratio + r.ExpiresAt = m.ExpiresAt.CloneVT() + r.Exempt = m.Exempt if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -346,7 +335,7 @@ func (m *ThrottlerConfig_MetricNames) CloneVT() *ThrottlerConfig_MetricNames { if m == nil { return (*ThrottlerConfig_MetricNames)(nil) } - r := &ThrottlerConfig_MetricNames{} + r := new(ThrottlerConfig_MetricNames) if rhs := m.Names; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -367,12 +356,11 @@ func (m *ThrottlerConfig) CloneVT() *ThrottlerConfig { if m == nil { return (*ThrottlerConfig)(nil) } - r := &ThrottlerConfig{ - Enabled: m.Enabled, - Threshold: m.Threshold, - CustomQuery: m.CustomQuery, - CheckAsCheckSelf: m.CheckAsCheckSelf, - } + r := new(ThrottlerConfig) + r.Enabled = m.Enabled + r.Threshold = m.Threshold + r.CustomQuery = m.CustomQuery + r.CheckAsCheckSelf = m.CheckAsCheckSelf if rhs := m.ThrottledApps; rhs != nil { tmpContainer := make(map[string]*ThrottledAppRule, len(rhs)) for k, v := range rhs { @@ -409,9 +397,8 @@ func (m *SrvKeyspace_KeyspacePartition) CloneVT() *SrvKeyspace_KeyspacePartition if m == nil { return (*SrvKeyspace_KeyspacePartition)(nil) } - r := &SrvKeyspace_KeyspacePartition{ - ServedType: m.ServedType, - } + r := new(SrvKeyspace_KeyspacePartition) + r.ServedType = m.ServedType if rhs := m.ShardReferences; rhs != nil { tmpContainer := make([]*ShardReference, len(rhs)) for k, v := range rhs { @@ -441,9 +428,8 @@ func (m *SrvKeyspace) CloneVT() *SrvKeyspace { if m == nil { return (*SrvKeyspace)(nil) } - r := &SrvKeyspace{ - ThrottlerConfig: m.ThrottlerConfig.CloneVT(), - } + r := new(SrvKeyspace) + r.ThrottlerConfig = m.ThrottlerConfig.CloneVT() if rhs := m.Partitions; rhs != nil { tmpContainer := make([]*SrvKeyspace_KeyspacePartition, len(rhs)) for k, v := range rhs { @@ -466,10 +452,9 @@ func (m *CellInfo) CloneVT() *CellInfo { if m == nil { return (*CellInfo)(nil) } - r := &CellInfo{ - ServerAddress: m.ServerAddress, - Root: m.Root, - } + r := new(CellInfo) + r.ServerAddress = m.ServerAddress + r.Root = m.Root if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -485,7 +470,7 @@ func (m *CellsAlias) CloneVT() *CellsAlias { if m == nil { return (*CellsAlias)(nil) } - r := &CellsAlias{} + r := new(CellsAlias) if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -506,11 +491,10 @@ func (m *TopoConfig) CloneVT() *TopoConfig { if m == nil { return (*TopoConfig)(nil) } - r := &TopoConfig{ - TopoType: m.TopoType, - Server: m.Server, - Root: m.Root, - } + r := new(TopoConfig) + r.TopoType = m.TopoType + r.Server = m.Server + r.Root = m.Root if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -526,9 +510,8 @@ func (m *ExternalVitessCluster) CloneVT() *ExternalVitessCluster { if m == nil { return (*ExternalVitessCluster)(nil) } - r := &ExternalVitessCluster{ - TopoConfig: m.TopoConfig.CloneVT(), - } + r := new(ExternalVitessCluster) + r.TopoConfig = m.TopoConfig.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -544,7 +527,7 @@ func (m *ExternalClusters) CloneVT() *ExternalClusters { if m == nil { return (*ExternalClusters)(nil) } - r := &ExternalClusters{} + r := new(ExternalClusters) if rhs := m.VitessCluster; rhs != nil { tmpContainer := make([]*ExternalVitessCluster, len(rhs)) for k, v := range rhs { @@ -596,14 +579,14 @@ func (m *KeyRange) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.End) > 0 { i -= len(m.End) copy(dAtA[i:], m.End) - i = encodeVarint(dAtA, i, uint64(len(m.End))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.End))) i-- dAtA[i] = 0x12 } if len(m.Start) > 0 { i -= len(m.Start) copy(dAtA[i:], m.Start) - i = encodeVarint(dAtA, i, uint64(len(m.Start))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Start))) i-- dAtA[i] = 0xa } @@ -641,14 +624,14 @@ func (m *TabletAlias) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Uid != 0 { - i = encodeVarint(dAtA, i, uint64(m.Uid)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Uid)) i-- dAtA[i] = 0x10 } if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0xa } @@ -686,7 +669,7 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.DefaultConnCollation != 0 { - i = encodeVarint(dAtA, i, uint64(m.DefaultConnCollation)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.DefaultConnCollation)) i-- dAtA[i] = 0x1 i-- @@ -698,19 +681,19 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x72 } if m.MysqlPort != 0 { - i = encodeVarint(dAtA, i, uint64(m.MysqlPort)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MysqlPort)) i-- dAtA[i] = 0x68 } if len(m.MysqlHostname) > 0 { i -= len(m.MysqlHostname) copy(dAtA[i:], m.MysqlHostname) - i = encodeVarint(dAtA, i, uint64(len(m.MysqlHostname))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MysqlHostname))) i-- dAtA[i] = 0x62 } @@ -720,15 +703,15 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x52 } @@ -736,12 +719,12 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.DbNameOverride) > 0 { i -= len(m.DbNameOverride) copy(dAtA[i:], m.DbNameOverride) - i = encodeVarint(dAtA, i, uint64(len(m.DbNameOverride))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DbNameOverride))) i-- dAtA[i] = 0x4a } if m.Type != 0 { - i = encodeVarint(dAtA, i, uint64(m.Type)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Type)) i-- dAtA[i] = 0x40 } @@ -751,21 +734,21 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x3a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x32 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x2a } @@ -773,15 +756,15 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for k := range m.PortMap { v := m.PortMap[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x22 } @@ -789,7 +772,7 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Hostname) > 0 { i -= len(m.Hostname) copy(dAtA[i:], m.Hostname) - i = encodeVarint(dAtA, i, uint64(len(m.Hostname))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Hostname))) i-- dAtA[i] = 0x12 } @@ -799,7 +782,7 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -840,7 +823,7 @@ func (m *Shard_SourceShard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Tables[iNdEx]) copy(dAtA[i:], m.Tables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -851,26 +834,26 @@ func (m *Shard_SourceShard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if m.Uid != 0 { - i = encodeVarint(dAtA, i, uint64(m.Uid)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Uid)) i-- dAtA[i] = 0x8 } @@ -921,7 +904,7 @@ func (m *Shard_TabletControl) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.DeniedTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.DeniedTables[iNdEx]) copy(dAtA[i:], m.DeniedTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.DeniedTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DeniedTables[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -930,13 +913,13 @@ func (m *Shard_TabletControl) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } } if m.TabletType != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletType)) i-- dAtA[i] = 0x8 } @@ -979,7 +962,7 @@ func (m *Shard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x42 } @@ -1000,7 +983,7 @@ func (m *Shard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -1012,7 +995,7 @@ func (m *Shard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -1023,7 +1006,7 @@ func (m *Shard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1033,7 +1016,7 @@ func (m *Shard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1073,7 +1056,7 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.SidecarDbName) > 0 { i -= len(m.SidecarDbName) copy(dAtA[i:], m.SidecarDbName) - i = encodeVarint(dAtA, i, uint64(len(m.SidecarDbName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SidecarDbName))) i-- dAtA[i] = 0x52 } @@ -1083,14 +1066,14 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x4a } if len(m.DurabilityPolicy) > 0 { i -= len(m.DurabilityPolicy) copy(dAtA[i:], m.DurabilityPolicy) - i = encodeVarint(dAtA, i, uint64(len(m.DurabilityPolicy))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DurabilityPolicy))) i-- dAtA[i] = 0x42 } @@ -1100,19 +1083,19 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x3a } if len(m.BaseKeyspace) > 0 { i -= len(m.BaseKeyspace) copy(dAtA[i:], m.BaseKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.BaseKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BaseKeyspace))) i-- dAtA[i] = 0x32 } if m.KeyspaceType != 0 { - i = encodeVarint(dAtA, i, uint64(m.KeyspaceType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.KeyspaceType)) i-- dAtA[i] = 0x28 } @@ -1155,7 +1138,7 @@ func (m *ShardReplication_Node) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1199,7 +1182,7 @@ func (m *ShardReplication) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1243,12 +1226,12 @@ func (m *ShardReplicationError) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if m.Type != 0 { - i = encodeVarint(dAtA, i, uint64(m.Type)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Type)) i-- dAtA[i] = 0x8 } @@ -1291,14 +1274,14 @@ func (m *ShardReference) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -1351,14 +1334,14 @@ func (m *ShardTabletControl) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -1411,7 +1394,7 @@ func (m *ThrottledAppRule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1424,7 +1407,7 @@ func (m *ThrottledAppRule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -1465,7 +1448,7 @@ func (m *ThrottlerConfig_MetricNames) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.Names) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Names[iNdEx]) copy(dAtA[i:], m.Names[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) i-- dAtA[i] = 0xa } @@ -1513,10 +1496,10 @@ func (m *ThrottlerConfig) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x11 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x3a } @@ -1530,15 +1513,15 @@ func (m *ThrottlerConfig) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x32 } @@ -1552,15 +1535,15 @@ func (m *ThrottlerConfig) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x2a } @@ -1578,7 +1561,7 @@ func (m *ThrottlerConfig) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.CustomQuery) > 0 { i -= len(m.CustomQuery) copy(dAtA[i:], m.CustomQuery) - i = encodeVarint(dAtA, i, uint64(len(m.CustomQuery))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CustomQuery))) i-- dAtA[i] = 0x1a } @@ -1638,7 +1621,7 @@ func (m *SrvKeyspace_KeyspacePartition) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1650,13 +1633,13 @@ func (m *SrvKeyspace_KeyspacePartition) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } } if m.ServedType != 0 { - i = encodeVarint(dAtA, i, uint64(m.ServedType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ServedType)) i-- dAtA[i] = 0x8 } @@ -1699,7 +1682,7 @@ func (m *SrvKeyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -1710,7 +1693,7 @@ func (m *SrvKeyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1751,14 +1734,14 @@ func (m *CellInfo) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Root) > 0 { i -= len(m.Root) copy(dAtA[i:], m.Root) - i = encodeVarint(dAtA, i, uint64(len(m.Root))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Root))) i-- dAtA[i] = 0x12 } if len(m.ServerAddress) > 0 { i -= len(m.ServerAddress) copy(dAtA[i:], m.ServerAddress) - i = encodeVarint(dAtA, i, uint64(len(m.ServerAddress))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ServerAddress))) i-- dAtA[i] = 0xa } @@ -1799,7 +1782,7 @@ func (m *CellsAlias) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -1840,21 +1823,21 @@ func (m *TopoConfig) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Root) > 0 { i -= len(m.Root) copy(dAtA[i:], m.Root) - i = encodeVarint(dAtA, i, uint64(len(m.Root))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Root))) i-- dAtA[i] = 0x1a } if len(m.Server) > 0 { i -= len(m.Server) copy(dAtA[i:], m.Server) - i = encodeVarint(dAtA, i, uint64(len(m.Server))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Server))) i-- dAtA[i] = 0x12 } if len(m.TopoType) > 0 { i -= len(m.TopoType) copy(dAtA[i:], m.TopoType) - i = encodeVarint(dAtA, i, uint64(len(m.TopoType))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TopoType))) i-- dAtA[i] = 0xa } @@ -1897,7 +1880,7 @@ func (m *ExternalVitessCluster) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1941,7 +1924,7 @@ func (m *ExternalClusters) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1949,17 +1932,6 @@ func (m *ExternalClusters) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *KeyRange) SizeVT() (n int) { if m == nil { return 0 @@ -1968,11 +1940,11 @@ func (m *KeyRange) SizeVT() (n int) { _ = l l = len(m.Start) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.End) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1986,10 +1958,10 @@ func (m *TabletAlias) SizeVT() (n int) { _ = l l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Uid != 0 { - n += 1 + sov(uint64(m.Uid)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Uid)) } n += len(m.unknownFields) return n @@ -2003,60 +1975,60 @@ func (m *Tablet) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Hostname) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.PortMap) > 0 { for k, v := range m.PortMap { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeyRange != nil { l = m.KeyRange.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Type != 0 { - n += 1 + sov(uint64(m.Type)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Type)) } l = len(m.DbNameOverride) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Tags) > 0 { for k, v := range m.Tags { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } l = len(m.MysqlHostname) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.MysqlPort != 0 { - n += 1 + sov(uint64(m.MysqlPort)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MysqlPort)) } if m.PrimaryTermStartTime != nil { l = m.PrimaryTermStartTime.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.DefaultConnCollation != 0 { - n += 2 + sov(uint64(m.DefaultConnCollation)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.DefaultConnCollation)) } n += len(m.unknownFields) return n @@ -2069,24 +2041,24 @@ func (m *Shard_SourceShard) SizeVT() (n int) { var l int _ = l if m.Uid != 0 { - n += 1 + sov(uint64(m.Uid)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Uid)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeyRange != nil { l = m.KeyRange.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Tables) > 0 { for _, s := range m.Tables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -2100,18 +2072,18 @@ func (m *Shard_TabletControl) SizeVT() (n int) { var l int _ = l if m.TabletType != 0 { - n += 1 + sov(uint64(m.TabletType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletType)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.DeniedTables) > 0 { for _, s := range m.DeniedTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Frozen { @@ -2129,22 +2101,22 @@ func (m *Shard) SizeVT() (n int) { _ = l if m.PrimaryAlias != nil { l = m.PrimaryAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeyRange != nil { l = m.KeyRange.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.SourceShards) > 0 { for _, e := range m.SourceShards { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TabletControls) > 0 { for _, e := range m.TabletControls { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.IsPrimaryServing { @@ -2152,7 +2124,7 @@ func (m *Shard) SizeVT() (n int) { } if m.PrimaryTermStartTime != nil { l = m.PrimaryTermStartTime.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2165,27 +2137,27 @@ func (m *Keyspace) SizeVT() (n int) { var l int _ = l if m.KeyspaceType != 0 { - n += 1 + sov(uint64(m.KeyspaceType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.KeyspaceType)) } l = len(m.BaseKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SnapshotTime != nil { l = m.SnapshotTime.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.DurabilityPolicy) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ThrottlerConfig != nil { l = m.ThrottlerConfig.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SidecarDbName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2199,7 +2171,7 @@ func (m *ShardReplication_Node) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2214,7 +2186,7 @@ func (m *ShardReplication) SizeVT() (n int) { if len(m.Nodes) > 0 { for _, e := range m.Nodes { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -2228,11 +2200,11 @@ func (m *ShardReplicationError) SizeVT() (n int) { var l int _ = l if m.Type != 0 { - n += 1 + sov(uint64(m.Type)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Type)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2246,11 +2218,11 @@ func (m *ShardReference) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeyRange != nil { l = m.KeyRange.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2264,11 +2236,11 @@ func (m *ShardTabletControl) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeyRange != nil { l = m.KeyRange.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.QueryServiceDisabled { n += 2 @@ -2285,14 +2257,14 @@ func (m *ThrottledAppRule) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Ratio != 0 { n += 9 } if m.ExpiresAt != nil { l = m.ExpiresAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Exempt { n += 2 @@ -2310,7 +2282,7 @@ func (m *ThrottlerConfig_MetricNames) SizeVT() (n int) { if len(m.Names) > 0 { for _, s := range m.Names { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -2331,7 +2303,7 @@ func (m *ThrottlerConfig) SizeVT() (n int) { } l = len(m.CustomQuery) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CheckAsCheckSelf { n += 2 @@ -2344,9 +2316,9 @@ func (m *ThrottlerConfig) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if len(m.AppCheckedMetrics) > 0 { @@ -2357,17 +2329,17 @@ func (m *ThrottlerConfig) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if len(m.MetricThresholds) > 0 { for k, v := range m.MetricThresholds { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + 8 - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + 8 + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -2381,18 +2353,18 @@ func (m *SrvKeyspace_KeyspacePartition) SizeVT() (n int) { var l int _ = l if m.ServedType != 0 { - n += 1 + sov(uint64(m.ServedType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ServedType)) } if len(m.ShardReferences) > 0 { for _, e := range m.ShardReferences { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ShardTabletControls) > 0 { for _, e := range m.ShardTabletControls { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -2408,12 +2380,12 @@ func (m *SrvKeyspace) SizeVT() (n int) { if len(m.Partitions) > 0 { for _, e := range m.Partitions { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.ThrottlerConfig != nil { l = m.ThrottlerConfig.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2427,11 +2399,11 @@ func (m *CellInfo) SizeVT() (n int) { _ = l l = len(m.ServerAddress) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Root) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2446,7 +2418,7 @@ func (m *CellsAlias) SizeVT() (n int) { if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -2461,15 +2433,15 @@ func (m *TopoConfig) SizeVT() (n int) { _ = l l = len(m.TopoType) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Server) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Root) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2483,7 +2455,7 @@ func (m *ExternalVitessCluster) SizeVT() (n int) { _ = l if m.TopoConfig != nil { l = m.TopoConfig.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2498,19 +2470,13 @@ func (m *ExternalClusters) SizeVT() (n int) { if len(m.VitessCluster) > 0 { for _, e := range m.VitessCluster { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *KeyRange) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2519,7 +2485,7 @@ func (m *KeyRange) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2547,7 +2513,7 @@ func (m *KeyRange) UnmarshalVT(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2560,11 +2526,11 @@ func (m *KeyRange) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2581,7 +2547,7 @@ func (m *KeyRange) UnmarshalVT(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2594,11 +2560,11 @@ func (m *KeyRange) UnmarshalVT(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2610,12 +2576,12 @@ func (m *KeyRange) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2638,7 +2604,7 @@ func (m *TabletAlias) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2666,7 +2632,7 @@ func (m *TabletAlias) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2680,11 +2646,11 @@ func (m *TabletAlias) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2698,7 +2664,7 @@ func (m *TabletAlias) UnmarshalVT(dAtA []byte) error { m.Uid = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2712,12 +2678,12 @@ func (m *TabletAlias) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2740,7 +2706,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2768,7 +2734,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2781,11 +2747,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2804,7 +2770,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2818,11 +2784,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2836,7 +2802,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2849,11 +2815,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2868,7 +2834,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2885,7 +2851,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2899,11 +2865,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -2913,7 +2879,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2927,12 +2893,12 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -2949,7 +2915,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2963,11 +2929,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2981,7 +2947,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2995,11 +2961,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3013,7 +2979,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3026,11 +2992,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3049,7 +3015,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3068,7 +3034,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3082,11 +3048,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3100,7 +3066,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3113,11 +3079,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3132,7 +3098,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3149,7 +3115,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3163,11 +3129,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -3178,7 +3144,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3192,11 +3158,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } intStringLenmapvalue := int(stringLenmapvalue) if intStringLenmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapvalue := iNdEx + intStringLenmapvalue if postStringIndexmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF @@ -3205,12 +3171,12 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -3227,7 +3193,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3241,11 +3207,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3259,7 +3225,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { m.MysqlPort = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3278,7 +3244,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3291,11 +3257,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3314,7 +3280,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { m.DefaultConnCollation = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3328,12 +3294,12 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3356,7 +3322,7 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3384,7 +3350,7 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { m.Uid = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3403,7 +3369,7 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3417,11 +3383,11 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3435,7 +3401,7 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3449,11 +3415,11 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3467,7 +3433,7 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3480,11 +3446,11 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3503,7 +3469,7 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3517,11 +3483,11 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3530,12 +3496,12 @@ func (m *Shard_SourceShard) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3558,7 +3524,7 @@ func (m *Shard_TabletControl) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3586,7 +3552,7 @@ func (m *Shard_TabletControl) UnmarshalVT(dAtA []byte) error { m.TabletType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3605,7 +3571,7 @@ func (m *Shard_TabletControl) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3619,11 +3585,11 @@ func (m *Shard_TabletControl) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3637,7 +3603,7 @@ func (m *Shard_TabletControl) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3651,11 +3617,11 @@ func (m *Shard_TabletControl) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3669,7 +3635,7 @@ func (m *Shard_TabletControl) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3684,12 +3650,12 @@ func (m *Shard_TabletControl) UnmarshalVT(dAtA []byte) error { m.Frozen = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3712,7 +3678,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3740,7 +3706,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3753,11 +3719,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3776,7 +3742,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3789,11 +3755,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3812,7 +3778,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3825,11 +3791,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3846,7 +3812,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3859,11 +3825,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3880,7 +3846,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3900,7 +3866,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3913,11 +3879,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3931,12 +3897,12 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3959,7 +3925,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3987,7 +3953,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { m.KeyspaceType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4006,7 +3972,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4020,11 +3986,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4038,7 +4004,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4051,11 +4017,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4074,7 +4040,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4088,11 +4054,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4106,7 +4072,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4119,11 +4085,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4142,7 +4108,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4156,11 +4122,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4169,12 +4135,12 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4197,7 +4163,7 @@ func (m *ShardReplication_Node) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4225,7 +4191,7 @@ func (m *ShardReplication_Node) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4238,11 +4204,11 @@ func (m *ShardReplication_Node) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4256,12 +4222,12 @@ func (m *ShardReplication_Node) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4284,7 +4250,7 @@ func (m *ShardReplication) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4312,7 +4278,7 @@ func (m *ShardReplication) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4325,11 +4291,11 @@ func (m *ShardReplication) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4341,12 +4307,12 @@ func (m *ShardReplication) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4369,7 +4335,7 @@ func (m *ShardReplicationError) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4397,7 +4363,7 @@ func (m *ShardReplicationError) UnmarshalVT(dAtA []byte) error { m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4416,7 +4382,7 @@ func (m *ShardReplicationError) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4429,11 +4395,11 @@ func (m *ShardReplicationError) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4447,12 +4413,12 @@ func (m *ShardReplicationError) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4475,7 +4441,7 @@ func (m *ShardReference) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4503,7 +4469,7 @@ func (m *ShardReference) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4517,11 +4483,11 @@ func (m *ShardReference) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4535,7 +4501,7 @@ func (m *ShardReference) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4548,11 +4514,11 @@ func (m *ShardReference) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4566,12 +4532,12 @@ func (m *ShardReference) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4594,7 +4560,7 @@ func (m *ShardTabletControl) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4622,7 +4588,7 @@ func (m *ShardTabletControl) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4636,11 +4602,11 @@ func (m *ShardTabletControl) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4654,7 +4620,7 @@ func (m *ShardTabletControl) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4667,11 +4633,11 @@ func (m *ShardTabletControl) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4690,7 +4656,7 @@ func (m *ShardTabletControl) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4705,12 +4671,12 @@ func (m *ShardTabletControl) UnmarshalVT(dAtA []byte) error { m.QueryServiceDisabled = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4733,7 +4699,7 @@ func (m *ThrottledAppRule) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4761,7 +4727,7 @@ func (m *ThrottledAppRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4775,11 +4741,11 @@ func (m *ThrottledAppRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4804,7 +4770,7 @@ func (m *ThrottledAppRule) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4817,11 +4783,11 @@ func (m *ThrottledAppRule) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4840,7 +4806,7 @@ func (m *ThrottledAppRule) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4855,12 +4821,12 @@ func (m *ThrottledAppRule) UnmarshalVT(dAtA []byte) error { m.Exempt = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4883,7 +4849,7 @@ func (m *ThrottlerConfig_MetricNames) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4911,7 +4877,7 @@ func (m *ThrottlerConfig_MetricNames) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4925,11 +4891,11 @@ func (m *ThrottlerConfig_MetricNames) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4938,12 +4904,12 @@ func (m *ThrottlerConfig_MetricNames) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4966,7 +4932,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4994,7 +4960,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5025,7 +4991,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5039,11 +5005,11 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5057,7 +5023,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5077,7 +5043,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5090,11 +5056,11 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5109,7 +5075,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5126,7 +5092,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5140,11 +5106,11 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -5155,7 +5121,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5168,11 +5134,11 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -5184,12 +5150,12 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -5206,7 +5172,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5219,11 +5185,11 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5238,7 +5204,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5255,7 +5221,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5269,11 +5235,11 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -5284,7 +5250,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5297,11 +5263,11 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -5313,12 +5279,12 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -5335,7 +5301,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5348,11 +5314,11 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5367,7 +5333,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5384,7 +5350,7 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5398,11 +5364,11 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -5419,12 +5385,12 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { mapvalue = math.Float64frombits(mapvaluetemp) } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -5436,12 +5402,12 @@ func (m *ThrottlerConfig) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5464,7 +5430,7 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5492,7 +5458,7 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { m.ServedType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5511,7 +5477,7 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5524,11 +5490,11 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5545,7 +5511,7 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5558,11 +5524,11 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5574,12 +5540,12 @@ func (m *SrvKeyspace_KeyspacePartition) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5602,7 +5568,7 @@ func (m *SrvKeyspace) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5630,7 +5596,7 @@ func (m *SrvKeyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5643,11 +5609,11 @@ func (m *SrvKeyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5664,7 +5630,7 @@ func (m *SrvKeyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5677,11 +5643,11 @@ func (m *SrvKeyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5695,12 +5661,12 @@ func (m *SrvKeyspace) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5723,7 +5689,7 @@ func (m *CellInfo) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5751,7 +5717,7 @@ func (m *CellInfo) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5765,11 +5731,11 @@ func (m *CellInfo) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5783,7 +5749,7 @@ func (m *CellInfo) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5797,11 +5763,11 @@ func (m *CellInfo) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5810,12 +5776,12 @@ func (m *CellInfo) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5838,7 +5804,7 @@ func (m *CellsAlias) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5866,7 +5832,7 @@ func (m *CellsAlias) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5880,11 +5846,11 @@ func (m *CellsAlias) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5893,12 +5859,12 @@ func (m *CellsAlias) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5921,7 +5887,7 @@ func (m *TopoConfig) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5949,7 +5915,7 @@ func (m *TopoConfig) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5963,11 +5929,11 @@ func (m *TopoConfig) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5981,7 +5947,7 @@ func (m *TopoConfig) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5995,11 +5961,11 @@ func (m *TopoConfig) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6013,7 +5979,7 @@ func (m *TopoConfig) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6027,11 +5993,11 @@ func (m *TopoConfig) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6040,12 +6006,12 @@ func (m *TopoConfig) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -6068,7 +6034,7 @@ func (m *ExternalVitessCluster) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6096,7 +6062,7 @@ func (m *ExternalVitessCluster) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6109,11 +6075,11 @@ func (m *ExternalVitessCluster) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6127,12 +6093,12 @@ func (m *ExternalVitessCluster) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -6155,7 +6121,7 @@ func (m *ExternalClusters) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6183,7 +6149,7 @@ func (m *ExternalClusters) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6196,11 +6162,11 @@ func (m *ExternalClusters) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6212,12 +6178,12 @@ func (m *ExternalClusters) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -6232,88 +6198,3 @@ func (m *ExternalClusters) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/vschema/vschema_vtproto.pb.go b/go/vt/proto/vschema/vschema_vtproto.pb.go index 1951f430a15..54347631260 100644 --- a/go/vt/proto/vschema/vschema_vtproto.pb.go +++ b/go/vt/proto/vschema/vschema_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: vschema.proto package vschema @@ -7,11 +7,11 @@ package vschema import ( binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" math "math" - bits "math/bits" query "vitess.io/vitess/go/vt/proto/query" ) @@ -26,7 +26,7 @@ func (m *RoutingRules) CloneVT() *RoutingRules { if m == nil { return (*RoutingRules)(nil) } - r := &RoutingRules{} + r := new(RoutingRules) if rhs := m.Rules; rhs != nil { tmpContainer := make([]*RoutingRule, len(rhs)) for k, v := range rhs { @@ -49,9 +49,8 @@ func (m *RoutingRule) CloneVT() *RoutingRule { if m == nil { return (*RoutingRule)(nil) } - r := &RoutingRule{ - FromTable: m.FromTable, - } + r := new(RoutingRule) + r.FromTable = m.FromTable if rhs := m.ToTables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -72,12 +71,11 @@ func (m *Keyspace) CloneVT() *Keyspace { if m == nil { return (*Keyspace)(nil) } - r := &Keyspace{ - Sharded: m.Sharded, - RequireExplicitRouting: m.RequireExplicitRouting, - ForeignKeyMode: m.ForeignKeyMode, - MultiTenantSpec: m.MultiTenantSpec.CloneVT(), - } + r := new(Keyspace) + r.Sharded = m.Sharded + r.RequireExplicitRouting = m.RequireExplicitRouting + r.ForeignKeyMode = m.ForeignKeyMode + r.MultiTenantSpec = m.MultiTenantSpec.CloneVT() if rhs := m.Vindexes; rhs != nil { tmpContainer := make(map[string]*Vindex, len(rhs)) for k, v := range rhs { @@ -107,10 +105,9 @@ func (m *MultiTenantSpec) CloneVT() *MultiTenantSpec { if m == nil { return (*MultiTenantSpec)(nil) } - r := &MultiTenantSpec{ - TenantIdColumnName: m.TenantIdColumnName, - TenantIdColumnType: m.TenantIdColumnType, - } + r := new(MultiTenantSpec) + r.TenantIdColumnName = m.TenantIdColumnName + r.TenantIdColumnType = m.TenantIdColumnType if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -126,10 +123,9 @@ func (m *Vindex) CloneVT() *Vindex { if m == nil { return (*Vindex)(nil) } - r := &Vindex{ - Type: m.Type, - Owner: m.Owner, - } + r := new(Vindex) + r.Type = m.Type + r.Owner = m.Owner if rhs := m.Params; rhs != nil { tmpContainer := make(map[string]string, len(rhs)) for k, v := range rhs { @@ -152,13 +148,12 @@ func (m *Table) CloneVT() *Table { if m == nil { return (*Table)(nil) } - r := &Table{ - Type: m.Type, - AutoIncrement: m.AutoIncrement.CloneVT(), - Pinned: m.Pinned, - ColumnListAuthoritative: m.ColumnListAuthoritative, - Source: m.Source, - } + r := new(Table) + r.Type = m.Type + r.AutoIncrement = m.AutoIncrement.CloneVT() + r.Pinned = m.Pinned + r.ColumnListAuthoritative = m.ColumnListAuthoritative + r.Source = m.Source if rhs := m.ColumnVindexes; rhs != nil { tmpContainer := make([]*ColumnVindex, len(rhs)) for k, v := range rhs { @@ -188,10 +183,9 @@ func (m *ColumnVindex) CloneVT() *ColumnVindex { if m == nil { return (*ColumnVindex)(nil) } - r := &ColumnVindex{ - Column: m.Column, - Name: m.Name, - } + r := new(ColumnVindex) + r.Column = m.Column + r.Name = m.Name if rhs := m.Columns; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -212,10 +206,9 @@ func (m *AutoIncrement) CloneVT() *AutoIncrement { if m == nil { return (*AutoIncrement)(nil) } - r := &AutoIncrement{ - Column: m.Column, - Sequence: m.Sequence, - } + r := new(AutoIncrement) + r.Column = m.Column + r.Sequence = m.Sequence if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -231,15 +224,14 @@ func (m *Column) CloneVT() *Column { if m == nil { return (*Column)(nil) } - r := &Column{ - Name: m.Name, - Type: m.Type, - Invisible: m.Invisible, - Default: m.Default, - CollationName: m.CollationName, - Size: m.Size, - Scale: m.Scale, - } + r := new(Column) + r.Name = m.Name + r.Type = m.Type + r.Invisible = m.Invisible + r.Default = m.Default + r.CollationName = m.CollationName + r.Size = m.Size + r.Scale = m.Scale if rhs := m.Nullable; rhs != nil { tmpVal := *rhs r.Nullable = &tmpVal @@ -264,12 +256,11 @@ func (m *SrvVSchema) CloneVT() *SrvVSchema { if m == nil { return (*SrvVSchema)(nil) } - r := &SrvVSchema{ - RoutingRules: m.RoutingRules.CloneVT(), - ShardRoutingRules: m.ShardRoutingRules.CloneVT(), - KeyspaceRoutingRules: m.KeyspaceRoutingRules.CloneVT(), - MirrorRules: m.MirrorRules.CloneVT(), - } + r := new(SrvVSchema) + r.RoutingRules = m.RoutingRules.CloneVT() + r.ShardRoutingRules = m.ShardRoutingRules.CloneVT() + r.KeyspaceRoutingRules = m.KeyspaceRoutingRules.CloneVT() + r.MirrorRules = m.MirrorRules.CloneVT() if rhs := m.Keyspaces; rhs != nil { tmpContainer := make(map[string]*Keyspace, len(rhs)) for k, v := range rhs { @@ -292,7 +283,7 @@ func (m *ShardRoutingRules) CloneVT() *ShardRoutingRules { if m == nil { return (*ShardRoutingRules)(nil) } - r := &ShardRoutingRules{} + r := new(ShardRoutingRules) if rhs := m.Rules; rhs != nil { tmpContainer := make([]*ShardRoutingRule, len(rhs)) for k, v := range rhs { @@ -315,11 +306,10 @@ func (m *ShardRoutingRule) CloneVT() *ShardRoutingRule { if m == nil { return (*ShardRoutingRule)(nil) } - r := &ShardRoutingRule{ - FromKeyspace: m.FromKeyspace, - ToKeyspace: m.ToKeyspace, - Shard: m.Shard, - } + r := new(ShardRoutingRule) + r.FromKeyspace = m.FromKeyspace + r.ToKeyspace = m.ToKeyspace + r.Shard = m.Shard if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -335,7 +325,7 @@ func (m *KeyspaceRoutingRules) CloneVT() *KeyspaceRoutingRules { if m == nil { return (*KeyspaceRoutingRules)(nil) } - r := &KeyspaceRoutingRules{} + r := new(KeyspaceRoutingRules) if rhs := m.Rules; rhs != nil { tmpContainer := make([]*KeyspaceRoutingRule, len(rhs)) for k, v := range rhs { @@ -358,10 +348,9 @@ func (m *KeyspaceRoutingRule) CloneVT() *KeyspaceRoutingRule { if m == nil { return (*KeyspaceRoutingRule)(nil) } - r := &KeyspaceRoutingRule{ - FromKeyspace: m.FromKeyspace, - ToKeyspace: m.ToKeyspace, - } + r := new(KeyspaceRoutingRule) + r.FromKeyspace = m.FromKeyspace + r.ToKeyspace = m.ToKeyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -377,7 +366,7 @@ func (m *MirrorRules) CloneVT() *MirrorRules { if m == nil { return (*MirrorRules)(nil) } - r := &MirrorRules{} + r := new(MirrorRules) if rhs := m.Rules; rhs != nil { tmpContainer := make([]*MirrorRule, len(rhs)) for k, v := range rhs { @@ -400,11 +389,10 @@ func (m *MirrorRule) CloneVT() *MirrorRule { if m == nil { return (*MirrorRule)(nil) } - r := &MirrorRule{ - FromTable: m.FromTable, - ToTable: m.ToTable, - Percent: m.Percent, - } + r := new(MirrorRule) + r.FromTable = m.FromTable + r.ToTable = m.ToTable + r.Percent = m.Percent if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -453,7 +441,7 @@ func (m *RoutingRules) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -495,7 +483,7 @@ func (m *RoutingRule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ToTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ToTables[iNdEx]) copy(dAtA[i:], m.ToTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ToTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ToTables[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -503,7 +491,7 @@ func (m *RoutingRule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.FromTable) > 0 { i -= len(m.FromTable) copy(dAtA[i:], m.FromTable) - i = encodeVarint(dAtA, i, uint64(len(m.FromTable))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FromTable))) i-- dAtA[i] = 0xa } @@ -546,12 +534,12 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } if m.ForeignKeyMode != 0 { - i = encodeVarint(dAtA, i, uint64(m.ForeignKeyMode)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ForeignKeyMode)) i-- dAtA[i] = 0x28 } @@ -574,15 +562,15 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x1a } @@ -596,15 +584,15 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -653,14 +641,14 @@ func (m *MultiTenantSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.TenantIdColumnType != 0 { - i = encodeVarint(dAtA, i, uint64(m.TenantIdColumnType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TenantIdColumnType)) i-- dAtA[i] = 0x10 } if len(m.TenantIdColumnName) > 0 { i -= len(m.TenantIdColumnName) copy(dAtA[i:], m.TenantIdColumnName) - i = encodeVarint(dAtA, i, uint64(len(m.TenantIdColumnName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TenantIdColumnName))) i-- dAtA[i] = 0xa } @@ -700,7 +688,7 @@ func (m *Vindex) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Owner) > 0 { i -= len(m.Owner) copy(dAtA[i:], m.Owner) - i = encodeVarint(dAtA, i, uint64(len(m.Owner))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Owner))) i-- dAtA[i] = 0x1a } @@ -710,15 +698,15 @@ func (m *Vindex) MarshalToSizedBufferVT(dAtA []byte) (int, error) { baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -726,7 +714,7 @@ func (m *Vindex) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Type) > 0 { i -= len(m.Type) copy(dAtA[i:], m.Type) - i = encodeVarint(dAtA, i, uint64(len(m.Type))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Type))) i-- dAtA[i] = 0xa } @@ -766,7 +754,7 @@ func (m *Table) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Source) > 0 { i -= len(m.Source) copy(dAtA[i:], m.Source) - i = encodeVarint(dAtA, i, uint64(len(m.Source))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Source))) i-- dAtA[i] = 0x3a } @@ -783,7 +771,7 @@ func (m *Table) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Pinned) > 0 { i -= len(m.Pinned) copy(dAtA[i:], m.Pinned) - i = encodeVarint(dAtA, i, uint64(len(m.Pinned))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Pinned))) i-- dAtA[i] = 0x2a } @@ -794,7 +782,7 @@ func (m *Table) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -805,7 +793,7 @@ func (m *Table) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -816,7 +804,7 @@ func (m *Table) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -824,7 +812,7 @@ func (m *Table) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Type) > 0 { i -= len(m.Type) copy(dAtA[i:], m.Type) - i = encodeVarint(dAtA, i, uint64(len(m.Type))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Type))) i-- dAtA[i] = 0xa } @@ -865,7 +853,7 @@ func (m *ColumnVindex) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Columns) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Columns[iNdEx]) copy(dAtA[i:], m.Columns[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Columns[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Columns[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -873,14 +861,14 @@ func (m *ColumnVindex) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x12 } if len(m.Column) > 0 { i -= len(m.Column) copy(dAtA[i:], m.Column) - i = encodeVarint(dAtA, i, uint64(len(m.Column))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Column))) i-- dAtA[i] = 0xa } @@ -920,14 +908,14 @@ func (m *AutoIncrement) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Sequence) > 0 { i -= len(m.Sequence) copy(dAtA[i:], m.Sequence) - i = encodeVarint(dAtA, i, uint64(len(m.Sequence))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sequence))) i-- dAtA[i] = 0x12 } if len(m.Column) > 0 { i -= len(m.Column) copy(dAtA[i:], m.Column) - i = encodeVarint(dAtA, i, uint64(len(m.Column))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Column))) i-- dAtA[i] = 0xa } @@ -968,7 +956,7 @@ func (m *Column) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Values) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Values[iNdEx]) copy(dAtA[i:], m.Values[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Values[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Values[iNdEx]))) i-- dAtA[i] = 0x4a } @@ -984,26 +972,26 @@ func (m *Column) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x40 } if m.Scale != 0 { - i = encodeVarint(dAtA, i, uint64(m.Scale)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Scale)) i-- dAtA[i] = 0x38 } if m.Size != 0 { - i = encodeVarint(dAtA, i, uint64(m.Size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Size)) i-- dAtA[i] = 0x30 } if len(m.CollationName) > 0 { i -= len(m.CollationName) copy(dAtA[i:], m.CollationName) - i = encodeVarint(dAtA, i, uint64(len(m.CollationName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CollationName))) i-- dAtA[i] = 0x2a } if len(m.Default) > 0 { i -= len(m.Default) copy(dAtA[i:], m.Default) - i = encodeVarint(dAtA, i, uint64(len(m.Default))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Default))) i-- dAtA[i] = 0x22 } @@ -1018,14 +1006,14 @@ func (m *Column) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x18 } if m.Type != 0 { - i = encodeVarint(dAtA, i, uint64(m.Type)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Type)) i-- dAtA[i] = 0x10 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -1068,7 +1056,7 @@ func (m *SrvVSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -1078,7 +1066,7 @@ func (m *SrvVSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -1088,7 +1076,7 @@ func (m *SrvVSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1098,7 +1086,7 @@ func (m *SrvVSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1111,15 +1099,15 @@ func (m *SrvVSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -1164,7 +1152,7 @@ func (m *ShardRoutingRules) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1205,21 +1193,21 @@ func (m *ShardRoutingRule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.ToKeyspace) > 0 { i -= len(m.ToKeyspace) copy(dAtA[i:], m.ToKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.ToKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ToKeyspace))) i-- dAtA[i] = 0x12 } if len(m.FromKeyspace) > 0 { i -= len(m.FromKeyspace) copy(dAtA[i:], m.FromKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.FromKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FromKeyspace))) i-- dAtA[i] = 0xa } @@ -1263,7 +1251,7 @@ func (m *KeyspaceRoutingRules) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1304,14 +1292,14 @@ func (m *KeyspaceRoutingRule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ToKeyspace) > 0 { i -= len(m.ToKeyspace) copy(dAtA[i:], m.ToKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.ToKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ToKeyspace))) i-- dAtA[i] = 0x12 } if len(m.FromKeyspace) > 0 { i -= len(m.FromKeyspace) copy(dAtA[i:], m.FromKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.FromKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FromKeyspace))) i-- dAtA[i] = 0xa } @@ -1355,7 +1343,7 @@ func (m *MirrorRules) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1402,31 +1390,20 @@ func (m *MirrorRule) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ToTable) > 0 { i -= len(m.ToTable) copy(dAtA[i:], m.ToTable) - i = encodeVarint(dAtA, i, uint64(len(m.ToTable))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ToTable))) i-- dAtA[i] = 0x12 } if len(m.FromTable) > 0 { i -= len(m.FromTable) copy(dAtA[i:], m.FromTable) - i = encodeVarint(dAtA, i, uint64(len(m.FromTable))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FromTable))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *RoutingRules) SizeVT() (n int) { if m == nil { return 0 @@ -1436,7 +1413,7 @@ func (m *RoutingRules) SizeVT() (n int) { if len(m.Rules) > 0 { for _, e := range m.Rules { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1451,12 +1428,12 @@ func (m *RoutingRule) SizeVT() (n int) { _ = l l = len(m.FromTable) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ToTables) > 0 { for _, s := range m.ToTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1480,9 +1457,9 @@ func (m *Keyspace) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if len(m.Tables) > 0 { @@ -1493,20 +1470,20 @@ func (m *Keyspace) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if m.RequireExplicitRouting { n += 2 } if m.ForeignKeyMode != 0 { - n += 1 + sov(uint64(m.ForeignKeyMode)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ForeignKeyMode)) } if m.MultiTenantSpec != nil { l = m.MultiTenantSpec.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1520,10 +1497,10 @@ func (m *MultiTenantSpec) SizeVT() (n int) { _ = l l = len(m.TenantIdColumnName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TenantIdColumnType != 0 { - n += 1 + sov(uint64(m.TenantIdColumnType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TenantIdColumnType)) } n += len(m.unknownFields) return n @@ -1537,19 +1514,19 @@ func (m *Vindex) SizeVT() (n int) { _ = l l = len(m.Type) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Params) > 0 { for k, v := range m.Params { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } l = len(m.Owner) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1563,34 +1540,34 @@ func (m *Table) SizeVT() (n int) { _ = l l = len(m.Type) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ColumnVindexes) > 0 { for _, e := range m.ColumnVindexes { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.AutoIncrement != nil { l = m.AutoIncrement.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Columns) > 0 { for _, e := range m.Columns { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.Pinned) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ColumnListAuthoritative { n += 2 } l = len(m.Source) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1604,16 +1581,16 @@ func (m *ColumnVindex) SizeVT() (n int) { _ = l l = len(m.Column) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Columns) > 0 { for _, s := range m.Columns { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1628,11 +1605,11 @@ func (m *AutoIncrement) SizeVT() (n int) { _ = l l = len(m.Column) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Sequence) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1646,27 +1623,27 @@ func (m *Column) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Type != 0 { - n += 1 + sov(uint64(m.Type)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Type)) } if m.Invisible { n += 2 } l = len(m.Default) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.CollationName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Size != 0 { - n += 1 + sov(uint64(m.Size)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Size)) } if m.Scale != 0 { - n += 1 + sov(uint64(m.Scale)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Scale)) } if m.Nullable != nil { n += 2 @@ -1674,7 +1651,7 @@ func (m *Column) SizeVT() (n int) { if len(m.Values) > 0 { for _, s := range m.Values { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1695,26 +1672,26 @@ func (m *SrvVSchema) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if m.RoutingRules != nil { l = m.RoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ShardRoutingRules != nil { l = m.ShardRoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeyspaceRoutingRules != nil { l = m.KeyspaceRoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.MirrorRules != nil { l = m.MirrorRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1729,7 +1706,7 @@ func (m *ShardRoutingRules) SizeVT() (n int) { if len(m.Rules) > 0 { for _, e := range m.Rules { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1744,15 +1721,15 @@ func (m *ShardRoutingRule) SizeVT() (n int) { _ = l l = len(m.FromKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ToKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1767,7 +1744,7 @@ func (m *KeyspaceRoutingRules) SizeVT() (n int) { if len(m.Rules) > 0 { for _, e := range m.Rules { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1782,11 +1759,11 @@ func (m *KeyspaceRoutingRule) SizeVT() (n int) { _ = l l = len(m.FromKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ToKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -1801,7 +1778,7 @@ func (m *MirrorRules) SizeVT() (n int) { if len(m.Rules) > 0 { for _, e := range m.Rules { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -1816,11 +1793,11 @@ func (m *MirrorRule) SizeVT() (n int) { _ = l l = len(m.FromTable) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ToTable) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Percent != 0 { n += 5 @@ -1829,12 +1806,6 @@ func (m *MirrorRule) SizeVT() (n int) { return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *RoutingRules) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1843,7 +1814,7 @@ func (m *RoutingRules) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1871,7 +1842,7 @@ func (m *RoutingRules) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1884,11 +1855,11 @@ func (m *RoutingRules) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1900,12 +1871,12 @@ func (m *RoutingRules) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -1928,7 +1899,7 @@ func (m *RoutingRule) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1956,7 +1927,7 @@ func (m *RoutingRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1970,11 +1941,11 @@ func (m *RoutingRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -1988,7 +1959,7 @@ func (m *RoutingRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2002,11 +1973,11 @@ func (m *RoutingRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2015,12 +1986,12 @@ func (m *RoutingRule) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2043,7 +2014,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2071,7 +2042,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2091,7 +2062,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2104,11 +2075,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2123,7 +2094,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2140,7 +2111,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2154,11 +2125,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -2169,7 +2140,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2182,11 +2153,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -2198,12 +2169,12 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -2220,7 +2191,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2233,11 +2204,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2252,7 +2223,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2269,7 +2240,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2283,11 +2254,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -2298,7 +2269,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2311,11 +2282,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -2327,12 +2298,12 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -2349,7 +2320,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2369,7 +2340,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { m.ForeignKeyMode = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2388,7 +2359,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2401,11 +2372,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2419,12 +2390,12 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2447,7 +2418,7 @@ func (m *MultiTenantSpec) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2475,7 +2446,7 @@ func (m *MultiTenantSpec) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2489,11 +2460,11 @@ func (m *MultiTenantSpec) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2507,7 +2478,7 @@ func (m *MultiTenantSpec) UnmarshalVT(dAtA []byte) error { m.TenantIdColumnType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2521,12 +2492,12 @@ func (m *MultiTenantSpec) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2549,7 +2520,7 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2577,7 +2548,7 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2591,11 +2562,11 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2609,7 +2580,7 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2622,11 +2593,11 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2641,7 +2612,7 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2658,7 +2629,7 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2672,11 +2643,11 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -2687,7 +2658,7 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2701,11 +2672,11 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { } intStringLenmapvalue := int(stringLenmapvalue) if intStringLenmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapvalue := iNdEx + intStringLenmapvalue if postStringIndexmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF @@ -2714,12 +2685,12 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -2736,7 +2707,7 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2750,11 +2721,11 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2763,12 +2734,12 @@ func (m *Vindex) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2791,7 +2762,7 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2819,7 +2790,7 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2833,11 +2804,11 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2851,7 +2822,7 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2864,11 +2835,11 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2885,7 +2856,7 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2898,11 +2869,11 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2921,7 +2892,7 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2934,11 +2905,11 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2955,7 +2926,7 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2969,11 +2940,11 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2987,7 +2958,7 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3007,7 +2978,7 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3021,11 +2992,11 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3034,12 +3005,12 @@ func (m *Table) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3062,7 +3033,7 @@ func (m *ColumnVindex) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3090,7 +3061,7 @@ func (m *ColumnVindex) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3104,11 +3075,11 @@ func (m *ColumnVindex) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3122,7 +3093,7 @@ func (m *ColumnVindex) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3136,11 +3107,11 @@ func (m *ColumnVindex) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3154,7 +3125,7 @@ func (m *ColumnVindex) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3168,11 +3139,11 @@ func (m *ColumnVindex) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3181,12 +3152,12 @@ func (m *ColumnVindex) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3209,7 +3180,7 @@ func (m *AutoIncrement) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3237,7 +3208,7 @@ func (m *AutoIncrement) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3251,11 +3222,11 @@ func (m *AutoIncrement) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3269,7 +3240,7 @@ func (m *AutoIncrement) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3283,11 +3254,11 @@ func (m *AutoIncrement) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3296,12 +3267,12 @@ func (m *AutoIncrement) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3324,7 +3295,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3352,7 +3323,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3366,11 +3337,11 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3384,7 +3355,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3403,7 +3374,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3423,7 +3394,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3437,11 +3408,11 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3455,7 +3426,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3469,11 +3440,11 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3487,7 +3458,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { m.Size = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3506,7 +3477,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { m.Scale = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3525,7 +3496,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3546,7 +3517,7 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3560,11 +3531,11 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3573,12 +3544,12 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3601,7 +3572,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3629,7 +3600,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3642,11 +3613,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3661,7 +3632,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3678,7 +3649,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3692,11 +3663,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -3707,7 +3678,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3720,11 +3691,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -3736,12 +3707,12 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -3758,7 +3729,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3771,11 +3742,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3794,7 +3765,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3807,11 +3778,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3830,7 +3801,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3843,11 +3814,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3866,7 +3837,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3879,11 +3850,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3897,12 +3868,12 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3925,7 +3896,7 @@ func (m *ShardRoutingRules) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3953,7 +3924,7 @@ func (m *ShardRoutingRules) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3966,11 +3937,11 @@ func (m *ShardRoutingRules) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3982,12 +3953,12 @@ func (m *ShardRoutingRules) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4010,7 +3981,7 @@ func (m *ShardRoutingRule) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4038,7 +4009,7 @@ func (m *ShardRoutingRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4052,11 +4023,11 @@ func (m *ShardRoutingRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4070,7 +4041,7 @@ func (m *ShardRoutingRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4084,11 +4055,11 @@ func (m *ShardRoutingRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4102,7 +4073,7 @@ func (m *ShardRoutingRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4116,11 +4087,11 @@ func (m *ShardRoutingRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4129,12 +4100,12 @@ func (m *ShardRoutingRule) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4157,7 +4128,7 @@ func (m *KeyspaceRoutingRules) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4185,7 +4156,7 @@ func (m *KeyspaceRoutingRules) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4198,11 +4169,11 @@ func (m *KeyspaceRoutingRules) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4214,12 +4185,12 @@ func (m *KeyspaceRoutingRules) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4242,7 +4213,7 @@ func (m *KeyspaceRoutingRule) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4270,7 +4241,7 @@ func (m *KeyspaceRoutingRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4284,11 +4255,11 @@ func (m *KeyspaceRoutingRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4302,7 +4273,7 @@ func (m *KeyspaceRoutingRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4316,11 +4287,11 @@ func (m *KeyspaceRoutingRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4329,12 +4300,12 @@ func (m *KeyspaceRoutingRule) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4357,7 +4328,7 @@ func (m *MirrorRules) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4385,7 +4356,7 @@ func (m *MirrorRules) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4398,11 +4369,11 @@ func (m *MirrorRules) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4414,12 +4385,12 @@ func (m *MirrorRules) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4442,7 +4413,7 @@ func (m *MirrorRule) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4470,7 +4441,7 @@ func (m *MirrorRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4484,11 +4455,11 @@ func (m *MirrorRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4502,7 +4473,7 @@ func (m *MirrorRule) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4516,11 +4487,11 @@ func (m *MirrorRule) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4540,12 +4511,12 @@ func (m *MirrorRule) UnmarshalVT(dAtA []byte) error { m.Percent = float32(math.Float32frombits(v)) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4560,88 +4531,3 @@ func (m *MirrorRule) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/vtadmin/vtadmin.pb.go b/go/vt/proto/vtadmin/vtadmin.pb.go index 303af932adf..720626a4a98 100644 --- a/go/vt/proto/vtadmin/vtadmin.pb.go +++ b/go/vt/proto/vtadmin/vtadmin.pb.go @@ -1124,6 +1124,116 @@ func (x *Workflow) GetWorkflow() *vtctldata.Workflow { return nil } +type WorkflowDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Request *vtctldata.WorkflowDeleteRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` +} + +func (x *WorkflowDeleteRequest) Reset() { + *x = WorkflowDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkflowDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkflowDeleteRequest) ProtoMessage() {} + +func (x *WorkflowDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WorkflowDeleteRequest.ProtoReflect.Descriptor instead. +func (*WorkflowDeleteRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{16} +} + +func (x *WorkflowDeleteRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *WorkflowDeleteRequest) GetRequest() *vtctldata.WorkflowDeleteRequest { + if x != nil { + return x.Request + } + return nil +} + +type WorkflowSwitchTrafficRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Request *vtctldata.WorkflowSwitchTrafficRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` +} + +func (x *WorkflowSwitchTrafficRequest) Reset() { + *x = WorkflowSwitchTrafficRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkflowSwitchTrafficRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkflowSwitchTrafficRequest) ProtoMessage() {} + +func (x *WorkflowSwitchTrafficRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WorkflowSwitchTrafficRequest.ProtoReflect.Descriptor instead. +func (*WorkflowSwitchTrafficRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{17} +} + +func (x *WorkflowSwitchTrafficRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *WorkflowSwitchTrafficRequest) GetRequest() *vtctldata.WorkflowSwitchTrafficRequest { + if x != nil { + return x.Request + } + return nil +} + type ApplySchemaRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1136,7 +1246,7 @@ type ApplySchemaRequest struct { func (x *ApplySchemaRequest) Reset() { *x = ApplySchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[16] + mi := &file_vtadmin_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1149,7 +1259,7 @@ func (x *ApplySchemaRequest) String() string { func (*ApplySchemaRequest) ProtoMessage() {} func (x *ApplySchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[16] + mi := &file_vtadmin_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1162,7 +1272,7 @@ func (x *ApplySchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplySchemaRequest.ProtoReflect.Descriptor instead. func (*ApplySchemaRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{16} + return file_vtadmin_proto_rawDescGZIP(), []int{18} } func (x *ApplySchemaRequest) GetClusterId() string { @@ -1191,7 +1301,7 @@ type CancelSchemaMigrationRequest struct { func (x *CancelSchemaMigrationRequest) Reset() { *x = CancelSchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[17] + mi := &file_vtadmin_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1204,7 +1314,7 @@ func (x *CancelSchemaMigrationRequest) String() string { func (*CancelSchemaMigrationRequest) ProtoMessage() {} func (x *CancelSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[17] + mi := &file_vtadmin_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1217,7 +1327,7 @@ func (x *CancelSchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CancelSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*CancelSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{17} + return file_vtadmin_proto_rawDescGZIP(), []int{19} } func (x *CancelSchemaMigrationRequest) GetClusterId() string { @@ -1246,7 +1356,7 @@ type CleanupSchemaMigrationRequest struct { func (x *CleanupSchemaMigrationRequest) Reset() { *x = CleanupSchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[18] + mi := &file_vtadmin_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1259,7 +1369,7 @@ func (x *CleanupSchemaMigrationRequest) String() string { func (*CleanupSchemaMigrationRequest) ProtoMessage() {} func (x *CleanupSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[18] + mi := &file_vtadmin_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1272,7 +1382,7 @@ func (x *CleanupSchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*CleanupSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{18} + return file_vtadmin_proto_rawDescGZIP(), []int{20} } func (x *CleanupSchemaMigrationRequest) GetClusterId() string { @@ -1301,7 +1411,7 @@ type CompleteSchemaMigrationRequest struct { func (x *CompleteSchemaMigrationRequest) Reset() { *x = CompleteSchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[19] + mi := &file_vtadmin_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1314,7 +1424,7 @@ func (x *CompleteSchemaMigrationRequest) String() string { func (*CompleteSchemaMigrationRequest) ProtoMessage() {} func (x *CompleteSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[19] + mi := &file_vtadmin_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1327,7 +1437,7 @@ func (x *CompleteSchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*CompleteSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{19} + return file_vtadmin_proto_rawDescGZIP(), []int{21} } func (x *CompleteSchemaMigrationRequest) GetClusterId() string { @@ -1344,6 +1454,61 @@ func (x *CompleteSchemaMigrationRequest) GetRequest() *vtctldata.CompleteSchemaM return nil } +type ConcludeTransactionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Dtid string `protobuf:"bytes,2,opt,name=dtid,proto3" json:"dtid,omitempty"` +} + +func (x *ConcludeTransactionRequest) Reset() { + *x = ConcludeTransactionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConcludeTransactionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConcludeTransactionRequest) ProtoMessage() {} + +func (x *ConcludeTransactionRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConcludeTransactionRequest.ProtoReflect.Descriptor instead. +func (*ConcludeTransactionRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{22} +} + +func (x *ConcludeTransactionRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ConcludeTransactionRequest) GetDtid() string { + if x != nil { + return x.Dtid + } + return "" +} + type CreateKeyspaceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1356,7 +1521,7 @@ type CreateKeyspaceRequest struct { func (x *CreateKeyspaceRequest) Reset() { *x = CreateKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[20] + mi := &file_vtadmin_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1369,7 +1534,7 @@ func (x *CreateKeyspaceRequest) String() string { func (*CreateKeyspaceRequest) ProtoMessage() {} func (x *CreateKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[20] + mi := &file_vtadmin_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1382,7 +1547,7 @@ func (x *CreateKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateKeyspaceRequest.ProtoReflect.Descriptor instead. func (*CreateKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{20} + return file_vtadmin_proto_rawDescGZIP(), []int{23} } func (x *CreateKeyspaceRequest) GetClusterId() string { @@ -1410,7 +1575,7 @@ type CreateKeyspaceResponse struct { func (x *CreateKeyspaceResponse) Reset() { *x = CreateKeyspaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[21] + mi := &file_vtadmin_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1423,7 +1588,7 @@ func (x *CreateKeyspaceResponse) String() string { func (*CreateKeyspaceResponse) ProtoMessage() {} func (x *CreateKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[21] + mi := &file_vtadmin_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1436,7 +1601,7 @@ func (x *CreateKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateKeyspaceResponse.ProtoReflect.Descriptor instead. func (*CreateKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{21} + return file_vtadmin_proto_rawDescGZIP(), []int{24} } func (x *CreateKeyspaceResponse) GetKeyspace() *Keyspace { @@ -1458,7 +1623,7 @@ type CreateShardRequest struct { func (x *CreateShardRequest) Reset() { *x = CreateShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[22] + mi := &file_vtadmin_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1471,7 +1636,7 @@ func (x *CreateShardRequest) String() string { func (*CreateShardRequest) ProtoMessage() {} func (x *CreateShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[22] + mi := &file_vtadmin_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1484,7 +1649,7 @@ func (x *CreateShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateShardRequest.ProtoReflect.Descriptor instead. func (*CreateShardRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{22} + return file_vtadmin_proto_rawDescGZIP(), []int{25} } func (x *CreateShardRequest) GetClusterId() string { @@ -1513,7 +1678,7 @@ type DeleteKeyspaceRequest struct { func (x *DeleteKeyspaceRequest) Reset() { *x = DeleteKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[23] + mi := &file_vtadmin_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1526,7 +1691,7 @@ func (x *DeleteKeyspaceRequest) String() string { func (*DeleteKeyspaceRequest) ProtoMessage() {} func (x *DeleteKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[23] + mi := &file_vtadmin_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1539,7 +1704,7 @@ func (x *DeleteKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeyspaceRequest.ProtoReflect.Descriptor instead. func (*DeleteKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{23} + return file_vtadmin_proto_rawDescGZIP(), []int{26} } func (x *DeleteKeyspaceRequest) GetClusterId() string { @@ -1568,7 +1733,7 @@ type DeleteShardsRequest struct { func (x *DeleteShardsRequest) Reset() { *x = DeleteShardsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[24] + mi := &file_vtadmin_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1581,7 +1746,7 @@ func (x *DeleteShardsRequest) String() string { func (*DeleteShardsRequest) ProtoMessage() {} func (x *DeleteShardsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[24] + mi := &file_vtadmin_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1594,7 +1759,7 @@ func (x *DeleteShardsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteShardsRequest.ProtoReflect.Descriptor instead. func (*DeleteShardsRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{24} + return file_vtadmin_proto_rawDescGZIP(), []int{27} } func (x *DeleteShardsRequest) GetClusterId() string { @@ -1624,7 +1789,7 @@ type DeleteTabletRequest struct { func (x *DeleteTabletRequest) Reset() { *x = DeleteTabletRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[25] + mi := &file_vtadmin_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1637,7 +1802,7 @@ func (x *DeleteTabletRequest) String() string { func (*DeleteTabletRequest) ProtoMessage() {} func (x *DeleteTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[25] + mi := &file_vtadmin_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1650,7 +1815,7 @@ func (x *DeleteTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTabletRequest.ProtoReflect.Descriptor instead. func (*DeleteTabletRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{25} + return file_vtadmin_proto_rawDescGZIP(), []int{28} } func (x *DeleteTabletRequest) GetAlias() *topodata.TabletAlias { @@ -1686,7 +1851,7 @@ type DeleteTabletResponse struct { func (x *DeleteTabletResponse) Reset() { *x = DeleteTabletResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[26] + mi := &file_vtadmin_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1699,7 +1864,7 @@ func (x *DeleteTabletResponse) String() string { func (*DeleteTabletResponse) ProtoMessage() {} func (x *DeleteTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[26] + mi := &file_vtadmin_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1712,7 +1877,7 @@ func (x *DeleteTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTabletResponse.ProtoReflect.Descriptor instead. func (*DeleteTabletResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{26} + return file_vtadmin_proto_rawDescGZIP(), []int{29} } func (x *DeleteTabletResponse) GetStatus() string { @@ -1741,7 +1906,7 @@ type EmergencyFailoverShardRequest struct { func (x *EmergencyFailoverShardRequest) Reset() { *x = EmergencyFailoverShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[27] + mi := &file_vtadmin_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1754,7 +1919,7 @@ func (x *EmergencyFailoverShardRequest) String() string { func (*EmergencyFailoverShardRequest) ProtoMessage() {} func (x *EmergencyFailoverShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[27] + mi := &file_vtadmin_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1767,7 +1932,7 @@ func (x *EmergencyFailoverShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyFailoverShardRequest.ProtoReflect.Descriptor instead. func (*EmergencyFailoverShardRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{27} + return file_vtadmin_proto_rawDescGZIP(), []int{30} } func (x *EmergencyFailoverShardRequest) GetClusterId() string { @@ -1803,7 +1968,7 @@ type EmergencyFailoverShardResponse struct { func (x *EmergencyFailoverShardResponse) Reset() { *x = EmergencyFailoverShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[28] + mi := &file_vtadmin_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1816,7 +1981,7 @@ func (x *EmergencyFailoverShardResponse) String() string { func (*EmergencyFailoverShardResponse) ProtoMessage() {} func (x *EmergencyFailoverShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[28] + mi := &file_vtadmin_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1829,7 +1994,7 @@ func (x *EmergencyFailoverShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyFailoverShardResponse.ProtoReflect.Descriptor instead. func (*EmergencyFailoverShardResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{28} + return file_vtadmin_proto_rawDescGZIP(), []int{31} } func (x *EmergencyFailoverShardResponse) GetCluster() *Cluster { @@ -1880,7 +2045,7 @@ type FindSchemaRequest struct { func (x *FindSchemaRequest) Reset() { *x = FindSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[29] + mi := &file_vtadmin_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1893,7 +2058,7 @@ func (x *FindSchemaRequest) String() string { func (*FindSchemaRequest) ProtoMessage() {} func (x *FindSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[29] + mi := &file_vtadmin_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1906,7 +2071,7 @@ func (x *FindSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindSchemaRequest.ProtoReflect.Descriptor instead. func (*FindSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{29} + return file_vtadmin_proto_rawDescGZIP(), []int{32} } func (x *FindSchemaRequest) GetTable() string { @@ -1955,7 +2120,7 @@ type GetBackupsRequest struct { func (x *GetBackupsRequest) Reset() { *x = GetBackupsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[30] + mi := &file_vtadmin_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1968,7 +2133,7 @@ func (x *GetBackupsRequest) String() string { func (*GetBackupsRequest) ProtoMessage() {} func (x *GetBackupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[30] + mi := &file_vtadmin_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1981,7 +2146,7 @@ func (x *GetBackupsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBackupsRequest.ProtoReflect.Descriptor instead. func (*GetBackupsRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{30} + return file_vtadmin_proto_rawDescGZIP(), []int{33} } func (x *GetBackupsRequest) GetClusterIds() []string { @@ -2023,7 +2188,7 @@ type GetBackupsResponse struct { func (x *GetBackupsResponse) Reset() { *x = GetBackupsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[31] + mi := &file_vtadmin_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2036,7 +2201,7 @@ func (x *GetBackupsResponse) String() string { func (*GetBackupsResponse) ProtoMessage() {} func (x *GetBackupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[31] + mi := &file_vtadmin_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2049,7 +2214,7 @@ func (x *GetBackupsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBackupsResponse.ProtoReflect.Descriptor instead. func (*GetBackupsResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{31} + return file_vtadmin_proto_rawDescGZIP(), []int{34} } func (x *GetBackupsResponse) GetBackups() []*ClusterBackup { @@ -2080,7 +2245,7 @@ type GetCellInfosRequest struct { func (x *GetCellInfosRequest) Reset() { *x = GetCellInfosRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[32] + mi := &file_vtadmin_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2093,7 +2258,7 @@ func (x *GetCellInfosRequest) String() string { func (*GetCellInfosRequest) ProtoMessage() {} func (x *GetCellInfosRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[32] + mi := &file_vtadmin_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2106,7 +2271,7 @@ func (x *GetCellInfosRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfosRequest.ProtoReflect.Descriptor instead. func (*GetCellInfosRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{32} + return file_vtadmin_proto_rawDescGZIP(), []int{35} } func (x *GetCellInfosRequest) GetClusterIds() []string { @@ -2141,7 +2306,7 @@ type GetCellInfosResponse struct { func (x *GetCellInfosResponse) Reset() { *x = GetCellInfosResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[33] + mi := &file_vtadmin_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2154,7 +2319,7 @@ func (x *GetCellInfosResponse) String() string { func (*GetCellInfosResponse) ProtoMessage() {} func (x *GetCellInfosResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[33] + mi := &file_vtadmin_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2167,7 +2332,7 @@ func (x *GetCellInfosResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfosResponse.ProtoReflect.Descriptor instead. func (*GetCellInfosResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{33} + return file_vtadmin_proto_rawDescGZIP(), []int{36} } func (x *GetCellInfosResponse) GetCellInfos() []*ClusterCellInfo { @@ -2188,7 +2353,7 @@ type GetCellsAliasesRequest struct { func (x *GetCellsAliasesRequest) Reset() { *x = GetCellsAliasesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[34] + mi := &file_vtadmin_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2201,7 +2366,7 @@ func (x *GetCellsAliasesRequest) String() string { func (*GetCellsAliasesRequest) ProtoMessage() {} func (x *GetCellsAliasesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[34] + mi := &file_vtadmin_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2214,7 +2379,7 @@ func (x *GetCellsAliasesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellsAliasesRequest.ProtoReflect.Descriptor instead. func (*GetCellsAliasesRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{34} + return file_vtadmin_proto_rawDescGZIP(), []int{37} } func (x *GetCellsAliasesRequest) GetClusterIds() []string { @@ -2235,7 +2400,7 @@ type GetCellsAliasesResponse struct { func (x *GetCellsAliasesResponse) Reset() { *x = GetCellsAliasesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[35] + mi := &file_vtadmin_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2248,7 +2413,7 @@ func (x *GetCellsAliasesResponse) String() string { func (*GetCellsAliasesResponse) ProtoMessage() {} func (x *GetCellsAliasesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[35] + mi := &file_vtadmin_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2261,7 +2426,7 @@ func (x *GetCellsAliasesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellsAliasesResponse.ProtoReflect.Descriptor instead. func (*GetCellsAliasesResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{35} + return file_vtadmin_proto_rawDescGZIP(), []int{38} } func (x *GetCellsAliasesResponse) GetAliases() []*ClusterCellsAliases { @@ -2280,7 +2445,7 @@ type GetClustersRequest struct { func (x *GetClustersRequest) Reset() { *x = GetClustersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[36] + mi := &file_vtadmin_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2293,7 +2458,7 @@ func (x *GetClustersRequest) String() string { func (*GetClustersRequest) ProtoMessage() {} func (x *GetClustersRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[36] + mi := &file_vtadmin_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2306,7 +2471,7 @@ func (x *GetClustersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetClustersRequest.ProtoReflect.Descriptor instead. func (*GetClustersRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{36} + return file_vtadmin_proto_rawDescGZIP(), []int{39} } type GetClustersResponse struct { @@ -2320,7 +2485,7 @@ type GetClustersResponse struct { func (x *GetClustersResponse) Reset() { *x = GetClustersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[37] + mi := &file_vtadmin_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2333,7 +2498,7 @@ func (x *GetClustersResponse) String() string { func (*GetClustersResponse) ProtoMessage() {} func (x *GetClustersResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[37] + mi := &file_vtadmin_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2346,7 +2511,7 @@ func (x *GetClustersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetClustersResponse.ProtoReflect.Descriptor instead. func (*GetClustersResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{37} + return file_vtadmin_proto_rawDescGZIP(), []int{40} } func (x *GetClustersResponse) GetClusters() []*Cluster { @@ -2368,7 +2533,7 @@ type GetFullStatusRequest struct { func (x *GetFullStatusRequest) Reset() { *x = GetFullStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[38] + mi := &file_vtadmin_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2381,7 +2546,7 @@ func (x *GetFullStatusRequest) String() string { func (*GetFullStatusRequest) ProtoMessage() {} func (x *GetFullStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[38] + mi := &file_vtadmin_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2394,7 +2559,7 @@ func (x *GetFullStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFullStatusRequest.ProtoReflect.Descriptor instead. func (*GetFullStatusRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{38} + return file_vtadmin_proto_rawDescGZIP(), []int{41} } func (x *GetFullStatusRequest) GetClusterId() string { @@ -2422,7 +2587,7 @@ type GetGatesRequest struct { func (x *GetGatesRequest) Reset() { *x = GetGatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[39] + mi := &file_vtadmin_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2435,7 +2600,7 @@ func (x *GetGatesRequest) String() string { func (*GetGatesRequest) ProtoMessage() {} func (x *GetGatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[39] + mi := &file_vtadmin_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2448,7 +2613,7 @@ func (x *GetGatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGatesRequest.ProtoReflect.Descriptor instead. func (*GetGatesRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{39} + return file_vtadmin_proto_rawDescGZIP(), []int{42} } func (x *GetGatesRequest) GetClusterIds() []string { @@ -2469,7 +2634,7 @@ type GetGatesResponse struct { func (x *GetGatesResponse) Reset() { *x = GetGatesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[40] + mi := &file_vtadmin_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2482,7 +2647,7 @@ func (x *GetGatesResponse) String() string { func (*GetGatesResponse) ProtoMessage() {} func (x *GetGatesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[40] + mi := &file_vtadmin_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2495,7 +2660,7 @@ func (x *GetGatesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGatesResponse.ProtoReflect.Descriptor instead. func (*GetGatesResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{40} + return file_vtadmin_proto_rawDescGZIP(), []int{43} } func (x *GetGatesResponse) GetGates() []*VTGate { @@ -2517,7 +2682,7 @@ type GetKeyspaceRequest struct { func (x *GetKeyspaceRequest) Reset() { *x = GetKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[41] + mi := &file_vtadmin_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2530,7 +2695,7 @@ func (x *GetKeyspaceRequest) String() string { func (*GetKeyspaceRequest) ProtoMessage() {} func (x *GetKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[41] + mi := &file_vtadmin_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2543,7 +2708,7 @@ func (x *GetKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRequest.ProtoReflect.Descriptor instead. func (*GetKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{41} + return file_vtadmin_proto_rawDescGZIP(), []int{44} } func (x *GetKeyspaceRequest) GetClusterId() string { @@ -2571,7 +2736,7 @@ type GetKeyspacesRequest struct { func (x *GetKeyspacesRequest) Reset() { *x = GetKeyspacesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[42] + mi := &file_vtadmin_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2584,7 +2749,7 @@ func (x *GetKeyspacesRequest) String() string { func (*GetKeyspacesRequest) ProtoMessage() {} func (x *GetKeyspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[42] + mi := &file_vtadmin_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2597,7 +2762,7 @@ func (x *GetKeyspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspacesRequest.ProtoReflect.Descriptor instead. func (*GetKeyspacesRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{42} + return file_vtadmin_proto_rawDescGZIP(), []int{45} } func (x *GetKeyspacesRequest) GetClusterIds() []string { @@ -2618,7 +2783,7 @@ type GetKeyspacesResponse struct { func (x *GetKeyspacesResponse) Reset() { *x = GetKeyspacesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[43] + mi := &file_vtadmin_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2631,7 +2796,7 @@ func (x *GetKeyspacesResponse) String() string { func (*GetKeyspacesResponse) ProtoMessage() {} func (x *GetKeyspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[43] + mi := &file_vtadmin_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2644,7 +2809,7 @@ func (x *GetKeyspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspacesResponse.ProtoReflect.Descriptor instead. func (*GetKeyspacesResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{43} + return file_vtadmin_proto_rawDescGZIP(), []int{46} } func (x *GetKeyspacesResponse) GetKeyspaces() []*Keyspace { @@ -2668,7 +2833,7 @@ type GetSchemaRequest struct { func (x *GetSchemaRequest) Reset() { *x = GetSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[44] + mi := &file_vtadmin_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2681,7 +2846,7 @@ func (x *GetSchemaRequest) String() string { func (*GetSchemaRequest) ProtoMessage() {} func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[44] + mi := &file_vtadmin_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2694,7 +2859,7 @@ func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaRequest.ProtoReflect.Descriptor instead. func (*GetSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{44} + return file_vtadmin_proto_rawDescGZIP(), []int{47} } func (x *GetSchemaRequest) GetClusterId() string { @@ -2737,7 +2902,7 @@ type GetSchemasRequest struct { func (x *GetSchemasRequest) Reset() { *x = GetSchemasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[45] + mi := &file_vtadmin_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2750,7 +2915,7 @@ func (x *GetSchemasRequest) String() string { func (*GetSchemasRequest) ProtoMessage() {} func (x *GetSchemasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[45] + mi := &file_vtadmin_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2763,7 +2928,7 @@ func (x *GetSchemasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemasRequest.ProtoReflect.Descriptor instead. func (*GetSchemasRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{45} + return file_vtadmin_proto_rawDescGZIP(), []int{48} } func (x *GetSchemasRequest) GetClusterIds() []string { @@ -2791,7 +2956,7 @@ type GetSchemasResponse struct { func (x *GetSchemasResponse) Reset() { *x = GetSchemasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[46] + mi := &file_vtadmin_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2804,7 +2969,7 @@ func (x *GetSchemasResponse) String() string { func (*GetSchemasResponse) ProtoMessage() {} func (x *GetSchemasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[46] + mi := &file_vtadmin_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2817,7 +2982,7 @@ func (x *GetSchemasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemasResponse.ProtoReflect.Descriptor instead. func (*GetSchemasResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{46} + return file_vtadmin_proto_rawDescGZIP(), []int{49} } func (x *GetSchemasResponse) GetSchemas() []*Schema { @@ -2838,7 +3003,7 @@ type GetSchemaMigrationsRequest struct { func (x *GetSchemaMigrationsRequest) Reset() { *x = GetSchemaMigrationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[47] + mi := &file_vtadmin_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2851,7 +3016,7 @@ func (x *GetSchemaMigrationsRequest) String() string { func (*GetSchemaMigrationsRequest) ProtoMessage() {} func (x *GetSchemaMigrationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[47] + mi := &file_vtadmin_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2864,7 +3029,7 @@ func (x *GetSchemaMigrationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaMigrationsRequest.ProtoReflect.Descriptor instead. func (*GetSchemaMigrationsRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{47} + return file_vtadmin_proto_rawDescGZIP(), []int{50} } func (x *GetSchemaMigrationsRequest) GetClusterRequests() []*GetSchemaMigrationsRequest_ClusterRequest { @@ -2885,7 +3050,7 @@ type GetSchemaMigrationsResponse struct { func (x *GetSchemaMigrationsResponse) Reset() { *x = GetSchemaMigrationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[48] + mi := &file_vtadmin_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2898,7 +3063,7 @@ func (x *GetSchemaMigrationsResponse) String() string { func (*GetSchemaMigrationsResponse) ProtoMessage() {} func (x *GetSchemaMigrationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[48] + mi := &file_vtadmin_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2911,7 +3076,7 @@ func (x *GetSchemaMigrationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaMigrationsResponse.ProtoReflect.Descriptor instead. func (*GetSchemaMigrationsResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{48} + return file_vtadmin_proto_rawDescGZIP(), []int{51} } func (x *GetSchemaMigrationsResponse) GetSchemaMigrations() []*SchemaMigration { @@ -2941,7 +3106,7 @@ type GetShardReplicationPositionsRequest struct { func (x *GetShardReplicationPositionsRequest) Reset() { *x = GetShardReplicationPositionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[49] + mi := &file_vtadmin_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2954,7 +3119,7 @@ func (x *GetShardReplicationPositionsRequest) String() string { func (*GetShardReplicationPositionsRequest) ProtoMessage() {} func (x *GetShardReplicationPositionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[49] + mi := &file_vtadmin_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2967,7 +3132,7 @@ func (x *GetShardReplicationPositionsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use GetShardReplicationPositionsRequest.ProtoReflect.Descriptor instead. func (*GetShardReplicationPositionsRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{49} + return file_vtadmin_proto_rawDescGZIP(), []int{52} } func (x *GetShardReplicationPositionsRequest) GetClusterIds() []string { @@ -3002,7 +3167,7 @@ type GetShardReplicationPositionsResponse struct { func (x *GetShardReplicationPositionsResponse) Reset() { *x = GetShardReplicationPositionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[50] + mi := &file_vtadmin_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3015,7 +3180,7 @@ func (x *GetShardReplicationPositionsResponse) String() string { func (*GetShardReplicationPositionsResponse) ProtoMessage() {} func (x *GetShardReplicationPositionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[50] + mi := &file_vtadmin_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3028,7 +3193,7 @@ func (x *GetShardReplicationPositionsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use GetShardReplicationPositionsResponse.ProtoReflect.Descriptor instead. func (*GetShardReplicationPositionsResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{50} + return file_vtadmin_proto_rawDescGZIP(), []int{53} } func (x *GetShardReplicationPositionsResponse) GetReplicationPositions() []*ClusterShardReplicationPosition { @@ -3053,7 +3218,7 @@ type GetSrvKeyspaceRequest struct { func (x *GetSrvKeyspaceRequest) Reset() { *x = GetSrvKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[51] + mi := &file_vtadmin_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3066,7 +3231,7 @@ func (x *GetSrvKeyspaceRequest) String() string { func (*GetSrvKeyspaceRequest) ProtoMessage() {} func (x *GetSrvKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[51] + mi := &file_vtadmin_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3079,7 +3244,7 @@ func (x *GetSrvKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspaceRequest.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{51} + return file_vtadmin_proto_rawDescGZIP(), []int{54} } func (x *GetSrvKeyspaceRequest) GetClusterId() string { @@ -3118,7 +3283,7 @@ type GetSrvKeyspacesRequest struct { func (x *GetSrvKeyspacesRequest) Reset() { *x = GetSrvKeyspacesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[52] + mi := &file_vtadmin_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3131,7 +3296,7 @@ func (x *GetSrvKeyspacesRequest) String() string { func (*GetSrvKeyspacesRequest) ProtoMessage() {} func (x *GetSrvKeyspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[52] + mi := &file_vtadmin_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3144,7 +3309,7 @@ func (x *GetSrvKeyspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspacesRequest.ProtoReflect.Descriptor instead. func (*GetSrvKeyspacesRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{52} + return file_vtadmin_proto_rawDescGZIP(), []int{55} } func (x *GetSrvKeyspacesRequest) GetClusterIds() []string { @@ -3173,7 +3338,7 @@ type GetSrvKeyspacesResponse struct { func (x *GetSrvKeyspacesResponse) Reset() { *x = GetSrvKeyspacesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[53] + mi := &file_vtadmin_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3186,7 +3351,7 @@ func (x *GetSrvKeyspacesResponse) String() string { func (*GetSrvKeyspacesResponse) ProtoMessage() {} func (x *GetSrvKeyspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[53] + mi := &file_vtadmin_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3199,7 +3364,7 @@ func (x *GetSrvKeyspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspacesResponse.ProtoReflect.Descriptor instead. func (*GetSrvKeyspacesResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{53} + return file_vtadmin_proto_rawDescGZIP(), []int{56} } func (x *GetSrvKeyspacesResponse) GetSrvKeyspaces() map[string]*vtctldata.GetSrvKeyspacesResponse { @@ -3221,7 +3386,7 @@ type GetSrvVSchemaRequest struct { func (x *GetSrvVSchemaRequest) Reset() { *x = GetSrvVSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[54] + mi := &file_vtadmin_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3234,7 +3399,7 @@ func (x *GetSrvVSchemaRequest) String() string { func (*GetSrvVSchemaRequest) ProtoMessage() {} func (x *GetSrvVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[54] + mi := &file_vtadmin_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3247,7 +3412,7 @@ func (x *GetSrvVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemaRequest.ProtoReflect.Descriptor instead. func (*GetSrvVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{54} + return file_vtadmin_proto_rawDescGZIP(), []int{57} } func (x *GetSrvVSchemaRequest) GetClusterId() string { @@ -3276,7 +3441,7 @@ type GetSrvVSchemasRequest struct { func (x *GetSrvVSchemasRequest) Reset() { *x = GetSrvVSchemasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[55] + mi := &file_vtadmin_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3289,7 +3454,7 @@ func (x *GetSrvVSchemasRequest) String() string { func (*GetSrvVSchemasRequest) ProtoMessage() {} func (x *GetSrvVSchemasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[55] + mi := &file_vtadmin_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3302,7 +3467,7 @@ func (x *GetSrvVSchemasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemasRequest.ProtoReflect.Descriptor instead. func (*GetSrvVSchemasRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{55} + return file_vtadmin_proto_rawDescGZIP(), []int{58} } func (x *GetSrvVSchemasRequest) GetClusterIds() []string { @@ -3330,7 +3495,7 @@ type GetSrvVSchemasResponse struct { func (x *GetSrvVSchemasResponse) Reset() { *x = GetSrvVSchemasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[56] + mi := &file_vtadmin_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3343,7 +3508,7 @@ func (x *GetSrvVSchemasResponse) String() string { func (*GetSrvVSchemasResponse) ProtoMessage() {} func (x *GetSrvVSchemasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[56] + mi := &file_vtadmin_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3356,7 +3521,7 @@ func (x *GetSrvVSchemasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemasResponse.ProtoReflect.Descriptor instead. func (*GetSrvVSchemasResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{56} + return file_vtadmin_proto_rawDescGZIP(), []int{59} } func (x *GetSrvVSchemasResponse) GetSrvVSchemas() []*SrvVSchema { @@ -3378,7 +3543,7 @@ type GetSchemaTableSizeOptions struct { func (x *GetSchemaTableSizeOptions) Reset() { *x = GetSchemaTableSizeOptions{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[57] + mi := &file_vtadmin_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3391,7 +3556,7 @@ func (x *GetSchemaTableSizeOptions) String() string { func (*GetSchemaTableSizeOptions) ProtoMessage() {} func (x *GetSchemaTableSizeOptions) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[57] + mi := &file_vtadmin_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3404,7 +3569,7 @@ func (x *GetSchemaTableSizeOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaTableSizeOptions.ProtoReflect.Descriptor instead. func (*GetSchemaTableSizeOptions) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{57} + return file_vtadmin_proto_rawDescGZIP(), []int{60} } func (x *GetSchemaTableSizeOptions) GetAggregateSizes() bool { @@ -3437,7 +3602,7 @@ type GetTabletRequest struct { func (x *GetTabletRequest) Reset() { *x = GetTabletRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[58] + mi := &file_vtadmin_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3450,7 +3615,7 @@ func (x *GetTabletRequest) String() string { func (*GetTabletRequest) ProtoMessage() {} func (x *GetTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[58] + mi := &file_vtadmin_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3463,7 +3628,7 @@ func (x *GetTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletRequest.ProtoReflect.Descriptor instead. func (*GetTabletRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{58} + return file_vtadmin_proto_rawDescGZIP(), []int{61} } func (x *GetTabletRequest) GetAlias() *topodata.TabletAlias { @@ -3491,7 +3656,7 @@ type GetTabletsRequest struct { func (x *GetTabletsRequest) Reset() { *x = GetTabletsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[59] + mi := &file_vtadmin_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3504,7 +3669,7 @@ func (x *GetTabletsRequest) String() string { func (*GetTabletsRequest) ProtoMessage() {} func (x *GetTabletsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[59] + mi := &file_vtadmin_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3517,7 +3682,7 @@ func (x *GetTabletsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletsRequest.ProtoReflect.Descriptor instead. func (*GetTabletsRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{59} + return file_vtadmin_proto_rawDescGZIP(), []int{62} } func (x *GetTabletsRequest) GetClusterIds() []string { @@ -3538,7 +3703,7 @@ type GetTabletsResponse struct { func (x *GetTabletsResponse) Reset() { *x = GetTabletsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[60] + mi := &file_vtadmin_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3551,7 +3716,7 @@ func (x *GetTabletsResponse) String() string { func (*GetTabletsResponse) ProtoMessage() {} func (x *GetTabletsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[60] + mi := &file_vtadmin_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3564,7 +3729,7 @@ func (x *GetTabletsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletsResponse.ProtoReflect.Descriptor instead. func (*GetTabletsResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{60} + return file_vtadmin_proto_rawDescGZIP(), []int{63} } func (x *GetTabletsResponse) GetTablets() []*Tablet { @@ -3586,7 +3751,7 @@ type GetTopologyPathRequest struct { func (x *GetTopologyPathRequest) Reset() { *x = GetTopologyPathRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[61] + mi := &file_vtadmin_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3599,7 +3764,7 @@ func (x *GetTopologyPathRequest) String() string { func (*GetTopologyPathRequest) ProtoMessage() {} func (x *GetTopologyPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[61] + mi := &file_vtadmin_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3612,7 +3777,7 @@ func (x *GetTopologyPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopologyPathRequest.ProtoReflect.Descriptor instead. func (*GetTopologyPathRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{61} + return file_vtadmin_proto_rawDescGZIP(), []int{64} } func (x *GetTopologyPathRequest) GetClusterId() string { @@ -3629,6 +3794,69 @@ func (x *GetTopologyPathRequest) GetPath() string { return "" } +type GetUnresolvedTransactionsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + AbandonAge int64 `protobuf:"varint,3,opt,name=abandon_age,json=abandonAge,proto3" json:"abandon_age,omitempty"` +} + +func (x *GetUnresolvedTransactionsRequest) Reset() { + *x = GetUnresolvedTransactionsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUnresolvedTransactionsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUnresolvedTransactionsRequest) ProtoMessage() {} + +func (x *GetUnresolvedTransactionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUnresolvedTransactionsRequest.ProtoReflect.Descriptor instead. +func (*GetUnresolvedTransactionsRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{65} +} + +func (x *GetUnresolvedTransactionsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetUnresolvedTransactionsRequest) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +func (x *GetUnresolvedTransactionsRequest) GetAbandonAge() int64 { + if x != nil { + return x.AbandonAge + } + return 0 +} + type GetVSchemaRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3641,7 +3869,7 @@ type GetVSchemaRequest struct { func (x *GetVSchemaRequest) Reset() { *x = GetVSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[62] + mi := &file_vtadmin_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3654,7 +3882,7 @@ func (x *GetVSchemaRequest) String() string { func (*GetVSchemaRequest) ProtoMessage() {} func (x *GetVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[62] + mi := &file_vtadmin_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3667,7 +3895,7 @@ func (x *GetVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVSchemaRequest.ProtoReflect.Descriptor instead. func (*GetVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{62} + return file_vtadmin_proto_rawDescGZIP(), []int{66} } func (x *GetVSchemaRequest) GetClusterId() string { @@ -3695,7 +3923,7 @@ type GetVSchemasRequest struct { func (x *GetVSchemasRequest) Reset() { *x = GetVSchemasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[63] + mi := &file_vtadmin_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3708,7 +3936,7 @@ func (x *GetVSchemasRequest) String() string { func (*GetVSchemasRequest) ProtoMessage() {} func (x *GetVSchemasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[63] + mi := &file_vtadmin_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3721,7 +3949,7 @@ func (x *GetVSchemasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVSchemasRequest.ProtoReflect.Descriptor instead. func (*GetVSchemasRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{63} + return file_vtadmin_proto_rawDescGZIP(), []int{67} } func (x *GetVSchemasRequest) GetClusterIds() []string { @@ -3742,7 +3970,7 @@ type GetVSchemasResponse struct { func (x *GetVSchemasResponse) Reset() { *x = GetVSchemasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[64] + mi := &file_vtadmin_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3755,7 +3983,7 @@ func (x *GetVSchemasResponse) String() string { func (*GetVSchemasResponse) ProtoMessage() {} func (x *GetVSchemasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[64] + mi := &file_vtadmin_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3768,7 +3996,7 @@ func (x *GetVSchemasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVSchemasResponse.ProtoReflect.Descriptor instead. func (*GetVSchemasResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{64} + return file_vtadmin_proto_rawDescGZIP(), []int{68} } func (x *GetVSchemasResponse) GetVSchemas() []*VSchema { @@ -3789,7 +4017,7 @@ type GetVtctldsRequest struct { func (x *GetVtctldsRequest) Reset() { *x = GetVtctldsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[65] + mi := &file_vtadmin_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3802,7 +4030,7 @@ func (x *GetVtctldsRequest) String() string { func (*GetVtctldsRequest) ProtoMessage() {} func (x *GetVtctldsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[65] + mi := &file_vtadmin_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3815,7 +4043,7 @@ func (x *GetVtctldsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVtctldsRequest.ProtoReflect.Descriptor instead. func (*GetVtctldsRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{65} + return file_vtadmin_proto_rawDescGZIP(), []int{69} } func (x *GetVtctldsRequest) GetClusterIds() []string { @@ -3836,7 +4064,7 @@ type GetVtctldsResponse struct { func (x *GetVtctldsResponse) Reset() { *x = GetVtctldsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[66] + mi := &file_vtadmin_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3849,7 +4077,7 @@ func (x *GetVtctldsResponse) String() string { func (*GetVtctldsResponse) ProtoMessage() {} func (x *GetVtctldsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[66] + mi := &file_vtadmin_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3862,7 +4090,7 @@ func (x *GetVtctldsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVtctldsResponse.ProtoReflect.Descriptor instead. func (*GetVtctldsResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{66} + return file_vtadmin_proto_rawDescGZIP(), []int{70} } func (x *GetVtctldsResponse) GetVtctlds() []*Vtctld { @@ -3886,7 +4114,7 @@ type GetWorkflowRequest struct { func (x *GetWorkflowRequest) Reset() { *x = GetWorkflowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[67] + mi := &file_vtadmin_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3899,7 +4127,7 @@ func (x *GetWorkflowRequest) String() string { func (*GetWorkflowRequest) ProtoMessage() {} func (x *GetWorkflowRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[67] + mi := &file_vtadmin_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3912,7 +4140,7 @@ func (x *GetWorkflowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{67} + return file_vtadmin_proto_rawDescGZIP(), []int{71} } func (x *GetWorkflowRequest) GetClusterId() string { @@ -3943,36 +4171,225 @@ func (x *GetWorkflowRequest) GetActiveOnly() bool { return false } -type GetWorkflowsRequest struct { +type GetWorkflowStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterIds []string `protobuf:"bytes,1,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - // ActiveOnly specifies whether to return workflows that are currently - // active (running or paused) instead of all workflows. - ActiveOnly bool `protobuf:"varint,2,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` - // Keyspaces is a list of keyspaces to restrict the workflow search to. Note - // that the keyspaces list applies across all cluster IDs in the request. - // - // If, for example, you have two clusters, each with a keyspace called "foo" - // and want the workflows from "foo" in cluster1 but not from cluster2, you - // must make two requests. - // - // Keyspaces and IgnoreKeyspaces are mutually-exclusive, and Keyspaces takes - // precedence; if Keyspaces is a non-empty list, then IgnoreKeyspaces is - // ignored completely. - Keyspaces []string `protobuf:"bytes,3,rep,name=keyspaces,proto3" json:"keyspaces,omitempty"` - // IgnoreKeyspaces is a list of keyspaces to skip during the workflow - // search. It has the same semantics as the Keyspaces parameter, so refer to - // that documentation for more details. + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *GetWorkflowStatusRequest) Reset() { + *x = GetWorkflowStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkflowStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkflowStatusRequest) ProtoMessage() {} + +func (x *GetWorkflowStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[72] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetWorkflowStatusRequest.ProtoReflect.Descriptor instead. +func (*GetWorkflowStatusRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{72} +} + +func (x *GetWorkflowStatusRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkflowStatusRequest) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +func (x *GetWorkflowStatusRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type StartWorkflowRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + Workflow string `protobuf:"bytes,3,opt,name=workflow,proto3" json:"workflow,omitempty"` +} + +func (x *StartWorkflowRequest) Reset() { + *x = StartWorkflowRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartWorkflowRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartWorkflowRequest) ProtoMessage() {} + +func (x *StartWorkflowRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[73] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartWorkflowRequest.ProtoReflect.Descriptor instead. +func (*StartWorkflowRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{73} +} + +func (x *StartWorkflowRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *StartWorkflowRequest) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +func (x *StartWorkflowRequest) GetWorkflow() string { + if x != nil { + return x.Workflow + } + return "" +} + +type StopWorkflowRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + Workflow string `protobuf:"bytes,3,opt,name=workflow,proto3" json:"workflow,omitempty"` +} + +func (x *StopWorkflowRequest) Reset() { + *x = StopWorkflowRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StopWorkflowRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StopWorkflowRequest) ProtoMessage() {} + +func (x *StopWorkflowRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[74] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StopWorkflowRequest.ProtoReflect.Descriptor instead. +func (*StopWorkflowRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{74} +} + +func (x *StopWorkflowRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *StopWorkflowRequest) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +func (x *StopWorkflowRequest) GetWorkflow() string { + if x != nil { + return x.Workflow + } + return "" +} + +type GetWorkflowsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterIds []string `protobuf:"bytes,1,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + // ActiveOnly specifies whether to return workflows that are currently + // active (running or paused) instead of all workflows. + ActiveOnly bool `protobuf:"varint,2,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` + // Keyspaces is a list of keyspaces to restrict the workflow search to. Note + // that the keyspaces list applies across all cluster IDs in the request. + // + // If, for example, you have two clusters, each with a keyspace called "foo" + // and want the workflows from "foo" in cluster1 but not from cluster2, you + // must make two requests. + // + // Keyspaces and IgnoreKeyspaces are mutually-exclusive, and Keyspaces takes + // precedence; if Keyspaces is a non-empty list, then IgnoreKeyspaces is + // ignored completely. + Keyspaces []string `protobuf:"bytes,3,rep,name=keyspaces,proto3" json:"keyspaces,omitempty"` + // IgnoreKeyspaces is a list of keyspaces to skip during the workflow + // search. It has the same semantics as the Keyspaces parameter, so refer to + // that documentation for more details. IgnoreKeyspaces []string `protobuf:"bytes,4,rep,name=ignore_keyspaces,json=ignoreKeyspaces,proto3" json:"ignore_keyspaces,omitempty"` } func (x *GetWorkflowsRequest) Reset() { *x = GetWorkflowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[68] + mi := &file_vtadmin_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3985,7 +4402,7 @@ func (x *GetWorkflowsRequest) String() string { func (*GetWorkflowsRequest) ProtoMessage() {} func (x *GetWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[68] + mi := &file_vtadmin_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3998,7 +4415,7 @@ func (x *GetWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowsRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{68} + return file_vtadmin_proto_rawDescGZIP(), []int{75} } func (x *GetWorkflowsRequest) GetClusterIds() []string { @@ -4040,7 +4457,7 @@ type GetWorkflowsResponse struct { func (x *GetWorkflowsResponse) Reset() { *x = GetWorkflowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[69] + mi := &file_vtadmin_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4053,7 +4470,7 @@ func (x *GetWorkflowsResponse) String() string { func (*GetWorkflowsResponse) ProtoMessage() {} func (x *GetWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[69] + mi := &file_vtadmin_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4066,7 +4483,7 @@ func (x *GetWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowsResponse.ProtoReflect.Descriptor instead. func (*GetWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{69} + return file_vtadmin_proto_rawDescGZIP(), []int{76} } func (x *GetWorkflowsResponse) GetWorkflowsByCluster() map[string]*ClusterWorkflows { @@ -4088,7 +4505,7 @@ type LaunchSchemaMigrationRequest struct { func (x *LaunchSchemaMigrationRequest) Reset() { *x = LaunchSchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[70] + mi := &file_vtadmin_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4101,7 +4518,7 @@ func (x *LaunchSchemaMigrationRequest) String() string { func (*LaunchSchemaMigrationRequest) ProtoMessage() {} func (x *LaunchSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[70] + mi := &file_vtadmin_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4114,7 +4531,7 @@ func (x *LaunchSchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LaunchSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*LaunchSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{70} + return file_vtadmin_proto_rawDescGZIP(), []int{77} } func (x *LaunchSchemaMigrationRequest) GetClusterId() string { @@ -4131,36 +4548,35 @@ func (x *LaunchSchemaMigrationRequest) GetRequest() *vtctldata.LaunchSchemaMigra return nil } -type PingTabletRequest struct { +type MaterializeCreateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Unique (per cluster) tablet alias of the standard form: "$cell-$uid" - Alias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` - // ClusterIDs is an optional parameter to narrow the scope of the search, if - // the caller knows which cluster the tablet may be in, or, to disambiguate - // if multiple clusters have a tablet with the same hostname. - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // TableSettings is a JSON string defining what tables to materialize using + // what select statements. + TableSettings string `protobuf:"bytes,2,opt,name=table_settings,json=tableSettings,proto3" json:"table_settings,omitempty"` + Request *vtctldata.MaterializeCreateRequest `protobuf:"bytes,3,opt,name=request,proto3" json:"request,omitempty"` } -func (x *PingTabletRequest) Reset() { - *x = PingTabletRequest{} +func (x *MaterializeCreateRequest) Reset() { + *x = MaterializeCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[71] + mi := &file_vtadmin_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PingTabletRequest) String() string { +func (x *MaterializeCreateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PingTabletRequest) ProtoMessage() {} +func (*MaterializeCreateRequest) ProtoMessage() {} -func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[71] +func (x *MaterializeCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4171,51 +4587,58 @@ func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PingTabletRequest.ProtoReflect.Descriptor instead. -func (*PingTabletRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{71} +// Deprecated: Use MaterializeCreateRequest.ProtoReflect.Descriptor instead. +func (*MaterializeCreateRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{78} } -func (x *PingTabletRequest) GetAlias() *topodata.TabletAlias { +func (x *MaterializeCreateRequest) GetClusterId() string { if x != nil { - return x.Alias + return x.ClusterId } - return nil + return "" } -func (x *PingTabletRequest) GetClusterIds() []string { +func (x *MaterializeCreateRequest) GetTableSettings() string { if x != nil { - return x.ClusterIds + return x.TableSettings + } + return "" +} + +func (x *MaterializeCreateRequest) GetRequest() *vtctldata.MaterializeCreateRequest { + if x != nil { + return x.Request } return nil } -type PingTabletResponse struct { +type MoveTablesCompleteRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` - Cluster *Cluster `protobuf:"bytes,2,opt,name=cluster,proto3" json:"cluster,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Request *vtctldata.MoveTablesCompleteRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` } -func (x *PingTabletResponse) Reset() { - *x = PingTabletResponse{} +func (x *MoveTablesCompleteRequest) Reset() { + *x = MoveTablesCompleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[72] + mi := &file_vtadmin_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PingTabletResponse) String() string { +func (x *MoveTablesCompleteRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PingTabletResponse) ProtoMessage() {} +func (*MoveTablesCompleteRequest) ProtoMessage() {} -func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[72] +func (x *MoveTablesCompleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4226,51 +4649,220 @@ func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PingTabletResponse.ProtoReflect.Descriptor instead. -func (*PingTabletResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{72} +// Deprecated: Use MoveTablesCompleteRequest.ProtoReflect.Descriptor instead. +func (*MoveTablesCompleteRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{79} } -func (x *PingTabletResponse) GetStatus() string { +func (x *MoveTablesCompleteRequest) GetClusterId() string { if x != nil { - return x.Status + return x.ClusterId } return "" } -func (x *PingTabletResponse) GetCluster() *Cluster { +func (x *MoveTablesCompleteRequest) GetRequest() *vtctldata.MoveTablesCompleteRequest { if x != nil { - return x.Cluster + return x.Request } return nil } -type PlannedFailoverShardRequest struct { +type MoveTablesCreateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Options *vtctldata.PlannedReparentShardRequest `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Request *vtctldata.MoveTablesCreateRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` } -func (x *PlannedFailoverShardRequest) Reset() { - *x = PlannedFailoverShardRequest{} +func (x *MoveTablesCreateRequest) Reset() { + *x = MoveTablesCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[73] + mi := &file_vtadmin_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PlannedFailoverShardRequest) String() string { +func (x *MoveTablesCreateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PlannedFailoverShardRequest) ProtoMessage() {} +func (*MoveTablesCreateRequest) ProtoMessage() {} -func (x *PlannedFailoverShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[73] +func (x *MoveTablesCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[80] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MoveTablesCreateRequest.ProtoReflect.Descriptor instead. +func (*MoveTablesCreateRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{80} +} + +func (x *MoveTablesCreateRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *MoveTablesCreateRequest) GetRequest() *vtctldata.MoveTablesCreateRequest { + if x != nil { + return x.Request + } + return nil +} + +type PingTabletRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Unique (per cluster) tablet alias of the standard form: "$cell-$uid" + Alias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` + // ClusterIDs is an optional parameter to narrow the scope of the search, if + // the caller knows which cluster the tablet may be in, or, to disambiguate + // if multiple clusters have a tablet with the same hostname. + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` +} + +func (x *PingTabletRequest) Reset() { + *x = PingTabletRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PingTabletRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PingTabletRequest) ProtoMessage() {} + +func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[81] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PingTabletRequest.ProtoReflect.Descriptor instead. +func (*PingTabletRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{81} +} + +func (x *PingTabletRequest) GetAlias() *topodata.TabletAlias { + if x != nil { + return x.Alias + } + return nil +} + +func (x *PingTabletRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +type PingTabletResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + Cluster *Cluster `protobuf:"bytes,2,opt,name=cluster,proto3" json:"cluster,omitempty"` +} + +func (x *PingTabletResponse) Reset() { + *x = PingTabletResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PingTabletResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PingTabletResponse) ProtoMessage() {} + +func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[82] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PingTabletResponse.ProtoReflect.Descriptor instead. +func (*PingTabletResponse) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{82} +} + +func (x *PingTabletResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *PingTabletResponse) GetCluster() *Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +type PlannedFailoverShardRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Options *vtctldata.PlannedReparentShardRequest `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"` +} + +func (x *PlannedFailoverShardRequest) Reset() { + *x = PlannedFailoverShardRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlannedFailoverShardRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlannedFailoverShardRequest) ProtoMessage() {} + +func (x *PlannedFailoverShardRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4283,7 +4875,7 @@ func (x *PlannedFailoverShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedFailoverShardRequest.ProtoReflect.Descriptor instead. func (*PlannedFailoverShardRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{73} + return file_vtadmin_proto_rawDescGZIP(), []int{83} } func (x *PlannedFailoverShardRequest) GetClusterId() string { @@ -4319,7 +4911,7 @@ type PlannedFailoverShardResponse struct { func (x *PlannedFailoverShardResponse) Reset() { *x = PlannedFailoverShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[74] + mi := &file_vtadmin_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4332,7 +4924,7 @@ func (x *PlannedFailoverShardResponse) String() string { func (*PlannedFailoverShardResponse) ProtoMessage() {} func (x *PlannedFailoverShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[74] + mi := &file_vtadmin_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4345,7 +4937,7 @@ func (x *PlannedFailoverShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedFailoverShardResponse.ProtoReflect.Descriptor instead. func (*PlannedFailoverShardResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{74} + return file_vtadmin_proto_rawDescGZIP(), []int{84} } func (x *PlannedFailoverShardResponse) GetCluster() *Cluster { @@ -4397,7 +4989,7 @@ type RebuildKeyspaceGraphRequest struct { func (x *RebuildKeyspaceGraphRequest) Reset() { *x = RebuildKeyspaceGraphRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[75] + mi := &file_vtadmin_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4410,7 +5002,7 @@ func (x *RebuildKeyspaceGraphRequest) String() string { func (*RebuildKeyspaceGraphRequest) ProtoMessage() {} func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[75] + mi := &file_vtadmin_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4423,7 +5015,7 @@ func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphRequest.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{75} + return file_vtadmin_proto_rawDescGZIP(), []int{85} } func (x *RebuildKeyspaceGraphRequest) GetClusterId() string { @@ -4465,7 +5057,7 @@ type RebuildKeyspaceGraphResponse struct { func (x *RebuildKeyspaceGraphResponse) Reset() { *x = RebuildKeyspaceGraphResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[76] + mi := &file_vtadmin_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4478,7 +5070,7 @@ func (x *RebuildKeyspaceGraphResponse) String() string { func (*RebuildKeyspaceGraphResponse) ProtoMessage() {} func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[76] + mi := &file_vtadmin_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4491,7 +5083,7 @@ func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphResponse.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{76} + return file_vtadmin_proto_rawDescGZIP(), []int{86} } func (x *RebuildKeyspaceGraphResponse) GetStatus() string { @@ -4513,7 +5105,7 @@ type RefreshStateRequest struct { func (x *RefreshStateRequest) Reset() { *x = RefreshStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[77] + mi := &file_vtadmin_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4526,7 +5118,7 @@ func (x *RefreshStateRequest) String() string { func (*RefreshStateRequest) ProtoMessage() {} func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[77] + mi := &file_vtadmin_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4539,7 +5131,7 @@ func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateRequest.ProtoReflect.Descriptor instead. func (*RefreshStateRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{77} + return file_vtadmin_proto_rawDescGZIP(), []int{87} } func (x *RefreshStateRequest) GetAlias() *topodata.TabletAlias { @@ -4568,7 +5160,7 @@ type RefreshStateResponse struct { func (x *RefreshStateResponse) Reset() { *x = RefreshStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[78] + mi := &file_vtadmin_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4581,7 +5173,7 @@ func (x *RefreshStateResponse) String() string { func (*RefreshStateResponse) ProtoMessage() {} func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[78] + mi := &file_vtadmin_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4594,7 +5186,7 @@ func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateResponse.ProtoReflect.Descriptor instead. func (*RefreshStateResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{78} + return file_vtadmin_proto_rawDescGZIP(), []int{88} } func (x *RefreshStateResponse) GetStatus() string { @@ -4663,7 +5255,7 @@ type ReloadSchemasRequest struct { func (x *ReloadSchemasRequest) Reset() { *x = ReloadSchemasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[79] + mi := &file_vtadmin_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4676,7 +5268,7 @@ func (x *ReloadSchemasRequest) String() string { func (*ReloadSchemasRequest) ProtoMessage() {} func (x *ReloadSchemasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[79] + mi := &file_vtadmin_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4689,7 +5281,7 @@ func (x *ReloadSchemasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemasRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemasRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{79} + return file_vtadmin_proto_rawDescGZIP(), []int{89} } func (x *ReloadSchemasRequest) GetKeyspaces() []string { @@ -4763,7 +5355,7 @@ type ReloadSchemasResponse struct { func (x *ReloadSchemasResponse) Reset() { *x = ReloadSchemasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[80] + mi := &file_vtadmin_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4776,7 +5368,7 @@ func (x *ReloadSchemasResponse) String() string { func (*ReloadSchemasResponse) ProtoMessage() {} func (x *ReloadSchemasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[80] + mi := &file_vtadmin_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4789,7 +5381,7 @@ func (x *ReloadSchemasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemasResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemasResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{80} + return file_vtadmin_proto_rawDescGZIP(), []int{90} } func (x *ReloadSchemasResponse) GetKeyspaceResults() []*ReloadSchemasResponse_KeyspaceResult { @@ -4829,7 +5421,7 @@ type ReloadSchemaShardRequest struct { func (x *ReloadSchemaShardRequest) Reset() { *x = ReloadSchemaShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[81] + mi := &file_vtadmin_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4842,7 +5434,7 @@ func (x *ReloadSchemaShardRequest) String() string { func (*ReloadSchemaShardRequest) ProtoMessage() {} func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[81] + mi := &file_vtadmin_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4855,7 +5447,7 @@ func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{81} + return file_vtadmin_proto_rawDescGZIP(), []int{91} } func (x *ReloadSchemaShardRequest) GetClusterId() string { @@ -4911,7 +5503,7 @@ type ReloadSchemaShardResponse struct { func (x *ReloadSchemaShardResponse) Reset() { *x = ReloadSchemaShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[82] + mi := &file_vtadmin_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4924,7 +5516,7 @@ func (x *ReloadSchemaShardResponse) String() string { func (*ReloadSchemaShardResponse) ProtoMessage() {} func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[82] + mi := &file_vtadmin_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4937,7 +5529,7 @@ func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{82} + return file_vtadmin_proto_rawDescGZIP(), []int{92} } func (x *ReloadSchemaShardResponse) GetEvents() []*logutil.Event { @@ -4959,7 +5551,7 @@ type RefreshTabletReplicationSourceRequest struct { func (x *RefreshTabletReplicationSourceRequest) Reset() { *x = RefreshTabletReplicationSourceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[83] + mi := &file_vtadmin_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4972,7 +5564,7 @@ func (x *RefreshTabletReplicationSourceRequest) String() string { func (*RefreshTabletReplicationSourceRequest) ProtoMessage() {} func (x *RefreshTabletReplicationSourceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[83] + mi := &file_vtadmin_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4985,7 +5577,7 @@ func (x *RefreshTabletReplicationSourceRequest) ProtoReflect() protoreflect.Mess // Deprecated: Use RefreshTabletReplicationSourceRequest.ProtoReflect.Descriptor instead. func (*RefreshTabletReplicationSourceRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{83} + return file_vtadmin_proto_rawDescGZIP(), []int{93} } func (x *RefreshTabletReplicationSourceRequest) GetAlias() *topodata.TabletAlias { @@ -5016,7 +5608,7 @@ type RefreshTabletReplicationSourceResponse struct { func (x *RefreshTabletReplicationSourceResponse) Reset() { *x = RefreshTabletReplicationSourceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[84] + mi := &file_vtadmin_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5029,7 +5621,7 @@ func (x *RefreshTabletReplicationSourceResponse) String() string { func (*RefreshTabletReplicationSourceResponse) ProtoMessage() {} func (x *RefreshTabletReplicationSourceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[84] + mi := &file_vtadmin_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5042,7 +5634,7 @@ func (x *RefreshTabletReplicationSourceResponse) ProtoReflect() protoreflect.Mes // Deprecated: Use RefreshTabletReplicationSourceResponse.ProtoReflect.Descriptor instead. func (*RefreshTabletReplicationSourceResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{84} + return file_vtadmin_proto_rawDescGZIP(), []int{94} } func (x *RefreshTabletReplicationSourceResponse) GetKeyspace() string { @@ -5088,7 +5680,7 @@ type RemoveKeyspaceCellRequest struct { func (x *RemoveKeyspaceCellRequest) Reset() { *x = RemoveKeyspaceCellRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[85] + mi := &file_vtadmin_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5101,7 +5693,7 @@ func (x *RemoveKeyspaceCellRequest) String() string { func (*RemoveKeyspaceCellRequest) ProtoMessage() {} func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[85] + mi := &file_vtadmin_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5114,7 +5706,7 @@ func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellRequest.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{85} + return file_vtadmin_proto_rawDescGZIP(), []int{95} } func (x *RemoveKeyspaceCellRequest) GetClusterId() string { @@ -5163,7 +5755,7 @@ type RemoveKeyspaceCellResponse struct { func (x *RemoveKeyspaceCellResponse) Reset() { *x = RemoveKeyspaceCellResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[86] + mi := &file_vtadmin_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5176,7 +5768,7 @@ func (x *RemoveKeyspaceCellResponse) String() string { func (*RemoveKeyspaceCellResponse) ProtoMessage() {} func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[86] + mi := &file_vtadmin_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5189,7 +5781,7 @@ func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellResponse.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{86} + return file_vtadmin_proto_rawDescGZIP(), []int{96} } func (x *RemoveKeyspaceCellResponse) GetStatus() string { @@ -5211,7 +5803,7 @@ type RetrySchemaMigrationRequest struct { func (x *RetrySchemaMigrationRequest) Reset() { *x = RetrySchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[87] + mi := &file_vtadmin_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5224,7 +5816,7 @@ func (x *RetrySchemaMigrationRequest) String() string { func (*RetrySchemaMigrationRequest) ProtoMessage() {} func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[87] + mi := &file_vtadmin_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5237,7 +5829,7 @@ func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RetrySchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*RetrySchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{87} + return file_vtadmin_proto_rawDescGZIP(), []int{97} } func (x *RetrySchemaMigrationRequest) GetClusterId() string { @@ -5266,7 +5858,7 @@ type RunHealthCheckRequest struct { func (x *RunHealthCheckRequest) Reset() { *x = RunHealthCheckRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[88] + mi := &file_vtadmin_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5279,7 +5871,7 @@ func (x *RunHealthCheckRequest) String() string { func (*RunHealthCheckRequest) ProtoMessage() {} func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[88] + mi := &file_vtadmin_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5292,7 +5884,7 @@ func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckRequest.ProtoReflect.Descriptor instead. func (*RunHealthCheckRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{88} + return file_vtadmin_proto_rawDescGZIP(), []int{98} } func (x *RunHealthCheckRequest) GetAlias() *topodata.TabletAlias { @@ -5321,7 +5913,7 @@ type RunHealthCheckResponse struct { func (x *RunHealthCheckResponse) Reset() { *x = RunHealthCheckResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[89] + mi := &file_vtadmin_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5334,7 +5926,7 @@ func (x *RunHealthCheckResponse) String() string { func (*RunHealthCheckResponse) ProtoMessage() {} func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[89] + mi := &file_vtadmin_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5347,7 +5939,7 @@ func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckResponse.ProtoReflect.Descriptor instead. func (*RunHealthCheckResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{89} + return file_vtadmin_proto_rawDescGZIP(), []int{99} } func (x *RunHealthCheckResponse) GetStatus() string { @@ -5364,6 +5956,61 @@ func (x *RunHealthCheckResponse) GetCluster() *Cluster { return nil } +type ReshardCreateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Request *vtctldata.ReshardCreateRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` +} + +func (x *ReshardCreateRequest) Reset() { + *x = ReshardCreateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[100] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReshardCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReshardCreateRequest) ProtoMessage() {} + +func (x *ReshardCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[100] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReshardCreateRequest.ProtoReflect.Descriptor instead. +func (*ReshardCreateRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{100} +} + +func (x *ReshardCreateRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ReshardCreateRequest) GetRequest() *vtctldata.ReshardCreateRequest { + if x != nil { + return x.Request + } + return nil +} + type SetReadOnlyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5376,7 +6023,7 @@ type SetReadOnlyRequest struct { func (x *SetReadOnlyRequest) Reset() { *x = SetReadOnlyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[90] + mi := &file_vtadmin_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5389,7 +6036,7 @@ func (x *SetReadOnlyRequest) String() string { func (*SetReadOnlyRequest) ProtoMessage() {} func (x *SetReadOnlyRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[90] + mi := &file_vtadmin_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5402,7 +6049,7 @@ func (x *SetReadOnlyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetReadOnlyRequest.ProtoReflect.Descriptor instead. func (*SetReadOnlyRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{90} + return file_vtadmin_proto_rawDescGZIP(), []int{101} } func (x *SetReadOnlyRequest) GetAlias() *topodata.TabletAlias { @@ -5428,7 +6075,7 @@ type SetReadOnlyResponse struct { func (x *SetReadOnlyResponse) Reset() { *x = SetReadOnlyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[91] + mi := &file_vtadmin_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5441,7 +6088,7 @@ func (x *SetReadOnlyResponse) String() string { func (*SetReadOnlyResponse) ProtoMessage() {} func (x *SetReadOnlyResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[91] + mi := &file_vtadmin_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5454,7 +6101,7 @@ func (x *SetReadOnlyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetReadOnlyResponse.ProtoReflect.Descriptor instead. func (*SetReadOnlyResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{91} + return file_vtadmin_proto_rawDescGZIP(), []int{102} } type SetReadWriteRequest struct { @@ -5469,7 +6116,7 @@ type SetReadWriteRequest struct { func (x *SetReadWriteRequest) Reset() { *x = SetReadWriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[92] + mi := &file_vtadmin_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5482,7 +6129,7 @@ func (x *SetReadWriteRequest) String() string { func (*SetReadWriteRequest) ProtoMessage() {} func (x *SetReadWriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[92] + mi := &file_vtadmin_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5495,7 +6142,7 @@ func (x *SetReadWriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetReadWriteRequest.ProtoReflect.Descriptor instead. func (*SetReadWriteRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{92} + return file_vtadmin_proto_rawDescGZIP(), []int{103} } func (x *SetReadWriteRequest) GetAlias() *topodata.TabletAlias { @@ -5521,7 +6168,7 @@ type SetReadWriteResponse struct { func (x *SetReadWriteResponse) Reset() { *x = SetReadWriteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[93] + mi := &file_vtadmin_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5534,7 +6181,7 @@ func (x *SetReadWriteResponse) String() string { func (*SetReadWriteResponse) ProtoMessage() {} func (x *SetReadWriteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[93] + mi := &file_vtadmin_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5547,7 +6194,7 @@ func (x *SetReadWriteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetReadWriteResponse.ProtoReflect.Descriptor instead. func (*SetReadWriteResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{93} + return file_vtadmin_proto_rawDescGZIP(), []int{104} } type StartReplicationRequest struct { @@ -5562,7 +6209,7 @@ type StartReplicationRequest struct { func (x *StartReplicationRequest) Reset() { *x = StartReplicationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[94] + mi := &file_vtadmin_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5575,7 +6222,7 @@ func (x *StartReplicationRequest) String() string { func (*StartReplicationRequest) ProtoMessage() {} func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[94] + mi := &file_vtadmin_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5588,7 +6235,7 @@ func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationRequest.ProtoReflect.Descriptor instead. func (*StartReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{94} + return file_vtadmin_proto_rawDescGZIP(), []int{105} } func (x *StartReplicationRequest) GetAlias() *topodata.TabletAlias { @@ -5617,7 +6264,7 @@ type StartReplicationResponse struct { func (x *StartReplicationResponse) Reset() { *x = StartReplicationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[95] + mi := &file_vtadmin_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5630,7 +6277,7 @@ func (x *StartReplicationResponse) String() string { func (*StartReplicationResponse) ProtoMessage() {} func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[95] + mi := &file_vtadmin_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5643,7 +6290,7 @@ func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationResponse.ProtoReflect.Descriptor instead. func (*StartReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{95} + return file_vtadmin_proto_rawDescGZIP(), []int{106} } func (x *StartReplicationResponse) GetStatus() string { @@ -5672,7 +6319,7 @@ type StopReplicationRequest struct { func (x *StopReplicationRequest) Reset() { *x = StopReplicationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[96] + mi := &file_vtadmin_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5685,7 +6332,7 @@ func (x *StopReplicationRequest) String() string { func (*StopReplicationRequest) ProtoMessage() {} func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[96] + mi := &file_vtadmin_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5698,7 +6345,7 @@ func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationRequest.ProtoReflect.Descriptor instead. func (*StopReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{96} + return file_vtadmin_proto_rawDescGZIP(), []int{107} } func (x *StopReplicationRequest) GetAlias() *topodata.TabletAlias { @@ -5727,7 +6374,7 @@ type StopReplicationResponse struct { func (x *StopReplicationResponse) Reset() { *x = StopReplicationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[97] + mi := &file_vtadmin_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5740,7 +6387,7 @@ func (x *StopReplicationResponse) String() string { func (*StopReplicationResponse) ProtoMessage() {} func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[97] + mi := &file_vtadmin_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5753,51 +6400,358 @@ func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationResponse.ProtoReflect.Descriptor instead. func (*StopReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{97} + return file_vtadmin_proto_rawDescGZIP(), []int{108} +} + +func (x *StopReplicationResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *StopReplicationResponse) GetCluster() *Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +type TabletExternallyPromotedRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Tablet is the alias of the tablet that was promoted externally and should + // be updated to the shard primary in the topo. + Alias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` +} + +func (x *TabletExternallyPromotedRequest) Reset() { + *x = TabletExternallyPromotedRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[109] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TabletExternallyPromotedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TabletExternallyPromotedRequest) ProtoMessage() {} + +func (x *TabletExternallyPromotedRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[109] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TabletExternallyPromotedRequest.ProtoReflect.Descriptor instead. +func (*TabletExternallyPromotedRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{109} +} + +func (x *TabletExternallyPromotedRequest) GetAlias() *topodata.TabletAlias { + if x != nil { + return x.Alias + } + return nil +} + +func (x *TabletExternallyPromotedRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +type TabletExternallyPromotedResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + Shard string `protobuf:"bytes,3,opt,name=shard,proto3" json:"shard,omitempty"` + NewPrimary *topodata.TabletAlias `protobuf:"bytes,4,opt,name=new_primary,json=newPrimary,proto3" json:"new_primary,omitempty"` + OldPrimary *topodata.TabletAlias `protobuf:"bytes,5,opt,name=old_primary,json=oldPrimary,proto3" json:"old_primary,omitempty"` +} + +func (x *TabletExternallyPromotedResponse) Reset() { + *x = TabletExternallyPromotedResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[110] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TabletExternallyPromotedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TabletExternallyPromotedResponse) ProtoMessage() {} + +func (x *TabletExternallyPromotedResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[110] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TabletExternallyPromotedResponse.ProtoReflect.Descriptor instead. +func (*TabletExternallyPromotedResponse) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{110} +} + +func (x *TabletExternallyPromotedResponse) GetCluster() *Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +func (x *TabletExternallyPromotedResponse) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +func (x *TabletExternallyPromotedResponse) GetShard() string { + if x != nil { + return x.Shard + } + return "" +} + +func (x *TabletExternallyPromotedResponse) GetNewPrimary() *topodata.TabletAlias { + if x != nil { + return x.NewPrimary + } + return nil +} + +func (x *TabletExternallyPromotedResponse) GetOldPrimary() *topodata.TabletAlias { + if x != nil { + return x.OldPrimary + } + return nil +} + +type TabletExternallyReparentedRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Alias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` +} + +func (x *TabletExternallyReparentedRequest) Reset() { + *x = TabletExternallyReparentedRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[111] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TabletExternallyReparentedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TabletExternallyReparentedRequest) ProtoMessage() {} + +func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[111] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TabletExternallyReparentedRequest.ProtoReflect.Descriptor instead. +func (*TabletExternallyReparentedRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{111} +} + +func (x *TabletExternallyReparentedRequest) GetAlias() *topodata.TabletAlias { + if x != nil { + return x.Alias + } + return nil +} + +func (x *TabletExternallyReparentedRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +type ValidateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PingTablets bool `protobuf:"varint,2,opt,name=ping_tablets,json=pingTablets,proto3" json:"ping_tablets,omitempty"` +} + +func (x *ValidateRequest) Reset() { + *x = ValidateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateRequest) ProtoMessage() {} + +func (x *ValidateRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[112] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateRequest.ProtoReflect.Descriptor instead. +func (*ValidateRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{112} +} + +func (x *ValidateRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ValidateRequest) GetPingTablets() bool { + if x != nil { + return x.PingTablets + } + return false +} + +type ValidateKeyspaceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + PingTablets bool `protobuf:"varint,3,opt,name=ping_tablets,json=pingTablets,proto3" json:"ping_tablets,omitempty"` +} + +func (x *ValidateKeyspaceRequest) Reset() { + *x = ValidateKeyspaceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtadmin_proto_msgTypes[113] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateKeyspaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateKeyspaceRequest) ProtoMessage() {} + +func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[113] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateKeyspaceRequest.ProtoReflect.Descriptor instead. +func (*ValidateKeyspaceRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{113} +} + +func (x *ValidateKeyspaceRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" } -func (x *StopReplicationResponse) GetStatus() string { +func (x *ValidateKeyspaceRequest) GetKeyspace() string { if x != nil { - return x.Status + return x.Keyspace } return "" } -func (x *StopReplicationResponse) GetCluster() *Cluster { +func (x *ValidateKeyspaceRequest) GetPingTablets() bool { if x != nil { - return x.Cluster + return x.PingTablets } - return nil + return false } -type TabletExternallyPromotedRequest struct { +type ValidateSchemaKeyspaceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Tablet is the alias of the tablet that was promoted externally and should - // be updated to the shard primary in the topo. - Alias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` } -func (x *TabletExternallyPromotedRequest) Reset() { - *x = TabletExternallyPromotedRequest{} +func (x *ValidateSchemaKeyspaceRequest) Reset() { + *x = ValidateSchemaKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[98] + mi := &file_vtadmin_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TabletExternallyPromotedRequest) String() string { +func (x *ValidateSchemaKeyspaceRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TabletExternallyPromotedRequest) ProtoMessage() {} +func (*ValidateSchemaKeyspaceRequest) ProtoMessage() {} -func (x *TabletExternallyPromotedRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[98] +func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5808,54 +6762,53 @@ func (x *TabletExternallyPromotedRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TabletExternallyPromotedRequest.ProtoReflect.Descriptor instead. -func (*TabletExternallyPromotedRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{98} +// Deprecated: Use ValidateSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. +func (*ValidateSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{114} } -func (x *TabletExternallyPromotedRequest) GetAlias() *topodata.TabletAlias { +func (x *ValidateSchemaKeyspaceRequest) GetClusterId() string { if x != nil { - return x.Alias + return x.ClusterId } - return nil + return "" } -func (x *TabletExternallyPromotedRequest) GetClusterIds() []string { +func (x *ValidateSchemaKeyspaceRequest) GetKeyspace() string { if x != nil { - return x.ClusterIds + return x.Keyspace } - return nil + return "" } -type TabletExternallyPromotedResponse struct { +type ValidateShardRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` - Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` - Shard string `protobuf:"bytes,3,opt,name=shard,proto3" json:"shard,omitempty"` - NewPrimary *topodata.TabletAlias `protobuf:"bytes,4,opt,name=new_primary,json=newPrimary,proto3" json:"new_primary,omitempty"` - OldPrimary *topodata.TabletAlias `protobuf:"bytes,5,opt,name=old_primary,json=oldPrimary,proto3" json:"old_primary,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + Shard string `protobuf:"bytes,3,opt,name=shard,proto3" json:"shard,omitempty"` + PingTablets bool `protobuf:"varint,4,opt,name=ping_tablets,json=pingTablets,proto3" json:"ping_tablets,omitempty"` } -func (x *TabletExternallyPromotedResponse) Reset() { - *x = TabletExternallyPromotedResponse{} +func (x *ValidateShardRequest) Reset() { + *x = ValidateShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[99] + mi := &file_vtadmin_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TabletExternallyPromotedResponse) String() string { +func (x *ValidateShardRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TabletExternallyPromotedResponse) ProtoMessage() {} +func (*ValidateShardRequest) ProtoMessage() {} -func (x *TabletExternallyPromotedResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[99] +func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5866,72 +6819,65 @@ func (x *TabletExternallyPromotedResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TabletExternallyPromotedResponse.ProtoReflect.Descriptor instead. -func (*TabletExternallyPromotedResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{99} +// Deprecated: Use ValidateShardRequest.ProtoReflect.Descriptor instead. +func (*ValidateShardRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{115} } -func (x *TabletExternallyPromotedResponse) GetCluster() *Cluster { +func (x *ValidateShardRequest) GetClusterId() string { if x != nil { - return x.Cluster + return x.ClusterId } - return nil + return "" } -func (x *TabletExternallyPromotedResponse) GetKeyspace() string { +func (x *ValidateShardRequest) GetKeyspace() string { if x != nil { return x.Keyspace } return "" } -func (x *TabletExternallyPromotedResponse) GetShard() string { +func (x *ValidateShardRequest) GetShard() string { if x != nil { return x.Shard } return "" } -func (x *TabletExternallyPromotedResponse) GetNewPrimary() *topodata.TabletAlias { - if x != nil { - return x.NewPrimary - } - return nil -} - -func (x *TabletExternallyPromotedResponse) GetOldPrimary() *topodata.TabletAlias { +func (x *ValidateShardRequest) GetPingTablets() bool { if x != nil { - return x.OldPrimary + return x.PingTablets } - return nil + return false } -type TabletExternallyReparentedRequest struct { +type ValidateVersionKeyspaceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Alias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` } -func (x *TabletExternallyReparentedRequest) Reset() { - *x = TabletExternallyReparentedRequest{} +func (x *ValidateVersionKeyspaceRequest) Reset() { + *x = ValidateVersionKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[100] + mi := &file_vtadmin_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TabletExternallyReparentedRequest) String() string { +func (x *ValidateVersionKeyspaceRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TabletExternallyReparentedRequest) ProtoMessage() {} +func (*ValidateVersionKeyspaceRequest) ProtoMessage() {} -func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[100] +func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5942,51 +6888,52 @@ func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use TabletExternallyReparentedRequest.ProtoReflect.Descriptor instead. -func (*TabletExternallyReparentedRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{100} +// Deprecated: Use ValidateVersionKeyspaceRequest.ProtoReflect.Descriptor instead. +func (*ValidateVersionKeyspaceRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{116} } -func (x *TabletExternallyReparentedRequest) GetAlias() *topodata.TabletAlias { +func (x *ValidateVersionKeyspaceRequest) GetClusterId() string { if x != nil { - return x.Alias + return x.ClusterId } - return nil + return "" } -func (x *TabletExternallyReparentedRequest) GetClusterIds() []string { +func (x *ValidateVersionKeyspaceRequest) GetKeyspace() string { if x != nil { - return x.ClusterIds + return x.Keyspace } - return nil + return "" } -type ValidateRequest struct { +type ValidateVersionShardRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - PingTablets bool `protobuf:"varint,2,opt,name=ping_tablets,json=pingTablets,proto3" json:"ping_tablets,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + Shard string `protobuf:"bytes,3,opt,name=shard,proto3" json:"shard,omitempty"` } -func (x *ValidateRequest) Reset() { - *x = ValidateRequest{} +func (x *ValidateVersionShardRequest) Reset() { + *x = ValidateVersionShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[101] + mi := &file_vtadmin_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ValidateRequest) String() string { +func (x *ValidateVersionShardRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ValidateRequest) ProtoMessage() {} +func (*ValidateVersionShardRequest) ProtoMessage() {} -func (x *ValidateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[101] +func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5997,52 +6944,58 @@ func (x *ValidateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ValidateRequest.ProtoReflect.Descriptor instead. -func (*ValidateRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{101} +// Deprecated: Use ValidateVersionShardRequest.ProtoReflect.Descriptor instead. +func (*ValidateVersionShardRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{117} } -func (x *ValidateRequest) GetClusterId() string { +func (x *ValidateVersionShardRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *ValidateRequest) GetPingTablets() bool { +func (x *ValidateVersionShardRequest) GetKeyspace() string { if x != nil { - return x.PingTablets + return x.Keyspace } - return false + return "" } -type ValidateKeyspaceRequest struct { +func (x *ValidateVersionShardRequest) GetShard() string { + if x != nil { + return x.Shard + } + return "" +} + +type VDiffCreateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` - PingTablets bool `protobuf:"varint,3,opt,name=ping_tablets,json=pingTablets,proto3" json:"ping_tablets,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Request *vtctldata.VDiffCreateRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` } -func (x *ValidateKeyspaceRequest) Reset() { - *x = ValidateKeyspaceRequest{} +func (x *VDiffCreateRequest) Reset() { + *x = VDiffCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[102] + mi := &file_vtadmin_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ValidateKeyspaceRequest) String() string { +func (x *VDiffCreateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ValidateKeyspaceRequest) ProtoMessage() {} +func (*VDiffCreateRequest) ProtoMessage() {} -func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[102] +func (x *VDiffCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6053,58 +7006,51 @@ func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ValidateKeyspaceRequest.ProtoReflect.Descriptor instead. -func (*ValidateKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{102} +// Deprecated: Use VDiffCreateRequest.ProtoReflect.Descriptor instead. +func (*VDiffCreateRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{118} } -func (x *ValidateKeyspaceRequest) GetClusterId() string { +func (x *VDiffCreateRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *ValidateKeyspaceRequest) GetKeyspace() string { - if x != nil { - return x.Keyspace - } - return "" -} - -func (x *ValidateKeyspaceRequest) GetPingTablets() bool { +func (x *VDiffCreateRequest) GetRequest() *vtctldata.VDiffCreateRequest { if x != nil { - return x.PingTablets + return x.Request } - return false + return nil } -type ValidateSchemaKeyspaceRequest struct { +type VDiffShowRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Request *vtctldata.VDiffShowRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"` } -func (x *ValidateSchemaKeyspaceRequest) Reset() { - *x = ValidateSchemaKeyspaceRequest{} +func (x *VDiffShowRequest) Reset() { + *x = VDiffShowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[103] + mi := &file_vtadmin_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ValidateSchemaKeyspaceRequest) String() string { +func (x *VDiffShowRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ValidateSchemaKeyspaceRequest) ProtoMessage() {} +func (*VDiffShowRequest) ProtoMessage() {} -func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[103] +func (x *VDiffShowRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6115,122 +7061,110 @@ func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ValidateSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. -func (*ValidateSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{103} +// Deprecated: Use VDiffShowRequest.ProtoReflect.Descriptor instead. +func (*VDiffShowRequest) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{119} } -func (x *ValidateSchemaKeyspaceRequest) GetClusterId() string { +func (x *VDiffShowRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *ValidateSchemaKeyspaceRequest) GetKeyspace() string { +func (x *VDiffShowRequest) GetRequest() *vtctldata.VDiffShowRequest { if x != nil { - return x.Keyspace + return x.Request } - return "" + return nil } -type ValidateShardRequest struct { +type VDiffProgress struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` - Shard string `protobuf:"bytes,3,opt,name=shard,proto3" json:"shard,omitempty"` - PingTablets bool `protobuf:"varint,4,opt,name=ping_tablets,json=pingTablets,proto3" json:"ping_tablets,omitempty"` + Percentage float64 `protobuf:"fixed64,1,opt,name=percentage,proto3" json:"percentage,omitempty"` + Eta string `protobuf:"bytes,2,opt,name=eta,proto3" json:"eta,omitempty"` } -func (x *ValidateShardRequest) Reset() { - *x = ValidateShardRequest{} +func (x *VDiffProgress) Reset() { + *x = VDiffProgress{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[104] + mi := &file_vtadmin_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ValidateShardRequest) String() string { +func (x *VDiffProgress) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ValidateShardRequest) ProtoMessage() {} +func (*VDiffProgress) ProtoMessage() {} -func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[104] +func (x *VDiffProgress) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ValidateShardRequest.ProtoReflect.Descriptor instead. -func (*ValidateShardRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{104} -} - -func (x *ValidateShardRequest) GetClusterId() string { - if x != nil { - return x.ClusterId + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ValidateShardRequest) GetKeyspace() string { - if x != nil { - return x.Keyspace - } - return "" +// Deprecated: Use VDiffProgress.ProtoReflect.Descriptor instead. +func (*VDiffProgress) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{120} } -func (x *ValidateShardRequest) GetShard() string { +func (x *VDiffProgress) GetPercentage() float64 { if x != nil { - return x.Shard + return x.Percentage } - return "" + return 0 } -func (x *ValidateShardRequest) GetPingTablets() bool { +func (x *VDiffProgress) GetEta() string { if x != nil { - return x.PingTablets + return x.Eta } - return false + return "" } -type ValidateVersionKeyspaceRequest struct { +type VDiffShardReport struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + RowsCompared int64 `protobuf:"varint,2,opt,name=rows_compared,json=rowsCompared,proto3" json:"rows_compared,omitempty"` + HasMismatch bool `protobuf:"varint,3,opt,name=has_mismatch,json=hasMismatch,proto3" json:"has_mismatch,omitempty"` + StartedAt string `protobuf:"bytes,4,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + CompletedAt string `protobuf:"bytes,5,opt,name=completed_at,json=completedAt,proto3" json:"completed_at,omitempty"` + Progress *VDiffProgress `protobuf:"bytes,6,opt,name=progress,proto3" json:"progress,omitempty"` } -func (x *ValidateVersionKeyspaceRequest) Reset() { - *x = ValidateVersionKeyspaceRequest{} +func (x *VDiffShardReport) Reset() { + *x = VDiffShardReport{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[105] + mi := &file_vtadmin_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ValidateVersionKeyspaceRequest) String() string { +func (x *VDiffShardReport) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ValidateVersionKeyspaceRequest) ProtoMessage() {} +func (*VDiffShardReport) ProtoMessage() {} -func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[105] +func (x *VDiffShardReport) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6241,52 +7175,78 @@ func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ValidateVersionKeyspaceRequest.ProtoReflect.Descriptor instead. -func (*ValidateVersionKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{105} +// Deprecated: Use VDiffShardReport.ProtoReflect.Descriptor instead. +func (*VDiffShardReport) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{121} } -func (x *ValidateVersionKeyspaceRequest) GetClusterId() string { +func (x *VDiffShardReport) GetState() string { if x != nil { - return x.ClusterId + return x.State } return "" } -func (x *ValidateVersionKeyspaceRequest) GetKeyspace() string { +func (x *VDiffShardReport) GetRowsCompared() int64 { if x != nil { - return x.Keyspace + return x.RowsCompared + } + return 0 +} + +func (x *VDiffShardReport) GetHasMismatch() bool { + if x != nil { + return x.HasMismatch + } + return false +} + +func (x *VDiffShardReport) GetStartedAt() string { + if x != nil { + return x.StartedAt } return "" } -type ValidateVersionShardRequest struct { +func (x *VDiffShardReport) GetCompletedAt() string { + if x != nil { + return x.CompletedAt + } + return "" +} + +func (x *VDiffShardReport) GetProgress() *VDiffProgress { + if x != nil { + return x.Progress + } + return nil +} + +type VDiffShowResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Keyspace string `protobuf:"bytes,2,opt,name=keyspace,proto3" json:"keyspace,omitempty"` - Shard string `protobuf:"bytes,3,opt,name=shard,proto3" json:"shard,omitempty"` + ShardReport map[string]*VDiffShardReport `protobuf:"bytes,1,rep,name=shard_report,json=shardReport,proto3" json:"shard_report,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *ValidateVersionShardRequest) Reset() { - *x = ValidateVersionShardRequest{} +func (x *VDiffShowResponse) Reset() { + *x = VDiffShowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[106] + mi := &file_vtadmin_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ValidateVersionShardRequest) String() string { +func (x *VDiffShowResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ValidateVersionShardRequest) ProtoMessage() {} +func (*VDiffShowResponse) ProtoMessage() {} -func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[106] +func (x *VDiffShowResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtadmin_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6297,30 +7257,16 @@ func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ValidateVersionShardRequest.ProtoReflect.Descriptor instead. -func (*ValidateVersionShardRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{106} -} - -func (x *ValidateVersionShardRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *ValidateVersionShardRequest) GetKeyspace() string { - if x != nil { - return x.Keyspace - } - return "" +// Deprecated: Use VDiffShowResponse.ProtoReflect.Descriptor instead. +func (*VDiffShowResponse) Descriptor() ([]byte, []int) { + return file_vtadmin_proto_rawDescGZIP(), []int{122} } -func (x *ValidateVersionShardRequest) GetShard() string { +func (x *VDiffShowResponse) GetShardReport() map[string]*VDiffShardReport { if x != nil { - return x.Shard + return x.ShardReport } - return "" + return nil } type VTExplainRequest struct { @@ -6336,7 +7282,7 @@ type VTExplainRequest struct { func (x *VTExplainRequest) Reset() { *x = VTExplainRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[107] + mi := &file_vtadmin_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6349,7 +7295,7 @@ func (x *VTExplainRequest) String() string { func (*VTExplainRequest) ProtoMessage() {} func (x *VTExplainRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[107] + mi := &file_vtadmin_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6362,7 +7308,7 @@ func (x *VTExplainRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VTExplainRequest.ProtoReflect.Descriptor instead. func (*VTExplainRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{107} + return file_vtadmin_proto_rawDescGZIP(), []int{123} } func (x *VTExplainRequest) GetCluster() string { @@ -6397,7 +7343,7 @@ type VTExplainResponse struct { func (x *VTExplainResponse) Reset() { *x = VTExplainResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[108] + mi := &file_vtadmin_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6410,7 +7356,7 @@ func (x *VTExplainResponse) String() string { func (*VTExplainResponse) ProtoMessage() {} func (x *VTExplainResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[108] + mi := &file_vtadmin_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6423,7 +7369,7 @@ func (x *VTExplainResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VTExplainResponse.ProtoReflect.Descriptor instead. func (*VTExplainResponse) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{108} + return file_vtadmin_proto_rawDescGZIP(), []int{124} } func (x *VTExplainResponse) GetResponse() string { @@ -6445,7 +7391,7 @@ type Schema_ShardTableSize struct { func (x *Schema_ShardTableSize) Reset() { *x = Schema_ShardTableSize{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[112] + mi := &file_vtadmin_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6458,7 +7404,7 @@ func (x *Schema_ShardTableSize) String() string { func (*Schema_ShardTableSize) ProtoMessage() {} func (x *Schema_ShardTableSize) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[112] + mi := &file_vtadmin_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6503,7 +7449,7 @@ type Schema_TableSize struct { func (x *Schema_TableSize) Reset() { *x = Schema_TableSize{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[113] + mi := &file_vtadmin_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6516,7 +7462,7 @@ func (x *Schema_TableSize) String() string { func (*Schema_TableSize) ProtoMessage() {} func (x *Schema_TableSize) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[113] + mi := &file_vtadmin_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6565,7 +7511,7 @@ type GetSchemaMigrationsRequest_ClusterRequest struct { func (x *GetSchemaMigrationsRequest_ClusterRequest) Reset() { *x = GetSchemaMigrationsRequest_ClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[115] + mi := &file_vtadmin_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6578,7 +7524,7 @@ func (x *GetSchemaMigrationsRequest_ClusterRequest) String() string { func (*GetSchemaMigrationsRequest_ClusterRequest) ProtoMessage() {} func (x *GetSchemaMigrationsRequest_ClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[115] + mi := &file_vtadmin_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6591,7 +7537,7 @@ func (x *GetSchemaMigrationsRequest_ClusterRequest) ProtoReflect() protoreflect. // Deprecated: Use GetSchemaMigrationsRequest_ClusterRequest.ProtoReflect.Descriptor instead. func (*GetSchemaMigrationsRequest_ClusterRequest) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{47, 0} + return file_vtadmin_proto_rawDescGZIP(), []int{50, 0} } func (x *GetSchemaMigrationsRequest_ClusterRequest) GetClusterId() string { @@ -6626,7 +7572,7 @@ type ReloadSchemasResponse_KeyspaceResult struct { func (x *ReloadSchemasResponse_KeyspaceResult) Reset() { *x = ReloadSchemasResponse_KeyspaceResult{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[118] + mi := &file_vtadmin_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6639,7 +7585,7 @@ func (x *ReloadSchemasResponse_KeyspaceResult) String() string { func (*ReloadSchemasResponse_KeyspaceResult) ProtoMessage() {} func (x *ReloadSchemasResponse_KeyspaceResult) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[118] + mi := &file_vtadmin_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6652,7 +7598,7 @@ func (x *ReloadSchemasResponse_KeyspaceResult) ProtoReflect() protoreflect.Messa // Deprecated: Use ReloadSchemasResponse_KeyspaceResult.ProtoReflect.Descriptor instead. func (*ReloadSchemasResponse_KeyspaceResult) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{80, 0} + return file_vtadmin_proto_rawDescGZIP(), []int{90, 0} } func (x *ReloadSchemasResponse_KeyspaceResult) GetKeyspace() *Keyspace { @@ -6687,7 +7633,7 @@ type ReloadSchemasResponse_ShardResult struct { func (x *ReloadSchemasResponse_ShardResult) Reset() { *x = ReloadSchemasResponse_ShardResult{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[119] + mi := &file_vtadmin_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6700,7 +7646,7 @@ func (x *ReloadSchemasResponse_ShardResult) String() string { func (*ReloadSchemasResponse_ShardResult) ProtoMessage() {} func (x *ReloadSchemasResponse_ShardResult) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[119] + mi := &file_vtadmin_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6713,7 +7659,7 @@ func (x *ReloadSchemasResponse_ShardResult) ProtoReflect() protoreflect.Message // Deprecated: Use ReloadSchemasResponse_ShardResult.ProtoReflect.Descriptor instead. func (*ReloadSchemasResponse_ShardResult) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{80, 1} + return file_vtadmin_proto_rawDescGZIP(), []int{90, 1} } func (x *ReloadSchemasResponse_ShardResult) GetShard() *Shard { @@ -6749,7 +7695,7 @@ type ReloadSchemasResponse_TabletResult struct { func (x *ReloadSchemasResponse_TabletResult) Reset() { *x = ReloadSchemasResponse_TabletResult{} if protoimpl.UnsafeEnabled { - mi := &file_vtadmin_proto_msgTypes[120] + mi := &file_vtadmin_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6762,7 +7708,7 @@ func (x *ReloadSchemasResponse_TabletResult) String() string { func (*ReloadSchemasResponse_TabletResult) ProtoMessage() {} func (x *ReloadSchemasResponse_TabletResult) ProtoReflect() protoreflect.Message { - mi := &file_vtadmin_proto_msgTypes[120] + mi := &file_vtadmin_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6775,7 +7721,7 @@ func (x *ReloadSchemasResponse_TabletResult) ProtoReflect() protoreflect.Message // Deprecated: Use ReloadSchemasResponse_TabletResult.ProtoReflect.Descriptor instead. func (*ReloadSchemasResponse_TabletResult) Descriptor() ([]byte, []int) { - return file_vtadmin_proto_rawDescGZIP(), []int{80, 2} + return file_vtadmin_proto_rawDescGZIP(), []int{90, 2} } func (x *ReloadSchemasResponse_TabletResult) GetTablet() *Tablet { @@ -6978,347 +7924,396 @@ var file_vtadmin_proto_rawDesc = []byte{ 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x6c, 0x0a, 0x12, 0x41, 0x70, 0x70, - 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x72, 0x0a, 0x15, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x80, 0x01, + 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x41, 0x0a, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x6c, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x80, + 0x01, 0x0a, 0x1c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x37, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x1c, 0x43, 0x61, 0x6e, 0x63, + 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x82, 0x01, 0x0a, 0x1d, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x84, 0x01, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x82, 0x01, 0x0a, 0x1d, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x42, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4f, 0x0a, + 0x1a, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x72, + 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x47, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x6c, 0x0a, 0x12, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x72, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x72, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6e, 0x0a, + 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x88, 0x01, + 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x5a, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x22, 0x82, 0x01, 0x0a, 0x1d, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, + 0x63, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x1e, 0x45, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, + 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, + 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, + 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x73, 0x12, 0x50, 0x0a, 0x12, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x46, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, + 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, + 0x22, 0x6b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x4f, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x39, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x51, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x65, 0x73, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x22, 0x14, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x43, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x75, + 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3a, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x47, 0x0a, 0x16, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0x6c, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x72, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6e, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, - 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x22, 0x5a, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x82, 0x01, 0x0a, - 0x1d, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, - 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x42, 0x0a, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, - 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x1e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x46, - 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2b, + 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x32, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, + 0x39, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x67, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x54, 0x47, + 0x61, 0x74, 0x65, 0x52, 0x05, 0x67, 0x61, 0x74, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x36, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x22, 0x47, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0xb5, 0x01, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x01, 0x0a, - 0x11, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x50, 0x0a, 0x12, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x46, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, - 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x22, 0x6b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, - 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, - 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x4f, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, - 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x65, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x39, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, - 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x50, 0x0a, 0x12, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3f, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0xed, + 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5d, 0x0a, + 0x10, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x1a, 0x70, 0x0a, 0x0e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3f, 0x0a, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x64, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, + 0x11, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, + 0x15, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, + 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x68, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x4f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x73, 0x22, 0x51, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x07, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x65, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x43, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, - 0x62, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x22, 0x32, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x39, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x47, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x67, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x52, 0x05, 0x67, 0x61, 0x74, - 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0x36, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x47, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, + 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x73, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x63, 0x0a, 0x11, + 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x73, 0x12, 0x50, 0x0a, 0x12, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3f, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, - 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x07, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x10, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x32, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x73, 0x1a, 0x70, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x4e, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x51, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x0b, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, + 0x81, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, + 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x1a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x22, 0x60, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x34, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x3f, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x29, 0x0a, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x4b, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x64, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, - 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x01, 0x0a, - 0x23, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x85, 0x01, 0x0a, - 0x24, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x15, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x68, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x7e, 0x0a, 0x20, 0x47, 0x65, 0x74, + 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x4f, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, - 0xd7, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x0d, 0x73, - 0x72, 0x76, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x1a, 0x63, 0x0a, 0x11, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x4e, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, - 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0b, 0x73, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, 0x3b, - 0x0a, 0x1a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x60, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x34, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x73, 0x22, 0x3f, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x73, 0x22, 0x4b, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, - 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x62, 0x61, 0x6e, + 0x64, 0x6f, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, + 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x22, 0x4e, 0x0a, 0x11, 0x47, 0x65, 0x74, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x22, 0x4e, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x22, 0x35, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x44, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2d, 0x0a, 0x09, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x08, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0x34, - 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 0x73, 0x22, 0x3f, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x52, 0x07, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xa0, 0x01, 0x0a, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x35, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, + 0x22, 0x44, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x76, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x08, 0x76, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0x34, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x3f, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x52, 0x07, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x73, 0x22, 0x84, 0x01, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, + 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x69, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x6d, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x6c, + 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xa0, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, @@ -7351,627 +8346,779 @@ var file_vtadmin_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x61, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x58, 0x0a, 0x12, 0x50, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x22, 0x7e, 0x0a, 0x1b, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x46, 0x61, - 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, - 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x46, - 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x93, 0x01, 0x0a, - 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x22, 0x36, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x63, 0x0a, 0x13, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, - 0x5a, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x9f, 0x02, 0x0a, 0x14, - 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x20, 0x0a, - 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, - 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xad, 0x04, - 0x0a, 0x15, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x10, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x12, 0x4f, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x52, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x74, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x67, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x74, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, - 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, - 0x5b, 0x0a, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x24, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x4f, 0x0a, 0x0c, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x27, 0x0a, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, - 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x06, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xdb, 0x01, - 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, - 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, 0x52, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, - 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x22, 0x75, 0x0a, 0x25, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x26, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x22, 0x9e, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x9f, 0x01, 0x0a, 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3d, 0x0a, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7a, 0x0a, 0x19, 0x4d, 0x6f, 0x76, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x76, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, - 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, - 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, - 0x76, 0x65, 0x22, 0x34, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x7e, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3c, + 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x61, 0x0a, 0x11, + 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, - 0x5c, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x58, 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, + 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x7e, 0x0a, 0x1b, 0x50, 0x6c, 0x61, + 0x6e, 0x6e, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x1c, 0x50, 0x6c, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, + 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, + 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x22, 0x36, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x5a, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x22, 0x9f, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, + 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x22, 0xad, 0x04, 0x0a, 0x15, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, + 0x10, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x4f, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x52, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0d, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x67, 0x0a, 0x0e, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x26, 0x0a, + 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x5b, 0x0a, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x24, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, + 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x1a, 0x4f, 0x0a, 0x0c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x27, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0xdb, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x22, 0x43, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, + 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x75, 0x0a, 0x25, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xb7, 0x01, + 0x0a, 0x26, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x9e, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, + 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x34, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x7e, + 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x07, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, + 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x5c, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x22, 0x70, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, + 0x4f, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x63, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, + 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x5e, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x5d, + 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x62, 0x0a, - 0x12, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x16, 0x0a, - 0x14, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x6f, 0x0a, + 0x1f, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, + 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x5e, - 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x66, - 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x5d, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x6f, 0x0a, 0x1f, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xf0, 0x01, 0x0a, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, - 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0xf0, + 0x01, 0x0a, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x6c, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, + 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, + 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x12, 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6f, - 0x6c, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x71, 0x0a, 0x21, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, - 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x53, 0x0a, 0x0f, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x73, 0x22, 0x77, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6f, 0x6c, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x22, 0x71, 0x0a, 0x21, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x73, 0x22, 0x53, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x77, 0x0a, 0x17, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x73, 0x22, 0x5a, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8a, + 0x01, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, + 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x5b, 0x0a, 0x1e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x6e, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x6c, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, + 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x37, 0x0a, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, + 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x41, 0x0a, 0x0d, 0x56, 0x44, 0x69, 0x66, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x65, 0x74, 0x61, 0x22, 0xe6, 0x01, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x72, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x69, 0x73, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x4d, 0x69, + 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xbe, 0x01, 0x0a, + 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x1a, 0x59, 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5a, 0x0a, + 0x10, 0x56, 0x54, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x5a, 0x0a, 0x1d, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x73, 0x22, 0x5b, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0x6e, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x22, 0x5a, 0x0a, 0x10, 0x56, 0x54, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x22, 0x2f, 0x0a, 0x11, - 0x56, 0x54, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xad, 0x27, - 0x0a, 0x07, 0x56, 0x54, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x4c, 0x0a, 0x0b, 0x41, 0x70, 0x70, - 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x25, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x16, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x70, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, - 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x22, 0x2f, 0x0a, 0x11, 0x56, 0x54, 0x45, + 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xda, 0x30, 0x0a, 0x07, 0x56, + 0x54, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x4c, 0x0a, 0x0b, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, + 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x6d, 0x0a, 0x16, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x70, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x64, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, - 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1c, - 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4d, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, - 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, - 0x0a, 0x16, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x6f, - 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x61, 0x69, 0x6c, - 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, - 0x65, 0x6e, 0x63, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0a, 0x46, - 0x69, 0x6e, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4d, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x56, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x47, - 0x61, 0x74, 0x65, 0x73, 0x12, 0x18, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, - 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x76, - 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x09, 0x47, - 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x19, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x73, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x62, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1f, 0x2e, - 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x72, 0x76, - 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x76, 0x74, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, + 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x76, + 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6b, 0x0a, 0x16, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x61, + 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x46, + 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x45, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, + 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1a, 0x2e, 0x76, + 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x47, + 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x46, 0x75, + 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x47, + 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x73, 0x12, 0x18, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x47, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, + 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x00, 0x12, + 0x4d, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, + 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, + 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x19, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x47, 0x65, 0x74, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, - 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x0a, - 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0b, 0x47, 0x65, - 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, - 0x65, 0x74, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3f, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, - 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x76, 0x74, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x00, - 0x12, 0x4d, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x62, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, + 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x1e, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x39, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x19, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, + 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x76, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x76, + 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, + 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x73, 0x12, + 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x21, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, + 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1c, 0x2e, 0x76, + 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x50, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x14, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x46, - 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x76, - 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x46, 0x61, - 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x50, 0x6c, 0x61, - 0x6e, 0x6e, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x14, 0x52, - 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x83, 0x01, 0x0a, 0x1e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x2e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x11, 0x52, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x21, - 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x22, 0x2e, - 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x14, 0x52, 0x65, 0x74, 0x72, - 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x24, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x75, - 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x75, - 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, - 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x59, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0f, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x18, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, - 0x12, 0x28, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x12, 0x4d, + 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, 0x76, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, + 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, 0x76, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x4d, 0x61, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x21, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x50, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x65, 0x0a, 0x14, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x46, 0x61, 0x69, + 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, + 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, + 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x14, 0x52, 0x65, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4d, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x83, 0x01, 0x0a, 0x1e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x2e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x21, 0x2e, 0x76, + 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x22, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x14, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, + 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x53, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x75, 0x6e, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x52, 0x75, 0x6e, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0b, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x56, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x53, 0x74, + 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x18, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x16, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, + 0x74, 0x65, 0x64, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x50, 0x72, + 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x08, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5b, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x16, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x2e, 0x76, + 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x17, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x70, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, - 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x56, 0x54, 0x45, 0x78, 0x70, - 0x6c, 0x61, 0x69, 0x6e, 0x12, 0x19, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, - 0x54, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x54, 0x45, 0x78, 0x70, 0x6c, - 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, - 0x24, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, - 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x67, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x56, 0x44, + 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, + 0x66, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x19, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, + 0x0a, 0x09, 0x56, 0x54, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x12, 0x19, 0x2e, 0x76, 0x74, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x56, 0x54, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x56, 0x54, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x76, 0x69, 0x74, 0x65, 0x73, + 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, + 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7987,7 +9134,7 @@ func file_vtadmin_proto_rawDescGZIP() []byte { } var file_vtadmin_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_vtadmin_proto_msgTypes = make([]protoimpl.MessageInfo, 121) +var file_vtadmin_proto_msgTypes = make([]protoimpl.MessageInfo, 138) var file_vtadmin_proto_goTypes = []any{ (Tablet_ServingState)(0), // 0: vtadmin.Tablet.ServingState (*Cluster)(nil), // 1: vtadmin.Cluster @@ -8006,391 +9153,462 @@ var file_vtadmin_proto_goTypes = []any{ (*Vtctld)(nil), // 14: vtadmin.Vtctld (*VTGate)(nil), // 15: vtadmin.VTGate (*Workflow)(nil), // 16: vtadmin.Workflow - (*ApplySchemaRequest)(nil), // 17: vtadmin.ApplySchemaRequest - (*CancelSchemaMigrationRequest)(nil), // 18: vtadmin.CancelSchemaMigrationRequest - (*CleanupSchemaMigrationRequest)(nil), // 19: vtadmin.CleanupSchemaMigrationRequest - (*CompleteSchemaMigrationRequest)(nil), // 20: vtadmin.CompleteSchemaMigrationRequest - (*CreateKeyspaceRequest)(nil), // 21: vtadmin.CreateKeyspaceRequest - (*CreateKeyspaceResponse)(nil), // 22: vtadmin.CreateKeyspaceResponse - (*CreateShardRequest)(nil), // 23: vtadmin.CreateShardRequest - (*DeleteKeyspaceRequest)(nil), // 24: vtadmin.DeleteKeyspaceRequest - (*DeleteShardsRequest)(nil), // 25: vtadmin.DeleteShardsRequest - (*DeleteTabletRequest)(nil), // 26: vtadmin.DeleteTabletRequest - (*DeleteTabletResponse)(nil), // 27: vtadmin.DeleteTabletResponse - (*EmergencyFailoverShardRequest)(nil), // 28: vtadmin.EmergencyFailoverShardRequest - (*EmergencyFailoverShardResponse)(nil), // 29: vtadmin.EmergencyFailoverShardResponse - (*FindSchemaRequest)(nil), // 30: vtadmin.FindSchemaRequest - (*GetBackupsRequest)(nil), // 31: vtadmin.GetBackupsRequest - (*GetBackupsResponse)(nil), // 32: vtadmin.GetBackupsResponse - (*GetCellInfosRequest)(nil), // 33: vtadmin.GetCellInfosRequest - (*GetCellInfosResponse)(nil), // 34: vtadmin.GetCellInfosResponse - (*GetCellsAliasesRequest)(nil), // 35: vtadmin.GetCellsAliasesRequest - (*GetCellsAliasesResponse)(nil), // 36: vtadmin.GetCellsAliasesResponse - (*GetClustersRequest)(nil), // 37: vtadmin.GetClustersRequest - (*GetClustersResponse)(nil), // 38: vtadmin.GetClustersResponse - (*GetFullStatusRequest)(nil), // 39: vtadmin.GetFullStatusRequest - (*GetGatesRequest)(nil), // 40: vtadmin.GetGatesRequest - (*GetGatesResponse)(nil), // 41: vtadmin.GetGatesResponse - (*GetKeyspaceRequest)(nil), // 42: vtadmin.GetKeyspaceRequest - (*GetKeyspacesRequest)(nil), // 43: vtadmin.GetKeyspacesRequest - (*GetKeyspacesResponse)(nil), // 44: vtadmin.GetKeyspacesResponse - (*GetSchemaRequest)(nil), // 45: vtadmin.GetSchemaRequest - (*GetSchemasRequest)(nil), // 46: vtadmin.GetSchemasRequest - (*GetSchemasResponse)(nil), // 47: vtadmin.GetSchemasResponse - (*GetSchemaMigrationsRequest)(nil), // 48: vtadmin.GetSchemaMigrationsRequest - (*GetSchemaMigrationsResponse)(nil), // 49: vtadmin.GetSchemaMigrationsResponse - (*GetShardReplicationPositionsRequest)(nil), // 50: vtadmin.GetShardReplicationPositionsRequest - (*GetShardReplicationPositionsResponse)(nil), // 51: vtadmin.GetShardReplicationPositionsResponse - (*GetSrvKeyspaceRequest)(nil), // 52: vtadmin.GetSrvKeyspaceRequest - (*GetSrvKeyspacesRequest)(nil), // 53: vtadmin.GetSrvKeyspacesRequest - (*GetSrvKeyspacesResponse)(nil), // 54: vtadmin.GetSrvKeyspacesResponse - (*GetSrvVSchemaRequest)(nil), // 55: vtadmin.GetSrvVSchemaRequest - (*GetSrvVSchemasRequest)(nil), // 56: vtadmin.GetSrvVSchemasRequest - (*GetSrvVSchemasResponse)(nil), // 57: vtadmin.GetSrvVSchemasResponse - (*GetSchemaTableSizeOptions)(nil), // 58: vtadmin.GetSchemaTableSizeOptions - (*GetTabletRequest)(nil), // 59: vtadmin.GetTabletRequest - (*GetTabletsRequest)(nil), // 60: vtadmin.GetTabletsRequest - (*GetTabletsResponse)(nil), // 61: vtadmin.GetTabletsResponse - (*GetTopologyPathRequest)(nil), // 62: vtadmin.GetTopologyPathRequest - (*GetVSchemaRequest)(nil), // 63: vtadmin.GetVSchemaRequest - (*GetVSchemasRequest)(nil), // 64: vtadmin.GetVSchemasRequest - (*GetVSchemasResponse)(nil), // 65: vtadmin.GetVSchemasResponse - (*GetVtctldsRequest)(nil), // 66: vtadmin.GetVtctldsRequest - (*GetVtctldsResponse)(nil), // 67: vtadmin.GetVtctldsResponse - (*GetWorkflowRequest)(nil), // 68: vtadmin.GetWorkflowRequest - (*GetWorkflowsRequest)(nil), // 69: vtadmin.GetWorkflowsRequest - (*GetWorkflowsResponse)(nil), // 70: vtadmin.GetWorkflowsResponse - (*LaunchSchemaMigrationRequest)(nil), // 71: vtadmin.LaunchSchemaMigrationRequest - (*PingTabletRequest)(nil), // 72: vtadmin.PingTabletRequest - (*PingTabletResponse)(nil), // 73: vtadmin.PingTabletResponse - (*PlannedFailoverShardRequest)(nil), // 74: vtadmin.PlannedFailoverShardRequest - (*PlannedFailoverShardResponse)(nil), // 75: vtadmin.PlannedFailoverShardResponse - (*RebuildKeyspaceGraphRequest)(nil), // 76: vtadmin.RebuildKeyspaceGraphRequest - (*RebuildKeyspaceGraphResponse)(nil), // 77: vtadmin.RebuildKeyspaceGraphResponse - (*RefreshStateRequest)(nil), // 78: vtadmin.RefreshStateRequest - (*RefreshStateResponse)(nil), // 79: vtadmin.RefreshStateResponse - (*ReloadSchemasRequest)(nil), // 80: vtadmin.ReloadSchemasRequest - (*ReloadSchemasResponse)(nil), // 81: vtadmin.ReloadSchemasResponse - (*ReloadSchemaShardRequest)(nil), // 82: vtadmin.ReloadSchemaShardRequest - (*ReloadSchemaShardResponse)(nil), // 83: vtadmin.ReloadSchemaShardResponse - (*RefreshTabletReplicationSourceRequest)(nil), // 84: vtadmin.RefreshTabletReplicationSourceRequest - (*RefreshTabletReplicationSourceResponse)(nil), // 85: vtadmin.RefreshTabletReplicationSourceResponse - (*RemoveKeyspaceCellRequest)(nil), // 86: vtadmin.RemoveKeyspaceCellRequest - (*RemoveKeyspaceCellResponse)(nil), // 87: vtadmin.RemoveKeyspaceCellResponse - (*RetrySchemaMigrationRequest)(nil), // 88: vtadmin.RetrySchemaMigrationRequest - (*RunHealthCheckRequest)(nil), // 89: vtadmin.RunHealthCheckRequest - (*RunHealthCheckResponse)(nil), // 90: vtadmin.RunHealthCheckResponse - (*SetReadOnlyRequest)(nil), // 91: vtadmin.SetReadOnlyRequest - (*SetReadOnlyResponse)(nil), // 92: vtadmin.SetReadOnlyResponse - (*SetReadWriteRequest)(nil), // 93: vtadmin.SetReadWriteRequest - (*SetReadWriteResponse)(nil), // 94: vtadmin.SetReadWriteResponse - (*StartReplicationRequest)(nil), // 95: vtadmin.StartReplicationRequest - (*StartReplicationResponse)(nil), // 96: vtadmin.StartReplicationResponse - (*StopReplicationRequest)(nil), // 97: vtadmin.StopReplicationRequest - (*StopReplicationResponse)(nil), // 98: vtadmin.StopReplicationResponse - (*TabletExternallyPromotedRequest)(nil), // 99: vtadmin.TabletExternallyPromotedRequest - (*TabletExternallyPromotedResponse)(nil), // 100: vtadmin.TabletExternallyPromotedResponse - (*TabletExternallyReparentedRequest)(nil), // 101: vtadmin.TabletExternallyReparentedRequest - (*ValidateRequest)(nil), // 102: vtadmin.ValidateRequest - (*ValidateKeyspaceRequest)(nil), // 103: vtadmin.ValidateKeyspaceRequest - (*ValidateSchemaKeyspaceRequest)(nil), // 104: vtadmin.ValidateSchemaKeyspaceRequest - (*ValidateShardRequest)(nil), // 105: vtadmin.ValidateShardRequest - (*ValidateVersionKeyspaceRequest)(nil), // 106: vtadmin.ValidateVersionKeyspaceRequest - (*ValidateVersionShardRequest)(nil), // 107: vtadmin.ValidateVersionShardRequest - (*VTExplainRequest)(nil), // 108: vtadmin.VTExplainRequest - (*VTExplainResponse)(nil), // 109: vtadmin.VTExplainResponse - nil, // 110: vtadmin.ClusterCellsAliases.AliasesEntry - nil, // 111: vtadmin.Keyspace.ShardsEntry - nil, // 112: vtadmin.Schema.TableSizesEntry - (*Schema_ShardTableSize)(nil), // 113: vtadmin.Schema.ShardTableSize - (*Schema_TableSize)(nil), // 114: vtadmin.Schema.TableSize - nil, // 115: vtadmin.Schema.TableSize.ByShardEntry - (*GetSchemaMigrationsRequest_ClusterRequest)(nil), // 116: vtadmin.GetSchemaMigrationsRequest.ClusterRequest - nil, // 117: vtadmin.GetSrvKeyspacesResponse.SrvKeyspacesEntry - nil, // 118: vtadmin.GetWorkflowsResponse.WorkflowsByClusterEntry - (*ReloadSchemasResponse_KeyspaceResult)(nil), // 119: vtadmin.ReloadSchemasResponse.KeyspaceResult - (*ReloadSchemasResponse_ShardResult)(nil), // 120: vtadmin.ReloadSchemasResponse.ShardResult - (*ReloadSchemasResponse_TabletResult)(nil), // 121: vtadmin.ReloadSchemasResponse.TabletResult - (*mysqlctl.BackupInfo)(nil), // 122: mysqlctl.BackupInfo - (*topodata.CellInfo)(nil), // 123: topodata.CellInfo - (*vtctldata.ShardReplicationPositionsResponse)(nil), // 124: vtctldata.ShardReplicationPositionsResponse - (*vtctldata.Keyspace)(nil), // 125: vtctldata.Keyspace - (*tabletmanagerdata.TableDefinition)(nil), // 126: tabletmanagerdata.TableDefinition - (*vtctldata.SchemaMigration)(nil), // 127: vtctldata.SchemaMigration - (*vtctldata.Shard)(nil), // 128: vtctldata.Shard - (*vschema.SrvVSchema)(nil), // 129: vschema.SrvVSchema - (*topodata.Tablet)(nil), // 130: topodata.Tablet - (*vschema.Keyspace)(nil), // 131: vschema.Keyspace - (*vtctldata.Workflow)(nil), // 132: vtctldata.Workflow - (*vtctldata.ApplySchemaRequest)(nil), // 133: vtctldata.ApplySchemaRequest - (*vtctldata.CancelSchemaMigrationRequest)(nil), // 134: vtctldata.CancelSchemaMigrationRequest - (*vtctldata.CleanupSchemaMigrationRequest)(nil), // 135: vtctldata.CleanupSchemaMigrationRequest - (*vtctldata.CompleteSchemaMigrationRequest)(nil), // 136: vtctldata.CompleteSchemaMigrationRequest - (*vtctldata.CreateKeyspaceRequest)(nil), // 137: vtctldata.CreateKeyspaceRequest - (*vtctldata.CreateShardRequest)(nil), // 138: vtctldata.CreateShardRequest - (*vtctldata.DeleteKeyspaceRequest)(nil), // 139: vtctldata.DeleteKeyspaceRequest - (*vtctldata.DeleteShardsRequest)(nil), // 140: vtctldata.DeleteShardsRequest - (*topodata.TabletAlias)(nil), // 141: topodata.TabletAlias - (*vtctldata.EmergencyReparentShardRequest)(nil), // 142: vtctldata.EmergencyReparentShardRequest - (*logutil.Event)(nil), // 143: logutil.Event - (*vtctldata.GetBackupsRequest)(nil), // 144: vtctldata.GetBackupsRequest - (*vtctldata.LaunchSchemaMigrationRequest)(nil), // 145: vtctldata.LaunchSchemaMigrationRequest - (*vtctldata.PlannedReparentShardRequest)(nil), // 146: vtctldata.PlannedReparentShardRequest - (*vtctldata.RetrySchemaMigrationRequest)(nil), // 147: vtctldata.RetrySchemaMigrationRequest - (*topodata.CellsAlias)(nil), // 148: topodata.CellsAlias - (*vtctldata.GetSchemaMigrationsRequest)(nil), // 149: vtctldata.GetSchemaMigrationsRequest - (*vtctldata.GetSrvKeyspacesResponse)(nil), // 150: vtctldata.GetSrvKeyspacesResponse - (*vtctldata.ApplySchemaResponse)(nil), // 151: vtctldata.ApplySchemaResponse - (*vtctldata.CancelSchemaMigrationResponse)(nil), // 152: vtctldata.CancelSchemaMigrationResponse - (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 153: vtctldata.CleanupSchemaMigrationResponse - (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 154: vtctldata.CompleteSchemaMigrationResponse - (*vtctldata.CreateShardResponse)(nil), // 155: vtctldata.CreateShardResponse - (*vtctldata.DeleteKeyspaceResponse)(nil), // 156: vtctldata.DeleteKeyspaceResponse - (*vtctldata.DeleteShardsResponse)(nil), // 157: vtctldata.DeleteShardsResponse - (*vtctldata.GetFullStatusResponse)(nil), // 158: vtctldata.GetFullStatusResponse - (*vtctldata.GetTopologyPathResponse)(nil), // 159: vtctldata.GetTopologyPathResponse - (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 160: vtctldata.LaunchSchemaMigrationResponse - (*vtctldata.RetrySchemaMigrationResponse)(nil), // 161: vtctldata.RetrySchemaMigrationResponse - (*vtctldata.ValidateResponse)(nil), // 162: vtctldata.ValidateResponse - (*vtctldata.ValidateKeyspaceResponse)(nil), // 163: vtctldata.ValidateKeyspaceResponse - (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 164: vtctldata.ValidateSchemaKeyspaceResponse - (*vtctldata.ValidateShardResponse)(nil), // 165: vtctldata.ValidateShardResponse - (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 166: vtctldata.ValidateVersionKeyspaceResponse - (*vtctldata.ValidateVersionShardResponse)(nil), // 167: vtctldata.ValidateVersionShardResponse + (*WorkflowDeleteRequest)(nil), // 17: vtadmin.WorkflowDeleteRequest + (*WorkflowSwitchTrafficRequest)(nil), // 18: vtadmin.WorkflowSwitchTrafficRequest + (*ApplySchemaRequest)(nil), // 19: vtadmin.ApplySchemaRequest + (*CancelSchemaMigrationRequest)(nil), // 20: vtadmin.CancelSchemaMigrationRequest + (*CleanupSchemaMigrationRequest)(nil), // 21: vtadmin.CleanupSchemaMigrationRequest + (*CompleteSchemaMigrationRequest)(nil), // 22: vtadmin.CompleteSchemaMigrationRequest + (*ConcludeTransactionRequest)(nil), // 23: vtadmin.ConcludeTransactionRequest + (*CreateKeyspaceRequest)(nil), // 24: vtadmin.CreateKeyspaceRequest + (*CreateKeyspaceResponse)(nil), // 25: vtadmin.CreateKeyspaceResponse + (*CreateShardRequest)(nil), // 26: vtadmin.CreateShardRequest + (*DeleteKeyspaceRequest)(nil), // 27: vtadmin.DeleteKeyspaceRequest + (*DeleteShardsRequest)(nil), // 28: vtadmin.DeleteShardsRequest + (*DeleteTabletRequest)(nil), // 29: vtadmin.DeleteTabletRequest + (*DeleteTabletResponse)(nil), // 30: vtadmin.DeleteTabletResponse + (*EmergencyFailoverShardRequest)(nil), // 31: vtadmin.EmergencyFailoverShardRequest + (*EmergencyFailoverShardResponse)(nil), // 32: vtadmin.EmergencyFailoverShardResponse + (*FindSchemaRequest)(nil), // 33: vtadmin.FindSchemaRequest + (*GetBackupsRequest)(nil), // 34: vtadmin.GetBackupsRequest + (*GetBackupsResponse)(nil), // 35: vtadmin.GetBackupsResponse + (*GetCellInfosRequest)(nil), // 36: vtadmin.GetCellInfosRequest + (*GetCellInfosResponse)(nil), // 37: vtadmin.GetCellInfosResponse + (*GetCellsAliasesRequest)(nil), // 38: vtadmin.GetCellsAliasesRequest + (*GetCellsAliasesResponse)(nil), // 39: vtadmin.GetCellsAliasesResponse + (*GetClustersRequest)(nil), // 40: vtadmin.GetClustersRequest + (*GetClustersResponse)(nil), // 41: vtadmin.GetClustersResponse + (*GetFullStatusRequest)(nil), // 42: vtadmin.GetFullStatusRequest + (*GetGatesRequest)(nil), // 43: vtadmin.GetGatesRequest + (*GetGatesResponse)(nil), // 44: vtadmin.GetGatesResponse + (*GetKeyspaceRequest)(nil), // 45: vtadmin.GetKeyspaceRequest + (*GetKeyspacesRequest)(nil), // 46: vtadmin.GetKeyspacesRequest + (*GetKeyspacesResponse)(nil), // 47: vtadmin.GetKeyspacesResponse + (*GetSchemaRequest)(nil), // 48: vtadmin.GetSchemaRequest + (*GetSchemasRequest)(nil), // 49: vtadmin.GetSchemasRequest + (*GetSchemasResponse)(nil), // 50: vtadmin.GetSchemasResponse + (*GetSchemaMigrationsRequest)(nil), // 51: vtadmin.GetSchemaMigrationsRequest + (*GetSchemaMigrationsResponse)(nil), // 52: vtadmin.GetSchemaMigrationsResponse + (*GetShardReplicationPositionsRequest)(nil), // 53: vtadmin.GetShardReplicationPositionsRequest + (*GetShardReplicationPositionsResponse)(nil), // 54: vtadmin.GetShardReplicationPositionsResponse + (*GetSrvKeyspaceRequest)(nil), // 55: vtadmin.GetSrvKeyspaceRequest + (*GetSrvKeyspacesRequest)(nil), // 56: vtadmin.GetSrvKeyspacesRequest + (*GetSrvKeyspacesResponse)(nil), // 57: vtadmin.GetSrvKeyspacesResponse + (*GetSrvVSchemaRequest)(nil), // 58: vtadmin.GetSrvVSchemaRequest + (*GetSrvVSchemasRequest)(nil), // 59: vtadmin.GetSrvVSchemasRequest + (*GetSrvVSchemasResponse)(nil), // 60: vtadmin.GetSrvVSchemasResponse + (*GetSchemaTableSizeOptions)(nil), // 61: vtadmin.GetSchemaTableSizeOptions + (*GetTabletRequest)(nil), // 62: vtadmin.GetTabletRequest + (*GetTabletsRequest)(nil), // 63: vtadmin.GetTabletsRequest + (*GetTabletsResponse)(nil), // 64: vtadmin.GetTabletsResponse + (*GetTopologyPathRequest)(nil), // 65: vtadmin.GetTopologyPathRequest + (*GetUnresolvedTransactionsRequest)(nil), // 66: vtadmin.GetUnresolvedTransactionsRequest + (*GetVSchemaRequest)(nil), // 67: vtadmin.GetVSchemaRequest + (*GetVSchemasRequest)(nil), // 68: vtadmin.GetVSchemasRequest + (*GetVSchemasResponse)(nil), // 69: vtadmin.GetVSchemasResponse + (*GetVtctldsRequest)(nil), // 70: vtadmin.GetVtctldsRequest + (*GetVtctldsResponse)(nil), // 71: vtadmin.GetVtctldsResponse + (*GetWorkflowRequest)(nil), // 72: vtadmin.GetWorkflowRequest + (*GetWorkflowStatusRequest)(nil), // 73: vtadmin.GetWorkflowStatusRequest + (*StartWorkflowRequest)(nil), // 74: vtadmin.StartWorkflowRequest + (*StopWorkflowRequest)(nil), // 75: vtadmin.StopWorkflowRequest + (*GetWorkflowsRequest)(nil), // 76: vtadmin.GetWorkflowsRequest + (*GetWorkflowsResponse)(nil), // 77: vtadmin.GetWorkflowsResponse + (*LaunchSchemaMigrationRequest)(nil), // 78: vtadmin.LaunchSchemaMigrationRequest + (*MaterializeCreateRequest)(nil), // 79: vtadmin.MaterializeCreateRequest + (*MoveTablesCompleteRequest)(nil), // 80: vtadmin.MoveTablesCompleteRequest + (*MoveTablesCreateRequest)(nil), // 81: vtadmin.MoveTablesCreateRequest + (*PingTabletRequest)(nil), // 82: vtadmin.PingTabletRequest + (*PingTabletResponse)(nil), // 83: vtadmin.PingTabletResponse + (*PlannedFailoverShardRequest)(nil), // 84: vtadmin.PlannedFailoverShardRequest + (*PlannedFailoverShardResponse)(nil), // 85: vtadmin.PlannedFailoverShardResponse + (*RebuildKeyspaceGraphRequest)(nil), // 86: vtadmin.RebuildKeyspaceGraphRequest + (*RebuildKeyspaceGraphResponse)(nil), // 87: vtadmin.RebuildKeyspaceGraphResponse + (*RefreshStateRequest)(nil), // 88: vtadmin.RefreshStateRequest + (*RefreshStateResponse)(nil), // 89: vtadmin.RefreshStateResponse + (*ReloadSchemasRequest)(nil), // 90: vtadmin.ReloadSchemasRequest + (*ReloadSchemasResponse)(nil), // 91: vtadmin.ReloadSchemasResponse + (*ReloadSchemaShardRequest)(nil), // 92: vtadmin.ReloadSchemaShardRequest + (*ReloadSchemaShardResponse)(nil), // 93: vtadmin.ReloadSchemaShardResponse + (*RefreshTabletReplicationSourceRequest)(nil), // 94: vtadmin.RefreshTabletReplicationSourceRequest + (*RefreshTabletReplicationSourceResponse)(nil), // 95: vtadmin.RefreshTabletReplicationSourceResponse + (*RemoveKeyspaceCellRequest)(nil), // 96: vtadmin.RemoveKeyspaceCellRequest + (*RemoveKeyspaceCellResponse)(nil), // 97: vtadmin.RemoveKeyspaceCellResponse + (*RetrySchemaMigrationRequest)(nil), // 98: vtadmin.RetrySchemaMigrationRequest + (*RunHealthCheckRequest)(nil), // 99: vtadmin.RunHealthCheckRequest + (*RunHealthCheckResponse)(nil), // 100: vtadmin.RunHealthCheckResponse + (*ReshardCreateRequest)(nil), // 101: vtadmin.ReshardCreateRequest + (*SetReadOnlyRequest)(nil), // 102: vtadmin.SetReadOnlyRequest + (*SetReadOnlyResponse)(nil), // 103: vtadmin.SetReadOnlyResponse + (*SetReadWriteRequest)(nil), // 104: vtadmin.SetReadWriteRequest + (*SetReadWriteResponse)(nil), // 105: vtadmin.SetReadWriteResponse + (*StartReplicationRequest)(nil), // 106: vtadmin.StartReplicationRequest + (*StartReplicationResponse)(nil), // 107: vtadmin.StartReplicationResponse + (*StopReplicationRequest)(nil), // 108: vtadmin.StopReplicationRequest + (*StopReplicationResponse)(nil), // 109: vtadmin.StopReplicationResponse + (*TabletExternallyPromotedRequest)(nil), // 110: vtadmin.TabletExternallyPromotedRequest + (*TabletExternallyPromotedResponse)(nil), // 111: vtadmin.TabletExternallyPromotedResponse + (*TabletExternallyReparentedRequest)(nil), // 112: vtadmin.TabletExternallyReparentedRequest + (*ValidateRequest)(nil), // 113: vtadmin.ValidateRequest + (*ValidateKeyspaceRequest)(nil), // 114: vtadmin.ValidateKeyspaceRequest + (*ValidateSchemaKeyspaceRequest)(nil), // 115: vtadmin.ValidateSchemaKeyspaceRequest + (*ValidateShardRequest)(nil), // 116: vtadmin.ValidateShardRequest + (*ValidateVersionKeyspaceRequest)(nil), // 117: vtadmin.ValidateVersionKeyspaceRequest + (*ValidateVersionShardRequest)(nil), // 118: vtadmin.ValidateVersionShardRequest + (*VDiffCreateRequest)(nil), // 119: vtadmin.VDiffCreateRequest + (*VDiffShowRequest)(nil), // 120: vtadmin.VDiffShowRequest + (*VDiffProgress)(nil), // 121: vtadmin.VDiffProgress + (*VDiffShardReport)(nil), // 122: vtadmin.VDiffShardReport + (*VDiffShowResponse)(nil), // 123: vtadmin.VDiffShowResponse + (*VTExplainRequest)(nil), // 124: vtadmin.VTExplainRequest + (*VTExplainResponse)(nil), // 125: vtadmin.VTExplainResponse + nil, // 126: vtadmin.ClusterCellsAliases.AliasesEntry + nil, // 127: vtadmin.Keyspace.ShardsEntry + nil, // 128: vtadmin.Schema.TableSizesEntry + (*Schema_ShardTableSize)(nil), // 129: vtadmin.Schema.ShardTableSize + (*Schema_TableSize)(nil), // 130: vtadmin.Schema.TableSize + nil, // 131: vtadmin.Schema.TableSize.ByShardEntry + (*GetSchemaMigrationsRequest_ClusterRequest)(nil), // 132: vtadmin.GetSchemaMigrationsRequest.ClusterRequest + nil, // 133: vtadmin.GetSrvKeyspacesResponse.SrvKeyspacesEntry + nil, // 134: vtadmin.GetWorkflowsResponse.WorkflowsByClusterEntry + (*ReloadSchemasResponse_KeyspaceResult)(nil), // 135: vtadmin.ReloadSchemasResponse.KeyspaceResult + (*ReloadSchemasResponse_ShardResult)(nil), // 136: vtadmin.ReloadSchemasResponse.ShardResult + (*ReloadSchemasResponse_TabletResult)(nil), // 137: vtadmin.ReloadSchemasResponse.TabletResult + nil, // 138: vtadmin.VDiffShowResponse.ShardReportEntry + (*mysqlctl.BackupInfo)(nil), // 139: mysqlctl.BackupInfo + (*topodata.CellInfo)(nil), // 140: topodata.CellInfo + (*vtctldata.ShardReplicationPositionsResponse)(nil), // 141: vtctldata.ShardReplicationPositionsResponse + (*vtctldata.Keyspace)(nil), // 142: vtctldata.Keyspace + (*tabletmanagerdata.TableDefinition)(nil), // 143: tabletmanagerdata.TableDefinition + (*vtctldata.SchemaMigration)(nil), // 144: vtctldata.SchemaMigration + (*vtctldata.Shard)(nil), // 145: vtctldata.Shard + (*vschema.SrvVSchema)(nil), // 146: vschema.SrvVSchema + (*topodata.Tablet)(nil), // 147: topodata.Tablet + (*vschema.Keyspace)(nil), // 148: vschema.Keyspace + (*vtctldata.Workflow)(nil), // 149: vtctldata.Workflow + (*vtctldata.WorkflowDeleteRequest)(nil), // 150: vtctldata.WorkflowDeleteRequest + (*vtctldata.WorkflowSwitchTrafficRequest)(nil), // 151: vtctldata.WorkflowSwitchTrafficRequest + (*vtctldata.ApplySchemaRequest)(nil), // 152: vtctldata.ApplySchemaRequest + (*vtctldata.CancelSchemaMigrationRequest)(nil), // 153: vtctldata.CancelSchemaMigrationRequest + (*vtctldata.CleanupSchemaMigrationRequest)(nil), // 154: vtctldata.CleanupSchemaMigrationRequest + (*vtctldata.CompleteSchemaMigrationRequest)(nil), // 155: vtctldata.CompleteSchemaMigrationRequest + (*vtctldata.CreateKeyspaceRequest)(nil), // 156: vtctldata.CreateKeyspaceRequest + (*vtctldata.CreateShardRequest)(nil), // 157: vtctldata.CreateShardRequest + (*vtctldata.DeleteKeyspaceRequest)(nil), // 158: vtctldata.DeleteKeyspaceRequest + (*vtctldata.DeleteShardsRequest)(nil), // 159: vtctldata.DeleteShardsRequest + (*topodata.TabletAlias)(nil), // 160: topodata.TabletAlias + (*vtctldata.EmergencyReparentShardRequest)(nil), // 161: vtctldata.EmergencyReparentShardRequest + (*logutil.Event)(nil), // 162: logutil.Event + (*vtctldata.GetBackupsRequest)(nil), // 163: vtctldata.GetBackupsRequest + (*vtctldata.LaunchSchemaMigrationRequest)(nil), // 164: vtctldata.LaunchSchemaMigrationRequest + (*vtctldata.MaterializeCreateRequest)(nil), // 165: vtctldata.MaterializeCreateRequest + (*vtctldata.MoveTablesCompleteRequest)(nil), // 166: vtctldata.MoveTablesCompleteRequest + (*vtctldata.MoveTablesCreateRequest)(nil), // 167: vtctldata.MoveTablesCreateRequest + (*vtctldata.PlannedReparentShardRequest)(nil), // 168: vtctldata.PlannedReparentShardRequest + (*vtctldata.RetrySchemaMigrationRequest)(nil), // 169: vtctldata.RetrySchemaMigrationRequest + (*vtctldata.ReshardCreateRequest)(nil), // 170: vtctldata.ReshardCreateRequest + (*vtctldata.VDiffCreateRequest)(nil), // 171: vtctldata.VDiffCreateRequest + (*vtctldata.VDiffShowRequest)(nil), // 172: vtctldata.VDiffShowRequest + (*topodata.CellsAlias)(nil), // 173: topodata.CellsAlias + (*vtctldata.GetSchemaMigrationsRequest)(nil), // 174: vtctldata.GetSchemaMigrationsRequest + (*vtctldata.GetSrvKeyspacesResponse)(nil), // 175: vtctldata.GetSrvKeyspacesResponse + (*vtctldata.ApplySchemaResponse)(nil), // 176: vtctldata.ApplySchemaResponse + (*vtctldata.CancelSchemaMigrationResponse)(nil), // 177: vtctldata.CancelSchemaMigrationResponse + (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 178: vtctldata.CleanupSchemaMigrationResponse + (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 179: vtctldata.CompleteSchemaMigrationResponse + (*vtctldata.ConcludeTransactionResponse)(nil), // 180: vtctldata.ConcludeTransactionResponse + (*vtctldata.CreateShardResponse)(nil), // 181: vtctldata.CreateShardResponse + (*vtctldata.DeleteKeyspaceResponse)(nil), // 182: vtctldata.DeleteKeyspaceResponse + (*vtctldata.DeleteShardsResponse)(nil), // 183: vtctldata.DeleteShardsResponse + (*vtctldata.GetFullStatusResponse)(nil), // 184: vtctldata.GetFullStatusResponse + (*vtctldata.GetTopologyPathResponse)(nil), // 185: vtctldata.GetTopologyPathResponse + (*vtctldata.GetUnresolvedTransactionsResponse)(nil), // 186: vtctldata.GetUnresolvedTransactionsResponse + (*vtctldata.WorkflowStatusResponse)(nil), // 187: vtctldata.WorkflowStatusResponse + (*vtctldata.WorkflowUpdateResponse)(nil), // 188: vtctldata.WorkflowUpdateResponse + (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 189: vtctldata.LaunchSchemaMigrationResponse + (*vtctldata.MoveTablesCompleteResponse)(nil), // 190: vtctldata.MoveTablesCompleteResponse + (*vtctldata.MaterializeCreateResponse)(nil), // 191: vtctldata.MaterializeCreateResponse + (*vtctldata.RetrySchemaMigrationResponse)(nil), // 192: vtctldata.RetrySchemaMigrationResponse + (*vtctldata.ValidateResponse)(nil), // 193: vtctldata.ValidateResponse + (*vtctldata.ValidateKeyspaceResponse)(nil), // 194: vtctldata.ValidateKeyspaceResponse + (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 195: vtctldata.ValidateSchemaKeyspaceResponse + (*vtctldata.ValidateShardResponse)(nil), // 196: vtctldata.ValidateShardResponse + (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 197: vtctldata.ValidateVersionKeyspaceResponse + (*vtctldata.ValidateVersionShardResponse)(nil), // 198: vtctldata.ValidateVersionShardResponse + (*vtctldata.VDiffCreateResponse)(nil), // 199: vtctldata.VDiffCreateResponse + (*vtctldata.WorkflowDeleteResponse)(nil), // 200: vtctldata.WorkflowDeleteResponse + (*vtctldata.WorkflowSwitchTrafficResponse)(nil), // 201: vtctldata.WorkflowSwitchTrafficResponse } var file_vtadmin_proto_depIdxs = []int32{ 1, // 0: vtadmin.ClusterBackup.cluster:type_name -> vtadmin.Cluster - 122, // 1: vtadmin.ClusterBackup.backup:type_name -> mysqlctl.BackupInfo + 139, // 1: vtadmin.ClusterBackup.backup:type_name -> mysqlctl.BackupInfo 1, // 2: vtadmin.ClusterCellsAliases.cluster:type_name -> vtadmin.Cluster - 110, // 3: vtadmin.ClusterCellsAliases.aliases:type_name -> vtadmin.ClusterCellsAliases.AliasesEntry + 126, // 3: vtadmin.ClusterCellsAliases.aliases:type_name -> vtadmin.ClusterCellsAliases.AliasesEntry 1, // 4: vtadmin.ClusterCellInfo.cluster:type_name -> vtadmin.Cluster - 123, // 5: vtadmin.ClusterCellInfo.cell_info:type_name -> topodata.CellInfo + 140, // 5: vtadmin.ClusterCellInfo.cell_info:type_name -> topodata.CellInfo 1, // 6: vtadmin.ClusterShardReplicationPosition.cluster:type_name -> vtadmin.Cluster - 124, // 7: vtadmin.ClusterShardReplicationPosition.position_info:type_name -> vtctldata.ShardReplicationPositionsResponse + 141, // 7: vtadmin.ClusterShardReplicationPosition.position_info:type_name -> vtctldata.ShardReplicationPositionsResponse 16, // 8: vtadmin.ClusterWorkflows.workflows:type_name -> vtadmin.Workflow 1, // 9: vtadmin.Keyspace.cluster:type_name -> vtadmin.Cluster - 125, // 10: vtadmin.Keyspace.keyspace:type_name -> vtctldata.Keyspace - 111, // 11: vtadmin.Keyspace.shards:type_name -> vtadmin.Keyspace.ShardsEntry + 142, // 10: vtadmin.Keyspace.keyspace:type_name -> vtctldata.Keyspace + 127, // 11: vtadmin.Keyspace.shards:type_name -> vtadmin.Keyspace.ShardsEntry 1, // 12: vtadmin.Schema.cluster:type_name -> vtadmin.Cluster - 126, // 13: vtadmin.Schema.table_definitions:type_name -> tabletmanagerdata.TableDefinition - 112, // 14: vtadmin.Schema.table_sizes:type_name -> vtadmin.Schema.TableSizesEntry + 143, // 13: vtadmin.Schema.table_definitions:type_name -> tabletmanagerdata.TableDefinition + 128, // 14: vtadmin.Schema.table_sizes:type_name -> vtadmin.Schema.TableSizesEntry 1, // 15: vtadmin.SchemaMigration.cluster:type_name -> vtadmin.Cluster - 127, // 16: vtadmin.SchemaMigration.schema_migration:type_name -> vtctldata.SchemaMigration + 144, // 16: vtadmin.SchemaMigration.schema_migration:type_name -> vtctldata.SchemaMigration 1, // 17: vtadmin.Shard.cluster:type_name -> vtadmin.Cluster - 128, // 18: vtadmin.Shard.shard:type_name -> vtctldata.Shard + 145, // 18: vtadmin.Shard.shard:type_name -> vtctldata.Shard 1, // 19: vtadmin.SrvVSchema.cluster:type_name -> vtadmin.Cluster - 129, // 20: vtadmin.SrvVSchema.srv_v_schema:type_name -> vschema.SrvVSchema + 146, // 20: vtadmin.SrvVSchema.srv_v_schema:type_name -> vschema.SrvVSchema 1, // 21: vtadmin.Tablet.cluster:type_name -> vtadmin.Cluster - 130, // 22: vtadmin.Tablet.tablet:type_name -> topodata.Tablet + 147, // 22: vtadmin.Tablet.tablet:type_name -> topodata.Tablet 0, // 23: vtadmin.Tablet.state:type_name -> vtadmin.Tablet.ServingState 1, // 24: vtadmin.VSchema.cluster:type_name -> vtadmin.Cluster - 131, // 25: vtadmin.VSchema.v_schema:type_name -> vschema.Keyspace + 148, // 25: vtadmin.VSchema.v_schema:type_name -> vschema.Keyspace 1, // 26: vtadmin.Vtctld.cluster:type_name -> vtadmin.Cluster 1, // 27: vtadmin.VTGate.cluster:type_name -> vtadmin.Cluster 1, // 28: vtadmin.Workflow.cluster:type_name -> vtadmin.Cluster - 132, // 29: vtadmin.Workflow.workflow:type_name -> vtctldata.Workflow - 133, // 30: vtadmin.ApplySchemaRequest.request:type_name -> vtctldata.ApplySchemaRequest - 134, // 31: vtadmin.CancelSchemaMigrationRequest.request:type_name -> vtctldata.CancelSchemaMigrationRequest - 135, // 32: vtadmin.CleanupSchemaMigrationRequest.request:type_name -> vtctldata.CleanupSchemaMigrationRequest - 136, // 33: vtadmin.CompleteSchemaMigrationRequest.request:type_name -> vtctldata.CompleteSchemaMigrationRequest - 137, // 34: vtadmin.CreateKeyspaceRequest.options:type_name -> vtctldata.CreateKeyspaceRequest - 7, // 35: vtadmin.CreateKeyspaceResponse.keyspace:type_name -> vtadmin.Keyspace - 138, // 36: vtadmin.CreateShardRequest.options:type_name -> vtctldata.CreateShardRequest - 139, // 37: vtadmin.DeleteKeyspaceRequest.options:type_name -> vtctldata.DeleteKeyspaceRequest - 140, // 38: vtadmin.DeleteShardsRequest.options:type_name -> vtctldata.DeleteShardsRequest - 141, // 39: vtadmin.DeleteTabletRequest.alias:type_name -> topodata.TabletAlias - 1, // 40: vtadmin.DeleteTabletResponse.cluster:type_name -> vtadmin.Cluster - 142, // 41: vtadmin.EmergencyFailoverShardRequest.options:type_name -> vtctldata.EmergencyReparentShardRequest - 1, // 42: vtadmin.EmergencyFailoverShardResponse.cluster:type_name -> vtadmin.Cluster - 141, // 43: vtadmin.EmergencyFailoverShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 143, // 44: vtadmin.EmergencyFailoverShardResponse.events:type_name -> logutil.Event - 58, // 45: vtadmin.FindSchemaRequest.table_size_options:type_name -> vtadmin.GetSchemaTableSizeOptions - 144, // 46: vtadmin.GetBackupsRequest.request_options:type_name -> vtctldata.GetBackupsRequest - 2, // 47: vtadmin.GetBackupsResponse.backups:type_name -> vtadmin.ClusterBackup - 4, // 48: vtadmin.GetCellInfosResponse.cell_infos:type_name -> vtadmin.ClusterCellInfo - 3, // 49: vtadmin.GetCellsAliasesResponse.aliases:type_name -> vtadmin.ClusterCellsAliases - 1, // 50: vtadmin.GetClustersResponse.clusters:type_name -> vtadmin.Cluster - 141, // 51: vtadmin.GetFullStatusRequest.alias:type_name -> topodata.TabletAlias - 15, // 52: vtadmin.GetGatesResponse.gates:type_name -> vtadmin.VTGate - 7, // 53: vtadmin.GetKeyspacesResponse.keyspaces:type_name -> vtadmin.Keyspace - 58, // 54: vtadmin.GetSchemaRequest.table_size_options:type_name -> vtadmin.GetSchemaTableSizeOptions - 58, // 55: vtadmin.GetSchemasRequest.table_size_options:type_name -> vtadmin.GetSchemaTableSizeOptions - 8, // 56: vtadmin.GetSchemasResponse.schemas:type_name -> vtadmin.Schema - 116, // 57: vtadmin.GetSchemaMigrationsRequest.cluster_requests:type_name -> vtadmin.GetSchemaMigrationsRequest.ClusterRequest - 9, // 58: vtadmin.GetSchemaMigrationsResponse.schema_migrations:type_name -> vtadmin.SchemaMigration - 5, // 59: vtadmin.GetShardReplicationPositionsResponse.replication_positions:type_name -> vtadmin.ClusterShardReplicationPosition - 117, // 60: vtadmin.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtadmin.GetSrvKeyspacesResponse.SrvKeyspacesEntry - 11, // 61: vtadmin.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtadmin.SrvVSchema - 141, // 62: vtadmin.GetTabletRequest.alias:type_name -> topodata.TabletAlias - 12, // 63: vtadmin.GetTabletsResponse.tablets:type_name -> vtadmin.Tablet - 13, // 64: vtadmin.GetVSchemasResponse.v_schemas:type_name -> vtadmin.VSchema - 14, // 65: vtadmin.GetVtctldsResponse.vtctlds:type_name -> vtadmin.Vtctld - 118, // 66: vtadmin.GetWorkflowsResponse.workflows_by_cluster:type_name -> vtadmin.GetWorkflowsResponse.WorkflowsByClusterEntry - 145, // 67: vtadmin.LaunchSchemaMigrationRequest.request:type_name -> vtctldata.LaunchSchemaMigrationRequest - 141, // 68: vtadmin.PingTabletRequest.alias:type_name -> topodata.TabletAlias - 1, // 69: vtadmin.PingTabletResponse.cluster:type_name -> vtadmin.Cluster - 146, // 70: vtadmin.PlannedFailoverShardRequest.options:type_name -> vtctldata.PlannedReparentShardRequest - 1, // 71: vtadmin.PlannedFailoverShardResponse.cluster:type_name -> vtadmin.Cluster - 141, // 72: vtadmin.PlannedFailoverShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 143, // 73: vtadmin.PlannedFailoverShardResponse.events:type_name -> logutil.Event - 141, // 74: vtadmin.RefreshStateRequest.alias:type_name -> topodata.TabletAlias - 1, // 75: vtadmin.RefreshStateResponse.cluster:type_name -> vtadmin.Cluster - 141, // 76: vtadmin.ReloadSchemasRequest.tablets:type_name -> topodata.TabletAlias - 119, // 77: vtadmin.ReloadSchemasResponse.keyspace_results:type_name -> vtadmin.ReloadSchemasResponse.KeyspaceResult - 120, // 78: vtadmin.ReloadSchemasResponse.shard_results:type_name -> vtadmin.ReloadSchemasResponse.ShardResult - 121, // 79: vtadmin.ReloadSchemasResponse.tablet_results:type_name -> vtadmin.ReloadSchemasResponse.TabletResult - 143, // 80: vtadmin.ReloadSchemaShardResponse.events:type_name -> logutil.Event - 141, // 81: vtadmin.RefreshTabletReplicationSourceRequest.alias:type_name -> topodata.TabletAlias - 141, // 82: vtadmin.RefreshTabletReplicationSourceResponse.primary:type_name -> topodata.TabletAlias - 1, // 83: vtadmin.RefreshTabletReplicationSourceResponse.cluster:type_name -> vtadmin.Cluster - 147, // 84: vtadmin.RetrySchemaMigrationRequest.request:type_name -> vtctldata.RetrySchemaMigrationRequest - 141, // 85: vtadmin.RunHealthCheckRequest.alias:type_name -> topodata.TabletAlias - 1, // 86: vtadmin.RunHealthCheckResponse.cluster:type_name -> vtadmin.Cluster - 141, // 87: vtadmin.SetReadOnlyRequest.alias:type_name -> topodata.TabletAlias - 141, // 88: vtadmin.SetReadWriteRequest.alias:type_name -> topodata.TabletAlias - 141, // 89: vtadmin.StartReplicationRequest.alias:type_name -> topodata.TabletAlias - 1, // 90: vtadmin.StartReplicationResponse.cluster:type_name -> vtadmin.Cluster - 141, // 91: vtadmin.StopReplicationRequest.alias:type_name -> topodata.TabletAlias - 1, // 92: vtadmin.StopReplicationResponse.cluster:type_name -> vtadmin.Cluster - 141, // 93: vtadmin.TabletExternallyPromotedRequest.alias:type_name -> topodata.TabletAlias - 1, // 94: vtadmin.TabletExternallyPromotedResponse.cluster:type_name -> vtadmin.Cluster - 141, // 95: vtadmin.TabletExternallyPromotedResponse.new_primary:type_name -> topodata.TabletAlias - 141, // 96: vtadmin.TabletExternallyPromotedResponse.old_primary:type_name -> topodata.TabletAlias - 141, // 97: vtadmin.TabletExternallyReparentedRequest.alias:type_name -> topodata.TabletAlias - 148, // 98: vtadmin.ClusterCellsAliases.AliasesEntry.value:type_name -> topodata.CellsAlias - 128, // 99: vtadmin.Keyspace.ShardsEntry.value:type_name -> vtctldata.Shard - 114, // 100: vtadmin.Schema.TableSizesEntry.value:type_name -> vtadmin.Schema.TableSize - 115, // 101: vtadmin.Schema.TableSize.by_shard:type_name -> vtadmin.Schema.TableSize.ByShardEntry - 113, // 102: vtadmin.Schema.TableSize.ByShardEntry.value:type_name -> vtadmin.Schema.ShardTableSize - 149, // 103: vtadmin.GetSchemaMigrationsRequest.ClusterRequest.request:type_name -> vtctldata.GetSchemaMigrationsRequest - 150, // 104: vtadmin.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> vtctldata.GetSrvKeyspacesResponse - 6, // 105: vtadmin.GetWorkflowsResponse.WorkflowsByClusterEntry.value:type_name -> vtadmin.ClusterWorkflows - 7, // 106: vtadmin.ReloadSchemasResponse.KeyspaceResult.keyspace:type_name -> vtadmin.Keyspace - 143, // 107: vtadmin.ReloadSchemasResponse.KeyspaceResult.events:type_name -> logutil.Event - 10, // 108: vtadmin.ReloadSchemasResponse.ShardResult.shard:type_name -> vtadmin.Shard - 143, // 109: vtadmin.ReloadSchemasResponse.ShardResult.events:type_name -> logutil.Event - 12, // 110: vtadmin.ReloadSchemasResponse.TabletResult.tablet:type_name -> vtadmin.Tablet - 17, // 111: vtadmin.VTAdmin.ApplySchema:input_type -> vtadmin.ApplySchemaRequest - 18, // 112: vtadmin.VTAdmin.CancelSchemaMigration:input_type -> vtadmin.CancelSchemaMigrationRequest - 19, // 113: vtadmin.VTAdmin.CleanupSchemaMigration:input_type -> vtadmin.CleanupSchemaMigrationRequest - 20, // 114: vtadmin.VTAdmin.CompleteSchemaMigration:input_type -> vtadmin.CompleteSchemaMigrationRequest - 21, // 115: vtadmin.VTAdmin.CreateKeyspace:input_type -> vtadmin.CreateKeyspaceRequest - 23, // 116: vtadmin.VTAdmin.CreateShard:input_type -> vtadmin.CreateShardRequest - 24, // 117: vtadmin.VTAdmin.DeleteKeyspace:input_type -> vtadmin.DeleteKeyspaceRequest - 25, // 118: vtadmin.VTAdmin.DeleteShards:input_type -> vtadmin.DeleteShardsRequest - 26, // 119: vtadmin.VTAdmin.DeleteTablet:input_type -> vtadmin.DeleteTabletRequest - 28, // 120: vtadmin.VTAdmin.EmergencyFailoverShard:input_type -> vtadmin.EmergencyFailoverShardRequest - 30, // 121: vtadmin.VTAdmin.FindSchema:input_type -> vtadmin.FindSchemaRequest - 31, // 122: vtadmin.VTAdmin.GetBackups:input_type -> vtadmin.GetBackupsRequest - 33, // 123: vtadmin.VTAdmin.GetCellInfos:input_type -> vtadmin.GetCellInfosRequest - 35, // 124: vtadmin.VTAdmin.GetCellsAliases:input_type -> vtadmin.GetCellsAliasesRequest - 37, // 125: vtadmin.VTAdmin.GetClusters:input_type -> vtadmin.GetClustersRequest - 39, // 126: vtadmin.VTAdmin.GetFullStatus:input_type -> vtadmin.GetFullStatusRequest - 40, // 127: vtadmin.VTAdmin.GetGates:input_type -> vtadmin.GetGatesRequest - 42, // 128: vtadmin.VTAdmin.GetKeyspace:input_type -> vtadmin.GetKeyspaceRequest - 43, // 129: vtadmin.VTAdmin.GetKeyspaces:input_type -> vtadmin.GetKeyspacesRequest - 45, // 130: vtadmin.VTAdmin.GetSchema:input_type -> vtadmin.GetSchemaRequest - 46, // 131: vtadmin.VTAdmin.GetSchemas:input_type -> vtadmin.GetSchemasRequest - 48, // 132: vtadmin.VTAdmin.GetSchemaMigrations:input_type -> vtadmin.GetSchemaMigrationsRequest - 50, // 133: vtadmin.VTAdmin.GetShardReplicationPositions:input_type -> vtadmin.GetShardReplicationPositionsRequest - 52, // 134: vtadmin.VTAdmin.GetSrvKeyspace:input_type -> vtadmin.GetSrvKeyspaceRequest - 53, // 135: vtadmin.VTAdmin.GetSrvKeyspaces:input_type -> vtadmin.GetSrvKeyspacesRequest - 55, // 136: vtadmin.VTAdmin.GetSrvVSchema:input_type -> vtadmin.GetSrvVSchemaRequest - 56, // 137: vtadmin.VTAdmin.GetSrvVSchemas:input_type -> vtadmin.GetSrvVSchemasRequest - 59, // 138: vtadmin.VTAdmin.GetTablet:input_type -> vtadmin.GetTabletRequest - 60, // 139: vtadmin.VTAdmin.GetTablets:input_type -> vtadmin.GetTabletsRequest - 62, // 140: vtadmin.VTAdmin.GetTopologyPath:input_type -> vtadmin.GetTopologyPathRequest - 63, // 141: vtadmin.VTAdmin.GetVSchema:input_type -> vtadmin.GetVSchemaRequest - 64, // 142: vtadmin.VTAdmin.GetVSchemas:input_type -> vtadmin.GetVSchemasRequest - 66, // 143: vtadmin.VTAdmin.GetVtctlds:input_type -> vtadmin.GetVtctldsRequest - 68, // 144: vtadmin.VTAdmin.GetWorkflow:input_type -> vtadmin.GetWorkflowRequest - 69, // 145: vtadmin.VTAdmin.GetWorkflows:input_type -> vtadmin.GetWorkflowsRequest - 71, // 146: vtadmin.VTAdmin.LaunchSchemaMigration:input_type -> vtadmin.LaunchSchemaMigrationRequest - 72, // 147: vtadmin.VTAdmin.PingTablet:input_type -> vtadmin.PingTabletRequest - 74, // 148: vtadmin.VTAdmin.PlannedFailoverShard:input_type -> vtadmin.PlannedFailoverShardRequest - 76, // 149: vtadmin.VTAdmin.RebuildKeyspaceGraph:input_type -> vtadmin.RebuildKeyspaceGraphRequest - 78, // 150: vtadmin.VTAdmin.RefreshState:input_type -> vtadmin.RefreshStateRequest - 84, // 151: vtadmin.VTAdmin.RefreshTabletReplicationSource:input_type -> vtadmin.RefreshTabletReplicationSourceRequest - 80, // 152: vtadmin.VTAdmin.ReloadSchemas:input_type -> vtadmin.ReloadSchemasRequest - 82, // 153: vtadmin.VTAdmin.ReloadSchemaShard:input_type -> vtadmin.ReloadSchemaShardRequest - 86, // 154: vtadmin.VTAdmin.RemoveKeyspaceCell:input_type -> vtadmin.RemoveKeyspaceCellRequest - 88, // 155: vtadmin.VTAdmin.RetrySchemaMigration:input_type -> vtadmin.RetrySchemaMigrationRequest - 89, // 156: vtadmin.VTAdmin.RunHealthCheck:input_type -> vtadmin.RunHealthCheckRequest - 91, // 157: vtadmin.VTAdmin.SetReadOnly:input_type -> vtadmin.SetReadOnlyRequest - 93, // 158: vtadmin.VTAdmin.SetReadWrite:input_type -> vtadmin.SetReadWriteRequest - 95, // 159: vtadmin.VTAdmin.StartReplication:input_type -> vtadmin.StartReplicationRequest - 97, // 160: vtadmin.VTAdmin.StopReplication:input_type -> vtadmin.StopReplicationRequest - 99, // 161: vtadmin.VTAdmin.TabletExternallyPromoted:input_type -> vtadmin.TabletExternallyPromotedRequest - 102, // 162: vtadmin.VTAdmin.Validate:input_type -> vtadmin.ValidateRequest - 103, // 163: vtadmin.VTAdmin.ValidateKeyspace:input_type -> vtadmin.ValidateKeyspaceRequest - 104, // 164: vtadmin.VTAdmin.ValidateSchemaKeyspace:input_type -> vtadmin.ValidateSchemaKeyspaceRequest - 105, // 165: vtadmin.VTAdmin.ValidateShard:input_type -> vtadmin.ValidateShardRequest - 106, // 166: vtadmin.VTAdmin.ValidateVersionKeyspace:input_type -> vtadmin.ValidateVersionKeyspaceRequest - 107, // 167: vtadmin.VTAdmin.ValidateVersionShard:input_type -> vtadmin.ValidateVersionShardRequest - 108, // 168: vtadmin.VTAdmin.VTExplain:input_type -> vtadmin.VTExplainRequest - 151, // 169: vtadmin.VTAdmin.ApplySchema:output_type -> vtctldata.ApplySchemaResponse - 152, // 170: vtadmin.VTAdmin.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse - 153, // 171: vtadmin.VTAdmin.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse - 154, // 172: vtadmin.VTAdmin.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse - 22, // 173: vtadmin.VTAdmin.CreateKeyspace:output_type -> vtadmin.CreateKeyspaceResponse - 155, // 174: vtadmin.VTAdmin.CreateShard:output_type -> vtctldata.CreateShardResponse - 156, // 175: vtadmin.VTAdmin.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse - 157, // 176: vtadmin.VTAdmin.DeleteShards:output_type -> vtctldata.DeleteShardsResponse - 27, // 177: vtadmin.VTAdmin.DeleteTablet:output_type -> vtadmin.DeleteTabletResponse - 29, // 178: vtadmin.VTAdmin.EmergencyFailoverShard:output_type -> vtadmin.EmergencyFailoverShardResponse - 8, // 179: vtadmin.VTAdmin.FindSchema:output_type -> vtadmin.Schema - 32, // 180: vtadmin.VTAdmin.GetBackups:output_type -> vtadmin.GetBackupsResponse - 34, // 181: vtadmin.VTAdmin.GetCellInfos:output_type -> vtadmin.GetCellInfosResponse - 36, // 182: vtadmin.VTAdmin.GetCellsAliases:output_type -> vtadmin.GetCellsAliasesResponse - 38, // 183: vtadmin.VTAdmin.GetClusters:output_type -> vtadmin.GetClustersResponse - 158, // 184: vtadmin.VTAdmin.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse - 41, // 185: vtadmin.VTAdmin.GetGates:output_type -> vtadmin.GetGatesResponse - 7, // 186: vtadmin.VTAdmin.GetKeyspace:output_type -> vtadmin.Keyspace - 44, // 187: vtadmin.VTAdmin.GetKeyspaces:output_type -> vtadmin.GetKeyspacesResponse - 8, // 188: vtadmin.VTAdmin.GetSchema:output_type -> vtadmin.Schema - 47, // 189: vtadmin.VTAdmin.GetSchemas:output_type -> vtadmin.GetSchemasResponse - 49, // 190: vtadmin.VTAdmin.GetSchemaMigrations:output_type -> vtadmin.GetSchemaMigrationsResponse - 51, // 191: vtadmin.VTAdmin.GetShardReplicationPositions:output_type -> vtadmin.GetShardReplicationPositionsResponse - 150, // 192: vtadmin.VTAdmin.GetSrvKeyspace:output_type -> vtctldata.GetSrvKeyspacesResponse - 54, // 193: vtadmin.VTAdmin.GetSrvKeyspaces:output_type -> vtadmin.GetSrvKeyspacesResponse - 11, // 194: vtadmin.VTAdmin.GetSrvVSchema:output_type -> vtadmin.SrvVSchema - 57, // 195: vtadmin.VTAdmin.GetSrvVSchemas:output_type -> vtadmin.GetSrvVSchemasResponse - 12, // 196: vtadmin.VTAdmin.GetTablet:output_type -> vtadmin.Tablet - 61, // 197: vtadmin.VTAdmin.GetTablets:output_type -> vtadmin.GetTabletsResponse - 159, // 198: vtadmin.VTAdmin.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse - 13, // 199: vtadmin.VTAdmin.GetVSchema:output_type -> vtadmin.VSchema - 65, // 200: vtadmin.VTAdmin.GetVSchemas:output_type -> vtadmin.GetVSchemasResponse - 67, // 201: vtadmin.VTAdmin.GetVtctlds:output_type -> vtadmin.GetVtctldsResponse - 16, // 202: vtadmin.VTAdmin.GetWorkflow:output_type -> vtadmin.Workflow - 70, // 203: vtadmin.VTAdmin.GetWorkflows:output_type -> vtadmin.GetWorkflowsResponse - 160, // 204: vtadmin.VTAdmin.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse - 73, // 205: vtadmin.VTAdmin.PingTablet:output_type -> vtadmin.PingTabletResponse - 75, // 206: vtadmin.VTAdmin.PlannedFailoverShard:output_type -> vtadmin.PlannedFailoverShardResponse - 77, // 207: vtadmin.VTAdmin.RebuildKeyspaceGraph:output_type -> vtadmin.RebuildKeyspaceGraphResponse - 79, // 208: vtadmin.VTAdmin.RefreshState:output_type -> vtadmin.RefreshStateResponse - 85, // 209: vtadmin.VTAdmin.RefreshTabletReplicationSource:output_type -> vtadmin.RefreshTabletReplicationSourceResponse - 81, // 210: vtadmin.VTAdmin.ReloadSchemas:output_type -> vtadmin.ReloadSchemasResponse - 83, // 211: vtadmin.VTAdmin.ReloadSchemaShard:output_type -> vtadmin.ReloadSchemaShardResponse - 87, // 212: vtadmin.VTAdmin.RemoveKeyspaceCell:output_type -> vtadmin.RemoveKeyspaceCellResponse - 161, // 213: vtadmin.VTAdmin.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse - 90, // 214: vtadmin.VTAdmin.RunHealthCheck:output_type -> vtadmin.RunHealthCheckResponse - 92, // 215: vtadmin.VTAdmin.SetReadOnly:output_type -> vtadmin.SetReadOnlyResponse - 94, // 216: vtadmin.VTAdmin.SetReadWrite:output_type -> vtadmin.SetReadWriteResponse - 96, // 217: vtadmin.VTAdmin.StartReplication:output_type -> vtadmin.StartReplicationResponse - 98, // 218: vtadmin.VTAdmin.StopReplication:output_type -> vtadmin.StopReplicationResponse - 100, // 219: vtadmin.VTAdmin.TabletExternallyPromoted:output_type -> vtadmin.TabletExternallyPromotedResponse - 162, // 220: vtadmin.VTAdmin.Validate:output_type -> vtctldata.ValidateResponse - 163, // 221: vtadmin.VTAdmin.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse - 164, // 222: vtadmin.VTAdmin.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse - 165, // 223: vtadmin.VTAdmin.ValidateShard:output_type -> vtctldata.ValidateShardResponse - 166, // 224: vtadmin.VTAdmin.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse - 167, // 225: vtadmin.VTAdmin.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse - 109, // 226: vtadmin.VTAdmin.VTExplain:output_type -> vtadmin.VTExplainResponse - 169, // [169:227] is the sub-list for method output_type - 111, // [111:169] is the sub-list for method input_type - 111, // [111:111] is the sub-list for extension type_name - 111, // [111:111] is the sub-list for extension extendee - 0, // [0:111] is the sub-list for field type_name + 149, // 29: vtadmin.Workflow.workflow:type_name -> vtctldata.Workflow + 150, // 30: vtadmin.WorkflowDeleteRequest.request:type_name -> vtctldata.WorkflowDeleteRequest + 151, // 31: vtadmin.WorkflowSwitchTrafficRequest.request:type_name -> vtctldata.WorkflowSwitchTrafficRequest + 152, // 32: vtadmin.ApplySchemaRequest.request:type_name -> vtctldata.ApplySchemaRequest + 153, // 33: vtadmin.CancelSchemaMigrationRequest.request:type_name -> vtctldata.CancelSchemaMigrationRequest + 154, // 34: vtadmin.CleanupSchemaMigrationRequest.request:type_name -> vtctldata.CleanupSchemaMigrationRequest + 155, // 35: vtadmin.CompleteSchemaMigrationRequest.request:type_name -> vtctldata.CompleteSchemaMigrationRequest + 156, // 36: vtadmin.CreateKeyspaceRequest.options:type_name -> vtctldata.CreateKeyspaceRequest + 7, // 37: vtadmin.CreateKeyspaceResponse.keyspace:type_name -> vtadmin.Keyspace + 157, // 38: vtadmin.CreateShardRequest.options:type_name -> vtctldata.CreateShardRequest + 158, // 39: vtadmin.DeleteKeyspaceRequest.options:type_name -> vtctldata.DeleteKeyspaceRequest + 159, // 40: vtadmin.DeleteShardsRequest.options:type_name -> vtctldata.DeleteShardsRequest + 160, // 41: vtadmin.DeleteTabletRequest.alias:type_name -> topodata.TabletAlias + 1, // 42: vtadmin.DeleteTabletResponse.cluster:type_name -> vtadmin.Cluster + 161, // 43: vtadmin.EmergencyFailoverShardRequest.options:type_name -> vtctldata.EmergencyReparentShardRequest + 1, // 44: vtadmin.EmergencyFailoverShardResponse.cluster:type_name -> vtadmin.Cluster + 160, // 45: vtadmin.EmergencyFailoverShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 162, // 46: vtadmin.EmergencyFailoverShardResponse.events:type_name -> logutil.Event + 61, // 47: vtadmin.FindSchemaRequest.table_size_options:type_name -> vtadmin.GetSchemaTableSizeOptions + 163, // 48: vtadmin.GetBackupsRequest.request_options:type_name -> vtctldata.GetBackupsRequest + 2, // 49: vtadmin.GetBackupsResponse.backups:type_name -> vtadmin.ClusterBackup + 4, // 50: vtadmin.GetCellInfosResponse.cell_infos:type_name -> vtadmin.ClusterCellInfo + 3, // 51: vtadmin.GetCellsAliasesResponse.aliases:type_name -> vtadmin.ClusterCellsAliases + 1, // 52: vtadmin.GetClustersResponse.clusters:type_name -> vtadmin.Cluster + 160, // 53: vtadmin.GetFullStatusRequest.alias:type_name -> topodata.TabletAlias + 15, // 54: vtadmin.GetGatesResponse.gates:type_name -> vtadmin.VTGate + 7, // 55: vtadmin.GetKeyspacesResponse.keyspaces:type_name -> vtadmin.Keyspace + 61, // 56: vtadmin.GetSchemaRequest.table_size_options:type_name -> vtadmin.GetSchemaTableSizeOptions + 61, // 57: vtadmin.GetSchemasRequest.table_size_options:type_name -> vtadmin.GetSchemaTableSizeOptions + 8, // 58: vtadmin.GetSchemasResponse.schemas:type_name -> vtadmin.Schema + 132, // 59: vtadmin.GetSchemaMigrationsRequest.cluster_requests:type_name -> vtadmin.GetSchemaMigrationsRequest.ClusterRequest + 9, // 60: vtadmin.GetSchemaMigrationsResponse.schema_migrations:type_name -> vtadmin.SchemaMigration + 5, // 61: vtadmin.GetShardReplicationPositionsResponse.replication_positions:type_name -> vtadmin.ClusterShardReplicationPosition + 133, // 62: vtadmin.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtadmin.GetSrvKeyspacesResponse.SrvKeyspacesEntry + 11, // 63: vtadmin.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtadmin.SrvVSchema + 160, // 64: vtadmin.GetTabletRequest.alias:type_name -> topodata.TabletAlias + 12, // 65: vtadmin.GetTabletsResponse.tablets:type_name -> vtadmin.Tablet + 13, // 66: vtadmin.GetVSchemasResponse.v_schemas:type_name -> vtadmin.VSchema + 14, // 67: vtadmin.GetVtctldsResponse.vtctlds:type_name -> vtadmin.Vtctld + 134, // 68: vtadmin.GetWorkflowsResponse.workflows_by_cluster:type_name -> vtadmin.GetWorkflowsResponse.WorkflowsByClusterEntry + 164, // 69: vtadmin.LaunchSchemaMigrationRequest.request:type_name -> vtctldata.LaunchSchemaMigrationRequest + 165, // 70: vtadmin.MaterializeCreateRequest.request:type_name -> vtctldata.MaterializeCreateRequest + 166, // 71: vtadmin.MoveTablesCompleteRequest.request:type_name -> vtctldata.MoveTablesCompleteRequest + 167, // 72: vtadmin.MoveTablesCreateRequest.request:type_name -> vtctldata.MoveTablesCreateRequest + 160, // 73: vtadmin.PingTabletRequest.alias:type_name -> topodata.TabletAlias + 1, // 74: vtadmin.PingTabletResponse.cluster:type_name -> vtadmin.Cluster + 168, // 75: vtadmin.PlannedFailoverShardRequest.options:type_name -> vtctldata.PlannedReparentShardRequest + 1, // 76: vtadmin.PlannedFailoverShardResponse.cluster:type_name -> vtadmin.Cluster + 160, // 77: vtadmin.PlannedFailoverShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 162, // 78: vtadmin.PlannedFailoverShardResponse.events:type_name -> logutil.Event + 160, // 79: vtadmin.RefreshStateRequest.alias:type_name -> topodata.TabletAlias + 1, // 80: vtadmin.RefreshStateResponse.cluster:type_name -> vtadmin.Cluster + 160, // 81: vtadmin.ReloadSchemasRequest.tablets:type_name -> topodata.TabletAlias + 135, // 82: vtadmin.ReloadSchemasResponse.keyspace_results:type_name -> vtadmin.ReloadSchemasResponse.KeyspaceResult + 136, // 83: vtadmin.ReloadSchemasResponse.shard_results:type_name -> vtadmin.ReloadSchemasResponse.ShardResult + 137, // 84: vtadmin.ReloadSchemasResponse.tablet_results:type_name -> vtadmin.ReloadSchemasResponse.TabletResult + 162, // 85: vtadmin.ReloadSchemaShardResponse.events:type_name -> logutil.Event + 160, // 86: vtadmin.RefreshTabletReplicationSourceRequest.alias:type_name -> topodata.TabletAlias + 160, // 87: vtadmin.RefreshTabletReplicationSourceResponse.primary:type_name -> topodata.TabletAlias + 1, // 88: vtadmin.RefreshTabletReplicationSourceResponse.cluster:type_name -> vtadmin.Cluster + 169, // 89: vtadmin.RetrySchemaMigrationRequest.request:type_name -> vtctldata.RetrySchemaMigrationRequest + 160, // 90: vtadmin.RunHealthCheckRequest.alias:type_name -> topodata.TabletAlias + 1, // 91: vtadmin.RunHealthCheckResponse.cluster:type_name -> vtadmin.Cluster + 170, // 92: vtadmin.ReshardCreateRequest.request:type_name -> vtctldata.ReshardCreateRequest + 160, // 93: vtadmin.SetReadOnlyRequest.alias:type_name -> topodata.TabletAlias + 160, // 94: vtadmin.SetReadWriteRequest.alias:type_name -> topodata.TabletAlias + 160, // 95: vtadmin.StartReplicationRequest.alias:type_name -> topodata.TabletAlias + 1, // 96: vtadmin.StartReplicationResponse.cluster:type_name -> vtadmin.Cluster + 160, // 97: vtadmin.StopReplicationRequest.alias:type_name -> topodata.TabletAlias + 1, // 98: vtadmin.StopReplicationResponse.cluster:type_name -> vtadmin.Cluster + 160, // 99: vtadmin.TabletExternallyPromotedRequest.alias:type_name -> topodata.TabletAlias + 1, // 100: vtadmin.TabletExternallyPromotedResponse.cluster:type_name -> vtadmin.Cluster + 160, // 101: vtadmin.TabletExternallyPromotedResponse.new_primary:type_name -> topodata.TabletAlias + 160, // 102: vtadmin.TabletExternallyPromotedResponse.old_primary:type_name -> topodata.TabletAlias + 160, // 103: vtadmin.TabletExternallyReparentedRequest.alias:type_name -> topodata.TabletAlias + 171, // 104: vtadmin.VDiffCreateRequest.request:type_name -> vtctldata.VDiffCreateRequest + 172, // 105: vtadmin.VDiffShowRequest.request:type_name -> vtctldata.VDiffShowRequest + 121, // 106: vtadmin.VDiffShardReport.progress:type_name -> vtadmin.VDiffProgress + 138, // 107: vtadmin.VDiffShowResponse.shard_report:type_name -> vtadmin.VDiffShowResponse.ShardReportEntry + 173, // 108: vtadmin.ClusterCellsAliases.AliasesEntry.value:type_name -> topodata.CellsAlias + 145, // 109: vtadmin.Keyspace.ShardsEntry.value:type_name -> vtctldata.Shard + 130, // 110: vtadmin.Schema.TableSizesEntry.value:type_name -> vtadmin.Schema.TableSize + 131, // 111: vtadmin.Schema.TableSize.by_shard:type_name -> vtadmin.Schema.TableSize.ByShardEntry + 129, // 112: vtadmin.Schema.TableSize.ByShardEntry.value:type_name -> vtadmin.Schema.ShardTableSize + 174, // 113: vtadmin.GetSchemaMigrationsRequest.ClusterRequest.request:type_name -> vtctldata.GetSchemaMigrationsRequest + 175, // 114: vtadmin.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> vtctldata.GetSrvKeyspacesResponse + 6, // 115: vtadmin.GetWorkflowsResponse.WorkflowsByClusterEntry.value:type_name -> vtadmin.ClusterWorkflows + 7, // 116: vtadmin.ReloadSchemasResponse.KeyspaceResult.keyspace:type_name -> vtadmin.Keyspace + 162, // 117: vtadmin.ReloadSchemasResponse.KeyspaceResult.events:type_name -> logutil.Event + 10, // 118: vtadmin.ReloadSchemasResponse.ShardResult.shard:type_name -> vtadmin.Shard + 162, // 119: vtadmin.ReloadSchemasResponse.ShardResult.events:type_name -> logutil.Event + 12, // 120: vtadmin.ReloadSchemasResponse.TabletResult.tablet:type_name -> vtadmin.Tablet + 122, // 121: vtadmin.VDiffShowResponse.ShardReportEntry.value:type_name -> vtadmin.VDiffShardReport + 19, // 122: vtadmin.VTAdmin.ApplySchema:input_type -> vtadmin.ApplySchemaRequest + 20, // 123: vtadmin.VTAdmin.CancelSchemaMigration:input_type -> vtadmin.CancelSchemaMigrationRequest + 21, // 124: vtadmin.VTAdmin.CleanupSchemaMigration:input_type -> vtadmin.CleanupSchemaMigrationRequest + 22, // 125: vtadmin.VTAdmin.CompleteSchemaMigration:input_type -> vtadmin.CompleteSchemaMigrationRequest + 23, // 126: vtadmin.VTAdmin.ConcludeTransaction:input_type -> vtadmin.ConcludeTransactionRequest + 24, // 127: vtadmin.VTAdmin.CreateKeyspace:input_type -> vtadmin.CreateKeyspaceRequest + 26, // 128: vtadmin.VTAdmin.CreateShard:input_type -> vtadmin.CreateShardRequest + 27, // 129: vtadmin.VTAdmin.DeleteKeyspace:input_type -> vtadmin.DeleteKeyspaceRequest + 28, // 130: vtadmin.VTAdmin.DeleteShards:input_type -> vtadmin.DeleteShardsRequest + 29, // 131: vtadmin.VTAdmin.DeleteTablet:input_type -> vtadmin.DeleteTabletRequest + 31, // 132: vtadmin.VTAdmin.EmergencyFailoverShard:input_type -> vtadmin.EmergencyFailoverShardRequest + 33, // 133: vtadmin.VTAdmin.FindSchema:input_type -> vtadmin.FindSchemaRequest + 34, // 134: vtadmin.VTAdmin.GetBackups:input_type -> vtadmin.GetBackupsRequest + 36, // 135: vtadmin.VTAdmin.GetCellInfos:input_type -> vtadmin.GetCellInfosRequest + 38, // 136: vtadmin.VTAdmin.GetCellsAliases:input_type -> vtadmin.GetCellsAliasesRequest + 40, // 137: vtadmin.VTAdmin.GetClusters:input_type -> vtadmin.GetClustersRequest + 42, // 138: vtadmin.VTAdmin.GetFullStatus:input_type -> vtadmin.GetFullStatusRequest + 43, // 139: vtadmin.VTAdmin.GetGates:input_type -> vtadmin.GetGatesRequest + 45, // 140: vtadmin.VTAdmin.GetKeyspace:input_type -> vtadmin.GetKeyspaceRequest + 46, // 141: vtadmin.VTAdmin.GetKeyspaces:input_type -> vtadmin.GetKeyspacesRequest + 48, // 142: vtadmin.VTAdmin.GetSchema:input_type -> vtadmin.GetSchemaRequest + 49, // 143: vtadmin.VTAdmin.GetSchemas:input_type -> vtadmin.GetSchemasRequest + 51, // 144: vtadmin.VTAdmin.GetSchemaMigrations:input_type -> vtadmin.GetSchemaMigrationsRequest + 53, // 145: vtadmin.VTAdmin.GetShardReplicationPositions:input_type -> vtadmin.GetShardReplicationPositionsRequest + 55, // 146: vtadmin.VTAdmin.GetSrvKeyspace:input_type -> vtadmin.GetSrvKeyspaceRequest + 56, // 147: vtadmin.VTAdmin.GetSrvKeyspaces:input_type -> vtadmin.GetSrvKeyspacesRequest + 58, // 148: vtadmin.VTAdmin.GetSrvVSchema:input_type -> vtadmin.GetSrvVSchemaRequest + 59, // 149: vtadmin.VTAdmin.GetSrvVSchemas:input_type -> vtadmin.GetSrvVSchemasRequest + 62, // 150: vtadmin.VTAdmin.GetTablet:input_type -> vtadmin.GetTabletRequest + 63, // 151: vtadmin.VTAdmin.GetTablets:input_type -> vtadmin.GetTabletsRequest + 65, // 152: vtadmin.VTAdmin.GetTopologyPath:input_type -> vtadmin.GetTopologyPathRequest + 66, // 153: vtadmin.VTAdmin.GetUnresolvedTransactions:input_type -> vtadmin.GetUnresolvedTransactionsRequest + 67, // 154: vtadmin.VTAdmin.GetVSchema:input_type -> vtadmin.GetVSchemaRequest + 68, // 155: vtadmin.VTAdmin.GetVSchemas:input_type -> vtadmin.GetVSchemasRequest + 70, // 156: vtadmin.VTAdmin.GetVtctlds:input_type -> vtadmin.GetVtctldsRequest + 72, // 157: vtadmin.VTAdmin.GetWorkflow:input_type -> vtadmin.GetWorkflowRequest + 76, // 158: vtadmin.VTAdmin.GetWorkflows:input_type -> vtadmin.GetWorkflowsRequest + 73, // 159: vtadmin.VTAdmin.GetWorkflowStatus:input_type -> vtadmin.GetWorkflowStatusRequest + 74, // 160: vtadmin.VTAdmin.StartWorkflow:input_type -> vtadmin.StartWorkflowRequest + 75, // 161: vtadmin.VTAdmin.StopWorkflow:input_type -> vtadmin.StopWorkflowRequest + 78, // 162: vtadmin.VTAdmin.LaunchSchemaMigration:input_type -> vtadmin.LaunchSchemaMigrationRequest + 80, // 163: vtadmin.VTAdmin.MoveTablesComplete:input_type -> vtadmin.MoveTablesCompleteRequest + 81, // 164: vtadmin.VTAdmin.MoveTablesCreate:input_type -> vtadmin.MoveTablesCreateRequest + 79, // 165: vtadmin.VTAdmin.MaterializeCreate:input_type -> vtadmin.MaterializeCreateRequest + 82, // 166: vtadmin.VTAdmin.PingTablet:input_type -> vtadmin.PingTabletRequest + 84, // 167: vtadmin.VTAdmin.PlannedFailoverShard:input_type -> vtadmin.PlannedFailoverShardRequest + 86, // 168: vtadmin.VTAdmin.RebuildKeyspaceGraph:input_type -> vtadmin.RebuildKeyspaceGraphRequest + 88, // 169: vtadmin.VTAdmin.RefreshState:input_type -> vtadmin.RefreshStateRequest + 94, // 170: vtadmin.VTAdmin.RefreshTabletReplicationSource:input_type -> vtadmin.RefreshTabletReplicationSourceRequest + 90, // 171: vtadmin.VTAdmin.ReloadSchemas:input_type -> vtadmin.ReloadSchemasRequest + 92, // 172: vtadmin.VTAdmin.ReloadSchemaShard:input_type -> vtadmin.ReloadSchemaShardRequest + 96, // 173: vtadmin.VTAdmin.RemoveKeyspaceCell:input_type -> vtadmin.RemoveKeyspaceCellRequest + 98, // 174: vtadmin.VTAdmin.RetrySchemaMigration:input_type -> vtadmin.RetrySchemaMigrationRequest + 99, // 175: vtadmin.VTAdmin.RunHealthCheck:input_type -> vtadmin.RunHealthCheckRequest + 101, // 176: vtadmin.VTAdmin.ReshardCreate:input_type -> vtadmin.ReshardCreateRequest + 102, // 177: vtadmin.VTAdmin.SetReadOnly:input_type -> vtadmin.SetReadOnlyRequest + 104, // 178: vtadmin.VTAdmin.SetReadWrite:input_type -> vtadmin.SetReadWriteRequest + 106, // 179: vtadmin.VTAdmin.StartReplication:input_type -> vtadmin.StartReplicationRequest + 108, // 180: vtadmin.VTAdmin.StopReplication:input_type -> vtadmin.StopReplicationRequest + 110, // 181: vtadmin.VTAdmin.TabletExternallyPromoted:input_type -> vtadmin.TabletExternallyPromotedRequest + 113, // 182: vtadmin.VTAdmin.Validate:input_type -> vtadmin.ValidateRequest + 114, // 183: vtadmin.VTAdmin.ValidateKeyspace:input_type -> vtadmin.ValidateKeyspaceRequest + 115, // 184: vtadmin.VTAdmin.ValidateSchemaKeyspace:input_type -> vtadmin.ValidateSchemaKeyspaceRequest + 116, // 185: vtadmin.VTAdmin.ValidateShard:input_type -> vtadmin.ValidateShardRequest + 117, // 186: vtadmin.VTAdmin.ValidateVersionKeyspace:input_type -> vtadmin.ValidateVersionKeyspaceRequest + 118, // 187: vtadmin.VTAdmin.ValidateVersionShard:input_type -> vtadmin.ValidateVersionShardRequest + 119, // 188: vtadmin.VTAdmin.VDiffCreate:input_type -> vtadmin.VDiffCreateRequest + 120, // 189: vtadmin.VTAdmin.VDiffShow:input_type -> vtadmin.VDiffShowRequest + 124, // 190: vtadmin.VTAdmin.VTExplain:input_type -> vtadmin.VTExplainRequest + 17, // 191: vtadmin.VTAdmin.WorkflowDelete:input_type -> vtadmin.WorkflowDeleteRequest + 18, // 192: vtadmin.VTAdmin.WorkflowSwitchTraffic:input_type -> vtadmin.WorkflowSwitchTrafficRequest + 176, // 193: vtadmin.VTAdmin.ApplySchema:output_type -> vtctldata.ApplySchemaResponse + 177, // 194: vtadmin.VTAdmin.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse + 178, // 195: vtadmin.VTAdmin.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse + 179, // 196: vtadmin.VTAdmin.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse + 180, // 197: vtadmin.VTAdmin.ConcludeTransaction:output_type -> vtctldata.ConcludeTransactionResponse + 25, // 198: vtadmin.VTAdmin.CreateKeyspace:output_type -> vtadmin.CreateKeyspaceResponse + 181, // 199: vtadmin.VTAdmin.CreateShard:output_type -> vtctldata.CreateShardResponse + 182, // 200: vtadmin.VTAdmin.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse + 183, // 201: vtadmin.VTAdmin.DeleteShards:output_type -> vtctldata.DeleteShardsResponse + 30, // 202: vtadmin.VTAdmin.DeleteTablet:output_type -> vtadmin.DeleteTabletResponse + 32, // 203: vtadmin.VTAdmin.EmergencyFailoverShard:output_type -> vtadmin.EmergencyFailoverShardResponse + 8, // 204: vtadmin.VTAdmin.FindSchema:output_type -> vtadmin.Schema + 35, // 205: vtadmin.VTAdmin.GetBackups:output_type -> vtadmin.GetBackupsResponse + 37, // 206: vtadmin.VTAdmin.GetCellInfos:output_type -> vtadmin.GetCellInfosResponse + 39, // 207: vtadmin.VTAdmin.GetCellsAliases:output_type -> vtadmin.GetCellsAliasesResponse + 41, // 208: vtadmin.VTAdmin.GetClusters:output_type -> vtadmin.GetClustersResponse + 184, // 209: vtadmin.VTAdmin.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse + 44, // 210: vtadmin.VTAdmin.GetGates:output_type -> vtadmin.GetGatesResponse + 7, // 211: vtadmin.VTAdmin.GetKeyspace:output_type -> vtadmin.Keyspace + 47, // 212: vtadmin.VTAdmin.GetKeyspaces:output_type -> vtadmin.GetKeyspacesResponse + 8, // 213: vtadmin.VTAdmin.GetSchema:output_type -> vtadmin.Schema + 50, // 214: vtadmin.VTAdmin.GetSchemas:output_type -> vtadmin.GetSchemasResponse + 52, // 215: vtadmin.VTAdmin.GetSchemaMigrations:output_type -> vtadmin.GetSchemaMigrationsResponse + 54, // 216: vtadmin.VTAdmin.GetShardReplicationPositions:output_type -> vtadmin.GetShardReplicationPositionsResponse + 175, // 217: vtadmin.VTAdmin.GetSrvKeyspace:output_type -> vtctldata.GetSrvKeyspacesResponse + 57, // 218: vtadmin.VTAdmin.GetSrvKeyspaces:output_type -> vtadmin.GetSrvKeyspacesResponse + 11, // 219: vtadmin.VTAdmin.GetSrvVSchema:output_type -> vtadmin.SrvVSchema + 60, // 220: vtadmin.VTAdmin.GetSrvVSchemas:output_type -> vtadmin.GetSrvVSchemasResponse + 12, // 221: vtadmin.VTAdmin.GetTablet:output_type -> vtadmin.Tablet + 64, // 222: vtadmin.VTAdmin.GetTablets:output_type -> vtadmin.GetTabletsResponse + 185, // 223: vtadmin.VTAdmin.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse + 186, // 224: vtadmin.VTAdmin.GetUnresolvedTransactions:output_type -> vtctldata.GetUnresolvedTransactionsResponse + 13, // 225: vtadmin.VTAdmin.GetVSchema:output_type -> vtadmin.VSchema + 69, // 226: vtadmin.VTAdmin.GetVSchemas:output_type -> vtadmin.GetVSchemasResponse + 71, // 227: vtadmin.VTAdmin.GetVtctlds:output_type -> vtadmin.GetVtctldsResponse + 16, // 228: vtadmin.VTAdmin.GetWorkflow:output_type -> vtadmin.Workflow + 77, // 229: vtadmin.VTAdmin.GetWorkflows:output_type -> vtadmin.GetWorkflowsResponse + 187, // 230: vtadmin.VTAdmin.GetWorkflowStatus:output_type -> vtctldata.WorkflowStatusResponse + 188, // 231: vtadmin.VTAdmin.StartWorkflow:output_type -> vtctldata.WorkflowUpdateResponse + 188, // 232: vtadmin.VTAdmin.StopWorkflow:output_type -> vtctldata.WorkflowUpdateResponse + 189, // 233: vtadmin.VTAdmin.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse + 190, // 234: vtadmin.VTAdmin.MoveTablesComplete:output_type -> vtctldata.MoveTablesCompleteResponse + 187, // 235: vtadmin.VTAdmin.MoveTablesCreate:output_type -> vtctldata.WorkflowStatusResponse + 191, // 236: vtadmin.VTAdmin.MaterializeCreate:output_type -> vtctldata.MaterializeCreateResponse + 83, // 237: vtadmin.VTAdmin.PingTablet:output_type -> vtadmin.PingTabletResponse + 85, // 238: vtadmin.VTAdmin.PlannedFailoverShard:output_type -> vtadmin.PlannedFailoverShardResponse + 87, // 239: vtadmin.VTAdmin.RebuildKeyspaceGraph:output_type -> vtadmin.RebuildKeyspaceGraphResponse + 89, // 240: vtadmin.VTAdmin.RefreshState:output_type -> vtadmin.RefreshStateResponse + 95, // 241: vtadmin.VTAdmin.RefreshTabletReplicationSource:output_type -> vtadmin.RefreshTabletReplicationSourceResponse + 91, // 242: vtadmin.VTAdmin.ReloadSchemas:output_type -> vtadmin.ReloadSchemasResponse + 93, // 243: vtadmin.VTAdmin.ReloadSchemaShard:output_type -> vtadmin.ReloadSchemaShardResponse + 97, // 244: vtadmin.VTAdmin.RemoveKeyspaceCell:output_type -> vtadmin.RemoveKeyspaceCellResponse + 192, // 245: vtadmin.VTAdmin.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse + 100, // 246: vtadmin.VTAdmin.RunHealthCheck:output_type -> vtadmin.RunHealthCheckResponse + 187, // 247: vtadmin.VTAdmin.ReshardCreate:output_type -> vtctldata.WorkflowStatusResponse + 103, // 248: vtadmin.VTAdmin.SetReadOnly:output_type -> vtadmin.SetReadOnlyResponse + 105, // 249: vtadmin.VTAdmin.SetReadWrite:output_type -> vtadmin.SetReadWriteResponse + 107, // 250: vtadmin.VTAdmin.StartReplication:output_type -> vtadmin.StartReplicationResponse + 109, // 251: vtadmin.VTAdmin.StopReplication:output_type -> vtadmin.StopReplicationResponse + 111, // 252: vtadmin.VTAdmin.TabletExternallyPromoted:output_type -> vtadmin.TabletExternallyPromotedResponse + 193, // 253: vtadmin.VTAdmin.Validate:output_type -> vtctldata.ValidateResponse + 194, // 254: vtadmin.VTAdmin.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse + 195, // 255: vtadmin.VTAdmin.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse + 196, // 256: vtadmin.VTAdmin.ValidateShard:output_type -> vtctldata.ValidateShardResponse + 197, // 257: vtadmin.VTAdmin.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse + 198, // 258: vtadmin.VTAdmin.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse + 199, // 259: vtadmin.VTAdmin.VDiffCreate:output_type -> vtctldata.VDiffCreateResponse + 123, // 260: vtadmin.VTAdmin.VDiffShow:output_type -> vtadmin.VDiffShowResponse + 125, // 261: vtadmin.VTAdmin.VTExplain:output_type -> vtadmin.VTExplainResponse + 200, // 262: vtadmin.VTAdmin.WorkflowDelete:output_type -> vtctldata.WorkflowDeleteResponse + 201, // 263: vtadmin.VTAdmin.WorkflowSwitchTraffic:output_type -> vtctldata.WorkflowSwitchTrafficResponse + 193, // [193:264] is the sub-list for method output_type + 122, // [122:193] is the sub-list for method input_type + 122, // [122:122] is the sub-list for extension type_name + 122, // [122:122] is the sub-list for extension extendee + 0, // [0:122] is the sub-list for field type_name } func init() { file_vtadmin_proto_init() } @@ -8592,7 +9810,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*ApplySchemaRequest); i { + switch v := v.(*WorkflowDeleteRequest); i { case 0: return &v.state case 1: @@ -8604,7 +9822,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*CancelSchemaMigrationRequest); i { + switch v := v.(*WorkflowSwitchTrafficRequest); i { case 0: return &v.state case 1: @@ -8616,7 +9834,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[18].Exporter = func(v any, i int) any { - switch v := v.(*CleanupSchemaMigrationRequest); i { + switch v := v.(*ApplySchemaRequest); i { case 0: return &v.state case 1: @@ -8628,7 +9846,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[19].Exporter = func(v any, i int) any { - switch v := v.(*CompleteSchemaMigrationRequest); i { + switch v := v.(*CancelSchemaMigrationRequest); i { case 0: return &v.state case 1: @@ -8640,7 +9858,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*CreateKeyspaceRequest); i { + switch v := v.(*CleanupSchemaMigrationRequest); i { case 0: return &v.state case 1: @@ -8652,7 +9870,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*CreateKeyspaceResponse); i { + switch v := v.(*CompleteSchemaMigrationRequest); i { case 0: return &v.state case 1: @@ -8664,7 +9882,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*CreateShardRequest); i { + switch v := v.(*ConcludeTransactionRequest); i { case 0: return &v.state case 1: @@ -8676,7 +9894,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*DeleteKeyspaceRequest); i { + switch v := v.(*CreateKeyspaceRequest); i { case 0: return &v.state case 1: @@ -8688,7 +9906,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*DeleteShardsRequest); i { + switch v := v.(*CreateKeyspaceResponse); i { case 0: return &v.state case 1: @@ -8700,7 +9918,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[25].Exporter = func(v any, i int) any { - switch v := v.(*DeleteTabletRequest); i { + switch v := v.(*CreateShardRequest); i { case 0: return &v.state case 1: @@ -8712,7 +9930,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[26].Exporter = func(v any, i int) any { - switch v := v.(*DeleteTabletResponse); i { + switch v := v.(*DeleteKeyspaceRequest); i { case 0: return &v.state case 1: @@ -8724,7 +9942,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[27].Exporter = func(v any, i int) any { - switch v := v.(*EmergencyFailoverShardRequest); i { + switch v := v.(*DeleteShardsRequest); i { case 0: return &v.state case 1: @@ -8736,7 +9954,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[28].Exporter = func(v any, i int) any { - switch v := v.(*EmergencyFailoverShardResponse); i { + switch v := v.(*DeleteTabletRequest); i { case 0: return &v.state case 1: @@ -8748,7 +9966,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[29].Exporter = func(v any, i int) any { - switch v := v.(*FindSchemaRequest); i { + switch v := v.(*DeleteTabletResponse); i { case 0: return &v.state case 1: @@ -8760,7 +9978,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[30].Exporter = func(v any, i int) any { - switch v := v.(*GetBackupsRequest); i { + switch v := v.(*EmergencyFailoverShardRequest); i { case 0: return &v.state case 1: @@ -8772,7 +9990,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[31].Exporter = func(v any, i int) any { - switch v := v.(*GetBackupsResponse); i { + switch v := v.(*EmergencyFailoverShardResponse); i { case 0: return &v.state case 1: @@ -8784,7 +10002,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[32].Exporter = func(v any, i int) any { - switch v := v.(*GetCellInfosRequest); i { + switch v := v.(*FindSchemaRequest); i { case 0: return &v.state case 1: @@ -8796,7 +10014,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[33].Exporter = func(v any, i int) any { - switch v := v.(*GetCellInfosResponse); i { + switch v := v.(*GetBackupsRequest); i { case 0: return &v.state case 1: @@ -8808,7 +10026,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[34].Exporter = func(v any, i int) any { - switch v := v.(*GetCellsAliasesRequest); i { + switch v := v.(*GetBackupsResponse); i { case 0: return &v.state case 1: @@ -8820,7 +10038,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[35].Exporter = func(v any, i int) any { - switch v := v.(*GetCellsAliasesResponse); i { + switch v := v.(*GetCellInfosRequest); i { case 0: return &v.state case 1: @@ -8832,7 +10050,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[36].Exporter = func(v any, i int) any { - switch v := v.(*GetClustersRequest); i { + switch v := v.(*GetCellInfosResponse); i { case 0: return &v.state case 1: @@ -8844,7 +10062,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[37].Exporter = func(v any, i int) any { - switch v := v.(*GetClustersResponse); i { + switch v := v.(*GetCellsAliasesRequest); i { case 0: return &v.state case 1: @@ -8856,7 +10074,7 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[38].Exporter = func(v any, i int) any { - switch v := v.(*GetFullStatusRequest); i { + switch v := v.(*GetCellsAliasesResponse); i { case 0: return &v.state case 1: @@ -8868,6 +10086,42 @@ func file_vtadmin_proto_init() { } } file_vtadmin_proto_msgTypes[39].Exporter = func(v any, i int) any { + switch v := v.(*GetClustersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[40].Exporter = func(v any, i int) any { + switch v := v.(*GetClustersResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[41].Exporter = func(v any, i int) any { + switch v := v.(*GetFullStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[42].Exporter = func(v any, i int) any { switch v := v.(*GetGatesRequest); i { case 0: return &v.state @@ -8879,8 +10133,92 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[40].Exporter = func(v any, i int) any { - switch v := v.(*GetGatesResponse); i { + file_vtadmin_proto_msgTypes[43].Exporter = func(v any, i int) any { + switch v := v.(*GetGatesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[44].Exporter = func(v any, i int) any { + switch v := v.(*GetKeyspaceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[45].Exporter = func(v any, i int) any { + switch v := v.(*GetKeyspacesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[46].Exporter = func(v any, i int) any { + switch v := v.(*GetKeyspacesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[47].Exporter = func(v any, i int) any { + switch v := v.(*GetSchemaRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[48].Exporter = func(v any, i int) any { + switch v := v.(*GetSchemasRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[49].Exporter = func(v any, i int) any { + switch v := v.(*GetSchemasResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[50].Exporter = func(v any, i int) any { + switch v := v.(*GetSchemaMigrationsRequest); i { case 0: return &v.state case 1: @@ -8891,8 +10229,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[41].Exporter = func(v any, i int) any { - switch v := v.(*GetKeyspaceRequest); i { + file_vtadmin_proto_msgTypes[51].Exporter = func(v any, i int) any { + switch v := v.(*GetSchemaMigrationsResponse); i { case 0: return &v.state case 1: @@ -8903,8 +10241,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[42].Exporter = func(v any, i int) any { - switch v := v.(*GetKeyspacesRequest); i { + file_vtadmin_proto_msgTypes[52].Exporter = func(v any, i int) any { + switch v := v.(*GetShardReplicationPositionsRequest); i { case 0: return &v.state case 1: @@ -8915,8 +10253,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*GetKeyspacesResponse); i { + file_vtadmin_proto_msgTypes[53].Exporter = func(v any, i int) any { + switch v := v.(*GetShardReplicationPositionsResponse); i { case 0: return &v.state case 1: @@ -8927,8 +10265,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[44].Exporter = func(v any, i int) any { - switch v := v.(*GetSchemaRequest); i { + file_vtadmin_proto_msgTypes[54].Exporter = func(v any, i int) any { + switch v := v.(*GetSrvKeyspaceRequest); i { case 0: return &v.state case 1: @@ -8939,8 +10277,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[45].Exporter = func(v any, i int) any { - switch v := v.(*GetSchemasRequest); i { + file_vtadmin_proto_msgTypes[55].Exporter = func(v any, i int) any { + switch v := v.(*GetSrvKeyspacesRequest); i { case 0: return &v.state case 1: @@ -8951,8 +10289,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[46].Exporter = func(v any, i int) any { - switch v := v.(*GetSchemasResponse); i { + file_vtadmin_proto_msgTypes[56].Exporter = func(v any, i int) any { + switch v := v.(*GetSrvKeyspacesResponse); i { case 0: return &v.state case 1: @@ -8963,8 +10301,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[47].Exporter = func(v any, i int) any { - switch v := v.(*GetSchemaMigrationsRequest); i { + file_vtadmin_proto_msgTypes[57].Exporter = func(v any, i int) any { + switch v := v.(*GetSrvVSchemaRequest); i { case 0: return &v.state case 1: @@ -8975,8 +10313,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[48].Exporter = func(v any, i int) any { - switch v := v.(*GetSchemaMigrationsResponse); i { + file_vtadmin_proto_msgTypes[58].Exporter = func(v any, i int) any { + switch v := v.(*GetSrvVSchemasRequest); i { case 0: return &v.state case 1: @@ -8987,8 +10325,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[49].Exporter = func(v any, i int) any { - switch v := v.(*GetShardReplicationPositionsRequest); i { + file_vtadmin_proto_msgTypes[59].Exporter = func(v any, i int) any { + switch v := v.(*GetSrvVSchemasResponse); i { case 0: return &v.state case 1: @@ -8999,8 +10337,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[50].Exporter = func(v any, i int) any { - switch v := v.(*GetShardReplicationPositionsResponse); i { + file_vtadmin_proto_msgTypes[60].Exporter = func(v any, i int) any { + switch v := v.(*GetSchemaTableSizeOptions); i { case 0: return &v.state case 1: @@ -9011,8 +10349,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[51].Exporter = func(v any, i int) any { - switch v := v.(*GetSrvKeyspaceRequest); i { + file_vtadmin_proto_msgTypes[61].Exporter = func(v any, i int) any { + switch v := v.(*GetTabletRequest); i { case 0: return &v.state case 1: @@ -9023,8 +10361,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[52].Exporter = func(v any, i int) any { - switch v := v.(*GetSrvKeyspacesRequest); i { + file_vtadmin_proto_msgTypes[62].Exporter = func(v any, i int) any { + switch v := v.(*GetTabletsRequest); i { case 0: return &v.state case 1: @@ -9035,8 +10373,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[53].Exporter = func(v any, i int) any { - switch v := v.(*GetSrvKeyspacesResponse); i { + file_vtadmin_proto_msgTypes[63].Exporter = func(v any, i int) any { + switch v := v.(*GetTabletsResponse); i { case 0: return &v.state case 1: @@ -9047,8 +10385,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[54].Exporter = func(v any, i int) any { - switch v := v.(*GetSrvVSchemaRequest); i { + file_vtadmin_proto_msgTypes[64].Exporter = func(v any, i int) any { + switch v := v.(*GetTopologyPathRequest); i { case 0: return &v.state case 1: @@ -9059,8 +10397,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[55].Exporter = func(v any, i int) any { - switch v := v.(*GetSrvVSchemasRequest); i { + file_vtadmin_proto_msgTypes[65].Exporter = func(v any, i int) any { + switch v := v.(*GetUnresolvedTransactionsRequest); i { case 0: return &v.state case 1: @@ -9071,8 +10409,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[56].Exporter = func(v any, i int) any { - switch v := v.(*GetSrvVSchemasResponse); i { + file_vtadmin_proto_msgTypes[66].Exporter = func(v any, i int) any { + switch v := v.(*GetVSchemaRequest); i { case 0: return &v.state case 1: @@ -9083,8 +10421,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[57].Exporter = func(v any, i int) any { - switch v := v.(*GetSchemaTableSizeOptions); i { + file_vtadmin_proto_msgTypes[67].Exporter = func(v any, i int) any { + switch v := v.(*GetVSchemasRequest); i { case 0: return &v.state case 1: @@ -9095,8 +10433,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[58].Exporter = func(v any, i int) any { - switch v := v.(*GetTabletRequest); i { + file_vtadmin_proto_msgTypes[68].Exporter = func(v any, i int) any { + switch v := v.(*GetVSchemasResponse); i { case 0: return &v.state case 1: @@ -9107,8 +10445,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[59].Exporter = func(v any, i int) any { - switch v := v.(*GetTabletsRequest); i { + file_vtadmin_proto_msgTypes[69].Exporter = func(v any, i int) any { + switch v := v.(*GetVtctldsRequest); i { case 0: return &v.state case 1: @@ -9119,8 +10457,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[60].Exporter = func(v any, i int) any { - switch v := v.(*GetTabletsResponse); i { + file_vtadmin_proto_msgTypes[70].Exporter = func(v any, i int) any { + switch v := v.(*GetVtctldsResponse); i { case 0: return &v.state case 1: @@ -9131,8 +10469,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[61].Exporter = func(v any, i int) any { - switch v := v.(*GetTopologyPathRequest); i { + file_vtadmin_proto_msgTypes[71].Exporter = func(v any, i int) any { + switch v := v.(*GetWorkflowRequest); i { case 0: return &v.state case 1: @@ -9143,8 +10481,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[62].Exporter = func(v any, i int) any { - switch v := v.(*GetVSchemaRequest); i { + file_vtadmin_proto_msgTypes[72].Exporter = func(v any, i int) any { + switch v := v.(*GetWorkflowStatusRequest); i { case 0: return &v.state case 1: @@ -9155,8 +10493,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[63].Exporter = func(v any, i int) any { - switch v := v.(*GetVSchemasRequest); i { + file_vtadmin_proto_msgTypes[73].Exporter = func(v any, i int) any { + switch v := v.(*StartWorkflowRequest); i { case 0: return &v.state case 1: @@ -9167,8 +10505,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[64].Exporter = func(v any, i int) any { - switch v := v.(*GetVSchemasResponse); i { + file_vtadmin_proto_msgTypes[74].Exporter = func(v any, i int) any { + switch v := v.(*StopWorkflowRequest); i { case 0: return &v.state case 1: @@ -9179,8 +10517,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[65].Exporter = func(v any, i int) any { - switch v := v.(*GetVtctldsRequest); i { + file_vtadmin_proto_msgTypes[75].Exporter = func(v any, i int) any { + switch v := v.(*GetWorkflowsRequest); i { case 0: return &v.state case 1: @@ -9191,8 +10529,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[66].Exporter = func(v any, i int) any { - switch v := v.(*GetVtctldsResponse); i { + file_vtadmin_proto_msgTypes[76].Exporter = func(v any, i int) any { + switch v := v.(*GetWorkflowsResponse); i { case 0: return &v.state case 1: @@ -9203,8 +10541,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[67].Exporter = func(v any, i int) any { - switch v := v.(*GetWorkflowRequest); i { + file_vtadmin_proto_msgTypes[77].Exporter = func(v any, i int) any { + switch v := v.(*LaunchSchemaMigrationRequest); i { case 0: return &v.state case 1: @@ -9215,8 +10553,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[68].Exporter = func(v any, i int) any { - switch v := v.(*GetWorkflowsRequest); i { + file_vtadmin_proto_msgTypes[78].Exporter = func(v any, i int) any { + switch v := v.(*MaterializeCreateRequest); i { case 0: return &v.state case 1: @@ -9227,8 +10565,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[69].Exporter = func(v any, i int) any { - switch v := v.(*GetWorkflowsResponse); i { + file_vtadmin_proto_msgTypes[79].Exporter = func(v any, i int) any { + switch v := v.(*MoveTablesCompleteRequest); i { case 0: return &v.state case 1: @@ -9239,8 +10577,8 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[70].Exporter = func(v any, i int) any { - switch v := v.(*LaunchSchemaMigrationRequest); i { + file_vtadmin_proto_msgTypes[80].Exporter = func(v any, i int) any { + switch v := v.(*MoveTablesCreateRequest); i { case 0: return &v.state case 1: @@ -9251,7 +10589,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[71].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[81].Exporter = func(v any, i int) any { switch v := v.(*PingTabletRequest); i { case 0: return &v.state @@ -9263,7 +10601,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[72].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[82].Exporter = func(v any, i int) any { switch v := v.(*PingTabletResponse); i { case 0: return &v.state @@ -9275,7 +10613,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[73].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[83].Exporter = func(v any, i int) any { switch v := v.(*PlannedFailoverShardRequest); i { case 0: return &v.state @@ -9287,7 +10625,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[74].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[84].Exporter = func(v any, i int) any { switch v := v.(*PlannedFailoverShardResponse); i { case 0: return &v.state @@ -9299,7 +10637,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[75].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[85].Exporter = func(v any, i int) any { switch v := v.(*RebuildKeyspaceGraphRequest); i { case 0: return &v.state @@ -9311,7 +10649,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[76].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[86].Exporter = func(v any, i int) any { switch v := v.(*RebuildKeyspaceGraphResponse); i { case 0: return &v.state @@ -9323,7 +10661,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[77].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[87].Exporter = func(v any, i int) any { switch v := v.(*RefreshStateRequest); i { case 0: return &v.state @@ -9335,7 +10673,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[78].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[88].Exporter = func(v any, i int) any { switch v := v.(*RefreshStateResponse); i { case 0: return &v.state @@ -9347,7 +10685,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[79].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[89].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemasRequest); i { case 0: return &v.state @@ -9359,7 +10697,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[80].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[90].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemasResponse); i { case 0: return &v.state @@ -9371,7 +10709,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[81].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[91].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemaShardRequest); i { case 0: return &v.state @@ -9383,7 +10721,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[82].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[92].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemaShardResponse); i { case 0: return &v.state @@ -9395,7 +10733,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[83].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[93].Exporter = func(v any, i int) any { switch v := v.(*RefreshTabletReplicationSourceRequest); i { case 0: return &v.state @@ -9407,7 +10745,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[84].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[94].Exporter = func(v any, i int) any { switch v := v.(*RefreshTabletReplicationSourceResponse); i { case 0: return &v.state @@ -9419,7 +10757,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[85].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[95].Exporter = func(v any, i int) any { switch v := v.(*RemoveKeyspaceCellRequest); i { case 0: return &v.state @@ -9431,7 +10769,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[86].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[96].Exporter = func(v any, i int) any { switch v := v.(*RemoveKeyspaceCellResponse); i { case 0: return &v.state @@ -9443,7 +10781,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[87].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[97].Exporter = func(v any, i int) any { switch v := v.(*RetrySchemaMigrationRequest); i { case 0: return &v.state @@ -9455,7 +10793,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[88].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[98].Exporter = func(v any, i int) any { switch v := v.(*RunHealthCheckRequest); i { case 0: return &v.state @@ -9467,7 +10805,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[89].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[99].Exporter = func(v any, i int) any { switch v := v.(*RunHealthCheckResponse); i { case 0: return &v.state @@ -9479,7 +10817,19 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[90].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[100].Exporter = func(v any, i int) any { + switch v := v.(*ReshardCreateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[101].Exporter = func(v any, i int) any { switch v := v.(*SetReadOnlyRequest); i { case 0: return &v.state @@ -9491,7 +10841,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[91].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[102].Exporter = func(v any, i int) any { switch v := v.(*SetReadOnlyResponse); i { case 0: return &v.state @@ -9503,7 +10853,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[92].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[103].Exporter = func(v any, i int) any { switch v := v.(*SetReadWriteRequest); i { case 0: return &v.state @@ -9515,7 +10865,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[93].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[104].Exporter = func(v any, i int) any { switch v := v.(*SetReadWriteResponse); i { case 0: return &v.state @@ -9527,7 +10877,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[94].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[105].Exporter = func(v any, i int) any { switch v := v.(*StartReplicationRequest); i { case 0: return &v.state @@ -9539,7 +10889,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[95].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[106].Exporter = func(v any, i int) any { switch v := v.(*StartReplicationResponse); i { case 0: return &v.state @@ -9551,7 +10901,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[96].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[107].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationRequest); i { case 0: return &v.state @@ -9563,7 +10913,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[97].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[108].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationResponse); i { case 0: return &v.state @@ -9575,7 +10925,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[98].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[109].Exporter = func(v any, i int) any { switch v := v.(*TabletExternallyPromotedRequest); i { case 0: return &v.state @@ -9587,7 +10937,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[99].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[110].Exporter = func(v any, i int) any { switch v := v.(*TabletExternallyPromotedResponse); i { case 0: return &v.state @@ -9599,7 +10949,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[100].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[111].Exporter = func(v any, i int) any { switch v := v.(*TabletExternallyReparentedRequest); i { case 0: return &v.state @@ -9611,7 +10961,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[101].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[112].Exporter = func(v any, i int) any { switch v := v.(*ValidateRequest); i { case 0: return &v.state @@ -9623,7 +10973,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[102].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[113].Exporter = func(v any, i int) any { switch v := v.(*ValidateKeyspaceRequest); i { case 0: return &v.state @@ -9635,7 +10985,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[103].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[114].Exporter = func(v any, i int) any { switch v := v.(*ValidateSchemaKeyspaceRequest); i { case 0: return &v.state @@ -9647,7 +10997,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[104].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[115].Exporter = func(v any, i int) any { switch v := v.(*ValidateShardRequest); i { case 0: return &v.state @@ -9659,7 +11009,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[105].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[116].Exporter = func(v any, i int) any { switch v := v.(*ValidateVersionKeyspaceRequest); i { case 0: return &v.state @@ -9671,7 +11021,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[106].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[117].Exporter = func(v any, i int) any { switch v := v.(*ValidateVersionShardRequest); i { case 0: return &v.state @@ -9683,7 +11033,67 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[107].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[118].Exporter = func(v any, i int) any { + switch v := v.(*VDiffCreateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[119].Exporter = func(v any, i int) any { + switch v := v.(*VDiffShowRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[120].Exporter = func(v any, i int) any { + switch v := v.(*VDiffProgress); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[121].Exporter = func(v any, i int) any { + switch v := v.(*VDiffShardReport); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[122].Exporter = func(v any, i int) any { + switch v := v.(*VDiffShowResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtadmin_proto_msgTypes[123].Exporter = func(v any, i int) any { switch v := v.(*VTExplainRequest); i { case 0: return &v.state @@ -9695,7 +11105,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[108].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[124].Exporter = func(v any, i int) any { switch v := v.(*VTExplainResponse); i { case 0: return &v.state @@ -9707,7 +11117,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[112].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[128].Exporter = func(v any, i int) any { switch v := v.(*Schema_ShardTableSize); i { case 0: return &v.state @@ -9719,7 +11129,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[113].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[129].Exporter = func(v any, i int) any { switch v := v.(*Schema_TableSize); i { case 0: return &v.state @@ -9731,7 +11141,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[115].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[131].Exporter = func(v any, i int) any { switch v := v.(*GetSchemaMigrationsRequest_ClusterRequest); i { case 0: return &v.state @@ -9743,7 +11153,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[118].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[134].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemasResponse_KeyspaceResult); i { case 0: return &v.state @@ -9755,7 +11165,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[119].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[135].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemasResponse_ShardResult); i { case 0: return &v.state @@ -9767,7 +11177,7 @@ func file_vtadmin_proto_init() { return nil } } - file_vtadmin_proto_msgTypes[120].Exporter = func(v any, i int) any { + file_vtadmin_proto_msgTypes[136].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemasResponse_TabletResult); i { case 0: return &v.state @@ -9786,7 +11196,7 @@ func file_vtadmin_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vtadmin_proto_rawDesc, NumEnums: 1, - NumMessages: 121, + NumMessages: 138, NumExtensions: 0, NumServices: 1, }, diff --git a/go/vt/proto/vtadmin/vtadmin_grpc.pb.go b/go/vt/proto/vtadmin/vtadmin_grpc.pb.go index 1e377d0659f..23c587bf67f 100644 --- a/go/vt/proto/vtadmin/vtadmin_grpc.pb.go +++ b/go/vt/proto/vtadmin/vtadmin_grpc.pb.go @@ -34,6 +34,8 @@ type VTAdminClient interface { // CompleteSchemaMigration completes one or all migrations in the given // cluster executed with --postpone-completion. CompleteSchemaMigration(ctx context.Context, in *CompleteSchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.CompleteSchemaMigrationResponse, error) + // ConcludeTransaction concludes a distributed transaction identified by the provided dtid. + ConcludeTransaction(ctx context.Context, in *ConcludeTransactionRequest, opts ...grpc.CallOption) (*vtctldata.ConcludeTransactionResponse, error) // CreateKeyspace creates a new keyspace in the given cluster. CreateKeyspace(ctx context.Context, in *CreateKeyspaceRequest, opts ...grpc.CallOption) (*CreateKeyspaceResponse, error) // CreateShard creates a new shard in the given cluster and keyspace. @@ -104,6 +106,8 @@ type VTAdminClient interface { GetTablets(ctx context.Context, in *GetTabletsRequest, opts ...grpc.CallOption) (*GetTabletsResponse, error) // GetTopologyPath returns the cell located at the specified path in the topology server. GetTopologyPath(ctx context.Context, in *GetTopologyPathRequest, opts ...grpc.CallOption) (*vtctldata.GetTopologyPathResponse, error) + // GetUnresolvedTransactions returns the unresolved transactions for the request. + GetUnresolvedTransactions(ctx context.Context, in *GetUnresolvedTransactionsRequest, opts ...grpc.CallOption) (*vtctldata.GetUnresolvedTransactionsResponse, error) // GetVSchema returns a VSchema for the specified keyspace in the specified // cluster. GetVSchema(ctx context.Context, in *GetVSchemaRequest, opts ...grpc.CallOption) (*VSchema, error) @@ -116,9 +120,24 @@ type VTAdminClient interface { GetWorkflow(ctx context.Context, in *GetWorkflowRequest, opts ...grpc.CallOption) (*Workflow, error) // GetWorkflows returns the Workflows for all specified clusters. GetWorkflows(ctx context.Context, in *GetWorkflowsRequest, opts ...grpc.CallOption) (*GetWorkflowsResponse, error) + // GetWorkflowStatus returns the status for a specific workflow. + GetWorkflowStatus(ctx context.Context, in *GetWorkflowStatusRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowStatusResponse, error) + // StartWorkflow starts a vreplication workflow. + StartWorkflow(ctx context.Context, in *StartWorkflowRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowUpdateResponse, error) + // StopWorkflow stops a vreplication workflow. + StopWorkflow(ctx context.Context, in *StopWorkflowRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowUpdateResponse, error) // LaunchSchemaMigration launches one or all migrations in the given // cluster executed with --postpone-launch. LaunchSchemaMigration(ctx context.Context, in *LaunchSchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.LaunchSchemaMigrationResponse, error) + // MoveTablesComplete completes the move and cleans up the workflow and + // its related artifacts. + MoveTablesComplete(ctx context.Context, in *MoveTablesCompleteRequest, opts ...grpc.CallOption) (*vtctldata.MoveTablesCompleteResponse, error) + // MoveTablesCreate creates a workflow which moves one or more tables from a + // source keyspace to a target keyspace. + MoveTablesCreate(ctx context.Context, in *MoveTablesCreateRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowStatusResponse, error) + // MaterializeCreate creates a workflow to materialize one or more tables + // from a source keyspace to a target keyspace using a provided expressions. + MaterializeCreate(ctx context.Context, in *MaterializeCreateRequest, opts ...grpc.CallOption) (*vtctldata.MaterializeCreateResponse, error) // PingTablet checks that the specified tablet is awake and responding to // RPCs. This command can be blocked by other in-flight operations. PingTablet(ctx context.Context, in *PingTabletRequest, opts ...grpc.CallOption) (*PingTabletResponse, error) @@ -150,6 +169,8 @@ type VTAdminClient interface { RetrySchemaMigration(ctx context.Context, in *RetrySchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.RetrySchemaMigrationResponse, error) // RunHealthCheck runs a healthcheck on the tablet. RunHealthCheck(ctx context.Context, in *RunHealthCheckRequest, opts ...grpc.CallOption) (*RunHealthCheckResponse, error) + // ReshardCreate creates a workflow to reshard a keyspace. + ReshardCreate(ctx context.Context, in *ReshardCreateRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowStatusResponse, error) // SetReadOnly sets the tablet to read-only mode. SetReadOnly(ctx context.Context, in *SetReadOnlyRequest, opts ...grpc.CallOption) (*SetReadOnlyResponse, error) // SetReadWrite sets the tablet to read-write mode. @@ -187,9 +208,15 @@ type VTAdminClient interface { ValidateVersionKeyspace(ctx context.Context, in *ValidateVersionKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.ValidateVersionKeyspaceResponse, error) // ValidateVersionShard validates that the version on the primary matches all of the replicas. ValidateVersionShard(ctx context.Context, in *ValidateVersionShardRequest, opts ...grpc.CallOption) (*vtctldata.ValidateVersionShardResponse, error) + VDiffCreate(ctx context.Context, in *VDiffCreateRequest, opts ...grpc.CallOption) (*vtctldata.VDiffCreateResponse, error) + VDiffShow(ctx context.Context, in *VDiffShowRequest, opts ...grpc.CallOption) (*VDiffShowResponse, error) // VTExplain provides information on how Vitess plans to execute a // particular query. VTExplain(ctx context.Context, in *VTExplainRequest, opts ...grpc.CallOption) (*VTExplainResponse, error) + // WorkflowDelete deletes a vreplication workflow. + WorkflowDelete(ctx context.Context, in *WorkflowDeleteRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowDeleteResponse, error) + // WorkflowSwitchTraffic switches traffic for a VReplication workflow. + WorkflowSwitchTraffic(ctx context.Context, in *WorkflowSwitchTrafficRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowSwitchTrafficResponse, error) } type vTAdminClient struct { @@ -236,6 +263,15 @@ func (c *vTAdminClient) CompleteSchemaMigration(ctx context.Context, in *Complet return out, nil } +func (c *vTAdminClient) ConcludeTransaction(ctx context.Context, in *ConcludeTransactionRequest, opts ...grpc.CallOption) (*vtctldata.ConcludeTransactionResponse, error) { + out := new(vtctldata.ConcludeTransactionResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/ConcludeTransaction", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vTAdminClient) CreateKeyspace(ctx context.Context, in *CreateKeyspaceRequest, opts ...grpc.CallOption) (*CreateKeyspaceResponse, error) { out := new(CreateKeyspaceResponse) err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/CreateKeyspace", in, out, opts...) @@ -470,6 +506,15 @@ func (c *vTAdminClient) GetTopologyPath(ctx context.Context, in *GetTopologyPath return out, nil } +func (c *vTAdminClient) GetUnresolvedTransactions(ctx context.Context, in *GetUnresolvedTransactionsRequest, opts ...grpc.CallOption) (*vtctldata.GetUnresolvedTransactionsResponse, error) { + out := new(vtctldata.GetUnresolvedTransactionsResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/GetUnresolvedTransactions", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vTAdminClient) GetVSchema(ctx context.Context, in *GetVSchemaRequest, opts ...grpc.CallOption) (*VSchema, error) { out := new(VSchema) err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/GetVSchema", in, out, opts...) @@ -515,6 +560,33 @@ func (c *vTAdminClient) GetWorkflows(ctx context.Context, in *GetWorkflowsReques return out, nil } +func (c *vTAdminClient) GetWorkflowStatus(ctx context.Context, in *GetWorkflowStatusRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowStatusResponse, error) { + out := new(vtctldata.WorkflowStatusResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/GetWorkflowStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *vTAdminClient) StartWorkflow(ctx context.Context, in *StartWorkflowRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowUpdateResponse, error) { + out := new(vtctldata.WorkflowUpdateResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/StartWorkflow", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *vTAdminClient) StopWorkflow(ctx context.Context, in *StopWorkflowRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowUpdateResponse, error) { + out := new(vtctldata.WorkflowUpdateResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/StopWorkflow", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vTAdminClient) LaunchSchemaMigration(ctx context.Context, in *LaunchSchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.LaunchSchemaMigrationResponse, error) { out := new(vtctldata.LaunchSchemaMigrationResponse) err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/LaunchSchemaMigration", in, out, opts...) @@ -524,6 +596,33 @@ func (c *vTAdminClient) LaunchSchemaMigration(ctx context.Context, in *LaunchSch return out, nil } +func (c *vTAdminClient) MoveTablesComplete(ctx context.Context, in *MoveTablesCompleteRequest, opts ...grpc.CallOption) (*vtctldata.MoveTablesCompleteResponse, error) { + out := new(vtctldata.MoveTablesCompleteResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/MoveTablesComplete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *vTAdminClient) MoveTablesCreate(ctx context.Context, in *MoveTablesCreateRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowStatusResponse, error) { + out := new(vtctldata.WorkflowStatusResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/MoveTablesCreate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *vTAdminClient) MaterializeCreate(ctx context.Context, in *MaterializeCreateRequest, opts ...grpc.CallOption) (*vtctldata.MaterializeCreateResponse, error) { + out := new(vtctldata.MaterializeCreateResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/MaterializeCreate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vTAdminClient) PingTablet(ctx context.Context, in *PingTabletRequest, opts ...grpc.CallOption) (*PingTabletResponse, error) { out := new(PingTabletResponse) err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/PingTablet", in, out, opts...) @@ -614,6 +713,15 @@ func (c *vTAdminClient) RunHealthCheck(ctx context.Context, in *RunHealthCheckRe return out, nil } +func (c *vTAdminClient) ReshardCreate(ctx context.Context, in *ReshardCreateRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowStatusResponse, error) { + out := new(vtctldata.WorkflowStatusResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/ReshardCreate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vTAdminClient) SetReadOnly(ctx context.Context, in *SetReadOnlyRequest, opts ...grpc.CallOption) (*SetReadOnlyResponse, error) { out := new(SetReadOnlyResponse) err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/SetReadOnly", in, out, opts...) @@ -713,6 +821,24 @@ func (c *vTAdminClient) ValidateVersionShard(ctx context.Context, in *ValidateVe return out, nil } +func (c *vTAdminClient) VDiffCreate(ctx context.Context, in *VDiffCreateRequest, opts ...grpc.CallOption) (*vtctldata.VDiffCreateResponse, error) { + out := new(vtctldata.VDiffCreateResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/VDiffCreate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *vTAdminClient) VDiffShow(ctx context.Context, in *VDiffShowRequest, opts ...grpc.CallOption) (*VDiffShowResponse, error) { + out := new(VDiffShowResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/VDiffShow", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vTAdminClient) VTExplain(ctx context.Context, in *VTExplainRequest, opts ...grpc.CallOption) (*VTExplainResponse, error) { out := new(VTExplainResponse) err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/VTExplain", in, out, opts...) @@ -722,6 +848,24 @@ func (c *vTAdminClient) VTExplain(ctx context.Context, in *VTExplainRequest, opt return out, nil } +func (c *vTAdminClient) WorkflowDelete(ctx context.Context, in *WorkflowDeleteRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowDeleteResponse, error) { + out := new(vtctldata.WorkflowDeleteResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/WorkflowDelete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *vTAdminClient) WorkflowSwitchTraffic(ctx context.Context, in *WorkflowSwitchTrafficRequest, opts ...grpc.CallOption) (*vtctldata.WorkflowSwitchTrafficResponse, error) { + out := new(vtctldata.WorkflowSwitchTrafficResponse) + err := c.cc.Invoke(ctx, "/vtadmin.VTAdmin/WorkflowSwitchTraffic", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // VTAdminServer is the server API for VTAdmin service. // All implementations must embed UnimplementedVTAdminServer // for forward compatibility @@ -737,6 +881,8 @@ type VTAdminServer interface { // CompleteSchemaMigration completes one or all migrations in the given // cluster executed with --postpone-completion. CompleteSchemaMigration(context.Context, *CompleteSchemaMigrationRequest) (*vtctldata.CompleteSchemaMigrationResponse, error) + // ConcludeTransaction concludes a distributed transaction identified by the provided dtid. + ConcludeTransaction(context.Context, *ConcludeTransactionRequest) (*vtctldata.ConcludeTransactionResponse, error) // CreateKeyspace creates a new keyspace in the given cluster. CreateKeyspace(context.Context, *CreateKeyspaceRequest) (*CreateKeyspaceResponse, error) // CreateShard creates a new shard in the given cluster and keyspace. @@ -807,6 +953,8 @@ type VTAdminServer interface { GetTablets(context.Context, *GetTabletsRequest) (*GetTabletsResponse, error) // GetTopologyPath returns the cell located at the specified path in the topology server. GetTopologyPath(context.Context, *GetTopologyPathRequest) (*vtctldata.GetTopologyPathResponse, error) + // GetUnresolvedTransactions returns the unresolved transactions for the request. + GetUnresolvedTransactions(context.Context, *GetUnresolvedTransactionsRequest) (*vtctldata.GetUnresolvedTransactionsResponse, error) // GetVSchema returns a VSchema for the specified keyspace in the specified // cluster. GetVSchema(context.Context, *GetVSchemaRequest) (*VSchema, error) @@ -819,9 +967,24 @@ type VTAdminServer interface { GetWorkflow(context.Context, *GetWorkflowRequest) (*Workflow, error) // GetWorkflows returns the Workflows for all specified clusters. GetWorkflows(context.Context, *GetWorkflowsRequest) (*GetWorkflowsResponse, error) + // GetWorkflowStatus returns the status for a specific workflow. + GetWorkflowStatus(context.Context, *GetWorkflowStatusRequest) (*vtctldata.WorkflowStatusResponse, error) + // StartWorkflow starts a vreplication workflow. + StartWorkflow(context.Context, *StartWorkflowRequest) (*vtctldata.WorkflowUpdateResponse, error) + // StopWorkflow stops a vreplication workflow. + StopWorkflow(context.Context, *StopWorkflowRequest) (*vtctldata.WorkflowUpdateResponse, error) // LaunchSchemaMigration launches one or all migrations in the given // cluster executed with --postpone-launch. LaunchSchemaMigration(context.Context, *LaunchSchemaMigrationRequest) (*vtctldata.LaunchSchemaMigrationResponse, error) + // MoveTablesComplete completes the move and cleans up the workflow and + // its related artifacts. + MoveTablesComplete(context.Context, *MoveTablesCompleteRequest) (*vtctldata.MoveTablesCompleteResponse, error) + // MoveTablesCreate creates a workflow which moves one or more tables from a + // source keyspace to a target keyspace. + MoveTablesCreate(context.Context, *MoveTablesCreateRequest) (*vtctldata.WorkflowStatusResponse, error) + // MaterializeCreate creates a workflow to materialize one or more tables + // from a source keyspace to a target keyspace using a provided expressions. + MaterializeCreate(context.Context, *MaterializeCreateRequest) (*vtctldata.MaterializeCreateResponse, error) // PingTablet checks that the specified tablet is awake and responding to // RPCs. This command can be blocked by other in-flight operations. PingTablet(context.Context, *PingTabletRequest) (*PingTabletResponse, error) @@ -853,6 +1016,8 @@ type VTAdminServer interface { RetrySchemaMigration(context.Context, *RetrySchemaMigrationRequest) (*vtctldata.RetrySchemaMigrationResponse, error) // RunHealthCheck runs a healthcheck on the tablet. RunHealthCheck(context.Context, *RunHealthCheckRequest) (*RunHealthCheckResponse, error) + // ReshardCreate creates a workflow to reshard a keyspace. + ReshardCreate(context.Context, *ReshardCreateRequest) (*vtctldata.WorkflowStatusResponse, error) // SetReadOnly sets the tablet to read-only mode. SetReadOnly(context.Context, *SetReadOnlyRequest) (*SetReadOnlyResponse, error) // SetReadWrite sets the tablet to read-write mode. @@ -890,9 +1055,15 @@ type VTAdminServer interface { ValidateVersionKeyspace(context.Context, *ValidateVersionKeyspaceRequest) (*vtctldata.ValidateVersionKeyspaceResponse, error) // ValidateVersionShard validates that the version on the primary matches all of the replicas. ValidateVersionShard(context.Context, *ValidateVersionShardRequest) (*vtctldata.ValidateVersionShardResponse, error) + VDiffCreate(context.Context, *VDiffCreateRequest) (*vtctldata.VDiffCreateResponse, error) + VDiffShow(context.Context, *VDiffShowRequest) (*VDiffShowResponse, error) // VTExplain provides information on how Vitess plans to execute a // particular query. VTExplain(context.Context, *VTExplainRequest) (*VTExplainResponse, error) + // WorkflowDelete deletes a vreplication workflow. + WorkflowDelete(context.Context, *WorkflowDeleteRequest) (*vtctldata.WorkflowDeleteResponse, error) + // WorkflowSwitchTraffic switches traffic for a VReplication workflow. + WorkflowSwitchTraffic(context.Context, *WorkflowSwitchTrafficRequest) (*vtctldata.WorkflowSwitchTrafficResponse, error) mustEmbedUnimplementedVTAdminServer() } @@ -912,6 +1083,9 @@ func (UnimplementedVTAdminServer) CleanupSchemaMigration(context.Context, *Clean func (UnimplementedVTAdminServer) CompleteSchemaMigration(context.Context, *CompleteSchemaMigrationRequest) (*vtctldata.CompleteSchemaMigrationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CompleteSchemaMigration not implemented") } +func (UnimplementedVTAdminServer) ConcludeTransaction(context.Context, *ConcludeTransactionRequest) (*vtctldata.ConcludeTransactionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ConcludeTransaction not implemented") +} func (UnimplementedVTAdminServer) CreateKeyspace(context.Context, *CreateKeyspaceRequest) (*CreateKeyspaceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateKeyspace not implemented") } @@ -990,6 +1164,9 @@ func (UnimplementedVTAdminServer) GetTablets(context.Context, *GetTabletsRequest func (UnimplementedVTAdminServer) GetTopologyPath(context.Context, *GetTopologyPathRequest) (*vtctldata.GetTopologyPathResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTopologyPath not implemented") } +func (UnimplementedVTAdminServer) GetUnresolvedTransactions(context.Context, *GetUnresolvedTransactionsRequest) (*vtctldata.GetUnresolvedTransactionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUnresolvedTransactions not implemented") +} func (UnimplementedVTAdminServer) GetVSchema(context.Context, *GetVSchemaRequest) (*VSchema, error) { return nil, status.Errorf(codes.Unimplemented, "method GetVSchema not implemented") } @@ -1005,9 +1182,27 @@ func (UnimplementedVTAdminServer) GetWorkflow(context.Context, *GetWorkflowReque func (UnimplementedVTAdminServer) GetWorkflows(context.Context, *GetWorkflowsRequest) (*GetWorkflowsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetWorkflows not implemented") } +func (UnimplementedVTAdminServer) GetWorkflowStatus(context.Context, *GetWorkflowStatusRequest) (*vtctldata.WorkflowStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowStatus not implemented") +} +func (UnimplementedVTAdminServer) StartWorkflow(context.Context, *StartWorkflowRequest) (*vtctldata.WorkflowUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartWorkflow not implemented") +} +func (UnimplementedVTAdminServer) StopWorkflow(context.Context, *StopWorkflowRequest) (*vtctldata.WorkflowUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StopWorkflow not implemented") +} func (UnimplementedVTAdminServer) LaunchSchemaMigration(context.Context, *LaunchSchemaMigrationRequest) (*vtctldata.LaunchSchemaMigrationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LaunchSchemaMigration not implemented") } +func (UnimplementedVTAdminServer) MoveTablesComplete(context.Context, *MoveTablesCompleteRequest) (*vtctldata.MoveTablesCompleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MoveTablesComplete not implemented") +} +func (UnimplementedVTAdminServer) MoveTablesCreate(context.Context, *MoveTablesCreateRequest) (*vtctldata.WorkflowStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MoveTablesCreate not implemented") +} +func (UnimplementedVTAdminServer) MaterializeCreate(context.Context, *MaterializeCreateRequest) (*vtctldata.MaterializeCreateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MaterializeCreate not implemented") +} func (UnimplementedVTAdminServer) PingTablet(context.Context, *PingTabletRequest) (*PingTabletResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PingTablet not implemented") } @@ -1038,6 +1233,9 @@ func (UnimplementedVTAdminServer) RetrySchemaMigration(context.Context, *RetrySc func (UnimplementedVTAdminServer) RunHealthCheck(context.Context, *RunHealthCheckRequest) (*RunHealthCheckResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RunHealthCheck not implemented") } +func (UnimplementedVTAdminServer) ReshardCreate(context.Context, *ReshardCreateRequest) (*vtctldata.WorkflowStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReshardCreate not implemented") +} func (UnimplementedVTAdminServer) SetReadOnly(context.Context, *SetReadOnlyRequest) (*SetReadOnlyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SetReadOnly not implemented") } @@ -1071,9 +1269,21 @@ func (UnimplementedVTAdminServer) ValidateVersionKeyspace(context.Context, *Vali func (UnimplementedVTAdminServer) ValidateVersionShard(context.Context, *ValidateVersionShardRequest) (*vtctldata.ValidateVersionShardResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidateVersionShard not implemented") } +func (UnimplementedVTAdminServer) VDiffCreate(context.Context, *VDiffCreateRequest) (*vtctldata.VDiffCreateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VDiffCreate not implemented") +} +func (UnimplementedVTAdminServer) VDiffShow(context.Context, *VDiffShowRequest) (*VDiffShowResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VDiffShow not implemented") +} func (UnimplementedVTAdminServer) VTExplain(context.Context, *VTExplainRequest) (*VTExplainResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VTExplain not implemented") } +func (UnimplementedVTAdminServer) WorkflowDelete(context.Context, *WorkflowDeleteRequest) (*vtctldata.WorkflowDeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method WorkflowDelete not implemented") +} +func (UnimplementedVTAdminServer) WorkflowSwitchTraffic(context.Context, *WorkflowSwitchTrafficRequest) (*vtctldata.WorkflowSwitchTrafficResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method WorkflowSwitchTraffic not implemented") +} func (UnimplementedVTAdminServer) mustEmbedUnimplementedVTAdminServer() {} // UnsafeVTAdminServer may be embedded to opt out of forward compatibility for this service. @@ -1159,6 +1369,24 @@ func _VTAdmin_CompleteSchemaMigration_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _VTAdmin_ConcludeTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ConcludeTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).ConcludeTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/ConcludeTransaction", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).ConcludeTransaction(ctx, req.(*ConcludeTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _VTAdmin_CreateKeyspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateKeyspaceRequest) if err := dec(in); err != nil { @@ -1627,6 +1855,24 @@ func _VTAdmin_GetTopologyPath_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _VTAdmin_GetUnresolvedTransactions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetUnresolvedTransactionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).GetUnresolvedTransactions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/GetUnresolvedTransactions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).GetUnresolvedTransactions(ctx, req.(*GetUnresolvedTransactionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _VTAdmin_GetVSchema_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetVSchemaRequest) if err := dec(in); err != nil { @@ -1717,6 +1963,60 @@ func _VTAdmin_GetWorkflows_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _VTAdmin_GetWorkflowStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkflowStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).GetWorkflowStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/GetWorkflowStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).GetWorkflowStatus(ctx, req.(*GetWorkflowStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _VTAdmin_StartWorkflow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StartWorkflowRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).StartWorkflow(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/StartWorkflow", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).StartWorkflow(ctx, req.(*StartWorkflowRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _VTAdmin_StopWorkflow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StopWorkflowRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).StopWorkflow(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/StopWorkflow", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).StopWorkflow(ctx, req.(*StopWorkflowRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _VTAdmin_LaunchSchemaMigration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(LaunchSchemaMigrationRequest) if err := dec(in); err != nil { @@ -1735,6 +2035,60 @@ func _VTAdmin_LaunchSchemaMigration_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _VTAdmin_MoveTablesComplete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MoveTablesCompleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).MoveTablesComplete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/MoveTablesComplete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).MoveTablesComplete(ctx, req.(*MoveTablesCompleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _VTAdmin_MoveTablesCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MoveTablesCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).MoveTablesCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/MoveTablesCreate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).MoveTablesCreate(ctx, req.(*MoveTablesCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _VTAdmin_MaterializeCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MaterializeCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).MaterializeCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/MaterializeCreate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).MaterializeCreate(ctx, req.(*MaterializeCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _VTAdmin_PingTablet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PingTabletRequest) if err := dec(in); err != nil { @@ -1915,6 +2269,24 @@ func _VTAdmin_RunHealthCheck_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _VTAdmin_ReshardCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReshardCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).ReshardCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/ReshardCreate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).ReshardCreate(ctx, req.(*ReshardCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _VTAdmin_SetReadOnly_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SetReadOnlyRequest) if err := dec(in); err != nil { @@ -2113,6 +2485,42 @@ func _VTAdmin_ValidateVersionShard_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _VTAdmin_VDiffCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(VDiffCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).VDiffCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/VDiffCreate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).VDiffCreate(ctx, req.(*VDiffCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _VTAdmin_VDiffShow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(VDiffShowRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).VDiffShow(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/VDiffShow", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).VDiffShow(ctx, req.(*VDiffShowRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _VTAdmin_VTExplain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(VTExplainRequest) if err := dec(in); err != nil { @@ -2131,6 +2539,42 @@ func _VTAdmin_VTExplain_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _VTAdmin_WorkflowDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WorkflowDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).WorkflowDelete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/WorkflowDelete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).WorkflowDelete(ctx, req.(*WorkflowDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _VTAdmin_WorkflowSwitchTraffic_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WorkflowSwitchTrafficRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VTAdminServer).WorkflowSwitchTraffic(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtadmin.VTAdmin/WorkflowSwitchTraffic", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VTAdminServer).WorkflowSwitchTraffic(ctx, req.(*WorkflowSwitchTrafficRequest)) + } + return interceptor(ctx, in, info, handler) +} + // VTAdmin_ServiceDesc is the grpc.ServiceDesc for VTAdmin service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -2154,6 +2598,10 @@ var VTAdmin_ServiceDesc = grpc.ServiceDesc{ MethodName: "CompleteSchemaMigration", Handler: _VTAdmin_CompleteSchemaMigration_Handler, }, + { + MethodName: "ConcludeTransaction", + Handler: _VTAdmin_ConcludeTransaction_Handler, + }, { MethodName: "CreateKeyspace", Handler: _VTAdmin_CreateKeyspace_Handler, @@ -2258,6 +2706,10 @@ var VTAdmin_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetTopologyPath", Handler: _VTAdmin_GetTopologyPath_Handler, }, + { + MethodName: "GetUnresolvedTransactions", + Handler: _VTAdmin_GetUnresolvedTransactions_Handler, + }, { MethodName: "GetVSchema", Handler: _VTAdmin_GetVSchema_Handler, @@ -2278,10 +2730,34 @@ var VTAdmin_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetWorkflows", Handler: _VTAdmin_GetWorkflows_Handler, }, + { + MethodName: "GetWorkflowStatus", + Handler: _VTAdmin_GetWorkflowStatus_Handler, + }, + { + MethodName: "StartWorkflow", + Handler: _VTAdmin_StartWorkflow_Handler, + }, + { + MethodName: "StopWorkflow", + Handler: _VTAdmin_StopWorkflow_Handler, + }, { MethodName: "LaunchSchemaMigration", Handler: _VTAdmin_LaunchSchemaMigration_Handler, }, + { + MethodName: "MoveTablesComplete", + Handler: _VTAdmin_MoveTablesComplete_Handler, + }, + { + MethodName: "MoveTablesCreate", + Handler: _VTAdmin_MoveTablesCreate_Handler, + }, + { + MethodName: "MaterializeCreate", + Handler: _VTAdmin_MaterializeCreate_Handler, + }, { MethodName: "PingTablet", Handler: _VTAdmin_PingTablet_Handler, @@ -2322,6 +2798,10 @@ var VTAdmin_ServiceDesc = grpc.ServiceDesc{ MethodName: "RunHealthCheck", Handler: _VTAdmin_RunHealthCheck_Handler, }, + { + MethodName: "ReshardCreate", + Handler: _VTAdmin_ReshardCreate_Handler, + }, { MethodName: "SetReadOnly", Handler: _VTAdmin_SetReadOnly_Handler, @@ -2366,10 +2846,26 @@ var VTAdmin_ServiceDesc = grpc.ServiceDesc{ MethodName: "ValidateVersionShard", Handler: _VTAdmin_ValidateVersionShard_Handler, }, + { + MethodName: "VDiffCreate", + Handler: _VTAdmin_VDiffCreate_Handler, + }, + { + MethodName: "VDiffShow", + Handler: _VTAdmin_VDiffShow_Handler, + }, { MethodName: "VTExplain", Handler: _VTAdmin_VTExplain_Handler, }, + { + MethodName: "WorkflowDelete", + Handler: _VTAdmin_WorkflowDelete_Handler, + }, + { + MethodName: "WorkflowSwitchTraffic", + Handler: _VTAdmin_WorkflowSwitchTraffic_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "vtadmin.proto", diff --git a/go/vt/proto/vtadmin/vtadmin_vtproto.pb.go b/go/vt/proto/vtadmin/vtadmin_vtproto.pb.go index ce506cb7215..16ac8c4fbd5 100644 --- a/go/vt/proto/vtadmin/vtadmin_vtproto.pb.go +++ b/go/vt/proto/vtadmin/vtadmin_vtproto.pb.go @@ -1,15 +1,17 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: vtadmin.proto package vtadmin import ( + binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" - bits "math/bits" + math "math" logutil "vitess.io/vitess/go/vt/proto/logutil" mysqlctl "vitess.io/vitess/go/vt/proto/mysqlctl" tabletmanagerdata "vitess.io/vitess/go/vt/proto/tabletmanagerdata" @@ -29,10 +31,9 @@ func (m *Cluster) CloneVT() *Cluster { if m == nil { return (*Cluster)(nil) } - r := &Cluster{ - Id: m.Id, - Name: m.Name, - } + r := new(Cluster) + r.Id = m.Id + r.Name = m.Name if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -48,10 +49,9 @@ func (m *ClusterBackup) CloneVT() *ClusterBackup { if m == nil { return (*ClusterBackup)(nil) } - r := &ClusterBackup{ - Cluster: m.Cluster.CloneVT(), - Backup: m.Backup.CloneVT(), - } + r := new(ClusterBackup) + r.Cluster = m.Cluster.CloneVT() + r.Backup = m.Backup.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -67,9 +67,8 @@ func (m *ClusterCellsAliases) CloneVT() *ClusterCellsAliases { if m == nil { return (*ClusterCellsAliases)(nil) } - r := &ClusterCellsAliases{ - Cluster: m.Cluster.CloneVT(), - } + r := new(ClusterCellsAliases) + r.Cluster = m.Cluster.CloneVT() if rhs := m.Aliases; rhs != nil { tmpContainer := make(map[string]*topodata.CellsAlias, len(rhs)) for k, v := range rhs { @@ -92,11 +91,10 @@ func (m *ClusterCellInfo) CloneVT() *ClusterCellInfo { if m == nil { return (*ClusterCellInfo)(nil) } - r := &ClusterCellInfo{ - Cluster: m.Cluster.CloneVT(), - Name: m.Name, - CellInfo: m.CellInfo.CloneVT(), - } + r := new(ClusterCellInfo) + r.Cluster = m.Cluster.CloneVT() + r.Name = m.Name + r.CellInfo = m.CellInfo.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -112,12 +110,11 @@ func (m *ClusterShardReplicationPosition) CloneVT() *ClusterShardReplicationPosi if m == nil { return (*ClusterShardReplicationPosition)(nil) } - r := &ClusterShardReplicationPosition{ - Cluster: m.Cluster.CloneVT(), - Keyspace: m.Keyspace, - Shard: m.Shard, - PositionInfo: m.PositionInfo.CloneVT(), - } + r := new(ClusterShardReplicationPosition) + r.Cluster = m.Cluster.CloneVT() + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.PositionInfo = m.PositionInfo.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -133,7 +130,7 @@ func (m *ClusterWorkflows) CloneVT() *ClusterWorkflows { if m == nil { return (*ClusterWorkflows)(nil) } - r := &ClusterWorkflows{} + r := new(ClusterWorkflows) if rhs := m.Workflows; rhs != nil { tmpContainer := make([]*Workflow, len(rhs)) for k, v := range rhs { @@ -161,10 +158,9 @@ func (m *Keyspace) CloneVT() *Keyspace { if m == nil { return (*Keyspace)(nil) } - r := &Keyspace{ - Cluster: m.Cluster.CloneVT(), - Keyspace: m.Keyspace.CloneVT(), - } + r := new(Keyspace) + r.Cluster = m.Cluster.CloneVT() + r.Keyspace = m.Keyspace.CloneVT() if rhs := m.Shards; rhs != nil { tmpContainer := make(map[string]*vtctldata.Shard, len(rhs)) for k, v := range rhs { @@ -187,10 +183,9 @@ func (m *Schema_ShardTableSize) CloneVT() *Schema_ShardTableSize { if m == nil { return (*Schema_ShardTableSize)(nil) } - r := &Schema_ShardTableSize{ - RowCount: m.RowCount, - DataLength: m.DataLength, - } + r := new(Schema_ShardTableSize) + r.RowCount = m.RowCount + r.DataLength = m.DataLength if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -206,10 +201,9 @@ func (m *Schema_TableSize) CloneVT() *Schema_TableSize { if m == nil { return (*Schema_TableSize)(nil) } - r := &Schema_TableSize{ - RowCount: m.RowCount, - DataLength: m.DataLength, - } + r := new(Schema_TableSize) + r.RowCount = m.RowCount + r.DataLength = m.DataLength if rhs := m.ByShard; rhs != nil { tmpContainer := make(map[string]*Schema_ShardTableSize, len(rhs)) for k, v := range rhs { @@ -232,10 +226,9 @@ func (m *Schema) CloneVT() *Schema { if m == nil { return (*Schema)(nil) } - r := &Schema{ - Cluster: m.Cluster.CloneVT(), - Keyspace: m.Keyspace, - } + r := new(Schema) + r.Cluster = m.Cluster.CloneVT() + r.Keyspace = m.Keyspace if rhs := m.TableDefinitions; rhs != nil { tmpContainer := make([]*tabletmanagerdata.TableDefinition, len(rhs)) for k, v := range rhs { @@ -265,10 +258,9 @@ func (m *SchemaMigration) CloneVT() *SchemaMigration { if m == nil { return (*SchemaMigration)(nil) } - r := &SchemaMigration{ - Cluster: m.Cluster.CloneVT(), - SchemaMigration: m.SchemaMigration.CloneVT(), - } + r := new(SchemaMigration) + r.Cluster = m.Cluster.CloneVT() + r.SchemaMigration = m.SchemaMigration.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -284,10 +276,9 @@ func (m *Shard) CloneVT() *Shard { if m == nil { return (*Shard)(nil) } - r := &Shard{ - Cluster: m.Cluster.CloneVT(), - Shard: m.Shard.CloneVT(), - } + r := new(Shard) + r.Cluster = m.Cluster.CloneVT() + r.Shard = m.Shard.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -303,11 +294,10 @@ func (m *SrvVSchema) CloneVT() *SrvVSchema { if m == nil { return (*SrvVSchema)(nil) } - r := &SrvVSchema{ - Cell: m.Cell, - Cluster: m.Cluster.CloneVT(), - SrvVSchema: m.SrvVSchema.CloneVT(), - } + r := new(SrvVSchema) + r.Cell = m.Cell + r.Cluster = m.Cluster.CloneVT() + r.SrvVSchema = m.SrvVSchema.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -323,12 +313,11 @@ func (m *Tablet) CloneVT() *Tablet { if m == nil { return (*Tablet)(nil) } - r := &Tablet{ - Cluster: m.Cluster.CloneVT(), - Tablet: m.Tablet.CloneVT(), - State: m.State, - FQDN: m.FQDN, - } + r := new(Tablet) + r.Cluster = m.Cluster.CloneVT() + r.Tablet = m.Tablet.CloneVT() + r.State = m.State + r.FQDN = m.FQDN if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -344,11 +333,10 @@ func (m *VSchema) CloneVT() *VSchema { if m == nil { return (*VSchema)(nil) } - r := &VSchema{ - Cluster: m.Cluster.CloneVT(), - Name: m.Name, - VSchema: m.VSchema.CloneVT(), - } + r := new(VSchema) + r.Cluster = m.Cluster.CloneVT() + r.Name = m.Name + r.VSchema = m.VSchema.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -364,11 +352,10 @@ func (m *Vtctld) CloneVT() *Vtctld { if m == nil { return (*Vtctld)(nil) } - r := &Vtctld{ - Hostname: m.Hostname, - Cluster: m.Cluster.CloneVT(), - FQDN: m.FQDN, - } + r := new(Vtctld) + r.Hostname = m.Hostname + r.Cluster = m.Cluster.CloneVT() + r.FQDN = m.FQDN if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -384,13 +371,12 @@ func (m *VTGate) CloneVT() *VTGate { if m == nil { return (*VTGate)(nil) } - r := &VTGate{ - Hostname: m.Hostname, - Pool: m.Pool, - Cell: m.Cell, - Cluster: m.Cluster.CloneVT(), - FQDN: m.FQDN, - } + r := new(VTGate) + r.Hostname = m.Hostname + r.Pool = m.Pool + r.Cell = m.Cell + r.Cluster = m.Cluster.CloneVT() + r.FQDN = m.FQDN if rhs := m.Keyspaces; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -411,11 +397,10 @@ func (m *Workflow) CloneVT() *Workflow { if m == nil { return (*Workflow)(nil) } - r := &Workflow{ - Cluster: m.Cluster.CloneVT(), - Keyspace: m.Keyspace, - Workflow: m.Workflow.CloneVT(), - } + r := new(Workflow) + r.Cluster = m.Cluster.CloneVT() + r.Keyspace = m.Keyspace + r.Workflow = m.Workflow.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -427,14 +412,49 @@ func (m *Workflow) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *WorkflowDeleteRequest) CloneVT() *WorkflowDeleteRequest { + if m == nil { + return (*WorkflowDeleteRequest)(nil) + } + r := new(WorkflowDeleteRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *WorkflowDeleteRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *WorkflowSwitchTrafficRequest) CloneVT() *WorkflowSwitchTrafficRequest { + if m == nil { + return (*WorkflowSwitchTrafficRequest)(nil) + } + r := new(WorkflowSwitchTrafficRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *WorkflowSwitchTrafficRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *ApplySchemaRequest) CloneVT() *ApplySchemaRequest { if m == nil { return (*ApplySchemaRequest)(nil) } - r := &ApplySchemaRequest{ - ClusterId: m.ClusterId, - Request: m.Request.CloneVT(), - } + r := new(ApplySchemaRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -450,10 +470,9 @@ func (m *CancelSchemaMigrationRequest) CloneVT() *CancelSchemaMigrationRequest { if m == nil { return (*CancelSchemaMigrationRequest)(nil) } - r := &CancelSchemaMigrationRequest{ - ClusterId: m.ClusterId, - Request: m.Request.CloneVT(), - } + r := new(CancelSchemaMigrationRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -469,10 +488,9 @@ func (m *CleanupSchemaMigrationRequest) CloneVT() *CleanupSchemaMigrationRequest if m == nil { return (*CleanupSchemaMigrationRequest)(nil) } - r := &CleanupSchemaMigrationRequest{ - ClusterId: m.ClusterId, - Request: m.Request.CloneVT(), - } + r := new(CleanupSchemaMigrationRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -488,10 +506,9 @@ func (m *CompleteSchemaMigrationRequest) CloneVT() *CompleteSchemaMigrationReque if m == nil { return (*CompleteSchemaMigrationRequest)(nil) } - r := &CompleteSchemaMigrationRequest{ - ClusterId: m.ClusterId, - Request: m.Request.CloneVT(), - } + r := new(CompleteSchemaMigrationRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -503,14 +520,31 @@ func (m *CompleteSchemaMigrationRequest) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *ConcludeTransactionRequest) CloneVT() *ConcludeTransactionRequest { + if m == nil { + return (*ConcludeTransactionRequest)(nil) + } + r := new(ConcludeTransactionRequest) + r.ClusterId = m.ClusterId + r.Dtid = m.Dtid + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ConcludeTransactionRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *CreateKeyspaceRequest) CloneVT() *CreateKeyspaceRequest { if m == nil { return (*CreateKeyspaceRequest)(nil) } - r := &CreateKeyspaceRequest{ - ClusterId: m.ClusterId, - Options: m.Options.CloneVT(), - } + r := new(CreateKeyspaceRequest) + r.ClusterId = m.ClusterId + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -526,9 +560,8 @@ func (m *CreateKeyspaceResponse) CloneVT() *CreateKeyspaceResponse { if m == nil { return (*CreateKeyspaceResponse)(nil) } - r := &CreateKeyspaceResponse{ - Keyspace: m.Keyspace.CloneVT(), - } + r := new(CreateKeyspaceResponse) + r.Keyspace = m.Keyspace.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -544,10 +577,9 @@ func (m *CreateShardRequest) CloneVT() *CreateShardRequest { if m == nil { return (*CreateShardRequest)(nil) } - r := &CreateShardRequest{ - ClusterId: m.ClusterId, - Options: m.Options.CloneVT(), - } + r := new(CreateShardRequest) + r.ClusterId = m.ClusterId + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -563,10 +595,9 @@ func (m *DeleteKeyspaceRequest) CloneVT() *DeleteKeyspaceRequest { if m == nil { return (*DeleteKeyspaceRequest)(nil) } - r := &DeleteKeyspaceRequest{ - ClusterId: m.ClusterId, - Options: m.Options.CloneVT(), - } + r := new(DeleteKeyspaceRequest) + r.ClusterId = m.ClusterId + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -582,10 +613,9 @@ func (m *DeleteShardsRequest) CloneVT() *DeleteShardsRequest { if m == nil { return (*DeleteShardsRequest)(nil) } - r := &DeleteShardsRequest{ - ClusterId: m.ClusterId, - Options: m.Options.CloneVT(), - } + r := new(DeleteShardsRequest) + r.ClusterId = m.ClusterId + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -601,10 +631,9 @@ func (m *DeleteTabletRequest) CloneVT() *DeleteTabletRequest { if m == nil { return (*DeleteTabletRequest)(nil) } - r := &DeleteTabletRequest{ - Alias: m.Alias.CloneVT(), - AllowPrimary: m.AllowPrimary, - } + r := new(DeleteTabletRequest) + r.Alias = m.Alias.CloneVT() + r.AllowPrimary = m.AllowPrimary if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -625,10 +654,9 @@ func (m *DeleteTabletResponse) CloneVT() *DeleteTabletResponse { if m == nil { return (*DeleteTabletResponse)(nil) } - r := &DeleteTabletResponse{ - Status: m.Status, - Cluster: m.Cluster.CloneVT(), - } + r := new(DeleteTabletResponse) + r.Status = m.Status + r.Cluster = m.Cluster.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -644,10 +672,9 @@ func (m *EmergencyFailoverShardRequest) CloneVT() *EmergencyFailoverShardRequest if m == nil { return (*EmergencyFailoverShardRequest)(nil) } - r := &EmergencyFailoverShardRequest{ - ClusterId: m.ClusterId, - Options: m.Options.CloneVT(), - } + r := new(EmergencyFailoverShardRequest) + r.ClusterId = m.ClusterId + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -663,12 +690,11 @@ func (m *EmergencyFailoverShardResponse) CloneVT() *EmergencyFailoverShardRespon if m == nil { return (*EmergencyFailoverShardResponse)(nil) } - r := &EmergencyFailoverShardResponse{ - Cluster: m.Cluster.CloneVT(), - Keyspace: m.Keyspace, - Shard: m.Shard, - PromotedPrimary: m.PromotedPrimary.CloneVT(), - } + r := new(EmergencyFailoverShardResponse) + r.Cluster = m.Cluster.CloneVT() + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.PromotedPrimary = m.PromotedPrimary.CloneVT() if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -691,10 +717,9 @@ func (m *FindSchemaRequest) CloneVT() *FindSchemaRequest { if m == nil { return (*FindSchemaRequest)(nil) } - r := &FindSchemaRequest{ - Table: m.Table, - TableSizeOptions: m.TableSizeOptions.CloneVT(), - } + r := new(FindSchemaRequest) + r.Table = m.Table + r.TableSizeOptions = m.TableSizeOptions.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -715,9 +740,8 @@ func (m *GetBackupsRequest) CloneVT() *GetBackupsRequest { if m == nil { return (*GetBackupsRequest)(nil) } - r := &GetBackupsRequest{ - RequestOptions: m.RequestOptions.CloneVT(), - } + r := new(GetBackupsRequest) + r.RequestOptions = m.RequestOptions.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -748,7 +772,7 @@ func (m *GetBackupsResponse) CloneVT() *GetBackupsResponse { if m == nil { return (*GetBackupsResponse)(nil) } - r := &GetBackupsResponse{} + r := new(GetBackupsResponse) if rhs := m.Backups; rhs != nil { tmpContainer := make([]*ClusterBackup, len(rhs)) for k, v := range rhs { @@ -771,9 +795,8 @@ func (m *GetCellInfosRequest) CloneVT() *GetCellInfosRequest { if m == nil { return (*GetCellInfosRequest)(nil) } - r := &GetCellInfosRequest{ - NamesOnly: m.NamesOnly, - } + r := new(GetCellInfosRequest) + r.NamesOnly = m.NamesOnly if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -799,7 +822,7 @@ func (m *GetCellInfosResponse) CloneVT() *GetCellInfosResponse { if m == nil { return (*GetCellInfosResponse)(nil) } - r := &GetCellInfosResponse{} + r := new(GetCellInfosResponse) if rhs := m.CellInfos; rhs != nil { tmpContainer := make([]*ClusterCellInfo, len(rhs)) for k, v := range rhs { @@ -822,7 +845,7 @@ func (m *GetCellsAliasesRequest) CloneVT() *GetCellsAliasesRequest { if m == nil { return (*GetCellsAliasesRequest)(nil) } - r := &GetCellsAliasesRequest{} + r := new(GetCellsAliasesRequest) if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -843,7 +866,7 @@ func (m *GetCellsAliasesResponse) CloneVT() *GetCellsAliasesResponse { if m == nil { return (*GetCellsAliasesResponse)(nil) } - r := &GetCellsAliasesResponse{} + r := new(GetCellsAliasesResponse) if rhs := m.Aliases; rhs != nil { tmpContainer := make([]*ClusterCellsAliases, len(rhs)) for k, v := range rhs { @@ -866,7 +889,7 @@ func (m *GetClustersRequest) CloneVT() *GetClustersRequest { if m == nil { return (*GetClustersRequest)(nil) } - r := &GetClustersRequest{} + r := new(GetClustersRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -882,7 +905,7 @@ func (m *GetClustersResponse) CloneVT() *GetClustersResponse { if m == nil { return (*GetClustersResponse)(nil) } - r := &GetClustersResponse{} + r := new(GetClustersResponse) if rhs := m.Clusters; rhs != nil { tmpContainer := make([]*Cluster, len(rhs)) for k, v := range rhs { @@ -905,10 +928,9 @@ func (m *GetFullStatusRequest) CloneVT() *GetFullStatusRequest { if m == nil { return (*GetFullStatusRequest)(nil) } - r := &GetFullStatusRequest{ - ClusterId: m.ClusterId, - Alias: m.Alias.CloneVT(), - } + r := new(GetFullStatusRequest) + r.ClusterId = m.ClusterId + r.Alias = m.Alias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -924,7 +946,7 @@ func (m *GetGatesRequest) CloneVT() *GetGatesRequest { if m == nil { return (*GetGatesRequest)(nil) } - r := &GetGatesRequest{} + r := new(GetGatesRequest) if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -945,7 +967,7 @@ func (m *GetGatesResponse) CloneVT() *GetGatesResponse { if m == nil { return (*GetGatesResponse)(nil) } - r := &GetGatesResponse{} + r := new(GetGatesResponse) if rhs := m.Gates; rhs != nil { tmpContainer := make([]*VTGate, len(rhs)) for k, v := range rhs { @@ -968,10 +990,9 @@ func (m *GetKeyspaceRequest) CloneVT() *GetKeyspaceRequest { if m == nil { return (*GetKeyspaceRequest)(nil) } - r := &GetKeyspaceRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - } + r := new(GetKeyspaceRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -987,7 +1008,7 @@ func (m *GetKeyspacesRequest) CloneVT() *GetKeyspacesRequest { if m == nil { return (*GetKeyspacesRequest)(nil) } - r := &GetKeyspacesRequest{} + r := new(GetKeyspacesRequest) if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1008,7 +1029,7 @@ func (m *GetKeyspacesResponse) CloneVT() *GetKeyspacesResponse { if m == nil { return (*GetKeyspacesResponse)(nil) } - r := &GetKeyspacesResponse{} + r := new(GetKeyspacesResponse) if rhs := m.Keyspaces; rhs != nil { tmpContainer := make([]*Keyspace, len(rhs)) for k, v := range rhs { @@ -1031,12 +1052,11 @@ func (m *GetSchemaRequest) CloneVT() *GetSchemaRequest { if m == nil { return (*GetSchemaRequest)(nil) } - r := &GetSchemaRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - Table: m.Table, - TableSizeOptions: m.TableSizeOptions.CloneVT(), - } + r := new(GetSchemaRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.Table = m.Table + r.TableSizeOptions = m.TableSizeOptions.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1052,9 +1072,8 @@ func (m *GetSchemasRequest) CloneVT() *GetSchemasRequest { if m == nil { return (*GetSchemasRequest)(nil) } - r := &GetSchemasRequest{ - TableSizeOptions: m.TableSizeOptions.CloneVT(), - } + r := new(GetSchemasRequest) + r.TableSizeOptions = m.TableSizeOptions.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1075,7 +1094,7 @@ func (m *GetSchemasResponse) CloneVT() *GetSchemasResponse { if m == nil { return (*GetSchemasResponse)(nil) } - r := &GetSchemasResponse{} + r := new(GetSchemasResponse) if rhs := m.Schemas; rhs != nil { tmpContainer := make([]*Schema, len(rhs)) for k, v := range rhs { @@ -1098,10 +1117,9 @@ func (m *GetSchemaMigrationsRequest_ClusterRequest) CloneVT() *GetSchemaMigratio if m == nil { return (*GetSchemaMigrationsRequest_ClusterRequest)(nil) } - r := &GetSchemaMigrationsRequest_ClusterRequest{ - ClusterId: m.ClusterId, - Request: m.Request.CloneVT(), - } + r := new(GetSchemaMigrationsRequest_ClusterRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1117,7 +1135,7 @@ func (m *GetSchemaMigrationsRequest) CloneVT() *GetSchemaMigrationsRequest { if m == nil { return (*GetSchemaMigrationsRequest)(nil) } - r := &GetSchemaMigrationsRequest{} + r := new(GetSchemaMigrationsRequest) if rhs := m.ClusterRequests; rhs != nil { tmpContainer := make([]*GetSchemaMigrationsRequest_ClusterRequest, len(rhs)) for k, v := range rhs { @@ -1140,7 +1158,7 @@ func (m *GetSchemaMigrationsResponse) CloneVT() *GetSchemaMigrationsResponse { if m == nil { return (*GetSchemaMigrationsResponse)(nil) } - r := &GetSchemaMigrationsResponse{} + r := new(GetSchemaMigrationsResponse) if rhs := m.SchemaMigrations; rhs != nil { tmpContainer := make([]*SchemaMigration, len(rhs)) for k, v := range rhs { @@ -1163,7 +1181,7 @@ func (m *GetShardReplicationPositionsRequest) CloneVT() *GetShardReplicationPosi if m == nil { return (*GetShardReplicationPositionsRequest)(nil) } - r := &GetShardReplicationPositionsRequest{} + r := new(GetShardReplicationPositionsRequest) if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1194,7 +1212,7 @@ func (m *GetShardReplicationPositionsResponse) CloneVT() *GetShardReplicationPos if m == nil { return (*GetShardReplicationPositionsResponse)(nil) } - r := &GetShardReplicationPositionsResponse{} + r := new(GetShardReplicationPositionsResponse) if rhs := m.ReplicationPositions; rhs != nil { tmpContainer := make([]*ClusterShardReplicationPosition, len(rhs)) for k, v := range rhs { @@ -1217,10 +1235,9 @@ func (m *GetSrvKeyspaceRequest) CloneVT() *GetSrvKeyspaceRequest { if m == nil { return (*GetSrvKeyspaceRequest)(nil) } - r := &GetSrvKeyspaceRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - } + r := new(GetSrvKeyspaceRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1241,7 +1258,7 @@ func (m *GetSrvKeyspacesRequest) CloneVT() *GetSrvKeyspacesRequest { if m == nil { return (*GetSrvKeyspacesRequest)(nil) } - r := &GetSrvKeyspacesRequest{} + r := new(GetSrvKeyspacesRequest) if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1267,7 +1284,7 @@ func (m *GetSrvKeyspacesResponse) CloneVT() *GetSrvKeyspacesResponse { if m == nil { return (*GetSrvKeyspacesResponse)(nil) } - r := &GetSrvKeyspacesResponse{} + r := new(GetSrvKeyspacesResponse) if rhs := m.SrvKeyspaces; rhs != nil { tmpContainer := make(map[string]*vtctldata.GetSrvKeyspacesResponse, len(rhs)) for k, v := range rhs { @@ -1290,10 +1307,9 @@ func (m *GetSrvVSchemaRequest) CloneVT() *GetSrvVSchemaRequest { if m == nil { return (*GetSrvVSchemaRequest)(nil) } - r := &GetSrvVSchemaRequest{ - ClusterId: m.ClusterId, - Cell: m.Cell, - } + r := new(GetSrvVSchemaRequest) + r.ClusterId = m.ClusterId + r.Cell = m.Cell if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1309,7 +1325,7 @@ func (m *GetSrvVSchemasRequest) CloneVT() *GetSrvVSchemasRequest { if m == nil { return (*GetSrvVSchemasRequest)(nil) } - r := &GetSrvVSchemasRequest{} + r := new(GetSrvVSchemasRequest) if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1335,7 +1351,7 @@ func (m *GetSrvVSchemasResponse) CloneVT() *GetSrvVSchemasResponse { if m == nil { return (*GetSrvVSchemasResponse)(nil) } - r := &GetSrvVSchemasResponse{} + r := new(GetSrvVSchemasResponse) if rhs := m.SrvVSchemas; rhs != nil { tmpContainer := make([]*SrvVSchema, len(rhs)) for k, v := range rhs { @@ -1358,10 +1374,9 @@ func (m *GetSchemaTableSizeOptions) CloneVT() *GetSchemaTableSizeOptions { if m == nil { return (*GetSchemaTableSizeOptions)(nil) } - r := &GetSchemaTableSizeOptions{ - AggregateSizes: m.AggregateSizes, - IncludeNonServingShards: m.IncludeNonServingShards, - } + r := new(GetSchemaTableSizeOptions) + r.AggregateSizes = m.AggregateSizes + r.IncludeNonServingShards = m.IncludeNonServingShards if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1377,9 +1392,8 @@ func (m *GetTabletRequest) CloneVT() *GetTabletRequest { if m == nil { return (*GetTabletRequest)(nil) } - r := &GetTabletRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(GetTabletRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1400,7 +1414,7 @@ func (m *GetTabletsRequest) CloneVT() *GetTabletsRequest { if m == nil { return (*GetTabletsRequest)(nil) } - r := &GetTabletsRequest{} + r := new(GetTabletsRequest) if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1421,7 +1435,7 @@ func (m *GetTabletsResponse) CloneVT() *GetTabletsResponse { if m == nil { return (*GetTabletsResponse)(nil) } - r := &GetTabletsResponse{} + r := new(GetTabletsResponse) if rhs := m.Tablets; rhs != nil { tmpContainer := make([]*Tablet, len(rhs)) for k, v := range rhs { @@ -1444,10 +1458,9 @@ func (m *GetTopologyPathRequest) CloneVT() *GetTopologyPathRequest { if m == nil { return (*GetTopologyPathRequest)(nil) } - r := &GetTopologyPathRequest{ - ClusterId: m.ClusterId, - Path: m.Path, - } + r := new(GetTopologyPathRequest) + r.ClusterId = m.ClusterId + r.Path = m.Path if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1459,14 +1472,32 @@ func (m *GetTopologyPathRequest) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *GetUnresolvedTransactionsRequest) CloneVT() *GetUnresolvedTransactionsRequest { + if m == nil { + return (*GetUnresolvedTransactionsRequest)(nil) + } + r := new(GetUnresolvedTransactionsRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.AbandonAge = m.AbandonAge + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *GetUnresolvedTransactionsRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *GetVSchemaRequest) CloneVT() *GetVSchemaRequest { if m == nil { return (*GetVSchemaRequest)(nil) } - r := &GetVSchemaRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - } + r := new(GetVSchemaRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1482,7 +1513,7 @@ func (m *GetVSchemasRequest) CloneVT() *GetVSchemasRequest { if m == nil { return (*GetVSchemasRequest)(nil) } - r := &GetVSchemasRequest{} + r := new(GetVSchemasRequest) if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1503,7 +1534,7 @@ func (m *GetVSchemasResponse) CloneVT() *GetVSchemasResponse { if m == nil { return (*GetVSchemasResponse)(nil) } - r := &GetVSchemasResponse{} + r := new(GetVSchemasResponse) if rhs := m.VSchemas; rhs != nil { tmpContainer := make([]*VSchema, len(rhs)) for k, v := range rhs { @@ -1526,7 +1557,7 @@ func (m *GetVtctldsRequest) CloneVT() *GetVtctldsRequest { if m == nil { return (*GetVtctldsRequest)(nil) } - r := &GetVtctldsRequest{} + r := new(GetVtctldsRequest) if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1547,7 +1578,7 @@ func (m *GetVtctldsResponse) CloneVT() *GetVtctldsResponse { if m == nil { return (*GetVtctldsResponse)(nil) } - r := &GetVtctldsResponse{} + r := new(GetVtctldsResponse) if rhs := m.Vtctlds; rhs != nil { tmpContainer := make([]*Vtctld, len(rhs)) for k, v := range rhs { @@ -1570,12 +1601,11 @@ func (m *GetWorkflowRequest) CloneVT() *GetWorkflowRequest { if m == nil { return (*GetWorkflowRequest)(nil) } - r := &GetWorkflowRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - Name: m.Name, - ActiveOnly: m.ActiveOnly, - } + r := new(GetWorkflowRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.Name = m.Name + r.ActiveOnly = m.ActiveOnly if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1587,13 +1617,69 @@ func (m *GetWorkflowRequest) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *GetWorkflowStatusRequest) CloneVT() *GetWorkflowStatusRequest { + if m == nil { + return (*GetWorkflowStatusRequest)(nil) + } + r := new(GetWorkflowStatusRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.Name = m.Name + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *GetWorkflowStatusRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *StartWorkflowRequest) CloneVT() *StartWorkflowRequest { + if m == nil { + return (*StartWorkflowRequest)(nil) + } + r := new(StartWorkflowRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.Workflow = m.Workflow + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *StartWorkflowRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *StopWorkflowRequest) CloneVT() *StopWorkflowRequest { + if m == nil { + return (*StopWorkflowRequest)(nil) + } + r := new(StopWorkflowRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.Workflow = m.Workflow + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *StopWorkflowRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *GetWorkflowsRequest) CloneVT() *GetWorkflowsRequest { if m == nil { return (*GetWorkflowsRequest)(nil) } - r := &GetWorkflowsRequest{ - ActiveOnly: m.ActiveOnly, - } + r := new(GetWorkflowsRequest) + r.ActiveOnly = m.ActiveOnly if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1624,7 +1710,7 @@ func (m *GetWorkflowsResponse) CloneVT() *GetWorkflowsResponse { if m == nil { return (*GetWorkflowsResponse)(nil) } - r := &GetWorkflowsResponse{} + r := new(GetWorkflowsResponse) if rhs := m.WorkflowsByCluster; rhs != nil { tmpContainer := make(map[string]*ClusterWorkflows, len(rhs)) for k, v := range rhs { @@ -1647,10 +1733,9 @@ func (m *LaunchSchemaMigrationRequest) CloneVT() *LaunchSchemaMigrationRequest { if m == nil { return (*LaunchSchemaMigrationRequest)(nil) } - r := &LaunchSchemaMigrationRequest{ - ClusterId: m.ClusterId, - Request: m.Request.CloneVT(), - } + r := new(LaunchSchemaMigrationRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1662,13 +1747,67 @@ func (m *LaunchSchemaMigrationRequest) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *MaterializeCreateRequest) CloneVT() *MaterializeCreateRequest { + if m == nil { + return (*MaterializeCreateRequest)(nil) + } + r := new(MaterializeCreateRequest) + r.ClusterId = m.ClusterId + r.TableSettings = m.TableSettings + r.Request = m.Request.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MaterializeCreateRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MoveTablesCompleteRequest) CloneVT() *MoveTablesCompleteRequest { + if m == nil { + return (*MoveTablesCompleteRequest)(nil) + } + r := new(MoveTablesCompleteRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MoveTablesCompleteRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *MoveTablesCreateRequest) CloneVT() *MoveTablesCreateRequest { + if m == nil { + return (*MoveTablesCreateRequest)(nil) + } + r := new(MoveTablesCreateRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *MoveTablesCreateRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *PingTabletRequest) CloneVT() *PingTabletRequest { if m == nil { return (*PingTabletRequest)(nil) } - r := &PingTabletRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(PingTabletRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1689,10 +1828,9 @@ func (m *PingTabletResponse) CloneVT() *PingTabletResponse { if m == nil { return (*PingTabletResponse)(nil) } - r := &PingTabletResponse{ - Status: m.Status, - Cluster: m.Cluster.CloneVT(), - } + r := new(PingTabletResponse) + r.Status = m.Status + r.Cluster = m.Cluster.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1708,10 +1846,9 @@ func (m *PlannedFailoverShardRequest) CloneVT() *PlannedFailoverShardRequest { if m == nil { return (*PlannedFailoverShardRequest)(nil) } - r := &PlannedFailoverShardRequest{ - ClusterId: m.ClusterId, - Options: m.Options.CloneVT(), - } + r := new(PlannedFailoverShardRequest) + r.ClusterId = m.ClusterId + r.Options = m.Options.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1727,12 +1864,11 @@ func (m *PlannedFailoverShardResponse) CloneVT() *PlannedFailoverShardResponse { if m == nil { return (*PlannedFailoverShardResponse)(nil) } - r := &PlannedFailoverShardResponse{ - Cluster: m.Cluster.CloneVT(), - Keyspace: m.Keyspace, - Shard: m.Shard, - PromotedPrimary: m.PromotedPrimary.CloneVT(), - } + r := new(PlannedFailoverShardResponse) + r.Cluster = m.Cluster.CloneVT() + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.PromotedPrimary = m.PromotedPrimary.CloneVT() if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -1755,11 +1891,10 @@ func (m *RebuildKeyspaceGraphRequest) CloneVT() *RebuildKeyspaceGraphRequest { if m == nil { return (*RebuildKeyspaceGraphRequest)(nil) } - r := &RebuildKeyspaceGraphRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - AllowPartial: m.AllowPartial, - } + r := new(RebuildKeyspaceGraphRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.AllowPartial = m.AllowPartial if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1780,9 +1915,8 @@ func (m *RebuildKeyspaceGraphResponse) CloneVT() *RebuildKeyspaceGraphResponse { if m == nil { return (*RebuildKeyspaceGraphResponse)(nil) } - r := &RebuildKeyspaceGraphResponse{ - Status: m.Status, - } + r := new(RebuildKeyspaceGraphResponse) + r.Status = m.Status if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1798,9 +1932,8 @@ func (m *RefreshStateRequest) CloneVT() *RefreshStateRequest { if m == nil { return (*RefreshStateRequest)(nil) } - r := &RefreshStateRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(RefreshStateRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1821,10 +1954,9 @@ func (m *RefreshStateResponse) CloneVT() *RefreshStateResponse { if m == nil { return (*RefreshStateResponse)(nil) } - r := &RefreshStateResponse{ - Status: m.Status, - Cluster: m.Cluster.CloneVT(), - } + r := new(RefreshStateResponse) + r.Status = m.Status + r.Cluster = m.Cluster.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1840,11 +1972,10 @@ func (m *ReloadSchemasRequest) CloneVT() *ReloadSchemasRequest { if m == nil { return (*ReloadSchemasRequest)(nil) } - r := &ReloadSchemasRequest{ - Concurrency: m.Concurrency, - WaitPosition: m.WaitPosition, - IncludePrimary: m.IncludePrimary, - } + r := new(ReloadSchemasRequest) + r.Concurrency = m.Concurrency + r.WaitPosition = m.WaitPosition + r.IncludePrimary = m.IncludePrimary if rhs := m.Keyspaces; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1882,9 +2013,8 @@ func (m *ReloadSchemasResponse_KeyspaceResult) CloneVT() *ReloadSchemasResponse_ if m == nil { return (*ReloadSchemasResponse_KeyspaceResult)(nil) } - r := &ReloadSchemasResponse_KeyspaceResult{ - Keyspace: m.Keyspace.CloneVT(), - } + r := new(ReloadSchemasResponse_KeyspaceResult) + r.Keyspace = m.Keyspace.CloneVT() if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -1907,9 +2037,8 @@ func (m *ReloadSchemasResponse_ShardResult) CloneVT() *ReloadSchemasResponse_Sha if m == nil { return (*ReloadSchemasResponse_ShardResult)(nil) } - r := &ReloadSchemasResponse_ShardResult{ - Shard: m.Shard.CloneVT(), - } + r := new(ReloadSchemasResponse_ShardResult) + r.Shard = m.Shard.CloneVT() if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -1932,10 +2061,9 @@ func (m *ReloadSchemasResponse_TabletResult) CloneVT() *ReloadSchemasResponse_Ta if m == nil { return (*ReloadSchemasResponse_TabletResult)(nil) } - r := &ReloadSchemasResponse_TabletResult{ - Tablet: m.Tablet.CloneVT(), - Result: m.Result, - } + r := new(ReloadSchemasResponse_TabletResult) + r.Tablet = m.Tablet.CloneVT() + r.Result = m.Result if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1951,7 +2079,7 @@ func (m *ReloadSchemasResponse) CloneVT() *ReloadSchemasResponse { if m == nil { return (*ReloadSchemasResponse)(nil) } - r := &ReloadSchemasResponse{} + r := new(ReloadSchemasResponse) if rhs := m.KeyspaceResults; rhs != nil { tmpContainer := make([]*ReloadSchemasResponse_KeyspaceResult, len(rhs)) for k, v := range rhs { @@ -1988,14 +2116,13 @@ func (m *ReloadSchemaShardRequest) CloneVT() *ReloadSchemaShardRequest { if m == nil { return (*ReloadSchemaShardRequest)(nil) } - r := &ReloadSchemaShardRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - Shard: m.Shard, - WaitPosition: m.WaitPosition, - IncludePrimary: m.IncludePrimary, - Concurrency: m.Concurrency, - } + r := new(ReloadSchemaShardRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.WaitPosition = m.WaitPosition + r.IncludePrimary = m.IncludePrimary + r.Concurrency = m.Concurrency if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2011,7 +2138,7 @@ func (m *ReloadSchemaShardResponse) CloneVT() *ReloadSchemaShardResponse { if m == nil { return (*ReloadSchemaShardResponse)(nil) } - r := &ReloadSchemaShardResponse{} + r := new(ReloadSchemaShardResponse) if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -2034,9 +2161,8 @@ func (m *RefreshTabletReplicationSourceRequest) CloneVT() *RefreshTabletReplicat if m == nil { return (*RefreshTabletReplicationSourceRequest)(nil) } - r := &RefreshTabletReplicationSourceRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(RefreshTabletReplicationSourceRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2057,12 +2183,11 @@ func (m *RefreshTabletReplicationSourceResponse) CloneVT() *RefreshTabletReplica if m == nil { return (*RefreshTabletReplicationSourceResponse)(nil) } - r := &RefreshTabletReplicationSourceResponse{ - Keyspace: m.Keyspace, - Shard: m.Shard, - Primary: m.Primary.CloneVT(), - Cluster: m.Cluster.CloneVT(), - } + r := new(RefreshTabletReplicationSourceResponse) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Primary = m.Primary.CloneVT() + r.Cluster = m.Cluster.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2078,13 +2203,12 @@ func (m *RemoveKeyspaceCellRequest) CloneVT() *RemoveKeyspaceCellRequest { if m == nil { return (*RemoveKeyspaceCellRequest)(nil) } - r := &RemoveKeyspaceCellRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - Cell: m.Cell, - Force: m.Force, - Recursive: m.Recursive, - } + r := new(RemoveKeyspaceCellRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.Cell = m.Cell + r.Force = m.Force + r.Recursive = m.Recursive if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2100,9 +2224,8 @@ func (m *RemoveKeyspaceCellResponse) CloneVT() *RemoveKeyspaceCellResponse { if m == nil { return (*RemoveKeyspaceCellResponse)(nil) } - r := &RemoveKeyspaceCellResponse{ - Status: m.Status, - } + r := new(RemoveKeyspaceCellResponse) + r.Status = m.Status if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2118,10 +2241,9 @@ func (m *RetrySchemaMigrationRequest) CloneVT() *RetrySchemaMigrationRequest { if m == nil { return (*RetrySchemaMigrationRequest)(nil) } - r := &RetrySchemaMigrationRequest{ - ClusterId: m.ClusterId, - Request: m.Request.CloneVT(), - } + r := new(RetrySchemaMigrationRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2137,9 +2259,8 @@ func (m *RunHealthCheckRequest) CloneVT() *RunHealthCheckRequest { if m == nil { return (*RunHealthCheckRequest)(nil) } - r := &RunHealthCheckRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(RunHealthCheckRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2160,10 +2281,9 @@ func (m *RunHealthCheckResponse) CloneVT() *RunHealthCheckResponse { if m == nil { return (*RunHealthCheckResponse)(nil) } - r := &RunHealthCheckResponse{ - Status: m.Status, - Cluster: m.Cluster.CloneVT(), - } + r := new(RunHealthCheckResponse) + r.Status = m.Status + r.Cluster = m.Cluster.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2175,13 +2295,30 @@ func (m *RunHealthCheckResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *ReshardCreateRequest) CloneVT() *ReshardCreateRequest { + if m == nil { + return (*ReshardCreateRequest)(nil) + } + r := new(ReshardCreateRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ReshardCreateRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *SetReadOnlyRequest) CloneVT() *SetReadOnlyRequest { if m == nil { return (*SetReadOnlyRequest)(nil) } - r := &SetReadOnlyRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(SetReadOnlyRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2202,7 +2339,7 @@ func (m *SetReadOnlyResponse) CloneVT() *SetReadOnlyResponse { if m == nil { return (*SetReadOnlyResponse)(nil) } - r := &SetReadOnlyResponse{} + r := new(SetReadOnlyResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2218,9 +2355,8 @@ func (m *SetReadWriteRequest) CloneVT() *SetReadWriteRequest { if m == nil { return (*SetReadWriteRequest)(nil) } - r := &SetReadWriteRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(SetReadWriteRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2241,7 +2377,7 @@ func (m *SetReadWriteResponse) CloneVT() *SetReadWriteResponse { if m == nil { return (*SetReadWriteResponse)(nil) } - r := &SetReadWriteResponse{} + r := new(SetReadWriteResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2257,9 +2393,8 @@ func (m *StartReplicationRequest) CloneVT() *StartReplicationRequest { if m == nil { return (*StartReplicationRequest)(nil) } - r := &StartReplicationRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(StartReplicationRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2280,10 +2415,9 @@ func (m *StartReplicationResponse) CloneVT() *StartReplicationResponse { if m == nil { return (*StartReplicationResponse)(nil) } - r := &StartReplicationResponse{ - Status: m.Status, - Cluster: m.Cluster.CloneVT(), - } + r := new(StartReplicationResponse) + r.Status = m.Status + r.Cluster = m.Cluster.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2299,9 +2433,8 @@ func (m *StopReplicationRequest) CloneVT() *StopReplicationRequest { if m == nil { return (*StopReplicationRequest)(nil) } - r := &StopReplicationRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(StopReplicationRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2322,10 +2455,9 @@ func (m *StopReplicationResponse) CloneVT() *StopReplicationResponse { if m == nil { return (*StopReplicationResponse)(nil) } - r := &StopReplicationResponse{ - Status: m.Status, - Cluster: m.Cluster.CloneVT(), - } + r := new(StopReplicationResponse) + r.Status = m.Status + r.Cluster = m.Cluster.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2341,9 +2473,8 @@ func (m *TabletExternallyPromotedRequest) CloneVT() *TabletExternallyPromotedReq if m == nil { return (*TabletExternallyPromotedRequest)(nil) } - r := &TabletExternallyPromotedRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(TabletExternallyPromotedRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2364,13 +2495,12 @@ func (m *TabletExternallyPromotedResponse) CloneVT() *TabletExternallyPromotedRe if m == nil { return (*TabletExternallyPromotedResponse)(nil) } - r := &TabletExternallyPromotedResponse{ - Cluster: m.Cluster.CloneVT(), - Keyspace: m.Keyspace, - Shard: m.Shard, - NewPrimary: m.NewPrimary.CloneVT(), - OldPrimary: m.OldPrimary.CloneVT(), - } + r := new(TabletExternallyPromotedResponse) + r.Cluster = m.Cluster.CloneVT() + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.NewPrimary = m.NewPrimary.CloneVT() + r.OldPrimary = m.OldPrimary.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2386,9 +2516,8 @@ func (m *TabletExternallyReparentedRequest) CloneVT() *TabletExternallyReparente if m == nil { return (*TabletExternallyReparentedRequest)(nil) } - r := &TabletExternallyReparentedRequest{ - Alias: m.Alias.CloneVT(), - } + r := new(TabletExternallyReparentedRequest) + r.Alias = m.Alias.CloneVT() if rhs := m.ClusterIds; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2409,10 +2538,9 @@ func (m *ValidateRequest) CloneVT() *ValidateRequest { if m == nil { return (*ValidateRequest)(nil) } - r := &ValidateRequest{ - ClusterId: m.ClusterId, - PingTablets: m.PingTablets, - } + r := new(ValidateRequest) + r.ClusterId = m.ClusterId + r.PingTablets = m.PingTablets if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2428,11 +2556,10 @@ func (m *ValidateKeyspaceRequest) CloneVT() *ValidateKeyspaceRequest { if m == nil { return (*ValidateKeyspaceRequest)(nil) } - r := &ValidateKeyspaceRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - PingTablets: m.PingTablets, - } + r := new(ValidateKeyspaceRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.PingTablets = m.PingTablets if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2448,10 +2575,9 @@ func (m *ValidateSchemaKeyspaceRequest) CloneVT() *ValidateSchemaKeyspaceRequest if m == nil { return (*ValidateSchemaKeyspaceRequest)(nil) } - r := &ValidateSchemaKeyspaceRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - } + r := new(ValidateSchemaKeyspaceRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2467,12 +2593,11 @@ func (m *ValidateShardRequest) CloneVT() *ValidateShardRequest { if m == nil { return (*ValidateShardRequest)(nil) } - r := &ValidateShardRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - Shard: m.Shard, - PingTablets: m.PingTablets, - } + r := new(ValidateShardRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.PingTablets = m.PingTablets if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2488,10 +2613,9 @@ func (m *ValidateVersionKeyspaceRequest) CloneVT() *ValidateVersionKeyspaceReque if m == nil { return (*ValidateVersionKeyspaceRequest)(nil) } - r := &ValidateVersionKeyspaceRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - } + r := new(ValidateVersionKeyspaceRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2507,11 +2631,10 @@ func (m *ValidateVersionShardRequest) CloneVT() *ValidateVersionShardRequest { if m == nil { return (*ValidateVersionShardRequest)(nil) } - r := &ValidateVersionShardRequest{ - ClusterId: m.ClusterId, - Keyspace: m.Keyspace, - Shard: m.Shard, - } + r := new(ValidateVersionShardRequest) + r.ClusterId = m.ClusterId + r.Keyspace = m.Keyspace + r.Shard = m.Shard if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2523,15 +2646,13 @@ func (m *ValidateVersionShardRequest) CloneMessageVT() proto.Message { return m.CloneVT() } -func (m *VTExplainRequest) CloneVT() *VTExplainRequest { +func (m *VDiffCreateRequest) CloneVT() *VDiffCreateRequest { if m == nil { - return (*VTExplainRequest)(nil) - } - r := &VTExplainRequest{ - Cluster: m.Cluster, - Keyspace: m.Keyspace, - Sql: m.Sql, + return (*VDiffCreateRequest)(nil) } + r := new(VDiffCreateRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2539,17 +2660,17 @@ func (m *VTExplainRequest) CloneVT() *VTExplainRequest { return r } -func (m *VTExplainRequest) CloneMessageVT() proto.Message { +func (m *VDiffCreateRequest) CloneMessageVT() proto.Message { return m.CloneVT() } -func (m *VTExplainResponse) CloneVT() *VTExplainResponse { +func (m *VDiffShowRequest) CloneVT() *VDiffShowRequest { if m == nil { - return (*VTExplainResponse)(nil) - } - r := &VTExplainResponse{ - Response: m.Response, + return (*VDiffShowRequest)(nil) } + r := new(VDiffShowRequest) + r.ClusterId = m.ClusterId + r.Request = m.Request.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2557,51 +2678,150 @@ func (m *VTExplainResponse) CloneVT() *VTExplainResponse { return r } -func (m *VTExplainResponse) CloneMessageVT() proto.Message { +func (m *VDiffShowRequest) CloneMessageVT() proto.Message { return m.CloneVT() } -func (m *Cluster) MarshalVT() (dAtA []byte, err error) { +func (m *VDiffProgress) CloneVT() *VDiffProgress { if m == nil { - return nil, nil + return (*VDiffProgress)(nil) } - size := m.SizeVT() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBufferVT(dAtA[:size]) - if err != nil { - return nil, err + r := new(VDiffProgress) + r.Percentage = m.Percentage + r.Eta = m.Eta + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) } - return dAtA[:n], nil + return r } -func (m *Cluster) MarshalToVT(dAtA []byte) (int, error) { - size := m.SizeVT() - return m.MarshalToSizedBufferVT(dAtA[:size]) +func (m *VDiffProgress) CloneMessageVT() proto.Message { + return m.CloneVT() } -func (m *Cluster) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VDiffShardReport) CloneVT() *VDiffShardReport { if m == nil { - return 0, nil + return (*VDiffShardReport)(nil) } - i := len(dAtA) - _ = i - var l int - _ = l - if m.unknownFields != nil { - i -= len(m.unknownFields) - copy(dAtA[i:], m.unknownFields) - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0x12 + r := new(VDiffShardReport) + r.State = m.State + r.RowsCompared = m.RowsCompared + r.HasMismatch = m.HasMismatch + r.StartedAt = m.StartedAt + r.CompletedAt = m.CompletedAt + r.Progress = m.Progress.CloneVT() + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *VDiffShardReport) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *VDiffShowResponse) CloneVT() *VDiffShowResponse { + if m == nil { + return (*VDiffShowResponse)(nil) + } + r := new(VDiffShowResponse) + if rhs := m.ShardReport; rhs != nil { + tmpContainer := make(map[string]*VDiffShardReport, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.ShardReport = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *VDiffShowResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *VTExplainRequest) CloneVT() *VTExplainRequest { + if m == nil { + return (*VTExplainRequest)(nil) + } + r := new(VTExplainRequest) + r.Cluster = m.Cluster + r.Keyspace = m.Keyspace + r.Sql = m.Sql + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *VTExplainRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *VTExplainResponse) CloneVT() *VTExplainResponse { + if m == nil { + return (*VTExplainResponse)(nil) + } + r := new(VTExplainResponse) + r.Response = m.Response + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *VTExplainResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *Cluster) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Cluster) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Cluster) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x12 } if len(m.Id) > 0 { i -= len(m.Id) copy(dAtA[i:], m.Id) - i = encodeVarint(dAtA, i, uint64(len(m.Id))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } @@ -2644,7 +2864,7 @@ func (m *ClusterBackup) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2654,7 +2874,7 @@ func (m *ClusterBackup) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2700,15 +2920,15 @@ func (m *ClusterCellsAliases) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -2719,7 +2939,7 @@ func (m *ClusterCellsAliases) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2762,14 +2982,14 @@ func (m *ClusterCellInfo) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x12 } @@ -2779,7 +2999,7 @@ func (m *ClusterCellInfo) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2822,21 +3042,21 @@ func (m *ClusterShardReplicationPosition) MarshalToSizedBufferVT(dAtA []byte) (i return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } @@ -2846,7 +3066,7 @@ func (m *ClusterShardReplicationPosition) MarshalToSizedBufferVT(dAtA []byte) (i return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2887,7 +3107,7 @@ func (m *ClusterWorkflows) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Warnings) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Warnings[iNdEx]) copy(dAtA[i:], m.Warnings[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Warnings[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Warnings[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -2899,7 +3119,7 @@ func (m *ClusterWorkflows) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -2946,15 +3166,15 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x1a } @@ -2965,7 +3185,7 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -2975,7 +3195,7 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3013,12 +3233,12 @@ func (m *Schema_ShardTableSize) MarshalToSizedBufferVT(dAtA []byte) (int, error) copy(dAtA[i:], m.unknownFields) } if m.DataLength != 0 { - i = encodeVarint(dAtA, i, uint64(m.DataLength)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.DataLength)) i-- dAtA[i] = 0x10 } if m.RowCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowCount)) i-- dAtA[i] = 0x8 } @@ -3064,26 +3284,26 @@ func (m *Schema_TableSize) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x1a } } if m.DataLength != 0 { - i = encodeVarint(dAtA, i, uint64(m.DataLength)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.DataLength)) i-- dAtA[i] = 0x10 } if m.RowCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowCount)) i-- dAtA[i] = 0x8 } @@ -3129,15 +3349,15 @@ func (m *Schema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x22 } @@ -3149,7 +3369,7 @@ func (m *Schema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3157,7 +3377,7 @@ func (m *Schema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } @@ -3167,7 +3387,7 @@ func (m *Schema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3210,7 +3430,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3220,7 +3440,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3263,7 +3483,7 @@ func (m *Shard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3273,7 +3493,7 @@ func (m *Shard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3316,7 +3536,7 @@ func (m *SrvVSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -3326,14 +3546,14 @@ func (m *SrvVSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0xa } @@ -3373,12 +3593,12 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.FQDN) > 0 { i -= len(m.FQDN) copy(dAtA[i:], m.FQDN) - i = encodeVarint(dAtA, i, uint64(len(m.FQDN))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FQDN))) i-- dAtA[i] = 0x22 } if m.State != 0 { - i = encodeVarint(dAtA, i, uint64(m.State)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.State)) i-- dAtA[i] = 0x18 } @@ -3388,7 +3608,7 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -3398,7 +3618,7 @@ func (m *Tablet) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3441,14 +3661,14 @@ func (m *VSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x12 } @@ -3458,7 +3678,7 @@ func (m *VSchema) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3498,7 +3718,7 @@ func (m *Vtctld) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.FQDN) > 0 { i -= len(m.FQDN) copy(dAtA[i:], m.FQDN) - i = encodeVarint(dAtA, i, uint64(len(m.FQDN))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FQDN))) i-- dAtA[i] = 0x1a } @@ -3508,14 +3728,14 @@ func (m *Vtctld) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Hostname) > 0 { i -= len(m.Hostname) copy(dAtA[i:], m.Hostname) - i = encodeVarint(dAtA, i, uint64(len(m.Hostname))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Hostname))) i-- dAtA[i] = 0xa } @@ -3555,7 +3775,7 @@ func (m *VTGate) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.FQDN) > 0 { i -= len(m.FQDN) copy(dAtA[i:], m.FQDN) - i = encodeVarint(dAtA, i, uint64(len(m.FQDN))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.FQDN))) i-- dAtA[i] = 0x32 } @@ -3563,7 +3783,7 @@ func (m *VTGate) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Keyspaces) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Keyspaces[iNdEx]) copy(dAtA[i:], m.Keyspaces[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -3574,28 +3794,28 @@ func (m *VTGate) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0x1a } if len(m.Pool) > 0 { i -= len(m.Pool) copy(dAtA[i:], m.Pool) - i = encodeVarint(dAtA, i, uint64(len(m.Pool))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Pool))) i-- dAtA[i] = 0x12 } if len(m.Hostname) > 0 { i -= len(m.Hostname) copy(dAtA[i:], m.Hostname) - i = encodeVarint(dAtA, i, uint64(len(m.Hostname))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Hostname))) i-- dAtA[i] = 0xa } @@ -3638,14 +3858,14 @@ func (m *Workflow) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } @@ -3655,7 +3875,107 @@ func (m *Workflow) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WorkflowDeleteRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WorkflowDeleteRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *WorkflowDeleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Request != nil { + size, err := m.Request.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WorkflowSwitchTrafficRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WorkflowSwitchTrafficRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *WorkflowSwitchTrafficRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Request != nil { + size, err := m.Request.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -3698,14 +4018,14 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -3748,14 +4068,14 @@ func (m *CancelSchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -3798,14 +4118,14 @@ func (m *CleanupSchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -3848,14 +4168,61 @@ func (m *CompleteSchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ConcludeTransactionRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConcludeTransactionRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ConcludeTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Dtid) > 0 { + i -= len(m.Dtid) + copy(dAtA[i:], m.Dtid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -3898,14 +4265,14 @@ func (m *CreateKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -3948,7 +4315,7 @@ func (m *CreateKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -3991,14 +4358,14 @@ func (m *CreateShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -4041,14 +4408,14 @@ func (m *DeleteKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -4091,14 +4458,14 @@ func (m *DeleteShardsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -4149,7 +4516,7 @@ func (m *DeleteTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -4160,7 +4527,7 @@ func (m *DeleteTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4203,14 +4570,14 @@ func (m *DeleteTabletResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) - i = encodeVarint(dAtA, i, uint64(len(m.Status))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) i-- dAtA[i] = 0xa } @@ -4253,14 +4620,14 @@ func (m *EmergencyFailoverShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -4304,7 +4671,7 @@ func (m *EmergencyFailoverShardResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -4315,21 +4682,21 @@ func (m *EmergencyFailoverShardResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } @@ -4339,7 +4706,7 @@ func (m *EmergencyFailoverShardResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4382,7 +4749,7 @@ func (m *FindSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -4390,7 +4757,7 @@ func (m *FindSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -4398,7 +4765,7 @@ func (m *FindSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Table) > 0 { i -= len(m.Table) copy(dAtA[i:], m.Table) - i = encodeVarint(dAtA, i, uint64(len(m.Table))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Table))) i-- dAtA[i] = 0xa } @@ -4441,7 +4808,7 @@ func (m *GetBackupsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -4449,7 +4816,7 @@ func (m *GetBackupsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.KeyspaceShards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.KeyspaceShards[iNdEx]) copy(dAtA[i:], m.KeyspaceShards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.KeyspaceShards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.KeyspaceShards[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -4458,7 +4825,7 @@ func (m *GetBackupsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Keyspaces) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Keyspaces[iNdEx]) copy(dAtA[i:], m.Keyspaces[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -4467,7 +4834,7 @@ func (m *GetBackupsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -4512,7 +4879,7 @@ func (m *GetBackupsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4564,7 +4931,7 @@ func (m *GetCellInfosRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -4573,7 +4940,7 @@ func (m *GetCellInfosRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -4618,7 +4985,7 @@ func (m *GetCellInfosResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4660,7 +5027,7 @@ func (m *GetCellsAliasesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -4705,7 +5072,7 @@ func (m *GetCellsAliasesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4783,7 +5150,7 @@ func (m *GetClustersResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4827,14 +5194,14 @@ func (m *GetFullStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -4875,7 +5242,7 @@ func (m *GetGatesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -4920,7 +5287,7 @@ func (m *GetGatesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -4961,14 +5328,14 @@ func (m *GetKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -5009,7 +5376,7 @@ func (m *GetKeyspacesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -5054,7 +5421,7 @@ func (m *GetKeyspacesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5098,28 +5465,28 @@ func (m *GetSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if len(m.Table) > 0 { i -= len(m.Table) copy(dAtA[i:], m.Table) - i = encodeVarint(dAtA, i, uint64(len(m.Table))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Table))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -5162,7 +5529,7 @@ func (m *GetSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -5170,7 +5537,7 @@ func (m *GetSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -5215,7 +5582,7 @@ func (m *GetSchemasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5259,14 +5626,14 @@ func (m *GetSchemaMigrationsRequest_ClusterRequest) MarshalToSizedBufferVT(dAtA return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -5310,7 +5677,7 @@ func (m *GetSchemaMigrationsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5355,7 +5722,7 @@ func (m *GetSchemaMigrationsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5397,7 +5764,7 @@ func (m *GetShardReplicationPositionsRequest) MarshalToSizedBufferVT(dAtA []byte for iNdEx := len(m.KeyspaceShards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.KeyspaceShards[iNdEx]) copy(dAtA[i:], m.KeyspaceShards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.KeyspaceShards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.KeyspaceShards[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -5406,7 +5773,7 @@ func (m *GetShardReplicationPositionsRequest) MarshalToSizedBufferVT(dAtA []byte for iNdEx := len(m.Keyspaces) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Keyspaces[iNdEx]) copy(dAtA[i:], m.Keyspaces[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -5415,7 +5782,7 @@ func (m *GetShardReplicationPositionsRequest) MarshalToSizedBufferVT(dAtA []byte for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -5460,7 +5827,7 @@ func (m *GetShardReplicationPositionsResponse) MarshalToSizedBufferVT(dAtA []byt return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5502,7 +5869,7 @@ func (m *GetSrvKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -5510,14 +5877,14 @@ func (m *GetSrvKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -5558,7 +5925,7 @@ func (m *GetSrvKeyspacesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -5567,7 +5934,7 @@ func (m *GetSrvKeyspacesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -5614,15 +5981,15 @@ func (m *GetSrvKeyspacesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -5663,14 +6030,14 @@ func (m *GetSrvVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -5711,7 +6078,7 @@ func (m *GetSrvVSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -5720,7 +6087,7 @@ func (m *GetSrvVSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -5765,7 +6132,7 @@ func (m *GetSrvVSchemasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5860,7 +6227,7 @@ func (m *GetTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -5871,7 +6238,7 @@ func (m *GetTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5912,7 +6279,7 @@ func (m *GetTabletsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -5957,7 +6324,7 @@ func (m *GetTabletsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5998,21 +6365,21 @@ func (m *GetTopologyPathRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.Path) > 0 { i -= len(m.Path) copy(dAtA[i:], m.Path) - i = encodeVarint(dAtA, i, uint64(len(m.Path))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Path))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetVSchemaRequest) MarshalVT() (dAtA []byte, err error) { +func (m *GetUnresolvedTransactionsRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6025,12 +6392,12 @@ func (m *GetVSchemaRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetVSchemaRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *GetUnresolvedTransactionsRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *GetUnresolvedTransactionsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6042,24 +6409,29 @@ func (m *GetVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.AbandonAge != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.AbandonAge)) + i-- + dAtA[i] = 0x18 + } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetVSchemasRequest) MarshalVT() (dAtA []byte, err error) { +func (m *GetVSchemaRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6072,12 +6444,12 @@ func (m *GetVSchemasRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetVSchemasRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *GetVSchemaRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetVSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *GetVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6089,19 +6461,24 @@ func (m *GetVSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.ClusterIds) > 0 { - for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ClusterIds[iNdEx]) - copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetVSchemasResponse) MarshalVT() (dAtA []byte, err error) { +func (m *GetVSchemasRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6114,12 +6491,12 @@ func (m *GetVSchemasResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetVSchemasResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *GetVSchemasRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *GetVSchemasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *GetVSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6131,14 +6508,56 @@ func (m *GetVSchemasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.VSchemas) > 0 { - for iNdEx := len(m.VSchemas) - 1; iNdEx >= 0; iNdEx-- { - size, err := m.VSchemas[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if len(m.ClusterIds) > 0 { + for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ClusterIds[iNdEx]) + copy(dAtA[i:], m.ClusterIds[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *GetVSchemasResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetVSchemasResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetVSchemasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.VSchemas) > 0 { + for iNdEx := len(m.VSchemas) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.VSchemas[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -6180,7 +6599,7 @@ func (m *GetVtctldsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -6225,7 +6644,7 @@ func (m *GetVtctldsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -6276,21 +6695,183 @@ func (m *GetWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x1a + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GetWorkflowStatusRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetWorkflowStatusRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetWorkflowStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x1a + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *StartWorkflowRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StartWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *StartWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Workflow) > 0 { + i -= len(m.Workflow) + copy(dAtA[i:], m.Workflow) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) + i-- + dAtA[i] = 0x1a + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *StopWorkflowRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StopWorkflowRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *StopWorkflowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Workflow) > 0 { + i -= len(m.Workflow) + copy(dAtA[i:], m.Workflow) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -6331,7 +6912,7 @@ func (m *GetWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.IgnoreKeyspaces) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.IgnoreKeyspaces[iNdEx]) copy(dAtA[i:], m.IgnoreKeyspaces[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.IgnoreKeyspaces[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IgnoreKeyspaces[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -6340,7 +6921,7 @@ func (m *GetWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Keyspaces) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Keyspaces[iNdEx]) copy(dAtA[i:], m.Keyspaces[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -6359,7 +6940,7 @@ func (m *GetWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -6406,15 +6987,15 @@ func (m *GetWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -6458,21 +7039,21 @@ func (m *LaunchSchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *PingTabletRequest) MarshalVT() (dAtA []byte, err error) { +func (m *MaterializeCreateRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6485,12 +7066,12 @@ func (m *PingTabletRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PingTabletRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *MaterializeCreateRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PingTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *MaterializeCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6502,29 +7083,34 @@ func (m *PingTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.ClusterIds) > 0 { - for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ClusterIds[iNdEx]) - copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if m.Alias != nil { - size, err := m.Alias.MarshalToSizedBufferVT(dAtA[:i]) + if m.Request != nil { + size, err := m.Request.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + if len(m.TableSettings) > 0 { + i -= len(m.TableSettings) + copy(dAtA[i:], m.TableSettings) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableSettings))) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *PingTabletResponse) MarshalVT() (dAtA []byte, err error) { +func (m *MoveTablesCompleteRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6537,12 +7123,12 @@ func (m *PingTabletResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PingTabletResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *MoveTablesCompleteRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PingTabletResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *MoveTablesCompleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6554,27 +7140,27 @@ func (m *PingTabletResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Cluster != nil { - size, err := m.Cluster.MarshalToSizedBufferVT(dAtA[:i]) + if m.Request != nil { + size, err := m.Request.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarint(dAtA, i, uint64(len(m.Status))) + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *PlannedFailoverShardRequest) MarshalVT() (dAtA []byte, err error) { +func (m *MoveTablesCreateRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6587,12 +7173,12 @@ func (m *PlannedFailoverShardRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlannedFailoverShardRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *MoveTablesCreateRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PlannedFailoverShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *MoveTablesCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6604,27 +7190,27 @@ func (m *PlannedFailoverShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Options != nil { - size, err := m.Options.MarshalToSizedBufferVT(dAtA[:i]) + if m.Request != nil { + size, err := m.Request.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *PlannedFailoverShardResponse) MarshalVT() (dAtA []byte, err error) { +func (m *PingTabletRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -6637,12 +7223,12 @@ func (m *PlannedFailoverShardResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlannedFailoverShardResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *PingTabletRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *PlannedFailoverShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *PingTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -6654,39 +7240,191 @@ func (m *PlannedFailoverShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Events) > 0 { - for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { - size, err := m.Events[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) + if len(m.ClusterIds) > 0 { + for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ClusterIds[iNdEx]) + copy(dAtA[i:], m.ClusterIds[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x12 } } - if m.PromotedPrimary != nil { - size, err := m.PromotedPrimary.MarshalToSizedBufferVT(dAtA[:i]) + if m.Alias != nil { + size, err := m.Alias.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- - dAtA[i] = 0x22 + dAtA[i] = 0xa } - if len(m.Shard) > 0 { - i -= len(m.Shard) - copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) - i-- - dAtA[i] = 0x1a + return len(dAtA) - i, nil +} + +func (m *PingTabletResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PingTabletResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *PingTabletResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Cluster != nil { + size, err := m.Cluster.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PlannedFailoverShardRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PlannedFailoverShardRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *PlannedFailoverShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Options != nil { + size, err := m.Options.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PlannedFailoverShardResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PlannedFailoverShardResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *PlannedFailoverShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Events) > 0 { + for iNdEx := len(m.Events) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Events[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x2a + } + } + if m.PromotedPrimary != nil { + size, err := m.PromotedPrimary.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + if len(m.Shard) > 0 { + i -= len(m.Shard) + copy(dAtA[i:], m.Shard) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) + i-- + dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } @@ -6696,7 +7434,7 @@ func (m *PlannedFailoverShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -6747,7 +7485,7 @@ func (m *RebuildKeyspaceGraphRequest) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -6755,14 +7493,14 @@ func (m *RebuildKeyspaceGraphRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -6802,7 +7540,7 @@ func (m *RebuildKeyspaceGraphResponse) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) - i = encodeVarint(dAtA, i, uint64(len(m.Status))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) i-- dAtA[i] = 0xa } @@ -6843,7 +7581,7 @@ func (m *RefreshStateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -6854,7 +7592,7 @@ func (m *RefreshStateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -6897,14 +7635,14 @@ func (m *RefreshStateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) - i = encodeVarint(dAtA, i, uint64(len(m.Status))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) i-- dAtA[i] = 0xa } @@ -6954,12 +7692,12 @@ func (m *ReloadSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.WaitPosition) > 0 { i -= len(m.WaitPosition) copy(dAtA[i:], m.WaitPosition) - i = encodeVarint(dAtA, i, uint64(len(m.WaitPosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WaitPosition))) i-- dAtA[i] = 0x32 } if m.Concurrency != 0 { - i = encodeVarint(dAtA, i, uint64(m.Concurrency)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Concurrency)) i-- dAtA[i] = 0x28 } @@ -6967,7 +7705,7 @@ func (m *ReloadSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -6979,7 +7717,7 @@ func (m *ReloadSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -6988,7 +7726,7 @@ func (m *ReloadSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.KeyspaceShards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.KeyspaceShards[iNdEx]) copy(dAtA[i:], m.KeyspaceShards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.KeyspaceShards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.KeyspaceShards[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -6997,7 +7735,7 @@ func (m *ReloadSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Keyspaces) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Keyspaces[iNdEx]) copy(dAtA[i:], m.Keyspaces[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspaces[iNdEx]))) i-- dAtA[i] = 0xa } @@ -7042,7 +7780,7 @@ func (m *ReloadSchemasResponse_KeyspaceResult) MarshalToSizedBufferVT(dAtA []byt return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -7053,7 +7791,7 @@ func (m *ReloadSchemasResponse_KeyspaceResult) MarshalToSizedBufferVT(dAtA []byt return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7097,7 +7835,7 @@ func (m *ReloadSchemasResponse_ShardResult) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -7108,7 +7846,7 @@ func (m *ReloadSchemasResponse_ShardResult) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7148,7 +7886,7 @@ func (m *ReloadSchemasResponse_TabletResult) MarshalToSizedBufferVT(dAtA []byte) if len(m.Result) > 0 { i -= len(m.Result) copy(dAtA[i:], m.Result) - i = encodeVarint(dAtA, i, uint64(len(m.Result))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Result))) i-- dAtA[i] = 0x12 } @@ -7158,7 +7896,7 @@ func (m *ReloadSchemasResponse_TabletResult) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7202,7 +7940,7 @@ func (m *ReloadSchemasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -7214,7 +7952,7 @@ func (m *ReloadSchemasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -7226,7 +7964,7 @@ func (m *ReloadSchemasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7265,7 +8003,7 @@ func (m *ReloadSchemaShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err copy(dAtA[i:], m.unknownFields) } if m.Concurrency != 0 { - i = encodeVarint(dAtA, i, uint64(m.Concurrency)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Concurrency)) i-- dAtA[i] = 0x30 } @@ -7282,28 +8020,28 @@ func (m *ReloadSchemaShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err if len(m.WaitPosition) > 0 { i -= len(m.WaitPosition) copy(dAtA[i:], m.WaitPosition) - i = encodeVarint(dAtA, i, uint64(len(m.WaitPosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WaitPosition))) i-- dAtA[i] = 0x22 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -7347,7 +8085,7 @@ func (m *ReloadSchemaShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7389,7 +8127,7 @@ func (m *RefreshTabletReplicationSourceRequest) MarshalToSizedBufferVT(dAtA []by for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -7400,7 +8138,7 @@ func (m *RefreshTabletReplicationSourceRequest) MarshalToSizedBufferVT(dAtA []by return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7443,7 +8181,7 @@ func (m *RefreshTabletReplicationSourceResponse) MarshalToSizedBufferVT(dAtA []b return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -7453,21 +8191,21 @@ func (m *RefreshTabletReplicationSourceResponse) MarshalToSizedBufferVT(dAtA []b return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -7527,21 +8265,21 @@ func (m *RemoveKeyspaceCellRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -7581,7 +8319,7 @@ func (m *RemoveKeyspaceCellResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) - i = encodeVarint(dAtA, i, uint64(len(m.Status))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) i-- dAtA[i] = 0xa } @@ -7624,14 +8362,14 @@ func (m *RetrySchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -7672,7 +8410,7 @@ func (m *RunHealthCheckRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -7683,7 +8421,7 @@ func (m *RunHealthCheckRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7726,14 +8464,64 @@ func (m *RunHealthCheckResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) - i = encodeVarint(dAtA, i, uint64(len(m.Status))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ReshardCreateRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ReshardCreateRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ReshardCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Request != nil { + size, err := m.Request.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -7774,7 +8562,7 @@ func (m *SetReadOnlyRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -7785,7 +8573,7 @@ func (m *SetReadOnlyRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7859,7 +8647,7 @@ func (m *SetReadWriteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -7870,7 +8658,7 @@ func (m *SetReadWriteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7944,7 +8732,7 @@ func (m *StartReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -7955,7 +8743,7 @@ func (m *StartReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7998,14 +8786,14 @@ func (m *StartReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) - i = encodeVarint(dAtA, i, uint64(len(m.Status))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) i-- dAtA[i] = 0xa } @@ -8046,7 +8834,7 @@ func (m *StopReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -8057,7 +8845,7 @@ func (m *StopReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8100,14 +8888,14 @@ func (m *StopReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) - i = encodeVarint(dAtA, i, uint64(len(m.Status))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) i-- dAtA[i] = 0xa } @@ -8148,7 +8936,7 @@ func (m *TabletExternallyPromotedRequest) MarshalToSizedBufferVT(dAtA []byte) (i for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -8159,7 +8947,7 @@ func (m *TabletExternallyPromotedRequest) MarshalToSizedBufferVT(dAtA []byte) (i return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8202,7 +8990,7 @@ func (m *TabletExternallyPromotedResponse) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -8212,21 +9000,21 @@ func (m *TabletExternallyPromotedResponse) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } @@ -8236,7 +9024,7 @@ func (m *TabletExternallyPromotedResponse) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8277,7 +9065,7 @@ func (m *TabletExternallyReparentedRequest) MarshalToSizedBufferVT(dAtA []byte) for iNdEx := len(m.ClusterIds) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ClusterIds[iNdEx]) copy(dAtA[i:], m.ClusterIds[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterIds[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -8288,7 +9076,7 @@ func (m *TabletExternallyReparentedRequest) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8338,7 +9126,7 @@ func (m *ValidateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -8388,14 +9176,14 @@ func (m *ValidateKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -8435,14 +9223,14 @@ func (m *ValidateSchemaKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -8492,21 +9280,21 @@ func (m *ValidateShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -8546,14 +9334,14 @@ func (m *ValidateVersionKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (in if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } @@ -8593,28 +9381,28 @@ func (m *ValidateVersionShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.ClusterId) > 0 { i -= len(m.ClusterId) copy(dAtA[i:], m.ClusterId) - i = encodeVarint(dAtA, i, uint64(len(m.ClusterId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *VTExplainRequest) MarshalVT() (dAtA []byte, err error) { +func (m *VDiffCreateRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8627,12 +9415,12 @@ func (m *VTExplainRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VTExplainRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *VDiffCreateRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VTExplainRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8644,31 +9432,27 @@ func (m *VTExplainRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Sql) > 0 { - i -= len(m.Sql) - copy(dAtA[i:], m.Sql) - i = encodeVarint(dAtA, i, uint64(len(m.Sql))) - i-- - dAtA[i] = 0x1a - } - if len(m.Keyspace) > 0 { - i -= len(m.Keyspace) - copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + if m.Request != nil { + size, err := m.Request.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } - if len(m.Cluster) > 0 { - i -= len(m.Cluster) - copy(dAtA[i:], m.Cluster) - i = encodeVarint(dAtA, i, uint64(len(m.Cluster))) + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *VTExplainResponse) MarshalVT() (dAtA []byte, err error) { +func (m *VDiffShowRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -8681,12 +9465,12 @@ func (m *VTExplainResponse) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VTExplainResponse) MarshalToVT(dAtA []byte) (int, error) { +func (m *VDiffShowRequest) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VTExplainResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VDiffShowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -8698,40 +9482,313 @@ func (m *VTExplainResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if len(m.Response) > 0 { - i -= len(m.Response) - copy(dAtA[i:], m.Response) - i = encodeVarint(dAtA, i, uint64(len(m.Response))) + if m.Request != nil { + size, err := m.Request.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.ClusterId) > 0 { + i -= len(m.ClusterId) + copy(dAtA[i:], m.ClusterId) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ClusterId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Cluster) SizeVT() (n int) { +func (m *VDiffProgress) MarshalVT() (dAtA []byte, err error) { if m == nil { - return 0 + return nil, nil } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sov(uint64(l)) + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err } - l = len(m.Name) + return dAtA[:n], nil +} + +func (m *VDiffProgress) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *VDiffProgress) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Eta) > 0 { + i -= len(m.Eta) + copy(dAtA[i:], m.Eta) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Eta))) + i-- + dAtA[i] = 0x12 + } + if m.Percentage != 0 { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Percentage)))) + i-- + dAtA[i] = 0x9 + } + return len(dAtA) - i, nil +} + +func (m *VDiffShardReport) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VDiffShardReport) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *VDiffShardReport) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Progress != nil { + size, err := m.Progress.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x32 + } + if len(m.CompletedAt) > 0 { + i -= len(m.CompletedAt) + copy(dAtA[i:], m.CompletedAt) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CompletedAt))) + i-- + dAtA[i] = 0x2a + } + if len(m.StartedAt) > 0 { + i -= len(m.StartedAt) + copy(dAtA[i:], m.StartedAt) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.StartedAt))) + i-- + dAtA[i] = 0x22 + } + if m.HasMismatch { + i-- + if m.HasMismatch { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.RowsCompared != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowsCompared)) + i-- + dAtA[i] = 0x10 + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *VDiffShowResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VDiffShowResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *VDiffShowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.ShardReport) > 0 { + for k := range m.ShardReport { + v := m.ShardReport[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *VTExplainRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VTExplainRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *VTExplainRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Sql) > 0 { + i -= len(m.Sql) + copy(dAtA[i:], m.Sql) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sql))) + i-- + dAtA[i] = 0x1a + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0x12 + } + if len(m.Cluster) > 0 { + i -= len(m.Cluster) + copy(dAtA[i:], m.Cluster) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cluster))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *VTExplainResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VTExplainResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *VTExplainResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Response) > 0 { + i -= len(m.Response) + copy(dAtA[i:], m.Response) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Response))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Cluster) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -8745,11 +9802,11 @@ func (m *ClusterBackup) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Backup != nil { l = m.Backup.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -8763,7 +9820,7 @@ func (m *ClusterCellsAliases) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Aliases) > 0 { for k, v := range m.Aliases { @@ -8773,9 +9830,9 @@ func (m *ClusterCellsAliases) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -8790,15 +9847,15 @@ func (m *ClusterCellInfo) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CellInfo != nil { l = m.CellInfo.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -8812,19 +9869,19 @@ func (m *ClusterShardReplicationPosition) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PositionInfo != nil { l = m.PositionInfo.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -8839,13 +9896,13 @@ func (m *ClusterWorkflows) SizeVT() (n int) { if len(m.Workflows) > 0 { for _, e := range m.Workflows { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Warnings) > 0 { for _, s := range m.Warnings { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -8860,11 +9917,11 @@ func (m *Keyspace) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Keyspace != nil { l = m.Keyspace.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Shards) > 0 { for k, v := range m.Shards { @@ -8874,9 +9931,9 @@ func (m *Keyspace) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -8890,10 +9947,10 @@ func (m *Schema_ShardTableSize) SizeVT() (n int) { var l int _ = l if m.RowCount != 0 { - n += 1 + sov(uint64(m.RowCount)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowCount)) } if m.DataLength != 0 { - n += 1 + sov(uint64(m.DataLength)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.DataLength)) } n += len(m.unknownFields) return n @@ -8906,10 +9963,10 @@ func (m *Schema_TableSize) SizeVT() (n int) { var l int _ = l if m.RowCount != 0 { - n += 1 + sov(uint64(m.RowCount)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowCount)) } if m.DataLength != 0 { - n += 1 + sov(uint64(m.DataLength)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.DataLength)) } if len(m.ByShard) > 0 { for k, v := range m.ByShard { @@ -8919,9 +9976,9 @@ func (m *Schema_TableSize) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -8936,16 +9993,16 @@ func (m *Schema) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.TableDefinitions) > 0 { for _, e := range m.TableDefinitions { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TableSizes) > 0 { @@ -8956,9 +10013,9 @@ func (m *Schema) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -8973,11 +10030,11 @@ func (m *SchemaMigration) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SchemaMigration != nil { l = m.SchemaMigration.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -8991,11 +10048,11 @@ func (m *Shard) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Shard != nil { l = m.Shard.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9009,15 +10066,15 @@ func (m *SrvVSchema) SizeVT() (n int) { _ = l l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SrvVSchema != nil { l = m.SrvVSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9031,18 +10088,18 @@ func (m *Tablet) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.State != 0 { - n += 1 + sov(uint64(m.State)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.State)) } l = len(m.FQDN) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9056,15 +10113,15 @@ func (m *VSchema) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.VSchema != nil { l = m.VSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9078,15 +10135,15 @@ func (m *Vtctld) SizeVT() (n int) { _ = l l = len(m.Hostname) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.FQDN) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9100,29 +10157,29 @@ func (m *VTGate) SizeVT() (n int) { _ = l l = len(m.Hostname) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Pool) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Keyspaces) > 0 { for _, s := range m.Keyspaces { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.FQDN) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9136,21 +10193,21 @@ func (m *Workflow) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Workflow != nil { l = m.Workflow.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *ApplySchemaRequest) SizeVT() (n int) { +func (m *WorkflowDeleteRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -9158,17 +10215,17 @@ func (m *ApplySchemaRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Request != nil { l = m.Request.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *CancelSchemaMigrationRequest) SizeVT() (n int) { +func (m *WorkflowSwitchTrafficRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -9176,17 +10233,17 @@ func (m *CancelSchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Request != nil { l = m.Request.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *CleanupSchemaMigrationRequest) SizeVT() (n int) { +func (m *ApplySchemaRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -9194,17 +10251,17 @@ func (m *CleanupSchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Request != nil { l = m.Request.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *CompleteSchemaMigrationRequest) SizeVT() (n int) { +func (m *CancelSchemaMigrationRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -9212,17 +10269,17 @@ func (m *CompleteSchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Request != nil { l = m.Request.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *CreateKeyspaceRequest) SizeVT() (n int) { +func (m *CleanupSchemaMigrationRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -9230,31 +10287,35 @@ func (m *CreateKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.Options != nil { - l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + if m.Request != nil { + l = m.Request.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *CreateKeyspaceResponse) SizeVT() (n int) { +func (m *CompleteSchemaMigrationRequest) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Keyspace != nil { - l = m.Keyspace.SizeVT() - n += 1 + l + sov(uint64(l)) + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Request != nil { + l = m.Request.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *CreateShardRequest) SizeVT() (n int) { +func (m *ConcludeTransactionRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -9262,17 +10323,17 @@ func (m *CreateShardRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.Options != nil { - l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + l = len(m.Dtid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func (m *DeleteKeyspaceRequest) SizeVT() (n int) { +func (m *CreateKeyspaceRequest) SizeVT() (n int) { if m == nil { return 0 } @@ -9280,11 +10341,61 @@ func (m *DeleteKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *CreateKeyspaceResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Keyspace != nil { + l = m.Keyspace.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *CreateShardRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Options != nil { + l = m.Options.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *DeleteKeyspaceRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Options != nil { + l = m.Options.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9298,11 +10409,11 @@ func (m *DeleteShardsRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9316,12 +10427,12 @@ func (m *DeleteTabletRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.AllowPrimary { @@ -9339,11 +10450,11 @@ func (m *DeleteTabletResponse) SizeVT() (n int) { _ = l l = len(m.Status) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9357,11 +10468,11 @@ func (m *EmergencyFailoverShardRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9375,24 +10486,24 @@ func (m *EmergencyFailoverShardResponse) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PromotedPrimary != nil { l = m.PromotedPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9407,17 +10518,17 @@ func (m *FindSchemaRequest) SizeVT() (n int) { _ = l l = len(m.Table) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.TableSizeOptions != nil { l = m.TableSizeOptions.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9432,24 +10543,24 @@ func (m *GetBackupsRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Keyspaces) > 0 { for _, s := range m.Keyspaces { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.KeyspaceShards) > 0 { for _, s := range m.KeyspaceShards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.RequestOptions != nil { l = m.RequestOptions.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9464,7 +10575,7 @@ func (m *GetBackupsResponse) SizeVT() (n int) { if len(m.Backups) > 0 { for _, e := range m.Backups { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9480,13 +10591,13 @@ func (m *GetCellInfosRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.NamesOnly { @@ -9505,7 +10616,7 @@ func (m *GetCellInfosResponse) SizeVT() (n int) { if len(m.CellInfos) > 0 { for _, e := range m.CellInfos { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9521,7 +10632,7 @@ func (m *GetCellsAliasesRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9537,7 +10648,7 @@ func (m *GetCellsAliasesResponse) SizeVT() (n int) { if len(m.Aliases) > 0 { for _, e := range m.Aliases { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9563,7 +10674,7 @@ func (m *GetClustersResponse) SizeVT() (n int) { if len(m.Clusters) > 0 { for _, e := range m.Clusters { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9578,11 +10689,11 @@ func (m *GetFullStatusRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9597,7 +10708,7 @@ func (m *GetGatesRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9613,7 +10724,7 @@ func (m *GetGatesResponse) SizeVT() (n int) { if len(m.Gates) > 0 { for _, e := range m.Gates { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9628,11 +10739,11 @@ func (m *GetKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9647,7 +10758,7 @@ func (m *GetKeyspacesRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9663,7 +10774,7 @@ func (m *GetKeyspacesResponse) SizeVT() (n int) { if len(m.Keyspaces) > 0 { for _, e := range m.Keyspaces { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9678,19 +10789,19 @@ func (m *GetSchemaRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Table) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TableSizeOptions != nil { l = m.TableSizeOptions.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9705,12 +10816,12 @@ func (m *GetSchemasRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.TableSizeOptions != nil { l = m.TableSizeOptions.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9725,7 +10836,7 @@ func (m *GetSchemasResponse) SizeVT() (n int) { if len(m.Schemas) > 0 { for _, e := range m.Schemas { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9740,11 +10851,11 @@ func (m *GetSchemaMigrationsRequest_ClusterRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Request != nil { l = m.Request.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9759,7 +10870,7 @@ func (m *GetSchemaMigrationsRequest) SizeVT() (n int) { if len(m.ClusterRequests) > 0 { for _, e := range m.ClusterRequests { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9775,7 +10886,7 @@ func (m *GetSchemaMigrationsResponse) SizeVT() (n int) { if len(m.SchemaMigrations) > 0 { for _, e := range m.SchemaMigrations { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9791,19 +10902,19 @@ func (m *GetShardReplicationPositionsRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Keyspaces) > 0 { for _, s := range m.Keyspaces { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.KeyspaceShards) > 0 { for _, s := range m.KeyspaceShards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9819,7 +10930,7 @@ func (m *GetShardReplicationPositionsResponse) SizeVT() (n int) { if len(m.ReplicationPositions) > 0 { for _, e := range m.ReplicationPositions { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9834,16 +10945,16 @@ func (m *GetSrvKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9859,13 +10970,13 @@ func (m *GetSrvKeyspacesRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9886,9 +10997,9 @@ func (m *GetSrvKeyspacesResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -9903,11 +11014,11 @@ func (m *GetSrvVSchemaRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -9922,13 +11033,13 @@ func (m *GetSrvVSchemasRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9944,7 +11055,7 @@ func (m *GetSrvVSchemasResponse) SizeVT() (n int) { if len(m.SrvVSchemas) > 0 { for _, e := range m.SrvVSchemas { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9975,12 +11086,12 @@ func (m *GetTabletRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -9996,7 +11107,7 @@ func (m *GetTabletsRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10012,7 +11123,7 @@ func (m *GetTabletsResponse) SizeVT() (n int) { if len(m.Tablets) > 0 { for _, e := range m.Tablets { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10027,11 +11138,32 @@ func (m *GetTopologyPathRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Path) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *GetUnresolvedTransactionsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.AbandonAge != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.AbandonAge)) } n += len(m.unknownFields) return n @@ -10045,11 +11177,11 @@ func (m *GetVSchemaRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10064,7 +11196,7 @@ func (m *GetVSchemasRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10080,7 +11212,7 @@ func (m *GetVSchemasResponse) SizeVT() (n int) { if len(m.VSchemas) > 0 { for _, e := range m.VSchemas { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10096,7 +11228,7 @@ func (m *GetVtctldsRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10112,7 +11244,7 @@ func (m *GetVtctldsResponse) SizeVT() (n int) { if len(m.Vtctlds) > 0 { for _, e := range m.Vtctlds { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10127,15 +11259,15 @@ func (m *GetWorkflowRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ActiveOnly { n += 2 @@ -10144,6 +11276,72 @@ func (m *GetWorkflowRequest) SizeVT() (n int) { return n } +func (m *GetWorkflowStatusRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *StartWorkflowRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Workflow) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *StopWorkflowRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.Workflow) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + func (m *GetWorkflowsRequest) SizeVT() (n int) { if m == nil { return 0 @@ -10153,7 +11351,7 @@ func (m *GetWorkflowsRequest) SizeVT() (n int) { if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.ActiveOnly { @@ -10162,13 +11360,13 @@ func (m *GetWorkflowsRequest) SizeVT() (n int) { if len(m.Keyspaces) > 0 { for _, s := range m.Keyspaces { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.IgnoreKeyspaces) > 0 { for _, s := range m.IgnoreKeyspaces { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10189,9 +11387,9 @@ func (m *GetWorkflowsResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -10206,11 +11404,69 @@ func (m *LaunchSchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Request != nil { + l = m.Request.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MaterializeCreateRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.TableSettings) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Request != nil { + l = m.Request.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MoveTablesCompleteRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Request != nil { + l = m.Request.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *MoveTablesCreateRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Request != nil { l = m.Request.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10224,12 +11480,12 @@ func (m *PingTabletRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10244,11 +11500,11 @@ func (m *PingTabletResponse) SizeVT() (n int) { _ = l l = len(m.Status) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10262,11 +11518,11 @@ func (m *PlannedFailoverShardRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10280,24 +11536,24 @@ func (m *PlannedFailoverShardResponse) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PromotedPrimary != nil { l = m.PromotedPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10312,16 +11568,16 @@ func (m *RebuildKeyspaceGraphRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.AllowPartial { @@ -10339,7 +11595,7 @@ func (m *RebuildKeyspaceGraphResponse) SizeVT() (n int) { _ = l l = len(m.Status) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10353,12 +11609,12 @@ func (m *RefreshStateRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10373,11 +11629,11 @@ func (m *RefreshStateResponse) SizeVT() (n int) { _ = l l = len(m.Status) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10392,33 +11648,33 @@ func (m *ReloadSchemasRequest) SizeVT() (n int) { if len(m.Keyspaces) > 0 { for _, s := range m.Keyspaces { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.KeyspaceShards) > 0 { for _, s := range m.KeyspaceShards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Tablets) > 0 { for _, e := range m.Tablets { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Concurrency != 0 { - n += 1 + sov(uint64(m.Concurrency)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Concurrency)) } l = len(m.WaitPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.IncludePrimary { n += 2 @@ -10435,12 +11691,12 @@ func (m *ReloadSchemasResponse_KeyspaceResult) SizeVT() (n int) { _ = l if m.Keyspace != nil { l = m.Keyspace.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10455,12 +11711,12 @@ func (m *ReloadSchemasResponse_ShardResult) SizeVT() (n int) { _ = l if m.Shard != nil { l = m.Shard.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10475,11 +11731,11 @@ func (m *ReloadSchemasResponse_TabletResult) SizeVT() (n int) { _ = l if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Result) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10494,19 +11750,19 @@ func (m *ReloadSchemasResponse) SizeVT() (n int) { if len(m.KeyspaceResults) > 0 { for _, e := range m.KeyspaceResults { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ShardResults) > 0 { for _, e := range m.ShardResults { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TabletResults) > 0 { for _, e := range m.TabletResults { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10521,25 +11777,25 @@ func (m *ReloadSchemaShardRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.WaitPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.IncludePrimary { n += 2 } if m.Concurrency != 0 { - n += 1 + sov(uint64(m.Concurrency)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Concurrency)) } n += len(m.unknownFields) return n @@ -10554,7 +11810,7 @@ func (m *ReloadSchemaShardResponse) SizeVT() (n int) { if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10569,12 +11825,12 @@ func (m *RefreshTabletReplicationSourceRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10589,19 +11845,19 @@ func (m *RefreshTabletReplicationSourceResponse) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Primary != nil { l = m.Primary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10615,15 +11871,15 @@ func (m *RemoveKeyspaceCellRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Force { n += 2 @@ -10643,7 +11899,7 @@ func (m *RemoveKeyspaceCellResponse) SizeVT() (n int) { _ = l l = len(m.Status) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10657,11 +11913,11 @@ func (m *RetrySchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Request != nil { l = m.Request.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10675,12 +11931,12 @@ func (m *RunHealthCheckRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10695,11 +11951,29 @@ func (m *RunHealthCheckResponse) SizeVT() (n int) { _ = l l = len(m.Status) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *ReshardCreateRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Request != nil { + l = m.Request.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10713,12 +11987,12 @@ func (m *SetReadOnlyRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10743,12 +12017,12 @@ func (m *SetReadWriteRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10773,12 +12047,12 @@ func (m *StartReplicationRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10793,11 +12067,11 @@ func (m *StartReplicationResponse) SizeVT() (n int) { _ = l l = len(m.Status) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10811,12 +12085,12 @@ func (m *StopReplicationRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10831,11 +12105,11 @@ func (m *StopReplicationResponse) SizeVT() (n int) { _ = l l = len(m.Status) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10849,12 +12123,12 @@ func (m *TabletExternallyPromotedRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10869,23 +12143,23 @@ func (m *TabletExternallyPromotedResponse) SizeVT() (n int) { _ = l if m.Cluster != nil { l = m.Cluster.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.NewPrimary != nil { l = m.NewPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.OldPrimary != nil { l = m.OldPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10899,12 +12173,12 @@ func (m *TabletExternallyReparentedRequest) SizeVT() (n int) { _ = l if m.Alias != nil { l = m.Alias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ClusterIds) > 0 { for _, s := range m.ClusterIds { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -10919,7 +12193,7 @@ func (m *ValidateRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PingTablets { n += 2 @@ -10936,11 +12210,11 @@ func (m *ValidateKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PingTablets { n += 2 @@ -10957,11 +12231,11 @@ func (m *ValidateSchemaKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -10975,15 +12249,15 @@ func (m *ValidateShardRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PingTablets { n += 2 @@ -11000,11 +12274,11 @@ func (m *ValidateVersionKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -11018,15 +12292,123 @@ func (m *ValidateVersionShardRequest) SizeVT() (n int) { _ = l l = len(m.ClusterId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffCreateRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Request != nil { + l = m.Request.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffShowRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClusterId) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Request != nil { + l = m.Request.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffProgress) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Percentage != 0 { + n += 9 + } + l = len(m.Eta) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffShardReport) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.State) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.RowsCompared != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowsCompared)) + } + if m.HasMismatch { + n += 2 + } + l = len(m.StartedAt) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + l = len(m.CompletedAt) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.Progress != nil { + l = m.Progress.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *VDiffShowResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ShardReport) > 0 { + for k, v := range m.ShardReport { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } } n += len(m.unknownFields) return n @@ -11040,15 +12422,15 @@ func (m *VTExplainRequest) SizeVT() (n int) { _ = l l = len(m.Cluster) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Sql) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -11062,18 +12444,12 @@ func (m *VTExplainResponse) SizeVT() (n int) { _ = l l = len(m.Response) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *Cluster) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -11082,7 +12458,7 @@ func (m *Cluster) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11110,7 +12486,7 @@ func (m *Cluster) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11124,11 +12500,11 @@ func (m *Cluster) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11142,7 +12518,7 @@ func (m *Cluster) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11156,11 +12532,11 @@ func (m *Cluster) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11169,12 +12545,12 @@ func (m *Cluster) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11197,7 +12573,7 @@ func (m *ClusterBackup) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11225,7 +12601,7 @@ func (m *ClusterBackup) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11238,11 +12614,11 @@ func (m *ClusterBackup) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11261,7 +12637,7 @@ func (m *ClusterBackup) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11274,11 +12650,11 @@ func (m *ClusterBackup) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11292,12 +12668,12 @@ func (m *ClusterBackup) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11320,7 +12696,7 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11348,7 +12724,7 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11361,11 +12737,11 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11384,7 +12760,7 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11397,11 +12773,11 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11416,7 +12792,7 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11433,7 +12809,7 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11447,11 +12823,11 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -11462,7 +12838,7 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11475,11 +12851,11 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -11491,12 +12867,12 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -11508,12 +12884,12 @@ func (m *ClusterCellsAliases) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11536,7 +12912,7 @@ func (m *ClusterCellInfo) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11564,7 +12940,7 @@ func (m *ClusterCellInfo) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11577,11 +12953,11 @@ func (m *ClusterCellInfo) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11600,7 +12976,7 @@ func (m *ClusterCellInfo) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11614,11 +12990,11 @@ func (m *ClusterCellInfo) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11632,7 +13008,7 @@ func (m *ClusterCellInfo) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11645,11 +13021,11 @@ func (m *ClusterCellInfo) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11663,12 +13039,12 @@ func (m *ClusterCellInfo) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11691,7 +13067,7 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11719,7 +13095,7 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11732,11 +13108,11 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11755,7 +13131,7 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11769,11 +13145,11 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11787,7 +13163,7 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11801,11 +13177,11 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11819,7 +13195,7 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11832,11 +13208,11 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11850,12 +13226,12 @@ func (m *ClusterShardReplicationPosition) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11878,7 +13254,7 @@ func (m *ClusterWorkflows) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11906,7 +13282,7 @@ func (m *ClusterWorkflows) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11919,11 +13295,11 @@ func (m *ClusterWorkflows) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11940,7 +13316,7 @@ func (m *ClusterWorkflows) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -11954,11 +13330,11 @@ func (m *ClusterWorkflows) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -11967,12 +13343,12 @@ func (m *ClusterWorkflows) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -11995,7 +13371,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12023,7 +13399,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12036,11 +13412,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12059,7 +13435,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12072,11 +13448,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12095,7 +13471,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12108,11 +13484,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12127,7 +13503,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12144,7 +13520,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12158,11 +13534,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -12173,7 +13549,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12186,11 +13562,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -12202,12 +13578,12 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -12219,12 +13595,12 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12247,7 +13623,7 @@ func (m *Schema_ShardTableSize) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12275,7 +13651,7 @@ func (m *Schema_ShardTableSize) UnmarshalVT(dAtA []byte) error { m.RowCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12294,7 +13670,7 @@ func (m *Schema_ShardTableSize) UnmarshalVT(dAtA []byte) error { m.DataLength = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12308,12 +13684,12 @@ func (m *Schema_ShardTableSize) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12336,7 +13712,7 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12364,7 +13740,7 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { m.RowCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12383,7 +13759,7 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { m.DataLength = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12402,7 +13778,7 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12415,11 +13791,11 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12434,7 +13810,7 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12451,7 +13827,7 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12465,11 +13841,11 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -12480,7 +13856,7 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12493,11 +13869,11 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -12509,12 +13885,12 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -12526,12 +13902,12 @@ func (m *Schema_TableSize) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12554,7 +13930,7 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12582,7 +13958,7 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12595,11 +13971,11 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12618,7 +13994,7 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12632,11 +14008,11 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12650,7 +14026,7 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12663,11 +14039,11 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12684,7 +14060,7 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12697,11 +14073,11 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12716,7 +14092,7 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12733,7 +14109,7 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12747,11 +14123,11 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -12762,7 +14138,7 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12775,11 +14151,11 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -12791,12 +14167,12 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -12808,12 +14184,12 @@ func (m *Schema) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12836,7 +14212,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12864,7 +14240,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12877,11 +14253,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12900,7 +14276,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12913,11 +14289,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -12931,12 +14307,12 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -12959,7 +14335,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -12987,7 +14363,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13000,11 +14376,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13023,7 +14399,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13036,11 +14412,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13054,12 +14430,12 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13082,7 +14458,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13110,7 +14486,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13124,11 +14500,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13142,7 +14518,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13155,11 +14531,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13178,7 +14554,7 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13191,11 +14567,11 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13209,12 +14585,12 @@ func (m *SrvVSchema) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13237,7 +14613,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13265,7 +14641,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13278,11 +14654,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13301,7 +14677,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13314,11 +14690,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13337,7 +14713,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { m.State = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13356,7 +14732,7 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13370,11 +14746,11 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13383,12 +14759,12 @@ func (m *Tablet) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13411,7 +14787,7 @@ func (m *VSchema) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13439,7 +14815,7 @@ func (m *VSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13452,11 +14828,11 @@ func (m *VSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13475,7 +14851,7 @@ func (m *VSchema) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13489,11 +14865,11 @@ func (m *VSchema) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13507,7 +14883,7 @@ func (m *VSchema) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13520,11 +14896,11 @@ func (m *VSchema) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13538,12 +14914,12 @@ func (m *VSchema) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13566,7 +14942,7 @@ func (m *Vtctld) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13594,7 +14970,7 @@ func (m *Vtctld) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13608,11 +14984,11 @@ func (m *Vtctld) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13626,7 +15002,7 @@ func (m *Vtctld) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13639,11 +15015,11 @@ func (m *Vtctld) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13662,7 +15038,7 @@ func (m *Vtctld) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13676,11 +15052,11 @@ func (m *Vtctld) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13689,12 +15065,12 @@ func (m *Vtctld) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13717,7 +15093,7 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13745,7 +15121,7 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13759,11 +15135,11 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13777,7 +15153,7 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13791,11 +15167,11 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13809,7 +15185,7 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13823,11 +15199,11 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13841,7 +15217,7 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13854,11 +15230,11 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13877,7 +15253,7 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13891,11 +15267,11 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13909,7 +15285,7 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13923,11 +15299,11 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -13936,12 +15312,12 @@ func (m *VTGate) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -13964,7 +15340,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13992,7 +15368,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14005,11 +15381,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14028,7 +15404,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14042,11 +15418,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14060,7 +15436,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14073,11 +15449,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14091,12 +15467,12 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14111,7 +15487,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { +func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14119,7 +15495,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14134,10 +15510,10 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplySchemaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: WorkflowDeleteRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplySchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: WorkflowDeleteRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -14147,7 +15523,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14161,11 +15537,11 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14179,7 +15555,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14192,17 +15568,17 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &vtctldata.ApplySchemaRequest{} + m.Request = &vtctldata.WorkflowDeleteRequest{} } if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err @@ -14210,12 +15586,12 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14230,7 +15606,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { +func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14238,7 +15614,7 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14253,10 +15629,10 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CancelSchemaMigrationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: WorkflowSwitchTrafficRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CancelSchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: WorkflowSwitchTrafficRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -14266,7 +15642,7 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14280,11 +15656,11 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14298,7 +15674,7 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14311,17 +15687,17 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &vtctldata.CancelSchemaMigrationRequest{} + m.Request = &vtctldata.WorkflowSwitchTrafficRequest{} } if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err @@ -14329,12 +15705,12 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14349,7 +15725,7 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { +func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14357,7 +15733,7 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14372,10 +15748,10 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CleanupSchemaMigrationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplySchemaRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CleanupSchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplySchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -14385,7 +15761,7 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14399,11 +15775,11 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14417,7 +15793,7 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14430,17 +15806,17 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &vtctldata.CleanupSchemaMigrationRequest{} + m.Request = &vtctldata.ApplySchemaRequest{} } if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err @@ -14448,12 +15824,12 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14468,7 +15844,7 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { +func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14476,7 +15852,7 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14491,10 +15867,10 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CompleteSchemaMigrationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: CancelSchemaMigrationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CompleteSchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CancelSchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -14504,7 +15880,7 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14518,11 +15894,11 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14536,7 +15912,7 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14549,17 +15925,17 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &vtctldata.CompleteSchemaMigrationRequest{} + m.Request = &vtctldata.CancelSchemaMigrationRequest{} } if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err @@ -14567,12 +15943,12 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14587,7 +15963,7 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { +func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14595,7 +15971,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14610,10 +15986,10 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CreateKeyspaceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: CleanupSchemaMigrationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CreateKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CleanupSchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -14623,7 +15999,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14637,11 +16013,11 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14650,12 +16026,12 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14668,30 +16044,30 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Options == nil { - m.Options = &vtctldata.CreateKeyspaceRequest{} + if m.Request == nil { + m.Request = &vtctldata.CleanupSchemaMigrationRequest{} } - if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14706,7 +16082,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { +func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14714,7 +16090,7 @@ func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14729,20 +16105,52 @@ func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CreateKeyspaceResponse: wiretype end group for non-group") + return fmt.Errorf("proto: CompleteSchemaMigrationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CreateKeyspaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CompleteSchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14755,30 +16163,30 @@ func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Keyspace == nil { - m.Keyspace = &Keyspace{} + if m.Request == nil { + m.Request = &vtctldata.CompleteSchemaMigrationRequest{} } - if err := m.Keyspace.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14793,7 +16201,7 @@ func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { +func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14801,7 +16209,7 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14816,10 +16224,10 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CreateShardRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ConcludeTransactionRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CreateShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ConcludeTransactionRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -14829,7 +16237,7 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14843,11 +16251,11 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14856,48 +16264,44 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Dtid", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Options == nil { - m.Options = &vtctldata.CreateShardRequest{} - } - if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Dtid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -14912,7 +16316,7 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { +func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14920,7 +16324,7 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14935,10 +16339,10 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DeleteKeyspaceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: CreateKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DeleteKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CreateKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -14948,7 +16352,7 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14962,11 +16366,11 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -14980,7 +16384,7 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -14993,17 +16397,17 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } if m.Options == nil { - m.Options = &vtctldata.DeleteKeyspaceRequest{} + m.Options = &vtctldata.CreateKeyspaceRequest{} } if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err @@ -15011,12 +16415,12 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15031,7 +16435,7 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { +func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15039,7 +16443,7 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15054,52 +16458,20 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DeleteShardsRequest: wiretype end group for non-group") + return fmt.Errorf("proto: CreateKeyspaceResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DeleteShardsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CreateKeyspaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClusterId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15112,30 +16484,30 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Options == nil { - m.Options = &vtctldata.DeleteShardsRequest{} + if m.Keyspace == nil { + m.Keyspace = &Keyspace{} } - if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Keyspace.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15150,7 +16522,7 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *DeleteTabletRequest) UnmarshalVT(dAtA []byte) error { +func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15158,7 +16530,7 @@ func (m *DeleteTabletRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15173,108 +16545,88 @@ func (m *DeleteTabletRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DeleteTabletRequest: wiretype end group for non-group") + return fmt.Errorf("proto: CreateShardRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DeleteTabletRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CreateShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Alias == nil { - m.Alias = &topodata.TabletAlias{} - } - if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowPrimary", wireType) + if m.Options == nil { + m.Options = &vtctldata.CreateShardRequest{} } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } + if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.AllowPrimary = bool(v != 0) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15289,7 +16641,7 @@ func (m *DeleteTabletRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *DeleteTabletResponse) UnmarshalVT(dAtA []byte) error { +func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15297,7 +16649,7 @@ func (m *DeleteTabletResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15312,20 +16664,20 @@ func (m *DeleteTabletResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DeleteTabletResponse: wiretype end group for non-group") + return fmt.Errorf("proto: DeleteKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DeleteTabletResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DeleteKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15339,25 +16691,25 @@ func (m *DeleteTabletResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Status = string(dAtA[iNdEx:postIndex]) + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15370,30 +16722,30 @@ func (m *DeleteTabletResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Cluster == nil { - m.Cluster = &Cluster{} + if m.Options == nil { + m.Options = &vtctldata.DeleteKeyspaceRequest{} } - if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15408,7 +16760,7 @@ func (m *DeleteTabletResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { +func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15416,7 +16768,7 @@ func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15431,10 +16783,10 @@ func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EmergencyFailoverShardRequest: wiretype end group for non-group") + return fmt.Errorf("proto: DeleteShardsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EmergencyFailoverShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DeleteShardsRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -15444,7 +16796,7 @@ func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15458,11 +16810,11 @@ func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -15476,7 +16828,7 @@ func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15489,17 +16841,17 @@ func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } if m.Options == nil { - m.Options = &vtctldata.EmergencyReparentShardRequest{} + m.Options = &vtctldata.DeleteShardsRequest{} } if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err @@ -15507,12 +16859,12 @@ func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15527,7 +16879,7 @@ func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *EmergencyFailoverShardResponse) UnmarshalVT(dAtA []byte) error { +func (m *DeleteTabletRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15535,7 +16887,7 @@ func (m *EmergencyFailoverShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15550,20 +16902,20 @@ func (m *EmergencyFailoverShardResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EmergencyFailoverShardResponse: wiretype end group for non-group") + return fmt.Errorf("proto: DeleteTabletRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EmergencyFailoverShardResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DeleteTabletRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15576,30 +16928,30 @@ func (m *EmergencyFailoverShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Cluster == nil { - m.Cluster = &Cluster{} + if m.Alias == nil { + m.Alias = &topodata.TabletAlias{} } - if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15613,93 +16965,128 @@ func (m *EmergencyFailoverShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) - } - var stringLen uint64 + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowPrimary", wireType) + } + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + m.AllowPrimary = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.Shard = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeleteTabletResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeleteTabletResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeleteTabletResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PromotedPrimary", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.PromotedPrimary == nil { - m.PromotedPrimary = &topodata.TabletAlias{} - } - if err := m.PromotedPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15712,28 +17099,30 @@ func (m *EmergencyFailoverShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Events = append(m.Events, &logutil.Event{}) - if err := m.Events[len(m.Events)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if m.Cluster == nil { + m.Cluster = &Cluster{} + } + if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15748,7 +17137,7 @@ func (m *EmergencyFailoverShardResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *FindSchemaRequest) UnmarshalVT(dAtA []byte) error { +func (m *EmergencyFailoverShardRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15756,7 +17145,7 @@ func (m *FindSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15771,20 +17160,20 @@ func (m *FindSchemaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: FindSchemaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: EmergencyFailoverShardRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: FindSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EmergencyFailoverShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Table", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15798,57 +17187,25 @@ func (m *FindSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Table = string(dAtA[iNdEx:postIndex]) + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TableSizeOptions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15861,30 +17218,30 @@ func (m *FindSchemaRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.TableSizeOptions == nil { - m.TableSizeOptions = &GetSchemaTableSizeOptions{} + if m.Options == nil { + m.Options = &vtctldata.EmergencyReparentShardRequest{} } - if err := m.TableSizeOptions.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -15899,7 +17256,7 @@ func (m *FindSchemaRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { +func (m *EmergencyFailoverShardResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15907,7 +17264,7 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15922,52 +17279,56 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetBackupsRequest: wiretype end group for non-group") + return fmt.Errorf("proto: EmergencyFailoverShardResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetBackupsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EmergencyFailoverShardResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + if m.Cluster == nil { + m.Cluster = &Cluster{} + } + if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspaces", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -15981,25 +17342,25 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspaces = append(m.Keyspaces, string(dAtA[iNdEx:postIndex])) + m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KeyspaceShards", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16013,25 +17374,25 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.KeyspaceShards = append(m.KeyspaceShards, string(dAtA[iNdEx:postIndex])) + m.Shard = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RequestOptions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PromotedPrimary", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16044,81 +17405,30 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.RequestOptions == nil { - m.RequestOptions = &vtctldata.GetBackupsRequest{} + if m.PromotedPrimary == nil { + m.PromotedPrimary = &topodata.TabletAlias{} } - if err := m.RequestOptions.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.PromotedPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetBackupsResponse) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GetBackupsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetBackupsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Backups", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16131,28 +17441,28 @@ func (m *GetBackupsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Backups = append(m.Backups, &ClusterBackup{}) - if err := m.Backups[len(m.Backups)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.Events = append(m.Events, &logutil.Event{}) + if err := m.Events[len(m.Events)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16167,7 +17477,7 @@ func (m *GetBackupsResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetCellInfosRequest) UnmarshalVT(dAtA []byte) error { +func (m *FindSchemaRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16175,7 +17485,7 @@ func (m *GetCellInfosRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16190,20 +17500,20 @@ func (m *GetCellInfosRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetCellInfosRequest: wiretype end group for non-group") + return fmt.Errorf("proto: FindSchemaRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetCellInfosRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: FindSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Table", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16217,25 +17527,25 @@ func (m *GetCellInfosRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + m.Table = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cells", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16249,45 +17559,61 @@ func (m *GetCellInfosRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Cells = append(m.Cells, string(dAtA[iNdEx:postIndex])) + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NamesOnly", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TableSizeOptions", wireType) } - var v int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - m.NamesOnly = bool(v != 0) - default: + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TableSizeOptions == nil { + m.TableSizeOptions = &GetSchemaTableSizeOptions{} + } + if err := m.TableSizeOptions.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16302,7 +17628,7 @@ func (m *GetCellInfosRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetCellInfosResponse) UnmarshalVT(dAtA []byte) error { +func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16310,7 +17636,7 @@ func (m *GetCellInfosResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16325,105 +17651,84 @@ func (m *GetCellInfosResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetCellInfosResponse: wiretype end group for non-group") + return fmt.Errorf("proto: GetBackupsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetCellInfosResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetBackupsRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CellInfos", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.CellInfos = append(m.CellInfos, &ClusterCellInfo{}) - if err := m.CellInfos[len(m.CellInfos)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspaces", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetCellsAliasesRequest) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GetCellsAliasesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetCellsAliasesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Keyspaces = append(m.Keyspaces, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KeyspaceShards", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16437,25 +17742,61 @@ func (m *GetCellsAliasesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + m.KeyspaceShards = append(m.KeyspaceShards, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RequestOptions == nil { + m.RequestOptions = &vtctldata.GetBackupsRequest{} + } + if err := m.RequestOptions.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16470,7 +17811,7 @@ func (m *GetCellsAliasesRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { +func (m *GetBackupsResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16478,7 +17819,7 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16493,20 +17834,20 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetCellsAliasesResponse: wiretype end group for non-group") + return fmt.Errorf("proto: GetBackupsResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetCellsAliasesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetBackupsResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Aliases", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Backups", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16519,28 +17860,28 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Aliases = append(m.Aliases, &ClusterCellsAliases{}) - if err := m.Aliases[len(m.Aliases)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.Backups = append(m.Backups, &ClusterBackup{}) + if err := m.Backups[len(m.Backups)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16555,7 +17896,7 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetClustersRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetCellInfosRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16563,7 +17904,7 @@ func (m *GetClustersRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16578,20 +17919,104 @@ func (m *GetClustersRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetClustersRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetCellInfosRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetClustersRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetCellInfosRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cells", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Cells = append(m.Cells, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NamesOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.NamesOnly = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16606,7 +18031,7 @@ func (m *GetClustersRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetClustersResponse) UnmarshalVT(dAtA []byte) error { +func (m *GetCellInfosResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16614,7 +18039,7 @@ func (m *GetClustersResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16629,20 +18054,20 @@ func (m *GetClustersResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetClustersResponse: wiretype end group for non-group") + return fmt.Errorf("proto: GetCellInfosResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetClustersResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetCellInfosResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Clusters", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CellInfos", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16655,28 +18080,28 @@ func (m *GetClustersResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Clusters = append(m.Clusters, &Cluster{}) - if err := m.Clusters[len(m.Clusters)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.CellInfos = append(m.CellInfos, &ClusterCellInfo{}) + if err := m.CellInfos[len(m.CellInfos)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16691,7 +18116,7 @@ func (m *GetClustersResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetCellsAliasesRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16699,7 +18124,7 @@ func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16714,20 +18139,20 @@ func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetFullStatusRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetCellsAliasesRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetFullStatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetCellsAliasesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16741,25 +18166,76 @@ func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterId = string(dAtA[iNdEx:postIndex]) + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 2: + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetCellsAliasesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetCellsAliasesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Aliases", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16772,30 +18248,28 @@ func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Alias == nil { - m.Alias = &topodata.TabletAlias{} - } - if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.Aliases = append(m.Aliases, &ClusterCellsAliases{}) + if err := m.Aliases[len(m.Aliases)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16810,7 +18284,7 @@ func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetGatesRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetClustersRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16818,7 +18292,7 @@ func (m *GetGatesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16833,52 +18307,20 @@ func (m *GetGatesRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetGatesRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetClustersRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetGatesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetClustersRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16893,7 +18335,7 @@ func (m *GetGatesRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetGatesResponse) UnmarshalVT(dAtA []byte) error { +func (m *GetClustersResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16901,7 +18343,7 @@ func (m *GetGatesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16916,20 +18358,20 @@ func (m *GetGatesResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetGatesResponse: wiretype end group for non-group") + return fmt.Errorf("proto: GetClustersResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetGatesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetClustersResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Gates", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Clusters", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -16942,28 +18384,28 @@ func (m *GetGatesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Gates = append(m.Gates, &VTGate{}) - if err := m.Gates[len(m.Gates)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.Clusters = append(m.Clusters, &Cluster{}) + if err := m.Clusters[len(m.Clusters)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -16978,7 +18420,7 @@ func (m *GetGatesResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16986,7 +18428,7 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17001,10 +18443,10 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetKeyspaceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetFullStatusRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetFullStatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -17014,7 +18456,7 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17028,11 +18470,11 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17041,44 +18483,48 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + if m.Alias == nil { + m.Alias = &topodata.TabletAlias{} + } + if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17093,7 +18539,7 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetGatesRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -17101,7 +18547,7 @@ func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17116,10 +18562,10 @@ func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetKeyspacesRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetGatesRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetKeyspacesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetGatesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -17129,7 +18575,7 @@ func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17143,11 +18589,11 @@ func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17156,12 +18602,12 @@ func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17176,7 +18622,7 @@ func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { +func (m *GetGatesResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -17184,7 +18630,7 @@ func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17199,20 +18645,20 @@ func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetKeyspacesResponse: wiretype end group for non-group") + return fmt.Errorf("proto: GetGatesResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetKeyspacesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetGatesResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspaces", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Gates", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17225,28 +18671,28 @@ func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspaces = append(m.Keyspaces, &Keyspace{}) - if err := m.Keyspaces[len(m.Keyspaces)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.Gates = append(m.Gates, &VTGate{}) + if err := m.Gates[len(m.Gates)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17261,7 +18707,7 @@ func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -17269,7 +18715,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17284,10 +18730,10 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetSchemaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -17297,7 +18743,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17311,11 +18757,11 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17329,7 +18775,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17343,93 +18789,108 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Table", wireType) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - m.Table = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetKeyspacesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetKeyspacesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TableSizeOptions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.TableSizeOptions == nil { - m.TableSizeOptions = &GetSchemaTableSizeOptions{} - } - if err := m.TableSizeOptions.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17444,7 +18905,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetSchemasRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -17452,7 +18913,7 @@ func (m *GetSchemasRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17467,38 +18928,306 @@ func (m *GetSchemasRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetSchemasRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetKeyspacesResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetSchemasRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetKeyspacesResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspaces", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspaces = append(m.Keyspaces, &Keyspace{}) + if err := m.Keyspaces[len(m.Keyspaces)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetSchemaRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Table", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Table = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TableSizeOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TableSizeOptions == nil { + m.TableSizeOptions = &GetSchemaTableSizeOptions{} + } + if err := m.TableSizeOptions.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetSchemasRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetSchemasRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetSchemasRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17512,7 +19241,7 @@ func (m *GetSchemasRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17525,11 +19254,11 @@ func (m *GetSchemasRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17543,12 +19272,12 @@ func (m *GetSchemasRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17571,7 +19300,7 @@ func (m *GetSchemasResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17599,7 +19328,7 @@ func (m *GetSchemasResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17612,11 +19341,11 @@ func (m *GetSchemasResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17628,12 +19357,12 @@ func (m *GetSchemasResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17656,7 +19385,7 @@ func (m *GetSchemaMigrationsRequest_ClusterRequest) UnmarshalVT(dAtA []byte) err var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17684,7 +19413,7 @@ func (m *GetSchemaMigrationsRequest_ClusterRequest) UnmarshalVT(dAtA []byte) err var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17698,11 +19427,11 @@ func (m *GetSchemaMigrationsRequest_ClusterRequest) UnmarshalVT(dAtA []byte) err } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17716,7 +19445,7 @@ func (m *GetSchemaMigrationsRequest_ClusterRequest) UnmarshalVT(dAtA []byte) err var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17729,11 +19458,11 @@ func (m *GetSchemaMigrationsRequest_ClusterRequest) UnmarshalVT(dAtA []byte) err } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17747,12 +19476,12 @@ func (m *GetSchemaMigrationsRequest_ClusterRequest) UnmarshalVT(dAtA []byte) err iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17775,7 +19504,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17803,7 +19532,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17816,11 +19545,11 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17832,12 +19561,12 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17860,7 +19589,7 @@ func (m *GetSchemaMigrationsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17888,7 +19617,7 @@ func (m *GetSchemaMigrationsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17901,11 +19630,11 @@ func (m *GetSchemaMigrationsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -17917,12 +19646,12 @@ func (m *GetSchemaMigrationsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -17945,7 +19674,7 @@ func (m *GetShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17973,7 +19702,7 @@ func (m *GetShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -17987,11 +19716,11 @@ func (m *GetShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18005,7 +19734,7 @@ func (m *GetShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18019,11 +19748,11 @@ func (m *GetShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18037,7 +19766,7 @@ func (m *GetShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18051,11 +19780,11 @@ func (m *GetShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18064,12 +19793,12 @@ func (m *GetShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18092,7 +19821,7 @@ func (m *GetShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18120,7 +19849,7 @@ func (m *GetShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18133,11 +19862,11 @@ func (m *GetShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18149,12 +19878,12 @@ func (m *GetShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18177,7 +19906,7 @@ func (m *GetSrvKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18205,7 +19934,7 @@ func (m *GetSrvKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18219,11 +19948,11 @@ func (m *GetSrvKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18237,7 +19966,7 @@ func (m *GetSrvKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18251,11 +19980,11 @@ func (m *GetSrvKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18269,7 +19998,7 @@ func (m *GetSrvKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18283,11 +20012,11 @@ func (m *GetSrvKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18296,12 +20025,12 @@ func (m *GetSrvKeyspaceRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18324,7 +20053,7 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18352,7 +20081,7 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18366,11 +20095,11 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18384,7 +20113,7 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18398,11 +20127,11 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18411,12 +20140,12 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18439,7 +20168,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18467,7 +20196,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18480,11 +20209,11 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18499,7 +20228,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18516,7 +20245,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18530,11 +20259,11 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -18545,7 +20274,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18558,11 +20287,11 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -18574,12 +20303,12 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -18591,12 +20320,12 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18619,7 +20348,7 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18647,7 +20376,7 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18661,11 +20390,11 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18679,7 +20408,7 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18693,11 +20422,11 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18706,12 +20435,12 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18734,7 +20463,7 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18762,7 +20491,7 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18776,11 +20505,11 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18794,7 +20523,7 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18808,11 +20537,11 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18821,12 +20550,12 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18849,7 +20578,7 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18877,7 +20606,7 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18890,11 +20619,11 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -18906,12 +20635,12 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -18934,7 +20663,7 @@ func (m *GetSchemaTableSizeOptions) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18962,7 +20691,7 @@ func (m *GetSchemaTableSizeOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18982,7 +20711,7 @@ func (m *GetSchemaTableSizeOptions) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -18997,12 +20726,12 @@ func (m *GetSchemaTableSizeOptions) UnmarshalVT(dAtA []byte) error { m.IncludeNonServingShards = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19025,7 +20754,7 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19053,7 +20782,7 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19066,11 +20795,11 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19089,7 +20818,7 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19103,11 +20832,11 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19116,12 +20845,12 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19144,7 +20873,7 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19172,7 +20901,7 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19186,11 +20915,11 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19199,12 +20928,12 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19227,7 +20956,7 @@ func (m *GetTabletsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19255,7 +20984,7 @@ func (m *GetTabletsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19268,11 +20997,11 @@ func (m *GetTabletsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19284,12 +21013,12 @@ func (m *GetTabletsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19312,7 +21041,7 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19340,7 +21069,7 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19354,11 +21083,11 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19372,7 +21101,7 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19386,11 +21115,11 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19399,12 +21128,12 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19419,7 +21148,7 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetUnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -19427,7 +21156,7 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19442,10 +21171,10 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetVSchemaRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetUnresolvedTransactionsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetVSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetUnresolvedTransactionsRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -19455,7 +21184,7 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19469,11 +21198,11 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19487,7 +21216,7 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19501,25 +21230,159 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AbandonAge", wireType) + } + m.AbandonAge = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AbandonAge |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetVSchemaRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetVSchemaRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19542,7 +21405,7 @@ func (m *GetVSchemasRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19570,7 +21433,7 @@ func (m *GetVSchemasRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19584,11 +21447,11 @@ func (m *GetVSchemasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19597,12 +21460,12 @@ func (m *GetVSchemasRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19625,7 +21488,7 @@ func (m *GetVSchemasResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19653,7 +21516,7 @@ func (m *GetVSchemasResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19666,11 +21529,11 @@ func (m *GetVSchemasResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19682,12 +21545,12 @@ func (m *GetVSchemasResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19710,7 +21573,7 @@ func (m *GetVtctldsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19738,7 +21601,7 @@ func (m *GetVtctldsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19752,11 +21615,11 @@ func (m *GetVtctldsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19765,12 +21628,12 @@ func (m *GetVtctldsRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19793,7 +21656,7 @@ func (m *GetVtctldsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19821,7 +21684,7 @@ func (m *GetVtctldsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19834,11 +21697,11 @@ func (m *GetVtctldsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19850,12 +21713,12 @@ func (m *GetVtctldsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -19878,7 +21741,7 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19906,7 +21769,7 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19920,11 +21783,11 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19938,7 +21801,7 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19952,11 +21815,11 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -19970,7 +21833,7 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -19984,11 +21847,11 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20002,7 +21865,7 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20017,12 +21880,12 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { m.ActiveOnly = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20037,7 +21900,7 @@ func (m *GetWorkflowRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { +func (m *GetWorkflowStatusRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -20045,7 +21908,7 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20060,20 +21923,20 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetWorkflowsRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetWorkflowStatusRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetWorkflowStatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20087,45 +21950,25 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ActiveOnly", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ActiveOnly = bool(v != 0) - case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspaces", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20139,25 +21982,25 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspaces = append(m.Keyspaces, string(dAtA[iNdEx:postIndex])) + m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IgnoreKeyspaces", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20171,25 +22014,25 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.IgnoreKeyspaces = append(m.IgnoreKeyspaces, string(dAtA[iNdEx:postIndex])) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20204,7 +22047,7 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { +func (m *StartWorkflowRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -20212,7 +22055,7 @@ func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20227,132 +22070,593 @@ func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetWorkflowsResponse: wiretype end group for non-group") + return fmt.Errorf("proto: StartWorkflowRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StartWorkflowRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowsByCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.WorkflowsByCluster == nil { - m.WorkflowsByCluster = make(map[string]*ClusterWorkflows) + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } - var mapkey string - var mapvalue *ClusterWorkflows - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLength - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLength - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLength - } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return ErrInvalidLength - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue = &ClusterWorkflows{} - if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { - return err + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Workflow = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StopWorkflowRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StopWorkflowRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StopWorkflowRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Workflow = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetWorkflowsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetWorkflowsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ActiveOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ActiveOnly = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspaces", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspaces = append(m.Keyspaces, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoreKeyspaces", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IgnoreKeyspaces = append(m.IgnoreKeyspaces, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetWorkflowsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetWorkflowsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowsByCluster", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WorkflowsByCluster == nil { + m.WorkflowsByCluster = make(map[string]*ClusterWorkflows) + } + var mapkey string + var mapvalue *ClusterWorkflows + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &ClusterWorkflows{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err } iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -20360,16 +22664,1102 @@ func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { iNdEx += skippy } } - m.WorkflowsByCluster[mapkey] = mapvalue + m.WorkflowsByCluster[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LaunchSchemaMigrationRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LaunchSchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Request == nil { + m.Request = &vtctldata.LaunchSchemaMigrationRequest{} + } + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MaterializeCreateRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MaterializeCreateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MaterializeCreateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TableSettings", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TableSettings = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Request == nil { + m.Request = &vtctldata.MaterializeCreateRequest{} + } + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MoveTablesCompleteRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MoveTablesCompleteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Request == nil { + m.Request = &vtctldata.MoveTablesCompleteRequest{} + } + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MoveTablesCreateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MoveTablesCreateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Request == nil { + m.Request = &vtctldata.MoveTablesCreateRequest{} + } + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PingTabletRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PingTabletRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Alias == nil { + m.Alias = &topodata.TabletAlias{} + } + if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingTabletResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PingTabletResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PingTabletResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Cluster == nil { + m.Cluster = &Cluster{} + } + if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PlannedFailoverShardRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PlannedFailoverShardRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PlannedFailoverShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Options == nil { + m.Options = &vtctldata.PlannedReparentShardRequest{} + } + if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PlannedFailoverShardResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PlannedFailoverShardResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PlannedFailoverShardResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Cluster == nil { + m.Cluster = &Cluster{} + } + if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shard = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PromotedPrimary", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PromotedPrimary == nil { + m.PromotedPrimary = &topodata.TabletAlias{} + } + if err := m.PromotedPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Events = append(m.Events, &logutil.Event{}) + if err := m.Events[len(m.Events)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20384,7 +23774,7 @@ func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { +func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -20392,7 +23782,7 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20407,10 +23797,10 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: LaunchSchemaMigrationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: RebuildKeyspaceGraphRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: LaunchSchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RebuildKeyspaceGraphRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -20420,7 +23810,7 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20434,11 +23824,11 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -20447,48 +23837,96 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Request == nil { - m.Request = &vtctldata.LaunchSchemaMigrationRequest{} + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cells", wireType) } - if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Cells = append(m.Cells, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowPartial", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllowPartial = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20503,7 +23941,7 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { +func (m *RebuildKeyspaceGraphResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -20511,7 +23949,7 @@ func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20526,56 +23964,20 @@ func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PingTabletRequest: wiretype end group for non-group") + return fmt.Errorf("proto: RebuildKeyspaceGraphResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PingTabletRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RebuildKeyspaceGraphResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Alias == nil { - m.Alias = &topodata.TabletAlias{} - } - if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20589,25 +23991,25 @@ func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20622,7 +24024,7 @@ func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *PingTabletResponse) UnmarshalVT(dAtA []byte) error { +func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -20630,7 +24032,7 @@ func (m *PingTabletResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20645,88 +24047,88 @@ func (m *PingTabletResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PingTabletResponse: wiretype end group for non-group") + return fmt.Errorf("proto: RefreshStateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PingTabletResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RefreshStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Status = string(dAtA[iNdEx:postIndex]) + if m.Alias == nil { + m.Alias = &topodata.TabletAlias{} + } + if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Cluster == nil { - m.Cluster = &Cluster{} - } - if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20741,7 +24143,7 @@ func (m *PingTabletResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *PlannedFailoverShardRequest) UnmarshalVT(dAtA []byte) error { +func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -20749,7 +24151,7 @@ func (m *PlannedFailoverShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20764,20 +24166,20 @@ func (m *PlannedFailoverShardRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PlannedFailoverShardRequest: wiretype end group for non-group") + return fmt.Errorf("proto: RefreshStateResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PlannedFailoverShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RefreshStateResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20791,25 +24193,25 @@ func (m *PlannedFailoverShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterId = string(dAtA[iNdEx:postIndex]) + m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20822,30 +24224,30 @@ func (m *PlannedFailoverShardRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Options == nil { - m.Options = &vtctldata.PlannedReparentShardRequest{} + if m.Cluster == nil { + m.Cluster = &Cluster{} } - if err := m.Options.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -20860,7 +24262,7 @@ func (m *PlannedFailoverShardRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *PlannedFailoverShardResponse) UnmarshalVT(dAtA []byte) error { +func (m *ReloadSchemasRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -20868,7 +24270,7 @@ func (m *PlannedFailoverShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20883,56 +24285,52 @@ func (m *PlannedFailoverShardResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PlannedFailoverShardResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ReloadSchemasRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PlannedFailoverShardResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReloadSchemasRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspaces", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Cluster == nil { - m.Cluster = &Cluster{} - } - if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Keyspaces = append(m.Keyspaces, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KeyspaceShards", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20946,25 +24344,59 @@ func (m *PlannedFailoverShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + m.KeyspaceShards = append(m.KeyspaceShards, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Tablets", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tablets = append(m.Tablets, &topodata.TabletAlias{}) + if err := m.Tablets[len(m.Tablets)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -20978,95 +24410,96 @@ func (m *PlannedFailoverShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Shard = string(dAtA[iNdEx:postIndex]) + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PromotedPrimary", wireType) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Concurrency", wireType) } - var msglen int + m.Concurrency = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Concurrency |= int32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.PromotedPrimary == nil { - m.PromotedPrimary = &topodata.TabletAlias{} - } - if err := m.PromotedPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WaitPosition", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Events = append(m.Events, &logutil.Event{}) - if err := m.Events[len(m.Events)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.WaitPosition = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IncludePrimary", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IncludePrimary = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21081,7 +24514,7 @@ func (m *PlannedFailoverShardResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { +func (m *ReloadSchemasResponse_KeyspaceResult) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21089,7 +24522,7 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21104,136 +24537,90 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RebuildKeyspaceGraphRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ReloadSchemasResponse_KeyspaceResult: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RebuildKeyspaceGraphRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReloadSchemasResponse_KeyspaceResult: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength + if m.Keyspace == nil { + m.Keyspace = &Keyspace{} } - if postIndex > l { - return io.ErrUnexpectedEOF + if err := m.Keyspace.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cells", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Cells = append(m.Cells, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowPartial", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } + m.Events = append(m.Events, &logutil.Event{}) + if err := m.Events[len(m.Events)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.AllowPartial = bool(v != 0) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21248,7 +24635,7 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RebuildKeyspaceGraphResponse) UnmarshalVT(dAtA []byte) error { +func (m *ReloadSchemasResponse_ShardResult) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21256,7 +24643,7 @@ func (m *RebuildKeyspaceGraphResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21271,52 +24658,90 @@ func (m *RebuildKeyspaceGraphResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RebuildKeyspaceGraphResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ReloadSchemasResponse_ShardResult: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RebuildKeyspaceGraphResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReloadSchemasResponse_ShardResult: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Status = string(dAtA[iNdEx:postIndex]) + if m.Shard == nil { + m.Shard = &Shard{} + } + if err := m.Shard.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Events = append(m.Events, &logutil.Event{}) + if err := m.Events[len(m.Events)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21331,7 +24756,7 @@ func (m *RebuildKeyspaceGraphResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { +func (m *ReloadSchemasResponse_TabletResult) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21339,7 +24764,7 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21354,20 +24779,20 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RefreshStateRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ReloadSchemasResponse_TabletResult: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReloadSchemasResponse_TabletResult: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Tablet", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21380,30 +24805,30 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Alias == nil { - m.Alias = &topodata.TabletAlias{} + if m.Tablet == nil { + m.Tablet = &Tablet{} } - if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Tablet.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21417,25 +24842,25 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + m.Result = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21450,7 +24875,7 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { +func (m *ReloadSchemasResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21458,7 +24883,7 @@ func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21473,52 +24898,88 @@ func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RefreshStateResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ReloadSchemasResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshStateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReloadSchemasResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KeyspaceResults", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KeyspaceResults = append(m.KeyspaceResults, &ReloadSchemasResponse_KeyspaceResult{}) + if err := m.KeyspaceResults[len(m.KeyspaceResults)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShardResults", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Status = string(dAtA[iNdEx:postIndex]) + m.ShardResults = append(m.ShardResults, &ReloadSchemasResponse_ShardResult{}) + if err := m.ShardResults[len(m.ShardResults)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TabletResults", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21531,30 +24992,28 @@ func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Cluster == nil { - m.Cluster = &Cluster{} - } - if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.TabletResults = append(m.TabletResults, &ReloadSchemasResponse_TabletResult{}) + if err := m.TabletResults[len(m.TabletResults)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21569,7 +25028,7 @@ func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ReloadSchemasRequest) UnmarshalVT(dAtA []byte) error { +func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21577,7 +25036,7 @@ func (m *ReloadSchemasRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21592,20 +25051,20 @@ func (m *ReloadSchemasRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ReloadSchemasRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ReloadSchemaShardRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ReloadSchemasRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReloadSchemaShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspaces", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21619,25 +25078,25 @@ func (m *ReloadSchemasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspaces = append(m.Keyspaces, string(dAtA[iNdEx:postIndex])) + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KeyspaceShards", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21651,59 +25110,57 @@ func (m *ReloadSchemasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.KeyspaceShards = append(m.KeyspaceShards, string(dAtA[iNdEx:postIndex])) + m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tablets", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Tablets = append(m.Tablets, &topodata.TabletAlias{}) - if err := m.Tablets[len(m.Tablets)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Shard = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WaitPosition", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21717,96 +25174,64 @@ func (m *ReloadSchemasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + m.WaitPosition = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Concurrency", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IncludePrimary", wireType) } - m.Concurrency = 0 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - m.Concurrency |= int32(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } + m.IncludePrimary = bool(v != 0) case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WaitPosition", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WaitPosition = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IncludePrimary", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Concurrency", wireType) } - var v int + m.Concurrency = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + m.Concurrency |= int32(b&0x7F) << shift if b < 0x80 { break } } - m.IncludePrimary = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21821,7 +25246,7 @@ func (m *ReloadSchemasRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ReloadSchemasResponse_KeyspaceResult) UnmarshalVT(dAtA []byte) error { +func (m *ReloadSchemaShardResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21829,7 +25254,7 @@ func (m *ReloadSchemasResponse_KeyspaceResult) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21844,56 +25269,20 @@ func (m *ReloadSchemasResponse_KeyspaceResult) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ReloadSchemasResponse_KeyspaceResult: wiretype end group for non-group") + return fmt.Errorf("proto: ReloadSchemaShardResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ReloadSchemasResponse_KeyspaceResult: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReloadSchemaShardResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Keyspace == nil { - m.Keyspace = &Keyspace{} - } - if err := m.Keyspace.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21906,11 +25295,11 @@ func (m *ReloadSchemasResponse_KeyspaceResult) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -21922,12 +25311,12 @@ func (m *ReloadSchemasResponse_KeyspaceResult) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -21942,7 +25331,7 @@ func (m *ReloadSchemasResponse_KeyspaceResult) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ReloadSchemasResponse_ShardResult) UnmarshalVT(dAtA []byte) error { +func (m *RefreshTabletReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -21950,7 +25339,7 @@ func (m *ReloadSchemasResponse_ShardResult) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21965,20 +25354,20 @@ func (m *ReloadSchemasResponse_ShardResult) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ReloadSchemasResponse_ShardResult: wiretype end group for non-group") + return fmt.Errorf("proto: RefreshTabletReplicationSourceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ReloadSchemasResponse_ShardResult: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RefreshTabletReplicationSourceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -21991,64 +25380,62 @@ func (m *ReloadSchemasResponse_ShardResult) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Shard == nil { - m.Shard = &Shard{} + if m.Alias == nil { + m.Alias = &topodata.TabletAlias{} } - if err := m.Shard.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Events = append(m.Events, &logutil.Event{}) - if err := m.Events[len(m.Events)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22063,7 +25450,7 @@ func (m *ReloadSchemasResponse_ShardResult) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ReloadSchemasResponse_TabletResult) UnmarshalVT(dAtA []byte) error { +func (m *RefreshTabletReplicationSourceResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -22071,7 +25458,7 @@ func (m *ReloadSchemasResponse_TabletResult) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22086,56 +25473,20 @@ func (m *ReloadSchemasResponse_TabletResult) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ReloadSchemasResponse_TabletResult: wiretype end group for non-group") + return fmt.Errorf("proto: RefreshTabletReplicationSourceResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ReloadSchemasResponse_TabletResult: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RefreshTabletReplicationSourceResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tablet", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Tablet == nil { - m.Tablet = &Tablet{} - } - if err := m.Tablet.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22148,111 +25499,58 @@ func (m *ReloadSchemasResponse_TabletResult) UnmarshalVT(dAtA []byte) error { } } intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Result = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ReloadSchemasResponse) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - if iNdEx >= l { - return io.ErrUnexpectedEOF + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + if postIndex > l { + return io.ErrUnexpectedEOF } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ReloadSchemasResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ReloadSchemasResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KeyspaceResults", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.KeyspaceResults = append(m.KeyspaceResults, &ReloadSchemasResponse_KeyspaceResult{}) - if err := m.KeyspaceResults[len(m.KeyspaceResults)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Shard = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShardResults", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Primary", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22265,28 +25563,30 @@ func (m *ReloadSchemasResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ShardResults = append(m.ShardResults, &ReloadSchemasResponse_ShardResult{}) - if err := m.ShardResults[len(m.ShardResults)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if m.Primary == nil { + m.Primary = &topodata.TabletAlias{} + } + if err := m.Primary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TabletResults", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22299,28 +25599,30 @@ func (m *ReloadSchemasResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.TabletResults = append(m.TabletResults, &ReloadSchemasResponse_TabletResult{}) - if err := m.TabletResults[len(m.TabletResults)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if m.Cluster == nil { + m.Cluster = &Cluster{} + } + if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22335,7 +25637,7 @@ func (m *ReloadSchemasResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { +func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -22343,7 +25645,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22358,10 +25660,10 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ReloadSchemaShardRequest: wiretype end group for non-group") + return fmt.Errorf("proto: RemoveKeyspaceCellRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ReloadSchemaShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RemoveKeyspaceCellRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -22371,7 +25673,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22385,11 +25687,11 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22403,7 +25705,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22417,11 +25719,11 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22430,12 +25732,12 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Cell", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22449,57 +25751,25 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Shard = string(dAtA[iNdEx:postIndex]) + m.Cell = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WaitPosition", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WaitPosition = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IncludePrimary", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) } var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22511,34 +25781,35 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { break } } - m.IncludePrimary = bool(v != 0) - case 6: + m.Force = bool(v != 0) + case 5: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Concurrency", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Recursive", wireType) } - m.Concurrency = 0 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - m.Concurrency |= int32(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } + m.Recursive = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22553,7 +25824,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ReloadSchemaShardResponse) UnmarshalVT(dAtA []byte) error { +func (m *RemoveKeyspaceCellResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -22561,7 +25832,7 @@ func (m *ReloadSchemaShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22576,54 +25847,52 @@ func (m *ReloadSchemaShardResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ReloadSchemaShardResponse: wiretype end group for non-group") + return fmt.Errorf("proto: RemoveKeyspaceCellResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ReloadSchemaShardResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RemoveKeyspaceCellResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Events = append(m.Events, &logutil.Event{}) - if err := m.Events[len(m.Events)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22638,7 +25907,7 @@ func (m *ReloadSchemaShardResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RefreshTabletReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { +func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -22646,7 +25915,7 @@ func (m *RefreshTabletReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22661,88 +25930,88 @@ func (m *RefreshTabletReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RefreshTabletReplicationSourceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: RetrySchemaMigrationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshTabletReplicationSourceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RetrySchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Alias == nil { - m.Alias = &topodata.TabletAlias{} - } - if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + if m.Request == nil { + m.Request = &vtctldata.RetrySchemaMigrationRequest{} + } + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22757,7 +26026,7 @@ func (m *RefreshTabletReplicationSourceRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RefreshTabletReplicationSourceResponse) UnmarshalVT(dAtA []byte) error { +func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -22765,7 +26034,7 @@ func (m *RefreshTabletReplicationSourceResponse) UnmarshalVT(dAtA []byte) error var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22780,52 +26049,56 @@ func (m *RefreshTabletReplicationSourceResponse) UnmarshalVT(dAtA []byte) error fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RefreshTabletReplicationSourceResponse: wiretype end group for non-group") + return fmt.Errorf("proto: RunHealthCheckRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshTabletReplicationSourceResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RunHealthCheckRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + if m.Alias == nil { + m.Alias = &topodata.TabletAlias{} + } + if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22839,61 +26112,108 @@ func (m *RefreshTabletReplicationSourceResponse) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Shard = string(dAtA[iNdEx:postIndex]) + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 3: + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RunHealthCheckResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RunHealthCheckResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Primary", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Primary == nil { - m.Primary = &topodata.TabletAlias{} - } - if err := m.Primary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22906,11 +26226,11 @@ func (m *RefreshTabletReplicationSourceResponse) UnmarshalVT(dAtA []byte) error } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -22924,12 +26244,12 @@ func (m *RefreshTabletReplicationSourceResponse) UnmarshalVT(dAtA []byte) error iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -22944,7 +26264,7 @@ func (m *RefreshTabletReplicationSourceResponse) UnmarshalVT(dAtA []byte) error } return nil } -func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { +func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -22952,7 +26272,7 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22967,10 +26287,10 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RemoveKeyspaceCellRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ReshardCreateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveKeyspaceCellRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReshardCreateRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -22980,7 +26300,7 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -22994,11 +26314,11 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23007,116 +26327,167 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + if m.Request == nil { + m.Request = &vtctldata.ReshardCreateRequest{} + } + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SetReadOnlyRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetReadOnlyRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cell", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Cell = string(dAtA[iNdEx:postIndex]) + if m.Alias == nil { + m.Alias = &topodata.TabletAlias{} + } + if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.Force = bool(v != 0) - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Recursive", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength } - m.Recursive = bool(v != 0) + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23131,7 +26502,7 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RemoveKeyspaceCellResponse) UnmarshalVT(dAtA []byte) error { +func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -23139,7 +26510,7 @@ func (m *RemoveKeyspaceCellResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23154,52 +26525,20 @@ func (m *RemoveKeyspaceCellResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RemoveKeyspaceCellResponse: wiretype end group for non-group") + return fmt.Errorf("proto: SetReadOnlyResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveKeyspaceCellResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetReadOnlyResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23214,7 +26553,7 @@ func (m *RemoveKeyspaceCellResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { +func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -23222,7 +26561,7 @@ func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23237,88 +26576,139 @@ func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RetrySchemaMigrationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: SetReadWriteRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RetrySchemaMigrationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetReadWriteRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterId = string(dAtA[iNdEx:postIndex]) + if m.Alias == nil { + m.Alias = &topodata.TabletAlias{} + } + if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Request == nil { - m.Request = &vtctldata.RetrySchemaMigrationRequest{} - } - if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { return err } - iNdEx = postIndex + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetReadWriteResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SetReadWriteResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetReadWriteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23333,7 +26723,7 @@ func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { +func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -23341,7 +26731,7 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23356,10 +26746,10 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RunHealthCheckRequest: wiretype end group for non-group") + return fmt.Errorf("proto: StartReplicationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RunHealthCheckRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StartReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -23369,7 +26759,7 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23382,11 +26772,11 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23405,7 +26795,7 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23419,11 +26809,11 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23432,12 +26822,12 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23452,7 +26842,7 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { +func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -23460,7 +26850,7 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23475,10 +26865,10 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RunHealthCheckResponse: wiretype end group for non-group") + return fmt.Errorf("proto: StartReplicationResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RunHealthCheckResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StartReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -23488,7 +26878,7 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23502,11 +26892,11 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23520,7 +26910,7 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23533,11 +26923,11 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23551,12 +26941,12 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23571,7 +26961,7 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { +func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -23579,7 +26969,7 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23594,10 +26984,10 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetReadOnlyRequest: wiretype end group for non-group") + return fmt.Errorf("proto: StopReplicationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetReadOnlyRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StopReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -23607,7 +26997,7 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23620,11 +27010,11 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23643,7 +27033,7 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23657,11 +27047,11 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23670,12 +27060,12 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23690,7 +27080,7 @@ func (m *SetReadOnlyRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { +func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -23698,7 +27088,7 @@ func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23713,20 +27103,88 @@ func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetReadOnlyResponse: wiretype end group for non-group") + return fmt.Errorf("proto: StopReplicationResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetReadOnlyResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StopReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Cluster == nil { + m.Cluster = &Cluster{} + } + if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23741,7 +27199,7 @@ func (m *SetReadOnlyResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { +func (m *TabletExternallyPromotedRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -23749,7 +27207,7 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23764,10 +27222,10 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetReadWriteRequest: wiretype end group for non-group") + return fmt.Errorf("proto: TabletExternallyPromotedRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetReadWriteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TabletExternallyPromotedRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -23777,7 +27235,7 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23790,11 +27248,11 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23813,7 +27271,7 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23827,11 +27285,11 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -23840,63 +27298,12 @@ func (m *SetReadWriteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetReadWriteResponse) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SetReadWriteResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetReadWriteResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -23911,7 +27318,7 @@ func (m *SetReadWriteResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { +func (m *TabletExternallyPromotedResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -23919,7 +27326,7 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23934,20 +27341,20 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StartReplicationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: TabletExternallyPromotedResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StartReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TabletExternallyPromotedResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23960,30 +27367,30 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Alias == nil { - m.Alias = &topodata.TabletAlias{} + if m.Cluster == nil { + m.Cluster = &Cluster{} } - if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -23997,108 +27404,93 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: StartReplicationResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StartReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Shard = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NewPrimary", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Status = string(dAtA[iNdEx:postIndex]) + if m.NewPrimary == nil { + m.NewPrimary = &topodata.TabletAlias{} + } + if err := m.NewPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 2: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field OldPrimary", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24111,30 +27503,30 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Cluster == nil { - m.Cluster = &Cluster{} + if m.OldPrimary == nil { + m.OldPrimary = &topodata.TabletAlias{} } - if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.OldPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24149,7 +27541,7 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { +func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -24157,7 +27549,7 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24172,10 +27564,10 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StopReplicationRequest: wiretype end group for non-group") + return fmt.Errorf("proto: TabletExternallyReparentedRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StopReplicationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TabletExternallyReparentedRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -24185,7 +27577,7 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24198,11 +27590,11 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24221,7 +27613,7 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24235,11 +27627,11 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24248,12 +27640,12 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24268,7 +27660,7 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { +func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -24276,7 +27668,7 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24291,20 +27683,20 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StopReplicationResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StopReplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24318,61 +27710,45 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Status = string(dAtA[iNdEx:postIndex]) + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Cluster == nil { - m.Cluster = &Cluster{} - } - if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex + m.PingTablets = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24387,7 +27763,7 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TabletExternallyPromotedRequest) UnmarshalVT(dAtA []byte) error { +func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -24395,7 +27771,7 @@ func (m *TabletExternallyPromotedRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24410,56 +27786,52 @@ func (m *TabletExternallyPromotedRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TabletExternallyPromotedRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TabletExternallyPromotedRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Alias == nil { - m.Alias = &topodata.TabletAlias{} - } - if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24473,25 +27845,45 @@ func (m *TabletExternallyPromotedRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.PingTablets = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24506,7 +27898,7 @@ func (m *TabletExternallyPromotedRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TabletExternallyPromotedResponse) UnmarshalVT(dAtA []byte) error { +func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -24514,7 +27906,7 @@ func (m *TabletExternallyPromotedResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24529,56 +27921,20 @@ func (m *TabletExternallyPromotedResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TabletExternallyPromotedResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateSchemaKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TabletExternallyPromotedResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateSchemaKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cluster", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Cluster == nil { - m.Cluster = &Cluster{} - } - if err := m.Cluster.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24592,25 +27948,25 @@ func (m *TabletExternallyPromotedResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24624,97 +27980,25 @@ func (m *TabletExternallyPromotedResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Shard = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewPrimary", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.NewPrimary == nil { - m.NewPrimary = &topodata.TabletAlias{} - } - if err := m.NewPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OldPrimary", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.OldPrimary == nil { - m.OldPrimary = &topodata.TabletAlias{} - } - if err := m.OldPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24729,7 +28013,7 @@ func (m *TabletExternallyPromotedResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { +func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -24737,7 +28021,7 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24752,56 +28036,84 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TabletExternallyReparentedRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateShardRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TabletExternallyReparentedRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Alias", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Alias == nil { - m.Alias = &topodata.TabletAlias{} + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } - if err := m.Alias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24815,25 +28127,45 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterIds = append(m.ClusterIds, string(dAtA[iNdEx:postIndex])) + m.Shard = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.PingTablets = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24848,7 +28180,7 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { +func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -24856,7 +28188,7 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24871,10 +28203,10 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateVersionKeyspaceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateVersionKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -24884,7 +28216,7 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24898,11 +28230,11 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -24910,33 +28242,45 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.PingTablets = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -24951,7 +28295,7 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { +func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -24959,7 +28303,7 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -24974,10 +28318,10 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateKeyspaceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ValidateVersionShardRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ValidateVersionShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -24987,7 +28331,7 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25001,11 +28345,11 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25019,7 +28363,7 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25033,11 +28377,11 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25045,33 +28389,45 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { m.Keyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.PingTablets = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shard = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25086,7 +28442,7 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { +func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -25094,7 +28450,7 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25109,10 +28465,10 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateSchemaKeyspaceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: VDiffCreateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateSchemaKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: VDiffCreateRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -25122,7 +28478,7 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25136,11 +28492,11 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25149,44 +28505,48 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + if m.Request == nil { + m.Request = &vtctldata.VDiffCreateRequest{} + } + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25201,7 +28561,7 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { +func (m *VDiffShowRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -25209,7 +28569,7 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25224,10 +28584,10 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateShardRequest: wiretype end group for non-group") + return fmt.Errorf("proto: VDiffShowRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: VDiffShowRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -25237,7 +28597,7 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25251,11 +28611,11 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25264,44 +28624,110 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + if m.Request == nil { + m.Request = &vtctldata.VDiffShowRequest{} + } + if err := m.Request.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VDiffProgress) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VDiffProgress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VDiffProgress: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Percentage", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Percentage = float64(math.Float64frombits(v)) + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Eta", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25315,45 +28741,25 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Shard = string(dAtA[iNdEx:postIndex]) + m.Eta = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PingTablets", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.PingTablets = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25368,7 +28774,7 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { +func (m *VDiffShardReport) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -25376,7 +28782,7 @@ func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25387,24 +28793,95 @@ func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { if b < 0x80 { break } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ValidateVersionKeyspaceRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateVersionKeyspaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VDiffShardReport: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VDiffShardReport: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RowsCompared", wireType) + } + m.RowsCompared = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RowsCompared |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HasMismatch", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.HasMismatch = bool(v != 0) + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StartedAt", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25418,25 +28895,25 @@ func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterId = string(dAtA[iNdEx:postIndex]) + m.StartedAt = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CompletedAt", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25450,25 +28927,61 @@ func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) + m.CompletedAt = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Progress", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Progress == nil { + m.Progress = &VDiffProgress{} + } + if err := m.Progress.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25483,7 +28996,7 @@ func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { +func (m *VDiffShowResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -25491,7 +29004,7 @@ func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25506,116 +29019,149 @@ func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ValidateVersionShardRequest: wiretype end group for non-group") + return fmt.Errorf("proto: VDiffShowResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ValidateVersionShardRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: VDiffShowResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClusterId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ShardReport", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength + if msglen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Keyspace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + if m.ShardReport == nil { + m.ShardReport = make(map[string]*VDiffShardReport) } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + var mapkey string + var mapvalue *VDiffShardReport + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &VDiffShardReport{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Shard = string(dAtA[iNdEx:postIndex]) + m.ShardReport[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25638,7 +29184,7 @@ func (m *VTExplainRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25666,7 +29212,7 @@ func (m *VTExplainRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25680,11 +29226,11 @@ func (m *VTExplainRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25698,7 +29244,7 @@ func (m *VTExplainRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25712,11 +29258,11 @@ func (m *VTExplainRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25730,7 +29276,7 @@ func (m *VTExplainRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25744,11 +29290,11 @@ func (m *VTExplainRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25757,12 +29303,12 @@ func (m *VTExplainRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25785,7 +29331,7 @@ func (m *VTExplainResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25813,7 +29359,7 @@ func (m *VTExplainResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -25827,11 +29373,11 @@ func (m *VTExplainResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -25840,12 +29386,12 @@ func (m *VTExplainResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -25860,88 +29406,3 @@ func (m *VTExplainResponse) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index a79acd29dab..038c0fc8c58 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -150,6 +150,55 @@ func (QueryOrdering) EnumDescriptor() ([]byte, []int) { return file_vtctldata_proto_rawDescGZIP(), []int{1} } +type ShardedAutoIncrementHandling int32 + +const ( + ShardedAutoIncrementHandling_LEAVE ShardedAutoIncrementHandling = 0 + ShardedAutoIncrementHandling_REMOVE ShardedAutoIncrementHandling = 1 + ShardedAutoIncrementHandling_REPLACE ShardedAutoIncrementHandling = 2 +) + +// Enum value maps for ShardedAutoIncrementHandling. +var ( + ShardedAutoIncrementHandling_name = map[int32]string{ + 0: "LEAVE", + 1: "REMOVE", + 2: "REPLACE", + } + ShardedAutoIncrementHandling_value = map[string]int32{ + "LEAVE": 0, + "REMOVE": 1, + "REPLACE": 2, + } +) + +func (x ShardedAutoIncrementHandling) Enum() *ShardedAutoIncrementHandling { + p := new(ShardedAutoIncrementHandling) + *p = x + return p +} + +func (x ShardedAutoIncrementHandling) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ShardedAutoIncrementHandling) Descriptor() protoreflect.EnumDescriptor { + return file_vtctldata_proto_enumTypes[2].Descriptor() +} + +func (ShardedAutoIncrementHandling) Type() protoreflect.EnumType { + return &file_vtctldata_proto_enumTypes[2] +} + +func (x ShardedAutoIncrementHandling) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ShardedAutoIncrementHandling.Descriptor instead. +func (ShardedAutoIncrementHandling) EnumDescriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{2} +} + type SchemaMigration_Strategy int32 const ( @@ -200,11 +249,11 @@ func (x SchemaMigration_Strategy) String() string { } func (SchemaMigration_Strategy) Descriptor() protoreflect.EnumDescriptor { - return file_vtctldata_proto_enumTypes[2].Descriptor() + return file_vtctldata_proto_enumTypes[3].Descriptor() } func (SchemaMigration_Strategy) Type() protoreflect.EnumType { - return &file_vtctldata_proto_enumTypes[2] + return &file_vtctldata_proto_enumTypes[3] } func (x SchemaMigration_Strategy) Number() protoreflect.EnumNumber { @@ -264,11 +313,11 @@ func (x SchemaMigration_Status) String() string { } func (SchemaMigration_Status) Descriptor() protoreflect.EnumDescriptor { - return file_vtctldata_proto_enumTypes[3].Descriptor() + return file_vtctldata_proto_enumTypes[4].Descriptor() } func (SchemaMigration_Status) Type() protoreflect.EnumType { - return &file_vtctldata_proto_enumTypes[3] + return &file_vtctldata_proto_enumTypes[4] } func (x SchemaMigration_Status) Number() protoreflect.EnumNumber { @@ -487,6 +536,8 @@ type MaterializeSettings struct { TabletSelectionPreference tabletmanagerdata.TabletSelectionPreference `protobuf:"varint,15,opt,name=tablet_selection_preference,json=tabletSelectionPreference,proto3,enum=tabletmanagerdata.TabletSelectionPreference" json:"tablet_selection_preference,omitempty"` AtomicCopy bool `protobuf:"varint,16,opt,name=atomic_copy,json=atomicCopy,proto3" json:"atomic_copy,omitempty"` WorkflowOptions *WorkflowOptions `protobuf:"bytes,17,opt,name=workflow_options,json=workflowOptions,proto3" json:"workflow_options,omitempty"` + // ReferenceTables is set to a csv list of tables, if the materialization is for reference tables. + ReferenceTables []string `protobuf:"bytes,18,rep,name=reference_tables,json=referenceTables,proto3" json:"reference_tables,omitempty"` } func (x *MaterializeSettings) Reset() { @@ -640,6 +691,13 @@ func (x *MaterializeSettings) GetWorkflowOptions() *WorkflowOptions { return nil } +func (x *MaterializeSettings) GetReferenceTables() []string { + if x != nil { + return x.ReferenceTables + } + return nil +} + type Keyspace struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1237,11 +1295,16 @@ type WorkflowOptions struct { TenantId string `protobuf:"bytes,1,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"` // Remove auto_increment clauses on tables when moving them to a sharded - // keyspace. - StripShardedAutoIncrement bool `protobuf:"varint,2,opt,name=strip_sharded_auto_increment,json=stripShardedAutoIncrement,proto3" json:"strip_sharded_auto_increment,omitempty"` + // keyspace and optionally replace them with vschema AutoIncrement + // definitions. + ShardedAutoIncrementHandling ShardedAutoIncrementHandling `protobuf:"varint,2,opt,name=sharded_auto_increment_handling,json=shardedAutoIncrementHandling,proto3,enum=vtctldata.ShardedAutoIncrementHandling" json:"sharded_auto_increment_handling,omitempty"` // Shards on which vreplication streams in the target keyspace are created for this workflow and to which the data // from the source will be vreplicated. - Shards []string `protobuf:"bytes,3,rep,name=shards,proto3" json:"shards,omitempty"` + Shards []string `protobuf:"bytes,3,rep,name=shards,proto3" json:"shards,omitempty"` + Config map[string]string `protobuf:"bytes,4,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Where to create any related schema and vschema objects such as + // sequence tables. + GlobalKeyspace string `protobuf:"bytes,5,opt,name=global_keyspace,json=globalKeyspace,proto3" json:"global_keyspace,omitempty"` } func (x *WorkflowOptions) Reset() { @@ -1283,11 +1346,11 @@ func (x *WorkflowOptions) GetTenantId() string { return "" } -func (x *WorkflowOptions) GetStripShardedAutoIncrement() bool { +func (x *WorkflowOptions) GetShardedAutoIncrementHandling() ShardedAutoIncrementHandling { if x != nil { - return x.StripShardedAutoIncrement + return x.ShardedAutoIncrementHandling } - return false + return ShardedAutoIncrementHandling_LEAVE } func (x *WorkflowOptions) GetShards() []string { @@ -1297,6 +1360,20 @@ func (x *WorkflowOptions) GetShards() []string { return nil } +func (x *WorkflowOptions) GetConfig() map[string]string { + if x != nil { + return x.Config + } + return nil +} + +func (x *WorkflowOptions) GetGlobalKeyspace() string { + if x != nil { + return x.GlobalKeyspace + } + return "" +} + // TODO: comment the hell out of this. type Workflow struct { state protoimpl.MessageState @@ -2290,6 +2367,8 @@ type BackupRequest struct { // UpgradeSafe indicates if the backup should be taken with innodb_fast_shutdown=0 // so that it's a backup that can be used for an upgrade. UpgradeSafe bool `protobuf:"varint,5,opt,name=upgrade_safe,json=upgradeSafe,proto3" json:"upgrade_safe,omitempty"` + // BackupEngine specifies if we want to use a particular backup engine for this backup request + BackupEngine *string `protobuf:"bytes,6,opt,name=backup_engine,json=backupEngine,proto3,oneof" json:"backup_engine,omitempty"` } func (x *BackupRequest) Reset() { @@ -2359,6 +2438,13 @@ func (x *BackupRequest) GetUpgradeSafe() bool { return false } +func (x *BackupRequest) GetBackupEngine() string { + if x != nil && x.BackupEngine != nil { + return *x.BackupEngine + } + return "" +} + type BackupResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2628,6 +2714,124 @@ func (x *CancelSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint return nil } +type ChangeTabletTagsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TabletAlias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=tablet_alias,json=tabletAlias,proto3" json:"tablet_alias,omitempty"` + Tags map[string]string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Replace bool `protobuf:"varint,3,opt,name=replace,proto3" json:"replace,omitempty"` +} + +func (x *ChangeTabletTagsRequest) Reset() { + *x = ChangeTabletTagsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtctldata_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeTabletTagsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeTabletTagsRequest) ProtoMessage() {} + +func (x *ChangeTabletTagsRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeTabletTagsRequest.ProtoReflect.Descriptor instead. +func (*ChangeTabletTagsRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{28} +} + +func (x *ChangeTabletTagsRequest) GetTabletAlias() *topodata.TabletAlias { + if x != nil { + return x.TabletAlias + } + return nil +} + +func (x *ChangeTabletTagsRequest) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *ChangeTabletTagsRequest) GetReplace() bool { + if x != nil { + return x.Replace + } + return false +} + +type ChangeTabletTagsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BeforeTags map[string]string `protobuf:"bytes,1,rep,name=before_tags,json=beforeTags,proto3" json:"before_tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + AfterTags map[string]string `protobuf:"bytes,2,rep,name=after_tags,json=afterTags,proto3" json:"after_tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ChangeTabletTagsResponse) Reset() { + *x = ChangeTabletTagsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_vtctldata_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeTabletTagsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeTabletTagsResponse) ProtoMessage() {} + +func (x *ChangeTabletTagsResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeTabletTagsResponse.ProtoReflect.Descriptor instead. +func (*ChangeTabletTagsResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{29} +} + +func (x *ChangeTabletTagsResponse) GetBeforeTags() map[string]string { + if x != nil { + return x.BeforeTags + } + return nil +} + +func (x *ChangeTabletTagsResponse) GetAfterTags() map[string]string { + if x != nil { + return x.AfterTags + } + return nil +} + type ChangeTabletTypeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2641,7 +2845,7 @@ type ChangeTabletTypeRequest struct { func (x *ChangeTabletTypeRequest) Reset() { *x = ChangeTabletTypeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[28] + mi := &file_vtctldata_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2654,7 +2858,7 @@ func (x *ChangeTabletTypeRequest) String() string { func (*ChangeTabletTypeRequest) ProtoMessage() {} func (x *ChangeTabletTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[28] + mi := &file_vtctldata_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2667,7 +2871,7 @@ func (x *ChangeTabletTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeTabletTypeRequest.ProtoReflect.Descriptor instead. func (*ChangeTabletTypeRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{28} + return file_vtctldata_proto_rawDescGZIP(), []int{30} } func (x *ChangeTabletTypeRequest) GetTabletAlias() *topodata.TabletAlias { @@ -2704,7 +2908,7 @@ type ChangeTabletTypeResponse struct { func (x *ChangeTabletTypeResponse) Reset() { *x = ChangeTabletTypeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[29] + mi := &file_vtctldata_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2717,7 +2921,7 @@ func (x *ChangeTabletTypeResponse) String() string { func (*ChangeTabletTypeResponse) ProtoMessage() {} func (x *ChangeTabletTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[29] + mi := &file_vtctldata_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2730,7 +2934,7 @@ func (x *ChangeTabletTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeTabletTypeResponse.ProtoReflect.Descriptor instead. func (*ChangeTabletTypeResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{29} + return file_vtctldata_proto_rawDescGZIP(), []int{31} } func (x *ChangeTabletTypeResponse) GetBeforeTablet() *topodata.Tablet { @@ -2771,7 +2975,7 @@ type CheckThrottlerRequest struct { func (x *CheckThrottlerRequest) Reset() { *x = CheckThrottlerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[30] + mi := &file_vtctldata_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2784,7 +2988,7 @@ func (x *CheckThrottlerRequest) String() string { func (*CheckThrottlerRequest) ProtoMessage() {} func (x *CheckThrottlerRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[30] + mi := &file_vtctldata_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2797,7 +3001,7 @@ func (x *CheckThrottlerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerRequest.ProtoReflect.Descriptor instead. func (*CheckThrottlerRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{30} + return file_vtctldata_proto_rawDescGZIP(), []int{32} } func (x *CheckThrottlerRequest) GetTabletAlias() *topodata.TabletAlias { @@ -2847,7 +3051,7 @@ type CheckThrottlerResponse struct { func (x *CheckThrottlerResponse) Reset() { *x = CheckThrottlerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[31] + mi := &file_vtctldata_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2860,7 +3064,7 @@ func (x *CheckThrottlerResponse) String() string { func (*CheckThrottlerResponse) ProtoMessage() {} func (x *CheckThrottlerResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[31] + mi := &file_vtctldata_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2873,7 +3077,7 @@ func (x *CheckThrottlerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckThrottlerResponse.ProtoReflect.Descriptor instead. func (*CheckThrottlerResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{31} + return file_vtctldata_proto_rawDescGZIP(), []int{33} } func (x *CheckThrottlerResponse) GetTabletAlias() *topodata.TabletAlias { @@ -2902,7 +3106,7 @@ type CleanupSchemaMigrationRequest struct { func (x *CleanupSchemaMigrationRequest) Reset() { *x = CleanupSchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[32] + mi := &file_vtctldata_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2915,7 +3119,7 @@ func (x *CleanupSchemaMigrationRequest) String() string { func (*CleanupSchemaMigrationRequest) ProtoMessage() {} func (x *CleanupSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[32] + mi := &file_vtctldata_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2928,7 +3132,7 @@ func (x *CleanupSchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*CleanupSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{32} + return file_vtctldata_proto_rawDescGZIP(), []int{34} } func (x *CleanupSchemaMigrationRequest) GetKeyspace() string { @@ -2956,7 +3160,7 @@ type CleanupSchemaMigrationResponse struct { func (x *CleanupSchemaMigrationResponse) Reset() { *x = CleanupSchemaMigrationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[33] + mi := &file_vtctldata_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2969,7 +3173,7 @@ func (x *CleanupSchemaMigrationResponse) String() string { func (*CleanupSchemaMigrationResponse) ProtoMessage() {} func (x *CleanupSchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[33] + mi := &file_vtctldata_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2982,7 +3186,7 @@ func (x *CleanupSchemaMigrationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupSchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*CleanupSchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{33} + return file_vtctldata_proto_rawDescGZIP(), []int{35} } func (x *CleanupSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -3004,7 +3208,7 @@ type CompleteSchemaMigrationRequest struct { func (x *CompleteSchemaMigrationRequest) Reset() { *x = CompleteSchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[34] + mi := &file_vtctldata_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3017,7 +3221,7 @@ func (x *CompleteSchemaMigrationRequest) String() string { func (*CompleteSchemaMigrationRequest) ProtoMessage() {} func (x *CompleteSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[34] + mi := &file_vtctldata_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3030,7 +3234,7 @@ func (x *CompleteSchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*CompleteSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{34} + return file_vtctldata_proto_rawDescGZIP(), []int{36} } func (x *CompleteSchemaMigrationRequest) GetKeyspace() string { @@ -3058,7 +3262,7 @@ type CompleteSchemaMigrationResponse struct { func (x *CompleteSchemaMigrationResponse) Reset() { *x = CompleteSchemaMigrationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[35] + mi := &file_vtctldata_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3071,7 +3275,7 @@ func (x *CompleteSchemaMigrationResponse) String() string { func (*CompleteSchemaMigrationResponse) ProtoMessage() {} func (x *CompleteSchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[35] + mi := &file_vtctldata_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3084,7 +3288,7 @@ func (x *CompleteSchemaMigrationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteSchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*CompleteSchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{35} + return file_vtctldata_proto_rawDescGZIP(), []int{37} } func (x *CompleteSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -3124,7 +3328,7 @@ type CreateKeyspaceRequest struct { func (x *CreateKeyspaceRequest) Reset() { *x = CreateKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[36] + mi := &file_vtctldata_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3137,7 +3341,7 @@ func (x *CreateKeyspaceRequest) String() string { func (*CreateKeyspaceRequest) ProtoMessage() {} func (x *CreateKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[36] + mi := &file_vtctldata_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3150,7 +3354,7 @@ func (x *CreateKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateKeyspaceRequest.ProtoReflect.Descriptor instead. func (*CreateKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{36} + return file_vtctldata_proto_rawDescGZIP(), []int{38} } func (x *CreateKeyspaceRequest) GetName() string { @@ -3221,7 +3425,7 @@ type CreateKeyspaceResponse struct { func (x *CreateKeyspaceResponse) Reset() { *x = CreateKeyspaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[37] + mi := &file_vtctldata_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3234,7 +3438,7 @@ func (x *CreateKeyspaceResponse) String() string { func (*CreateKeyspaceResponse) ProtoMessage() {} func (x *CreateKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[37] + mi := &file_vtctldata_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3247,7 +3451,7 @@ func (x *CreateKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateKeyspaceResponse.ProtoReflect.Descriptor instead. func (*CreateKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{37} + return file_vtctldata_proto_rawDescGZIP(), []int{39} } func (x *CreateKeyspaceResponse) GetKeyspace() *Keyspace { @@ -3277,7 +3481,7 @@ type CreateShardRequest struct { func (x *CreateShardRequest) Reset() { *x = CreateShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[38] + mi := &file_vtctldata_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3290,7 +3494,7 @@ func (x *CreateShardRequest) String() string { func (*CreateShardRequest) ProtoMessage() {} func (x *CreateShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[38] + mi := &file_vtctldata_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3303,7 +3507,7 @@ func (x *CreateShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateShardRequest.ProtoReflect.Descriptor instead. func (*CreateShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{38} + return file_vtctldata_proto_rawDescGZIP(), []int{40} } func (x *CreateShardRequest) GetKeyspace() string { @@ -3352,7 +3556,7 @@ type CreateShardResponse struct { func (x *CreateShardResponse) Reset() { *x = CreateShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[39] + mi := &file_vtctldata_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3365,7 +3569,7 @@ func (x *CreateShardResponse) String() string { func (*CreateShardResponse) ProtoMessage() {} func (x *CreateShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[39] + mi := &file_vtctldata_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3378,7 +3582,7 @@ func (x *CreateShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateShardResponse.ProtoReflect.Descriptor instead. func (*CreateShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{39} + return file_vtctldata_proto_rawDescGZIP(), []int{41} } func (x *CreateShardResponse) GetKeyspace() *Keyspace { @@ -3414,7 +3618,7 @@ type DeleteCellInfoRequest struct { func (x *DeleteCellInfoRequest) Reset() { *x = DeleteCellInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[40] + mi := &file_vtctldata_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3427,7 +3631,7 @@ func (x *DeleteCellInfoRequest) String() string { func (*DeleteCellInfoRequest) ProtoMessage() {} func (x *DeleteCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[40] + mi := &file_vtctldata_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3440,7 +3644,7 @@ func (x *DeleteCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellInfoRequest.ProtoReflect.Descriptor instead. func (*DeleteCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{40} + return file_vtctldata_proto_rawDescGZIP(), []int{42} } func (x *DeleteCellInfoRequest) GetName() string { @@ -3466,7 +3670,7 @@ type DeleteCellInfoResponse struct { func (x *DeleteCellInfoResponse) Reset() { *x = DeleteCellInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[41] + mi := &file_vtctldata_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3479,7 +3683,7 @@ func (x *DeleteCellInfoResponse) String() string { func (*DeleteCellInfoResponse) ProtoMessage() {} func (x *DeleteCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[41] + mi := &file_vtctldata_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3492,7 +3696,7 @@ func (x *DeleteCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellInfoResponse.ProtoReflect.Descriptor instead. func (*DeleteCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{41} + return file_vtctldata_proto_rawDescGZIP(), []int{43} } type DeleteCellsAliasRequest struct { @@ -3506,7 +3710,7 @@ type DeleteCellsAliasRequest struct { func (x *DeleteCellsAliasRequest) Reset() { *x = DeleteCellsAliasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[42] + mi := &file_vtctldata_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3519,7 +3723,7 @@ func (x *DeleteCellsAliasRequest) String() string { func (*DeleteCellsAliasRequest) ProtoMessage() {} func (x *DeleteCellsAliasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[42] + mi := &file_vtctldata_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3532,7 +3736,7 @@ func (x *DeleteCellsAliasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellsAliasRequest.ProtoReflect.Descriptor instead. func (*DeleteCellsAliasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{42} + return file_vtctldata_proto_rawDescGZIP(), []int{44} } func (x *DeleteCellsAliasRequest) GetName() string { @@ -3551,7 +3755,7 @@ type DeleteCellsAliasResponse struct { func (x *DeleteCellsAliasResponse) Reset() { *x = DeleteCellsAliasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[43] + mi := &file_vtctldata_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3564,7 +3768,7 @@ func (x *DeleteCellsAliasResponse) String() string { func (*DeleteCellsAliasResponse) ProtoMessage() {} func (x *DeleteCellsAliasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[43] + mi := &file_vtctldata_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3577,7 +3781,7 @@ func (x *DeleteCellsAliasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCellsAliasResponse.ProtoReflect.Descriptor instead. func (*DeleteCellsAliasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{43} + return file_vtctldata_proto_rawDescGZIP(), []int{45} } type DeleteKeyspaceRequest struct { @@ -3599,7 +3803,7 @@ type DeleteKeyspaceRequest struct { func (x *DeleteKeyspaceRequest) Reset() { *x = DeleteKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[44] + mi := &file_vtctldata_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3612,7 +3816,7 @@ func (x *DeleteKeyspaceRequest) String() string { func (*DeleteKeyspaceRequest) ProtoMessage() {} func (x *DeleteKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[44] + mi := &file_vtctldata_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3625,7 +3829,7 @@ func (x *DeleteKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeyspaceRequest.ProtoReflect.Descriptor instead. func (*DeleteKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{44} + return file_vtctldata_proto_rawDescGZIP(), []int{46} } func (x *DeleteKeyspaceRequest) GetKeyspace() string { @@ -3658,7 +3862,7 @@ type DeleteKeyspaceResponse struct { func (x *DeleteKeyspaceResponse) Reset() { *x = DeleteKeyspaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[45] + mi := &file_vtctldata_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3671,7 +3875,7 @@ func (x *DeleteKeyspaceResponse) String() string { func (*DeleteKeyspaceResponse) ProtoMessage() {} func (x *DeleteKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[45] + mi := &file_vtctldata_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3684,7 +3888,7 @@ func (x *DeleteKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteKeyspaceResponse.ProtoReflect.Descriptor instead. func (*DeleteKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{45} + return file_vtctldata_proto_rawDescGZIP(), []int{47} } type DeleteShardsRequest struct { @@ -3710,7 +3914,7 @@ type DeleteShardsRequest struct { func (x *DeleteShardsRequest) Reset() { *x = DeleteShardsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[46] + mi := &file_vtctldata_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3723,7 +3927,7 @@ func (x *DeleteShardsRequest) String() string { func (*DeleteShardsRequest) ProtoMessage() {} func (x *DeleteShardsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[46] + mi := &file_vtctldata_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3736,7 +3940,7 @@ func (x *DeleteShardsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteShardsRequest.ProtoReflect.Descriptor instead. func (*DeleteShardsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{46} + return file_vtctldata_proto_rawDescGZIP(), []int{48} } func (x *DeleteShardsRequest) GetShards() []*Shard { @@ -3776,7 +3980,7 @@ type DeleteShardsResponse struct { func (x *DeleteShardsResponse) Reset() { *x = DeleteShardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[47] + mi := &file_vtctldata_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3789,7 +3993,7 @@ func (x *DeleteShardsResponse) String() string { func (*DeleteShardsResponse) ProtoMessage() {} func (x *DeleteShardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[47] + mi := &file_vtctldata_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3802,7 +4006,7 @@ func (x *DeleteShardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteShardsResponse.ProtoReflect.Descriptor instead. func (*DeleteShardsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{47} + return file_vtctldata_proto_rawDescGZIP(), []int{49} } type DeleteSrvVSchemaRequest struct { @@ -3816,7 +4020,7 @@ type DeleteSrvVSchemaRequest struct { func (x *DeleteSrvVSchemaRequest) Reset() { *x = DeleteSrvVSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[48] + mi := &file_vtctldata_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3829,7 +4033,7 @@ func (x *DeleteSrvVSchemaRequest) String() string { func (*DeleteSrvVSchemaRequest) ProtoMessage() {} func (x *DeleteSrvVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[48] + mi := &file_vtctldata_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3842,7 +4046,7 @@ func (x *DeleteSrvVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSrvVSchemaRequest.ProtoReflect.Descriptor instead. func (*DeleteSrvVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{48} + return file_vtctldata_proto_rawDescGZIP(), []int{50} } func (x *DeleteSrvVSchemaRequest) GetCell() string { @@ -3861,7 +4065,7 @@ type DeleteSrvVSchemaResponse struct { func (x *DeleteSrvVSchemaResponse) Reset() { *x = DeleteSrvVSchemaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[49] + mi := &file_vtctldata_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3874,7 +4078,7 @@ func (x *DeleteSrvVSchemaResponse) String() string { func (*DeleteSrvVSchemaResponse) ProtoMessage() {} func (x *DeleteSrvVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[49] + mi := &file_vtctldata_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3887,7 +4091,7 @@ func (x *DeleteSrvVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSrvVSchemaResponse.ProtoReflect.Descriptor instead. func (*DeleteSrvVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{49} + return file_vtctldata_proto_rawDescGZIP(), []int{51} } type DeleteTabletsRequest struct { @@ -3905,7 +4109,7 @@ type DeleteTabletsRequest struct { func (x *DeleteTabletsRequest) Reset() { *x = DeleteTabletsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[50] + mi := &file_vtctldata_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3918,7 +4122,7 @@ func (x *DeleteTabletsRequest) String() string { func (*DeleteTabletsRequest) ProtoMessage() {} func (x *DeleteTabletsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[50] + mi := &file_vtctldata_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3931,7 +4135,7 @@ func (x *DeleteTabletsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTabletsRequest.ProtoReflect.Descriptor instead. func (*DeleteTabletsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{50} + return file_vtctldata_proto_rawDescGZIP(), []int{52} } func (x *DeleteTabletsRequest) GetTabletAliases() []*topodata.TabletAlias { @@ -3957,7 +4161,7 @@ type DeleteTabletsResponse struct { func (x *DeleteTabletsResponse) Reset() { *x = DeleteTabletsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[51] + mi := &file_vtctldata_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3970,7 +4174,7 @@ func (x *DeleteTabletsResponse) String() string { func (*DeleteTabletsResponse) ProtoMessage() {} func (x *DeleteTabletsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[51] + mi := &file_vtctldata_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3983,7 +4187,7 @@ func (x *DeleteTabletsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTabletsResponse.ProtoReflect.Descriptor instead. func (*DeleteTabletsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{51} + return file_vtctldata_proto_rawDescGZIP(), []int{53} } type EmergencyReparentShardRequest struct { @@ -4012,12 +4216,15 @@ type EmergencyReparentShardRequest struct { // WaitForAllTablets makes ERS wait for a response from all the tablets before proceeding. // Useful when all the tablets are up and reachable. WaitForAllTablets bool `protobuf:"varint,7,opt,name=wait_for_all_tablets,json=waitForAllTablets,proto3" json:"wait_for_all_tablets,omitempty"` + // ExpectedPrimary is the optional alias we expect to be the current primary in order for + // the reparent operation to succeed. + ExpectedPrimary *topodata.TabletAlias `protobuf:"bytes,8,opt,name=expected_primary,json=expectedPrimary,proto3" json:"expected_primary,omitempty"` } func (x *EmergencyReparentShardRequest) Reset() { *x = EmergencyReparentShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[52] + mi := &file_vtctldata_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4030,7 +4237,7 @@ func (x *EmergencyReparentShardRequest) String() string { func (*EmergencyReparentShardRequest) ProtoMessage() {} func (x *EmergencyReparentShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[52] + mi := &file_vtctldata_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4043,7 +4250,7 @@ func (x *EmergencyReparentShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyReparentShardRequest.ProtoReflect.Descriptor instead. func (*EmergencyReparentShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{52} + return file_vtctldata_proto_rawDescGZIP(), []int{54} } func (x *EmergencyReparentShardRequest) GetKeyspace() string { @@ -4095,6 +4302,13 @@ func (x *EmergencyReparentShardRequest) GetWaitForAllTablets() bool { return false } +func (x *EmergencyReparentShardRequest) GetExpectedPrimary() *topodata.TabletAlias { + if x != nil { + return x.ExpectedPrimary + } + return nil +} + type EmergencyReparentShardResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4115,7 +4329,7 @@ type EmergencyReparentShardResponse struct { func (x *EmergencyReparentShardResponse) Reset() { *x = EmergencyReparentShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[53] + mi := &file_vtctldata_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4128,7 +4342,7 @@ func (x *EmergencyReparentShardResponse) String() string { func (*EmergencyReparentShardResponse) ProtoMessage() {} func (x *EmergencyReparentShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[53] + mi := &file_vtctldata_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4141,7 +4355,7 @@ func (x *EmergencyReparentShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyReparentShardResponse.ProtoReflect.Descriptor instead. func (*EmergencyReparentShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{53} + return file_vtctldata_proto_rawDescGZIP(), []int{55} } func (x *EmergencyReparentShardResponse) GetKeyspace() string { @@ -4193,7 +4407,7 @@ type ExecuteFetchAsAppRequest struct { func (x *ExecuteFetchAsAppRequest) Reset() { *x = ExecuteFetchAsAppRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[54] + mi := &file_vtctldata_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4206,7 +4420,7 @@ func (x *ExecuteFetchAsAppRequest) String() string { func (*ExecuteFetchAsAppRequest) ProtoMessage() {} func (x *ExecuteFetchAsAppRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[54] + mi := &file_vtctldata_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4219,7 +4433,7 @@ func (x *ExecuteFetchAsAppRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsAppRequest.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsAppRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{54} + return file_vtctldata_proto_rawDescGZIP(), []int{56} } func (x *ExecuteFetchAsAppRequest) GetTabletAlias() *topodata.TabletAlias { @@ -4261,7 +4475,7 @@ type ExecuteFetchAsAppResponse struct { func (x *ExecuteFetchAsAppResponse) Reset() { *x = ExecuteFetchAsAppResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[55] + mi := &file_vtctldata_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4274,7 +4488,7 @@ func (x *ExecuteFetchAsAppResponse) String() string { func (*ExecuteFetchAsAppResponse) ProtoMessage() {} func (x *ExecuteFetchAsAppResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[55] + mi := &file_vtctldata_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4287,7 +4501,7 @@ func (x *ExecuteFetchAsAppResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsAppResponse.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsAppResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{55} + return file_vtctldata_proto_rawDescGZIP(), []int{57} } func (x *ExecuteFetchAsAppResponse) GetResult() *query.QueryResult { @@ -4322,7 +4536,7 @@ type ExecuteFetchAsDBARequest struct { func (x *ExecuteFetchAsDBARequest) Reset() { *x = ExecuteFetchAsDBARequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[56] + mi := &file_vtctldata_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4335,7 +4549,7 @@ func (x *ExecuteFetchAsDBARequest) String() string { func (*ExecuteFetchAsDBARequest) ProtoMessage() {} func (x *ExecuteFetchAsDBARequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[56] + mi := &file_vtctldata_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4348,7 +4562,7 @@ func (x *ExecuteFetchAsDBARequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsDBARequest.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsDBARequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{56} + return file_vtctldata_proto_rawDescGZIP(), []int{58} } func (x *ExecuteFetchAsDBARequest) GetTabletAlias() *topodata.TabletAlias { @@ -4397,7 +4611,7 @@ type ExecuteFetchAsDBAResponse struct { func (x *ExecuteFetchAsDBAResponse) Reset() { *x = ExecuteFetchAsDBAResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[57] + mi := &file_vtctldata_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4410,7 +4624,7 @@ func (x *ExecuteFetchAsDBAResponse) String() string { func (*ExecuteFetchAsDBAResponse) ProtoMessage() {} func (x *ExecuteFetchAsDBAResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[57] + mi := &file_vtctldata_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4423,7 +4637,7 @@ func (x *ExecuteFetchAsDBAResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteFetchAsDBAResponse.ProtoReflect.Descriptor instead. func (*ExecuteFetchAsDBAResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{57} + return file_vtctldata_proto_rawDescGZIP(), []int{59} } func (x *ExecuteFetchAsDBAResponse) GetResult() *query.QueryResult { @@ -4445,7 +4659,7 @@ type ExecuteHookRequest struct { func (x *ExecuteHookRequest) Reset() { *x = ExecuteHookRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[58] + mi := &file_vtctldata_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4458,7 +4672,7 @@ func (x *ExecuteHookRequest) String() string { func (*ExecuteHookRequest) ProtoMessage() {} func (x *ExecuteHookRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[58] + mi := &file_vtctldata_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4471,7 +4685,7 @@ func (x *ExecuteHookRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteHookRequest.ProtoReflect.Descriptor instead. func (*ExecuteHookRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{58} + return file_vtctldata_proto_rawDescGZIP(), []int{60} } func (x *ExecuteHookRequest) GetTabletAlias() *topodata.TabletAlias { @@ -4499,7 +4713,7 @@ type ExecuteHookResponse struct { func (x *ExecuteHookResponse) Reset() { *x = ExecuteHookResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[59] + mi := &file_vtctldata_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4512,7 +4726,7 @@ func (x *ExecuteHookResponse) String() string { func (*ExecuteHookResponse) ProtoMessage() {} func (x *ExecuteHookResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[59] + mi := &file_vtctldata_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4525,7 +4739,7 @@ func (x *ExecuteHookResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteHookResponse.ProtoReflect.Descriptor instead. func (*ExecuteHookResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{59} + return file_vtctldata_proto_rawDescGZIP(), []int{61} } func (x *ExecuteHookResponse) GetHookResult() *tabletmanagerdata.ExecuteHookResponse { @@ -4561,7 +4775,7 @@ type ExecuteMultiFetchAsDBARequest struct { func (x *ExecuteMultiFetchAsDBARequest) Reset() { *x = ExecuteMultiFetchAsDBARequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[60] + mi := &file_vtctldata_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4574,7 +4788,7 @@ func (x *ExecuteMultiFetchAsDBARequest) String() string { func (*ExecuteMultiFetchAsDBARequest) ProtoMessage() {} func (x *ExecuteMultiFetchAsDBARequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[60] + mi := &file_vtctldata_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4587,7 +4801,7 @@ func (x *ExecuteMultiFetchAsDBARequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteMultiFetchAsDBARequest.ProtoReflect.Descriptor instead. func (*ExecuteMultiFetchAsDBARequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{60} + return file_vtctldata_proto_rawDescGZIP(), []int{62} } func (x *ExecuteMultiFetchAsDBARequest) GetTabletAlias() *topodata.TabletAlias { @@ -4636,7 +4850,7 @@ type ExecuteMultiFetchAsDBAResponse struct { func (x *ExecuteMultiFetchAsDBAResponse) Reset() { *x = ExecuteMultiFetchAsDBAResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[61] + mi := &file_vtctldata_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4649,7 +4863,7 @@ func (x *ExecuteMultiFetchAsDBAResponse) String() string { func (*ExecuteMultiFetchAsDBAResponse) ProtoMessage() {} func (x *ExecuteMultiFetchAsDBAResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[61] + mi := &file_vtctldata_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4662,7 +4876,7 @@ func (x *ExecuteMultiFetchAsDBAResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteMultiFetchAsDBAResponse.ProtoReflect.Descriptor instead. func (*ExecuteMultiFetchAsDBAResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{61} + return file_vtctldata_proto_rawDescGZIP(), []int{63} } func (x *ExecuteMultiFetchAsDBAResponse) GetResults() []*query.QueryResult { @@ -4683,7 +4897,7 @@ type FindAllShardsInKeyspaceRequest struct { func (x *FindAllShardsInKeyspaceRequest) Reset() { *x = FindAllShardsInKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[62] + mi := &file_vtctldata_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4696,7 +4910,7 @@ func (x *FindAllShardsInKeyspaceRequest) String() string { func (*FindAllShardsInKeyspaceRequest) ProtoMessage() {} func (x *FindAllShardsInKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[62] + mi := &file_vtctldata_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4709,7 +4923,7 @@ func (x *FindAllShardsInKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindAllShardsInKeyspaceRequest.ProtoReflect.Descriptor instead. func (*FindAllShardsInKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{62} + return file_vtctldata_proto_rawDescGZIP(), []int{64} } func (x *FindAllShardsInKeyspaceRequest) GetKeyspace() string { @@ -4730,7 +4944,7 @@ type FindAllShardsInKeyspaceResponse struct { func (x *FindAllShardsInKeyspaceResponse) Reset() { *x = FindAllShardsInKeyspaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[63] + mi := &file_vtctldata_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4743,7 +4957,7 @@ func (x *FindAllShardsInKeyspaceResponse) String() string { func (*FindAllShardsInKeyspaceResponse) ProtoMessage() {} func (x *FindAllShardsInKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[63] + mi := &file_vtctldata_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4756,7 +4970,7 @@ func (x *FindAllShardsInKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FindAllShardsInKeyspaceResponse.ProtoReflect.Descriptor instead. func (*FindAllShardsInKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{63} + return file_vtctldata_proto_rawDescGZIP(), []int{65} } func (x *FindAllShardsInKeyspaceResponse) GetShards() map[string]*Shard { @@ -4778,7 +4992,7 @@ type ForceCutOverSchemaMigrationRequest struct { func (x *ForceCutOverSchemaMigrationRequest) Reset() { *x = ForceCutOverSchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[64] + mi := &file_vtctldata_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4791,7 +5005,7 @@ func (x *ForceCutOverSchemaMigrationRequest) String() string { func (*ForceCutOverSchemaMigrationRequest) ProtoMessage() {} func (x *ForceCutOverSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[64] + mi := &file_vtctldata_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4804,7 +5018,7 @@ func (x *ForceCutOverSchemaMigrationRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ForceCutOverSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*ForceCutOverSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{64} + return file_vtctldata_proto_rawDescGZIP(), []int{66} } func (x *ForceCutOverSchemaMigrationRequest) GetKeyspace() string { @@ -4832,7 +5046,7 @@ type ForceCutOverSchemaMigrationResponse struct { func (x *ForceCutOverSchemaMigrationResponse) Reset() { *x = ForceCutOverSchemaMigrationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[65] + mi := &file_vtctldata_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4845,7 +5059,7 @@ func (x *ForceCutOverSchemaMigrationResponse) String() string { func (*ForceCutOverSchemaMigrationResponse) ProtoMessage() {} func (x *ForceCutOverSchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[65] + mi := &file_vtctldata_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4858,7 +5072,7 @@ func (x *ForceCutOverSchemaMigrationResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ForceCutOverSchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*ForceCutOverSchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{65} + return file_vtctldata_proto_rawDescGZIP(), []int{67} } func (x *ForceCutOverSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -4894,7 +5108,7 @@ type GetBackupsRequest struct { func (x *GetBackupsRequest) Reset() { *x = GetBackupsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[66] + mi := &file_vtctldata_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4907,7 +5121,7 @@ func (x *GetBackupsRequest) String() string { func (*GetBackupsRequest) ProtoMessage() {} func (x *GetBackupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[66] + mi := &file_vtctldata_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4920,7 +5134,7 @@ func (x *GetBackupsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBackupsRequest.ProtoReflect.Descriptor instead. func (*GetBackupsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{66} + return file_vtctldata_proto_rawDescGZIP(), []int{68} } func (x *GetBackupsRequest) GetKeyspace() string { @@ -4969,7 +5183,7 @@ type GetBackupsResponse struct { func (x *GetBackupsResponse) Reset() { *x = GetBackupsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[67] + mi := &file_vtctldata_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4982,7 +5196,7 @@ func (x *GetBackupsResponse) String() string { func (*GetBackupsResponse) ProtoMessage() {} func (x *GetBackupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[67] + mi := &file_vtctldata_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4995,7 +5209,7 @@ func (x *GetBackupsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBackupsResponse.ProtoReflect.Descriptor instead. func (*GetBackupsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{67} + return file_vtctldata_proto_rawDescGZIP(), []int{69} } func (x *GetBackupsResponse) GetBackups() []*mysqlctl.BackupInfo { @@ -5016,7 +5230,7 @@ type GetCellInfoRequest struct { func (x *GetCellInfoRequest) Reset() { *x = GetCellInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[68] + mi := &file_vtctldata_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5029,7 +5243,7 @@ func (x *GetCellInfoRequest) String() string { func (*GetCellInfoRequest) ProtoMessage() {} func (x *GetCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[68] + mi := &file_vtctldata_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5042,7 +5256,7 @@ func (x *GetCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoRequest.ProtoReflect.Descriptor instead. func (*GetCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{68} + return file_vtctldata_proto_rawDescGZIP(), []int{70} } func (x *GetCellInfoRequest) GetCell() string { @@ -5063,7 +5277,7 @@ type GetCellInfoResponse struct { func (x *GetCellInfoResponse) Reset() { *x = GetCellInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[69] + mi := &file_vtctldata_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5076,7 +5290,7 @@ func (x *GetCellInfoResponse) String() string { func (*GetCellInfoResponse) ProtoMessage() {} func (x *GetCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[69] + mi := &file_vtctldata_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5089,7 +5303,7 @@ func (x *GetCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoResponse.ProtoReflect.Descriptor instead. func (*GetCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{69} + return file_vtctldata_proto_rawDescGZIP(), []int{71} } func (x *GetCellInfoResponse) GetCellInfo() *topodata.CellInfo { @@ -5108,7 +5322,7 @@ type GetCellInfoNamesRequest struct { func (x *GetCellInfoNamesRequest) Reset() { *x = GetCellInfoNamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[70] + mi := &file_vtctldata_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5121,7 +5335,7 @@ func (x *GetCellInfoNamesRequest) String() string { func (*GetCellInfoNamesRequest) ProtoMessage() {} func (x *GetCellInfoNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[70] + mi := &file_vtctldata_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5134,7 +5348,7 @@ func (x *GetCellInfoNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoNamesRequest.ProtoReflect.Descriptor instead. func (*GetCellInfoNamesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{70} + return file_vtctldata_proto_rawDescGZIP(), []int{72} } type GetCellInfoNamesResponse struct { @@ -5148,7 +5362,7 @@ type GetCellInfoNamesResponse struct { func (x *GetCellInfoNamesResponse) Reset() { *x = GetCellInfoNamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[71] + mi := &file_vtctldata_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5161,7 +5375,7 @@ func (x *GetCellInfoNamesResponse) String() string { func (*GetCellInfoNamesResponse) ProtoMessage() {} func (x *GetCellInfoNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[71] + mi := &file_vtctldata_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5174,7 +5388,7 @@ func (x *GetCellInfoNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellInfoNamesResponse.ProtoReflect.Descriptor instead. func (*GetCellInfoNamesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{71} + return file_vtctldata_proto_rawDescGZIP(), []int{73} } func (x *GetCellInfoNamesResponse) GetNames() []string { @@ -5193,7 +5407,7 @@ type GetCellsAliasesRequest struct { func (x *GetCellsAliasesRequest) Reset() { *x = GetCellsAliasesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[72] + mi := &file_vtctldata_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5206,7 +5420,7 @@ func (x *GetCellsAliasesRequest) String() string { func (*GetCellsAliasesRequest) ProtoMessage() {} func (x *GetCellsAliasesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[72] + mi := &file_vtctldata_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5219,7 +5433,7 @@ func (x *GetCellsAliasesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellsAliasesRequest.ProtoReflect.Descriptor instead. func (*GetCellsAliasesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{72} + return file_vtctldata_proto_rawDescGZIP(), []int{74} } type GetCellsAliasesResponse struct { @@ -5233,7 +5447,7 @@ type GetCellsAliasesResponse struct { func (x *GetCellsAliasesResponse) Reset() { *x = GetCellsAliasesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[73] + mi := &file_vtctldata_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5246,7 +5460,7 @@ func (x *GetCellsAliasesResponse) String() string { func (*GetCellsAliasesResponse) ProtoMessage() {} func (x *GetCellsAliasesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[73] + mi := &file_vtctldata_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5259,7 +5473,7 @@ func (x *GetCellsAliasesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCellsAliasesResponse.ProtoReflect.Descriptor instead. func (*GetCellsAliasesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{73} + return file_vtctldata_proto_rawDescGZIP(), []int{75} } func (x *GetCellsAliasesResponse) GetAliases() map[string]*topodata.CellsAlias { @@ -5280,7 +5494,7 @@ type GetFullStatusRequest struct { func (x *GetFullStatusRequest) Reset() { *x = GetFullStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[74] + mi := &file_vtctldata_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5293,7 +5507,7 @@ func (x *GetFullStatusRequest) String() string { func (*GetFullStatusRequest) ProtoMessage() {} func (x *GetFullStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[74] + mi := &file_vtctldata_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5306,7 +5520,7 @@ func (x *GetFullStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFullStatusRequest.ProtoReflect.Descriptor instead. func (*GetFullStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{74} + return file_vtctldata_proto_rawDescGZIP(), []int{76} } func (x *GetFullStatusRequest) GetTabletAlias() *topodata.TabletAlias { @@ -5327,7 +5541,7 @@ type GetFullStatusResponse struct { func (x *GetFullStatusResponse) Reset() { *x = GetFullStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[75] + mi := &file_vtctldata_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5340,7 +5554,7 @@ func (x *GetFullStatusResponse) String() string { func (*GetFullStatusResponse) ProtoMessage() {} func (x *GetFullStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[75] + mi := &file_vtctldata_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5353,7 +5567,7 @@ func (x *GetFullStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFullStatusResponse.ProtoReflect.Descriptor instead. func (*GetFullStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{75} + return file_vtctldata_proto_rawDescGZIP(), []int{77} } func (x *GetFullStatusResponse) GetStatus() *replicationdata.FullStatus { @@ -5372,7 +5586,7 @@ type GetKeyspacesRequest struct { func (x *GetKeyspacesRequest) Reset() { *x = GetKeyspacesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[76] + mi := &file_vtctldata_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5385,7 +5599,7 @@ func (x *GetKeyspacesRequest) String() string { func (*GetKeyspacesRequest) ProtoMessage() {} func (x *GetKeyspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[76] + mi := &file_vtctldata_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5398,7 +5612,7 @@ func (x *GetKeyspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspacesRequest.ProtoReflect.Descriptor instead. func (*GetKeyspacesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{76} + return file_vtctldata_proto_rawDescGZIP(), []int{78} } type GetKeyspacesResponse struct { @@ -5412,7 +5626,7 @@ type GetKeyspacesResponse struct { func (x *GetKeyspacesResponse) Reset() { *x = GetKeyspacesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[77] + mi := &file_vtctldata_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5425,7 +5639,7 @@ func (x *GetKeyspacesResponse) String() string { func (*GetKeyspacesResponse) ProtoMessage() {} func (x *GetKeyspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[77] + mi := &file_vtctldata_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5438,7 +5652,7 @@ func (x *GetKeyspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspacesResponse.ProtoReflect.Descriptor instead. func (*GetKeyspacesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{77} + return file_vtctldata_proto_rawDescGZIP(), []int{79} } func (x *GetKeyspacesResponse) GetKeyspaces() []*Keyspace { @@ -5459,7 +5673,7 @@ type GetKeyspaceRequest struct { func (x *GetKeyspaceRequest) Reset() { *x = GetKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[78] + mi := &file_vtctldata_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5472,7 +5686,7 @@ func (x *GetKeyspaceRequest) String() string { func (*GetKeyspaceRequest) ProtoMessage() {} func (x *GetKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[78] + mi := &file_vtctldata_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5485,7 +5699,7 @@ func (x *GetKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRequest.ProtoReflect.Descriptor instead. func (*GetKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{78} + return file_vtctldata_proto_rawDescGZIP(), []int{80} } func (x *GetKeyspaceRequest) GetKeyspace() string { @@ -5506,7 +5720,7 @@ type GetKeyspaceResponse struct { func (x *GetKeyspaceResponse) Reset() { *x = GetKeyspaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[79] + mi := &file_vtctldata_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5519,7 +5733,7 @@ func (x *GetKeyspaceResponse) String() string { func (*GetKeyspaceResponse) ProtoMessage() {} func (x *GetKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[79] + mi := &file_vtctldata_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5532,7 +5746,7 @@ func (x *GetKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceResponse.ProtoReflect.Descriptor instead. func (*GetKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{79} + return file_vtctldata_proto_rawDescGZIP(), []int{81} } func (x *GetKeyspaceResponse) GetKeyspace() *Keyspace { @@ -5553,7 +5767,7 @@ type GetPermissionsRequest struct { func (x *GetPermissionsRequest) Reset() { *x = GetPermissionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[80] + mi := &file_vtctldata_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5566,7 +5780,7 @@ func (x *GetPermissionsRequest) String() string { func (*GetPermissionsRequest) ProtoMessage() {} func (x *GetPermissionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[80] + mi := &file_vtctldata_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5579,7 +5793,7 @@ func (x *GetPermissionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPermissionsRequest.ProtoReflect.Descriptor instead. func (*GetPermissionsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{80} + return file_vtctldata_proto_rawDescGZIP(), []int{82} } func (x *GetPermissionsRequest) GetTabletAlias() *topodata.TabletAlias { @@ -5600,7 +5814,7 @@ type GetPermissionsResponse struct { func (x *GetPermissionsResponse) Reset() { *x = GetPermissionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[81] + mi := &file_vtctldata_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5613,7 +5827,7 @@ func (x *GetPermissionsResponse) String() string { func (*GetPermissionsResponse) ProtoMessage() {} func (x *GetPermissionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[81] + mi := &file_vtctldata_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5626,7 +5840,7 @@ func (x *GetPermissionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPermissionsResponse.ProtoReflect.Descriptor instead. func (*GetPermissionsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{81} + return file_vtctldata_proto_rawDescGZIP(), []int{83} } func (x *GetPermissionsResponse) GetPermissions() *tabletmanagerdata.Permissions { @@ -5645,7 +5859,7 @@ type GetKeyspaceRoutingRulesRequest struct { func (x *GetKeyspaceRoutingRulesRequest) Reset() { *x = GetKeyspaceRoutingRulesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[82] + mi := &file_vtctldata_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5658,7 +5872,7 @@ func (x *GetKeyspaceRoutingRulesRequest) String() string { func (*GetKeyspaceRoutingRulesRequest) ProtoMessage() {} func (x *GetKeyspaceRoutingRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[82] + mi := &file_vtctldata_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5671,7 +5885,7 @@ func (x *GetKeyspaceRoutingRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRoutingRulesRequest.ProtoReflect.Descriptor instead. func (*GetKeyspaceRoutingRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{82} + return file_vtctldata_proto_rawDescGZIP(), []int{84} } type GetKeyspaceRoutingRulesResponse struct { @@ -5685,7 +5899,7 @@ type GetKeyspaceRoutingRulesResponse struct { func (x *GetKeyspaceRoutingRulesResponse) Reset() { *x = GetKeyspaceRoutingRulesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[83] + mi := &file_vtctldata_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5698,7 +5912,7 @@ func (x *GetKeyspaceRoutingRulesResponse) String() string { func (*GetKeyspaceRoutingRulesResponse) ProtoMessage() {} func (x *GetKeyspaceRoutingRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[83] + mi := &file_vtctldata_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5711,7 +5925,7 @@ func (x *GetKeyspaceRoutingRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKeyspaceRoutingRulesResponse.ProtoReflect.Descriptor instead. func (*GetKeyspaceRoutingRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{83} + return file_vtctldata_proto_rawDescGZIP(), []int{85} } func (x *GetKeyspaceRoutingRulesResponse) GetKeyspaceRoutingRules() *vschema.KeyspaceRoutingRules { @@ -5730,7 +5944,7 @@ type GetRoutingRulesRequest struct { func (x *GetRoutingRulesRequest) Reset() { *x = GetRoutingRulesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[84] + mi := &file_vtctldata_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5743,7 +5957,7 @@ func (x *GetRoutingRulesRequest) String() string { func (*GetRoutingRulesRequest) ProtoMessage() {} func (x *GetRoutingRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[84] + mi := &file_vtctldata_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5756,7 +5970,7 @@ func (x *GetRoutingRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoutingRulesRequest.ProtoReflect.Descriptor instead. func (*GetRoutingRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{84} + return file_vtctldata_proto_rawDescGZIP(), []int{86} } type GetRoutingRulesResponse struct { @@ -5770,7 +5984,7 @@ type GetRoutingRulesResponse struct { func (x *GetRoutingRulesResponse) Reset() { *x = GetRoutingRulesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[85] + mi := &file_vtctldata_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5783,7 +5997,7 @@ func (x *GetRoutingRulesResponse) String() string { func (*GetRoutingRulesResponse) ProtoMessage() {} func (x *GetRoutingRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[85] + mi := &file_vtctldata_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5796,7 +6010,7 @@ func (x *GetRoutingRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoutingRulesResponse.ProtoReflect.Descriptor instead. func (*GetRoutingRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{85} + return file_vtctldata_proto_rawDescGZIP(), []int{87} } func (x *GetRoutingRulesResponse) GetRoutingRules() *vschema.RoutingRules { @@ -5835,7 +6049,7 @@ type GetSchemaRequest struct { func (x *GetSchemaRequest) Reset() { *x = GetSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[86] + mi := &file_vtctldata_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5848,7 +6062,7 @@ func (x *GetSchemaRequest) String() string { func (*GetSchemaRequest) ProtoMessage() {} func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[86] + mi := &file_vtctldata_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5861,7 +6075,7 @@ func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaRequest.ProtoReflect.Descriptor instead. func (*GetSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{86} + return file_vtctldata_proto_rawDescGZIP(), []int{88} } func (x *GetSchemaRequest) GetTabletAlias() *topodata.TabletAlias { @@ -5924,7 +6138,7 @@ type GetSchemaResponse struct { func (x *GetSchemaResponse) Reset() { *x = GetSchemaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[87] + mi := &file_vtctldata_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5937,7 +6151,7 @@ func (x *GetSchemaResponse) String() string { func (*GetSchemaResponse) ProtoMessage() {} func (x *GetSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[87] + mi := &file_vtctldata_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5950,7 +6164,7 @@ func (x *GetSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaResponse.ProtoReflect.Descriptor instead. func (*GetSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{87} + return file_vtctldata_proto_rawDescGZIP(), []int{89} } func (x *GetSchemaResponse) GetSchema() *tabletmanagerdata.SchemaDefinition { @@ -5996,7 +6210,7 @@ type GetSchemaMigrationsRequest struct { func (x *GetSchemaMigrationsRequest) Reset() { *x = GetSchemaMigrationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[88] + mi := &file_vtctldata_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6009,7 +6223,7 @@ func (x *GetSchemaMigrationsRequest) String() string { func (*GetSchemaMigrationsRequest) ProtoMessage() {} func (x *GetSchemaMigrationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[88] + mi := &file_vtctldata_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6022,7 +6236,7 @@ func (x *GetSchemaMigrationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaMigrationsRequest.ProtoReflect.Descriptor instead. func (*GetSchemaMigrationsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{88} + return file_vtctldata_proto_rawDescGZIP(), []int{90} } func (x *GetSchemaMigrationsRequest) GetKeyspace() string { @@ -6092,7 +6306,7 @@ type GetSchemaMigrationsResponse struct { func (x *GetSchemaMigrationsResponse) Reset() { *x = GetSchemaMigrationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[89] + mi := &file_vtctldata_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6105,7 +6319,7 @@ func (x *GetSchemaMigrationsResponse) String() string { func (*GetSchemaMigrationsResponse) ProtoMessage() {} func (x *GetSchemaMigrationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[89] + mi := &file_vtctldata_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6118,7 +6332,7 @@ func (x *GetSchemaMigrationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSchemaMigrationsResponse.ProtoReflect.Descriptor instead. func (*GetSchemaMigrationsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{89} + return file_vtctldata_proto_rawDescGZIP(), []int{91} } func (x *GetSchemaMigrationsResponse) GetMigrations() []*SchemaMigration { @@ -6143,7 +6357,7 @@ type GetShardReplicationRequest struct { func (x *GetShardReplicationRequest) Reset() { *x = GetShardReplicationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[90] + mi := &file_vtctldata_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6156,7 +6370,7 @@ func (x *GetShardReplicationRequest) String() string { func (*GetShardReplicationRequest) ProtoMessage() {} func (x *GetShardReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[90] + mi := &file_vtctldata_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6169,7 +6383,7 @@ func (x *GetShardReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardReplicationRequest.ProtoReflect.Descriptor instead. func (*GetShardReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{90} + return file_vtctldata_proto_rawDescGZIP(), []int{92} } func (x *GetShardReplicationRequest) GetKeyspace() string { @@ -6204,7 +6418,7 @@ type GetShardReplicationResponse struct { func (x *GetShardReplicationResponse) Reset() { *x = GetShardReplicationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[91] + mi := &file_vtctldata_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6217,7 +6431,7 @@ func (x *GetShardReplicationResponse) String() string { func (*GetShardReplicationResponse) ProtoMessage() {} func (x *GetShardReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[91] + mi := &file_vtctldata_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6230,7 +6444,7 @@ func (x *GetShardReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardReplicationResponse.ProtoReflect.Descriptor instead. func (*GetShardReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{91} + return file_vtctldata_proto_rawDescGZIP(), []int{93} } func (x *GetShardReplicationResponse) GetShardReplicationByCell() map[string]*topodata.ShardReplication { @@ -6252,7 +6466,7 @@ type GetShardRequest struct { func (x *GetShardRequest) Reset() { *x = GetShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[92] + mi := &file_vtctldata_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6265,7 +6479,7 @@ func (x *GetShardRequest) String() string { func (*GetShardRequest) ProtoMessage() {} func (x *GetShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[92] + mi := &file_vtctldata_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6278,7 +6492,7 @@ func (x *GetShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardRequest.ProtoReflect.Descriptor instead. func (*GetShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{92} + return file_vtctldata_proto_rawDescGZIP(), []int{94} } func (x *GetShardRequest) GetKeyspace() string { @@ -6306,7 +6520,7 @@ type GetShardResponse struct { func (x *GetShardResponse) Reset() { *x = GetShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[93] + mi := &file_vtctldata_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6319,7 +6533,7 @@ func (x *GetShardResponse) String() string { func (*GetShardResponse) ProtoMessage() {} func (x *GetShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[93] + mi := &file_vtctldata_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6332,7 +6546,7 @@ func (x *GetShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardResponse.ProtoReflect.Descriptor instead. func (*GetShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{93} + return file_vtctldata_proto_rawDescGZIP(), []int{95} } func (x *GetShardResponse) GetShard() *Shard { @@ -6351,7 +6565,7 @@ type GetShardRoutingRulesRequest struct { func (x *GetShardRoutingRulesRequest) Reset() { *x = GetShardRoutingRulesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[94] + mi := &file_vtctldata_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6364,7 +6578,7 @@ func (x *GetShardRoutingRulesRequest) String() string { func (*GetShardRoutingRulesRequest) ProtoMessage() {} func (x *GetShardRoutingRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[94] + mi := &file_vtctldata_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6377,7 +6591,7 @@ func (x *GetShardRoutingRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardRoutingRulesRequest.ProtoReflect.Descriptor instead. func (*GetShardRoutingRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{94} + return file_vtctldata_proto_rawDescGZIP(), []int{96} } type GetShardRoutingRulesResponse struct { @@ -6391,7 +6605,7 @@ type GetShardRoutingRulesResponse struct { func (x *GetShardRoutingRulesResponse) Reset() { *x = GetShardRoutingRulesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[95] + mi := &file_vtctldata_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6404,7 +6618,7 @@ func (x *GetShardRoutingRulesResponse) String() string { func (*GetShardRoutingRulesResponse) ProtoMessage() {} func (x *GetShardRoutingRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[95] + mi := &file_vtctldata_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6417,7 +6631,7 @@ func (x *GetShardRoutingRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShardRoutingRulesResponse.ProtoReflect.Descriptor instead. func (*GetShardRoutingRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{95} + return file_vtctldata_proto_rawDescGZIP(), []int{97} } func (x *GetShardRoutingRulesResponse) GetShardRoutingRules() *vschema.ShardRoutingRules { @@ -6438,7 +6652,7 @@ type GetSrvKeyspaceNamesRequest struct { func (x *GetSrvKeyspaceNamesRequest) Reset() { *x = GetSrvKeyspaceNamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[96] + mi := &file_vtctldata_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6451,7 +6665,7 @@ func (x *GetSrvKeyspaceNamesRequest) String() string { func (*GetSrvKeyspaceNamesRequest) ProtoMessage() {} func (x *GetSrvKeyspaceNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[96] + mi := &file_vtctldata_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6464,7 +6678,7 @@ func (x *GetSrvKeyspaceNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspaceNamesRequest.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceNamesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{96} + return file_vtctldata_proto_rawDescGZIP(), []int{98} } func (x *GetSrvKeyspaceNamesRequest) GetCells() []string { @@ -6486,7 +6700,7 @@ type GetSrvKeyspaceNamesResponse struct { func (x *GetSrvKeyspaceNamesResponse) Reset() { *x = GetSrvKeyspaceNamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[97] + mi := &file_vtctldata_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6499,7 +6713,7 @@ func (x *GetSrvKeyspaceNamesResponse) String() string { func (*GetSrvKeyspaceNamesResponse) ProtoMessage() {} func (x *GetSrvKeyspaceNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[97] + mi := &file_vtctldata_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6512,7 +6726,7 @@ func (x *GetSrvKeyspaceNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspaceNamesResponse.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceNamesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{97} + return file_vtctldata_proto_rawDescGZIP(), []int{99} } func (x *GetSrvKeyspaceNamesResponse) GetNames() map[string]*GetSrvKeyspaceNamesResponse_NameList { @@ -6536,7 +6750,7 @@ type GetSrvKeyspacesRequest struct { func (x *GetSrvKeyspacesRequest) Reset() { *x = GetSrvKeyspacesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[98] + mi := &file_vtctldata_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6549,7 +6763,7 @@ func (x *GetSrvKeyspacesRequest) String() string { func (*GetSrvKeyspacesRequest) ProtoMessage() {} func (x *GetSrvKeyspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[98] + mi := &file_vtctldata_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6562,7 +6776,7 @@ func (x *GetSrvKeyspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspacesRequest.ProtoReflect.Descriptor instead. func (*GetSrvKeyspacesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{98} + return file_vtctldata_proto_rawDescGZIP(), []int{100} } func (x *GetSrvKeyspacesRequest) GetKeyspace() string { @@ -6591,7 +6805,7 @@ type GetSrvKeyspacesResponse struct { func (x *GetSrvKeyspacesResponse) Reset() { *x = GetSrvKeyspacesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[99] + mi := &file_vtctldata_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6604,7 +6818,7 @@ func (x *GetSrvKeyspacesResponse) String() string { func (*GetSrvKeyspacesResponse) ProtoMessage() {} func (x *GetSrvKeyspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[99] + mi := &file_vtctldata_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6617,7 +6831,7 @@ func (x *GetSrvKeyspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvKeyspacesResponse.ProtoReflect.Descriptor instead. func (*GetSrvKeyspacesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{99} + return file_vtctldata_proto_rawDescGZIP(), []int{101} } func (x *GetSrvKeyspacesResponse) GetSrvKeyspaces() map[string]*topodata.SrvKeyspace { @@ -6661,7 +6875,7 @@ type UpdateThrottlerConfigRequest struct { func (x *UpdateThrottlerConfigRequest) Reset() { *x = UpdateThrottlerConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[100] + mi := &file_vtctldata_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6674,7 +6888,7 @@ func (x *UpdateThrottlerConfigRequest) String() string { func (*UpdateThrottlerConfigRequest) ProtoMessage() {} func (x *UpdateThrottlerConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[100] + mi := &file_vtctldata_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6687,7 +6901,7 @@ func (x *UpdateThrottlerConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateThrottlerConfigRequest.ProtoReflect.Descriptor instead. func (*UpdateThrottlerConfigRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{100} + return file_vtctldata_proto_rawDescGZIP(), []int{102} } func (x *UpdateThrottlerConfigRequest) GetKeyspace() string { @@ -6783,7 +6997,7 @@ type UpdateThrottlerConfigResponse struct { func (x *UpdateThrottlerConfigResponse) Reset() { *x = UpdateThrottlerConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[101] + mi := &file_vtctldata_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6796,7 +7010,7 @@ func (x *UpdateThrottlerConfigResponse) String() string { func (*UpdateThrottlerConfigResponse) ProtoMessage() {} func (x *UpdateThrottlerConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[101] + mi := &file_vtctldata_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6809,7 +7023,7 @@ func (x *UpdateThrottlerConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateThrottlerConfigResponse.ProtoReflect.Descriptor instead. func (*UpdateThrottlerConfigResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{101} + return file_vtctldata_proto_rawDescGZIP(), []int{103} } type GetSrvVSchemaRequest struct { @@ -6823,7 +7037,7 @@ type GetSrvVSchemaRequest struct { func (x *GetSrvVSchemaRequest) Reset() { *x = GetSrvVSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[102] + mi := &file_vtctldata_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6836,7 +7050,7 @@ func (x *GetSrvVSchemaRequest) String() string { func (*GetSrvVSchemaRequest) ProtoMessage() {} func (x *GetSrvVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[102] + mi := &file_vtctldata_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6849,7 +7063,7 @@ func (x *GetSrvVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemaRequest.ProtoReflect.Descriptor instead. func (*GetSrvVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{102} + return file_vtctldata_proto_rawDescGZIP(), []int{104} } func (x *GetSrvVSchemaRequest) GetCell() string { @@ -6870,7 +7084,7 @@ type GetSrvVSchemaResponse struct { func (x *GetSrvVSchemaResponse) Reset() { *x = GetSrvVSchemaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[103] + mi := &file_vtctldata_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6883,7 +7097,7 @@ func (x *GetSrvVSchemaResponse) String() string { func (*GetSrvVSchemaResponse) ProtoMessage() {} func (x *GetSrvVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[103] + mi := &file_vtctldata_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6896,7 +7110,7 @@ func (x *GetSrvVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemaResponse.ProtoReflect.Descriptor instead. func (*GetSrvVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{103} + return file_vtctldata_proto_rawDescGZIP(), []int{105} } func (x *GetSrvVSchemaResponse) GetSrvVSchema() *vschema.SrvVSchema { @@ -6917,7 +7131,7 @@ type GetSrvVSchemasRequest struct { func (x *GetSrvVSchemasRequest) Reset() { *x = GetSrvVSchemasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[104] + mi := &file_vtctldata_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6930,7 +7144,7 @@ func (x *GetSrvVSchemasRequest) String() string { func (*GetSrvVSchemasRequest) ProtoMessage() {} func (x *GetSrvVSchemasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[104] + mi := &file_vtctldata_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6943,7 +7157,7 @@ func (x *GetSrvVSchemasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemasRequest.ProtoReflect.Descriptor instead. func (*GetSrvVSchemasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{104} + return file_vtctldata_proto_rawDescGZIP(), []int{106} } func (x *GetSrvVSchemasRequest) GetCells() []string { @@ -6965,7 +7179,7 @@ type GetSrvVSchemasResponse struct { func (x *GetSrvVSchemasResponse) Reset() { *x = GetSrvVSchemasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[105] + mi := &file_vtctldata_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6978,7 +7192,7 @@ func (x *GetSrvVSchemasResponse) String() string { func (*GetSrvVSchemasResponse) ProtoMessage() {} func (x *GetSrvVSchemasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[105] + mi := &file_vtctldata_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6991,7 +7205,7 @@ func (x *GetSrvVSchemasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSrvVSchemasResponse.ProtoReflect.Descriptor instead. func (*GetSrvVSchemasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{105} + return file_vtctldata_proto_rawDescGZIP(), []int{107} } func (x *GetSrvVSchemasResponse) GetSrvVSchemas() map[string]*vschema.SrvVSchema { @@ -7012,7 +7226,7 @@ type GetTabletRequest struct { func (x *GetTabletRequest) Reset() { *x = GetTabletRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[106] + mi := &file_vtctldata_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7025,7 +7239,7 @@ func (x *GetTabletRequest) String() string { func (*GetTabletRequest) ProtoMessage() {} func (x *GetTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[106] + mi := &file_vtctldata_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7038,7 +7252,7 @@ func (x *GetTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletRequest.ProtoReflect.Descriptor instead. func (*GetTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{106} + return file_vtctldata_proto_rawDescGZIP(), []int{108} } func (x *GetTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -7059,7 +7273,7 @@ type GetTabletResponse struct { func (x *GetTabletResponse) Reset() { *x = GetTabletResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[107] + mi := &file_vtctldata_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7072,7 +7286,7 @@ func (x *GetTabletResponse) String() string { func (*GetTabletResponse) ProtoMessage() {} func (x *GetTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[107] + mi := &file_vtctldata_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7085,7 +7299,7 @@ func (x *GetTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletResponse.ProtoReflect.Descriptor instead. func (*GetTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{107} + return file_vtctldata_proto_rawDescGZIP(), []int{109} } func (x *GetTabletResponse) GetTablet() *topodata.Tablet { @@ -7127,7 +7341,7 @@ type GetTabletsRequest struct { func (x *GetTabletsRequest) Reset() { *x = GetTabletsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[108] + mi := &file_vtctldata_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7140,7 +7354,7 @@ func (x *GetTabletsRequest) String() string { func (*GetTabletsRequest) ProtoMessage() {} func (x *GetTabletsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[108] + mi := &file_vtctldata_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7153,7 +7367,7 @@ func (x *GetTabletsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletsRequest.ProtoReflect.Descriptor instead. func (*GetTabletsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{108} + return file_vtctldata_proto_rawDescGZIP(), []int{110} } func (x *GetTabletsRequest) GetKeyspace() string { @@ -7209,7 +7423,7 @@ type GetTabletsResponse struct { func (x *GetTabletsResponse) Reset() { *x = GetTabletsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[109] + mi := &file_vtctldata_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7222,7 +7436,7 @@ func (x *GetTabletsResponse) String() string { func (*GetTabletsResponse) ProtoMessage() {} func (x *GetTabletsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[109] + mi := &file_vtctldata_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7235,7 +7449,7 @@ func (x *GetTabletsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTabletsResponse.ProtoReflect.Descriptor instead. func (*GetTabletsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{109} + return file_vtctldata_proto_rawDescGZIP(), []int{111} } func (x *GetTabletsResponse) GetTablets() []*topodata.Tablet { @@ -7257,7 +7471,7 @@ type GetThrottlerStatusRequest struct { func (x *GetThrottlerStatusRequest) Reset() { *x = GetThrottlerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[110] + mi := &file_vtctldata_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7270,7 +7484,7 @@ func (x *GetThrottlerStatusRequest) String() string { func (*GetThrottlerStatusRequest) ProtoMessage() {} func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[110] + mi := &file_vtctldata_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7283,7 +7497,7 @@ func (x *GetThrottlerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusRequest.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{110} + return file_vtctldata_proto_rawDescGZIP(), []int{112} } func (x *GetThrottlerStatusRequest) GetTabletAlias() *topodata.TabletAlias { @@ -7304,7 +7518,7 @@ type GetThrottlerStatusResponse struct { func (x *GetThrottlerStatusResponse) Reset() { *x = GetThrottlerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[111] + mi := &file_vtctldata_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7317,7 +7531,7 @@ func (x *GetThrottlerStatusResponse) String() string { func (*GetThrottlerStatusResponse) ProtoMessage() {} func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[111] + mi := &file_vtctldata_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7330,7 +7544,7 @@ func (x *GetThrottlerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetThrottlerStatusResponse.ProtoReflect.Descriptor instead. func (*GetThrottlerStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{111} + return file_vtctldata_proto_rawDescGZIP(), []int{113} } func (x *GetThrottlerStatusResponse) GetStatus() *tabletmanagerdata.GetThrottlerStatusResponse { @@ -7353,7 +7567,7 @@ type GetTopologyPathRequest struct { func (x *GetTopologyPathRequest) Reset() { *x = GetTopologyPathRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[112] + mi := &file_vtctldata_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7366,7 +7580,7 @@ func (x *GetTopologyPathRequest) String() string { func (*GetTopologyPathRequest) ProtoMessage() {} func (x *GetTopologyPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[112] + mi := &file_vtctldata_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7379,7 +7593,7 @@ func (x *GetTopologyPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopologyPathRequest.ProtoReflect.Descriptor instead. func (*GetTopologyPathRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{112} + return file_vtctldata_proto_rawDescGZIP(), []int{114} } func (x *GetTopologyPathRequest) GetPath() string { @@ -7414,7 +7628,7 @@ type GetTopologyPathResponse struct { func (x *GetTopologyPathResponse) Reset() { *x = GetTopologyPathResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[113] + mi := &file_vtctldata_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7427,7 +7641,7 @@ func (x *GetTopologyPathResponse) String() string { func (*GetTopologyPathResponse) ProtoMessage() {} func (x *GetTopologyPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[113] + mi := &file_vtctldata_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7440,7 +7654,7 @@ func (x *GetTopologyPathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopologyPathResponse.ProtoReflect.Descriptor instead. func (*GetTopologyPathResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{113} + return file_vtctldata_proto_rawDescGZIP(), []int{115} } func (x *GetTopologyPathResponse) GetCell() *TopologyCell { @@ -7467,7 +7681,7 @@ type TopologyCell struct { func (x *TopologyCell) Reset() { *x = TopologyCell{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[114] + mi := &file_vtctldata_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7480,7 +7694,7 @@ func (x *TopologyCell) String() string { func (*TopologyCell) ProtoMessage() {} func (x *TopologyCell) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[114] + mi := &file_vtctldata_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7493,7 +7707,7 @@ func (x *TopologyCell) ProtoReflect() protoreflect.Message { // Deprecated: Use TopologyCell.ProtoReflect.Descriptor instead. func (*TopologyCell) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{114} + return file_vtctldata_proto_rawDescGZIP(), []int{116} } func (x *TopologyCell) GetName() string { @@ -7531,31 +7745,32 @@ func (x *TopologyCell) GetVersion() int64 { return 0 } -type GetVSchemaRequest struct { +type GetUnresolvedTransactionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + AbandonAge int64 `protobuf:"varint,2,opt,name=abandon_age,json=abandonAge,proto3" json:"abandon_age,omitempty"` // in seconds } -func (x *GetVSchemaRequest) Reset() { - *x = GetVSchemaRequest{} +func (x *GetUnresolvedTransactionsRequest) Reset() { + *x = GetUnresolvedTransactionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[115] + mi := &file_vtctldata_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetVSchemaRequest) String() string { +func (x *GetUnresolvedTransactionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetVSchemaRequest) ProtoMessage() {} +func (*GetUnresolvedTransactionsRequest) ProtoMessage() {} -func (x *GetVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[115] +func (x *GetUnresolvedTransactionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7566,43 +7781,50 @@ func (x *GetVSchemaRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetVSchemaRequest.ProtoReflect.Descriptor instead. -func (*GetVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{115} +// Deprecated: Use GetUnresolvedTransactionsRequest.ProtoReflect.Descriptor instead. +func (*GetUnresolvedTransactionsRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{117} } -func (x *GetVSchemaRequest) GetKeyspace() string { +func (x *GetUnresolvedTransactionsRequest) GetKeyspace() string { if x != nil { return x.Keyspace } return "" } -type GetVersionRequest struct { +func (x *GetUnresolvedTransactionsRequest) GetAbandonAge() int64 { + if x != nil { + return x.AbandonAge + } + return 0 +} + +type GetUnresolvedTransactionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TabletAlias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=tablet_alias,json=tabletAlias,proto3" json:"tablet_alias,omitempty"` + Transactions []*query.TransactionMetadata `protobuf:"bytes,1,rep,name=transactions,proto3" json:"transactions,omitempty"` } -func (x *GetVersionRequest) Reset() { - *x = GetVersionRequest{} +func (x *GetUnresolvedTransactionsResponse) Reset() { + *x = GetUnresolvedTransactionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[116] + mi := &file_vtctldata_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetVersionRequest) String() string { +func (x *GetUnresolvedTransactionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetVersionRequest) ProtoMessage() {} +func (*GetUnresolvedTransactionsResponse) ProtoMessage() {} -func (x *GetVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[116] +func (x *GetUnresolvedTransactionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7613,43 +7835,44 @@ func (x *GetVersionRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetVersionRequest.ProtoReflect.Descriptor instead. -func (*GetVersionRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{116} +// Deprecated: Use GetUnresolvedTransactionsResponse.ProtoReflect.Descriptor instead. +func (*GetUnresolvedTransactionsResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{118} } -func (x *GetVersionRequest) GetTabletAlias() *topodata.TabletAlias { +func (x *GetUnresolvedTransactionsResponse) GetTransactions() []*query.TransactionMetadata { if x != nil { - return x.TabletAlias + return x.Transactions } return nil } -type GetVersionResponse struct { +type ConcludeTransactionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + Dtid string `protobuf:"bytes,1,opt,name=dtid,proto3" json:"dtid,omitempty"` + Participants []*query.Target `protobuf:"bytes,2,rep,name=participants,proto3" json:"participants,omitempty"` } -func (x *GetVersionResponse) Reset() { - *x = GetVersionResponse{} +func (x *ConcludeTransactionRequest) Reset() { + *x = ConcludeTransactionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[117] + mi := &file_vtctldata_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetVersionResponse) String() string { +func (x *ConcludeTransactionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetVersionResponse) ProtoMessage() {} +func (*ConcludeTransactionRequest) ProtoMessage() {} -func (x *GetVersionResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[117] +func (x *ConcludeTransactionRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7660,43 +7883,48 @@ func (x *GetVersionResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetVersionResponse.ProtoReflect.Descriptor instead. -func (*GetVersionResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{117} +// Deprecated: Use ConcludeTransactionRequest.ProtoReflect.Descriptor instead. +func (*ConcludeTransactionRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{119} } -func (x *GetVersionResponse) GetVersion() string { +func (x *ConcludeTransactionRequest) GetDtid() string { if x != nil { - return x.Version + return x.Dtid } return "" } -type GetVSchemaResponse struct { +func (x *ConcludeTransactionRequest) GetParticipants() []*query.Target { + if x != nil { + return x.Participants + } + return nil +} + +type ConcludeTransactionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - VSchema *vschema.Keyspace `protobuf:"bytes,1,opt,name=v_schema,json=vSchema,proto3" json:"v_schema,omitempty"` } -func (x *GetVSchemaResponse) Reset() { - *x = GetVSchemaResponse{} +func (x *ConcludeTransactionResponse) Reset() { + *x = ConcludeTransactionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[118] + mi := &file_vtctldata_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetVSchemaResponse) String() string { +func (x *ConcludeTransactionResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetVSchemaResponse) ProtoMessage() {} +func (*ConcludeTransactionResponse) ProtoMessage() {} -func (x *GetVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[118] +func (x *ConcludeTransactionResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7707,36 +7935,217 @@ func (x *GetVSchemaResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetVSchemaResponse.ProtoReflect.Descriptor instead. -func (*GetVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{118} -} - -func (x *GetVSchemaResponse) GetVSchema() *vschema.Keyspace { - if x != nil { - return x.VSchema - } - return nil +// Deprecated: Use ConcludeTransactionResponse.ProtoReflect.Descriptor instead. +func (*ConcludeTransactionResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{120} } -type GetWorkflowsRequest struct { +type GetVSchemaRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` - ActiveOnly bool `protobuf:"varint,2,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` - NameOnly bool `protobuf:"varint,3,opt,name=name_only,json=nameOnly,proto3" json:"name_only,omitempty"` - // If you only want a specific workflow then set this field. - Workflow string `protobuf:"bytes,4,opt,name=workflow,proto3" json:"workflow,omitempty"` - IncludeLogs bool `protobuf:"varint,5,opt,name=include_logs,json=includeLogs,proto3" json:"include_logs,omitempty"` - Shards []string `protobuf:"bytes,6,rep,name=shards,proto3" json:"shards,omitempty"` + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` } -func (x *GetWorkflowsRequest) Reset() { - *x = GetWorkflowsRequest{} +func (x *GetVSchemaRequest) Reset() { + *x = GetVSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[119] + mi := &file_vtctldata_proto_msgTypes[121] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetVSchemaRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVSchemaRequest) ProtoMessage() {} + +func (x *GetVSchemaRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[121] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVSchemaRequest.ProtoReflect.Descriptor instead. +func (*GetVSchemaRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{121} +} + +func (x *GetVSchemaRequest) GetKeyspace() string { + if x != nil { + return x.Keyspace + } + return "" +} + +type GetVersionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TabletAlias *topodata.TabletAlias `protobuf:"bytes,1,opt,name=tablet_alias,json=tabletAlias,proto3" json:"tablet_alias,omitempty"` +} + +func (x *GetVersionRequest) Reset() { + *x = GetVersionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtctldata_proto_msgTypes[122] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetVersionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVersionRequest) ProtoMessage() {} + +func (x *GetVersionRequest) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[122] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVersionRequest.ProtoReflect.Descriptor instead. +func (*GetVersionRequest) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{122} +} + +func (x *GetVersionRequest) GetTabletAlias() *topodata.TabletAlias { + if x != nil { + return x.TabletAlias + } + return nil +} + +type GetVersionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *GetVersionResponse) Reset() { + *x = GetVersionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_vtctldata_proto_msgTypes[123] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetVersionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVersionResponse) ProtoMessage() {} + +func (x *GetVersionResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[123] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVersionResponse.ProtoReflect.Descriptor instead. +func (*GetVersionResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{123} +} + +func (x *GetVersionResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +type GetVSchemaResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VSchema *vschema.Keyspace `protobuf:"bytes,1,opt,name=v_schema,json=vSchema,proto3" json:"v_schema,omitempty"` +} + +func (x *GetVSchemaResponse) Reset() { + *x = GetVSchemaResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_vtctldata_proto_msgTypes[124] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetVSchemaResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetVSchemaResponse) ProtoMessage() {} + +func (x *GetVSchemaResponse) ProtoReflect() protoreflect.Message { + mi := &file_vtctldata_proto_msgTypes[124] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetVSchemaResponse.ProtoReflect.Descriptor instead. +func (*GetVSchemaResponse) Descriptor() ([]byte, []int) { + return file_vtctldata_proto_rawDescGZIP(), []int{124} +} + +func (x *GetVSchemaResponse) GetVSchema() *vschema.Keyspace { + if x != nil { + return x.VSchema + } + return nil +} + +type GetWorkflowsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + ActiveOnly bool `protobuf:"varint,2,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` + NameOnly bool `protobuf:"varint,3,opt,name=name_only,json=nameOnly,proto3" json:"name_only,omitempty"` + // If you only want a specific workflow then set this field. + Workflow string `protobuf:"bytes,4,opt,name=workflow,proto3" json:"workflow,omitempty"` + IncludeLogs bool `protobuf:"varint,5,opt,name=include_logs,json=includeLogs,proto3" json:"include_logs,omitempty"` + Shards []string `protobuf:"bytes,6,rep,name=shards,proto3" json:"shards,omitempty"` +} + +func (x *GetWorkflowsRequest) Reset() { + *x = GetWorkflowsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_vtctldata_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7749,7 +8158,7 @@ func (x *GetWorkflowsRequest) String() string { func (*GetWorkflowsRequest) ProtoMessage() {} func (x *GetWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[119] + mi := &file_vtctldata_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7762,7 +8171,7 @@ func (x *GetWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowsRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{119} + return file_vtctldata_proto_rawDescGZIP(), []int{125} } func (x *GetWorkflowsRequest) GetKeyspace() string { @@ -7818,7 +8227,7 @@ type GetWorkflowsResponse struct { func (x *GetWorkflowsResponse) Reset() { *x = GetWorkflowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[120] + mi := &file_vtctldata_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7831,7 +8240,7 @@ func (x *GetWorkflowsResponse) String() string { func (*GetWorkflowsResponse) ProtoMessage() {} func (x *GetWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[120] + mi := &file_vtctldata_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7844,7 +8253,7 @@ func (x *GetWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowsResponse.ProtoReflect.Descriptor instead. func (*GetWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{120} + return file_vtctldata_proto_rawDescGZIP(), []int{126} } func (x *GetWorkflowsResponse) GetWorkflows() []*Workflow { @@ -7869,7 +8278,7 @@ type InitShardPrimaryRequest struct { func (x *InitShardPrimaryRequest) Reset() { *x = InitShardPrimaryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[121] + mi := &file_vtctldata_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7882,7 +8291,7 @@ func (x *InitShardPrimaryRequest) String() string { func (*InitShardPrimaryRequest) ProtoMessage() {} func (x *InitShardPrimaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[121] + mi := &file_vtctldata_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7895,7 +8304,7 @@ func (x *InitShardPrimaryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InitShardPrimaryRequest.ProtoReflect.Descriptor instead. func (*InitShardPrimaryRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{121} + return file_vtctldata_proto_rawDescGZIP(), []int{127} } func (x *InitShardPrimaryRequest) GetKeyspace() string { @@ -7944,7 +8353,7 @@ type InitShardPrimaryResponse struct { func (x *InitShardPrimaryResponse) Reset() { *x = InitShardPrimaryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[122] + mi := &file_vtctldata_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7957,7 +8366,7 @@ func (x *InitShardPrimaryResponse) String() string { func (*InitShardPrimaryResponse) ProtoMessage() {} func (x *InitShardPrimaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[122] + mi := &file_vtctldata_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7970,7 +8379,7 @@ func (x *InitShardPrimaryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InitShardPrimaryResponse.ProtoReflect.Descriptor instead. func (*InitShardPrimaryResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{122} + return file_vtctldata_proto_rawDescGZIP(), []int{128} } func (x *InitShardPrimaryResponse) GetEvents() []*logutil.Event { @@ -7992,7 +8401,7 @@ type LaunchSchemaMigrationRequest struct { func (x *LaunchSchemaMigrationRequest) Reset() { *x = LaunchSchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[123] + mi := &file_vtctldata_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8005,7 +8414,7 @@ func (x *LaunchSchemaMigrationRequest) String() string { func (*LaunchSchemaMigrationRequest) ProtoMessage() {} func (x *LaunchSchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[123] + mi := &file_vtctldata_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8018,7 +8427,7 @@ func (x *LaunchSchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LaunchSchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*LaunchSchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{123} + return file_vtctldata_proto_rawDescGZIP(), []int{129} } func (x *LaunchSchemaMigrationRequest) GetKeyspace() string { @@ -8046,7 +8455,7 @@ type LaunchSchemaMigrationResponse struct { func (x *LaunchSchemaMigrationResponse) Reset() { *x = LaunchSchemaMigrationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[124] + mi := &file_vtctldata_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8059,7 +8468,7 @@ func (x *LaunchSchemaMigrationResponse) String() string { func (*LaunchSchemaMigrationResponse) ProtoMessage() {} func (x *LaunchSchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[124] + mi := &file_vtctldata_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8072,7 +8481,7 @@ func (x *LaunchSchemaMigrationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LaunchSchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*LaunchSchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{124} + return file_vtctldata_proto_rawDescGZIP(), []int{130} } func (x *LaunchSchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -8099,7 +8508,7 @@ type LookupVindexCreateRequest struct { func (x *LookupVindexCreateRequest) Reset() { *x = LookupVindexCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[125] + mi := &file_vtctldata_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8112,7 +8521,7 @@ func (x *LookupVindexCreateRequest) String() string { func (*LookupVindexCreateRequest) ProtoMessage() {} func (x *LookupVindexCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[125] + mi := &file_vtctldata_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8125,7 +8534,7 @@ func (x *LookupVindexCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexCreateRequest.ProtoReflect.Descriptor instead. func (*LookupVindexCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{125} + return file_vtctldata_proto_rawDescGZIP(), []int{131} } func (x *LookupVindexCreateRequest) GetKeyspace() string { @@ -8186,7 +8595,7 @@ type LookupVindexCreateResponse struct { func (x *LookupVindexCreateResponse) Reset() { *x = LookupVindexCreateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[126] + mi := &file_vtctldata_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8199,7 +8608,7 @@ func (x *LookupVindexCreateResponse) String() string { func (*LookupVindexCreateResponse) ProtoMessage() {} func (x *LookupVindexCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[126] + mi := &file_vtctldata_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8212,7 +8621,7 @@ func (x *LookupVindexCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexCreateResponse.ProtoReflect.Descriptor instead. func (*LookupVindexCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{126} + return file_vtctldata_proto_rawDescGZIP(), []int{132} } type LookupVindexExternalizeRequest struct { @@ -8231,7 +8640,7 @@ type LookupVindexExternalizeRequest struct { func (x *LookupVindexExternalizeRequest) Reset() { *x = LookupVindexExternalizeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[127] + mi := &file_vtctldata_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8244,7 +8653,7 @@ func (x *LookupVindexExternalizeRequest) String() string { func (*LookupVindexExternalizeRequest) ProtoMessage() {} func (x *LookupVindexExternalizeRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[127] + mi := &file_vtctldata_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8257,7 +8666,7 @@ func (x *LookupVindexExternalizeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexExternalizeRequest.ProtoReflect.Descriptor instead. func (*LookupVindexExternalizeRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{127} + return file_vtctldata_proto_rawDescGZIP(), []int{133} } func (x *LookupVindexExternalizeRequest) GetKeyspace() string { @@ -8293,7 +8702,7 @@ type LookupVindexExternalizeResponse struct { func (x *LookupVindexExternalizeResponse) Reset() { *x = LookupVindexExternalizeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[128] + mi := &file_vtctldata_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8306,7 +8715,7 @@ func (x *LookupVindexExternalizeResponse) String() string { func (*LookupVindexExternalizeResponse) ProtoMessage() {} func (x *LookupVindexExternalizeResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[128] + mi := &file_vtctldata_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8319,7 +8728,7 @@ func (x *LookupVindexExternalizeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVindexExternalizeResponse.ProtoReflect.Descriptor instead. func (*LookupVindexExternalizeResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{128} + return file_vtctldata_proto_rawDescGZIP(), []int{134} } func (x *LookupVindexExternalizeResponse) GetWorkflowDeleted() bool { @@ -8340,7 +8749,7 @@ type MaterializeCreateRequest struct { func (x *MaterializeCreateRequest) Reset() { *x = MaterializeCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[129] + mi := &file_vtctldata_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8353,7 +8762,7 @@ func (x *MaterializeCreateRequest) String() string { func (*MaterializeCreateRequest) ProtoMessage() {} func (x *MaterializeCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[129] + mi := &file_vtctldata_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8366,7 +8775,7 @@ func (x *MaterializeCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MaterializeCreateRequest.ProtoReflect.Descriptor instead. func (*MaterializeCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{129} + return file_vtctldata_proto_rawDescGZIP(), []int{135} } func (x *MaterializeCreateRequest) GetSettings() *MaterializeSettings { @@ -8385,7 +8794,7 @@ type MaterializeCreateResponse struct { func (x *MaterializeCreateResponse) Reset() { *x = MaterializeCreateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[130] + mi := &file_vtctldata_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8398,7 +8807,7 @@ func (x *MaterializeCreateResponse) String() string { func (*MaterializeCreateResponse) ProtoMessage() {} func (x *MaterializeCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[130] + mi := &file_vtctldata_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8411,7 +8820,7 @@ func (x *MaterializeCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MaterializeCreateResponse.ProtoReflect.Descriptor instead. func (*MaterializeCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{130} + return file_vtctldata_proto_rawDescGZIP(), []int{136} } type MigrateCreateRequest struct { @@ -8450,7 +8859,7 @@ type MigrateCreateRequest struct { func (x *MigrateCreateRequest) Reset() { *x = MigrateCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[131] + mi := &file_vtctldata_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8463,7 +8872,7 @@ func (x *MigrateCreateRequest) String() string { func (*MigrateCreateRequest) ProtoMessage() {} func (x *MigrateCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[131] + mi := &file_vtctldata_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8476,7 +8885,7 @@ func (x *MigrateCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCreateRequest.ProtoReflect.Descriptor instead. func (*MigrateCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{131} + return file_vtctldata_proto_rawDescGZIP(), []int{137} } func (x *MigrateCreateRequest) GetWorkflow() string { @@ -8614,7 +9023,7 @@ type MigrateCompleteRequest struct { func (x *MigrateCompleteRequest) Reset() { *x = MigrateCompleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[132] + mi := &file_vtctldata_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8627,7 +9036,7 @@ func (x *MigrateCompleteRequest) String() string { func (*MigrateCompleteRequest) ProtoMessage() {} func (x *MigrateCompleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[132] + mi := &file_vtctldata_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8640,7 +9049,7 @@ func (x *MigrateCompleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCompleteRequest.ProtoReflect.Descriptor instead. func (*MigrateCompleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{132} + return file_vtctldata_proto_rawDescGZIP(), []int{138} } func (x *MigrateCompleteRequest) GetWorkflow() string { @@ -8697,7 +9106,7 @@ type MigrateCompleteResponse struct { func (x *MigrateCompleteResponse) Reset() { *x = MigrateCompleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[133] + mi := &file_vtctldata_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8710,7 +9119,7 @@ func (x *MigrateCompleteResponse) String() string { func (*MigrateCompleteResponse) ProtoMessage() {} func (x *MigrateCompleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[133] + mi := &file_vtctldata_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8723,7 +9132,7 @@ func (x *MigrateCompleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateCompleteResponse.ProtoReflect.Descriptor instead. func (*MigrateCompleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{133} + return file_vtctldata_proto_rawDescGZIP(), []int{139} } func (x *MigrateCompleteResponse) GetSummary() string { @@ -8754,7 +9163,7 @@ type MountRegisterRequest struct { func (x *MountRegisterRequest) Reset() { *x = MountRegisterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[134] + mi := &file_vtctldata_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8767,7 +9176,7 @@ func (x *MountRegisterRequest) String() string { func (*MountRegisterRequest) ProtoMessage() {} func (x *MountRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[134] + mi := &file_vtctldata_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8780,7 +9189,7 @@ func (x *MountRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountRegisterRequest.ProtoReflect.Descriptor instead. func (*MountRegisterRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{134} + return file_vtctldata_proto_rawDescGZIP(), []int{140} } func (x *MountRegisterRequest) GetTopoType() string { @@ -8820,7 +9229,7 @@ type MountRegisterResponse struct { func (x *MountRegisterResponse) Reset() { *x = MountRegisterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[135] + mi := &file_vtctldata_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8833,7 +9242,7 @@ func (x *MountRegisterResponse) String() string { func (*MountRegisterResponse) ProtoMessage() {} func (x *MountRegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[135] + mi := &file_vtctldata_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8846,7 +9255,7 @@ func (x *MountRegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountRegisterResponse.ProtoReflect.Descriptor instead. func (*MountRegisterResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{135} + return file_vtctldata_proto_rawDescGZIP(), []int{141} } type MountUnregisterRequest struct { @@ -8860,7 +9269,7 @@ type MountUnregisterRequest struct { func (x *MountUnregisterRequest) Reset() { *x = MountUnregisterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[136] + mi := &file_vtctldata_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8873,7 +9282,7 @@ func (x *MountUnregisterRequest) String() string { func (*MountUnregisterRequest) ProtoMessage() {} func (x *MountUnregisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[136] + mi := &file_vtctldata_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8886,7 +9295,7 @@ func (x *MountUnregisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountUnregisterRequest.ProtoReflect.Descriptor instead. func (*MountUnregisterRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{136} + return file_vtctldata_proto_rawDescGZIP(), []int{142} } func (x *MountUnregisterRequest) GetName() string { @@ -8905,7 +9314,7 @@ type MountUnregisterResponse struct { func (x *MountUnregisterResponse) Reset() { *x = MountUnregisterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[137] + mi := &file_vtctldata_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8918,7 +9327,7 @@ func (x *MountUnregisterResponse) String() string { func (*MountUnregisterResponse) ProtoMessage() {} func (x *MountUnregisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[137] + mi := &file_vtctldata_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8931,7 +9340,7 @@ func (x *MountUnregisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountUnregisterResponse.ProtoReflect.Descriptor instead. func (*MountUnregisterResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{137} + return file_vtctldata_proto_rawDescGZIP(), []int{143} } type MountShowRequest struct { @@ -8945,7 +9354,7 @@ type MountShowRequest struct { func (x *MountShowRequest) Reset() { *x = MountShowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[138] + mi := &file_vtctldata_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8958,7 +9367,7 @@ func (x *MountShowRequest) String() string { func (*MountShowRequest) ProtoMessage() {} func (x *MountShowRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[138] + mi := &file_vtctldata_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8971,7 +9380,7 @@ func (x *MountShowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountShowRequest.ProtoReflect.Descriptor instead. func (*MountShowRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{138} + return file_vtctldata_proto_rawDescGZIP(), []int{144} } func (x *MountShowRequest) GetName() string { @@ -8995,7 +9404,7 @@ type MountShowResponse struct { func (x *MountShowResponse) Reset() { *x = MountShowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[139] + mi := &file_vtctldata_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9008,7 +9417,7 @@ func (x *MountShowResponse) String() string { func (*MountShowResponse) ProtoMessage() {} func (x *MountShowResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[139] + mi := &file_vtctldata_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9021,7 +9430,7 @@ func (x *MountShowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountShowResponse.ProtoReflect.Descriptor instead. func (*MountShowResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{139} + return file_vtctldata_proto_rawDescGZIP(), []int{145} } func (x *MountShowResponse) GetTopoType() string { @@ -9061,7 +9470,7 @@ type MountListRequest struct { func (x *MountListRequest) Reset() { *x = MountListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[140] + mi := &file_vtctldata_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9074,7 +9483,7 @@ func (x *MountListRequest) String() string { func (*MountListRequest) ProtoMessage() {} func (x *MountListRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[140] + mi := &file_vtctldata_proto_msgTypes[146] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9087,7 +9496,7 @@ func (x *MountListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MountListRequest.ProtoReflect.Descriptor instead. func (*MountListRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{140} + return file_vtctldata_proto_rawDescGZIP(), []int{146} } type MountListResponse struct { @@ -9101,7 +9510,7 @@ type MountListResponse struct { func (x *MountListResponse) Reset() { *x = MountListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[141] + mi := &file_vtctldata_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9114,7 +9523,7 @@ func (x *MountListResponse) String() string { func (*MountListResponse) ProtoMessage() {} func (x *MountListResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[141] + mi := &file_vtctldata_proto_msgTypes[147] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9127,7 +9536,7 @@ func (x *MountListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MountListResponse.ProtoReflect.Descriptor instead. func (*MountListResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{141} + return file_vtctldata_proto_rawDescGZIP(), []int{147} } func (x *MountListResponse) GetNames() []string { @@ -9178,7 +9587,7 @@ type MoveTablesCreateRequest struct { func (x *MoveTablesCreateRequest) Reset() { *x = MoveTablesCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[142] + mi := &file_vtctldata_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9191,7 +9600,7 @@ func (x *MoveTablesCreateRequest) String() string { func (*MoveTablesCreateRequest) ProtoMessage() {} func (x *MoveTablesCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[142] + mi := &file_vtctldata_proto_msgTypes[148] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9204,7 +9613,7 @@ func (x *MoveTablesCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCreateRequest.ProtoReflect.Descriptor instead. func (*MoveTablesCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{142} + return file_vtctldata_proto_rawDescGZIP(), []int{148} } func (x *MoveTablesCreateRequest) GetWorkflow() string { @@ -9359,7 +9768,7 @@ type MoveTablesCreateResponse struct { func (x *MoveTablesCreateResponse) Reset() { *x = MoveTablesCreateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[143] + mi := &file_vtctldata_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9372,7 +9781,7 @@ func (x *MoveTablesCreateResponse) String() string { func (*MoveTablesCreateResponse) ProtoMessage() {} func (x *MoveTablesCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[143] + mi := &file_vtctldata_proto_msgTypes[149] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9385,7 +9794,7 @@ func (x *MoveTablesCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCreateResponse.ProtoReflect.Descriptor instead. func (*MoveTablesCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{143} + return file_vtctldata_proto_rawDescGZIP(), []int{149} } func (x *MoveTablesCreateResponse) GetSummary() string { @@ -9419,7 +9828,7 @@ type MoveTablesCompleteRequest struct { func (x *MoveTablesCompleteRequest) Reset() { *x = MoveTablesCompleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[144] + mi := &file_vtctldata_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9432,7 +9841,7 @@ func (x *MoveTablesCompleteRequest) String() string { func (*MoveTablesCompleteRequest) ProtoMessage() {} func (x *MoveTablesCompleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[144] + mi := &file_vtctldata_proto_msgTypes[150] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9445,7 +9854,7 @@ func (x *MoveTablesCompleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCompleteRequest.ProtoReflect.Descriptor instead. func (*MoveTablesCompleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{144} + return file_vtctldata_proto_rawDescGZIP(), []int{150} } func (x *MoveTablesCompleteRequest) GetWorkflow() string { @@ -9509,7 +9918,7 @@ type MoveTablesCompleteResponse struct { func (x *MoveTablesCompleteResponse) Reset() { *x = MoveTablesCompleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[145] + mi := &file_vtctldata_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9522,7 +9931,7 @@ func (x *MoveTablesCompleteResponse) String() string { func (*MoveTablesCompleteResponse) ProtoMessage() {} func (x *MoveTablesCompleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[145] + mi := &file_vtctldata_proto_msgTypes[151] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9535,7 +9944,7 @@ func (x *MoveTablesCompleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MoveTablesCompleteResponse.ProtoReflect.Descriptor instead. func (*MoveTablesCompleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{145} + return file_vtctldata_proto_rawDescGZIP(), []int{151} } func (x *MoveTablesCompleteResponse) GetSummary() string { @@ -9563,7 +9972,7 @@ type PingTabletRequest struct { func (x *PingTabletRequest) Reset() { *x = PingTabletRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[146] + mi := &file_vtctldata_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9576,7 +9985,7 @@ func (x *PingTabletRequest) String() string { func (*PingTabletRequest) ProtoMessage() {} func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[146] + mi := &file_vtctldata_proto_msgTypes[152] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9589,7 +9998,7 @@ func (x *PingTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PingTabletRequest.ProtoReflect.Descriptor instead. func (*PingTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{146} + return file_vtctldata_proto_rawDescGZIP(), []int{152} } func (x *PingTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -9608,7 +10017,7 @@ type PingTabletResponse struct { func (x *PingTabletResponse) Reset() { *x = PingTabletResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[147] + mi := &file_vtctldata_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9621,7 +10030,7 @@ func (x *PingTabletResponse) String() string { func (*PingTabletResponse) ProtoMessage() {} func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[147] + mi := &file_vtctldata_proto_msgTypes[153] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9634,7 +10043,7 @@ func (x *PingTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PingTabletResponse.ProtoReflect.Descriptor instead. func (*PingTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{147} + return file_vtctldata_proto_rawDescGZIP(), []int{153} } type PlannedReparentShardRequest struct { @@ -9668,12 +10077,17 @@ type PlannedReparentShardRequest struct { // acceptable for a tablet to be eligible for promotion when Vitess makes the choice of a new primary. // A value of 0 indicates that Vitess shouldn't consider the replication lag at all. TolerableReplicationLag *vttime.Duration `protobuf:"bytes,6,opt,name=tolerable_replication_lag,json=tolerableReplicationLag,proto3" json:"tolerable_replication_lag,omitempty"` + // AllowCrossCellPromotion allows cross cell promotion, + AllowCrossCellPromotion bool `protobuf:"varint,7,opt,name=allow_cross_cell_promotion,json=allowCrossCellPromotion,proto3" json:"allow_cross_cell_promotion,omitempty"` + // ExpectedPrimary is the optional alias we expect to be the current primary in order for + // the reparent operation to succeed. + ExpectedPrimary *topodata.TabletAlias `protobuf:"bytes,8,opt,name=expected_primary,json=expectedPrimary,proto3" json:"expected_primary,omitempty"` } func (x *PlannedReparentShardRequest) Reset() { *x = PlannedReparentShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[148] + mi := &file_vtctldata_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9686,7 +10100,7 @@ func (x *PlannedReparentShardRequest) String() string { func (*PlannedReparentShardRequest) ProtoMessage() {} func (x *PlannedReparentShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[148] + mi := &file_vtctldata_proto_msgTypes[154] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9699,7 +10113,7 @@ func (x *PlannedReparentShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedReparentShardRequest.ProtoReflect.Descriptor instead. func (*PlannedReparentShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{148} + return file_vtctldata_proto_rawDescGZIP(), []int{154} } func (x *PlannedReparentShardRequest) GetKeyspace() string { @@ -9744,6 +10158,20 @@ func (x *PlannedReparentShardRequest) GetTolerableReplicationLag() *vttime.Durat return nil } +func (x *PlannedReparentShardRequest) GetAllowCrossCellPromotion() bool { + if x != nil { + return x.AllowCrossCellPromotion + } + return false +} + +func (x *PlannedReparentShardRequest) GetExpectedPrimary() *topodata.TabletAlias { + if x != nil { + return x.ExpectedPrimary + } + return nil +} + type PlannedReparentShardResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9764,7 +10192,7 @@ type PlannedReparentShardResponse struct { func (x *PlannedReparentShardResponse) Reset() { *x = PlannedReparentShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[149] + mi := &file_vtctldata_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9777,7 +10205,7 @@ func (x *PlannedReparentShardResponse) String() string { func (*PlannedReparentShardResponse) ProtoMessage() {} func (x *PlannedReparentShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[149] + mi := &file_vtctldata_proto_msgTypes[155] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9790,7 +10218,7 @@ func (x *PlannedReparentShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedReparentShardResponse.ProtoReflect.Descriptor instead. func (*PlannedReparentShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{149} + return file_vtctldata_proto_rawDescGZIP(), []int{155} } func (x *PlannedReparentShardResponse) GetKeyspace() string { @@ -9836,7 +10264,7 @@ type RebuildKeyspaceGraphRequest struct { func (x *RebuildKeyspaceGraphRequest) Reset() { *x = RebuildKeyspaceGraphRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[150] + mi := &file_vtctldata_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9849,7 +10277,7 @@ func (x *RebuildKeyspaceGraphRequest) String() string { func (*RebuildKeyspaceGraphRequest) ProtoMessage() {} func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[150] + mi := &file_vtctldata_proto_msgTypes[156] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9862,7 +10290,7 @@ func (x *RebuildKeyspaceGraphRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphRequest.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{150} + return file_vtctldata_proto_rawDescGZIP(), []int{156} } func (x *RebuildKeyspaceGraphRequest) GetKeyspace() string { @@ -9895,7 +10323,7 @@ type RebuildKeyspaceGraphResponse struct { func (x *RebuildKeyspaceGraphResponse) Reset() { *x = RebuildKeyspaceGraphResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[151] + mi := &file_vtctldata_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9908,7 +10336,7 @@ func (x *RebuildKeyspaceGraphResponse) String() string { func (*RebuildKeyspaceGraphResponse) ProtoMessage() {} func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[151] + mi := &file_vtctldata_proto_msgTypes[157] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9921,7 +10349,7 @@ func (x *RebuildKeyspaceGraphResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeyspaceGraphResponse.ProtoReflect.Descriptor instead. func (*RebuildKeyspaceGraphResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{151} + return file_vtctldata_proto_rawDescGZIP(), []int{157} } type RebuildVSchemaGraphRequest struct { @@ -9937,7 +10365,7 @@ type RebuildVSchemaGraphRequest struct { func (x *RebuildVSchemaGraphRequest) Reset() { *x = RebuildVSchemaGraphRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[152] + mi := &file_vtctldata_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9950,7 +10378,7 @@ func (x *RebuildVSchemaGraphRequest) String() string { func (*RebuildVSchemaGraphRequest) ProtoMessage() {} func (x *RebuildVSchemaGraphRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[152] + mi := &file_vtctldata_proto_msgTypes[158] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9963,7 +10391,7 @@ func (x *RebuildVSchemaGraphRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildVSchemaGraphRequest.ProtoReflect.Descriptor instead. func (*RebuildVSchemaGraphRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{152} + return file_vtctldata_proto_rawDescGZIP(), []int{158} } func (x *RebuildVSchemaGraphRequest) GetCells() []string { @@ -9982,7 +10410,7 @@ type RebuildVSchemaGraphResponse struct { func (x *RebuildVSchemaGraphResponse) Reset() { *x = RebuildVSchemaGraphResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[153] + mi := &file_vtctldata_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9995,7 +10423,7 @@ func (x *RebuildVSchemaGraphResponse) String() string { func (*RebuildVSchemaGraphResponse) ProtoMessage() {} func (x *RebuildVSchemaGraphResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[153] + mi := &file_vtctldata_proto_msgTypes[159] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10008,7 +10436,7 @@ func (x *RebuildVSchemaGraphResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildVSchemaGraphResponse.ProtoReflect.Descriptor instead. func (*RebuildVSchemaGraphResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{153} + return file_vtctldata_proto_rawDescGZIP(), []int{159} } type RefreshStateRequest struct { @@ -10022,7 +10450,7 @@ type RefreshStateRequest struct { func (x *RefreshStateRequest) Reset() { *x = RefreshStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[154] + mi := &file_vtctldata_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10035,7 +10463,7 @@ func (x *RefreshStateRequest) String() string { func (*RefreshStateRequest) ProtoMessage() {} func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[154] + mi := &file_vtctldata_proto_msgTypes[160] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10048,7 +10476,7 @@ func (x *RefreshStateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateRequest.ProtoReflect.Descriptor instead. func (*RefreshStateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{154} + return file_vtctldata_proto_rawDescGZIP(), []int{160} } func (x *RefreshStateRequest) GetTabletAlias() *topodata.TabletAlias { @@ -10067,7 +10495,7 @@ type RefreshStateResponse struct { func (x *RefreshStateResponse) Reset() { *x = RefreshStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[155] + mi := &file_vtctldata_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10080,7 +10508,7 @@ func (x *RefreshStateResponse) String() string { func (*RefreshStateResponse) ProtoMessage() {} func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[155] + mi := &file_vtctldata_proto_msgTypes[161] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10093,7 +10521,7 @@ func (x *RefreshStateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateResponse.ProtoReflect.Descriptor instead. func (*RefreshStateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{155} + return file_vtctldata_proto_rawDescGZIP(), []int{161} } type RefreshStateByShardRequest struct { @@ -10109,7 +10537,7 @@ type RefreshStateByShardRequest struct { func (x *RefreshStateByShardRequest) Reset() { *x = RefreshStateByShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[156] + mi := &file_vtctldata_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10122,7 +10550,7 @@ func (x *RefreshStateByShardRequest) String() string { func (*RefreshStateByShardRequest) ProtoMessage() {} func (x *RefreshStateByShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[156] + mi := &file_vtctldata_proto_msgTypes[162] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10135,7 +10563,7 @@ func (x *RefreshStateByShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateByShardRequest.ProtoReflect.Descriptor instead. func (*RefreshStateByShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{156} + return file_vtctldata_proto_rawDescGZIP(), []int{162} } func (x *RefreshStateByShardRequest) GetKeyspace() string { @@ -10172,7 +10600,7 @@ type RefreshStateByShardResponse struct { func (x *RefreshStateByShardResponse) Reset() { *x = RefreshStateByShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[157] + mi := &file_vtctldata_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10185,7 +10613,7 @@ func (x *RefreshStateByShardResponse) String() string { func (*RefreshStateByShardResponse) ProtoMessage() {} func (x *RefreshStateByShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[157] + mi := &file_vtctldata_proto_msgTypes[163] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10198,7 +10626,7 @@ func (x *RefreshStateByShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshStateByShardResponse.ProtoReflect.Descriptor instead. func (*RefreshStateByShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{157} + return file_vtctldata_proto_rawDescGZIP(), []int{163} } func (x *RefreshStateByShardResponse) GetIsPartialRefresh() bool { @@ -10226,7 +10654,7 @@ type ReloadSchemaRequest struct { func (x *ReloadSchemaRequest) Reset() { *x = ReloadSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[158] + mi := &file_vtctldata_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10239,7 +10667,7 @@ func (x *ReloadSchemaRequest) String() string { func (*ReloadSchemaRequest) ProtoMessage() {} func (x *ReloadSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[158] + mi := &file_vtctldata_proto_msgTypes[164] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10252,7 +10680,7 @@ func (x *ReloadSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{158} + return file_vtctldata_proto_rawDescGZIP(), []int{164} } func (x *ReloadSchemaRequest) GetTabletAlias() *topodata.TabletAlias { @@ -10271,7 +10699,7 @@ type ReloadSchemaResponse struct { func (x *ReloadSchemaResponse) Reset() { *x = ReloadSchemaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[159] + mi := &file_vtctldata_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10284,7 +10712,7 @@ func (x *ReloadSchemaResponse) String() string { func (*ReloadSchemaResponse) ProtoMessage() {} func (x *ReloadSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[159] + mi := &file_vtctldata_proto_msgTypes[165] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10297,7 +10725,7 @@ func (x *ReloadSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{159} + return file_vtctldata_proto_rawDescGZIP(), []int{165} } type ReloadSchemaKeyspaceRequest struct { @@ -10317,7 +10745,7 @@ type ReloadSchemaKeyspaceRequest struct { func (x *ReloadSchemaKeyspaceRequest) Reset() { *x = ReloadSchemaKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[160] + mi := &file_vtctldata_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10330,7 +10758,7 @@ func (x *ReloadSchemaKeyspaceRequest) String() string { func (*ReloadSchemaKeyspaceRequest) ProtoMessage() {} func (x *ReloadSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[160] + mi := &file_vtctldata_proto_msgTypes[166] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10343,7 +10771,7 @@ func (x *ReloadSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{160} + return file_vtctldata_proto_rawDescGZIP(), []int{166} } func (x *ReloadSchemaKeyspaceRequest) GetKeyspace() string { @@ -10385,7 +10813,7 @@ type ReloadSchemaKeyspaceResponse struct { func (x *ReloadSchemaKeyspaceResponse) Reset() { *x = ReloadSchemaKeyspaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[161] + mi := &file_vtctldata_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10398,7 +10826,7 @@ func (x *ReloadSchemaKeyspaceResponse) String() string { func (*ReloadSchemaKeyspaceResponse) ProtoMessage() {} func (x *ReloadSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[161] + mi := &file_vtctldata_proto_msgTypes[167] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10411,7 +10839,7 @@ func (x *ReloadSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{161} + return file_vtctldata_proto_rawDescGZIP(), []int{167} } func (x *ReloadSchemaKeyspaceResponse) GetEvents() []*logutil.Event { @@ -10437,7 +10865,7 @@ type ReloadSchemaShardRequest struct { func (x *ReloadSchemaShardRequest) Reset() { *x = ReloadSchemaShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[162] + mi := &file_vtctldata_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10450,7 +10878,7 @@ func (x *ReloadSchemaShardRequest) String() string { func (*ReloadSchemaShardRequest) ProtoMessage() {} func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[162] + mi := &file_vtctldata_proto_msgTypes[168] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10463,7 +10891,7 @@ func (x *ReloadSchemaShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardRequest.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{162} + return file_vtctldata_proto_rawDescGZIP(), []int{168} } func (x *ReloadSchemaShardRequest) GetKeyspace() string { @@ -10512,7 +10940,7 @@ type ReloadSchemaShardResponse struct { func (x *ReloadSchemaShardResponse) Reset() { *x = ReloadSchemaShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[163] + mi := &file_vtctldata_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10525,7 +10953,7 @@ func (x *ReloadSchemaShardResponse) String() string { func (*ReloadSchemaShardResponse) ProtoMessage() {} func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[163] + mi := &file_vtctldata_proto_msgTypes[169] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10538,7 +10966,7 @@ func (x *ReloadSchemaShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReloadSchemaShardResponse.ProtoReflect.Descriptor instead. func (*ReloadSchemaShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{163} + return file_vtctldata_proto_rawDescGZIP(), []int{169} } func (x *ReloadSchemaShardResponse) GetEvents() []*logutil.Event { @@ -10561,7 +10989,7 @@ type RemoveBackupRequest struct { func (x *RemoveBackupRequest) Reset() { *x = RemoveBackupRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[164] + mi := &file_vtctldata_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10574,7 +11002,7 @@ func (x *RemoveBackupRequest) String() string { func (*RemoveBackupRequest) ProtoMessage() {} func (x *RemoveBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[164] + mi := &file_vtctldata_proto_msgTypes[170] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10587,7 +11015,7 @@ func (x *RemoveBackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBackupRequest.ProtoReflect.Descriptor instead. func (*RemoveBackupRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{164} + return file_vtctldata_proto_rawDescGZIP(), []int{170} } func (x *RemoveBackupRequest) GetKeyspace() string { @@ -10620,7 +11048,7 @@ type RemoveBackupResponse struct { func (x *RemoveBackupResponse) Reset() { *x = RemoveBackupResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[165] + mi := &file_vtctldata_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10633,7 +11061,7 @@ func (x *RemoveBackupResponse) String() string { func (*RemoveBackupResponse) ProtoMessage() {} func (x *RemoveBackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[165] + mi := &file_vtctldata_proto_msgTypes[171] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10646,7 +11074,7 @@ func (x *RemoveBackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveBackupResponse.ProtoReflect.Descriptor instead. func (*RemoveBackupResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{165} + return file_vtctldata_proto_rawDescGZIP(), []int{171} } type RemoveKeyspaceCellRequest struct { @@ -10668,7 +11096,7 @@ type RemoveKeyspaceCellRequest struct { func (x *RemoveKeyspaceCellRequest) Reset() { *x = RemoveKeyspaceCellRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[166] + mi := &file_vtctldata_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10681,7 +11109,7 @@ func (x *RemoveKeyspaceCellRequest) String() string { func (*RemoveKeyspaceCellRequest) ProtoMessage() {} func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[166] + mi := &file_vtctldata_proto_msgTypes[172] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10694,7 +11122,7 @@ func (x *RemoveKeyspaceCellRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellRequest.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{166} + return file_vtctldata_proto_rawDescGZIP(), []int{172} } func (x *RemoveKeyspaceCellRequest) GetKeyspace() string { @@ -10734,7 +11162,7 @@ type RemoveKeyspaceCellResponse struct { func (x *RemoveKeyspaceCellResponse) Reset() { *x = RemoveKeyspaceCellResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[167] + mi := &file_vtctldata_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10747,7 +11175,7 @@ func (x *RemoveKeyspaceCellResponse) String() string { func (*RemoveKeyspaceCellResponse) ProtoMessage() {} func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[167] + mi := &file_vtctldata_proto_msgTypes[173] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10760,7 +11188,7 @@ func (x *RemoveKeyspaceCellResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveKeyspaceCellResponse.ProtoReflect.Descriptor instead. func (*RemoveKeyspaceCellResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{167} + return file_vtctldata_proto_rawDescGZIP(), []int{173} } type RemoveShardCellRequest struct { @@ -10783,7 +11211,7 @@ type RemoveShardCellRequest struct { func (x *RemoveShardCellRequest) Reset() { *x = RemoveShardCellRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[168] + mi := &file_vtctldata_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10796,7 +11224,7 @@ func (x *RemoveShardCellRequest) String() string { func (*RemoveShardCellRequest) ProtoMessage() {} func (x *RemoveShardCellRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[168] + mi := &file_vtctldata_proto_msgTypes[174] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10809,7 +11237,7 @@ func (x *RemoveShardCellRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveShardCellRequest.ProtoReflect.Descriptor instead. func (*RemoveShardCellRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{168} + return file_vtctldata_proto_rawDescGZIP(), []int{174} } func (x *RemoveShardCellRequest) GetKeyspace() string { @@ -10856,7 +11284,7 @@ type RemoveShardCellResponse struct { func (x *RemoveShardCellResponse) Reset() { *x = RemoveShardCellResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[169] + mi := &file_vtctldata_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10869,7 +11297,7 @@ func (x *RemoveShardCellResponse) String() string { func (*RemoveShardCellResponse) ProtoMessage() {} func (x *RemoveShardCellResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[169] + mi := &file_vtctldata_proto_msgTypes[175] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10882,7 +11310,7 @@ func (x *RemoveShardCellResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveShardCellResponse.ProtoReflect.Descriptor instead. func (*RemoveShardCellResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{169} + return file_vtctldata_proto_rawDescGZIP(), []int{175} } type ReparentTabletRequest struct { @@ -10898,7 +11326,7 @@ type ReparentTabletRequest struct { func (x *ReparentTabletRequest) Reset() { *x = ReparentTabletRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[170] + mi := &file_vtctldata_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10911,7 +11339,7 @@ func (x *ReparentTabletRequest) String() string { func (*ReparentTabletRequest) ProtoMessage() {} func (x *ReparentTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[170] + mi := &file_vtctldata_proto_msgTypes[176] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10924,7 +11352,7 @@ func (x *ReparentTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentTabletRequest.ProtoReflect.Descriptor instead. func (*ReparentTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{170} + return file_vtctldata_proto_rawDescGZIP(), []int{176} } func (x *ReparentTabletRequest) GetTablet() *topodata.TabletAlias { @@ -10950,7 +11378,7 @@ type ReparentTabletResponse struct { func (x *ReparentTabletResponse) Reset() { *x = ReparentTabletResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[171] + mi := &file_vtctldata_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10963,7 +11391,7 @@ func (x *ReparentTabletResponse) String() string { func (*ReparentTabletResponse) ProtoMessage() {} func (x *ReparentTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[171] + mi := &file_vtctldata_proto_msgTypes[177] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10976,7 +11404,7 @@ func (x *ReparentTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReparentTabletResponse.ProtoReflect.Descriptor instead. func (*ReparentTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{171} + return file_vtctldata_proto_rawDescGZIP(), []int{177} } func (x *ReparentTabletResponse) GetKeyspace() string { @@ -11022,13 +11450,14 @@ type ReshardCreateRequest struct { // DeferSecondaryKeys specifies if secondary keys should be created in one shot after table copy finishes. DeferSecondaryKeys bool `protobuf:"varint,11,opt,name=defer_secondary_keys,json=deferSecondaryKeys,proto3" json:"defer_secondary_keys,omitempty"` // Start the workflow after creating it. - AutoStart bool `protobuf:"varint,12,opt,name=auto_start,json=autoStart,proto3" json:"auto_start,omitempty"` + AutoStart bool `protobuf:"varint,12,opt,name=auto_start,json=autoStart,proto3" json:"auto_start,omitempty"` + WorkflowOptions *WorkflowOptions `protobuf:"bytes,13,opt,name=workflow_options,json=workflowOptions,proto3" json:"workflow_options,omitempty"` } func (x *ReshardCreateRequest) Reset() { *x = ReshardCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[172] + mi := &file_vtctldata_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11041,7 +11470,7 @@ func (x *ReshardCreateRequest) String() string { func (*ReshardCreateRequest) ProtoMessage() {} func (x *ReshardCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[172] + mi := &file_vtctldata_proto_msgTypes[178] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11054,7 +11483,7 @@ func (x *ReshardCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReshardCreateRequest.ProtoReflect.Descriptor instead. func (*ReshardCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{172} + return file_vtctldata_proto_rawDescGZIP(), []int{178} } func (x *ReshardCreateRequest) GetWorkflow() string { @@ -11141,6 +11570,13 @@ func (x *ReshardCreateRequest) GetAutoStart() bool { return false } +func (x *ReshardCreateRequest) GetWorkflowOptions() *WorkflowOptions { + if x != nil { + return x.WorkflowOptions + } + return nil +} + type RestoreFromBackupRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -11159,12 +11595,14 @@ type RestoreFromBackupRequest struct { // RestoreToTimestamp, if given, requested an inremental restore up to (and excluding) the given timestamp. // RestoreToTimestamp and RestoreToPos are mutually exclusive. RestoreToTimestamp *vttime.Time `protobuf:"bytes,5,opt,name=restore_to_timestamp,json=restoreToTimestamp,proto3" json:"restore_to_timestamp,omitempty"` + // AllowedBackupEngines, if present will filter out any backups taken with engines not included in the list + AllowedBackupEngines []string `protobuf:"bytes,6,rep,name=allowed_backup_engines,json=allowedBackupEngines,proto3" json:"allowed_backup_engines,omitempty"` } func (x *RestoreFromBackupRequest) Reset() { *x = RestoreFromBackupRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[173] + mi := &file_vtctldata_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11177,7 +11615,7 @@ func (x *RestoreFromBackupRequest) String() string { func (*RestoreFromBackupRequest) ProtoMessage() {} func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[173] + mi := &file_vtctldata_proto_msgTypes[179] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11190,7 +11628,7 @@ func (x *RestoreFromBackupRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupRequest.ProtoReflect.Descriptor instead. func (*RestoreFromBackupRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{173} + return file_vtctldata_proto_rawDescGZIP(), []int{179} } func (x *RestoreFromBackupRequest) GetTabletAlias() *topodata.TabletAlias { @@ -11228,6 +11666,13 @@ func (x *RestoreFromBackupRequest) GetRestoreToTimestamp() *vttime.Time { return nil } +func (x *RestoreFromBackupRequest) GetAllowedBackupEngines() []string { + if x != nil { + return x.AllowedBackupEngines + } + return nil +} + type RestoreFromBackupResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -11243,7 +11688,7 @@ type RestoreFromBackupResponse struct { func (x *RestoreFromBackupResponse) Reset() { *x = RestoreFromBackupResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[174] + mi := &file_vtctldata_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11256,7 +11701,7 @@ func (x *RestoreFromBackupResponse) String() string { func (*RestoreFromBackupResponse) ProtoMessage() {} func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[174] + mi := &file_vtctldata_proto_msgTypes[180] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11269,7 +11714,7 @@ func (x *RestoreFromBackupResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RestoreFromBackupResponse.ProtoReflect.Descriptor instead. func (*RestoreFromBackupResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{174} + return file_vtctldata_proto_rawDescGZIP(), []int{180} } func (x *RestoreFromBackupResponse) GetTabletAlias() *topodata.TabletAlias { @@ -11312,7 +11757,7 @@ type RetrySchemaMigrationRequest struct { func (x *RetrySchemaMigrationRequest) Reset() { *x = RetrySchemaMigrationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[175] + mi := &file_vtctldata_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11325,7 +11770,7 @@ func (x *RetrySchemaMigrationRequest) String() string { func (*RetrySchemaMigrationRequest) ProtoMessage() {} func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[175] + mi := &file_vtctldata_proto_msgTypes[181] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11338,7 +11783,7 @@ func (x *RetrySchemaMigrationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RetrySchemaMigrationRequest.ProtoReflect.Descriptor instead. func (*RetrySchemaMigrationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{175} + return file_vtctldata_proto_rawDescGZIP(), []int{181} } func (x *RetrySchemaMigrationRequest) GetKeyspace() string { @@ -11366,7 +11811,7 @@ type RetrySchemaMigrationResponse struct { func (x *RetrySchemaMigrationResponse) Reset() { *x = RetrySchemaMigrationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[176] + mi := &file_vtctldata_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11379,7 +11824,7 @@ func (x *RetrySchemaMigrationResponse) String() string { func (*RetrySchemaMigrationResponse) ProtoMessage() {} func (x *RetrySchemaMigrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[176] + mi := &file_vtctldata_proto_msgTypes[182] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11392,7 +11837,7 @@ func (x *RetrySchemaMigrationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RetrySchemaMigrationResponse.ProtoReflect.Descriptor instead. func (*RetrySchemaMigrationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{176} + return file_vtctldata_proto_rawDescGZIP(), []int{182} } func (x *RetrySchemaMigrationResponse) GetRowsAffectedByShard() map[string]uint64 { @@ -11413,7 +11858,7 @@ type RunHealthCheckRequest struct { func (x *RunHealthCheckRequest) Reset() { *x = RunHealthCheckRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[177] + mi := &file_vtctldata_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11426,7 +11871,7 @@ func (x *RunHealthCheckRequest) String() string { func (*RunHealthCheckRequest) ProtoMessage() {} func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[177] + mi := &file_vtctldata_proto_msgTypes[183] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11439,7 +11884,7 @@ func (x *RunHealthCheckRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckRequest.ProtoReflect.Descriptor instead. func (*RunHealthCheckRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{177} + return file_vtctldata_proto_rawDescGZIP(), []int{183} } func (x *RunHealthCheckRequest) GetTabletAlias() *topodata.TabletAlias { @@ -11458,7 +11903,7 @@ type RunHealthCheckResponse struct { func (x *RunHealthCheckResponse) Reset() { *x = RunHealthCheckResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[178] + mi := &file_vtctldata_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11471,7 +11916,7 @@ func (x *RunHealthCheckResponse) String() string { func (*RunHealthCheckResponse) ProtoMessage() {} func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[178] + mi := &file_vtctldata_proto_msgTypes[184] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11484,7 +11929,7 @@ func (x *RunHealthCheckResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunHealthCheckResponse.ProtoReflect.Descriptor instead. func (*RunHealthCheckResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{178} + return file_vtctldata_proto_rawDescGZIP(), []int{184} } type SetKeyspaceDurabilityPolicyRequest struct { @@ -11499,7 +11944,7 @@ type SetKeyspaceDurabilityPolicyRequest struct { func (x *SetKeyspaceDurabilityPolicyRequest) Reset() { *x = SetKeyspaceDurabilityPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[179] + mi := &file_vtctldata_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11512,7 +11957,7 @@ func (x *SetKeyspaceDurabilityPolicyRequest) String() string { func (*SetKeyspaceDurabilityPolicyRequest) ProtoMessage() {} func (x *SetKeyspaceDurabilityPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[179] + mi := &file_vtctldata_proto_msgTypes[185] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11525,7 +11970,7 @@ func (x *SetKeyspaceDurabilityPolicyRequest) ProtoReflect() protoreflect.Message // Deprecated: Use SetKeyspaceDurabilityPolicyRequest.ProtoReflect.Descriptor instead. func (*SetKeyspaceDurabilityPolicyRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{179} + return file_vtctldata_proto_rawDescGZIP(), []int{185} } func (x *SetKeyspaceDurabilityPolicyRequest) GetKeyspace() string { @@ -11554,7 +11999,7 @@ type SetKeyspaceDurabilityPolicyResponse struct { func (x *SetKeyspaceDurabilityPolicyResponse) Reset() { *x = SetKeyspaceDurabilityPolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[180] + mi := &file_vtctldata_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11567,7 +12012,7 @@ func (x *SetKeyspaceDurabilityPolicyResponse) String() string { func (*SetKeyspaceDurabilityPolicyResponse) ProtoMessage() {} func (x *SetKeyspaceDurabilityPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[180] + mi := &file_vtctldata_proto_msgTypes[186] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11580,7 +12025,7 @@ func (x *SetKeyspaceDurabilityPolicyResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use SetKeyspaceDurabilityPolicyResponse.ProtoReflect.Descriptor instead. func (*SetKeyspaceDurabilityPolicyResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{180} + return file_vtctldata_proto_rawDescGZIP(), []int{186} } func (x *SetKeyspaceDurabilityPolicyResponse) GetKeyspace() *topodata.Keyspace { @@ -11602,7 +12047,7 @@ type SetKeyspaceShardingInfoRequest struct { func (x *SetKeyspaceShardingInfoRequest) Reset() { *x = SetKeyspaceShardingInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[181] + mi := &file_vtctldata_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11615,7 +12060,7 @@ func (x *SetKeyspaceShardingInfoRequest) String() string { func (*SetKeyspaceShardingInfoRequest) ProtoMessage() {} func (x *SetKeyspaceShardingInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[181] + mi := &file_vtctldata_proto_msgTypes[187] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11628,7 +12073,7 @@ func (x *SetKeyspaceShardingInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetKeyspaceShardingInfoRequest.ProtoReflect.Descriptor instead. func (*SetKeyspaceShardingInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{181} + return file_vtctldata_proto_rawDescGZIP(), []int{187} } func (x *SetKeyspaceShardingInfoRequest) GetKeyspace() string { @@ -11657,7 +12102,7 @@ type SetKeyspaceShardingInfoResponse struct { func (x *SetKeyspaceShardingInfoResponse) Reset() { *x = SetKeyspaceShardingInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[182] + mi := &file_vtctldata_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11670,7 +12115,7 @@ func (x *SetKeyspaceShardingInfoResponse) String() string { func (*SetKeyspaceShardingInfoResponse) ProtoMessage() {} func (x *SetKeyspaceShardingInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[182] + mi := &file_vtctldata_proto_msgTypes[188] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11683,7 +12128,7 @@ func (x *SetKeyspaceShardingInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetKeyspaceShardingInfoResponse.ProtoReflect.Descriptor instead. func (*SetKeyspaceShardingInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{182} + return file_vtctldata_proto_rawDescGZIP(), []int{188} } func (x *SetKeyspaceShardingInfoResponse) GetKeyspace() *topodata.Keyspace { @@ -11706,7 +12151,7 @@ type SetShardIsPrimaryServingRequest struct { func (x *SetShardIsPrimaryServingRequest) Reset() { *x = SetShardIsPrimaryServingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[183] + mi := &file_vtctldata_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11719,7 +12164,7 @@ func (x *SetShardIsPrimaryServingRequest) String() string { func (*SetShardIsPrimaryServingRequest) ProtoMessage() {} func (x *SetShardIsPrimaryServingRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[183] + mi := &file_vtctldata_proto_msgTypes[189] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11732,7 +12177,7 @@ func (x *SetShardIsPrimaryServingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardIsPrimaryServingRequest.ProtoReflect.Descriptor instead. func (*SetShardIsPrimaryServingRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{183} + return file_vtctldata_proto_rawDescGZIP(), []int{189} } func (x *SetShardIsPrimaryServingRequest) GetKeyspace() string { @@ -11768,7 +12213,7 @@ type SetShardIsPrimaryServingResponse struct { func (x *SetShardIsPrimaryServingResponse) Reset() { *x = SetShardIsPrimaryServingResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[184] + mi := &file_vtctldata_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11781,7 +12226,7 @@ func (x *SetShardIsPrimaryServingResponse) String() string { func (*SetShardIsPrimaryServingResponse) ProtoMessage() {} func (x *SetShardIsPrimaryServingResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[184] + mi := &file_vtctldata_proto_msgTypes[190] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11794,7 +12239,7 @@ func (x *SetShardIsPrimaryServingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardIsPrimaryServingResponse.ProtoReflect.Descriptor instead. func (*SetShardIsPrimaryServingResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{184} + return file_vtctldata_proto_rawDescGZIP(), []int{190} } func (x *SetShardIsPrimaryServingResponse) GetShard() *topodata.Shard { @@ -11835,7 +12280,7 @@ type SetShardTabletControlRequest struct { func (x *SetShardTabletControlRequest) Reset() { *x = SetShardTabletControlRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[185] + mi := &file_vtctldata_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11848,7 +12293,7 @@ func (x *SetShardTabletControlRequest) String() string { func (*SetShardTabletControlRequest) ProtoMessage() {} func (x *SetShardTabletControlRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[185] + mi := &file_vtctldata_proto_msgTypes[191] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11861,7 +12306,7 @@ func (x *SetShardTabletControlRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardTabletControlRequest.ProtoReflect.Descriptor instead. func (*SetShardTabletControlRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{185} + return file_vtctldata_proto_rawDescGZIP(), []int{191} } func (x *SetShardTabletControlRequest) GetKeyspace() string { @@ -11925,7 +12370,7 @@ type SetShardTabletControlResponse struct { func (x *SetShardTabletControlResponse) Reset() { *x = SetShardTabletControlResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[186] + mi := &file_vtctldata_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11938,7 +12383,7 @@ func (x *SetShardTabletControlResponse) String() string { func (*SetShardTabletControlResponse) ProtoMessage() {} func (x *SetShardTabletControlResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[186] + mi := &file_vtctldata_proto_msgTypes[192] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11951,7 +12396,7 @@ func (x *SetShardTabletControlResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetShardTabletControlResponse.ProtoReflect.Descriptor instead. func (*SetShardTabletControlResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{186} + return file_vtctldata_proto_rawDescGZIP(), []int{192} } func (x *SetShardTabletControlResponse) GetShard() *topodata.Shard { @@ -11973,7 +12418,7 @@ type SetWritableRequest struct { func (x *SetWritableRequest) Reset() { *x = SetWritableRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[187] + mi := &file_vtctldata_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11986,7 +12431,7 @@ func (x *SetWritableRequest) String() string { func (*SetWritableRequest) ProtoMessage() {} func (x *SetWritableRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[187] + mi := &file_vtctldata_proto_msgTypes[193] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11999,7 +12444,7 @@ func (x *SetWritableRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetWritableRequest.ProtoReflect.Descriptor instead. func (*SetWritableRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{187} + return file_vtctldata_proto_rawDescGZIP(), []int{193} } func (x *SetWritableRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12025,7 +12470,7 @@ type SetWritableResponse struct { func (x *SetWritableResponse) Reset() { *x = SetWritableResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[188] + mi := &file_vtctldata_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12038,7 +12483,7 @@ func (x *SetWritableResponse) String() string { func (*SetWritableResponse) ProtoMessage() {} func (x *SetWritableResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[188] + mi := &file_vtctldata_proto_msgTypes[194] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12051,7 +12496,7 @@ func (x *SetWritableResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetWritableResponse.ProtoReflect.Descriptor instead. func (*SetWritableResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{188} + return file_vtctldata_proto_rawDescGZIP(), []int{194} } type ShardReplicationAddRequest struct { @@ -12067,7 +12512,7 @@ type ShardReplicationAddRequest struct { func (x *ShardReplicationAddRequest) Reset() { *x = ShardReplicationAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[189] + mi := &file_vtctldata_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12080,7 +12525,7 @@ func (x *ShardReplicationAddRequest) String() string { func (*ShardReplicationAddRequest) ProtoMessage() {} func (x *ShardReplicationAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[189] + mi := &file_vtctldata_proto_msgTypes[195] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12093,7 +12538,7 @@ func (x *ShardReplicationAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationAddRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationAddRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{189} + return file_vtctldata_proto_rawDescGZIP(), []int{195} } func (x *ShardReplicationAddRequest) GetKeyspace() string { @@ -12126,7 +12571,7 @@ type ShardReplicationAddResponse struct { func (x *ShardReplicationAddResponse) Reset() { *x = ShardReplicationAddResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[190] + mi := &file_vtctldata_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12139,7 +12584,7 @@ func (x *ShardReplicationAddResponse) String() string { func (*ShardReplicationAddResponse) ProtoMessage() {} func (x *ShardReplicationAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[190] + mi := &file_vtctldata_proto_msgTypes[196] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12152,7 +12597,7 @@ func (x *ShardReplicationAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationAddResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationAddResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{190} + return file_vtctldata_proto_rawDescGZIP(), []int{196} } type ShardReplicationFixRequest struct { @@ -12168,7 +12613,7 @@ type ShardReplicationFixRequest struct { func (x *ShardReplicationFixRequest) Reset() { *x = ShardReplicationFixRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[191] + mi := &file_vtctldata_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12181,7 +12626,7 @@ func (x *ShardReplicationFixRequest) String() string { func (*ShardReplicationFixRequest) ProtoMessage() {} func (x *ShardReplicationFixRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[191] + mi := &file_vtctldata_proto_msgTypes[197] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12194,7 +12639,7 @@ func (x *ShardReplicationFixRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationFixRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationFixRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{191} + return file_vtctldata_proto_rawDescGZIP(), []int{197} } func (x *ShardReplicationFixRequest) GetKeyspace() string { @@ -12232,7 +12677,7 @@ type ShardReplicationFixResponse struct { func (x *ShardReplicationFixResponse) Reset() { *x = ShardReplicationFixResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[192] + mi := &file_vtctldata_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12245,7 +12690,7 @@ func (x *ShardReplicationFixResponse) String() string { func (*ShardReplicationFixResponse) ProtoMessage() {} func (x *ShardReplicationFixResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[192] + mi := &file_vtctldata_proto_msgTypes[198] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12258,7 +12703,7 @@ func (x *ShardReplicationFixResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationFixResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationFixResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{192} + return file_vtctldata_proto_rawDescGZIP(), []int{198} } func (x *ShardReplicationFixResponse) GetError() *topodata.ShardReplicationError { @@ -12280,7 +12725,7 @@ type ShardReplicationPositionsRequest struct { func (x *ShardReplicationPositionsRequest) Reset() { *x = ShardReplicationPositionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[193] + mi := &file_vtctldata_proto_msgTypes[199] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12293,7 +12738,7 @@ func (x *ShardReplicationPositionsRequest) String() string { func (*ShardReplicationPositionsRequest) ProtoMessage() {} func (x *ShardReplicationPositionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[193] + mi := &file_vtctldata_proto_msgTypes[199] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12306,7 +12751,7 @@ func (x *ShardReplicationPositionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationPositionsRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationPositionsRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{193} + return file_vtctldata_proto_rawDescGZIP(), []int{199} } func (x *ShardReplicationPositionsRequest) GetKeyspace() string { @@ -12339,7 +12784,7 @@ type ShardReplicationPositionsResponse struct { func (x *ShardReplicationPositionsResponse) Reset() { *x = ShardReplicationPositionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[194] + mi := &file_vtctldata_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12352,7 +12797,7 @@ func (x *ShardReplicationPositionsResponse) String() string { func (*ShardReplicationPositionsResponse) ProtoMessage() {} func (x *ShardReplicationPositionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[194] + mi := &file_vtctldata_proto_msgTypes[200] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12365,7 +12810,7 @@ func (x *ShardReplicationPositionsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ShardReplicationPositionsResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationPositionsResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{194} + return file_vtctldata_proto_rawDescGZIP(), []int{200} } func (x *ShardReplicationPositionsResponse) GetReplicationStatuses() map[string]*replicationdata.Status { @@ -12395,7 +12840,7 @@ type ShardReplicationRemoveRequest struct { func (x *ShardReplicationRemoveRequest) Reset() { *x = ShardReplicationRemoveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[195] + mi := &file_vtctldata_proto_msgTypes[201] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12408,7 +12853,7 @@ func (x *ShardReplicationRemoveRequest) String() string { func (*ShardReplicationRemoveRequest) ProtoMessage() {} func (x *ShardReplicationRemoveRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[195] + mi := &file_vtctldata_proto_msgTypes[201] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12421,7 +12866,7 @@ func (x *ShardReplicationRemoveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationRemoveRequest.ProtoReflect.Descriptor instead. func (*ShardReplicationRemoveRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{195} + return file_vtctldata_proto_rawDescGZIP(), []int{201} } func (x *ShardReplicationRemoveRequest) GetKeyspace() string { @@ -12454,7 +12899,7 @@ type ShardReplicationRemoveResponse struct { func (x *ShardReplicationRemoveResponse) Reset() { *x = ShardReplicationRemoveResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[196] + mi := &file_vtctldata_proto_msgTypes[202] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12467,7 +12912,7 @@ func (x *ShardReplicationRemoveResponse) String() string { func (*ShardReplicationRemoveResponse) ProtoMessage() {} func (x *ShardReplicationRemoveResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[196] + mi := &file_vtctldata_proto_msgTypes[202] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12480,7 +12925,7 @@ func (x *ShardReplicationRemoveResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShardReplicationRemoveResponse.ProtoReflect.Descriptor instead. func (*ShardReplicationRemoveResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{196} + return file_vtctldata_proto_rawDescGZIP(), []int{202} } type SleepTabletRequest struct { @@ -12495,7 +12940,7 @@ type SleepTabletRequest struct { func (x *SleepTabletRequest) Reset() { *x = SleepTabletRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[197] + mi := &file_vtctldata_proto_msgTypes[203] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12508,7 +12953,7 @@ func (x *SleepTabletRequest) String() string { func (*SleepTabletRequest) ProtoMessage() {} func (x *SleepTabletRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[197] + mi := &file_vtctldata_proto_msgTypes[203] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12521,7 +12966,7 @@ func (x *SleepTabletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SleepTabletRequest.ProtoReflect.Descriptor instead. func (*SleepTabletRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{197} + return file_vtctldata_proto_rawDescGZIP(), []int{203} } func (x *SleepTabletRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12547,7 +12992,7 @@ type SleepTabletResponse struct { func (x *SleepTabletResponse) Reset() { *x = SleepTabletResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[198] + mi := &file_vtctldata_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12560,7 +13005,7 @@ func (x *SleepTabletResponse) String() string { func (*SleepTabletResponse) ProtoMessage() {} func (x *SleepTabletResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[198] + mi := &file_vtctldata_proto_msgTypes[204] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12573,7 +13018,7 @@ func (x *SleepTabletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SleepTabletResponse.ProtoReflect.Descriptor instead. func (*SleepTabletResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{198} + return file_vtctldata_proto_rawDescGZIP(), []int{204} } type SourceShardAddRequest struct { @@ -12597,7 +13042,7 @@ type SourceShardAddRequest struct { func (x *SourceShardAddRequest) Reset() { *x = SourceShardAddRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[199] + mi := &file_vtctldata_proto_msgTypes[205] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12610,7 +13055,7 @@ func (x *SourceShardAddRequest) String() string { func (*SourceShardAddRequest) ProtoMessage() {} func (x *SourceShardAddRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[199] + mi := &file_vtctldata_proto_msgTypes[205] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12623,7 +13068,7 @@ func (x *SourceShardAddRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardAddRequest.ProtoReflect.Descriptor instead. func (*SourceShardAddRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{199} + return file_vtctldata_proto_rawDescGZIP(), []int{205} } func (x *SourceShardAddRequest) GetKeyspace() string { @@ -12687,7 +13132,7 @@ type SourceShardAddResponse struct { func (x *SourceShardAddResponse) Reset() { *x = SourceShardAddResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[200] + mi := &file_vtctldata_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12700,7 +13145,7 @@ func (x *SourceShardAddResponse) String() string { func (*SourceShardAddResponse) ProtoMessage() {} func (x *SourceShardAddResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[200] + mi := &file_vtctldata_proto_msgTypes[206] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12713,7 +13158,7 @@ func (x *SourceShardAddResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardAddResponse.ProtoReflect.Descriptor instead. func (*SourceShardAddResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{200} + return file_vtctldata_proto_rawDescGZIP(), []int{206} } func (x *SourceShardAddResponse) GetShard() *topodata.Shard { @@ -12736,7 +13181,7 @@ type SourceShardDeleteRequest struct { func (x *SourceShardDeleteRequest) Reset() { *x = SourceShardDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[201] + mi := &file_vtctldata_proto_msgTypes[207] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12749,7 +13194,7 @@ func (x *SourceShardDeleteRequest) String() string { func (*SourceShardDeleteRequest) ProtoMessage() {} func (x *SourceShardDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[201] + mi := &file_vtctldata_proto_msgTypes[207] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12762,7 +13207,7 @@ func (x *SourceShardDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardDeleteRequest.ProtoReflect.Descriptor instead. func (*SourceShardDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{201} + return file_vtctldata_proto_rawDescGZIP(), []int{207} } func (x *SourceShardDeleteRequest) GetKeyspace() string { @@ -12798,7 +13243,7 @@ type SourceShardDeleteResponse struct { func (x *SourceShardDeleteResponse) Reset() { *x = SourceShardDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[202] + mi := &file_vtctldata_proto_msgTypes[208] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12811,7 +13256,7 @@ func (x *SourceShardDeleteResponse) String() string { func (*SourceShardDeleteResponse) ProtoMessage() {} func (x *SourceShardDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[202] + mi := &file_vtctldata_proto_msgTypes[208] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12824,7 +13269,7 @@ func (x *SourceShardDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceShardDeleteResponse.ProtoReflect.Descriptor instead. func (*SourceShardDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{202} + return file_vtctldata_proto_rawDescGZIP(), []int{208} } func (x *SourceShardDeleteResponse) GetShard() *topodata.Shard { @@ -12845,7 +13290,7 @@ type StartReplicationRequest struct { func (x *StartReplicationRequest) Reset() { *x = StartReplicationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[203] + mi := &file_vtctldata_proto_msgTypes[209] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12858,7 +13303,7 @@ func (x *StartReplicationRequest) String() string { func (*StartReplicationRequest) ProtoMessage() {} func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[203] + mi := &file_vtctldata_proto_msgTypes[209] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12871,7 +13316,7 @@ func (x *StartReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationRequest.ProtoReflect.Descriptor instead. func (*StartReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{203} + return file_vtctldata_proto_rawDescGZIP(), []int{209} } func (x *StartReplicationRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12890,7 +13335,7 @@ type StartReplicationResponse struct { func (x *StartReplicationResponse) Reset() { *x = StartReplicationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[204] + mi := &file_vtctldata_proto_msgTypes[210] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12903,7 +13348,7 @@ func (x *StartReplicationResponse) String() string { func (*StartReplicationResponse) ProtoMessage() {} func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[204] + mi := &file_vtctldata_proto_msgTypes[210] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12916,7 +13361,7 @@ func (x *StartReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartReplicationResponse.ProtoReflect.Descriptor instead. func (*StartReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{204} + return file_vtctldata_proto_rawDescGZIP(), []int{210} } type StopReplicationRequest struct { @@ -12930,7 +13375,7 @@ type StopReplicationRequest struct { func (x *StopReplicationRequest) Reset() { *x = StopReplicationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[205] + mi := &file_vtctldata_proto_msgTypes[211] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12943,7 +13388,7 @@ func (x *StopReplicationRequest) String() string { func (*StopReplicationRequest) ProtoMessage() {} func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[205] + mi := &file_vtctldata_proto_msgTypes[211] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12956,7 +13401,7 @@ func (x *StopReplicationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationRequest.ProtoReflect.Descriptor instead. func (*StopReplicationRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{205} + return file_vtctldata_proto_rawDescGZIP(), []int{211} } func (x *StopReplicationRequest) GetTabletAlias() *topodata.TabletAlias { @@ -12975,7 +13420,7 @@ type StopReplicationResponse struct { func (x *StopReplicationResponse) Reset() { *x = StopReplicationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[206] + mi := &file_vtctldata_proto_msgTypes[212] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12988,7 +13433,7 @@ func (x *StopReplicationResponse) String() string { func (*StopReplicationResponse) ProtoMessage() {} func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[206] + mi := &file_vtctldata_proto_msgTypes[212] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13001,7 +13446,7 @@ func (x *StopReplicationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StopReplicationResponse.ProtoReflect.Descriptor instead. func (*StopReplicationResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{206} + return file_vtctldata_proto_rawDescGZIP(), []int{212} } type TabletExternallyReparentedRequest struct { @@ -13017,7 +13462,7 @@ type TabletExternallyReparentedRequest struct { func (x *TabletExternallyReparentedRequest) Reset() { *x = TabletExternallyReparentedRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[207] + mi := &file_vtctldata_proto_msgTypes[213] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13030,7 +13475,7 @@ func (x *TabletExternallyReparentedRequest) String() string { func (*TabletExternallyReparentedRequest) ProtoMessage() {} func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[207] + mi := &file_vtctldata_proto_msgTypes[213] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13043,7 +13488,7 @@ func (x *TabletExternallyReparentedRequest) ProtoReflect() protoreflect.Message // Deprecated: Use TabletExternallyReparentedRequest.ProtoReflect.Descriptor instead. func (*TabletExternallyReparentedRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{207} + return file_vtctldata_proto_rawDescGZIP(), []int{213} } func (x *TabletExternallyReparentedRequest) GetTablet() *topodata.TabletAlias { @@ -13067,7 +13512,7 @@ type TabletExternallyReparentedResponse struct { func (x *TabletExternallyReparentedResponse) Reset() { *x = TabletExternallyReparentedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[208] + mi := &file_vtctldata_proto_msgTypes[214] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13080,7 +13525,7 @@ func (x *TabletExternallyReparentedResponse) String() string { func (*TabletExternallyReparentedResponse) ProtoMessage() {} func (x *TabletExternallyReparentedResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[208] + mi := &file_vtctldata_proto_msgTypes[214] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13093,7 +13538,7 @@ func (x *TabletExternallyReparentedResponse) ProtoReflect() protoreflect.Message // Deprecated: Use TabletExternallyReparentedResponse.ProtoReflect.Descriptor instead. func (*TabletExternallyReparentedResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{208} + return file_vtctldata_proto_rawDescGZIP(), []int{214} } func (x *TabletExternallyReparentedResponse) GetKeyspace() string { @@ -13136,7 +13581,7 @@ type UpdateCellInfoRequest struct { func (x *UpdateCellInfoRequest) Reset() { *x = UpdateCellInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[209] + mi := &file_vtctldata_proto_msgTypes[215] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13149,7 +13594,7 @@ func (x *UpdateCellInfoRequest) String() string { func (*UpdateCellInfoRequest) ProtoMessage() {} func (x *UpdateCellInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[209] + mi := &file_vtctldata_proto_msgTypes[215] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13162,7 +13607,7 @@ func (x *UpdateCellInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellInfoRequest.ProtoReflect.Descriptor instead. func (*UpdateCellInfoRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{209} + return file_vtctldata_proto_rawDescGZIP(), []int{215} } func (x *UpdateCellInfoRequest) GetName() string { @@ -13191,7 +13636,7 @@ type UpdateCellInfoResponse struct { func (x *UpdateCellInfoResponse) Reset() { *x = UpdateCellInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[210] + mi := &file_vtctldata_proto_msgTypes[216] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13204,7 +13649,7 @@ func (x *UpdateCellInfoResponse) String() string { func (*UpdateCellInfoResponse) ProtoMessage() {} func (x *UpdateCellInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[210] + mi := &file_vtctldata_proto_msgTypes[216] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13217,7 +13662,7 @@ func (x *UpdateCellInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellInfoResponse.ProtoReflect.Descriptor instead. func (*UpdateCellInfoResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{210} + return file_vtctldata_proto_rawDescGZIP(), []int{216} } func (x *UpdateCellInfoResponse) GetName() string { @@ -13246,7 +13691,7 @@ type UpdateCellsAliasRequest struct { func (x *UpdateCellsAliasRequest) Reset() { *x = UpdateCellsAliasRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[211] + mi := &file_vtctldata_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13259,7 +13704,7 @@ func (x *UpdateCellsAliasRequest) String() string { func (*UpdateCellsAliasRequest) ProtoMessage() {} func (x *UpdateCellsAliasRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[211] + mi := &file_vtctldata_proto_msgTypes[217] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13272,7 +13717,7 @@ func (x *UpdateCellsAliasRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellsAliasRequest.ProtoReflect.Descriptor instead. func (*UpdateCellsAliasRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{211} + return file_vtctldata_proto_rawDescGZIP(), []int{217} } func (x *UpdateCellsAliasRequest) GetName() string { @@ -13301,7 +13746,7 @@ type UpdateCellsAliasResponse struct { func (x *UpdateCellsAliasResponse) Reset() { *x = UpdateCellsAliasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[212] + mi := &file_vtctldata_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13314,7 +13759,7 @@ func (x *UpdateCellsAliasResponse) String() string { func (*UpdateCellsAliasResponse) ProtoMessage() {} func (x *UpdateCellsAliasResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[212] + mi := &file_vtctldata_proto_msgTypes[218] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13327,7 +13772,7 @@ func (x *UpdateCellsAliasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCellsAliasResponse.ProtoReflect.Descriptor instead. func (*UpdateCellsAliasResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{212} + return file_vtctldata_proto_rawDescGZIP(), []int{218} } func (x *UpdateCellsAliasResponse) GetName() string { @@ -13355,7 +13800,7 @@ type ValidateRequest struct { func (x *ValidateRequest) Reset() { *x = ValidateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[213] + mi := &file_vtctldata_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13368,7 +13813,7 @@ func (x *ValidateRequest) String() string { func (*ValidateRequest) ProtoMessage() {} func (x *ValidateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[213] + mi := &file_vtctldata_proto_msgTypes[219] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13381,7 +13826,7 @@ func (x *ValidateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateRequest.ProtoReflect.Descriptor instead. func (*ValidateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{213} + return file_vtctldata_proto_rawDescGZIP(), []int{219} } func (x *ValidateRequest) GetPingTablets() bool { @@ -13403,7 +13848,7 @@ type ValidateResponse struct { func (x *ValidateResponse) Reset() { *x = ValidateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[214] + mi := &file_vtctldata_proto_msgTypes[220] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13416,7 +13861,7 @@ func (x *ValidateResponse) String() string { func (*ValidateResponse) ProtoMessage() {} func (x *ValidateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[214] + mi := &file_vtctldata_proto_msgTypes[220] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13429,7 +13874,7 @@ func (x *ValidateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateResponse.ProtoReflect.Descriptor instead. func (*ValidateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{214} + return file_vtctldata_proto_rawDescGZIP(), []int{220} } func (x *ValidateResponse) GetResults() []string { @@ -13458,7 +13903,7 @@ type ValidateKeyspaceRequest struct { func (x *ValidateKeyspaceRequest) Reset() { *x = ValidateKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[215] + mi := &file_vtctldata_proto_msgTypes[221] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13471,7 +13916,7 @@ func (x *ValidateKeyspaceRequest) String() string { func (*ValidateKeyspaceRequest) ProtoMessage() {} func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[215] + mi := &file_vtctldata_proto_msgTypes[221] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13484,7 +13929,7 @@ func (x *ValidateKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{215} + return file_vtctldata_proto_rawDescGZIP(), []int{221} } func (x *ValidateKeyspaceRequest) GetKeyspace() string { @@ -13513,7 +13958,7 @@ type ValidateKeyspaceResponse struct { func (x *ValidateKeyspaceResponse) Reset() { *x = ValidateKeyspaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[216] + mi := &file_vtctldata_proto_msgTypes[222] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13526,7 +13971,7 @@ func (x *ValidateKeyspaceResponse) String() string { func (*ValidateKeyspaceResponse) ProtoMessage() {} func (x *ValidateKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[216] + mi := &file_vtctldata_proto_msgTypes[222] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13539,7 +13984,7 @@ func (x *ValidateKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{216} + return file_vtctldata_proto_rawDescGZIP(), []int{222} } func (x *ValidateKeyspaceResponse) GetResults() []string { @@ -13571,7 +14016,7 @@ type ValidateSchemaKeyspaceRequest struct { func (x *ValidateSchemaKeyspaceRequest) Reset() { *x = ValidateSchemaKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[217] + mi := &file_vtctldata_proto_msgTypes[223] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13584,7 +14029,7 @@ func (x *ValidateSchemaKeyspaceRequest) String() string { func (*ValidateSchemaKeyspaceRequest) ProtoMessage() {} func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[217] + mi := &file_vtctldata_proto_msgTypes[223] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13597,7 +14042,7 @@ func (x *ValidateSchemaKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSchemaKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateSchemaKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{217} + return file_vtctldata_proto_rawDescGZIP(), []int{223} } func (x *ValidateSchemaKeyspaceRequest) GetKeyspace() string { @@ -13647,7 +14092,7 @@ type ValidateSchemaKeyspaceResponse struct { func (x *ValidateSchemaKeyspaceResponse) Reset() { *x = ValidateSchemaKeyspaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[218] + mi := &file_vtctldata_proto_msgTypes[224] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13660,7 +14105,7 @@ func (x *ValidateSchemaKeyspaceResponse) String() string { func (*ValidateSchemaKeyspaceResponse) ProtoMessage() {} func (x *ValidateSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[218] + mi := &file_vtctldata_proto_msgTypes[224] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13673,7 +14118,7 @@ func (x *ValidateSchemaKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSchemaKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateSchemaKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{218} + return file_vtctldata_proto_rawDescGZIP(), []int{224} } func (x *ValidateSchemaKeyspaceResponse) GetResults() []string { @@ -13703,7 +14148,7 @@ type ValidateShardRequest struct { func (x *ValidateShardRequest) Reset() { *x = ValidateShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[219] + mi := &file_vtctldata_proto_msgTypes[225] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13716,7 +14161,7 @@ func (x *ValidateShardRequest) String() string { func (*ValidateShardRequest) ProtoMessage() {} func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[219] + mi := &file_vtctldata_proto_msgTypes[225] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13729,7 +14174,7 @@ func (x *ValidateShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateShardRequest.ProtoReflect.Descriptor instead. func (*ValidateShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{219} + return file_vtctldata_proto_rawDescGZIP(), []int{225} } func (x *ValidateShardRequest) GetKeyspace() string { @@ -13764,7 +14209,7 @@ type ValidateShardResponse struct { func (x *ValidateShardResponse) Reset() { *x = ValidateShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[220] + mi := &file_vtctldata_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13777,7 +14222,7 @@ func (x *ValidateShardResponse) String() string { func (*ValidateShardResponse) ProtoMessage() {} func (x *ValidateShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[220] + mi := &file_vtctldata_proto_msgTypes[226] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13790,7 +14235,7 @@ func (x *ValidateShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateShardResponse.ProtoReflect.Descriptor instead. func (*ValidateShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{220} + return file_vtctldata_proto_rawDescGZIP(), []int{226} } func (x *ValidateShardResponse) GetResults() []string { @@ -13811,7 +14256,7 @@ type ValidateVersionKeyspaceRequest struct { func (x *ValidateVersionKeyspaceRequest) Reset() { *x = ValidateVersionKeyspaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[221] + mi := &file_vtctldata_proto_msgTypes[227] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13824,7 +14269,7 @@ func (x *ValidateVersionKeyspaceRequest) String() string { func (*ValidateVersionKeyspaceRequest) ProtoMessage() {} func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[221] + mi := &file_vtctldata_proto_msgTypes[227] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13837,7 +14282,7 @@ func (x *ValidateVersionKeyspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionKeyspaceRequest.ProtoReflect.Descriptor instead. func (*ValidateVersionKeyspaceRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{221} + return file_vtctldata_proto_rawDescGZIP(), []int{227} } func (x *ValidateVersionKeyspaceRequest) GetKeyspace() string { @@ -13859,7 +14304,7 @@ type ValidateVersionKeyspaceResponse struct { func (x *ValidateVersionKeyspaceResponse) Reset() { *x = ValidateVersionKeyspaceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[222] + mi := &file_vtctldata_proto_msgTypes[228] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13872,7 +14317,7 @@ func (x *ValidateVersionKeyspaceResponse) String() string { func (*ValidateVersionKeyspaceResponse) ProtoMessage() {} func (x *ValidateVersionKeyspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[222] + mi := &file_vtctldata_proto_msgTypes[228] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13885,7 +14330,7 @@ func (x *ValidateVersionKeyspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionKeyspaceResponse.ProtoReflect.Descriptor instead. func (*ValidateVersionKeyspaceResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{222} + return file_vtctldata_proto_rawDescGZIP(), []int{228} } func (x *ValidateVersionKeyspaceResponse) GetResults() []string { @@ -13914,7 +14359,7 @@ type ValidateVersionShardRequest struct { func (x *ValidateVersionShardRequest) Reset() { *x = ValidateVersionShardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[223] + mi := &file_vtctldata_proto_msgTypes[229] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13927,7 +14372,7 @@ func (x *ValidateVersionShardRequest) String() string { func (*ValidateVersionShardRequest) ProtoMessage() {} func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[223] + mi := &file_vtctldata_proto_msgTypes[229] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13940,7 +14385,7 @@ func (x *ValidateVersionShardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionShardRequest.ProtoReflect.Descriptor instead. func (*ValidateVersionShardRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{223} + return file_vtctldata_proto_rawDescGZIP(), []int{229} } func (x *ValidateVersionShardRequest) GetKeyspace() string { @@ -13968,7 +14413,7 @@ type ValidateVersionShardResponse struct { func (x *ValidateVersionShardResponse) Reset() { *x = ValidateVersionShardResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[224] + mi := &file_vtctldata_proto_msgTypes[230] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13981,7 +14426,7 @@ func (x *ValidateVersionShardResponse) String() string { func (*ValidateVersionShardResponse) ProtoMessage() {} func (x *ValidateVersionShardResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[224] + mi := &file_vtctldata_proto_msgTypes[230] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13994,7 +14439,7 @@ func (x *ValidateVersionShardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVersionShardResponse.ProtoReflect.Descriptor instead. func (*ValidateVersionShardResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{224} + return file_vtctldata_proto_rawDescGZIP(), []int{230} } func (x *ValidateVersionShardResponse) GetResults() []string { @@ -14018,7 +14463,7 @@ type ValidateVSchemaRequest struct { func (x *ValidateVSchemaRequest) Reset() { *x = ValidateVSchemaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[225] + mi := &file_vtctldata_proto_msgTypes[231] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14031,7 +14476,7 @@ func (x *ValidateVSchemaRequest) String() string { func (*ValidateVSchemaRequest) ProtoMessage() {} func (x *ValidateVSchemaRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[225] + mi := &file_vtctldata_proto_msgTypes[231] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14044,7 +14489,7 @@ func (x *ValidateVSchemaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVSchemaRequest.ProtoReflect.Descriptor instead. func (*ValidateVSchemaRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{225} + return file_vtctldata_proto_rawDescGZIP(), []int{231} } func (x *ValidateVSchemaRequest) GetKeyspace() string { @@ -14087,7 +14532,7 @@ type ValidateVSchemaResponse struct { func (x *ValidateVSchemaResponse) Reset() { *x = ValidateVSchemaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[226] + mi := &file_vtctldata_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14100,7 +14545,7 @@ func (x *ValidateVSchemaResponse) String() string { func (*ValidateVSchemaResponse) ProtoMessage() {} func (x *ValidateVSchemaResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[226] + mi := &file_vtctldata_proto_msgTypes[232] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14113,7 +14558,7 @@ func (x *ValidateVSchemaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateVSchemaResponse.ProtoReflect.Descriptor instead. func (*ValidateVSchemaResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{226} + return file_vtctldata_proto_rawDescGZIP(), []int{232} } func (x *ValidateVSchemaResponse) GetResults() []string { @@ -14135,32 +14580,92 @@ type VDiffCreateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Workflow string `protobuf:"bytes,1,opt,name=workflow,proto3" json:"workflow,omitempty"` - TargetKeyspace string `protobuf:"bytes,2,opt,name=target_keyspace,json=targetKeyspace,proto3" json:"target_keyspace,omitempty"` - Uuid string `protobuf:"bytes,3,opt,name=uuid,proto3" json:"uuid,omitempty"` - SourceCells []string `protobuf:"bytes,4,rep,name=source_cells,json=sourceCells,proto3" json:"source_cells,omitempty"` - TargetCells []string `protobuf:"bytes,5,rep,name=target_cells,json=targetCells,proto3" json:"target_cells,omitempty"` - TabletTypes []topodata.TabletType `protobuf:"varint,6,rep,packed,name=tablet_types,json=tabletTypes,proto3,enum=topodata.TabletType" json:"tablet_types,omitempty"` - TabletSelectionPreference tabletmanagerdata.TabletSelectionPreference `protobuf:"varint,7,opt,name=tablet_selection_preference,json=tabletSelectionPreference,proto3,enum=tabletmanagerdata.TabletSelectionPreference" json:"tablet_selection_preference,omitempty"` - Tables []string `protobuf:"bytes,8,rep,name=tables,proto3" json:"tables,omitempty"` - Limit int64 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` - FilteredReplicationWaitTime *vttime.Duration `protobuf:"bytes,10,opt,name=filtered_replication_wait_time,json=filteredReplicationWaitTime,proto3" json:"filtered_replication_wait_time,omitempty"` - DebugQuery bool `protobuf:"varint,11,opt,name=debug_query,json=debugQuery,proto3" json:"debug_query,omitempty"` - OnlyPKs bool `protobuf:"varint,12,opt,name=only_p_ks,json=onlyPKs,proto3" json:"only_p_ks,omitempty"` - UpdateTableStats bool `protobuf:"varint,13,opt,name=update_table_stats,json=updateTableStats,proto3" json:"update_table_stats,omitempty"` - MaxExtraRowsToCompare int64 `protobuf:"varint,14,opt,name=max_extra_rows_to_compare,json=maxExtraRowsToCompare,proto3" json:"max_extra_rows_to_compare,omitempty"` - Wait bool `protobuf:"varint,15,opt,name=wait,proto3" json:"wait,omitempty"` - WaitUpdateInterval *vttime.Duration `protobuf:"bytes,16,opt,name=wait_update_interval,json=waitUpdateInterval,proto3" json:"wait_update_interval,omitempty"` - AutoRetry bool `protobuf:"varint,17,opt,name=auto_retry,json=autoRetry,proto3" json:"auto_retry,omitempty"` - Verbose bool `protobuf:"varint,18,opt,name=verbose,proto3" json:"verbose,omitempty"` - MaxReportSampleRows int64 `protobuf:"varint,19,opt,name=max_report_sample_rows,json=maxReportSampleRows,proto3" json:"max_report_sample_rows,omitempty"` - MaxDiffDuration *vttime.Duration `protobuf:"bytes,20,opt,name=max_diff_duration,json=maxDiffDuration,proto3" json:"max_diff_duration,omitempty"` + // The name of the workflow that we're diffing tables for. + Workflow string `protobuf:"bytes,1,opt,name=workflow,proto3" json:"workflow,omitempty"` + // The keyspace where the vreplication workflow is running. + TargetKeyspace string `protobuf:"bytes,2,opt,name=target_keyspace,json=targetKeyspace,proto3" json:"target_keyspace,omitempty"` + // A unique identifier for the vdiff. + // If empty, a new UUID will be generated. + Uuid string `protobuf:"bytes,3,opt,name=uuid,proto3" json:"uuid,omitempty"` + // The cells to look for source tablets in. + // If empty, all cells are used. + SourceCells []string `protobuf:"bytes,4,rep,name=source_cells,json=sourceCells,proto3" json:"source_cells,omitempty"` + // The cells to look for target tablets in. + // If empty, all cells are used. + TargetCells []string `protobuf:"bytes,5,rep,name=target_cells,json=targetCells,proto3" json:"target_cells,omitempty"` + // The tablet types to use when searching for tablets to use when streaming + // results. + // A default value of "replica,rdonly,primary" is used by the tablet picker. + TabletTypes []topodata.TabletType `protobuf:"varint,6,rep,packed,name=tablet_types,json=tabletTypes,proto3,enum=topodata.TabletType" json:"tablet_types,omitempty"` + // When performing source tablet selection, look for candidates in the type + // order as they are listed in the tablet_types value (or the default of + // "replica,rdonly,primary" that the tablet picker uses). + // The default is ANY (0) and you can use INORDER (1) to e.g. ensure that a + // primary tablet is only used if there are no available replica or rdonly + // tablets. + TabletSelectionPreference tabletmanagerdata.TabletSelectionPreference `protobuf:"varint,7,opt,name=tablet_selection_preference,json=tabletSelectionPreference,proto3,enum=tabletmanagerdata.TabletSelectionPreference" json:"tablet_selection_preference,omitempty"` + // The tables to compare. If empty, all tables in the workflow are compared. + Tables []string `protobuf:"bytes,8,rep,name=tables,proto3" json:"tables,omitempty"` + // The maximum number of rows to compare for each table on each shard. + // The default is a max int64 value: 2^63 - 1 or 9,223,372,036,854,775,807. + Limit int64 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` + // How long to wait for the relevant vreplication stream(s) to catch up when + // attempting to setup the table snapshots on the source and target to use for + // the diff on each shard. + // The default is 30s. + FilteredReplicationWaitTime *vttime.Duration `protobuf:"bytes,10,opt,name=filtered_replication_wait_time,json=filteredReplicationWaitTime,proto3" json:"filtered_replication_wait_time,omitempty"` + // Include the MySQL query used for the diff in the report that is stored on + // each shard primary tablet in the _vt.vdiff_table records. + DebugQuery bool `protobuf:"varint,11,opt,name=debug_query,json=debugQuery,proto3" json:"debug_query,omitempty"` + // Only show the Primary Key columns in any row diff output. You would + // typically want to use this if you set the max_sample_rows very high. + OnlyPKs bool `protobuf:"varint,12,opt,name=only_p_ks,json=onlyPKs,proto3" json:"only_p_ks,omitempty"` + // Update the table statistics, using ANALYZE TABLE, on each table involved + // in the vdiff during initialization on each target shard. This will ensure + // that progress estimates are as accurate as possible -- but it does involve + // locks and can potentially impact query processing on the target keyspace. + UpdateTableStats bool `protobuf:"varint,13,opt,name=update_table_stats,json=updateTableStats,proto3" json:"update_table_stats,omitempty"` + // If there are collation differences between the source and target, you can + // have rows that are identical but simply returned in a different order from + // MySQL. We will do a second pass to compare the rows for any actual + // differences in this case and this flag allows you to control the resources + // used for this operation. + // The default is 0, comparing no extra rows. + MaxExtraRowsToCompare int64 `protobuf:"varint,14,opt,name=max_extra_rows_to_compare,json=maxExtraRowsToCompare,proto3" json:"max_extra_rows_to_compare,omitempty"` + // Wait for the vdiff to complete before returning (making the call synchronous + // vs asynchronous by default). + Wait bool `protobuf:"varint,15,opt,name=wait,proto3" json:"wait,omitempty"` + // When wait is true, this is how frequently the vdiff progress will be shown. + WaitUpdateInterval *vttime.Duration `protobuf:"bytes,16,opt,name=wait_update_interval,json=waitUpdateInterval,proto3" json:"wait_update_interval,omitempty"` + // Automatically retry the vdiff if we encounter an error. This should almost + // always be set to true (default is false). + AutoRetry bool `protobuf:"varint,17,opt,name=auto_retry,json=autoRetry,proto3" json:"auto_retry,omitempty"` + // Include additional information in the vdiff report that is produced and + // stored on each target shard primary's _vt sidecar database. + Verbose bool `protobuf:"varint,18,opt,name=verbose,proto3" json:"verbose,omitempty"` + // The maximum number of rows to include in the row diff report (when + // differences are found) for each table on each shard. + // The default is 0, which will include no sample rows that differed. + MaxReportSampleRows int64 `protobuf:"varint,19,opt,name=max_report_sample_rows,json=maxReportSampleRows,proto3" json:"max_report_sample_rows,omitempty"` + // The maximum time that a diff of a single table can run on each target shard + // before it is stopped and then later resumed from where we left off. This + // can be helpful in limiting the impact of holding open that large transaction + // where we scan up to every row in the table. + // The default is 0 or no limit. + MaxDiffDuration *vttime.Duration `protobuf:"bytes,20,opt,name=max_diff_duration,json=maxDiffDuration,proto3" json:"max_diff_duration,omitempty"` + // At what length should we truncate the column values in the row diff report + // generated for each table on each shard when differences are detected. + // The default is 0, meaning do not truncate. + RowDiffColumnTruncateAt int64 `protobuf:"varint,21,opt,name=row_diff_column_truncate_at,json=rowDiffColumnTruncateAt,proto3" json:"row_diff_column_truncate_at,omitempty"` + // Auto start the vdiff after creating it. + // The default is true if no value is specified. + AutoStart *bool `protobuf:"varint,22,opt,name=auto_start,json=autoStart,proto3,oneof" json:"auto_start,omitempty"` } func (x *VDiffCreateRequest) Reset() { *x = VDiffCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[227] + mi := &file_vtctldata_proto_msgTypes[233] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14173,7 +14678,7 @@ func (x *VDiffCreateRequest) String() string { func (*VDiffCreateRequest) ProtoMessage() {} func (x *VDiffCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[227] + mi := &file_vtctldata_proto_msgTypes[233] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14186,7 +14691,7 @@ func (x *VDiffCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffCreateRequest.ProtoReflect.Descriptor instead. func (*VDiffCreateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{227} + return file_vtctldata_proto_rawDescGZIP(), []int{233} } func (x *VDiffCreateRequest) GetWorkflow() string { @@ -14329,6 +14834,20 @@ func (x *VDiffCreateRequest) GetMaxDiffDuration() *vttime.Duration { return nil } +func (x *VDiffCreateRequest) GetRowDiffColumnTruncateAt() int64 { + if x != nil { + return x.RowDiffColumnTruncateAt + } + return 0 +} + +func (x *VDiffCreateRequest) GetAutoStart() bool { + if x != nil && x.AutoStart != nil { + return *x.AutoStart + } + return false +} + type VDiffCreateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -14342,7 +14861,7 @@ type VDiffCreateResponse struct { func (x *VDiffCreateResponse) Reset() { *x = VDiffCreateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[228] + mi := &file_vtctldata_proto_msgTypes[234] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14355,7 +14874,7 @@ func (x *VDiffCreateResponse) String() string { func (*VDiffCreateResponse) ProtoMessage() {} func (x *VDiffCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[228] + mi := &file_vtctldata_proto_msgTypes[234] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14368,7 +14887,7 @@ func (x *VDiffCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffCreateResponse.ProtoReflect.Descriptor instead. func (*VDiffCreateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{228} + return file_vtctldata_proto_rawDescGZIP(), []int{234} } func (x *VDiffCreateResponse) GetUUID() string { @@ -14392,7 +14911,7 @@ type VDiffDeleteRequest struct { func (x *VDiffDeleteRequest) Reset() { *x = VDiffDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[229] + mi := &file_vtctldata_proto_msgTypes[235] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14405,7 +14924,7 @@ func (x *VDiffDeleteRequest) String() string { func (*VDiffDeleteRequest) ProtoMessage() {} func (x *VDiffDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[229] + mi := &file_vtctldata_proto_msgTypes[235] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14418,7 +14937,7 @@ func (x *VDiffDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffDeleteRequest.ProtoReflect.Descriptor instead. func (*VDiffDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{229} + return file_vtctldata_proto_rawDescGZIP(), []int{235} } func (x *VDiffDeleteRequest) GetWorkflow() string { @@ -14451,7 +14970,7 @@ type VDiffDeleteResponse struct { func (x *VDiffDeleteResponse) Reset() { *x = VDiffDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[230] + mi := &file_vtctldata_proto_msgTypes[236] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14464,7 +14983,7 @@ func (x *VDiffDeleteResponse) String() string { func (*VDiffDeleteResponse) ProtoMessage() {} func (x *VDiffDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[230] + mi := &file_vtctldata_proto_msgTypes[236] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14477,7 +14996,7 @@ func (x *VDiffDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffDeleteResponse.ProtoReflect.Descriptor instead. func (*VDiffDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{230} + return file_vtctldata_proto_rawDescGZIP(), []int{236} } type VDiffResumeRequest struct { @@ -14485,15 +15004,16 @@ type VDiffResumeRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Workflow string `protobuf:"bytes,1,opt,name=workflow,proto3" json:"workflow,omitempty"` - TargetKeyspace string `protobuf:"bytes,2,opt,name=target_keyspace,json=targetKeyspace,proto3" json:"target_keyspace,omitempty"` - Uuid string `protobuf:"bytes,3,opt,name=uuid,proto3" json:"uuid,omitempty"` + Workflow string `protobuf:"bytes,1,opt,name=workflow,proto3" json:"workflow,omitempty"` + TargetKeyspace string `protobuf:"bytes,2,opt,name=target_keyspace,json=targetKeyspace,proto3" json:"target_keyspace,omitempty"` + Uuid string `protobuf:"bytes,3,opt,name=uuid,proto3" json:"uuid,omitempty"` + TargetShards []string `protobuf:"bytes,4,rep,name=target_shards,json=targetShards,proto3" json:"target_shards,omitempty"` } func (x *VDiffResumeRequest) Reset() { *x = VDiffResumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[231] + mi := &file_vtctldata_proto_msgTypes[237] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14506,7 +15026,7 @@ func (x *VDiffResumeRequest) String() string { func (*VDiffResumeRequest) ProtoMessage() {} func (x *VDiffResumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[231] + mi := &file_vtctldata_proto_msgTypes[237] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14519,7 +15039,7 @@ func (x *VDiffResumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffResumeRequest.ProtoReflect.Descriptor instead. func (*VDiffResumeRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{231} + return file_vtctldata_proto_rawDescGZIP(), []int{237} } func (x *VDiffResumeRequest) GetWorkflow() string { @@ -14543,6 +15063,13 @@ func (x *VDiffResumeRequest) GetUuid() string { return "" } +func (x *VDiffResumeRequest) GetTargetShards() []string { + if x != nil { + return x.TargetShards + } + return nil +} + type VDiffResumeResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -14552,7 +15079,7 @@ type VDiffResumeResponse struct { func (x *VDiffResumeResponse) Reset() { *x = VDiffResumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[232] + mi := &file_vtctldata_proto_msgTypes[238] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14565,7 +15092,7 @@ func (x *VDiffResumeResponse) String() string { func (*VDiffResumeResponse) ProtoMessage() {} func (x *VDiffResumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[232] + mi := &file_vtctldata_proto_msgTypes[238] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14578,7 +15105,7 @@ func (x *VDiffResumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffResumeResponse.ProtoReflect.Descriptor instead. func (*VDiffResumeResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{232} + return file_vtctldata_proto_rawDescGZIP(), []int{238} } type VDiffShowRequest struct { @@ -14595,7 +15122,7 @@ type VDiffShowRequest struct { func (x *VDiffShowRequest) Reset() { *x = VDiffShowRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[233] + mi := &file_vtctldata_proto_msgTypes[239] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14608,7 +15135,7 @@ func (x *VDiffShowRequest) String() string { func (*VDiffShowRequest) ProtoMessage() {} func (x *VDiffShowRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[233] + mi := &file_vtctldata_proto_msgTypes[239] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14621,7 +15148,7 @@ func (x *VDiffShowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffShowRequest.ProtoReflect.Descriptor instead. func (*VDiffShowRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{233} + return file_vtctldata_proto_rawDescGZIP(), []int{239} } func (x *VDiffShowRequest) GetWorkflow() string { @@ -14657,7 +15184,7 @@ type VDiffShowResponse struct { func (x *VDiffShowResponse) Reset() { *x = VDiffShowResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[234] + mi := &file_vtctldata_proto_msgTypes[240] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14670,7 +15197,7 @@ func (x *VDiffShowResponse) String() string { func (*VDiffShowResponse) ProtoMessage() {} func (x *VDiffShowResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[234] + mi := &file_vtctldata_proto_msgTypes[240] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14683,7 +15210,7 @@ func (x *VDiffShowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffShowResponse.ProtoReflect.Descriptor instead. func (*VDiffShowResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{234} + return file_vtctldata_proto_rawDescGZIP(), []int{240} } func (x *VDiffShowResponse) GetTabletResponses() map[string]*tabletmanagerdata.VDiffResponse { @@ -14698,15 +15225,16 @@ type VDiffStopRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Workflow string `protobuf:"bytes,1,opt,name=workflow,proto3" json:"workflow,omitempty"` - TargetKeyspace string `protobuf:"bytes,2,opt,name=target_keyspace,json=targetKeyspace,proto3" json:"target_keyspace,omitempty"` - Uuid string `protobuf:"bytes,3,opt,name=uuid,proto3" json:"uuid,omitempty"` + Workflow string `protobuf:"bytes,1,opt,name=workflow,proto3" json:"workflow,omitempty"` + TargetKeyspace string `protobuf:"bytes,2,opt,name=target_keyspace,json=targetKeyspace,proto3" json:"target_keyspace,omitempty"` + Uuid string `protobuf:"bytes,3,opt,name=uuid,proto3" json:"uuid,omitempty"` + TargetShards []string `protobuf:"bytes,4,rep,name=target_shards,json=targetShards,proto3" json:"target_shards,omitempty"` } func (x *VDiffStopRequest) Reset() { *x = VDiffStopRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[235] + mi := &file_vtctldata_proto_msgTypes[241] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14719,7 +15247,7 @@ func (x *VDiffStopRequest) String() string { func (*VDiffStopRequest) ProtoMessage() {} func (x *VDiffStopRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[235] + mi := &file_vtctldata_proto_msgTypes[241] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14732,7 +15260,7 @@ func (x *VDiffStopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffStopRequest.ProtoReflect.Descriptor instead. func (*VDiffStopRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{235} + return file_vtctldata_proto_rawDescGZIP(), []int{241} } func (x *VDiffStopRequest) GetWorkflow() string { @@ -14756,6 +15284,13 @@ func (x *VDiffStopRequest) GetUuid() string { return "" } +func (x *VDiffStopRequest) GetTargetShards() []string { + if x != nil { + return x.TargetShards + } + return nil +} + type VDiffStopResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -14765,7 +15300,7 @@ type VDiffStopResponse struct { func (x *VDiffStopResponse) Reset() { *x = VDiffStopResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[236] + mi := &file_vtctldata_proto_msgTypes[242] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14778,7 +15313,7 @@ func (x *VDiffStopResponse) String() string { func (*VDiffStopResponse) ProtoMessage() {} func (x *VDiffStopResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[236] + mi := &file_vtctldata_proto_msgTypes[242] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14791,7 +15326,7 @@ func (x *VDiffStopResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VDiffStopResponse.ProtoReflect.Descriptor instead. func (*VDiffStopResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{236} + return file_vtctldata_proto_rawDescGZIP(), []int{242} } type WorkflowDeleteRequest struct { @@ -14804,12 +15339,16 @@ type WorkflowDeleteRequest struct { KeepData bool `protobuf:"varint,3,opt,name=keep_data,json=keepData,proto3" json:"keep_data,omitempty"` KeepRoutingRules bool `protobuf:"varint,4,opt,name=keep_routing_rules,json=keepRoutingRules,proto3" json:"keep_routing_rules,omitempty"` Shards []string `protobuf:"bytes,5,rep,name=shards,proto3" json:"shards,omitempty"` + // The max records to delete from the moved tables when cleaning + // up the migrated data. This is only used with multi-tenant + // MoveTables migrations. + DeleteBatchSize int64 `protobuf:"varint,6,opt,name=delete_batch_size,json=deleteBatchSize,proto3" json:"delete_batch_size,omitempty"` } func (x *WorkflowDeleteRequest) Reset() { *x = WorkflowDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[237] + mi := &file_vtctldata_proto_msgTypes[243] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14822,7 +15361,7 @@ func (x *WorkflowDeleteRequest) String() string { func (*WorkflowDeleteRequest) ProtoMessage() {} func (x *WorkflowDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[237] + mi := &file_vtctldata_proto_msgTypes[243] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14835,7 +15374,7 @@ func (x *WorkflowDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowDeleteRequest.ProtoReflect.Descriptor instead. func (*WorkflowDeleteRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{237} + return file_vtctldata_proto_rawDescGZIP(), []int{243} } func (x *WorkflowDeleteRequest) GetKeyspace() string { @@ -14873,6 +15412,13 @@ func (x *WorkflowDeleteRequest) GetShards() []string { return nil } +func (x *WorkflowDeleteRequest) GetDeleteBatchSize() int64 { + if x != nil { + return x.DeleteBatchSize + } + return 0 +} + type WorkflowDeleteResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -14885,7 +15431,7 @@ type WorkflowDeleteResponse struct { func (x *WorkflowDeleteResponse) Reset() { *x = WorkflowDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[238] + mi := &file_vtctldata_proto_msgTypes[244] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14898,7 +15444,7 @@ func (x *WorkflowDeleteResponse) String() string { func (*WorkflowDeleteResponse) ProtoMessage() {} func (x *WorkflowDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[238] + mi := &file_vtctldata_proto_msgTypes[244] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14911,7 +15457,7 @@ func (x *WorkflowDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowDeleteResponse.ProtoReflect.Descriptor instead. func (*WorkflowDeleteResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{238} + return file_vtctldata_proto_rawDescGZIP(), []int{244} } func (x *WorkflowDeleteResponse) GetSummary() string { @@ -14941,7 +15487,7 @@ type WorkflowStatusRequest struct { func (x *WorkflowStatusRequest) Reset() { *x = WorkflowStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[239] + mi := &file_vtctldata_proto_msgTypes[245] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14954,7 +15500,7 @@ func (x *WorkflowStatusRequest) String() string { func (*WorkflowStatusRequest) ProtoMessage() {} func (x *WorkflowStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[239] + mi := &file_vtctldata_proto_msgTypes[245] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14967,7 +15513,7 @@ func (x *WorkflowStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowStatusRequest.ProtoReflect.Descriptor instead. func (*WorkflowStatusRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{239} + return file_vtctldata_proto_rawDescGZIP(), []int{245} } func (x *WorkflowStatusRequest) GetKeyspace() string { @@ -15005,7 +15551,7 @@ type WorkflowStatusResponse struct { func (x *WorkflowStatusResponse) Reset() { *x = WorkflowStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[240] + mi := &file_vtctldata_proto_msgTypes[246] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15018,7 +15564,7 @@ func (x *WorkflowStatusResponse) String() string { func (*WorkflowStatusResponse) ProtoMessage() {} func (x *WorkflowStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[240] + mi := &file_vtctldata_proto_msgTypes[246] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15031,7 +15577,7 @@ func (x *WorkflowStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowStatusResponse.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{240} + return file_vtctldata_proto_rawDescGZIP(), []int{246} } func (x *WorkflowStatusResponse) GetTableCopyState() map[string]*WorkflowStatusResponse_TableCopyState { @@ -15071,12 +15617,13 @@ type WorkflowSwitchTrafficRequest struct { DryRun bool `protobuf:"varint,9,opt,name=dry_run,json=dryRun,proto3" json:"dry_run,omitempty"` InitializeTargetSequences bool `protobuf:"varint,10,opt,name=initialize_target_sequences,json=initializeTargetSequences,proto3" json:"initialize_target_sequences,omitempty"` Shards []string `protobuf:"bytes,11,rep,name=shards,proto3" json:"shards,omitempty"` + Force bool `protobuf:"varint,12,opt,name=force,proto3" json:"force,omitempty"` } func (x *WorkflowSwitchTrafficRequest) Reset() { *x = WorkflowSwitchTrafficRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[241] + mi := &file_vtctldata_proto_msgTypes[247] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15089,7 +15636,7 @@ func (x *WorkflowSwitchTrafficRequest) String() string { func (*WorkflowSwitchTrafficRequest) ProtoMessage() {} func (x *WorkflowSwitchTrafficRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[241] + mi := &file_vtctldata_proto_msgTypes[247] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15102,7 +15649,7 @@ func (x *WorkflowSwitchTrafficRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowSwitchTrafficRequest.ProtoReflect.Descriptor instead. func (*WorkflowSwitchTrafficRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{241} + return file_vtctldata_proto_rawDescGZIP(), []int{247} } func (x *WorkflowSwitchTrafficRequest) GetKeyspace() string { @@ -15182,6 +15729,13 @@ func (x *WorkflowSwitchTrafficRequest) GetShards() []string { return nil } +func (x *WorkflowSwitchTrafficRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + type WorkflowSwitchTrafficResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -15196,7 +15750,7 @@ type WorkflowSwitchTrafficResponse struct { func (x *WorkflowSwitchTrafficResponse) Reset() { *x = WorkflowSwitchTrafficResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[242] + mi := &file_vtctldata_proto_msgTypes[248] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15209,7 +15763,7 @@ func (x *WorkflowSwitchTrafficResponse) String() string { func (*WorkflowSwitchTrafficResponse) ProtoMessage() {} func (x *WorkflowSwitchTrafficResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[242] + mi := &file_vtctldata_proto_msgTypes[248] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15222,7 +15776,7 @@ func (x *WorkflowSwitchTrafficResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowSwitchTrafficResponse.ProtoReflect.Descriptor instead. func (*WorkflowSwitchTrafficResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{242} + return file_vtctldata_proto_rawDescGZIP(), []int{248} } func (x *WorkflowSwitchTrafficResponse) GetSummary() string { @@ -15267,7 +15821,7 @@ type WorkflowUpdateRequest struct { func (x *WorkflowUpdateRequest) Reset() { *x = WorkflowUpdateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[243] + mi := &file_vtctldata_proto_msgTypes[249] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15280,7 +15834,7 @@ func (x *WorkflowUpdateRequest) String() string { func (*WorkflowUpdateRequest) ProtoMessage() {} func (x *WorkflowUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[243] + mi := &file_vtctldata_proto_msgTypes[249] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15293,7 +15847,7 @@ func (x *WorkflowUpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowUpdateRequest.ProtoReflect.Descriptor instead. func (*WorkflowUpdateRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{243} + return file_vtctldata_proto_rawDescGZIP(), []int{249} } func (x *WorkflowUpdateRequest) GetKeyspace() string { @@ -15322,7 +15876,7 @@ type WorkflowUpdateResponse struct { func (x *WorkflowUpdateResponse) Reset() { *x = WorkflowUpdateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[244] + mi := &file_vtctldata_proto_msgTypes[250] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15335,7 +15889,7 @@ func (x *WorkflowUpdateResponse) String() string { func (*WorkflowUpdateResponse) ProtoMessage() {} func (x *WorkflowUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[244] + mi := &file_vtctldata_proto_msgTypes[250] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15348,7 +15902,7 @@ func (x *WorkflowUpdateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowUpdateResponse.ProtoReflect.Descriptor instead. func (*WorkflowUpdateResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{244} + return file_vtctldata_proto_rawDescGZIP(), []int{250} } func (x *WorkflowUpdateResponse) GetSummary() string { @@ -15374,7 +15928,7 @@ type GetMirrorRulesRequest struct { func (x *GetMirrorRulesRequest) Reset() { *x = GetMirrorRulesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[245] + mi := &file_vtctldata_proto_msgTypes[251] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15387,7 +15941,7 @@ func (x *GetMirrorRulesRequest) String() string { func (*GetMirrorRulesRequest) ProtoMessage() {} func (x *GetMirrorRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[245] + mi := &file_vtctldata_proto_msgTypes[251] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15400,7 +15954,7 @@ func (x *GetMirrorRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMirrorRulesRequest.ProtoReflect.Descriptor instead. func (*GetMirrorRulesRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{245} + return file_vtctldata_proto_rawDescGZIP(), []int{251} } type GetMirrorRulesResponse struct { @@ -15414,7 +15968,7 @@ type GetMirrorRulesResponse struct { func (x *GetMirrorRulesResponse) Reset() { *x = GetMirrorRulesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[246] + mi := &file_vtctldata_proto_msgTypes[252] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15427,7 +15981,7 @@ func (x *GetMirrorRulesResponse) String() string { func (*GetMirrorRulesResponse) ProtoMessage() {} func (x *GetMirrorRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[246] + mi := &file_vtctldata_proto_msgTypes[252] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15440,7 +15994,7 @@ func (x *GetMirrorRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMirrorRulesResponse.ProtoReflect.Descriptor instead. func (*GetMirrorRulesResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{246} + return file_vtctldata_proto_rawDescGZIP(), []int{252} } func (x *GetMirrorRulesResponse) GetMirrorRules() *vschema.MirrorRules { @@ -15464,7 +16018,7 @@ type WorkflowMirrorTrafficRequest struct { func (x *WorkflowMirrorTrafficRequest) Reset() { *x = WorkflowMirrorTrafficRequest{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[247] + mi := &file_vtctldata_proto_msgTypes[253] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15477,7 +16031,7 @@ func (x *WorkflowMirrorTrafficRequest) String() string { func (*WorkflowMirrorTrafficRequest) ProtoMessage() {} func (x *WorkflowMirrorTrafficRequest) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[247] + mi := &file_vtctldata_proto_msgTypes[253] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15490,7 +16044,7 @@ func (x *WorkflowMirrorTrafficRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowMirrorTrafficRequest.ProtoReflect.Descriptor instead. func (*WorkflowMirrorTrafficRequest) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{247} + return file_vtctldata_proto_rawDescGZIP(), []int{253} } func (x *WorkflowMirrorTrafficRequest) GetKeyspace() string { @@ -15534,7 +16088,7 @@ type WorkflowMirrorTrafficResponse struct { func (x *WorkflowMirrorTrafficResponse) Reset() { *x = WorkflowMirrorTrafficResponse{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[248] + mi := &file_vtctldata_proto_msgTypes[254] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15547,7 +16101,7 @@ func (x *WorkflowMirrorTrafficResponse) String() string { func (*WorkflowMirrorTrafficResponse) ProtoMessage() {} func (x *WorkflowMirrorTrafficResponse) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[248] + mi := &file_vtctldata_proto_msgTypes[254] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15560,7 +16114,7 @@ func (x *WorkflowMirrorTrafficResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowMirrorTrafficResponse.ProtoReflect.Descriptor instead. func (*WorkflowMirrorTrafficResponse) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{248} + return file_vtctldata_proto_rawDescGZIP(), []int{254} } func (x *WorkflowMirrorTrafficResponse) GetSummary() string { @@ -15596,7 +16150,7 @@ type Workflow_ReplicationLocation struct { func (x *Workflow_ReplicationLocation) Reset() { *x = Workflow_ReplicationLocation{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[250] + mi := &file_vtctldata_proto_msgTypes[257] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15609,7 +16163,7 @@ func (x *Workflow_ReplicationLocation) String() string { func (*Workflow_ReplicationLocation) ProtoMessage() {} func (x *Workflow_ReplicationLocation) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[250] + mi := &file_vtctldata_proto_msgTypes[257] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15652,7 +16206,7 @@ type Workflow_ShardStream struct { func (x *Workflow_ShardStream) Reset() { *x = Workflow_ShardStream{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[251] + mi := &file_vtctldata_proto_msgTypes[258] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15665,7 +16219,7 @@ func (x *Workflow_ShardStream) String() string { func (*Workflow_ShardStream) ProtoMessage() {} func (x *Workflow_ShardStream) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[251] + mi := &file_vtctldata_proto_msgTypes[258] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15740,7 +16294,7 @@ type Workflow_Stream struct { func (x *Workflow_Stream) Reset() { *x = Workflow_Stream{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[252] + mi := &file_vtctldata_proto_msgTypes[259] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15753,7 +16307,7 @@ func (x *Workflow_Stream) String() string { func (*Workflow_Stream) ProtoMessage() {} func (x *Workflow_Stream) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[252] + mi := &file_vtctldata_proto_msgTypes[259] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15922,7 +16476,7 @@ type Workflow_Stream_CopyState struct { func (x *Workflow_Stream_CopyState) Reset() { *x = Workflow_Stream_CopyState{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[253] + mi := &file_vtctldata_proto_msgTypes[260] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15935,7 +16489,7 @@ func (x *Workflow_Stream_CopyState) String() string { func (*Workflow_Stream_CopyState) ProtoMessage() {} func (x *Workflow_Stream_CopyState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[253] + mi := &file_vtctldata_proto_msgTypes[260] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15990,7 +16544,7 @@ type Workflow_Stream_Log struct { func (x *Workflow_Stream_Log) Reset() { *x = Workflow_Stream_Log{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[254] + mi := &file_vtctldata_proto_msgTypes[261] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16003,7 +16557,7 @@ func (x *Workflow_Stream_Log) String() string { func (*Workflow_Stream_Log) ProtoMessage() {} func (x *Workflow_Stream_Log) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[254] + mi := &file_vtctldata_proto_msgTypes[261] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16087,7 +16641,7 @@ type Workflow_Stream_ThrottlerStatus struct { func (x *Workflow_Stream_ThrottlerStatus) Reset() { *x = Workflow_Stream_ThrottlerStatus{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[255] + mi := &file_vtctldata_proto_msgTypes[262] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16100,7 +16654,7 @@ func (x *Workflow_Stream_ThrottlerStatus) String() string { func (*Workflow_Stream_ThrottlerStatus) ProtoMessage() {} func (x *Workflow_Stream_ThrottlerStatus) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[255] + mi := &file_vtctldata_proto_msgTypes[262] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16141,7 +16695,7 @@ type ApplyVSchemaResponse_ParamList struct { func (x *ApplyVSchemaResponse_ParamList) Reset() { *x = ApplyVSchemaResponse_ParamList{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[258] + mi := &file_vtctldata_proto_msgTypes[265] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16154,7 +16708,7 @@ func (x *ApplyVSchemaResponse_ParamList) String() string { func (*ApplyVSchemaResponse_ParamList) ProtoMessage() {} func (x *ApplyVSchemaResponse_ParamList) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[258] + mi := &file_vtctldata_proto_msgTypes[265] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16188,7 +16742,7 @@ type GetSrvKeyspaceNamesResponse_NameList struct { func (x *GetSrvKeyspaceNamesResponse_NameList) Reset() { *x = GetSrvKeyspaceNamesResponse_NameList{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[267] + mi := &file_vtctldata_proto_msgTypes[277] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16201,7 +16755,7 @@ func (x *GetSrvKeyspaceNamesResponse_NameList) String() string { func (*GetSrvKeyspaceNamesResponse_NameList) ProtoMessage() {} func (x *GetSrvKeyspaceNamesResponse_NameList) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[267] + mi := &file_vtctldata_proto_msgTypes[277] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16214,7 +16768,7 @@ func (x *GetSrvKeyspaceNamesResponse_NameList) ProtoReflect() protoreflect.Messa // Deprecated: Use GetSrvKeyspaceNamesResponse_NameList.ProtoReflect.Descriptor instead. func (*GetSrvKeyspaceNamesResponse_NameList) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{97, 1} + return file_vtctldata_proto_rawDescGZIP(), []int{99, 1} } func (x *GetSrvKeyspaceNamesResponse_NameList) GetNames() []string { @@ -16237,7 +16791,7 @@ type MoveTablesCreateResponse_TabletInfo struct { func (x *MoveTablesCreateResponse_TabletInfo) Reset() { *x = MoveTablesCreateResponse_TabletInfo{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[271] + mi := &file_vtctldata_proto_msgTypes[281] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16250,7 +16804,7 @@ func (x *MoveTablesCreateResponse_TabletInfo) String() string { func (*MoveTablesCreateResponse_TabletInfo) ProtoMessage() {} func (x *MoveTablesCreateResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[271] + mi := &file_vtctldata_proto_msgTypes[281] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16263,7 +16817,7 @@ func (x *MoveTablesCreateResponse_TabletInfo) ProtoReflect() protoreflect.Messag // Deprecated: Use MoveTablesCreateResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*MoveTablesCreateResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{143, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{149, 0} } func (x *MoveTablesCreateResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -16293,7 +16847,7 @@ type WorkflowDeleteResponse_TabletInfo struct { func (x *WorkflowDeleteResponse_TabletInfo) Reset() { *x = WorkflowDeleteResponse_TabletInfo{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[281] + mi := &file_vtctldata_proto_msgTypes[291] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16306,7 +16860,7 @@ func (x *WorkflowDeleteResponse_TabletInfo) String() string { func (*WorkflowDeleteResponse_TabletInfo) ProtoMessage() {} func (x *WorkflowDeleteResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[281] + mi := &file_vtctldata_proto_msgTypes[291] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16319,7 +16873,7 @@ func (x *WorkflowDeleteResponse_TabletInfo) ProtoReflect() protoreflect.Message // Deprecated: Use WorkflowDeleteResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*WorkflowDeleteResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{238, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{244, 0} } func (x *WorkflowDeleteResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -16352,7 +16906,7 @@ type WorkflowStatusResponse_TableCopyState struct { func (x *WorkflowStatusResponse_TableCopyState) Reset() { *x = WorkflowStatusResponse_TableCopyState{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[282] + mi := &file_vtctldata_proto_msgTypes[292] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16365,7 +16919,7 @@ func (x *WorkflowStatusResponse_TableCopyState) String() string { func (*WorkflowStatusResponse_TableCopyState) ProtoMessage() {} func (x *WorkflowStatusResponse_TableCopyState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[282] + mi := &file_vtctldata_proto_msgTypes[292] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16378,7 +16932,7 @@ func (x *WorkflowStatusResponse_TableCopyState) ProtoReflect() protoreflect.Mess // Deprecated: Use WorkflowStatusResponse_TableCopyState.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_TableCopyState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{240, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{246, 0} } func (x *WorkflowStatusResponse_TableCopyState) GetRowsCopied() int64 { @@ -16439,7 +16993,7 @@ type WorkflowStatusResponse_ShardStreamState struct { func (x *WorkflowStatusResponse_ShardStreamState) Reset() { *x = WorkflowStatusResponse_ShardStreamState{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[283] + mi := &file_vtctldata_proto_msgTypes[293] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16452,7 +17006,7 @@ func (x *WorkflowStatusResponse_ShardStreamState) String() string { func (*WorkflowStatusResponse_ShardStreamState) ProtoMessage() {} func (x *WorkflowStatusResponse_ShardStreamState) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[283] + mi := &file_vtctldata_proto_msgTypes[293] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16465,7 +17019,7 @@ func (x *WorkflowStatusResponse_ShardStreamState) ProtoReflect() protoreflect.Me // Deprecated: Use WorkflowStatusResponse_ShardStreamState.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_ShardStreamState) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{240, 1} + return file_vtctldata_proto_rawDescGZIP(), []int{246, 1} } func (x *WorkflowStatusResponse_ShardStreamState) GetId() int32 { @@ -16521,7 +17075,7 @@ type WorkflowStatusResponse_ShardStreams struct { func (x *WorkflowStatusResponse_ShardStreams) Reset() { *x = WorkflowStatusResponse_ShardStreams{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[284] + mi := &file_vtctldata_proto_msgTypes[294] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16534,7 +17088,7 @@ func (x *WorkflowStatusResponse_ShardStreams) String() string { func (*WorkflowStatusResponse_ShardStreams) ProtoMessage() {} func (x *WorkflowStatusResponse_ShardStreams) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[284] + mi := &file_vtctldata_proto_msgTypes[294] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16547,7 +17101,7 @@ func (x *WorkflowStatusResponse_ShardStreams) ProtoReflect() protoreflect.Messag // Deprecated: Use WorkflowStatusResponse_ShardStreams.ProtoReflect.Descriptor instead. func (*WorkflowStatusResponse_ShardStreams) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{240, 2} + return file_vtctldata_proto_rawDescGZIP(), []int{246, 2} } func (x *WorkflowStatusResponse_ShardStreams) GetStreams() []*WorkflowStatusResponse_ShardStreamState { @@ -16571,7 +17125,7 @@ type WorkflowUpdateResponse_TabletInfo struct { func (x *WorkflowUpdateResponse_TabletInfo) Reset() { *x = WorkflowUpdateResponse_TabletInfo{} if protoimpl.UnsafeEnabled { - mi := &file_vtctldata_proto_msgTypes[287] + mi := &file_vtctldata_proto_msgTypes[297] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16584,7 +17138,7 @@ func (x *WorkflowUpdateResponse_TabletInfo) String() string { func (*WorkflowUpdateResponse_TabletInfo) ProtoMessage() {} func (x *WorkflowUpdateResponse_TabletInfo) ProtoReflect() protoreflect.Message { - mi := &file_vtctldata_proto_msgTypes[287] + mi := &file_vtctldata_proto_msgTypes[297] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16597,7 +17151,7 @@ func (x *WorkflowUpdateResponse_TabletInfo) ProtoReflect() protoreflect.Message // Deprecated: Use WorkflowUpdateResponse_TabletInfo.ProtoReflect.Descriptor instead. func (*WorkflowUpdateResponse_TabletInfo) Descriptor() ([]byte, []int) { - return file_vtctldata_proto_rawDescGZIP(), []int{244, 0} + return file_vtctldata_proto_rawDescGZIP(), []int{250, 0} } func (x *WorkflowUpdateResponse_TabletInfo) GetTablet() *topodata.TabletAlias { @@ -16647,7 +17201,7 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x64, 0x6c, 0x22, 0xca, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x64, 0x6c, 0x22, 0xf5, 0x06, 0x0a, 0x13, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, @@ -16700,585 +17254,620 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4e, 0x0a, 0x08, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xc0, 0x13, 0x0a, 0x0f, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x27, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, + 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xc0, 0x13, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2f, + 0x0a, 0x13, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x3f, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, + 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x08, 0x61, 0x64, + 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x07, 0x61, 0x64, 0x64, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x2f, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x27, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x61, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x52, 0x07, 0x72, 0x65, 0x61, 0x64, 0x79, 0x41, 0x74, 0x12, 0x2b, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x07, 0x61, 0x64, 0x64, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2f, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x27, 0x0a, 0x08, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x07, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x41, 0x74, 0x12, 0x2b, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x3b, 0x0a, 0x12, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x11, 0x6c, 0x69, 0x76, 0x65, 0x6e, - 0x65, 0x73, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x0c, - 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, - 0x0d, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x5f, 0x61, 0x74, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x52, 0x0b, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x65, 0x64, 0x55, 0x70, 0x41, 0x74, 0x12, - 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, - 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, - 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x0a, - 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, - 0x75, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x2b, 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x64, 0x64, 0x6c, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x64, 0x64, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x65, 0x74, 0x61, 0x53, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, - 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x72, 0x6f, 0x77, - 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, - 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x75, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x1f, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x3f, 0x0a, - 0x12, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x61, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, - 0x0a, 0x13, 0x70, 0x6f, 0x73, 0x74, 0x70, 0x6f, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x6f, 0x73, - 0x74, 0x70, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x37, 0x0a, 0x18, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x69, 0x71, 0x75, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x15, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1f, 0x64, 0x72, 0x6f, 0x70, - 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1b, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x32, - 0x0a, 0x15, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, - 0x78, 0x70, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x6c, 0x65, - 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x29, 0x0a, - 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x76, 0x65, - 0x72, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x27, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x17, 0x0a, - 0x07, 0x69, 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x69, 0x73, 0x56, 0x69, 0x65, 0x77, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, - 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x76, - 0x65, 0x6e, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, - 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x76, - 0x65, 0x6e, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2e, - 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x5f, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x75, 0x73, 0x65, - 0x72, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x2c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x50, 0x6c, 0x61, - 0x6e, 0x12, 0x38, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, - 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x64, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x0c, - 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x0b, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x27, 0x0a, - 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x70, 0x6f, 0x6e, 0x65, 0x5f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x74, 0x70, 0x6f, 0x6e, 0x65, - 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, - 0x31, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, - 0x63, 0x75, 0x74, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, - 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x63, 0x75, 0x74, 0x6f, 0x76, 0x65, 0x72, 0x41, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x73, 0x5f, 0x69, 0x6d, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x73, 0x49, 0x6d, 0x6d, 0x65, 0x64, - 0x69, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, - 0x0b, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x34, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x0a, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x14, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x5f, 0x61, 0x74, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, - 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x53, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x12, 0x0a, 0x0a, 0x06, 0x56, 0x49, 0x54, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x48, - 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x54, 0x4f, 0x53, 0x43, 0x10, 0x02, - 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, - 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x10, 0x04, 0x1a, 0x02, 0x10, 0x01, 0x22, 0x71, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, - 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, - 0x12, 0x0a, 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, - 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, - 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x07, 0x22, 0x5e, - 0x0a, 0x05, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x87, - 0x01, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x3f, 0x0a, 0x1c, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, - 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x73, 0x74, 0x72, 0x69, 0x70, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x65, 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xcf, 0x11, 0x0a, 0x08, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x31, 0x0a, 0x15, 0x6d, - 0x61, 0x78, 0x5f, 0x76, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x56, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x4a, - 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x2a, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x75, 0x62, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x48, 0x0a, 0x21, 0x6d, - 0x61, 0x78, 0x5f, 0x76, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x6d, 0x61, 0x78, 0x56, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x60, 0x0a, - 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x12, 0x6c, 0x69, + 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x52, 0x11, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x0d, 0x63, 0x6c, 0x65, 0x61, + 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x65, 0x64, 0x55, 0x70, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x64, 0x6c, 0x5f, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x64, 0x6c, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, + 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x65, 0x74, 0x61, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, + 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x70, 0x69, + 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x77, 0x73, + 0x18, 0x1c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, + 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x61, 0x64, + 0x64, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x2e, 0x0a, + 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x19, 0x0a, + 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x12, 0x61, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x20, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x6f, 0x73, + 0x74, 0x70, 0x6f, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x6f, 0x73, 0x74, 0x70, 0x6f, 0x6e, 0x65, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x18, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4b, 0x65, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6e, + 0x6f, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x64, 0x72, + 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, + 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x29, 0x0a, + 0x10, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x65, + 0x73, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x26, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x5f, + 0x75, 0x75, 0x69, 0x64, 0x18, 0x27, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x74, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x76, + 0x69, 0x65, 0x77, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x56, 0x69, 0x65, + 0x77, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x3a, 0x0a, + 0x19, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, + 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x17, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x18, 0x2b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x54, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x38, 0x0a, 0x11, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x2e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x0c, 0x63, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x63, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, + 0x70, 0x6f, 0x6e, 0x65, 0x5f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x18, 0x30, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x74, 0x70, 0x6f, 0x6e, 0x65, 0x4c, 0x61, 0x75, 0x6e, 0x63, + 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x31, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x74, 0x6f, 0x76, + 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0f, 0x63, 0x75, 0x74, 0x6f, 0x76, 0x65, 0x72, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x73, 0x5f, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x33, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x14, 0x69, 0x73, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x0b, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x14, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, + 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x64, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x22, 0x53, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x0a, 0x0a, + 0x06, 0x56, 0x49, 0x54, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x4e, 0x4c, + 0x49, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x01, + 0x12, 0x09, 0x0a, 0x05, 0x50, 0x54, 0x4f, 0x53, 0x43, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x59, 0x53, 0x51, 0x4c, + 0x10, 0x04, 0x1a, 0x02, 0x10, 0x01, 0x22, 0x71, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x51, + 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, + 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, + 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x06, 0x12, 0x0a, 0x0a, + 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x07, 0x22, 0x5e, 0x0a, 0x05, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xda, 0x02, 0x0a, 0x0f, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x6e, 0x0a, 0x1f, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x1c, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcf, 0x11, 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, + 0x5f, 0x76, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, + 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x56, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x4a, 0x0a, 0x0d, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x49, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x1a, 0xb9, 0x01, 0x0a, 0x0b, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, - 0x12, 0x46, 0x0a, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x1a, 0xc1, 0x0a, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, 0x69, 0x6e, 0x6c, 0x6f, - 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x07, - 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, - 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x74, 0x69, - 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, - 0x63, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x6f, - 0x67, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x26, - 0x0a, 0x0f, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x6f, 0x67, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, - 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x55, 0x0a, 0x10, 0x74, - 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x0f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x1a, - 0x57, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x1a, 0xe6, 0x01, 0x0a, 0x03, 0x4c, 0x6f, 0x67, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x2b, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x1a, 0x77, 0x0a, 0x0f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x74, 0x69, 0x6d, - 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x22, 0x59, 0x0a, 0x12, 0x41, 0x64, - 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x15, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x0a, 0x14, - 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x17, - 0x0a, 0x15, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbf, 0x01, 0x0a, 0x20, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x16, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, - 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x78, 0x0a, 0x21, 0x41, 0x70, 0x70, - 0x6c, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, - 0x0a, 0x16, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, + 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x75, 0x62, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x48, 0x0a, 0x21, 0x6d, 0x61, 0x78, + 0x5f, 0x76, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x6d, 0x61, 0x78, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x61, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, + 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x60, 0x0a, 0x11, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, + 0x13, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x1a, 0xb9, 0x01, 0x0a, 0x0b, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x46, + 0x0a, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x1a, 0xc1, 0x0a, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, + 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x6f, 0x67, 0x46, 0x65, 0x74, 0x63, 0x68, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, + 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, + 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x55, 0x0a, 0x10, 0x74, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x0f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x18, 0x12, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, + 0x18, 0x14, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x1a, 0x57, 0x0a, + 0x09, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x1a, 0xe6, 0x01, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, + 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x2b, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, + 0x77, 0x0a, 0x0f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, + 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x22, 0x59, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x43, + 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x22, 0x15, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x0a, 0x14, 0x41, 0x64, + 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x17, 0x0a, 0x15, + 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbf, 0x01, 0x0a, 0x20, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, - 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x1d, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x16, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x41, 0x70, 0x70, 0x6c, 0x79, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xce, 0x02, 0x0a, 0x12, 0x41, 0x70, - 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x64, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x64, 0x6c, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2b, - 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x44, 0x0a, 0x15, 0x77, - 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, - 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x4a, 0x04, - 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0xe8, 0x01, 0x0a, 0x13, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x6c, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, - 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdb, 0x01, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x17, 0x0a, 0x07, - 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, - 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x76, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x72, 0x69, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x22, 0xca, 0x02, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, - 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x6c, 0x0a, 0x15, 0x75, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x13, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x56, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x71, 0x0a, 0x18, 0x55, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x23, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x22, 0xe5, 0x01, 0x0a, 0x0d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x23, 0x0a, 0x0d, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x72, - 0x6f, 0x6d, 0x50, 0x6f, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, - 0x5f, 0x73, 0x61, 0x66, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x53, 0x61, 0x66, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0e, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xe2, 0x01, - 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x21, 0x0a, - 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, 0x61, 0x66, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x61, 0x66, 0x65, - 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, - 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x72, 0x6f, 0x6d, 0x50, - 0x6f, 0x73, 0x22, 0x4e, 0x0a, 0x1c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, 0x1d, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, + 0x6c, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x78, 0x0a, 0x21, 0x41, 0x70, 0x70, 0x6c, 0x79, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x16, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, + 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x65, 0x6c, + 0x6c, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xb3, 0x01, 0x0a, 0x1d, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xce, 0x02, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, + 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x21, 0x0a, 0x0c, + 0x64, 0x64, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x64, 0x6c, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, + 0x1b, 0x0a, 0x09, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, + 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, + 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x49, 0x44, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x4a, 0x04, 0x08, 0x02, + 0x10, 0x03, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0xe8, 0x01, 0x0a, 0x13, 0x41, 0x70, 0x70, + 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x6c, 0x0a, + 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, + 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, + 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, - 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xdb, 0x01, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, + 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, + 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, + 0x52, 0x75, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, + 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x22, 0xca, 0x02, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x6c, 0x0a, 0x15, 0x75, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x13, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x71, 0x0a, 0x18, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x23, 0x0a, 0x09, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xa1, + 0x02, 0x0a, 0x0d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x62, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x06, 0x64, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, - 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, - 0x75, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x35, 0x0a, 0x0d, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0c, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x0b, - 0x61, 0x66, 0x74, 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x77, - 0x61, 0x73, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x77, 0x61, 0x73, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0xe3, 0x01, 0x0a, 0x15, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x72, 0x6f, 0x6d, + 0x50, 0x6f, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, + 0x61, 0x66, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x53, 0x61, 0x66, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x88, 0x01, 0x01, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, - 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x6b, 0x49, 0x66, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x22, 0x93, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x3f, 0x0a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, - 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x4f, 0x0a, 0x1d, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xe1, 0x01, 0x0a, 0x1e, 0x43, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x16, 0x72, - 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x5f, 0x73, 0x61, 0x66, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x61, 0x66, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, + 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x73, 0x22, 0x4e, 0x0a, 0x1c, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, + 0x1d, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, + 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, + 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe8, + 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, + 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x40, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc0, 0x02, 0x0a, 0x18, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0b, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x0a, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x66, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x1a, + 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3c, + 0x0a, 0x0e, 0x41, 0x66, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x1e, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xe3, - 0x01, 0x0a, 0x1f, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x78, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, + 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x64, 0x62, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x18, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0d, 0x62, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x52, 0x0c, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x33, + 0x0a, 0x0c, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x0b, 0x61, 0x66, 0x74, 0x65, 0x72, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x77, 0x61, 0x73, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, + 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x77, 0x61, 0x73, 0x44, 0x72, 0x79, + 0x52, 0x75, 0x6e, 0x22, 0xe3, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, + 0x12, 0x27, 0x0a, 0x10, 0x6f, 0x6b, 0x5f, 0x69, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x6b, 0x49, 0x66, + 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x16, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x3f, + 0x0a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, + 0x4f, 0x0a, 0x1d, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, + 0x22, 0xe1, 0x01, 0x0a, 0x1e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, @@ -17287,732 +17876,896 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdd, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, - 0x73, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, - 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x69, - 0x64, 0x65, 0x63, 0x61, 0x72, 0x5f, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x44, 0x62, 0x4e, 0x61, - 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, - 0x08, 0x06, 0x10, 0x07, 0x22, 0x49, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, - 0x8c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0xa0, - 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xe3, 0x01, 0x0a, 0x1f, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x16, 0x72, 0x6f, + 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdd, 0x02, 0x0a, + 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, + 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x16, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x5f, 0x64, 0x62, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x69, 0x64, + 0x65, 0x63, 0x61, 0x72, 0x44, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, + 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x49, 0x0a, 0x16, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x22, 0x41, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, - 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, - 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, - 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, 0x15, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, - 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0f, - 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x49, 0x66, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, - 0x6c, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x79, 0x0a, - 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0xa0, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x5f, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x67, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, + 0x73, 0x69, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x06, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, + 0x73, 0x69, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, 0x66, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, + 0x76, 0x65, 0x6e, 0x49, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x79, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, + 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc3, 0x03, 0x0a, 0x1d, 0x45, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, + 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x0f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0e, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 0x70, + 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, + 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x19, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, + 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, + 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x77, 0x61, 0x69, 0x74, + 0x46, 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, + 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, + 0xbc, 0x01, 0x0a, 0x1e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, + 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa0, + 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, + 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, + 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, + 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, + 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x18, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x81, 0x03, 0x0a, 0x1d, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, - 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3e, 0x0a, - 0x0f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0e, 0x69, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x44, 0x0a, - 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, - 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, - 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, 0x72, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, - 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x11, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x1e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, - 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, - 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, - 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, - 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x19, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0xd3, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, - 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0xa5, 0x01, 0x0a, 0x12, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x12, 0x55, 0x0a, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, + 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x5e, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x68, 0x6f, 0x6f, 0x6b, + 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5e, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, - 0x0a, 0x0b, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, - 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x68, 0x6f, 0x6f, - 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x1d, 0x45, 0x78, 0x65, 0x63, + 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x1d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x73, 0x71, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, + 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, + 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x4e, 0x0a, 0x1e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, - 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, - 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, - 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x4e, - 0x0a, 0x1e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2c, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, - 0x0a, 0x1e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xbe, 0x01, 0x0a, - 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, - 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x1a, 0x4b, 0x0a, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x54, 0x0a, - 0x22, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x75, 0x69, 0x64, 0x22, 0xeb, 0x01, 0x0a, 0x23, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, - 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x16, 0x72, - 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, - 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, - 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, - 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x22, 0x44, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, - 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, - 0x6c, 0x6c, 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, - 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, - 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x65, - 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, - 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, - 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x1a, 0x50, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x4c, 0x0a, 0x15, - 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x30, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x46, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, 0x1e, 0x46, 0x69, 0x6e, 0x64, + 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x41, + 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x1a, 0x4b, 0x0a, 0x0b, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x54, 0x0a, 0x22, 0x46, 0x6f, 0x72, 0x63, 0x65, + 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xeb, 0x01, + 0x0a, 0x23, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, + 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x44, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x46, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x30, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x65, 0x73, 0x1a, 0x50, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, + 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x4c, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x30, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x22, 0x5a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, + 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x76, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x16, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, + 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xb0, 0x02, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x5a, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x76, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x16, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, - 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x22, 0xb0, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, - 0x65, 0x77, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x28, 0x0a, - 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, - 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, - 0x6e, 0x6c, 0x79, 0x22, 0x50, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xb8, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x28, 0x0a, + 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x4f, 0x6e, 0x6c, + 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x50, 0x0a, + 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0xb8, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x2b, + 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x18, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x22, 0x59, 0x0a, 0x1b, 0x47, 0x65, + 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x6d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x1b, + 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x19, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x16, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x1a, 0x65, 0x0a, 0x1b, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, + 0x43, 0x65, 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x4c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x75, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x06, - 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, - 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x6b, 0x69, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, - 0x22, 0x59, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3a, 0x0a, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x64, 0x0a, 0x1a, 0x47, - 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x1c, 0x47, 0x65, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x32, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x20, + 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xcc, 0x01, 0x0a, + 0x17, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x11, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe4, 0x03, 0x0a, 0x1c, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, + 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x53, 0x65, 0x6c, 0x66, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, + 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x22, 0x1f, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, + 0x4e, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x73, 0x72, 0x76, 0x5f, + 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x2d, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xc5, + 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x73, 0x72, 0x76, + 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x1a, 0x53, 0x0a, 0x10, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x22, 0xe8, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x22, 0x83, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x7d, 0x0a, 0x19, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, - 0x65, 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, - 0x1a, 0x65, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x6a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x32, 0x0a, 0x1a, - 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x22, 0xf3, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x47, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x20, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x40, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, + 0x22, 0x55, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x63, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x5f, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x46, 0x0a, + 0x17, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x52, + 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x55, + 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x62, 0x61, 0x6e, + 0x64, 0x6f, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, + 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x22, 0x63, 0x0a, 0x21, 0x47, 0x65, 0x74, + 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x63, + 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, + 0x12, 0x31, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xc6, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, + 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, + 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x17, 0x49, + 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x52, 0x0a, 0x1a, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x17, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6c, 0x65, 0x63, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x42, 0x0a, 0x18, 0x49, 0x6e, 0x69, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x4e, 0x0a, 0x1c, + 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, + 0x1d, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, + 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, + 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, + 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, + 0x02, 0x0a, 0x19, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x76, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x76, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x42, 0x0a, 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, + 0x57, 0x69, 0x74, 0x68, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, + 0x0a, 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, - 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x72, 0x76, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x11, 0x53, 0x72, 0x76, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xe4, 0x03, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x65, - 0x6c, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, - 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, - 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x74, - 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, - 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x12, 0x1f, 0x0a, 0x0b, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x61, 0x70, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, - 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x1f, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x4e, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, - 0x0a, 0x0c, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, - 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x73, 0x72, 0x76, 0x56, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2d, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x56, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x1a, 0x53, 0x0a, 0x10, 0x53, 0x72, 0x76, 0x56, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x28, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0xe8, 0x01, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x12, - 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x22, 0x40, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x55, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x63, 0x0a, - 0x1a, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x22, 0x5f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, - 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x73, 0x4a, - 0x73, 0x6f, 0x6e, 0x22, 0x46, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, - 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x80, 0x01, 0x0a, 0x0c, - 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x72, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2f, - 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, - 0x4d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x4c, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1b, 0x0a, + 0x19, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x05, 0x0a, 0x14, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, + 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, + 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, + 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, + 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, + 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, + 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, + 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, + 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, + 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, + 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, + 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, + 0x52, 0x75, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, + 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x22, 0x85, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, + 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, + 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, + 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, + 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x19, 0x0a, 0x17, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, + 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, + 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x82, 0x07, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, + 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, + 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, + 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, + 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, + 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, + 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, + 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, + 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, + 0x70, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, + 0x43, 0x6f, 0x70, 0x79, 0x12, 0x45, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x18, + 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x48, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x2e, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x22, 0xc6, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, - 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, - 0x6f, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x69, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x52, 0x0a, 0x1a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x17, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x44, - 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x22, 0x42, 0x0a, 0x18, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x4e, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, - 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, 0x1d, 0x4c, 0x61, 0x75, - 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x16, 0x72, 0x6f, - 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, - 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, 0x02, 0x0a, 0x19, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x42, 0x0a, 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x61, 0x66, - 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x69, - 0x6e, 0x75, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x57, 0x69, 0x74, 0x68, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, - 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x1c, 0x0a, 0x1a, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, 0x0a, 0x1e, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0x4c, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x22, 0x56, 0x0a, 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x4d, 0x61, 0x74, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x05, 0x0a, 0x14, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, - 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, - 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, - 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, - 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, - 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, - 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, - 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, - 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, - 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x22, 0x81, 0x02, 0x0a, 0x19, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, @@ -18025,339 +18778,235 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, - 0x5b, 0x0a, 0x17, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, - 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x85, 0x01, 0x0a, - 0x14, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x0a, - 0x16, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, - 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x82, - 0x01, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x22, 0x82, 0x07, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, - 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, - 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, - 0x64, 0x64, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, - 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, - 0x6f, 0x70, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, - 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, - 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, - 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, - 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x70, 0x79, - 0x12, 0x45, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x76, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x48, - 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, - 0x81, 0x02, 0x0a, 0x19, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, - 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x22, 0x5e, 0x0a, 0x1a, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, - 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd7, 0x02, 0x0a, 0x1b, 0x50, 0x6c, 0x61, - 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0x5e, 0x0a, 0x1a, 0x4d, 0x6f, 0x76, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd6, 0x03, 0x0a, + 0x1b, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, + 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x0d, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x5f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4c, 0x0a, 0x19, 0x74, 0x6f, 0x6c, 0x65, + 0x72, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x74, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x3b, 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, + 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, + 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, + 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x74, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1d, 0x0a, 0x1b, + 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, + 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x1a, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, + 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, + 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x46, 0x0a, 0x1c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x01, + 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, + 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, + 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, + 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, - 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x0d, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0c, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x44, - 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4c, 0x0a, 0x19, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, - 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x74, 0x6f, 0x6c, 0x65, 0x72, - 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x61, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, + 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7f, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, - 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, - 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, - 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x74, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x61, 0x6c, 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, - 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x64, 0x0a, 0x1a, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, - 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x4f, 0x0a, - 0x13, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, - 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x22, 0x46, 0x0a, 0x1c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x52, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, - 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, - 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, 0x52, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5b, - 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x7f, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, + 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, + 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, - 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, - 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, - 0x73, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, - 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, - 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, 0x15, 0x52, - 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x22, 0x8f, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, - 0x70, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, - 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, - 0x79, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, - 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x22, 0x82, 0x02, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, - 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, 0x12, 0x17, - 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, + 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, + 0x0a, 0x15, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x22, 0xd6, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, + 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x43, 0x6f, 0x70, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, + 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x45, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb8, 0x02, 0x0a, + 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, + 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, + 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, + 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, @@ -18756,7 +19405,7 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x88, 0x07, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, + 0x02, 0x38, 0x01, 0x22, 0xf9, 0x07, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, @@ -18812,250 +19461,270 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x12, 0x3c, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, - 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, - 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x22, 0x6b, 0x0a, 0x12, 0x56, 0x44, 0x69, - 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, - 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, - 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x15, 0x0a, 0x13, - 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0xd7, - 0x01, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, - 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, + 0x61, 0x78, 0x44, 0x69, 0x66, 0x66, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, + 0x0a, 0x1b, 0x72, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x17, 0x72, 0x6f, 0x77, 0x44, 0x69, 0x66, 0x66, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0a, + 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, + 0x29, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x22, 0x6b, 0x0a, 0x12, 0x56, 0x44, + 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x92, + 0x01, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, + 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, 0x44, + 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, + 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, - 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, - 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x15, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, 0x0a, 0x09, - 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, - 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, - 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xe6, 0x07, 0x0a, - 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, - 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xe8, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, - 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, - 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x6f, - 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, 0x6f, 0x77, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, - 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, - 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x1a, - 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xef, 0x03, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, 0x0a, - 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x3c, - 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, - 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, - 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, - 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, - 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x6d, - 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x69, 0x72, 0x72, - 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x90, 0x01, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, + 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, + 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x15, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x22, 0xe6, 0x07, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x5f, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x1a, 0xe8, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, + 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, 0x6f, + 0x77, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x12, 0x29, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, 0x10, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, 0x0a, + 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x85, + 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x22, 0x7f, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, - 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, - 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x56, 0x45, 0x54, 0x41, - 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, - 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x10, 0x02, 0x2a, 0x38, 0x0a, - 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x08, - 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x53, 0x43, 0x45, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x43, 0x45, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, 0x76, 0x69, 0x74, 0x65, 0x73, - 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, - 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x6d, + 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, + 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x22, 0x90, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, + 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x69, + 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x69, + 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x69, 0x72, 0x72, 0x6f, + 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, + 0x7f, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, + 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, + 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x56, 0x45, 0x54, 0x41, 0x42, + 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x4c, + 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x10, 0x02, 0x2a, 0x38, 0x0a, 0x0d, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x53, 0x43, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x43, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x42, 0x0a, 0x1c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, + 0x64, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, + 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x45, 0x41, 0x56, 0x45, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, 0x76, 0x69, + 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, + 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -19070,574 +19739,598 @@ func file_vtctldata_proto_rawDescGZIP() []byte { return file_vtctldata_proto_rawDescData } -var file_vtctldata_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_vtctldata_proto_msgTypes = make([]protoimpl.MessageInfo, 288) +var file_vtctldata_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_vtctldata_proto_msgTypes = make([]protoimpl.MessageInfo, 298) var file_vtctldata_proto_goTypes = []any{ (MaterializationIntent)(0), // 0: vtctldata.MaterializationIntent (QueryOrdering)(0), // 1: vtctldata.QueryOrdering - (SchemaMigration_Strategy)(0), // 2: vtctldata.SchemaMigration.Strategy - (SchemaMigration_Status)(0), // 3: vtctldata.SchemaMigration.Status - (*ExecuteVtctlCommandRequest)(nil), // 4: vtctldata.ExecuteVtctlCommandRequest - (*ExecuteVtctlCommandResponse)(nil), // 5: vtctldata.ExecuteVtctlCommandResponse - (*TableMaterializeSettings)(nil), // 6: vtctldata.TableMaterializeSettings - (*MaterializeSettings)(nil), // 7: vtctldata.MaterializeSettings - (*Keyspace)(nil), // 8: vtctldata.Keyspace - (*SchemaMigration)(nil), // 9: vtctldata.SchemaMigration - (*Shard)(nil), // 10: vtctldata.Shard - (*WorkflowOptions)(nil), // 11: vtctldata.WorkflowOptions - (*Workflow)(nil), // 12: vtctldata.Workflow - (*AddCellInfoRequest)(nil), // 13: vtctldata.AddCellInfoRequest - (*AddCellInfoResponse)(nil), // 14: vtctldata.AddCellInfoResponse - (*AddCellsAliasRequest)(nil), // 15: vtctldata.AddCellsAliasRequest - (*AddCellsAliasResponse)(nil), // 16: vtctldata.AddCellsAliasResponse - (*ApplyKeyspaceRoutingRulesRequest)(nil), // 17: vtctldata.ApplyKeyspaceRoutingRulesRequest - (*ApplyKeyspaceRoutingRulesResponse)(nil), // 18: vtctldata.ApplyKeyspaceRoutingRulesResponse - (*ApplyRoutingRulesRequest)(nil), // 19: vtctldata.ApplyRoutingRulesRequest - (*ApplyRoutingRulesResponse)(nil), // 20: vtctldata.ApplyRoutingRulesResponse - (*ApplyShardRoutingRulesRequest)(nil), // 21: vtctldata.ApplyShardRoutingRulesRequest - (*ApplyShardRoutingRulesResponse)(nil), // 22: vtctldata.ApplyShardRoutingRulesResponse - (*ApplySchemaRequest)(nil), // 23: vtctldata.ApplySchemaRequest - (*ApplySchemaResponse)(nil), // 24: vtctldata.ApplySchemaResponse - (*ApplyVSchemaRequest)(nil), // 25: vtctldata.ApplyVSchemaRequest - (*ApplyVSchemaResponse)(nil), // 26: vtctldata.ApplyVSchemaResponse - (*BackupRequest)(nil), // 27: vtctldata.BackupRequest - (*BackupResponse)(nil), // 28: vtctldata.BackupResponse - (*BackupShardRequest)(nil), // 29: vtctldata.BackupShardRequest - (*CancelSchemaMigrationRequest)(nil), // 30: vtctldata.CancelSchemaMigrationRequest - (*CancelSchemaMigrationResponse)(nil), // 31: vtctldata.CancelSchemaMigrationResponse - (*ChangeTabletTypeRequest)(nil), // 32: vtctldata.ChangeTabletTypeRequest - (*ChangeTabletTypeResponse)(nil), // 33: vtctldata.ChangeTabletTypeResponse - (*CheckThrottlerRequest)(nil), // 34: vtctldata.CheckThrottlerRequest - (*CheckThrottlerResponse)(nil), // 35: vtctldata.CheckThrottlerResponse - (*CleanupSchemaMigrationRequest)(nil), // 36: vtctldata.CleanupSchemaMigrationRequest - (*CleanupSchemaMigrationResponse)(nil), // 37: vtctldata.CleanupSchemaMigrationResponse - (*CompleteSchemaMigrationRequest)(nil), // 38: vtctldata.CompleteSchemaMigrationRequest - (*CompleteSchemaMigrationResponse)(nil), // 39: vtctldata.CompleteSchemaMigrationResponse - (*CreateKeyspaceRequest)(nil), // 40: vtctldata.CreateKeyspaceRequest - (*CreateKeyspaceResponse)(nil), // 41: vtctldata.CreateKeyspaceResponse - (*CreateShardRequest)(nil), // 42: vtctldata.CreateShardRequest - (*CreateShardResponse)(nil), // 43: vtctldata.CreateShardResponse - (*DeleteCellInfoRequest)(nil), // 44: vtctldata.DeleteCellInfoRequest - (*DeleteCellInfoResponse)(nil), // 45: vtctldata.DeleteCellInfoResponse - (*DeleteCellsAliasRequest)(nil), // 46: vtctldata.DeleteCellsAliasRequest - (*DeleteCellsAliasResponse)(nil), // 47: vtctldata.DeleteCellsAliasResponse - (*DeleteKeyspaceRequest)(nil), // 48: vtctldata.DeleteKeyspaceRequest - (*DeleteKeyspaceResponse)(nil), // 49: vtctldata.DeleteKeyspaceResponse - (*DeleteShardsRequest)(nil), // 50: vtctldata.DeleteShardsRequest - (*DeleteShardsResponse)(nil), // 51: vtctldata.DeleteShardsResponse - (*DeleteSrvVSchemaRequest)(nil), // 52: vtctldata.DeleteSrvVSchemaRequest - (*DeleteSrvVSchemaResponse)(nil), // 53: vtctldata.DeleteSrvVSchemaResponse - (*DeleteTabletsRequest)(nil), // 54: vtctldata.DeleteTabletsRequest - (*DeleteTabletsResponse)(nil), // 55: vtctldata.DeleteTabletsResponse - (*EmergencyReparentShardRequest)(nil), // 56: vtctldata.EmergencyReparentShardRequest - (*EmergencyReparentShardResponse)(nil), // 57: vtctldata.EmergencyReparentShardResponse - (*ExecuteFetchAsAppRequest)(nil), // 58: vtctldata.ExecuteFetchAsAppRequest - (*ExecuteFetchAsAppResponse)(nil), // 59: vtctldata.ExecuteFetchAsAppResponse - (*ExecuteFetchAsDBARequest)(nil), // 60: vtctldata.ExecuteFetchAsDBARequest - (*ExecuteFetchAsDBAResponse)(nil), // 61: vtctldata.ExecuteFetchAsDBAResponse - (*ExecuteHookRequest)(nil), // 62: vtctldata.ExecuteHookRequest - (*ExecuteHookResponse)(nil), // 63: vtctldata.ExecuteHookResponse - (*ExecuteMultiFetchAsDBARequest)(nil), // 64: vtctldata.ExecuteMultiFetchAsDBARequest - (*ExecuteMultiFetchAsDBAResponse)(nil), // 65: vtctldata.ExecuteMultiFetchAsDBAResponse - (*FindAllShardsInKeyspaceRequest)(nil), // 66: vtctldata.FindAllShardsInKeyspaceRequest - (*FindAllShardsInKeyspaceResponse)(nil), // 67: vtctldata.FindAllShardsInKeyspaceResponse - (*ForceCutOverSchemaMigrationRequest)(nil), // 68: vtctldata.ForceCutOverSchemaMigrationRequest - (*ForceCutOverSchemaMigrationResponse)(nil), // 69: vtctldata.ForceCutOverSchemaMigrationResponse - (*GetBackupsRequest)(nil), // 70: vtctldata.GetBackupsRequest - (*GetBackupsResponse)(nil), // 71: vtctldata.GetBackupsResponse - (*GetCellInfoRequest)(nil), // 72: vtctldata.GetCellInfoRequest - (*GetCellInfoResponse)(nil), // 73: vtctldata.GetCellInfoResponse - (*GetCellInfoNamesRequest)(nil), // 74: vtctldata.GetCellInfoNamesRequest - (*GetCellInfoNamesResponse)(nil), // 75: vtctldata.GetCellInfoNamesResponse - (*GetCellsAliasesRequest)(nil), // 76: vtctldata.GetCellsAliasesRequest - (*GetCellsAliasesResponse)(nil), // 77: vtctldata.GetCellsAliasesResponse - (*GetFullStatusRequest)(nil), // 78: vtctldata.GetFullStatusRequest - (*GetFullStatusResponse)(nil), // 79: vtctldata.GetFullStatusResponse - (*GetKeyspacesRequest)(nil), // 80: vtctldata.GetKeyspacesRequest - (*GetKeyspacesResponse)(nil), // 81: vtctldata.GetKeyspacesResponse - (*GetKeyspaceRequest)(nil), // 82: vtctldata.GetKeyspaceRequest - (*GetKeyspaceResponse)(nil), // 83: vtctldata.GetKeyspaceResponse - (*GetPermissionsRequest)(nil), // 84: vtctldata.GetPermissionsRequest - (*GetPermissionsResponse)(nil), // 85: vtctldata.GetPermissionsResponse - (*GetKeyspaceRoutingRulesRequest)(nil), // 86: vtctldata.GetKeyspaceRoutingRulesRequest - (*GetKeyspaceRoutingRulesResponse)(nil), // 87: vtctldata.GetKeyspaceRoutingRulesResponse - (*GetRoutingRulesRequest)(nil), // 88: vtctldata.GetRoutingRulesRequest - (*GetRoutingRulesResponse)(nil), // 89: vtctldata.GetRoutingRulesResponse - (*GetSchemaRequest)(nil), // 90: vtctldata.GetSchemaRequest - (*GetSchemaResponse)(nil), // 91: vtctldata.GetSchemaResponse - (*GetSchemaMigrationsRequest)(nil), // 92: vtctldata.GetSchemaMigrationsRequest - (*GetSchemaMigrationsResponse)(nil), // 93: vtctldata.GetSchemaMigrationsResponse - (*GetShardReplicationRequest)(nil), // 94: vtctldata.GetShardReplicationRequest - (*GetShardReplicationResponse)(nil), // 95: vtctldata.GetShardReplicationResponse - (*GetShardRequest)(nil), // 96: vtctldata.GetShardRequest - (*GetShardResponse)(nil), // 97: vtctldata.GetShardResponse - (*GetShardRoutingRulesRequest)(nil), // 98: vtctldata.GetShardRoutingRulesRequest - (*GetShardRoutingRulesResponse)(nil), // 99: vtctldata.GetShardRoutingRulesResponse - (*GetSrvKeyspaceNamesRequest)(nil), // 100: vtctldata.GetSrvKeyspaceNamesRequest - (*GetSrvKeyspaceNamesResponse)(nil), // 101: vtctldata.GetSrvKeyspaceNamesResponse - (*GetSrvKeyspacesRequest)(nil), // 102: vtctldata.GetSrvKeyspacesRequest - (*GetSrvKeyspacesResponse)(nil), // 103: vtctldata.GetSrvKeyspacesResponse - (*UpdateThrottlerConfigRequest)(nil), // 104: vtctldata.UpdateThrottlerConfigRequest - (*UpdateThrottlerConfigResponse)(nil), // 105: vtctldata.UpdateThrottlerConfigResponse - (*GetSrvVSchemaRequest)(nil), // 106: vtctldata.GetSrvVSchemaRequest - (*GetSrvVSchemaResponse)(nil), // 107: vtctldata.GetSrvVSchemaResponse - (*GetSrvVSchemasRequest)(nil), // 108: vtctldata.GetSrvVSchemasRequest - (*GetSrvVSchemasResponse)(nil), // 109: vtctldata.GetSrvVSchemasResponse - (*GetTabletRequest)(nil), // 110: vtctldata.GetTabletRequest - (*GetTabletResponse)(nil), // 111: vtctldata.GetTabletResponse - (*GetTabletsRequest)(nil), // 112: vtctldata.GetTabletsRequest - (*GetTabletsResponse)(nil), // 113: vtctldata.GetTabletsResponse - (*GetThrottlerStatusRequest)(nil), // 114: vtctldata.GetThrottlerStatusRequest - (*GetThrottlerStatusResponse)(nil), // 115: vtctldata.GetThrottlerStatusResponse - (*GetTopologyPathRequest)(nil), // 116: vtctldata.GetTopologyPathRequest - (*GetTopologyPathResponse)(nil), // 117: vtctldata.GetTopologyPathResponse - (*TopologyCell)(nil), // 118: vtctldata.TopologyCell - (*GetVSchemaRequest)(nil), // 119: vtctldata.GetVSchemaRequest - (*GetVersionRequest)(nil), // 120: vtctldata.GetVersionRequest - (*GetVersionResponse)(nil), // 121: vtctldata.GetVersionResponse - (*GetVSchemaResponse)(nil), // 122: vtctldata.GetVSchemaResponse - (*GetWorkflowsRequest)(nil), // 123: vtctldata.GetWorkflowsRequest - (*GetWorkflowsResponse)(nil), // 124: vtctldata.GetWorkflowsResponse - (*InitShardPrimaryRequest)(nil), // 125: vtctldata.InitShardPrimaryRequest - (*InitShardPrimaryResponse)(nil), // 126: vtctldata.InitShardPrimaryResponse - (*LaunchSchemaMigrationRequest)(nil), // 127: vtctldata.LaunchSchemaMigrationRequest - (*LaunchSchemaMigrationResponse)(nil), // 128: vtctldata.LaunchSchemaMigrationResponse - (*LookupVindexCreateRequest)(nil), // 129: vtctldata.LookupVindexCreateRequest - (*LookupVindexCreateResponse)(nil), // 130: vtctldata.LookupVindexCreateResponse - (*LookupVindexExternalizeRequest)(nil), // 131: vtctldata.LookupVindexExternalizeRequest - (*LookupVindexExternalizeResponse)(nil), // 132: vtctldata.LookupVindexExternalizeResponse - (*MaterializeCreateRequest)(nil), // 133: vtctldata.MaterializeCreateRequest - (*MaterializeCreateResponse)(nil), // 134: vtctldata.MaterializeCreateResponse - (*MigrateCreateRequest)(nil), // 135: vtctldata.MigrateCreateRequest - (*MigrateCompleteRequest)(nil), // 136: vtctldata.MigrateCompleteRequest - (*MigrateCompleteResponse)(nil), // 137: vtctldata.MigrateCompleteResponse - (*MountRegisterRequest)(nil), // 138: vtctldata.MountRegisterRequest - (*MountRegisterResponse)(nil), // 139: vtctldata.MountRegisterResponse - (*MountUnregisterRequest)(nil), // 140: vtctldata.MountUnregisterRequest - (*MountUnregisterResponse)(nil), // 141: vtctldata.MountUnregisterResponse - (*MountShowRequest)(nil), // 142: vtctldata.MountShowRequest - (*MountShowResponse)(nil), // 143: vtctldata.MountShowResponse - (*MountListRequest)(nil), // 144: vtctldata.MountListRequest - (*MountListResponse)(nil), // 145: vtctldata.MountListResponse - (*MoveTablesCreateRequest)(nil), // 146: vtctldata.MoveTablesCreateRequest - (*MoveTablesCreateResponse)(nil), // 147: vtctldata.MoveTablesCreateResponse - (*MoveTablesCompleteRequest)(nil), // 148: vtctldata.MoveTablesCompleteRequest - (*MoveTablesCompleteResponse)(nil), // 149: vtctldata.MoveTablesCompleteResponse - (*PingTabletRequest)(nil), // 150: vtctldata.PingTabletRequest - (*PingTabletResponse)(nil), // 151: vtctldata.PingTabletResponse - (*PlannedReparentShardRequest)(nil), // 152: vtctldata.PlannedReparentShardRequest - (*PlannedReparentShardResponse)(nil), // 153: vtctldata.PlannedReparentShardResponse - (*RebuildKeyspaceGraphRequest)(nil), // 154: vtctldata.RebuildKeyspaceGraphRequest - (*RebuildKeyspaceGraphResponse)(nil), // 155: vtctldata.RebuildKeyspaceGraphResponse - (*RebuildVSchemaGraphRequest)(nil), // 156: vtctldata.RebuildVSchemaGraphRequest - (*RebuildVSchemaGraphResponse)(nil), // 157: vtctldata.RebuildVSchemaGraphResponse - (*RefreshStateRequest)(nil), // 158: vtctldata.RefreshStateRequest - (*RefreshStateResponse)(nil), // 159: vtctldata.RefreshStateResponse - (*RefreshStateByShardRequest)(nil), // 160: vtctldata.RefreshStateByShardRequest - (*RefreshStateByShardResponse)(nil), // 161: vtctldata.RefreshStateByShardResponse - (*ReloadSchemaRequest)(nil), // 162: vtctldata.ReloadSchemaRequest - (*ReloadSchemaResponse)(nil), // 163: vtctldata.ReloadSchemaResponse - (*ReloadSchemaKeyspaceRequest)(nil), // 164: vtctldata.ReloadSchemaKeyspaceRequest - (*ReloadSchemaKeyspaceResponse)(nil), // 165: vtctldata.ReloadSchemaKeyspaceResponse - (*ReloadSchemaShardRequest)(nil), // 166: vtctldata.ReloadSchemaShardRequest - (*ReloadSchemaShardResponse)(nil), // 167: vtctldata.ReloadSchemaShardResponse - (*RemoveBackupRequest)(nil), // 168: vtctldata.RemoveBackupRequest - (*RemoveBackupResponse)(nil), // 169: vtctldata.RemoveBackupResponse - (*RemoveKeyspaceCellRequest)(nil), // 170: vtctldata.RemoveKeyspaceCellRequest - (*RemoveKeyspaceCellResponse)(nil), // 171: vtctldata.RemoveKeyspaceCellResponse - (*RemoveShardCellRequest)(nil), // 172: vtctldata.RemoveShardCellRequest - (*RemoveShardCellResponse)(nil), // 173: vtctldata.RemoveShardCellResponse - (*ReparentTabletRequest)(nil), // 174: vtctldata.ReparentTabletRequest - (*ReparentTabletResponse)(nil), // 175: vtctldata.ReparentTabletResponse - (*ReshardCreateRequest)(nil), // 176: vtctldata.ReshardCreateRequest - (*RestoreFromBackupRequest)(nil), // 177: vtctldata.RestoreFromBackupRequest - (*RestoreFromBackupResponse)(nil), // 178: vtctldata.RestoreFromBackupResponse - (*RetrySchemaMigrationRequest)(nil), // 179: vtctldata.RetrySchemaMigrationRequest - (*RetrySchemaMigrationResponse)(nil), // 180: vtctldata.RetrySchemaMigrationResponse - (*RunHealthCheckRequest)(nil), // 181: vtctldata.RunHealthCheckRequest - (*RunHealthCheckResponse)(nil), // 182: vtctldata.RunHealthCheckResponse - (*SetKeyspaceDurabilityPolicyRequest)(nil), // 183: vtctldata.SetKeyspaceDurabilityPolicyRequest - (*SetKeyspaceDurabilityPolicyResponse)(nil), // 184: vtctldata.SetKeyspaceDurabilityPolicyResponse - (*SetKeyspaceShardingInfoRequest)(nil), // 185: vtctldata.SetKeyspaceShardingInfoRequest - (*SetKeyspaceShardingInfoResponse)(nil), // 186: vtctldata.SetKeyspaceShardingInfoResponse - (*SetShardIsPrimaryServingRequest)(nil), // 187: vtctldata.SetShardIsPrimaryServingRequest - (*SetShardIsPrimaryServingResponse)(nil), // 188: vtctldata.SetShardIsPrimaryServingResponse - (*SetShardTabletControlRequest)(nil), // 189: vtctldata.SetShardTabletControlRequest - (*SetShardTabletControlResponse)(nil), // 190: vtctldata.SetShardTabletControlResponse - (*SetWritableRequest)(nil), // 191: vtctldata.SetWritableRequest - (*SetWritableResponse)(nil), // 192: vtctldata.SetWritableResponse - (*ShardReplicationAddRequest)(nil), // 193: vtctldata.ShardReplicationAddRequest - (*ShardReplicationAddResponse)(nil), // 194: vtctldata.ShardReplicationAddResponse - (*ShardReplicationFixRequest)(nil), // 195: vtctldata.ShardReplicationFixRequest - (*ShardReplicationFixResponse)(nil), // 196: vtctldata.ShardReplicationFixResponse - (*ShardReplicationPositionsRequest)(nil), // 197: vtctldata.ShardReplicationPositionsRequest - (*ShardReplicationPositionsResponse)(nil), // 198: vtctldata.ShardReplicationPositionsResponse - (*ShardReplicationRemoveRequest)(nil), // 199: vtctldata.ShardReplicationRemoveRequest - (*ShardReplicationRemoveResponse)(nil), // 200: vtctldata.ShardReplicationRemoveResponse - (*SleepTabletRequest)(nil), // 201: vtctldata.SleepTabletRequest - (*SleepTabletResponse)(nil), // 202: vtctldata.SleepTabletResponse - (*SourceShardAddRequest)(nil), // 203: vtctldata.SourceShardAddRequest - (*SourceShardAddResponse)(nil), // 204: vtctldata.SourceShardAddResponse - (*SourceShardDeleteRequest)(nil), // 205: vtctldata.SourceShardDeleteRequest - (*SourceShardDeleteResponse)(nil), // 206: vtctldata.SourceShardDeleteResponse - (*StartReplicationRequest)(nil), // 207: vtctldata.StartReplicationRequest - (*StartReplicationResponse)(nil), // 208: vtctldata.StartReplicationResponse - (*StopReplicationRequest)(nil), // 209: vtctldata.StopReplicationRequest - (*StopReplicationResponse)(nil), // 210: vtctldata.StopReplicationResponse - (*TabletExternallyReparentedRequest)(nil), // 211: vtctldata.TabletExternallyReparentedRequest - (*TabletExternallyReparentedResponse)(nil), // 212: vtctldata.TabletExternallyReparentedResponse - (*UpdateCellInfoRequest)(nil), // 213: vtctldata.UpdateCellInfoRequest - (*UpdateCellInfoResponse)(nil), // 214: vtctldata.UpdateCellInfoResponse - (*UpdateCellsAliasRequest)(nil), // 215: vtctldata.UpdateCellsAliasRequest - (*UpdateCellsAliasResponse)(nil), // 216: vtctldata.UpdateCellsAliasResponse - (*ValidateRequest)(nil), // 217: vtctldata.ValidateRequest - (*ValidateResponse)(nil), // 218: vtctldata.ValidateResponse - (*ValidateKeyspaceRequest)(nil), // 219: vtctldata.ValidateKeyspaceRequest - (*ValidateKeyspaceResponse)(nil), // 220: vtctldata.ValidateKeyspaceResponse - (*ValidateSchemaKeyspaceRequest)(nil), // 221: vtctldata.ValidateSchemaKeyspaceRequest - (*ValidateSchemaKeyspaceResponse)(nil), // 222: vtctldata.ValidateSchemaKeyspaceResponse - (*ValidateShardRequest)(nil), // 223: vtctldata.ValidateShardRequest - (*ValidateShardResponse)(nil), // 224: vtctldata.ValidateShardResponse - (*ValidateVersionKeyspaceRequest)(nil), // 225: vtctldata.ValidateVersionKeyspaceRequest - (*ValidateVersionKeyspaceResponse)(nil), // 226: vtctldata.ValidateVersionKeyspaceResponse - (*ValidateVersionShardRequest)(nil), // 227: vtctldata.ValidateVersionShardRequest - (*ValidateVersionShardResponse)(nil), // 228: vtctldata.ValidateVersionShardResponse - (*ValidateVSchemaRequest)(nil), // 229: vtctldata.ValidateVSchemaRequest - (*ValidateVSchemaResponse)(nil), // 230: vtctldata.ValidateVSchemaResponse - (*VDiffCreateRequest)(nil), // 231: vtctldata.VDiffCreateRequest - (*VDiffCreateResponse)(nil), // 232: vtctldata.VDiffCreateResponse - (*VDiffDeleteRequest)(nil), // 233: vtctldata.VDiffDeleteRequest - (*VDiffDeleteResponse)(nil), // 234: vtctldata.VDiffDeleteResponse - (*VDiffResumeRequest)(nil), // 235: vtctldata.VDiffResumeRequest - (*VDiffResumeResponse)(nil), // 236: vtctldata.VDiffResumeResponse - (*VDiffShowRequest)(nil), // 237: vtctldata.VDiffShowRequest - (*VDiffShowResponse)(nil), // 238: vtctldata.VDiffShowResponse - (*VDiffStopRequest)(nil), // 239: vtctldata.VDiffStopRequest - (*VDiffStopResponse)(nil), // 240: vtctldata.VDiffStopResponse - (*WorkflowDeleteRequest)(nil), // 241: vtctldata.WorkflowDeleteRequest - (*WorkflowDeleteResponse)(nil), // 242: vtctldata.WorkflowDeleteResponse - (*WorkflowStatusRequest)(nil), // 243: vtctldata.WorkflowStatusRequest - (*WorkflowStatusResponse)(nil), // 244: vtctldata.WorkflowStatusResponse - (*WorkflowSwitchTrafficRequest)(nil), // 245: vtctldata.WorkflowSwitchTrafficRequest - (*WorkflowSwitchTrafficResponse)(nil), // 246: vtctldata.WorkflowSwitchTrafficResponse - (*WorkflowUpdateRequest)(nil), // 247: vtctldata.WorkflowUpdateRequest - (*WorkflowUpdateResponse)(nil), // 248: vtctldata.WorkflowUpdateResponse - (*GetMirrorRulesRequest)(nil), // 249: vtctldata.GetMirrorRulesRequest - (*GetMirrorRulesResponse)(nil), // 250: vtctldata.GetMirrorRulesResponse - (*WorkflowMirrorTrafficRequest)(nil), // 251: vtctldata.WorkflowMirrorTrafficRequest - (*WorkflowMirrorTrafficResponse)(nil), // 252: vtctldata.WorkflowMirrorTrafficResponse - nil, // 253: vtctldata.Workflow.ShardStreamsEntry - (*Workflow_ReplicationLocation)(nil), // 254: vtctldata.Workflow.ReplicationLocation - (*Workflow_ShardStream)(nil), // 255: vtctldata.Workflow.ShardStream - (*Workflow_Stream)(nil), // 256: vtctldata.Workflow.Stream - (*Workflow_Stream_CopyState)(nil), // 257: vtctldata.Workflow.Stream.CopyState - (*Workflow_Stream_Log)(nil), // 258: vtctldata.Workflow.Stream.Log - (*Workflow_Stream_ThrottlerStatus)(nil), // 259: vtctldata.Workflow.Stream.ThrottlerStatus - nil, // 260: vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry - nil, // 261: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry - (*ApplyVSchemaResponse_ParamList)(nil), // 262: vtctldata.ApplyVSchemaResponse.ParamList - nil, // 263: vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 264: vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 265: vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 266: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry - nil, // 267: vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 268: vtctldata.GetCellsAliasesResponse.AliasesEntry - nil, // 269: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry - nil, // 270: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry - (*GetSrvKeyspaceNamesResponse_NameList)(nil), // 271: vtctldata.GetSrvKeyspaceNamesResponse.NameList - nil, // 272: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry - nil, // 273: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry - nil, // 274: vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry - (*MoveTablesCreateResponse_TabletInfo)(nil), // 275: vtctldata.MoveTablesCreateResponse.TabletInfo - nil, // 276: vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry - nil, // 277: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry - nil, // 278: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry - nil, // 279: vtctldata.ValidateResponse.ResultsByKeyspaceEntry - nil, // 280: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry - nil, // 281: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry - nil, // 282: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry - nil, // 283: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry - nil, // 284: vtctldata.VDiffShowResponse.TabletResponsesEntry - (*WorkflowDeleteResponse_TabletInfo)(nil), // 285: vtctldata.WorkflowDeleteResponse.TabletInfo - (*WorkflowStatusResponse_TableCopyState)(nil), // 286: vtctldata.WorkflowStatusResponse.TableCopyState - (*WorkflowStatusResponse_ShardStreamState)(nil), // 287: vtctldata.WorkflowStatusResponse.ShardStreamState - (*WorkflowStatusResponse_ShardStreams)(nil), // 288: vtctldata.WorkflowStatusResponse.ShardStreams - nil, // 289: vtctldata.WorkflowStatusResponse.TableCopyStateEntry - nil, // 290: vtctldata.WorkflowStatusResponse.ShardStreamsEntry - (*WorkflowUpdateResponse_TabletInfo)(nil), // 291: vtctldata.WorkflowUpdateResponse.TabletInfo - (*logutil.Event)(nil), // 292: logutil.Event - (tabletmanagerdata.TabletSelectionPreference)(0), // 293: tabletmanagerdata.TabletSelectionPreference - (*topodata.Keyspace)(nil), // 294: topodata.Keyspace - (*vttime.Time)(nil), // 295: vttime.Time - (*topodata.TabletAlias)(nil), // 296: topodata.TabletAlias - (*vttime.Duration)(nil), // 297: vttime.Duration - (*topodata.Shard)(nil), // 298: topodata.Shard - (*topodata.CellInfo)(nil), // 299: topodata.CellInfo - (*vschema.KeyspaceRoutingRules)(nil), // 300: vschema.KeyspaceRoutingRules - (*vschema.RoutingRules)(nil), // 301: vschema.RoutingRules - (*vschema.ShardRoutingRules)(nil), // 302: vschema.ShardRoutingRules - (*vtrpc.CallerID)(nil), // 303: vtrpc.CallerID - (*vschema.Keyspace)(nil), // 304: vschema.Keyspace - (topodata.TabletType)(0), // 305: topodata.TabletType - (*topodata.Tablet)(nil), // 306: topodata.Tablet - (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 307: tabletmanagerdata.CheckThrottlerResponse - (topodata.KeyspaceType)(0), // 308: topodata.KeyspaceType - (*query.QueryResult)(nil), // 309: query.QueryResult - (*tabletmanagerdata.ExecuteHookRequest)(nil), // 310: tabletmanagerdata.ExecuteHookRequest - (*tabletmanagerdata.ExecuteHookResponse)(nil), // 311: tabletmanagerdata.ExecuteHookResponse - (*mysqlctl.BackupInfo)(nil), // 312: mysqlctl.BackupInfo - (*replicationdata.FullStatus)(nil), // 313: replicationdata.FullStatus - (*tabletmanagerdata.Permissions)(nil), // 314: tabletmanagerdata.Permissions - (*tabletmanagerdata.SchemaDefinition)(nil), // 315: tabletmanagerdata.SchemaDefinition - (*topodata.ThrottledAppRule)(nil), // 316: topodata.ThrottledAppRule - (*vschema.SrvVSchema)(nil), // 317: vschema.SrvVSchema - (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 318: tabletmanagerdata.GetThrottlerStatusResponse - (*topodata.ShardReplicationError)(nil), // 319: topodata.ShardReplicationError - (*topodata.KeyRange)(nil), // 320: topodata.KeyRange - (*topodata.CellsAlias)(nil), // 321: topodata.CellsAlias - (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 322: tabletmanagerdata.UpdateVReplicationWorkflowRequest - (*vschema.MirrorRules)(nil), // 323: vschema.MirrorRules - (*topodata.Shard_TabletControl)(nil), // 324: topodata.Shard.TabletControl - (*binlogdata.BinlogSource)(nil), // 325: binlogdata.BinlogSource - (*topodata.ShardReplication)(nil), // 326: topodata.ShardReplication - (*topodata.SrvKeyspace)(nil), // 327: topodata.SrvKeyspace - (*replicationdata.Status)(nil), // 328: replicationdata.Status - (*tabletmanagerdata.VDiffResponse)(nil), // 329: tabletmanagerdata.VDiffResponse + (ShardedAutoIncrementHandling)(0), // 2: vtctldata.ShardedAutoIncrementHandling + (SchemaMigration_Strategy)(0), // 3: vtctldata.SchemaMigration.Strategy + (SchemaMigration_Status)(0), // 4: vtctldata.SchemaMigration.Status + (*ExecuteVtctlCommandRequest)(nil), // 5: vtctldata.ExecuteVtctlCommandRequest + (*ExecuteVtctlCommandResponse)(nil), // 6: vtctldata.ExecuteVtctlCommandResponse + (*TableMaterializeSettings)(nil), // 7: vtctldata.TableMaterializeSettings + (*MaterializeSettings)(nil), // 8: vtctldata.MaterializeSettings + (*Keyspace)(nil), // 9: vtctldata.Keyspace + (*SchemaMigration)(nil), // 10: vtctldata.SchemaMigration + (*Shard)(nil), // 11: vtctldata.Shard + (*WorkflowOptions)(nil), // 12: vtctldata.WorkflowOptions + (*Workflow)(nil), // 13: vtctldata.Workflow + (*AddCellInfoRequest)(nil), // 14: vtctldata.AddCellInfoRequest + (*AddCellInfoResponse)(nil), // 15: vtctldata.AddCellInfoResponse + (*AddCellsAliasRequest)(nil), // 16: vtctldata.AddCellsAliasRequest + (*AddCellsAliasResponse)(nil), // 17: vtctldata.AddCellsAliasResponse + (*ApplyKeyspaceRoutingRulesRequest)(nil), // 18: vtctldata.ApplyKeyspaceRoutingRulesRequest + (*ApplyKeyspaceRoutingRulesResponse)(nil), // 19: vtctldata.ApplyKeyspaceRoutingRulesResponse + (*ApplyRoutingRulesRequest)(nil), // 20: vtctldata.ApplyRoutingRulesRequest + (*ApplyRoutingRulesResponse)(nil), // 21: vtctldata.ApplyRoutingRulesResponse + (*ApplyShardRoutingRulesRequest)(nil), // 22: vtctldata.ApplyShardRoutingRulesRequest + (*ApplyShardRoutingRulesResponse)(nil), // 23: vtctldata.ApplyShardRoutingRulesResponse + (*ApplySchemaRequest)(nil), // 24: vtctldata.ApplySchemaRequest + (*ApplySchemaResponse)(nil), // 25: vtctldata.ApplySchemaResponse + (*ApplyVSchemaRequest)(nil), // 26: vtctldata.ApplyVSchemaRequest + (*ApplyVSchemaResponse)(nil), // 27: vtctldata.ApplyVSchemaResponse + (*BackupRequest)(nil), // 28: vtctldata.BackupRequest + (*BackupResponse)(nil), // 29: vtctldata.BackupResponse + (*BackupShardRequest)(nil), // 30: vtctldata.BackupShardRequest + (*CancelSchemaMigrationRequest)(nil), // 31: vtctldata.CancelSchemaMigrationRequest + (*CancelSchemaMigrationResponse)(nil), // 32: vtctldata.CancelSchemaMigrationResponse + (*ChangeTabletTagsRequest)(nil), // 33: vtctldata.ChangeTabletTagsRequest + (*ChangeTabletTagsResponse)(nil), // 34: vtctldata.ChangeTabletTagsResponse + (*ChangeTabletTypeRequest)(nil), // 35: vtctldata.ChangeTabletTypeRequest + (*ChangeTabletTypeResponse)(nil), // 36: vtctldata.ChangeTabletTypeResponse + (*CheckThrottlerRequest)(nil), // 37: vtctldata.CheckThrottlerRequest + (*CheckThrottlerResponse)(nil), // 38: vtctldata.CheckThrottlerResponse + (*CleanupSchemaMigrationRequest)(nil), // 39: vtctldata.CleanupSchemaMigrationRequest + (*CleanupSchemaMigrationResponse)(nil), // 40: vtctldata.CleanupSchemaMigrationResponse + (*CompleteSchemaMigrationRequest)(nil), // 41: vtctldata.CompleteSchemaMigrationRequest + (*CompleteSchemaMigrationResponse)(nil), // 42: vtctldata.CompleteSchemaMigrationResponse + (*CreateKeyspaceRequest)(nil), // 43: vtctldata.CreateKeyspaceRequest + (*CreateKeyspaceResponse)(nil), // 44: vtctldata.CreateKeyspaceResponse + (*CreateShardRequest)(nil), // 45: vtctldata.CreateShardRequest + (*CreateShardResponse)(nil), // 46: vtctldata.CreateShardResponse + (*DeleteCellInfoRequest)(nil), // 47: vtctldata.DeleteCellInfoRequest + (*DeleteCellInfoResponse)(nil), // 48: vtctldata.DeleteCellInfoResponse + (*DeleteCellsAliasRequest)(nil), // 49: vtctldata.DeleteCellsAliasRequest + (*DeleteCellsAliasResponse)(nil), // 50: vtctldata.DeleteCellsAliasResponse + (*DeleteKeyspaceRequest)(nil), // 51: vtctldata.DeleteKeyspaceRequest + (*DeleteKeyspaceResponse)(nil), // 52: vtctldata.DeleteKeyspaceResponse + (*DeleteShardsRequest)(nil), // 53: vtctldata.DeleteShardsRequest + (*DeleteShardsResponse)(nil), // 54: vtctldata.DeleteShardsResponse + (*DeleteSrvVSchemaRequest)(nil), // 55: vtctldata.DeleteSrvVSchemaRequest + (*DeleteSrvVSchemaResponse)(nil), // 56: vtctldata.DeleteSrvVSchemaResponse + (*DeleteTabletsRequest)(nil), // 57: vtctldata.DeleteTabletsRequest + (*DeleteTabletsResponse)(nil), // 58: vtctldata.DeleteTabletsResponse + (*EmergencyReparentShardRequest)(nil), // 59: vtctldata.EmergencyReparentShardRequest + (*EmergencyReparentShardResponse)(nil), // 60: vtctldata.EmergencyReparentShardResponse + (*ExecuteFetchAsAppRequest)(nil), // 61: vtctldata.ExecuteFetchAsAppRequest + (*ExecuteFetchAsAppResponse)(nil), // 62: vtctldata.ExecuteFetchAsAppResponse + (*ExecuteFetchAsDBARequest)(nil), // 63: vtctldata.ExecuteFetchAsDBARequest + (*ExecuteFetchAsDBAResponse)(nil), // 64: vtctldata.ExecuteFetchAsDBAResponse + (*ExecuteHookRequest)(nil), // 65: vtctldata.ExecuteHookRequest + (*ExecuteHookResponse)(nil), // 66: vtctldata.ExecuteHookResponse + (*ExecuteMultiFetchAsDBARequest)(nil), // 67: vtctldata.ExecuteMultiFetchAsDBARequest + (*ExecuteMultiFetchAsDBAResponse)(nil), // 68: vtctldata.ExecuteMultiFetchAsDBAResponse + (*FindAllShardsInKeyspaceRequest)(nil), // 69: vtctldata.FindAllShardsInKeyspaceRequest + (*FindAllShardsInKeyspaceResponse)(nil), // 70: vtctldata.FindAllShardsInKeyspaceResponse + (*ForceCutOverSchemaMigrationRequest)(nil), // 71: vtctldata.ForceCutOverSchemaMigrationRequest + (*ForceCutOverSchemaMigrationResponse)(nil), // 72: vtctldata.ForceCutOverSchemaMigrationResponse + (*GetBackupsRequest)(nil), // 73: vtctldata.GetBackupsRequest + (*GetBackupsResponse)(nil), // 74: vtctldata.GetBackupsResponse + (*GetCellInfoRequest)(nil), // 75: vtctldata.GetCellInfoRequest + (*GetCellInfoResponse)(nil), // 76: vtctldata.GetCellInfoResponse + (*GetCellInfoNamesRequest)(nil), // 77: vtctldata.GetCellInfoNamesRequest + (*GetCellInfoNamesResponse)(nil), // 78: vtctldata.GetCellInfoNamesResponse + (*GetCellsAliasesRequest)(nil), // 79: vtctldata.GetCellsAliasesRequest + (*GetCellsAliasesResponse)(nil), // 80: vtctldata.GetCellsAliasesResponse + (*GetFullStatusRequest)(nil), // 81: vtctldata.GetFullStatusRequest + (*GetFullStatusResponse)(nil), // 82: vtctldata.GetFullStatusResponse + (*GetKeyspacesRequest)(nil), // 83: vtctldata.GetKeyspacesRequest + (*GetKeyspacesResponse)(nil), // 84: vtctldata.GetKeyspacesResponse + (*GetKeyspaceRequest)(nil), // 85: vtctldata.GetKeyspaceRequest + (*GetKeyspaceResponse)(nil), // 86: vtctldata.GetKeyspaceResponse + (*GetPermissionsRequest)(nil), // 87: vtctldata.GetPermissionsRequest + (*GetPermissionsResponse)(nil), // 88: vtctldata.GetPermissionsResponse + (*GetKeyspaceRoutingRulesRequest)(nil), // 89: vtctldata.GetKeyspaceRoutingRulesRequest + (*GetKeyspaceRoutingRulesResponse)(nil), // 90: vtctldata.GetKeyspaceRoutingRulesResponse + (*GetRoutingRulesRequest)(nil), // 91: vtctldata.GetRoutingRulesRequest + (*GetRoutingRulesResponse)(nil), // 92: vtctldata.GetRoutingRulesResponse + (*GetSchemaRequest)(nil), // 93: vtctldata.GetSchemaRequest + (*GetSchemaResponse)(nil), // 94: vtctldata.GetSchemaResponse + (*GetSchemaMigrationsRequest)(nil), // 95: vtctldata.GetSchemaMigrationsRequest + (*GetSchemaMigrationsResponse)(nil), // 96: vtctldata.GetSchemaMigrationsResponse + (*GetShardReplicationRequest)(nil), // 97: vtctldata.GetShardReplicationRequest + (*GetShardReplicationResponse)(nil), // 98: vtctldata.GetShardReplicationResponse + (*GetShardRequest)(nil), // 99: vtctldata.GetShardRequest + (*GetShardResponse)(nil), // 100: vtctldata.GetShardResponse + (*GetShardRoutingRulesRequest)(nil), // 101: vtctldata.GetShardRoutingRulesRequest + (*GetShardRoutingRulesResponse)(nil), // 102: vtctldata.GetShardRoutingRulesResponse + (*GetSrvKeyspaceNamesRequest)(nil), // 103: vtctldata.GetSrvKeyspaceNamesRequest + (*GetSrvKeyspaceNamesResponse)(nil), // 104: vtctldata.GetSrvKeyspaceNamesResponse + (*GetSrvKeyspacesRequest)(nil), // 105: vtctldata.GetSrvKeyspacesRequest + (*GetSrvKeyspacesResponse)(nil), // 106: vtctldata.GetSrvKeyspacesResponse + (*UpdateThrottlerConfigRequest)(nil), // 107: vtctldata.UpdateThrottlerConfigRequest + (*UpdateThrottlerConfigResponse)(nil), // 108: vtctldata.UpdateThrottlerConfigResponse + (*GetSrvVSchemaRequest)(nil), // 109: vtctldata.GetSrvVSchemaRequest + (*GetSrvVSchemaResponse)(nil), // 110: vtctldata.GetSrvVSchemaResponse + (*GetSrvVSchemasRequest)(nil), // 111: vtctldata.GetSrvVSchemasRequest + (*GetSrvVSchemasResponse)(nil), // 112: vtctldata.GetSrvVSchemasResponse + (*GetTabletRequest)(nil), // 113: vtctldata.GetTabletRequest + (*GetTabletResponse)(nil), // 114: vtctldata.GetTabletResponse + (*GetTabletsRequest)(nil), // 115: vtctldata.GetTabletsRequest + (*GetTabletsResponse)(nil), // 116: vtctldata.GetTabletsResponse + (*GetThrottlerStatusRequest)(nil), // 117: vtctldata.GetThrottlerStatusRequest + (*GetThrottlerStatusResponse)(nil), // 118: vtctldata.GetThrottlerStatusResponse + (*GetTopologyPathRequest)(nil), // 119: vtctldata.GetTopologyPathRequest + (*GetTopologyPathResponse)(nil), // 120: vtctldata.GetTopologyPathResponse + (*TopologyCell)(nil), // 121: vtctldata.TopologyCell + (*GetUnresolvedTransactionsRequest)(nil), // 122: vtctldata.GetUnresolvedTransactionsRequest + (*GetUnresolvedTransactionsResponse)(nil), // 123: vtctldata.GetUnresolvedTransactionsResponse + (*ConcludeTransactionRequest)(nil), // 124: vtctldata.ConcludeTransactionRequest + (*ConcludeTransactionResponse)(nil), // 125: vtctldata.ConcludeTransactionResponse + (*GetVSchemaRequest)(nil), // 126: vtctldata.GetVSchemaRequest + (*GetVersionRequest)(nil), // 127: vtctldata.GetVersionRequest + (*GetVersionResponse)(nil), // 128: vtctldata.GetVersionResponse + (*GetVSchemaResponse)(nil), // 129: vtctldata.GetVSchemaResponse + (*GetWorkflowsRequest)(nil), // 130: vtctldata.GetWorkflowsRequest + (*GetWorkflowsResponse)(nil), // 131: vtctldata.GetWorkflowsResponse + (*InitShardPrimaryRequest)(nil), // 132: vtctldata.InitShardPrimaryRequest + (*InitShardPrimaryResponse)(nil), // 133: vtctldata.InitShardPrimaryResponse + (*LaunchSchemaMigrationRequest)(nil), // 134: vtctldata.LaunchSchemaMigrationRequest + (*LaunchSchemaMigrationResponse)(nil), // 135: vtctldata.LaunchSchemaMigrationResponse + (*LookupVindexCreateRequest)(nil), // 136: vtctldata.LookupVindexCreateRequest + (*LookupVindexCreateResponse)(nil), // 137: vtctldata.LookupVindexCreateResponse + (*LookupVindexExternalizeRequest)(nil), // 138: vtctldata.LookupVindexExternalizeRequest + (*LookupVindexExternalizeResponse)(nil), // 139: vtctldata.LookupVindexExternalizeResponse + (*MaterializeCreateRequest)(nil), // 140: vtctldata.MaterializeCreateRequest + (*MaterializeCreateResponse)(nil), // 141: vtctldata.MaterializeCreateResponse + (*MigrateCreateRequest)(nil), // 142: vtctldata.MigrateCreateRequest + (*MigrateCompleteRequest)(nil), // 143: vtctldata.MigrateCompleteRequest + (*MigrateCompleteResponse)(nil), // 144: vtctldata.MigrateCompleteResponse + (*MountRegisterRequest)(nil), // 145: vtctldata.MountRegisterRequest + (*MountRegisterResponse)(nil), // 146: vtctldata.MountRegisterResponse + (*MountUnregisterRequest)(nil), // 147: vtctldata.MountUnregisterRequest + (*MountUnregisterResponse)(nil), // 148: vtctldata.MountUnregisterResponse + (*MountShowRequest)(nil), // 149: vtctldata.MountShowRequest + (*MountShowResponse)(nil), // 150: vtctldata.MountShowResponse + (*MountListRequest)(nil), // 151: vtctldata.MountListRequest + (*MountListResponse)(nil), // 152: vtctldata.MountListResponse + (*MoveTablesCreateRequest)(nil), // 153: vtctldata.MoveTablesCreateRequest + (*MoveTablesCreateResponse)(nil), // 154: vtctldata.MoveTablesCreateResponse + (*MoveTablesCompleteRequest)(nil), // 155: vtctldata.MoveTablesCompleteRequest + (*MoveTablesCompleteResponse)(nil), // 156: vtctldata.MoveTablesCompleteResponse + (*PingTabletRequest)(nil), // 157: vtctldata.PingTabletRequest + (*PingTabletResponse)(nil), // 158: vtctldata.PingTabletResponse + (*PlannedReparentShardRequest)(nil), // 159: vtctldata.PlannedReparentShardRequest + (*PlannedReparentShardResponse)(nil), // 160: vtctldata.PlannedReparentShardResponse + (*RebuildKeyspaceGraphRequest)(nil), // 161: vtctldata.RebuildKeyspaceGraphRequest + (*RebuildKeyspaceGraphResponse)(nil), // 162: vtctldata.RebuildKeyspaceGraphResponse + (*RebuildVSchemaGraphRequest)(nil), // 163: vtctldata.RebuildVSchemaGraphRequest + (*RebuildVSchemaGraphResponse)(nil), // 164: vtctldata.RebuildVSchemaGraphResponse + (*RefreshStateRequest)(nil), // 165: vtctldata.RefreshStateRequest + (*RefreshStateResponse)(nil), // 166: vtctldata.RefreshStateResponse + (*RefreshStateByShardRequest)(nil), // 167: vtctldata.RefreshStateByShardRequest + (*RefreshStateByShardResponse)(nil), // 168: vtctldata.RefreshStateByShardResponse + (*ReloadSchemaRequest)(nil), // 169: vtctldata.ReloadSchemaRequest + (*ReloadSchemaResponse)(nil), // 170: vtctldata.ReloadSchemaResponse + (*ReloadSchemaKeyspaceRequest)(nil), // 171: vtctldata.ReloadSchemaKeyspaceRequest + (*ReloadSchemaKeyspaceResponse)(nil), // 172: vtctldata.ReloadSchemaKeyspaceResponse + (*ReloadSchemaShardRequest)(nil), // 173: vtctldata.ReloadSchemaShardRequest + (*ReloadSchemaShardResponse)(nil), // 174: vtctldata.ReloadSchemaShardResponse + (*RemoveBackupRequest)(nil), // 175: vtctldata.RemoveBackupRequest + (*RemoveBackupResponse)(nil), // 176: vtctldata.RemoveBackupResponse + (*RemoveKeyspaceCellRequest)(nil), // 177: vtctldata.RemoveKeyspaceCellRequest + (*RemoveKeyspaceCellResponse)(nil), // 178: vtctldata.RemoveKeyspaceCellResponse + (*RemoveShardCellRequest)(nil), // 179: vtctldata.RemoveShardCellRequest + (*RemoveShardCellResponse)(nil), // 180: vtctldata.RemoveShardCellResponse + (*ReparentTabletRequest)(nil), // 181: vtctldata.ReparentTabletRequest + (*ReparentTabletResponse)(nil), // 182: vtctldata.ReparentTabletResponse + (*ReshardCreateRequest)(nil), // 183: vtctldata.ReshardCreateRequest + (*RestoreFromBackupRequest)(nil), // 184: vtctldata.RestoreFromBackupRequest + (*RestoreFromBackupResponse)(nil), // 185: vtctldata.RestoreFromBackupResponse + (*RetrySchemaMigrationRequest)(nil), // 186: vtctldata.RetrySchemaMigrationRequest + (*RetrySchemaMigrationResponse)(nil), // 187: vtctldata.RetrySchemaMigrationResponse + (*RunHealthCheckRequest)(nil), // 188: vtctldata.RunHealthCheckRequest + (*RunHealthCheckResponse)(nil), // 189: vtctldata.RunHealthCheckResponse + (*SetKeyspaceDurabilityPolicyRequest)(nil), // 190: vtctldata.SetKeyspaceDurabilityPolicyRequest + (*SetKeyspaceDurabilityPolicyResponse)(nil), // 191: vtctldata.SetKeyspaceDurabilityPolicyResponse + (*SetKeyspaceShardingInfoRequest)(nil), // 192: vtctldata.SetKeyspaceShardingInfoRequest + (*SetKeyspaceShardingInfoResponse)(nil), // 193: vtctldata.SetKeyspaceShardingInfoResponse + (*SetShardIsPrimaryServingRequest)(nil), // 194: vtctldata.SetShardIsPrimaryServingRequest + (*SetShardIsPrimaryServingResponse)(nil), // 195: vtctldata.SetShardIsPrimaryServingResponse + (*SetShardTabletControlRequest)(nil), // 196: vtctldata.SetShardTabletControlRequest + (*SetShardTabletControlResponse)(nil), // 197: vtctldata.SetShardTabletControlResponse + (*SetWritableRequest)(nil), // 198: vtctldata.SetWritableRequest + (*SetWritableResponse)(nil), // 199: vtctldata.SetWritableResponse + (*ShardReplicationAddRequest)(nil), // 200: vtctldata.ShardReplicationAddRequest + (*ShardReplicationAddResponse)(nil), // 201: vtctldata.ShardReplicationAddResponse + (*ShardReplicationFixRequest)(nil), // 202: vtctldata.ShardReplicationFixRequest + (*ShardReplicationFixResponse)(nil), // 203: vtctldata.ShardReplicationFixResponse + (*ShardReplicationPositionsRequest)(nil), // 204: vtctldata.ShardReplicationPositionsRequest + (*ShardReplicationPositionsResponse)(nil), // 205: vtctldata.ShardReplicationPositionsResponse + (*ShardReplicationRemoveRequest)(nil), // 206: vtctldata.ShardReplicationRemoveRequest + (*ShardReplicationRemoveResponse)(nil), // 207: vtctldata.ShardReplicationRemoveResponse + (*SleepTabletRequest)(nil), // 208: vtctldata.SleepTabletRequest + (*SleepTabletResponse)(nil), // 209: vtctldata.SleepTabletResponse + (*SourceShardAddRequest)(nil), // 210: vtctldata.SourceShardAddRequest + (*SourceShardAddResponse)(nil), // 211: vtctldata.SourceShardAddResponse + (*SourceShardDeleteRequest)(nil), // 212: vtctldata.SourceShardDeleteRequest + (*SourceShardDeleteResponse)(nil), // 213: vtctldata.SourceShardDeleteResponse + (*StartReplicationRequest)(nil), // 214: vtctldata.StartReplicationRequest + (*StartReplicationResponse)(nil), // 215: vtctldata.StartReplicationResponse + (*StopReplicationRequest)(nil), // 216: vtctldata.StopReplicationRequest + (*StopReplicationResponse)(nil), // 217: vtctldata.StopReplicationResponse + (*TabletExternallyReparentedRequest)(nil), // 218: vtctldata.TabletExternallyReparentedRequest + (*TabletExternallyReparentedResponse)(nil), // 219: vtctldata.TabletExternallyReparentedResponse + (*UpdateCellInfoRequest)(nil), // 220: vtctldata.UpdateCellInfoRequest + (*UpdateCellInfoResponse)(nil), // 221: vtctldata.UpdateCellInfoResponse + (*UpdateCellsAliasRequest)(nil), // 222: vtctldata.UpdateCellsAliasRequest + (*UpdateCellsAliasResponse)(nil), // 223: vtctldata.UpdateCellsAliasResponse + (*ValidateRequest)(nil), // 224: vtctldata.ValidateRequest + (*ValidateResponse)(nil), // 225: vtctldata.ValidateResponse + (*ValidateKeyspaceRequest)(nil), // 226: vtctldata.ValidateKeyspaceRequest + (*ValidateKeyspaceResponse)(nil), // 227: vtctldata.ValidateKeyspaceResponse + (*ValidateSchemaKeyspaceRequest)(nil), // 228: vtctldata.ValidateSchemaKeyspaceRequest + (*ValidateSchemaKeyspaceResponse)(nil), // 229: vtctldata.ValidateSchemaKeyspaceResponse + (*ValidateShardRequest)(nil), // 230: vtctldata.ValidateShardRequest + (*ValidateShardResponse)(nil), // 231: vtctldata.ValidateShardResponse + (*ValidateVersionKeyspaceRequest)(nil), // 232: vtctldata.ValidateVersionKeyspaceRequest + (*ValidateVersionKeyspaceResponse)(nil), // 233: vtctldata.ValidateVersionKeyspaceResponse + (*ValidateVersionShardRequest)(nil), // 234: vtctldata.ValidateVersionShardRequest + (*ValidateVersionShardResponse)(nil), // 235: vtctldata.ValidateVersionShardResponse + (*ValidateVSchemaRequest)(nil), // 236: vtctldata.ValidateVSchemaRequest + (*ValidateVSchemaResponse)(nil), // 237: vtctldata.ValidateVSchemaResponse + (*VDiffCreateRequest)(nil), // 238: vtctldata.VDiffCreateRequest + (*VDiffCreateResponse)(nil), // 239: vtctldata.VDiffCreateResponse + (*VDiffDeleteRequest)(nil), // 240: vtctldata.VDiffDeleteRequest + (*VDiffDeleteResponse)(nil), // 241: vtctldata.VDiffDeleteResponse + (*VDiffResumeRequest)(nil), // 242: vtctldata.VDiffResumeRequest + (*VDiffResumeResponse)(nil), // 243: vtctldata.VDiffResumeResponse + (*VDiffShowRequest)(nil), // 244: vtctldata.VDiffShowRequest + (*VDiffShowResponse)(nil), // 245: vtctldata.VDiffShowResponse + (*VDiffStopRequest)(nil), // 246: vtctldata.VDiffStopRequest + (*VDiffStopResponse)(nil), // 247: vtctldata.VDiffStopResponse + (*WorkflowDeleteRequest)(nil), // 248: vtctldata.WorkflowDeleteRequest + (*WorkflowDeleteResponse)(nil), // 249: vtctldata.WorkflowDeleteResponse + (*WorkflowStatusRequest)(nil), // 250: vtctldata.WorkflowStatusRequest + (*WorkflowStatusResponse)(nil), // 251: vtctldata.WorkflowStatusResponse + (*WorkflowSwitchTrafficRequest)(nil), // 252: vtctldata.WorkflowSwitchTrafficRequest + (*WorkflowSwitchTrafficResponse)(nil), // 253: vtctldata.WorkflowSwitchTrafficResponse + (*WorkflowUpdateRequest)(nil), // 254: vtctldata.WorkflowUpdateRequest + (*WorkflowUpdateResponse)(nil), // 255: vtctldata.WorkflowUpdateResponse + (*GetMirrorRulesRequest)(nil), // 256: vtctldata.GetMirrorRulesRequest + (*GetMirrorRulesResponse)(nil), // 257: vtctldata.GetMirrorRulesResponse + (*WorkflowMirrorTrafficRequest)(nil), // 258: vtctldata.WorkflowMirrorTrafficRequest + (*WorkflowMirrorTrafficResponse)(nil), // 259: vtctldata.WorkflowMirrorTrafficResponse + nil, // 260: vtctldata.WorkflowOptions.ConfigEntry + nil, // 261: vtctldata.Workflow.ShardStreamsEntry + (*Workflow_ReplicationLocation)(nil), // 262: vtctldata.Workflow.ReplicationLocation + (*Workflow_ShardStream)(nil), // 263: vtctldata.Workflow.ShardStream + (*Workflow_Stream)(nil), // 264: vtctldata.Workflow.Stream + (*Workflow_Stream_CopyState)(nil), // 265: vtctldata.Workflow.Stream.CopyState + (*Workflow_Stream_Log)(nil), // 266: vtctldata.Workflow.Stream.Log + (*Workflow_Stream_ThrottlerStatus)(nil), // 267: vtctldata.Workflow.Stream.ThrottlerStatus + nil, // 268: vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry + nil, // 269: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry + (*ApplyVSchemaResponse_ParamList)(nil), // 270: vtctldata.ApplyVSchemaResponse.ParamList + nil, // 271: vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 272: vtctldata.ChangeTabletTagsRequest.TagsEntry + nil, // 273: vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry + nil, // 274: vtctldata.ChangeTabletTagsResponse.AfterTagsEntry + nil, // 275: vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 276: vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 277: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry + nil, // 278: vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 279: vtctldata.GetCellsAliasesResponse.AliasesEntry + nil, // 280: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry + nil, // 281: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry + (*GetSrvKeyspaceNamesResponse_NameList)(nil), // 282: vtctldata.GetSrvKeyspaceNamesResponse.NameList + nil, // 283: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry + nil, // 284: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry + nil, // 285: vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry + (*MoveTablesCreateResponse_TabletInfo)(nil), // 286: vtctldata.MoveTablesCreateResponse.TabletInfo + nil, // 287: vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry + nil, // 288: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry + nil, // 289: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry + nil, // 290: vtctldata.ValidateResponse.ResultsByKeyspaceEntry + nil, // 291: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry + nil, // 292: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry + nil, // 293: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry + nil, // 294: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry + nil, // 295: vtctldata.VDiffShowResponse.TabletResponsesEntry + (*WorkflowDeleteResponse_TabletInfo)(nil), // 296: vtctldata.WorkflowDeleteResponse.TabletInfo + (*WorkflowStatusResponse_TableCopyState)(nil), // 297: vtctldata.WorkflowStatusResponse.TableCopyState + (*WorkflowStatusResponse_ShardStreamState)(nil), // 298: vtctldata.WorkflowStatusResponse.ShardStreamState + (*WorkflowStatusResponse_ShardStreams)(nil), // 299: vtctldata.WorkflowStatusResponse.ShardStreams + nil, // 300: vtctldata.WorkflowStatusResponse.TableCopyStateEntry + nil, // 301: vtctldata.WorkflowStatusResponse.ShardStreamsEntry + (*WorkflowUpdateResponse_TabletInfo)(nil), // 302: vtctldata.WorkflowUpdateResponse.TabletInfo + (*logutil.Event)(nil), // 303: logutil.Event + (tabletmanagerdata.TabletSelectionPreference)(0), // 304: tabletmanagerdata.TabletSelectionPreference + (*topodata.Keyspace)(nil), // 305: topodata.Keyspace + (*vttime.Time)(nil), // 306: vttime.Time + (*topodata.TabletAlias)(nil), // 307: topodata.TabletAlias + (*vttime.Duration)(nil), // 308: vttime.Duration + (*topodata.Shard)(nil), // 309: topodata.Shard + (*topodata.CellInfo)(nil), // 310: topodata.CellInfo + (*vschema.KeyspaceRoutingRules)(nil), // 311: vschema.KeyspaceRoutingRules + (*vschema.RoutingRules)(nil), // 312: vschema.RoutingRules + (*vschema.ShardRoutingRules)(nil), // 313: vschema.ShardRoutingRules + (*vtrpc.CallerID)(nil), // 314: vtrpc.CallerID + (*vschema.Keyspace)(nil), // 315: vschema.Keyspace + (topodata.TabletType)(0), // 316: topodata.TabletType + (*topodata.Tablet)(nil), // 317: topodata.Tablet + (*tabletmanagerdata.CheckThrottlerResponse)(nil), // 318: tabletmanagerdata.CheckThrottlerResponse + (topodata.KeyspaceType)(0), // 319: topodata.KeyspaceType + (*query.QueryResult)(nil), // 320: query.QueryResult + (*tabletmanagerdata.ExecuteHookRequest)(nil), // 321: tabletmanagerdata.ExecuteHookRequest + (*tabletmanagerdata.ExecuteHookResponse)(nil), // 322: tabletmanagerdata.ExecuteHookResponse + (*mysqlctl.BackupInfo)(nil), // 323: mysqlctl.BackupInfo + (*replicationdata.FullStatus)(nil), // 324: replicationdata.FullStatus + (*tabletmanagerdata.Permissions)(nil), // 325: tabletmanagerdata.Permissions + (*tabletmanagerdata.SchemaDefinition)(nil), // 326: tabletmanagerdata.SchemaDefinition + (*topodata.ThrottledAppRule)(nil), // 327: topodata.ThrottledAppRule + (*vschema.SrvVSchema)(nil), // 328: vschema.SrvVSchema + (*tabletmanagerdata.GetThrottlerStatusResponse)(nil), // 329: tabletmanagerdata.GetThrottlerStatusResponse + (*query.TransactionMetadata)(nil), // 330: query.TransactionMetadata + (*query.Target)(nil), // 331: query.Target + (*topodata.ShardReplicationError)(nil), // 332: topodata.ShardReplicationError + (*topodata.KeyRange)(nil), // 333: topodata.KeyRange + (*topodata.CellsAlias)(nil), // 334: topodata.CellsAlias + (*tabletmanagerdata.UpdateVReplicationWorkflowRequest)(nil), // 335: tabletmanagerdata.UpdateVReplicationWorkflowRequest + (*vschema.MirrorRules)(nil), // 336: vschema.MirrorRules + (*topodata.Shard_TabletControl)(nil), // 337: topodata.Shard.TabletControl + (*binlogdata.BinlogSource)(nil), // 338: binlogdata.BinlogSource + (*topodata.ShardReplication)(nil), // 339: topodata.ShardReplication + (*topodata.SrvKeyspace)(nil), // 340: topodata.SrvKeyspace + (*replicationdata.Status)(nil), // 341: replicationdata.Status + (*tabletmanagerdata.VDiffResponse)(nil), // 342: tabletmanagerdata.VDiffResponse } var file_vtctldata_proto_depIdxs = []int32{ - 292, // 0: vtctldata.ExecuteVtctlCommandResponse.event:type_name -> logutil.Event - 6, // 1: vtctldata.MaterializeSettings.table_settings:type_name -> vtctldata.TableMaterializeSettings + 303, // 0: vtctldata.ExecuteVtctlCommandResponse.event:type_name -> logutil.Event + 7, // 1: vtctldata.MaterializeSettings.table_settings:type_name -> vtctldata.TableMaterializeSettings 0, // 2: vtctldata.MaterializeSettings.materialization_intent:type_name -> vtctldata.MaterializationIntent - 293, // 3: vtctldata.MaterializeSettings.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 11, // 4: vtctldata.MaterializeSettings.workflow_options:type_name -> vtctldata.WorkflowOptions - 294, // 5: vtctldata.Keyspace.keyspace:type_name -> topodata.Keyspace - 2, // 6: vtctldata.SchemaMigration.strategy:type_name -> vtctldata.SchemaMigration.Strategy - 295, // 7: vtctldata.SchemaMigration.added_at:type_name -> vttime.Time - 295, // 8: vtctldata.SchemaMigration.requested_at:type_name -> vttime.Time - 295, // 9: vtctldata.SchemaMigration.ready_at:type_name -> vttime.Time - 295, // 10: vtctldata.SchemaMigration.started_at:type_name -> vttime.Time - 295, // 11: vtctldata.SchemaMigration.liveness_timestamp:type_name -> vttime.Time - 295, // 12: vtctldata.SchemaMigration.completed_at:type_name -> vttime.Time - 295, // 13: vtctldata.SchemaMigration.cleaned_up_at:type_name -> vttime.Time - 3, // 14: vtctldata.SchemaMigration.status:type_name -> vtctldata.SchemaMigration.Status - 296, // 15: vtctldata.SchemaMigration.tablet:type_name -> topodata.TabletAlias - 297, // 16: vtctldata.SchemaMigration.artifact_retention:type_name -> vttime.Duration - 295, // 17: vtctldata.SchemaMigration.last_throttled_at:type_name -> vttime.Time - 295, // 18: vtctldata.SchemaMigration.cancelled_at:type_name -> vttime.Time - 295, // 19: vtctldata.SchemaMigration.reviewed_at:type_name -> vttime.Time - 295, // 20: vtctldata.SchemaMigration.ready_to_complete_at:type_name -> vttime.Time - 298, // 21: vtctldata.Shard.shard:type_name -> topodata.Shard - 254, // 22: vtctldata.Workflow.source:type_name -> vtctldata.Workflow.ReplicationLocation - 254, // 23: vtctldata.Workflow.target:type_name -> vtctldata.Workflow.ReplicationLocation - 253, // 24: vtctldata.Workflow.shard_streams:type_name -> vtctldata.Workflow.ShardStreamsEntry - 11, // 25: vtctldata.Workflow.options:type_name -> vtctldata.WorkflowOptions - 299, // 26: vtctldata.AddCellInfoRequest.cell_info:type_name -> topodata.CellInfo - 300, // 27: vtctldata.ApplyKeyspaceRoutingRulesRequest.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 300, // 28: vtctldata.ApplyKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 301, // 29: vtctldata.ApplyRoutingRulesRequest.routing_rules:type_name -> vschema.RoutingRules - 302, // 30: vtctldata.ApplyShardRoutingRulesRequest.shard_routing_rules:type_name -> vschema.ShardRoutingRules - 297, // 31: vtctldata.ApplySchemaRequest.wait_replicas_timeout:type_name -> vttime.Duration - 303, // 32: vtctldata.ApplySchemaRequest.caller_id:type_name -> vtrpc.CallerID - 260, // 33: vtctldata.ApplySchemaResponse.rows_affected_by_shard:type_name -> vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry - 304, // 34: vtctldata.ApplyVSchemaRequest.v_schema:type_name -> vschema.Keyspace - 304, // 35: vtctldata.ApplyVSchemaResponse.v_schema:type_name -> vschema.Keyspace - 261, // 36: vtctldata.ApplyVSchemaResponse.unknown_vindex_params:type_name -> vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry - 296, // 37: vtctldata.BackupRequest.tablet_alias:type_name -> topodata.TabletAlias - 296, // 38: vtctldata.BackupResponse.tablet_alias:type_name -> topodata.TabletAlias - 292, // 39: vtctldata.BackupResponse.event:type_name -> logutil.Event - 263, // 40: vtctldata.CancelSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry - 296, // 41: vtctldata.ChangeTabletTypeRequest.tablet_alias:type_name -> topodata.TabletAlias - 305, // 42: vtctldata.ChangeTabletTypeRequest.db_type:type_name -> topodata.TabletType - 306, // 43: vtctldata.ChangeTabletTypeResponse.before_tablet:type_name -> topodata.Tablet - 306, // 44: vtctldata.ChangeTabletTypeResponse.after_tablet:type_name -> topodata.Tablet - 296, // 45: vtctldata.CheckThrottlerRequest.tablet_alias:type_name -> topodata.TabletAlias - 296, // 46: vtctldata.CheckThrottlerResponse.tablet_alias:type_name -> topodata.TabletAlias - 307, // 47: vtctldata.CheckThrottlerResponse.Check:type_name -> tabletmanagerdata.CheckThrottlerResponse - 264, // 48: vtctldata.CleanupSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry - 265, // 49: vtctldata.CompleteSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry - 308, // 50: vtctldata.CreateKeyspaceRequest.type:type_name -> topodata.KeyspaceType - 295, // 51: vtctldata.CreateKeyspaceRequest.snapshot_time:type_name -> vttime.Time - 8, // 52: vtctldata.CreateKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace - 8, // 53: vtctldata.CreateShardResponse.keyspace:type_name -> vtctldata.Keyspace - 10, // 54: vtctldata.CreateShardResponse.shard:type_name -> vtctldata.Shard - 10, // 55: vtctldata.DeleteShardsRequest.shards:type_name -> vtctldata.Shard - 296, // 56: vtctldata.DeleteTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias - 296, // 57: vtctldata.EmergencyReparentShardRequest.new_primary:type_name -> topodata.TabletAlias - 296, // 58: vtctldata.EmergencyReparentShardRequest.ignore_replicas:type_name -> topodata.TabletAlias - 297, // 59: vtctldata.EmergencyReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration - 296, // 60: vtctldata.EmergencyReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 292, // 61: vtctldata.EmergencyReparentShardResponse.events:type_name -> logutil.Event - 296, // 62: vtctldata.ExecuteFetchAsAppRequest.tablet_alias:type_name -> topodata.TabletAlias - 309, // 63: vtctldata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult - 296, // 64: vtctldata.ExecuteFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias - 309, // 65: vtctldata.ExecuteFetchAsDBAResponse.result:type_name -> query.QueryResult - 296, // 66: vtctldata.ExecuteHookRequest.tablet_alias:type_name -> topodata.TabletAlias - 310, // 67: vtctldata.ExecuteHookRequest.tablet_hook_request:type_name -> tabletmanagerdata.ExecuteHookRequest - 311, // 68: vtctldata.ExecuteHookResponse.hook_result:type_name -> tabletmanagerdata.ExecuteHookResponse - 296, // 69: vtctldata.ExecuteMultiFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias - 309, // 70: vtctldata.ExecuteMultiFetchAsDBAResponse.results:type_name -> query.QueryResult - 266, // 71: vtctldata.FindAllShardsInKeyspaceResponse.shards:type_name -> vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry - 267, // 72: vtctldata.ForceCutOverSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry - 312, // 73: vtctldata.GetBackupsResponse.backups:type_name -> mysqlctl.BackupInfo - 299, // 74: vtctldata.GetCellInfoResponse.cell_info:type_name -> topodata.CellInfo - 268, // 75: vtctldata.GetCellsAliasesResponse.aliases:type_name -> vtctldata.GetCellsAliasesResponse.AliasesEntry - 296, // 76: vtctldata.GetFullStatusRequest.tablet_alias:type_name -> topodata.TabletAlias - 313, // 77: vtctldata.GetFullStatusResponse.status:type_name -> replicationdata.FullStatus - 8, // 78: vtctldata.GetKeyspacesResponse.keyspaces:type_name -> vtctldata.Keyspace - 8, // 79: vtctldata.GetKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace - 296, // 80: vtctldata.GetPermissionsRequest.tablet_alias:type_name -> topodata.TabletAlias - 314, // 81: vtctldata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions - 300, // 82: vtctldata.GetKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules - 301, // 83: vtctldata.GetRoutingRulesResponse.routing_rules:type_name -> vschema.RoutingRules - 296, // 84: vtctldata.GetSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias - 315, // 85: vtctldata.GetSchemaResponse.schema:type_name -> tabletmanagerdata.SchemaDefinition - 3, // 86: vtctldata.GetSchemaMigrationsRequest.status:type_name -> vtctldata.SchemaMigration.Status - 297, // 87: vtctldata.GetSchemaMigrationsRequest.recent:type_name -> vttime.Duration - 1, // 88: vtctldata.GetSchemaMigrationsRequest.order:type_name -> vtctldata.QueryOrdering - 9, // 89: vtctldata.GetSchemaMigrationsResponse.migrations:type_name -> vtctldata.SchemaMigration - 269, // 90: vtctldata.GetShardReplicationResponse.shard_replication_by_cell:type_name -> vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry - 10, // 91: vtctldata.GetShardResponse.shard:type_name -> vtctldata.Shard - 302, // 92: vtctldata.GetShardRoutingRulesResponse.shard_routing_rules:type_name -> vschema.ShardRoutingRules - 270, // 93: vtctldata.GetSrvKeyspaceNamesResponse.names:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry - 272, // 94: vtctldata.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry - 316, // 95: vtctldata.UpdateThrottlerConfigRequest.throttled_app:type_name -> topodata.ThrottledAppRule - 317, // 96: vtctldata.GetSrvVSchemaResponse.srv_v_schema:type_name -> vschema.SrvVSchema - 273, // 97: vtctldata.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry - 296, // 98: vtctldata.GetTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 306, // 99: vtctldata.GetTabletResponse.tablet:type_name -> topodata.Tablet - 296, // 100: vtctldata.GetTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias - 305, // 101: vtctldata.GetTabletsRequest.tablet_type:type_name -> topodata.TabletType - 306, // 102: vtctldata.GetTabletsResponse.tablets:type_name -> topodata.Tablet - 296, // 103: vtctldata.GetThrottlerStatusRequest.tablet_alias:type_name -> topodata.TabletAlias - 318, // 104: vtctldata.GetThrottlerStatusResponse.status:type_name -> tabletmanagerdata.GetThrottlerStatusResponse - 118, // 105: vtctldata.GetTopologyPathResponse.cell:type_name -> vtctldata.TopologyCell - 296, // 106: vtctldata.GetVersionRequest.tablet_alias:type_name -> topodata.TabletAlias - 304, // 107: vtctldata.GetVSchemaResponse.v_schema:type_name -> vschema.Keyspace - 12, // 108: vtctldata.GetWorkflowsResponse.workflows:type_name -> vtctldata.Workflow - 296, // 109: vtctldata.InitShardPrimaryRequest.primary_elect_tablet_alias:type_name -> topodata.TabletAlias - 297, // 110: vtctldata.InitShardPrimaryRequest.wait_replicas_timeout:type_name -> vttime.Duration - 292, // 111: vtctldata.InitShardPrimaryResponse.events:type_name -> logutil.Event - 274, // 112: vtctldata.LaunchSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry - 304, // 113: vtctldata.LookupVindexCreateRequest.vindex:type_name -> vschema.Keyspace - 305, // 114: vtctldata.LookupVindexCreateRequest.tablet_types:type_name -> topodata.TabletType - 293, // 115: vtctldata.LookupVindexCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 7, // 116: vtctldata.MaterializeCreateRequest.settings:type_name -> vtctldata.MaterializeSettings - 305, // 117: vtctldata.MigrateCreateRequest.tablet_types:type_name -> topodata.TabletType - 293, // 118: vtctldata.MigrateCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 305, // 119: vtctldata.MoveTablesCreateRequest.tablet_types:type_name -> topodata.TabletType - 293, // 120: vtctldata.MoveTablesCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 11, // 121: vtctldata.MoveTablesCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions - 275, // 122: vtctldata.MoveTablesCreateResponse.details:type_name -> vtctldata.MoveTablesCreateResponse.TabletInfo - 296, // 123: vtctldata.PingTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 296, // 124: vtctldata.PlannedReparentShardRequest.new_primary:type_name -> topodata.TabletAlias - 296, // 125: vtctldata.PlannedReparentShardRequest.avoid_primary:type_name -> topodata.TabletAlias - 297, // 126: vtctldata.PlannedReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration - 297, // 127: vtctldata.PlannedReparentShardRequest.tolerable_replication_lag:type_name -> vttime.Duration - 296, // 128: vtctldata.PlannedReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias - 292, // 129: vtctldata.PlannedReparentShardResponse.events:type_name -> logutil.Event - 296, // 130: vtctldata.RefreshStateRequest.tablet_alias:type_name -> topodata.TabletAlias - 296, // 131: vtctldata.ReloadSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias - 292, // 132: vtctldata.ReloadSchemaKeyspaceResponse.events:type_name -> logutil.Event - 292, // 133: vtctldata.ReloadSchemaShardResponse.events:type_name -> logutil.Event - 296, // 134: vtctldata.ReparentTabletRequest.tablet:type_name -> topodata.TabletAlias - 296, // 135: vtctldata.ReparentTabletResponse.primary:type_name -> topodata.TabletAlias - 305, // 136: vtctldata.ReshardCreateRequest.tablet_types:type_name -> topodata.TabletType - 293, // 137: vtctldata.ReshardCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 296, // 138: vtctldata.RestoreFromBackupRequest.tablet_alias:type_name -> topodata.TabletAlias - 295, // 139: vtctldata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time - 295, // 140: vtctldata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time - 296, // 141: vtctldata.RestoreFromBackupResponse.tablet_alias:type_name -> topodata.TabletAlias - 292, // 142: vtctldata.RestoreFromBackupResponse.event:type_name -> logutil.Event - 276, // 143: vtctldata.RetrySchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry - 296, // 144: vtctldata.RunHealthCheckRequest.tablet_alias:type_name -> topodata.TabletAlias - 294, // 145: vtctldata.SetKeyspaceDurabilityPolicyResponse.keyspace:type_name -> topodata.Keyspace - 294, // 146: vtctldata.SetKeyspaceShardingInfoResponse.keyspace:type_name -> topodata.Keyspace - 298, // 147: vtctldata.SetShardIsPrimaryServingResponse.shard:type_name -> topodata.Shard - 305, // 148: vtctldata.SetShardTabletControlRequest.tablet_type:type_name -> topodata.TabletType - 298, // 149: vtctldata.SetShardTabletControlResponse.shard:type_name -> topodata.Shard - 296, // 150: vtctldata.SetWritableRequest.tablet_alias:type_name -> topodata.TabletAlias - 296, // 151: vtctldata.ShardReplicationAddRequest.tablet_alias:type_name -> topodata.TabletAlias - 319, // 152: vtctldata.ShardReplicationFixResponse.error:type_name -> topodata.ShardReplicationError - 277, // 153: vtctldata.ShardReplicationPositionsResponse.replication_statuses:type_name -> vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry - 278, // 154: vtctldata.ShardReplicationPositionsResponse.tablet_map:type_name -> vtctldata.ShardReplicationPositionsResponse.TabletMapEntry - 296, // 155: vtctldata.ShardReplicationRemoveRequest.tablet_alias:type_name -> topodata.TabletAlias - 296, // 156: vtctldata.SleepTabletRequest.tablet_alias:type_name -> topodata.TabletAlias - 297, // 157: vtctldata.SleepTabletRequest.duration:type_name -> vttime.Duration - 320, // 158: vtctldata.SourceShardAddRequest.key_range:type_name -> topodata.KeyRange - 298, // 159: vtctldata.SourceShardAddResponse.shard:type_name -> topodata.Shard - 298, // 160: vtctldata.SourceShardDeleteResponse.shard:type_name -> topodata.Shard - 296, // 161: vtctldata.StartReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias - 296, // 162: vtctldata.StopReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias - 296, // 163: vtctldata.TabletExternallyReparentedRequest.tablet:type_name -> topodata.TabletAlias - 296, // 164: vtctldata.TabletExternallyReparentedResponse.new_primary:type_name -> topodata.TabletAlias - 296, // 165: vtctldata.TabletExternallyReparentedResponse.old_primary:type_name -> topodata.TabletAlias - 299, // 166: vtctldata.UpdateCellInfoRequest.cell_info:type_name -> topodata.CellInfo - 299, // 167: vtctldata.UpdateCellInfoResponse.cell_info:type_name -> topodata.CellInfo - 321, // 168: vtctldata.UpdateCellsAliasRequest.cells_alias:type_name -> topodata.CellsAlias - 321, // 169: vtctldata.UpdateCellsAliasResponse.cells_alias:type_name -> topodata.CellsAlias - 279, // 170: vtctldata.ValidateResponse.results_by_keyspace:type_name -> vtctldata.ValidateResponse.ResultsByKeyspaceEntry - 280, // 171: vtctldata.ValidateKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry - 281, // 172: vtctldata.ValidateSchemaKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry - 282, // 173: vtctldata.ValidateVersionKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry - 283, // 174: vtctldata.ValidateVSchemaResponse.results_by_shard:type_name -> vtctldata.ValidateVSchemaResponse.ResultsByShardEntry - 305, // 175: vtctldata.VDiffCreateRequest.tablet_types:type_name -> topodata.TabletType - 293, // 176: vtctldata.VDiffCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 297, // 177: vtctldata.VDiffCreateRequest.filtered_replication_wait_time:type_name -> vttime.Duration - 297, // 178: vtctldata.VDiffCreateRequest.wait_update_interval:type_name -> vttime.Duration - 297, // 179: vtctldata.VDiffCreateRequest.max_diff_duration:type_name -> vttime.Duration - 284, // 180: vtctldata.VDiffShowResponse.tablet_responses:type_name -> vtctldata.VDiffShowResponse.TabletResponsesEntry - 285, // 181: vtctldata.WorkflowDeleteResponse.details:type_name -> vtctldata.WorkflowDeleteResponse.TabletInfo - 289, // 182: vtctldata.WorkflowStatusResponse.table_copy_state:type_name -> vtctldata.WorkflowStatusResponse.TableCopyStateEntry - 290, // 183: vtctldata.WorkflowStatusResponse.shard_streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamsEntry - 305, // 184: vtctldata.WorkflowSwitchTrafficRequest.tablet_types:type_name -> topodata.TabletType - 297, // 185: vtctldata.WorkflowSwitchTrafficRequest.max_replication_lag_allowed:type_name -> vttime.Duration - 297, // 186: vtctldata.WorkflowSwitchTrafficRequest.timeout:type_name -> vttime.Duration - 322, // 187: vtctldata.WorkflowUpdateRequest.tablet_request:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest - 291, // 188: vtctldata.WorkflowUpdateResponse.details:type_name -> vtctldata.WorkflowUpdateResponse.TabletInfo - 323, // 189: vtctldata.GetMirrorRulesResponse.mirror_rules:type_name -> vschema.MirrorRules - 305, // 190: vtctldata.WorkflowMirrorTrafficRequest.tablet_types:type_name -> topodata.TabletType - 255, // 191: vtctldata.Workflow.ShardStreamsEntry.value:type_name -> vtctldata.Workflow.ShardStream - 256, // 192: vtctldata.Workflow.ShardStream.streams:type_name -> vtctldata.Workflow.Stream - 324, // 193: vtctldata.Workflow.ShardStream.tablet_controls:type_name -> topodata.Shard.TabletControl - 296, // 194: vtctldata.Workflow.Stream.tablet:type_name -> topodata.TabletAlias - 325, // 195: vtctldata.Workflow.Stream.binlog_source:type_name -> binlogdata.BinlogSource - 295, // 196: vtctldata.Workflow.Stream.transaction_timestamp:type_name -> vttime.Time - 295, // 197: vtctldata.Workflow.Stream.time_updated:type_name -> vttime.Time - 257, // 198: vtctldata.Workflow.Stream.copy_states:type_name -> vtctldata.Workflow.Stream.CopyState - 258, // 199: vtctldata.Workflow.Stream.logs:type_name -> vtctldata.Workflow.Stream.Log - 259, // 200: vtctldata.Workflow.Stream.throttler_status:type_name -> vtctldata.Workflow.Stream.ThrottlerStatus - 305, // 201: vtctldata.Workflow.Stream.tablet_types:type_name -> topodata.TabletType - 293, // 202: vtctldata.Workflow.Stream.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference - 295, // 203: vtctldata.Workflow.Stream.Log.created_at:type_name -> vttime.Time - 295, // 204: vtctldata.Workflow.Stream.Log.updated_at:type_name -> vttime.Time - 295, // 205: vtctldata.Workflow.Stream.ThrottlerStatus.time_throttled:type_name -> vttime.Time - 262, // 206: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry.value:type_name -> vtctldata.ApplyVSchemaResponse.ParamList - 10, // 207: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry.value:type_name -> vtctldata.Shard - 321, // 208: vtctldata.GetCellsAliasesResponse.AliasesEntry.value:type_name -> topodata.CellsAlias - 326, // 209: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry.value:type_name -> topodata.ShardReplication - 271, // 210: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry.value:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NameList - 327, // 211: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> topodata.SrvKeyspace - 317, // 212: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry.value:type_name -> vschema.SrvVSchema - 296, // 213: vtctldata.MoveTablesCreateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 328, // 214: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry.value:type_name -> replicationdata.Status - 306, // 215: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry.value:type_name -> topodata.Tablet - 220, // 216: vtctldata.ValidateResponse.ResultsByKeyspaceEntry.value:type_name -> vtctldata.ValidateKeyspaceResponse - 224, // 217: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 224, // 218: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 224, // 219: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 224, // 220: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse - 329, // 221: vtctldata.VDiffShowResponse.TabletResponsesEntry.value:type_name -> tabletmanagerdata.VDiffResponse - 296, // 222: vtctldata.WorkflowDeleteResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 296, // 223: vtctldata.WorkflowStatusResponse.ShardStreamState.tablet:type_name -> topodata.TabletAlias - 287, // 224: vtctldata.WorkflowStatusResponse.ShardStreams.streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamState - 286, // 225: vtctldata.WorkflowStatusResponse.TableCopyStateEntry.value:type_name -> vtctldata.WorkflowStatusResponse.TableCopyState - 288, // 226: vtctldata.WorkflowStatusResponse.ShardStreamsEntry.value:type_name -> vtctldata.WorkflowStatusResponse.ShardStreams - 296, // 227: vtctldata.WorkflowUpdateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias - 228, // [228:228] is the sub-list for method output_type - 228, // [228:228] is the sub-list for method input_type - 228, // [228:228] is the sub-list for extension type_name - 228, // [228:228] is the sub-list for extension extendee - 0, // [0:228] is the sub-list for field type_name + 304, // 3: vtctldata.MaterializeSettings.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 12, // 4: vtctldata.MaterializeSettings.workflow_options:type_name -> vtctldata.WorkflowOptions + 305, // 5: vtctldata.Keyspace.keyspace:type_name -> topodata.Keyspace + 3, // 6: vtctldata.SchemaMigration.strategy:type_name -> vtctldata.SchemaMigration.Strategy + 306, // 7: vtctldata.SchemaMigration.added_at:type_name -> vttime.Time + 306, // 8: vtctldata.SchemaMigration.requested_at:type_name -> vttime.Time + 306, // 9: vtctldata.SchemaMigration.ready_at:type_name -> vttime.Time + 306, // 10: vtctldata.SchemaMigration.started_at:type_name -> vttime.Time + 306, // 11: vtctldata.SchemaMigration.liveness_timestamp:type_name -> vttime.Time + 306, // 12: vtctldata.SchemaMigration.completed_at:type_name -> vttime.Time + 306, // 13: vtctldata.SchemaMigration.cleaned_up_at:type_name -> vttime.Time + 4, // 14: vtctldata.SchemaMigration.status:type_name -> vtctldata.SchemaMigration.Status + 307, // 15: vtctldata.SchemaMigration.tablet:type_name -> topodata.TabletAlias + 308, // 16: vtctldata.SchemaMigration.artifact_retention:type_name -> vttime.Duration + 306, // 17: vtctldata.SchemaMigration.last_throttled_at:type_name -> vttime.Time + 306, // 18: vtctldata.SchemaMigration.cancelled_at:type_name -> vttime.Time + 306, // 19: vtctldata.SchemaMigration.reviewed_at:type_name -> vttime.Time + 306, // 20: vtctldata.SchemaMigration.ready_to_complete_at:type_name -> vttime.Time + 309, // 21: vtctldata.Shard.shard:type_name -> topodata.Shard + 2, // 22: vtctldata.WorkflowOptions.sharded_auto_increment_handling:type_name -> vtctldata.ShardedAutoIncrementHandling + 260, // 23: vtctldata.WorkflowOptions.config:type_name -> vtctldata.WorkflowOptions.ConfigEntry + 262, // 24: vtctldata.Workflow.source:type_name -> vtctldata.Workflow.ReplicationLocation + 262, // 25: vtctldata.Workflow.target:type_name -> vtctldata.Workflow.ReplicationLocation + 261, // 26: vtctldata.Workflow.shard_streams:type_name -> vtctldata.Workflow.ShardStreamsEntry + 12, // 27: vtctldata.Workflow.options:type_name -> vtctldata.WorkflowOptions + 310, // 28: vtctldata.AddCellInfoRequest.cell_info:type_name -> topodata.CellInfo + 311, // 29: vtctldata.ApplyKeyspaceRoutingRulesRequest.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 311, // 30: vtctldata.ApplyKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 312, // 31: vtctldata.ApplyRoutingRulesRequest.routing_rules:type_name -> vschema.RoutingRules + 313, // 32: vtctldata.ApplyShardRoutingRulesRequest.shard_routing_rules:type_name -> vschema.ShardRoutingRules + 308, // 33: vtctldata.ApplySchemaRequest.wait_replicas_timeout:type_name -> vttime.Duration + 314, // 34: vtctldata.ApplySchemaRequest.caller_id:type_name -> vtrpc.CallerID + 268, // 35: vtctldata.ApplySchemaResponse.rows_affected_by_shard:type_name -> vtctldata.ApplySchemaResponse.RowsAffectedByShardEntry + 315, // 36: vtctldata.ApplyVSchemaRequest.v_schema:type_name -> vschema.Keyspace + 315, // 37: vtctldata.ApplyVSchemaResponse.v_schema:type_name -> vschema.Keyspace + 269, // 38: vtctldata.ApplyVSchemaResponse.unknown_vindex_params:type_name -> vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry + 307, // 39: vtctldata.BackupRequest.tablet_alias:type_name -> topodata.TabletAlias + 307, // 40: vtctldata.BackupResponse.tablet_alias:type_name -> topodata.TabletAlias + 303, // 41: vtctldata.BackupResponse.event:type_name -> logutil.Event + 271, // 42: vtctldata.CancelSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CancelSchemaMigrationResponse.RowsAffectedByShardEntry + 307, // 43: vtctldata.ChangeTabletTagsRequest.tablet_alias:type_name -> topodata.TabletAlias + 272, // 44: vtctldata.ChangeTabletTagsRequest.tags:type_name -> vtctldata.ChangeTabletTagsRequest.TagsEntry + 273, // 45: vtctldata.ChangeTabletTagsResponse.before_tags:type_name -> vtctldata.ChangeTabletTagsResponse.BeforeTagsEntry + 274, // 46: vtctldata.ChangeTabletTagsResponse.after_tags:type_name -> vtctldata.ChangeTabletTagsResponse.AfterTagsEntry + 307, // 47: vtctldata.ChangeTabletTypeRequest.tablet_alias:type_name -> topodata.TabletAlias + 316, // 48: vtctldata.ChangeTabletTypeRequest.db_type:type_name -> topodata.TabletType + 317, // 49: vtctldata.ChangeTabletTypeResponse.before_tablet:type_name -> topodata.Tablet + 317, // 50: vtctldata.ChangeTabletTypeResponse.after_tablet:type_name -> topodata.Tablet + 307, // 51: vtctldata.CheckThrottlerRequest.tablet_alias:type_name -> topodata.TabletAlias + 307, // 52: vtctldata.CheckThrottlerResponse.tablet_alias:type_name -> topodata.TabletAlias + 318, // 53: vtctldata.CheckThrottlerResponse.Check:type_name -> tabletmanagerdata.CheckThrottlerResponse + 275, // 54: vtctldata.CleanupSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CleanupSchemaMigrationResponse.RowsAffectedByShardEntry + 276, // 55: vtctldata.CompleteSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.CompleteSchemaMigrationResponse.RowsAffectedByShardEntry + 319, // 56: vtctldata.CreateKeyspaceRequest.type:type_name -> topodata.KeyspaceType + 306, // 57: vtctldata.CreateKeyspaceRequest.snapshot_time:type_name -> vttime.Time + 9, // 58: vtctldata.CreateKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace + 9, // 59: vtctldata.CreateShardResponse.keyspace:type_name -> vtctldata.Keyspace + 11, // 60: vtctldata.CreateShardResponse.shard:type_name -> vtctldata.Shard + 11, // 61: vtctldata.DeleteShardsRequest.shards:type_name -> vtctldata.Shard + 307, // 62: vtctldata.DeleteTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias + 307, // 63: vtctldata.EmergencyReparentShardRequest.new_primary:type_name -> topodata.TabletAlias + 307, // 64: vtctldata.EmergencyReparentShardRequest.ignore_replicas:type_name -> topodata.TabletAlias + 308, // 65: vtctldata.EmergencyReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 307, // 66: vtctldata.EmergencyReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias + 307, // 67: vtctldata.EmergencyReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 303, // 68: vtctldata.EmergencyReparentShardResponse.events:type_name -> logutil.Event + 307, // 69: vtctldata.ExecuteFetchAsAppRequest.tablet_alias:type_name -> topodata.TabletAlias + 320, // 70: vtctldata.ExecuteFetchAsAppResponse.result:type_name -> query.QueryResult + 307, // 71: vtctldata.ExecuteFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias + 320, // 72: vtctldata.ExecuteFetchAsDBAResponse.result:type_name -> query.QueryResult + 307, // 73: vtctldata.ExecuteHookRequest.tablet_alias:type_name -> topodata.TabletAlias + 321, // 74: vtctldata.ExecuteHookRequest.tablet_hook_request:type_name -> tabletmanagerdata.ExecuteHookRequest + 322, // 75: vtctldata.ExecuteHookResponse.hook_result:type_name -> tabletmanagerdata.ExecuteHookResponse + 307, // 76: vtctldata.ExecuteMultiFetchAsDBARequest.tablet_alias:type_name -> topodata.TabletAlias + 320, // 77: vtctldata.ExecuteMultiFetchAsDBAResponse.results:type_name -> query.QueryResult + 277, // 78: vtctldata.FindAllShardsInKeyspaceResponse.shards:type_name -> vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry + 278, // 79: vtctldata.ForceCutOverSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.ForceCutOverSchemaMigrationResponse.RowsAffectedByShardEntry + 323, // 80: vtctldata.GetBackupsResponse.backups:type_name -> mysqlctl.BackupInfo + 310, // 81: vtctldata.GetCellInfoResponse.cell_info:type_name -> topodata.CellInfo + 279, // 82: vtctldata.GetCellsAliasesResponse.aliases:type_name -> vtctldata.GetCellsAliasesResponse.AliasesEntry + 307, // 83: vtctldata.GetFullStatusRequest.tablet_alias:type_name -> topodata.TabletAlias + 324, // 84: vtctldata.GetFullStatusResponse.status:type_name -> replicationdata.FullStatus + 9, // 85: vtctldata.GetKeyspacesResponse.keyspaces:type_name -> vtctldata.Keyspace + 9, // 86: vtctldata.GetKeyspaceResponse.keyspace:type_name -> vtctldata.Keyspace + 307, // 87: vtctldata.GetPermissionsRequest.tablet_alias:type_name -> topodata.TabletAlias + 325, // 88: vtctldata.GetPermissionsResponse.permissions:type_name -> tabletmanagerdata.Permissions + 311, // 89: vtctldata.GetKeyspaceRoutingRulesResponse.keyspace_routing_rules:type_name -> vschema.KeyspaceRoutingRules + 312, // 90: vtctldata.GetRoutingRulesResponse.routing_rules:type_name -> vschema.RoutingRules + 307, // 91: vtctldata.GetSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias + 326, // 92: vtctldata.GetSchemaResponse.schema:type_name -> tabletmanagerdata.SchemaDefinition + 4, // 93: vtctldata.GetSchemaMigrationsRequest.status:type_name -> vtctldata.SchemaMigration.Status + 308, // 94: vtctldata.GetSchemaMigrationsRequest.recent:type_name -> vttime.Duration + 1, // 95: vtctldata.GetSchemaMigrationsRequest.order:type_name -> vtctldata.QueryOrdering + 10, // 96: vtctldata.GetSchemaMigrationsResponse.migrations:type_name -> vtctldata.SchemaMigration + 280, // 97: vtctldata.GetShardReplicationResponse.shard_replication_by_cell:type_name -> vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry + 11, // 98: vtctldata.GetShardResponse.shard:type_name -> vtctldata.Shard + 313, // 99: vtctldata.GetShardRoutingRulesResponse.shard_routing_rules:type_name -> vschema.ShardRoutingRules + 281, // 100: vtctldata.GetSrvKeyspaceNamesResponse.names:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry + 283, // 101: vtctldata.GetSrvKeyspacesResponse.srv_keyspaces:type_name -> vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry + 327, // 102: vtctldata.UpdateThrottlerConfigRequest.throttled_app:type_name -> topodata.ThrottledAppRule + 328, // 103: vtctldata.GetSrvVSchemaResponse.srv_v_schema:type_name -> vschema.SrvVSchema + 284, // 104: vtctldata.GetSrvVSchemasResponse.srv_v_schemas:type_name -> vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry + 307, // 105: vtctldata.GetTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 317, // 106: vtctldata.GetTabletResponse.tablet:type_name -> topodata.Tablet + 307, // 107: vtctldata.GetTabletsRequest.tablet_aliases:type_name -> topodata.TabletAlias + 316, // 108: vtctldata.GetTabletsRequest.tablet_type:type_name -> topodata.TabletType + 317, // 109: vtctldata.GetTabletsResponse.tablets:type_name -> topodata.Tablet + 307, // 110: vtctldata.GetThrottlerStatusRequest.tablet_alias:type_name -> topodata.TabletAlias + 329, // 111: vtctldata.GetThrottlerStatusResponse.status:type_name -> tabletmanagerdata.GetThrottlerStatusResponse + 121, // 112: vtctldata.GetTopologyPathResponse.cell:type_name -> vtctldata.TopologyCell + 330, // 113: vtctldata.GetUnresolvedTransactionsResponse.transactions:type_name -> query.TransactionMetadata + 331, // 114: vtctldata.ConcludeTransactionRequest.participants:type_name -> query.Target + 307, // 115: vtctldata.GetVersionRequest.tablet_alias:type_name -> topodata.TabletAlias + 315, // 116: vtctldata.GetVSchemaResponse.v_schema:type_name -> vschema.Keyspace + 13, // 117: vtctldata.GetWorkflowsResponse.workflows:type_name -> vtctldata.Workflow + 307, // 118: vtctldata.InitShardPrimaryRequest.primary_elect_tablet_alias:type_name -> topodata.TabletAlias + 308, // 119: vtctldata.InitShardPrimaryRequest.wait_replicas_timeout:type_name -> vttime.Duration + 303, // 120: vtctldata.InitShardPrimaryResponse.events:type_name -> logutil.Event + 285, // 121: vtctldata.LaunchSchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.LaunchSchemaMigrationResponse.RowsAffectedByShardEntry + 315, // 122: vtctldata.LookupVindexCreateRequest.vindex:type_name -> vschema.Keyspace + 316, // 123: vtctldata.LookupVindexCreateRequest.tablet_types:type_name -> topodata.TabletType + 304, // 124: vtctldata.LookupVindexCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 8, // 125: vtctldata.MaterializeCreateRequest.settings:type_name -> vtctldata.MaterializeSettings + 316, // 126: vtctldata.MigrateCreateRequest.tablet_types:type_name -> topodata.TabletType + 304, // 127: vtctldata.MigrateCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 316, // 128: vtctldata.MoveTablesCreateRequest.tablet_types:type_name -> topodata.TabletType + 304, // 129: vtctldata.MoveTablesCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 12, // 130: vtctldata.MoveTablesCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions + 286, // 131: vtctldata.MoveTablesCreateResponse.details:type_name -> vtctldata.MoveTablesCreateResponse.TabletInfo + 307, // 132: vtctldata.PingTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 307, // 133: vtctldata.PlannedReparentShardRequest.new_primary:type_name -> topodata.TabletAlias + 307, // 134: vtctldata.PlannedReparentShardRequest.avoid_primary:type_name -> topodata.TabletAlias + 308, // 135: vtctldata.PlannedReparentShardRequest.wait_replicas_timeout:type_name -> vttime.Duration + 308, // 136: vtctldata.PlannedReparentShardRequest.tolerable_replication_lag:type_name -> vttime.Duration + 307, // 137: vtctldata.PlannedReparentShardRequest.expected_primary:type_name -> topodata.TabletAlias + 307, // 138: vtctldata.PlannedReparentShardResponse.promoted_primary:type_name -> topodata.TabletAlias + 303, // 139: vtctldata.PlannedReparentShardResponse.events:type_name -> logutil.Event + 307, // 140: vtctldata.RefreshStateRequest.tablet_alias:type_name -> topodata.TabletAlias + 307, // 141: vtctldata.ReloadSchemaRequest.tablet_alias:type_name -> topodata.TabletAlias + 303, // 142: vtctldata.ReloadSchemaKeyspaceResponse.events:type_name -> logutil.Event + 303, // 143: vtctldata.ReloadSchemaShardResponse.events:type_name -> logutil.Event + 307, // 144: vtctldata.ReparentTabletRequest.tablet:type_name -> topodata.TabletAlias + 307, // 145: vtctldata.ReparentTabletResponse.primary:type_name -> topodata.TabletAlias + 316, // 146: vtctldata.ReshardCreateRequest.tablet_types:type_name -> topodata.TabletType + 304, // 147: vtctldata.ReshardCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 12, // 148: vtctldata.ReshardCreateRequest.workflow_options:type_name -> vtctldata.WorkflowOptions + 307, // 149: vtctldata.RestoreFromBackupRequest.tablet_alias:type_name -> topodata.TabletAlias + 306, // 150: vtctldata.RestoreFromBackupRequest.backup_time:type_name -> vttime.Time + 306, // 151: vtctldata.RestoreFromBackupRequest.restore_to_timestamp:type_name -> vttime.Time + 307, // 152: vtctldata.RestoreFromBackupResponse.tablet_alias:type_name -> topodata.TabletAlias + 303, // 153: vtctldata.RestoreFromBackupResponse.event:type_name -> logutil.Event + 287, // 154: vtctldata.RetrySchemaMigrationResponse.rows_affected_by_shard:type_name -> vtctldata.RetrySchemaMigrationResponse.RowsAffectedByShardEntry + 307, // 155: vtctldata.RunHealthCheckRequest.tablet_alias:type_name -> topodata.TabletAlias + 305, // 156: vtctldata.SetKeyspaceDurabilityPolicyResponse.keyspace:type_name -> topodata.Keyspace + 305, // 157: vtctldata.SetKeyspaceShardingInfoResponse.keyspace:type_name -> topodata.Keyspace + 309, // 158: vtctldata.SetShardIsPrimaryServingResponse.shard:type_name -> topodata.Shard + 316, // 159: vtctldata.SetShardTabletControlRequest.tablet_type:type_name -> topodata.TabletType + 309, // 160: vtctldata.SetShardTabletControlResponse.shard:type_name -> topodata.Shard + 307, // 161: vtctldata.SetWritableRequest.tablet_alias:type_name -> topodata.TabletAlias + 307, // 162: vtctldata.ShardReplicationAddRequest.tablet_alias:type_name -> topodata.TabletAlias + 332, // 163: vtctldata.ShardReplicationFixResponse.error:type_name -> topodata.ShardReplicationError + 288, // 164: vtctldata.ShardReplicationPositionsResponse.replication_statuses:type_name -> vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry + 289, // 165: vtctldata.ShardReplicationPositionsResponse.tablet_map:type_name -> vtctldata.ShardReplicationPositionsResponse.TabletMapEntry + 307, // 166: vtctldata.ShardReplicationRemoveRequest.tablet_alias:type_name -> topodata.TabletAlias + 307, // 167: vtctldata.SleepTabletRequest.tablet_alias:type_name -> topodata.TabletAlias + 308, // 168: vtctldata.SleepTabletRequest.duration:type_name -> vttime.Duration + 333, // 169: vtctldata.SourceShardAddRequest.key_range:type_name -> topodata.KeyRange + 309, // 170: vtctldata.SourceShardAddResponse.shard:type_name -> topodata.Shard + 309, // 171: vtctldata.SourceShardDeleteResponse.shard:type_name -> topodata.Shard + 307, // 172: vtctldata.StartReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias + 307, // 173: vtctldata.StopReplicationRequest.tablet_alias:type_name -> topodata.TabletAlias + 307, // 174: vtctldata.TabletExternallyReparentedRequest.tablet:type_name -> topodata.TabletAlias + 307, // 175: vtctldata.TabletExternallyReparentedResponse.new_primary:type_name -> topodata.TabletAlias + 307, // 176: vtctldata.TabletExternallyReparentedResponse.old_primary:type_name -> topodata.TabletAlias + 310, // 177: vtctldata.UpdateCellInfoRequest.cell_info:type_name -> topodata.CellInfo + 310, // 178: vtctldata.UpdateCellInfoResponse.cell_info:type_name -> topodata.CellInfo + 334, // 179: vtctldata.UpdateCellsAliasRequest.cells_alias:type_name -> topodata.CellsAlias + 334, // 180: vtctldata.UpdateCellsAliasResponse.cells_alias:type_name -> topodata.CellsAlias + 290, // 181: vtctldata.ValidateResponse.results_by_keyspace:type_name -> vtctldata.ValidateResponse.ResultsByKeyspaceEntry + 291, // 182: vtctldata.ValidateKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry + 292, // 183: vtctldata.ValidateSchemaKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry + 293, // 184: vtctldata.ValidateVersionKeyspaceResponse.results_by_shard:type_name -> vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry + 294, // 185: vtctldata.ValidateVSchemaResponse.results_by_shard:type_name -> vtctldata.ValidateVSchemaResponse.ResultsByShardEntry + 316, // 186: vtctldata.VDiffCreateRequest.tablet_types:type_name -> topodata.TabletType + 304, // 187: vtctldata.VDiffCreateRequest.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 308, // 188: vtctldata.VDiffCreateRequest.filtered_replication_wait_time:type_name -> vttime.Duration + 308, // 189: vtctldata.VDiffCreateRequest.wait_update_interval:type_name -> vttime.Duration + 308, // 190: vtctldata.VDiffCreateRequest.max_diff_duration:type_name -> vttime.Duration + 295, // 191: vtctldata.VDiffShowResponse.tablet_responses:type_name -> vtctldata.VDiffShowResponse.TabletResponsesEntry + 296, // 192: vtctldata.WorkflowDeleteResponse.details:type_name -> vtctldata.WorkflowDeleteResponse.TabletInfo + 300, // 193: vtctldata.WorkflowStatusResponse.table_copy_state:type_name -> vtctldata.WorkflowStatusResponse.TableCopyStateEntry + 301, // 194: vtctldata.WorkflowStatusResponse.shard_streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamsEntry + 316, // 195: vtctldata.WorkflowSwitchTrafficRequest.tablet_types:type_name -> topodata.TabletType + 308, // 196: vtctldata.WorkflowSwitchTrafficRequest.max_replication_lag_allowed:type_name -> vttime.Duration + 308, // 197: vtctldata.WorkflowSwitchTrafficRequest.timeout:type_name -> vttime.Duration + 335, // 198: vtctldata.WorkflowUpdateRequest.tablet_request:type_name -> tabletmanagerdata.UpdateVReplicationWorkflowRequest + 302, // 199: vtctldata.WorkflowUpdateResponse.details:type_name -> vtctldata.WorkflowUpdateResponse.TabletInfo + 336, // 200: vtctldata.GetMirrorRulesResponse.mirror_rules:type_name -> vschema.MirrorRules + 316, // 201: vtctldata.WorkflowMirrorTrafficRequest.tablet_types:type_name -> topodata.TabletType + 263, // 202: vtctldata.Workflow.ShardStreamsEntry.value:type_name -> vtctldata.Workflow.ShardStream + 264, // 203: vtctldata.Workflow.ShardStream.streams:type_name -> vtctldata.Workflow.Stream + 337, // 204: vtctldata.Workflow.ShardStream.tablet_controls:type_name -> topodata.Shard.TabletControl + 307, // 205: vtctldata.Workflow.Stream.tablet:type_name -> topodata.TabletAlias + 338, // 206: vtctldata.Workflow.Stream.binlog_source:type_name -> binlogdata.BinlogSource + 306, // 207: vtctldata.Workflow.Stream.transaction_timestamp:type_name -> vttime.Time + 306, // 208: vtctldata.Workflow.Stream.time_updated:type_name -> vttime.Time + 265, // 209: vtctldata.Workflow.Stream.copy_states:type_name -> vtctldata.Workflow.Stream.CopyState + 266, // 210: vtctldata.Workflow.Stream.logs:type_name -> vtctldata.Workflow.Stream.Log + 267, // 211: vtctldata.Workflow.Stream.throttler_status:type_name -> vtctldata.Workflow.Stream.ThrottlerStatus + 316, // 212: vtctldata.Workflow.Stream.tablet_types:type_name -> topodata.TabletType + 304, // 213: vtctldata.Workflow.Stream.tablet_selection_preference:type_name -> tabletmanagerdata.TabletSelectionPreference + 306, // 214: vtctldata.Workflow.Stream.Log.created_at:type_name -> vttime.Time + 306, // 215: vtctldata.Workflow.Stream.Log.updated_at:type_name -> vttime.Time + 306, // 216: vtctldata.Workflow.Stream.ThrottlerStatus.time_throttled:type_name -> vttime.Time + 270, // 217: vtctldata.ApplyVSchemaResponse.UnknownVindexParamsEntry.value:type_name -> vtctldata.ApplyVSchemaResponse.ParamList + 11, // 218: vtctldata.FindAllShardsInKeyspaceResponse.ShardsEntry.value:type_name -> vtctldata.Shard + 334, // 219: vtctldata.GetCellsAliasesResponse.AliasesEntry.value:type_name -> topodata.CellsAlias + 339, // 220: vtctldata.GetShardReplicationResponse.ShardReplicationByCellEntry.value:type_name -> topodata.ShardReplication + 282, // 221: vtctldata.GetSrvKeyspaceNamesResponse.NamesEntry.value:type_name -> vtctldata.GetSrvKeyspaceNamesResponse.NameList + 340, // 222: vtctldata.GetSrvKeyspacesResponse.SrvKeyspacesEntry.value:type_name -> topodata.SrvKeyspace + 328, // 223: vtctldata.GetSrvVSchemasResponse.SrvVSchemasEntry.value:type_name -> vschema.SrvVSchema + 307, // 224: vtctldata.MoveTablesCreateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 341, // 225: vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry.value:type_name -> replicationdata.Status + 317, // 226: vtctldata.ShardReplicationPositionsResponse.TabletMapEntry.value:type_name -> topodata.Tablet + 227, // 227: vtctldata.ValidateResponse.ResultsByKeyspaceEntry.value:type_name -> vtctldata.ValidateKeyspaceResponse + 231, // 228: vtctldata.ValidateKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 231, // 229: vtctldata.ValidateSchemaKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 231, // 230: vtctldata.ValidateVersionKeyspaceResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 231, // 231: vtctldata.ValidateVSchemaResponse.ResultsByShardEntry.value:type_name -> vtctldata.ValidateShardResponse + 342, // 232: vtctldata.VDiffShowResponse.TabletResponsesEntry.value:type_name -> tabletmanagerdata.VDiffResponse + 307, // 233: vtctldata.WorkflowDeleteResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 307, // 234: vtctldata.WorkflowStatusResponse.ShardStreamState.tablet:type_name -> topodata.TabletAlias + 298, // 235: vtctldata.WorkflowStatusResponse.ShardStreams.streams:type_name -> vtctldata.WorkflowStatusResponse.ShardStreamState + 297, // 236: vtctldata.WorkflowStatusResponse.TableCopyStateEntry.value:type_name -> vtctldata.WorkflowStatusResponse.TableCopyState + 299, // 237: vtctldata.WorkflowStatusResponse.ShardStreamsEntry.value:type_name -> vtctldata.WorkflowStatusResponse.ShardStreams + 307, // 238: vtctldata.WorkflowUpdateResponse.TabletInfo.tablet:type_name -> topodata.TabletAlias + 239, // [239:239] is the sub-list for method output_type + 239, // [239:239] is the sub-list for method input_type + 239, // [239:239] is the sub-list for extension type_name + 239, // [239:239] is the sub-list for extension extendee + 0, // [0:239] is the sub-list for field type_name } func init() { file_vtctldata_proto_init() } @@ -19922,8 +20615,32 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*BackupRequest); i { + file_vtctldata_proto_msgTypes[23].Exporter = func(v any, i int) any { + switch v := v.(*BackupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtctldata_proto_msgTypes[24].Exporter = func(v any, i int) any { + switch v := v.(*BackupResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtctldata_proto_msgTypes[25].Exporter = func(v any, i int) any { + switch v := v.(*BackupShardRequest); i { case 0: return &v.state case 1: @@ -19934,8 +20651,8 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*BackupResponse); i { + file_vtctldata_proto_msgTypes[26].Exporter = func(v any, i int) any { + switch v := v.(*CancelSchemaMigrationRequest); i { case 0: return &v.state case 1: @@ -19946,8 +20663,8 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[25].Exporter = func(v any, i int) any { - switch v := v.(*BackupShardRequest); i { + file_vtctldata_proto_msgTypes[27].Exporter = func(v any, i int) any { + switch v := v.(*CancelSchemaMigrationResponse); i { case 0: return &v.state case 1: @@ -19958,8 +20675,8 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[26].Exporter = func(v any, i int) any { - switch v := v.(*CancelSchemaMigrationRequest); i { + file_vtctldata_proto_msgTypes[28].Exporter = func(v any, i int) any { + switch v := v.(*ChangeTabletTagsRequest); i { case 0: return &v.state case 1: @@ -19970,8 +20687,8 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[27].Exporter = func(v any, i int) any { - switch v := v.(*CancelSchemaMigrationResponse); i { + file_vtctldata_proto_msgTypes[29].Exporter = func(v any, i int) any { + switch v := v.(*ChangeTabletTagsResponse); i { case 0: return &v.state case 1: @@ -19982,7 +20699,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[28].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[30].Exporter = func(v any, i int) any { switch v := v.(*ChangeTabletTypeRequest); i { case 0: return &v.state @@ -19994,7 +20711,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[29].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[31].Exporter = func(v any, i int) any { switch v := v.(*ChangeTabletTypeResponse); i { case 0: return &v.state @@ -20006,7 +20723,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[30].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[32].Exporter = func(v any, i int) any { switch v := v.(*CheckThrottlerRequest); i { case 0: return &v.state @@ -20018,7 +20735,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[31].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[33].Exporter = func(v any, i int) any { switch v := v.(*CheckThrottlerResponse); i { case 0: return &v.state @@ -20030,7 +20747,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[32].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[34].Exporter = func(v any, i int) any { switch v := v.(*CleanupSchemaMigrationRequest); i { case 0: return &v.state @@ -20042,7 +20759,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[33].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[35].Exporter = func(v any, i int) any { switch v := v.(*CleanupSchemaMigrationResponse); i { case 0: return &v.state @@ -20054,7 +20771,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[34].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[36].Exporter = func(v any, i int) any { switch v := v.(*CompleteSchemaMigrationRequest); i { case 0: return &v.state @@ -20066,7 +20783,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[35].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[37].Exporter = func(v any, i int) any { switch v := v.(*CompleteSchemaMigrationResponse); i { case 0: return &v.state @@ -20078,7 +20795,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[36].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[38].Exporter = func(v any, i int) any { switch v := v.(*CreateKeyspaceRequest); i { case 0: return &v.state @@ -20090,7 +20807,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[37].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[39].Exporter = func(v any, i int) any { switch v := v.(*CreateKeyspaceResponse); i { case 0: return &v.state @@ -20102,7 +20819,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[38].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[40].Exporter = func(v any, i int) any { switch v := v.(*CreateShardRequest); i { case 0: return &v.state @@ -20114,7 +20831,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[39].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[41].Exporter = func(v any, i int) any { switch v := v.(*CreateShardResponse); i { case 0: return &v.state @@ -20126,7 +20843,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[40].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[42].Exporter = func(v any, i int) any { switch v := v.(*DeleteCellInfoRequest); i { case 0: return &v.state @@ -20138,7 +20855,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[41].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[43].Exporter = func(v any, i int) any { switch v := v.(*DeleteCellInfoResponse); i { case 0: return &v.state @@ -20150,7 +20867,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[42].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[44].Exporter = func(v any, i int) any { switch v := v.(*DeleteCellsAliasRequest); i { case 0: return &v.state @@ -20162,7 +20879,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[43].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[45].Exporter = func(v any, i int) any { switch v := v.(*DeleteCellsAliasResponse); i { case 0: return &v.state @@ -20174,7 +20891,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[44].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[46].Exporter = func(v any, i int) any { switch v := v.(*DeleteKeyspaceRequest); i { case 0: return &v.state @@ -20186,7 +20903,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[45].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[47].Exporter = func(v any, i int) any { switch v := v.(*DeleteKeyspaceResponse); i { case 0: return &v.state @@ -20198,7 +20915,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[46].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[48].Exporter = func(v any, i int) any { switch v := v.(*DeleteShardsRequest); i { case 0: return &v.state @@ -20210,7 +20927,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[47].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[49].Exporter = func(v any, i int) any { switch v := v.(*DeleteShardsResponse); i { case 0: return &v.state @@ -20222,7 +20939,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[48].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[50].Exporter = func(v any, i int) any { switch v := v.(*DeleteSrvVSchemaRequest); i { case 0: return &v.state @@ -20234,7 +20951,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[49].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[51].Exporter = func(v any, i int) any { switch v := v.(*DeleteSrvVSchemaResponse); i { case 0: return &v.state @@ -20246,7 +20963,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[50].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[52].Exporter = func(v any, i int) any { switch v := v.(*DeleteTabletsRequest); i { case 0: return &v.state @@ -20258,7 +20975,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[51].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[53].Exporter = func(v any, i int) any { switch v := v.(*DeleteTabletsResponse); i { case 0: return &v.state @@ -20270,7 +20987,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[52].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[54].Exporter = func(v any, i int) any { switch v := v.(*EmergencyReparentShardRequest); i { case 0: return &v.state @@ -20282,7 +20999,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[53].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[55].Exporter = func(v any, i int) any { switch v := v.(*EmergencyReparentShardResponse); i { case 0: return &v.state @@ -20294,7 +21011,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[54].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[56].Exporter = func(v any, i int) any { switch v := v.(*ExecuteFetchAsAppRequest); i { case 0: return &v.state @@ -20306,7 +21023,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[55].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[57].Exporter = func(v any, i int) any { switch v := v.(*ExecuteFetchAsAppResponse); i { case 0: return &v.state @@ -20318,7 +21035,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[56].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[58].Exporter = func(v any, i int) any { switch v := v.(*ExecuteFetchAsDBARequest); i { case 0: return &v.state @@ -20330,7 +21047,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[57].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[59].Exporter = func(v any, i int) any { switch v := v.(*ExecuteFetchAsDBAResponse); i { case 0: return &v.state @@ -20342,7 +21059,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[58].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[60].Exporter = func(v any, i int) any { switch v := v.(*ExecuteHookRequest); i { case 0: return &v.state @@ -20354,7 +21071,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[59].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[61].Exporter = func(v any, i int) any { switch v := v.(*ExecuteHookResponse); i { case 0: return &v.state @@ -20366,7 +21083,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[60].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[62].Exporter = func(v any, i int) any { switch v := v.(*ExecuteMultiFetchAsDBARequest); i { case 0: return &v.state @@ -20378,7 +21095,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[61].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[63].Exporter = func(v any, i int) any { switch v := v.(*ExecuteMultiFetchAsDBAResponse); i { case 0: return &v.state @@ -20390,7 +21107,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[62].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[64].Exporter = func(v any, i int) any { switch v := v.(*FindAllShardsInKeyspaceRequest); i { case 0: return &v.state @@ -20402,7 +21119,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[63].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[65].Exporter = func(v any, i int) any { switch v := v.(*FindAllShardsInKeyspaceResponse); i { case 0: return &v.state @@ -20414,7 +21131,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[64].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[66].Exporter = func(v any, i int) any { switch v := v.(*ForceCutOverSchemaMigrationRequest); i { case 0: return &v.state @@ -20426,7 +21143,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[65].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[67].Exporter = func(v any, i int) any { switch v := v.(*ForceCutOverSchemaMigrationResponse); i { case 0: return &v.state @@ -20438,7 +21155,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[66].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[68].Exporter = func(v any, i int) any { switch v := v.(*GetBackupsRequest); i { case 0: return &v.state @@ -20450,7 +21167,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[67].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[69].Exporter = func(v any, i int) any { switch v := v.(*GetBackupsResponse); i { case 0: return &v.state @@ -20462,7 +21179,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[68].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[70].Exporter = func(v any, i int) any { switch v := v.(*GetCellInfoRequest); i { case 0: return &v.state @@ -20474,7 +21191,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[69].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[71].Exporter = func(v any, i int) any { switch v := v.(*GetCellInfoResponse); i { case 0: return &v.state @@ -20486,7 +21203,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[70].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[72].Exporter = func(v any, i int) any { switch v := v.(*GetCellInfoNamesRequest); i { case 0: return &v.state @@ -20498,7 +21215,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[71].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[73].Exporter = func(v any, i int) any { switch v := v.(*GetCellInfoNamesResponse); i { case 0: return &v.state @@ -20510,7 +21227,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[72].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[74].Exporter = func(v any, i int) any { switch v := v.(*GetCellsAliasesRequest); i { case 0: return &v.state @@ -20522,7 +21239,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[73].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[75].Exporter = func(v any, i int) any { switch v := v.(*GetCellsAliasesResponse); i { case 0: return &v.state @@ -20534,7 +21251,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[74].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[76].Exporter = func(v any, i int) any { switch v := v.(*GetFullStatusRequest); i { case 0: return &v.state @@ -20546,7 +21263,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[75].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[77].Exporter = func(v any, i int) any { switch v := v.(*GetFullStatusResponse); i { case 0: return &v.state @@ -20558,7 +21275,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[76].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[78].Exporter = func(v any, i int) any { switch v := v.(*GetKeyspacesRequest); i { case 0: return &v.state @@ -20570,7 +21287,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[77].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[79].Exporter = func(v any, i int) any { switch v := v.(*GetKeyspacesResponse); i { case 0: return &v.state @@ -20582,7 +21299,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[78].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[80].Exporter = func(v any, i int) any { switch v := v.(*GetKeyspaceRequest); i { case 0: return &v.state @@ -20594,7 +21311,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[79].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[81].Exporter = func(v any, i int) any { switch v := v.(*GetKeyspaceResponse); i { case 0: return &v.state @@ -20606,7 +21323,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[80].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[82].Exporter = func(v any, i int) any { switch v := v.(*GetPermissionsRequest); i { case 0: return &v.state @@ -20618,7 +21335,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[81].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[83].Exporter = func(v any, i int) any { switch v := v.(*GetPermissionsResponse); i { case 0: return &v.state @@ -20630,7 +21347,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[82].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[84].Exporter = func(v any, i int) any { switch v := v.(*GetKeyspaceRoutingRulesRequest); i { case 0: return &v.state @@ -20642,7 +21359,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[83].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[85].Exporter = func(v any, i int) any { switch v := v.(*GetKeyspaceRoutingRulesResponse); i { case 0: return &v.state @@ -20654,7 +21371,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[84].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[86].Exporter = func(v any, i int) any { switch v := v.(*GetRoutingRulesRequest); i { case 0: return &v.state @@ -20666,7 +21383,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[85].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[87].Exporter = func(v any, i int) any { switch v := v.(*GetRoutingRulesResponse); i { case 0: return &v.state @@ -20678,7 +21395,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[86].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[88].Exporter = func(v any, i int) any { switch v := v.(*GetSchemaRequest); i { case 0: return &v.state @@ -20690,7 +21407,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[87].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[89].Exporter = func(v any, i int) any { switch v := v.(*GetSchemaResponse); i { case 0: return &v.state @@ -20702,7 +21419,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[88].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[90].Exporter = func(v any, i int) any { switch v := v.(*GetSchemaMigrationsRequest); i { case 0: return &v.state @@ -20714,7 +21431,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[89].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[91].Exporter = func(v any, i int) any { switch v := v.(*GetSchemaMigrationsResponse); i { case 0: return &v.state @@ -20726,7 +21443,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[90].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[92].Exporter = func(v any, i int) any { switch v := v.(*GetShardReplicationRequest); i { case 0: return &v.state @@ -20738,7 +21455,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[91].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[93].Exporter = func(v any, i int) any { switch v := v.(*GetShardReplicationResponse); i { case 0: return &v.state @@ -20750,7 +21467,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[92].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[94].Exporter = func(v any, i int) any { switch v := v.(*GetShardRequest); i { case 0: return &v.state @@ -20762,7 +21479,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[93].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[95].Exporter = func(v any, i int) any { switch v := v.(*GetShardResponse); i { case 0: return &v.state @@ -20774,7 +21491,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[94].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[96].Exporter = func(v any, i int) any { switch v := v.(*GetShardRoutingRulesRequest); i { case 0: return &v.state @@ -20786,7 +21503,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[95].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[97].Exporter = func(v any, i int) any { switch v := v.(*GetShardRoutingRulesResponse); i { case 0: return &v.state @@ -20798,7 +21515,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[96].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[98].Exporter = func(v any, i int) any { switch v := v.(*GetSrvKeyspaceNamesRequest); i { case 0: return &v.state @@ -20810,7 +21527,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[97].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[99].Exporter = func(v any, i int) any { switch v := v.(*GetSrvKeyspaceNamesResponse); i { case 0: return &v.state @@ -20822,7 +21539,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[98].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[100].Exporter = func(v any, i int) any { switch v := v.(*GetSrvKeyspacesRequest); i { case 0: return &v.state @@ -20834,7 +21551,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[99].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[101].Exporter = func(v any, i int) any { switch v := v.(*GetSrvKeyspacesResponse); i { case 0: return &v.state @@ -20846,7 +21563,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[100].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[102].Exporter = func(v any, i int) any { switch v := v.(*UpdateThrottlerConfigRequest); i { case 0: return &v.state @@ -20858,7 +21575,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[101].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[103].Exporter = func(v any, i int) any { switch v := v.(*UpdateThrottlerConfigResponse); i { case 0: return &v.state @@ -20870,7 +21587,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[102].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[104].Exporter = func(v any, i int) any { switch v := v.(*GetSrvVSchemaRequest); i { case 0: return &v.state @@ -20882,7 +21599,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[103].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[105].Exporter = func(v any, i int) any { switch v := v.(*GetSrvVSchemaResponse); i { case 0: return &v.state @@ -20894,7 +21611,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[104].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[106].Exporter = func(v any, i int) any { switch v := v.(*GetSrvVSchemasRequest); i { case 0: return &v.state @@ -20906,7 +21623,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[105].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[107].Exporter = func(v any, i int) any { switch v := v.(*GetSrvVSchemasResponse); i { case 0: return &v.state @@ -20918,7 +21635,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[106].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[108].Exporter = func(v any, i int) any { switch v := v.(*GetTabletRequest); i { case 0: return &v.state @@ -20930,7 +21647,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[107].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[109].Exporter = func(v any, i int) any { switch v := v.(*GetTabletResponse); i { case 0: return &v.state @@ -20942,7 +21659,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[108].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[110].Exporter = func(v any, i int) any { switch v := v.(*GetTabletsRequest); i { case 0: return &v.state @@ -20954,7 +21671,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[109].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[111].Exporter = func(v any, i int) any { switch v := v.(*GetTabletsResponse); i { case 0: return &v.state @@ -20966,7 +21683,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[110].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[112].Exporter = func(v any, i int) any { switch v := v.(*GetThrottlerStatusRequest); i { case 0: return &v.state @@ -20978,7 +21695,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[111].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[113].Exporter = func(v any, i int) any { switch v := v.(*GetThrottlerStatusResponse); i { case 0: return &v.state @@ -20990,7 +21707,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[112].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[114].Exporter = func(v any, i int) any { switch v := v.(*GetTopologyPathRequest); i { case 0: return &v.state @@ -21002,7 +21719,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[113].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[115].Exporter = func(v any, i int) any { switch v := v.(*GetTopologyPathResponse); i { case 0: return &v.state @@ -21014,7 +21731,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[114].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[116].Exporter = func(v any, i int) any { switch v := v.(*TopologyCell); i { case 0: return &v.state @@ -21026,7 +21743,55 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[115].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[117].Exporter = func(v any, i int) any { + switch v := v.(*GetUnresolvedTransactionsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtctldata_proto_msgTypes[118].Exporter = func(v any, i int) any { + switch v := v.(*GetUnresolvedTransactionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtctldata_proto_msgTypes[119].Exporter = func(v any, i int) any { + switch v := v.(*ConcludeTransactionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtctldata_proto_msgTypes[120].Exporter = func(v any, i int) any { + switch v := v.(*ConcludeTransactionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vtctldata_proto_msgTypes[121].Exporter = func(v any, i int) any { switch v := v.(*GetVSchemaRequest); i { case 0: return &v.state @@ -21038,7 +21803,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[116].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[122].Exporter = func(v any, i int) any { switch v := v.(*GetVersionRequest); i { case 0: return &v.state @@ -21050,7 +21815,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[117].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[123].Exporter = func(v any, i int) any { switch v := v.(*GetVersionResponse); i { case 0: return &v.state @@ -21062,7 +21827,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[118].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[124].Exporter = func(v any, i int) any { switch v := v.(*GetVSchemaResponse); i { case 0: return &v.state @@ -21074,7 +21839,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[119].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[125].Exporter = func(v any, i int) any { switch v := v.(*GetWorkflowsRequest); i { case 0: return &v.state @@ -21086,7 +21851,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[120].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[126].Exporter = func(v any, i int) any { switch v := v.(*GetWorkflowsResponse); i { case 0: return &v.state @@ -21098,7 +21863,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[121].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[127].Exporter = func(v any, i int) any { switch v := v.(*InitShardPrimaryRequest); i { case 0: return &v.state @@ -21110,7 +21875,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[122].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[128].Exporter = func(v any, i int) any { switch v := v.(*InitShardPrimaryResponse); i { case 0: return &v.state @@ -21122,7 +21887,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[123].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[129].Exporter = func(v any, i int) any { switch v := v.(*LaunchSchemaMigrationRequest); i { case 0: return &v.state @@ -21134,7 +21899,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[124].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[130].Exporter = func(v any, i int) any { switch v := v.(*LaunchSchemaMigrationResponse); i { case 0: return &v.state @@ -21146,7 +21911,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[125].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[131].Exporter = func(v any, i int) any { switch v := v.(*LookupVindexCreateRequest); i { case 0: return &v.state @@ -21158,7 +21923,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[126].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[132].Exporter = func(v any, i int) any { switch v := v.(*LookupVindexCreateResponse); i { case 0: return &v.state @@ -21170,7 +21935,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[127].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[133].Exporter = func(v any, i int) any { switch v := v.(*LookupVindexExternalizeRequest); i { case 0: return &v.state @@ -21182,7 +21947,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[128].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[134].Exporter = func(v any, i int) any { switch v := v.(*LookupVindexExternalizeResponse); i { case 0: return &v.state @@ -21194,7 +21959,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[129].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[135].Exporter = func(v any, i int) any { switch v := v.(*MaterializeCreateRequest); i { case 0: return &v.state @@ -21206,7 +21971,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[130].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[136].Exporter = func(v any, i int) any { switch v := v.(*MaterializeCreateResponse); i { case 0: return &v.state @@ -21218,7 +21983,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[131].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[137].Exporter = func(v any, i int) any { switch v := v.(*MigrateCreateRequest); i { case 0: return &v.state @@ -21230,7 +21995,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[132].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[138].Exporter = func(v any, i int) any { switch v := v.(*MigrateCompleteRequest); i { case 0: return &v.state @@ -21242,7 +22007,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[133].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[139].Exporter = func(v any, i int) any { switch v := v.(*MigrateCompleteResponse); i { case 0: return &v.state @@ -21254,7 +22019,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[134].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[140].Exporter = func(v any, i int) any { switch v := v.(*MountRegisterRequest); i { case 0: return &v.state @@ -21266,7 +22031,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[135].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[141].Exporter = func(v any, i int) any { switch v := v.(*MountRegisterResponse); i { case 0: return &v.state @@ -21278,7 +22043,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[136].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[142].Exporter = func(v any, i int) any { switch v := v.(*MountUnregisterRequest); i { case 0: return &v.state @@ -21290,7 +22055,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[137].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[143].Exporter = func(v any, i int) any { switch v := v.(*MountUnregisterResponse); i { case 0: return &v.state @@ -21302,7 +22067,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[138].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[144].Exporter = func(v any, i int) any { switch v := v.(*MountShowRequest); i { case 0: return &v.state @@ -21314,7 +22079,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[139].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[145].Exporter = func(v any, i int) any { switch v := v.(*MountShowResponse); i { case 0: return &v.state @@ -21326,7 +22091,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[140].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[146].Exporter = func(v any, i int) any { switch v := v.(*MountListRequest); i { case 0: return &v.state @@ -21338,7 +22103,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[141].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[147].Exporter = func(v any, i int) any { switch v := v.(*MountListResponse); i { case 0: return &v.state @@ -21350,7 +22115,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[142].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[148].Exporter = func(v any, i int) any { switch v := v.(*MoveTablesCreateRequest); i { case 0: return &v.state @@ -21362,7 +22127,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[143].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[149].Exporter = func(v any, i int) any { switch v := v.(*MoveTablesCreateResponse); i { case 0: return &v.state @@ -21374,7 +22139,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[144].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[150].Exporter = func(v any, i int) any { switch v := v.(*MoveTablesCompleteRequest); i { case 0: return &v.state @@ -21386,7 +22151,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[145].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[151].Exporter = func(v any, i int) any { switch v := v.(*MoveTablesCompleteResponse); i { case 0: return &v.state @@ -21398,7 +22163,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[146].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[152].Exporter = func(v any, i int) any { switch v := v.(*PingTabletRequest); i { case 0: return &v.state @@ -21410,7 +22175,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[147].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[153].Exporter = func(v any, i int) any { switch v := v.(*PingTabletResponse); i { case 0: return &v.state @@ -21422,7 +22187,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[148].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[154].Exporter = func(v any, i int) any { switch v := v.(*PlannedReparentShardRequest); i { case 0: return &v.state @@ -21434,7 +22199,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[149].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[155].Exporter = func(v any, i int) any { switch v := v.(*PlannedReparentShardResponse); i { case 0: return &v.state @@ -21446,7 +22211,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[150].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[156].Exporter = func(v any, i int) any { switch v := v.(*RebuildKeyspaceGraphRequest); i { case 0: return &v.state @@ -21458,7 +22223,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[151].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[157].Exporter = func(v any, i int) any { switch v := v.(*RebuildKeyspaceGraphResponse); i { case 0: return &v.state @@ -21470,7 +22235,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[152].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[158].Exporter = func(v any, i int) any { switch v := v.(*RebuildVSchemaGraphRequest); i { case 0: return &v.state @@ -21482,7 +22247,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[153].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[159].Exporter = func(v any, i int) any { switch v := v.(*RebuildVSchemaGraphResponse); i { case 0: return &v.state @@ -21494,7 +22259,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[154].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[160].Exporter = func(v any, i int) any { switch v := v.(*RefreshStateRequest); i { case 0: return &v.state @@ -21506,7 +22271,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[155].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[161].Exporter = func(v any, i int) any { switch v := v.(*RefreshStateResponse); i { case 0: return &v.state @@ -21518,7 +22283,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[156].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[162].Exporter = func(v any, i int) any { switch v := v.(*RefreshStateByShardRequest); i { case 0: return &v.state @@ -21530,7 +22295,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[157].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[163].Exporter = func(v any, i int) any { switch v := v.(*RefreshStateByShardResponse); i { case 0: return &v.state @@ -21542,7 +22307,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[158].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[164].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemaRequest); i { case 0: return &v.state @@ -21554,7 +22319,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[159].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[165].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemaResponse); i { case 0: return &v.state @@ -21566,7 +22331,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[160].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[166].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemaKeyspaceRequest); i { case 0: return &v.state @@ -21578,7 +22343,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[161].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[167].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemaKeyspaceResponse); i { case 0: return &v.state @@ -21590,7 +22355,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[162].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[168].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemaShardRequest); i { case 0: return &v.state @@ -21602,7 +22367,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[163].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[169].Exporter = func(v any, i int) any { switch v := v.(*ReloadSchemaShardResponse); i { case 0: return &v.state @@ -21614,7 +22379,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[164].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[170].Exporter = func(v any, i int) any { switch v := v.(*RemoveBackupRequest); i { case 0: return &v.state @@ -21626,7 +22391,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[165].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[171].Exporter = func(v any, i int) any { switch v := v.(*RemoveBackupResponse); i { case 0: return &v.state @@ -21638,7 +22403,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[166].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[172].Exporter = func(v any, i int) any { switch v := v.(*RemoveKeyspaceCellRequest); i { case 0: return &v.state @@ -21650,7 +22415,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[167].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[173].Exporter = func(v any, i int) any { switch v := v.(*RemoveKeyspaceCellResponse); i { case 0: return &v.state @@ -21662,7 +22427,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[168].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[174].Exporter = func(v any, i int) any { switch v := v.(*RemoveShardCellRequest); i { case 0: return &v.state @@ -21674,7 +22439,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[169].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[175].Exporter = func(v any, i int) any { switch v := v.(*RemoveShardCellResponse); i { case 0: return &v.state @@ -21686,7 +22451,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[170].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[176].Exporter = func(v any, i int) any { switch v := v.(*ReparentTabletRequest); i { case 0: return &v.state @@ -21698,7 +22463,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[171].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[177].Exporter = func(v any, i int) any { switch v := v.(*ReparentTabletResponse); i { case 0: return &v.state @@ -21710,7 +22475,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[172].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[178].Exporter = func(v any, i int) any { switch v := v.(*ReshardCreateRequest); i { case 0: return &v.state @@ -21722,7 +22487,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[173].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[179].Exporter = func(v any, i int) any { switch v := v.(*RestoreFromBackupRequest); i { case 0: return &v.state @@ -21734,7 +22499,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[174].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[180].Exporter = func(v any, i int) any { switch v := v.(*RestoreFromBackupResponse); i { case 0: return &v.state @@ -21746,7 +22511,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[175].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[181].Exporter = func(v any, i int) any { switch v := v.(*RetrySchemaMigrationRequest); i { case 0: return &v.state @@ -21758,7 +22523,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[176].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[182].Exporter = func(v any, i int) any { switch v := v.(*RetrySchemaMigrationResponse); i { case 0: return &v.state @@ -21770,7 +22535,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[177].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[183].Exporter = func(v any, i int) any { switch v := v.(*RunHealthCheckRequest); i { case 0: return &v.state @@ -21782,7 +22547,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[178].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[184].Exporter = func(v any, i int) any { switch v := v.(*RunHealthCheckResponse); i { case 0: return &v.state @@ -21794,7 +22559,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[179].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[185].Exporter = func(v any, i int) any { switch v := v.(*SetKeyspaceDurabilityPolicyRequest); i { case 0: return &v.state @@ -21806,7 +22571,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[180].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[186].Exporter = func(v any, i int) any { switch v := v.(*SetKeyspaceDurabilityPolicyResponse); i { case 0: return &v.state @@ -21818,7 +22583,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[181].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[187].Exporter = func(v any, i int) any { switch v := v.(*SetKeyspaceShardingInfoRequest); i { case 0: return &v.state @@ -21830,7 +22595,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[182].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[188].Exporter = func(v any, i int) any { switch v := v.(*SetKeyspaceShardingInfoResponse); i { case 0: return &v.state @@ -21842,7 +22607,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[183].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[189].Exporter = func(v any, i int) any { switch v := v.(*SetShardIsPrimaryServingRequest); i { case 0: return &v.state @@ -21854,7 +22619,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[184].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[190].Exporter = func(v any, i int) any { switch v := v.(*SetShardIsPrimaryServingResponse); i { case 0: return &v.state @@ -21866,7 +22631,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[185].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[191].Exporter = func(v any, i int) any { switch v := v.(*SetShardTabletControlRequest); i { case 0: return &v.state @@ -21878,7 +22643,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[186].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[192].Exporter = func(v any, i int) any { switch v := v.(*SetShardTabletControlResponse); i { case 0: return &v.state @@ -21890,7 +22655,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[187].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[193].Exporter = func(v any, i int) any { switch v := v.(*SetWritableRequest); i { case 0: return &v.state @@ -21902,7 +22667,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[188].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[194].Exporter = func(v any, i int) any { switch v := v.(*SetWritableResponse); i { case 0: return &v.state @@ -21914,7 +22679,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[189].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[195].Exporter = func(v any, i int) any { switch v := v.(*ShardReplicationAddRequest); i { case 0: return &v.state @@ -21926,7 +22691,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[190].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[196].Exporter = func(v any, i int) any { switch v := v.(*ShardReplicationAddResponse); i { case 0: return &v.state @@ -21938,7 +22703,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[191].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[197].Exporter = func(v any, i int) any { switch v := v.(*ShardReplicationFixRequest); i { case 0: return &v.state @@ -21950,7 +22715,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[192].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[198].Exporter = func(v any, i int) any { switch v := v.(*ShardReplicationFixResponse); i { case 0: return &v.state @@ -21962,7 +22727,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[193].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[199].Exporter = func(v any, i int) any { switch v := v.(*ShardReplicationPositionsRequest); i { case 0: return &v.state @@ -21974,7 +22739,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[194].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[200].Exporter = func(v any, i int) any { switch v := v.(*ShardReplicationPositionsResponse); i { case 0: return &v.state @@ -21986,7 +22751,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[195].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[201].Exporter = func(v any, i int) any { switch v := v.(*ShardReplicationRemoveRequest); i { case 0: return &v.state @@ -21998,7 +22763,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[196].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[202].Exporter = func(v any, i int) any { switch v := v.(*ShardReplicationRemoveResponse); i { case 0: return &v.state @@ -22010,7 +22775,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[197].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[203].Exporter = func(v any, i int) any { switch v := v.(*SleepTabletRequest); i { case 0: return &v.state @@ -22022,7 +22787,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[198].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[204].Exporter = func(v any, i int) any { switch v := v.(*SleepTabletResponse); i { case 0: return &v.state @@ -22034,7 +22799,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[199].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[205].Exporter = func(v any, i int) any { switch v := v.(*SourceShardAddRequest); i { case 0: return &v.state @@ -22046,7 +22811,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[200].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[206].Exporter = func(v any, i int) any { switch v := v.(*SourceShardAddResponse); i { case 0: return &v.state @@ -22058,7 +22823,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[201].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[207].Exporter = func(v any, i int) any { switch v := v.(*SourceShardDeleteRequest); i { case 0: return &v.state @@ -22070,7 +22835,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[202].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[208].Exporter = func(v any, i int) any { switch v := v.(*SourceShardDeleteResponse); i { case 0: return &v.state @@ -22082,7 +22847,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[203].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[209].Exporter = func(v any, i int) any { switch v := v.(*StartReplicationRequest); i { case 0: return &v.state @@ -22094,7 +22859,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[204].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[210].Exporter = func(v any, i int) any { switch v := v.(*StartReplicationResponse); i { case 0: return &v.state @@ -22106,7 +22871,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[205].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[211].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationRequest); i { case 0: return &v.state @@ -22118,7 +22883,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[206].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[212].Exporter = func(v any, i int) any { switch v := v.(*StopReplicationResponse); i { case 0: return &v.state @@ -22130,7 +22895,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[207].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[213].Exporter = func(v any, i int) any { switch v := v.(*TabletExternallyReparentedRequest); i { case 0: return &v.state @@ -22142,7 +22907,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[208].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[214].Exporter = func(v any, i int) any { switch v := v.(*TabletExternallyReparentedResponse); i { case 0: return &v.state @@ -22154,7 +22919,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[209].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[215].Exporter = func(v any, i int) any { switch v := v.(*UpdateCellInfoRequest); i { case 0: return &v.state @@ -22166,7 +22931,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[210].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[216].Exporter = func(v any, i int) any { switch v := v.(*UpdateCellInfoResponse); i { case 0: return &v.state @@ -22178,7 +22943,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[211].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[217].Exporter = func(v any, i int) any { switch v := v.(*UpdateCellsAliasRequest); i { case 0: return &v.state @@ -22190,7 +22955,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[212].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[218].Exporter = func(v any, i int) any { switch v := v.(*UpdateCellsAliasResponse); i { case 0: return &v.state @@ -22202,7 +22967,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[213].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[219].Exporter = func(v any, i int) any { switch v := v.(*ValidateRequest); i { case 0: return &v.state @@ -22214,7 +22979,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[214].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[220].Exporter = func(v any, i int) any { switch v := v.(*ValidateResponse); i { case 0: return &v.state @@ -22226,7 +22991,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[215].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[221].Exporter = func(v any, i int) any { switch v := v.(*ValidateKeyspaceRequest); i { case 0: return &v.state @@ -22238,7 +23003,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[216].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[222].Exporter = func(v any, i int) any { switch v := v.(*ValidateKeyspaceResponse); i { case 0: return &v.state @@ -22250,7 +23015,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[217].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[223].Exporter = func(v any, i int) any { switch v := v.(*ValidateSchemaKeyspaceRequest); i { case 0: return &v.state @@ -22262,7 +23027,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[218].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[224].Exporter = func(v any, i int) any { switch v := v.(*ValidateSchemaKeyspaceResponse); i { case 0: return &v.state @@ -22274,7 +23039,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[219].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[225].Exporter = func(v any, i int) any { switch v := v.(*ValidateShardRequest); i { case 0: return &v.state @@ -22286,7 +23051,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[220].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[226].Exporter = func(v any, i int) any { switch v := v.(*ValidateShardResponse); i { case 0: return &v.state @@ -22298,7 +23063,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[221].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[227].Exporter = func(v any, i int) any { switch v := v.(*ValidateVersionKeyspaceRequest); i { case 0: return &v.state @@ -22310,7 +23075,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[222].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[228].Exporter = func(v any, i int) any { switch v := v.(*ValidateVersionKeyspaceResponse); i { case 0: return &v.state @@ -22322,7 +23087,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[223].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[229].Exporter = func(v any, i int) any { switch v := v.(*ValidateVersionShardRequest); i { case 0: return &v.state @@ -22334,7 +23099,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[224].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[230].Exporter = func(v any, i int) any { switch v := v.(*ValidateVersionShardResponse); i { case 0: return &v.state @@ -22346,7 +23111,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[225].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[231].Exporter = func(v any, i int) any { switch v := v.(*ValidateVSchemaRequest); i { case 0: return &v.state @@ -22358,7 +23123,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[226].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[232].Exporter = func(v any, i int) any { switch v := v.(*ValidateVSchemaResponse); i { case 0: return &v.state @@ -22370,7 +23135,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[227].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[233].Exporter = func(v any, i int) any { switch v := v.(*VDiffCreateRequest); i { case 0: return &v.state @@ -22382,7 +23147,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[228].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[234].Exporter = func(v any, i int) any { switch v := v.(*VDiffCreateResponse); i { case 0: return &v.state @@ -22394,7 +23159,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[229].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[235].Exporter = func(v any, i int) any { switch v := v.(*VDiffDeleteRequest); i { case 0: return &v.state @@ -22406,7 +23171,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[230].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[236].Exporter = func(v any, i int) any { switch v := v.(*VDiffDeleteResponse); i { case 0: return &v.state @@ -22418,7 +23183,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[231].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[237].Exporter = func(v any, i int) any { switch v := v.(*VDiffResumeRequest); i { case 0: return &v.state @@ -22430,7 +23195,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[232].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[238].Exporter = func(v any, i int) any { switch v := v.(*VDiffResumeResponse); i { case 0: return &v.state @@ -22442,7 +23207,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[233].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[239].Exporter = func(v any, i int) any { switch v := v.(*VDiffShowRequest); i { case 0: return &v.state @@ -22454,7 +23219,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[234].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[240].Exporter = func(v any, i int) any { switch v := v.(*VDiffShowResponse); i { case 0: return &v.state @@ -22466,7 +23231,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[235].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[241].Exporter = func(v any, i int) any { switch v := v.(*VDiffStopRequest); i { case 0: return &v.state @@ -22478,7 +23243,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[236].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[242].Exporter = func(v any, i int) any { switch v := v.(*VDiffStopResponse); i { case 0: return &v.state @@ -22490,7 +23255,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[237].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[243].Exporter = func(v any, i int) any { switch v := v.(*WorkflowDeleteRequest); i { case 0: return &v.state @@ -22502,7 +23267,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[238].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[244].Exporter = func(v any, i int) any { switch v := v.(*WorkflowDeleteResponse); i { case 0: return &v.state @@ -22514,7 +23279,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[239].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[245].Exporter = func(v any, i int) any { switch v := v.(*WorkflowStatusRequest); i { case 0: return &v.state @@ -22526,7 +23291,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[240].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[246].Exporter = func(v any, i int) any { switch v := v.(*WorkflowStatusResponse); i { case 0: return &v.state @@ -22538,7 +23303,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[241].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[247].Exporter = func(v any, i int) any { switch v := v.(*WorkflowSwitchTrafficRequest); i { case 0: return &v.state @@ -22550,7 +23315,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[242].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[248].Exporter = func(v any, i int) any { switch v := v.(*WorkflowSwitchTrafficResponse); i { case 0: return &v.state @@ -22562,7 +23327,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[243].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[249].Exporter = func(v any, i int) any { switch v := v.(*WorkflowUpdateRequest); i { case 0: return &v.state @@ -22574,7 +23339,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[244].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[250].Exporter = func(v any, i int) any { switch v := v.(*WorkflowUpdateResponse); i { case 0: return &v.state @@ -22586,7 +23351,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[245].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[251].Exporter = func(v any, i int) any { switch v := v.(*GetMirrorRulesRequest); i { case 0: return &v.state @@ -22598,7 +23363,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[246].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[252].Exporter = func(v any, i int) any { switch v := v.(*GetMirrorRulesResponse); i { case 0: return &v.state @@ -22610,7 +23375,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[247].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[253].Exporter = func(v any, i int) any { switch v := v.(*WorkflowMirrorTrafficRequest); i { case 0: return &v.state @@ -22622,7 +23387,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[248].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[254].Exporter = func(v any, i int) any { switch v := v.(*WorkflowMirrorTrafficResponse); i { case 0: return &v.state @@ -22634,7 +23399,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[250].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[257].Exporter = func(v any, i int) any { switch v := v.(*Workflow_ReplicationLocation); i { case 0: return &v.state @@ -22646,7 +23411,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[251].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[258].Exporter = func(v any, i int) any { switch v := v.(*Workflow_ShardStream); i { case 0: return &v.state @@ -22658,7 +23423,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[252].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[259].Exporter = func(v any, i int) any { switch v := v.(*Workflow_Stream); i { case 0: return &v.state @@ -22670,7 +23435,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[253].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[260].Exporter = func(v any, i int) any { switch v := v.(*Workflow_Stream_CopyState); i { case 0: return &v.state @@ -22682,7 +23447,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[254].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[261].Exporter = func(v any, i int) any { switch v := v.(*Workflow_Stream_Log); i { case 0: return &v.state @@ -22694,7 +23459,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[255].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[262].Exporter = func(v any, i int) any { switch v := v.(*Workflow_Stream_ThrottlerStatus); i { case 0: return &v.state @@ -22706,7 +23471,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[258].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[265].Exporter = func(v any, i int) any { switch v := v.(*ApplyVSchemaResponse_ParamList); i { case 0: return &v.state @@ -22718,7 +23483,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[267].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[277].Exporter = func(v any, i int) any { switch v := v.(*GetSrvKeyspaceNamesResponse_NameList); i { case 0: return &v.state @@ -22730,7 +23495,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[271].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[281].Exporter = func(v any, i int) any { switch v := v.(*MoveTablesCreateResponse_TabletInfo); i { case 0: return &v.state @@ -22742,7 +23507,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[281].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[291].Exporter = func(v any, i int) any { switch v := v.(*WorkflowDeleteResponse_TabletInfo); i { case 0: return &v.state @@ -22754,7 +23519,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[282].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[292].Exporter = func(v any, i int) any { switch v := v.(*WorkflowStatusResponse_TableCopyState); i { case 0: return &v.state @@ -22766,7 +23531,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[283].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[293].Exporter = func(v any, i int) any { switch v := v.(*WorkflowStatusResponse_ShardStreamState); i { case 0: return &v.state @@ -22778,7 +23543,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[284].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[294].Exporter = func(v any, i int) any { switch v := v.(*WorkflowStatusResponse_ShardStreams); i { case 0: return &v.state @@ -22790,7 +23555,7 @@ func file_vtctldata_proto_init() { return nil } } - file_vtctldata_proto_msgTypes[287].Exporter = func(v any, i int) any { + file_vtctldata_proto_msgTypes[297].Exporter = func(v any, i int) any { switch v := v.(*WorkflowUpdateResponse_TabletInfo); i { case 0: return &v.state @@ -22803,13 +23568,15 @@ func file_vtctldata_proto_init() { } } } + file_vtctldata_proto_msgTypes[23].OneofWrappers = []any{} + file_vtctldata_proto_msgTypes[233].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vtctldata_proto_rawDesc, - NumEnums: 4, - NumMessages: 288, + NumEnums: 5, + NumMessages: 298, NumExtensions: 0, NumServices: 0, }, diff --git a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go index 7e38623a907..438357693b3 100644 --- a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go +++ b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: vtctldata.proto package vtctldata @@ -7,11 +7,11 @@ package vtctldata import ( binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" math "math" - bits "math/bits" binlogdata "vitess.io/vitess/go/vt/proto/binlogdata" logutil "vitess.io/vitess/go/vt/proto/logutil" mysqlctl "vitess.io/vitess/go/vt/proto/mysqlctl" @@ -35,9 +35,8 @@ func (m *ExecuteVtctlCommandRequest) CloneVT() *ExecuteVtctlCommandRequest { if m == nil { return (*ExecuteVtctlCommandRequest)(nil) } - r := &ExecuteVtctlCommandRequest{ - ActionTimeout: m.ActionTimeout, - } + r := new(ExecuteVtctlCommandRequest) + r.ActionTimeout = m.ActionTimeout if rhs := m.Args; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -58,9 +57,8 @@ func (m *ExecuteVtctlCommandResponse) CloneVT() *ExecuteVtctlCommandResponse { if m == nil { return (*ExecuteVtctlCommandResponse)(nil) } - r := &ExecuteVtctlCommandResponse{ - Event: m.Event.CloneVT(), - } + r := new(ExecuteVtctlCommandResponse) + r.Event = m.Event.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -76,11 +74,10 @@ func (m *TableMaterializeSettings) CloneVT() *TableMaterializeSettings { if m == nil { return (*TableMaterializeSettings)(nil) } - r := &TableMaterializeSettings{ - TargetTable: m.TargetTable, - SourceExpression: m.SourceExpression, - CreateDdl: m.CreateDdl, - } + r := new(TableMaterializeSettings) + r.TargetTable = m.TargetTable + r.SourceExpression = m.SourceExpression + r.CreateDdl = m.CreateDdl if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -96,23 +93,22 @@ func (m *MaterializeSettings) CloneVT() *MaterializeSettings { if m == nil { return (*MaterializeSettings)(nil) } - r := &MaterializeSettings{ - Workflow: m.Workflow, - SourceKeyspace: m.SourceKeyspace, - TargetKeyspace: m.TargetKeyspace, - StopAfterCopy: m.StopAfterCopy, - Cell: m.Cell, - TabletTypes: m.TabletTypes, - ExternalCluster: m.ExternalCluster, - MaterializationIntent: m.MaterializationIntent, - SourceTimeZone: m.SourceTimeZone, - TargetTimeZone: m.TargetTimeZone, - OnDdl: m.OnDdl, - DeferSecondaryKeys: m.DeferSecondaryKeys, - TabletSelectionPreference: m.TabletSelectionPreference, - AtomicCopy: m.AtomicCopy, - WorkflowOptions: m.WorkflowOptions.CloneVT(), - } + r := new(MaterializeSettings) + r.Workflow = m.Workflow + r.SourceKeyspace = m.SourceKeyspace + r.TargetKeyspace = m.TargetKeyspace + r.StopAfterCopy = m.StopAfterCopy + r.Cell = m.Cell + r.TabletTypes = m.TabletTypes + r.ExternalCluster = m.ExternalCluster + r.MaterializationIntent = m.MaterializationIntent + r.SourceTimeZone = m.SourceTimeZone + r.TargetTimeZone = m.TargetTimeZone + r.OnDdl = m.OnDdl + r.DeferSecondaryKeys = m.DeferSecondaryKeys + r.TabletSelectionPreference = m.TabletSelectionPreference + r.AtomicCopy = m.AtomicCopy + r.WorkflowOptions = m.WorkflowOptions.CloneVT() if rhs := m.TableSettings; rhs != nil { tmpContainer := make([]*TableMaterializeSettings, len(rhs)) for k, v := range rhs { @@ -125,6 +121,11 @@ func (m *MaterializeSettings) CloneVT() *MaterializeSettings { copy(tmpContainer, rhs) r.SourceShards = tmpContainer } + if rhs := m.ReferenceTables; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.ReferenceTables = tmpContainer + } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -140,10 +141,9 @@ func (m *Keyspace) CloneVT() *Keyspace { if m == nil { return (*Keyspace)(nil) } - r := &Keyspace{ - Name: m.Name, - Keyspace: m.Keyspace.CloneVT(), - } + r := new(Keyspace) + r.Name = m.Name + r.Keyspace = m.Keyspace.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -159,62 +159,61 @@ func (m *SchemaMigration) CloneVT() *SchemaMigration { if m == nil { return (*SchemaMigration)(nil) } - r := &SchemaMigration{ - Uuid: m.Uuid, - Keyspace: m.Keyspace, - Shard: m.Shard, - Schema: m.Schema, - Table: m.Table, - MigrationStatement: m.MigrationStatement, - Strategy: m.Strategy, - Options: m.Options, - AddedAt: m.AddedAt.CloneVT(), - RequestedAt: m.RequestedAt.CloneVT(), - ReadyAt: m.ReadyAt.CloneVT(), - StartedAt: m.StartedAt.CloneVT(), - LivenessTimestamp: m.LivenessTimestamp.CloneVT(), - CompletedAt: m.CompletedAt.CloneVT(), - CleanedUpAt: m.CleanedUpAt.CloneVT(), - Status: m.Status, - LogPath: m.LogPath, - Artifacts: m.Artifacts, - Retries: m.Retries, - Tablet: m.Tablet.CloneVT(), - TabletFailure: m.TabletFailure, - Progress: m.Progress, - MigrationContext: m.MigrationContext, - DdlAction: m.DdlAction, - Message: m.Message, - EtaSeconds: m.EtaSeconds, - RowsCopied: m.RowsCopied, - TableRows: m.TableRows, - AddedUniqueKeys: m.AddedUniqueKeys, - RemovedUniqueKeys: m.RemovedUniqueKeys, - LogFile: m.LogFile, - ArtifactRetention: m.ArtifactRetention.CloneVT(), - PostponeCompletion: m.PostponeCompletion, - RemovedUniqueKeyNames: m.RemovedUniqueKeyNames, - DroppedNoDefaultColumnNames: m.DroppedNoDefaultColumnNames, - ExpandedColumnNames: m.ExpandedColumnNames, - RevertibleNotes: m.RevertibleNotes, - AllowConcurrent: m.AllowConcurrent, - RevertedUuid: m.RevertedUuid, - IsView: m.IsView, - ReadyToComplete: m.ReadyToComplete, - VitessLivenessIndicator: m.VitessLivenessIndicator, - UserThrottleRatio: m.UserThrottleRatio, - SpecialPlan: m.SpecialPlan, - LastThrottledAt: m.LastThrottledAt.CloneVT(), - ComponentThrottled: m.ComponentThrottled, - CancelledAt: m.CancelledAt.CloneVT(), - PostponeLaunch: m.PostponeLaunch, - Stage: m.Stage, - CutoverAttempts: m.CutoverAttempts, - IsImmediateOperation: m.IsImmediateOperation, - ReviewedAt: m.ReviewedAt.CloneVT(), - ReadyToCompleteAt: m.ReadyToCompleteAt.CloneVT(), - RemovedForeignKeyNames: m.RemovedForeignKeyNames, - } + r := new(SchemaMigration) + r.Uuid = m.Uuid + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Schema = m.Schema + r.Table = m.Table + r.MigrationStatement = m.MigrationStatement + r.Strategy = m.Strategy + r.Options = m.Options + r.AddedAt = m.AddedAt.CloneVT() + r.RequestedAt = m.RequestedAt.CloneVT() + r.ReadyAt = m.ReadyAt.CloneVT() + r.StartedAt = m.StartedAt.CloneVT() + r.LivenessTimestamp = m.LivenessTimestamp.CloneVT() + r.CompletedAt = m.CompletedAt.CloneVT() + r.CleanedUpAt = m.CleanedUpAt.CloneVT() + r.Status = m.Status + r.LogPath = m.LogPath + r.Artifacts = m.Artifacts + r.Retries = m.Retries + r.Tablet = m.Tablet.CloneVT() + r.TabletFailure = m.TabletFailure + r.Progress = m.Progress + r.MigrationContext = m.MigrationContext + r.DdlAction = m.DdlAction + r.Message = m.Message + r.EtaSeconds = m.EtaSeconds + r.RowsCopied = m.RowsCopied + r.TableRows = m.TableRows + r.AddedUniqueKeys = m.AddedUniqueKeys + r.RemovedUniqueKeys = m.RemovedUniqueKeys + r.LogFile = m.LogFile + r.ArtifactRetention = m.ArtifactRetention.CloneVT() + r.PostponeCompletion = m.PostponeCompletion + r.RemovedUniqueKeyNames = m.RemovedUniqueKeyNames + r.DroppedNoDefaultColumnNames = m.DroppedNoDefaultColumnNames + r.ExpandedColumnNames = m.ExpandedColumnNames + r.RevertibleNotes = m.RevertibleNotes + r.AllowConcurrent = m.AllowConcurrent + r.RevertedUuid = m.RevertedUuid + r.IsView = m.IsView + r.ReadyToComplete = m.ReadyToComplete + r.VitessLivenessIndicator = m.VitessLivenessIndicator + r.UserThrottleRatio = m.UserThrottleRatio + r.SpecialPlan = m.SpecialPlan + r.LastThrottledAt = m.LastThrottledAt.CloneVT() + r.ComponentThrottled = m.ComponentThrottled + r.CancelledAt = m.CancelledAt.CloneVT() + r.PostponeLaunch = m.PostponeLaunch + r.Stage = m.Stage + r.CutoverAttempts = m.CutoverAttempts + r.IsImmediateOperation = m.IsImmediateOperation + r.ReviewedAt = m.ReviewedAt.CloneVT() + r.ReadyToCompleteAt = m.ReadyToCompleteAt.CloneVT() + r.RemovedForeignKeyNames = m.RemovedForeignKeyNames if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -230,11 +229,10 @@ func (m *Shard) CloneVT() *Shard { if m == nil { return (*Shard)(nil) } - r := &Shard{ - Keyspace: m.Keyspace, - Name: m.Name, - Shard: m.Shard.CloneVT(), - } + r := new(Shard) + r.Keyspace = m.Keyspace + r.Name = m.Name + r.Shard = m.Shard.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -250,15 +248,22 @@ func (m *WorkflowOptions) CloneVT() *WorkflowOptions { if m == nil { return (*WorkflowOptions)(nil) } - r := &WorkflowOptions{ - TenantId: m.TenantId, - StripShardedAutoIncrement: m.StripShardedAutoIncrement, - } + r := new(WorkflowOptions) + r.TenantId = m.TenantId + r.ShardedAutoIncrementHandling = m.ShardedAutoIncrementHandling + r.GlobalKeyspace = m.GlobalKeyspace if rhs := m.Shards; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) r.Shards = tmpContainer } + if rhs := m.Config; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.Config = tmpContainer + } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -274,9 +279,8 @@ func (m *Workflow_ReplicationLocation) CloneVT() *Workflow_ReplicationLocation { if m == nil { return (*Workflow_ReplicationLocation)(nil) } - r := &Workflow_ReplicationLocation{ - Keyspace: m.Keyspace, - } + r := new(Workflow_ReplicationLocation) + r.Keyspace = m.Keyspace if rhs := m.Shards; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -297,9 +301,8 @@ func (m *Workflow_ShardStream) CloneVT() *Workflow_ShardStream { if m == nil { return (*Workflow_ShardStream)(nil) } - r := &Workflow_ShardStream{ - IsPrimaryServing: m.IsPrimaryServing, - } + r := new(Workflow_ShardStream) + r.IsPrimaryServing = m.IsPrimaryServing if rhs := m.Streams; rhs != nil { tmpContainer := make([]*Workflow_Stream, len(rhs)) for k, v := range rhs { @@ -329,11 +332,10 @@ func (m *Workflow_Stream_CopyState) CloneVT() *Workflow_Stream_CopyState { if m == nil { return (*Workflow_Stream_CopyState)(nil) } - r := &Workflow_Stream_CopyState{ - Table: m.Table, - LastPk: m.LastPk, - StreamId: m.StreamId, - } + r := new(Workflow_Stream_CopyState) + r.Table = m.Table + r.LastPk = m.LastPk + r.StreamId = m.StreamId if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -349,16 +351,15 @@ func (m *Workflow_Stream_Log) CloneVT() *Workflow_Stream_Log { if m == nil { return (*Workflow_Stream_Log)(nil) } - r := &Workflow_Stream_Log{ - Id: m.Id, - StreamId: m.StreamId, - Type: m.Type, - State: m.State, - CreatedAt: m.CreatedAt.CloneVT(), - UpdatedAt: m.UpdatedAt.CloneVT(), - Message: m.Message, - Count: m.Count, - } + r := new(Workflow_Stream_Log) + r.Id = m.Id + r.StreamId = m.StreamId + r.Type = m.Type + r.State = m.State + r.CreatedAt = m.CreatedAt.CloneVT() + r.UpdatedAt = m.UpdatedAt.CloneVT() + r.Message = m.Message + r.Count = m.Count if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -374,10 +375,9 @@ func (m *Workflow_Stream_ThrottlerStatus) CloneVT() *Workflow_Stream_ThrottlerSt if m == nil { return (*Workflow_Stream_ThrottlerStatus)(nil) } - r := &Workflow_Stream_ThrottlerStatus{ - ComponentThrottled: m.ComponentThrottled, - TimeThrottled: m.TimeThrottled.CloneVT(), - } + r := new(Workflow_Stream_ThrottlerStatus) + r.ComponentThrottled = m.ComponentThrottled + r.TimeThrottled = m.TimeThrottled.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -393,23 +393,22 @@ func (m *Workflow_Stream) CloneVT() *Workflow_Stream { if m == nil { return (*Workflow_Stream)(nil) } - r := &Workflow_Stream{ - Id: m.Id, - Shard: m.Shard, - Tablet: m.Tablet.CloneVT(), - BinlogSource: m.BinlogSource.CloneVT(), - Position: m.Position, - StopPosition: m.StopPosition, - State: m.State, - DbName: m.DbName, - TransactionTimestamp: m.TransactionTimestamp.CloneVT(), - TimeUpdated: m.TimeUpdated.CloneVT(), - Message: m.Message, - LogFetchError: m.LogFetchError, - RowsCopied: m.RowsCopied, - ThrottlerStatus: m.ThrottlerStatus.CloneVT(), - TabletSelectionPreference: m.TabletSelectionPreference, - } + r := new(Workflow_Stream) + r.Id = m.Id + r.Shard = m.Shard + r.Tablet = m.Tablet.CloneVT() + r.BinlogSource = m.BinlogSource.CloneVT() + r.Position = m.Position + r.StopPosition = m.StopPosition + r.State = m.State + r.DbName = m.DbName + r.TransactionTimestamp = m.TransactionTimestamp.CloneVT() + r.TimeUpdated = m.TimeUpdated.CloneVT() + r.Message = m.Message + r.LogFetchError = m.LogFetchError + r.RowsCopied = m.RowsCopied + r.ThrottlerStatus = m.ThrottlerStatus.CloneVT() + r.TabletSelectionPreference = m.TabletSelectionPreference if rhs := m.CopyStates; rhs != nil { tmpContainer := make([]*Workflow_Stream_CopyState, len(rhs)) for k, v := range rhs { @@ -454,17 +453,16 @@ func (m *Workflow) CloneVT() *Workflow { if m == nil { return (*Workflow)(nil) } - r := &Workflow{ - Name: m.Name, - Source: m.Source.CloneVT(), - Target: m.Target.CloneVT(), - MaxVReplicationLag: m.MaxVReplicationLag, - WorkflowType: m.WorkflowType, - WorkflowSubType: m.WorkflowSubType, - MaxVReplicationTransactionLag: m.MaxVReplicationTransactionLag, - DeferSecondaryKeys: m.DeferSecondaryKeys, - Options: m.Options.CloneVT(), - } + r := new(Workflow) + r.Name = m.Name + r.Source = m.Source.CloneVT() + r.Target = m.Target.CloneVT() + r.MaxVReplicationLag = m.MaxVReplicationLag + r.WorkflowType = m.WorkflowType + r.WorkflowSubType = m.WorkflowSubType + r.MaxVReplicationTransactionLag = m.MaxVReplicationTransactionLag + r.DeferSecondaryKeys = m.DeferSecondaryKeys + r.Options = m.Options.CloneVT() if rhs := m.ShardStreams; rhs != nil { tmpContainer := make(map[string]*Workflow_ShardStream, len(rhs)) for k, v := range rhs { @@ -487,10 +485,9 @@ func (m *AddCellInfoRequest) CloneVT() *AddCellInfoRequest { if m == nil { return (*AddCellInfoRequest)(nil) } - r := &AddCellInfoRequest{ - Name: m.Name, - CellInfo: m.CellInfo.CloneVT(), - } + r := new(AddCellInfoRequest) + r.Name = m.Name + r.CellInfo = m.CellInfo.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -506,7 +503,7 @@ func (m *AddCellInfoResponse) CloneVT() *AddCellInfoResponse { if m == nil { return (*AddCellInfoResponse)(nil) } - r := &AddCellInfoResponse{} + r := new(AddCellInfoResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -522,9 +519,8 @@ func (m *AddCellsAliasRequest) CloneVT() *AddCellsAliasRequest { if m == nil { return (*AddCellsAliasRequest)(nil) } - r := &AddCellsAliasRequest{ - Name: m.Name, - } + r := new(AddCellsAliasRequest) + r.Name = m.Name if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -545,7 +541,7 @@ func (m *AddCellsAliasResponse) CloneVT() *AddCellsAliasResponse { if m == nil { return (*AddCellsAliasResponse)(nil) } - r := &AddCellsAliasResponse{} + r := new(AddCellsAliasResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -561,10 +557,9 @@ func (m *ApplyKeyspaceRoutingRulesRequest) CloneVT() *ApplyKeyspaceRoutingRulesR if m == nil { return (*ApplyKeyspaceRoutingRulesRequest)(nil) } - r := &ApplyKeyspaceRoutingRulesRequest{ - KeyspaceRoutingRules: m.KeyspaceRoutingRules.CloneVT(), - SkipRebuild: m.SkipRebuild, - } + r := new(ApplyKeyspaceRoutingRulesRequest) + r.KeyspaceRoutingRules = m.KeyspaceRoutingRules.CloneVT() + r.SkipRebuild = m.SkipRebuild if rhs := m.RebuildCells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -585,9 +580,8 @@ func (m *ApplyKeyspaceRoutingRulesResponse) CloneVT() *ApplyKeyspaceRoutingRules if m == nil { return (*ApplyKeyspaceRoutingRulesResponse)(nil) } - r := &ApplyKeyspaceRoutingRulesResponse{ - KeyspaceRoutingRules: m.KeyspaceRoutingRules.CloneVT(), - } + r := new(ApplyKeyspaceRoutingRulesResponse) + r.KeyspaceRoutingRules = m.KeyspaceRoutingRules.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -603,10 +597,9 @@ func (m *ApplyRoutingRulesRequest) CloneVT() *ApplyRoutingRulesRequest { if m == nil { return (*ApplyRoutingRulesRequest)(nil) } - r := &ApplyRoutingRulesRequest{ - RoutingRules: m.RoutingRules.CloneVT(), - SkipRebuild: m.SkipRebuild, - } + r := new(ApplyRoutingRulesRequest) + r.RoutingRules = m.RoutingRules.CloneVT() + r.SkipRebuild = m.SkipRebuild if rhs := m.RebuildCells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -627,7 +620,7 @@ func (m *ApplyRoutingRulesResponse) CloneVT() *ApplyRoutingRulesResponse { if m == nil { return (*ApplyRoutingRulesResponse)(nil) } - r := &ApplyRoutingRulesResponse{} + r := new(ApplyRoutingRulesResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -643,10 +636,9 @@ func (m *ApplyShardRoutingRulesRequest) CloneVT() *ApplyShardRoutingRulesRequest if m == nil { return (*ApplyShardRoutingRulesRequest)(nil) } - r := &ApplyShardRoutingRulesRequest{ - ShardRoutingRules: m.ShardRoutingRules.CloneVT(), - SkipRebuild: m.SkipRebuild, - } + r := new(ApplyShardRoutingRulesRequest) + r.ShardRoutingRules = m.ShardRoutingRules.CloneVT() + r.SkipRebuild = m.SkipRebuild if rhs := m.RebuildCells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -667,7 +659,7 @@ func (m *ApplyShardRoutingRulesResponse) CloneVT() *ApplyShardRoutingRulesRespon if m == nil { return (*ApplyShardRoutingRulesResponse)(nil) } - r := &ApplyShardRoutingRulesResponse{} + r := new(ApplyShardRoutingRulesResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -683,14 +675,13 @@ func (m *ApplySchemaRequest) CloneVT() *ApplySchemaRequest { if m == nil { return (*ApplySchemaRequest)(nil) } - r := &ApplySchemaRequest{ - Keyspace: m.Keyspace, - DdlStrategy: m.DdlStrategy, - MigrationContext: m.MigrationContext, - WaitReplicasTimeout: m.WaitReplicasTimeout.CloneVT(), - CallerId: m.CallerId.CloneVT(), - BatchSize: m.BatchSize, - } + r := new(ApplySchemaRequest) + r.Keyspace = m.Keyspace + r.DdlStrategy = m.DdlStrategy + r.MigrationContext = m.MigrationContext + r.WaitReplicasTimeout = m.WaitReplicasTimeout.CloneVT() + r.CallerId = m.CallerId.CloneVT() + r.BatchSize = m.BatchSize if rhs := m.Sql; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -716,7 +707,7 @@ func (m *ApplySchemaResponse) CloneVT() *ApplySchemaResponse { if m == nil { return (*ApplySchemaResponse)(nil) } - r := &ApplySchemaResponse{} + r := new(ApplySchemaResponse) if rhs := m.UuidList; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -744,14 +735,13 @@ func (m *ApplyVSchemaRequest) CloneVT() *ApplyVSchemaRequest { if m == nil { return (*ApplyVSchemaRequest)(nil) } - r := &ApplyVSchemaRequest{ - Keyspace: m.Keyspace, - SkipRebuild: m.SkipRebuild, - DryRun: m.DryRun, - VSchema: m.VSchema.CloneVT(), - Sql: m.Sql, - Strict: m.Strict, - } + r := new(ApplyVSchemaRequest) + r.Keyspace = m.Keyspace + r.SkipRebuild = m.SkipRebuild + r.DryRun = m.DryRun + r.VSchema = m.VSchema.CloneVT() + r.Sql = m.Sql + r.Strict = m.Strict if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -772,7 +762,7 @@ func (m *ApplyVSchemaResponse_ParamList) CloneVT() *ApplyVSchemaResponse_ParamLi if m == nil { return (*ApplyVSchemaResponse_ParamList)(nil) } - r := &ApplyVSchemaResponse_ParamList{} + r := new(ApplyVSchemaResponse_ParamList) if rhs := m.Params; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -793,9 +783,8 @@ func (m *ApplyVSchemaResponse) CloneVT() *ApplyVSchemaResponse { if m == nil { return (*ApplyVSchemaResponse)(nil) } - r := &ApplyVSchemaResponse{ - VSchema: m.VSchema.CloneVT(), - } + r := new(ApplyVSchemaResponse) + r.VSchema = m.VSchema.CloneVT() if rhs := m.UnknownVindexParams; rhs != nil { tmpContainer := make(map[string]*ApplyVSchemaResponse_ParamList, len(rhs)) for k, v := range rhs { @@ -818,12 +807,15 @@ func (m *BackupRequest) CloneVT() *BackupRequest { if m == nil { return (*BackupRequest)(nil) } - r := &BackupRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - AllowPrimary: m.AllowPrimary, - Concurrency: m.Concurrency, - IncrementalFromPos: m.IncrementalFromPos, - UpgradeSafe: m.UpgradeSafe, + r := new(BackupRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.AllowPrimary = m.AllowPrimary + r.Concurrency = m.Concurrency + r.IncrementalFromPos = m.IncrementalFromPos + r.UpgradeSafe = m.UpgradeSafe + if rhs := m.BackupEngine; rhs != nil { + tmpVal := *rhs + r.BackupEngine = &tmpVal } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -840,12 +832,11 @@ func (m *BackupResponse) CloneVT() *BackupResponse { if m == nil { return (*BackupResponse)(nil) } - r := &BackupResponse{ - TabletAlias: m.TabletAlias.CloneVT(), - Keyspace: m.Keyspace, - Shard: m.Shard, - Event: m.Event.CloneVT(), - } + r := new(BackupResponse) + r.TabletAlias = m.TabletAlias.CloneVT() + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Event = m.Event.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -861,14 +852,13 @@ func (m *BackupShardRequest) CloneVT() *BackupShardRequest { if m == nil { return (*BackupShardRequest)(nil) } - r := &BackupShardRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - AllowPrimary: m.AllowPrimary, - Concurrency: m.Concurrency, - UpgradeSafe: m.UpgradeSafe, - IncrementalFromPos: m.IncrementalFromPos, - } + r := new(BackupShardRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.AllowPrimary = m.AllowPrimary + r.Concurrency = m.Concurrency + r.UpgradeSafe = m.UpgradeSafe + r.IncrementalFromPos = m.IncrementalFromPos if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -884,10 +874,9 @@ func (m *CancelSchemaMigrationRequest) CloneVT() *CancelSchemaMigrationRequest { if m == nil { return (*CancelSchemaMigrationRequest)(nil) } - r := &CancelSchemaMigrationRequest{ - Keyspace: m.Keyspace, - Uuid: m.Uuid, - } + r := new(CancelSchemaMigrationRequest) + r.Keyspace = m.Keyspace + r.Uuid = m.Uuid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -903,7 +892,7 @@ func (m *CancelSchemaMigrationResponse) CloneVT() *CancelSchemaMigrationResponse if m == nil { return (*CancelSchemaMigrationResponse)(nil) } - r := &CancelSchemaMigrationResponse{} + r := new(CancelSchemaMigrationResponse) if rhs := m.RowsAffectedByShard; rhs != nil { tmpContainer := make(map[string]uint64, len(rhs)) for k, v := range rhs { @@ -922,15 +911,69 @@ func (m *CancelSchemaMigrationResponse) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *ChangeTabletTagsRequest) CloneVT() *ChangeTabletTagsRequest { + if m == nil { + return (*ChangeTabletTagsRequest)(nil) + } + r := new(ChangeTabletTagsRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.Replace = m.Replace + if rhs := m.Tags; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.Tags = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ChangeTabletTagsRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ChangeTabletTagsResponse) CloneVT() *ChangeTabletTagsResponse { + if m == nil { + return (*ChangeTabletTagsResponse)(nil) + } + r := new(ChangeTabletTagsResponse) + if rhs := m.BeforeTags; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.BeforeTags = tmpContainer + } + if rhs := m.AfterTags; rhs != nil { + tmpContainer := make(map[string]string, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v + } + r.AfterTags = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ChangeTabletTagsResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *ChangeTabletTypeRequest) CloneVT() *ChangeTabletTypeRequest { if m == nil { return (*ChangeTabletTypeRequest)(nil) } - r := &ChangeTabletTypeRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - DbType: m.DbType, - DryRun: m.DryRun, - } + r := new(ChangeTabletTypeRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.DbType = m.DbType + r.DryRun = m.DryRun if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -946,11 +989,10 @@ func (m *ChangeTabletTypeResponse) CloneVT() *ChangeTabletTypeResponse { if m == nil { return (*ChangeTabletTypeResponse)(nil) } - r := &ChangeTabletTypeResponse{ - BeforeTablet: m.BeforeTablet.CloneVT(), - AfterTablet: m.AfterTablet.CloneVT(), - WasDryRun: m.WasDryRun, - } + r := new(ChangeTabletTypeResponse) + r.BeforeTablet = m.BeforeTablet.CloneVT() + r.AfterTablet = m.AfterTablet.CloneVT() + r.WasDryRun = m.WasDryRun if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -966,13 +1008,12 @@ func (m *CheckThrottlerRequest) CloneVT() *CheckThrottlerRequest { if m == nil { return (*CheckThrottlerRequest)(nil) } - r := &CheckThrottlerRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - AppName: m.AppName, - Scope: m.Scope, - SkipRequestHeartbeats: m.SkipRequestHeartbeats, - OkIfNotExists: m.OkIfNotExists, - } + r := new(CheckThrottlerRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.AppName = m.AppName + r.Scope = m.Scope + r.SkipRequestHeartbeats = m.SkipRequestHeartbeats + r.OkIfNotExists = m.OkIfNotExists if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -988,10 +1029,9 @@ func (m *CheckThrottlerResponse) CloneVT() *CheckThrottlerResponse { if m == nil { return (*CheckThrottlerResponse)(nil) } - r := &CheckThrottlerResponse{ - TabletAlias: m.TabletAlias.CloneVT(), - Check: m.Check.CloneVT(), - } + r := new(CheckThrottlerResponse) + r.TabletAlias = m.TabletAlias.CloneVT() + r.Check = m.Check.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1007,10 +1047,9 @@ func (m *CleanupSchemaMigrationRequest) CloneVT() *CleanupSchemaMigrationRequest if m == nil { return (*CleanupSchemaMigrationRequest)(nil) } - r := &CleanupSchemaMigrationRequest{ - Keyspace: m.Keyspace, - Uuid: m.Uuid, - } + r := new(CleanupSchemaMigrationRequest) + r.Keyspace = m.Keyspace + r.Uuid = m.Uuid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1026,7 +1065,7 @@ func (m *CleanupSchemaMigrationResponse) CloneVT() *CleanupSchemaMigrationRespon if m == nil { return (*CleanupSchemaMigrationResponse)(nil) } - r := &CleanupSchemaMigrationResponse{} + r := new(CleanupSchemaMigrationResponse) if rhs := m.RowsAffectedByShard; rhs != nil { tmpContainer := make(map[string]uint64, len(rhs)) for k, v := range rhs { @@ -1049,10 +1088,9 @@ func (m *CompleteSchemaMigrationRequest) CloneVT() *CompleteSchemaMigrationReque if m == nil { return (*CompleteSchemaMigrationRequest)(nil) } - r := &CompleteSchemaMigrationRequest{ - Keyspace: m.Keyspace, - Uuid: m.Uuid, - } + r := new(CompleteSchemaMigrationRequest) + r.Keyspace = m.Keyspace + r.Uuid = m.Uuid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1068,7 +1106,7 @@ func (m *CompleteSchemaMigrationResponse) CloneVT() *CompleteSchemaMigrationResp if m == nil { return (*CompleteSchemaMigrationResponse)(nil) } - r := &CompleteSchemaMigrationResponse{} + r := new(CompleteSchemaMigrationResponse) if rhs := m.RowsAffectedByShard; rhs != nil { tmpContainer := make(map[string]uint64, len(rhs)) for k, v := range rhs { @@ -1091,16 +1129,15 @@ func (m *CreateKeyspaceRequest) CloneVT() *CreateKeyspaceRequest { if m == nil { return (*CreateKeyspaceRequest)(nil) } - r := &CreateKeyspaceRequest{ - Name: m.Name, - Force: m.Force, - AllowEmptyVSchema: m.AllowEmptyVSchema, - Type: m.Type, - BaseKeyspace: m.BaseKeyspace, - SnapshotTime: m.SnapshotTime.CloneVT(), - DurabilityPolicy: m.DurabilityPolicy, - SidecarDbName: m.SidecarDbName, - } + r := new(CreateKeyspaceRequest) + r.Name = m.Name + r.Force = m.Force + r.AllowEmptyVSchema = m.AllowEmptyVSchema + r.Type = m.Type + r.BaseKeyspace = m.BaseKeyspace + r.SnapshotTime = m.SnapshotTime.CloneVT() + r.DurabilityPolicy = m.DurabilityPolicy + r.SidecarDbName = m.SidecarDbName if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1116,9 +1153,8 @@ func (m *CreateKeyspaceResponse) CloneVT() *CreateKeyspaceResponse { if m == nil { return (*CreateKeyspaceResponse)(nil) } - r := &CreateKeyspaceResponse{ - Keyspace: m.Keyspace.CloneVT(), - } + r := new(CreateKeyspaceResponse) + r.Keyspace = m.Keyspace.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1134,12 +1170,11 @@ func (m *CreateShardRequest) CloneVT() *CreateShardRequest { if m == nil { return (*CreateShardRequest)(nil) } - r := &CreateShardRequest{ - Keyspace: m.Keyspace, - ShardName: m.ShardName, - Force: m.Force, - IncludeParent: m.IncludeParent, - } + r := new(CreateShardRequest) + r.Keyspace = m.Keyspace + r.ShardName = m.ShardName + r.Force = m.Force + r.IncludeParent = m.IncludeParent if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1155,11 +1190,10 @@ func (m *CreateShardResponse) CloneVT() *CreateShardResponse { if m == nil { return (*CreateShardResponse)(nil) } - r := &CreateShardResponse{ - Keyspace: m.Keyspace.CloneVT(), - Shard: m.Shard.CloneVT(), - ShardAlreadyExists: m.ShardAlreadyExists, - } + r := new(CreateShardResponse) + r.Keyspace = m.Keyspace.CloneVT() + r.Shard = m.Shard.CloneVT() + r.ShardAlreadyExists = m.ShardAlreadyExists if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1175,10 +1209,9 @@ func (m *DeleteCellInfoRequest) CloneVT() *DeleteCellInfoRequest { if m == nil { return (*DeleteCellInfoRequest)(nil) } - r := &DeleteCellInfoRequest{ - Name: m.Name, - Force: m.Force, - } + r := new(DeleteCellInfoRequest) + r.Name = m.Name + r.Force = m.Force if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1194,7 +1227,7 @@ func (m *DeleteCellInfoResponse) CloneVT() *DeleteCellInfoResponse { if m == nil { return (*DeleteCellInfoResponse)(nil) } - r := &DeleteCellInfoResponse{} + r := new(DeleteCellInfoResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1210,9 +1243,8 @@ func (m *DeleteCellsAliasRequest) CloneVT() *DeleteCellsAliasRequest { if m == nil { return (*DeleteCellsAliasRequest)(nil) } - r := &DeleteCellsAliasRequest{ - Name: m.Name, - } + r := new(DeleteCellsAliasRequest) + r.Name = m.Name if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1228,7 +1260,7 @@ func (m *DeleteCellsAliasResponse) CloneVT() *DeleteCellsAliasResponse { if m == nil { return (*DeleteCellsAliasResponse)(nil) } - r := &DeleteCellsAliasResponse{} + r := new(DeleteCellsAliasResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1244,11 +1276,10 @@ func (m *DeleteKeyspaceRequest) CloneVT() *DeleteKeyspaceRequest { if m == nil { return (*DeleteKeyspaceRequest)(nil) } - r := &DeleteKeyspaceRequest{ - Keyspace: m.Keyspace, - Recursive: m.Recursive, - Force: m.Force, - } + r := new(DeleteKeyspaceRequest) + r.Keyspace = m.Keyspace + r.Recursive = m.Recursive + r.Force = m.Force if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1264,7 +1295,7 @@ func (m *DeleteKeyspaceResponse) CloneVT() *DeleteKeyspaceResponse { if m == nil { return (*DeleteKeyspaceResponse)(nil) } - r := &DeleteKeyspaceResponse{} + r := new(DeleteKeyspaceResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1280,11 +1311,10 @@ func (m *DeleteShardsRequest) CloneVT() *DeleteShardsRequest { if m == nil { return (*DeleteShardsRequest)(nil) } - r := &DeleteShardsRequest{ - Recursive: m.Recursive, - EvenIfServing: m.EvenIfServing, - Force: m.Force, - } + r := new(DeleteShardsRequest) + r.Recursive = m.Recursive + r.EvenIfServing = m.EvenIfServing + r.Force = m.Force if rhs := m.Shards; rhs != nil { tmpContainer := make([]*Shard, len(rhs)) for k, v := range rhs { @@ -1307,7 +1337,7 @@ func (m *DeleteShardsResponse) CloneVT() *DeleteShardsResponse { if m == nil { return (*DeleteShardsResponse)(nil) } - r := &DeleteShardsResponse{} + r := new(DeleteShardsResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1323,9 +1353,8 @@ func (m *DeleteSrvVSchemaRequest) CloneVT() *DeleteSrvVSchemaRequest { if m == nil { return (*DeleteSrvVSchemaRequest)(nil) } - r := &DeleteSrvVSchemaRequest{ - Cell: m.Cell, - } + r := new(DeleteSrvVSchemaRequest) + r.Cell = m.Cell if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1341,7 +1370,7 @@ func (m *DeleteSrvVSchemaResponse) CloneVT() *DeleteSrvVSchemaResponse { if m == nil { return (*DeleteSrvVSchemaResponse)(nil) } - r := &DeleteSrvVSchemaResponse{} + r := new(DeleteSrvVSchemaResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1357,9 +1386,8 @@ func (m *DeleteTabletsRequest) CloneVT() *DeleteTabletsRequest { if m == nil { return (*DeleteTabletsRequest)(nil) } - r := &DeleteTabletsRequest{ - AllowPrimary: m.AllowPrimary, - } + r := new(DeleteTabletsRequest) + r.AllowPrimary = m.AllowPrimary if rhs := m.TabletAliases; rhs != nil { tmpContainer := make([]*topodata.TabletAlias, len(rhs)) for k, v := range rhs { @@ -1382,7 +1410,7 @@ func (m *DeleteTabletsResponse) CloneVT() *DeleteTabletsResponse { if m == nil { return (*DeleteTabletsResponse)(nil) } - r := &DeleteTabletsResponse{} + r := new(DeleteTabletsResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1398,14 +1426,14 @@ func (m *EmergencyReparentShardRequest) CloneVT() *EmergencyReparentShardRequest if m == nil { return (*EmergencyReparentShardRequest)(nil) } - r := &EmergencyReparentShardRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - NewPrimary: m.NewPrimary.CloneVT(), - WaitReplicasTimeout: m.WaitReplicasTimeout.CloneVT(), - PreventCrossCellPromotion: m.PreventCrossCellPromotion, - WaitForAllTablets: m.WaitForAllTablets, - } + r := new(EmergencyReparentShardRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.NewPrimary = m.NewPrimary.CloneVT() + r.WaitReplicasTimeout = m.WaitReplicasTimeout.CloneVT() + r.PreventCrossCellPromotion = m.PreventCrossCellPromotion + r.WaitForAllTablets = m.WaitForAllTablets + r.ExpectedPrimary = m.ExpectedPrimary.CloneVT() if rhs := m.IgnoreReplicas; rhs != nil { tmpContainer := make([]*topodata.TabletAlias, len(rhs)) for k, v := range rhs { @@ -1428,11 +1456,10 @@ func (m *EmergencyReparentShardResponse) CloneVT() *EmergencyReparentShardRespon if m == nil { return (*EmergencyReparentShardResponse)(nil) } - r := &EmergencyReparentShardResponse{ - Keyspace: m.Keyspace, - Shard: m.Shard, - PromotedPrimary: m.PromotedPrimary.CloneVT(), - } + r := new(EmergencyReparentShardResponse) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.PromotedPrimary = m.PromotedPrimary.CloneVT() if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -1455,12 +1482,11 @@ func (m *ExecuteFetchAsAppRequest) CloneVT() *ExecuteFetchAsAppRequest { if m == nil { return (*ExecuteFetchAsAppRequest)(nil) } - r := &ExecuteFetchAsAppRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - Query: m.Query, - MaxRows: m.MaxRows, - UsePool: m.UsePool, - } + r := new(ExecuteFetchAsAppRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.Query = m.Query + r.MaxRows = m.MaxRows + r.UsePool = m.UsePool if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1476,9 +1502,8 @@ func (m *ExecuteFetchAsAppResponse) CloneVT() *ExecuteFetchAsAppResponse { if m == nil { return (*ExecuteFetchAsAppResponse)(nil) } - r := &ExecuteFetchAsAppResponse{ - Result: m.Result.CloneVT(), - } + r := new(ExecuteFetchAsAppResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1494,13 +1519,12 @@ func (m *ExecuteFetchAsDBARequest) CloneVT() *ExecuteFetchAsDBARequest { if m == nil { return (*ExecuteFetchAsDBARequest)(nil) } - r := &ExecuteFetchAsDBARequest{ - TabletAlias: m.TabletAlias.CloneVT(), - Query: m.Query, - MaxRows: m.MaxRows, - DisableBinlogs: m.DisableBinlogs, - ReloadSchema: m.ReloadSchema, - } + r := new(ExecuteFetchAsDBARequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.Query = m.Query + r.MaxRows = m.MaxRows + r.DisableBinlogs = m.DisableBinlogs + r.ReloadSchema = m.ReloadSchema if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1516,9 +1540,8 @@ func (m *ExecuteFetchAsDBAResponse) CloneVT() *ExecuteFetchAsDBAResponse { if m == nil { return (*ExecuteFetchAsDBAResponse)(nil) } - r := &ExecuteFetchAsDBAResponse{ - Result: m.Result.CloneVT(), - } + r := new(ExecuteFetchAsDBAResponse) + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1534,10 +1557,9 @@ func (m *ExecuteHookRequest) CloneVT() *ExecuteHookRequest { if m == nil { return (*ExecuteHookRequest)(nil) } - r := &ExecuteHookRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - TabletHookRequest: m.TabletHookRequest.CloneVT(), - } + r := new(ExecuteHookRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.TabletHookRequest = m.TabletHookRequest.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1553,9 +1575,8 @@ func (m *ExecuteHookResponse) CloneVT() *ExecuteHookResponse { if m == nil { return (*ExecuteHookResponse)(nil) } - r := &ExecuteHookResponse{ - HookResult: m.HookResult.CloneVT(), - } + r := new(ExecuteHookResponse) + r.HookResult = m.HookResult.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1571,13 +1592,12 @@ func (m *ExecuteMultiFetchAsDBARequest) CloneVT() *ExecuteMultiFetchAsDBARequest if m == nil { return (*ExecuteMultiFetchAsDBARequest)(nil) } - r := &ExecuteMultiFetchAsDBARequest{ - TabletAlias: m.TabletAlias.CloneVT(), - Sql: m.Sql, - MaxRows: m.MaxRows, - DisableBinlogs: m.DisableBinlogs, - ReloadSchema: m.ReloadSchema, - } + r := new(ExecuteMultiFetchAsDBARequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.Sql = m.Sql + r.MaxRows = m.MaxRows + r.DisableBinlogs = m.DisableBinlogs + r.ReloadSchema = m.ReloadSchema if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1593,7 +1613,7 @@ func (m *ExecuteMultiFetchAsDBAResponse) CloneVT() *ExecuteMultiFetchAsDBARespon if m == nil { return (*ExecuteMultiFetchAsDBAResponse)(nil) } - r := &ExecuteMultiFetchAsDBAResponse{} + r := new(ExecuteMultiFetchAsDBAResponse) if rhs := m.Results; rhs != nil { tmpContainer := make([]*query.QueryResult, len(rhs)) for k, v := range rhs { @@ -1616,9 +1636,8 @@ func (m *FindAllShardsInKeyspaceRequest) CloneVT() *FindAllShardsInKeyspaceReque if m == nil { return (*FindAllShardsInKeyspaceRequest)(nil) } - r := &FindAllShardsInKeyspaceRequest{ - Keyspace: m.Keyspace, - } + r := new(FindAllShardsInKeyspaceRequest) + r.Keyspace = m.Keyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1634,7 +1653,7 @@ func (m *FindAllShardsInKeyspaceResponse) CloneVT() *FindAllShardsInKeyspaceResp if m == nil { return (*FindAllShardsInKeyspaceResponse)(nil) } - r := &FindAllShardsInKeyspaceResponse{} + r := new(FindAllShardsInKeyspaceResponse) if rhs := m.Shards; rhs != nil { tmpContainer := make(map[string]*Shard, len(rhs)) for k, v := range rhs { @@ -1657,10 +1676,9 @@ func (m *ForceCutOverSchemaMigrationRequest) CloneVT() *ForceCutOverSchemaMigrat if m == nil { return (*ForceCutOverSchemaMigrationRequest)(nil) } - r := &ForceCutOverSchemaMigrationRequest{ - Keyspace: m.Keyspace, - Uuid: m.Uuid, - } + r := new(ForceCutOverSchemaMigrationRequest) + r.Keyspace = m.Keyspace + r.Uuid = m.Uuid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1676,7 +1694,7 @@ func (m *ForceCutOverSchemaMigrationResponse) CloneVT() *ForceCutOverSchemaMigra if m == nil { return (*ForceCutOverSchemaMigrationResponse)(nil) } - r := &ForceCutOverSchemaMigrationResponse{} + r := new(ForceCutOverSchemaMigrationResponse) if rhs := m.RowsAffectedByShard; rhs != nil { tmpContainer := make(map[string]uint64, len(rhs)) for k, v := range rhs { @@ -1699,13 +1717,12 @@ func (m *GetBackupsRequest) CloneVT() *GetBackupsRequest { if m == nil { return (*GetBackupsRequest)(nil) } - r := &GetBackupsRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - Limit: m.Limit, - Detailed: m.Detailed, - DetailedLimit: m.DetailedLimit, - } + r := new(GetBackupsRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Limit = m.Limit + r.Detailed = m.Detailed + r.DetailedLimit = m.DetailedLimit if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1721,7 +1738,7 @@ func (m *GetBackupsResponse) CloneVT() *GetBackupsResponse { if m == nil { return (*GetBackupsResponse)(nil) } - r := &GetBackupsResponse{} + r := new(GetBackupsResponse) if rhs := m.Backups; rhs != nil { tmpContainer := make([]*mysqlctl.BackupInfo, len(rhs)) for k, v := range rhs { @@ -1744,9 +1761,8 @@ func (m *GetCellInfoRequest) CloneVT() *GetCellInfoRequest { if m == nil { return (*GetCellInfoRequest)(nil) } - r := &GetCellInfoRequest{ - Cell: m.Cell, - } + r := new(GetCellInfoRequest) + r.Cell = m.Cell if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1762,9 +1778,8 @@ func (m *GetCellInfoResponse) CloneVT() *GetCellInfoResponse { if m == nil { return (*GetCellInfoResponse)(nil) } - r := &GetCellInfoResponse{ - CellInfo: m.CellInfo.CloneVT(), - } + r := new(GetCellInfoResponse) + r.CellInfo = m.CellInfo.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1780,7 +1795,7 @@ func (m *GetCellInfoNamesRequest) CloneVT() *GetCellInfoNamesRequest { if m == nil { return (*GetCellInfoNamesRequest)(nil) } - r := &GetCellInfoNamesRequest{} + r := new(GetCellInfoNamesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1796,7 +1811,7 @@ func (m *GetCellInfoNamesResponse) CloneVT() *GetCellInfoNamesResponse { if m == nil { return (*GetCellInfoNamesResponse)(nil) } - r := &GetCellInfoNamesResponse{} + r := new(GetCellInfoNamesResponse) if rhs := m.Names; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -1817,7 +1832,7 @@ func (m *GetCellsAliasesRequest) CloneVT() *GetCellsAliasesRequest { if m == nil { return (*GetCellsAliasesRequest)(nil) } - r := &GetCellsAliasesRequest{} + r := new(GetCellsAliasesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1833,7 +1848,7 @@ func (m *GetCellsAliasesResponse) CloneVT() *GetCellsAliasesResponse { if m == nil { return (*GetCellsAliasesResponse)(nil) } - r := &GetCellsAliasesResponse{} + r := new(GetCellsAliasesResponse) if rhs := m.Aliases; rhs != nil { tmpContainer := make(map[string]*topodata.CellsAlias, len(rhs)) for k, v := range rhs { @@ -1856,9 +1871,8 @@ func (m *GetFullStatusRequest) CloneVT() *GetFullStatusRequest { if m == nil { return (*GetFullStatusRequest)(nil) } - r := &GetFullStatusRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(GetFullStatusRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1874,9 +1888,8 @@ func (m *GetFullStatusResponse) CloneVT() *GetFullStatusResponse { if m == nil { return (*GetFullStatusResponse)(nil) } - r := &GetFullStatusResponse{ - Status: m.Status.CloneVT(), - } + r := new(GetFullStatusResponse) + r.Status = m.Status.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1892,7 +1905,7 @@ func (m *GetKeyspacesRequest) CloneVT() *GetKeyspacesRequest { if m == nil { return (*GetKeyspacesRequest)(nil) } - r := &GetKeyspacesRequest{} + r := new(GetKeyspacesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1908,7 +1921,7 @@ func (m *GetKeyspacesResponse) CloneVT() *GetKeyspacesResponse { if m == nil { return (*GetKeyspacesResponse)(nil) } - r := &GetKeyspacesResponse{} + r := new(GetKeyspacesResponse) if rhs := m.Keyspaces; rhs != nil { tmpContainer := make([]*Keyspace, len(rhs)) for k, v := range rhs { @@ -1931,9 +1944,8 @@ func (m *GetKeyspaceRequest) CloneVT() *GetKeyspaceRequest { if m == nil { return (*GetKeyspaceRequest)(nil) } - r := &GetKeyspaceRequest{ - Keyspace: m.Keyspace, - } + r := new(GetKeyspaceRequest) + r.Keyspace = m.Keyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1949,9 +1961,8 @@ func (m *GetKeyspaceResponse) CloneVT() *GetKeyspaceResponse { if m == nil { return (*GetKeyspaceResponse)(nil) } - r := &GetKeyspaceResponse{ - Keyspace: m.Keyspace.CloneVT(), - } + r := new(GetKeyspaceResponse) + r.Keyspace = m.Keyspace.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1967,9 +1978,8 @@ func (m *GetPermissionsRequest) CloneVT() *GetPermissionsRequest { if m == nil { return (*GetPermissionsRequest)(nil) } - r := &GetPermissionsRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(GetPermissionsRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -1985,9 +1995,8 @@ func (m *GetPermissionsResponse) CloneVT() *GetPermissionsResponse { if m == nil { return (*GetPermissionsResponse)(nil) } - r := &GetPermissionsResponse{ - Permissions: m.Permissions.CloneVT(), - } + r := new(GetPermissionsResponse) + r.Permissions = m.Permissions.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2003,7 +2012,7 @@ func (m *GetKeyspaceRoutingRulesRequest) CloneVT() *GetKeyspaceRoutingRulesReque if m == nil { return (*GetKeyspaceRoutingRulesRequest)(nil) } - r := &GetKeyspaceRoutingRulesRequest{} + r := new(GetKeyspaceRoutingRulesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2019,9 +2028,8 @@ func (m *GetKeyspaceRoutingRulesResponse) CloneVT() *GetKeyspaceRoutingRulesResp if m == nil { return (*GetKeyspaceRoutingRulesResponse)(nil) } - r := &GetKeyspaceRoutingRulesResponse{ - KeyspaceRoutingRules: m.KeyspaceRoutingRules.CloneVT(), - } + r := new(GetKeyspaceRoutingRulesResponse) + r.KeyspaceRoutingRules = m.KeyspaceRoutingRules.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2037,7 +2045,7 @@ func (m *GetRoutingRulesRequest) CloneVT() *GetRoutingRulesRequest { if m == nil { return (*GetRoutingRulesRequest)(nil) } - r := &GetRoutingRulesRequest{} + r := new(GetRoutingRulesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2053,9 +2061,8 @@ func (m *GetRoutingRulesResponse) CloneVT() *GetRoutingRulesResponse { if m == nil { return (*GetRoutingRulesResponse)(nil) } - r := &GetRoutingRulesResponse{ - RoutingRules: m.RoutingRules.CloneVT(), - } + r := new(GetRoutingRulesResponse) + r.RoutingRules = m.RoutingRules.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2071,13 +2078,12 @@ func (m *GetSchemaRequest) CloneVT() *GetSchemaRequest { if m == nil { return (*GetSchemaRequest)(nil) } - r := &GetSchemaRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - IncludeViews: m.IncludeViews, - TableNamesOnly: m.TableNamesOnly, - TableSizesOnly: m.TableSizesOnly, - TableSchemaOnly: m.TableSchemaOnly, - } + r := new(GetSchemaRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.IncludeViews = m.IncludeViews + r.TableNamesOnly = m.TableNamesOnly + r.TableSizesOnly = m.TableSizesOnly + r.TableSchemaOnly = m.TableSchemaOnly if rhs := m.Tables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2103,9 +2109,8 @@ func (m *GetSchemaResponse) CloneVT() *GetSchemaResponse { if m == nil { return (*GetSchemaResponse)(nil) } - r := &GetSchemaResponse{ - Schema: m.Schema.CloneVT(), - } + r := new(GetSchemaResponse) + r.Schema = m.Schema.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2121,16 +2126,15 @@ func (m *GetSchemaMigrationsRequest) CloneVT() *GetSchemaMigrationsRequest { if m == nil { return (*GetSchemaMigrationsRequest)(nil) } - r := &GetSchemaMigrationsRequest{ - Keyspace: m.Keyspace, - Uuid: m.Uuid, - MigrationContext: m.MigrationContext, - Status: m.Status, - Recent: m.Recent.CloneVT(), - Order: m.Order, - Limit: m.Limit, - Skip: m.Skip, - } + r := new(GetSchemaMigrationsRequest) + r.Keyspace = m.Keyspace + r.Uuid = m.Uuid + r.MigrationContext = m.MigrationContext + r.Status = m.Status + r.Recent = m.Recent.CloneVT() + r.Order = m.Order + r.Limit = m.Limit + r.Skip = m.Skip if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2146,7 +2150,7 @@ func (m *GetSchemaMigrationsResponse) CloneVT() *GetSchemaMigrationsResponse { if m == nil { return (*GetSchemaMigrationsResponse)(nil) } - r := &GetSchemaMigrationsResponse{} + r := new(GetSchemaMigrationsResponse) if rhs := m.Migrations; rhs != nil { tmpContainer := make([]*SchemaMigration, len(rhs)) for k, v := range rhs { @@ -2169,10 +2173,9 @@ func (m *GetShardReplicationRequest) CloneVT() *GetShardReplicationRequest { if m == nil { return (*GetShardReplicationRequest)(nil) } - r := &GetShardReplicationRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - } + r := new(GetShardReplicationRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2193,7 +2196,7 @@ func (m *GetShardReplicationResponse) CloneVT() *GetShardReplicationResponse { if m == nil { return (*GetShardReplicationResponse)(nil) } - r := &GetShardReplicationResponse{} + r := new(GetShardReplicationResponse) if rhs := m.ShardReplicationByCell; rhs != nil { tmpContainer := make(map[string]*topodata.ShardReplication, len(rhs)) for k, v := range rhs { @@ -2216,10 +2219,9 @@ func (m *GetShardRequest) CloneVT() *GetShardRequest { if m == nil { return (*GetShardRequest)(nil) } - r := &GetShardRequest{ - Keyspace: m.Keyspace, - ShardName: m.ShardName, - } + r := new(GetShardRequest) + r.Keyspace = m.Keyspace + r.ShardName = m.ShardName if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2235,9 +2237,8 @@ func (m *GetShardResponse) CloneVT() *GetShardResponse { if m == nil { return (*GetShardResponse)(nil) } - r := &GetShardResponse{ - Shard: m.Shard.CloneVT(), - } + r := new(GetShardResponse) + r.Shard = m.Shard.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2253,7 +2254,7 @@ func (m *GetShardRoutingRulesRequest) CloneVT() *GetShardRoutingRulesRequest { if m == nil { return (*GetShardRoutingRulesRequest)(nil) } - r := &GetShardRoutingRulesRequest{} + r := new(GetShardRoutingRulesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2269,9 +2270,8 @@ func (m *GetShardRoutingRulesResponse) CloneVT() *GetShardRoutingRulesResponse { if m == nil { return (*GetShardRoutingRulesResponse)(nil) } - r := &GetShardRoutingRulesResponse{ - ShardRoutingRules: m.ShardRoutingRules.CloneVT(), - } + r := new(GetShardRoutingRulesResponse) + r.ShardRoutingRules = m.ShardRoutingRules.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2287,7 +2287,7 @@ func (m *GetSrvKeyspaceNamesRequest) CloneVT() *GetSrvKeyspaceNamesRequest { if m == nil { return (*GetSrvKeyspaceNamesRequest)(nil) } - r := &GetSrvKeyspaceNamesRequest{} + r := new(GetSrvKeyspaceNamesRequest) if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2308,7 +2308,7 @@ func (m *GetSrvKeyspaceNamesResponse_NameList) CloneVT() *GetSrvKeyspaceNamesRes if m == nil { return (*GetSrvKeyspaceNamesResponse_NameList)(nil) } - r := &GetSrvKeyspaceNamesResponse_NameList{} + r := new(GetSrvKeyspaceNamesResponse_NameList) if rhs := m.Names; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2329,7 +2329,7 @@ func (m *GetSrvKeyspaceNamesResponse) CloneVT() *GetSrvKeyspaceNamesResponse { if m == nil { return (*GetSrvKeyspaceNamesResponse)(nil) } - r := &GetSrvKeyspaceNamesResponse{} + r := new(GetSrvKeyspaceNamesResponse) if rhs := m.Names; rhs != nil { tmpContainer := make(map[string]*GetSrvKeyspaceNamesResponse_NameList, len(rhs)) for k, v := range rhs { @@ -2352,9 +2352,8 @@ func (m *GetSrvKeyspacesRequest) CloneVT() *GetSrvKeyspacesRequest { if m == nil { return (*GetSrvKeyspacesRequest)(nil) } - r := &GetSrvKeyspacesRequest{ - Keyspace: m.Keyspace, - } + r := new(GetSrvKeyspacesRequest) + r.Keyspace = m.Keyspace if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2375,7 +2374,7 @@ func (m *GetSrvKeyspacesResponse) CloneVT() *GetSrvKeyspacesResponse { if m == nil { return (*GetSrvKeyspacesResponse)(nil) } - r := &GetSrvKeyspacesResponse{} + r := new(GetSrvKeyspacesResponse) if rhs := m.SrvKeyspaces; rhs != nil { tmpContainer := make(map[string]*topodata.SrvKeyspace, len(rhs)) for k, v := range rhs { @@ -2398,19 +2397,18 @@ func (m *UpdateThrottlerConfigRequest) CloneVT() *UpdateThrottlerConfigRequest { if m == nil { return (*UpdateThrottlerConfigRequest)(nil) } - r := &UpdateThrottlerConfigRequest{ - Keyspace: m.Keyspace, - Enable: m.Enable, - Disable: m.Disable, - Threshold: m.Threshold, - CustomQuery: m.CustomQuery, - CustomQuerySet: m.CustomQuerySet, - CheckAsCheckSelf: m.CheckAsCheckSelf, - CheckAsCheckShard: m.CheckAsCheckShard, - ThrottledApp: m.ThrottledApp.CloneVT(), - MetricName: m.MetricName, - AppName: m.AppName, - } + r := new(UpdateThrottlerConfigRequest) + r.Keyspace = m.Keyspace + r.Enable = m.Enable + r.Disable = m.Disable + r.Threshold = m.Threshold + r.CustomQuery = m.CustomQuery + r.CustomQuerySet = m.CustomQuerySet + r.CheckAsCheckSelf = m.CheckAsCheckSelf + r.CheckAsCheckShard = m.CheckAsCheckShard + r.ThrottledApp = m.ThrottledApp.CloneVT() + r.MetricName = m.MetricName + r.AppName = m.AppName if rhs := m.AppCheckedMetrics; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2431,7 +2429,7 @@ func (m *UpdateThrottlerConfigResponse) CloneVT() *UpdateThrottlerConfigResponse if m == nil { return (*UpdateThrottlerConfigResponse)(nil) } - r := &UpdateThrottlerConfigResponse{} + r := new(UpdateThrottlerConfigResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2447,9 +2445,8 @@ func (m *GetSrvVSchemaRequest) CloneVT() *GetSrvVSchemaRequest { if m == nil { return (*GetSrvVSchemaRequest)(nil) } - r := &GetSrvVSchemaRequest{ - Cell: m.Cell, - } + r := new(GetSrvVSchemaRequest) + r.Cell = m.Cell if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2465,9 +2462,8 @@ func (m *GetSrvVSchemaResponse) CloneVT() *GetSrvVSchemaResponse { if m == nil { return (*GetSrvVSchemaResponse)(nil) } - r := &GetSrvVSchemaResponse{ - SrvVSchema: m.SrvVSchema.CloneVT(), - } + r := new(GetSrvVSchemaResponse) + r.SrvVSchema = m.SrvVSchema.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2483,7 +2479,7 @@ func (m *GetSrvVSchemasRequest) CloneVT() *GetSrvVSchemasRequest { if m == nil { return (*GetSrvVSchemasRequest)(nil) } - r := &GetSrvVSchemasRequest{} + r := new(GetSrvVSchemasRequest) if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2504,7 +2500,7 @@ func (m *GetSrvVSchemasResponse) CloneVT() *GetSrvVSchemasResponse { if m == nil { return (*GetSrvVSchemasResponse)(nil) } - r := &GetSrvVSchemasResponse{} + r := new(GetSrvVSchemasResponse) if rhs := m.SrvVSchemas; rhs != nil { tmpContainer := make(map[string]*vschema.SrvVSchema, len(rhs)) for k, v := range rhs { @@ -2527,9 +2523,8 @@ func (m *GetTabletRequest) CloneVT() *GetTabletRequest { if m == nil { return (*GetTabletRequest)(nil) } - r := &GetTabletRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(GetTabletRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2545,9 +2540,8 @@ func (m *GetTabletResponse) CloneVT() *GetTabletResponse { if m == nil { return (*GetTabletResponse)(nil) } - r := &GetTabletResponse{ - Tablet: m.Tablet.CloneVT(), - } + r := new(GetTabletResponse) + r.Tablet = m.Tablet.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2563,12 +2557,11 @@ func (m *GetTabletsRequest) CloneVT() *GetTabletsRequest { if m == nil { return (*GetTabletsRequest)(nil) } - r := &GetTabletsRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - Strict: m.Strict, - TabletType: m.TabletType, - } + r := new(GetTabletsRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Strict = m.Strict + r.TabletType = m.TabletType if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2596,7 +2589,7 @@ func (m *GetTabletsResponse) CloneVT() *GetTabletsResponse { if m == nil { return (*GetTabletsResponse)(nil) } - r := &GetTabletsResponse{} + r := new(GetTabletsResponse) if rhs := m.Tablets; rhs != nil { tmpContainer := make([]*topodata.Tablet, len(rhs)) for k, v := range rhs { @@ -2619,9 +2612,8 @@ func (m *GetThrottlerStatusRequest) CloneVT() *GetThrottlerStatusRequest { if m == nil { return (*GetThrottlerStatusRequest)(nil) } - r := &GetThrottlerStatusRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(GetThrottlerStatusRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2637,9 +2629,8 @@ func (m *GetThrottlerStatusResponse) CloneVT() *GetThrottlerStatusResponse { if m == nil { return (*GetThrottlerStatusResponse)(nil) } - r := &GetThrottlerStatusResponse{ - Status: m.Status.CloneVT(), - } + r := new(GetThrottlerStatusResponse) + r.Status = m.Status.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2655,11 +2646,10 @@ func (m *GetTopologyPathRequest) CloneVT() *GetTopologyPathRequest { if m == nil { return (*GetTopologyPathRequest)(nil) } - r := &GetTopologyPathRequest{ - Path: m.Path, - Version: m.Version, - AsJson: m.AsJson, - } + r := new(GetTopologyPathRequest) + r.Path = m.Path + r.Version = m.Version + r.AsJson = m.AsJson if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2675,9 +2665,8 @@ func (m *GetTopologyPathResponse) CloneVT() *GetTopologyPathResponse { if m == nil { return (*GetTopologyPathResponse)(nil) } - r := &GetTopologyPathResponse{ - Cell: m.Cell.CloneVT(), - } + r := new(GetTopologyPathResponse) + r.Cell = m.Cell.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2693,12 +2682,11 @@ func (m *TopologyCell) CloneVT() *TopologyCell { if m == nil { return (*TopologyCell)(nil) } - r := &TopologyCell{ - Name: m.Name, - Path: m.Path, - Data: m.Data, - Version: m.Version, - } + r := new(TopologyCell) + r.Name = m.Name + r.Path = m.Path + r.Data = m.Data + r.Version = m.Version if rhs := m.Children; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2715,13 +2703,93 @@ func (m *TopologyCell) CloneMessageVT() proto.Message { return m.CloneVT() } +func (m *GetUnresolvedTransactionsRequest) CloneVT() *GetUnresolvedTransactionsRequest { + if m == nil { + return (*GetUnresolvedTransactionsRequest)(nil) + } + r := new(GetUnresolvedTransactionsRequest) + r.Keyspace = m.Keyspace + r.AbandonAge = m.AbandonAge + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *GetUnresolvedTransactionsRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *GetUnresolvedTransactionsResponse) CloneVT() *GetUnresolvedTransactionsResponse { + if m == nil { + return (*GetUnresolvedTransactionsResponse)(nil) + } + r := new(GetUnresolvedTransactionsResponse) + if rhs := m.Transactions; rhs != nil { + tmpContainer := make([]*query.TransactionMetadata, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Transactions = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *GetUnresolvedTransactionsResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ConcludeTransactionRequest) CloneVT() *ConcludeTransactionRequest { + if m == nil { + return (*ConcludeTransactionRequest)(nil) + } + r := new(ConcludeTransactionRequest) + r.Dtid = m.Dtid + if rhs := m.Participants; rhs != nil { + tmpContainer := make([]*query.Target, len(rhs)) + for k, v := range rhs { + tmpContainer[k] = v.CloneVT() + } + r.Participants = tmpContainer + } + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ConcludeTransactionRequest) CloneMessageVT() proto.Message { + return m.CloneVT() +} + +func (m *ConcludeTransactionResponse) CloneVT() *ConcludeTransactionResponse { + if m == nil { + return (*ConcludeTransactionResponse)(nil) + } + r := new(ConcludeTransactionResponse) + if len(m.unknownFields) > 0 { + r.unknownFields = make([]byte, len(m.unknownFields)) + copy(r.unknownFields, m.unknownFields) + } + return r +} + +func (m *ConcludeTransactionResponse) CloneMessageVT() proto.Message { + return m.CloneVT() +} + func (m *GetVSchemaRequest) CloneVT() *GetVSchemaRequest { if m == nil { return (*GetVSchemaRequest)(nil) } - r := &GetVSchemaRequest{ - Keyspace: m.Keyspace, - } + r := new(GetVSchemaRequest) + r.Keyspace = m.Keyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2737,9 +2805,8 @@ func (m *GetVersionRequest) CloneVT() *GetVersionRequest { if m == nil { return (*GetVersionRequest)(nil) } - r := &GetVersionRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(GetVersionRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2755,9 +2822,8 @@ func (m *GetVersionResponse) CloneVT() *GetVersionResponse { if m == nil { return (*GetVersionResponse)(nil) } - r := &GetVersionResponse{ - Version: m.Version, - } + r := new(GetVersionResponse) + r.Version = m.Version if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2773,9 +2839,8 @@ func (m *GetVSchemaResponse) CloneVT() *GetVSchemaResponse { if m == nil { return (*GetVSchemaResponse)(nil) } - r := &GetVSchemaResponse{ - VSchema: m.VSchema.CloneVT(), - } + r := new(GetVSchemaResponse) + r.VSchema = m.VSchema.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2791,13 +2856,12 @@ func (m *GetWorkflowsRequest) CloneVT() *GetWorkflowsRequest { if m == nil { return (*GetWorkflowsRequest)(nil) } - r := &GetWorkflowsRequest{ - Keyspace: m.Keyspace, - ActiveOnly: m.ActiveOnly, - NameOnly: m.NameOnly, - Workflow: m.Workflow, - IncludeLogs: m.IncludeLogs, - } + r := new(GetWorkflowsRequest) + r.Keyspace = m.Keyspace + r.ActiveOnly = m.ActiveOnly + r.NameOnly = m.NameOnly + r.Workflow = m.Workflow + r.IncludeLogs = m.IncludeLogs if rhs := m.Shards; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2818,7 +2882,7 @@ func (m *GetWorkflowsResponse) CloneVT() *GetWorkflowsResponse { if m == nil { return (*GetWorkflowsResponse)(nil) } - r := &GetWorkflowsResponse{} + r := new(GetWorkflowsResponse) if rhs := m.Workflows; rhs != nil { tmpContainer := make([]*Workflow, len(rhs)) for k, v := range rhs { @@ -2841,13 +2905,12 @@ func (m *InitShardPrimaryRequest) CloneVT() *InitShardPrimaryRequest { if m == nil { return (*InitShardPrimaryRequest)(nil) } - r := &InitShardPrimaryRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - PrimaryElectTabletAlias: m.PrimaryElectTabletAlias.CloneVT(), - Force: m.Force, - WaitReplicasTimeout: m.WaitReplicasTimeout.CloneVT(), - } + r := new(InitShardPrimaryRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.PrimaryElectTabletAlias = m.PrimaryElectTabletAlias.CloneVT() + r.Force = m.Force + r.WaitReplicasTimeout = m.WaitReplicasTimeout.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2863,7 +2926,7 @@ func (m *InitShardPrimaryResponse) CloneVT() *InitShardPrimaryResponse { if m == nil { return (*InitShardPrimaryResponse)(nil) } - r := &InitShardPrimaryResponse{} + r := new(InitShardPrimaryResponse) if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -2886,10 +2949,9 @@ func (m *LaunchSchemaMigrationRequest) CloneVT() *LaunchSchemaMigrationRequest { if m == nil { return (*LaunchSchemaMigrationRequest)(nil) } - r := &LaunchSchemaMigrationRequest{ - Keyspace: m.Keyspace, - Uuid: m.Uuid, - } + r := new(LaunchSchemaMigrationRequest) + r.Keyspace = m.Keyspace + r.Uuid = m.Uuid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2905,7 +2967,7 @@ func (m *LaunchSchemaMigrationResponse) CloneVT() *LaunchSchemaMigrationResponse if m == nil { return (*LaunchSchemaMigrationResponse)(nil) } - r := &LaunchSchemaMigrationResponse{} + r := new(LaunchSchemaMigrationResponse) if rhs := m.RowsAffectedByShard; rhs != nil { tmpContainer := make(map[string]uint64, len(rhs)) for k, v := range rhs { @@ -2928,13 +2990,12 @@ func (m *LookupVindexCreateRequest) CloneVT() *LookupVindexCreateRequest { if m == nil { return (*LookupVindexCreateRequest)(nil) } - r := &LookupVindexCreateRequest{ - Keyspace: m.Keyspace, - Workflow: m.Workflow, - Vindex: m.Vindex.CloneVT(), - ContinueAfterCopyWithOwner: m.ContinueAfterCopyWithOwner, - TabletSelectionPreference: m.TabletSelectionPreference, - } + r := new(LookupVindexCreateRequest) + r.Keyspace = m.Keyspace + r.Workflow = m.Workflow + r.Vindex = m.Vindex.CloneVT() + r.ContinueAfterCopyWithOwner = m.ContinueAfterCopyWithOwner + r.TabletSelectionPreference = m.TabletSelectionPreference if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -2960,7 +3021,7 @@ func (m *LookupVindexCreateResponse) CloneVT() *LookupVindexCreateResponse { if m == nil { return (*LookupVindexCreateResponse)(nil) } - r := &LookupVindexCreateResponse{} + r := new(LookupVindexCreateResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2976,11 +3037,10 @@ func (m *LookupVindexExternalizeRequest) CloneVT() *LookupVindexExternalizeReque if m == nil { return (*LookupVindexExternalizeRequest)(nil) } - r := &LookupVindexExternalizeRequest{ - Keyspace: m.Keyspace, - Name: m.Name, - TableKeyspace: m.TableKeyspace, - } + r := new(LookupVindexExternalizeRequest) + r.Keyspace = m.Keyspace + r.Name = m.Name + r.TableKeyspace = m.TableKeyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -2996,9 +3056,8 @@ func (m *LookupVindexExternalizeResponse) CloneVT() *LookupVindexExternalizeResp if m == nil { return (*LookupVindexExternalizeResponse)(nil) } - r := &LookupVindexExternalizeResponse{ - WorkflowDeleted: m.WorkflowDeleted, - } + r := new(LookupVindexExternalizeResponse) + r.WorkflowDeleted = m.WorkflowDeleted if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3014,9 +3073,8 @@ func (m *MaterializeCreateRequest) CloneVT() *MaterializeCreateRequest { if m == nil { return (*MaterializeCreateRequest)(nil) } - r := &MaterializeCreateRequest{ - Settings: m.Settings.CloneVT(), - } + r := new(MaterializeCreateRequest) + r.Settings = m.Settings.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3032,7 +3090,7 @@ func (m *MaterializeCreateResponse) CloneVT() *MaterializeCreateResponse { if m == nil { return (*MaterializeCreateResponse)(nil) } - r := &MaterializeCreateResponse{} + r := new(MaterializeCreateResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3048,21 +3106,20 @@ func (m *MigrateCreateRequest) CloneVT() *MigrateCreateRequest { if m == nil { return (*MigrateCreateRequest)(nil) } - r := &MigrateCreateRequest{ - Workflow: m.Workflow, - SourceKeyspace: m.SourceKeyspace, - TargetKeyspace: m.TargetKeyspace, - MountName: m.MountName, - TabletSelectionPreference: m.TabletSelectionPreference, - AllTables: m.AllTables, - SourceTimeZone: m.SourceTimeZone, - OnDdl: m.OnDdl, - StopAfterCopy: m.StopAfterCopy, - DropForeignKeys: m.DropForeignKeys, - DeferSecondaryKeys: m.DeferSecondaryKeys, - AutoStart: m.AutoStart, - NoRoutingRules: m.NoRoutingRules, - } + r := new(MigrateCreateRequest) + r.Workflow = m.Workflow + r.SourceKeyspace = m.SourceKeyspace + r.TargetKeyspace = m.TargetKeyspace + r.MountName = m.MountName + r.TabletSelectionPreference = m.TabletSelectionPreference + r.AllTables = m.AllTables + r.SourceTimeZone = m.SourceTimeZone + r.OnDdl = m.OnDdl + r.StopAfterCopy = m.StopAfterCopy + r.DropForeignKeys = m.DropForeignKeys + r.DeferSecondaryKeys = m.DeferSecondaryKeys + r.AutoStart = m.AutoStart + r.NoRoutingRules = m.NoRoutingRules if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3098,14 +3155,13 @@ func (m *MigrateCompleteRequest) CloneVT() *MigrateCompleteRequest { if m == nil { return (*MigrateCompleteRequest)(nil) } - r := &MigrateCompleteRequest{ - Workflow: m.Workflow, - TargetKeyspace: m.TargetKeyspace, - KeepData: m.KeepData, - KeepRoutingRules: m.KeepRoutingRules, - RenameTables: m.RenameTables, - DryRun: m.DryRun, - } + r := new(MigrateCompleteRequest) + r.Workflow = m.Workflow + r.TargetKeyspace = m.TargetKeyspace + r.KeepData = m.KeepData + r.KeepRoutingRules = m.KeepRoutingRules + r.RenameTables = m.RenameTables + r.DryRun = m.DryRun if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3121,9 +3177,8 @@ func (m *MigrateCompleteResponse) CloneVT() *MigrateCompleteResponse { if m == nil { return (*MigrateCompleteResponse)(nil) } - r := &MigrateCompleteResponse{ - Summary: m.Summary, - } + r := new(MigrateCompleteResponse) + r.Summary = m.Summary if rhs := m.DryRunResults; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3144,12 +3199,11 @@ func (m *MountRegisterRequest) CloneVT() *MountRegisterRequest { if m == nil { return (*MountRegisterRequest)(nil) } - r := &MountRegisterRequest{ - TopoType: m.TopoType, - TopoServer: m.TopoServer, - TopoRoot: m.TopoRoot, - Name: m.Name, - } + r := new(MountRegisterRequest) + r.TopoType = m.TopoType + r.TopoServer = m.TopoServer + r.TopoRoot = m.TopoRoot + r.Name = m.Name if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3165,7 +3219,7 @@ func (m *MountRegisterResponse) CloneVT() *MountRegisterResponse { if m == nil { return (*MountRegisterResponse)(nil) } - r := &MountRegisterResponse{} + r := new(MountRegisterResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3181,9 +3235,8 @@ func (m *MountUnregisterRequest) CloneVT() *MountUnregisterRequest { if m == nil { return (*MountUnregisterRequest)(nil) } - r := &MountUnregisterRequest{ - Name: m.Name, - } + r := new(MountUnregisterRequest) + r.Name = m.Name if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3199,7 +3252,7 @@ func (m *MountUnregisterResponse) CloneVT() *MountUnregisterResponse { if m == nil { return (*MountUnregisterResponse)(nil) } - r := &MountUnregisterResponse{} + r := new(MountUnregisterResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3215,9 +3268,8 @@ func (m *MountShowRequest) CloneVT() *MountShowRequest { if m == nil { return (*MountShowRequest)(nil) } - r := &MountShowRequest{ - Name: m.Name, - } + r := new(MountShowRequest) + r.Name = m.Name if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3233,12 +3285,11 @@ func (m *MountShowResponse) CloneVT() *MountShowResponse { if m == nil { return (*MountShowResponse)(nil) } - r := &MountShowResponse{ - TopoType: m.TopoType, - TopoServer: m.TopoServer, - TopoRoot: m.TopoRoot, - Name: m.Name, - } + r := new(MountShowResponse) + r.TopoType = m.TopoType + r.TopoServer = m.TopoServer + r.TopoRoot = m.TopoRoot + r.Name = m.Name if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3254,7 +3305,7 @@ func (m *MountListRequest) CloneVT() *MountListRequest { if m == nil { return (*MountListRequest)(nil) } - r := &MountListRequest{} + r := new(MountListRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3270,7 +3321,7 @@ func (m *MountListResponse) CloneVT() *MountListResponse { if m == nil { return (*MountListResponse)(nil) } - r := &MountListResponse{} + r := new(MountListResponse) if rhs := m.Names; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3291,23 +3342,22 @@ func (m *MoveTablesCreateRequest) CloneVT() *MoveTablesCreateRequest { if m == nil { return (*MoveTablesCreateRequest)(nil) } - r := &MoveTablesCreateRequest{ - Workflow: m.Workflow, - SourceKeyspace: m.SourceKeyspace, - TargetKeyspace: m.TargetKeyspace, - TabletSelectionPreference: m.TabletSelectionPreference, - AllTables: m.AllTables, - ExternalClusterName: m.ExternalClusterName, - SourceTimeZone: m.SourceTimeZone, - OnDdl: m.OnDdl, - StopAfterCopy: m.StopAfterCopy, - DropForeignKeys: m.DropForeignKeys, - DeferSecondaryKeys: m.DeferSecondaryKeys, - AutoStart: m.AutoStart, - NoRoutingRules: m.NoRoutingRules, - AtomicCopy: m.AtomicCopy, - WorkflowOptions: m.WorkflowOptions.CloneVT(), - } + r := new(MoveTablesCreateRequest) + r.Workflow = m.Workflow + r.SourceKeyspace = m.SourceKeyspace + r.TargetKeyspace = m.TargetKeyspace + r.TabletSelectionPreference = m.TabletSelectionPreference + r.AllTables = m.AllTables + r.ExternalClusterName = m.ExternalClusterName + r.SourceTimeZone = m.SourceTimeZone + r.OnDdl = m.OnDdl + r.StopAfterCopy = m.StopAfterCopy + r.DropForeignKeys = m.DropForeignKeys + r.DeferSecondaryKeys = m.DeferSecondaryKeys + r.AutoStart = m.AutoStart + r.NoRoutingRules = m.NoRoutingRules + r.AtomicCopy = m.AtomicCopy + r.WorkflowOptions = m.WorkflowOptions.CloneVT() if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3348,10 +3398,9 @@ func (m *MoveTablesCreateResponse_TabletInfo) CloneVT() *MoveTablesCreateRespons if m == nil { return (*MoveTablesCreateResponse_TabletInfo)(nil) } - r := &MoveTablesCreateResponse_TabletInfo{ - Tablet: m.Tablet.CloneVT(), - Created: m.Created, - } + r := new(MoveTablesCreateResponse_TabletInfo) + r.Tablet = m.Tablet.CloneVT() + r.Created = m.Created if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3367,9 +3416,8 @@ func (m *MoveTablesCreateResponse) CloneVT() *MoveTablesCreateResponse { if m == nil { return (*MoveTablesCreateResponse)(nil) } - r := &MoveTablesCreateResponse{ - Summary: m.Summary, - } + r := new(MoveTablesCreateResponse) + r.Summary = m.Summary if rhs := m.Details; rhs != nil { tmpContainer := make([]*MoveTablesCreateResponse_TabletInfo, len(rhs)) for k, v := range rhs { @@ -3392,14 +3440,13 @@ func (m *MoveTablesCompleteRequest) CloneVT() *MoveTablesCompleteRequest { if m == nil { return (*MoveTablesCompleteRequest)(nil) } - r := &MoveTablesCompleteRequest{ - Workflow: m.Workflow, - TargetKeyspace: m.TargetKeyspace, - KeepData: m.KeepData, - KeepRoutingRules: m.KeepRoutingRules, - RenameTables: m.RenameTables, - DryRun: m.DryRun, - } + r := new(MoveTablesCompleteRequest) + r.Workflow = m.Workflow + r.TargetKeyspace = m.TargetKeyspace + r.KeepData = m.KeepData + r.KeepRoutingRules = m.KeepRoutingRules + r.RenameTables = m.RenameTables + r.DryRun = m.DryRun if rhs := m.Shards; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3420,9 +3467,8 @@ func (m *MoveTablesCompleteResponse) CloneVT() *MoveTablesCompleteResponse { if m == nil { return (*MoveTablesCompleteResponse)(nil) } - r := &MoveTablesCompleteResponse{ - Summary: m.Summary, - } + r := new(MoveTablesCompleteResponse) + r.Summary = m.Summary if rhs := m.DryRunResults; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3443,9 +3489,8 @@ func (m *PingTabletRequest) CloneVT() *PingTabletRequest { if m == nil { return (*PingTabletRequest)(nil) } - r := &PingTabletRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(PingTabletRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3461,7 +3506,7 @@ func (m *PingTabletResponse) CloneVT() *PingTabletResponse { if m == nil { return (*PingTabletResponse)(nil) } - r := &PingTabletResponse{} + r := new(PingTabletResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3477,14 +3522,15 @@ func (m *PlannedReparentShardRequest) CloneVT() *PlannedReparentShardRequest { if m == nil { return (*PlannedReparentShardRequest)(nil) } - r := &PlannedReparentShardRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - NewPrimary: m.NewPrimary.CloneVT(), - AvoidPrimary: m.AvoidPrimary.CloneVT(), - WaitReplicasTimeout: m.WaitReplicasTimeout.CloneVT(), - TolerableReplicationLag: m.TolerableReplicationLag.CloneVT(), - } + r := new(PlannedReparentShardRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.NewPrimary = m.NewPrimary.CloneVT() + r.AvoidPrimary = m.AvoidPrimary.CloneVT() + r.WaitReplicasTimeout = m.WaitReplicasTimeout.CloneVT() + r.TolerableReplicationLag = m.TolerableReplicationLag.CloneVT() + r.AllowCrossCellPromotion = m.AllowCrossCellPromotion + r.ExpectedPrimary = m.ExpectedPrimary.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3500,11 +3546,10 @@ func (m *PlannedReparentShardResponse) CloneVT() *PlannedReparentShardResponse { if m == nil { return (*PlannedReparentShardResponse)(nil) } - r := &PlannedReparentShardResponse{ - Keyspace: m.Keyspace, - Shard: m.Shard, - PromotedPrimary: m.PromotedPrimary.CloneVT(), - } + r := new(PlannedReparentShardResponse) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.PromotedPrimary = m.PromotedPrimary.CloneVT() if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -3527,10 +3572,9 @@ func (m *RebuildKeyspaceGraphRequest) CloneVT() *RebuildKeyspaceGraphRequest { if m == nil { return (*RebuildKeyspaceGraphRequest)(nil) } - r := &RebuildKeyspaceGraphRequest{ - Keyspace: m.Keyspace, - AllowPartial: m.AllowPartial, - } + r := new(RebuildKeyspaceGraphRequest) + r.Keyspace = m.Keyspace + r.AllowPartial = m.AllowPartial if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3551,7 +3595,7 @@ func (m *RebuildKeyspaceGraphResponse) CloneVT() *RebuildKeyspaceGraphResponse { if m == nil { return (*RebuildKeyspaceGraphResponse)(nil) } - r := &RebuildKeyspaceGraphResponse{} + r := new(RebuildKeyspaceGraphResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3567,7 +3611,7 @@ func (m *RebuildVSchemaGraphRequest) CloneVT() *RebuildVSchemaGraphRequest { if m == nil { return (*RebuildVSchemaGraphRequest)(nil) } - r := &RebuildVSchemaGraphRequest{} + r := new(RebuildVSchemaGraphRequest) if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3588,7 +3632,7 @@ func (m *RebuildVSchemaGraphResponse) CloneVT() *RebuildVSchemaGraphResponse { if m == nil { return (*RebuildVSchemaGraphResponse)(nil) } - r := &RebuildVSchemaGraphResponse{} + r := new(RebuildVSchemaGraphResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3604,9 +3648,8 @@ func (m *RefreshStateRequest) CloneVT() *RefreshStateRequest { if m == nil { return (*RefreshStateRequest)(nil) } - r := &RefreshStateRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(RefreshStateRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3622,7 +3665,7 @@ func (m *RefreshStateResponse) CloneVT() *RefreshStateResponse { if m == nil { return (*RefreshStateResponse)(nil) } - r := &RefreshStateResponse{} + r := new(RefreshStateResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3638,10 +3681,9 @@ func (m *RefreshStateByShardRequest) CloneVT() *RefreshStateByShardRequest { if m == nil { return (*RefreshStateByShardRequest)(nil) } - r := &RefreshStateByShardRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - } + r := new(RefreshStateByShardRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3662,10 +3704,9 @@ func (m *RefreshStateByShardResponse) CloneVT() *RefreshStateByShardResponse { if m == nil { return (*RefreshStateByShardResponse)(nil) } - r := &RefreshStateByShardResponse{ - IsPartialRefresh: m.IsPartialRefresh, - PartialRefreshDetails: m.PartialRefreshDetails, - } + r := new(RefreshStateByShardResponse) + r.IsPartialRefresh = m.IsPartialRefresh + r.PartialRefreshDetails = m.PartialRefreshDetails if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3681,9 +3722,8 @@ func (m *ReloadSchemaRequest) CloneVT() *ReloadSchemaRequest { if m == nil { return (*ReloadSchemaRequest)(nil) } - r := &ReloadSchemaRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(ReloadSchemaRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3699,7 +3739,7 @@ func (m *ReloadSchemaResponse) CloneVT() *ReloadSchemaResponse { if m == nil { return (*ReloadSchemaResponse)(nil) } - r := &ReloadSchemaResponse{} + r := new(ReloadSchemaResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3715,12 +3755,11 @@ func (m *ReloadSchemaKeyspaceRequest) CloneVT() *ReloadSchemaKeyspaceRequest { if m == nil { return (*ReloadSchemaKeyspaceRequest)(nil) } - r := &ReloadSchemaKeyspaceRequest{ - Keyspace: m.Keyspace, - WaitPosition: m.WaitPosition, - IncludePrimary: m.IncludePrimary, - Concurrency: m.Concurrency, - } + r := new(ReloadSchemaKeyspaceRequest) + r.Keyspace = m.Keyspace + r.WaitPosition = m.WaitPosition + r.IncludePrimary = m.IncludePrimary + r.Concurrency = m.Concurrency if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3736,7 +3775,7 @@ func (m *ReloadSchemaKeyspaceResponse) CloneVT() *ReloadSchemaKeyspaceResponse { if m == nil { return (*ReloadSchemaKeyspaceResponse)(nil) } - r := &ReloadSchemaKeyspaceResponse{} + r := new(ReloadSchemaKeyspaceResponse) if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -3759,13 +3798,12 @@ func (m *ReloadSchemaShardRequest) CloneVT() *ReloadSchemaShardRequest { if m == nil { return (*ReloadSchemaShardRequest)(nil) } - r := &ReloadSchemaShardRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - WaitPosition: m.WaitPosition, - IncludePrimary: m.IncludePrimary, - Concurrency: m.Concurrency, - } + r := new(ReloadSchemaShardRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.WaitPosition = m.WaitPosition + r.IncludePrimary = m.IncludePrimary + r.Concurrency = m.Concurrency if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3781,7 +3819,7 @@ func (m *ReloadSchemaShardResponse) CloneVT() *ReloadSchemaShardResponse { if m == nil { return (*ReloadSchemaShardResponse)(nil) } - r := &ReloadSchemaShardResponse{} + r := new(ReloadSchemaShardResponse) if rhs := m.Events; rhs != nil { tmpContainer := make([]*logutil.Event, len(rhs)) for k, v := range rhs { @@ -3804,11 +3842,10 @@ func (m *RemoveBackupRequest) CloneVT() *RemoveBackupRequest { if m == nil { return (*RemoveBackupRequest)(nil) } - r := &RemoveBackupRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - Name: m.Name, - } + r := new(RemoveBackupRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Name = m.Name if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3824,7 +3861,7 @@ func (m *RemoveBackupResponse) CloneVT() *RemoveBackupResponse { if m == nil { return (*RemoveBackupResponse)(nil) } - r := &RemoveBackupResponse{} + r := new(RemoveBackupResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3840,12 +3877,11 @@ func (m *RemoveKeyspaceCellRequest) CloneVT() *RemoveKeyspaceCellRequest { if m == nil { return (*RemoveKeyspaceCellRequest)(nil) } - r := &RemoveKeyspaceCellRequest{ - Keyspace: m.Keyspace, - Cell: m.Cell, - Force: m.Force, - Recursive: m.Recursive, - } + r := new(RemoveKeyspaceCellRequest) + r.Keyspace = m.Keyspace + r.Cell = m.Cell + r.Force = m.Force + r.Recursive = m.Recursive if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3861,7 +3897,7 @@ func (m *RemoveKeyspaceCellResponse) CloneVT() *RemoveKeyspaceCellResponse { if m == nil { return (*RemoveKeyspaceCellResponse)(nil) } - r := &RemoveKeyspaceCellResponse{} + r := new(RemoveKeyspaceCellResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3877,13 +3913,12 @@ func (m *RemoveShardCellRequest) CloneVT() *RemoveShardCellRequest { if m == nil { return (*RemoveShardCellRequest)(nil) } - r := &RemoveShardCellRequest{ - Keyspace: m.Keyspace, - ShardName: m.ShardName, - Cell: m.Cell, - Force: m.Force, - Recursive: m.Recursive, - } + r := new(RemoveShardCellRequest) + r.Keyspace = m.Keyspace + r.ShardName = m.ShardName + r.Cell = m.Cell + r.Force = m.Force + r.Recursive = m.Recursive if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3899,7 +3934,7 @@ func (m *RemoveShardCellResponse) CloneVT() *RemoveShardCellResponse { if m == nil { return (*RemoveShardCellResponse)(nil) } - r := &RemoveShardCellResponse{} + r := new(RemoveShardCellResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3915,9 +3950,8 @@ func (m *ReparentTabletRequest) CloneVT() *ReparentTabletRequest { if m == nil { return (*ReparentTabletRequest)(nil) } - r := &ReparentTabletRequest{ - Tablet: m.Tablet.CloneVT(), - } + r := new(ReparentTabletRequest) + r.Tablet = m.Tablet.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3933,11 +3967,10 @@ func (m *ReparentTabletResponse) CloneVT() *ReparentTabletResponse { if m == nil { return (*ReparentTabletResponse)(nil) } - r := &ReparentTabletResponse{ - Keyspace: m.Keyspace, - Shard: m.Shard, - Primary: m.Primary.CloneVT(), - } + r := new(ReparentTabletResponse) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Primary = m.Primary.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -3953,16 +3986,16 @@ func (m *ReshardCreateRequest) CloneVT() *ReshardCreateRequest { if m == nil { return (*ReshardCreateRequest)(nil) } - r := &ReshardCreateRequest{ - Workflow: m.Workflow, - Keyspace: m.Keyspace, - TabletSelectionPreference: m.TabletSelectionPreference, - SkipSchemaCopy: m.SkipSchemaCopy, - OnDdl: m.OnDdl, - StopAfterCopy: m.StopAfterCopy, - DeferSecondaryKeys: m.DeferSecondaryKeys, - AutoStart: m.AutoStart, - } + r := new(ReshardCreateRequest) + r.Workflow = m.Workflow + r.Keyspace = m.Keyspace + r.TabletSelectionPreference = m.TabletSelectionPreference + r.SkipSchemaCopy = m.SkipSchemaCopy + r.OnDdl = m.OnDdl + r.StopAfterCopy = m.StopAfterCopy + r.DeferSecondaryKeys = m.DeferSecondaryKeys + r.AutoStart = m.AutoStart + r.WorkflowOptions = m.WorkflowOptions.CloneVT() if rhs := m.SourceShards; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -3998,12 +4031,16 @@ func (m *RestoreFromBackupRequest) CloneVT() *RestoreFromBackupRequest { if m == nil { return (*RestoreFromBackupRequest)(nil) } - r := &RestoreFromBackupRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - BackupTime: m.BackupTime.CloneVT(), - RestoreToPos: m.RestoreToPos, - DryRun: m.DryRun, - RestoreToTimestamp: m.RestoreToTimestamp.CloneVT(), + r := new(RestoreFromBackupRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.BackupTime = m.BackupTime.CloneVT() + r.RestoreToPos = m.RestoreToPos + r.DryRun = m.DryRun + r.RestoreToTimestamp = m.RestoreToTimestamp.CloneVT() + if rhs := m.AllowedBackupEngines; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.AllowedBackupEngines = tmpContainer } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -4020,12 +4057,11 @@ func (m *RestoreFromBackupResponse) CloneVT() *RestoreFromBackupResponse { if m == nil { return (*RestoreFromBackupResponse)(nil) } - r := &RestoreFromBackupResponse{ - TabletAlias: m.TabletAlias.CloneVT(), - Keyspace: m.Keyspace, - Shard: m.Shard, - Event: m.Event.CloneVT(), - } + r := new(RestoreFromBackupResponse) + r.TabletAlias = m.TabletAlias.CloneVT() + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Event = m.Event.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4041,10 +4077,9 @@ func (m *RetrySchemaMigrationRequest) CloneVT() *RetrySchemaMigrationRequest { if m == nil { return (*RetrySchemaMigrationRequest)(nil) } - r := &RetrySchemaMigrationRequest{ - Keyspace: m.Keyspace, - Uuid: m.Uuid, - } + r := new(RetrySchemaMigrationRequest) + r.Keyspace = m.Keyspace + r.Uuid = m.Uuid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4060,7 +4095,7 @@ func (m *RetrySchemaMigrationResponse) CloneVT() *RetrySchemaMigrationResponse { if m == nil { return (*RetrySchemaMigrationResponse)(nil) } - r := &RetrySchemaMigrationResponse{} + r := new(RetrySchemaMigrationResponse) if rhs := m.RowsAffectedByShard; rhs != nil { tmpContainer := make(map[string]uint64, len(rhs)) for k, v := range rhs { @@ -4083,9 +4118,8 @@ func (m *RunHealthCheckRequest) CloneVT() *RunHealthCheckRequest { if m == nil { return (*RunHealthCheckRequest)(nil) } - r := &RunHealthCheckRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(RunHealthCheckRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4101,7 +4135,7 @@ func (m *RunHealthCheckResponse) CloneVT() *RunHealthCheckResponse { if m == nil { return (*RunHealthCheckResponse)(nil) } - r := &RunHealthCheckResponse{} + r := new(RunHealthCheckResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4117,10 +4151,9 @@ func (m *SetKeyspaceDurabilityPolicyRequest) CloneVT() *SetKeyspaceDurabilityPol if m == nil { return (*SetKeyspaceDurabilityPolicyRequest)(nil) } - r := &SetKeyspaceDurabilityPolicyRequest{ - Keyspace: m.Keyspace, - DurabilityPolicy: m.DurabilityPolicy, - } + r := new(SetKeyspaceDurabilityPolicyRequest) + r.Keyspace = m.Keyspace + r.DurabilityPolicy = m.DurabilityPolicy if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4136,9 +4169,8 @@ func (m *SetKeyspaceDurabilityPolicyResponse) CloneVT() *SetKeyspaceDurabilityPo if m == nil { return (*SetKeyspaceDurabilityPolicyResponse)(nil) } - r := &SetKeyspaceDurabilityPolicyResponse{ - Keyspace: m.Keyspace.CloneVT(), - } + r := new(SetKeyspaceDurabilityPolicyResponse) + r.Keyspace = m.Keyspace.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4154,10 +4186,9 @@ func (m *SetKeyspaceShardingInfoRequest) CloneVT() *SetKeyspaceShardingInfoReque if m == nil { return (*SetKeyspaceShardingInfoRequest)(nil) } - r := &SetKeyspaceShardingInfoRequest{ - Keyspace: m.Keyspace, - Force: m.Force, - } + r := new(SetKeyspaceShardingInfoRequest) + r.Keyspace = m.Keyspace + r.Force = m.Force if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4173,9 +4204,8 @@ func (m *SetKeyspaceShardingInfoResponse) CloneVT() *SetKeyspaceShardingInfoResp if m == nil { return (*SetKeyspaceShardingInfoResponse)(nil) } - r := &SetKeyspaceShardingInfoResponse{ - Keyspace: m.Keyspace.CloneVT(), - } + r := new(SetKeyspaceShardingInfoResponse) + r.Keyspace = m.Keyspace.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4191,11 +4221,10 @@ func (m *SetShardIsPrimaryServingRequest) CloneVT() *SetShardIsPrimaryServingReq if m == nil { return (*SetShardIsPrimaryServingRequest)(nil) } - r := &SetShardIsPrimaryServingRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - IsServing: m.IsServing, - } + r := new(SetShardIsPrimaryServingRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.IsServing = m.IsServing if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4211,9 +4240,8 @@ func (m *SetShardIsPrimaryServingResponse) CloneVT() *SetShardIsPrimaryServingRe if m == nil { return (*SetShardIsPrimaryServingResponse)(nil) } - r := &SetShardIsPrimaryServingResponse{ - Shard: m.Shard.CloneVT(), - } + r := new(SetShardIsPrimaryServingResponse) + r.Shard = m.Shard.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4229,13 +4257,12 @@ func (m *SetShardTabletControlRequest) CloneVT() *SetShardTabletControlRequest { if m == nil { return (*SetShardTabletControlRequest)(nil) } - r := &SetShardTabletControlRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - TabletType: m.TabletType, - DisableQueryService: m.DisableQueryService, - Remove: m.Remove, - } + r := new(SetShardTabletControlRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.TabletType = m.TabletType + r.DisableQueryService = m.DisableQueryService + r.Remove = m.Remove if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -4261,9 +4288,8 @@ func (m *SetShardTabletControlResponse) CloneVT() *SetShardTabletControlResponse if m == nil { return (*SetShardTabletControlResponse)(nil) } - r := &SetShardTabletControlResponse{ - Shard: m.Shard.CloneVT(), - } + r := new(SetShardTabletControlResponse) + r.Shard = m.Shard.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4279,10 +4305,9 @@ func (m *SetWritableRequest) CloneVT() *SetWritableRequest { if m == nil { return (*SetWritableRequest)(nil) } - r := &SetWritableRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - Writable: m.Writable, - } + r := new(SetWritableRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.Writable = m.Writable if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4298,7 +4323,7 @@ func (m *SetWritableResponse) CloneVT() *SetWritableResponse { if m == nil { return (*SetWritableResponse)(nil) } - r := &SetWritableResponse{} + r := new(SetWritableResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4314,11 +4339,10 @@ func (m *ShardReplicationAddRequest) CloneVT() *ShardReplicationAddRequest { if m == nil { return (*ShardReplicationAddRequest)(nil) } - r := &ShardReplicationAddRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(ShardReplicationAddRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4334,7 +4358,7 @@ func (m *ShardReplicationAddResponse) CloneVT() *ShardReplicationAddResponse { if m == nil { return (*ShardReplicationAddResponse)(nil) } - r := &ShardReplicationAddResponse{} + r := new(ShardReplicationAddResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4350,11 +4374,10 @@ func (m *ShardReplicationFixRequest) CloneVT() *ShardReplicationFixRequest { if m == nil { return (*ShardReplicationFixRequest)(nil) } - r := &ShardReplicationFixRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - Cell: m.Cell, - } + r := new(ShardReplicationFixRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Cell = m.Cell if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4370,9 +4393,8 @@ func (m *ShardReplicationFixResponse) CloneVT() *ShardReplicationFixResponse { if m == nil { return (*ShardReplicationFixResponse)(nil) } - r := &ShardReplicationFixResponse{ - Error: m.Error.CloneVT(), - } + r := new(ShardReplicationFixResponse) + r.Error = m.Error.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4388,10 +4410,9 @@ func (m *ShardReplicationPositionsRequest) CloneVT() *ShardReplicationPositionsR if m == nil { return (*ShardReplicationPositionsRequest)(nil) } - r := &ShardReplicationPositionsRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - } + r := new(ShardReplicationPositionsRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4407,7 +4428,7 @@ func (m *ShardReplicationPositionsResponse) CloneVT() *ShardReplicationPositions if m == nil { return (*ShardReplicationPositionsResponse)(nil) } - r := &ShardReplicationPositionsResponse{} + r := new(ShardReplicationPositionsResponse) if rhs := m.ReplicationStatuses; rhs != nil { tmpContainer := make(map[string]*replicationdata.Status, len(rhs)) for k, v := range rhs { @@ -4437,11 +4458,10 @@ func (m *ShardReplicationRemoveRequest) CloneVT() *ShardReplicationRemoveRequest if m == nil { return (*ShardReplicationRemoveRequest)(nil) } - r := &ShardReplicationRemoveRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(ShardReplicationRemoveRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4457,7 +4477,7 @@ func (m *ShardReplicationRemoveResponse) CloneVT() *ShardReplicationRemoveRespon if m == nil { return (*ShardReplicationRemoveResponse)(nil) } - r := &ShardReplicationRemoveResponse{} + r := new(ShardReplicationRemoveResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4473,10 +4493,9 @@ func (m *SleepTabletRequest) CloneVT() *SleepTabletRequest { if m == nil { return (*SleepTabletRequest)(nil) } - r := &SleepTabletRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - Duration: m.Duration.CloneVT(), - } + r := new(SleepTabletRequest) + r.TabletAlias = m.TabletAlias.CloneVT() + r.Duration = m.Duration.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4492,7 +4511,7 @@ func (m *SleepTabletResponse) CloneVT() *SleepTabletResponse { if m == nil { return (*SleepTabletResponse)(nil) } - r := &SleepTabletResponse{} + r := new(SleepTabletResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4508,14 +4527,13 @@ func (m *SourceShardAddRequest) CloneVT() *SourceShardAddRequest { if m == nil { return (*SourceShardAddRequest)(nil) } - r := &SourceShardAddRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - Uid: m.Uid, - SourceKeyspace: m.SourceKeyspace, - SourceShard: m.SourceShard, - KeyRange: m.KeyRange.CloneVT(), - } + r := new(SourceShardAddRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Uid = m.Uid + r.SourceKeyspace = m.SourceKeyspace + r.SourceShard = m.SourceShard + r.KeyRange = m.KeyRange.CloneVT() if rhs := m.Tables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -4536,9 +4554,8 @@ func (m *SourceShardAddResponse) CloneVT() *SourceShardAddResponse { if m == nil { return (*SourceShardAddResponse)(nil) } - r := &SourceShardAddResponse{ - Shard: m.Shard.CloneVT(), - } + r := new(SourceShardAddResponse) + r.Shard = m.Shard.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4554,11 +4571,10 @@ func (m *SourceShardDeleteRequest) CloneVT() *SourceShardDeleteRequest { if m == nil { return (*SourceShardDeleteRequest)(nil) } - r := &SourceShardDeleteRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - Uid: m.Uid, - } + r := new(SourceShardDeleteRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.Uid = m.Uid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4574,9 +4590,8 @@ func (m *SourceShardDeleteResponse) CloneVT() *SourceShardDeleteResponse { if m == nil { return (*SourceShardDeleteResponse)(nil) } - r := &SourceShardDeleteResponse{ - Shard: m.Shard.CloneVT(), - } + r := new(SourceShardDeleteResponse) + r.Shard = m.Shard.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4592,9 +4607,8 @@ func (m *StartReplicationRequest) CloneVT() *StartReplicationRequest { if m == nil { return (*StartReplicationRequest)(nil) } - r := &StartReplicationRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(StartReplicationRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4610,7 +4624,7 @@ func (m *StartReplicationResponse) CloneVT() *StartReplicationResponse { if m == nil { return (*StartReplicationResponse)(nil) } - r := &StartReplicationResponse{} + r := new(StartReplicationResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4626,9 +4640,8 @@ func (m *StopReplicationRequest) CloneVT() *StopReplicationRequest { if m == nil { return (*StopReplicationRequest)(nil) } - r := &StopReplicationRequest{ - TabletAlias: m.TabletAlias.CloneVT(), - } + r := new(StopReplicationRequest) + r.TabletAlias = m.TabletAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4644,7 +4657,7 @@ func (m *StopReplicationResponse) CloneVT() *StopReplicationResponse { if m == nil { return (*StopReplicationResponse)(nil) } - r := &StopReplicationResponse{} + r := new(StopReplicationResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4660,9 +4673,8 @@ func (m *TabletExternallyReparentedRequest) CloneVT() *TabletExternallyReparente if m == nil { return (*TabletExternallyReparentedRequest)(nil) } - r := &TabletExternallyReparentedRequest{ - Tablet: m.Tablet.CloneVT(), - } + r := new(TabletExternallyReparentedRequest) + r.Tablet = m.Tablet.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4678,12 +4690,11 @@ func (m *TabletExternallyReparentedResponse) CloneVT() *TabletExternallyReparent if m == nil { return (*TabletExternallyReparentedResponse)(nil) } - r := &TabletExternallyReparentedResponse{ - Keyspace: m.Keyspace, - Shard: m.Shard, - NewPrimary: m.NewPrimary.CloneVT(), - OldPrimary: m.OldPrimary.CloneVT(), - } + r := new(TabletExternallyReparentedResponse) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.NewPrimary = m.NewPrimary.CloneVT() + r.OldPrimary = m.OldPrimary.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4699,10 +4710,9 @@ func (m *UpdateCellInfoRequest) CloneVT() *UpdateCellInfoRequest { if m == nil { return (*UpdateCellInfoRequest)(nil) } - r := &UpdateCellInfoRequest{ - Name: m.Name, - CellInfo: m.CellInfo.CloneVT(), - } + r := new(UpdateCellInfoRequest) + r.Name = m.Name + r.CellInfo = m.CellInfo.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4718,10 +4728,9 @@ func (m *UpdateCellInfoResponse) CloneVT() *UpdateCellInfoResponse { if m == nil { return (*UpdateCellInfoResponse)(nil) } - r := &UpdateCellInfoResponse{ - Name: m.Name, - CellInfo: m.CellInfo.CloneVT(), - } + r := new(UpdateCellInfoResponse) + r.Name = m.Name + r.CellInfo = m.CellInfo.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4737,10 +4746,9 @@ func (m *UpdateCellsAliasRequest) CloneVT() *UpdateCellsAliasRequest { if m == nil { return (*UpdateCellsAliasRequest)(nil) } - r := &UpdateCellsAliasRequest{ - Name: m.Name, - CellsAlias: m.CellsAlias.CloneVT(), - } + r := new(UpdateCellsAliasRequest) + r.Name = m.Name + r.CellsAlias = m.CellsAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4756,10 +4764,9 @@ func (m *UpdateCellsAliasResponse) CloneVT() *UpdateCellsAliasResponse { if m == nil { return (*UpdateCellsAliasResponse)(nil) } - r := &UpdateCellsAliasResponse{ - Name: m.Name, - CellsAlias: m.CellsAlias.CloneVT(), - } + r := new(UpdateCellsAliasResponse) + r.Name = m.Name + r.CellsAlias = m.CellsAlias.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4775,9 +4782,8 @@ func (m *ValidateRequest) CloneVT() *ValidateRequest { if m == nil { return (*ValidateRequest)(nil) } - r := &ValidateRequest{ - PingTablets: m.PingTablets, - } + r := new(ValidateRequest) + r.PingTablets = m.PingTablets if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4793,7 +4799,7 @@ func (m *ValidateResponse) CloneVT() *ValidateResponse { if m == nil { return (*ValidateResponse)(nil) } - r := &ValidateResponse{} + r := new(ValidateResponse) if rhs := m.Results; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -4821,10 +4827,9 @@ func (m *ValidateKeyspaceRequest) CloneVT() *ValidateKeyspaceRequest { if m == nil { return (*ValidateKeyspaceRequest)(nil) } - r := &ValidateKeyspaceRequest{ - Keyspace: m.Keyspace, - PingTablets: m.PingTablets, - } + r := new(ValidateKeyspaceRequest) + r.Keyspace = m.Keyspace + r.PingTablets = m.PingTablets if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4840,7 +4845,7 @@ func (m *ValidateKeyspaceResponse) CloneVT() *ValidateKeyspaceResponse { if m == nil { return (*ValidateKeyspaceResponse)(nil) } - r := &ValidateKeyspaceResponse{} + r := new(ValidateKeyspaceResponse) if rhs := m.Results; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -4868,12 +4873,11 @@ func (m *ValidateSchemaKeyspaceRequest) CloneVT() *ValidateSchemaKeyspaceRequest if m == nil { return (*ValidateSchemaKeyspaceRequest)(nil) } - r := &ValidateSchemaKeyspaceRequest{ - Keyspace: m.Keyspace, - IncludeViews: m.IncludeViews, - SkipNoPrimary: m.SkipNoPrimary, - IncludeVschema: m.IncludeVschema, - } + r := new(ValidateSchemaKeyspaceRequest) + r.Keyspace = m.Keyspace + r.IncludeViews = m.IncludeViews + r.SkipNoPrimary = m.SkipNoPrimary + r.IncludeVschema = m.IncludeVschema if rhs := m.ExcludeTables; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -4894,7 +4898,7 @@ func (m *ValidateSchemaKeyspaceResponse) CloneVT() *ValidateSchemaKeyspaceRespon if m == nil { return (*ValidateSchemaKeyspaceResponse)(nil) } - r := &ValidateSchemaKeyspaceResponse{} + r := new(ValidateSchemaKeyspaceResponse) if rhs := m.Results; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -4922,11 +4926,10 @@ func (m *ValidateShardRequest) CloneVT() *ValidateShardRequest { if m == nil { return (*ValidateShardRequest)(nil) } - r := &ValidateShardRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - PingTablets: m.PingTablets, - } + r := new(ValidateShardRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard + r.PingTablets = m.PingTablets if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4942,7 +4945,7 @@ func (m *ValidateShardResponse) CloneVT() *ValidateShardResponse { if m == nil { return (*ValidateShardResponse)(nil) } - r := &ValidateShardResponse{} + r := new(ValidateShardResponse) if rhs := m.Results; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -4963,9 +4966,8 @@ func (m *ValidateVersionKeyspaceRequest) CloneVT() *ValidateVersionKeyspaceReque if m == nil { return (*ValidateVersionKeyspaceRequest)(nil) } - r := &ValidateVersionKeyspaceRequest{ - Keyspace: m.Keyspace, - } + r := new(ValidateVersionKeyspaceRequest) + r.Keyspace = m.Keyspace if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -4981,7 +4983,7 @@ func (m *ValidateVersionKeyspaceResponse) CloneVT() *ValidateVersionKeyspaceResp if m == nil { return (*ValidateVersionKeyspaceResponse)(nil) } - r := &ValidateVersionKeyspaceResponse{} + r := new(ValidateVersionKeyspaceResponse) if rhs := m.Results; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -5009,10 +5011,9 @@ func (m *ValidateVersionShardRequest) CloneVT() *ValidateVersionShardRequest { if m == nil { return (*ValidateVersionShardRequest)(nil) } - r := &ValidateVersionShardRequest{ - Keyspace: m.Keyspace, - Shard: m.Shard, - } + r := new(ValidateVersionShardRequest) + r.Keyspace = m.Keyspace + r.Shard = m.Shard if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5028,7 +5029,7 @@ func (m *ValidateVersionShardResponse) CloneVT() *ValidateVersionShardResponse { if m == nil { return (*ValidateVersionShardResponse)(nil) } - r := &ValidateVersionShardResponse{} + r := new(ValidateVersionShardResponse) if rhs := m.Results; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -5049,10 +5050,9 @@ func (m *ValidateVSchemaRequest) CloneVT() *ValidateVSchemaRequest { if m == nil { return (*ValidateVSchemaRequest)(nil) } - r := &ValidateVSchemaRequest{ - Keyspace: m.Keyspace, - IncludeViews: m.IncludeViews, - } + r := new(ValidateVSchemaRequest) + r.Keyspace = m.Keyspace + r.IncludeViews = m.IncludeViews if rhs := m.Shards; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -5078,7 +5078,7 @@ func (m *ValidateVSchemaResponse) CloneVT() *ValidateVSchemaResponse { if m == nil { return (*ValidateVSchemaResponse)(nil) } - r := &ValidateVSchemaResponse{} + r := new(ValidateVSchemaResponse) if rhs := m.Results; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -5106,24 +5106,24 @@ func (m *VDiffCreateRequest) CloneVT() *VDiffCreateRequest { if m == nil { return (*VDiffCreateRequest)(nil) } - r := &VDiffCreateRequest{ - Workflow: m.Workflow, - TargetKeyspace: m.TargetKeyspace, - Uuid: m.Uuid, - TabletSelectionPreference: m.TabletSelectionPreference, - Limit: m.Limit, - FilteredReplicationWaitTime: m.FilteredReplicationWaitTime.CloneVT(), - DebugQuery: m.DebugQuery, - OnlyPKs: m.OnlyPKs, - UpdateTableStats: m.UpdateTableStats, - MaxExtraRowsToCompare: m.MaxExtraRowsToCompare, - Wait: m.Wait, - WaitUpdateInterval: m.WaitUpdateInterval.CloneVT(), - AutoRetry: m.AutoRetry, - Verbose: m.Verbose, - MaxReportSampleRows: m.MaxReportSampleRows, - MaxDiffDuration: m.MaxDiffDuration.CloneVT(), - } + r := new(VDiffCreateRequest) + r.Workflow = m.Workflow + r.TargetKeyspace = m.TargetKeyspace + r.Uuid = m.Uuid + r.TabletSelectionPreference = m.TabletSelectionPreference + r.Limit = m.Limit + r.FilteredReplicationWaitTime = m.FilteredReplicationWaitTime.CloneVT() + r.DebugQuery = m.DebugQuery + r.OnlyPKs = m.OnlyPKs + r.UpdateTableStats = m.UpdateTableStats + r.MaxExtraRowsToCompare = m.MaxExtraRowsToCompare + r.Wait = m.Wait + r.WaitUpdateInterval = m.WaitUpdateInterval.CloneVT() + r.AutoRetry = m.AutoRetry + r.Verbose = m.Verbose + r.MaxReportSampleRows = m.MaxReportSampleRows + r.MaxDiffDuration = m.MaxDiffDuration.CloneVT() + r.RowDiffColumnTruncateAt = m.RowDiffColumnTruncateAt if rhs := m.SourceCells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -5144,6 +5144,10 @@ func (m *VDiffCreateRequest) CloneVT() *VDiffCreateRequest { copy(tmpContainer, rhs) r.Tables = tmpContainer } + if rhs := m.AutoStart; rhs != nil { + tmpVal := *rhs + r.AutoStart = &tmpVal + } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5159,9 +5163,8 @@ func (m *VDiffCreateResponse) CloneVT() *VDiffCreateResponse { if m == nil { return (*VDiffCreateResponse)(nil) } - r := &VDiffCreateResponse{ - UUID: m.UUID, - } + r := new(VDiffCreateResponse) + r.UUID = m.UUID if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5177,11 +5180,10 @@ func (m *VDiffDeleteRequest) CloneVT() *VDiffDeleteRequest { if m == nil { return (*VDiffDeleteRequest)(nil) } - r := &VDiffDeleteRequest{ - Workflow: m.Workflow, - TargetKeyspace: m.TargetKeyspace, - Arg: m.Arg, - } + r := new(VDiffDeleteRequest) + r.Workflow = m.Workflow + r.TargetKeyspace = m.TargetKeyspace + r.Arg = m.Arg if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5197,7 +5199,7 @@ func (m *VDiffDeleteResponse) CloneVT() *VDiffDeleteResponse { if m == nil { return (*VDiffDeleteResponse)(nil) } - r := &VDiffDeleteResponse{} + r := new(VDiffDeleteResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5213,10 +5215,14 @@ func (m *VDiffResumeRequest) CloneVT() *VDiffResumeRequest { if m == nil { return (*VDiffResumeRequest)(nil) } - r := &VDiffResumeRequest{ - Workflow: m.Workflow, - TargetKeyspace: m.TargetKeyspace, - Uuid: m.Uuid, + r := new(VDiffResumeRequest) + r.Workflow = m.Workflow + r.TargetKeyspace = m.TargetKeyspace + r.Uuid = m.Uuid + if rhs := m.TargetShards; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.TargetShards = tmpContainer } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -5233,7 +5239,7 @@ func (m *VDiffResumeResponse) CloneVT() *VDiffResumeResponse { if m == nil { return (*VDiffResumeResponse)(nil) } - r := &VDiffResumeResponse{} + r := new(VDiffResumeResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5249,11 +5255,10 @@ func (m *VDiffShowRequest) CloneVT() *VDiffShowRequest { if m == nil { return (*VDiffShowRequest)(nil) } - r := &VDiffShowRequest{ - Workflow: m.Workflow, - TargetKeyspace: m.TargetKeyspace, - Arg: m.Arg, - } + r := new(VDiffShowRequest) + r.Workflow = m.Workflow + r.TargetKeyspace = m.TargetKeyspace + r.Arg = m.Arg if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5269,7 +5274,7 @@ func (m *VDiffShowResponse) CloneVT() *VDiffShowResponse { if m == nil { return (*VDiffShowResponse)(nil) } - r := &VDiffShowResponse{} + r := new(VDiffShowResponse) if rhs := m.TabletResponses; rhs != nil { tmpContainer := make(map[string]*tabletmanagerdata.VDiffResponse, len(rhs)) for k, v := range rhs { @@ -5292,10 +5297,14 @@ func (m *VDiffStopRequest) CloneVT() *VDiffStopRequest { if m == nil { return (*VDiffStopRequest)(nil) } - r := &VDiffStopRequest{ - Workflow: m.Workflow, - TargetKeyspace: m.TargetKeyspace, - Uuid: m.Uuid, + r := new(VDiffStopRequest) + r.Workflow = m.Workflow + r.TargetKeyspace = m.TargetKeyspace + r.Uuid = m.Uuid + if rhs := m.TargetShards; rhs != nil { + tmpContainer := make([]string, len(rhs)) + copy(tmpContainer, rhs) + r.TargetShards = tmpContainer } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -5312,7 +5321,7 @@ func (m *VDiffStopResponse) CloneVT() *VDiffStopResponse { if m == nil { return (*VDiffStopResponse)(nil) } - r := &VDiffStopResponse{} + r := new(VDiffStopResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5328,12 +5337,12 @@ func (m *WorkflowDeleteRequest) CloneVT() *WorkflowDeleteRequest { if m == nil { return (*WorkflowDeleteRequest)(nil) } - r := &WorkflowDeleteRequest{ - Keyspace: m.Keyspace, - Workflow: m.Workflow, - KeepData: m.KeepData, - KeepRoutingRules: m.KeepRoutingRules, - } + r := new(WorkflowDeleteRequest) + r.Keyspace = m.Keyspace + r.Workflow = m.Workflow + r.KeepData = m.KeepData + r.KeepRoutingRules = m.KeepRoutingRules + r.DeleteBatchSize = m.DeleteBatchSize if rhs := m.Shards; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -5354,10 +5363,9 @@ func (m *WorkflowDeleteResponse_TabletInfo) CloneVT() *WorkflowDeleteResponse_Ta if m == nil { return (*WorkflowDeleteResponse_TabletInfo)(nil) } - r := &WorkflowDeleteResponse_TabletInfo{ - Tablet: m.Tablet.CloneVT(), - Deleted: m.Deleted, - } + r := new(WorkflowDeleteResponse_TabletInfo) + r.Tablet = m.Tablet.CloneVT() + r.Deleted = m.Deleted if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5373,9 +5381,8 @@ func (m *WorkflowDeleteResponse) CloneVT() *WorkflowDeleteResponse { if m == nil { return (*WorkflowDeleteResponse)(nil) } - r := &WorkflowDeleteResponse{ - Summary: m.Summary, - } + r := new(WorkflowDeleteResponse) + r.Summary = m.Summary if rhs := m.Details; rhs != nil { tmpContainer := make([]*WorkflowDeleteResponse_TabletInfo, len(rhs)) for k, v := range rhs { @@ -5398,10 +5405,9 @@ func (m *WorkflowStatusRequest) CloneVT() *WorkflowStatusRequest { if m == nil { return (*WorkflowStatusRequest)(nil) } - r := &WorkflowStatusRequest{ - Keyspace: m.Keyspace, - Workflow: m.Workflow, - } + r := new(WorkflowStatusRequest) + r.Keyspace = m.Keyspace + r.Workflow = m.Workflow if rhs := m.Shards; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -5422,14 +5428,13 @@ func (m *WorkflowStatusResponse_TableCopyState) CloneVT() *WorkflowStatusRespons if m == nil { return (*WorkflowStatusResponse_TableCopyState)(nil) } - r := &WorkflowStatusResponse_TableCopyState{ - RowsCopied: m.RowsCopied, - RowsTotal: m.RowsTotal, - RowsPercentage: m.RowsPercentage, - BytesCopied: m.BytesCopied, - BytesTotal: m.BytesTotal, - BytesPercentage: m.BytesPercentage, - } + r := new(WorkflowStatusResponse_TableCopyState) + r.RowsCopied = m.RowsCopied + r.RowsTotal = m.RowsTotal + r.RowsPercentage = m.RowsPercentage + r.BytesCopied = m.BytesCopied + r.BytesTotal = m.BytesTotal + r.BytesPercentage = m.BytesPercentage if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5445,14 +5450,13 @@ func (m *WorkflowStatusResponse_ShardStreamState) CloneVT() *WorkflowStatusRespo if m == nil { return (*WorkflowStatusResponse_ShardStreamState)(nil) } - r := &WorkflowStatusResponse_ShardStreamState{ - Id: m.Id, - Tablet: m.Tablet.CloneVT(), - SourceShard: m.SourceShard, - Position: m.Position, - Status: m.Status, - Info: m.Info, - } + r := new(WorkflowStatusResponse_ShardStreamState) + r.Id = m.Id + r.Tablet = m.Tablet.CloneVT() + r.SourceShard = m.SourceShard + r.Position = m.Position + r.Status = m.Status + r.Info = m.Info if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5468,7 +5472,7 @@ func (m *WorkflowStatusResponse_ShardStreams) CloneVT() *WorkflowStatusResponse_ if m == nil { return (*WorkflowStatusResponse_ShardStreams)(nil) } - r := &WorkflowStatusResponse_ShardStreams{} + r := new(WorkflowStatusResponse_ShardStreams) if rhs := m.Streams; rhs != nil { tmpContainer := make([]*WorkflowStatusResponse_ShardStreamState, len(rhs)) for k, v := range rhs { @@ -5491,9 +5495,8 @@ func (m *WorkflowStatusResponse) CloneVT() *WorkflowStatusResponse { if m == nil { return (*WorkflowStatusResponse)(nil) } - r := &WorkflowStatusResponse{ - TrafficState: m.TrafficState, - } + r := new(WorkflowStatusResponse) + r.TrafficState = m.TrafficState if rhs := m.TableCopyState; rhs != nil { tmpContainer := make(map[string]*WorkflowStatusResponse_TableCopyState, len(rhs)) for k, v := range rhs { @@ -5523,16 +5526,16 @@ func (m *WorkflowSwitchTrafficRequest) CloneVT() *WorkflowSwitchTrafficRequest { if m == nil { return (*WorkflowSwitchTrafficRequest)(nil) } - r := &WorkflowSwitchTrafficRequest{ - Keyspace: m.Keyspace, - Workflow: m.Workflow, - MaxReplicationLagAllowed: m.MaxReplicationLagAllowed.CloneVT(), - EnableReverseReplication: m.EnableReverseReplication, - Direction: m.Direction, - Timeout: m.Timeout.CloneVT(), - DryRun: m.DryRun, - InitializeTargetSequences: m.InitializeTargetSequences, - } + r := new(WorkflowSwitchTrafficRequest) + r.Keyspace = m.Keyspace + r.Workflow = m.Workflow + r.MaxReplicationLagAllowed = m.MaxReplicationLagAllowed.CloneVT() + r.EnableReverseReplication = m.EnableReverseReplication + r.Direction = m.Direction + r.Timeout = m.Timeout.CloneVT() + r.DryRun = m.DryRun + r.InitializeTargetSequences = m.InitializeTargetSequences + r.Force = m.Force if rhs := m.Cells; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -5563,11 +5566,10 @@ func (m *WorkflowSwitchTrafficResponse) CloneVT() *WorkflowSwitchTrafficResponse if m == nil { return (*WorkflowSwitchTrafficResponse)(nil) } - r := &WorkflowSwitchTrafficResponse{ - Summary: m.Summary, - StartState: m.StartState, - CurrentState: m.CurrentState, - } + r := new(WorkflowSwitchTrafficResponse) + r.Summary = m.Summary + r.StartState = m.StartState + r.CurrentState = m.CurrentState if rhs := m.DryRunResults; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -5588,10 +5590,9 @@ func (m *WorkflowUpdateRequest) CloneVT() *WorkflowUpdateRequest { if m == nil { return (*WorkflowUpdateRequest)(nil) } - r := &WorkflowUpdateRequest{ - Keyspace: m.Keyspace, - TabletRequest: m.TabletRequest.CloneVT(), - } + r := new(WorkflowUpdateRequest) + r.Keyspace = m.Keyspace + r.TabletRequest = m.TabletRequest.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5607,10 +5608,9 @@ func (m *WorkflowUpdateResponse_TabletInfo) CloneVT() *WorkflowUpdateResponse_Ta if m == nil { return (*WorkflowUpdateResponse_TabletInfo)(nil) } - r := &WorkflowUpdateResponse_TabletInfo{ - Tablet: m.Tablet.CloneVT(), - Changed: m.Changed, - } + r := new(WorkflowUpdateResponse_TabletInfo) + r.Tablet = m.Tablet.CloneVT() + r.Changed = m.Changed if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5626,9 +5626,8 @@ func (m *WorkflowUpdateResponse) CloneVT() *WorkflowUpdateResponse { if m == nil { return (*WorkflowUpdateResponse)(nil) } - r := &WorkflowUpdateResponse{ - Summary: m.Summary, - } + r := new(WorkflowUpdateResponse) + r.Summary = m.Summary if rhs := m.Details; rhs != nil { tmpContainer := make([]*WorkflowUpdateResponse_TabletInfo, len(rhs)) for k, v := range rhs { @@ -5651,7 +5650,7 @@ func (m *GetMirrorRulesRequest) CloneVT() *GetMirrorRulesRequest { if m == nil { return (*GetMirrorRulesRequest)(nil) } - r := &GetMirrorRulesRequest{} + r := new(GetMirrorRulesRequest) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5667,9 +5666,8 @@ func (m *GetMirrorRulesResponse) CloneVT() *GetMirrorRulesResponse { if m == nil { return (*GetMirrorRulesResponse)(nil) } - r := &GetMirrorRulesResponse{ - MirrorRules: m.MirrorRules.CloneVT(), - } + r := new(GetMirrorRulesResponse) + r.MirrorRules = m.MirrorRules.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5685,11 +5683,10 @@ func (m *WorkflowMirrorTrafficRequest) CloneVT() *WorkflowMirrorTrafficRequest { if m == nil { return (*WorkflowMirrorTrafficRequest)(nil) } - r := &WorkflowMirrorTrafficRequest{ - Keyspace: m.Keyspace, - Workflow: m.Workflow, - Percent: m.Percent, - } + r := new(WorkflowMirrorTrafficRequest) + r.Keyspace = m.Keyspace + r.Workflow = m.Workflow + r.Percent = m.Percent if rhs := m.TabletTypes; rhs != nil { tmpContainer := make([]topodata.TabletType, len(rhs)) copy(tmpContainer, rhs) @@ -5710,11 +5707,10 @@ func (m *WorkflowMirrorTrafficResponse) CloneVT() *WorkflowMirrorTrafficResponse if m == nil { return (*WorkflowMirrorTrafficResponse)(nil) } - r := &WorkflowMirrorTrafficResponse{ - Summary: m.Summary, - StartState: m.StartState, - CurrentState: m.CurrentState, - } + r := new(WorkflowMirrorTrafficResponse) + r.Summary = m.Summary + r.StartState = m.StartState + r.CurrentState = m.CurrentState if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -5757,7 +5753,7 @@ func (m *ExecuteVtctlCommandRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e copy(dAtA[i:], m.unknownFields) } if m.ActionTimeout != 0 { - i = encodeVarint(dAtA, i, uint64(m.ActionTimeout)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ActionTimeout)) i-- dAtA[i] = 0x10 } @@ -5765,7 +5761,7 @@ func (m *ExecuteVtctlCommandRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.Args) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Args[iNdEx]) copy(dAtA[i:], m.Args[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Args[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Args[iNdEx]))) i-- dAtA[i] = 0xa } @@ -5809,7 +5805,7 @@ func (m *ExecuteVtctlCommandResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -5849,21 +5845,21 @@ func (m *TableMaterializeSettings) MarshalToSizedBufferVT(dAtA []byte) (int, err if len(m.CreateDdl) > 0 { i -= len(m.CreateDdl) copy(dAtA[i:], m.CreateDdl) - i = encodeVarint(dAtA, i, uint64(len(m.CreateDdl))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CreateDdl))) i-- dAtA[i] = 0x1a } if len(m.SourceExpression) > 0 { i -= len(m.SourceExpression) copy(dAtA[i:], m.SourceExpression) - i = encodeVarint(dAtA, i, uint64(len(m.SourceExpression))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceExpression))) i-- dAtA[i] = 0x12 } if len(m.TargetTable) > 0 { i -= len(m.TargetTable) copy(dAtA[i:], m.TargetTable) - i = encodeVarint(dAtA, i, uint64(len(m.TargetTable))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetTable))) i-- dAtA[i] = 0xa } @@ -5900,13 +5896,24 @@ func (m *MaterializeSettings) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.ReferenceTables) > 0 { + for iNdEx := len(m.ReferenceTables) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ReferenceTables[iNdEx]) + copy(dAtA[i:], m.ReferenceTables[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ReferenceTables[iNdEx]))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } + } if m.WorkflowOptions != nil { size, err := m.WorkflowOptions.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- @@ -5925,7 +5932,7 @@ func (m *MaterializeSettings) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x80 } if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) i-- dAtA[i] = 0x78 } @@ -5942,7 +5949,7 @@ func (m *MaterializeSettings) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.OnDdl) > 0 { i -= len(m.OnDdl) copy(dAtA[i:], m.OnDdl) - i = encodeVarint(dAtA, i, uint64(len(m.OnDdl))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.OnDdl))) i-- dAtA[i] = 0x6a } @@ -5950,7 +5957,7 @@ func (m *MaterializeSettings) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.SourceShards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SourceShards[iNdEx]) copy(dAtA[i:], m.SourceShards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.SourceShards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceShards[iNdEx]))) i-- dAtA[i] = 0x62 } @@ -5958,40 +5965,40 @@ func (m *MaterializeSettings) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.TargetTimeZone) > 0 { i -= len(m.TargetTimeZone) copy(dAtA[i:], m.TargetTimeZone) - i = encodeVarint(dAtA, i, uint64(len(m.TargetTimeZone))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetTimeZone))) i-- dAtA[i] = 0x5a } if len(m.SourceTimeZone) > 0 { i -= len(m.SourceTimeZone) copy(dAtA[i:], m.SourceTimeZone) - i = encodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) i-- dAtA[i] = 0x52 } if m.MaterializationIntent != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaterializationIntent)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaterializationIntent)) i-- dAtA[i] = 0x48 } if len(m.ExternalCluster) > 0 { i -= len(m.ExternalCluster) copy(dAtA[i:], m.ExternalCluster) - i = encodeVarint(dAtA, i, uint64(len(m.ExternalCluster))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExternalCluster))) i-- dAtA[i] = 0x42 } if len(m.TabletTypes) > 0 { i -= len(m.TabletTypes) copy(dAtA[i:], m.TabletTypes) - i = encodeVarint(dAtA, i, uint64(len(m.TabletTypes))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TabletTypes))) i-- dAtA[i] = 0x3a } if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0x32 } @@ -6002,7 +6009,7 @@ func (m *MaterializeSettings) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -6020,21 +6027,21 @@ func (m *MaterializeSettings) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x1a } if len(m.SourceKeyspace) > 0 { i -= len(m.SourceKeyspace) copy(dAtA[i:], m.SourceKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.SourceKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceKeyspace))) i-- dAtA[i] = 0x12 } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -6077,14 +6084,14 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -6124,7 +6131,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.RemovedForeignKeyNames) > 0 { i -= len(m.RemovedForeignKeyNames) copy(dAtA[i:], m.RemovedForeignKeyNames) - i = encodeVarint(dAtA, i, uint64(len(m.RemovedForeignKeyNames))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RemovedForeignKeyNames))) i-- dAtA[i] = 0x3 i-- @@ -6136,7 +6143,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x3 i-- @@ -6148,7 +6155,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x3 i-- @@ -6167,7 +6174,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x98 } if m.CutoverAttempts != 0 { - i = encodeVarint(dAtA, i, uint64(m.CutoverAttempts)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.CutoverAttempts)) i-- dAtA[i] = 0x3 i-- @@ -6176,7 +6183,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Stage) > 0 { i -= len(m.Stage) copy(dAtA[i:], m.Stage) - i = encodeVarint(dAtA, i, uint64(len(m.Stage))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Stage))) i-- dAtA[i] = 0x3 i-- @@ -6200,7 +6207,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2 i-- @@ -6209,7 +6216,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ComponentThrottled) > 0 { i -= len(m.ComponentThrottled) copy(dAtA[i:], m.ComponentThrottled) - i = encodeVarint(dAtA, i, uint64(len(m.ComponentThrottled))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ComponentThrottled))) i-- dAtA[i] = 0x2 i-- @@ -6221,7 +6228,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2 i-- @@ -6230,7 +6237,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.SpecialPlan) > 0 { i -= len(m.SpecialPlan) copy(dAtA[i:], m.SpecialPlan) - i = encodeVarint(dAtA, i, uint64(len(m.SpecialPlan))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SpecialPlan))) i-- dAtA[i] = 0x2 i-- @@ -6245,7 +6252,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0xdd } if m.VitessLivenessIndicator != 0 { - i = encodeVarint(dAtA, i, uint64(m.VitessLivenessIndicator)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.VitessLivenessIndicator)) i-- dAtA[i] = 0x2 i-- @@ -6278,7 +6285,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.RevertedUuid) > 0 { i -= len(m.RevertedUuid) copy(dAtA[i:], m.RevertedUuid) - i = encodeVarint(dAtA, i, uint64(len(m.RevertedUuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RevertedUuid))) i-- dAtA[i] = 0x2 i-- @@ -6299,7 +6306,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.RevertibleNotes) > 0 { i -= len(m.RevertibleNotes) copy(dAtA[i:], m.RevertibleNotes) - i = encodeVarint(dAtA, i, uint64(len(m.RevertibleNotes))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RevertibleNotes))) i-- dAtA[i] = 0x2 i-- @@ -6308,7 +6315,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ExpandedColumnNames) > 0 { i -= len(m.ExpandedColumnNames) copy(dAtA[i:], m.ExpandedColumnNames) - i = encodeVarint(dAtA, i, uint64(len(m.ExpandedColumnNames))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExpandedColumnNames))) i-- dAtA[i] = 0x2 i-- @@ -6317,7 +6324,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.DroppedNoDefaultColumnNames) > 0 { i -= len(m.DroppedNoDefaultColumnNames) copy(dAtA[i:], m.DroppedNoDefaultColumnNames) - i = encodeVarint(dAtA, i, uint64(len(m.DroppedNoDefaultColumnNames))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DroppedNoDefaultColumnNames))) i-- dAtA[i] = 0x2 i-- @@ -6326,7 +6333,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.RemovedUniqueKeyNames) > 0 { i -= len(m.RemovedUniqueKeyNames) copy(dAtA[i:], m.RemovedUniqueKeyNames) - i = encodeVarint(dAtA, i, uint64(len(m.RemovedUniqueKeyNames))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RemovedUniqueKeyNames))) i-- dAtA[i] = 0x2 i-- @@ -6350,7 +6357,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2 i-- @@ -6359,42 +6366,42 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.LogFile) > 0 { i -= len(m.LogFile) copy(dAtA[i:], m.LogFile) - i = encodeVarint(dAtA, i, uint64(len(m.LogFile))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LogFile))) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xfa } if m.RemovedUniqueKeys != 0 { - i = encodeVarint(dAtA, i, uint64(m.RemovedUniqueKeys)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RemovedUniqueKeys)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xf0 } if m.AddedUniqueKeys != 0 { - i = encodeVarint(dAtA, i, uint64(m.AddedUniqueKeys)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.AddedUniqueKeys)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xe8 } if m.TableRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.TableRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TableRows)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xe0 } if m.RowsCopied != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowsCopied)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowsCopied)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xd8 } if m.EtaSeconds != 0 { - i = encodeVarint(dAtA, i, uint64(m.EtaSeconds)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.EtaSeconds)) i-- dAtA[i] = 0x1 i-- @@ -6403,7 +6410,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Message) > 0 { i -= len(m.Message) copy(dAtA[i:], m.Message) - i = encodeVarint(dAtA, i, uint64(len(m.Message))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Message))) i-- dAtA[i] = 0x1 i-- @@ -6412,7 +6419,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.DdlAction) > 0 { i -= len(m.DdlAction) copy(dAtA[i:], m.DdlAction) - i = encodeVarint(dAtA, i, uint64(len(m.DdlAction))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DdlAction))) i-- dAtA[i] = 0x1 i-- @@ -6421,7 +6428,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.MigrationContext) > 0 { i -= len(m.MigrationContext) copy(dAtA[i:], m.MigrationContext) - i = encodeVarint(dAtA, i, uint64(len(m.MigrationContext))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MigrationContext))) i-- dAtA[i] = 0x1 i-- @@ -6453,14 +6460,14 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xa2 } if m.Retries != 0 { - i = encodeVarint(dAtA, i, uint64(m.Retries)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Retries)) i-- dAtA[i] = 0x1 i-- @@ -6469,7 +6476,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Artifacts) > 0 { i -= len(m.Artifacts) copy(dAtA[i:], m.Artifacts) - i = encodeVarint(dAtA, i, uint64(len(m.Artifacts))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Artifacts))) i-- dAtA[i] = 0x1 i-- @@ -6478,14 +6485,14 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.LogPath) > 0 { i -= len(m.LogPath) copy(dAtA[i:], m.LogPath) - i = encodeVarint(dAtA, i, uint64(len(m.LogPath))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LogPath))) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0x8a } if m.Status != 0 { - i = encodeVarint(dAtA, i, uint64(m.Status)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Status)) i-- dAtA[i] = 0x1 i-- @@ -6497,7 +6504,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x7a } @@ -6507,7 +6514,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x72 } @@ -6517,7 +6524,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x6a } @@ -6527,7 +6534,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x62 } @@ -6537,7 +6544,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x5a } @@ -6547,7 +6554,7 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x52 } @@ -6557,61 +6564,61 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x4a } if len(m.Options) > 0 { i -= len(m.Options) copy(dAtA[i:], m.Options) - i = encodeVarint(dAtA, i, uint64(len(m.Options))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Options))) i-- dAtA[i] = 0x42 } if m.Strategy != 0 { - i = encodeVarint(dAtA, i, uint64(m.Strategy)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Strategy)) i-- dAtA[i] = 0x38 } if len(m.MigrationStatement) > 0 { i -= len(m.MigrationStatement) copy(dAtA[i:], m.MigrationStatement) - i = encodeVarint(dAtA, i, uint64(len(m.MigrationStatement))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MigrationStatement))) i-- dAtA[i] = 0x32 } if len(m.Table) > 0 { i -= len(m.Table) copy(dAtA[i:], m.Table) - i = encodeVarint(dAtA, i, uint64(len(m.Table))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Table))) i-- dAtA[i] = 0x2a } if len(m.Schema) > 0 { i -= len(m.Schema) copy(dAtA[i:], m.Schema) - i = encodeVarint(dAtA, i, uint64(len(m.Schema))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Schema))) i-- dAtA[i] = 0x22 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0xa } @@ -6654,21 +6661,21 @@ func (m *Shard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -6705,29 +6712,50 @@ func (m *WorkflowOptions) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.GlobalKeyspace) > 0 { + i -= len(m.GlobalKeyspace) + copy(dAtA[i:], m.GlobalKeyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.GlobalKeyspace))) + i-- + dAtA[i] = 0x2a + } + if len(m.Config) > 0 { + for k := range m.Config { + v := m.Config[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x22 + } + } if len(m.Shards) > 0 { for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Shards[iNdEx]) copy(dAtA[i:], m.Shards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) i-- dAtA[i] = 0x1a } } - if m.StripShardedAutoIncrement { - i-- - if m.StripShardedAutoIncrement { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if m.ShardedAutoIncrementHandling != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ShardedAutoIncrementHandling)) i-- dAtA[i] = 0x10 } if len(m.TenantId) > 0 { i -= len(m.TenantId) copy(dAtA[i:], m.TenantId) - i = encodeVarint(dAtA, i, uint64(len(m.TenantId))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TenantId))) i-- dAtA[i] = 0xa } @@ -6768,7 +6796,7 @@ func (m *Workflow_ReplicationLocation) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Shards[iNdEx]) copy(dAtA[i:], m.Shards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -6776,7 +6804,7 @@ func (m *Workflow_ReplicationLocation) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -6830,7 +6858,7 @@ func (m *Workflow_ShardStream) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -6842,7 +6870,7 @@ func (m *Workflow_ShardStream) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -6881,21 +6909,21 @@ func (m *Workflow_Stream_CopyState) MarshalToSizedBufferVT(dAtA []byte) (int, er copy(dAtA[i:], m.unknownFields) } if m.StreamId != 0 { - i = encodeVarint(dAtA, i, uint64(m.StreamId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.StreamId)) i-- dAtA[i] = 0x18 } if len(m.LastPk) > 0 { i -= len(m.LastPk) copy(dAtA[i:], m.LastPk) - i = encodeVarint(dAtA, i, uint64(len(m.LastPk))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LastPk))) i-- dAtA[i] = 0x12 } if len(m.Table) > 0 { i -= len(m.Table) copy(dAtA[i:], m.Table) - i = encodeVarint(dAtA, i, uint64(len(m.Table))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Table))) i-- dAtA[i] = 0xa } @@ -6933,14 +6961,14 @@ func (m *Workflow_Stream_Log) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Count != 0 { - i = encodeVarint(dAtA, i, uint64(m.Count)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Count)) i-- dAtA[i] = 0x40 } if len(m.Message) > 0 { i -= len(m.Message) copy(dAtA[i:], m.Message) - i = encodeVarint(dAtA, i, uint64(len(m.Message))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Message))) i-- dAtA[i] = 0x3a } @@ -6950,7 +6978,7 @@ func (m *Workflow_Stream_Log) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -6960,31 +6988,31 @@ func (m *Workflow_Stream_Log) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) - i = encodeVarint(dAtA, i, uint64(len(m.State))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.State))) i-- dAtA[i] = 0x22 } if len(m.Type) > 0 { i -= len(m.Type) copy(dAtA[i:], m.Type) - i = encodeVarint(dAtA, i, uint64(len(m.Type))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Type))) i-- dAtA[i] = 0x1a } if m.StreamId != 0 { - i = encodeVarint(dAtA, i, uint64(m.StreamId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.StreamId)) i-- dAtA[i] = 0x10 } if m.Id != 0 { - i = encodeVarint(dAtA, i, uint64(m.Id)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Id)) i-- dAtA[i] = 0x8 } @@ -7027,14 +7055,14 @@ func (m *Workflow_Stream_ThrottlerStatus) MarshalToSizedBufferVT(dAtA []byte) (i return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.ComponentThrottled) > 0 { i -= len(m.ComponentThrottled) copy(dAtA[i:], m.ComponentThrottled) - i = encodeVarint(dAtA, i, uint64(len(m.ComponentThrottled))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ComponentThrottled))) i-- dAtA[i] = 0xa } @@ -7075,7 +7103,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x1 i-- @@ -7083,7 +7111,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { } } if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) i-- dAtA[i] = 0x1 i-- @@ -7092,7 +7120,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.TabletTypes) > 0 { var pksize2 int for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -7106,7 +7134,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x1 i-- @@ -7118,14 +7146,14 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0x8a } if m.RowsCopied != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowsCopied)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowsCopied)) i-- dAtA[i] = 0x1 i-- @@ -7135,7 +7163,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Tags) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Tags[iNdEx]) copy(dAtA[i:], m.Tags[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tags[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tags[iNdEx]))) i-- dAtA[i] = 0x7a } @@ -7143,7 +7171,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.LogFetchError) > 0 { i -= len(m.LogFetchError) copy(dAtA[i:], m.LogFetchError) - i = encodeVarint(dAtA, i, uint64(len(m.LogFetchError))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.LogFetchError))) i-- dAtA[i] = 0x72 } @@ -7154,7 +7182,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x6a } @@ -7166,7 +7194,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x62 } @@ -7174,7 +7202,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Message) > 0 { i -= len(m.Message) copy(dAtA[i:], m.Message) - i = encodeVarint(dAtA, i, uint64(len(m.Message))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Message))) i-- dAtA[i] = 0x5a } @@ -7184,7 +7212,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x52 } @@ -7194,35 +7222,35 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x4a } if len(m.DbName) > 0 { i -= len(m.DbName) copy(dAtA[i:], m.DbName) - i = encodeVarint(dAtA, i, uint64(len(m.DbName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DbName))) i-- dAtA[i] = 0x42 } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) - i = encodeVarint(dAtA, i, uint64(len(m.State))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.State))) i-- dAtA[i] = 0x3a } if len(m.StopPosition) > 0 { i -= len(m.StopPosition) copy(dAtA[i:], m.StopPosition) - i = encodeVarint(dAtA, i, uint64(len(m.StopPosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.StopPosition))) i-- dAtA[i] = 0x32 } if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- dAtA[i] = 0x2a } @@ -7232,7 +7260,7 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -7242,19 +7270,19 @@ func (m *Workflow_Stream) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if m.Id != 0 { - i = encodeVarint(dAtA, i, uint64(m.Id)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Id)) i-- dAtA[i] = 0x8 } @@ -7297,7 +7325,7 @@ func (m *Workflow) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x52 } @@ -7312,21 +7340,21 @@ func (m *Workflow) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x48 } if m.MaxVReplicationTransactionLag != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxVReplicationTransactionLag)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxVReplicationTransactionLag)) i-- dAtA[i] = 0x40 } if len(m.WorkflowSubType) > 0 { i -= len(m.WorkflowSubType) copy(dAtA[i:], m.WorkflowSubType) - i = encodeVarint(dAtA, i, uint64(len(m.WorkflowSubType))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WorkflowSubType))) i-- dAtA[i] = 0x3a } if len(m.WorkflowType) > 0 { i -= len(m.WorkflowType) copy(dAtA[i:], m.WorkflowType) - i = encodeVarint(dAtA, i, uint64(len(m.WorkflowType))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WorkflowType))) i-- dAtA[i] = 0x32 } @@ -7339,21 +7367,21 @@ func (m *Workflow) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x2a } } if m.MaxVReplicationLag != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxVReplicationLag)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxVReplicationLag)) i-- dAtA[i] = 0x20 } @@ -7363,7 +7391,7 @@ func (m *Workflow) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -7373,14 +7401,14 @@ func (m *Workflow) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -7423,14 +7451,14 @@ func (m *AddCellInfoRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -7504,7 +7532,7 @@ func (m *AddCellsAliasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -7512,7 +7540,7 @@ func (m *AddCellsAliasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -7586,7 +7614,7 @@ func (m *ApplyKeyspaceRoutingRulesRequest) MarshalToSizedBufferVT(dAtA []byte) ( for iNdEx := len(m.RebuildCells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.RebuildCells[iNdEx]) copy(dAtA[i:], m.RebuildCells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.RebuildCells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RebuildCells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -7607,7 +7635,7 @@ func (m *ApplyKeyspaceRoutingRulesRequest) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7650,7 +7678,7 @@ func (m *ApplyKeyspaceRoutingRulesResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7691,7 +7719,7 @@ func (m *ApplyRoutingRulesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err for iNdEx := len(m.RebuildCells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.RebuildCells[iNdEx]) copy(dAtA[i:], m.RebuildCells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.RebuildCells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RebuildCells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -7712,7 +7740,7 @@ func (m *ApplyRoutingRulesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7786,7 +7814,7 @@ func (m *ApplyShardRoutingRulesRequest) MarshalToSizedBufferVT(dAtA []byte) (int for iNdEx := len(m.RebuildCells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.RebuildCells[iNdEx]) copy(dAtA[i:], m.RebuildCells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.RebuildCells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RebuildCells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -7807,7 +7835,7 @@ func (m *ApplyShardRoutingRulesRequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -7878,7 +7906,7 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.BatchSize != 0 { - i = encodeVarint(dAtA, i, uint64(m.BatchSize)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.BatchSize)) i-- dAtA[i] = 0x50 } @@ -7888,7 +7916,7 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x4a } @@ -7898,14 +7926,14 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x3a } if len(m.MigrationContext) > 0 { i -= len(m.MigrationContext) copy(dAtA[i:], m.MigrationContext) - i = encodeVarint(dAtA, i, uint64(len(m.MigrationContext))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MigrationContext))) i-- dAtA[i] = 0x32 } @@ -7913,7 +7941,7 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.UuidList) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.UuidList[iNdEx]) copy(dAtA[i:], m.UuidList[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.UuidList[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.UuidList[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -7921,7 +7949,7 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.DdlStrategy) > 0 { i -= len(m.DdlStrategy) copy(dAtA[i:], m.DdlStrategy) - i = encodeVarint(dAtA, i, uint64(len(m.DdlStrategy))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DdlStrategy))) i-- dAtA[i] = 0x22 } @@ -7929,7 +7957,7 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Sql) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Sql[iNdEx]) copy(dAtA[i:], m.Sql[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Sql[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sql[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -7937,7 +7965,7 @@ func (m *ApplySchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -7978,15 +8006,15 @@ func (m *ApplySchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for k := range m.RowsAffectedByShard { v := m.RowsAffectedByShard[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -7995,7 +8023,7 @@ func (m *ApplySchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.UuidList) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.UuidList[iNdEx]) copy(dAtA[i:], m.UuidList[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.UuidList[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.UuidList[iNdEx]))) i-- dAtA[i] = 0xa } @@ -8046,7 +8074,7 @@ func (m *ApplyVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Sql) > 0 { i -= len(m.Sql) copy(dAtA[i:], m.Sql) - i = encodeVarint(dAtA, i, uint64(len(m.Sql))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sql))) i-- dAtA[i] = 0x32 } @@ -8056,7 +8084,7 @@ func (m *ApplyVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -8064,7 +8092,7 @@ func (m *ApplyVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -8092,7 +8120,7 @@ func (m *ApplyVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -8133,7 +8161,7 @@ func (m *ApplyVSchemaResponse_ParamList) MarshalToSizedBufferVT(dAtA []byte) (in for iNdEx := len(m.Params) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Params[iNdEx]) copy(dAtA[i:], m.Params[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Params[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Params[iNdEx]))) i-- dAtA[i] = 0xa } @@ -8180,15 +8208,15 @@ func (m *ApplyVSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -8199,7 +8227,7 @@ func (m *ApplyVSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8236,6 +8264,13 @@ func (m *BackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.BackupEngine != nil { + i -= len(*m.BackupEngine) + copy(dAtA[i:], *m.BackupEngine) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(*m.BackupEngine))) + i-- + dAtA[i] = 0x32 + } if m.UpgradeSafe { i-- if m.UpgradeSafe { @@ -8249,12 +8284,12 @@ func (m *BackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.IncrementalFromPos) > 0 { i -= len(m.IncrementalFromPos) copy(dAtA[i:], m.IncrementalFromPos) - i = encodeVarint(dAtA, i, uint64(len(m.IncrementalFromPos))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IncrementalFromPos))) i-- dAtA[i] = 0x22 } if m.Concurrency != 0 { - i = encodeVarint(dAtA, i, uint64(m.Concurrency)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Concurrency)) i-- dAtA[i] = 0x18 } @@ -8274,7 +8309,7 @@ func (m *BackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8317,21 +8352,21 @@ func (m *BackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } @@ -8341,7 +8376,7 @@ func (m *BackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8381,7 +8416,7 @@ func (m *BackupShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.IncrementalFromPos) > 0 { i -= len(m.IncrementalFromPos) copy(dAtA[i:], m.IncrementalFromPos) - i = encodeVarint(dAtA, i, uint64(len(m.IncrementalFromPos))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IncrementalFromPos))) i-- dAtA[i] = 0x32 } @@ -8396,7 +8431,7 @@ func (m *BackupShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x28 } if m.Concurrency != 0 { - i = encodeVarint(dAtA, i, uint64(m.Concurrency)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Concurrency)) i-- dAtA[i] = 0x20 } @@ -8413,14 +8448,14 @@ func (m *BackupShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -8460,14 +8495,14 @@ func (m *CancelSchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -8508,15 +8543,158 @@ func (m *CancelSchemaMigrationResponse) MarshalToSizedBufferVT(dAtA []byte) (int for k := range m.RowsAffectedByShard { v := m.RowsAffectedByShard[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ChangeTabletTagsRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangeTabletTagsRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ChangeTabletTagsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Replace { + i-- + if m.Replace { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Tags) > 0 { + for k := range m.Tags { + v := m.Tags[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if m.TabletAlias != nil { + size, err := m.TabletAlias.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ChangeTabletTagsResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangeTabletTagsResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ChangeTabletTagsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.AfterTags) > 0 { + for k := range m.AfterTags { + v := m.AfterTags[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.BeforeTags) > 0 { + for k := range m.BeforeTags { + v := m.BeforeTags[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -8565,7 +8743,7 @@ func (m *ChangeTabletTypeRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro dAtA[i] = 0x18 } if m.DbType != 0 { - i = encodeVarint(dAtA, i, uint64(m.DbType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.DbType)) i-- dAtA[i] = 0x10 } @@ -8575,7 +8753,7 @@ func (m *ChangeTabletTypeRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8628,7 +8806,7 @@ func (m *ChangeTabletTypeResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -8638,7 +8816,7 @@ func (m *ChangeTabletTypeResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8698,14 +8876,14 @@ func (m *CheckThrottlerRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Scope) > 0 { i -= len(m.Scope) copy(dAtA[i:], m.Scope) - i = encodeVarint(dAtA, i, uint64(len(m.Scope))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Scope))) i-- dAtA[i] = 0x1a } if len(m.AppName) > 0 { i -= len(m.AppName) copy(dAtA[i:], m.AppName) - i = encodeVarint(dAtA, i, uint64(len(m.AppName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AppName))) i-- dAtA[i] = 0x12 } @@ -8715,7 +8893,7 @@ func (m *CheckThrottlerRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8758,7 +8936,7 @@ func (m *CheckThrottlerResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -8768,7 +8946,7 @@ func (m *CheckThrottlerResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -8808,14 +8986,14 @@ func (m *CleanupSchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (int if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -8856,15 +9034,15 @@ func (m *CleanupSchemaMigrationResponse) MarshalToSizedBufferVT(dAtA []byte) (in for k := range m.RowsAffectedByShard { v := m.RowsAffectedByShard[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -8905,14 +9083,14 @@ func (m *CompleteSchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (in if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -8953,15 +9131,15 @@ func (m *CompleteSchemaMigrationResponse) MarshalToSizedBufferVT(dAtA []byte) (i for k := range m.RowsAffectedByShard { v := m.RowsAffectedByShard[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -9002,14 +9180,14 @@ func (m *CreateKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.SidecarDbName) > 0 { i -= len(m.SidecarDbName) copy(dAtA[i:], m.SidecarDbName) - i = encodeVarint(dAtA, i, uint64(len(m.SidecarDbName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SidecarDbName))) i-- dAtA[i] = 0x5a } if len(m.DurabilityPolicy) > 0 { i -= len(m.DurabilityPolicy) copy(dAtA[i:], m.DurabilityPolicy) - i = encodeVarint(dAtA, i, uint64(len(m.DurabilityPolicy))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DurabilityPolicy))) i-- dAtA[i] = 0x52 } @@ -9019,19 +9197,19 @@ func (m *CreateKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x4a } if len(m.BaseKeyspace) > 0 { i -= len(m.BaseKeyspace) copy(dAtA[i:], m.BaseKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.BaseKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.BaseKeyspace))) i-- dAtA[i] = 0x42 } if m.Type != 0 { - i = encodeVarint(dAtA, i, uint64(m.Type)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Type)) i-- dAtA[i] = 0x38 } @@ -9058,7 +9236,7 @@ func (m *CreateKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -9101,7 +9279,7 @@ func (m *CreateKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -9161,14 +9339,14 @@ func (m *CreateShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ShardName) > 0 { i -= len(m.ShardName) copy(dAtA[i:], m.ShardName) - i = encodeVarint(dAtA, i, uint64(len(m.ShardName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ShardName))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -9221,7 +9399,7 @@ func (m *CreateShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -9231,7 +9409,7 @@ func (m *CreateShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -9281,7 +9459,7 @@ func (m *DeleteCellInfoRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -9354,7 +9532,7 @@ func (m *DeleteCellsAliasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -9447,7 +9625,7 @@ func (m *DeleteKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -9554,7 +9732,7 @@ func (m *DeleteShardsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -9628,7 +9806,7 @@ func (m *DeleteSrvVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0xa } @@ -9715,7 +9893,7 @@ func (m *DeleteTabletsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -9786,6 +9964,16 @@ func (m *EmergencyReparentShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.ExpectedPrimary != nil { + size, err := m.ExpectedPrimary.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x42 + } if m.WaitForAllTablets { i-- if m.WaitForAllTablets { @@ -9812,7 +10000,7 @@ func (m *EmergencyReparentShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -9823,7 +10011,7 @@ func (m *EmergencyReparentShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -9834,21 +10022,21 @@ func (m *EmergencyReparentShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -9892,7 +10080,7 @@ func (m *EmergencyReparentShardResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -9903,21 +10091,21 @@ func (m *EmergencyReparentShardResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -9965,14 +10153,14 @@ func (m *ExecuteFetchAsAppRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err dAtA[i] = 0x20 } if m.MaxRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxRows)) i-- dAtA[i] = 0x18 } if len(m.Query) > 0 { i -= len(m.Query) copy(dAtA[i:], m.Query) - i = encodeVarint(dAtA, i, uint64(len(m.Query))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Query))) i-- dAtA[i] = 0x12 } @@ -9982,7 +10170,7 @@ func (m *ExecuteFetchAsAppRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10025,7 +10213,7 @@ func (m *ExecuteFetchAsAppResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10083,14 +10271,14 @@ func (m *ExecuteFetchAsDBARequest) MarshalToSizedBufferVT(dAtA []byte) (int, err dAtA[i] = 0x20 } if m.MaxRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxRows)) i-- dAtA[i] = 0x18 } if len(m.Query) > 0 { i -= len(m.Query) copy(dAtA[i:], m.Query) - i = encodeVarint(dAtA, i, uint64(len(m.Query))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Query))) i-- dAtA[i] = 0x12 } @@ -10100,7 +10288,7 @@ func (m *ExecuteFetchAsDBARequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10143,7 +10331,7 @@ func (m *ExecuteFetchAsDBAResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10186,7 +10374,7 @@ func (m *ExecuteHookRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -10196,7 +10384,7 @@ func (m *ExecuteHookRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10239,7 +10427,7 @@ func (m *ExecuteHookResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10297,14 +10485,14 @@ func (m *ExecuteMultiFetchAsDBARequest) MarshalToSizedBufferVT(dAtA []byte) (int dAtA[i] = 0x20 } if m.MaxRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxRows)) i-- dAtA[i] = 0x18 } if len(m.Sql) > 0 { i -= len(m.Sql) copy(dAtA[i:], m.Sql) - i = encodeVarint(dAtA, i, uint64(len(m.Sql))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Sql))) i-- dAtA[i] = 0x12 } @@ -10314,7 +10502,7 @@ func (m *ExecuteMultiFetchAsDBARequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10358,7 +10546,7 @@ func (m *ExecuteMultiFetchAsDBAResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10399,7 +10587,7 @@ func (m *FindAllShardsInKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (in if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -10445,15 +10633,15 @@ func (m *FindAllShardsInKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (i return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -10494,14 +10682,14 @@ func (m *ForceCutOverSchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -10542,15 +10730,15 @@ func (m *ForceCutOverSchemaMigrationResponse) MarshalToSizedBufferVT(dAtA []byte for k := range m.RowsAffectedByShard { v := m.RowsAffectedByShard[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -10589,7 +10777,7 @@ func (m *GetBackupsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.DetailedLimit != 0 { - i = encodeVarint(dAtA, i, uint64(m.DetailedLimit)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.DetailedLimit)) i-- dAtA[i] = 0x28 } @@ -10604,21 +10792,21 @@ func (m *GetBackupsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x20 } if m.Limit != 0 { - i = encodeVarint(dAtA, i, uint64(m.Limit)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Limit)) i-- dAtA[i] = 0x18 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -10662,7 +10850,7 @@ func (m *GetBackupsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10703,7 +10891,7 @@ func (m *GetCellInfoRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0xa } @@ -10746,7 +10934,7 @@ func (m *GetCellInfoResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10820,7 +11008,7 @@ func (m *GetCellInfoNamesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err for iNdEx := len(m.Names) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Names[iNdEx]) copy(dAtA[i:], m.Names[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) i-- dAtA[i] = 0xa } @@ -10900,15 +11088,15 @@ func (m *GetCellsAliasesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -10952,7 +11140,7 @@ func (m *GetFullStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -10995,7 +11183,7 @@ func (m *GetFullStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11072,7 +11260,7 @@ func (m *GetKeyspacesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11113,7 +11301,7 @@ func (m *GetKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -11156,7 +11344,7 @@ func (m *GetKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11199,7 +11387,7 @@ func (m *GetPermissionsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11242,7 +11430,7 @@ func (m *GetPermissionsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11318,7 +11506,7 @@ func (m *GetKeyspaceRoutingRulesResponse) MarshalToSizedBufferVT(dAtA []byte) (i return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11394,7 +11582,7 @@ func (m *GetRoutingRulesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11475,7 +11663,7 @@ func (m *GetSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.ExcludeTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ExcludeTables[iNdEx]) copy(dAtA[i:], m.ExcludeTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -11484,7 +11672,7 @@ func (m *GetSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Tables[iNdEx]) copy(dAtA[i:], m.Tables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -11495,7 +11683,7 @@ func (m *GetSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11538,7 +11726,7 @@ func (m *GetSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11576,17 +11764,17 @@ func (m *GetSchemaMigrationsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e copy(dAtA[i:], m.unknownFields) } if m.Skip != 0 { - i = encodeVarint(dAtA, i, uint64(m.Skip)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Skip)) i-- dAtA[i] = 0x40 } if m.Limit != 0 { - i = encodeVarint(dAtA, i, uint64(m.Limit)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Limit)) i-- dAtA[i] = 0x38 } if m.Order != 0 { - i = encodeVarint(dAtA, i, uint64(m.Order)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Order)) i-- dAtA[i] = 0x30 } @@ -11596,33 +11784,33 @@ func (m *GetSchemaMigrationsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } if m.Status != 0 { - i = encodeVarint(dAtA, i, uint64(m.Status)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Status)) i-- dAtA[i] = 0x20 } if len(m.MigrationContext) > 0 { i -= len(m.MigrationContext) copy(dAtA[i:], m.MigrationContext) - i = encodeVarint(dAtA, i, uint64(len(m.MigrationContext))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MigrationContext))) i-- dAtA[i] = 0x1a } if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -11666,7 +11854,7 @@ func (m *GetSchemaMigrationsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11708,7 +11896,7 @@ func (m *GetShardReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -11716,14 +11904,14 @@ func (m *GetShardReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -11769,15 +11957,15 @@ func (m *GetShardReplicationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -11818,14 +12006,14 @@ func (m *GetShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ShardName) > 0 { i -= len(m.ShardName) copy(dAtA[i:], m.ShardName) - i = encodeVarint(dAtA, i, uint64(len(m.ShardName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ShardName))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -11868,7 +12056,7 @@ func (m *GetShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11944,7 +12132,7 @@ func (m *GetShardRoutingRulesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -11985,7 +12173,7 @@ func (m *GetSrvKeyspaceNamesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0xa } @@ -12027,7 +12215,7 @@ func (m *GetSrvKeyspaceNamesResponse_NameList) MarshalToSizedBufferVT(dAtA []byt for iNdEx := len(m.Names) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Names[iNdEx]) copy(dAtA[i:], m.Names[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) i-- dAtA[i] = 0xa } @@ -12074,15 +12262,15 @@ func (m *GetSrvKeyspaceNamesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -12124,7 +12312,7 @@ func (m *GetSrvKeyspacesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -12132,7 +12320,7 @@ func (m *GetSrvKeyspacesRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -12178,15 +12366,15 @@ func (m *GetSrvKeyspacesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -12228,7 +12416,7 @@ func (m *UpdateThrottlerConfigRequest) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.AppCheckedMetrics) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.AppCheckedMetrics[iNdEx]) copy(dAtA[i:], m.AppCheckedMetrics[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.AppCheckedMetrics[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AppCheckedMetrics[iNdEx]))) i-- dAtA[i] = 0x62 } @@ -12236,14 +12424,14 @@ func (m *UpdateThrottlerConfigRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.AppName) > 0 { i -= len(m.AppName) copy(dAtA[i:], m.AppName) - i = encodeVarint(dAtA, i, uint64(len(m.AppName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AppName))) i-- dAtA[i] = 0x5a } if len(m.MetricName) > 0 { i -= len(m.MetricName) copy(dAtA[i:], m.MetricName) - i = encodeVarint(dAtA, i, uint64(len(m.MetricName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MetricName))) i-- dAtA[i] = 0x52 } @@ -12253,7 +12441,7 @@ func (m *UpdateThrottlerConfigRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x4a } @@ -12290,7 +12478,7 @@ func (m *UpdateThrottlerConfigRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.CustomQuery) > 0 { i -= len(m.CustomQuery) copy(dAtA[i:], m.CustomQuery) - i = encodeVarint(dAtA, i, uint64(len(m.CustomQuery))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CustomQuery))) i-- dAtA[i] = 0x2a } @@ -12323,7 +12511,7 @@ func (m *UpdateThrottlerConfigRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -12396,7 +12584,7 @@ func (m *GetSrvVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0xa } @@ -12439,7 +12627,7 @@ func (m *GetSrvVSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -12480,7 +12668,7 @@ func (m *GetSrvVSchemasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -12527,15 +12715,15 @@ func (m *GetSrvVSchemasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -12579,7 +12767,7 @@ func (m *GetTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -12622,7 +12810,7 @@ func (m *GetTabletResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -12660,7 +12848,7 @@ func (m *GetTabletsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.TabletType != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletType)) i-- dAtA[i] = 0x30 } @@ -12671,7 +12859,7 @@ func (m *GetTabletsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -12690,7 +12878,7 @@ func (m *GetTabletsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -12698,14 +12886,14 @@ func (m *GetTabletsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -12749,7 +12937,7 @@ func (m *GetTabletsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -12793,7 +12981,7 @@ func (m *GetThrottlerStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -12836,7 +13024,7 @@ func (m *GetThrottlerStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -12884,14 +13072,14 @@ func (m *GetTopologyPathRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error dAtA[i] = 0x18 } if m.Version != 0 { - i = encodeVarint(dAtA, i, uint64(m.Version)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Version)) i-- dAtA[i] = 0x10 } if len(m.Path) > 0 { i -= len(m.Path) copy(dAtA[i:], m.Path) - i = encodeVarint(dAtA, i, uint64(len(m.Path))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Path))) i-- dAtA[i] = 0xa } @@ -12934,7 +13122,7 @@ func (m *GetTopologyPathResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -12972,7 +13160,7 @@ func (m *TopologyCell) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Version != 0 { - i = encodeVarint(dAtA, i, uint64(m.Version)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Version)) i-- dAtA[i] = 0x28 } @@ -12980,7 +13168,7 @@ func (m *TopologyCell) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Children) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Children[iNdEx]) copy(dAtA[i:], m.Children[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Children[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Children[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -12988,27 +13176,202 @@ func (m *TopologyCell) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Data) > 0 { i -= len(m.Data) copy(dAtA[i:], m.Data) - i = encodeVarint(dAtA, i, uint64(len(m.Data))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Data))) i-- dAtA[i] = 0x1a } if len(m.Path) > 0 { i -= len(m.Path) copy(dAtA[i:], m.Path) - i = encodeVarint(dAtA, i, uint64(len(m.Path))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Path))) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GetUnresolvedTransactionsRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetUnresolvedTransactionsRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetUnresolvedTransactionsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.AbandonAge != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.AbandonAge)) + i-- + dAtA[i] = 0x10 + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } +func (m *GetUnresolvedTransactionsResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetUnresolvedTransactionsResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *GetUnresolvedTransactionsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Transactions) > 0 { + for iNdEx := len(m.Transactions) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Transactions[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ConcludeTransactionRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConcludeTransactionRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ConcludeTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Participants) > 0 { + for iNdEx := len(m.Participants) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Participants[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Dtid) > 0 { + i -= len(m.Dtid) + copy(dAtA[i:], m.Dtid) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ConcludeTransactionResponse) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConcludeTransactionResponse) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ConcludeTransactionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + func (m *GetVSchemaRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -13042,7 +13405,7 @@ func (m *GetVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -13085,7 +13448,7 @@ func (m *GetVersionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -13125,7 +13488,7 @@ func (m *GetVersionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Version) > 0 { i -= len(m.Version) copy(dAtA[i:], m.Version) - i = encodeVarint(dAtA, i, uint64(len(m.Version))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Version))) i-- dAtA[i] = 0xa } @@ -13168,7 +13531,7 @@ func (m *GetVSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -13209,7 +13572,7 @@ func (m *GetWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Shards[iNdEx]) copy(dAtA[i:], m.Shards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) i-- dAtA[i] = 0x32 } @@ -13227,7 +13590,7 @@ func (m *GetWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0x22 } @@ -13254,7 +13617,7 @@ func (m *GetWorkflowsRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -13298,7 +13661,7 @@ func (m *GetWorkflowsResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -13342,7 +13705,7 @@ func (m *InitShardPrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -13362,21 +13725,21 @@ func (m *InitShardPrimaryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -13420,7 +13783,7 @@ func (m *InitShardPrimaryResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -13461,14 +13824,14 @@ func (m *LaunchSchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -13509,15 +13872,15 @@ func (m *LaunchSchemaMigrationResponse) MarshalToSizedBufferVT(dAtA []byte) (int for k := range m.RowsAffectedByShard { v := m.RowsAffectedByShard[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -13556,14 +13919,14 @@ func (m *LookupVindexCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er copy(dAtA[i:], m.unknownFields) } if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) i-- dAtA[i] = 0x38 } if len(m.TabletTypes) > 0 { var pksize2 int for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -13577,7 +13940,7 @@ func (m *LookupVindexCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x32 } @@ -13597,7 +13960,7 @@ func (m *LookupVindexCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -13605,7 +13968,7 @@ func (m *LookupVindexCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -13613,14 +13976,14 @@ func (m *LookupVindexCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -13693,21 +14056,21 @@ func (m *LookupVindexExternalizeRequest) MarshalToSizedBufferVT(dAtA []byte) (in if len(m.TableKeyspace) > 0 { i -= len(m.TableKeyspace) copy(dAtA[i:], m.TableKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TableKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TableKeyspace))) i-- dAtA[i] = 0x1a } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -13793,7 +14156,7 @@ func (m *MaterializeCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -13920,14 +14283,14 @@ func (m *MigrateCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.OnDdl) > 0 { i -= len(m.OnDdl) copy(dAtA[i:], m.OnDdl) - i = encodeVarint(dAtA, i, uint64(len(m.OnDdl))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.OnDdl))) i-- dAtA[i] = 0x62 } if len(m.SourceTimeZone) > 0 { i -= len(m.SourceTimeZone) copy(dAtA[i:], m.SourceTimeZone) - i = encodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) i-- dAtA[i] = 0x5a } @@ -13935,7 +14298,7 @@ func (m *MigrateCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.ExcludeTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ExcludeTables[iNdEx]) copy(dAtA[i:], m.ExcludeTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) i-- dAtA[i] = 0x52 } @@ -13944,7 +14307,7 @@ func (m *MigrateCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.IncludeTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.IncludeTables[iNdEx]) copy(dAtA[i:], m.IncludeTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.IncludeTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IncludeTables[iNdEx]))) i-- dAtA[i] = 0x4a } @@ -13960,14 +14323,14 @@ func (m *MigrateCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) dAtA[i] = 0x40 } if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) i-- dAtA[i] = 0x38 } if len(m.TabletTypes) > 0 { var pksize2 int for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -13981,7 +14344,7 @@ func (m *MigrateCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x32 } @@ -13989,7 +14352,7 @@ func (m *MigrateCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -13997,28 +14360,28 @@ func (m *MigrateCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.MountName) > 0 { i -= len(m.MountName) copy(dAtA[i:], m.MountName) - i = encodeVarint(dAtA, i, uint64(len(m.MountName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MountName))) i-- dAtA[i] = 0x22 } if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x1a } if len(m.SourceKeyspace) > 0 { i -= len(m.SourceKeyspace) copy(dAtA[i:], m.SourceKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.SourceKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceKeyspace))) i-- dAtA[i] = 0x12 } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -14098,14 +14461,14 @@ func (m *MigrateCompleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x1a } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -14146,7 +14509,7 @@ func (m *MigrateCompleteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro for iNdEx := len(m.DryRunResults) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.DryRunResults[iNdEx]) copy(dAtA[i:], m.DryRunResults[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.DryRunResults[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DryRunResults[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -14154,7 +14517,7 @@ func (m *MigrateCompleteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro if len(m.Summary) > 0 { i -= len(m.Summary) copy(dAtA[i:], m.Summary) - i = encodeVarint(dAtA, i, uint64(len(m.Summary))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Summary))) i-- dAtA[i] = 0xa } @@ -14194,28 +14557,28 @@ func (m *MountRegisterRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x22 } if len(m.TopoRoot) > 0 { i -= len(m.TopoRoot) copy(dAtA[i:], m.TopoRoot) - i = encodeVarint(dAtA, i, uint64(len(m.TopoRoot))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TopoRoot))) i-- dAtA[i] = 0x1a } if len(m.TopoServer) > 0 { i -= len(m.TopoServer) copy(dAtA[i:], m.TopoServer) - i = encodeVarint(dAtA, i, uint64(len(m.TopoServer))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TopoServer))) i-- dAtA[i] = 0x12 } if len(m.TopoType) > 0 { i -= len(m.TopoType) copy(dAtA[i:], m.TopoType) - i = encodeVarint(dAtA, i, uint64(len(m.TopoType))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TopoType))) i-- dAtA[i] = 0xa } @@ -14288,7 +14651,7 @@ func (m *MountUnregisterRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x22 } @@ -14361,7 +14724,7 @@ func (m *MountShowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x22 } @@ -14401,28 +14764,28 @@ func (m *MountShowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x22 } if len(m.TopoRoot) > 0 { i -= len(m.TopoRoot) copy(dAtA[i:], m.TopoRoot) - i = encodeVarint(dAtA, i, uint64(len(m.TopoRoot))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TopoRoot))) i-- dAtA[i] = 0x1a } if len(m.TopoServer) > 0 { i -= len(m.TopoServer) copy(dAtA[i:], m.TopoServer) - i = encodeVarint(dAtA, i, uint64(len(m.TopoServer))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TopoServer))) i-- dAtA[i] = 0x12 } if len(m.TopoType) > 0 { i -= len(m.TopoType) copy(dAtA[i:], m.TopoType) - i = encodeVarint(dAtA, i, uint64(len(m.TopoType))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TopoType))) i-- dAtA[i] = 0xa } @@ -14496,7 +14859,7 @@ func (m *MountListResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Names) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Names[iNdEx]) copy(dAtA[i:], m.Names[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Names[iNdEx]))) i-- dAtA[i] = 0xa } @@ -14540,7 +14903,7 @@ func (m *MoveTablesCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- @@ -14617,21 +14980,21 @@ func (m *MoveTablesCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro if len(m.OnDdl) > 0 { i -= len(m.OnDdl) copy(dAtA[i:], m.OnDdl) - i = encodeVarint(dAtA, i, uint64(len(m.OnDdl))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.OnDdl))) i-- dAtA[i] = 0x6a } if len(m.SourceTimeZone) > 0 { i -= len(m.SourceTimeZone) copy(dAtA[i:], m.SourceTimeZone) - i = encodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) i-- dAtA[i] = 0x62 } if len(m.ExternalClusterName) > 0 { i -= len(m.ExternalClusterName) copy(dAtA[i:], m.ExternalClusterName) - i = encodeVarint(dAtA, i, uint64(len(m.ExternalClusterName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExternalClusterName))) i-- dAtA[i] = 0x5a } @@ -14639,7 +15002,7 @@ func (m *MoveTablesCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro for iNdEx := len(m.ExcludeTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ExcludeTables[iNdEx]) copy(dAtA[i:], m.ExcludeTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) i-- dAtA[i] = 0x52 } @@ -14648,7 +15011,7 @@ func (m *MoveTablesCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro for iNdEx := len(m.IncludeTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.IncludeTables[iNdEx]) copy(dAtA[i:], m.IncludeTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.IncludeTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.IncludeTables[iNdEx]))) i-- dAtA[i] = 0x4a } @@ -14667,20 +15030,20 @@ func (m *MoveTablesCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro for iNdEx := len(m.SourceShards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SourceShards[iNdEx]) copy(dAtA[i:], m.SourceShards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.SourceShards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceShards[iNdEx]))) i-- dAtA[i] = 0x3a } } if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) i-- dAtA[i] = 0x30 } if len(m.TabletTypes) > 0 { var pksize2 int for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -14694,7 +15057,7 @@ func (m *MoveTablesCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x2a } @@ -14702,7 +15065,7 @@ func (m *MoveTablesCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -14710,21 +15073,21 @@ func (m *MoveTablesCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x1a } if len(m.SourceKeyspace) > 0 { i -= len(m.SourceKeyspace) copy(dAtA[i:], m.SourceKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.SourceKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceKeyspace))) i-- dAtA[i] = 0x12 } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -14777,7 +15140,7 @@ func (m *MoveTablesCreateResponse_TabletInfo) MarshalToSizedBufferVT(dAtA []byte return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -14821,7 +15184,7 @@ func (m *MoveTablesCreateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -14829,7 +15192,7 @@ func (m *MoveTablesCreateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err if len(m.Summary) > 0 { i -= len(m.Summary) copy(dAtA[i:], m.Summary) - i = encodeVarint(dAtA, i, uint64(len(m.Summary))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Summary))) i-- dAtA[i] = 0xa } @@ -14870,7 +15233,7 @@ func (m *MoveTablesCompleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Shards[iNdEx]) copy(dAtA[i:], m.Shards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) i-- dAtA[i] = 0x42 } @@ -14918,14 +15281,14 @@ func (m *MoveTablesCompleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x1a } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -14966,7 +15329,7 @@ func (m *MoveTablesCompleteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.DryRunResults) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.DryRunResults[iNdEx]) copy(dAtA[i:], m.DryRunResults[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.DryRunResults[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DryRunResults[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -14974,7 +15337,7 @@ func (m *MoveTablesCompleteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, e if len(m.Summary) > 0 { i -= len(m.Summary) copy(dAtA[i:], m.Summary) - i = encodeVarint(dAtA, i, uint64(len(m.Summary))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Summary))) i-- dAtA[i] = 0xa } @@ -15017,7 +15380,7 @@ func (m *PingTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -15087,13 +15450,33 @@ func (m *PlannedReparentShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.ExpectedPrimary != nil { + size, err := m.ExpectedPrimary.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x42 + } + if m.AllowCrossCellPromotion { + i-- + if m.AllowCrossCellPromotion { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } if m.TolerableReplicationLag != nil { size, err := m.TolerableReplicationLag.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -15103,7 +15486,7 @@ func (m *PlannedReparentShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -15113,7 +15496,7 @@ func (m *PlannedReparentShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -15123,21 +15506,21 @@ func (m *PlannedReparentShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -15181,7 +15564,7 @@ func (m *PlannedReparentShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -15192,21 +15575,21 @@ func (m *PlannedReparentShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -15257,7 +15640,7 @@ func (m *RebuildKeyspaceGraphRequest) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -15265,7 +15648,7 @@ func (m *RebuildKeyspaceGraphRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -15339,7 +15722,7 @@ func (m *RebuildVSchemaGraphRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0xa } @@ -15416,7 +15799,7 @@ func (m *RefreshStateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -15490,7 +15873,7 @@ func (m *RefreshStateByShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -15498,14 +15881,14 @@ func (m *RefreshStateByShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -15545,7 +15928,7 @@ func (m *RefreshStateByShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.PartialRefreshDetails) > 0 { i -= len(m.PartialRefreshDetails) copy(dAtA[i:], m.PartialRefreshDetails) - i = encodeVarint(dAtA, i, uint64(len(m.PartialRefreshDetails))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PartialRefreshDetails))) i-- dAtA[i] = 0x12 } @@ -15598,7 +15981,7 @@ func (m *ReloadSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -15669,7 +16052,7 @@ func (m *ReloadSchemaKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, copy(dAtA[i:], m.unknownFields) } if m.Concurrency != 0 { - i = encodeVarint(dAtA, i, uint64(m.Concurrency)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Concurrency)) i-- dAtA[i] = 0x20 } @@ -15686,14 +16069,14 @@ func (m *ReloadSchemaKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.WaitPosition) > 0 { i -= len(m.WaitPosition) copy(dAtA[i:], m.WaitPosition) - i = encodeVarint(dAtA, i, uint64(len(m.WaitPosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WaitPosition))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -15737,7 +16120,7 @@ func (m *ReloadSchemaKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -15776,7 +16159,7 @@ func (m *ReloadSchemaShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err copy(dAtA[i:], m.unknownFields) } if m.Concurrency != 0 { - i = encodeVarint(dAtA, i, uint64(m.Concurrency)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Concurrency)) i-- dAtA[i] = 0x28 } @@ -15793,21 +16176,21 @@ func (m *ReloadSchemaShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err if len(m.WaitPosition) > 0 { i -= len(m.WaitPosition) copy(dAtA[i:], m.WaitPosition) - i = encodeVarint(dAtA, i, uint64(len(m.WaitPosition))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.WaitPosition))) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -15851,7 +16234,7 @@ func (m *ReloadSchemaShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -15892,21 +16275,21 @@ func (m *RemoveBackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -15999,14 +16382,14 @@ func (m *RemoveKeyspaceCellRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -16099,21 +16482,21 @@ func (m *RemoveShardCellRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0x1a } if len(m.ShardName) > 0 { i -= len(m.ShardName) copy(dAtA[i:], m.ShardName) - i = encodeVarint(dAtA, i, uint64(len(m.ShardName))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ShardName))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -16189,7 +16572,7 @@ func (m *ReparentTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -16232,21 +16615,21 @@ func (m *ReparentTabletResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -16283,6 +16666,16 @@ func (m *ReshardCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.WorkflowOptions != nil { + size, err := m.WorkflowOptions.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x6a + } if m.AutoStart { i-- if m.AutoStart { @@ -16316,7 +16709,7 @@ func (m *ReshardCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.OnDdl) > 0 { i -= len(m.OnDdl) copy(dAtA[i:], m.OnDdl) - i = encodeVarint(dAtA, i, uint64(len(m.OnDdl))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.OnDdl))) i-- dAtA[i] = 0x4a } @@ -16331,14 +16724,14 @@ func (m *ReshardCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) dAtA[i] = 0x40 } if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) i-- dAtA[i] = 0x38 } if len(m.TabletTypes) > 0 { var pksize2 int for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -16352,7 +16745,7 @@ func (m *ReshardCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x32 } @@ -16360,7 +16753,7 @@ func (m *ReshardCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -16369,7 +16762,7 @@ func (m *ReshardCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.TargetShards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.TargetShards[iNdEx]) copy(dAtA[i:], m.TargetShards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.TargetShards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetShards[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -16378,7 +16771,7 @@ func (m *ReshardCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.SourceShards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SourceShards[iNdEx]) copy(dAtA[i:], m.SourceShards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.SourceShards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceShards[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -16386,14 +16779,14 @@ func (m *ReshardCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -16430,13 +16823,22 @@ func (m *RestoreFromBackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.AllowedBackupEngines) > 0 { + for iNdEx := len(m.AllowedBackupEngines) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AllowedBackupEngines[iNdEx]) + copy(dAtA[i:], m.AllowedBackupEngines[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.AllowedBackupEngines[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } if m.RestoreToTimestamp != nil { size, err := m.RestoreToTimestamp.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -16453,7 +16855,7 @@ func (m *RestoreFromBackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err if len(m.RestoreToPos) > 0 { i -= len(m.RestoreToPos) copy(dAtA[i:], m.RestoreToPos) - i = encodeVarint(dAtA, i, uint64(len(m.RestoreToPos))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.RestoreToPos))) i-- dAtA[i] = 0x1a } @@ -16463,7 +16865,7 @@ func (m *RestoreFromBackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -16473,7 +16875,7 @@ func (m *RestoreFromBackupRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -16516,21 +16918,21 @@ func (m *RestoreFromBackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x1a } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0x12 } @@ -16540,7 +16942,7 @@ func (m *RestoreFromBackupResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -16580,14 +16982,14 @@ func (m *RetrySchemaMigrationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -16628,15 +17030,15 @@ func (m *RetrySchemaMigrationResponse) MarshalToSizedBufferVT(dAtA []byte) (int, for k := range m.RowsAffectedByShard { v := m.RowsAffectedByShard[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -16680,7 +17082,7 @@ func (m *RunHealthCheckRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -16753,14 +17155,14 @@ func (m *SetKeyspaceDurabilityPolicyRequest) MarshalToSizedBufferVT(dAtA []byte) if len(m.DurabilityPolicy) > 0 { i -= len(m.DurabilityPolicy) copy(dAtA[i:], m.DurabilityPolicy) - i = encodeVarint(dAtA, i, uint64(len(m.DurabilityPolicy))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DurabilityPolicy))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -16803,7 +17205,7 @@ func (m *SetKeyspaceDurabilityPolicyResponse) MarshalToSizedBufferVT(dAtA []byte return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -16853,7 +17255,7 @@ func (m *SetKeyspaceShardingInfoRequest) MarshalToSizedBufferVT(dAtA []byte) (in if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -16896,7 +17298,7 @@ func (m *SetKeyspaceShardingInfoResponse) MarshalToSizedBufferVT(dAtA []byte) (i return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -16946,14 +17348,14 @@ func (m *SetShardIsPrimaryServingRequest) MarshalToSizedBufferVT(dAtA []byte) (i if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -16996,7 +17398,7 @@ func (m *SetShardIsPrimaryServingResponse) MarshalToSizedBufferVT(dAtA []byte) ( return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -17057,7 +17459,7 @@ func (m *SetShardTabletControlRequest) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.DeniedTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.DeniedTables[iNdEx]) copy(dAtA[i:], m.DeniedTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.DeniedTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DeniedTables[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -17066,27 +17468,27 @@ func (m *SetShardTabletControlRequest) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x22 } } if m.TabletType != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletType)) i-- dAtA[i] = 0x18 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -17129,7 +17531,7 @@ func (m *SetShardTabletControlResponse) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -17182,7 +17584,7 @@ func (m *SetWritableRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -17258,21 +17660,21 @@ func (m *ShardReplicationAddRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -17345,21 +17747,21 @@ func (m *ShardReplicationFixRequest) MarshalToSizedBufferVT(dAtA []byte) (int, e if len(m.Cell) > 0 { i -= len(m.Cell) copy(dAtA[i:], m.Cell) - i = encodeVarint(dAtA, i, uint64(len(m.Cell))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cell))) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -17402,7 +17804,7 @@ func (m *ShardReplicationFixResponse) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -17442,14 +17844,14 @@ func (m *ShardReplicationPositionsRequest) MarshalToSizedBufferVT(dAtA []byte) ( if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -17495,15 +17897,15 @@ func (m *ShardReplicationPositionsResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -17517,15 +17919,15 @@ func (m *ShardReplicationPositionsResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -17569,21 +17971,21 @@ func (m *ShardReplicationRemoveRequest) MarshalToSizedBufferVT(dAtA []byte) (int return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -17659,7 +18061,7 @@ func (m *SleepTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -17669,7 +18071,7 @@ func (m *SleepTabletRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -17743,7 +18145,7 @@ func (m *SourceShardAddRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Tables[iNdEx]) copy(dAtA[i:], m.Tables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) i-- dAtA[i] = 0x3a } @@ -17754,40 +18156,40 @@ func (m *SourceShardAddRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } if len(m.SourceShard) > 0 { i -= len(m.SourceShard) copy(dAtA[i:], m.SourceShard) - i = encodeVarint(dAtA, i, uint64(len(m.SourceShard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceShard))) i-- dAtA[i] = 0x2a } if len(m.SourceKeyspace) > 0 { i -= len(m.SourceKeyspace) copy(dAtA[i:], m.SourceKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.SourceKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceKeyspace))) i-- dAtA[i] = 0x22 } if m.Uid != 0 { - i = encodeVarint(dAtA, i, uint64(m.Uid)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Uid)) i-- dAtA[i] = 0x18 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -17830,7 +18232,7 @@ func (m *SourceShardAddResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -17868,21 +18270,21 @@ func (m *SourceShardDeleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, err copy(dAtA[i:], m.unknownFields) } if m.Uid != 0 { - i = encodeVarint(dAtA, i, uint64(m.Uid)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Uid)) i-- dAtA[i] = 0x18 } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -17925,7 +18327,7 @@ func (m *SourceShardDeleteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -17968,7 +18370,7 @@ func (m *StartReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -18044,7 +18446,7 @@ func (m *StopReplicationRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -18120,7 +18522,7 @@ func (m *TabletExternallyReparentedRequest) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -18163,7 +18565,7 @@ func (m *TabletExternallyReparentedResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -18173,21 +18575,21 @@ func (m *TabletExternallyReparentedResponse) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -18230,14 +18632,14 @@ func (m *UpdateCellInfoRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -18280,14 +18682,14 @@ func (m *UpdateCellInfoResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -18330,14 +18732,14 @@ func (m *UpdateCellsAliasRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -18380,14 +18782,14 @@ func (m *UpdateCellsAliasResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -18476,15 +18878,15 @@ func (m *ValidateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -18493,7 +18895,7 @@ func (m *ValidateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Results[iNdEx]) copy(dAtA[i:], m.Results[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) i-- dAtA[i] = 0xa } @@ -18544,7 +18946,7 @@ func (m *ValidateKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int, erro if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -18590,15 +18992,15 @@ func (m *ValidateKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -18607,7 +19009,7 @@ func (m *ValidateKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (int, err for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Results[iNdEx]) copy(dAtA[i:], m.Results[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) i-- dAtA[i] = 0xa } @@ -18679,7 +19081,7 @@ func (m *ValidateSchemaKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int for iNdEx := len(m.ExcludeTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ExcludeTables[iNdEx]) copy(dAtA[i:], m.ExcludeTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -18687,7 +19089,7 @@ func (m *ValidateSchemaKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (int if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -18733,15 +19135,15 @@ func (m *ValidateSchemaKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (in return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -18750,7 +19152,7 @@ func (m *ValidateSchemaKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (in for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Results[iNdEx]) copy(dAtA[i:], m.Results[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) i-- dAtA[i] = 0xa } @@ -18801,14 +19203,14 @@ func (m *ValidateShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -18849,7 +19251,7 @@ func (m *ValidateShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Results[iNdEx]) copy(dAtA[i:], m.Results[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) i-- dAtA[i] = 0xa } @@ -18890,7 +19292,7 @@ func (m *ValidateVersionKeyspaceRequest) MarshalToSizedBufferVT(dAtA []byte) (in if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -18936,15 +19338,15 @@ func (m *ValidateVersionKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (i return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -18953,7 +19355,7 @@ func (m *ValidateVersionKeyspaceResponse) MarshalToSizedBufferVT(dAtA []byte) (i for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Results[iNdEx]) copy(dAtA[i:], m.Results[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) i-- dAtA[i] = 0xa } @@ -18994,14 +19396,14 @@ func (m *ValidateVersionShardRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Shard) > 0 { i -= len(m.Shard) copy(dAtA[i:], m.Shard) - i = encodeVarint(dAtA, i, uint64(len(m.Shard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shard))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -19042,7 +19444,7 @@ func (m *ValidateVersionShardResponse) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Results[iNdEx]) copy(dAtA[i:], m.Results[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) i-- dAtA[i] = 0xa } @@ -19094,7 +19496,7 @@ func (m *ValidateVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error for iNdEx := len(m.ExcludeTables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ExcludeTables[iNdEx]) copy(dAtA[i:], m.ExcludeTables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ExcludeTables[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -19103,7 +19505,7 @@ func (m *ValidateVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Shards[iNdEx]) copy(dAtA[i:], m.Shards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -19111,7 +19513,7 @@ func (m *ValidateVSchemaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -19157,15 +19559,15 @@ func (m *ValidateVSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -19174,7 +19576,7 @@ func (m *ValidateVSchemaResponse) MarshalToSizedBufferVT(dAtA []byte) (int, erro for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Results[iNdEx]) copy(dAtA[i:], m.Results[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Results[iNdEx]))) i-- dAtA[i] = 0xa } @@ -19212,20 +19614,39 @@ func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.AutoStart != nil { + i-- + if *m.AutoStart { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xb0 + } + if m.RowDiffColumnTruncateAt != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowDiffColumnTruncateAt)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xa8 + } if m.MaxDiffDuration != nil { size, err := m.MaxDiffDuration.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xa2 } if m.MaxReportSampleRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxReportSampleRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxReportSampleRows)) i-- dAtA[i] = 0x1 i-- @@ -19261,7 +19682,7 @@ func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- @@ -19278,7 +19699,7 @@ func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x78 } if m.MaxExtraRowsToCompare != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxExtraRowsToCompare)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.MaxExtraRowsToCompare)) i-- dAtA[i] = 0x70 } @@ -19318,12 +19739,12 @@ func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x52 } if m.Limit != 0 { - i = encodeVarint(dAtA, i, uint64(m.Limit)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Limit)) i-- dAtA[i] = 0x48 } @@ -19331,20 +19752,20 @@ func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Tables) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Tables[iNdEx]) copy(dAtA[i:], m.Tables[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Tables[iNdEx]))) i-- dAtA[i] = 0x42 } } if m.TabletSelectionPreference != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletSelectionPreference)) i-- dAtA[i] = 0x38 } if len(m.TabletTypes) > 0 { var pksize2 int for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -19358,7 +19779,7 @@ func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x32 } @@ -19366,7 +19787,7 @@ func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.TargetCells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.TargetCells[iNdEx]) copy(dAtA[i:], m.TargetCells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.TargetCells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetCells[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -19375,7 +19796,7 @@ func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.SourceCells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SourceCells[iNdEx]) copy(dAtA[i:], m.SourceCells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.SourceCells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceCells[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -19383,21 +19804,21 @@ func (m *VDiffCreateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x1a } if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x12 } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -19437,7 +19858,7 @@ func (m *VDiffCreateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.UUID) > 0 { i -= len(m.UUID) copy(dAtA[i:], m.UUID) - i = encodeVarint(dAtA, i, uint64(len(m.UUID))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.UUID))) i-- dAtA[i] = 0xa } @@ -19477,21 +19898,21 @@ func (m *VDiffDeleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Arg) > 0 { i -= len(m.Arg) copy(dAtA[i:], m.Arg) - i = encodeVarint(dAtA, i, uint64(len(m.Arg))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Arg))) i-- dAtA[i] = 0x1a } if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x12 } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -19561,24 +19982,33 @@ func (m *VDiffResumeRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.TargetShards) > 0 { + for iNdEx := len(m.TargetShards) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TargetShards[iNdEx]) + copy(dAtA[i:], m.TargetShards[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetShards[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x1a } if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x12 } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -19651,21 +20081,21 @@ func (m *VDiffShowRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Arg) > 0 { i -= len(m.Arg) copy(dAtA[i:], m.Arg) - i = encodeVarint(dAtA, i, uint64(len(m.Arg))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Arg))) i-- dAtA[i] = 0x1a } if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x12 } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -19711,15 +20141,15 @@ func (m *VDiffShowResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -19757,24 +20187,33 @@ func (m *VDiffStopRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.TargetShards) > 0 { + for iNdEx := len(m.TargetShards) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TargetShards[iNdEx]) + copy(dAtA[i:], m.TargetShards[iNdEx]) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetShards[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } if len(m.Uuid) > 0 { i -= len(m.Uuid) copy(dAtA[i:], m.Uuid) - i = encodeVarint(dAtA, i, uint64(len(m.Uuid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Uuid))) i-- dAtA[i] = 0x1a } if len(m.TargetKeyspace) > 0 { i -= len(m.TargetKeyspace) copy(dAtA[i:], m.TargetKeyspace) - i = encodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetKeyspace))) i-- dAtA[i] = 0x12 } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0xa } @@ -19844,11 +20283,16 @@ func (m *WorkflowDeleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.DeleteBatchSize != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.DeleteBatchSize)) + i-- + dAtA[i] = 0x30 + } if len(m.Shards) > 0 { for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Shards[iNdEx]) copy(dAtA[i:], m.Shards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) i-- dAtA[i] = 0x2a } @@ -19876,14 +20320,14 @@ func (m *WorkflowDeleteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -19936,7 +20380,7 @@ func (m *WorkflowDeleteResponse_TabletInfo) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -19980,7 +20424,7 @@ func (m *WorkflowDeleteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -19988,7 +20432,7 @@ func (m *WorkflowDeleteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.Summary) > 0 { i -= len(m.Summary) copy(dAtA[i:], m.Summary) - i = encodeVarint(dAtA, i, uint64(len(m.Summary))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Summary))) i-- dAtA[i] = 0xa } @@ -20029,7 +20473,7 @@ func (m *WorkflowStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Shards[iNdEx]) copy(dAtA[i:], m.Shards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -20037,14 +20481,14 @@ func (m *WorkflowStatusRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -20088,12 +20532,12 @@ func (m *WorkflowStatusResponse_TableCopyState) MarshalToSizedBufferVT(dAtA []by dAtA[i] = 0x35 } if m.BytesTotal != 0 { - i = encodeVarint(dAtA, i, uint64(m.BytesTotal)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.BytesTotal)) i-- dAtA[i] = 0x28 } if m.BytesCopied != 0 { - i = encodeVarint(dAtA, i, uint64(m.BytesCopied)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.BytesCopied)) i-- dAtA[i] = 0x20 } @@ -20104,12 +20548,12 @@ func (m *WorkflowStatusResponse_TableCopyState) MarshalToSizedBufferVT(dAtA []by dAtA[i] = 0x1d } if m.RowsTotal != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowsTotal)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowsTotal)) i-- dAtA[i] = 0x10 } if m.RowsCopied != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowsCopied)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowsCopied)) i-- dAtA[i] = 0x8 } @@ -20149,28 +20593,28 @@ func (m *WorkflowStatusResponse_ShardStreamState) MarshalToSizedBufferVT(dAtA [] if len(m.Info) > 0 { i -= len(m.Info) copy(dAtA[i:], m.Info) - i = encodeVarint(dAtA, i, uint64(len(m.Info))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Info))) i-- dAtA[i] = 0x32 } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) - i = encodeVarint(dAtA, i, uint64(len(m.Status))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Status))) i-- dAtA[i] = 0x2a } if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) - i = encodeVarint(dAtA, i, uint64(len(m.Position))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Position))) i-- dAtA[i] = 0x22 } if len(m.SourceShard) > 0 { i -= len(m.SourceShard) copy(dAtA[i:], m.SourceShard) - i = encodeVarint(dAtA, i, uint64(len(m.SourceShard))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SourceShard))) i-- dAtA[i] = 0x1a } @@ -20180,12 +20624,12 @@ func (m *WorkflowStatusResponse_ShardStreamState) MarshalToSizedBufferVT(dAtA [] return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if m.Id != 0 { - i = encodeVarint(dAtA, i, uint64(m.Id)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Id)) i-- dAtA[i] = 0x8 } @@ -20229,7 +20673,7 @@ func (m *WorkflowStatusResponse_ShardStreams) MarshalToSizedBufferVT(dAtA []byte return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -20270,7 +20714,7 @@ func (m *WorkflowStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.TrafficState) > 0 { i -= len(m.TrafficState) copy(dAtA[i:], m.TrafficState) - i = encodeVarint(dAtA, i, uint64(len(m.TrafficState))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TrafficState))) i-- dAtA[i] = 0x1a } @@ -20283,15 +20727,15 @@ func (m *WorkflowStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x12 } @@ -20305,15 +20749,15 @@ func (m *WorkflowStatusResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0xa } @@ -20351,11 +20795,21 @@ func (m *WorkflowSwitchTrafficRequest) MarshalToSizedBufferVT(dAtA []byte) (int, i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.Force { + i-- + if m.Force { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x60 + } if len(m.Shards) > 0 { for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Shards[iNdEx]) copy(dAtA[i:], m.Shards[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Shards[iNdEx]))) i-- dAtA[i] = 0x5a } @@ -20386,12 +20840,12 @@ func (m *WorkflowSwitchTrafficRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x42 } if m.Direction != 0 { - i = encodeVarint(dAtA, i, uint64(m.Direction)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Direction)) i-- dAtA[i] = 0x38 } @@ -20411,14 +20865,14 @@ func (m *WorkflowSwitchTrafficRequest) MarshalToSizedBufferVT(dAtA []byte) (int, return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } if len(m.TabletTypes) > 0 { var pksize2 int for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -20432,7 +20886,7 @@ func (m *WorkflowSwitchTrafficRequest) MarshalToSizedBufferVT(dAtA []byte) (int, dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x22 } @@ -20440,7 +20894,7 @@ func (m *WorkflowSwitchTrafficRequest) MarshalToSizedBufferVT(dAtA []byte) (int, for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -20448,14 +20902,14 @@ func (m *WorkflowSwitchTrafficRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -20496,7 +20950,7 @@ func (m *WorkflowSwitchTrafficResponse) MarshalToSizedBufferVT(dAtA []byte) (int for iNdEx := len(m.DryRunResults) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.DryRunResults[iNdEx]) copy(dAtA[i:], m.DryRunResults[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.DryRunResults[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DryRunResults[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -20504,21 +20958,21 @@ func (m *WorkflowSwitchTrafficResponse) MarshalToSizedBufferVT(dAtA []byte) (int if len(m.CurrentState) > 0 { i -= len(m.CurrentState) copy(dAtA[i:], m.CurrentState) - i = encodeVarint(dAtA, i, uint64(len(m.CurrentState))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CurrentState))) i-- dAtA[i] = 0x1a } if len(m.StartState) > 0 { i -= len(m.StartState) copy(dAtA[i:], m.StartState) - i = encodeVarint(dAtA, i, uint64(len(m.StartState))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.StartState))) i-- dAtA[i] = 0x12 } if len(m.Summary) > 0 { i -= len(m.Summary) copy(dAtA[i:], m.Summary) - i = encodeVarint(dAtA, i, uint64(len(m.Summary))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Summary))) i-- dAtA[i] = 0xa } @@ -20561,14 +21015,14 @@ func (m *WorkflowUpdateRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -20621,7 +21075,7 @@ func (m *WorkflowUpdateResponse_TabletInfo) MarshalToSizedBufferVT(dAtA []byte) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -20665,7 +21119,7 @@ func (m *WorkflowUpdateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -20673,7 +21127,7 @@ func (m *WorkflowUpdateResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error if len(m.Summary) > 0 { i -= len(m.Summary) copy(dAtA[i:], m.Summary) - i = encodeVarint(dAtA, i, uint64(len(m.Summary))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Summary))) i-- dAtA[i] = 0xa } @@ -20749,7 +21203,7 @@ func (m *GetMirrorRulesResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -20795,7 +21249,7 @@ func (m *WorkflowMirrorTrafficRequest) MarshalToSizedBufferVT(dAtA []byte) (int, if len(m.TabletTypes) > 0 { var pksize2 int for _, num := range m.TabletTypes { - pksize2 += sov(uint64(num)) + pksize2 += protohelpers.SizeOfVarint(uint64(num)) } i -= pksize2 j1 := i @@ -20809,21 +21263,21 @@ func (m *WorkflowMirrorTrafficRequest) MarshalToSizedBufferVT(dAtA []byte) (int, dAtA[j1] = uint8(num) j1++ } - i = encodeVarint(dAtA, i, uint64(pksize2)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(pksize2)) i-- dAtA[i] = 0x1a } if len(m.Workflow) > 0 { i -= len(m.Workflow) copy(dAtA[i:], m.Workflow) - i = encodeVarint(dAtA, i, uint64(len(m.Workflow))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Workflow))) i-- dAtA[i] = 0x12 } if len(m.Keyspace) > 0 { i -= len(m.Keyspace) copy(dAtA[i:], m.Keyspace) - i = encodeVarint(dAtA, i, uint64(len(m.Keyspace))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Keyspace))) i-- dAtA[i] = 0xa } @@ -20863,38 +21317,27 @@ func (m *WorkflowMirrorTrafficResponse) MarshalToSizedBufferVT(dAtA []byte) (int if len(m.CurrentState) > 0 { i -= len(m.CurrentState) copy(dAtA[i:], m.CurrentState) - i = encodeVarint(dAtA, i, uint64(len(m.CurrentState))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CurrentState))) i-- dAtA[i] = 0x1a } if len(m.StartState) > 0 { i -= len(m.StartState) copy(dAtA[i:], m.StartState) - i = encodeVarint(dAtA, i, uint64(len(m.StartState))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.StartState))) i-- dAtA[i] = 0x12 } if len(m.Summary) > 0 { i -= len(m.Summary) copy(dAtA[i:], m.Summary) - i = encodeVarint(dAtA, i, uint64(len(m.Summary))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Summary))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *ExecuteVtctlCommandRequest) SizeVT() (n int) { if m == nil { return 0 @@ -20904,11 +21347,11 @@ func (m *ExecuteVtctlCommandRequest) SizeVT() (n int) { if len(m.Args) > 0 { for _, s := range m.Args { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.ActionTimeout != 0 { - n += 1 + sov(uint64(m.ActionTimeout)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ActionTimeout)) } n += len(m.unknownFields) return n @@ -20922,7 +21365,7 @@ func (m *ExecuteVtctlCommandResponse) SizeVT() (n int) { _ = l if m.Event != nil { l = m.Event.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -20936,15 +21379,15 @@ func (m *TableMaterializeSettings) SizeVT() (n int) { _ = l l = len(m.TargetTable) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceExpression) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.CreateDdl) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -20958,15 +21401,15 @@ func (m *MaterializeSettings) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.StopAfterCopy { n += 2 @@ -20974,54 +21417,60 @@ func (m *MaterializeSettings) SizeVT() (n int) { if len(m.TableSettings) > 0 { for _, e := range m.TableSettings { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TabletTypes) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ExternalCluster) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.MaterializationIntent != 0 { - n += 1 + sov(uint64(m.MaterializationIntent)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaterializationIntent)) } l = len(m.SourceTimeZone) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetTimeZone) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.SourceShards) > 0 { for _, s := range m.SourceShards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.OnDdl) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.DeferSecondaryKeys { n += 2 } if m.TabletSelectionPreference != 0 { - n += 1 + sov(uint64(m.TabletSelectionPreference)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletSelectionPreference)) } if m.AtomicCopy { n += 3 } if m.WorkflowOptions != nil { l = m.WorkflowOptions.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.ReferenceTables) > 0 { + for _, s := range m.ReferenceTables { + l = len(s) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n @@ -21035,11 +21484,11 @@ func (m *Keyspace) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Keyspace != nil { l = m.Keyspace.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21053,80 +21502,80 @@ func (m *SchemaMigration) SizeVT() (n int) { _ = l l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Schema) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Table) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.MigrationStatement) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Strategy != 0 { - n += 1 + sov(uint64(m.Strategy)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Strategy)) } l = len(m.Options) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.AddedAt != nil { l = m.AddedAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.RequestedAt != nil { l = m.RequestedAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReadyAt != nil { l = m.ReadyAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.StartedAt != nil { l = m.StartedAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.LivenessTimestamp != nil { l = m.LivenessTimestamp.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CompletedAt != nil { l = m.CompletedAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CleanedUpAt != nil { l = m.CleanedUpAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Status != 0 { - n += 2 + sov(uint64(m.Status)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.Status)) } l = len(m.LogPath) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Artifacts) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Retries != 0 { - n += 2 + sov(uint64(m.Retries)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.Retries)) } if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletFailure { n += 3 @@ -21136,64 +21585,64 @@ func (m *SchemaMigration) SizeVT() (n int) { } l = len(m.MigrationContext) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.DdlAction) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Message) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.EtaSeconds != 0 { - n += 2 + sov(uint64(m.EtaSeconds)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.EtaSeconds)) } if m.RowsCopied != 0 { - n += 2 + sov(uint64(m.RowsCopied)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.RowsCopied)) } if m.TableRows != 0 { - n += 2 + sov(uint64(m.TableRows)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.TableRows)) } if m.AddedUniqueKeys != 0 { - n += 2 + sov(uint64(m.AddedUniqueKeys)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.AddedUniqueKeys)) } if m.RemovedUniqueKeys != 0 { - n += 2 + sov(uint64(m.RemovedUniqueKeys)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.RemovedUniqueKeys)) } l = len(m.LogFile) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ArtifactRetention != nil { l = m.ArtifactRetention.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PostponeCompletion { n += 3 } l = len(m.RemovedUniqueKeyNames) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.DroppedNoDefaultColumnNames) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ExpandedColumnNames) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.RevertibleNotes) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.AllowConcurrent { n += 3 } l = len(m.RevertedUuid) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.IsView { n += 3 @@ -21202,51 +21651,51 @@ func (m *SchemaMigration) SizeVT() (n int) { n += 3 } if m.VitessLivenessIndicator != 0 { - n += 2 + sov(uint64(m.VitessLivenessIndicator)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.VitessLivenessIndicator)) } if m.UserThrottleRatio != 0 { n += 6 } l = len(m.SpecialPlan) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.LastThrottledAt != nil { l = m.LastThrottledAt.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ComponentThrottled) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CancelledAt != nil { l = m.CancelledAt.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PostponeLaunch { n += 3 } l = len(m.Stage) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CutoverAttempts != 0 { - n += 2 + sov(uint64(m.CutoverAttempts)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.CutoverAttempts)) } if m.IsImmediateOperation { n += 3 } if m.ReviewedAt != nil { l = m.ReviewedAt.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReadyToCompleteAt != nil { l = m.ReadyToCompleteAt.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.RemovedForeignKeyNames) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21260,15 +21709,15 @@ func (m *Shard) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Shard != nil { l = m.Shard.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21282,17 +21731,29 @@ func (m *WorkflowOptions) SizeVT() (n int) { _ = l l = len(m.TenantId) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } - if m.StripShardedAutoIncrement { - n += 2 + if m.ShardedAutoIncrementHandling != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.ShardedAutoIncrementHandling)) } if len(m.Shards) > 0 { for _, s := range m.Shards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + if len(m.Config) > 0 { + for k, v := range m.Config { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } + l = len(m.GlobalKeyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } @@ -21305,12 +21766,12 @@ func (m *Workflow_ReplicationLocation) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Shards) > 0 { for _, s := range m.Shards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -21326,13 +21787,13 @@ func (m *Workflow_ShardStream) SizeVT() (n int) { if len(m.Streams) > 0 { for _, e := range m.Streams { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TabletControls) > 0 { for _, e := range m.TabletControls { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.IsPrimaryServing { @@ -21350,14 +21811,14 @@ func (m *Workflow_Stream_CopyState) SizeVT() (n int) { _ = l l = len(m.Table) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.LastPk) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.StreamId != 0 { - n += 1 + sov(uint64(m.StreamId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.StreamId)) } n += len(m.unknownFields) return n @@ -21370,33 +21831,33 @@ func (m *Workflow_Stream_Log) SizeVT() (n int) { var l int _ = l if m.Id != 0 { - n += 1 + sov(uint64(m.Id)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Id)) } if m.StreamId != 0 { - n += 1 + sov(uint64(m.StreamId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.StreamId)) } l = len(m.Type) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.State) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CreatedAt != nil { l = m.CreatedAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.UpdatedAt != nil { l = m.UpdatedAt.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Message) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Count != 0 { - n += 1 + sov(uint64(m.Count)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Count)) } n += len(m.unknownFields) return n @@ -21410,11 +21871,11 @@ func (m *Workflow_Stream_ThrottlerStatus) SizeVT() (n int) { _ = l l = len(m.ComponentThrottled) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TimeThrottled != nil { l = m.TimeThrottled.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21427,91 +21888,91 @@ func (m *Workflow_Stream) SizeVT() (n int) { var l int _ = l if m.Id != 0 { - n += 1 + sov(uint64(m.Id)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Id)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.BinlogSource != nil { l = m.BinlogSource.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.StopPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.State) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.DbName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionTimestamp != nil { l = m.TransactionTimestamp.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TimeUpdated != nil { l = m.TimeUpdated.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Message) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.CopyStates) > 0 { for _, e := range m.CopyStates { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Logs) > 0 { for _, e := range m.Logs { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.LogFetchError) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Tags) > 0 { for _, s := range m.Tags { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.RowsCopied != 0 { - n += 2 + sov(uint64(m.RowsCopied)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.RowsCopied)) } if m.ThrottlerStatus != nil { l = m.ThrottlerStatus.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.TabletTypes) > 0 { l = 0 for _, e := range m.TabletTypes { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 2 + sov(uint64(l)) + l + n += 2 + protohelpers.SizeOfVarint(uint64(l)) + l } if m.TabletSelectionPreference != 0 { - n += 2 + sov(uint64(m.TabletSelectionPreference)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.TabletSelectionPreference)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -21526,18 +21987,18 @@ func (m *Workflow) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Source != nil { l = m.Source.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.MaxVReplicationLag != 0 { - n += 1 + sov(uint64(m.MaxVReplicationLag)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxVReplicationLag)) } if len(m.ShardStreams) > 0 { for k, v := range m.ShardStreams { @@ -21547,28 +22008,28 @@ func (m *Workflow) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } l = len(m.WorkflowType) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.WorkflowSubType) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.MaxVReplicationTransactionLag != 0 { - n += 1 + sov(uint64(m.MaxVReplicationTransactionLag)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxVReplicationTransactionLag)) } if m.DeferSecondaryKeys { n += 2 } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21582,11 +22043,11 @@ func (m *AddCellInfoRequest) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CellInfo != nil { l = m.CellInfo.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21610,12 +22071,12 @@ func (m *AddCellsAliasRequest) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -21640,7 +22101,7 @@ func (m *ApplyKeyspaceRoutingRulesRequest) SizeVT() (n int) { _ = l if m.KeyspaceRoutingRules != nil { l = m.KeyspaceRoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SkipRebuild { n += 2 @@ -21648,7 +22109,7 @@ func (m *ApplyKeyspaceRoutingRulesRequest) SizeVT() (n int) { if len(m.RebuildCells) > 0 { for _, s := range m.RebuildCells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -21663,7 +22124,7 @@ func (m *ApplyKeyspaceRoutingRulesResponse) SizeVT() (n int) { _ = l if m.KeyspaceRoutingRules != nil { l = m.KeyspaceRoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21677,7 +22138,7 @@ func (m *ApplyRoutingRulesRequest) SizeVT() (n int) { _ = l if m.RoutingRules != nil { l = m.RoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SkipRebuild { n += 2 @@ -21685,7 +22146,7 @@ func (m *ApplyRoutingRulesRequest) SizeVT() (n int) { if len(m.RebuildCells) > 0 { for _, s := range m.RebuildCells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -21710,7 +22171,7 @@ func (m *ApplyShardRoutingRulesRequest) SizeVT() (n int) { _ = l if m.ShardRoutingRules != nil { l = m.ShardRoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SkipRebuild { n += 2 @@ -21718,7 +22179,7 @@ func (m *ApplyShardRoutingRulesRequest) SizeVT() (n int) { if len(m.RebuildCells) > 0 { for _, s := range m.RebuildCells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -21743,38 +22204,38 @@ func (m *ApplySchemaRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Sql) > 0 { for _, s := range m.Sql { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.DdlStrategy) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.UuidList) > 0 { for _, s := range m.UuidList { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.MigrationContext) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.WaitReplicasTimeout != nil { l = m.WaitReplicasTimeout.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CallerId != nil { l = m.CallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.BatchSize != 0 { - n += 1 + sov(uint64(m.BatchSize)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.BatchSize)) } n += len(m.unknownFields) return n @@ -21789,15 +22250,15 @@ func (m *ApplySchemaResponse) SizeVT() (n int) { if len(m.UuidList) > 0 { for _, s := range m.UuidList { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.RowsAffectedByShard) > 0 { for k, v := range m.RowsAffectedByShard { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -21812,7 +22273,7 @@ func (m *ApplyVSchemaRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SkipRebuild { n += 2 @@ -21823,16 +22284,16 @@ func (m *ApplyVSchemaRequest) SizeVT() (n int) { if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.VSchema != nil { l = m.VSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Sql) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Strict { n += 2 @@ -21850,7 +22311,7 @@ func (m *ApplyVSchemaResponse_ParamList) SizeVT() (n int) { if len(m.Params) > 0 { for _, s := range m.Params { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -21865,7 +22326,7 @@ func (m *ApplyVSchemaResponse) SizeVT() (n int) { _ = l if m.VSchema != nil { l = m.VSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.UnknownVindexParams) > 0 { for k, v := range m.UnknownVindexParams { @@ -21875,9 +22336,9 @@ func (m *ApplyVSchemaResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -21892,21 +22353,25 @@ func (m *BackupRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.AllowPrimary { n += 2 } if m.Concurrency != 0 { - n += 1 + sov(uint64(m.Concurrency)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Concurrency)) } l = len(m.IncrementalFromPos) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.UpgradeSafe { n += 2 } + if m.BackupEngine != nil { + l = len(*m.BackupEngine) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } @@ -21919,19 +22384,19 @@ func (m *BackupResponse) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Event != nil { l = m.Event.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21945,24 +22410,24 @@ func (m *BackupShardRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.AllowPrimary { n += 2 } if m.Concurrency != 0 { - n += 1 + sov(uint64(m.Concurrency)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Concurrency)) } if m.UpgradeSafe { n += 2 } l = len(m.IncrementalFromPos) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21976,11 +22441,11 @@ func (m *CancelSchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -21996,8 +22461,59 @@ func (m *CancelSchemaMigrationResponse) SizeVT() (n int) { for k, v := range m.RowsAffectedByShard { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ChangeTabletTagsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TabletAlias != nil { + l = m.TabletAlias.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Tags) > 0 { + for k, v := range m.Tags { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if m.Replace { + n += 2 + } + n += len(m.unknownFields) + return n +} + +func (m *ChangeTabletTagsResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.BeforeTags) > 0 { + for k, v := range m.BeforeTags { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) + } + } + if len(m.AfterTags) > 0 { + for k, v := range m.AfterTags { + _ = k + _ = v + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -22012,10 +22528,10 @@ func (m *ChangeTabletTypeRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.DbType != 0 { - n += 1 + sov(uint64(m.DbType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.DbType)) } if m.DryRun { n += 2 @@ -22032,11 +22548,11 @@ func (m *ChangeTabletTypeResponse) SizeVT() (n int) { _ = l if m.BeforeTablet != nil { l = m.BeforeTablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.AfterTablet != nil { l = m.AfterTablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.WasDryRun { n += 2 @@ -22053,15 +22569,15 @@ func (m *CheckThrottlerRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.AppName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Scope) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SkipRequestHeartbeats { n += 2 @@ -22081,11 +22597,11 @@ func (m *CheckThrottlerResponse) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Check != nil { l = m.Check.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22099,11 +22615,11 @@ func (m *CleanupSchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22119,8 +22635,8 @@ func (m *CleanupSchemaMigrationResponse) SizeVT() (n int) { for k, v := range m.RowsAffectedByShard { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -22135,11 +22651,11 @@ func (m *CompleteSchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22155,8 +22671,8 @@ func (m *CompleteSchemaMigrationResponse) SizeVT() (n int) { for k, v := range m.RowsAffectedByShard { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -22171,7 +22687,7 @@ func (m *CreateKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Force { n += 2 @@ -22180,23 +22696,23 @@ func (m *CreateKeyspaceRequest) SizeVT() (n int) { n += 2 } if m.Type != 0 { - n += 1 + sov(uint64(m.Type)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Type)) } l = len(m.BaseKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.SnapshotTime != nil { l = m.SnapshotTime.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.DurabilityPolicy) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SidecarDbName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22210,7 +22726,7 @@ func (m *CreateKeyspaceResponse) SizeVT() (n int) { _ = l if m.Keyspace != nil { l = m.Keyspace.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22224,11 +22740,11 @@ func (m *CreateShardRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ShardName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Force { n += 2 @@ -22248,11 +22764,11 @@ func (m *CreateShardResponse) SizeVT() (n int) { _ = l if m.Keyspace != nil { l = m.Keyspace.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Shard != nil { l = m.Shard.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ShardAlreadyExists { n += 2 @@ -22269,7 +22785,7 @@ func (m *DeleteCellInfoRequest) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Force { n += 2 @@ -22296,7 +22812,7 @@ func (m *DeleteCellsAliasRequest) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22320,7 +22836,7 @@ func (m *DeleteKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Recursive { n += 2 @@ -22351,7 +22867,7 @@ func (m *DeleteShardsRequest) SizeVT() (n int) { if len(m.Shards) > 0 { for _, e := range m.Shards { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Recursive { @@ -22385,7 +22901,7 @@ func (m *DeleteSrvVSchemaRequest) SizeVT() (n int) { _ = l l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22410,7 +22926,7 @@ func (m *DeleteTabletsRequest) SizeVT() (n int) { if len(m.TabletAliases) > 0 { for _, e := range m.TabletAliases { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.AllowPrimary { @@ -22438,25 +22954,25 @@ func (m *EmergencyReparentShardRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.NewPrimary != nil { l = m.NewPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.IgnoreReplicas) > 0 { for _, e := range m.IgnoreReplicas { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.WaitReplicasTimeout != nil { l = m.WaitReplicasTimeout.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PreventCrossCellPromotion { n += 2 @@ -22464,6 +22980,10 @@ func (m *EmergencyReparentShardRequest) SizeVT() (n int) { if m.WaitForAllTablets { n += 2 } + if m.ExpectedPrimary != nil { + l = m.ExpectedPrimary.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } @@ -22476,20 +22996,20 @@ func (m *EmergencyReparentShardResponse) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PromotedPrimary != nil { l = m.PromotedPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -22504,14 +23024,14 @@ func (m *ExecuteFetchAsAppRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Query) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.MaxRows != 0 { - n += 1 + sov(uint64(m.MaxRows)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxRows)) } if m.UsePool { n += 2 @@ -22528,7 +23048,7 @@ func (m *ExecuteFetchAsAppResponse) SizeVT() (n int) { _ = l if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22542,14 +23062,14 @@ func (m *ExecuteFetchAsDBARequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Query) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.MaxRows != 0 { - n += 1 + sov(uint64(m.MaxRows)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxRows)) } if m.DisableBinlogs { n += 2 @@ -22569,7 +23089,7 @@ func (m *ExecuteFetchAsDBAResponse) SizeVT() (n int) { _ = l if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22583,11 +23103,11 @@ func (m *ExecuteHookRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletHookRequest != nil { l = m.TabletHookRequest.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22601,7 +23121,7 @@ func (m *ExecuteHookResponse) SizeVT() (n int) { _ = l if m.HookResult != nil { l = m.HookResult.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22615,14 +23135,14 @@ func (m *ExecuteMultiFetchAsDBARequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Sql) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.MaxRows != 0 { - n += 1 + sov(uint64(m.MaxRows)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxRows)) } if m.DisableBinlogs { n += 2 @@ -22643,7 +23163,7 @@ func (m *ExecuteMultiFetchAsDBAResponse) SizeVT() (n int) { if len(m.Results) > 0 { for _, e := range m.Results { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -22658,7 +23178,7 @@ func (m *FindAllShardsInKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22678,9 +23198,9 @@ func (m *FindAllShardsInKeyspaceResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -22695,11 +23215,11 @@ func (m *ForceCutOverSchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22715,8 +23235,8 @@ func (m *ForceCutOverSchemaMigrationResponse) SizeVT() (n int) { for k, v := range m.RowsAffectedByShard { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -22731,20 +23251,20 @@ func (m *GetBackupsRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Limit != 0 { - n += 1 + sov(uint64(m.Limit)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Limit)) } if m.Detailed { n += 2 } if m.DetailedLimit != 0 { - n += 1 + sov(uint64(m.DetailedLimit)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.DetailedLimit)) } n += len(m.unknownFields) return n @@ -22759,7 +23279,7 @@ func (m *GetBackupsResponse) SizeVT() (n int) { if len(m.Backups) > 0 { for _, e := range m.Backups { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -22774,7 +23294,7 @@ func (m *GetCellInfoRequest) SizeVT() (n int) { _ = l l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22788,7 +23308,7 @@ func (m *GetCellInfoResponse) SizeVT() (n int) { _ = l if m.CellInfo != nil { l = m.CellInfo.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22813,7 +23333,7 @@ func (m *GetCellInfoNamesResponse) SizeVT() (n int) { if len(m.Names) > 0 { for _, s := range m.Names { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -22844,9 +23364,9 @@ func (m *GetCellsAliasesResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -22861,7 +23381,7 @@ func (m *GetFullStatusRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22875,7 +23395,7 @@ func (m *GetFullStatusResponse) SizeVT() (n int) { _ = l if m.Status != nil { l = m.Status.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22900,7 +23420,7 @@ func (m *GetKeyspacesResponse) SizeVT() (n int) { if len(m.Keyspaces) > 0 { for _, e := range m.Keyspaces { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -22915,7 +23435,7 @@ func (m *GetKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22929,7 +23449,7 @@ func (m *GetKeyspaceResponse) SizeVT() (n int) { _ = l if m.Keyspace != nil { l = m.Keyspace.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22943,7 +23463,7 @@ func (m *GetPermissionsRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22957,7 +23477,7 @@ func (m *GetPermissionsResponse) SizeVT() (n int) { _ = l if m.Permissions != nil { l = m.Permissions.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -22981,7 +23501,7 @@ func (m *GetKeyspaceRoutingRulesResponse) SizeVT() (n int) { _ = l if m.KeyspaceRoutingRules != nil { l = m.KeyspaceRoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23005,7 +23525,7 @@ func (m *GetRoutingRulesResponse) SizeVT() (n int) { _ = l if m.RoutingRules != nil { l = m.RoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23019,18 +23539,18 @@ func (m *GetSchemaRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Tables) > 0 { for _, s := range m.Tables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ExcludeTables) > 0 { for _, s := range m.ExcludeTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.IncludeViews { @@ -23057,7 +23577,7 @@ func (m *GetSchemaResponse) SizeVT() (n int) { _ = l if m.Schema != nil { l = m.Schema.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23071,31 +23591,31 @@ func (m *GetSchemaMigrationsRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.MigrationContext) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Status != 0 { - n += 1 + sov(uint64(m.Status)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Status)) } if m.Recent != nil { l = m.Recent.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Order != 0 { - n += 1 + sov(uint64(m.Order)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Order)) } if m.Limit != 0 { - n += 1 + sov(uint64(m.Limit)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Limit)) } if m.Skip != 0 { - n += 1 + sov(uint64(m.Skip)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Skip)) } n += len(m.unknownFields) return n @@ -23110,7 +23630,7 @@ func (m *GetSchemaMigrationsResponse) SizeVT() (n int) { if len(m.Migrations) > 0 { for _, e := range m.Migrations { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23125,16 +23645,16 @@ func (m *GetShardReplicationRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23155,9 +23675,9 @@ func (m *GetShardReplicationResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -23172,11 +23692,11 @@ func (m *GetShardRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ShardName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23190,7 +23710,7 @@ func (m *GetShardResponse) SizeVT() (n int) { _ = l if m.Shard != nil { l = m.Shard.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23214,7 +23734,7 @@ func (m *GetShardRoutingRulesResponse) SizeVT() (n int) { _ = l if m.ShardRoutingRules != nil { l = m.ShardRoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23229,7 +23749,7 @@ func (m *GetSrvKeyspaceNamesRequest) SizeVT() (n int) { if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23245,7 +23765,7 @@ func (m *GetSrvKeyspaceNamesResponse_NameList) SizeVT() (n int) { if len(m.Names) > 0 { for _, s := range m.Names { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23266,9 +23786,9 @@ func (m *GetSrvKeyspaceNamesResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -23283,12 +23803,12 @@ func (m *GetSrvKeyspacesRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23309,9 +23829,9 @@ func (m *GetSrvKeyspacesResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -23326,7 +23846,7 @@ func (m *UpdateThrottlerConfigRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Enable { n += 2 @@ -23339,7 +23859,7 @@ func (m *UpdateThrottlerConfigRequest) SizeVT() (n int) { } l = len(m.CustomQuery) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CustomQuerySet { n += 2 @@ -23352,20 +23872,20 @@ func (m *UpdateThrottlerConfigRequest) SizeVT() (n int) { } if m.ThrottledApp != nil { l = m.ThrottledApp.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.MetricName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.AppName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.AppCheckedMetrics) > 0 { for _, s := range m.AppCheckedMetrics { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23390,7 +23910,7 @@ func (m *GetSrvVSchemaRequest) SizeVT() (n int) { _ = l l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23404,7 +23924,7 @@ func (m *GetSrvVSchemaResponse) SizeVT() (n int) { _ = l if m.SrvVSchema != nil { l = m.SrvVSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23419,7 +23939,7 @@ func (m *GetSrvVSchemasRequest) SizeVT() (n int) { if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23440,9 +23960,9 @@ func (m *GetSrvVSchemasResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -23457,7 +23977,7 @@ func (m *GetTabletRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23471,7 +23991,7 @@ func (m *GetTabletResponse) SizeVT() (n int) { _ = l if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23485,16 +24005,16 @@ func (m *GetTabletsRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Strict { @@ -23503,11 +24023,11 @@ func (m *GetTabletsRequest) SizeVT() (n int) { if len(m.TabletAliases) > 0 { for _, e := range m.TabletAliases { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.TabletType != 0 { - n += 1 + sov(uint64(m.TabletType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletType)) } n += len(m.unknownFields) return n @@ -23522,7 +24042,7 @@ func (m *GetTabletsResponse) SizeVT() (n int) { if len(m.Tablets) > 0 { for _, e := range m.Tablets { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23537,7 +24057,7 @@ func (m *GetThrottlerStatusRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23551,7 +24071,7 @@ func (m *GetThrottlerStatusResponse) SizeVT() (n int) { _ = l if m.Status != nil { l = m.Status.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23565,10 +24085,10 @@ func (m *GetTopologyPathRequest) SizeVT() (n int) { _ = l l = len(m.Path) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Version != 0 { - n += 1 + sov(uint64(m.Version)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Version)) } if m.AsJson { n += 2 @@ -23585,7 +24105,7 @@ func (m *GetTopologyPathResponse) SizeVT() (n int) { _ = l if m.Cell != nil { l = m.Cell.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23599,29 +24119,92 @@ func (m *TopologyCell) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Path) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Data) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Children) > 0 { for _, s := range m.Children { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Version != 0 { - n += 1 + sov(uint64(m.Version)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Version)) } n += len(m.unknownFields) return n } +func (m *GetUnresolvedTransactionsRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.AbandonAge != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.AbandonAge)) + } + n += len(m.unknownFields) + return n +} + +func (m *GetUnresolvedTransactionsResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Transactions) > 0 { + for _, e := range m.Transactions { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ConcludeTransactionRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Dtid) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.Participants) > 0 { + for _, e := range m.Participants { + l = e.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + +func (m *ConcludeTransactionResponse) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += len(m.unknownFields) + return n +} + func (m *GetVSchemaRequest) SizeVT() (n int) { if m == nil { return 0 @@ -23630,7 +24213,7 @@ func (m *GetVSchemaRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23644,7 +24227,7 @@ func (m *GetVersionRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23658,7 +24241,7 @@ func (m *GetVersionResponse) SizeVT() (n int) { _ = l l = len(m.Version) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23672,7 +24255,7 @@ func (m *GetVSchemaResponse) SizeVT() (n int) { _ = l if m.VSchema != nil { l = m.VSchema.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23686,7 +24269,7 @@ func (m *GetWorkflowsRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ActiveOnly { n += 2 @@ -23696,7 +24279,7 @@ func (m *GetWorkflowsRequest) SizeVT() (n int) { } l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.IncludeLogs { n += 2 @@ -23704,7 +24287,7 @@ func (m *GetWorkflowsRequest) SizeVT() (n int) { if len(m.Shards) > 0 { for _, s := range m.Shards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23720,7 +24303,7 @@ func (m *GetWorkflowsResponse) SizeVT() (n int) { if len(m.Workflows) > 0 { for _, e := range m.Workflows { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23735,22 +24318,22 @@ func (m *InitShardPrimaryRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PrimaryElectTabletAlias != nil { l = m.PrimaryElectTabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Force { n += 2 } if m.WaitReplicasTimeout != nil { l = m.WaitReplicasTimeout.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23765,7 +24348,7 @@ func (m *InitShardPrimaryResponse) SizeVT() (n int) { if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -23780,11 +24363,11 @@ func (m *LaunchSchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23800,8 +24383,8 @@ func (m *LaunchSchemaMigrationResponse) SizeVT() (n int) { for k, v := range m.RowsAffectedByShard { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -23816,21 +24399,21 @@ func (m *LookupVindexCreateRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Vindex != nil { l = m.Vindex.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ContinueAfterCopyWithOwner { n += 2 @@ -23838,12 +24421,12 @@ func (m *LookupVindexCreateRequest) SizeVT() (n int) { if len(m.TabletTypes) > 0 { l = 0 for _, e := range m.TabletTypes { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } if m.TabletSelectionPreference != 0 { - n += 1 + sov(uint64(m.TabletSelectionPreference)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletSelectionPreference)) } n += len(m.unknownFields) return n @@ -23867,15 +24450,15 @@ func (m *LookupVindexExternalizeRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TableKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23902,7 +24485,7 @@ func (m *MaterializeCreateRequest) SizeVT() (n int) { _ = l if m.Settings != nil { l = m.Settings.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -23926,35 +24509,35 @@ func (m *MigrateCreateRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.MountName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TabletTypes) > 0 { l = 0 for _, e := range m.TabletTypes { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } if m.TabletSelectionPreference != 0 { - n += 1 + sov(uint64(m.TabletSelectionPreference)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletSelectionPreference)) } if m.AllTables { n += 2 @@ -23962,22 +24545,22 @@ func (m *MigrateCreateRequest) SizeVT() (n int) { if len(m.IncludeTables) > 0 { for _, s := range m.IncludeTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ExcludeTables) > 0 { for _, s := range m.ExcludeTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.SourceTimeZone) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.OnDdl) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.StopAfterCopy { n += 2 @@ -24006,11 +24589,11 @@ func (m *MigrateCompleteRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeepData { n += 2 @@ -24036,12 +24619,12 @@ func (m *MigrateCompleteResponse) SizeVT() (n int) { _ = l l = len(m.Summary) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.DryRunResults) > 0 { for _, s := range m.DryRunResults { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24056,19 +24639,19 @@ func (m *MountRegisterRequest) SizeVT() (n int) { _ = l l = len(m.TopoType) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TopoServer) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TopoRoot) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24092,7 +24675,7 @@ func (m *MountUnregisterRequest) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24116,7 +24699,7 @@ func (m *MountShowRequest) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24130,19 +24713,19 @@ func (m *MountShowResponse) SizeVT() (n int) { _ = l l = len(m.TopoType) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TopoServer) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TopoRoot) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24167,7 +24750,7 @@ func (m *MountListResponse) SizeVT() (n int) { if len(m.Names) > 0 { for _, s := range m.Names { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24182,36 +24765,36 @@ func (m *MoveTablesCreateRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TabletTypes) > 0 { l = 0 for _, e := range m.TabletTypes { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } if m.TabletSelectionPreference != 0 { - n += 1 + sov(uint64(m.TabletSelectionPreference)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletSelectionPreference)) } if len(m.SourceShards) > 0 { for _, s := range m.SourceShards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.AllTables { @@ -24220,26 +24803,26 @@ func (m *MoveTablesCreateRequest) SizeVT() (n int) { if len(m.IncludeTables) > 0 { for _, s := range m.IncludeTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ExcludeTables) > 0 { for _, s := range m.ExcludeTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } l = len(m.ExternalClusterName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceTimeZone) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.OnDdl) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.StopAfterCopy { n += 2 @@ -24261,7 +24844,7 @@ func (m *MoveTablesCreateRequest) SizeVT() (n int) { } if m.WorkflowOptions != nil { l = m.WorkflowOptions.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24275,7 +24858,7 @@ func (m *MoveTablesCreateResponse_TabletInfo) SizeVT() (n int) { _ = l if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Created { n += 2 @@ -24292,12 +24875,12 @@ func (m *MoveTablesCreateResponse) SizeVT() (n int) { _ = l l = len(m.Summary) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Details) > 0 { for _, e := range m.Details { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24312,11 +24895,11 @@ func (m *MoveTablesCompleteRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeepData { n += 2 @@ -24333,7 +24916,7 @@ func (m *MoveTablesCompleteRequest) SizeVT() (n int) { if len(m.Shards) > 0 { for _, s := range m.Shards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24348,12 +24931,12 @@ func (m *MoveTablesCompleteResponse) SizeVT() (n int) { _ = l l = len(m.Summary) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.DryRunResults) > 0 { for _, s := range m.DryRunResults { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24368,7 +24951,7 @@ func (m *PingTabletRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24392,27 +24975,34 @@ func (m *PlannedReparentShardRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.NewPrimary != nil { l = m.NewPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.AvoidPrimary != nil { l = m.AvoidPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.WaitReplicasTimeout != nil { l = m.WaitReplicasTimeout.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TolerableReplicationLag != nil { l = m.TolerableReplicationLag.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.AllowCrossCellPromotion { + n += 2 + } + if m.ExpectedPrimary != nil { + l = m.ExpectedPrimary.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24426,20 +25016,20 @@ func (m *PlannedReparentShardResponse) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PromotedPrimary != nil { l = m.PromotedPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24454,12 +25044,12 @@ func (m *RebuildKeyspaceGraphRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.AllowPartial { @@ -24488,7 +25078,7 @@ func (m *RebuildVSchemaGraphRequest) SizeVT() (n int) { if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24513,7 +25103,7 @@ func (m *RefreshStateRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24537,16 +25127,16 @@ func (m *RefreshStateByShardRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24564,7 +25154,7 @@ func (m *RefreshStateByShardResponse) SizeVT() (n int) { } l = len(m.PartialRefreshDetails) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24578,7 +25168,7 @@ func (m *ReloadSchemaRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24602,17 +25192,17 @@ func (m *ReloadSchemaKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.WaitPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.IncludePrimary { n += 2 } if m.Concurrency != 0 { - n += 1 + sov(uint64(m.Concurrency)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Concurrency)) } n += len(m.unknownFields) return n @@ -24627,7 +25217,7 @@ func (m *ReloadSchemaKeyspaceResponse) SizeVT() (n int) { if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24642,21 +25232,21 @@ func (m *ReloadSchemaShardRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.WaitPosition) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.IncludePrimary { n += 2 } if m.Concurrency != 0 { - n += 1 + sov(uint64(m.Concurrency)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Concurrency)) } n += len(m.unknownFields) return n @@ -24671,7 +25261,7 @@ func (m *ReloadSchemaShardResponse) SizeVT() (n int) { if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -24686,15 +25276,15 @@ func (m *RemoveBackupRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24718,11 +25308,11 @@ func (m *RemoveKeyspaceCellRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Force { n += 2 @@ -24752,15 +25342,15 @@ func (m *RemoveShardCellRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.ShardName) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Force { n += 2 @@ -24790,7 +25380,7 @@ func (m *ReparentTabletRequest) SizeVT() (n int) { _ = l if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24804,15 +25394,15 @@ func (m *ReparentTabletResponse) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Primary != nil { l = m.Primary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24826,46 +25416,46 @@ func (m *ReshardCreateRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.SourceShards) > 0 { for _, s := range m.SourceShards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TargetShards) > 0 { for _, s := range m.TargetShards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TabletTypes) > 0 { l = 0 for _, e := range m.TabletTypes { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } if m.TabletSelectionPreference != 0 { - n += 1 + sov(uint64(m.TabletSelectionPreference)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletSelectionPreference)) } if m.SkipSchemaCopy { n += 2 } l = len(m.OnDdl) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.StopAfterCopy { n += 2 @@ -24876,6 +25466,10 @@ func (m *ReshardCreateRequest) SizeVT() (n int) { if m.AutoStart { n += 2 } + if m.WorkflowOptions != nil { + l = m.WorkflowOptions.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } n += len(m.unknownFields) return n } @@ -24888,22 +25482,28 @@ func (m *RestoreFromBackupRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.BackupTime != nil { l = m.BackupTime.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.RestoreToPos) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.DryRun { n += 2 } if m.RestoreToTimestamp != nil { l = m.RestoreToTimestamp.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.AllowedBackupEngines) > 0 { + for _, s := range m.AllowedBackupEngines { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n @@ -24917,19 +25517,19 @@ func (m *RestoreFromBackupResponse) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Event != nil { l = m.Event.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24943,11 +25543,11 @@ func (m *RetrySchemaMigrationRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -24963,8 +25563,8 @@ func (m *RetrySchemaMigrationResponse) SizeVT() (n int) { for k, v := range m.RowsAffectedByShard { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -24979,7 +25579,7 @@ func (m *RunHealthCheckRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25003,11 +25603,11 @@ func (m *SetKeyspaceDurabilityPolicyRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.DurabilityPolicy) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25021,7 +25621,7 @@ func (m *SetKeyspaceDurabilityPolicyResponse) SizeVT() (n int) { _ = l if m.Keyspace != nil { l = m.Keyspace.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25035,7 +25635,7 @@ func (m *SetKeyspaceShardingInfoRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Force { n += 2 @@ -25052,7 +25652,7 @@ func (m *SetKeyspaceShardingInfoResponse) SizeVT() (n int) { _ = l if m.Keyspace != nil { l = m.Keyspace.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25066,11 +25666,11 @@ func (m *SetShardIsPrimaryServingRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.IsServing { n += 2 @@ -25087,7 +25687,7 @@ func (m *SetShardIsPrimaryServingResponse) SizeVT() (n int) { _ = l if m.Shard != nil { l = m.Shard.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25101,25 +25701,25 @@ func (m *SetShardTabletControlRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletType != 0 { - n += 1 + sov(uint64(m.TabletType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletType)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.DeniedTables) > 0 { for _, s := range m.DeniedTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.DisableQueryService { @@ -25140,7 +25740,7 @@ func (m *SetShardTabletControlResponse) SizeVT() (n int) { _ = l if m.Shard != nil { l = m.Shard.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25154,7 +25754,7 @@ func (m *SetWritableRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Writable { n += 2 @@ -25181,15 +25781,15 @@ func (m *ShardReplicationAddRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25213,15 +25813,15 @@ func (m *ShardReplicationFixRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Cell) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25235,7 +25835,7 @@ func (m *ShardReplicationFixResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25249,11 +25849,11 @@ func (m *ShardReplicationPositionsRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25273,9 +25873,9 @@ func (m *ShardReplicationPositionsResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if len(m.TabletMap) > 0 { @@ -25286,9 +25886,9 @@ func (m *ShardReplicationPositionsResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -25303,15 +25903,15 @@ func (m *ShardReplicationRemoveRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25335,11 +25935,11 @@ func (m *SleepTabletRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Duration != nil { l = m.Duration.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25363,31 +25963,31 @@ func (m *SourceShardAddRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Uid != 0 { - n += 1 + sov(uint64(m.Uid)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Uid)) } l = len(m.SourceKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceShard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeyRange != nil { l = m.KeyRange.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Tables) > 0 { for _, s := range m.Tables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -25402,7 +26002,7 @@ func (m *SourceShardAddResponse) SizeVT() (n int) { _ = l if m.Shard != nil { l = m.Shard.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25416,14 +26016,14 @@ func (m *SourceShardDeleteRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Uid != 0 { - n += 1 + sov(uint64(m.Uid)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Uid)) } n += len(m.unknownFields) return n @@ -25437,7 +26037,7 @@ func (m *SourceShardDeleteResponse) SizeVT() (n int) { _ = l if m.Shard != nil { l = m.Shard.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25451,7 +26051,7 @@ func (m *StartReplicationRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25475,7 +26075,7 @@ func (m *StopReplicationRequest) SizeVT() (n int) { _ = l if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25499,7 +26099,7 @@ func (m *TabletExternallyReparentedRequest) SizeVT() (n int) { _ = l if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25513,19 +26113,19 @@ func (m *TabletExternallyReparentedResponse) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.NewPrimary != nil { l = m.NewPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.OldPrimary != nil { l = m.OldPrimary.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25539,11 +26139,11 @@ func (m *UpdateCellInfoRequest) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CellInfo != nil { l = m.CellInfo.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25557,11 +26157,11 @@ func (m *UpdateCellInfoResponse) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CellInfo != nil { l = m.CellInfo.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25575,11 +26175,11 @@ func (m *UpdateCellsAliasRequest) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CellsAlias != nil { l = m.CellsAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25593,11 +26193,11 @@ func (m *UpdateCellsAliasResponse) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.CellsAlias != nil { l = m.CellsAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25625,7 +26225,7 @@ func (m *ValidateResponse) SizeVT() (n int) { if len(m.Results) > 0 { for _, s := range m.Results { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ResultsByKeyspace) > 0 { @@ -25636,9 +26236,9 @@ func (m *ValidateResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -25653,7 +26253,7 @@ func (m *ValidateKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PingTablets { n += 2 @@ -25671,7 +26271,7 @@ func (m *ValidateKeyspaceResponse) SizeVT() (n int) { if len(m.Results) > 0 { for _, s := range m.Results { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ResultsByShard) > 0 { @@ -25682,9 +26282,9 @@ func (m *ValidateKeyspaceResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -25699,12 +26299,12 @@ func (m *ValidateSchemaKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.ExcludeTables) > 0 { for _, s := range m.ExcludeTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.IncludeViews { @@ -25729,7 +26329,7 @@ func (m *ValidateSchemaKeyspaceResponse) SizeVT() (n int) { if len(m.Results) > 0 { for _, s := range m.Results { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ResultsByShard) > 0 { @@ -25740,9 +26340,9 @@ func (m *ValidateSchemaKeyspaceResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -25757,11 +26357,11 @@ func (m *ValidateShardRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.PingTablets { n += 2 @@ -25779,7 +26379,7 @@ func (m *ValidateShardResponse) SizeVT() (n int) { if len(m.Results) > 0 { for _, s := range m.Results { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -25794,7 +26394,7 @@ func (m *ValidateVersionKeyspaceRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25809,7 +26409,7 @@ func (m *ValidateVersionKeyspaceResponse) SizeVT() (n int) { if len(m.Results) > 0 { for _, s := range m.Results { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ResultsByShard) > 0 { @@ -25820,9 +26420,9 @@ func (m *ValidateVersionKeyspaceResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -25837,11 +26437,11 @@ func (m *ValidateVersionShardRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Shard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -25856,7 +26456,7 @@ func (m *ValidateVersionShardResponse) SizeVT() (n int) { if len(m.Results) > 0 { for _, s := range m.Results { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -25871,18 +26471,18 @@ func (m *ValidateVSchemaRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Shards) > 0 { for _, s := range m.Shards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ExcludeTables) > 0 { for _, s := range m.ExcludeTables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.IncludeViews { @@ -25901,7 +26501,7 @@ func (m *ValidateVSchemaResponse) SizeVT() (n int) { if len(m.Results) > 0 { for _, s := range m.Results { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.ResultsByShard) > 0 { @@ -25912,9 +26512,9 @@ func (m *ValidateVSchemaResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -25929,50 +26529,50 @@ func (m *VDiffCreateRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.SourceCells) > 0 { for _, s := range m.SourceCells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TargetCells) > 0 { for _, s := range m.TargetCells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TabletTypes) > 0 { l = 0 for _, e := range m.TabletTypes { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } if m.TabletSelectionPreference != 0 { - n += 1 + sov(uint64(m.TabletSelectionPreference)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletSelectionPreference)) } if len(m.Tables) > 0 { for _, s := range m.Tables { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Limit != 0 { - n += 1 + sov(uint64(m.Limit)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Limit)) } if m.FilteredReplicationWaitTime != nil { l = m.FilteredReplicationWaitTime.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.DebugQuery { n += 2 @@ -25984,14 +26584,14 @@ func (m *VDiffCreateRequest) SizeVT() (n int) { n += 2 } if m.MaxExtraRowsToCompare != 0 { - n += 1 + sov(uint64(m.MaxExtraRowsToCompare)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.MaxExtraRowsToCompare)) } if m.Wait { n += 2 } if m.WaitUpdateInterval != nil { l = m.WaitUpdateInterval.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.AutoRetry { n += 3 @@ -26000,11 +26600,17 @@ func (m *VDiffCreateRequest) SizeVT() (n int) { n += 3 } if m.MaxReportSampleRows != 0 { - n += 2 + sov(uint64(m.MaxReportSampleRows)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.MaxReportSampleRows)) } if m.MaxDiffDuration != nil { l = m.MaxDiffDuration.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.RowDiffColumnTruncateAt != 0 { + n += 2 + protohelpers.SizeOfVarint(uint64(m.RowDiffColumnTruncateAt)) + } + if m.AutoStart != nil { + n += 3 } n += len(m.unknownFields) return n @@ -26018,7 +26624,7 @@ func (m *VDiffCreateResponse) SizeVT() (n int) { _ = l l = len(m.UUID) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -26032,15 +26638,15 @@ func (m *VDiffDeleteRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Arg) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -26064,15 +26670,21 @@ func (m *VDiffResumeRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.TargetShards) > 0 { + for _, s := range m.TargetShards { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n @@ -26096,15 +26708,15 @@ func (m *VDiffShowRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Arg) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -26124,9 +26736,9 @@ func (m *VDiffShowResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } n += len(m.unknownFields) @@ -26141,15 +26753,21 @@ func (m *VDiffStopRequest) SizeVT() (n int) { _ = l l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TargetKeyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Uuid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if len(m.TargetShards) > 0 { + for _, s := range m.TargetShards { + l = len(s) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } } n += len(m.unknownFields) return n @@ -26173,11 +26791,11 @@ func (m *WorkflowDeleteRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.KeepData { n += 2 @@ -26188,9 +26806,12 @@ func (m *WorkflowDeleteRequest) SizeVT() (n int) { if len(m.Shards) > 0 { for _, s := range m.Shards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } + if m.DeleteBatchSize != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.DeleteBatchSize)) + } n += len(m.unknownFields) return n } @@ -26203,7 +26824,7 @@ func (m *WorkflowDeleteResponse_TabletInfo) SizeVT() (n int) { _ = l if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Deleted { n += 2 @@ -26220,12 +26841,12 @@ func (m *WorkflowDeleteResponse) SizeVT() (n int) { _ = l l = len(m.Summary) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Details) > 0 { for _, e := range m.Details { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -26240,16 +26861,16 @@ func (m *WorkflowStatusRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Shards) > 0 { for _, s := range m.Shards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -26263,19 +26884,19 @@ func (m *WorkflowStatusResponse_TableCopyState) SizeVT() (n int) { var l int _ = l if m.RowsCopied != 0 { - n += 1 + sov(uint64(m.RowsCopied)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowsCopied)) } if m.RowsTotal != 0 { - n += 1 + sov(uint64(m.RowsTotal)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowsTotal)) } if m.RowsPercentage != 0 { n += 5 } if m.BytesCopied != 0 { - n += 1 + sov(uint64(m.BytesCopied)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.BytesCopied)) } if m.BytesTotal != 0 { - n += 1 + sov(uint64(m.BytesTotal)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.BytesTotal)) } if m.BytesPercentage != 0 { n += 5 @@ -26291,27 +26912,27 @@ func (m *WorkflowStatusResponse_ShardStreamState) SizeVT() (n int) { var l int _ = l if m.Id != 0 { - n += 1 + sov(uint64(m.Id)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Id)) } if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SourceShard) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Position) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Status) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Info) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -26326,7 +26947,7 @@ func (m *WorkflowStatusResponse_ShardStreams) SizeVT() (n int) { if len(m.Streams) > 0 { for _, e := range m.Streams { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -26347,9 +26968,9 @@ func (m *WorkflowStatusResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if len(m.ShardStreams) > 0 { @@ -26360,14 +26981,14 @@ func (m *WorkflowStatusResponse) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } l = len(m.TrafficState) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -26381,38 +27002,38 @@ func (m *WorkflowSwitchTrafficRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.TabletTypes) > 0 { l = 0 for _, e := range m.TabletTypes { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } if m.MaxReplicationLagAllowed != nil { l = m.MaxReplicationLagAllowed.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.EnableReverseReplication { n += 2 } if m.Direction != 0 { - n += 1 + sov(uint64(m.Direction)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Direction)) } if m.Timeout != nil { l = m.Timeout.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.DryRun { n += 2 @@ -26423,9 +27044,12 @@ func (m *WorkflowSwitchTrafficRequest) SizeVT() (n int) { if len(m.Shards) > 0 { for _, s := range m.Shards { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } + if m.Force { + n += 2 + } n += len(m.unknownFields) return n } @@ -26438,20 +27062,20 @@ func (m *WorkflowSwitchTrafficResponse) SizeVT() (n int) { _ = l l = len(m.Summary) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.StartState) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.CurrentState) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.DryRunResults) > 0 { for _, s := range m.DryRunResults { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -26466,11 +27090,11 @@ func (m *WorkflowUpdateRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletRequest != nil { l = m.TabletRequest.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -26484,7 +27108,7 @@ func (m *WorkflowUpdateResponse_TabletInfo) SizeVT() (n int) { _ = l if m.Tablet != nil { l = m.Tablet.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Changed { n += 2 @@ -26501,12 +27125,12 @@ func (m *WorkflowUpdateResponse) SizeVT() (n int) { _ = l l = len(m.Summary) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Details) > 0 { for _, e := range m.Details { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -26531,7 +27155,7 @@ func (m *GetMirrorRulesResponse) SizeVT() (n int) { _ = l if m.MirrorRules != nil { l = m.MirrorRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -26545,18 +27169,18 @@ func (m *WorkflowMirrorTrafficRequest) SizeVT() (n int) { _ = l l = len(m.Keyspace) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Workflow) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.TabletTypes) > 0 { l = 0 for _, e := range m.TabletTypes { - l += sov(uint64(e)) + l += protohelpers.SizeOfVarint(uint64(e)) } - n += 1 + sov(uint64(l)) + l + n += 1 + protohelpers.SizeOfVarint(uint64(l)) + l } if m.Percent != 0 { n += 5 @@ -26573,26 +27197,20 @@ func (m *WorkflowMirrorTrafficResponse) SizeVT() (n int) { _ = l l = len(m.Summary) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.StartState) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.CurrentState) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *ExecuteVtctlCommandRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -26601,7 +27219,7 @@ func (m *ExecuteVtctlCommandRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26629,7 +27247,7 @@ func (m *ExecuteVtctlCommandRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26643,11 +27261,11 @@ func (m *ExecuteVtctlCommandRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26661,7 +27279,7 @@ func (m *ExecuteVtctlCommandRequest) UnmarshalVT(dAtA []byte) error { m.ActionTimeout = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26675,12 +27293,12 @@ func (m *ExecuteVtctlCommandRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -26703,7 +27321,7 @@ func (m *ExecuteVtctlCommandResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26731,7 +27349,7 @@ func (m *ExecuteVtctlCommandResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26744,11 +27362,11 @@ func (m *ExecuteVtctlCommandResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26762,12 +27380,12 @@ func (m *ExecuteVtctlCommandResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -26790,7 +27408,7 @@ func (m *TableMaterializeSettings) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26818,7 +27436,7 @@ func (m *TableMaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26832,11 +27450,11 @@ func (m *TableMaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26850,7 +27468,7 @@ func (m *TableMaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26864,11 +27482,11 @@ func (m *TableMaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26882,7 +27500,7 @@ func (m *TableMaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26896,11 +27514,11 @@ func (m *TableMaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26909,12 +27527,12 @@ func (m *TableMaterializeSettings) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -26937,7 +27555,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26965,7 +27583,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -26979,11 +27597,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -26997,7 +27615,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27011,11 +27629,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27029,7 +27647,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27043,11 +27661,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27061,7 +27679,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27081,7 +27699,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27094,11 +27712,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27115,7 +27733,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27129,11 +27747,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27147,7 +27765,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27161,11 +27779,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27179,7 +27797,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27193,11 +27811,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27211,7 +27829,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { m.MaterializationIntent = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27230,7 +27848,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27244,11 +27862,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27262,7 +27880,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27276,11 +27894,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27294,7 +27912,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27308,11 +27926,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27326,7 +27944,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27340,11 +27958,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27358,7 +27976,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27378,7 +27996,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { m.TabletSelectionPreference = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27397,7 +28015,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27417,7 +28035,7 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27430,11 +28048,11 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27446,65 +28064,14 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Keyspace) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Keyspace: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Keyspace: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 18: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ReferenceTables", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27518,61 +28085,25 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Keyspace == nil { - m.Keyspace = &topodata.Keyspace{} - } - if err := m.Keyspace.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ReferenceTables = append(m.ReferenceTables, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -27587,7 +28118,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { +func (m *Keyspace) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -27595,7 +28126,126 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Keyspace: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Keyspace: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Keyspace == nil { + m.Keyspace = &topodata.Keyspace{} + } + if err := m.Keyspace.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27623,7 +28273,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27637,11 +28287,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27655,7 +28305,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27669,11 +28319,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27687,7 +28337,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27701,11 +28351,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27719,7 +28369,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27733,11 +28383,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27751,7 +28401,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27765,11 +28415,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27783,7 +28433,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27797,11 +28447,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27815,7 +28465,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.Strategy = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27834,7 +28484,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27848,11 +28498,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27866,7 +28516,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27879,11 +28529,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27902,7 +28552,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27915,11 +28565,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27938,7 +28588,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27951,11 +28601,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -27974,7 +28624,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -27987,11 +28637,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28010,7 +28660,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28023,11 +28673,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28046,7 +28696,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28059,11 +28709,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28082,7 +28732,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28095,11 +28745,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28118,7 +28768,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.Status = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28137,7 +28787,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28151,11 +28801,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28169,7 +28819,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28183,11 +28833,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28201,7 +28851,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.Retries = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28220,7 +28870,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28233,11 +28883,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28256,7 +28906,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28287,7 +28937,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28301,11 +28951,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28319,7 +28969,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28333,11 +28983,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28351,7 +29001,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28365,11 +29015,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28383,7 +29033,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.EtaSeconds = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28402,7 +29052,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.RowsCopied = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28421,7 +29071,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.TableRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28440,7 +29090,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.AddedUniqueKeys = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28459,7 +29109,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.RemovedUniqueKeys = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28478,7 +29128,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28492,11 +29142,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28510,7 +29160,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28523,11 +29173,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28546,7 +29196,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28566,7 +29216,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28580,11 +29230,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28598,7 +29248,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28612,11 +29262,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28630,7 +29280,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28644,11 +29294,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28662,7 +29312,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28676,11 +29326,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28694,7 +29344,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28714,7 +29364,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28728,11 +29378,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28746,7 +29396,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28766,7 +29416,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28786,7 +29436,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.VitessLivenessIndicator = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28816,7 +29466,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28830,11 +29480,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28848,7 +29498,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28861,11 +29511,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28884,7 +29534,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28898,11 +29548,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28916,7 +29566,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28929,11 +29579,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -28952,7 +29602,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28972,7 +29622,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -28986,11 +29636,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29004,7 +29654,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { m.CutoverAttempts = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29023,7 +29673,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29043,7 +29693,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29056,11 +29706,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29079,7 +29729,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29092,11 +29742,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29115,7 +29765,7 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29129,11 +29779,11 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29142,12 +29792,12 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -29170,7 +29820,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29198,7 +29848,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29212,11 +29862,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29230,7 +29880,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29244,11 +29894,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29262,7 +29912,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29275,11 +29925,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29293,12 +29943,12 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -29321,7 +29971,7 @@ func (m *WorkflowOptions) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29349,7 +29999,7 @@ func (m *WorkflowOptions) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29363,11 +30013,11 @@ func (m *WorkflowOptions) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29376,24 +30026,23 @@ func (m *WorkflowOptions) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StripShardedAutoIncrement", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ShardedAutoIncrementHandling", wireType) } - var v int + m.ShardedAutoIncrementHandling = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + m.ShardedAutoIncrementHandling |= ShardedAutoIncrementHandling(b&0x7F) << shift if b < 0x80 { break } } - m.StripShardedAutoIncrement = bool(v != 0) case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) @@ -29401,7 +30050,7 @@ func (m *WorkflowOptions) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29415,191 +30064,25 @@ func (m *WorkflowOptions) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Workflow_ReplicationLocation) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Workflow_ReplicationLocation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Workflow_ReplicationLocation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Keyspace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Workflow_ShardStream) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Workflow_ShardStream: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Workflow_ShardStream: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Streams", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) } var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29612,11 +30095,336 @@ func (m *Workflow_ShardStream) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Config == nil { + m.Config = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Config[mapkey] = mapvalue + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GlobalKeyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GlobalKeyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Workflow_ReplicationLocation) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Workflow_ReplicationLocation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Workflow_ReplicationLocation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Workflow_ShardStream) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Workflow_ShardStream: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Workflow_ShardStream: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Streams", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29633,7 +30441,7 @@ func (m *Workflow_ShardStream) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29646,11 +30454,11 @@ func (m *Workflow_ShardStream) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29667,7 +30475,7 @@ func (m *Workflow_ShardStream) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29682,12 +30490,12 @@ func (m *Workflow_ShardStream) UnmarshalVT(dAtA []byte) error { m.IsPrimaryServing = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -29710,7 +30518,7 @@ func (m *Workflow_Stream_CopyState) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29738,7 +30546,7 @@ func (m *Workflow_Stream_CopyState) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29752,11 +30560,11 @@ func (m *Workflow_Stream_CopyState) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29770,7 +30578,7 @@ func (m *Workflow_Stream_CopyState) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29784,11 +30592,11 @@ func (m *Workflow_Stream_CopyState) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29802,7 +30610,7 @@ func (m *Workflow_Stream_CopyState) UnmarshalVT(dAtA []byte) error { m.StreamId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29816,12 +30624,12 @@ func (m *Workflow_Stream_CopyState) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -29844,7 +30652,7 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29872,7 +30680,7 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { m.Id = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29891,7 +30699,7 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { m.StreamId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29910,7 +30718,7 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29924,11 +30732,11 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29942,7 +30750,7 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29956,11 +30764,11 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -29974,7 +30782,7 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -29987,11 +30795,11 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30010,7 +30818,7 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30023,11 +30831,11 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30046,7 +30854,7 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30060,11 +30868,11 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30078,7 +30886,7 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { m.Count = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30092,12 +30900,12 @@ func (m *Workflow_Stream_Log) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -30120,7 +30928,7 @@ func (m *Workflow_Stream_ThrottlerStatus) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30148,7 +30956,7 @@ func (m *Workflow_Stream_ThrottlerStatus) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30162,11 +30970,11 @@ func (m *Workflow_Stream_ThrottlerStatus) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30180,7 +30988,7 @@ func (m *Workflow_Stream_ThrottlerStatus) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30193,11 +31001,11 @@ func (m *Workflow_Stream_ThrottlerStatus) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30211,12 +31019,12 @@ func (m *Workflow_Stream_ThrottlerStatus) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -30239,7 +31047,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30267,7 +31075,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { m.Id = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30286,7 +31094,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30300,11 +31108,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30318,7 +31126,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30331,11 +31139,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30354,7 +31162,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30367,11 +31175,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30390,7 +31198,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30404,11 +31212,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30422,7 +31230,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30436,11 +31244,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30454,7 +31262,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30468,11 +31276,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30486,7 +31294,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30500,11 +31308,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30518,7 +31326,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30531,11 +31339,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30554,7 +31362,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30567,11 +31375,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30590,7 +31398,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30604,11 +31412,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30622,7 +31430,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30635,11 +31443,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30656,7 +31464,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30669,11 +31477,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30690,7 +31498,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30704,11 +31512,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30722,7 +31530,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30736,11 +31544,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30754,7 +31562,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { m.RowsCopied = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30773,7 +31581,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30786,11 +31594,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30807,7 +31615,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30824,7 +31632,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30837,11 +31645,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30854,7 +31662,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30878,7 +31686,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { m.TabletSelectionPreference = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30897,7 +31705,7 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30911,11 +31719,11 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -30924,12 +31732,12 @@ func (m *Workflow_Stream) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -30952,7 +31760,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30980,7 +31788,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -30994,11 +31802,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31012,7 +31820,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31025,11 +31833,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31048,7 +31856,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31061,11 +31869,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31084,7 +31892,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { m.MaxVReplicationLag = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31103,7 +31911,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31116,11 +31924,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31135,7 +31943,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31152,7 +31960,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31166,11 +31974,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -31181,7 +31989,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31194,11 +32002,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -31210,12 +32018,12 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -31232,7 +32040,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31246,11 +32054,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31264,7 +32072,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31278,11 +32086,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31296,7 +32104,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { m.MaxVReplicationTransactionLag = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31315,7 +32123,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31335,7 +32143,7 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31348,11 +32156,11 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31366,12 +32174,12 @@ func (m *Workflow) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -31394,7 +32202,7 @@ func (m *AddCellInfoRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31422,7 +32230,7 @@ func (m *AddCellInfoRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31436,11 +32244,11 @@ func (m *AddCellInfoRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31454,7 +32262,7 @@ func (m *AddCellInfoRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31467,11 +32275,11 @@ func (m *AddCellInfoRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31485,12 +32293,12 @@ func (m *AddCellInfoRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -31513,7 +32321,7 @@ func (m *AddCellInfoResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31536,12 +32344,12 @@ func (m *AddCellInfoResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -31564,7 +32372,7 @@ func (m *AddCellsAliasRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31592,7 +32400,7 @@ func (m *AddCellsAliasRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31606,11 +32414,11 @@ func (m *AddCellsAliasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31624,7 +32432,7 @@ func (m *AddCellsAliasRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31638,11 +32446,11 @@ func (m *AddCellsAliasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31651,12 +32459,12 @@ func (m *AddCellsAliasRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -31679,7 +32487,7 @@ func (m *AddCellsAliasResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31702,12 +32510,12 @@ func (m *AddCellsAliasResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -31730,7 +32538,7 @@ func (m *ApplyKeyspaceRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31758,7 +32566,7 @@ func (m *ApplyKeyspaceRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31771,11 +32579,11 @@ func (m *ApplyKeyspaceRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31794,7 +32602,7 @@ func (m *ApplyKeyspaceRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31814,7 +32622,7 @@ func (m *ApplyKeyspaceRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31828,11 +32636,11 @@ func (m *ApplyKeyspaceRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31841,12 +32649,12 @@ func (m *ApplyKeyspaceRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -31869,7 +32677,7 @@ func (m *ApplyKeyspaceRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31897,7 +32705,7 @@ func (m *ApplyKeyspaceRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31910,11 +32718,11 @@ func (m *ApplyKeyspaceRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -31928,12 +32736,12 @@ func (m *ApplyKeyspaceRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -31956,7 +32764,7 @@ func (m *ApplyRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31984,7 +32792,7 @@ func (m *ApplyRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -31997,11 +32805,11 @@ func (m *ApplyRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32020,7 +32828,7 @@ func (m *ApplyRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32040,7 +32848,7 @@ func (m *ApplyRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32054,11 +32862,11 @@ func (m *ApplyRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32067,12 +32875,12 @@ func (m *ApplyRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -32095,7 +32903,7 @@ func (m *ApplyRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32118,12 +32926,12 @@ func (m *ApplyRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -32146,7 +32954,7 @@ func (m *ApplyShardRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32174,7 +32982,7 @@ func (m *ApplyShardRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32187,11 +32995,11 @@ func (m *ApplyShardRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32210,7 +33018,7 @@ func (m *ApplyShardRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32230,7 +33038,7 @@ func (m *ApplyShardRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32244,11 +33052,11 @@ func (m *ApplyShardRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32257,12 +33065,12 @@ func (m *ApplyShardRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -32285,7 +33093,7 @@ func (m *ApplyShardRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32308,12 +33116,12 @@ func (m *ApplyShardRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -32336,7 +33144,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32364,7 +33172,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32378,11 +33186,11 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32396,7 +33204,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32410,11 +33218,11 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32428,7 +33236,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32442,11 +33250,11 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32460,7 +33268,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32474,11 +33282,11 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32492,7 +33300,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32506,11 +33314,11 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32524,7 +33332,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32537,11 +33345,11 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32560,7 +33368,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32573,11 +33381,11 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32596,7 +33404,7 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { m.BatchSize = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32610,12 +33418,12 @@ func (m *ApplySchemaRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -32638,7 +33446,7 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32666,7 +33474,7 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32680,11 +33488,11 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32698,7 +33506,7 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32711,11 +33519,11 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32730,7 +33538,7 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32747,7 +33555,7 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32761,11 +33569,11 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -32775,7 +33583,7 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32789,12 +33597,12 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -32806,12 +33614,12 @@ func (m *ApplySchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -32834,7 +33642,7 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32862,7 +33670,7 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32876,11 +33684,11 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32894,7 +33702,7 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32914,7 +33722,7 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32934,7 +33742,7 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32948,11 +33756,11 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -32966,7 +33774,7 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -32979,11 +33787,11 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33002,7 +33810,7 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33016,11 +33824,11 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33034,7 +33842,7 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33049,12 +33857,12 @@ func (m *ApplyVSchemaRequest) UnmarshalVT(dAtA []byte) error { m.Strict = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -33077,7 +33885,7 @@ func (m *ApplyVSchemaResponse_ParamList) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33105,7 +33913,7 @@ func (m *ApplyVSchemaResponse_ParamList) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33119,11 +33927,11 @@ func (m *ApplyVSchemaResponse_ParamList) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33132,12 +33940,12 @@ func (m *ApplyVSchemaResponse_ParamList) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -33160,7 +33968,7 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33188,7 +33996,7 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33201,11 +34009,11 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33224,7 +34032,7 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33237,11 +34045,11 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33256,7 +34064,7 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33273,7 +34081,7 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33287,11 +34095,11 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -33302,7 +34110,7 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33315,11 +34123,11 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -33331,12 +34139,12 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -33348,12 +34156,12 @@ func (m *ApplyVSchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -33376,7 +34184,7 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33404,7 +34212,7 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33417,11 +34225,11 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33440,7 +34248,7 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33460,7 +34268,7 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { m.Concurrency = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33479,7 +34287,7 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33493,11 +34301,11 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33511,7 +34319,7 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33524,14 +34332,47 @@ func (m *BackupRequest) UnmarshalVT(dAtA []byte) error { } } m.UpgradeSafe = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BackupEngine", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.BackupEngine = &s + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -33554,7 +34395,7 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33582,7 +34423,7 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33595,11 +34436,11 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33618,7 +34459,7 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33632,11 +34473,11 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33650,7 +34491,7 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33664,11 +34505,11 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33682,7 +34523,7 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33695,11 +34536,11 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33713,12 +34554,12 @@ func (m *BackupResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -33741,7 +34582,7 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33769,7 +34610,7 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33783,11 +34624,11 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33801,7 +34642,7 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33815,11 +34656,11 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33833,7 +34674,7 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33853,7 +34694,7 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { m.Concurrency = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33872,7 +34713,7 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33892,7 +34733,7 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33906,11 +34747,11 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -33919,12 +34760,12 @@ func (m *BackupShardRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -33947,7 +34788,7 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33975,7 +34816,7 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -33989,11 +34830,11 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34007,7 +34848,7 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34021,11 +34862,11 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34034,12 +34875,12 @@ func (m *CancelSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -34062,7 +34903,7 @@ func (m *CancelSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34090,7 +34931,7 @@ func (m *CancelSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34103,11 +34944,11 @@ func (m *CancelSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34122,7 +34963,7 @@ func (m *CancelSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34139,7 +34980,7 @@ func (m *CancelSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34153,11 +34994,11 @@ func (m *CancelSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -34167,7 +35008,7 @@ func (m *CancelSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34181,12 +35022,12 @@ func (m *CancelSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -34198,12 +35039,551 @@ func (m *CancelSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeTabletTagsRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeTabletTagsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeTabletTagsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TabletAlias", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TabletAlias == nil { + m.TabletAlias = &topodata.TabletAlias{} + } + if err := m.TabletAlias.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tags", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Tags == nil { + m.Tags = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Tags[mapkey] = mapvalue + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Replace", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Replace = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeTabletTagsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeTabletTagsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeTabletTagsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BeforeTags", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BeforeTags == nil { + m.BeforeTags = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.BeforeTags[mapkey] = mapvalue + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AfterTags", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AfterTags == nil { + m.AfterTags = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.AfterTags[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -34226,7 +35606,7 @@ func (m *ChangeTabletTypeRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34254,7 +35634,7 @@ func (m *ChangeTabletTypeRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34267,11 +35647,11 @@ func (m *ChangeTabletTypeRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34290,7 +35670,7 @@ func (m *ChangeTabletTypeRequest) UnmarshalVT(dAtA []byte) error { m.DbType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34309,7 +35689,7 @@ func (m *ChangeTabletTypeRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34324,12 +35704,12 @@ func (m *ChangeTabletTypeRequest) UnmarshalVT(dAtA []byte) error { m.DryRun = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -34352,7 +35732,7 @@ func (m *ChangeTabletTypeResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34380,7 +35760,7 @@ func (m *ChangeTabletTypeResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34393,11 +35773,11 @@ func (m *ChangeTabletTypeResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34416,7 +35796,7 @@ func (m *ChangeTabletTypeResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34429,11 +35809,11 @@ func (m *ChangeTabletTypeResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34452,7 +35832,7 @@ func (m *ChangeTabletTypeResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34467,12 +35847,12 @@ func (m *ChangeTabletTypeResponse) UnmarshalVT(dAtA []byte) error { m.WasDryRun = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -34495,7 +35875,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34523,7 +35903,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34536,11 +35916,11 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34559,7 +35939,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34573,11 +35953,11 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34591,7 +35971,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34605,11 +35985,11 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34623,7 +36003,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34643,7 +36023,7 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34658,12 +36038,12 @@ func (m *CheckThrottlerRequest) UnmarshalVT(dAtA []byte) error { m.OkIfNotExists = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -34686,7 +36066,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34714,7 +36094,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34727,11 +36107,11 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34750,7 +36130,7 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34763,11 +36143,11 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34781,12 +36161,12 @@ func (m *CheckThrottlerResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -34809,7 +36189,7 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34837,7 +36217,7 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34851,11 +36231,11 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34869,7 +36249,7 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34883,11 +36263,11 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34896,12 +36276,12 @@ func (m *CleanupSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -34924,7 +36304,7 @@ func (m *CleanupSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34952,7 +36332,7 @@ func (m *CleanupSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -34965,11 +36345,11 @@ func (m *CleanupSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -34984,7 +36364,7 @@ func (m *CleanupSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35001,7 +36381,7 @@ func (m *CleanupSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35015,11 +36395,11 @@ func (m *CleanupSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -35029,7 +36409,7 @@ func (m *CleanupSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35043,12 +36423,12 @@ func (m *CleanupSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -35060,12 +36440,12 @@ func (m *CleanupSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -35088,7 +36468,7 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35116,7 +36496,7 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35130,11 +36510,11 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35148,7 +36528,7 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35162,11 +36542,11 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35175,12 +36555,12 @@ func (m *CompleteSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -35203,7 +36583,7 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35231,7 +36611,7 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35244,11 +36624,11 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35263,7 +36643,7 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35280,7 +36660,7 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35294,11 +36674,11 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -35308,7 +36688,7 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35322,12 +36702,12 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -35339,12 +36719,12 @@ func (m *CompleteSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -35367,7 +36747,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35395,7 +36775,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35409,11 +36789,11 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35427,7 +36807,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35447,7 +36827,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35467,7 +36847,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35486,7 +36866,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35500,11 +36880,11 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35518,7 +36898,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35531,11 +36911,11 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35554,7 +36934,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35568,11 +36948,11 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35586,7 +36966,7 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35600,11 +36980,11 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35613,12 +36993,12 @@ func (m *CreateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -35641,7 +37021,7 @@ func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35669,7 +37049,7 @@ func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35682,11 +37062,11 @@ func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35700,12 +37080,12 @@ func (m *CreateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -35728,7 +37108,7 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35756,7 +37136,7 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35770,11 +37150,11 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35788,7 +37168,7 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35802,11 +37182,11 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35820,7 +37200,7 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35840,7 +37220,7 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35855,12 +37235,12 @@ func (m *CreateShardRequest) UnmarshalVT(dAtA []byte) error { m.IncludeParent = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -35883,7 +37263,7 @@ func (m *CreateShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35911,7 +37291,7 @@ func (m *CreateShardResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35924,11 +37304,11 @@ func (m *CreateShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35947,7 +37327,7 @@ func (m *CreateShardResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35960,11 +37340,11 @@ func (m *CreateShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -35983,7 +37363,7 @@ func (m *CreateShardResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -35998,12 +37378,12 @@ func (m *CreateShardResponse) UnmarshalVT(dAtA []byte) error { m.ShardAlreadyExists = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36026,7 +37406,7 @@ func (m *DeleteCellInfoRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36054,7 +37434,7 @@ func (m *DeleteCellInfoRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36068,11 +37448,11 @@ func (m *DeleteCellInfoRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -36086,7 +37466,7 @@ func (m *DeleteCellInfoRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36101,12 +37481,12 @@ func (m *DeleteCellInfoRequest) UnmarshalVT(dAtA []byte) error { m.Force = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36129,7 +37509,7 @@ func (m *DeleteCellInfoResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36152,12 +37532,12 @@ func (m *DeleteCellInfoResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36180,7 +37560,7 @@ func (m *DeleteCellsAliasRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36208,7 +37588,7 @@ func (m *DeleteCellsAliasRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36222,11 +37602,11 @@ func (m *DeleteCellsAliasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -36235,12 +37615,12 @@ func (m *DeleteCellsAliasRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36263,7 +37643,7 @@ func (m *DeleteCellsAliasResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36286,12 +37666,12 @@ func (m *DeleteCellsAliasResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36314,7 +37694,7 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36342,7 +37722,7 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36356,11 +37736,11 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -36374,7 +37754,7 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36394,7 +37774,7 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36409,12 +37789,12 @@ func (m *DeleteKeyspaceRequest) UnmarshalVT(dAtA []byte) error { m.Force = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36437,7 +37817,7 @@ func (m *DeleteKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36460,12 +37840,12 @@ func (m *DeleteKeyspaceResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36488,7 +37868,7 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36516,7 +37896,7 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36529,11 +37909,11 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -36550,7 +37930,7 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36570,7 +37950,7 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36590,7 +37970,7 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36605,12 +37985,12 @@ func (m *DeleteShardsRequest) UnmarshalVT(dAtA []byte) error { m.Force = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36633,7 +38013,7 @@ func (m *DeleteShardsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36656,12 +38036,12 @@ func (m *DeleteShardsResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36684,7 +38064,7 @@ func (m *DeleteSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36712,7 +38092,7 @@ func (m *DeleteSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36726,11 +38106,11 @@ func (m *DeleteSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -36739,12 +38119,12 @@ func (m *DeleteSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36767,7 +38147,7 @@ func (m *DeleteSrvVSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36790,12 +38170,12 @@ func (m *DeleteSrvVSchemaResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36818,7 +38198,7 @@ func (m *DeleteTabletsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36846,7 +38226,7 @@ func (m *DeleteTabletsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36859,11 +38239,11 @@ func (m *DeleteTabletsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -36880,7 +38260,7 @@ func (m *DeleteTabletsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36895,12 +38275,12 @@ func (m *DeleteTabletsRequest) UnmarshalVT(dAtA []byte) error { m.AllowPrimary = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36923,7 +38303,7 @@ func (m *DeleteTabletsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -36946,12 +38326,12 @@ func (m *DeleteTabletsResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -36974,7 +38354,7 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37002,7 +38382,7 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37016,11 +38396,11 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37034,7 +38414,7 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37048,11 +38428,11 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37066,7 +38446,7 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37079,11 +38459,11 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37102,7 +38482,7 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37115,11 +38495,11 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37136,7 +38516,7 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37149,11 +38529,11 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37172,7 +38552,7 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37192,7 +38572,7 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37205,14 +38585,50 @@ func (m *EmergencyReparentShardRequest) UnmarshalVT(dAtA []byte) error { } } m.WaitForAllTablets = bool(v != 0) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpectedPrimary", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExpectedPrimary == nil { + m.ExpectedPrimary = &topodata.TabletAlias{} + } + if err := m.ExpectedPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -37235,7 +38651,7 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37263,7 +38679,7 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37277,11 +38693,11 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37295,7 +38711,7 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37309,11 +38725,11 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37327,7 +38743,7 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37340,11 +38756,11 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37363,7 +38779,7 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37376,11 +38792,11 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37392,12 +38808,12 @@ func (m *EmergencyReparentShardResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -37420,7 +38836,7 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37448,7 +38864,7 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37461,11 +38877,11 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37484,7 +38900,7 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37498,11 +38914,11 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37516,7 +38932,7 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { m.MaxRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37535,7 +38951,7 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37550,12 +38966,12 @@ func (m *ExecuteFetchAsAppRequest) UnmarshalVT(dAtA []byte) error { m.UsePool = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -37578,7 +38994,7 @@ func (m *ExecuteFetchAsAppResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37606,7 +39022,7 @@ func (m *ExecuteFetchAsAppResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37619,11 +39035,11 @@ func (m *ExecuteFetchAsAppResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37637,12 +39053,12 @@ func (m *ExecuteFetchAsAppResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -37665,7 +39081,7 @@ func (m *ExecuteFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37693,7 +39109,7 @@ func (m *ExecuteFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37706,11 +39122,11 @@ func (m *ExecuteFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37729,7 +39145,7 @@ func (m *ExecuteFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37743,11 +39159,11 @@ func (m *ExecuteFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37761,7 +39177,7 @@ func (m *ExecuteFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { m.MaxRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37780,7 +39196,7 @@ func (m *ExecuteFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37800,7 +39216,7 @@ func (m *ExecuteFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37815,12 +39231,12 @@ func (m *ExecuteFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { m.ReloadSchema = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -37843,7 +39259,7 @@ func (m *ExecuteFetchAsDBAResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37871,7 +39287,7 @@ func (m *ExecuteFetchAsDBAResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37884,11 +39300,11 @@ func (m *ExecuteFetchAsDBAResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37902,12 +39318,12 @@ func (m *ExecuteFetchAsDBAResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -37930,7 +39346,7 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37958,7 +39374,7 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -37971,11 +39387,11 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -37994,7 +39410,7 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38007,11 +39423,11 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38025,12 +39441,12 @@ func (m *ExecuteHookRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -38053,7 +39469,7 @@ func (m *ExecuteHookResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38081,7 +39497,7 @@ func (m *ExecuteHookResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38094,11 +39510,11 @@ func (m *ExecuteHookResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38112,12 +39528,12 @@ func (m *ExecuteHookResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -38140,7 +39556,7 @@ func (m *ExecuteMultiFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38168,7 +39584,7 @@ func (m *ExecuteMultiFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38181,11 +39597,11 @@ func (m *ExecuteMultiFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38204,7 +39620,7 @@ func (m *ExecuteMultiFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38218,11 +39634,11 @@ func (m *ExecuteMultiFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38236,7 +39652,7 @@ func (m *ExecuteMultiFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { m.MaxRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38255,7 +39671,7 @@ func (m *ExecuteMultiFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38275,7 +39691,7 @@ func (m *ExecuteMultiFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38290,12 +39706,12 @@ func (m *ExecuteMultiFetchAsDBARequest) UnmarshalVT(dAtA []byte) error { m.ReloadSchema = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -38318,7 +39734,7 @@ func (m *ExecuteMultiFetchAsDBAResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38346,7 +39762,7 @@ func (m *ExecuteMultiFetchAsDBAResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38359,11 +39775,11 @@ func (m *ExecuteMultiFetchAsDBAResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38375,12 +39791,12 @@ func (m *ExecuteMultiFetchAsDBAResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -38403,7 +39819,7 @@ func (m *FindAllShardsInKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38431,7 +39847,7 @@ func (m *FindAllShardsInKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38445,11 +39861,11 @@ func (m *FindAllShardsInKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38458,12 +39874,12 @@ func (m *FindAllShardsInKeyspaceRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -38486,7 +39902,7 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38514,7 +39930,7 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38527,11 +39943,11 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38546,7 +39962,7 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38563,7 +39979,7 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38577,11 +39993,11 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -38592,7 +40008,7 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38605,11 +40021,11 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -38621,12 +40037,12 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -38638,12 +40054,12 @@ func (m *FindAllShardsInKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -38666,7 +40082,7 @@ func (m *ForceCutOverSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38694,7 +40110,7 @@ func (m *ForceCutOverSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38708,11 +40124,11 @@ func (m *ForceCutOverSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38726,7 +40142,7 @@ func (m *ForceCutOverSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38740,11 +40156,11 @@ func (m *ForceCutOverSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38753,12 +40169,12 @@ func (m *ForceCutOverSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -38781,7 +40197,7 @@ func (m *ForceCutOverSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38809,7 +40225,7 @@ func (m *ForceCutOverSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38822,11 +40238,11 @@ func (m *ForceCutOverSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -38841,7 +40257,7 @@ func (m *ForceCutOverSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38858,7 +40274,7 @@ func (m *ForceCutOverSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38872,11 +40288,11 @@ func (m *ForceCutOverSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -38886,7 +40302,7 @@ func (m *ForceCutOverSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38900,12 +40316,12 @@ func (m *ForceCutOverSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -38917,12 +40333,12 @@ func (m *ForceCutOverSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -38945,7 +40361,7 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38973,7 +40389,7 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -38987,11 +40403,11 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -39005,7 +40421,7 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39019,11 +40435,11 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -39037,7 +40453,7 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { m.Limit = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39056,7 +40472,7 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39076,7 +40492,7 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { m.DetailedLimit = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39090,12 +40506,12 @@ func (m *GetBackupsRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39118,7 +40534,7 @@ func (m *GetBackupsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39146,7 +40562,7 @@ func (m *GetBackupsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39159,11 +40575,11 @@ func (m *GetBackupsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -39175,12 +40591,12 @@ func (m *GetBackupsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39203,7 +40619,7 @@ func (m *GetCellInfoRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39231,7 +40647,7 @@ func (m *GetCellInfoRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39245,11 +40661,11 @@ func (m *GetCellInfoRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -39258,12 +40674,12 @@ func (m *GetCellInfoRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39286,7 +40702,7 @@ func (m *GetCellInfoResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39314,7 +40730,7 @@ func (m *GetCellInfoResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39327,11 +40743,11 @@ func (m *GetCellInfoResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -39345,12 +40761,12 @@ func (m *GetCellInfoResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39373,7 +40789,7 @@ func (m *GetCellInfoNamesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39396,12 +40812,12 @@ func (m *GetCellInfoNamesRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39424,7 +40840,7 @@ func (m *GetCellInfoNamesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39452,7 +40868,7 @@ func (m *GetCellInfoNamesResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39466,11 +40882,11 @@ func (m *GetCellInfoNamesResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -39479,12 +40895,12 @@ func (m *GetCellInfoNamesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39507,7 +40923,7 @@ func (m *GetCellsAliasesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39530,12 +40946,12 @@ func (m *GetCellsAliasesRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39558,7 +40974,7 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39586,7 +41002,7 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39599,11 +41015,11 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -39618,7 +41034,7 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39635,7 +41051,7 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39649,11 +41065,11 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -39664,7 +41080,7 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39677,11 +41093,11 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -39693,12 +41109,12 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -39710,12 +41126,12 @@ func (m *GetCellsAliasesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39738,7 +41154,7 @@ func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39766,7 +41182,7 @@ func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39779,11 +41195,11 @@ func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -39797,12 +41213,12 @@ func (m *GetFullStatusRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39825,7 +41241,7 @@ func (m *GetFullStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39853,7 +41269,7 @@ func (m *GetFullStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39866,11 +41282,11 @@ func (m *GetFullStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -39884,12 +41300,12 @@ func (m *GetFullStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39912,7 +41328,7 @@ func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39935,12 +41351,12 @@ func (m *GetKeyspacesRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -39963,7 +41379,7 @@ func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -39991,7 +41407,7 @@ func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40004,11 +41420,11 @@ func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40020,12 +41436,12 @@ func (m *GetKeyspacesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40048,7 +41464,7 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40076,7 +41492,7 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40090,11 +41506,11 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40103,12 +41519,12 @@ func (m *GetKeyspaceRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40131,7 +41547,7 @@ func (m *GetKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40159,7 +41575,7 @@ func (m *GetKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40172,11 +41588,11 @@ func (m *GetKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40190,12 +41606,12 @@ func (m *GetKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40218,7 +41634,7 @@ func (m *GetPermissionsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40246,7 +41662,7 @@ func (m *GetPermissionsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40259,11 +41675,11 @@ func (m *GetPermissionsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40277,12 +41693,12 @@ func (m *GetPermissionsRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40305,7 +41721,7 @@ func (m *GetPermissionsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40333,7 +41749,7 @@ func (m *GetPermissionsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40346,11 +41762,11 @@ func (m *GetPermissionsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40364,12 +41780,12 @@ func (m *GetPermissionsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40392,7 +41808,7 @@ func (m *GetKeyspaceRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40415,12 +41831,12 @@ func (m *GetKeyspaceRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40443,7 +41859,7 @@ func (m *GetKeyspaceRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40471,7 +41887,7 @@ func (m *GetKeyspaceRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40484,11 +41900,11 @@ func (m *GetKeyspaceRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40502,12 +41918,12 @@ func (m *GetKeyspaceRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40530,7 +41946,7 @@ func (m *GetRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40553,12 +41969,12 @@ func (m *GetRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40581,7 +41997,7 @@ func (m *GetRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40609,7 +42025,7 @@ func (m *GetRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40622,11 +42038,11 @@ func (m *GetRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40640,12 +42056,12 @@ func (m *GetRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40668,7 +42084,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40696,7 +42112,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40709,11 +42125,11 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40732,7 +42148,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40746,11 +42162,11 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40764,7 +42180,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40778,11 +42194,11 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40796,7 +42212,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40816,7 +42232,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40836,7 +42252,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40856,7 +42272,7 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40871,12 +42287,12 @@ func (m *GetSchemaRequest) UnmarshalVT(dAtA []byte) error { m.TableSchemaOnly = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40899,7 +42315,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40927,7 +42343,7 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -40940,11 +42356,11 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -40958,12 +42374,12 @@ func (m *GetSchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -40986,7 +42402,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41014,7 +42430,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41028,11 +42444,11 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41046,7 +42462,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41060,11 +42476,11 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41078,7 +42494,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41092,11 +42508,11 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41110,7 +42526,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { m.Status = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41129,7 +42545,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41142,11 +42558,11 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41165,7 +42581,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { m.Order = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41184,7 +42600,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { m.Limit = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41203,7 +42619,7 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { m.Skip = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41217,12 +42633,12 @@ func (m *GetSchemaMigrationsRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -41245,7 +42661,7 @@ func (m *GetSchemaMigrationsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41273,7 +42689,7 @@ func (m *GetSchemaMigrationsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41286,11 +42702,11 @@ func (m *GetSchemaMigrationsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41302,12 +42718,12 @@ func (m *GetSchemaMigrationsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -41330,7 +42746,7 @@ func (m *GetShardReplicationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41358,7 +42774,7 @@ func (m *GetShardReplicationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41372,11 +42788,11 @@ func (m *GetShardReplicationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41390,7 +42806,7 @@ func (m *GetShardReplicationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41404,11 +42820,11 @@ func (m *GetShardReplicationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41422,7 +42838,7 @@ func (m *GetShardReplicationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41436,11 +42852,11 @@ func (m *GetShardReplicationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41449,12 +42865,12 @@ func (m *GetShardReplicationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -41477,7 +42893,7 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41505,7 +42921,7 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41518,11 +42934,11 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41537,7 +42953,7 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41554,7 +42970,7 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41568,11 +42984,11 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -41583,7 +42999,7 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41596,11 +43012,11 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -41612,12 +43028,12 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -41629,12 +43045,12 @@ func (m *GetShardReplicationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -41657,7 +43073,7 @@ func (m *GetShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41685,7 +43101,7 @@ func (m *GetShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41699,11 +43115,11 @@ func (m *GetShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41717,7 +43133,7 @@ func (m *GetShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41731,11 +43147,11 @@ func (m *GetShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41744,12 +43160,12 @@ func (m *GetShardRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -41772,7 +43188,7 @@ func (m *GetShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41800,7 +43216,7 @@ func (m *GetShardResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41813,11 +43229,11 @@ func (m *GetShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41831,12 +43247,12 @@ func (m *GetShardResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -41859,7 +43275,7 @@ func (m *GetShardRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41882,12 +43298,12 @@ func (m *GetShardRoutingRulesRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -41910,7 +43326,7 @@ func (m *GetShardRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41938,7 +43354,7 @@ func (m *GetShardRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -41951,11 +43367,11 @@ func (m *GetShardRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -41969,12 +43385,12 @@ func (m *GetShardRoutingRulesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -41997,7 +43413,7 @@ func (m *GetSrvKeyspaceNamesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42025,7 +43441,7 @@ func (m *GetSrvKeyspaceNamesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42039,11 +43455,11 @@ func (m *GetSrvKeyspaceNamesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42052,12 +43468,12 @@ func (m *GetSrvKeyspaceNamesRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -42080,7 +43496,7 @@ func (m *GetSrvKeyspaceNamesResponse_NameList) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42108,7 +43524,7 @@ func (m *GetSrvKeyspaceNamesResponse_NameList) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42122,11 +43538,11 @@ func (m *GetSrvKeyspaceNamesResponse_NameList) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42135,12 +43551,12 @@ func (m *GetSrvKeyspaceNamesResponse_NameList) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -42163,7 +43579,7 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42191,7 +43607,7 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42204,11 +43620,11 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42223,7 +43639,7 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42240,7 +43656,7 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42254,11 +43670,11 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -42269,7 +43685,7 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42282,11 +43698,11 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -42298,12 +43714,12 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -42315,12 +43731,12 @@ func (m *GetSrvKeyspaceNamesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -42343,7 +43759,7 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42371,7 +43787,7 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42385,11 +43801,11 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42403,7 +43819,7 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42417,11 +43833,11 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42430,12 +43846,12 @@ func (m *GetSrvKeyspacesRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -42458,7 +43874,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42486,7 +43902,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42499,11 +43915,11 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42518,7 +43934,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42535,7 +43951,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42549,11 +43965,11 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -42564,7 +43980,7 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42577,11 +43993,11 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -42593,12 +44009,12 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -42610,12 +44026,12 @@ func (m *GetSrvKeyspacesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -42638,7 +44054,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42666,7 +44082,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42680,11 +44096,11 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42698,7 +44114,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42718,7 +44134,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42749,7 +44165,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42763,11 +44179,11 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42781,7 +44197,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42801,7 +44217,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42821,7 +44237,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42841,7 +44257,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42854,11 +44270,11 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42877,7 +44293,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42891,11 +44307,11 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42909,7 +44325,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42923,11 +44339,11 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42941,7 +44357,7 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -42955,11 +44371,11 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -42968,12 +44384,12 @@ func (m *UpdateThrottlerConfigRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -42996,7 +44412,7 @@ func (m *UpdateThrottlerConfigResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43019,12 +44435,12 @@ func (m *UpdateThrottlerConfigResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -43047,7 +44463,7 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43075,7 +44491,7 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43089,11 +44505,11 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43102,12 +44518,12 @@ func (m *GetSrvVSchemaRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -43130,7 +44546,7 @@ func (m *GetSrvVSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43158,7 +44574,7 @@ func (m *GetSrvVSchemaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43171,11 +44587,11 @@ func (m *GetSrvVSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43189,12 +44605,12 @@ func (m *GetSrvVSchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -43217,7 +44633,7 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43245,7 +44661,7 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43259,11 +44675,11 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43272,12 +44688,12 @@ func (m *GetSrvVSchemasRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -43300,7 +44716,7 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43328,7 +44744,7 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43341,11 +44757,11 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43360,7 +44776,7 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43377,7 +44793,7 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43391,11 +44807,11 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -43406,7 +44822,7 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43419,11 +44835,11 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -43435,12 +44851,12 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -43452,12 +44868,12 @@ func (m *GetSrvVSchemasResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -43480,7 +44896,7 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43508,7 +44924,7 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43521,11 +44937,11 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43539,12 +44955,12 @@ func (m *GetTabletRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -43567,7 +44983,7 @@ func (m *GetTabletResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43595,7 +45011,7 @@ func (m *GetTabletResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43608,11 +45024,11 @@ func (m *GetTabletResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43626,12 +45042,12 @@ func (m *GetTabletResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -43654,7 +45070,7 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43682,7 +45098,7 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43696,11 +45112,11 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43714,7 +45130,7 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43728,11 +45144,11 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43746,7 +45162,7 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43760,11 +45176,11 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43778,7 +45194,7 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43798,7 +45214,7 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43811,11 +45227,11 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43832,7 +45248,7 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { m.TabletType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43846,12 +45262,12 @@ func (m *GetTabletsRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -43874,7 +45290,7 @@ func (m *GetTabletsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43902,7 +45318,7 @@ func (m *GetTabletsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43915,11 +45331,11 @@ func (m *GetTabletsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -43931,12 +45347,12 @@ func (m *GetTabletsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -43959,7 +45375,7 @@ func (m *GetThrottlerStatusRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -43987,7 +45403,7 @@ func (m *GetThrottlerStatusRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44000,11 +45416,11 @@ func (m *GetThrottlerStatusRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44018,12 +45434,12 @@ func (m *GetThrottlerStatusRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -44046,7 +45462,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44074,7 +45490,7 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44087,11 +45503,11 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44105,12 +45521,12 @@ func (m *GetThrottlerStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -44133,7 +45549,7 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44161,7 +45577,7 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44175,11 +45591,11 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44193,7 +45609,7 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { m.Version = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44212,7 +45628,7 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44227,12 +45643,12 @@ func (m *GetTopologyPathRequest) UnmarshalVT(dAtA []byte) error { m.AsJson = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -44255,7 +45671,7 @@ func (m *GetTopologyPathResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44283,7 +45699,7 @@ func (m *GetTopologyPathResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44296,11 +45712,11 @@ func (m *GetTopologyPathResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44314,12 +45730,12 @@ func (m *GetTopologyPathResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -44342,7 +45758,7 @@ func (m *TopologyCell) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44370,7 +45786,7 @@ func (m *TopologyCell) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44384,11 +45800,11 @@ func (m *TopologyCell) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44402,7 +45818,7 @@ func (m *TopologyCell) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44416,11 +45832,11 @@ func (m *TopologyCell) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44434,7 +45850,7 @@ func (m *TopologyCell) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44448,11 +45864,11 @@ func (m *TopologyCell) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44466,7 +45882,296 @@ func (m *TopologyCell) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Children = append(m.Children, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + m.Version = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Version |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetUnresolvedTransactionsRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetUnresolvedTransactionsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetUnresolvedTransactionsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AbandonAge", wireType) + } + m.AbandonAge = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AbandonAge |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetUnresolvedTransactionsResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetUnresolvedTransactionsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetUnresolvedTransactionsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Transactions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Transactions = append(m.Transactions, &query.TransactionMetadata{}) + if err := m.Transactions[len(m.Transactions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConcludeTransactionRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConcludeTransactionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConcludeTransactionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Dtid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44480,44 +46185,110 @@ func (m *TopologyCell) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Children = append(m.Children, string(dAtA[iNdEx:postIndex])) + m.Dtid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Participants", wireType) } - m.Version = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - m.Version |= int64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Participants = append(m.Participants, &query.Target{}) + if err := m.Participants[len(m.Participants)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConcludeTransactionResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConcludeTransactionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConcludeTransactionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -44540,7 +46311,7 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44568,7 +46339,7 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44582,11 +46353,11 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44595,12 +46366,12 @@ func (m *GetVSchemaRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -44623,7 +46394,7 @@ func (m *GetVersionRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44651,7 +46422,7 @@ func (m *GetVersionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44664,11 +46435,11 @@ func (m *GetVersionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44682,12 +46453,12 @@ func (m *GetVersionRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -44710,7 +46481,7 @@ func (m *GetVersionResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44738,7 +46509,7 @@ func (m *GetVersionResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44752,11 +46523,11 @@ func (m *GetVersionResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44765,12 +46536,12 @@ func (m *GetVersionResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -44793,7 +46564,7 @@ func (m *GetVSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44821,7 +46592,7 @@ func (m *GetVSchemaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44834,11 +46605,11 @@ func (m *GetVSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44852,12 +46623,12 @@ func (m *GetVSchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -44880,7 +46651,7 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44908,7 +46679,7 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44922,11 +46693,11 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -44940,7 +46711,7 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44960,7 +46731,7 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44980,7 +46751,7 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -44994,11 +46765,11 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45012,7 +46783,7 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45032,7 +46803,7 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45046,11 +46817,11 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45059,12 +46830,12 @@ func (m *GetWorkflowsRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -45087,7 +46858,7 @@ func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45115,7 +46886,7 @@ func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45128,11 +46899,11 @@ func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45144,12 +46915,12 @@ func (m *GetWorkflowsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -45172,7 +46943,7 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45200,7 +46971,7 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45214,11 +46985,11 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45232,7 +47003,7 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45246,11 +47017,11 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45264,7 +47035,7 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45277,11 +47048,11 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45300,7 +47071,7 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45320,7 +47091,7 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45333,11 +47104,11 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45351,12 +47122,12 @@ func (m *InitShardPrimaryRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -45379,7 +47150,7 @@ func (m *InitShardPrimaryResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45407,7 +47178,7 @@ func (m *InitShardPrimaryResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45420,11 +47191,11 @@ func (m *InitShardPrimaryResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45436,12 +47207,12 @@ func (m *InitShardPrimaryResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -45464,7 +47235,7 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45492,7 +47263,7 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45506,11 +47277,11 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45524,7 +47295,7 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45538,11 +47309,11 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45551,12 +47322,12 @@ func (m *LaunchSchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -45579,7 +47350,7 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45607,7 +47378,7 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45620,11 +47391,11 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45639,7 +47410,7 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45656,7 +47427,7 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45670,11 +47441,11 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -45684,7 +47455,7 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45698,12 +47469,12 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -45715,12 +47486,12 @@ func (m *LaunchSchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -45743,7 +47514,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45771,7 +47542,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45785,11 +47556,11 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45803,7 +47574,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45817,11 +47588,11 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45835,7 +47606,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45849,11 +47620,11 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45867,7 +47638,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45880,11 +47651,11 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45903,7 +47674,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45921,7 +47692,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45938,7 +47709,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45951,11 +47722,11 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -45968,7 +47739,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -45992,7 +47763,7 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { m.TabletSelectionPreference = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46006,12 +47777,12 @@ func (m *LookupVindexCreateRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -46034,7 +47805,7 @@ func (m *LookupVindexCreateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46057,12 +47828,12 @@ func (m *LookupVindexCreateResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -46085,7 +47856,7 @@ func (m *LookupVindexExternalizeRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46113,7 +47884,7 @@ func (m *LookupVindexExternalizeRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46127,11 +47898,11 @@ func (m *LookupVindexExternalizeRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46145,7 +47916,7 @@ func (m *LookupVindexExternalizeRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46159,11 +47930,11 @@ func (m *LookupVindexExternalizeRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46177,7 +47948,7 @@ func (m *LookupVindexExternalizeRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46191,11 +47962,11 @@ func (m *LookupVindexExternalizeRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46204,12 +47975,12 @@ func (m *LookupVindexExternalizeRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -46232,7 +48003,7 @@ func (m *LookupVindexExternalizeResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46260,7 +48031,7 @@ func (m *LookupVindexExternalizeResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46275,12 +48046,12 @@ func (m *LookupVindexExternalizeResponse) UnmarshalVT(dAtA []byte) error { m.WorkflowDeleted = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -46303,7 +48074,7 @@ func (m *MaterializeCreateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46331,7 +48102,7 @@ func (m *MaterializeCreateRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46344,11 +48115,11 @@ func (m *MaterializeCreateRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46362,12 +48133,12 @@ func (m *MaterializeCreateRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -46390,7 +48161,7 @@ func (m *MaterializeCreateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46413,12 +48184,12 @@ func (m *MaterializeCreateResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -46441,7 +48212,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46469,7 +48240,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46483,11 +48254,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46501,7 +48272,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46515,11 +48286,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46533,7 +48304,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46547,11 +48318,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46565,7 +48336,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46579,11 +48350,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46597,7 +48368,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46611,11 +48382,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46627,7 +48398,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46644,7 +48415,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46657,11 +48428,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46674,7 +48445,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46698,7 +48469,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { m.TabletSelectionPreference = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46717,7 +48488,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46737,7 +48508,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46751,11 +48522,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46769,7 +48540,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46783,11 +48554,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46801,7 +48572,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46815,11 +48586,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46833,7 +48604,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46847,11 +48618,11 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -46865,7 +48636,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46885,7 +48656,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46905,7 +48676,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46925,7 +48696,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46945,7 +48716,7 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -46960,12 +48731,12 @@ func (m *MigrateCreateRequest) UnmarshalVT(dAtA []byte) error { m.NoRoutingRules = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -46988,7 +48759,7 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47016,7 +48787,7 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47030,11 +48801,11 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47048,7 +48819,7 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47062,11 +48833,11 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47080,7 +48851,7 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47100,7 +48871,7 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47120,7 +48891,7 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47140,7 +48911,7 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47155,12 +48926,12 @@ func (m *MigrateCompleteRequest) UnmarshalVT(dAtA []byte) error { m.DryRun = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -47183,7 +48954,7 @@ func (m *MigrateCompleteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47211,7 +48982,7 @@ func (m *MigrateCompleteResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47225,11 +48996,11 @@ func (m *MigrateCompleteResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47243,7 +49014,7 @@ func (m *MigrateCompleteResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47257,11 +49028,11 @@ func (m *MigrateCompleteResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47270,12 +49041,12 @@ func (m *MigrateCompleteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -47298,7 +49069,7 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47326,7 +49097,7 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47340,11 +49111,11 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47358,7 +49129,7 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47372,11 +49143,11 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47390,7 +49161,7 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47404,11 +49175,11 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47422,7 +49193,7 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47436,11 +49207,11 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47449,12 +49220,12 @@ func (m *MountRegisterRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -47477,7 +49248,7 @@ func (m *MountRegisterResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47500,12 +49271,12 @@ func (m *MountRegisterResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -47528,7 +49299,7 @@ func (m *MountUnregisterRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47556,7 +49327,7 @@ func (m *MountUnregisterRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47570,11 +49341,11 @@ func (m *MountUnregisterRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47583,12 +49354,12 @@ func (m *MountUnregisterRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -47611,7 +49382,7 @@ func (m *MountUnregisterResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47634,12 +49405,12 @@ func (m *MountUnregisterResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -47662,7 +49433,7 @@ func (m *MountShowRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47690,7 +49461,7 @@ func (m *MountShowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47704,11 +49475,11 @@ func (m *MountShowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47717,12 +49488,12 @@ func (m *MountShowRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -47745,7 +49516,7 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47773,7 +49544,7 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47787,11 +49558,11 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47805,7 +49576,7 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47819,11 +49590,11 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47837,7 +49608,7 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47851,11 +49622,11 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47869,7 +49640,7 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47883,11 +49654,11 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -47896,12 +49667,12 @@ func (m *MountShowResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -47924,7 +49695,7 @@ func (m *MountListRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -47947,12 +49718,12 @@ func (m *MountListRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -47975,7 +49746,7 @@ func (m *MountListResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48003,7 +49774,7 @@ func (m *MountListResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48017,11 +49788,11 @@ func (m *MountListResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48030,12 +49801,12 @@ func (m *MountListResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -48058,7 +49829,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48086,7 +49857,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48100,11 +49871,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48118,7 +49889,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48132,11 +49903,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48150,7 +49921,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48164,11 +49935,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48182,7 +49953,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48196,11 +49967,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48212,7 +49983,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48229,7 +50000,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48242,11 +50013,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48259,7 +50030,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48283,7 +50054,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { m.TabletSelectionPreference = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48302,7 +50073,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48316,11 +50087,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48334,7 +50105,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48354,7 +50125,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48368,11 +50139,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48386,7 +50157,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48400,11 +50171,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48418,7 +50189,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48432,11 +50203,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48450,7 +50221,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48464,11 +50235,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48482,7 +50253,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48496,11 +50267,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48514,7 +50285,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48534,7 +50305,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48554,7 +50325,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48574,7 +50345,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48594,7 +50365,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48614,7 +50385,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48634,7 +50405,7 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48647,11 +50418,11 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48665,12 +50436,12 @@ func (m *MoveTablesCreateRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -48693,7 +50464,7 @@ func (m *MoveTablesCreateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48721,7 +50492,7 @@ func (m *MoveTablesCreateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48734,11 +50505,11 @@ func (m *MoveTablesCreateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48757,7 +50528,7 @@ func (m *MoveTablesCreateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48772,12 +50543,12 @@ func (m *MoveTablesCreateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { m.Created = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -48800,7 +50571,7 @@ func (m *MoveTablesCreateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48828,7 +50599,7 @@ func (m *MoveTablesCreateResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48842,11 +50613,11 @@ func (m *MoveTablesCreateResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48860,7 +50631,7 @@ func (m *MoveTablesCreateResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48873,11 +50644,11 @@ func (m *MoveTablesCreateResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48889,12 +50660,12 @@ func (m *MoveTablesCreateResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -48917,7 +50688,7 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48945,7 +50716,7 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48959,11 +50730,11 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -48977,7 +50748,7 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -48991,11 +50762,11 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49009,7 +50780,7 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49029,7 +50800,7 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49049,7 +50820,7 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49069,7 +50840,7 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49089,7 +50860,7 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49103,11 +50874,11 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49116,12 +50887,12 @@ func (m *MoveTablesCompleteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -49144,7 +50915,7 @@ func (m *MoveTablesCompleteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49172,7 +50943,7 @@ func (m *MoveTablesCompleteResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49186,11 +50957,11 @@ func (m *MoveTablesCompleteResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49204,7 +50975,7 @@ func (m *MoveTablesCompleteResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49218,11 +50989,11 @@ func (m *MoveTablesCompleteResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49231,12 +51002,12 @@ func (m *MoveTablesCompleteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -49259,7 +51030,7 @@ func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49287,7 +51058,7 @@ func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49300,11 +51071,11 @@ func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49318,12 +51089,12 @@ func (m *PingTabletRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -49346,7 +51117,7 @@ func (m *PingTabletResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49369,12 +51140,12 @@ func (m *PingTabletResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -49397,7 +51168,7 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49425,7 +51196,7 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49439,11 +51210,11 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49457,7 +51228,7 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49471,11 +51242,11 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49489,7 +51260,7 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49502,11 +51273,11 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49525,7 +51296,7 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49538,11 +51309,11 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49561,7 +51332,7 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49574,11 +51345,11 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49597,7 +51368,7 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49610,11 +51381,11 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49626,14 +51397,70 @@ func (m *PlannedReparentShardRequest) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowCrossCellPromotion", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllowCrossCellPromotion = bool(v != 0) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpectedPrimary", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExpectedPrimary == nil { + m.ExpectedPrimary = &topodata.TabletAlias{} + } + if err := m.ExpectedPrimary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -49656,7 +51483,7 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49684,7 +51511,7 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49698,11 +51525,11 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49716,7 +51543,7 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49730,11 +51557,11 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49748,7 +51575,7 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49761,11 +51588,11 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49784,7 +51611,7 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49797,11 +51624,11 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49813,12 +51640,12 @@ func (m *PlannedReparentShardResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -49841,7 +51668,7 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49869,7 +51696,7 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49883,11 +51710,11 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49901,7 +51728,7 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49915,11 +51742,11 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -49933,7 +51760,7 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49948,12 +51775,12 @@ func (m *RebuildKeyspaceGraphRequest) UnmarshalVT(dAtA []byte) error { m.AllowPartial = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -49976,7 +51803,7 @@ func (m *RebuildKeyspaceGraphResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -49999,12 +51826,12 @@ func (m *RebuildKeyspaceGraphResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50027,7 +51854,7 @@ func (m *RebuildVSchemaGraphRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50055,7 +51882,7 @@ func (m *RebuildVSchemaGraphRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50069,11 +51896,11 @@ func (m *RebuildVSchemaGraphRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50082,12 +51909,12 @@ func (m *RebuildVSchemaGraphRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50110,7 +51937,7 @@ func (m *RebuildVSchemaGraphResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50133,12 +51960,12 @@ func (m *RebuildVSchemaGraphResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50161,7 +51988,7 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50189,7 +52016,7 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50202,11 +52029,11 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50220,12 +52047,12 @@ func (m *RefreshStateRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50248,7 +52075,7 @@ func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50271,12 +52098,12 @@ func (m *RefreshStateResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50299,7 +52126,7 @@ func (m *RefreshStateByShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50327,7 +52154,7 @@ func (m *RefreshStateByShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50341,11 +52168,11 @@ func (m *RefreshStateByShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50359,7 +52186,7 @@ func (m *RefreshStateByShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50373,11 +52200,11 @@ func (m *RefreshStateByShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50391,7 +52218,7 @@ func (m *RefreshStateByShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50405,11 +52232,11 @@ func (m *RefreshStateByShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50418,12 +52245,12 @@ func (m *RefreshStateByShardRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50446,7 +52273,7 @@ func (m *RefreshStateByShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50474,7 +52301,7 @@ func (m *RefreshStateByShardResponse) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50494,7 +52321,7 @@ func (m *RefreshStateByShardResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50508,11 +52335,11 @@ func (m *RefreshStateByShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50521,12 +52348,12 @@ func (m *RefreshStateByShardResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50549,7 +52376,7 @@ func (m *ReloadSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50577,7 +52404,7 @@ func (m *ReloadSchemaRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50590,11 +52417,11 @@ func (m *ReloadSchemaRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50608,12 +52435,12 @@ func (m *ReloadSchemaRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50636,7 +52463,7 @@ func (m *ReloadSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50659,12 +52486,12 @@ func (m *ReloadSchemaResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50687,7 +52514,7 @@ func (m *ReloadSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50715,7 +52542,7 @@ func (m *ReloadSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50729,11 +52556,11 @@ func (m *ReloadSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50747,7 +52574,7 @@ func (m *ReloadSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50761,11 +52588,11 @@ func (m *ReloadSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50779,7 +52606,7 @@ func (m *ReloadSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50799,7 +52626,7 @@ func (m *ReloadSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { m.Concurrency = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50813,12 +52640,12 @@ func (m *ReloadSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50841,7 +52668,7 @@ func (m *ReloadSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50869,7 +52696,7 @@ func (m *ReloadSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50882,11 +52709,11 @@ func (m *ReloadSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50898,12 +52725,12 @@ func (m *ReloadSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -50926,7 +52753,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50954,7 +52781,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -50968,11 +52795,11 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -50986,7 +52813,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51000,11 +52827,11 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51018,7 +52845,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51032,11 +52859,11 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51050,7 +52877,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51070,7 +52897,7 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { m.Concurrency = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51084,12 +52911,12 @@ func (m *ReloadSchemaShardRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -51112,7 +52939,7 @@ func (m *ReloadSchemaShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51140,7 +52967,7 @@ func (m *ReloadSchemaShardResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51153,11 +52980,11 @@ func (m *ReloadSchemaShardResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51169,12 +52996,12 @@ func (m *ReloadSchemaShardResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -51197,7 +53024,7 @@ func (m *RemoveBackupRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51225,7 +53052,7 @@ func (m *RemoveBackupRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51239,11 +53066,11 @@ func (m *RemoveBackupRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51257,7 +53084,7 @@ func (m *RemoveBackupRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51271,11 +53098,11 @@ func (m *RemoveBackupRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51289,7 +53116,7 @@ func (m *RemoveBackupRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51303,11 +53130,11 @@ func (m *RemoveBackupRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51316,12 +53143,12 @@ func (m *RemoveBackupRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -51344,7 +53171,7 @@ func (m *RemoveBackupResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51367,12 +53194,12 @@ func (m *RemoveBackupResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -51395,7 +53222,7 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51423,7 +53250,7 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51437,11 +53264,11 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51455,7 +53282,7 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51469,11 +53296,11 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51487,7 +53314,7 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51507,7 +53334,7 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51522,12 +53349,12 @@ func (m *RemoveKeyspaceCellRequest) UnmarshalVT(dAtA []byte) error { m.Recursive = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -51550,7 +53377,7 @@ func (m *RemoveKeyspaceCellResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51573,12 +53400,12 @@ func (m *RemoveKeyspaceCellResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -51601,7 +53428,7 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51629,7 +53456,7 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51643,11 +53470,11 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51661,7 +53488,7 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51675,11 +53502,11 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51693,7 +53520,7 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51707,11 +53534,11 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51725,7 +53552,7 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51745,7 +53572,7 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51760,12 +53587,12 @@ func (m *RemoveShardCellRequest) UnmarshalVT(dAtA []byte) error { m.Recursive = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -51788,7 +53615,7 @@ func (m *RemoveShardCellResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51811,12 +53638,12 @@ func (m *RemoveShardCellResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -51839,7 +53666,7 @@ func (m *ReparentTabletRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51867,7 +53694,7 @@ func (m *ReparentTabletRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51880,11 +53707,11 @@ func (m *ReparentTabletRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51898,12 +53725,12 @@ func (m *ReparentTabletRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -51926,7 +53753,7 @@ func (m *ReparentTabletResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51954,7 +53781,7 @@ func (m *ReparentTabletResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -51968,11 +53795,11 @@ func (m *ReparentTabletResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -51986,7 +53813,7 @@ func (m *ReparentTabletResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52000,11 +53827,11 @@ func (m *ReparentTabletResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52018,7 +53845,7 @@ func (m *ReparentTabletResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52031,11 +53858,11 @@ func (m *ReparentTabletResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52049,12 +53876,12 @@ func (m *ReparentTabletResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -52077,7 +53904,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52105,7 +53932,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52119,11 +53946,11 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52137,7 +53964,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52151,11 +53978,11 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52169,7 +53996,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52183,11 +54010,11 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52201,7 +54028,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52215,11 +54042,11 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52233,7 +54060,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52247,11 +54074,11 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52263,7 +54090,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52280,7 +54107,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52293,11 +54120,11 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52310,7 +54137,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52334,7 +54161,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { m.TabletSelectionPreference = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52353,7 +54180,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52373,7 +54200,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52387,11 +54214,11 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52405,7 +54232,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52425,7 +54252,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52445,7 +54272,7 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52458,14 +54285,50 @@ func (m *ReshardCreateRequest) UnmarshalVT(dAtA []byte) error { } } m.AutoStart = bool(v != 0) + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WorkflowOptions == nil { + m.WorkflowOptions = &WorkflowOptions{} + } + if err := m.WorkflowOptions.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -52488,7 +54351,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52516,7 +54379,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52529,11 +54392,11 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52552,7 +54415,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52565,11 +54428,11 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52588,7 +54451,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52602,11 +54465,11 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52620,7 +54483,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52640,7 +54503,7 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52653,11 +54516,11 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52669,14 +54532,46 @@ func (m *RestoreFromBackupRequest) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedBackupEngines", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedBackupEngines = append(m.AllowedBackupEngines, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -52699,7 +54594,7 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52727,7 +54622,7 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52740,11 +54635,11 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52763,7 +54658,7 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52777,11 +54672,11 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52795,7 +54690,7 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52809,11 +54704,11 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52827,7 +54722,7 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52840,11 +54735,11 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52858,12 +54753,12 @@ func (m *RestoreFromBackupResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -52886,7 +54781,7 @@ func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52914,7 +54809,7 @@ func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52928,11 +54823,11 @@ func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52946,7 +54841,7 @@ func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -52960,11 +54855,11 @@ func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -52973,12 +54868,12 @@ func (m *RetrySchemaMigrationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53001,7 +54896,7 @@ func (m *RetrySchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53029,7 +54924,7 @@ func (m *RetrySchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53042,11 +54937,11 @@ func (m *RetrySchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53061,7 +54956,7 @@ func (m *RetrySchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53078,7 +54973,7 @@ func (m *RetrySchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53092,11 +54987,11 @@ func (m *RetrySchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -53106,7 +55001,7 @@ func (m *RetrySchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53120,12 +55015,12 @@ func (m *RetrySchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -53137,12 +55032,12 @@ func (m *RetrySchemaMigrationResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53165,7 +55060,7 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53193,7 +55088,7 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53206,11 +55101,11 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53224,12 +55119,12 @@ func (m *RunHealthCheckRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53252,7 +55147,7 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53275,12 +55170,12 @@ func (m *RunHealthCheckResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53303,7 +55198,7 @@ func (m *SetKeyspaceDurabilityPolicyRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53331,7 +55226,7 @@ func (m *SetKeyspaceDurabilityPolicyRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53345,11 +55240,11 @@ func (m *SetKeyspaceDurabilityPolicyRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53363,7 +55258,7 @@ func (m *SetKeyspaceDurabilityPolicyRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53377,11 +55272,11 @@ func (m *SetKeyspaceDurabilityPolicyRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53390,12 +55285,12 @@ func (m *SetKeyspaceDurabilityPolicyRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53418,7 +55313,7 @@ func (m *SetKeyspaceDurabilityPolicyResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53446,7 +55341,7 @@ func (m *SetKeyspaceDurabilityPolicyResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53459,11 +55354,11 @@ func (m *SetKeyspaceDurabilityPolicyResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53477,12 +55372,12 @@ func (m *SetKeyspaceDurabilityPolicyResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53505,7 +55400,7 @@ func (m *SetKeyspaceShardingInfoRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53533,7 +55428,7 @@ func (m *SetKeyspaceShardingInfoRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53547,11 +55442,11 @@ func (m *SetKeyspaceShardingInfoRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53565,7 +55460,7 @@ func (m *SetKeyspaceShardingInfoRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53580,12 +55475,12 @@ func (m *SetKeyspaceShardingInfoRequest) UnmarshalVT(dAtA []byte) error { m.Force = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53608,7 +55503,7 @@ func (m *SetKeyspaceShardingInfoResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53636,7 +55531,7 @@ func (m *SetKeyspaceShardingInfoResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53649,11 +55544,11 @@ func (m *SetKeyspaceShardingInfoResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53667,12 +55562,12 @@ func (m *SetKeyspaceShardingInfoResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53695,7 +55590,7 @@ func (m *SetShardIsPrimaryServingRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53723,7 +55618,7 @@ func (m *SetShardIsPrimaryServingRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53737,11 +55632,11 @@ func (m *SetShardIsPrimaryServingRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53755,7 +55650,7 @@ func (m *SetShardIsPrimaryServingRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53769,11 +55664,11 @@ func (m *SetShardIsPrimaryServingRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53787,7 +55682,7 @@ func (m *SetShardIsPrimaryServingRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53802,12 +55697,12 @@ func (m *SetShardIsPrimaryServingRequest) UnmarshalVT(dAtA []byte) error { m.IsServing = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53830,7 +55725,7 @@ func (m *SetShardIsPrimaryServingResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53858,7 +55753,7 @@ func (m *SetShardIsPrimaryServingResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53871,11 +55766,11 @@ func (m *SetShardIsPrimaryServingResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53889,12 +55784,12 @@ func (m *SetShardIsPrimaryServingResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -53917,7 +55812,7 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53945,7 +55840,7 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53959,11 +55854,11 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -53977,7 +55872,7 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -53991,11 +55886,11 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54009,7 +55904,7 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { m.TabletType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54028,7 +55923,7 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54042,11 +55937,11 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54060,7 +55955,7 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54074,11 +55969,11 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54092,7 +55987,7 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54112,7 +56007,7 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54127,12 +56022,12 @@ func (m *SetShardTabletControlRequest) UnmarshalVT(dAtA []byte) error { m.Remove = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -54155,7 +56050,7 @@ func (m *SetShardTabletControlResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54183,7 +56078,7 @@ func (m *SetShardTabletControlResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54196,11 +56091,11 @@ func (m *SetShardTabletControlResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54214,12 +56109,12 @@ func (m *SetShardTabletControlResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -54242,7 +56137,7 @@ func (m *SetWritableRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54270,7 +56165,7 @@ func (m *SetWritableRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54283,11 +56178,11 @@ func (m *SetWritableRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54306,7 +56201,7 @@ func (m *SetWritableRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54321,12 +56216,12 @@ func (m *SetWritableRequest) UnmarshalVT(dAtA []byte) error { m.Writable = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -54349,7 +56244,7 @@ func (m *SetWritableResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54372,12 +56267,12 @@ func (m *SetWritableResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -54400,7 +56295,7 @@ func (m *ShardReplicationAddRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54428,7 +56323,7 @@ func (m *ShardReplicationAddRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54442,11 +56337,11 @@ func (m *ShardReplicationAddRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54460,7 +56355,7 @@ func (m *ShardReplicationAddRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54474,11 +56369,11 @@ func (m *ShardReplicationAddRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54492,7 +56387,7 @@ func (m *ShardReplicationAddRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54505,11 +56400,11 @@ func (m *ShardReplicationAddRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54523,12 +56418,12 @@ func (m *ShardReplicationAddRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -54551,7 +56446,7 @@ func (m *ShardReplicationAddResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54574,12 +56469,12 @@ func (m *ShardReplicationAddResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -54602,7 +56497,7 @@ func (m *ShardReplicationFixRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54630,7 +56525,7 @@ func (m *ShardReplicationFixRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54644,11 +56539,11 @@ func (m *ShardReplicationFixRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54662,7 +56557,7 @@ func (m *ShardReplicationFixRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54676,11 +56571,11 @@ func (m *ShardReplicationFixRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54694,7 +56589,7 @@ func (m *ShardReplicationFixRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54708,11 +56603,11 @@ func (m *ShardReplicationFixRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54721,12 +56616,12 @@ func (m *ShardReplicationFixRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -54749,7 +56644,7 @@ func (m *ShardReplicationFixResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54777,7 +56672,7 @@ func (m *ShardReplicationFixResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54790,11 +56685,11 @@ func (m *ShardReplicationFixResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54808,12 +56703,12 @@ func (m *ShardReplicationFixResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -54836,7 +56731,7 @@ func (m *ShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54864,7 +56759,7 @@ func (m *ShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54878,11 +56773,11 @@ func (m *ShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54896,7 +56791,7 @@ func (m *ShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54910,11 +56805,11 @@ func (m *ShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -54923,12 +56818,12 @@ func (m *ShardReplicationPositionsRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -54951,7 +56846,7 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54979,7 +56874,7 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -54992,11 +56887,11 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55011,7 +56906,7 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55028,7 +56923,7 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55042,11 +56937,11 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -55057,7 +56952,7 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55070,11 +56965,11 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -55086,12 +56981,12 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -55108,7 +57003,7 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55121,11 +57016,11 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55140,7 +57035,7 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55157,7 +57052,7 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55171,11 +57066,11 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -55186,7 +57081,7 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55199,11 +57094,11 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -55215,12 +57110,12 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -55232,12 +57127,12 @@ func (m *ShardReplicationPositionsResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -55260,7 +57155,7 @@ func (m *ShardReplicationRemoveRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55288,7 +57183,7 @@ func (m *ShardReplicationRemoveRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55302,11 +57197,11 @@ func (m *ShardReplicationRemoveRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55320,7 +57215,7 @@ func (m *ShardReplicationRemoveRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55334,11 +57229,11 @@ func (m *ShardReplicationRemoveRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55352,7 +57247,7 @@ func (m *ShardReplicationRemoveRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55365,11 +57260,11 @@ func (m *ShardReplicationRemoveRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55383,12 +57278,12 @@ func (m *ShardReplicationRemoveRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -55411,7 +57306,7 @@ func (m *ShardReplicationRemoveResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55434,12 +57329,12 @@ func (m *ShardReplicationRemoveResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -55462,7 +57357,7 @@ func (m *SleepTabletRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55490,7 +57385,7 @@ func (m *SleepTabletRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55503,11 +57398,11 @@ func (m *SleepTabletRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55526,7 +57421,7 @@ func (m *SleepTabletRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55539,11 +57434,11 @@ func (m *SleepTabletRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55557,12 +57452,12 @@ func (m *SleepTabletRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -55585,7 +57480,7 @@ func (m *SleepTabletResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55608,12 +57503,12 @@ func (m *SleepTabletResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -55636,7 +57531,7 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55664,7 +57559,7 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55678,11 +57573,11 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55696,7 +57591,7 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55710,11 +57605,11 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55728,7 +57623,7 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { m.Uid = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55747,7 +57642,7 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55761,11 +57656,11 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55779,7 +57674,7 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55793,11 +57688,11 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55811,7 +57706,7 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55824,11 +57719,11 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55847,7 +57742,7 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55861,11 +57756,11 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55874,12 +57769,12 @@ func (m *SourceShardAddRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -55902,7 +57797,7 @@ func (m *SourceShardAddResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55930,7 +57825,7 @@ func (m *SourceShardAddResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -55943,11 +57838,11 @@ func (m *SourceShardAddResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -55961,12 +57856,12 @@ func (m *SourceShardAddResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -55989,7 +57884,7 @@ func (m *SourceShardDeleteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56017,7 +57912,7 @@ func (m *SourceShardDeleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56031,11 +57926,11 @@ func (m *SourceShardDeleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56049,7 +57944,7 @@ func (m *SourceShardDeleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56063,11 +57958,11 @@ func (m *SourceShardDeleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56081,7 +57976,7 @@ func (m *SourceShardDeleteRequest) UnmarshalVT(dAtA []byte) error { m.Uid = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56095,12 +57990,12 @@ func (m *SourceShardDeleteRequest) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56123,7 +58018,7 @@ func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56151,7 +58046,7 @@ func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56164,11 +58059,11 @@ func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56182,12 +58077,12 @@ func (m *SourceShardDeleteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56210,7 +58105,7 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56238,7 +58133,7 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56251,11 +58146,11 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56269,12 +58164,12 @@ func (m *StartReplicationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56297,7 +58192,7 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56320,12 +58215,12 @@ func (m *StartReplicationResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56348,7 +58243,7 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56376,7 +58271,7 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56389,11 +58284,11 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56407,12 +58302,12 @@ func (m *StopReplicationRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56435,7 +58330,7 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56458,12 +58353,12 @@ func (m *StopReplicationResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56486,7 +58381,7 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56514,7 +58409,7 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56527,11 +58422,11 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56545,12 +58440,12 @@ func (m *TabletExternallyReparentedRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56573,7 +58468,7 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56601,7 +58496,7 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56615,11 +58510,11 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56633,7 +58528,7 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56647,11 +58542,11 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56665,7 +58560,7 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56678,11 +58573,11 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56701,7 +58596,7 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56714,11 +58609,11 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56732,12 +58627,12 @@ func (m *TabletExternallyReparentedResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56760,7 +58655,7 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56788,7 +58683,7 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56802,11 +58697,11 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56820,7 +58715,7 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56833,11 +58728,11 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56851,12 +58746,12 @@ func (m *UpdateCellInfoRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56879,7 +58774,7 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56907,7 +58802,7 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56921,11 +58816,11 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56939,7 +58834,7 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -56952,11 +58847,11 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -56970,12 +58865,12 @@ func (m *UpdateCellInfoResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -56998,7 +58893,7 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57026,7 +58921,7 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57040,11 +58935,11 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57058,7 +58953,7 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57071,11 +58966,11 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57089,12 +58984,12 @@ func (m *UpdateCellsAliasRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -57117,7 +59012,7 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57145,7 +59040,7 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57159,11 +59054,11 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57177,7 +59072,7 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57190,11 +59085,11 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57208,12 +59103,12 @@ func (m *UpdateCellsAliasResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -57236,7 +59131,7 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57264,7 +59159,7 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57279,12 +59174,12 @@ func (m *ValidateRequest) UnmarshalVT(dAtA []byte) error { m.PingTablets = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -57307,7 +59202,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57335,7 +59230,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57349,11 +59244,11 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57367,7 +59262,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57380,11 +59275,11 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57399,7 +59294,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57416,7 +59311,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57430,11 +59325,11 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -57445,7 +59340,7 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57458,11 +59353,11 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -57474,12 +59369,12 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -57491,12 +59386,12 @@ func (m *ValidateResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -57519,7 +59414,7 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57547,7 +59442,7 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57561,11 +59456,11 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57579,7 +59474,7 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57594,12 +59489,12 @@ func (m *ValidateKeyspaceRequest) UnmarshalVT(dAtA []byte) error { m.PingTablets = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -57622,7 +59517,7 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57650,7 +59545,7 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57664,11 +59559,11 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57682,7 +59577,7 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57695,11 +59590,11 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57714,7 +59609,7 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57731,7 +59626,7 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57745,11 +59640,11 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -57760,7 +59655,7 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57773,11 +59668,11 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -57789,12 +59684,12 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -57806,12 +59701,12 @@ func (m *ValidateKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -57834,7 +59729,7 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57862,7 +59757,7 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57876,11 +59771,11 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57894,7 +59789,7 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57908,11 +59803,11 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -57926,7 +59821,7 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57946,7 +59841,7 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57966,7 +59861,7 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -57981,12 +59876,12 @@ func (m *ValidateSchemaKeyspaceRequest) UnmarshalVT(dAtA []byte) error { m.IncludeVschema = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -58009,7 +59904,7 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58037,7 +59932,7 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58051,11 +59946,11 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58069,7 +59964,7 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58082,11 +59977,11 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58101,7 +59996,7 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58118,7 +60013,7 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58132,11 +60027,11 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -58147,7 +60042,7 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58160,11 +60055,11 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -58176,12 +60071,12 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -58193,12 +60088,12 @@ func (m *ValidateSchemaKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -58221,7 +60116,7 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58249,7 +60144,7 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58263,11 +60158,11 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58281,7 +60176,7 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58295,11 +60190,11 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58313,7 +60208,7 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58328,12 +60223,12 @@ func (m *ValidateShardRequest) UnmarshalVT(dAtA []byte) error { m.PingTablets = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -58356,7 +60251,7 @@ func (m *ValidateShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58384,7 +60279,7 @@ func (m *ValidateShardResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58398,11 +60293,11 @@ func (m *ValidateShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58411,12 +60306,12 @@ func (m *ValidateShardResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -58439,7 +60334,7 @@ func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58467,7 +60362,7 @@ func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58481,11 +60376,11 @@ func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58494,12 +60389,12 @@ func (m *ValidateVersionKeyspaceRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -58522,7 +60417,7 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58550,7 +60445,7 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58564,11 +60459,11 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58582,7 +60477,7 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58595,11 +60490,11 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58614,7 +60509,7 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58631,7 +60526,7 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58645,11 +60540,11 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -58660,7 +60555,7 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58673,11 +60568,11 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -58689,12 +60584,12 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -58706,12 +60601,12 @@ func (m *ValidateVersionKeyspaceResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -58734,7 +60629,7 @@ func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58762,7 +60657,7 @@ func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58776,11 +60671,11 @@ func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58794,7 +60689,7 @@ func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58808,11 +60703,11 @@ func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58821,12 +60716,12 @@ func (m *ValidateVersionShardRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -58849,7 +60744,7 @@ func (m *ValidateVersionShardResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58877,7 +60772,7 @@ func (m *ValidateVersionShardResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58891,11 +60786,11 @@ func (m *ValidateVersionShardResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58904,12 +60799,12 @@ func (m *ValidateVersionShardResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -58932,7 +60827,7 @@ func (m *ValidateVSchemaRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58960,7 +60855,7 @@ func (m *ValidateVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -58974,11 +60869,11 @@ func (m *ValidateVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -58992,7 +60887,7 @@ func (m *ValidateVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59006,11 +60901,11 @@ func (m *ValidateVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59024,7 +60919,7 @@ func (m *ValidateVSchemaRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59038,11 +60933,11 @@ func (m *ValidateVSchemaRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59056,7 +60951,7 @@ func (m *ValidateVSchemaRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59071,12 +60966,12 @@ func (m *ValidateVSchemaRequest) UnmarshalVT(dAtA []byte) error { m.IncludeViews = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -59099,7 +60994,7 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59127,7 +61022,7 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59141,11 +61036,11 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59159,7 +61054,7 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59172,11 +61067,11 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59191,7 +61086,7 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59208,7 +61103,7 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59222,11 +61117,11 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -59237,7 +61132,7 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59250,11 +61145,11 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -59266,12 +61161,12 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -59283,12 +61178,12 @@ func (m *ValidateVSchemaResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -59311,7 +61206,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59339,7 +61234,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59353,11 +61248,11 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59371,7 +61266,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59385,11 +61280,11 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59403,7 +61298,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59417,11 +61312,11 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59435,7 +61330,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59449,11 +61344,11 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59467,7 +61362,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59481,11 +61376,11 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59497,7 +61392,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59514,7 +61409,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59527,11 +61422,11 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59544,7 +61439,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59568,7 +61463,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { m.TabletSelectionPreference = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59587,7 +61482,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59601,11 +61496,11 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59619,7 +61514,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { m.Limit = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59638,7 +61533,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59651,11 +61546,11 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59674,7 +61569,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59694,7 +61589,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59714,7 +61609,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59734,7 +61629,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { m.MaxExtraRowsToCompare = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59753,7 +61648,7 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59773,7 +61668,102 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WaitUpdateInterval == nil { + m.WaitUpdateInterval = &vttime.Duration{} + } + if err := m.WaitUpdateInterval.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoRetry", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AutoRetry = bool(v != 0) + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Verbose", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Verbose = bool(v != 0) + case 19: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxReportSampleRows", wireType) + } + m.MaxReportSampleRows = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxReportSampleRows |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxDiffDuration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59786,50 +61776,49 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.WaitUpdateInterval == nil { - m.WaitUpdateInterval = &vttime.Duration{} + if m.MaxDiffDuration == nil { + m.MaxDiffDuration = &vttime.Duration{} } - if err := m.WaitUpdateInterval.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if err := m.MaxDiffDuration.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 17: + case 21: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoRetry", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RowDiffColumnTruncateAt", wireType) } - var v int + m.RowDiffColumnTruncateAt = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + m.RowDiffColumnTruncateAt |= int64(b&0x7F) << shift if b < 0x80 { break } } - m.AutoRetry = bool(v != 0) - case 18: + case 22: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Verbose", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AutoStart", wireType) } var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59841,70 +61830,16 @@ func (m *VDiffCreateRequest) UnmarshalVT(dAtA []byte) error { break } } - m.Verbose = bool(v != 0) - case 19: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxReportSampleRows", wireType) - } - m.MaxReportSampleRows = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxReportSampleRows |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 20: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxDiffDuration", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.MaxDiffDuration == nil { - m.MaxDiffDuration = &vttime.Duration{} - } - if err := m.MaxDiffDuration.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex + b := bool(v != 0) + m.AutoStart = &b default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -59927,7 +61862,7 @@ func (m *VDiffCreateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59955,7 +61890,7 @@ func (m *VDiffCreateResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -59969,11 +61904,11 @@ func (m *VDiffCreateResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -59982,12 +61917,12 @@ func (m *VDiffCreateResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -60010,7 +61945,7 @@ func (m *VDiffDeleteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60038,7 +61973,7 @@ func (m *VDiffDeleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60052,11 +61987,11 @@ func (m *VDiffDeleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -60070,7 +62005,7 @@ func (m *VDiffDeleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60084,11 +62019,11 @@ func (m *VDiffDeleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -60102,7 +62037,7 @@ func (m *VDiffDeleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60116,11 +62051,11 @@ func (m *VDiffDeleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -60129,12 +62064,12 @@ func (m *VDiffDeleteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -60157,7 +62092,7 @@ func (m *VDiffDeleteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60180,12 +62115,12 @@ func (m *VDiffDeleteResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -60208,7 +62143,7 @@ func (m *VDiffResumeRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60236,7 +62171,7 @@ func (m *VDiffResumeRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60250,11 +62185,11 @@ func (m *VDiffResumeRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -60268,7 +62203,7 @@ func (m *VDiffResumeRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60282,11 +62217,11 @@ func (m *VDiffResumeRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -60300,7 +62235,7 @@ func (m *VDiffResumeRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60314,25 +62249,57 @@ func (m *VDiffResumeRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.Uuid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetShards", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TargetShards = append(m.TargetShards, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -60355,7 +62322,7 @@ func (m *VDiffResumeResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60378,12 +62345,12 @@ func (m *VDiffResumeResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -60406,7 +62373,7 @@ func (m *VDiffShowRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60434,7 +62401,7 @@ func (m *VDiffShowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60448,11 +62415,11 @@ func (m *VDiffShowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -60466,7 +62433,7 @@ func (m *VDiffShowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60480,11 +62447,11 @@ func (m *VDiffShowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -60498,7 +62465,7 @@ func (m *VDiffShowRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60512,11 +62479,11 @@ func (m *VDiffShowRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -60525,12 +62492,12 @@ func (m *VDiffShowRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -60553,7 +62520,187 @@ func (m *VDiffShowResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VDiffShowResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VDiffShowResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TabletResponses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TabletResponses == nil { + m.TabletResponses = make(map[string]*tabletmanagerdata.VDiffResponse) + } + var mapkey string + var mapvalue *tabletmanagerdata.VDiffResponse + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return protohelpers.ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return protohelpers.ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return protohelpers.ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &tabletmanagerdata.VDiffResponse{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.TabletResponses[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VDiffStopRequest) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60568,200 +62715,52 @@ func (m *VDiffShowResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: VDiffShowResponse: wiretype end group for non-group") + return fmt.Errorf("proto: VDiffStopRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: VDiffShowResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: VDiffStopRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TabletResponses", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.TabletResponses == nil { - m.TabletResponses = make(map[string]*tabletmanagerdata.VDiffResponse) - } - var mapkey string - var mapvalue *tabletmanagerdata.VDiffResponse - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLength - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLength - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLength - } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return ErrInvalidLength - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue = &tabletmanagerdata.VDiffResponse{} - if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - } else { - iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.TabletResponses[mapkey] = mapvalue + m.Workflow = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *VDiffStopRequest) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: VDiffStopRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: VDiffStopRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TargetKeyspace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60775,25 +62774,25 @@ func (m *VDiffStopRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Workflow = string(dAtA[iNdEx:postIndex]) + m.TargetKeyspace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TargetKeyspace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Uuid", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60807,25 +62806,25 @@ func (m *VDiffStopRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.TargetKeyspace = string(dAtA[iNdEx:postIndex]) + m.Uuid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Uuid", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TargetShards", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60839,25 +62838,25 @@ func (m *VDiffStopRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Uuid = string(dAtA[iNdEx:postIndex]) + m.TargetShards = append(m.TargetShards, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -60880,7 +62879,7 @@ func (m *VDiffStopResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60903,12 +62902,12 @@ func (m *VDiffStopResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -60931,7 +62930,7 @@ func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60959,7 +62958,7 @@ func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -60973,11 +62972,11 @@ func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -60991,7 +62990,7 @@ func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61005,11 +63004,11 @@ func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61023,7 +63022,7 @@ func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61043,7 +63042,7 @@ func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61063,7 +63062,7 @@ func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61077,25 +63076,44 @@ func (m *WorkflowDeleteRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DeleteBatchSize", wireType) + } + m.DeleteBatchSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DeleteBatchSize |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -61118,7 +63136,7 @@ func (m *WorkflowDeleteResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61146,7 +63164,7 @@ func (m *WorkflowDeleteResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61159,11 +63177,11 @@ func (m *WorkflowDeleteResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61182,7 +63200,7 @@ func (m *WorkflowDeleteResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61197,12 +63215,12 @@ func (m *WorkflowDeleteResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { m.Deleted = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -61225,7 +63243,7 @@ func (m *WorkflowDeleteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61253,7 +63271,7 @@ func (m *WorkflowDeleteResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61267,11 +63285,11 @@ func (m *WorkflowDeleteResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61285,7 +63303,7 @@ func (m *WorkflowDeleteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61298,11 +63316,11 @@ func (m *WorkflowDeleteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61314,12 +63332,12 @@ func (m *WorkflowDeleteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -61342,7 +63360,7 @@ func (m *WorkflowStatusRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61370,7 +63388,7 @@ func (m *WorkflowStatusRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61384,11 +63402,11 @@ func (m *WorkflowStatusRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61402,7 +63420,7 @@ func (m *WorkflowStatusRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61416,11 +63434,11 @@ func (m *WorkflowStatusRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61434,7 +63452,7 @@ func (m *WorkflowStatusRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61448,11 +63466,11 @@ func (m *WorkflowStatusRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61461,12 +63479,12 @@ func (m *WorkflowStatusRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -61489,7 +63507,7 @@ func (m *WorkflowStatusResponse_TableCopyState) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61517,7 +63535,7 @@ func (m *WorkflowStatusResponse_TableCopyState) UnmarshalVT(dAtA []byte) error { m.RowsCopied = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61536,7 +63554,7 @@ func (m *WorkflowStatusResponse_TableCopyState) UnmarshalVT(dAtA []byte) error { m.RowsTotal = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61566,7 +63584,7 @@ func (m *WorkflowStatusResponse_TableCopyState) UnmarshalVT(dAtA []byte) error { m.BytesCopied = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61585,7 +63603,7 @@ func (m *WorkflowStatusResponse_TableCopyState) UnmarshalVT(dAtA []byte) error { m.BytesTotal = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61610,12 +63628,12 @@ func (m *WorkflowStatusResponse_TableCopyState) UnmarshalVT(dAtA []byte) error { m.BytesPercentage = float32(math.Float32frombits(v)) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -61638,7 +63656,7 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61666,7 +63684,7 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error m.Id = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61685,7 +63703,7 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61698,11 +63716,11 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61721,7 +63739,7 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61735,11 +63753,11 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61753,7 +63771,7 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61767,11 +63785,11 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61785,7 +63803,7 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61799,11 +63817,11 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61817,7 +63835,7 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61831,11 +63849,11 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61844,12 +63862,12 @@ func (m *WorkflowStatusResponse_ShardStreamState) UnmarshalVT(dAtA []byte) error iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -61872,7 +63890,7 @@ func (m *WorkflowStatusResponse_ShardStreams) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61900,7 +63918,7 @@ func (m *WorkflowStatusResponse_ShardStreams) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61913,11 +63931,11 @@ func (m *WorkflowStatusResponse_ShardStreams) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -61929,12 +63947,12 @@ func (m *WorkflowStatusResponse_ShardStreams) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -61957,7 +63975,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61985,7 +64003,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -61998,11 +64016,11 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62017,7 +64035,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62034,7 +64052,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62048,11 +64066,11 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -62063,7 +64081,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62076,11 +64094,11 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -62092,12 +64110,12 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -62114,7 +64132,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62127,11 +64145,11 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62146,7 +64164,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62163,7 +64181,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62177,11 +64195,11 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -62192,7 +64210,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62205,11 +64223,11 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -62221,12 +64239,12 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -62243,7 +64261,7 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62257,11 +64275,11 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62270,12 +64288,12 @@ func (m *WorkflowStatusResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -62298,7 +64316,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62326,7 +64344,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62340,11 +64358,11 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62358,7 +64376,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62372,11 +64390,11 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62390,7 +64408,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62404,11 +64422,11 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62420,7 +64438,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62437,7 +64455,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62450,11 +64468,11 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62467,7 +64485,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62491,7 +64509,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62504,11 +64522,11 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62527,7 +64545,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62547,7 +64565,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { m.Direction = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62566,7 +64584,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62579,11 +64597,11 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62602,7 +64620,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62622,7 +64640,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62642,7 +64660,7 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62656,25 +64674,45 @@ func (m *WorkflowSwitchTrafficRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Force = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -62697,7 +64735,7 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62725,7 +64763,7 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62739,11 +64777,11 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62757,7 +64795,7 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62771,11 +64809,11 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62789,7 +64827,7 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62803,11 +64841,11 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62821,7 +64859,7 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62835,11 +64873,11 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62848,12 +64886,12 @@ func (m *WorkflowSwitchTrafficResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -62876,7 +64914,7 @@ func (m *WorkflowUpdateRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62904,7 +64942,7 @@ func (m *WorkflowUpdateRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62918,11 +64956,11 @@ func (m *WorkflowUpdateRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62936,7 +64974,7 @@ func (m *WorkflowUpdateRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -62949,11 +64987,11 @@ func (m *WorkflowUpdateRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -62967,12 +65005,12 @@ func (m *WorkflowUpdateRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -62995,7 +65033,7 @@ func (m *WorkflowUpdateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63023,7 +65061,7 @@ func (m *WorkflowUpdateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63036,11 +65074,11 @@ func (m *WorkflowUpdateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63059,7 +65097,7 @@ func (m *WorkflowUpdateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63074,12 +65112,12 @@ func (m *WorkflowUpdateResponse_TabletInfo) UnmarshalVT(dAtA []byte) error { m.Changed = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -63102,7 +65140,7 @@ func (m *WorkflowUpdateResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63130,7 +65168,7 @@ func (m *WorkflowUpdateResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63144,11 +65182,11 @@ func (m *WorkflowUpdateResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63162,7 +65200,7 @@ func (m *WorkflowUpdateResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63175,11 +65213,11 @@ func (m *WorkflowUpdateResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63191,12 +65229,12 @@ func (m *WorkflowUpdateResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -63219,7 +65257,7 @@ func (m *GetMirrorRulesRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63242,12 +65280,12 @@ func (m *GetMirrorRulesRequest) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -63270,7 +65308,7 @@ func (m *GetMirrorRulesResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63298,7 +65336,7 @@ func (m *GetMirrorRulesResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63311,11 +65349,11 @@ func (m *GetMirrorRulesResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63329,12 +65367,12 @@ func (m *GetMirrorRulesResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -63357,7 +65395,7 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63385,7 +65423,7 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63399,11 +65437,11 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63417,7 +65455,7 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63431,11 +65469,11 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63447,7 +65485,7 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63464,7 +65502,7 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { var packedLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63477,11 +65515,11 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { } } if packedLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + packedLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63494,7 +65532,7 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { var v topodata.TabletType for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63524,12 +65562,12 @@ func (m *WorkflowMirrorTrafficRequest) UnmarshalVT(dAtA []byte) error { m.Percent = float32(math.Float32frombits(v)) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -63552,7 +65590,7 @@ func (m *WorkflowMirrorTrafficResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63580,7 +65618,7 @@ func (m *WorkflowMirrorTrafficResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63594,11 +65632,11 @@ func (m *WorkflowMirrorTrafficResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63612,7 +65650,7 @@ func (m *WorkflowMirrorTrafficResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63626,11 +65664,11 @@ func (m *WorkflowMirrorTrafficResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63644,7 +65682,7 @@ func (m *WorkflowMirrorTrafficResponse) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -63658,11 +65696,11 @@ func (m *WorkflowMirrorTrafficResponse) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -63671,12 +65709,12 @@ func (m *WorkflowMirrorTrafficResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -63691,88 +65729,3 @@ func (m *WorkflowMirrorTrafficResponse) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/vtctlservice/vtctlservice.pb.go b/go/vt/proto/vtctlservice/vtctlservice.pb.go index e5ff978e853..a0ff776c393 100644 --- a/go/vt/proto/vtctlservice/vtctlservice.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice.pb.go @@ -51,7 +51,7 @@ var file_vtctlservice_proto_rawDesc = []byte{ 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0xdf, 0x57, 0x0a, 0x06, 0x56, 0x74, 0x63, 0x74, 0x6c, + 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x32, 0xa0, 0x5a, 0x0a, 0x06, 0x56, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x12, 0x4e, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, @@ -110,653 +110,673 @@ var file_vtctlservice_proto_rawDesc = []byte{ 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, - 0x16, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, - 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, - 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1e, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, - 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, - 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, - 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x28, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, - 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x12, 0x23, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, - 0x41, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, - 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, - 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, - 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, - 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, + 0x61, 0x74, 0x61, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, + 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x66, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, + 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x45, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, + 0x70, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, + 0x44, 0x42, 0x41, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, + 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, + 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4c, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, + 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, + 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x72, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, + 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, - 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, - 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, - 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, + 0x6f, 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x6f, + 0x72, 0x63, 0x65, 0x43, 0x75, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, + 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, - 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, + 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x5d, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, + 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, + 0x09, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x45, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1a, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, - 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, + 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x20, 0x2e, 0x76, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, - 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, - 0x0a, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x49, 0x6e, 0x69, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, - 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x4c, 0x61, 0x75, 0x6e, 0x63, - 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, - 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x4c, 0x6f, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x63, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x55, + 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x72, 0x65, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, + 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x47, 0x65, 0x74, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x49, 0x6e, 0x69, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x22, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6e, + 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x4c, 0x61, 0x75, 0x6e, + 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, + 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x55, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x11, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x4d, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, - 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, - 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4d, 0x6f, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, + 0x0a, 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, + 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x4d, + 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, - 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4b, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1c, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, - 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, - 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1c, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, + 0x14, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, - 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, + 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, + 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x24, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, - 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, - 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x65, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x11, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x23, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, 0x0a, - 0x14, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, + 0x65, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x12, + 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, + 0x6c, 0x12, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x65, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x11, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, + 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x69, + 0x0a, 0x14, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x75, 0x6e, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x75, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, - 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, - 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x12, 0x25, 0x2e, + 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x2a, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, + 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x57, 0x72, + 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x12, 0x25, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, - 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x12, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x28, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6f, 0x0a, 0x16, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x28, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6c, 0x65, - 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6c, 0x65, 0x65, - 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x41, 0x64, 0x64, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, - 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, - 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, - 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, + 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6c, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6c, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x41, 0x64, 0x64, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x28, 0x2e, 0x76, + 0x61, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, + 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x28, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, - 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x21, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, + 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, - 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, - 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, - 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, - 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, - 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, - 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, 0x74, 0x65, - 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, - 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x21, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, + 0x73, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, + 0x6f, 0x77, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, + 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, + 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x48, 0x0a, 0x09, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x1b, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, + 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x15, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x12, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x76, 0x69, 0x74, + 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, + 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_vtctlservice_proto_goTypes = []any{ @@ -771,231 +791,237 @@ var file_vtctlservice_proto_goTypes = []any{ (*vtctldata.BackupRequest)(nil), // 8: vtctldata.BackupRequest (*vtctldata.BackupShardRequest)(nil), // 9: vtctldata.BackupShardRequest (*vtctldata.CancelSchemaMigrationRequest)(nil), // 10: vtctldata.CancelSchemaMigrationRequest - (*vtctldata.ChangeTabletTypeRequest)(nil), // 11: vtctldata.ChangeTabletTypeRequest - (*vtctldata.CheckThrottlerRequest)(nil), // 12: vtctldata.CheckThrottlerRequest - (*vtctldata.CleanupSchemaMigrationRequest)(nil), // 13: vtctldata.CleanupSchemaMigrationRequest - (*vtctldata.CompleteSchemaMigrationRequest)(nil), // 14: vtctldata.CompleteSchemaMigrationRequest - (*vtctldata.CreateKeyspaceRequest)(nil), // 15: vtctldata.CreateKeyspaceRequest - (*vtctldata.CreateShardRequest)(nil), // 16: vtctldata.CreateShardRequest - (*vtctldata.DeleteCellInfoRequest)(nil), // 17: vtctldata.DeleteCellInfoRequest - (*vtctldata.DeleteCellsAliasRequest)(nil), // 18: vtctldata.DeleteCellsAliasRequest - (*vtctldata.DeleteKeyspaceRequest)(nil), // 19: vtctldata.DeleteKeyspaceRequest - (*vtctldata.DeleteShardsRequest)(nil), // 20: vtctldata.DeleteShardsRequest - (*vtctldata.DeleteSrvVSchemaRequest)(nil), // 21: vtctldata.DeleteSrvVSchemaRequest - (*vtctldata.DeleteTabletsRequest)(nil), // 22: vtctldata.DeleteTabletsRequest - (*vtctldata.EmergencyReparentShardRequest)(nil), // 23: vtctldata.EmergencyReparentShardRequest - (*vtctldata.ExecuteFetchAsAppRequest)(nil), // 24: vtctldata.ExecuteFetchAsAppRequest - (*vtctldata.ExecuteFetchAsDBARequest)(nil), // 25: vtctldata.ExecuteFetchAsDBARequest - (*vtctldata.ExecuteHookRequest)(nil), // 26: vtctldata.ExecuteHookRequest - (*vtctldata.ExecuteMultiFetchAsDBARequest)(nil), // 27: vtctldata.ExecuteMultiFetchAsDBARequest - (*vtctldata.FindAllShardsInKeyspaceRequest)(nil), // 28: vtctldata.FindAllShardsInKeyspaceRequest - (*vtctldata.ForceCutOverSchemaMigrationRequest)(nil), // 29: vtctldata.ForceCutOverSchemaMigrationRequest - (*vtctldata.GetBackupsRequest)(nil), // 30: vtctldata.GetBackupsRequest - (*vtctldata.GetCellInfoRequest)(nil), // 31: vtctldata.GetCellInfoRequest - (*vtctldata.GetCellInfoNamesRequest)(nil), // 32: vtctldata.GetCellInfoNamesRequest - (*vtctldata.GetCellsAliasesRequest)(nil), // 33: vtctldata.GetCellsAliasesRequest - (*vtctldata.GetFullStatusRequest)(nil), // 34: vtctldata.GetFullStatusRequest - (*vtctldata.GetKeyspaceRequest)(nil), // 35: vtctldata.GetKeyspaceRequest - (*vtctldata.GetKeyspacesRequest)(nil), // 36: vtctldata.GetKeyspacesRequest - (*vtctldata.GetKeyspaceRoutingRulesRequest)(nil), // 37: vtctldata.GetKeyspaceRoutingRulesRequest - (*vtctldata.GetPermissionsRequest)(nil), // 38: vtctldata.GetPermissionsRequest - (*vtctldata.GetRoutingRulesRequest)(nil), // 39: vtctldata.GetRoutingRulesRequest - (*vtctldata.GetSchemaRequest)(nil), // 40: vtctldata.GetSchemaRequest - (*vtctldata.GetSchemaMigrationsRequest)(nil), // 41: vtctldata.GetSchemaMigrationsRequest - (*vtctldata.GetShardReplicationRequest)(nil), // 42: vtctldata.GetShardReplicationRequest - (*vtctldata.GetShardRequest)(nil), // 43: vtctldata.GetShardRequest - (*vtctldata.GetShardRoutingRulesRequest)(nil), // 44: vtctldata.GetShardRoutingRulesRequest - (*vtctldata.GetSrvKeyspaceNamesRequest)(nil), // 45: vtctldata.GetSrvKeyspaceNamesRequest - (*vtctldata.GetSrvKeyspacesRequest)(nil), // 46: vtctldata.GetSrvKeyspacesRequest - (*vtctldata.UpdateThrottlerConfigRequest)(nil), // 47: vtctldata.UpdateThrottlerConfigRequest - (*vtctldata.GetSrvVSchemaRequest)(nil), // 48: vtctldata.GetSrvVSchemaRequest - (*vtctldata.GetSrvVSchemasRequest)(nil), // 49: vtctldata.GetSrvVSchemasRequest - (*vtctldata.GetTabletRequest)(nil), // 50: vtctldata.GetTabletRequest - (*vtctldata.GetTabletsRequest)(nil), // 51: vtctldata.GetTabletsRequest - (*vtctldata.GetThrottlerStatusRequest)(nil), // 52: vtctldata.GetThrottlerStatusRequest - (*vtctldata.GetTopologyPathRequest)(nil), // 53: vtctldata.GetTopologyPathRequest - (*vtctldata.GetVersionRequest)(nil), // 54: vtctldata.GetVersionRequest - (*vtctldata.GetVSchemaRequest)(nil), // 55: vtctldata.GetVSchemaRequest - (*vtctldata.GetWorkflowsRequest)(nil), // 56: vtctldata.GetWorkflowsRequest - (*vtctldata.InitShardPrimaryRequest)(nil), // 57: vtctldata.InitShardPrimaryRequest - (*vtctldata.LaunchSchemaMigrationRequest)(nil), // 58: vtctldata.LaunchSchemaMigrationRequest - (*vtctldata.LookupVindexCreateRequest)(nil), // 59: vtctldata.LookupVindexCreateRequest - (*vtctldata.LookupVindexExternalizeRequest)(nil), // 60: vtctldata.LookupVindexExternalizeRequest - (*vtctldata.MaterializeCreateRequest)(nil), // 61: vtctldata.MaterializeCreateRequest - (*vtctldata.MigrateCreateRequest)(nil), // 62: vtctldata.MigrateCreateRequest - (*vtctldata.MountRegisterRequest)(nil), // 63: vtctldata.MountRegisterRequest - (*vtctldata.MountUnregisterRequest)(nil), // 64: vtctldata.MountUnregisterRequest - (*vtctldata.MountShowRequest)(nil), // 65: vtctldata.MountShowRequest - (*vtctldata.MountListRequest)(nil), // 66: vtctldata.MountListRequest - (*vtctldata.MoveTablesCreateRequest)(nil), // 67: vtctldata.MoveTablesCreateRequest - (*vtctldata.MoveTablesCompleteRequest)(nil), // 68: vtctldata.MoveTablesCompleteRequest - (*vtctldata.PingTabletRequest)(nil), // 69: vtctldata.PingTabletRequest - (*vtctldata.PlannedReparentShardRequest)(nil), // 70: vtctldata.PlannedReparentShardRequest - (*vtctldata.RebuildKeyspaceGraphRequest)(nil), // 71: vtctldata.RebuildKeyspaceGraphRequest - (*vtctldata.RebuildVSchemaGraphRequest)(nil), // 72: vtctldata.RebuildVSchemaGraphRequest - (*vtctldata.RefreshStateRequest)(nil), // 73: vtctldata.RefreshStateRequest - (*vtctldata.RefreshStateByShardRequest)(nil), // 74: vtctldata.RefreshStateByShardRequest - (*vtctldata.ReloadSchemaRequest)(nil), // 75: vtctldata.ReloadSchemaRequest - (*vtctldata.ReloadSchemaKeyspaceRequest)(nil), // 76: vtctldata.ReloadSchemaKeyspaceRequest - (*vtctldata.ReloadSchemaShardRequest)(nil), // 77: vtctldata.ReloadSchemaShardRequest - (*vtctldata.RemoveBackupRequest)(nil), // 78: vtctldata.RemoveBackupRequest - (*vtctldata.RemoveKeyspaceCellRequest)(nil), // 79: vtctldata.RemoveKeyspaceCellRequest - (*vtctldata.RemoveShardCellRequest)(nil), // 80: vtctldata.RemoveShardCellRequest - (*vtctldata.ReparentTabletRequest)(nil), // 81: vtctldata.ReparentTabletRequest - (*vtctldata.ReshardCreateRequest)(nil), // 82: vtctldata.ReshardCreateRequest - (*vtctldata.RestoreFromBackupRequest)(nil), // 83: vtctldata.RestoreFromBackupRequest - (*vtctldata.RetrySchemaMigrationRequest)(nil), // 84: vtctldata.RetrySchemaMigrationRequest - (*vtctldata.RunHealthCheckRequest)(nil), // 85: vtctldata.RunHealthCheckRequest - (*vtctldata.SetKeyspaceDurabilityPolicyRequest)(nil), // 86: vtctldata.SetKeyspaceDurabilityPolicyRequest - (*vtctldata.SetShardIsPrimaryServingRequest)(nil), // 87: vtctldata.SetShardIsPrimaryServingRequest - (*vtctldata.SetShardTabletControlRequest)(nil), // 88: vtctldata.SetShardTabletControlRequest - (*vtctldata.SetWritableRequest)(nil), // 89: vtctldata.SetWritableRequest - (*vtctldata.ShardReplicationAddRequest)(nil), // 90: vtctldata.ShardReplicationAddRequest - (*vtctldata.ShardReplicationFixRequest)(nil), // 91: vtctldata.ShardReplicationFixRequest - (*vtctldata.ShardReplicationPositionsRequest)(nil), // 92: vtctldata.ShardReplicationPositionsRequest - (*vtctldata.ShardReplicationRemoveRequest)(nil), // 93: vtctldata.ShardReplicationRemoveRequest - (*vtctldata.SleepTabletRequest)(nil), // 94: vtctldata.SleepTabletRequest - (*vtctldata.SourceShardAddRequest)(nil), // 95: vtctldata.SourceShardAddRequest - (*vtctldata.SourceShardDeleteRequest)(nil), // 96: vtctldata.SourceShardDeleteRequest - (*vtctldata.StartReplicationRequest)(nil), // 97: vtctldata.StartReplicationRequest - (*vtctldata.StopReplicationRequest)(nil), // 98: vtctldata.StopReplicationRequest - (*vtctldata.TabletExternallyReparentedRequest)(nil), // 99: vtctldata.TabletExternallyReparentedRequest - (*vtctldata.UpdateCellInfoRequest)(nil), // 100: vtctldata.UpdateCellInfoRequest - (*vtctldata.UpdateCellsAliasRequest)(nil), // 101: vtctldata.UpdateCellsAliasRequest - (*vtctldata.ValidateRequest)(nil), // 102: vtctldata.ValidateRequest - (*vtctldata.ValidateKeyspaceRequest)(nil), // 103: vtctldata.ValidateKeyspaceRequest - (*vtctldata.ValidateSchemaKeyspaceRequest)(nil), // 104: vtctldata.ValidateSchemaKeyspaceRequest - (*vtctldata.ValidateShardRequest)(nil), // 105: vtctldata.ValidateShardRequest - (*vtctldata.ValidateVersionKeyspaceRequest)(nil), // 106: vtctldata.ValidateVersionKeyspaceRequest - (*vtctldata.ValidateVersionShardRequest)(nil), // 107: vtctldata.ValidateVersionShardRequest - (*vtctldata.ValidateVSchemaRequest)(nil), // 108: vtctldata.ValidateVSchemaRequest - (*vtctldata.VDiffCreateRequest)(nil), // 109: vtctldata.VDiffCreateRequest - (*vtctldata.VDiffDeleteRequest)(nil), // 110: vtctldata.VDiffDeleteRequest - (*vtctldata.VDiffResumeRequest)(nil), // 111: vtctldata.VDiffResumeRequest - (*vtctldata.VDiffShowRequest)(nil), // 112: vtctldata.VDiffShowRequest - (*vtctldata.VDiffStopRequest)(nil), // 113: vtctldata.VDiffStopRequest - (*vtctldata.WorkflowDeleteRequest)(nil), // 114: vtctldata.WorkflowDeleteRequest - (*vtctldata.WorkflowStatusRequest)(nil), // 115: vtctldata.WorkflowStatusRequest - (*vtctldata.WorkflowSwitchTrafficRequest)(nil), // 116: vtctldata.WorkflowSwitchTrafficRequest - (*vtctldata.WorkflowUpdateRequest)(nil), // 117: vtctldata.WorkflowUpdateRequest - (*vtctldata.GetMirrorRulesRequest)(nil), // 118: vtctldata.GetMirrorRulesRequest - (*vtctldata.WorkflowMirrorTrafficRequest)(nil), // 119: vtctldata.WorkflowMirrorTrafficRequest - (*vtctldata.ExecuteVtctlCommandResponse)(nil), // 120: vtctldata.ExecuteVtctlCommandResponse - (*vtctldata.AddCellInfoResponse)(nil), // 121: vtctldata.AddCellInfoResponse - (*vtctldata.AddCellsAliasResponse)(nil), // 122: vtctldata.AddCellsAliasResponse - (*vtctldata.ApplyRoutingRulesResponse)(nil), // 123: vtctldata.ApplyRoutingRulesResponse - (*vtctldata.ApplySchemaResponse)(nil), // 124: vtctldata.ApplySchemaResponse - (*vtctldata.ApplyKeyspaceRoutingRulesResponse)(nil), // 125: vtctldata.ApplyKeyspaceRoutingRulesResponse - (*vtctldata.ApplyShardRoutingRulesResponse)(nil), // 126: vtctldata.ApplyShardRoutingRulesResponse - (*vtctldata.ApplyVSchemaResponse)(nil), // 127: vtctldata.ApplyVSchemaResponse - (*vtctldata.BackupResponse)(nil), // 128: vtctldata.BackupResponse - (*vtctldata.CancelSchemaMigrationResponse)(nil), // 129: vtctldata.CancelSchemaMigrationResponse - (*vtctldata.ChangeTabletTypeResponse)(nil), // 130: vtctldata.ChangeTabletTypeResponse - (*vtctldata.CheckThrottlerResponse)(nil), // 131: vtctldata.CheckThrottlerResponse - (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 132: vtctldata.CleanupSchemaMigrationResponse - (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 133: vtctldata.CompleteSchemaMigrationResponse - (*vtctldata.CreateKeyspaceResponse)(nil), // 134: vtctldata.CreateKeyspaceResponse - (*vtctldata.CreateShardResponse)(nil), // 135: vtctldata.CreateShardResponse - (*vtctldata.DeleteCellInfoResponse)(nil), // 136: vtctldata.DeleteCellInfoResponse - (*vtctldata.DeleteCellsAliasResponse)(nil), // 137: vtctldata.DeleteCellsAliasResponse - (*vtctldata.DeleteKeyspaceResponse)(nil), // 138: vtctldata.DeleteKeyspaceResponse - (*vtctldata.DeleteShardsResponse)(nil), // 139: vtctldata.DeleteShardsResponse - (*vtctldata.DeleteSrvVSchemaResponse)(nil), // 140: vtctldata.DeleteSrvVSchemaResponse - (*vtctldata.DeleteTabletsResponse)(nil), // 141: vtctldata.DeleteTabletsResponse - (*vtctldata.EmergencyReparentShardResponse)(nil), // 142: vtctldata.EmergencyReparentShardResponse - (*vtctldata.ExecuteFetchAsAppResponse)(nil), // 143: vtctldata.ExecuteFetchAsAppResponse - (*vtctldata.ExecuteFetchAsDBAResponse)(nil), // 144: vtctldata.ExecuteFetchAsDBAResponse - (*vtctldata.ExecuteHookResponse)(nil), // 145: vtctldata.ExecuteHookResponse - (*vtctldata.ExecuteMultiFetchAsDBAResponse)(nil), // 146: vtctldata.ExecuteMultiFetchAsDBAResponse - (*vtctldata.FindAllShardsInKeyspaceResponse)(nil), // 147: vtctldata.FindAllShardsInKeyspaceResponse - (*vtctldata.ForceCutOverSchemaMigrationResponse)(nil), // 148: vtctldata.ForceCutOverSchemaMigrationResponse - (*vtctldata.GetBackupsResponse)(nil), // 149: vtctldata.GetBackupsResponse - (*vtctldata.GetCellInfoResponse)(nil), // 150: vtctldata.GetCellInfoResponse - (*vtctldata.GetCellInfoNamesResponse)(nil), // 151: vtctldata.GetCellInfoNamesResponse - (*vtctldata.GetCellsAliasesResponse)(nil), // 152: vtctldata.GetCellsAliasesResponse - (*vtctldata.GetFullStatusResponse)(nil), // 153: vtctldata.GetFullStatusResponse - (*vtctldata.GetKeyspaceResponse)(nil), // 154: vtctldata.GetKeyspaceResponse - (*vtctldata.GetKeyspacesResponse)(nil), // 155: vtctldata.GetKeyspacesResponse - (*vtctldata.GetKeyspaceRoutingRulesResponse)(nil), // 156: vtctldata.GetKeyspaceRoutingRulesResponse - (*vtctldata.GetPermissionsResponse)(nil), // 157: vtctldata.GetPermissionsResponse - (*vtctldata.GetRoutingRulesResponse)(nil), // 158: vtctldata.GetRoutingRulesResponse - (*vtctldata.GetSchemaResponse)(nil), // 159: vtctldata.GetSchemaResponse - (*vtctldata.GetSchemaMigrationsResponse)(nil), // 160: vtctldata.GetSchemaMigrationsResponse - (*vtctldata.GetShardReplicationResponse)(nil), // 161: vtctldata.GetShardReplicationResponse - (*vtctldata.GetShardResponse)(nil), // 162: vtctldata.GetShardResponse - (*vtctldata.GetShardRoutingRulesResponse)(nil), // 163: vtctldata.GetShardRoutingRulesResponse - (*vtctldata.GetSrvKeyspaceNamesResponse)(nil), // 164: vtctldata.GetSrvKeyspaceNamesResponse - (*vtctldata.GetSrvKeyspacesResponse)(nil), // 165: vtctldata.GetSrvKeyspacesResponse - (*vtctldata.UpdateThrottlerConfigResponse)(nil), // 166: vtctldata.UpdateThrottlerConfigResponse - (*vtctldata.GetSrvVSchemaResponse)(nil), // 167: vtctldata.GetSrvVSchemaResponse - (*vtctldata.GetSrvVSchemasResponse)(nil), // 168: vtctldata.GetSrvVSchemasResponse - (*vtctldata.GetTabletResponse)(nil), // 169: vtctldata.GetTabletResponse - (*vtctldata.GetTabletsResponse)(nil), // 170: vtctldata.GetTabletsResponse - (*vtctldata.GetThrottlerStatusResponse)(nil), // 171: vtctldata.GetThrottlerStatusResponse - (*vtctldata.GetTopologyPathResponse)(nil), // 172: vtctldata.GetTopologyPathResponse - (*vtctldata.GetVersionResponse)(nil), // 173: vtctldata.GetVersionResponse - (*vtctldata.GetVSchemaResponse)(nil), // 174: vtctldata.GetVSchemaResponse - (*vtctldata.GetWorkflowsResponse)(nil), // 175: vtctldata.GetWorkflowsResponse - (*vtctldata.InitShardPrimaryResponse)(nil), // 176: vtctldata.InitShardPrimaryResponse - (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 177: vtctldata.LaunchSchemaMigrationResponse - (*vtctldata.LookupVindexCreateResponse)(nil), // 178: vtctldata.LookupVindexCreateResponse - (*vtctldata.LookupVindexExternalizeResponse)(nil), // 179: vtctldata.LookupVindexExternalizeResponse - (*vtctldata.MaterializeCreateResponse)(nil), // 180: vtctldata.MaterializeCreateResponse - (*vtctldata.WorkflowStatusResponse)(nil), // 181: vtctldata.WorkflowStatusResponse - (*vtctldata.MountRegisterResponse)(nil), // 182: vtctldata.MountRegisterResponse - (*vtctldata.MountUnregisterResponse)(nil), // 183: vtctldata.MountUnregisterResponse - (*vtctldata.MountShowResponse)(nil), // 184: vtctldata.MountShowResponse - (*vtctldata.MountListResponse)(nil), // 185: vtctldata.MountListResponse - (*vtctldata.MoveTablesCompleteResponse)(nil), // 186: vtctldata.MoveTablesCompleteResponse - (*vtctldata.PingTabletResponse)(nil), // 187: vtctldata.PingTabletResponse - (*vtctldata.PlannedReparentShardResponse)(nil), // 188: vtctldata.PlannedReparentShardResponse - (*vtctldata.RebuildKeyspaceGraphResponse)(nil), // 189: vtctldata.RebuildKeyspaceGraphResponse - (*vtctldata.RebuildVSchemaGraphResponse)(nil), // 190: vtctldata.RebuildVSchemaGraphResponse - (*vtctldata.RefreshStateResponse)(nil), // 191: vtctldata.RefreshStateResponse - (*vtctldata.RefreshStateByShardResponse)(nil), // 192: vtctldata.RefreshStateByShardResponse - (*vtctldata.ReloadSchemaResponse)(nil), // 193: vtctldata.ReloadSchemaResponse - (*vtctldata.ReloadSchemaKeyspaceResponse)(nil), // 194: vtctldata.ReloadSchemaKeyspaceResponse - (*vtctldata.ReloadSchemaShardResponse)(nil), // 195: vtctldata.ReloadSchemaShardResponse - (*vtctldata.RemoveBackupResponse)(nil), // 196: vtctldata.RemoveBackupResponse - (*vtctldata.RemoveKeyspaceCellResponse)(nil), // 197: vtctldata.RemoveKeyspaceCellResponse - (*vtctldata.RemoveShardCellResponse)(nil), // 198: vtctldata.RemoveShardCellResponse - (*vtctldata.ReparentTabletResponse)(nil), // 199: vtctldata.ReparentTabletResponse - (*vtctldata.RestoreFromBackupResponse)(nil), // 200: vtctldata.RestoreFromBackupResponse - (*vtctldata.RetrySchemaMigrationResponse)(nil), // 201: vtctldata.RetrySchemaMigrationResponse - (*vtctldata.RunHealthCheckResponse)(nil), // 202: vtctldata.RunHealthCheckResponse - (*vtctldata.SetKeyspaceDurabilityPolicyResponse)(nil), // 203: vtctldata.SetKeyspaceDurabilityPolicyResponse - (*vtctldata.SetShardIsPrimaryServingResponse)(nil), // 204: vtctldata.SetShardIsPrimaryServingResponse - (*vtctldata.SetShardTabletControlResponse)(nil), // 205: vtctldata.SetShardTabletControlResponse - (*vtctldata.SetWritableResponse)(nil), // 206: vtctldata.SetWritableResponse - (*vtctldata.ShardReplicationAddResponse)(nil), // 207: vtctldata.ShardReplicationAddResponse - (*vtctldata.ShardReplicationFixResponse)(nil), // 208: vtctldata.ShardReplicationFixResponse - (*vtctldata.ShardReplicationPositionsResponse)(nil), // 209: vtctldata.ShardReplicationPositionsResponse - (*vtctldata.ShardReplicationRemoveResponse)(nil), // 210: vtctldata.ShardReplicationRemoveResponse - (*vtctldata.SleepTabletResponse)(nil), // 211: vtctldata.SleepTabletResponse - (*vtctldata.SourceShardAddResponse)(nil), // 212: vtctldata.SourceShardAddResponse - (*vtctldata.SourceShardDeleteResponse)(nil), // 213: vtctldata.SourceShardDeleteResponse - (*vtctldata.StartReplicationResponse)(nil), // 214: vtctldata.StartReplicationResponse - (*vtctldata.StopReplicationResponse)(nil), // 215: vtctldata.StopReplicationResponse - (*vtctldata.TabletExternallyReparentedResponse)(nil), // 216: vtctldata.TabletExternallyReparentedResponse - (*vtctldata.UpdateCellInfoResponse)(nil), // 217: vtctldata.UpdateCellInfoResponse - (*vtctldata.UpdateCellsAliasResponse)(nil), // 218: vtctldata.UpdateCellsAliasResponse - (*vtctldata.ValidateResponse)(nil), // 219: vtctldata.ValidateResponse - (*vtctldata.ValidateKeyspaceResponse)(nil), // 220: vtctldata.ValidateKeyspaceResponse - (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 221: vtctldata.ValidateSchemaKeyspaceResponse - (*vtctldata.ValidateShardResponse)(nil), // 222: vtctldata.ValidateShardResponse - (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 223: vtctldata.ValidateVersionKeyspaceResponse - (*vtctldata.ValidateVersionShardResponse)(nil), // 224: vtctldata.ValidateVersionShardResponse - (*vtctldata.ValidateVSchemaResponse)(nil), // 225: vtctldata.ValidateVSchemaResponse - (*vtctldata.VDiffCreateResponse)(nil), // 226: vtctldata.VDiffCreateResponse - (*vtctldata.VDiffDeleteResponse)(nil), // 227: vtctldata.VDiffDeleteResponse - (*vtctldata.VDiffResumeResponse)(nil), // 228: vtctldata.VDiffResumeResponse - (*vtctldata.VDiffShowResponse)(nil), // 229: vtctldata.VDiffShowResponse - (*vtctldata.VDiffStopResponse)(nil), // 230: vtctldata.VDiffStopResponse - (*vtctldata.WorkflowDeleteResponse)(nil), // 231: vtctldata.WorkflowDeleteResponse - (*vtctldata.WorkflowSwitchTrafficResponse)(nil), // 232: vtctldata.WorkflowSwitchTrafficResponse - (*vtctldata.WorkflowUpdateResponse)(nil), // 233: vtctldata.WorkflowUpdateResponse - (*vtctldata.GetMirrorRulesResponse)(nil), // 234: vtctldata.GetMirrorRulesResponse - (*vtctldata.WorkflowMirrorTrafficResponse)(nil), // 235: vtctldata.WorkflowMirrorTrafficResponse + (*vtctldata.ChangeTabletTagsRequest)(nil), // 11: vtctldata.ChangeTabletTagsRequest + (*vtctldata.ChangeTabletTypeRequest)(nil), // 12: vtctldata.ChangeTabletTypeRequest + (*vtctldata.CheckThrottlerRequest)(nil), // 13: vtctldata.CheckThrottlerRequest + (*vtctldata.CleanupSchemaMigrationRequest)(nil), // 14: vtctldata.CleanupSchemaMigrationRequest + (*vtctldata.CompleteSchemaMigrationRequest)(nil), // 15: vtctldata.CompleteSchemaMigrationRequest + (*vtctldata.ConcludeTransactionRequest)(nil), // 16: vtctldata.ConcludeTransactionRequest + (*vtctldata.CreateKeyspaceRequest)(nil), // 17: vtctldata.CreateKeyspaceRequest + (*vtctldata.CreateShardRequest)(nil), // 18: vtctldata.CreateShardRequest + (*vtctldata.DeleteCellInfoRequest)(nil), // 19: vtctldata.DeleteCellInfoRequest + (*vtctldata.DeleteCellsAliasRequest)(nil), // 20: vtctldata.DeleteCellsAliasRequest + (*vtctldata.DeleteKeyspaceRequest)(nil), // 21: vtctldata.DeleteKeyspaceRequest + (*vtctldata.DeleteShardsRequest)(nil), // 22: vtctldata.DeleteShardsRequest + (*vtctldata.DeleteSrvVSchemaRequest)(nil), // 23: vtctldata.DeleteSrvVSchemaRequest + (*vtctldata.DeleteTabletsRequest)(nil), // 24: vtctldata.DeleteTabletsRequest + (*vtctldata.EmergencyReparentShardRequest)(nil), // 25: vtctldata.EmergencyReparentShardRequest + (*vtctldata.ExecuteFetchAsAppRequest)(nil), // 26: vtctldata.ExecuteFetchAsAppRequest + (*vtctldata.ExecuteFetchAsDBARequest)(nil), // 27: vtctldata.ExecuteFetchAsDBARequest + (*vtctldata.ExecuteHookRequest)(nil), // 28: vtctldata.ExecuteHookRequest + (*vtctldata.ExecuteMultiFetchAsDBARequest)(nil), // 29: vtctldata.ExecuteMultiFetchAsDBARequest + (*vtctldata.FindAllShardsInKeyspaceRequest)(nil), // 30: vtctldata.FindAllShardsInKeyspaceRequest + (*vtctldata.ForceCutOverSchemaMigrationRequest)(nil), // 31: vtctldata.ForceCutOverSchemaMigrationRequest + (*vtctldata.GetBackupsRequest)(nil), // 32: vtctldata.GetBackupsRequest + (*vtctldata.GetCellInfoRequest)(nil), // 33: vtctldata.GetCellInfoRequest + (*vtctldata.GetCellInfoNamesRequest)(nil), // 34: vtctldata.GetCellInfoNamesRequest + (*vtctldata.GetCellsAliasesRequest)(nil), // 35: vtctldata.GetCellsAliasesRequest + (*vtctldata.GetFullStatusRequest)(nil), // 36: vtctldata.GetFullStatusRequest + (*vtctldata.GetKeyspaceRequest)(nil), // 37: vtctldata.GetKeyspaceRequest + (*vtctldata.GetKeyspacesRequest)(nil), // 38: vtctldata.GetKeyspacesRequest + (*vtctldata.GetKeyspaceRoutingRulesRequest)(nil), // 39: vtctldata.GetKeyspaceRoutingRulesRequest + (*vtctldata.GetPermissionsRequest)(nil), // 40: vtctldata.GetPermissionsRequest + (*vtctldata.GetRoutingRulesRequest)(nil), // 41: vtctldata.GetRoutingRulesRequest + (*vtctldata.GetSchemaRequest)(nil), // 42: vtctldata.GetSchemaRequest + (*vtctldata.GetSchemaMigrationsRequest)(nil), // 43: vtctldata.GetSchemaMigrationsRequest + (*vtctldata.GetShardReplicationRequest)(nil), // 44: vtctldata.GetShardReplicationRequest + (*vtctldata.GetShardRequest)(nil), // 45: vtctldata.GetShardRequest + (*vtctldata.GetShardRoutingRulesRequest)(nil), // 46: vtctldata.GetShardRoutingRulesRequest + (*vtctldata.GetSrvKeyspaceNamesRequest)(nil), // 47: vtctldata.GetSrvKeyspaceNamesRequest + (*vtctldata.GetSrvKeyspacesRequest)(nil), // 48: vtctldata.GetSrvKeyspacesRequest + (*vtctldata.UpdateThrottlerConfigRequest)(nil), // 49: vtctldata.UpdateThrottlerConfigRequest + (*vtctldata.GetSrvVSchemaRequest)(nil), // 50: vtctldata.GetSrvVSchemaRequest + (*vtctldata.GetSrvVSchemasRequest)(nil), // 51: vtctldata.GetSrvVSchemasRequest + (*vtctldata.GetTabletRequest)(nil), // 52: vtctldata.GetTabletRequest + (*vtctldata.GetTabletsRequest)(nil), // 53: vtctldata.GetTabletsRequest + (*vtctldata.GetThrottlerStatusRequest)(nil), // 54: vtctldata.GetThrottlerStatusRequest + (*vtctldata.GetTopologyPathRequest)(nil), // 55: vtctldata.GetTopologyPathRequest + (*vtctldata.GetUnresolvedTransactionsRequest)(nil), // 56: vtctldata.GetUnresolvedTransactionsRequest + (*vtctldata.GetVersionRequest)(nil), // 57: vtctldata.GetVersionRequest + (*vtctldata.GetVSchemaRequest)(nil), // 58: vtctldata.GetVSchemaRequest + (*vtctldata.GetWorkflowsRequest)(nil), // 59: vtctldata.GetWorkflowsRequest + (*vtctldata.InitShardPrimaryRequest)(nil), // 60: vtctldata.InitShardPrimaryRequest + (*vtctldata.LaunchSchemaMigrationRequest)(nil), // 61: vtctldata.LaunchSchemaMigrationRequest + (*vtctldata.LookupVindexCreateRequest)(nil), // 62: vtctldata.LookupVindexCreateRequest + (*vtctldata.LookupVindexExternalizeRequest)(nil), // 63: vtctldata.LookupVindexExternalizeRequest + (*vtctldata.MaterializeCreateRequest)(nil), // 64: vtctldata.MaterializeCreateRequest + (*vtctldata.MigrateCreateRequest)(nil), // 65: vtctldata.MigrateCreateRequest + (*vtctldata.MountRegisterRequest)(nil), // 66: vtctldata.MountRegisterRequest + (*vtctldata.MountUnregisterRequest)(nil), // 67: vtctldata.MountUnregisterRequest + (*vtctldata.MountShowRequest)(nil), // 68: vtctldata.MountShowRequest + (*vtctldata.MountListRequest)(nil), // 69: vtctldata.MountListRequest + (*vtctldata.MoveTablesCreateRequest)(nil), // 70: vtctldata.MoveTablesCreateRequest + (*vtctldata.MoveTablesCompleteRequest)(nil), // 71: vtctldata.MoveTablesCompleteRequest + (*vtctldata.PingTabletRequest)(nil), // 72: vtctldata.PingTabletRequest + (*vtctldata.PlannedReparentShardRequest)(nil), // 73: vtctldata.PlannedReparentShardRequest + (*vtctldata.RebuildKeyspaceGraphRequest)(nil), // 74: vtctldata.RebuildKeyspaceGraphRequest + (*vtctldata.RebuildVSchemaGraphRequest)(nil), // 75: vtctldata.RebuildVSchemaGraphRequest + (*vtctldata.RefreshStateRequest)(nil), // 76: vtctldata.RefreshStateRequest + (*vtctldata.RefreshStateByShardRequest)(nil), // 77: vtctldata.RefreshStateByShardRequest + (*vtctldata.ReloadSchemaRequest)(nil), // 78: vtctldata.ReloadSchemaRequest + (*vtctldata.ReloadSchemaKeyspaceRequest)(nil), // 79: vtctldata.ReloadSchemaKeyspaceRequest + (*vtctldata.ReloadSchemaShardRequest)(nil), // 80: vtctldata.ReloadSchemaShardRequest + (*vtctldata.RemoveBackupRequest)(nil), // 81: vtctldata.RemoveBackupRequest + (*vtctldata.RemoveKeyspaceCellRequest)(nil), // 82: vtctldata.RemoveKeyspaceCellRequest + (*vtctldata.RemoveShardCellRequest)(nil), // 83: vtctldata.RemoveShardCellRequest + (*vtctldata.ReparentTabletRequest)(nil), // 84: vtctldata.ReparentTabletRequest + (*vtctldata.ReshardCreateRequest)(nil), // 85: vtctldata.ReshardCreateRequest + (*vtctldata.RestoreFromBackupRequest)(nil), // 86: vtctldata.RestoreFromBackupRequest + (*vtctldata.RetrySchemaMigrationRequest)(nil), // 87: vtctldata.RetrySchemaMigrationRequest + (*vtctldata.RunHealthCheckRequest)(nil), // 88: vtctldata.RunHealthCheckRequest + (*vtctldata.SetKeyspaceDurabilityPolicyRequest)(nil), // 89: vtctldata.SetKeyspaceDurabilityPolicyRequest + (*vtctldata.SetShardIsPrimaryServingRequest)(nil), // 90: vtctldata.SetShardIsPrimaryServingRequest + (*vtctldata.SetShardTabletControlRequest)(nil), // 91: vtctldata.SetShardTabletControlRequest + (*vtctldata.SetWritableRequest)(nil), // 92: vtctldata.SetWritableRequest + (*vtctldata.ShardReplicationAddRequest)(nil), // 93: vtctldata.ShardReplicationAddRequest + (*vtctldata.ShardReplicationFixRequest)(nil), // 94: vtctldata.ShardReplicationFixRequest + (*vtctldata.ShardReplicationPositionsRequest)(nil), // 95: vtctldata.ShardReplicationPositionsRequest + (*vtctldata.ShardReplicationRemoveRequest)(nil), // 96: vtctldata.ShardReplicationRemoveRequest + (*vtctldata.SleepTabletRequest)(nil), // 97: vtctldata.SleepTabletRequest + (*vtctldata.SourceShardAddRequest)(nil), // 98: vtctldata.SourceShardAddRequest + (*vtctldata.SourceShardDeleteRequest)(nil), // 99: vtctldata.SourceShardDeleteRequest + (*vtctldata.StartReplicationRequest)(nil), // 100: vtctldata.StartReplicationRequest + (*vtctldata.StopReplicationRequest)(nil), // 101: vtctldata.StopReplicationRequest + (*vtctldata.TabletExternallyReparentedRequest)(nil), // 102: vtctldata.TabletExternallyReparentedRequest + (*vtctldata.UpdateCellInfoRequest)(nil), // 103: vtctldata.UpdateCellInfoRequest + (*vtctldata.UpdateCellsAliasRequest)(nil), // 104: vtctldata.UpdateCellsAliasRequest + (*vtctldata.ValidateRequest)(nil), // 105: vtctldata.ValidateRequest + (*vtctldata.ValidateKeyspaceRequest)(nil), // 106: vtctldata.ValidateKeyspaceRequest + (*vtctldata.ValidateSchemaKeyspaceRequest)(nil), // 107: vtctldata.ValidateSchemaKeyspaceRequest + (*vtctldata.ValidateShardRequest)(nil), // 108: vtctldata.ValidateShardRequest + (*vtctldata.ValidateVersionKeyspaceRequest)(nil), // 109: vtctldata.ValidateVersionKeyspaceRequest + (*vtctldata.ValidateVersionShardRequest)(nil), // 110: vtctldata.ValidateVersionShardRequest + (*vtctldata.ValidateVSchemaRequest)(nil), // 111: vtctldata.ValidateVSchemaRequest + (*vtctldata.VDiffCreateRequest)(nil), // 112: vtctldata.VDiffCreateRequest + (*vtctldata.VDiffDeleteRequest)(nil), // 113: vtctldata.VDiffDeleteRequest + (*vtctldata.VDiffResumeRequest)(nil), // 114: vtctldata.VDiffResumeRequest + (*vtctldata.VDiffShowRequest)(nil), // 115: vtctldata.VDiffShowRequest + (*vtctldata.VDiffStopRequest)(nil), // 116: vtctldata.VDiffStopRequest + (*vtctldata.WorkflowDeleteRequest)(nil), // 117: vtctldata.WorkflowDeleteRequest + (*vtctldata.WorkflowStatusRequest)(nil), // 118: vtctldata.WorkflowStatusRequest + (*vtctldata.WorkflowSwitchTrafficRequest)(nil), // 119: vtctldata.WorkflowSwitchTrafficRequest + (*vtctldata.WorkflowUpdateRequest)(nil), // 120: vtctldata.WorkflowUpdateRequest + (*vtctldata.GetMirrorRulesRequest)(nil), // 121: vtctldata.GetMirrorRulesRequest + (*vtctldata.WorkflowMirrorTrafficRequest)(nil), // 122: vtctldata.WorkflowMirrorTrafficRequest + (*vtctldata.ExecuteVtctlCommandResponse)(nil), // 123: vtctldata.ExecuteVtctlCommandResponse + (*vtctldata.AddCellInfoResponse)(nil), // 124: vtctldata.AddCellInfoResponse + (*vtctldata.AddCellsAliasResponse)(nil), // 125: vtctldata.AddCellsAliasResponse + (*vtctldata.ApplyRoutingRulesResponse)(nil), // 126: vtctldata.ApplyRoutingRulesResponse + (*vtctldata.ApplySchemaResponse)(nil), // 127: vtctldata.ApplySchemaResponse + (*vtctldata.ApplyKeyspaceRoutingRulesResponse)(nil), // 128: vtctldata.ApplyKeyspaceRoutingRulesResponse + (*vtctldata.ApplyShardRoutingRulesResponse)(nil), // 129: vtctldata.ApplyShardRoutingRulesResponse + (*vtctldata.ApplyVSchemaResponse)(nil), // 130: vtctldata.ApplyVSchemaResponse + (*vtctldata.BackupResponse)(nil), // 131: vtctldata.BackupResponse + (*vtctldata.CancelSchemaMigrationResponse)(nil), // 132: vtctldata.CancelSchemaMigrationResponse + (*vtctldata.ChangeTabletTagsResponse)(nil), // 133: vtctldata.ChangeTabletTagsResponse + (*vtctldata.ChangeTabletTypeResponse)(nil), // 134: vtctldata.ChangeTabletTypeResponse + (*vtctldata.CheckThrottlerResponse)(nil), // 135: vtctldata.CheckThrottlerResponse + (*vtctldata.CleanupSchemaMigrationResponse)(nil), // 136: vtctldata.CleanupSchemaMigrationResponse + (*vtctldata.CompleteSchemaMigrationResponse)(nil), // 137: vtctldata.CompleteSchemaMigrationResponse + (*vtctldata.ConcludeTransactionResponse)(nil), // 138: vtctldata.ConcludeTransactionResponse + (*vtctldata.CreateKeyspaceResponse)(nil), // 139: vtctldata.CreateKeyspaceResponse + (*vtctldata.CreateShardResponse)(nil), // 140: vtctldata.CreateShardResponse + (*vtctldata.DeleteCellInfoResponse)(nil), // 141: vtctldata.DeleteCellInfoResponse + (*vtctldata.DeleteCellsAliasResponse)(nil), // 142: vtctldata.DeleteCellsAliasResponse + (*vtctldata.DeleteKeyspaceResponse)(nil), // 143: vtctldata.DeleteKeyspaceResponse + (*vtctldata.DeleteShardsResponse)(nil), // 144: vtctldata.DeleteShardsResponse + (*vtctldata.DeleteSrvVSchemaResponse)(nil), // 145: vtctldata.DeleteSrvVSchemaResponse + (*vtctldata.DeleteTabletsResponse)(nil), // 146: vtctldata.DeleteTabletsResponse + (*vtctldata.EmergencyReparentShardResponse)(nil), // 147: vtctldata.EmergencyReparentShardResponse + (*vtctldata.ExecuteFetchAsAppResponse)(nil), // 148: vtctldata.ExecuteFetchAsAppResponse + (*vtctldata.ExecuteFetchAsDBAResponse)(nil), // 149: vtctldata.ExecuteFetchAsDBAResponse + (*vtctldata.ExecuteHookResponse)(nil), // 150: vtctldata.ExecuteHookResponse + (*vtctldata.ExecuteMultiFetchAsDBAResponse)(nil), // 151: vtctldata.ExecuteMultiFetchAsDBAResponse + (*vtctldata.FindAllShardsInKeyspaceResponse)(nil), // 152: vtctldata.FindAllShardsInKeyspaceResponse + (*vtctldata.ForceCutOverSchemaMigrationResponse)(nil), // 153: vtctldata.ForceCutOverSchemaMigrationResponse + (*vtctldata.GetBackupsResponse)(nil), // 154: vtctldata.GetBackupsResponse + (*vtctldata.GetCellInfoResponse)(nil), // 155: vtctldata.GetCellInfoResponse + (*vtctldata.GetCellInfoNamesResponse)(nil), // 156: vtctldata.GetCellInfoNamesResponse + (*vtctldata.GetCellsAliasesResponse)(nil), // 157: vtctldata.GetCellsAliasesResponse + (*vtctldata.GetFullStatusResponse)(nil), // 158: vtctldata.GetFullStatusResponse + (*vtctldata.GetKeyspaceResponse)(nil), // 159: vtctldata.GetKeyspaceResponse + (*vtctldata.GetKeyspacesResponse)(nil), // 160: vtctldata.GetKeyspacesResponse + (*vtctldata.GetKeyspaceRoutingRulesResponse)(nil), // 161: vtctldata.GetKeyspaceRoutingRulesResponse + (*vtctldata.GetPermissionsResponse)(nil), // 162: vtctldata.GetPermissionsResponse + (*vtctldata.GetRoutingRulesResponse)(nil), // 163: vtctldata.GetRoutingRulesResponse + (*vtctldata.GetSchemaResponse)(nil), // 164: vtctldata.GetSchemaResponse + (*vtctldata.GetSchemaMigrationsResponse)(nil), // 165: vtctldata.GetSchemaMigrationsResponse + (*vtctldata.GetShardReplicationResponse)(nil), // 166: vtctldata.GetShardReplicationResponse + (*vtctldata.GetShardResponse)(nil), // 167: vtctldata.GetShardResponse + (*vtctldata.GetShardRoutingRulesResponse)(nil), // 168: vtctldata.GetShardRoutingRulesResponse + (*vtctldata.GetSrvKeyspaceNamesResponse)(nil), // 169: vtctldata.GetSrvKeyspaceNamesResponse + (*vtctldata.GetSrvKeyspacesResponse)(nil), // 170: vtctldata.GetSrvKeyspacesResponse + (*vtctldata.UpdateThrottlerConfigResponse)(nil), // 171: vtctldata.UpdateThrottlerConfigResponse + (*vtctldata.GetSrvVSchemaResponse)(nil), // 172: vtctldata.GetSrvVSchemaResponse + (*vtctldata.GetSrvVSchemasResponse)(nil), // 173: vtctldata.GetSrvVSchemasResponse + (*vtctldata.GetTabletResponse)(nil), // 174: vtctldata.GetTabletResponse + (*vtctldata.GetTabletsResponse)(nil), // 175: vtctldata.GetTabletsResponse + (*vtctldata.GetThrottlerStatusResponse)(nil), // 176: vtctldata.GetThrottlerStatusResponse + (*vtctldata.GetTopologyPathResponse)(nil), // 177: vtctldata.GetTopologyPathResponse + (*vtctldata.GetUnresolvedTransactionsResponse)(nil), // 178: vtctldata.GetUnresolvedTransactionsResponse + (*vtctldata.GetVersionResponse)(nil), // 179: vtctldata.GetVersionResponse + (*vtctldata.GetVSchemaResponse)(nil), // 180: vtctldata.GetVSchemaResponse + (*vtctldata.GetWorkflowsResponse)(nil), // 181: vtctldata.GetWorkflowsResponse + (*vtctldata.InitShardPrimaryResponse)(nil), // 182: vtctldata.InitShardPrimaryResponse + (*vtctldata.LaunchSchemaMigrationResponse)(nil), // 183: vtctldata.LaunchSchemaMigrationResponse + (*vtctldata.LookupVindexCreateResponse)(nil), // 184: vtctldata.LookupVindexCreateResponse + (*vtctldata.LookupVindexExternalizeResponse)(nil), // 185: vtctldata.LookupVindexExternalizeResponse + (*vtctldata.MaterializeCreateResponse)(nil), // 186: vtctldata.MaterializeCreateResponse + (*vtctldata.WorkflowStatusResponse)(nil), // 187: vtctldata.WorkflowStatusResponse + (*vtctldata.MountRegisterResponse)(nil), // 188: vtctldata.MountRegisterResponse + (*vtctldata.MountUnregisterResponse)(nil), // 189: vtctldata.MountUnregisterResponse + (*vtctldata.MountShowResponse)(nil), // 190: vtctldata.MountShowResponse + (*vtctldata.MountListResponse)(nil), // 191: vtctldata.MountListResponse + (*vtctldata.MoveTablesCompleteResponse)(nil), // 192: vtctldata.MoveTablesCompleteResponse + (*vtctldata.PingTabletResponse)(nil), // 193: vtctldata.PingTabletResponse + (*vtctldata.PlannedReparentShardResponse)(nil), // 194: vtctldata.PlannedReparentShardResponse + (*vtctldata.RebuildKeyspaceGraphResponse)(nil), // 195: vtctldata.RebuildKeyspaceGraphResponse + (*vtctldata.RebuildVSchemaGraphResponse)(nil), // 196: vtctldata.RebuildVSchemaGraphResponse + (*vtctldata.RefreshStateResponse)(nil), // 197: vtctldata.RefreshStateResponse + (*vtctldata.RefreshStateByShardResponse)(nil), // 198: vtctldata.RefreshStateByShardResponse + (*vtctldata.ReloadSchemaResponse)(nil), // 199: vtctldata.ReloadSchemaResponse + (*vtctldata.ReloadSchemaKeyspaceResponse)(nil), // 200: vtctldata.ReloadSchemaKeyspaceResponse + (*vtctldata.ReloadSchemaShardResponse)(nil), // 201: vtctldata.ReloadSchemaShardResponse + (*vtctldata.RemoveBackupResponse)(nil), // 202: vtctldata.RemoveBackupResponse + (*vtctldata.RemoveKeyspaceCellResponse)(nil), // 203: vtctldata.RemoveKeyspaceCellResponse + (*vtctldata.RemoveShardCellResponse)(nil), // 204: vtctldata.RemoveShardCellResponse + (*vtctldata.ReparentTabletResponse)(nil), // 205: vtctldata.ReparentTabletResponse + (*vtctldata.RestoreFromBackupResponse)(nil), // 206: vtctldata.RestoreFromBackupResponse + (*vtctldata.RetrySchemaMigrationResponse)(nil), // 207: vtctldata.RetrySchemaMigrationResponse + (*vtctldata.RunHealthCheckResponse)(nil), // 208: vtctldata.RunHealthCheckResponse + (*vtctldata.SetKeyspaceDurabilityPolicyResponse)(nil), // 209: vtctldata.SetKeyspaceDurabilityPolicyResponse + (*vtctldata.SetShardIsPrimaryServingResponse)(nil), // 210: vtctldata.SetShardIsPrimaryServingResponse + (*vtctldata.SetShardTabletControlResponse)(nil), // 211: vtctldata.SetShardTabletControlResponse + (*vtctldata.SetWritableResponse)(nil), // 212: vtctldata.SetWritableResponse + (*vtctldata.ShardReplicationAddResponse)(nil), // 213: vtctldata.ShardReplicationAddResponse + (*vtctldata.ShardReplicationFixResponse)(nil), // 214: vtctldata.ShardReplicationFixResponse + (*vtctldata.ShardReplicationPositionsResponse)(nil), // 215: vtctldata.ShardReplicationPositionsResponse + (*vtctldata.ShardReplicationRemoveResponse)(nil), // 216: vtctldata.ShardReplicationRemoveResponse + (*vtctldata.SleepTabletResponse)(nil), // 217: vtctldata.SleepTabletResponse + (*vtctldata.SourceShardAddResponse)(nil), // 218: vtctldata.SourceShardAddResponse + (*vtctldata.SourceShardDeleteResponse)(nil), // 219: vtctldata.SourceShardDeleteResponse + (*vtctldata.StartReplicationResponse)(nil), // 220: vtctldata.StartReplicationResponse + (*vtctldata.StopReplicationResponse)(nil), // 221: vtctldata.StopReplicationResponse + (*vtctldata.TabletExternallyReparentedResponse)(nil), // 222: vtctldata.TabletExternallyReparentedResponse + (*vtctldata.UpdateCellInfoResponse)(nil), // 223: vtctldata.UpdateCellInfoResponse + (*vtctldata.UpdateCellsAliasResponse)(nil), // 224: vtctldata.UpdateCellsAliasResponse + (*vtctldata.ValidateResponse)(nil), // 225: vtctldata.ValidateResponse + (*vtctldata.ValidateKeyspaceResponse)(nil), // 226: vtctldata.ValidateKeyspaceResponse + (*vtctldata.ValidateSchemaKeyspaceResponse)(nil), // 227: vtctldata.ValidateSchemaKeyspaceResponse + (*vtctldata.ValidateShardResponse)(nil), // 228: vtctldata.ValidateShardResponse + (*vtctldata.ValidateVersionKeyspaceResponse)(nil), // 229: vtctldata.ValidateVersionKeyspaceResponse + (*vtctldata.ValidateVersionShardResponse)(nil), // 230: vtctldata.ValidateVersionShardResponse + (*vtctldata.ValidateVSchemaResponse)(nil), // 231: vtctldata.ValidateVSchemaResponse + (*vtctldata.VDiffCreateResponse)(nil), // 232: vtctldata.VDiffCreateResponse + (*vtctldata.VDiffDeleteResponse)(nil), // 233: vtctldata.VDiffDeleteResponse + (*vtctldata.VDiffResumeResponse)(nil), // 234: vtctldata.VDiffResumeResponse + (*vtctldata.VDiffShowResponse)(nil), // 235: vtctldata.VDiffShowResponse + (*vtctldata.VDiffStopResponse)(nil), // 236: vtctldata.VDiffStopResponse + (*vtctldata.WorkflowDeleteResponse)(nil), // 237: vtctldata.WorkflowDeleteResponse + (*vtctldata.WorkflowSwitchTrafficResponse)(nil), // 238: vtctldata.WorkflowSwitchTrafficResponse + (*vtctldata.WorkflowUpdateResponse)(nil), // 239: vtctldata.WorkflowUpdateResponse + (*vtctldata.GetMirrorRulesResponse)(nil), // 240: vtctldata.GetMirrorRulesResponse + (*vtctldata.WorkflowMirrorTrafficResponse)(nil), // 241: vtctldata.WorkflowMirrorTrafficResponse } var file_vtctlservice_proto_depIdxs = []int32{ 0, // 0: vtctlservice.Vtctl.ExecuteVtctlCommand:input_type -> vtctldata.ExecuteVtctlCommandRequest @@ -1009,237 +1035,243 @@ var file_vtctlservice_proto_depIdxs = []int32{ 8, // 8: vtctlservice.Vtctld.Backup:input_type -> vtctldata.BackupRequest 9, // 9: vtctlservice.Vtctld.BackupShard:input_type -> vtctldata.BackupShardRequest 10, // 10: vtctlservice.Vtctld.CancelSchemaMigration:input_type -> vtctldata.CancelSchemaMigrationRequest - 11, // 11: vtctlservice.Vtctld.ChangeTabletType:input_type -> vtctldata.ChangeTabletTypeRequest - 12, // 12: vtctlservice.Vtctld.CheckThrottler:input_type -> vtctldata.CheckThrottlerRequest - 13, // 13: vtctlservice.Vtctld.CleanupSchemaMigration:input_type -> vtctldata.CleanupSchemaMigrationRequest - 14, // 14: vtctlservice.Vtctld.CompleteSchemaMigration:input_type -> vtctldata.CompleteSchemaMigrationRequest - 15, // 15: vtctlservice.Vtctld.CreateKeyspace:input_type -> vtctldata.CreateKeyspaceRequest - 16, // 16: vtctlservice.Vtctld.CreateShard:input_type -> vtctldata.CreateShardRequest - 17, // 17: vtctlservice.Vtctld.DeleteCellInfo:input_type -> vtctldata.DeleteCellInfoRequest - 18, // 18: vtctlservice.Vtctld.DeleteCellsAlias:input_type -> vtctldata.DeleteCellsAliasRequest - 19, // 19: vtctlservice.Vtctld.DeleteKeyspace:input_type -> vtctldata.DeleteKeyspaceRequest - 20, // 20: vtctlservice.Vtctld.DeleteShards:input_type -> vtctldata.DeleteShardsRequest - 21, // 21: vtctlservice.Vtctld.DeleteSrvVSchema:input_type -> vtctldata.DeleteSrvVSchemaRequest - 22, // 22: vtctlservice.Vtctld.DeleteTablets:input_type -> vtctldata.DeleteTabletsRequest - 23, // 23: vtctlservice.Vtctld.EmergencyReparentShard:input_type -> vtctldata.EmergencyReparentShardRequest - 24, // 24: vtctlservice.Vtctld.ExecuteFetchAsApp:input_type -> vtctldata.ExecuteFetchAsAppRequest - 25, // 25: vtctlservice.Vtctld.ExecuteFetchAsDBA:input_type -> vtctldata.ExecuteFetchAsDBARequest - 26, // 26: vtctlservice.Vtctld.ExecuteHook:input_type -> vtctldata.ExecuteHookRequest - 27, // 27: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:input_type -> vtctldata.ExecuteMultiFetchAsDBARequest - 28, // 28: vtctlservice.Vtctld.FindAllShardsInKeyspace:input_type -> vtctldata.FindAllShardsInKeyspaceRequest - 29, // 29: vtctlservice.Vtctld.ForceCutOverSchemaMigration:input_type -> vtctldata.ForceCutOverSchemaMigrationRequest - 30, // 30: vtctlservice.Vtctld.GetBackups:input_type -> vtctldata.GetBackupsRequest - 31, // 31: vtctlservice.Vtctld.GetCellInfo:input_type -> vtctldata.GetCellInfoRequest - 32, // 32: vtctlservice.Vtctld.GetCellInfoNames:input_type -> vtctldata.GetCellInfoNamesRequest - 33, // 33: vtctlservice.Vtctld.GetCellsAliases:input_type -> vtctldata.GetCellsAliasesRequest - 34, // 34: vtctlservice.Vtctld.GetFullStatus:input_type -> vtctldata.GetFullStatusRequest - 35, // 35: vtctlservice.Vtctld.GetKeyspace:input_type -> vtctldata.GetKeyspaceRequest - 36, // 36: vtctlservice.Vtctld.GetKeyspaces:input_type -> vtctldata.GetKeyspacesRequest - 37, // 37: vtctlservice.Vtctld.GetKeyspaceRoutingRules:input_type -> vtctldata.GetKeyspaceRoutingRulesRequest - 38, // 38: vtctlservice.Vtctld.GetPermissions:input_type -> vtctldata.GetPermissionsRequest - 39, // 39: vtctlservice.Vtctld.GetRoutingRules:input_type -> vtctldata.GetRoutingRulesRequest - 40, // 40: vtctlservice.Vtctld.GetSchema:input_type -> vtctldata.GetSchemaRequest - 41, // 41: vtctlservice.Vtctld.GetSchemaMigrations:input_type -> vtctldata.GetSchemaMigrationsRequest - 42, // 42: vtctlservice.Vtctld.GetShardReplication:input_type -> vtctldata.GetShardReplicationRequest - 43, // 43: vtctlservice.Vtctld.GetShard:input_type -> vtctldata.GetShardRequest - 44, // 44: vtctlservice.Vtctld.GetShardRoutingRules:input_type -> vtctldata.GetShardRoutingRulesRequest - 45, // 45: vtctlservice.Vtctld.GetSrvKeyspaceNames:input_type -> vtctldata.GetSrvKeyspaceNamesRequest - 46, // 46: vtctlservice.Vtctld.GetSrvKeyspaces:input_type -> vtctldata.GetSrvKeyspacesRequest - 47, // 47: vtctlservice.Vtctld.UpdateThrottlerConfig:input_type -> vtctldata.UpdateThrottlerConfigRequest - 48, // 48: vtctlservice.Vtctld.GetSrvVSchema:input_type -> vtctldata.GetSrvVSchemaRequest - 49, // 49: vtctlservice.Vtctld.GetSrvVSchemas:input_type -> vtctldata.GetSrvVSchemasRequest - 50, // 50: vtctlservice.Vtctld.GetTablet:input_type -> vtctldata.GetTabletRequest - 51, // 51: vtctlservice.Vtctld.GetTablets:input_type -> vtctldata.GetTabletsRequest - 52, // 52: vtctlservice.Vtctld.GetThrottlerStatus:input_type -> vtctldata.GetThrottlerStatusRequest - 53, // 53: vtctlservice.Vtctld.GetTopologyPath:input_type -> vtctldata.GetTopologyPathRequest - 54, // 54: vtctlservice.Vtctld.GetVersion:input_type -> vtctldata.GetVersionRequest - 55, // 55: vtctlservice.Vtctld.GetVSchema:input_type -> vtctldata.GetVSchemaRequest - 56, // 56: vtctlservice.Vtctld.GetWorkflows:input_type -> vtctldata.GetWorkflowsRequest - 57, // 57: vtctlservice.Vtctld.InitShardPrimary:input_type -> vtctldata.InitShardPrimaryRequest - 58, // 58: vtctlservice.Vtctld.LaunchSchemaMigration:input_type -> vtctldata.LaunchSchemaMigrationRequest - 59, // 59: vtctlservice.Vtctld.LookupVindexCreate:input_type -> vtctldata.LookupVindexCreateRequest - 60, // 60: vtctlservice.Vtctld.LookupVindexExternalize:input_type -> vtctldata.LookupVindexExternalizeRequest - 61, // 61: vtctlservice.Vtctld.MaterializeCreate:input_type -> vtctldata.MaterializeCreateRequest - 62, // 62: vtctlservice.Vtctld.MigrateCreate:input_type -> vtctldata.MigrateCreateRequest - 63, // 63: vtctlservice.Vtctld.MountRegister:input_type -> vtctldata.MountRegisterRequest - 64, // 64: vtctlservice.Vtctld.MountUnregister:input_type -> vtctldata.MountUnregisterRequest - 65, // 65: vtctlservice.Vtctld.MountShow:input_type -> vtctldata.MountShowRequest - 66, // 66: vtctlservice.Vtctld.MountList:input_type -> vtctldata.MountListRequest - 67, // 67: vtctlservice.Vtctld.MoveTablesCreate:input_type -> vtctldata.MoveTablesCreateRequest - 68, // 68: vtctlservice.Vtctld.MoveTablesComplete:input_type -> vtctldata.MoveTablesCompleteRequest - 69, // 69: vtctlservice.Vtctld.PingTablet:input_type -> vtctldata.PingTabletRequest - 70, // 70: vtctlservice.Vtctld.PlannedReparentShard:input_type -> vtctldata.PlannedReparentShardRequest - 71, // 71: vtctlservice.Vtctld.RebuildKeyspaceGraph:input_type -> vtctldata.RebuildKeyspaceGraphRequest - 72, // 72: vtctlservice.Vtctld.RebuildVSchemaGraph:input_type -> vtctldata.RebuildVSchemaGraphRequest - 73, // 73: vtctlservice.Vtctld.RefreshState:input_type -> vtctldata.RefreshStateRequest - 74, // 74: vtctlservice.Vtctld.RefreshStateByShard:input_type -> vtctldata.RefreshStateByShardRequest - 75, // 75: vtctlservice.Vtctld.ReloadSchema:input_type -> vtctldata.ReloadSchemaRequest - 76, // 76: vtctlservice.Vtctld.ReloadSchemaKeyspace:input_type -> vtctldata.ReloadSchemaKeyspaceRequest - 77, // 77: vtctlservice.Vtctld.ReloadSchemaShard:input_type -> vtctldata.ReloadSchemaShardRequest - 78, // 78: vtctlservice.Vtctld.RemoveBackup:input_type -> vtctldata.RemoveBackupRequest - 79, // 79: vtctlservice.Vtctld.RemoveKeyspaceCell:input_type -> vtctldata.RemoveKeyspaceCellRequest - 80, // 80: vtctlservice.Vtctld.RemoveShardCell:input_type -> vtctldata.RemoveShardCellRequest - 81, // 81: vtctlservice.Vtctld.ReparentTablet:input_type -> vtctldata.ReparentTabletRequest - 82, // 82: vtctlservice.Vtctld.ReshardCreate:input_type -> vtctldata.ReshardCreateRequest - 83, // 83: vtctlservice.Vtctld.RestoreFromBackup:input_type -> vtctldata.RestoreFromBackupRequest - 84, // 84: vtctlservice.Vtctld.RetrySchemaMigration:input_type -> vtctldata.RetrySchemaMigrationRequest - 85, // 85: vtctlservice.Vtctld.RunHealthCheck:input_type -> vtctldata.RunHealthCheckRequest - 86, // 86: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:input_type -> vtctldata.SetKeyspaceDurabilityPolicyRequest - 87, // 87: vtctlservice.Vtctld.SetShardIsPrimaryServing:input_type -> vtctldata.SetShardIsPrimaryServingRequest - 88, // 88: vtctlservice.Vtctld.SetShardTabletControl:input_type -> vtctldata.SetShardTabletControlRequest - 89, // 89: vtctlservice.Vtctld.SetWritable:input_type -> vtctldata.SetWritableRequest - 90, // 90: vtctlservice.Vtctld.ShardReplicationAdd:input_type -> vtctldata.ShardReplicationAddRequest - 91, // 91: vtctlservice.Vtctld.ShardReplicationFix:input_type -> vtctldata.ShardReplicationFixRequest - 92, // 92: vtctlservice.Vtctld.ShardReplicationPositions:input_type -> vtctldata.ShardReplicationPositionsRequest - 93, // 93: vtctlservice.Vtctld.ShardReplicationRemove:input_type -> vtctldata.ShardReplicationRemoveRequest - 94, // 94: vtctlservice.Vtctld.SleepTablet:input_type -> vtctldata.SleepTabletRequest - 95, // 95: vtctlservice.Vtctld.SourceShardAdd:input_type -> vtctldata.SourceShardAddRequest - 96, // 96: vtctlservice.Vtctld.SourceShardDelete:input_type -> vtctldata.SourceShardDeleteRequest - 97, // 97: vtctlservice.Vtctld.StartReplication:input_type -> vtctldata.StartReplicationRequest - 98, // 98: vtctlservice.Vtctld.StopReplication:input_type -> vtctldata.StopReplicationRequest - 99, // 99: vtctlservice.Vtctld.TabletExternallyReparented:input_type -> vtctldata.TabletExternallyReparentedRequest - 100, // 100: vtctlservice.Vtctld.UpdateCellInfo:input_type -> vtctldata.UpdateCellInfoRequest - 101, // 101: vtctlservice.Vtctld.UpdateCellsAlias:input_type -> vtctldata.UpdateCellsAliasRequest - 102, // 102: vtctlservice.Vtctld.Validate:input_type -> vtctldata.ValidateRequest - 103, // 103: vtctlservice.Vtctld.ValidateKeyspace:input_type -> vtctldata.ValidateKeyspaceRequest - 104, // 104: vtctlservice.Vtctld.ValidateSchemaKeyspace:input_type -> vtctldata.ValidateSchemaKeyspaceRequest - 105, // 105: vtctlservice.Vtctld.ValidateShard:input_type -> vtctldata.ValidateShardRequest - 106, // 106: vtctlservice.Vtctld.ValidateVersionKeyspace:input_type -> vtctldata.ValidateVersionKeyspaceRequest - 107, // 107: vtctlservice.Vtctld.ValidateVersionShard:input_type -> vtctldata.ValidateVersionShardRequest - 108, // 108: vtctlservice.Vtctld.ValidateVSchema:input_type -> vtctldata.ValidateVSchemaRequest - 109, // 109: vtctlservice.Vtctld.VDiffCreate:input_type -> vtctldata.VDiffCreateRequest - 110, // 110: vtctlservice.Vtctld.VDiffDelete:input_type -> vtctldata.VDiffDeleteRequest - 111, // 111: vtctlservice.Vtctld.VDiffResume:input_type -> vtctldata.VDiffResumeRequest - 112, // 112: vtctlservice.Vtctld.VDiffShow:input_type -> vtctldata.VDiffShowRequest - 113, // 113: vtctlservice.Vtctld.VDiffStop:input_type -> vtctldata.VDiffStopRequest - 114, // 114: vtctlservice.Vtctld.WorkflowDelete:input_type -> vtctldata.WorkflowDeleteRequest - 115, // 115: vtctlservice.Vtctld.WorkflowStatus:input_type -> vtctldata.WorkflowStatusRequest - 116, // 116: vtctlservice.Vtctld.WorkflowSwitchTraffic:input_type -> vtctldata.WorkflowSwitchTrafficRequest - 117, // 117: vtctlservice.Vtctld.WorkflowUpdate:input_type -> vtctldata.WorkflowUpdateRequest - 118, // 118: vtctlservice.Vtctld.GetMirrorRules:input_type -> vtctldata.GetMirrorRulesRequest - 119, // 119: vtctlservice.Vtctld.WorkflowMirrorTraffic:input_type -> vtctldata.WorkflowMirrorTrafficRequest - 120, // 120: vtctlservice.Vtctl.ExecuteVtctlCommand:output_type -> vtctldata.ExecuteVtctlCommandResponse - 121, // 121: vtctlservice.Vtctld.AddCellInfo:output_type -> vtctldata.AddCellInfoResponse - 122, // 122: vtctlservice.Vtctld.AddCellsAlias:output_type -> vtctldata.AddCellsAliasResponse - 123, // 123: vtctlservice.Vtctld.ApplyRoutingRules:output_type -> vtctldata.ApplyRoutingRulesResponse - 124, // 124: vtctlservice.Vtctld.ApplySchema:output_type -> vtctldata.ApplySchemaResponse - 125, // 125: vtctlservice.Vtctld.ApplyKeyspaceRoutingRules:output_type -> vtctldata.ApplyKeyspaceRoutingRulesResponse - 126, // 126: vtctlservice.Vtctld.ApplyShardRoutingRules:output_type -> vtctldata.ApplyShardRoutingRulesResponse - 127, // 127: vtctlservice.Vtctld.ApplyVSchema:output_type -> vtctldata.ApplyVSchemaResponse - 128, // 128: vtctlservice.Vtctld.Backup:output_type -> vtctldata.BackupResponse - 128, // 129: vtctlservice.Vtctld.BackupShard:output_type -> vtctldata.BackupResponse - 129, // 130: vtctlservice.Vtctld.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse - 130, // 131: vtctlservice.Vtctld.ChangeTabletType:output_type -> vtctldata.ChangeTabletTypeResponse - 131, // 132: vtctlservice.Vtctld.CheckThrottler:output_type -> vtctldata.CheckThrottlerResponse - 132, // 133: vtctlservice.Vtctld.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse - 133, // 134: vtctlservice.Vtctld.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse - 134, // 135: vtctlservice.Vtctld.CreateKeyspace:output_type -> vtctldata.CreateKeyspaceResponse - 135, // 136: vtctlservice.Vtctld.CreateShard:output_type -> vtctldata.CreateShardResponse - 136, // 137: vtctlservice.Vtctld.DeleteCellInfo:output_type -> vtctldata.DeleteCellInfoResponse - 137, // 138: vtctlservice.Vtctld.DeleteCellsAlias:output_type -> vtctldata.DeleteCellsAliasResponse - 138, // 139: vtctlservice.Vtctld.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse - 139, // 140: vtctlservice.Vtctld.DeleteShards:output_type -> vtctldata.DeleteShardsResponse - 140, // 141: vtctlservice.Vtctld.DeleteSrvVSchema:output_type -> vtctldata.DeleteSrvVSchemaResponse - 141, // 142: vtctlservice.Vtctld.DeleteTablets:output_type -> vtctldata.DeleteTabletsResponse - 142, // 143: vtctlservice.Vtctld.EmergencyReparentShard:output_type -> vtctldata.EmergencyReparentShardResponse - 143, // 144: vtctlservice.Vtctld.ExecuteFetchAsApp:output_type -> vtctldata.ExecuteFetchAsAppResponse - 144, // 145: vtctlservice.Vtctld.ExecuteFetchAsDBA:output_type -> vtctldata.ExecuteFetchAsDBAResponse - 145, // 146: vtctlservice.Vtctld.ExecuteHook:output_type -> vtctldata.ExecuteHookResponse - 146, // 147: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:output_type -> vtctldata.ExecuteMultiFetchAsDBAResponse - 147, // 148: vtctlservice.Vtctld.FindAllShardsInKeyspace:output_type -> vtctldata.FindAllShardsInKeyspaceResponse - 148, // 149: vtctlservice.Vtctld.ForceCutOverSchemaMigration:output_type -> vtctldata.ForceCutOverSchemaMigrationResponse - 149, // 150: vtctlservice.Vtctld.GetBackups:output_type -> vtctldata.GetBackupsResponse - 150, // 151: vtctlservice.Vtctld.GetCellInfo:output_type -> vtctldata.GetCellInfoResponse - 151, // 152: vtctlservice.Vtctld.GetCellInfoNames:output_type -> vtctldata.GetCellInfoNamesResponse - 152, // 153: vtctlservice.Vtctld.GetCellsAliases:output_type -> vtctldata.GetCellsAliasesResponse - 153, // 154: vtctlservice.Vtctld.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse - 154, // 155: vtctlservice.Vtctld.GetKeyspace:output_type -> vtctldata.GetKeyspaceResponse - 155, // 156: vtctlservice.Vtctld.GetKeyspaces:output_type -> vtctldata.GetKeyspacesResponse - 156, // 157: vtctlservice.Vtctld.GetKeyspaceRoutingRules:output_type -> vtctldata.GetKeyspaceRoutingRulesResponse - 157, // 158: vtctlservice.Vtctld.GetPermissions:output_type -> vtctldata.GetPermissionsResponse - 158, // 159: vtctlservice.Vtctld.GetRoutingRules:output_type -> vtctldata.GetRoutingRulesResponse - 159, // 160: vtctlservice.Vtctld.GetSchema:output_type -> vtctldata.GetSchemaResponse - 160, // 161: vtctlservice.Vtctld.GetSchemaMigrations:output_type -> vtctldata.GetSchemaMigrationsResponse - 161, // 162: vtctlservice.Vtctld.GetShardReplication:output_type -> vtctldata.GetShardReplicationResponse - 162, // 163: vtctlservice.Vtctld.GetShard:output_type -> vtctldata.GetShardResponse - 163, // 164: vtctlservice.Vtctld.GetShardRoutingRules:output_type -> vtctldata.GetShardRoutingRulesResponse - 164, // 165: vtctlservice.Vtctld.GetSrvKeyspaceNames:output_type -> vtctldata.GetSrvKeyspaceNamesResponse - 165, // 166: vtctlservice.Vtctld.GetSrvKeyspaces:output_type -> vtctldata.GetSrvKeyspacesResponse - 166, // 167: vtctlservice.Vtctld.UpdateThrottlerConfig:output_type -> vtctldata.UpdateThrottlerConfigResponse - 167, // 168: vtctlservice.Vtctld.GetSrvVSchema:output_type -> vtctldata.GetSrvVSchemaResponse - 168, // 169: vtctlservice.Vtctld.GetSrvVSchemas:output_type -> vtctldata.GetSrvVSchemasResponse - 169, // 170: vtctlservice.Vtctld.GetTablet:output_type -> vtctldata.GetTabletResponse - 170, // 171: vtctlservice.Vtctld.GetTablets:output_type -> vtctldata.GetTabletsResponse - 171, // 172: vtctlservice.Vtctld.GetThrottlerStatus:output_type -> vtctldata.GetThrottlerStatusResponse - 172, // 173: vtctlservice.Vtctld.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse - 173, // 174: vtctlservice.Vtctld.GetVersion:output_type -> vtctldata.GetVersionResponse - 174, // 175: vtctlservice.Vtctld.GetVSchema:output_type -> vtctldata.GetVSchemaResponse - 175, // 176: vtctlservice.Vtctld.GetWorkflows:output_type -> vtctldata.GetWorkflowsResponse - 176, // 177: vtctlservice.Vtctld.InitShardPrimary:output_type -> vtctldata.InitShardPrimaryResponse - 177, // 178: vtctlservice.Vtctld.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse - 178, // 179: vtctlservice.Vtctld.LookupVindexCreate:output_type -> vtctldata.LookupVindexCreateResponse - 179, // 180: vtctlservice.Vtctld.LookupVindexExternalize:output_type -> vtctldata.LookupVindexExternalizeResponse - 180, // 181: vtctlservice.Vtctld.MaterializeCreate:output_type -> vtctldata.MaterializeCreateResponse - 181, // 182: vtctlservice.Vtctld.MigrateCreate:output_type -> vtctldata.WorkflowStatusResponse - 182, // 183: vtctlservice.Vtctld.MountRegister:output_type -> vtctldata.MountRegisterResponse - 183, // 184: vtctlservice.Vtctld.MountUnregister:output_type -> vtctldata.MountUnregisterResponse - 184, // 185: vtctlservice.Vtctld.MountShow:output_type -> vtctldata.MountShowResponse - 185, // 186: vtctlservice.Vtctld.MountList:output_type -> vtctldata.MountListResponse - 181, // 187: vtctlservice.Vtctld.MoveTablesCreate:output_type -> vtctldata.WorkflowStatusResponse - 186, // 188: vtctlservice.Vtctld.MoveTablesComplete:output_type -> vtctldata.MoveTablesCompleteResponse - 187, // 189: vtctlservice.Vtctld.PingTablet:output_type -> vtctldata.PingTabletResponse - 188, // 190: vtctlservice.Vtctld.PlannedReparentShard:output_type -> vtctldata.PlannedReparentShardResponse - 189, // 191: vtctlservice.Vtctld.RebuildKeyspaceGraph:output_type -> vtctldata.RebuildKeyspaceGraphResponse - 190, // 192: vtctlservice.Vtctld.RebuildVSchemaGraph:output_type -> vtctldata.RebuildVSchemaGraphResponse - 191, // 193: vtctlservice.Vtctld.RefreshState:output_type -> vtctldata.RefreshStateResponse - 192, // 194: vtctlservice.Vtctld.RefreshStateByShard:output_type -> vtctldata.RefreshStateByShardResponse - 193, // 195: vtctlservice.Vtctld.ReloadSchema:output_type -> vtctldata.ReloadSchemaResponse - 194, // 196: vtctlservice.Vtctld.ReloadSchemaKeyspace:output_type -> vtctldata.ReloadSchemaKeyspaceResponse - 195, // 197: vtctlservice.Vtctld.ReloadSchemaShard:output_type -> vtctldata.ReloadSchemaShardResponse - 196, // 198: vtctlservice.Vtctld.RemoveBackup:output_type -> vtctldata.RemoveBackupResponse - 197, // 199: vtctlservice.Vtctld.RemoveKeyspaceCell:output_type -> vtctldata.RemoveKeyspaceCellResponse - 198, // 200: vtctlservice.Vtctld.RemoveShardCell:output_type -> vtctldata.RemoveShardCellResponse - 199, // 201: vtctlservice.Vtctld.ReparentTablet:output_type -> vtctldata.ReparentTabletResponse - 181, // 202: vtctlservice.Vtctld.ReshardCreate:output_type -> vtctldata.WorkflowStatusResponse - 200, // 203: vtctlservice.Vtctld.RestoreFromBackup:output_type -> vtctldata.RestoreFromBackupResponse - 201, // 204: vtctlservice.Vtctld.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse - 202, // 205: vtctlservice.Vtctld.RunHealthCheck:output_type -> vtctldata.RunHealthCheckResponse - 203, // 206: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:output_type -> vtctldata.SetKeyspaceDurabilityPolicyResponse - 204, // 207: vtctlservice.Vtctld.SetShardIsPrimaryServing:output_type -> vtctldata.SetShardIsPrimaryServingResponse - 205, // 208: vtctlservice.Vtctld.SetShardTabletControl:output_type -> vtctldata.SetShardTabletControlResponse - 206, // 209: vtctlservice.Vtctld.SetWritable:output_type -> vtctldata.SetWritableResponse - 207, // 210: vtctlservice.Vtctld.ShardReplicationAdd:output_type -> vtctldata.ShardReplicationAddResponse - 208, // 211: vtctlservice.Vtctld.ShardReplicationFix:output_type -> vtctldata.ShardReplicationFixResponse - 209, // 212: vtctlservice.Vtctld.ShardReplicationPositions:output_type -> vtctldata.ShardReplicationPositionsResponse - 210, // 213: vtctlservice.Vtctld.ShardReplicationRemove:output_type -> vtctldata.ShardReplicationRemoveResponse - 211, // 214: vtctlservice.Vtctld.SleepTablet:output_type -> vtctldata.SleepTabletResponse - 212, // 215: vtctlservice.Vtctld.SourceShardAdd:output_type -> vtctldata.SourceShardAddResponse - 213, // 216: vtctlservice.Vtctld.SourceShardDelete:output_type -> vtctldata.SourceShardDeleteResponse - 214, // 217: vtctlservice.Vtctld.StartReplication:output_type -> vtctldata.StartReplicationResponse - 215, // 218: vtctlservice.Vtctld.StopReplication:output_type -> vtctldata.StopReplicationResponse - 216, // 219: vtctlservice.Vtctld.TabletExternallyReparented:output_type -> vtctldata.TabletExternallyReparentedResponse - 217, // 220: vtctlservice.Vtctld.UpdateCellInfo:output_type -> vtctldata.UpdateCellInfoResponse - 218, // 221: vtctlservice.Vtctld.UpdateCellsAlias:output_type -> vtctldata.UpdateCellsAliasResponse - 219, // 222: vtctlservice.Vtctld.Validate:output_type -> vtctldata.ValidateResponse - 220, // 223: vtctlservice.Vtctld.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse - 221, // 224: vtctlservice.Vtctld.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse - 222, // 225: vtctlservice.Vtctld.ValidateShard:output_type -> vtctldata.ValidateShardResponse - 223, // 226: vtctlservice.Vtctld.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse - 224, // 227: vtctlservice.Vtctld.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse - 225, // 228: vtctlservice.Vtctld.ValidateVSchema:output_type -> vtctldata.ValidateVSchemaResponse - 226, // 229: vtctlservice.Vtctld.VDiffCreate:output_type -> vtctldata.VDiffCreateResponse - 227, // 230: vtctlservice.Vtctld.VDiffDelete:output_type -> vtctldata.VDiffDeleteResponse - 228, // 231: vtctlservice.Vtctld.VDiffResume:output_type -> vtctldata.VDiffResumeResponse - 229, // 232: vtctlservice.Vtctld.VDiffShow:output_type -> vtctldata.VDiffShowResponse - 230, // 233: vtctlservice.Vtctld.VDiffStop:output_type -> vtctldata.VDiffStopResponse - 231, // 234: vtctlservice.Vtctld.WorkflowDelete:output_type -> vtctldata.WorkflowDeleteResponse - 181, // 235: vtctlservice.Vtctld.WorkflowStatus:output_type -> vtctldata.WorkflowStatusResponse - 232, // 236: vtctlservice.Vtctld.WorkflowSwitchTraffic:output_type -> vtctldata.WorkflowSwitchTrafficResponse - 233, // 237: vtctlservice.Vtctld.WorkflowUpdate:output_type -> vtctldata.WorkflowUpdateResponse - 234, // 238: vtctlservice.Vtctld.GetMirrorRules:output_type -> vtctldata.GetMirrorRulesResponse - 235, // 239: vtctlservice.Vtctld.WorkflowMirrorTraffic:output_type -> vtctldata.WorkflowMirrorTrafficResponse - 120, // [120:240] is the sub-list for method output_type - 0, // [0:120] is the sub-list for method input_type + 11, // 11: vtctlservice.Vtctld.ChangeTabletTags:input_type -> vtctldata.ChangeTabletTagsRequest + 12, // 12: vtctlservice.Vtctld.ChangeTabletType:input_type -> vtctldata.ChangeTabletTypeRequest + 13, // 13: vtctlservice.Vtctld.CheckThrottler:input_type -> vtctldata.CheckThrottlerRequest + 14, // 14: vtctlservice.Vtctld.CleanupSchemaMigration:input_type -> vtctldata.CleanupSchemaMigrationRequest + 15, // 15: vtctlservice.Vtctld.CompleteSchemaMigration:input_type -> vtctldata.CompleteSchemaMigrationRequest + 16, // 16: vtctlservice.Vtctld.ConcludeTransaction:input_type -> vtctldata.ConcludeTransactionRequest + 17, // 17: vtctlservice.Vtctld.CreateKeyspace:input_type -> vtctldata.CreateKeyspaceRequest + 18, // 18: vtctlservice.Vtctld.CreateShard:input_type -> vtctldata.CreateShardRequest + 19, // 19: vtctlservice.Vtctld.DeleteCellInfo:input_type -> vtctldata.DeleteCellInfoRequest + 20, // 20: vtctlservice.Vtctld.DeleteCellsAlias:input_type -> vtctldata.DeleteCellsAliasRequest + 21, // 21: vtctlservice.Vtctld.DeleteKeyspace:input_type -> vtctldata.DeleteKeyspaceRequest + 22, // 22: vtctlservice.Vtctld.DeleteShards:input_type -> vtctldata.DeleteShardsRequest + 23, // 23: vtctlservice.Vtctld.DeleteSrvVSchema:input_type -> vtctldata.DeleteSrvVSchemaRequest + 24, // 24: vtctlservice.Vtctld.DeleteTablets:input_type -> vtctldata.DeleteTabletsRequest + 25, // 25: vtctlservice.Vtctld.EmergencyReparentShard:input_type -> vtctldata.EmergencyReparentShardRequest + 26, // 26: vtctlservice.Vtctld.ExecuteFetchAsApp:input_type -> vtctldata.ExecuteFetchAsAppRequest + 27, // 27: vtctlservice.Vtctld.ExecuteFetchAsDBA:input_type -> vtctldata.ExecuteFetchAsDBARequest + 28, // 28: vtctlservice.Vtctld.ExecuteHook:input_type -> vtctldata.ExecuteHookRequest + 29, // 29: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:input_type -> vtctldata.ExecuteMultiFetchAsDBARequest + 30, // 30: vtctlservice.Vtctld.FindAllShardsInKeyspace:input_type -> vtctldata.FindAllShardsInKeyspaceRequest + 31, // 31: vtctlservice.Vtctld.ForceCutOverSchemaMigration:input_type -> vtctldata.ForceCutOverSchemaMigrationRequest + 32, // 32: vtctlservice.Vtctld.GetBackups:input_type -> vtctldata.GetBackupsRequest + 33, // 33: vtctlservice.Vtctld.GetCellInfo:input_type -> vtctldata.GetCellInfoRequest + 34, // 34: vtctlservice.Vtctld.GetCellInfoNames:input_type -> vtctldata.GetCellInfoNamesRequest + 35, // 35: vtctlservice.Vtctld.GetCellsAliases:input_type -> vtctldata.GetCellsAliasesRequest + 36, // 36: vtctlservice.Vtctld.GetFullStatus:input_type -> vtctldata.GetFullStatusRequest + 37, // 37: vtctlservice.Vtctld.GetKeyspace:input_type -> vtctldata.GetKeyspaceRequest + 38, // 38: vtctlservice.Vtctld.GetKeyspaces:input_type -> vtctldata.GetKeyspacesRequest + 39, // 39: vtctlservice.Vtctld.GetKeyspaceRoutingRules:input_type -> vtctldata.GetKeyspaceRoutingRulesRequest + 40, // 40: vtctlservice.Vtctld.GetPermissions:input_type -> vtctldata.GetPermissionsRequest + 41, // 41: vtctlservice.Vtctld.GetRoutingRules:input_type -> vtctldata.GetRoutingRulesRequest + 42, // 42: vtctlservice.Vtctld.GetSchema:input_type -> vtctldata.GetSchemaRequest + 43, // 43: vtctlservice.Vtctld.GetSchemaMigrations:input_type -> vtctldata.GetSchemaMigrationsRequest + 44, // 44: vtctlservice.Vtctld.GetShardReplication:input_type -> vtctldata.GetShardReplicationRequest + 45, // 45: vtctlservice.Vtctld.GetShard:input_type -> vtctldata.GetShardRequest + 46, // 46: vtctlservice.Vtctld.GetShardRoutingRules:input_type -> vtctldata.GetShardRoutingRulesRequest + 47, // 47: vtctlservice.Vtctld.GetSrvKeyspaceNames:input_type -> vtctldata.GetSrvKeyspaceNamesRequest + 48, // 48: vtctlservice.Vtctld.GetSrvKeyspaces:input_type -> vtctldata.GetSrvKeyspacesRequest + 49, // 49: vtctlservice.Vtctld.UpdateThrottlerConfig:input_type -> vtctldata.UpdateThrottlerConfigRequest + 50, // 50: vtctlservice.Vtctld.GetSrvVSchema:input_type -> vtctldata.GetSrvVSchemaRequest + 51, // 51: vtctlservice.Vtctld.GetSrvVSchemas:input_type -> vtctldata.GetSrvVSchemasRequest + 52, // 52: vtctlservice.Vtctld.GetTablet:input_type -> vtctldata.GetTabletRequest + 53, // 53: vtctlservice.Vtctld.GetTablets:input_type -> vtctldata.GetTabletsRequest + 54, // 54: vtctlservice.Vtctld.GetThrottlerStatus:input_type -> vtctldata.GetThrottlerStatusRequest + 55, // 55: vtctlservice.Vtctld.GetTopologyPath:input_type -> vtctldata.GetTopologyPathRequest + 56, // 56: vtctlservice.Vtctld.GetUnresolvedTransactions:input_type -> vtctldata.GetUnresolvedTransactionsRequest + 57, // 57: vtctlservice.Vtctld.GetVersion:input_type -> vtctldata.GetVersionRequest + 58, // 58: vtctlservice.Vtctld.GetVSchema:input_type -> vtctldata.GetVSchemaRequest + 59, // 59: vtctlservice.Vtctld.GetWorkflows:input_type -> vtctldata.GetWorkflowsRequest + 60, // 60: vtctlservice.Vtctld.InitShardPrimary:input_type -> vtctldata.InitShardPrimaryRequest + 61, // 61: vtctlservice.Vtctld.LaunchSchemaMigration:input_type -> vtctldata.LaunchSchemaMigrationRequest + 62, // 62: vtctlservice.Vtctld.LookupVindexCreate:input_type -> vtctldata.LookupVindexCreateRequest + 63, // 63: vtctlservice.Vtctld.LookupVindexExternalize:input_type -> vtctldata.LookupVindexExternalizeRequest + 64, // 64: vtctlservice.Vtctld.MaterializeCreate:input_type -> vtctldata.MaterializeCreateRequest + 65, // 65: vtctlservice.Vtctld.MigrateCreate:input_type -> vtctldata.MigrateCreateRequest + 66, // 66: vtctlservice.Vtctld.MountRegister:input_type -> vtctldata.MountRegisterRequest + 67, // 67: vtctlservice.Vtctld.MountUnregister:input_type -> vtctldata.MountUnregisterRequest + 68, // 68: vtctlservice.Vtctld.MountShow:input_type -> vtctldata.MountShowRequest + 69, // 69: vtctlservice.Vtctld.MountList:input_type -> vtctldata.MountListRequest + 70, // 70: vtctlservice.Vtctld.MoveTablesCreate:input_type -> vtctldata.MoveTablesCreateRequest + 71, // 71: vtctlservice.Vtctld.MoveTablesComplete:input_type -> vtctldata.MoveTablesCompleteRequest + 72, // 72: vtctlservice.Vtctld.PingTablet:input_type -> vtctldata.PingTabletRequest + 73, // 73: vtctlservice.Vtctld.PlannedReparentShard:input_type -> vtctldata.PlannedReparentShardRequest + 74, // 74: vtctlservice.Vtctld.RebuildKeyspaceGraph:input_type -> vtctldata.RebuildKeyspaceGraphRequest + 75, // 75: vtctlservice.Vtctld.RebuildVSchemaGraph:input_type -> vtctldata.RebuildVSchemaGraphRequest + 76, // 76: vtctlservice.Vtctld.RefreshState:input_type -> vtctldata.RefreshStateRequest + 77, // 77: vtctlservice.Vtctld.RefreshStateByShard:input_type -> vtctldata.RefreshStateByShardRequest + 78, // 78: vtctlservice.Vtctld.ReloadSchema:input_type -> vtctldata.ReloadSchemaRequest + 79, // 79: vtctlservice.Vtctld.ReloadSchemaKeyspace:input_type -> vtctldata.ReloadSchemaKeyspaceRequest + 80, // 80: vtctlservice.Vtctld.ReloadSchemaShard:input_type -> vtctldata.ReloadSchemaShardRequest + 81, // 81: vtctlservice.Vtctld.RemoveBackup:input_type -> vtctldata.RemoveBackupRequest + 82, // 82: vtctlservice.Vtctld.RemoveKeyspaceCell:input_type -> vtctldata.RemoveKeyspaceCellRequest + 83, // 83: vtctlservice.Vtctld.RemoveShardCell:input_type -> vtctldata.RemoveShardCellRequest + 84, // 84: vtctlservice.Vtctld.ReparentTablet:input_type -> vtctldata.ReparentTabletRequest + 85, // 85: vtctlservice.Vtctld.ReshardCreate:input_type -> vtctldata.ReshardCreateRequest + 86, // 86: vtctlservice.Vtctld.RestoreFromBackup:input_type -> vtctldata.RestoreFromBackupRequest + 87, // 87: vtctlservice.Vtctld.RetrySchemaMigration:input_type -> vtctldata.RetrySchemaMigrationRequest + 88, // 88: vtctlservice.Vtctld.RunHealthCheck:input_type -> vtctldata.RunHealthCheckRequest + 89, // 89: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:input_type -> vtctldata.SetKeyspaceDurabilityPolicyRequest + 90, // 90: vtctlservice.Vtctld.SetShardIsPrimaryServing:input_type -> vtctldata.SetShardIsPrimaryServingRequest + 91, // 91: vtctlservice.Vtctld.SetShardTabletControl:input_type -> vtctldata.SetShardTabletControlRequest + 92, // 92: vtctlservice.Vtctld.SetWritable:input_type -> vtctldata.SetWritableRequest + 93, // 93: vtctlservice.Vtctld.ShardReplicationAdd:input_type -> vtctldata.ShardReplicationAddRequest + 94, // 94: vtctlservice.Vtctld.ShardReplicationFix:input_type -> vtctldata.ShardReplicationFixRequest + 95, // 95: vtctlservice.Vtctld.ShardReplicationPositions:input_type -> vtctldata.ShardReplicationPositionsRequest + 96, // 96: vtctlservice.Vtctld.ShardReplicationRemove:input_type -> vtctldata.ShardReplicationRemoveRequest + 97, // 97: vtctlservice.Vtctld.SleepTablet:input_type -> vtctldata.SleepTabletRequest + 98, // 98: vtctlservice.Vtctld.SourceShardAdd:input_type -> vtctldata.SourceShardAddRequest + 99, // 99: vtctlservice.Vtctld.SourceShardDelete:input_type -> vtctldata.SourceShardDeleteRequest + 100, // 100: vtctlservice.Vtctld.StartReplication:input_type -> vtctldata.StartReplicationRequest + 101, // 101: vtctlservice.Vtctld.StopReplication:input_type -> vtctldata.StopReplicationRequest + 102, // 102: vtctlservice.Vtctld.TabletExternallyReparented:input_type -> vtctldata.TabletExternallyReparentedRequest + 103, // 103: vtctlservice.Vtctld.UpdateCellInfo:input_type -> vtctldata.UpdateCellInfoRequest + 104, // 104: vtctlservice.Vtctld.UpdateCellsAlias:input_type -> vtctldata.UpdateCellsAliasRequest + 105, // 105: vtctlservice.Vtctld.Validate:input_type -> vtctldata.ValidateRequest + 106, // 106: vtctlservice.Vtctld.ValidateKeyspace:input_type -> vtctldata.ValidateKeyspaceRequest + 107, // 107: vtctlservice.Vtctld.ValidateSchemaKeyspace:input_type -> vtctldata.ValidateSchemaKeyspaceRequest + 108, // 108: vtctlservice.Vtctld.ValidateShard:input_type -> vtctldata.ValidateShardRequest + 109, // 109: vtctlservice.Vtctld.ValidateVersionKeyspace:input_type -> vtctldata.ValidateVersionKeyspaceRequest + 110, // 110: vtctlservice.Vtctld.ValidateVersionShard:input_type -> vtctldata.ValidateVersionShardRequest + 111, // 111: vtctlservice.Vtctld.ValidateVSchema:input_type -> vtctldata.ValidateVSchemaRequest + 112, // 112: vtctlservice.Vtctld.VDiffCreate:input_type -> vtctldata.VDiffCreateRequest + 113, // 113: vtctlservice.Vtctld.VDiffDelete:input_type -> vtctldata.VDiffDeleteRequest + 114, // 114: vtctlservice.Vtctld.VDiffResume:input_type -> vtctldata.VDiffResumeRequest + 115, // 115: vtctlservice.Vtctld.VDiffShow:input_type -> vtctldata.VDiffShowRequest + 116, // 116: vtctlservice.Vtctld.VDiffStop:input_type -> vtctldata.VDiffStopRequest + 117, // 117: vtctlservice.Vtctld.WorkflowDelete:input_type -> vtctldata.WorkflowDeleteRequest + 118, // 118: vtctlservice.Vtctld.WorkflowStatus:input_type -> vtctldata.WorkflowStatusRequest + 119, // 119: vtctlservice.Vtctld.WorkflowSwitchTraffic:input_type -> vtctldata.WorkflowSwitchTrafficRequest + 120, // 120: vtctlservice.Vtctld.WorkflowUpdate:input_type -> vtctldata.WorkflowUpdateRequest + 121, // 121: vtctlservice.Vtctld.GetMirrorRules:input_type -> vtctldata.GetMirrorRulesRequest + 122, // 122: vtctlservice.Vtctld.WorkflowMirrorTraffic:input_type -> vtctldata.WorkflowMirrorTrafficRequest + 123, // 123: vtctlservice.Vtctl.ExecuteVtctlCommand:output_type -> vtctldata.ExecuteVtctlCommandResponse + 124, // 124: vtctlservice.Vtctld.AddCellInfo:output_type -> vtctldata.AddCellInfoResponse + 125, // 125: vtctlservice.Vtctld.AddCellsAlias:output_type -> vtctldata.AddCellsAliasResponse + 126, // 126: vtctlservice.Vtctld.ApplyRoutingRules:output_type -> vtctldata.ApplyRoutingRulesResponse + 127, // 127: vtctlservice.Vtctld.ApplySchema:output_type -> vtctldata.ApplySchemaResponse + 128, // 128: vtctlservice.Vtctld.ApplyKeyspaceRoutingRules:output_type -> vtctldata.ApplyKeyspaceRoutingRulesResponse + 129, // 129: vtctlservice.Vtctld.ApplyShardRoutingRules:output_type -> vtctldata.ApplyShardRoutingRulesResponse + 130, // 130: vtctlservice.Vtctld.ApplyVSchema:output_type -> vtctldata.ApplyVSchemaResponse + 131, // 131: vtctlservice.Vtctld.Backup:output_type -> vtctldata.BackupResponse + 131, // 132: vtctlservice.Vtctld.BackupShard:output_type -> vtctldata.BackupResponse + 132, // 133: vtctlservice.Vtctld.CancelSchemaMigration:output_type -> vtctldata.CancelSchemaMigrationResponse + 133, // 134: vtctlservice.Vtctld.ChangeTabletTags:output_type -> vtctldata.ChangeTabletTagsResponse + 134, // 135: vtctlservice.Vtctld.ChangeTabletType:output_type -> vtctldata.ChangeTabletTypeResponse + 135, // 136: vtctlservice.Vtctld.CheckThrottler:output_type -> vtctldata.CheckThrottlerResponse + 136, // 137: vtctlservice.Vtctld.CleanupSchemaMigration:output_type -> vtctldata.CleanupSchemaMigrationResponse + 137, // 138: vtctlservice.Vtctld.CompleteSchemaMigration:output_type -> vtctldata.CompleteSchemaMigrationResponse + 138, // 139: vtctlservice.Vtctld.ConcludeTransaction:output_type -> vtctldata.ConcludeTransactionResponse + 139, // 140: vtctlservice.Vtctld.CreateKeyspace:output_type -> vtctldata.CreateKeyspaceResponse + 140, // 141: vtctlservice.Vtctld.CreateShard:output_type -> vtctldata.CreateShardResponse + 141, // 142: vtctlservice.Vtctld.DeleteCellInfo:output_type -> vtctldata.DeleteCellInfoResponse + 142, // 143: vtctlservice.Vtctld.DeleteCellsAlias:output_type -> vtctldata.DeleteCellsAliasResponse + 143, // 144: vtctlservice.Vtctld.DeleteKeyspace:output_type -> vtctldata.DeleteKeyspaceResponse + 144, // 145: vtctlservice.Vtctld.DeleteShards:output_type -> vtctldata.DeleteShardsResponse + 145, // 146: vtctlservice.Vtctld.DeleteSrvVSchema:output_type -> vtctldata.DeleteSrvVSchemaResponse + 146, // 147: vtctlservice.Vtctld.DeleteTablets:output_type -> vtctldata.DeleteTabletsResponse + 147, // 148: vtctlservice.Vtctld.EmergencyReparentShard:output_type -> vtctldata.EmergencyReparentShardResponse + 148, // 149: vtctlservice.Vtctld.ExecuteFetchAsApp:output_type -> vtctldata.ExecuteFetchAsAppResponse + 149, // 150: vtctlservice.Vtctld.ExecuteFetchAsDBA:output_type -> vtctldata.ExecuteFetchAsDBAResponse + 150, // 151: vtctlservice.Vtctld.ExecuteHook:output_type -> vtctldata.ExecuteHookResponse + 151, // 152: vtctlservice.Vtctld.ExecuteMultiFetchAsDBA:output_type -> vtctldata.ExecuteMultiFetchAsDBAResponse + 152, // 153: vtctlservice.Vtctld.FindAllShardsInKeyspace:output_type -> vtctldata.FindAllShardsInKeyspaceResponse + 153, // 154: vtctlservice.Vtctld.ForceCutOverSchemaMigration:output_type -> vtctldata.ForceCutOverSchemaMigrationResponse + 154, // 155: vtctlservice.Vtctld.GetBackups:output_type -> vtctldata.GetBackupsResponse + 155, // 156: vtctlservice.Vtctld.GetCellInfo:output_type -> vtctldata.GetCellInfoResponse + 156, // 157: vtctlservice.Vtctld.GetCellInfoNames:output_type -> vtctldata.GetCellInfoNamesResponse + 157, // 158: vtctlservice.Vtctld.GetCellsAliases:output_type -> vtctldata.GetCellsAliasesResponse + 158, // 159: vtctlservice.Vtctld.GetFullStatus:output_type -> vtctldata.GetFullStatusResponse + 159, // 160: vtctlservice.Vtctld.GetKeyspace:output_type -> vtctldata.GetKeyspaceResponse + 160, // 161: vtctlservice.Vtctld.GetKeyspaces:output_type -> vtctldata.GetKeyspacesResponse + 161, // 162: vtctlservice.Vtctld.GetKeyspaceRoutingRules:output_type -> vtctldata.GetKeyspaceRoutingRulesResponse + 162, // 163: vtctlservice.Vtctld.GetPermissions:output_type -> vtctldata.GetPermissionsResponse + 163, // 164: vtctlservice.Vtctld.GetRoutingRules:output_type -> vtctldata.GetRoutingRulesResponse + 164, // 165: vtctlservice.Vtctld.GetSchema:output_type -> vtctldata.GetSchemaResponse + 165, // 166: vtctlservice.Vtctld.GetSchemaMigrations:output_type -> vtctldata.GetSchemaMigrationsResponse + 166, // 167: vtctlservice.Vtctld.GetShardReplication:output_type -> vtctldata.GetShardReplicationResponse + 167, // 168: vtctlservice.Vtctld.GetShard:output_type -> vtctldata.GetShardResponse + 168, // 169: vtctlservice.Vtctld.GetShardRoutingRules:output_type -> vtctldata.GetShardRoutingRulesResponse + 169, // 170: vtctlservice.Vtctld.GetSrvKeyspaceNames:output_type -> vtctldata.GetSrvKeyspaceNamesResponse + 170, // 171: vtctlservice.Vtctld.GetSrvKeyspaces:output_type -> vtctldata.GetSrvKeyspacesResponse + 171, // 172: vtctlservice.Vtctld.UpdateThrottlerConfig:output_type -> vtctldata.UpdateThrottlerConfigResponse + 172, // 173: vtctlservice.Vtctld.GetSrvVSchema:output_type -> vtctldata.GetSrvVSchemaResponse + 173, // 174: vtctlservice.Vtctld.GetSrvVSchemas:output_type -> vtctldata.GetSrvVSchemasResponse + 174, // 175: vtctlservice.Vtctld.GetTablet:output_type -> vtctldata.GetTabletResponse + 175, // 176: vtctlservice.Vtctld.GetTablets:output_type -> vtctldata.GetTabletsResponse + 176, // 177: vtctlservice.Vtctld.GetThrottlerStatus:output_type -> vtctldata.GetThrottlerStatusResponse + 177, // 178: vtctlservice.Vtctld.GetTopologyPath:output_type -> vtctldata.GetTopologyPathResponse + 178, // 179: vtctlservice.Vtctld.GetUnresolvedTransactions:output_type -> vtctldata.GetUnresolvedTransactionsResponse + 179, // 180: vtctlservice.Vtctld.GetVersion:output_type -> vtctldata.GetVersionResponse + 180, // 181: vtctlservice.Vtctld.GetVSchema:output_type -> vtctldata.GetVSchemaResponse + 181, // 182: vtctlservice.Vtctld.GetWorkflows:output_type -> vtctldata.GetWorkflowsResponse + 182, // 183: vtctlservice.Vtctld.InitShardPrimary:output_type -> vtctldata.InitShardPrimaryResponse + 183, // 184: vtctlservice.Vtctld.LaunchSchemaMigration:output_type -> vtctldata.LaunchSchemaMigrationResponse + 184, // 185: vtctlservice.Vtctld.LookupVindexCreate:output_type -> vtctldata.LookupVindexCreateResponse + 185, // 186: vtctlservice.Vtctld.LookupVindexExternalize:output_type -> vtctldata.LookupVindexExternalizeResponse + 186, // 187: vtctlservice.Vtctld.MaterializeCreate:output_type -> vtctldata.MaterializeCreateResponse + 187, // 188: vtctlservice.Vtctld.MigrateCreate:output_type -> vtctldata.WorkflowStatusResponse + 188, // 189: vtctlservice.Vtctld.MountRegister:output_type -> vtctldata.MountRegisterResponse + 189, // 190: vtctlservice.Vtctld.MountUnregister:output_type -> vtctldata.MountUnregisterResponse + 190, // 191: vtctlservice.Vtctld.MountShow:output_type -> vtctldata.MountShowResponse + 191, // 192: vtctlservice.Vtctld.MountList:output_type -> vtctldata.MountListResponse + 187, // 193: vtctlservice.Vtctld.MoveTablesCreate:output_type -> vtctldata.WorkflowStatusResponse + 192, // 194: vtctlservice.Vtctld.MoveTablesComplete:output_type -> vtctldata.MoveTablesCompleteResponse + 193, // 195: vtctlservice.Vtctld.PingTablet:output_type -> vtctldata.PingTabletResponse + 194, // 196: vtctlservice.Vtctld.PlannedReparentShard:output_type -> vtctldata.PlannedReparentShardResponse + 195, // 197: vtctlservice.Vtctld.RebuildKeyspaceGraph:output_type -> vtctldata.RebuildKeyspaceGraphResponse + 196, // 198: vtctlservice.Vtctld.RebuildVSchemaGraph:output_type -> vtctldata.RebuildVSchemaGraphResponse + 197, // 199: vtctlservice.Vtctld.RefreshState:output_type -> vtctldata.RefreshStateResponse + 198, // 200: vtctlservice.Vtctld.RefreshStateByShard:output_type -> vtctldata.RefreshStateByShardResponse + 199, // 201: vtctlservice.Vtctld.ReloadSchema:output_type -> vtctldata.ReloadSchemaResponse + 200, // 202: vtctlservice.Vtctld.ReloadSchemaKeyspace:output_type -> vtctldata.ReloadSchemaKeyspaceResponse + 201, // 203: vtctlservice.Vtctld.ReloadSchemaShard:output_type -> vtctldata.ReloadSchemaShardResponse + 202, // 204: vtctlservice.Vtctld.RemoveBackup:output_type -> vtctldata.RemoveBackupResponse + 203, // 205: vtctlservice.Vtctld.RemoveKeyspaceCell:output_type -> vtctldata.RemoveKeyspaceCellResponse + 204, // 206: vtctlservice.Vtctld.RemoveShardCell:output_type -> vtctldata.RemoveShardCellResponse + 205, // 207: vtctlservice.Vtctld.ReparentTablet:output_type -> vtctldata.ReparentTabletResponse + 187, // 208: vtctlservice.Vtctld.ReshardCreate:output_type -> vtctldata.WorkflowStatusResponse + 206, // 209: vtctlservice.Vtctld.RestoreFromBackup:output_type -> vtctldata.RestoreFromBackupResponse + 207, // 210: vtctlservice.Vtctld.RetrySchemaMigration:output_type -> vtctldata.RetrySchemaMigrationResponse + 208, // 211: vtctlservice.Vtctld.RunHealthCheck:output_type -> vtctldata.RunHealthCheckResponse + 209, // 212: vtctlservice.Vtctld.SetKeyspaceDurabilityPolicy:output_type -> vtctldata.SetKeyspaceDurabilityPolicyResponse + 210, // 213: vtctlservice.Vtctld.SetShardIsPrimaryServing:output_type -> vtctldata.SetShardIsPrimaryServingResponse + 211, // 214: vtctlservice.Vtctld.SetShardTabletControl:output_type -> vtctldata.SetShardTabletControlResponse + 212, // 215: vtctlservice.Vtctld.SetWritable:output_type -> vtctldata.SetWritableResponse + 213, // 216: vtctlservice.Vtctld.ShardReplicationAdd:output_type -> vtctldata.ShardReplicationAddResponse + 214, // 217: vtctlservice.Vtctld.ShardReplicationFix:output_type -> vtctldata.ShardReplicationFixResponse + 215, // 218: vtctlservice.Vtctld.ShardReplicationPositions:output_type -> vtctldata.ShardReplicationPositionsResponse + 216, // 219: vtctlservice.Vtctld.ShardReplicationRemove:output_type -> vtctldata.ShardReplicationRemoveResponse + 217, // 220: vtctlservice.Vtctld.SleepTablet:output_type -> vtctldata.SleepTabletResponse + 218, // 221: vtctlservice.Vtctld.SourceShardAdd:output_type -> vtctldata.SourceShardAddResponse + 219, // 222: vtctlservice.Vtctld.SourceShardDelete:output_type -> vtctldata.SourceShardDeleteResponse + 220, // 223: vtctlservice.Vtctld.StartReplication:output_type -> vtctldata.StartReplicationResponse + 221, // 224: vtctlservice.Vtctld.StopReplication:output_type -> vtctldata.StopReplicationResponse + 222, // 225: vtctlservice.Vtctld.TabletExternallyReparented:output_type -> vtctldata.TabletExternallyReparentedResponse + 223, // 226: vtctlservice.Vtctld.UpdateCellInfo:output_type -> vtctldata.UpdateCellInfoResponse + 224, // 227: vtctlservice.Vtctld.UpdateCellsAlias:output_type -> vtctldata.UpdateCellsAliasResponse + 225, // 228: vtctlservice.Vtctld.Validate:output_type -> vtctldata.ValidateResponse + 226, // 229: vtctlservice.Vtctld.ValidateKeyspace:output_type -> vtctldata.ValidateKeyspaceResponse + 227, // 230: vtctlservice.Vtctld.ValidateSchemaKeyspace:output_type -> vtctldata.ValidateSchemaKeyspaceResponse + 228, // 231: vtctlservice.Vtctld.ValidateShard:output_type -> vtctldata.ValidateShardResponse + 229, // 232: vtctlservice.Vtctld.ValidateVersionKeyspace:output_type -> vtctldata.ValidateVersionKeyspaceResponse + 230, // 233: vtctlservice.Vtctld.ValidateVersionShard:output_type -> vtctldata.ValidateVersionShardResponse + 231, // 234: vtctlservice.Vtctld.ValidateVSchema:output_type -> vtctldata.ValidateVSchemaResponse + 232, // 235: vtctlservice.Vtctld.VDiffCreate:output_type -> vtctldata.VDiffCreateResponse + 233, // 236: vtctlservice.Vtctld.VDiffDelete:output_type -> vtctldata.VDiffDeleteResponse + 234, // 237: vtctlservice.Vtctld.VDiffResume:output_type -> vtctldata.VDiffResumeResponse + 235, // 238: vtctlservice.Vtctld.VDiffShow:output_type -> vtctldata.VDiffShowResponse + 236, // 239: vtctlservice.Vtctld.VDiffStop:output_type -> vtctldata.VDiffStopResponse + 237, // 240: vtctlservice.Vtctld.WorkflowDelete:output_type -> vtctldata.WorkflowDeleteResponse + 187, // 241: vtctlservice.Vtctld.WorkflowStatus:output_type -> vtctldata.WorkflowStatusResponse + 238, // 242: vtctlservice.Vtctld.WorkflowSwitchTraffic:output_type -> vtctldata.WorkflowSwitchTrafficResponse + 239, // 243: vtctlservice.Vtctld.WorkflowUpdate:output_type -> vtctldata.WorkflowUpdateResponse + 240, // 244: vtctlservice.Vtctld.GetMirrorRules:output_type -> vtctldata.GetMirrorRulesResponse + 241, // 245: vtctlservice.Vtctld.WorkflowMirrorTraffic:output_type -> vtctldata.WorkflowMirrorTrafficResponse + 123, // [123:246] is the sub-list for method output_type + 0, // [0:123] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go b/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go index 56cef8d1dcd..957c91793e6 100644 --- a/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice_grpc.pb.go @@ -163,6 +163,8 @@ type VtctldClient interface { BackupShard(ctx context.Context, in *vtctldata.BackupShardRequest, opts ...grpc.CallOption) (Vtctld_BackupShardClient, error) // CancelSchemaMigration cancels one or all migrations, terminating any running ones as needed. CancelSchemaMigration(ctx context.Context, in *vtctldata.CancelSchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.CancelSchemaMigrationResponse, error) + // ChangeTabletTags changes the tags of the specified tablet, if possible. + ChangeTabletTags(ctx context.Context, in *vtctldata.ChangeTabletTagsRequest, opts ...grpc.CallOption) (*vtctldata.ChangeTabletTagsResponse, error) // ChangeTabletType changes the db type for the specified tablet, if possible. // This is used primarily to arrange replicas, and it will not convert a // primary. For that, use InitShardPrimary. @@ -175,6 +177,8 @@ type VtctldClient interface { CleanupSchemaMigration(ctx context.Context, in *vtctldata.CleanupSchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.CleanupSchemaMigrationResponse, error) // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. CompleteSchemaMigration(ctx context.Context, in *vtctldata.CompleteSchemaMigrationRequest, opts ...grpc.CallOption) (*vtctldata.CompleteSchemaMigrationResponse, error) + // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. + ConcludeTransaction(ctx context.Context, in *vtctldata.ConcludeTransactionRequest, opts ...grpc.CallOption) (*vtctldata.ConcludeTransactionResponse, error) // CreateKeyspace creates the specified keyspace in the topology. For a // SNAPSHOT keyspace, the request must specify the name of a base keyspace, // as well as a snapshot time. @@ -274,6 +278,8 @@ type VtctldClient interface { GetThrottlerStatus(ctx context.Context, in *vtctldata.GetThrottlerStatusRequest, opts ...grpc.CallOption) (*vtctldata.GetThrottlerStatusResponse, error) // GetTopologyPath returns the topology cell at a given path. GetTopologyPath(ctx context.Context, in *vtctldata.GetTopologyPathRequest, opts ...grpc.CallOption) (*vtctldata.GetTopologyPathResponse, error) + // GetTransactions returns the unresolved transactions for the request. + GetUnresolvedTransactions(ctx context.Context, in *vtctldata.GetUnresolvedTransactionsRequest, opts ...grpc.CallOption) (*vtctldata.GetUnresolvedTransactionsResponse, error) // GetVersion returns the version of a tablet from its debug vars. GetVersion(ctx context.Context, in *vtctldata.GetVersionRequest, opts ...grpc.CallOption) (*vtctldata.GetVersionResponse, error) // GetVSchema returns the vschema for a keyspace. @@ -613,6 +619,15 @@ func (c *vtctldClient) CancelSchemaMigration(ctx context.Context, in *vtctldata. return out, nil } +func (c *vtctldClient) ChangeTabletTags(ctx context.Context, in *vtctldata.ChangeTabletTagsRequest, opts ...grpc.CallOption) (*vtctldata.ChangeTabletTagsResponse, error) { + out := new(vtctldata.ChangeTabletTagsResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/ChangeTabletTags", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) ChangeTabletType(ctx context.Context, in *vtctldata.ChangeTabletTypeRequest, opts ...grpc.CallOption) (*vtctldata.ChangeTabletTypeResponse, error) { out := new(vtctldata.ChangeTabletTypeResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/ChangeTabletType", in, out, opts...) @@ -649,6 +664,15 @@ func (c *vtctldClient) CompleteSchemaMigration(ctx context.Context, in *vtctldat return out, nil } +func (c *vtctldClient) ConcludeTransaction(ctx context.Context, in *vtctldata.ConcludeTransactionRequest, opts ...grpc.CallOption) (*vtctldata.ConcludeTransactionResponse, error) { + out := new(vtctldata.ConcludeTransactionResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/ConcludeTransaction", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) CreateKeyspace(ctx context.Context, in *vtctldata.CreateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldata.CreateKeyspaceResponse, error) { out := new(vtctldata.CreateKeyspaceResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/CreateKeyspace", in, out, opts...) @@ -1000,6 +1024,15 @@ func (c *vtctldClient) GetTopologyPath(ctx context.Context, in *vtctldata.GetTop return out, nil } +func (c *vtctldClient) GetUnresolvedTransactions(ctx context.Context, in *vtctldata.GetUnresolvedTransactionsRequest, opts ...grpc.CallOption) (*vtctldata.GetUnresolvedTransactionsResponse, error) { + out := new(vtctldata.GetUnresolvedTransactionsResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/GetUnresolvedTransactions", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) GetVersion(ctx context.Context, in *vtctldata.GetVersionRequest, opts ...grpc.CallOption) (*vtctldata.GetVersionResponse, error) { out := new(vtctldata.GetVersionResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/GetVersion", in, out, opts...) @@ -1648,6 +1681,8 @@ type VtctldServer interface { BackupShard(*vtctldata.BackupShardRequest, Vtctld_BackupShardServer) error // CancelSchemaMigration cancels one or all migrations, terminating any running ones as needed. CancelSchemaMigration(context.Context, *vtctldata.CancelSchemaMigrationRequest) (*vtctldata.CancelSchemaMigrationResponse, error) + // ChangeTabletTags changes the tags of the specified tablet, if possible. + ChangeTabletTags(context.Context, *vtctldata.ChangeTabletTagsRequest) (*vtctldata.ChangeTabletTagsResponse, error) // ChangeTabletType changes the db type for the specified tablet, if possible. // This is used primarily to arrange replicas, and it will not convert a // primary. For that, use InitShardPrimary. @@ -1660,6 +1695,8 @@ type VtctldServer interface { CleanupSchemaMigration(context.Context, *vtctldata.CleanupSchemaMigrationRequest) (*vtctldata.CleanupSchemaMigrationResponse, error) // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. CompleteSchemaMigration(context.Context, *vtctldata.CompleteSchemaMigrationRequest) (*vtctldata.CompleteSchemaMigrationResponse, error) + // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. + ConcludeTransaction(context.Context, *vtctldata.ConcludeTransactionRequest) (*vtctldata.ConcludeTransactionResponse, error) // CreateKeyspace creates the specified keyspace in the topology. For a // SNAPSHOT keyspace, the request must specify the name of a base keyspace, // as well as a snapshot time. @@ -1759,6 +1796,8 @@ type VtctldServer interface { GetThrottlerStatus(context.Context, *vtctldata.GetThrottlerStatusRequest) (*vtctldata.GetThrottlerStatusResponse, error) // GetTopologyPath returns the topology cell at a given path. GetTopologyPath(context.Context, *vtctldata.GetTopologyPathRequest) (*vtctldata.GetTopologyPathResponse, error) + // GetTransactions returns the unresolved transactions for the request. + GetUnresolvedTransactions(context.Context, *vtctldata.GetUnresolvedTransactionsRequest) (*vtctldata.GetUnresolvedTransactionsResponse, error) // GetVersion returns the version of a tablet from its debug vars. GetVersion(context.Context, *vtctldata.GetVersionRequest) (*vtctldata.GetVersionResponse, error) // GetVSchema returns the vschema for a keyspace. @@ -1989,6 +2028,9 @@ func (UnimplementedVtctldServer) BackupShard(*vtctldata.BackupShardRequest, Vtct func (UnimplementedVtctldServer) CancelSchemaMigration(context.Context, *vtctldata.CancelSchemaMigrationRequest) (*vtctldata.CancelSchemaMigrationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CancelSchemaMigration not implemented") } +func (UnimplementedVtctldServer) ChangeTabletTags(context.Context, *vtctldata.ChangeTabletTagsRequest) (*vtctldata.ChangeTabletTagsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangeTabletTags not implemented") +} func (UnimplementedVtctldServer) ChangeTabletType(context.Context, *vtctldata.ChangeTabletTypeRequest) (*vtctldata.ChangeTabletTypeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangeTabletType not implemented") } @@ -2001,6 +2043,9 @@ func (UnimplementedVtctldServer) CleanupSchemaMigration(context.Context, *vtctld func (UnimplementedVtctldServer) CompleteSchemaMigration(context.Context, *vtctldata.CompleteSchemaMigrationRequest) (*vtctldata.CompleteSchemaMigrationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CompleteSchemaMigration not implemented") } +func (UnimplementedVtctldServer) ConcludeTransaction(context.Context, *vtctldata.ConcludeTransactionRequest) (*vtctldata.ConcludeTransactionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ConcludeTransaction not implemented") +} func (UnimplementedVtctldServer) CreateKeyspace(context.Context, *vtctldata.CreateKeyspaceRequest) (*vtctldata.CreateKeyspaceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateKeyspace not implemented") } @@ -2118,6 +2163,9 @@ func (UnimplementedVtctldServer) GetThrottlerStatus(context.Context, *vtctldata. func (UnimplementedVtctldServer) GetTopologyPath(context.Context, *vtctldata.GetTopologyPathRequest) (*vtctldata.GetTopologyPathResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTopologyPath not implemented") } +func (UnimplementedVtctldServer) GetUnresolvedTransactions(context.Context, *vtctldata.GetUnresolvedTransactionsRequest) (*vtctldata.GetUnresolvedTransactionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUnresolvedTransactions not implemented") +} func (UnimplementedVtctldServer) GetVersion(context.Context, *vtctldata.GetVersionRequest) (*vtctldata.GetVersionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetVersion not implemented") } @@ -2515,6 +2563,24 @@ func _Vtctld_CancelSchemaMigration_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _Vtctld_ChangeTabletTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.ChangeTabletTagsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).ChangeTabletTags(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/ChangeTabletTags", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).ChangeTabletTags(ctx, req.(*vtctldata.ChangeTabletTagsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_ChangeTabletType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.ChangeTabletTypeRequest) if err := dec(in); err != nil { @@ -2587,6 +2653,24 @@ func _Vtctld_CompleteSchemaMigration_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _Vtctld_ConcludeTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.ConcludeTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).ConcludeTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/ConcludeTransaction", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).ConcludeTransaction(ctx, req.(*vtctldata.ConcludeTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_CreateKeyspace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.CreateKeyspaceRequest) if err := dec(in); err != nil { @@ -3289,6 +3373,24 @@ func _Vtctld_GetTopologyPath_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _Vtctld_GetUnresolvedTransactions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.GetUnresolvedTransactionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).GetUnresolvedTransactions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/GetUnresolvedTransactions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).GetUnresolvedTransactions(ctx, req.(*vtctldata.GetUnresolvedTransactionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_GetVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.GetVersionRequest) if err := dec(in); err != nil { @@ -4519,6 +4621,10 @@ var Vtctld_ServiceDesc = grpc.ServiceDesc{ MethodName: "CancelSchemaMigration", Handler: _Vtctld_CancelSchemaMigration_Handler, }, + { + MethodName: "ChangeTabletTags", + Handler: _Vtctld_ChangeTabletTags_Handler, + }, { MethodName: "ChangeTabletType", Handler: _Vtctld_ChangeTabletType_Handler, @@ -4535,6 +4641,10 @@ var Vtctld_ServiceDesc = grpc.ServiceDesc{ MethodName: "CompleteSchemaMigration", Handler: _Vtctld_CompleteSchemaMigration_Handler, }, + { + MethodName: "ConcludeTransaction", + Handler: _Vtctld_ConcludeTransaction_Handler, + }, { MethodName: "CreateKeyspace", Handler: _Vtctld_CreateKeyspace_Handler, @@ -4691,6 +4801,10 @@ var Vtctld_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetTopologyPath", Handler: _Vtctld_GetTopologyPath_Handler, }, + { + MethodName: "GetUnresolvedTransactions", + Handler: _Vtctld_GetUnresolvedTransactions_Handler, + }, { MethodName: "GetVersion", Handler: _Vtctld_GetVersion_Handler, diff --git a/go/vt/proto/vtgate/vtgate.pb.go b/go/vt/proto/vtgate/vtgate.pb.go index a7a200cc93d..58392f86bb3 100644 --- a/go/vt/proto/vtgate/vtgate.pb.go +++ b/go/vt/proto/vtgate/vtgate.pb.go @@ -1082,6 +1082,10 @@ type VStreamFlags struct { Cells string `protobuf:"bytes,4,opt,name=cells,proto3" json:"cells,omitempty"` CellPreference string `protobuf:"bytes,5,opt,name=cell_preference,json=cellPreference,proto3" json:"cell_preference,omitempty"` TabletOrder string `protobuf:"bytes,6,opt,name=tablet_order,json=tabletOrder,proto3" json:"tablet_order,omitempty"` + // When set, all new row events from the `heartbeat` table, for all shards, in the sidecardb will be streamed. + StreamKeyspaceHeartbeats bool `protobuf:"varint,7,opt,name=stream_keyspace_heartbeats,json=streamKeyspaceHeartbeats,proto3" json:"stream_keyspace_heartbeats,omitempty"` + // Include reshard journal events in the stream. + IncludeReshardJournalEvents bool `protobuf:"varint,8,opt,name=include_reshard_journal_events,json=includeReshardJournalEvents,proto3" json:"include_reshard_journal_events,omitempty"` } func (x *VStreamFlags) Reset() { @@ -1158,6 +1162,20 @@ func (x *VStreamFlags) GetTabletOrder() string { return "" } +func (x *VStreamFlags) GetStreamKeyspaceHeartbeats() bool { + if x != nil { + return x.StreamKeyspaceHeartbeats + } + return false +} + +func (x *VStreamFlags) GetIncludeReshardJournalEvents() bool { + if x != nil { + return x.IncludeReshardJournalEvents + } + return false +} + // VStreamRequest is the payload for VStream. type VStreamRequest struct { state protoimpl.MessageState @@ -1827,7 +1845,7 @@ var file_vtgate_proto_rawDesc = []byte{ 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x74, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x74, 0x69, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x0c, 0x56, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xef, 0x02, 0x0a, 0x0c, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x6b, 0x65, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x53, 0x6b, 0x65, 0x77, @@ -1842,68 +1860,76 @@ var file_vtgate_proto_rawDesc = []byte{ 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xf6, 0x01, 0x0a, 0x0e, 0x56, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x09, + 0x62, 0x6c, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x68, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6a, 0x6f, 0x75, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x1b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4a, + 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xf6, 0x01, 0x0a, + 0x0e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x49, 0x44, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x35, 0x0a, + 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x47, 0x74, 0x69, 0x64, 0x52, 0x05, 0x76, 0x67, 0x74, 0x69, 0x64, 0x12, 0x2a, 0x0a, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x05, 0x66, 0x6c, 0x61, + 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, + 0x65, 0x2e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x05, + 0x66, 0x6c, 0x61, 0x67, 0x73, 0x22, 0x3d, 0x0a, 0x0f, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, + 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, + 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x08, 0x63, 0x61, 0x6c, + 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x89, 0x01, 0x0a, 0x0f, 0x50, 0x72, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, + 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x6e, 0x0a, 0x13, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, - 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x47, - 0x74, 0x69, 0x64, 0x52, 0x05, 0x76, 0x67, 0x74, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x69, 0x6e, - 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x56, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x05, 0x66, 0x6c, 0x61, - 0x67, 0x73, 0x22, 0x3d, 0x0a, 0x0f, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, - 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x89, 0x01, 0x0a, 0x0f, 0x50, 0x72, 0x65, 0x70, 0x61, - 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, - 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x06, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x22, 0x6e, 0x0a, 0x13, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, - 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x08, 0x63, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, - 0x65, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, - 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x2a, 0x44, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, - 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, - 0x54, 0x57, 0x4f, 0x50, 0x43, 0x10, 0x03, 0x2a, 0x3c, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, - 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x52, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x50, - 0x4f, 0x53, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x55, 0x54, 0x4f, 0x43, 0x4f, 0x4d, - 0x4d, 0x49, 0x54, 0x10, 0x03, 0x42, 0x36, 0x0a, 0x0f, 0x69, 0x6f, 0x2e, 0x76, 0x69, 0x74, 0x65, - 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x23, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, - 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, + 0x67, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, + 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x2a, 0x44, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, + 0x4c, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x10, 0x02, 0x12, + 0x09, 0x0a, 0x05, 0x54, 0x57, 0x4f, 0x50, 0x43, 0x10, 0x03, 0x2a, 0x3c, 0x0a, 0x0b, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, + 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x52, 0x45, 0x10, 0x01, 0x12, 0x08, + 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x55, 0x54, 0x4f, + 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x03, 0x42, 0x36, 0x0a, 0x0f, 0x69, 0x6f, 0x2e, 0x76, + 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x23, 0x76, 0x69, 0x74, + 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, + 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/vt/proto/vtgate/vtgate_vtproto.pb.go b/go/vt/proto/vtgate/vtgate_vtproto.pb.go index bec24472760..d32eee0428a 100644 --- a/go/vt/proto/vtgate/vtgate_vtproto.pb.go +++ b/go/vt/proto/vtgate/vtgate_vtproto.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: vtgate.proto package vtgate @@ -7,11 +7,11 @@ package vtgate import ( binary "encoding/binary" fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" math "math" - bits "math/bits" binlogdata "vitess.io/vitess/go/vt/proto/binlogdata" query "vitess.io/vitess/go/vt/proto/query" topodata "vitess.io/vitess/go/vt/proto/topodata" @@ -29,13 +29,12 @@ func (m *Session_ShardSession) CloneVT() *Session_ShardSession { if m == nil { return (*Session_ShardSession)(nil) } - r := &Session_ShardSession{ - Target: m.Target.CloneVT(), - TransactionId: m.TransactionId, - TabletAlias: m.TabletAlias.CloneVT(), - ReservedId: m.ReservedId, - VindexOnly: m.VindexOnly, - } + r := new(Session_ShardSession) + r.Target = m.Target.CloneVT() + r.TransactionId = m.TransactionId + r.TabletAlias = m.TabletAlias.CloneVT() + r.ReservedId = m.ReservedId + r.VindexOnly = m.VindexOnly if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -51,25 +50,24 @@ func (m *Session) CloneVT() *Session { if m == nil { return (*Session)(nil) } - r := &Session{ - InTransaction: m.InTransaction, - Autocommit: m.Autocommit, - TargetString: m.TargetString, - Options: m.Options.CloneVT(), - TransactionMode: m.TransactionMode, - LastInsertId: m.LastInsertId, - FoundRows: m.FoundRows, - RowCount: m.RowCount, - InReservedConn: m.InReservedConn, - LockSession: m.LockSession.CloneVT(), - LastLockHeartbeat: m.LastLockHeartbeat, - ReadAfterWrite: m.ReadAfterWrite.CloneVT(), - DDLStrategy: m.DDLStrategy, - SessionUUID: m.SessionUUID, - EnableSystemSettings: m.EnableSystemSettings, - QueryTimeout: m.QueryTimeout, - MigrationContext: m.MigrationContext, - } + r := new(Session) + r.InTransaction = m.InTransaction + r.Autocommit = m.Autocommit + r.TargetString = m.TargetString + r.Options = m.Options.CloneVT() + r.TransactionMode = m.TransactionMode + r.LastInsertId = m.LastInsertId + r.FoundRows = m.FoundRows + r.RowCount = m.RowCount + r.InReservedConn = m.InReservedConn + r.LockSession = m.LockSession.CloneVT() + r.LastLockHeartbeat = m.LastLockHeartbeat + r.ReadAfterWrite = m.ReadAfterWrite.CloneVT() + r.DDLStrategy = m.DDLStrategy + r.SessionUUID = m.SessionUUID + r.EnableSystemSettings = m.EnableSystemSettings + r.QueryTimeout = m.QueryTimeout + r.MigrationContext = m.MigrationContext if rhs := m.ShardSessions; rhs != nil { tmpContainer := make([]*Session_ShardSession, len(rhs)) for k, v := range rhs { @@ -146,10 +144,9 @@ func (m *PrepareData) CloneVT() *PrepareData { if m == nil { return (*PrepareData)(nil) } - r := &PrepareData{ - PrepareStatement: m.PrepareStatement, - ParamsCount: m.ParamsCount, - } + r := new(PrepareData) + r.PrepareStatement = m.PrepareStatement + r.ParamsCount = m.ParamsCount if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -165,11 +162,10 @@ func (m *ReadAfterWrite) CloneVT() *ReadAfterWrite { if m == nil { return (*ReadAfterWrite)(nil) } - r := &ReadAfterWrite{ - ReadAfterWriteGtid: m.ReadAfterWriteGtid, - ReadAfterWriteTimeout: m.ReadAfterWriteTimeout, - SessionTrackGtids: m.SessionTrackGtids, - } + r := new(ReadAfterWrite) + r.ReadAfterWriteGtid = m.ReadAfterWriteGtid + r.ReadAfterWriteTimeout = m.ReadAfterWriteTimeout + r.SessionTrackGtids = m.SessionTrackGtids if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -185,11 +181,10 @@ func (m *ExecuteRequest) CloneVT() *ExecuteRequest { if m == nil { return (*ExecuteRequest)(nil) } - r := &ExecuteRequest{ - CallerId: m.CallerId.CloneVT(), - Session: m.Session.CloneVT(), - Query: m.Query.CloneVT(), - } + r := new(ExecuteRequest) + r.CallerId = m.CallerId.CloneVT() + r.Session = m.Session.CloneVT() + r.Query = m.Query.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -205,11 +200,10 @@ func (m *ExecuteResponse) CloneVT() *ExecuteResponse { if m == nil { return (*ExecuteResponse)(nil) } - r := &ExecuteResponse{ - Error: m.Error.CloneVT(), - Session: m.Session.CloneVT(), - Result: m.Result.CloneVT(), - } + r := new(ExecuteResponse) + r.Error = m.Error.CloneVT() + r.Session = m.Session.CloneVT() + r.Result = m.Result.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -225,10 +219,9 @@ func (m *ExecuteBatchRequest) CloneVT() *ExecuteBatchRequest { if m == nil { return (*ExecuteBatchRequest)(nil) } - r := &ExecuteBatchRequest{ - CallerId: m.CallerId.CloneVT(), - Session: m.Session.CloneVT(), - } + r := new(ExecuteBatchRequest) + r.CallerId = m.CallerId.CloneVT() + r.Session = m.Session.CloneVT() if rhs := m.Queries; rhs != nil { tmpContainer := make([]*query.BoundQuery, len(rhs)) for k, v := range rhs { @@ -251,10 +244,9 @@ func (m *ExecuteBatchResponse) CloneVT() *ExecuteBatchResponse { if m == nil { return (*ExecuteBatchResponse)(nil) } - r := &ExecuteBatchResponse{ - Error: m.Error.CloneVT(), - Session: m.Session.CloneVT(), - } + r := new(ExecuteBatchResponse) + r.Error = m.Error.CloneVT() + r.Session = m.Session.CloneVT() if rhs := m.Results; rhs != nil { tmpContainer := make([]*query.ResultWithError, len(rhs)) for k, v := range rhs { @@ -277,11 +269,10 @@ func (m *StreamExecuteRequest) CloneVT() *StreamExecuteRequest { if m == nil { return (*StreamExecuteRequest)(nil) } - r := &StreamExecuteRequest{ - CallerId: m.CallerId.CloneVT(), - Query: m.Query.CloneVT(), - Session: m.Session.CloneVT(), - } + r := new(StreamExecuteRequest) + r.CallerId = m.CallerId.CloneVT() + r.Query = m.Query.CloneVT() + r.Session = m.Session.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -297,10 +288,9 @@ func (m *StreamExecuteResponse) CloneVT() *StreamExecuteResponse { if m == nil { return (*StreamExecuteResponse)(nil) } - r := &StreamExecuteResponse{ - Result: m.Result.CloneVT(), - Session: m.Session.CloneVT(), - } + r := new(StreamExecuteResponse) + r.Result = m.Result.CloneVT() + r.Session = m.Session.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -316,10 +306,9 @@ func (m *ResolveTransactionRequest) CloneVT() *ResolveTransactionRequest { if m == nil { return (*ResolveTransactionRequest)(nil) } - r := &ResolveTransactionRequest{ - CallerId: m.CallerId.CloneVT(), - Dtid: m.Dtid, - } + r := new(ResolveTransactionRequest) + r.CallerId = m.CallerId.CloneVT() + r.Dtid = m.Dtid if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -335,7 +324,7 @@ func (m *ResolveTransactionResponse) CloneVT() *ResolveTransactionResponse { if m == nil { return (*ResolveTransactionResponse)(nil) } - r := &ResolveTransactionResponse{} + r := new(ResolveTransactionResponse) if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -351,14 +340,15 @@ func (m *VStreamFlags) CloneVT() *VStreamFlags { if m == nil { return (*VStreamFlags)(nil) } - r := &VStreamFlags{ - MinimizeSkew: m.MinimizeSkew, - HeartbeatInterval: m.HeartbeatInterval, - StopOnReshard: m.StopOnReshard, - Cells: m.Cells, - CellPreference: m.CellPreference, - TabletOrder: m.TabletOrder, - } + r := new(VStreamFlags) + r.MinimizeSkew = m.MinimizeSkew + r.HeartbeatInterval = m.HeartbeatInterval + r.StopOnReshard = m.StopOnReshard + r.Cells = m.Cells + r.CellPreference = m.CellPreference + r.TabletOrder = m.TabletOrder + r.StreamKeyspaceHeartbeats = m.StreamKeyspaceHeartbeats + r.IncludeReshardJournalEvents = m.IncludeReshardJournalEvents if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -374,13 +364,12 @@ func (m *VStreamRequest) CloneVT() *VStreamRequest { if m == nil { return (*VStreamRequest)(nil) } - r := &VStreamRequest{ - CallerId: m.CallerId.CloneVT(), - TabletType: m.TabletType, - Vgtid: m.Vgtid.CloneVT(), - Filter: m.Filter.CloneVT(), - Flags: m.Flags.CloneVT(), - } + r := new(VStreamRequest) + r.CallerId = m.CallerId.CloneVT() + r.TabletType = m.TabletType + r.Vgtid = m.Vgtid.CloneVT() + r.Filter = m.Filter.CloneVT() + r.Flags = m.Flags.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -396,7 +385,7 @@ func (m *VStreamResponse) CloneVT() *VStreamResponse { if m == nil { return (*VStreamResponse)(nil) } - r := &VStreamResponse{} + r := new(VStreamResponse) if rhs := m.Events; rhs != nil { tmpContainer := make([]*binlogdata.VEvent, len(rhs)) for k, v := range rhs { @@ -419,11 +408,10 @@ func (m *PrepareRequest) CloneVT() *PrepareRequest { if m == nil { return (*PrepareRequest)(nil) } - r := &PrepareRequest{ - CallerId: m.CallerId.CloneVT(), - Session: m.Session.CloneVT(), - Query: m.Query.CloneVT(), - } + r := new(PrepareRequest) + r.CallerId = m.CallerId.CloneVT() + r.Session = m.Session.CloneVT() + r.Query = m.Query.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -439,10 +427,9 @@ func (m *PrepareResponse) CloneVT() *PrepareResponse { if m == nil { return (*PrepareResponse)(nil) } - r := &PrepareResponse{ - Error: m.Error.CloneVT(), - Session: m.Session.CloneVT(), - } + r := new(PrepareResponse) + r.Error = m.Error.CloneVT() + r.Session = m.Session.CloneVT() if rhs := m.Fields; rhs != nil { tmpContainer := make([]*query.Field, len(rhs)) for k, v := range rhs { @@ -465,10 +452,9 @@ func (m *CloseSessionRequest) CloneVT() *CloseSessionRequest { if m == nil { return (*CloseSessionRequest)(nil) } - r := &CloseSessionRequest{ - CallerId: m.CallerId.CloneVT(), - Session: m.Session.CloneVT(), - } + r := new(CloseSessionRequest) + r.CallerId = m.CallerId.CloneVT() + r.Session = m.Session.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -484,9 +470,8 @@ func (m *CloseSessionResponse) CloneVT() *CloseSessionResponse { if m == nil { return (*CloseSessionResponse)(nil) } - r := &CloseSessionResponse{ - Error: m.Error.CloneVT(), - } + r := new(CloseSessionResponse) + r.Error = m.Error.CloneVT() if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -539,7 +524,7 @@ func (m *Session_ShardSession) MarshalToSizedBufferVT(dAtA []byte) (int, error) dAtA[i] = 0x28 } if m.ReservedId != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReservedId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReservedId)) i-- dAtA[i] = 0x20 } @@ -549,12 +534,12 @@ func (m *Session_ShardSession) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if m.TransactionId != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionId)) i-- dAtA[i] = 0x10 } @@ -564,7 +549,7 @@ func (m *Session_ShardSession) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -604,7 +589,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.MigrationContext) > 0 { i -= len(m.MigrationContext) copy(dAtA[i:], m.MigrationContext) - i = encodeVarint(dAtA, i, uint64(len(m.MigrationContext))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.MigrationContext))) i-- dAtA[i] = 0x1 i-- @@ -619,15 +604,15 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x1 i-- @@ -635,7 +620,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { } } if m.QueryTimeout != 0 { - i = encodeVarint(dAtA, i, uint64(m.QueryTimeout)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.QueryTimeout)) i-- dAtA[i] = 0x1 i-- @@ -645,15 +630,15 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for k := range m.AdvisoryLock { v := m.AdvisoryLock[k] baseI := i - i = encodeVarint(dAtA, i, uint64(v)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(v)) i-- dAtA[i] = 0x10 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x1 i-- @@ -675,7 +660,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.SessionUUID) > 0 { i -= len(m.SessionUUID) copy(dAtA[i:], m.SessionUUID) - i = encodeVarint(dAtA, i, uint64(len(m.SessionUUID))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.SessionUUID))) i-- dAtA[i] = 0x1 i-- @@ -684,7 +669,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.DDLStrategy) > 0 { i -= len(m.DDLStrategy) copy(dAtA[i:], m.DDLStrategy) - i = encodeVarint(dAtA, i, uint64(len(m.DDLStrategy))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DDLStrategy))) i-- dAtA[i] = 0x1 i-- @@ -696,14 +681,14 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xa2 } if m.LastLockHeartbeat != 0 { - i = encodeVarint(dAtA, i, uint64(m.LastLockHeartbeat)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.LastLockHeartbeat)) i-- dAtA[i] = 0x1 i-- @@ -715,7 +700,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1 i-- @@ -737,7 +722,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Savepoints) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Savepoints[iNdEx]) copy(dAtA[i:], m.Savepoints[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Savepoints[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Savepoints[iNdEx]))) i-- dAtA[i] = 0x1 i-- @@ -745,7 +730,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { } } if m.RowCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.RowCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RowCount)) i-- dAtA[i] = 0x78 } @@ -755,15 +740,15 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { baseI := i i -= len(v) copy(dAtA[i:], v) - i = encodeVarint(dAtA, i, uint64(len(v))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(v))) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x72 } @@ -777,26 +762,26 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 i -= len(k) copy(dAtA[i:], k) - i = encodeVarint(dAtA, i, uint64(len(k))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarint(dAtA, i, uint64(baseI-i)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x6a } } if m.FoundRows != 0 { - i = encodeVarint(dAtA, i, uint64(m.FoundRows)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.FoundRows)) i-- dAtA[i] = 0x60 } if m.LastInsertId != 0 { - i = encodeVarint(dAtA, i, uint64(m.LastInsertId)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.LastInsertId)) i-- dAtA[i] = 0x58 } @@ -807,7 +792,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x52 } @@ -819,7 +804,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x4a } @@ -831,13 +816,13 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x42 } } if m.TransactionMode != 0 { - i = encodeVarint(dAtA, i, uint64(m.TransactionMode)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TransactionMode)) i-- dAtA[i] = 0x38 } @@ -847,14 +832,14 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } if len(m.TargetString) > 0 { i -= len(m.TargetString) copy(dAtA[i:], m.TargetString) - i = encodeVarint(dAtA, i, uint64(len(m.TargetString))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TargetString))) i-- dAtA[i] = 0x2a } @@ -875,7 +860,7 @@ func (m *Session) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -924,14 +909,14 @@ func (m *PrepareData) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.ParamsCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.ParamsCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ParamsCount)) i-- dAtA[i] = 0x10 } if len(m.PrepareStatement) > 0 { i -= len(m.PrepareStatement) copy(dAtA[i:], m.PrepareStatement) - i = encodeVarint(dAtA, i, uint64(len(m.PrepareStatement))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.PrepareStatement))) i-- dAtA[i] = 0xa } @@ -987,7 +972,7 @@ func (m *ReadAfterWrite) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.ReadAfterWriteGtid) > 0 { i -= len(m.ReadAfterWriteGtid) copy(dAtA[i:], m.ReadAfterWriteGtid) - i = encodeVarint(dAtA, i, uint64(len(m.ReadAfterWriteGtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ReadAfterWriteGtid))) i-- dAtA[i] = 0xa } @@ -1030,7 +1015,7 @@ func (m *ExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1040,7 +1025,7 @@ func (m *ExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1050,7 +1035,7 @@ func (m *ExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1093,7 +1078,7 @@ func (m *ExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1103,7 +1088,7 @@ func (m *ExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1113,7 +1098,7 @@ func (m *ExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1157,7 +1142,7 @@ func (m *ExecuteBatchRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1168,7 +1153,7 @@ func (m *ExecuteBatchRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1178,7 +1163,7 @@ func (m *ExecuteBatchRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1222,7 +1207,7 @@ func (m *ExecuteBatchResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1233,7 +1218,7 @@ func (m *ExecuteBatchResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1243,7 +1228,7 @@ func (m *ExecuteBatchResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1286,7 +1271,7 @@ func (m *StreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x32 } @@ -1296,7 +1281,7 @@ func (m *StreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1306,7 +1291,7 @@ func (m *StreamExecuteRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1349,7 +1334,7 @@ func (m *StreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1359,7 +1344,7 @@ func (m *StreamExecuteResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1399,7 +1384,7 @@ func (m *ResolveTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er if len(m.Dtid) > 0 { i -= len(m.Dtid) copy(dAtA[i:], m.Dtid) - i = encodeVarint(dAtA, i, uint64(len(m.Dtid))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Dtid))) i-- dAtA[i] = 0x12 } @@ -1409,7 +1394,7 @@ func (m *ResolveTransactionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, er return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1479,24 +1464,44 @@ func (m *VStreamFlags) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.IncludeReshardJournalEvents { + i-- + if m.IncludeReshardJournalEvents { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if m.StreamKeyspaceHeartbeats { + i-- + if m.StreamKeyspaceHeartbeats { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } if len(m.TabletOrder) > 0 { i -= len(m.TabletOrder) copy(dAtA[i:], m.TabletOrder) - i = encodeVarint(dAtA, i, uint64(len(m.TabletOrder))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.TabletOrder))) i-- dAtA[i] = 0x32 } if len(m.CellPreference) > 0 { i -= len(m.CellPreference) copy(dAtA[i:], m.CellPreference) - i = encodeVarint(dAtA, i, uint64(len(m.CellPreference))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.CellPreference))) i-- dAtA[i] = 0x2a } if len(m.Cells) > 0 { i -= len(m.Cells) copy(dAtA[i:], m.Cells) - i = encodeVarint(dAtA, i, uint64(len(m.Cells))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells))) i-- dAtA[i] = 0x22 } @@ -1511,7 +1516,7 @@ func (m *VStreamFlags) MarshalToSizedBufferVT(dAtA []byte) (int, error) { dAtA[i] = 0x18 } if m.HeartbeatInterval != 0 { - i = encodeVarint(dAtA, i, uint64(m.HeartbeatInterval)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.HeartbeatInterval)) i-- dAtA[i] = 0x10 } @@ -1564,7 +1569,7 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x2a } @@ -1574,7 +1579,7 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -1584,12 +1589,12 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } if m.TabletType != 0 { - i = encodeVarint(dAtA, i, uint64(m.TabletType)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.TabletType)) i-- dAtA[i] = 0x10 } @@ -1599,7 +1604,7 @@ func (m *VStreamRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1643,7 +1648,7 @@ func (m *VStreamResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1687,7 +1692,7 @@ func (m *PrepareRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1697,7 +1702,7 @@ func (m *PrepareRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1707,7 +1712,7 @@ func (m *PrepareRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1751,7 +1756,7 @@ func (m *PrepareResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -1762,7 +1767,7 @@ func (m *PrepareResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1772,7 +1777,7 @@ func (m *PrepareResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1815,7 +1820,7 @@ func (m *CloseSessionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -1825,7 +1830,7 @@ func (m *CloseSessionRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -1868,24 +1873,13 @@ func (m *CloseSessionResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *Session_ShardSession) SizeVT() (n int) { if m == nil { return 0 @@ -1894,17 +1888,17 @@ func (m *Session_ShardSession) SizeVT() (n int) { _ = l if m.Target != nil { l = m.Target.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionId != 0 { - n += 1 + sov(uint64(m.TransactionId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionId)) } if m.TabletAlias != nil { l = m.TabletAlias.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReservedId != 0 { - n += 1 + sov(uint64(m.ReservedId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReservedId)) } if m.VindexOnly { n += 2 @@ -1925,7 +1919,7 @@ func (m *Session) SizeVT() (n int) { if len(m.ShardSessions) > 0 { for _, e := range m.ShardSessions { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.Autocommit { @@ -1933,38 +1927,38 @@ func (m *Session) SizeVT() (n int) { } l = len(m.TargetString) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Options != nil { l = m.Options.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TransactionMode != 0 { - n += 1 + sov(uint64(m.TransactionMode)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TransactionMode)) } if len(m.Warnings) > 0 { for _, e := range m.Warnings { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.PreSessions) > 0 { for _, e := range m.PreSessions { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.PostSessions) > 0 { for _, e := range m.PostSessions { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.LastInsertId != 0 { - n += 1 + sov(uint64(m.LastInsertId)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.LastInsertId)) } if m.FoundRows != 0 { - n += 1 + sov(uint64(m.FoundRows)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.FoundRows)) } if len(m.UserDefinedVariables) > 0 { for k, v := range m.UserDefinedVariables { @@ -1974,26 +1968,26 @@ func (m *Session) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if len(m.SystemVariables) > 0 { for k, v := range m.SystemVariables { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v))) - n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + len(v) + protohelpers.SizeOfVarint(uint64(len(v))) + n += mapEntrySize + 1 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if m.RowCount != 0 { - n += 1 + sov(uint64(m.RowCount)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.RowCount)) } if len(m.Savepoints) > 0 { for _, s := range m.Savepoints { l = len(s) - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.InReservedConn { @@ -2001,22 +1995,22 @@ func (m *Session) SizeVT() (n int) { } if m.LockSession != nil { l = m.LockSession.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.LastLockHeartbeat != 0 { - n += 2 + sov(uint64(m.LastLockHeartbeat)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.LastLockHeartbeat)) } if m.ReadAfterWrite != nil { l = m.ReadAfterWrite.SizeVT() - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.DDLStrategy) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.SessionUUID) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.EnableSystemSettings { n += 3 @@ -2025,12 +2019,12 @@ func (m *Session) SizeVT() (n int) { for k, v := range m.AdvisoryLock { _ = k _ = v - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + sov(uint64(v)) - n += mapEntrySize + 2 + sov(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + 1 + protohelpers.SizeOfVarint(uint64(v)) + n += mapEntrySize + 2 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } if m.QueryTimeout != 0 { - n += 2 + sov(uint64(m.QueryTimeout)) + n += 2 + protohelpers.SizeOfVarint(uint64(m.QueryTimeout)) } if len(m.PrepareStatement) > 0 { for k, v := range m.PrepareStatement { @@ -2040,14 +2034,14 @@ func (m *Session) SizeVT() (n int) { if v != nil { l = v.SizeVT() } - l += 1 + sov(uint64(l)) - mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l - n += mapEntrySize + 2 + sov(uint64(mapEntrySize)) + l += 1 + protohelpers.SizeOfVarint(uint64(l)) + mapEntrySize := 1 + len(k) + protohelpers.SizeOfVarint(uint64(len(k))) + l + n += mapEntrySize + 2 + protohelpers.SizeOfVarint(uint64(mapEntrySize)) } } l = len(m.MigrationContext) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 2 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2061,10 +2055,10 @@ func (m *PrepareData) SizeVT() (n int) { _ = l l = len(m.PrepareStatement) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ParamsCount != 0 { - n += 1 + sov(uint64(m.ParamsCount)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ParamsCount)) } n += len(m.unknownFields) return n @@ -2078,7 +2072,7 @@ func (m *ReadAfterWrite) SizeVT() (n int) { _ = l l = len(m.ReadAfterWriteGtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.ReadAfterWriteTimeout != 0 { n += 9 @@ -2098,15 +2092,15 @@ func (m *ExecuteRequest) SizeVT() (n int) { _ = l if m.CallerId != nil { l = m.CallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Session != nil { l = m.Session.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2120,15 +2114,15 @@ func (m *ExecuteResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Session != nil { l = m.Session.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2142,16 +2136,16 @@ func (m *ExecuteBatchRequest) SizeVT() (n int) { _ = l if m.CallerId != nil { l = m.CallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Session != nil { l = m.Session.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Queries) > 0 { for _, e := range m.Queries { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -2166,16 +2160,16 @@ func (m *ExecuteBatchResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Session != nil { l = m.Session.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Results) > 0 { for _, e := range m.Results { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -2190,15 +2184,15 @@ func (m *StreamExecuteRequest) SizeVT() (n int) { _ = l if m.CallerId != nil { l = m.CallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Session != nil { l = m.Session.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2212,11 +2206,11 @@ func (m *StreamExecuteResponse) SizeVT() (n int) { _ = l if m.Result != nil { l = m.Result.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Session != nil { l = m.Session.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2230,11 +2224,11 @@ func (m *ResolveTransactionRequest) SizeVT() (n int) { _ = l if m.CallerId != nil { l = m.CallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Dtid) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2260,22 +2254,28 @@ func (m *VStreamFlags) SizeVT() (n int) { n += 2 } if m.HeartbeatInterval != 0 { - n += 1 + sov(uint64(m.HeartbeatInterval)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.HeartbeatInterval)) } if m.StopOnReshard { n += 2 } l = len(m.Cells) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.CellPreference) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.TabletOrder) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + if m.StreamKeyspaceHeartbeats { + n += 2 + } + if m.IncludeReshardJournalEvents { + n += 2 } n += len(m.unknownFields) return n @@ -2289,22 +2289,22 @@ func (m *VStreamRequest) SizeVT() (n int) { _ = l if m.CallerId != nil { l = m.CallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.TabletType != 0 { - n += 1 + sov(uint64(m.TabletType)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.TabletType)) } if m.Vgtid != nil { l = m.Vgtid.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Filter != nil { l = m.Filter.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Flags != nil { l = m.Flags.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2319,7 +2319,7 @@ func (m *VStreamResponse) SizeVT() (n int) { if len(m.Events) > 0 { for _, e := range m.Events { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -2334,15 +2334,15 @@ func (m *PrepareRequest) SizeVT() (n int) { _ = l if m.CallerId != nil { l = m.CallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Session != nil { l = m.Session.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Query != nil { l = m.Query.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2356,16 +2356,16 @@ func (m *PrepareResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Session != nil { l = m.Session.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Fields) > 0 { for _, e := range m.Fields { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -2380,11 +2380,11 @@ func (m *CloseSessionRequest) SizeVT() (n int) { _ = l if m.CallerId != nil { l = m.CallerId.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Session != nil { l = m.Session.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -2398,18 +2398,12 @@ func (m *CloseSessionResponse) SizeVT() (n int) { _ = l if m.Error != nil { l = m.Error.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2418,7 +2412,7 @@ func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2446,7 +2440,7 @@ func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2459,11 +2453,11 @@ func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2482,7 +2476,7 @@ func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { m.TransactionId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2501,7 +2495,7 @@ func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2514,11 +2508,11 @@ func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2537,7 +2531,7 @@ func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { m.ReservedId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2556,7 +2550,7 @@ func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2571,12 +2565,12 @@ func (m *Session_ShardSession) UnmarshalVT(dAtA []byte) error { m.VindexOnly = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -2599,7 +2593,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2627,7 +2621,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2647,7 +2641,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2660,11 +2654,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2681,7 +2675,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2701,7 +2695,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2715,11 +2709,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2733,7 +2727,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2746,11 +2740,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2769,7 +2763,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { m.TransactionMode = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2788,7 +2782,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2801,11 +2795,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2822,7 +2816,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2835,11 +2829,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2856,7 +2850,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2869,11 +2863,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2890,7 +2884,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { m.LastInsertId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2909,7 +2903,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { m.FoundRows = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2928,7 +2922,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2941,11 +2935,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -2960,7 +2954,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2977,7 +2971,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2991,11 +2985,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -3006,7 +3000,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3019,11 +3013,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -3035,12 +3029,12 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -3057,7 +3051,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3070,11 +3064,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3089,7 +3083,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3106,7 +3100,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3120,11 +3114,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -3135,7 +3129,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLenmapvalue uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3149,11 +3143,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLenmapvalue := int(stringLenmapvalue) if intStringLenmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapvalue := iNdEx + intStringLenmapvalue if postStringIndexmapvalue < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapvalue > l { return io.ErrUnexpectedEOF @@ -3162,12 +3156,12 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { iNdEx = postStringIndexmapvalue } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -3184,7 +3178,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { m.RowCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3203,7 +3197,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3217,11 +3211,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3235,7 +3229,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3255,7 +3249,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3268,11 +3262,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3291,7 +3285,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { m.LastLockHeartbeat = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3310,7 +3304,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3323,11 +3317,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3346,7 +3340,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3360,11 +3354,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3378,7 +3372,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3392,11 +3386,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3410,7 +3404,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3430,7 +3424,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3443,11 +3437,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3462,7 +3456,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3479,7 +3473,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3493,11 +3487,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -3507,7 +3501,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } else if fieldNum == 2 { for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3521,12 +3515,12 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -3543,7 +3537,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { m.QueryTimeout = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3562,7 +3556,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3575,11 +3569,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3594,7 +3588,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3611,7 +3605,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLenmapkey uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3625,11 +3619,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLenmapkey := int(stringLenmapkey) if intStringLenmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postStringIndexmapkey := iNdEx + intStringLenmapkey if postStringIndexmapkey < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postStringIndexmapkey > l { return io.ErrUnexpectedEOF @@ -3640,7 +3634,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var mapmsglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3653,11 +3647,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } } if mapmsglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postmsgIndex := iNdEx + mapmsglen if postmsgIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postmsgIndex > l { return io.ErrUnexpectedEOF @@ -3669,12 +3663,12 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { iNdEx = postmsgIndex } else { iNdEx = entryPreIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > postIndex { return io.ErrUnexpectedEOF @@ -3691,7 +3685,7 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3705,11 +3699,11 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3718,12 +3712,12 @@ func (m *Session) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3746,7 +3740,7 @@ func (m *PrepareData) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3774,7 +3768,7 @@ func (m *PrepareData) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3788,11 +3782,11 @@ func (m *PrepareData) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3806,7 +3800,7 @@ func (m *PrepareData) UnmarshalVT(dAtA []byte) error { m.ParamsCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3820,12 +3814,12 @@ func (m *PrepareData) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3848,7 +3842,7 @@ func (m *ReadAfterWrite) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3876,7 +3870,7 @@ func (m *ReadAfterWrite) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3890,11 +3884,11 @@ func (m *ReadAfterWrite) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -3919,7 +3913,7 @@ func (m *ReadAfterWrite) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3934,12 +3928,12 @@ func (m *ReadAfterWrite) UnmarshalVT(dAtA []byte) error { m.SessionTrackGtids = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -3962,7 +3956,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3990,7 +3984,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4003,11 +3997,11 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4026,7 +4020,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4039,11 +4033,11 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4062,7 +4056,7 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4075,11 +4069,11 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4093,12 +4087,12 @@ func (m *ExecuteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4121,7 +4115,7 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4149,7 +4143,7 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4162,11 +4156,11 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4185,7 +4179,7 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4198,11 +4192,11 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4221,7 +4215,7 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4234,11 +4228,11 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4252,12 +4246,12 @@ func (m *ExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4280,7 +4274,7 @@ func (m *ExecuteBatchRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4308,7 +4302,7 @@ func (m *ExecuteBatchRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4321,11 +4315,11 @@ func (m *ExecuteBatchRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4344,7 +4338,7 @@ func (m *ExecuteBatchRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4357,11 +4351,11 @@ func (m *ExecuteBatchRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4380,7 +4374,7 @@ func (m *ExecuteBatchRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4393,11 +4387,11 @@ func (m *ExecuteBatchRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4409,12 +4403,12 @@ func (m *ExecuteBatchRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4437,7 +4431,7 @@ func (m *ExecuteBatchResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4465,7 +4459,7 @@ func (m *ExecuteBatchResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4478,11 +4472,11 @@ func (m *ExecuteBatchResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4501,7 +4495,7 @@ func (m *ExecuteBatchResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4514,11 +4508,11 @@ func (m *ExecuteBatchResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4537,7 +4531,7 @@ func (m *ExecuteBatchResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4550,11 +4544,11 @@ func (m *ExecuteBatchResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4566,12 +4560,12 @@ func (m *ExecuteBatchResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4594,7 +4588,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4622,7 +4616,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4635,11 +4629,11 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4658,7 +4652,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4671,11 +4665,11 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4694,7 +4688,7 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4707,11 +4701,11 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4725,12 +4719,12 @@ func (m *StreamExecuteRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4753,7 +4747,7 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4781,7 +4775,7 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4794,11 +4788,11 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4817,7 +4811,7 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4830,11 +4824,11 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4848,12 +4842,12 @@ func (m *StreamExecuteResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4876,7 +4870,7 @@ func (m *ResolveTransactionRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4904,7 +4898,7 @@ func (m *ResolveTransactionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4917,11 +4911,11 @@ func (m *ResolveTransactionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4940,7 +4934,7 @@ func (m *ResolveTransactionRequest) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -4954,11 +4948,11 @@ func (m *ResolveTransactionRequest) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -4967,12 +4961,12 @@ func (m *ResolveTransactionRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4995,7 +4989,7 @@ func (m *ResolveTransactionResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5018,12 +5012,12 @@ func (m *ResolveTransactionResponse) UnmarshalVT(dAtA []byte) error { switch fieldNum { default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5046,7 +5040,7 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5074,7 +5068,7 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5094,7 +5088,7 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { m.HeartbeatInterval = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5113,7 +5107,7 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5133,7 +5127,7 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5147,11 +5141,11 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5165,7 +5159,7 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5179,11 +5173,11 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5197,7 +5191,7 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5211,25 +5205,65 @@ func (m *VStreamFlags) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } m.TabletOrder = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StreamKeyspaceHeartbeats", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.StreamKeyspaceHeartbeats = bool(v != 0) + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IncludeReshardJournalEvents", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IncludeReshardJournalEvents = bool(v != 0) default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5252,7 +5286,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5280,7 +5314,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5293,11 +5327,11 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5316,7 +5350,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { m.TabletType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5335,7 +5369,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5348,11 +5382,11 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5371,7 +5405,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5384,11 +5418,11 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5407,7 +5441,7 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5420,11 +5454,11 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5438,12 +5472,12 @@ func (m *VStreamRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5466,7 +5500,7 @@ func (m *VStreamResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5494,7 +5528,7 @@ func (m *VStreamResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5507,11 +5541,11 @@ func (m *VStreamResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5523,12 +5557,12 @@ func (m *VStreamResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5551,7 +5585,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5579,7 +5613,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5592,11 +5626,11 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5615,7 +5649,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5628,11 +5662,11 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5651,7 +5685,7 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5664,11 +5698,11 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5682,12 +5716,12 @@ func (m *PrepareRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5710,7 +5744,7 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5738,7 +5772,7 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5751,11 +5785,11 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5774,7 +5808,7 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5787,11 +5821,11 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5810,7 +5844,7 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5823,11 +5857,11 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5839,12 +5873,12 @@ func (m *PrepareResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5867,7 +5901,7 @@ func (m *CloseSessionRequest) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5895,7 +5929,7 @@ func (m *CloseSessionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5908,11 +5942,11 @@ func (m *CloseSessionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5931,7 +5965,7 @@ func (m *CloseSessionRequest) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5944,11 +5978,11 @@ func (m *CloseSessionRequest) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -5962,12 +5996,12 @@ func (m *CloseSessionRequest) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5990,7 +6024,7 @@ func (m *CloseSessionResponse) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6018,7 +6052,7 @@ func (m *CloseSessionResponse) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -6031,11 +6065,11 @@ func (m *CloseSessionResponse) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -6049,12 +6083,12 @@ func (m *CloseSessionResponse) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -6069,88 +6103,3 @@ func (m *CloseSessionResponse) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/vtgateservice/vtgateservice.pb.go b/go/vt/proto/vtgateservice/vtgateservice.pb.go index fbe32f082e9..165e3c0bbef 100644 --- a/go/vt/proto/vtgateservice/vtgateservice.pb.go +++ b/go/vt/proto/vtgateservice/vtgateservice.pb.go @@ -44,7 +44,7 @@ var file_vtgateservice_proto_rawDesc = []byte{ 0x0a, 0x13, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x0c, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0x8f, 0x04, 0x0a, 0x06, 0x56, 0x69, 0x74, 0x65, 0x73, 0x73, 0x12, 0x3c, 0x0a, + 0x74, 0x6f, 0x32, 0xb0, 0x03, 0x0a, 0x06, 0x56, 0x69, 0x74, 0x65, 0x73, 0x73, 0x12, 0x3c, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, @@ -58,65 +58,56 @@ var file_vtgateservice_proto_rawDesc = []byte{ 0x74, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5d, 0x0a, 0x12, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x21, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x6c, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x56, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x12, 0x16, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x76, - 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, 0x0a, 0x07, 0x50, 0x72, 0x65, - 0x70, 0x61, 0x72, 0x65, 0x12, 0x16, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, - 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x76, - 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, - 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x42, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x76, 0x69, 0x74, 0x65, 0x73, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5a, 0x2a, 0x76, 0x69, - 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, - 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x67, 0x61, 0x74, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x07, 0x56, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x16, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x56, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, 0x0a, 0x07, 0x50, 0x72, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x12, 0x16, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x50, + 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, + 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, + 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x76, 0x74, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x42, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x76, 0x69, 0x74, 0x65, + 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5a, 0x2a, 0x76, + 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, + 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x67, 0x61, + 0x74, 0x65, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var file_vtgateservice_proto_goTypes = []any{ - (*vtgate.ExecuteRequest)(nil), // 0: vtgate.ExecuteRequest - (*vtgate.ExecuteBatchRequest)(nil), // 1: vtgate.ExecuteBatchRequest - (*vtgate.StreamExecuteRequest)(nil), // 2: vtgate.StreamExecuteRequest - (*vtgate.ResolveTransactionRequest)(nil), // 3: vtgate.ResolveTransactionRequest - (*vtgate.VStreamRequest)(nil), // 4: vtgate.VStreamRequest - (*vtgate.PrepareRequest)(nil), // 5: vtgate.PrepareRequest - (*vtgate.CloseSessionRequest)(nil), // 6: vtgate.CloseSessionRequest - (*vtgate.ExecuteResponse)(nil), // 7: vtgate.ExecuteResponse - (*vtgate.ExecuteBatchResponse)(nil), // 8: vtgate.ExecuteBatchResponse - (*vtgate.StreamExecuteResponse)(nil), // 9: vtgate.StreamExecuteResponse - (*vtgate.ResolveTransactionResponse)(nil), // 10: vtgate.ResolveTransactionResponse - (*vtgate.VStreamResponse)(nil), // 11: vtgate.VStreamResponse - (*vtgate.PrepareResponse)(nil), // 12: vtgate.PrepareResponse - (*vtgate.CloseSessionResponse)(nil), // 13: vtgate.CloseSessionResponse + (*vtgate.ExecuteRequest)(nil), // 0: vtgate.ExecuteRequest + (*vtgate.ExecuteBatchRequest)(nil), // 1: vtgate.ExecuteBatchRequest + (*vtgate.StreamExecuteRequest)(nil), // 2: vtgate.StreamExecuteRequest + (*vtgate.VStreamRequest)(nil), // 3: vtgate.VStreamRequest + (*vtgate.PrepareRequest)(nil), // 4: vtgate.PrepareRequest + (*vtgate.CloseSessionRequest)(nil), // 5: vtgate.CloseSessionRequest + (*vtgate.ExecuteResponse)(nil), // 6: vtgate.ExecuteResponse + (*vtgate.ExecuteBatchResponse)(nil), // 7: vtgate.ExecuteBatchResponse + (*vtgate.StreamExecuteResponse)(nil), // 8: vtgate.StreamExecuteResponse + (*vtgate.VStreamResponse)(nil), // 9: vtgate.VStreamResponse + (*vtgate.PrepareResponse)(nil), // 10: vtgate.PrepareResponse + (*vtgate.CloseSessionResponse)(nil), // 11: vtgate.CloseSessionResponse } var file_vtgateservice_proto_depIdxs = []int32{ 0, // 0: vtgateservice.Vitess.Execute:input_type -> vtgate.ExecuteRequest 1, // 1: vtgateservice.Vitess.ExecuteBatch:input_type -> vtgate.ExecuteBatchRequest 2, // 2: vtgateservice.Vitess.StreamExecute:input_type -> vtgate.StreamExecuteRequest - 3, // 3: vtgateservice.Vitess.ResolveTransaction:input_type -> vtgate.ResolveTransactionRequest - 4, // 4: vtgateservice.Vitess.VStream:input_type -> vtgate.VStreamRequest - 5, // 5: vtgateservice.Vitess.Prepare:input_type -> vtgate.PrepareRequest - 6, // 6: vtgateservice.Vitess.CloseSession:input_type -> vtgate.CloseSessionRequest - 7, // 7: vtgateservice.Vitess.Execute:output_type -> vtgate.ExecuteResponse - 8, // 8: vtgateservice.Vitess.ExecuteBatch:output_type -> vtgate.ExecuteBatchResponse - 9, // 9: vtgateservice.Vitess.StreamExecute:output_type -> vtgate.StreamExecuteResponse - 10, // 10: vtgateservice.Vitess.ResolveTransaction:output_type -> vtgate.ResolveTransactionResponse - 11, // 11: vtgateservice.Vitess.VStream:output_type -> vtgate.VStreamResponse - 12, // 12: vtgateservice.Vitess.Prepare:output_type -> vtgate.PrepareResponse - 13, // 13: vtgateservice.Vitess.CloseSession:output_type -> vtgate.CloseSessionResponse - 7, // [7:14] is the sub-list for method output_type - 0, // [0:7] is the sub-list for method input_type + 3, // 3: vtgateservice.Vitess.VStream:input_type -> vtgate.VStreamRequest + 4, // 4: vtgateservice.Vitess.Prepare:input_type -> vtgate.PrepareRequest + 5, // 5: vtgateservice.Vitess.CloseSession:input_type -> vtgate.CloseSessionRequest + 6, // 6: vtgateservice.Vitess.Execute:output_type -> vtgate.ExecuteResponse + 7, // 7: vtgateservice.Vitess.ExecuteBatch:output_type -> vtgate.ExecuteBatchResponse + 8, // 8: vtgateservice.Vitess.StreamExecute:output_type -> vtgate.StreamExecuteResponse + 9, // 9: vtgateservice.Vitess.VStream:output_type -> vtgate.VStreamResponse + 10, // 10: vtgateservice.Vitess.Prepare:output_type -> vtgate.PrepareResponse + 11, // 11: vtgateservice.Vitess.CloseSession:output_type -> vtgate.CloseSessionResponse + 6, // [6:12] is the sub-list for method output_type + 0, // [0:6] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/go/vt/proto/vtgateservice/vtgateservice_grpc.pb.go b/go/vt/proto/vtgateservice/vtgateservice_grpc.pb.go index 44dd83d7f0b..80042781649 100644 --- a/go/vt/proto/vtgateservice/vtgateservice_grpc.pb.go +++ b/go/vt/proto/vtgateservice/vtgateservice_grpc.pb.go @@ -39,9 +39,6 @@ type VitessClient interface { // Use this method if the query returns a large number of rows. // API group: v3 StreamExecute(ctx context.Context, in *vtgate.StreamExecuteRequest, opts ...grpc.CallOption) (Vitess_StreamExecuteClient, error) - // ResolveTransaction resolves a transaction. - // API group: Transactions - ResolveTransaction(ctx context.Context, in *vtgate.ResolveTransactionRequest, opts ...grpc.CallOption) (*vtgate.ResolveTransactionResponse, error) // VStream streams binlog events from the requested sources. VStream(ctx context.Context, in *vtgate.VStreamRequest, opts ...grpc.CallOption) (Vitess_VStreamClient, error) // Prepare is used by the MySQL server plugin as part of supporting prepared statements. @@ -110,15 +107,6 @@ func (x *vitessStreamExecuteClient) Recv() (*vtgate.StreamExecuteResponse, error return m, nil } -func (c *vitessClient) ResolveTransaction(ctx context.Context, in *vtgate.ResolveTransactionRequest, opts ...grpc.CallOption) (*vtgate.ResolveTransactionResponse, error) { - out := new(vtgate.ResolveTransactionResponse) - err := c.cc.Invoke(ctx, "/vtgateservice.Vitess/ResolveTransaction", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *vitessClient) VStream(ctx context.Context, in *vtgate.VStreamRequest, opts ...grpc.CallOption) (Vitess_VStreamClient, error) { stream, err := c.cc.NewStream(ctx, &Vitess_ServiceDesc.Streams[1], "/vtgateservice.Vitess/VStream", opts...) if err != nil { @@ -189,9 +177,6 @@ type VitessServer interface { // Use this method if the query returns a large number of rows. // API group: v3 StreamExecute(*vtgate.StreamExecuteRequest, Vitess_StreamExecuteServer) error - // ResolveTransaction resolves a transaction. - // API group: Transactions - ResolveTransaction(context.Context, *vtgate.ResolveTransactionRequest) (*vtgate.ResolveTransactionResponse, error) // VStream streams binlog events from the requested sources. VStream(*vtgate.VStreamRequest, Vitess_VStreamServer) error // Prepare is used by the MySQL server plugin as part of supporting prepared statements. @@ -216,9 +201,6 @@ func (UnimplementedVitessServer) ExecuteBatch(context.Context, *vtgate.ExecuteBa func (UnimplementedVitessServer) StreamExecute(*vtgate.StreamExecuteRequest, Vitess_StreamExecuteServer) error { return status.Errorf(codes.Unimplemented, "method StreamExecute not implemented") } -func (UnimplementedVitessServer) ResolveTransaction(context.Context, *vtgate.ResolveTransactionRequest) (*vtgate.ResolveTransactionResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ResolveTransaction not implemented") -} func (UnimplementedVitessServer) VStream(*vtgate.VStreamRequest, Vitess_VStreamServer) error { return status.Errorf(codes.Unimplemented, "method VStream not implemented") } @@ -298,24 +280,6 @@ func (x *vitessStreamExecuteServer) Send(m *vtgate.StreamExecuteResponse) error return x.ServerStream.SendMsg(m) } -func _Vitess_ResolveTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(vtgate.ResolveTransactionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(VitessServer).ResolveTransaction(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/vtgateservice.Vitess/ResolveTransaction", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(VitessServer).ResolveTransaction(ctx, req.(*vtgate.ResolveTransactionRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Vitess_VStream_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(vtgate.VStreamRequest) if err := stream.RecvMsg(m); err != nil { @@ -388,10 +352,6 @@ var Vitess_ServiceDesc = grpc.ServiceDesc{ MethodName: "ExecuteBatch", Handler: _Vitess_ExecuteBatch_Handler, }, - { - MethodName: "ResolveTransaction", - Handler: _Vitess_ResolveTransaction_Handler, - }, { MethodName: "Prepare", Handler: _Vitess_Prepare_Handler, diff --git a/go/vt/proto/vtrpc/vtrpc_vtproto.pb.go b/go/vt/proto/vtrpc/vtrpc_vtproto.pb.go index 36fb8ba8627..b518e3bd372 100644 --- a/go/vt/proto/vtrpc/vtrpc_vtproto.pb.go +++ b/go/vt/proto/vtrpc/vtrpc_vtproto.pb.go @@ -1,15 +1,15 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: vtrpc.proto package vtrpc import ( fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" - bits "math/bits" ) const ( @@ -23,11 +23,10 @@ func (m *CallerID) CloneVT() *CallerID { if m == nil { return (*CallerID)(nil) } - r := &CallerID{ - Principal: m.Principal, - Component: m.Component, - Subcomponent: m.Subcomponent, - } + r := new(CallerID) + r.Principal = m.Principal + r.Component = m.Component + r.Subcomponent = m.Subcomponent if rhs := m.Groups; rhs != nil { tmpContainer := make([]string, len(rhs)) copy(tmpContainer, rhs) @@ -48,10 +47,9 @@ func (m *RPCError) CloneVT() *RPCError { if m == nil { return (*RPCError)(nil) } - r := &RPCError{ - Message: m.Message, - Code: m.Code, - } + r := new(RPCError) + r.Message = m.Message + r.Code = m.Code if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -97,7 +95,7 @@ func (m *CallerID) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Groups) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Groups[iNdEx]) copy(dAtA[i:], m.Groups[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Groups[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Groups[iNdEx]))) i-- dAtA[i] = 0x22 } @@ -105,21 +103,21 @@ func (m *CallerID) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Subcomponent) > 0 { i -= len(m.Subcomponent) copy(dAtA[i:], m.Subcomponent) - i = encodeVarint(dAtA, i, uint64(len(m.Subcomponent))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Subcomponent))) i-- dAtA[i] = 0x1a } if len(m.Component) > 0 { i -= len(m.Component) copy(dAtA[i:], m.Component) - i = encodeVarint(dAtA, i, uint64(len(m.Component))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Component))) i-- dAtA[i] = 0x12 } if len(m.Principal) > 0 { i -= len(m.Principal) copy(dAtA[i:], m.Principal) - i = encodeVarint(dAtA, i, uint64(len(m.Principal))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Principal))) i-- dAtA[i] = 0xa } @@ -157,31 +155,20 @@ func (m *RPCError) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Code != 0 { - i = encodeVarint(dAtA, i, uint64(m.Code)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Code)) i-- dAtA[i] = 0x18 } if len(m.Message) > 0 { i -= len(m.Message) copy(dAtA[i:], m.Message) - i = encodeVarint(dAtA, i, uint64(len(m.Message))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Message))) i-- dAtA[i] = 0x12 } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *CallerID) SizeVT() (n int) { if m == nil { return 0 @@ -190,20 +177,20 @@ func (m *CallerID) SizeVT() (n int) { _ = l l = len(m.Principal) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Component) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.Subcomponent) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Groups) > 0 { for _, s := range m.Groups { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } n += len(m.unknownFields) @@ -218,21 +205,15 @@ func (m *RPCError) SizeVT() (n int) { _ = l l = len(m.Message) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.Code != 0 { - n += 1 + sov(uint64(m.Code)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Code)) } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *CallerID) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -241,7 +222,7 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -269,7 +250,7 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -283,11 +264,11 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -301,7 +282,7 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -315,11 +296,11 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -333,7 +314,7 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -347,11 +328,11 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -365,7 +346,7 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -379,11 +360,11 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -392,12 +373,12 @@ func (m *CallerID) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -420,7 +401,7 @@ func (m *RPCError) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -448,7 +429,7 @@ func (m *RPCError) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -462,11 +443,11 @@ func (m *RPCError) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -480,7 +461,7 @@ func (m *RPCError) UnmarshalVT(dAtA []byte) error { m.Code = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -494,12 +475,12 @@ func (m *RPCError) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -514,88 +495,3 @@ func (m *RPCError) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/vttest/vttest_vtproto.pb.go b/go/vt/proto/vttest/vttest_vtproto.pb.go index 82ad7a17e2c..84d4b706a7e 100644 --- a/go/vt/proto/vttest/vttest_vtproto.pb.go +++ b/go/vt/proto/vttest/vttest_vtproto.pb.go @@ -1,15 +1,15 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: vttest.proto package vttest import ( fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" - bits "math/bits" vschema "vitess.io/vitess/go/vt/proto/vschema" ) @@ -24,10 +24,9 @@ func (m *Shard) CloneVT() *Shard { if m == nil { return (*Shard)(nil) } - r := &Shard{ - Name: m.Name, - DbNameOverride: m.DbNameOverride, - } + r := new(Shard) + r.Name = m.Name + r.DbNameOverride = m.DbNameOverride if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -43,11 +42,10 @@ func (m *Keyspace) CloneVT() *Keyspace { if m == nil { return (*Keyspace)(nil) } - r := &Keyspace{ - Name: m.Name, - ReplicaCount: m.ReplicaCount, - RdonlyCount: m.RdonlyCount, - } + r := new(Keyspace) + r.Name = m.Name + r.ReplicaCount = m.ReplicaCount + r.RdonlyCount = m.RdonlyCount if rhs := m.Shards; rhs != nil { tmpContainer := make([]*Shard, len(rhs)) for k, v := range rhs { @@ -70,10 +68,9 @@ func (m *VTTestTopology) CloneVT() *VTTestTopology { if m == nil { return (*VTTestTopology)(nil) } - r := &VTTestTopology{ - RoutingRules: m.RoutingRules.CloneVT(), - MirrorRules: m.MirrorRules.CloneVT(), - } + r := new(VTTestTopology) + r.RoutingRules = m.RoutingRules.CloneVT() + r.MirrorRules = m.MirrorRules.CloneVT() if rhs := m.Keyspaces; rhs != nil { tmpContainer := make([]*Keyspace, len(rhs)) for k, v := range rhs { @@ -130,14 +127,14 @@ func (m *Shard) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.DbNameOverride) > 0 { i -= len(m.DbNameOverride) copy(dAtA[i:], m.DbNameOverride) - i = encodeVarint(dAtA, i, uint64(len(m.DbNameOverride))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.DbNameOverride))) i-- dAtA[i] = 0x12 } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -175,12 +172,12 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.RdonlyCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.RdonlyCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.RdonlyCount)) i-- dAtA[i] = 0x38 } if m.ReplicaCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.ReplicaCount)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ReplicaCount)) i-- dAtA[i] = 0x30 } @@ -191,7 +188,7 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x12 } @@ -199,7 +196,7 @@ func (m *Keyspace) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) - i = encodeVarint(dAtA, i, uint64(len(m.Name))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } @@ -242,7 +239,7 @@ func (m *VTTestTopology) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x22 } @@ -252,7 +249,7 @@ func (m *VTTestTopology) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0x1a } @@ -260,7 +257,7 @@ func (m *VTTestTopology) MarshalToSizedBufferVT(dAtA []byte) (int, error) { for iNdEx := len(m.Cells) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Cells[iNdEx]) copy(dAtA[i:], m.Cells[iNdEx]) - i = encodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Cells[iNdEx]))) i-- dAtA[i] = 0x12 } @@ -272,7 +269,7 @@ func (m *VTTestTopology) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarint(dAtA, i, uint64(size)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) i-- dAtA[i] = 0xa } @@ -280,17 +277,6 @@ func (m *VTTestTopology) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *Shard) SizeVT() (n int) { if m == nil { return 0 @@ -299,11 +285,11 @@ func (m *Shard) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } l = len(m.DbNameOverride) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n @@ -317,19 +303,19 @@ func (m *Keyspace) SizeVT() (n int) { _ = l l = len(m.Name) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if len(m.Shards) > 0 { for _, e := range m.Shards { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.ReplicaCount != 0 { - n += 1 + sov(uint64(m.ReplicaCount)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.ReplicaCount)) } if m.RdonlyCount != 0 { - n += 1 + sov(uint64(m.RdonlyCount)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.RdonlyCount)) } n += len(m.unknownFields) return n @@ -344,33 +330,27 @@ func (m *VTTestTopology) SizeVT() (n int) { if len(m.Keyspaces) > 0 { for _, e := range m.Keyspaces { l = e.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if len(m.Cells) > 0 { for _, s := range m.Cells { l = len(s) - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } if m.RoutingRules != nil { l = m.RoutingRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } if m.MirrorRules != nil { l = m.MirrorRules.SizeVT() - n += 1 + l + sov(uint64(l)) + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *Shard) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -379,7 +359,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -407,7 +387,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -421,11 +401,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -439,7 +419,7 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -453,11 +433,11 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -466,12 +446,12 @@ func (m *Shard) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -494,7 +474,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -522,7 +502,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -536,11 +516,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -554,7 +534,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -567,11 +547,11 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -588,7 +568,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { m.ReplicaCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -607,7 +587,7 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { m.RdonlyCount = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -621,12 +601,12 @@ func (m *Keyspace) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -649,7 +629,7 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -677,7 +657,7 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -690,11 +670,11 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -711,7 +691,7 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -725,11 +705,11 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -743,7 +723,7 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -756,11 +736,11 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -779,7 +759,7 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -792,11 +772,11 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { } } if msglen < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } postIndex := iNdEx + msglen if postIndex < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF @@ -810,12 +790,12 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -830,88 +810,3 @@ func (m *VTTestTopology) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/proto/vttime/cached_size.go b/go/vt/proto/vttime/cached_size.go index e34da16852c..62a6366ba3c 100644 --- a/go/vt/proto/vttime/cached_size.go +++ b/go/vt/proto/vttime/cached_size.go @@ -17,8 +17,6 @@ limitations under the License. package vttime -import hack "vitess.io/vitess/go/hack" - func (cached *Time) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -27,9 +25,5 @@ func (cached *Time) CachedSize(alloc bool) int64 { if alloc { size += int64(64) } - // field unknownFields []byte - { - size += hack.RuntimeAllocSize(int64(cap(cached.unknownFields))) - } return size } diff --git a/go/vt/proto/vttime/vttime_vtproto.pb.go b/go/vt/proto/vttime/vttime_vtproto.pb.go index aa53a902df5..16687011e63 100644 --- a/go/vt/proto/vttime/vttime_vtproto.pb.go +++ b/go/vt/proto/vttime/vttime_vtproto.pb.go @@ -1,15 +1,15 @@ // Code generated by protoc-gen-go-vtproto. DO NOT EDIT. -// protoc-gen-go-vtproto version: v0.5.0 +// protoc-gen-go-vtproto version: v0.6.1-0.20240319094008-0393e58bdf10 // source: vttime.proto package vttime import ( fmt "fmt" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" io "io" - bits "math/bits" ) const ( @@ -23,10 +23,9 @@ func (m *Time) CloneVT() *Time { if m == nil { return (*Time)(nil) } - r := &Time{ - Seconds: m.Seconds, - Nanoseconds: m.Nanoseconds, - } + r := new(Time) + r.Seconds = m.Seconds + r.Nanoseconds = m.Nanoseconds if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -42,10 +41,9 @@ func (m *Duration) CloneVT() *Duration { if m == nil { return (*Duration)(nil) } - r := &Duration{ - Seconds: m.Seconds, - Nanos: m.Nanos, - } + r := new(Duration) + r.Seconds = m.Seconds + r.Nanos = m.Nanos if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) copy(r.unknownFields, m.unknownFields) @@ -88,12 +86,12 @@ func (m *Time) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Nanoseconds != 0 { - i = encodeVarint(dAtA, i, uint64(m.Nanoseconds)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Nanoseconds)) i-- dAtA[i] = 0x10 } if m.Seconds != 0 { - i = encodeVarint(dAtA, i, uint64(m.Seconds)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Seconds)) i-- dAtA[i] = 0x8 } @@ -131,29 +129,18 @@ func (m *Duration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.unknownFields) } if m.Nanos != 0 { - i = encodeVarint(dAtA, i, uint64(m.Nanos)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Nanos)) i-- dAtA[i] = 0x10 } if m.Seconds != 0 { - i = encodeVarint(dAtA, i, uint64(m.Seconds)) + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Seconds)) i-- dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} func (m *Time) SizeVT() (n int) { if m == nil { return 0 @@ -161,10 +148,10 @@ func (m *Time) SizeVT() (n int) { var l int _ = l if m.Seconds != 0 { - n += 1 + sov(uint64(m.Seconds)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Seconds)) } if m.Nanoseconds != 0 { - n += 1 + sov(uint64(m.Nanoseconds)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Nanoseconds)) } n += len(m.unknownFields) return n @@ -177,21 +164,15 @@ func (m *Duration) SizeVT() (n int) { var l int _ = l if m.Seconds != 0 { - n += 1 + sov(uint64(m.Seconds)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Seconds)) } if m.Nanos != 0 { - n += 1 + sov(uint64(m.Nanos)) + n += 1 + protohelpers.SizeOfVarint(uint64(m.Nanos)) } n += len(m.unknownFields) return n } -func sov(x uint64) (n int) { - return (bits.Len64(x|1) + 6) / 7 -} -func soz(x uint64) (n int) { - return sov(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} func (m *Time) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -200,7 +181,7 @@ func (m *Time) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -228,7 +209,7 @@ func (m *Time) UnmarshalVT(dAtA []byte) error { m.Seconds = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -247,7 +228,7 @@ func (m *Time) UnmarshalVT(dAtA []byte) error { m.Nanoseconds = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -261,12 +242,12 @@ func (m *Time) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -289,7 +270,7 @@ func (m *Duration) UnmarshalVT(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -317,7 +298,7 @@ func (m *Duration) UnmarshalVT(dAtA []byte) error { m.Seconds = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -336,7 +317,7 @@ func (m *Duration) UnmarshalVT(dAtA []byte) error { m.Nanos = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflow + return protohelpers.ErrIntOverflow } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -350,12 +331,12 @@ func (m *Duration) UnmarshalVT(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + return protohelpers.ErrInvalidLength } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -370,88 +351,3 @@ func (m *Duration) UnmarshalVT(dAtA []byte) error { } return nil } - -func skip(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflow - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLength - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroup - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLength - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLength = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflow = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroup = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go/vt/schema/ddl_strategy_test.go b/go/vt/schema/ddl_strategy_test.go index f27f0963e80..c394907b98a 100644 --- a/go/vt/schema/ddl_strategy_test.go +++ b/go/vt/schema/ddl_strategy_test.go @@ -328,6 +328,13 @@ func TestParseDDLStrategy(t *testing.T) { runtimeOptions: "", forceCutOverAfter: 3 * time.Minute, }, + { + strategyVariable: "vitess --force-cut-over-after=-1ms", + strategy: DDLStrategyVitess, + options: "--force-cut-over-after=-1ms", + runtimeOptions: "", + forceCutOverAfter: -1 * time.Millisecond, + }, { strategyVariable: "vitess --force-cut-over-after=r3m", strategy: DDLStrategyVitess, diff --git a/go/vt/schemadiff/capability.go b/go/vt/schemadiff/capability.go index cde99ac18c3..9a4010854d7 100644 --- a/go/vt/schemadiff/capability.go +++ b/go/vt/schemadiff/capability.go @@ -61,24 +61,13 @@ func alterOptionCapableOfInstantDDL(alterOption sqlparser.AlterOption, createTab } } - isGeneratedColumn := func(col *sqlparser.ColumnDefinition) (bool, sqlparser.ColumnStorage) { - if col == nil { - return false, 0 - } - if col.Type.Options == nil { - return false, 0 - } - if col.Type.Options.As == nil { - return false, 0 - } - return true, col.Type.Options.Storage - } - colStringStrippedDown := func(col *sqlparser.ColumnDefinition, stripDefault bool, stripEnum bool) string { + colStringStrippedDown := func(col *sqlparser.ColumnDefinition, stripEnum bool) string { strippedCol := sqlparser.Clone(col) - if stripDefault { - strippedCol.Type.Options.Default = nil - strippedCol.Type.Options.DefaultLiteral = false - } + // strip `default` + strippedCol.Type.Options.Default = nil + strippedCol.Type.Options.DefaultLiteral = false + // strip `visibility` + strippedCol.Type.Options.Invisible = nil if stripEnum { strippedCol.Type.EnumValues = nil } @@ -95,15 +84,53 @@ func alterOptionCapableOfInstantDDL(alterOption sqlparser.AlterOption, createTab } return true } + changeModifyColumnCapableOfInstantDDL := func(col *sqlparser.ColumnDefinition, newCol *sqlparser.ColumnDefinition) (bool, error) { + // Check if only diff is change of default. + // We temporarily remove the DEFAULT expression (if any) from both + // table and ALTER statement, and compare the columns: if they're otherwise equal, + // then the only change can be an addition/change/removal of DEFAULT, which + // is instant-table. + tableColDefinition := colStringStrippedDown(col, false) + newColDefinition := colStringStrippedDown(newCol, false) + if tableColDefinition == newColDefinition { + return capableOf(capabilities.InstantChangeColumnDefaultFlavorCapability) + } + // Check if: + // 1. this an ENUM/SET + // 2. and the change is to append values to the end of the list + // 3. and the number of added values does not increase the storage size for the enum/set + // 4. while still not caring about a change in the default value + if len(col.Type.EnumValues) > 0 && len(newCol.Type.EnumValues) > 0 { + // both are enum or set + if !hasPrefix(newCol.Type.EnumValues, col.Type.EnumValues) { + return false, nil + } + // we know the new column definition is identical to, or extends, the old definition. + // Now validate storage: + if strings.EqualFold(col.Type.Type, "enum") { + if len(col.Type.EnumValues) <= 255 && len(newCol.Type.EnumValues) > 255 { + // this increases the SET storage size (1 byte for up to 8 values, 2 bytes beyond) + return false, nil + } + } + if strings.EqualFold(col.Type.Type, "set") { + if (len(col.Type.EnumValues)+7)/8 != (len(newCol.Type.EnumValues)+7)/8 { + // this increases the SET storage size (1 byte for up to 8 values, 2 bytes for 8-15, etc.) + return false, nil + } + } + // Now don't care about change of default: + tableColDefinition := colStringStrippedDown(col, true) + newColDefinition := colStringStrippedDown(newCol, true) + if tableColDefinition == newColDefinition { + return capableOf(capabilities.InstantExpandEnumCapability) + } + } + return false, nil + } + // Up to 8.0.26 we could only ADD COLUMN as last column switch opt := alterOption.(type) { - case *sqlparser.ChangeColumn: - // We do not support INSTANT for renaming a column (ALTER TABLE ...CHANGE) because: - // 1. We discourage column rename - // 2. We do not produce CHANGE statements in declarative diff - // 3. The success of the operation depends on whether the column is referenced by a foreign key - // in another table. Which is a bit too much to compute here. - return false, nil case *sqlparser.AddColumns: if tableHasFulltextIndex { // not supported if the table has a FULLTEXT index @@ -114,7 +141,7 @@ func alterOptionCapableOfInstantDDL(alterOption sqlparser.AlterOption, createTab return false, nil } for _, column := range opt.Columns { - if isGenerated, storage := isGeneratedColumn(column); isGenerated { + if isGenerated, storage := IsGeneratedColumn(column); isGenerated { if storage == sqlparser.StoredStorage { // Adding a generated "STORED" column is unsupported return false, nil @@ -124,6 +151,13 @@ func alterOptionCapableOfInstantDDL(alterOption sqlparser.AlterOption, createTab // Expression default values are not supported return false, nil } + if strings.EqualFold(column.Type.Type, "datetime") { + e := &ColumnDefinitionEntity{ColumnDefinition: column} + if !e.IsNullable() && !e.HasDefault() { + // DATETIME columns must have a default value + return false, nil + } + } } if opt.First || opt.After != nil { // not a "last" column. Only supported as of 8.0.29 @@ -149,7 +183,7 @@ func alterOptionCapableOfInstantDDL(alterOption sqlparser.AlterOption, createTab // not supported if the column is part of an index return false, nil } - if isGenerated, _ := isGeneratedColumn(col); isGenerated { + if isGenerated, _ := IsGeneratedColumn(col); isGenerated { // supported by all 8.0 versions // Note: according to the docs dropping a STORED generated column is not INSTANT-able, // but in practice this is supported. This is why we don't test for STORED here, like @@ -157,49 +191,36 @@ func alterOptionCapableOfInstantDDL(alterOption sqlparser.AlterOption, createTab return capableOf(capabilities.InstantAddDropVirtualColumnFlavorCapability) } return capableOf(capabilities.InstantAddDropColumnFlavorCapability) + case *sqlparser.ChangeColumn: + if opt.First || opt.After != nil { + return false, nil + } + // We do not support INSTANT for renaming a column (ALTER TABLE ...CHANGE) because: + // 1. We discourage column rename + // 2. We do not produce CHANGE statements in declarative diff + // 3. The success of the operation depends on whether the column is referenced by a foreign key + // in another table. Which is a bit too much to compute here. + if opt.OldColumn.Name.String() != opt.NewColDefinition.Name.String() { + return false, nil + } + if col := findColumn(opt.OldColumn.Name.String()); col != nil { + return changeModifyColumnCapableOfInstantDDL(col, opt.NewColDefinition) + } + return false, nil case *sqlparser.ModifyColumn: + if opt.First || opt.After != nil { + return false, nil + } if col := findColumn(opt.NewColDefinition.Name.String()); col != nil { - // Check if only diff is change of default. - // We temporarily remove the DEFAULT expression (if any) from both - // table and ALTER statement, and compare the columns: if they're otherwise equal, - // then the only change can be an addition/change/removal of DEFAULT, which - // is instant-table. - tableColDefinition := colStringStrippedDown(col, true, false) - newColDefinition := colStringStrippedDown(opt.NewColDefinition, true, false) - if tableColDefinition == newColDefinition { - return capableOf(capabilities.InstantChangeColumnDefaultFlavorCapability) - } - // Check if: - // 1. this an ENUM/SET - // 2. and the change is to append values to the end of the list - // 3. and the number of added values does not increase the storage size for the enum/set - // 4. while still not caring about a change in the default value - if len(col.Type.EnumValues) > 0 && len(opt.NewColDefinition.Type.EnumValues) > 0 { - // both are enum or set - if !hasPrefix(opt.NewColDefinition.Type.EnumValues, col.Type.EnumValues) { - return false, nil - } - // we know the new column definition is identical to, or extends, the old definition. - // Now validate storage: - if strings.EqualFold(col.Type.Type, "enum") { - if len(col.Type.EnumValues) <= 255 && len(opt.NewColDefinition.Type.EnumValues) > 255 { - // this increases the SET storage size (1 byte for up to 8 values, 2 bytes beyond) - return false, nil - } - } - if strings.EqualFold(col.Type.Type, "set") { - if (len(col.Type.EnumValues)+7)/8 != (len(opt.NewColDefinition.Type.EnumValues)+7)/8 { - // this increases the SET storage size (1 byte for up to 8 values, 2 bytes for 8-15, etc.) - return false, nil - } - } - // Now don't care about change of default: - tableColDefinition := colStringStrippedDown(col, true, true) - newColDefinition := colStringStrippedDown(opt.NewColDefinition, true, true) - if tableColDefinition == newColDefinition { - return capableOf(capabilities.InstantExpandEnumCapability) - } - } + return changeModifyColumnCapableOfInstantDDL(col, opt.NewColDefinition) + } + return false, nil + case *sqlparser.AlterColumn: + if opt.DropDefault || opt.DefaultLiteral || opt.DefaultVal != nil { + return capableOf(capabilities.InstantChangeColumnDefaultFlavorCapability) + } + if opt.Invisible != nil { + return capableOf(capabilities.InstantChangeColumnVisibilityCapability) } return false, nil default: diff --git a/go/vt/schemadiff/capability_test.go b/go/vt/schemadiff/capability_test.go index ca3387bb1a7..ad9e0507e5a 100644 --- a/go/vt/schemadiff/capability_test.go +++ b/go/vt/schemadiff/capability_test.go @@ -19,6 +19,7 @@ func TestAlterTableCapableOfInstantDDL(t *testing.T) { capabilities.InstantAddDropVirtualColumnFlavorCapability, capabilities.InstantAddDropColumnFlavorCapability, capabilities.InstantChangeColumnDefaultFlavorCapability, + capabilities.InstantChangeColumnVisibilityCapability, capabilities.InstantExpandEnumCapability: return true, nil } @@ -132,6 +133,24 @@ func TestAlterTableCapableOfInstantDDL(t *testing.T) { alter: "alter table t add column i2 int generated always as (i1 + 1) virtual", expectCapableOfInstantDDL: true, }, + { + name: "add nullable datetime column", + create: "create table t(id int, i1 int not null, primary key(id))", + alter: "alter table t add column dt datetime(3)", + expectCapableOfInstantDDL: true, + }, + { + name: "add default null datetime column", + create: "create table t(id int, i1 int not null, primary key(id))", + alter: "alter table t add column dt datetime(3) default null", + expectCapableOfInstantDDL: true, + }, + { + name: "add datetime column without default", + create: "create table t(id int, i1 int not null, primary key(id))", + alter: "alter table t add column dt datetime(3) not null", + expectCapableOfInstantDDL: false, + }, { name: "add stored column", create: "create table t(id int, i1 int not null, primary key(id))", @@ -224,11 +243,23 @@ func TestAlterTableCapableOfInstantDDL(t *testing.T) { expectCapableOfInstantDDL: false, }, { - name: "set column dfault value to null", + name: "set column default value to null", create: "create table t(id int, i1 int, primary key(id))", alter: "alter table t modify column i1 int default null", expectCapableOfInstantDDL: true, }, + { + name: "rearrange column after", + create: "create table t(id int, i1 int, i2 int, primary key(id))", + alter: "alter table t modify column i1 int after i2", + expectCapableOfInstantDDL: false, + }, + { + name: "rearrange column first", + create: "create table t(id int, i1 int, i2 int, primary key(id))", + alter: "alter table t modify column i1 int first", + expectCapableOfInstantDDL: false, + }, // enum/set: { name: "change enum default value", @@ -272,6 +303,48 @@ func TestAlterTableCapableOfInstantDDL(t *testing.T) { alter: "alter table t modify column c1 set('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i')", expectCapableOfInstantDDL: false, }, + { + name: "make a column invisible", + create: "create table t1 (id int, i1 int)", + alter: "alter table t1 modify column i1 int invisible", + expectCapableOfInstantDDL: true, + }, + { + name: "make a column visible", + create: "create table t1 (id int, i1 int)", + alter: "alter table t1 change column i1 i1 int visible", + expectCapableOfInstantDDL: true, + }, + { + name: "make a column visible with rename", + create: "create table t1 (id int, i1 int)", + alter: "alter table t1 change column i1 i2 int visible", + expectCapableOfInstantDDL: false, + }, + { + name: "change column, first", + create: "create table t1 (id int, i1 int, i2 int)", + alter: "alter table t1 change column i1 i1 int first", + expectCapableOfInstantDDL: false, + }, + { + name: "change column, after", + create: "create table t1 (id int, i1 int, i2 int)", + alter: "alter table t1 change column i1 i1 int after i2", + expectCapableOfInstantDDL: false, + }, + { + name: "make a column invisible via SET", + create: "create table t1 (id int, i1 int)", + alter: "alter table t1 alter column i1 set invisible", + expectCapableOfInstantDDL: true, + }, + { + name: "drop column default", + create: "create table t1 (id int, i1 int)", + alter: "alter table t1 alter column i1 drop default", + expectCapableOfInstantDDL: true, + }, } for _, tcase := range tcases { t.Run(tcase.name, func(t *testing.T) { diff --git a/go/vt/schemadiff/column.go b/go/vt/schemadiff/column.go index 7e55192cb06..63181cef9cb 100644 --- a/go/vt/schemadiff/column.go +++ b/go/vt/schemadiff/column.go @@ -20,6 +20,7 @@ import ( "strings" "vitess.io/vitess/go/mysql/collations" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/vt/sqlparser" ) @@ -71,63 +72,100 @@ func NewModifyColumnDiffByDefinition(definition *sqlparser.ColumnDefinition) *Mo } type ColumnDefinitionEntity struct { - columnDefinition *sqlparser.ColumnDefinition + ColumnDefinition *sqlparser.ColumnDefinition + inPK bool // Does this column appear in the primary key? tableCharsetCollate *charsetCollate Env *Environment } -func NewColumnDefinitionEntity(env *Environment, c *sqlparser.ColumnDefinition, tableCharsetCollate *charsetCollate) *ColumnDefinitionEntity { +func NewColumnDefinitionEntity(env *Environment, c *sqlparser.ColumnDefinition, inPK bool, tableCharsetCollate *charsetCollate) *ColumnDefinitionEntity { return &ColumnDefinitionEntity{ - columnDefinition: c, + ColumnDefinition: c, + inPK: inPK, tableCharsetCollate: tableCharsetCollate, Env: env, } } +func (c *ColumnDefinitionEntity) Name() string { + return c.ColumnDefinition.Name.String() +} + +func (c *ColumnDefinitionEntity) NameLowered() string { + return c.ColumnDefinition.Name.Lowered() +} + func (c *ColumnDefinitionEntity) Clone() *ColumnDefinitionEntity { clone := &ColumnDefinitionEntity{ - columnDefinition: sqlparser.Clone(c.columnDefinition), + ColumnDefinition: sqlparser.Clone(c.ColumnDefinition), + inPK: c.inPK, tableCharsetCollate: c.tableCharsetCollate, Env: c.Env, } return clone } +// SetExplicitDefaultAndNull sets: +// - NOT NULL, if the columns is part of the PRIMARY KEY +// - DEFAULT NULL, if the columns is NULLable and no DEFAULT was mentioned +// Normally in schemadiff we work the opposite way: we strive to have the minimal equivalent representation +// of a definition. But this function can be used (often in conjunction with Clone()) to enrich a column definition +// so as to have explicit and authoritative view on any particular column. +func (c *ColumnDefinitionEntity) SetExplicitDefaultAndNull() { + if c.inPK { + // Any column in the primary key is implicitly NOT NULL. + c.ColumnDefinition.Type.Options.Null = ptr.Of(false) + } + if c.ColumnDefinition.Type.Options.Null == nil || *c.ColumnDefinition.Type.Options.Null { + // Nullable column, let'se see if there's already a DEFAULT. + if c.ColumnDefinition.Type.Options.Default == nil { + // nope, let's add a DEFAULT NULL + c.ColumnDefinition.Type.Options.Default = &sqlparser.NullVal{} + } + } +} + // SetExplicitCharsetCollate enriches this column definition with collation and charset. Those may be // already present, or perhaps just one of them is present (in which case we use the one to populate the other), // or both might be missing, in which case we use the table's charset/collation. +// Normally in schemadiff we work the opposite way: we strive to have the minimal equivalent representation +// of a definition. But this function can be used (often in conjunction with Clone()) to enrich a column definition +// so as to have explicit and authoritative view on any particular column. func (c *ColumnDefinitionEntity) SetExplicitCharsetCollate() error { if !c.IsTextual() { return nil } // We will now denormalize the columns charset & collate as needed (if empty, populate from table.) // Normalizing _this_ column definition: - if c.columnDefinition.Type.Charset.Name != "" && c.columnDefinition.Type.Options.Collate == "" { + if c.ColumnDefinition.Type.Charset.Name != "" && c.ColumnDefinition.Type.Options.Collate == "" { // Charset defined without collation. Assign the default collation for that charset. - collation := c.Env.CollationEnv().DefaultCollationForCharset(c.columnDefinition.Type.Charset.Name) + collation := c.Env.CollationEnv().DefaultCollationForCharset(c.ColumnDefinition.Type.Charset.Name) if collation == collations.Unknown { - return &UnknownColumnCharsetCollationError{Column: c.columnDefinition.Name.String(), Charset: c.tableCharsetCollate.charset} + return &UnknownColumnCharsetCollationError{Column: c.ColumnDefinition.Name.String(), Charset: c.tableCharsetCollate.charset} } - c.columnDefinition.Type.Options.Collate = c.Env.CollationEnv().LookupName(collation) + c.ColumnDefinition.Type.Options.Collate = c.Env.CollationEnv().LookupName(collation) } - if c.columnDefinition.Type.Charset.Name == "" && c.columnDefinition.Type.Options.Collate != "" { + if c.ColumnDefinition.Type.Charset.Name == "" && c.ColumnDefinition.Type.Options.Collate != "" { // Column has explicit collation but no charset. We can infer the charset from the collation. - collationID := c.Env.CollationEnv().LookupByName(c.columnDefinition.Type.Options.Collate) + collationID := c.Env.CollationEnv().LookupByName(c.ColumnDefinition.Type.Options.Collate) charset := c.Env.CollationEnv().LookupCharsetName(collationID) if charset == "" { - return &UnknownColumnCollationCharsetError{Column: c.columnDefinition.Name.String(), Collation: c.columnDefinition.Type.Options.Collate} + return &UnknownColumnCollationCharsetError{Column: c.ColumnDefinition.Name.String(), Collation: c.ColumnDefinition.Type.Options.Collate} } - c.columnDefinition.Type.Charset.Name = charset + c.ColumnDefinition.Type.Charset.Name = charset } - if c.columnDefinition.Type.Charset.Name == "" { + if c.ColumnDefinition.Type.Charset.Name == "" { // Still nothing? Assign the table's charset/collation. - c.columnDefinition.Type.Charset.Name = c.tableCharsetCollate.charset - if c.columnDefinition.Type.Options.Collate = c.tableCharsetCollate.collate; c.columnDefinition.Type.Options.Collate == "" { + c.ColumnDefinition.Type.Charset.Name = c.tableCharsetCollate.charset + if c.ColumnDefinition.Type.Options.Collate == "" { + c.ColumnDefinition.Type.Options.Collate = c.tableCharsetCollate.collate + } + if c.ColumnDefinition.Type.Options.Collate = c.tableCharsetCollate.collate; c.ColumnDefinition.Type.Options.Collate == "" { collation := c.Env.CollationEnv().DefaultCollationForCharset(c.tableCharsetCollate.charset) if collation == collations.Unknown { - return &UnknownColumnCharsetCollationError{Column: c.columnDefinition.Name.String(), Charset: c.tableCharsetCollate.charset} + return &UnknownColumnCharsetCollationError{Column: c.ColumnDefinition.Name.String(), Charset: c.tableCharsetCollate.charset} } - c.columnDefinition.Type.Options.Collate = c.Env.CollationEnv().LookupName(collation) + c.ColumnDefinition.Type.Options.Collate = c.Env.CollationEnv().LookupName(collation) } } return nil @@ -168,7 +206,7 @@ func (c *ColumnDefinitionEntity) ColumnDiff( } } - if sqlparser.Equals.RefOfColumnDefinition(cClone.columnDefinition, otherClone.columnDefinition) { + if sqlparser.Equals.RefOfColumnDefinition(cClone.ColumnDefinition, otherClone.ColumnDefinition) { return nil, nil } @@ -181,19 +219,228 @@ func (c *ColumnDefinitionEntity) ColumnDiff( } switch hints.EnumReorderStrategy { case EnumReorderStrategyReject: - otherEnumValuesMap := getEnumValuesMap(otherClone.columnDefinition.Type.EnumValues) - for ordinal, enumValue := range cClone.columnDefinition.Type.EnumValues { + otherEnumValuesMap := getEnumValuesMap(otherClone.ColumnDefinition.Type.EnumValues) + for ordinal, enumValue := range cClone.ColumnDefinition.Type.EnumValues { if otherOrdinal, ok := otherEnumValuesMap[enumValue]; ok { if ordinal != otherOrdinal { - return nil, &EnumValueOrdinalChangedError{Table: tableName, Column: cClone.columnDefinition.Name.String(), Value: enumValue, Ordinal: ordinal, NewOrdinal: otherOrdinal} + return nil, &EnumValueOrdinalChangedError{Table: tableName, Column: cClone.ColumnDefinition.Name.String(), Value: enumValue, Ordinal: ordinal, NewOrdinal: otherOrdinal} } } } } - return NewModifyColumnDiffByDefinition(other.columnDefinition), nil + return NewModifyColumnDiffByDefinition(other.ColumnDefinition), nil +} + +// Type returns the column's type +func (c *ColumnDefinitionEntity) Type() string { + return c.ColumnDefinition.Type.Type } // IsTextual returns true when this column is of textual type, and is capable of having a character set property func (c *ColumnDefinitionEntity) IsTextual() bool { - return charsetTypes[strings.ToLower(c.columnDefinition.Type.Type)] + return charsetTypes[strings.ToLower(c.Type())] +} + +// IsGenerated returns true when this column is generated, and indicates the storage type (virtual/stored) +func IsGeneratedColumn(col *sqlparser.ColumnDefinition) (bool, sqlparser.ColumnStorage) { + if col == nil { + return false, 0 + } + if col.Type.Options == nil { + return false, 0 + } + if col.Type.Options.As == nil { + return false, 0 + } + return true, col.Type.Options.Storage +} + +// IsGenerated returns true when this column is generated, and indicates the storage type (virtual/stored) +func (c *ColumnDefinitionEntity) IsGenerated() bool { + isGenerated, _ := IsGeneratedColumn(c.ColumnDefinition) + return isGenerated +} + +// IsNullable returns true when this column is NULLable +func (c *ColumnDefinitionEntity) IsNullable() bool { + if c.inPK { + return false + } + return c.ColumnDefinition.Type.Options.Null == nil || *c.ColumnDefinition.Type.Options.Null +} + +// IsDefaultNull returns true when this column has DEFAULT NULL +func (c *ColumnDefinitionEntity) IsDefaultNull() bool { + if !c.IsNullable() { + return false + } + _, ok := c.ColumnDefinition.Type.Options.Default.(*sqlparser.NullVal) + return ok +} + +// IsDefaultNull returns true when this column has DEFAULT NULL +func (c *ColumnDefinitionEntity) HasDefault() bool { + if c.ColumnDefinition.Type.Options.Default == nil { + return false + } + if c.IsDefaultNull() { + return true + } + return true +} + +// IsAutoIncrement returns true when this column is AUTO_INCREMENT +func (c *ColumnDefinitionEntity) IsAutoIncrement() bool { + return c.ColumnDefinition.Type.Options.Autoincrement +} + +// IsUnsigned returns true when this column is UNSIGNED +func (c *ColumnDefinitionEntity) IsUnsigned() bool { + return c.ColumnDefinition.Type.Unsigned +} + +// IsNumeric returns true when this column is a numeric type +func (c *ColumnDefinitionEntity) IsIntegralType() bool { + return IsIntegralType(c.Type()) +} + +// IsFloatingPointType returns true when this column is a floating point type +func (c *ColumnDefinitionEntity) IsFloatingPointType() bool { + return IsFloatingPointType(c.Type()) +} + +// IsDecimalType returns true when this column is a decimal type +func (c *ColumnDefinitionEntity) IsDecimalType() bool { + return IsDecimalType(c.Type()) +} + +// HasBlobTypeStorage returns true when this column is a text/blob type +func (c *ColumnDefinitionEntity) HasBlobTypeStorage() bool { + return BlobTypeStorage(c.Type()) != 0 +} + +// Charset returns the column's charset +func (c *ColumnDefinitionEntity) Charset() string { + return c.ColumnDefinition.Type.Charset.Name +} + +// Collate returns the column's collation +func (c *ColumnDefinitionEntity) Collate() string { + return c.ColumnDefinition.Type.Options.Collate +} + +func (c *ColumnDefinitionEntity) EnumValues() []string { + return c.ColumnDefinition.Type.EnumValues +} + +func (c *ColumnDefinitionEntity) HasEnumValues() bool { + return len(c.EnumValues()) > 0 +} + +// EnumValuesOrdinals returns a map of enum values to their ordinals +func (c *ColumnDefinitionEntity) EnumValuesOrdinals() map[string]int { + m := make(map[string]int, len(c.ColumnDefinition.Type.EnumValues)) + for i, enumValue := range c.ColumnDefinition.Type.EnumValues { + m[enumValue] = i + 1 + } + return m +} + +// EnumOrdinalValues returns a map of enum ordinals to their values +func (c *ColumnDefinitionEntity) EnumOrdinalValues() map[int]string { + m := make(map[int]string, len(c.ColumnDefinition.Type.EnumValues)) + for i, enumValue := range c.ColumnDefinition.Type.EnumValues { + // SET and ENUM values are 1 indexed. + m[i+1] = enumValue + } + return m +} + +// Length returns the type length (e.g. 17 for VARCHAR(17), 10 for DECIMAL(10,2), 6 for TIMESTAMP(6), etc.) +func (c *ColumnDefinitionEntity) Length() int { + if c.ColumnDefinition.Type.Length == nil { + return 0 + } + return *c.ColumnDefinition.Type.Length +} + +// Scale returns the type scale (e.g. 2 for DECIMAL(10,2)) +func (c *ColumnDefinitionEntity) Scale() int { + if c.ColumnDefinition.Type.Scale == nil { + return 0 + } + return *c.ColumnDefinition.Type.Scale +} + +// ColumnDefinitionEntityList is a formalized list of ColumnDefinitionEntity, with some +// utility functions. +type ColumnDefinitionEntityList struct { + Entities []*ColumnDefinitionEntity + byName map[string]*ColumnDefinitionEntity +} + +func NewColumnDefinitionEntityList(entities []*ColumnDefinitionEntity) *ColumnDefinitionEntityList { + list := &ColumnDefinitionEntityList{ + Entities: entities, + byName: make(map[string]*ColumnDefinitionEntity), + } + for _, entity := range entities { + list.byName[entity.Name()] = entity + list.byName[entity.NameLowered()] = entity + } + return list +} + +func (l *ColumnDefinitionEntityList) Len() int { + return len(l.Entities) +} + +// Names returns the names of all the columns in this list +func (l *ColumnDefinitionEntityList) Names() []string { + names := make([]string, len(l.Entities)) + for i, entity := range l.Entities { + names[i] = entity.Name() + } + return names +} + +// GetColumn returns the column with the given name, or nil if not found +func (l *ColumnDefinitionEntityList) GetColumn(name string) *ColumnDefinitionEntity { + return l.byName[name] +} + +// Contains returns true when this list contains all the entities from the other list +func (l *ColumnDefinitionEntityList) Contains(other *ColumnDefinitionEntityList) bool { + for _, entity := range other.Entities { + if l.GetColumn(entity.NameLowered()) == nil { + return false + } + } + return true +} + +// Union returns a new ColumnDefinitionEntityList with all the entities from this list and the other list +func (l *ColumnDefinitionEntityList) Union(other *ColumnDefinitionEntityList) *ColumnDefinitionEntityList { + entities := append(l.Entities, other.Entities...) + return NewColumnDefinitionEntityList(entities) +} + +// Clone creates a copy of this list, with copies of the entities +func (l *ColumnDefinitionEntityList) Clone() *ColumnDefinitionEntityList { + entities := make([]*ColumnDefinitionEntity, len(l.Entities)) + for i, entity := range l.Entities { + entities[i] = entity.Clone() + } + return NewColumnDefinitionEntityList(entities) +} + +// Filter returns a new subset ColumnDefinitionEntityList with only the entities that pass the filter +func (l *ColumnDefinitionEntityList) Filter(include func(entity *ColumnDefinitionEntity) bool) *ColumnDefinitionEntityList { + var entities []*ColumnDefinitionEntity + for _, entity := range l.Entities { + if include(entity) { + entities = append(entities, entity) + } + } + return NewColumnDefinitionEntityList(entities) } diff --git a/go/vt/schemadiff/column_test.go b/go/vt/schemadiff/column_test.go new file mode 100644 index 00000000000..f1b8f9e4f75 --- /dev/null +++ b/go/vt/schemadiff/column_test.go @@ -0,0 +1,497 @@ +/* +Copyright 2024 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 schemadiff + +import ( + "fmt" + "testing" + + "golang.org/x/exp/maps" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestColumnFunctions(t *testing.T) { + table := ` + create table t ( + id int, + col1 int, + col2 int not null, + col3 int default null, + col4 int default 1, + COL5 int default 1, + ts1 timestamp, + ts2 timestamp(3) null, + ts3 timestamp(6) not null, + primary key (id) + )` + env := NewTestEnv() + createTableEntity, err := NewCreateTableEntityFromSQL(env, table) + require.NoError(t, err) + m := createTableEntity.ColumnDefinitionEntitiesMap() + for _, col := range m { + col.SetExplicitDefaultAndNull() + err := col.SetExplicitCharsetCollate() + require.NoError(t, err) + } + + t.Run("nullable", func(t *testing.T) { + assert.False(t, m["id"].IsNullable()) + assert.True(t, m["col1"].IsNullable()) + assert.False(t, m["col2"].IsNullable()) + assert.True(t, m["col3"].IsNullable()) + assert.True(t, m["col4"].IsNullable()) + assert.True(t, m["col5"].IsNullable()) + assert.True(t, m["ts1"].IsNullable()) + assert.True(t, m["ts2"].IsNullable()) + assert.False(t, m["ts3"].IsNullable()) + }) + t.Run("default null", func(t *testing.T) { + assert.False(t, m["id"].IsDefaultNull()) + assert.True(t, m["col1"].IsDefaultNull()) + assert.False(t, m["col2"].IsDefaultNull()) + assert.True(t, m["col3"].IsDefaultNull()) + assert.False(t, m["col4"].IsDefaultNull()) + assert.False(t, m["col5"].IsDefaultNull()) + assert.True(t, m["ts1"].IsDefaultNull()) + assert.True(t, m["ts2"].IsDefaultNull()) + assert.False(t, m["ts3"].IsDefaultNull()) + }) + t.Run("has default", func(t *testing.T) { + assert.False(t, m["id"].HasDefault()) + assert.True(t, m["col1"].HasDefault()) + assert.False(t, m["col2"].HasDefault()) + assert.True(t, m["col3"].HasDefault()) + assert.True(t, m["col4"].HasDefault()) + assert.True(t, m["col5"].HasDefault()) + assert.True(t, m["ts1"].HasDefault()) + assert.True(t, m["ts2"].HasDefault()) + assert.False(t, m["ts3"].HasDefault()) + }) +} + +func TestExpands(t *testing.T) { + tcases := []struct { + source string + target string + expands bool + msg string + }{ + { + source: "int", + target: "int", + }, + { + source: "int", + target: "smallint", + }, + { + source: "int", + target: "smallint unsigned", + }, + { + source: "int unsigned", + target: "tinyint", + expands: true, + msg: "source is unsigned, target is signed", + }, + { + source: "int unsigned", + target: "tinyint signed", + expands: true, + msg: "source is unsigned, target is signed", + }, + { + source: "int", + target: "tinyint", + }, + { + source: "int", + target: "bigint", + expands: true, + msg: "increased integer range", + }, + { + source: "int", + target: "bigint unsigned", + expands: true, + msg: "increased integer range", + }, + { + source: "int", + target: "int unsigned", + expands: true, + msg: "target unsigned value exceeds source unsigned value", + }, + { + source: "int unsigned", + target: "int", + expands: true, + msg: "source is unsigned, target is signed", + }, + { + source: "int", + target: "int default null", + }, + { + source: "int default null", + target: "int", + }, + { + source: "int", + target: "int not null", + }, + { + source: "int not null", + target: "int", + expands: true, + msg: "target is NULL-able, source is not", + }, + { + source: "int not null", + target: "int default null", + expands: true, + msg: "target is NULL-able, source is not", + }, + { + source: "float", + target: "int", + }, + { + source: "int", + target: "float", + expands: true, + msg: "target is floating point, source is not", + }, + { + source: "float", + target: "double", + expands: true, + msg: "increased floating point range", + }, + { + source: "decimal(5,2)", + target: "float", + expands: true, + msg: "target is floating point, source is not", + }, + { + source: "int", + target: "decimal", + expands: true, + msg: "target is decimal, source is not", + }, + { + source: "int", + target: "decimal(5,2)", + expands: true, + msg: "increased length", + }, + { + source: "int", + target: "decimal(5,0)", + expands: true, + msg: "increased length", + }, + { + source: "decimal(5,2)", // 123.45 + target: "decimal(3,2)", // 1.23 + }, + { + source: "decimal(5,2)", // 123.45 + target: "decimal(4,1)", // 123.4 + }, + { + source: "decimal(5,2)", // 123.45 + target: "decimal(5,1)", // 1234.5 + expands: true, + msg: "increased decimal range", + }, + { + source: "char(7)", + target: "char(7)", + }, + { + source: "char(7)", + target: "varchar(7)", + }, + { + source: "char(7)", + target: "varchar(5)", + }, + { + source: "char(5)", + target: "varchar(7)", + expands: true, + msg: "increased length", + }, + { + source: "varchar(5)", + target: "char(7)", + expands: true, + msg: "increased length", + }, + { + source: "tinytext", + target: "tinytext", + }, + { + source: "tinytext", + target: "tinyblob", + }, + { + source: "mediumtext", + target: "tinytext", + }, + { + source: "mediumblob", + target: "tinytext", + }, + { + source: "tinytext", + target: "text", + expands: true, + msg: "increased blob range", + }, + { + source: "tinytext", + target: "mediumblob", + expands: true, + msg: "increased blob range", + }, + { + source: "timestamp", + target: "timestamp", + }, + { + source: "timestamp", + target: "time", + }, + { + source: "datetime", + target: "timestamp", + }, + { + source: "datetime", + target: "date", + }, + { + source: "time", + target: "timestamp", + expands: true, + msg: "target is expanded data type of source", + }, + { + source: "timestamp", + target: "datetime", + expands: true, + msg: "target is expanded data type of source", + }, + { + source: "date", + target: "datetime", + expands: true, + msg: "target is expanded data type of source", + }, + { + source: "timestamp", + target: "timestamp(3)", + expands: true, + msg: "increased length", + }, + { + source: "timestamp", + target: "timestamp(6)", + expands: true, + msg: "increased length", + }, + { + source: "timestamp(3)", + target: "timestamp(6)", + expands: true, + msg: "increased length", + }, + { + source: "timestamp(6)", + target: "timestamp(3)", + }, + { + source: "timestamp(6)", + target: "timestamp", + }, + { + source: "timestamp", + target: "time(3)", + expands: true, + msg: "increased length", + }, + { + source: "datetime", + target: "time(3)", + expands: true, + msg: "increased length", + }, + { + source: "enum('a','b')", + target: "enum('a','b')", + }, + { + source: "enum('a','b')", + target: "enum('a')", + }, + { + source: "enum('a','b')", + target: "enum('b')", + expands: true, + msg: "target enum/set expands or reorders source enum/set", + }, + { + source: "enum('a','b')", + target: "enum('a','b','c')", + expands: true, + msg: "target enum/set expands or reorders source enum/set", + }, + { + source: "enum('a','b')", + target: "enum('a','x')", + expands: true, + msg: "target enum/set expands or reorders source enum/set", + }, + { + source: "set('a','b')", + target: "set('a','b')", + }, + { + source: "set('a','b')", + target: "set('a','b','c')", + expands: true, + msg: "target enum/set expands or reorders source enum/set", + }, + } + env := NewTestEnv() + for _, tcase := range tcases { + t.Run(tcase.source+" -> "+tcase.target, func(t *testing.T) { + fromCreateTableSQL := fmt.Sprintf("create table t (col %s)", tcase.source) + from, err := NewCreateTableEntityFromSQL(env, fromCreateTableSQL) + require.NoError(t, err) + + toCreateTableSQL := fmt.Sprintf("create table t (col %s)", tcase.target) + to, err := NewCreateTableEntityFromSQL(env, toCreateTableSQL) + require.NoError(t, err) + + require.Len(t, from.ColumnDefinitionEntities(), 1) + fromCol := from.ColumnDefinitionEntities()[0] + require.Len(t, to.ColumnDefinitionEntities(), 1) + toCol := to.ColumnDefinitionEntities()[0] + + expands, message := ColumnChangeExpandsDataRange(fromCol, toCol) + assert.Equal(t, tcase.expands, expands, message) + if expands { + require.NotEmpty(t, tcase.msg, message) + } + assert.Contains(t, message, tcase.msg) + }) + } +} + +func TestColumnDefinitionEntityList(t *testing.T) { + table := ` + create table t ( + id int, + col1 int, + Col2 int not null, + primary key (id) + )` + env := NewTestEnv() + createTableEntity, err := NewCreateTableEntityFromSQL(env, table) + require.NoError(t, err) + entities := createTableEntity.ColumnDefinitionEntities() + require.NotEmpty(t, entities) + list := NewColumnDefinitionEntityList(entities) + assert.NotNil(t, list.GetColumn("id")) + assert.NotNil(t, list.GetColumn("col1")) + assert.NotNil(t, list.GetColumn("Col2")) + assert.NotNil(t, list.GetColumn("col2")) // we also allow lower case + assert.Nil(t, list.GetColumn("COL2")) + assert.Nil(t, list.GetColumn("ID")) + assert.Nil(t, list.GetColumn("Col1")) + assert.Nil(t, list.GetColumn("col3")) +} + +func TestColumnDefinitionEntityListSubset(t *testing.T) { + table1 := ` + create table t ( + ID int, + col1 int, + Col2 int not null, + primary key (id) + )` + table2 := ` + create table t ( + id int, + Col1 int, + primary key (id) + )` + env := NewTestEnv() + createTableEntity1, err := NewCreateTableEntityFromSQL(env, table1) + require.NoError(t, err) + entities1 := createTableEntity1.ColumnDefinitionEntities() + require.NotEmpty(t, entities1) + list1 := NewColumnDefinitionEntityList(entities1) + + createTableEntity2, err := NewCreateTableEntityFromSQL(env, table2) + require.NoError(t, err) + entities2 := createTableEntity2.ColumnDefinitionEntities() + require.NotEmpty(t, entities2) + list2 := NewColumnDefinitionEntityList(entities2) + + assert.True(t, list1.Contains(list2)) + assert.False(t, list2.Contains(list1)) +} + +func TestColumnDefinitionEntity(t *testing.T) { + table1 := ` + create table t ( + it int, + e enum('a','b','c'), + primary key (id) + )` + env := NewTestEnv() + createTableEntity1, err := NewCreateTableEntityFromSQL(env, table1) + require.NoError(t, err) + entities1 := createTableEntity1.ColumnDefinitionEntities() + require.NotEmpty(t, entities1) + list1 := NewColumnDefinitionEntityList(entities1) + + t.Run("enum", func(t *testing.T) { + enumCol := list1.GetColumn("e") + require.NotNil(t, enumCol) + assert.Equal(t, []string{"'a'", "'b'", "'c'"}, enumCol.EnumValues()) + + { + ordinalsMap := enumCol.EnumValuesOrdinals() + assert.ElementsMatch(t, []int{1, 2, 3}, maps.Values(ordinalsMap)) + assert.ElementsMatch(t, []string{"'a'", "'b'", "'c'"}, maps.Keys(ordinalsMap)) + } + { + valuesMap := enumCol.EnumOrdinalValues() + assert.ElementsMatch(t, []int{1, 2, 3}, maps.Keys(valuesMap)) + assert.ElementsMatch(t, []string{"'a'", "'b'", "'c'"}, maps.Values(valuesMap)) + } + }) +} diff --git a/go/vt/schemadiff/diff_test.go b/go/vt/schemadiff/diff_test.go index d78308c90e0..185d233ef20 100644 --- a/go/vt/schemadiff/diff_test.go +++ b/go/vt/schemadiff/diff_test.go @@ -911,6 +911,17 @@ func TestDiffSchemas(t *testing.T) { "DROP TABLE `t7`", }, }, + { + name: "rename index used by foreign keys", + from: `create table parent (id int primary key); create table t (id int primary key, i int, key i_idx (i), constraint f foreign key (i) references parent(id))`, + to: `create table parent (id int primary key); create table t (id int primary key, i int, key i_alternative (i), constraint f foreign key (i) references parent(id))`, + diffs: []string{ + "alter table t rename index i_idx to i_alternative", + }, + cdiffs: []string{ + "ALTER TABLE `t` RENAME INDEX `i_idx` TO `i_alternative`", + }, + }, // Views { name: "identical views", diff --git a/go/vt/schemadiff/errors.go b/go/vt/schemadiff/errors.go index a941c406be0..c938e736206 100644 --- a/go/vt/schemadiff/errors.go +++ b/go/vt/schemadiff/errors.go @@ -487,3 +487,13 @@ type PartitionSpecNonExclusiveError struct { func (e *PartitionSpecNonExclusiveError) Error() string { return fmt.Sprintf("ALTER TABLE on %s, may only have a single partition spec change, and other changes are not allowed. Found spec: %s; and change: %s", sqlescape.EscapeID(e.Table), sqlparser.CanonicalString(e.PartitionSpec), e.ConflictingStatement) } + +type NonDeterministicDefaultError struct { + Table string + Column string + Function string +} + +func (e *NonDeterministicDefaultError) Error() string { + return fmt.Sprintf("column %s.%s default value uses non-deterministic function: %s", sqlescape.EscapeID(e.Table), sqlescape.EscapeID(e.Column), e.Function) +} diff --git a/go/vt/schemadiff/key.go b/go/vt/schemadiff/key.go new file mode 100644 index 00000000000..865073a5a98 --- /dev/null +++ b/go/vt/schemadiff/key.go @@ -0,0 +1,162 @@ +/* +Copyright 2024 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 schemadiff + +import ( + "vitess.io/vitess/go/vt/sqlparser" +) + +// IndexDefinitionEntity represents an index definition in a CREATE TABLE statement, +// and includes the list of columns that are part of the index. +type IndexDefinitionEntity struct { + IndexDefinition *sqlparser.IndexDefinition + ColumnList *ColumnDefinitionEntityList + Env *Environment +} + +func NewIndexDefinitionEntity(env *Environment, indexDefinition *sqlparser.IndexDefinition, columnDefinitionEntitiesList *ColumnDefinitionEntityList) *IndexDefinitionEntity { + return &IndexDefinitionEntity{ + IndexDefinition: indexDefinition, + ColumnList: columnDefinitionEntitiesList, + Env: env, + } +} + +func (i *IndexDefinitionEntity) Name() string { + return i.IndexDefinition.Info.Name.String() +} + +func (i *IndexDefinitionEntity) NameLowered() string { + return i.IndexDefinition.Info.Name.Lowered() +} + +// Clone returns a copy of this list, with copies of all the entities. +func (i *IndexDefinitionEntity) Clone() *IndexDefinitionEntity { + clone := &IndexDefinitionEntity{ + IndexDefinition: sqlparser.Clone(i.IndexDefinition), + ColumnList: i.ColumnList.Clone(), + Env: i.Env, + } + return clone +} + +func (i *IndexDefinitionEntity) Len() int { + return len(i.IndexDefinition.Columns) +} + +// IsPrimary returns true if the index is a primary key. +func (i *IndexDefinitionEntity) IsPrimary() bool { + return i.IndexDefinition.Info.Type == sqlparser.IndexTypePrimary +} + +// IsUnique returns true if the index is a unique key. +func (i *IndexDefinitionEntity) IsUnique() bool { + return i.IndexDefinition.Info.IsUnique() +} + +// HasNullable returns true if any of the columns in the index are nullable. +func (i *IndexDefinitionEntity) HasNullable() bool { + for _, col := range i.ColumnList.Entities { + if col.IsNullable() { + return true + } + } + return false +} + +// HasFloat returns true if any of the columns in the index are floating point types. +func (i *IndexDefinitionEntity) HasFloat() bool { + for _, col := range i.ColumnList.Entities { + if col.IsFloatingPointType() { + return true + } + } + return false +} + +// HasColumnPrefix returns true if any of the columns in the index have a length prefix. +func (i *IndexDefinitionEntity) HasColumnPrefix() bool { + for _, col := range i.IndexDefinition.Columns { + if col.Length != nil { + return true + } + } + return false +} + +// ColumnNames returns the names of the columns in the index. +func (i *IndexDefinitionEntity) ColumnNames() []string { + names := make([]string, 0, len(i.IndexDefinition.Columns)) + for _, col := range i.IndexDefinition.Columns { + names = append(names, col.Column.String()) + } + return names +} + +// ContainsColumns returns true if the index contains all the columns in the given list. +func (i *IndexDefinitionEntity) ContainsColumns(columns *ColumnDefinitionEntityList) bool { + return i.ColumnList.Contains(columns) +} + +// CoveredByColumns returns true if the index is covered by the given list of columns. +func (i *IndexDefinitionEntity) CoveredByColumns(columns *ColumnDefinitionEntityList) bool { + return columns.Contains(i.ColumnList) +} + +// IndexDefinitionEntityList is a formalized list of IndexDefinitionEntity objects with a few +// utility methods. +type IndexDefinitionEntityList struct { + Entities []*IndexDefinitionEntity +} + +func NewIndexDefinitionEntityList(entities []*IndexDefinitionEntity) *IndexDefinitionEntityList { + return &IndexDefinitionEntityList{ + Entities: entities, + } +} + +func (l *IndexDefinitionEntityList) Len() int { + return len(l.Entities) +} + +// Names returns the names of the indexes in the list. +func (l *IndexDefinitionEntityList) Names() []string { + names := make([]string, len(l.Entities)) + for i, entity := range l.Entities { + names[i] = entity.Name() + } + return names +} + +// SubsetCoveredByColumns returns a new list of indexes that are covered by the given list of columns. +func (l *IndexDefinitionEntityList) SubsetCoveredByColumns(columns *ColumnDefinitionEntityList) *IndexDefinitionEntityList { + var subset []*IndexDefinitionEntity + for _, entity := range l.Entities { + if entity.CoveredByColumns(columns) { + subset = append(subset, entity) + } + } + return NewIndexDefinitionEntityList(subset) +} + +// First returns the first index in the list, or nil if the list is empty. +func (l *IndexDefinitionEntityList) First() *IndexDefinitionEntity { + if len(l.Entities) == 0 { + return nil + } + return l.Entities[0] +} diff --git a/go/vt/schemadiff/key_test.go b/go/vt/schemadiff/key_test.go new file mode 100644 index 00000000000..f11d5589ab3 --- /dev/null +++ b/go/vt/schemadiff/key_test.go @@ -0,0 +1,185 @@ +/* +Copyright 2024 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 schemadiff + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestIndexDefinitionEntityMap(t *testing.T) { + table := ` + create table t ( + id int, + col1 int, + Col2 int not null, + col3 int not null default 3, + f float not null, + v varchar(32), + primary key (id), + unique key ukid (id), + unique key uk1 (col1), + unique key uk2 (Col2), + unique key uk3 (col3), + key k1 (col1), + key k2 (Col2), + key k3 (col3), + key kf (f), + key kf2 (f, Col2), + key kv (v), + key kv1 (v, col1), + key kv2 (v(10), Col2), + unique key uk12 (col1, Col2), + unique key uk21 (col2, Col1), + unique key uk23 (col2, col3), + unique key ukid3 (id, col3) + )` + tcases := []struct { + key string + unique bool + columns []string + nullable bool + float bool + prefix bool + }{ + { + key: "primary", + unique: true, + columns: []string{"id"}, + nullable: false, + }, + { + key: "ukid", + unique: true, + columns: []string{"id"}, + nullable: false, + }, + { + key: "uk1", + unique: true, + columns: []string{"col1"}, + nullable: true, + }, + { + key: "uk2", + unique: true, + columns: []string{"Col2"}, + nullable: false, + }, + { + key: "uk3", + unique: true, + columns: []string{"col3"}, + nullable: false, + }, + { + key: "k1", + unique: false, + columns: []string{"col1"}, + nullable: true, + }, + { + key: "k2", + unique: false, + columns: []string{"Col2"}, + nullable: false, + }, + { + key: "k3", + unique: false, + columns: []string{"col3"}, + nullable: false, + }, + { + key: "kf", + unique: false, + columns: []string{"f"}, + nullable: false, + float: true, + }, + { + key: "kf2", + unique: false, + columns: []string{"f", "Col2"}, + nullable: false, + float: true, + }, + { + key: "kv", + unique: false, + columns: []string{"v"}, + nullable: true, + }, + { + key: "kv1", + unique: false, + columns: []string{"v", "col1"}, + nullable: true, + }, + { + key: "kv2", + unique: false, + columns: []string{"v", "Col2"}, + nullable: true, + prefix: true, + }, + { + key: "uk12", + unique: true, + columns: []string{"col1", "Col2"}, + nullable: true, + }, + { + key: "uk21", + unique: true, + columns: []string{"col2", "Col1"}, + nullable: true, + }, + { + key: "uk23", + unique: true, + columns: []string{"col2", "col3"}, + nullable: false, + }, + { + key: "ukid3", + unique: true, + columns: []string{"id", "col3"}, + nullable: false, + }, + } + env := NewTestEnv() + createTableEntity, err := NewCreateTableEntityFromSQL(env, table) + require.NoError(t, err) + err = createTableEntity.validate() + require.NoError(t, err) + m := createTableEntity.IndexDefinitionEntitiesMap() + require.NotEmpty(t, m) + for _, tcase := range tcases { + t.Run(tcase.key, func(t *testing.T) { + key := m[tcase.key] + require.NotNil(t, key) + assert.Equal(t, tcase.unique, key.IsUnique()) + assert.Equal(t, tcase.columns, key.ColumnNames()) + assert.Equal(t, tcase.nullable, key.HasNullable()) + assert.Equal(t, tcase.float, key.HasFloat()) + assert.Equal(t, tcase.prefix, key.HasColumnPrefix()) + }) + } +} diff --git a/go/vt/schemadiff/mysql.go b/go/vt/schemadiff/mysql.go index 624897e2e43..65adcc1b7a1 100644 --- a/go/vt/schemadiff/mysql.go +++ b/go/vt/schemadiff/mysql.go @@ -21,20 +21,26 @@ var engineCasing = map[string]string{ "MYISAM": "MyISAM", } -var integralTypes = map[string]bool{ - "tinyint": true, - "smallint": true, - "mediumint": true, - "int": true, - "bigint": true, +// integralTypes maps known integer types to their byte storage size +var integralTypes = map[string]int{ + "tinyint": 1, + "smallint": 2, + "mediumint": 3, + "int": 4, + "bigint": 8, } -var floatTypes = map[string]bool{ - "float": true, - "float4": true, - "float8": true, - "double": true, - "real": true, +var floatTypes = map[string]int{ + "float": 4, + "float4": 4, + "float8": 8, + "double": 8, + "real": 8, +} + +var decimalTypes = map[string]bool{ + "decimal": true, + "numeric": true, } var charsetTypes = map[string]bool{ @@ -48,6 +54,56 @@ var charsetTypes = map[string]bool{ "set": true, } +var blobStorageExponent = map[string]int{ + "tinyblob": 8, + "tinytext": 8, + "blob": 16, + "text": 16, + "mediumblob": 24, + "mediumtext": 24, + "longblob": 32, + "longtext": 32, +} + +func IsFloatingPointType(columnType string) bool { + _, ok := floatTypes[columnType] + return ok +} + +func FloatingPointTypeStorage(columnType string) int { + return floatTypes[columnType] +} + func IsIntegralType(columnType string) bool { + _, ok := integralTypes[columnType] + return ok +} + +func IntegralTypeStorage(columnType string) int { return integralTypes[columnType] } + +func IsDecimalType(columnType string) bool { + return decimalTypes[columnType] +} + +func BlobTypeStorage(columnType string) int { + return blobStorageExponent[columnType] +} + +// expandedDataTypes maps some known and difficult-to-compute by INFORMATION_SCHEMA data types which expand other data types. +// For example, in "date:datetime", datetime expands date because it has more precision. In "timestamp:date" date expands timestamp +// because it can contain years not covered by timestamp. +var expandedDataTypes = map[string]bool{ + "time:datetime": true, + "date:datetime": true, + "timestamp:datetime": true, + "time:timestamp": true, + "date:timestamp": true, + "timestamp:date": true, +} + +func IsExpandingDataType(sourceType string, targetType string) bool { + _, ok := expandedDataTypes[sourceType+":"+targetType] + return ok +} diff --git a/go/vt/schemadiff/names.go b/go/vt/schemadiff/names.go index c0878d22eeb..e1d12cc80d4 100644 --- a/go/vt/schemadiff/names.go +++ b/go/vt/schemadiff/names.go @@ -20,6 +20,9 @@ import ( "fmt" "regexp" "strings" + + "vitess.io/vitess/go/textutil" + "vitess.io/vitess/go/vt/sqlparser" ) // constraint name examples: @@ -48,3 +51,47 @@ func ExtractConstraintOriginalName(tableName string, constraintName string) stri return constraintName } + +// newConstraintName generates a new, unique name for a constraint. Our problem is that a MySQL +// constraint's name is unique in the schema (!). And so as we duplicate the original table, we must +// create completely new names for all constraints. +// Moreover, we really want this name to be consistent across all shards. We therefore use a deterministic +// UUIDv5 (SHA) function over the migration UUID, table name, and constraint's _contents_. +// We _also_ include the original constraint name as prefix, as room allows +// for example, if the original constraint name is "check_1", +// we might generate "check_1_cps1okb4uafunfqusi2lp22u3". +// If we then again migrate a table whose constraint name is "check_1_cps1okb4uafunfqusi2lp22u3 " we +// get for example "check_1_19l09s37kbhj4axnzmi10e18k" (hash changes, and we still try to preserve original name) +// +// Furthermore, per bug report https://bugs.mysql.com/bug.php?id=107772, if the user doesn't provide a name for +// their CHECK constraint, then MySQL picks a name in this format _chk_. +// Example: sometable_chk_1 +// Next, when MySQL is asked to RENAME TABLE and sees a constraint with this format, it attempts to rename +// the constraint with the new table's name. This is problematic for Vitess, because we often rename tables to +// very long names, such as _vt_HOLD_394f9e6dfc3d11eca0390a43f95f28a3_20220706091048. +// As we rename the constraint to e.g. `sometable_chk_1_cps1okb4uafunfqusi2lp22u3`, this makes MySQL want to +// call the new constraint something like _vt_HOLD_394f9e6dfc3d11eca0390a43f95f28a3_20220706091048_chk_1_cps1okb4uafunfqusi2lp22u3, +// which exceeds the 64 character limit for table names. Long story short, we also trim down if the constraint seems +// to be auto-generated. +func newConstraintName(tableName string, baseUUID string, constraintDefinition *sqlparser.ConstraintDefinition, hashExists map[string]bool, seed string, oldName string) string { + constraintType := GetConstraintType(constraintDefinition.Details) + + constraintIndicator := constraintIndicatorMap[int(constraintType)] + oldName = ExtractConstraintOriginalName(tableName, oldName) + hash := textutil.UUIDv5Base36(baseUUID, tableName, seed) + for i := 1; hashExists[hash]; i++ { + hash = textutil.UUIDv5Base36(baseUUID, tableName, seed, fmt.Sprintf("%d", i)) + } + hashExists[hash] = true + suffix := "_" + hash + maxAllowedNameLength := maxConstraintNameLength - len(suffix) + newName := oldName + if newName == "" { + newName = constraintIndicator // start with something that looks consistent with MySQL's naming + } + if len(newName) > maxAllowedNameLength { + newName = newName[0:maxAllowedNameLength] + } + newName = newName + suffix + return newName +} diff --git a/go/vt/schemadiff/onlineddl.go b/go/vt/schemadiff/onlineddl.go new file mode 100644 index 00000000000..f02ccb1224d --- /dev/null +++ b/go/vt/schemadiff/onlineddl.go @@ -0,0 +1,778 @@ +/* +Copyright 2022 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 schemadiff + +import ( + "errors" + "fmt" + "math" + "sort" + "strings" + + "vitess.io/vitess/go/mysql/capabilities" + "vitess.io/vitess/go/vt/sqlparser" +) + +var ( + ErrForeignKeyFound = errors.New("Foreign key found") + + copyAlgorithm = sqlparser.AlgorithmValue(sqlparser.CopyStr) +) + +const ( + maxConstraintNameLength = 64 +) + +type ConstraintType int + +const ( + UnknownConstraintType ConstraintType = iota + CheckConstraintType + ForeignKeyConstraintType +) + +var ( + constraintIndicatorMap = map[int]string{ + int(CheckConstraintType): "chk", + int(ForeignKeyConstraintType): "fk", + } +) + +func GetConstraintType(constraintInfo sqlparser.ConstraintInfo) ConstraintType { + if _, ok := constraintInfo.(*sqlparser.CheckConstraintDefinition); ok { + return CheckConstraintType + } + if _, ok := constraintInfo.(*sqlparser.ForeignKeyDefinition); ok { + return ForeignKeyConstraintType + } + return UnknownConstraintType +} + +// ColumnChangeExpandsDataRange sees if target column has any value set/range that is impossible in source column. +func ColumnChangeExpandsDataRange(source *ColumnDefinitionEntity, target *ColumnDefinitionEntity) (bool, string) { + if target.IsNullable() && !source.IsNullable() { + return true, "target is NULL-able, source is not" + } + if target.Length() > source.Length() { + return true, "increased length" + } + if target.Scale() > source.Scale() { + return true, "increased scale" + } + if source.IsUnsigned() && !target.IsUnsigned() { + return true, "source is unsigned, target is signed" + } + if IntegralTypeStorage(target.Type()) > IntegralTypeStorage(source.Type()) && IntegralTypeStorage(source.Type()) != 0 { + return true, "increased integer range" + } + if IntegralTypeStorage(source.Type()) <= IntegralTypeStorage(target.Type()) && + !source.IsUnsigned() && target.IsUnsigned() { + // e.g. INT SIGNED => INT UNSIGNED, INT SIGNED => BIGINT UNSIGNED + return true, "target unsigned value exceeds source unsigned value" + } + if FloatingPointTypeStorage(target.Type()) > FloatingPointTypeStorage(source.Type()) && FloatingPointTypeStorage(source.Type()) != 0 { + return true, "increased floating point range" + } + if target.IsFloatingPointType() && !source.IsFloatingPointType() { + return true, "target is floating point, source is not" + } + if target.IsDecimalType() && !source.IsDecimalType() { + return true, "target is decimal, source is not" + } + if target.IsDecimalType() && source.IsDecimalType() { + if target.Length()-target.Scale() > source.Length()-source.Scale() { + return true, "increased decimal range" + } + } + if IsExpandingDataType(source.Type(), target.Type()) { + return true, "target is expanded data type of source" + } + if BlobTypeStorage(target.Type()) > BlobTypeStorage(source.Type()) && BlobTypeStorage(source.Type()) != 0 { + return true, "increased blob range" + } + if source.Charset() != target.Charset() { + if target.Charset() == "utf8mb4" { + return true, "expand character set to utf8mb4" + } + if strings.HasPrefix(target.Charset(), "utf8") && !strings.HasPrefix(source.Charset(), "utf8") { + // not utf to utf + return true, "expand character set to utf8" + } + } + for _, colType := range []string{"enum", "set"} { + // enums and sets have very similar properties, and are practically identical in our analysis + if source.Type() == colType { + // this is an enum or a set + if target.Type() != colType { + return true, "conversion from enum/set to non-enum/set adds potential values" + } + // target is an enum or a set. See if all values on target exist in source + sourceEnumTokensMap := source.EnumOrdinalValues() + targetEnumTokensMap := target.EnumOrdinalValues() + for k, v := range targetEnumTokensMap { + if sourceEnumTokensMap[k] != v { + return true, "target enum/set expands or reorders source enum/set" + } + } + } + } + return false, "" +} + +// IsValidIterationKey returns true if the key is eligible for Online DDL iteration. +func IsValidIterationKey(key *IndexDefinitionEntity) bool { + if key == nil { + return false + } + if !key.IsUnique() { + return false + } + if key.HasFloat() { + return false + } + if key.HasColumnPrefix() { + return false + } + if key.HasNullable() { + return false + } + return true +} + +// PrioritizedUniqueKeys returns all unique keys on given table, ordered from "best" to "worst", +// for Online DDL purposes. The list of keys includes some that are not eligible for Online DDL +// iteration. +func PrioritizedUniqueKeys(createTableEntity *CreateTableEntity) *IndexDefinitionEntityList { + uniqueKeys := []*IndexDefinitionEntity{} + for _, key := range createTableEntity.IndexDefinitionEntities() { + if !key.IsUnique() { + continue + } + uniqueKeys = append(uniqueKeys, key) + } + sort.SliceStable(uniqueKeys, func(i, j int) bool { + if uniqueKeys[i].IsPrimary() { + // PRIMARY is always first + return true + } + if uniqueKeys[j].IsPrimary() { + // PRIMARY is always first + return false + } + if !uniqueKeys[i].HasNullable() && uniqueKeys[j].HasNullable() { + // Non NULLable comes first + return true + } + if uniqueKeys[i].HasNullable() && !uniqueKeys[j].HasNullable() { + // NULLable come last + return false + } + if !uniqueKeys[i].HasColumnPrefix() && uniqueKeys[j].HasColumnPrefix() { + // Non prefix comes first + return true + } + if uniqueKeys[i].HasColumnPrefix() && !uniqueKeys[j].HasColumnPrefix() { + // Prefix comes last + return false + } + iFirstColEntity := uniqueKeys[i].ColumnList.Entities[0] + jFirstColEntity := uniqueKeys[j].ColumnList.Entities[0] + if iFirstColEntity.IsIntegralType() && !jFirstColEntity.IsIntegralType() { + // Prioritize integers + return true + } + if !iFirstColEntity.IsIntegralType() && jFirstColEntity.IsIntegralType() { + // Prioritize integers + return false + } + if !iFirstColEntity.HasBlobTypeStorage() && jFirstColEntity.HasBlobTypeStorage() { + return true + } + if iFirstColEntity.HasBlobTypeStorage() && !jFirstColEntity.HasBlobTypeStorage() { + return false + } + if !iFirstColEntity.IsTextual() && jFirstColEntity.IsTextual() { + return true + } + if iFirstColEntity.IsTextual() && !jFirstColEntity.IsTextual() { + return false + } + if storageDiff := IntegralTypeStorage(iFirstColEntity.Type()) - IntegralTypeStorage(jFirstColEntity.Type()); storageDiff != 0 { + return storageDiff < 0 + } + if lenDiff := len(uniqueKeys[i].ColumnList.Entities) - len(uniqueKeys[j].ColumnList.Entities); lenDiff != 0 { + return lenDiff < 0 + } + return false + }) + return NewIndexDefinitionEntityList(uniqueKeys) +} + +// RemovedForeignKeyNames returns the names of removed foreign keys, ignoring mere name changes +func RemovedForeignKeyNames(source *CreateTableEntity, target *CreateTableEntity) (names []string, err error) { + if source == nil || target == nil { + return nil, nil + } + diffHints := DiffHints{ + ConstraintNamesStrategy: ConstraintNamesIgnoreAll, + } + diff, err := source.Diff(target, &diffHints) + if err != nil { + return nil, err + } + names = []string{} + validateWalk := func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.DropKey: + if node.Type == sqlparser.ForeignKeyType { + names = append(names, node.Name.String()) + } + } + return true, nil + } + _ = sqlparser.Walk(validateWalk, diff.Statement()) // We never return an error + return names, nil +} + +// AlterTableAnalysis contains useful Online DDL information about an AlterTable statement +type AlterTableAnalysis struct { + ColumnRenameMap map[string]string + DroppedColumnsMap map[string]bool + IsRenameTable bool + IsAutoIncrementChangeRequested bool +} + +// AnalyzeAlter looks for specific changes in the AlterTable statement, that are relevant +// to OnlineDDL/VReplication +func OnlineDDLAlterTableAnalysis(alterTable *sqlparser.AlterTable) *AlterTableAnalysis { + analysis := &AlterTableAnalysis{ + ColumnRenameMap: make(map[string]string), + DroppedColumnsMap: make(map[string]bool), + } + if alterTable == nil { + return analysis + } + for _, opt := range alterTable.AlterOptions { + switch opt := opt.(type) { + case *sqlparser.RenameTableName: + analysis.IsRenameTable = true + case *sqlparser.DropColumn: + analysis.DroppedColumnsMap[opt.Name.Name.String()] = true + case *sqlparser.ChangeColumn: + if opt.OldColumn != nil && opt.NewColDefinition != nil { + oldName := opt.OldColumn.Name.String() + newName := opt.NewColDefinition.Name.String() + analysis.ColumnRenameMap[oldName] = newName + } + case sqlparser.TableOptions: + for _, tableOption := range opt { + if strings.ToUpper(tableOption.Name) == "AUTO_INCREMENT" { + analysis.IsAutoIncrementChangeRequested = true + } + } + } + } + return analysis +} + +// GetExpandedColumnNames is given source and target shared columns, and returns the list of columns whose data type is expanded. +// An expanded data type is one where the target can have a value which the source does not. Examples: +// - any NOT NULL to NULLable (a NULL in the target cannot appear on source) +// - INT -> BIGINT (obvious) +// - BIGINT UNSIGNED -> INT SIGNED (negative values) +// - TIMESTAMP -> TIMESTAMP(3) +// etc. +func GetExpandedColumns( + sourceColumns *ColumnDefinitionEntityList, + targetColumns *ColumnDefinitionEntityList, +) ( + expandedColumns *ColumnDefinitionEntityList, + expandedDescriptions map[string]string, + err error, +) { + if len(sourceColumns.Entities) != len(targetColumns.Entities) { + return nil, nil, fmt.Errorf("source and target columns must be of same length") + } + + expandedEntities := []*ColumnDefinitionEntity{} + expandedDescriptions = map[string]string{} + for i := range sourceColumns.Entities { + // source and target columns assumed to be mapped 1:1, same length + sourceColumn := sourceColumns.Entities[i] + targetColumn := targetColumns.Entities[i] + + if isExpanded, description := ColumnChangeExpandsDataRange(sourceColumn, targetColumn); isExpanded { + expandedEntities = append(expandedEntities, sourceColumn) + expandedDescriptions[sourceColumn.Name()] = description + } + } + return NewColumnDefinitionEntityList(expandedEntities), expandedDescriptions, nil +} + +// AnalyzeSharedColumns returns the intersection of two lists of columns in same order as the first list +func AnalyzeSharedColumns( + sourceColumns, targetColumns *ColumnDefinitionEntityList, + alterTableAnalysis *AlterTableAnalysis, +) ( + sourceSharedColumns *ColumnDefinitionEntityList, + targetSharedColumns *ColumnDefinitionEntityList, + droppedSourceNonGeneratedColumns *ColumnDefinitionEntityList, + sharedColumnsMap map[string]string, +) { + sharedColumnsMap = map[string]string{} + sourceShared := []*ColumnDefinitionEntity{} + targetShared := []*ColumnDefinitionEntity{} + droppedNonGenerated := []*ColumnDefinitionEntity{} + + for _, sourceColumn := range sourceColumns.Entities { + if sourceColumn.IsGenerated() { + continue + } + isDroppedFromSource := false + // Note to a future engineer: you may be tempted to remove this loop based on the + // assumption that the later `targetColumn := targetColumns.GetColumn(expectedTargetName)` + // check is sufficient. It is not. It is possible that a columns was explicitly dropped + // and added (`DROP COLUMN c, ADD COLUMN c INT`) in the same ALTER TABLE statement. + // Without checking the ALTER TABLE statement, we would be fooled to believe that column + // `c` is unchanged in the target, when in fact it was dropped and re-added. + for droppedColumn := range alterTableAnalysis.DroppedColumnsMap { + if strings.EqualFold(sourceColumn.Name(), droppedColumn) { + isDroppedFromSource = true + break + } + } + if isDroppedFromSource { + droppedNonGenerated = append(droppedNonGenerated, sourceColumn) + // Column was dropped, hence cannot be a shared column + continue + } + expectedTargetName := sourceColumn.NameLowered() + if mappedName := alterTableAnalysis.ColumnRenameMap[sourceColumn.Name()]; mappedName != "" { + expectedTargetName = mappedName + } + targetColumn := targetColumns.GetColumn(expectedTargetName) + if targetColumn == nil { + // Column not found in target + droppedNonGenerated = append(droppedNonGenerated, sourceColumn) + continue + } + if targetColumn.IsGenerated() { + // virtual/generated columns are silently skipped. + continue + } + // OK, the column is shared (possibly renamed) between source and target. + sharedColumnsMap[sourceColumn.Name()] = targetColumn.Name() + sourceShared = append(sourceShared, sourceColumn) + targetShared = append(targetShared, targetColumn) + } + return NewColumnDefinitionEntityList(sourceShared), + NewColumnDefinitionEntityList(targetShared), + NewColumnDefinitionEntityList(droppedNonGenerated), + sharedColumnsMap +} + +// KeyAtLeastConstrainedAs returns 'true' when sourceUniqueKey is at least as constrained as targetUniqueKey. +// "More constrained" means the uniqueness constraint is "stronger". Thus, if sourceUniqueKey is as-or-more constrained than targetUniqueKey, then +// rows valid under sourceUniqueKey must also be valid in targetUniqueKey. The opposite is not necessarily so: rows that are valid in targetUniqueKey +// may cause a unique key violation under sourceUniqueKey +func KeyAtLeastConstrainedAs( + sourceUniqueKey *IndexDefinitionEntity, + targetUniqueKey *IndexDefinitionEntity, + columnRenameMap map[string]string, +) bool { + if !sourceUniqueKey.IsUnique() { + return false + } + if !targetUniqueKey.IsUnique() { + return true + } + sourceKeyLengths := map[string]int{} + for _, col := range sourceUniqueKey.IndexDefinition.Columns { + if col.Length == nil { + sourceKeyLengths[col.Column.Lowered()] = math.MaxInt64 + } else { + sourceKeyLengths[col.Column.Lowered()] = *col.Length + } + } + targetKeyLengths := map[string]int{} + for _, col := range targetUniqueKey.IndexDefinition.Columns { + if col.Length == nil { + targetKeyLengths[col.Column.Lowered()] = math.MaxInt64 + } else { + targetKeyLengths[col.Column.Lowered()] = *col.Length + } + } + // source is more constrained than target if every column in source is also in target, order is immaterial + for _, sourceCol := range sourceUniqueKey.ColumnList.Entities { + mappedColName, ok := columnRenameMap[sourceCol.Name()] + if !ok { + mappedColName = sourceCol.NameLowered() + } + targetCol := targetUniqueKey.ColumnList.GetColumn(mappedColName) + if targetCol == nil { + // source can't be more constrained if it covers *more* columns + return false + } + // We now know that sourceCol maps to targetCol + if sourceKeyLengths[sourceCol.NameLowered()] > targetKeyLengths[targetCol.NameLowered()] { + // source column covers a larger prefix than target column. It is therefore less constrained. + return false + } + } + return true +} + +// IntroducedUniqueConstraints returns the unique key constraints added in target. +// This does not necessarily mean that the unique key itself is new, +// rather that there's a new, stricter constraint on a set of columns, that didn't exist before. Example: +// +// before: +// unique key my_key (c1, c2, c3) +// after: +// unique key `other_key`(c1, c2) +// Synopsis: the constraint on (c1, c2) is new; and `other_key` in target table is considered a new key +// +// Order of columns is immaterial to uniqueness of column combination. +func IntroducedUniqueConstraints(sourceUniqueKeys *IndexDefinitionEntityList, targetUniqueKeys *IndexDefinitionEntityList, columnRenameMap map[string]string) *IndexDefinitionEntityList { + introducedUniqueConstraints := []*IndexDefinitionEntity{} + for _, targetUniqueKey := range targetUniqueKeys.Entities { + foundSourceKeyAtLeastAsConstrained := func() bool { + for _, sourceUniqueKey := range sourceUniqueKeys.Entities { + if KeyAtLeastConstrainedAs(sourceUniqueKey, targetUniqueKey, columnRenameMap) { + // target key does not add a new constraint + return true + } + } + return false + } + if !foundSourceKeyAtLeastAsConstrained() { + introducedUniqueConstraints = append(introducedUniqueConstraints, targetUniqueKey) + } + } + return NewIndexDefinitionEntityList(introducedUniqueConstraints) +} + +// RemovedUniqueConstraints returns the list of unique key constraints _removed_ going from source to target. +func RemovedUniqueConstraints(sourceUniqueKeys *IndexDefinitionEntityList, targetUniqueKeys *IndexDefinitionEntityList, columnRenameMap map[string]string) *IndexDefinitionEntityList { + reverseColumnRenameMap := map[string]string{} + for k, v := range columnRenameMap { + reverseColumnRenameMap[v] = k + } + return IntroducedUniqueConstraints(targetUniqueKeys, sourceUniqueKeys, reverseColumnRenameMap) +} + +// IterationKeysByColumns returns the Online DDL compliant unique keys from given list, +// whose columns are all covered by the given column list. +func IterationKeysByColumns(keys *IndexDefinitionEntityList, columns *ColumnDefinitionEntityList) *IndexDefinitionEntityList { + subset := []*IndexDefinitionEntity{} + for _, key := range keys.SubsetCoveredByColumns(columns).Entities { + if IsValidIterationKey(key) { + subset = append(subset, key) + } + } + return NewIndexDefinitionEntityList(subset) +} + +// MappedColumnNames +func MappedColumnNames(columnsList *ColumnDefinitionEntityList, columnNamesMap map[string]string) []string { + names := columnsList.Names() + for i := range names { + if mappedName, ok := columnNamesMap[names[i]]; ok { + names[i] = mappedName + } + } + return names +} + +// AlterTableAnalysis contains useful Online DDL information about an AlterTable statement +type MigrationTablesAnalysis struct { + SourceSharedColumns *ColumnDefinitionEntityList + TargetSharedColumns *ColumnDefinitionEntityList + DroppedNoDefaultColumns *ColumnDefinitionEntityList + ExpandedColumns *ColumnDefinitionEntityList + SharedColumnsMap map[string]string + ChosenSourceUniqueKey *IndexDefinitionEntity + ChosenTargetUniqueKey *IndexDefinitionEntity + AddedUniqueKeys *IndexDefinitionEntityList + RemovedUniqueKeys *IndexDefinitionEntityList + RemovedForeignKeyNames []string + IntToEnumMap map[string]bool + SourceAutoIncrement uint64 + RevertibleNotes []string +} + +func OnlineDDLMigrationTablesAnalysis( + sourceCreateTableEntity *CreateTableEntity, + targetCreateTableEntity *CreateTableEntity, + alterTableAnalysis *AlterTableAnalysis, +) (analysis *MigrationTablesAnalysis, err error) { + analysis = &MigrationTablesAnalysis{ + IntToEnumMap: make(map[string]bool), + RevertibleNotes: []string{}, + } + // columns: + generatedColumns := func(columns *ColumnDefinitionEntityList) *ColumnDefinitionEntityList { + return columns.Filter(func(col *ColumnDefinitionEntity) bool { + return col.IsGenerated() + }) + } + noDefaultColumns := func(columns *ColumnDefinitionEntityList) *ColumnDefinitionEntityList { + return columns.Filter(func(col *ColumnDefinitionEntity) bool { + return !col.HasDefault() + }) + } + sourceColumns := sourceCreateTableEntity.ColumnDefinitionEntitiesList() + targetColumns := targetCreateTableEntity.ColumnDefinitionEntitiesList() + + var droppedSourceNonGeneratedColumns *ColumnDefinitionEntityList + analysis.SourceSharedColumns, analysis.TargetSharedColumns, droppedSourceNonGeneratedColumns, analysis.SharedColumnsMap = AnalyzeSharedColumns(sourceColumns, targetColumns, alterTableAnalysis) + + // unique keys + sourceUniqueKeys := PrioritizedUniqueKeys(sourceCreateTableEntity) + if sourceUniqueKeys.Len() == 0 { + return nil, fmt.Errorf("found no possible unique key on `%s`", sourceCreateTableEntity.Name()) + } + + targetUniqueKeys := PrioritizedUniqueKeys(targetCreateTableEntity) + if targetUniqueKeys.Len() == 0 { + return nil, fmt.Errorf("found no possible unique key on `%s`", targetCreateTableEntity.Name()) + } + // VReplication supports completely different unique keys on source and target, covering + // some/completely different columns. The condition is that the key on source + // must use columns which all exist on target table. + eligibleSourceColumnsForUniqueKey := analysis.SourceSharedColumns.Union(generatedColumns(sourceColumns)) + analysis.ChosenSourceUniqueKey = IterationKeysByColumns(sourceUniqueKeys, eligibleSourceColumnsForUniqueKey).First() + if analysis.ChosenSourceUniqueKey == nil { + return nil, fmt.Errorf("found no possible unique key on `%s` whose columns are in target table `%s`", sourceCreateTableEntity.Name(), targetCreateTableEntity.Name()) + } + + eligibleTargetColumnsForUniqueKey := analysis.TargetSharedColumns.Union(generatedColumns(targetColumns)) + analysis.ChosenTargetUniqueKey = IterationKeysByColumns(targetUniqueKeys, eligibleTargetColumnsForUniqueKey).First() + if analysis.ChosenTargetUniqueKey == nil { + return nil, fmt.Errorf("found no possible unique key on `%s` whose columns are in source table `%s`", targetCreateTableEntity.Name(), sourceCreateTableEntity.Name()) + } + + analysis.AddedUniqueKeys = IntroducedUniqueConstraints(sourceUniqueKeys, targetUniqueKeys, alterTableAnalysis.ColumnRenameMap) + analysis.RemovedUniqueKeys = RemovedUniqueConstraints(sourceUniqueKeys, targetUniqueKeys, alterTableAnalysis.ColumnRenameMap) + analysis.RemovedForeignKeyNames, err = RemovedForeignKeyNames(sourceCreateTableEntity, targetCreateTableEntity) + if err != nil { + return nil, err + } + + formalizeColumns := func(columnsLists ...*ColumnDefinitionEntityList) error { + for _, colList := range columnsLists { + for _, col := range colList.Entities { + col.SetExplicitDefaultAndNull() + if err := col.SetExplicitCharsetCollate(); err != nil { + return err + } + } + } + return nil + } + + if err := formalizeColumns(analysis.SourceSharedColumns, analysis.TargetSharedColumns, droppedSourceNonGeneratedColumns); err != nil { + return nil, err + } + + for i := range analysis.SourceSharedColumns.Entities { + sourceColumn := analysis.SourceSharedColumns.Entities[i] + mappedColumn := analysis.TargetSharedColumns.Entities[i] + + if sourceColumn.IsIntegralType() && mappedColumn.Type() == "enum" { + analysis.IntToEnumMap[sourceColumn.Name()] = true + } + } + + analysis.DroppedNoDefaultColumns = noDefaultColumns(droppedSourceNonGeneratedColumns) + var expandedDescriptions map[string]string + analysis.ExpandedColumns, expandedDescriptions, err = GetExpandedColumns(analysis.SourceSharedColumns, analysis.TargetSharedColumns) + if err != nil { + return nil, err + } + + analysis.SourceAutoIncrement, err = sourceCreateTableEntity.AutoIncrementValue() + if err != nil { + return nil, err + } + + for _, uk := range analysis.RemovedUniqueKeys.Names() { + analysis.RevertibleNotes = append(analysis.RevertibleNotes, fmt.Sprintf("unique constraint removed: %s", uk)) + } + for _, name := range analysis.DroppedNoDefaultColumns.Names() { + analysis.RevertibleNotes = append(analysis.RevertibleNotes, fmt.Sprintf("column %s dropped, and had no default value", name)) + } + for _, name := range analysis.ExpandedColumns.Names() { + analysis.RevertibleNotes = append(analysis.RevertibleNotes, fmt.Sprintf("column %s: %s", name, expandedDescriptions[name])) + } + for _, name := range analysis.RemovedForeignKeyNames { + analysis.RevertibleNotes = append(analysis.RevertibleNotes, fmt.Sprintf("foreign key %s dropped", name)) + } + + return analysis, nil +} + +// ValidateAndEditCreateTableStatement inspects the CreateTable AST and does the following: +// - extra validation (no FKs for now...) +// - generate new and unique names for all constraints (CHECK and FK; yes, why not handle FK names; even as we don't support FKs today, we may in the future) +func ValidateAndEditCreateTableStatement(originalTableName string, baseUUID string, createTable *sqlparser.CreateTable, allowForeignKeys bool) (constraintMap map[string]string, err error) { + constraintMap = map[string]string{} + hashExists := map[string]bool{} + + validateWalk := func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.ForeignKeyDefinition: + if !allowForeignKeys { + return false, ErrForeignKeyFound + } + case *sqlparser.ConstraintDefinition: + oldName := node.Name.String() + newName := newConstraintName(originalTableName, baseUUID, node, hashExists, sqlparser.CanonicalString(node.Details), oldName) + node.Name = sqlparser.NewIdentifierCI(newName) + constraintMap[oldName] = newName + } + return true, nil + } + if err := sqlparser.Walk(validateWalk, createTable); err != nil { + return constraintMap, err + } + return constraintMap, nil +} + +// ValidateAndEditAlterTableStatement inspects the AlterTable statement and: +// - modifies any CONSTRAINT name according to given name mapping +// - explode ADD FULLTEXT KEY into multiple statements +func ValidateAndEditAlterTableStatement(originalTableName string, baseUUID string, capableOf capabilities.CapableOf, alterTable *sqlparser.AlterTable, constraintMap map[string]string) (alters []*sqlparser.AlterTable, err error) { + capableOfInstantDDLXtrabackup, err := capableOf(capabilities.InstantDDLXtrabackupCapability) + if err != nil { + return nil, err + } + + hashExists := map[string]bool{} + validateWalk := func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.DropKey: + if node.Type == sqlparser.CheckKeyType || node.Type == sqlparser.ForeignKeyType { + // drop a check or a foreign key constraint + mappedName, ok := constraintMap[node.Name.String()] + if !ok { + return false, fmt.Errorf("Found DROP CONSTRAINT: %v, but could not find constraint name in map", sqlparser.CanonicalString(node)) + } + node.Name = sqlparser.NewIdentifierCI(mappedName) + } + case *sqlparser.AddConstraintDefinition: + oldName := node.ConstraintDefinition.Name.String() + newName := newConstraintName(originalTableName, baseUUID, node.ConstraintDefinition, hashExists, sqlparser.CanonicalString(node.ConstraintDefinition.Details), oldName) + node.ConstraintDefinition.Name = sqlparser.NewIdentifierCI(newName) + constraintMap[oldName] = newName + } + return true, nil + } + if err := sqlparser.Walk(validateWalk, alterTable); err != nil { + return alters, err + } + alters = append(alters, alterTable) + // Handle ADD FULLTEXT KEY statements + countAddFullTextStatements := 0 + redactedOptions := make([]sqlparser.AlterOption, 0, len(alterTable.AlterOptions)) + for i := range alterTable.AlterOptions { + opt := alterTable.AlterOptions[i] + switch opt := opt.(type) { + case sqlparser.AlgorithmValue: + if !capableOfInstantDDLXtrabackup { + // we do not pass ALGORITHM. We choose our own ALGORITHM. + continue + } + case *sqlparser.AddIndexDefinition: + if opt.IndexDefinition.Info.Type == sqlparser.IndexTypeFullText { + countAddFullTextStatements++ + if countAddFullTextStatements > 1 { + // We've already got one ADD FULLTEXT KEY. We can't have another + // in the same statement + extraAlterTable := &sqlparser.AlterTable{ + Table: alterTable.Table, + AlterOptions: []sqlparser.AlterOption{opt}, + } + if !capableOfInstantDDLXtrabackup { + extraAlterTable.AlterOptions = append(extraAlterTable.AlterOptions, copyAlgorithm) + } + alters = append(alters, extraAlterTable) + continue + } + } + } + redactedOptions = append(redactedOptions, opt) + } + alterTable.AlterOptions = redactedOptions + if !capableOfInstantDDLXtrabackup { + alterTable.AlterOptions = append(alterTable.AlterOptions, copyAlgorithm) + } + return alters, nil +} + +// AddInstantAlgorithm adds or modifies the AlterTable's ALGORITHM to INSTANT +func AddInstantAlgorithm(alterTable *sqlparser.AlterTable) { + instantOpt := sqlparser.AlgorithmValue("INSTANT") + for i, opt := range alterTable.AlterOptions { + if _, ok := opt.(sqlparser.AlgorithmValue); ok { + // replace an existing algorithm + alterTable.AlterOptions[i] = instantOpt + return + } + } + // append an algorithm + alterTable.AlterOptions = append(alterTable.AlterOptions, instantOpt) +} + +// DuplicateCreateTable parses the given `CREATE TABLE` statement, and returns: +// - The format CreateTable AST +// - A new CreateTable AST, with the table renamed as `newTableName`, and with constraints renamed deterministically +// - Map of renamed constraints +func DuplicateCreateTable(originalCreateTable *sqlparser.CreateTable, baseUUID string, newTableName string, allowForeignKeys bool) ( + newCreateTable *sqlparser.CreateTable, + constraintMap map[string]string, + err error, +) { + newCreateTable = sqlparser.Clone(originalCreateTable) + newCreateTable.SetTable(newCreateTable.GetTable().Qualifier.CompliantName(), newTableName) + + // If this table has a self-referencing foreign key constraint, ensure the referenced table gets renamed: + renameSelfFK := func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.ConstraintDefinition: + fk, ok := node.Details.(*sqlparser.ForeignKeyDefinition) + if !ok { + return true, nil + } + if referencedTableName := fk.ReferenceDefinition.ReferencedTable.Name.String(); referencedTableName == originalCreateTable.Table.Name.String() { + // This is a self-referencing foreign key + // We need to rename the referenced table as well + fk.ReferenceDefinition.ReferencedTable.Name = sqlparser.NewIdentifierCS(newTableName) + } + } + return true, nil + } + _ = sqlparser.Walk(renameSelfFK, newCreateTable) + + // manipulate CreateTable statement: take care of constraints names which have to be + // unique across the schema + constraintMap, err = ValidateAndEditCreateTableStatement(originalCreateTable.Table.Name.String(), baseUUID, newCreateTable, allowForeignKeys) + if err != nil { + return nil, nil, err + } + return newCreateTable, constraintMap, nil +} diff --git a/go/vt/schemadiff/onlineddl_test.go b/go/vt/schemadiff/onlineddl_test.go new file mode 100644 index 00000000000..834490dca1b --- /dev/null +++ b/go/vt/schemadiff/onlineddl_test.go @@ -0,0 +1,1341 @@ +/* +Copyright 2024 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 schemadiff + +import ( + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql/capabilities" + "vitess.io/vitess/go/vt/sqlparser" +) + +func TestGetConstraintType(t *testing.T) { + { + typ := GetConstraintType(&sqlparser.CheckConstraintDefinition{}) + assert.Equal(t, CheckConstraintType, typ) + } + { + typ := GetConstraintType(&sqlparser.ForeignKeyDefinition{}) + assert.Equal(t, ForeignKeyConstraintType, typ) + } +} + +func TestPrioritizedUniqueKeys(t *testing.T) { + table := ` + create table t ( + idsha varchar(64), + col1 int, + col2 int not null, + col3 bigint not null default 3, + col4 smallint not null, + f float not null, + v varchar(32) not null, + primary key (idsha), + unique key ukidsha (idsha), + unique key uk1 (col1), + unique key uk2 (col2), + unique key uk3 (col3), + key k1 (col1), + key kf (f), + key k1f (col1, f), + key kv (v), + unique key ukv (v), + unique key ukvprefix (v(10)), + unique key uk2vprefix (col2, v(10)), + unique key uk1f (col1, f), + unique key uk41 (col4, col1), + unique key uk42 (col4, col2) + )` + env := NewTestEnv() + createTableEntity, err := NewCreateTableEntityFromSQL(env, table) + require.NoError(t, err) + err = createTableEntity.validate() + require.NoError(t, err) + + keys := PrioritizedUniqueKeys(createTableEntity) + require.NotEmpty(t, keys) + names := make([]string, 0, len(keys.Entities)) + for _, key := range keys.Entities { + names = append(names, key.Name()) + } + expect := []string{ + "PRIMARY", + "uk42", + "uk2", + "uk3", + "ukidsha", + "ukv", + "uk2vprefix", + "ukvprefix", + "uk41", + "uk1", + "uk1f", + } + assert.Equal(t, expect, names) +} + +func TestRemovedForeignKeyNames(t *testing.T) { + env := NewTestEnv() + + tcases := []struct { + before string + after string + names []string + }{ + { + before: "create table t (id int primary key)", + after: "create table t (id2 int primary key, i int)", + }, + { + before: "create table t (id int primary key)", + after: "create table t2 (id2 int primary key, i int)", + }, + { + before: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", + after: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", + }, + { + before: "create table t (id int primary key, i int, constraint f1 foreign key (i) references parent (id) on delete cascade)", + after: "create table t (id int primary key, i int, constraint f2 foreign key (i) references parent (id) on delete cascade)", + }, + { + before: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", + after: "create table t (id int primary key, i int)", + names: []string{"f"}, + }, + { + before: "create table t (id int primary key, i int, i2 int, constraint f1 foreign key (i) references parent (id) on delete cascade, constraint fi2 foreign key (i2) references parent (id) on delete cascade)", + after: "create table t (id int primary key, i int, i2 int, constraint f2 foreign key (i) references parent (id) on delete cascade)", + names: []string{"fi2"}, + }, + { + before: "create table t1 (id int primary key, i int, constraint `check1` CHECK ((`i` < 5)))", + after: "create table t2 (id int primary key, i int)", + }, + } + for _, tcase := range tcases { + t.Run(tcase.before, func(t *testing.T) { + before, err := NewCreateTableEntityFromSQL(env, tcase.before) + require.NoError(t, err) + err = before.validate() + require.NoError(t, err) + + after, err := NewCreateTableEntityFromSQL(env, tcase.after) + require.NoError(t, err) + err = after.validate() + require.NoError(t, err) + + names, err := RemovedForeignKeyNames(before, after) + assert.NoError(t, err) + if tcase.names == nil { + tcase.names = []string{} + } + assert.Equal(t, tcase.names, names) + }) + } +} + +func TestGetAlterTableAnalysis(t *testing.T) { + tcases := []struct { + alter string + renames map[string]string + drops map[string]bool + isrename bool + autoinc bool + }{ + { + alter: "alter table t add column t int, engine=innodb", + }, + { + alter: "alter table t add column t int, change ts ts timestamp, engine=innodb", + renames: map[string]string{"ts": "ts"}, + }, + { + alter: "alter table t AUTO_INCREMENT=7", + autoinc: true, + }, + { + alter: "alter table t add column t int, change ts ts timestamp, auto_increment=7 engine=innodb", + renames: map[string]string{"ts": "ts"}, + autoinc: true, + }, + { + alter: "alter table t add column t int, change ts ts timestamp, CHANGE f `f` float, engine=innodb", + renames: map[string]string{"ts": "ts", "f": "f"}, + }, + { + alter: `alter table t add column b bigint, change f fl float, change i count int, engine=innodb`, + renames: map[string]string{"f": "fl", "i": "count"}, + }, + { + alter: "alter table t add column b bigint, change column `f` fl float, change `i` `count` int, engine=innodb", + renames: map[string]string{"f": "fl", "i": "count"}, + }, + { + alter: "alter table t add column b bigint, change column `f` fl float, change `i` `count` int, change ts ts timestamp, engine=innodb", + renames: map[string]string{"f": "fl", "i": "count", "ts": "ts"}, + }, + { + alter: "alter table t drop column b", + drops: map[string]bool{"b": true}, + }, + { + alter: "alter table t drop column b, drop key c_idx, drop column `d`", + drops: map[string]bool{"b": true, "d": true}, + }, + { + alter: "alter table t drop column b, drop key c_idx, drop column `d`, drop `e`, drop primary key, drop foreign key fk_1", + drops: map[string]bool{"b": true, "d": true, "e": true}, + }, + { + alter: "alter table t rename as something_else", + isrename: true, + }, + { + alter: "alter table t drop column b, rename as something_else", + isrename: true, + drops: map[string]bool{"b": true}, + }, + } + for _, tcase := range tcases { + t.Run(tcase.alter, func(t *testing.T) { + if tcase.renames == nil { + tcase.renames = make(map[string]string) + } + if tcase.drops == nil { + tcase.drops = make(map[string]bool) + } + stmt, err := sqlparser.NewTestParser().ParseStrictDDL(tcase.alter) + require.NoError(t, err) + alter, ok := stmt.(*sqlparser.AlterTable) + require.True(t, ok) + + analysis := OnlineDDLAlterTableAnalysis(alter) + require.NotNil(t, analysis) + assert.Equal(t, tcase.isrename, analysis.IsRenameTable) + assert.Equal(t, tcase.autoinc, analysis.IsAutoIncrementChangeRequested) + assert.Equal(t, tcase.renames, analysis.ColumnRenameMap) + assert.Equal(t, tcase.drops, analysis.DroppedColumnsMap) + }) + } +} + +func TestAnalyzeSharedColumns(t *testing.T) { + sourceTable := ` + create table t ( + id int, + cint int, + cgen1 int generated always as (cint + 1) stored, + cgen2 int generated always as (cint + 2) stored, + cchar char(1), + cremoved int not null default 7, + cnullable int, + cnodefault int not null, + extra1 int, + primary key (id) + ) + ` + targetTable := ` + create table t ( + id int, + cint int, + cgen1 int generated always as (cint + 1) stored, + cchar_alternate char(1), + cnullable int, + cnodefault int not null, + extra2 int, + primary key (id) + ) + ` + tcases := []struct { + name string + sourceTable string + targetTable string + renameMap map[string]string + expectSourceSharedColNames []string + expectTargetSharedColNames []string + expectDroppedSourceNonGeneratedColNames []string + expectSharedColumnsMap map[string]string + }{ + { + name: "rename map empty", + renameMap: map[string]string{}, + expectSourceSharedColNames: []string{"id", "cint", "cnullable", "cnodefault"}, + expectTargetSharedColNames: []string{"id", "cint", "cnullable", "cnodefault"}, + expectDroppedSourceNonGeneratedColNames: []string{"cchar", "cremoved", "extra1"}, + expectSharedColumnsMap: map[string]string{"id": "id", "cint": "cint", "cnullable": "cnullable", "cnodefault": "cnodefault"}, + }, + { + name: "renamed column", + renameMap: map[string]string{"cchar": "cchar_alternate"}, + expectSourceSharedColNames: []string{"id", "cint", "cchar", "cnullable", "cnodefault"}, + expectTargetSharedColNames: []string{"id", "cint", "cchar_alternate", "cnullable", "cnodefault"}, + expectDroppedSourceNonGeneratedColNames: []string{"cremoved", "extra1"}, + expectSharedColumnsMap: map[string]string{"id": "id", "cint": "cint", "cchar": "cchar_alternate", "cnullable": "cnullable", "cnodefault": "cnodefault"}, + }, + } + + env := NewTestEnv() + alterTableAnalysis := OnlineDDLAlterTableAnalysis(nil) // empty + for _, tcase := range tcases { + t.Run(tcase.name, func(t *testing.T) { + if tcase.sourceTable == "" { + tcase.sourceTable = sourceTable + } + if tcase.targetTable == "" { + tcase.targetTable = targetTable + } + if tcase.renameMap != nil { + alterTableAnalysis.ColumnRenameMap = tcase.renameMap + } + + sourceEntity, err := NewCreateTableEntityFromSQL(env, tcase.sourceTable) + require.NoError(t, err) + err = sourceEntity.validate() + require.NoError(t, err) + + targetEntity, err := NewCreateTableEntityFromSQL(env, tcase.targetTable) + require.NoError(t, err) + err = targetEntity.validate() + require.NoError(t, err) + + sourceSharedCols, targetSharedCols, droppedNonGeneratedCols, sharedColumnsMap := AnalyzeSharedColumns( + sourceEntity.ColumnDefinitionEntitiesList(), + targetEntity.ColumnDefinitionEntitiesList(), + alterTableAnalysis, + ) + assert.Equal(t, tcase.expectSourceSharedColNames, sourceSharedCols.Names()) + assert.Equal(t, tcase.expectTargetSharedColNames, targetSharedCols.Names()) + assert.Equal(t, tcase.expectDroppedSourceNonGeneratedColNames, droppedNonGeneratedCols.Names()) + assert.Equal(t, tcase.expectSharedColumnsMap, sharedColumnsMap) + }) + } +} + +func TestKeyAtLeastConstrainedAs(t *testing.T) { + env := NewTestEnv() + sourceTable := ` + create table source_table ( + id int, + c1 int, + c2 int, + c3 int, + c9 int, + v varchar(32), + primary key (id), + unique key uk1 (c1), + unique key uk2 (c2), + unique key uk3 (c3), + unique key uk9 (c9), + unique key uk12 (c1, c2), + unique key uk13 (c1, c3), + unique key uk23 (c2, c3), + unique key uk123 (c1, c2, c3), + unique key uk21 (c2, c1), + unique key ukv (v), + unique key ukv3 (v(3)), + unique key ukv5 (v(5)), + unique key uk2v5 (c2, v(5)) + )` + targetTable := ` + create table target_table ( + id int, + c1 int, + c2 int, + c3_renamed int, + v varchar(32), + primary key (id), + unique key uk1 (c1), + unique key uk2 (c2), + unique key uk3 (c3_renamed), + unique key uk12 (c1, c2), + unique key uk13 (c1, c3_renamed), + unique key uk23 (c2, c3_renamed), + unique key uk123 (c1, c2, c3_renamed), + unique key uk21 (c2, c1), + unique key ukv (v), + unique key ukv3 (v(3)), + unique key ukv5 (v(5)), + unique key uk2v5 (c2, v(5)) + )` + renameMap := map[string]string{ + "c3": "c3_renamed", + } + tcases := []struct { + sourceKey string + targetKey string + renameMap map[string]string + expect bool + }{ + { + sourceKey: "uk1", + targetKey: "uk1", + expect: true, + }, + { + sourceKey: "uk2", + targetKey: "uk2", + expect: true, + }, + { + sourceKey: "uk3", + targetKey: "uk3", + expect: false, // c3 is renamed + }, + { + sourceKey: "uk2", + targetKey: "uk1", + expect: false, + }, + { + sourceKey: "uk12", + targetKey: "uk1", + expect: false, + }, + { + sourceKey: "uk1", + targetKey: "uk12", + expect: true, + }, + { + sourceKey: "uk1", + targetKey: "uk21", + expect: true, + }, + { + sourceKey: "uk12", + targetKey: "uk21", + expect: true, + }, + { + sourceKey: "uk123", + targetKey: "uk21", + expect: false, + }, + { + sourceKey: "uk123", + targetKey: "uk123", + expect: false, // c3 is renamed + }, + { + sourceKey: "uk1", + targetKey: "uk123", + expect: true, // c3 is renamed but not referenced + }, + { + sourceKey: "uk21", + targetKey: "uk123", + expect: true, // c3 is renamed but not referenced + }, + { + sourceKey: "uk9", + targetKey: "uk123", + expect: false, // c9 not in target + }, + { + sourceKey: "uk3", + targetKey: "uk3", + renameMap: renameMap, + expect: true, + }, + { + sourceKey: "uk123", + targetKey: "uk123", + renameMap: renameMap, + expect: true, + }, + { + sourceKey: "uk3", + targetKey: "uk123", + renameMap: renameMap, + expect: true, + }, + { + sourceKey: "ukv", + targetKey: "ukv", + expect: true, + }, + { + sourceKey: "ukv3", + targetKey: "ukv3", + expect: true, + }, + { + sourceKey: "ukv", + targetKey: "ukv3", + expect: false, + }, + { + sourceKey: "ukv5", + targetKey: "ukv3", + expect: false, + }, + { + sourceKey: "ukv3", + targetKey: "ukv5", + expect: true, + }, + { + sourceKey: "ukv3", + targetKey: "ukv", + expect: true, + }, + { + sourceKey: "uk2", + targetKey: "uk2v5", + expect: true, + }, + { + sourceKey: "ukv5", + targetKey: "uk2v5", + expect: true, + }, + { + sourceKey: "ukv3", + targetKey: "uk2v5", + expect: true, + }, + { + sourceKey: "ukv", + targetKey: "uk2v5", + expect: false, + }, + { + sourceKey: "uk2v5", + targetKey: "ukv5", + expect: false, + }, + } + + sourceEntity, err := NewCreateTableEntityFromSQL(env, sourceTable) + require.NoError(t, err) + err = sourceEntity.validate() + require.NoError(t, err) + sourceKeys := sourceEntity.IndexDefinitionEntitiesMap() + + targetEntity, err := NewCreateTableEntityFromSQL(env, targetTable) + require.NoError(t, err) + err = targetEntity.validate() + require.NoError(t, err) + targetKeys := targetEntity.IndexDefinitionEntitiesMap() + + for _, tcase := range tcases { + t.Run(tcase.sourceKey+"/"+tcase.targetKey, func(t *testing.T) { + if tcase.renameMap == nil { + tcase.renameMap = make(map[string]string) + } + sourceKey := sourceKeys[tcase.sourceKey] + require.NotNil(t, sourceKey) + + targetKey := targetKeys[tcase.targetKey] + require.NotNil(t, targetKey) + + result := KeyAtLeastConstrainedAs(sourceKey, targetKey, tcase.renameMap) + assert.Equal(t, tcase.expect, result) + }) + } +} + +func TestIntroducedUniqueConstraints(t *testing.T) { + env := NewTestEnv() + tcases := []struct { + sourceTable string + targetTable string + expectIntroduced []string + expectRemoved []string + }{ + { + sourceTable: ` + create table source_table ( + id int, + c1 int, + c2 int, + c3 int, + primary key (id), + unique key uk1 (c1), + unique key uk2 (c2), + unique key uk31 (c3, c1), + key k1 (c1) + )`, + targetTable: ` + create table source_table ( + id int, + c1 int, + c2 int, + c3 int, + primary key (id), + unique key uk1 (c1), + unique key uk3 (c3), + unique key uk31_alias (c3, c1), + key k2 (c2) + )`, + expectIntroduced: []string{"uk3"}, + expectRemoved: []string{"uk2"}, + }, + { + sourceTable: ` + create table source_table ( + id int, + c1 int, + c2 int, + c3 int, + primary key (id), + unique key uk1 (c1), + unique key uk2 (c2), + unique key uk31 (c3, c1), + key k1 (c1) + )`, + targetTable: ` + create table source_table ( + id int, + c1 int, + c2 int, + c3 int, + primary key (id), + unique key uk1 (c1), + unique key uk3 (c3), + key k2 (c2) + )`, + expectIntroduced: []string{"uk3"}, // uk31 (c3, c1) not considered removed because the new "uk3" is even more constrained + expectRemoved: []string{"uk2"}, + }, + { + sourceTable: ` + create table source_table ( + id int, + c1 int, + c2 int, + v varchar(128), + primary key (id), + unique key uk12 (c1, c2), + unique key ukv5 (v(5)), + key k1 (c1) + )`, + targetTable: ` + create table source_table ( + id int, + c1 int, + c2 int, + c3 int, + v varchar(128), + primary key (id), + unique key uk1v2 (c1, v(2)), + unique key uk1v7 (c1, v(7)), + unique key ukv3 (v(3)), + key k2 (c2) + )`, + expectIntroduced: []string{"uk1v2", "ukv3"}, + expectRemoved: []string{"uk12"}, + }, + } + for _, tcase := range tcases { + t.Run("", func(t *testing.T) { + sourceEntity, err := NewCreateTableEntityFromSQL(env, tcase.sourceTable) + require.NoError(t, err) + err = sourceEntity.validate() + require.NoError(t, err) + sourceUniqueKeys := PrioritizedUniqueKeys(sourceEntity) + + targetEntity, err := NewCreateTableEntityFromSQL(env, tcase.targetTable) + require.NoError(t, err) + err = targetEntity.validate() + require.NoError(t, err) + targetUniqueKeys := PrioritizedUniqueKeys(targetEntity) + + introduced := IntroducedUniqueConstraints(sourceUniqueKeys, targetUniqueKeys, nil) + assert.Equal(t, tcase.expectIntroduced, introduced.Names()) + }) + } +} + +func TestUniqueKeysCoveredByColumns(t *testing.T) { + env := NewTestEnv() + table := ` + create table t ( + id int, + c1 int not null, + c2 int not null, + c3 int not null, + c9 int, + v varchar(32) not null, + primary key (id), + unique key uk1 (c1), + unique key uk3 (c3), + unique key uk9 (c9), + key k3 (c3), + unique key uk12 (c1, c2), + unique key uk13 (c1, c3), + unique key uk23 (c2, c3), + unique key uk123 (c1, c2, c3), + unique key uk21 (c2, c1), + unique key ukv (v), + unique key ukv3 (v(3)), + unique key uk2v5 (c2, v(5)), + unique key uk3v (c3, v) + ) + ` + tcases := []struct { + columns []string + expect []string + }{ + { + columns: []string{"id"}, + expect: []string{"PRIMARY"}, + }, + { + columns: []string{"c1"}, + expect: []string{"uk1"}, + }, + { + columns: []string{"id", "c1"}, + expect: []string{"PRIMARY", "uk1"}, + }, + { + columns: []string{"c1", "id"}, + expect: []string{"PRIMARY", "uk1"}, + }, + { + columns: []string{"c9"}, + expect: []string{}, // nullable column + }, + { + columns: []string{"v"}, + expect: []string{"ukv"}, + }, + { + columns: []string{"v", "c9"}, + expect: []string{"ukv"}, + }, + { + columns: []string{"v", "c2"}, + expect: []string{"ukv"}, + }, + { + columns: []string{"v", "c2", "c3"}, + expect: []string{"uk3", "uk23", "uk3v", "ukv"}, + }, + { + columns: []string{"id", "c1", "c2", "c3", "v"}, + expect: []string{"PRIMARY", "uk1", "uk3", "uk12", "uk13", "uk23", "uk21", "uk3v", "uk123", "ukv"}, + }, + } + + entity, err := NewCreateTableEntityFromSQL(env, table) + require.NoError(t, err) + err = entity.validate() + require.NoError(t, err) + tableColumns := entity.ColumnDefinitionEntitiesList() + tableKeys := PrioritizedUniqueKeys(entity) + assert.Equal(t, []string{ + "PRIMARY", + "uk1", + "uk3", + "uk12", + "uk13", + "uk23", + "uk21", + "uk3v", + "uk123", + "ukv", + "uk2v5", + "ukv3", + "uk9", + }, tableKeys.Names()) + + for _, tcase := range tcases { + t.Run(strings.Join(tcase.columns, ","), func(t *testing.T) { + columns := []*ColumnDefinitionEntity{} + for _, tcaseCol := range tcase.columns { + col := tableColumns.GetColumn(tcaseCol) + require.NotNil(t, col) + columns = append(columns, col) + } + columnsList := NewColumnDefinitionEntityList(columns) + + covered := IterationKeysByColumns(tableKeys, columnsList) + assert.Equal(t, tcase.expect, covered.Names()) + }) + } +} + +func TestRevertible(t *testing.T) { + + type revertibleTestCase struct { + name string + fromSchema string + toSchema string + // expectProblems bool + removedForeignKeyNames string + removedUniqueKeyNames string + droppedNoDefaultColumnNames string + expandedColumnNames string + } + + var testCases = []revertibleTestCase{ + { + name: "identical schemas", + fromSchema: `id int primary key, i1 int not null default 0`, + toSchema: `id int primary key, i2 int not null default 0`, + }, + { + name: "different schemas, nothing to note", + fromSchema: `id int primary key, i1 int not null default 0, unique key i1_uidx(i1)`, + toSchema: `id int primary key, i1 int not null default 0, i2 int not null default 0, unique key i1_uidx(i1)`, + }, + { + name: "removed non-nullable unique key", + fromSchema: `id int primary key, i1 int not null default 0, unique key i1_uidx(i1)`, + toSchema: `id int primary key, i2 int not null default 0`, + removedUniqueKeyNames: `i1_uidx`, + }, + { + name: "removed nullable unique key", + fromSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1)`, + toSchema: `id int primary key, i2 int default null`, + removedUniqueKeyNames: `i1_uidx`, + }, + { + name: "expanding unique key removes unique constraint", + fromSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1)`, + toSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1, id)`, + removedUniqueKeyNames: `i1_uidx`, + }, + { + name: "expanding unique key prefix removes unique constraint", + fromSchema: `id int primary key, v varchar(100) default null, unique key v_uidx(v(20))`, + toSchema: `id int primary key, v varchar(100) default null, unique key v_uidx(v(21))`, + removedUniqueKeyNames: `v_uidx`, + }, + { + name: "reducing unique key does not remove unique constraint", + fromSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1, id)`, + toSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1)`, + removedUniqueKeyNames: ``, + }, + { + name: "reducing unique key does not remove unique constraint", + fromSchema: `id int primary key, v varchar(100) default null, unique key v_uidx(v(21))`, + toSchema: `id int primary key, v varchar(100) default null, unique key v_uidx(v(20))`, + }, + { + name: "removed foreign key", + fromSchema: "id int primary key, i int, constraint some_fk_1 foreign key (i) references parent (id) on delete cascade", + toSchema: "id int primary key, i int", + removedForeignKeyNames: "some_fk_1", + }, + + { + name: "renamed foreign key", + fromSchema: "id int primary key, i int, constraint f1 foreign key (i) references parent (id) on delete cascade", + toSchema: "id int primary key, i int, constraint f2 foreign key (i) references parent (id) on delete cascade", + }, + { + name: "remove column without default", + fromSchema: `id int primary key, i1 int not null, i2 int not null default 0, i3 int default null`, + toSchema: `id int primary key, i4 int not null default 0`, + droppedNoDefaultColumnNames: `i1`, + }, + { + name: "expanded: nullable", + fromSchema: `id int primary key, i1 int not null, i2 int default null`, + toSchema: `id int primary key, i1 int default null, i2 int not null`, + expandedColumnNames: `i1`, + }, + { + name: "expanded: longer text", + fromSchema: `id int primary key, i1 int default null, v1 varchar(40) not null, v2 varchar(5), v3 varchar(3)`, + toSchema: `id int primary key, i1 int not null, v1 varchar(100) not null, v2 char(3), v3 char(5)`, + expandedColumnNames: `v1,v3`, + }, + { + name: "expanded: int numeric precision and scale", + fromSchema: `id int primary key, i1 int, i2 tinyint, i3 mediumint, i4 bigint`, + toSchema: `id int primary key, i1 int, i2 mediumint, i3 int, i4 tinyint`, + expandedColumnNames: `i2,i3`, + }, + { + name: "expanded: floating point", + fromSchema: `id int primary key, i1 int, n2 bigint, n3 bigint, n4 float, n5 double`, + toSchema: `id int primary key, i1 int, n2 float, n3 double, n4 double, n5 float`, + expandedColumnNames: `n2,n3,n4`, + }, + { + name: "expanded: decimal numeric precision and scale", + fromSchema: `id int primary key, i1 int, d1 decimal(10,2), d2 decimal (10,2), d3 decimal (10,2)`, + toSchema: `id int primary key, i1 int, d1 decimal(11,2), d2 decimal (9,1), d3 decimal (10,3)`, + expandedColumnNames: `d1,d3`, + }, + { + name: "expanded: signed, unsigned", + fromSchema: `id int primary key, i1 bigint signed, i2 int unsigned, i3 bigint unsigned`, + toSchema: `id int primary key, i1 int signed, i2 int signed, i3 int signed`, + expandedColumnNames: `i2,i3`, + }, + { + name: "expanded: signed, unsigned: range", + fromSchema: `id int primary key, i1 int signed, i2 bigint signed, i3 int signed`, + toSchema: `id int primary key, i1 int unsigned, i2 int unsigned, i3 bigint unsigned`, + expandedColumnNames: `i1,i3`, + }, + { + name: "expanded: datetime precision", + fromSchema: `id int primary key, dt1 datetime, ts1 timestamp, ti1 time, dt2 datetime(3), dt3 datetime(6), ts2 timestamp(3)`, + toSchema: `id int primary key, dt1 datetime(3), ts1 timestamp(6), ti1 time(3), dt2 datetime(6), dt3 datetime(3), ts2 timestamp`, + expandedColumnNames: `dt1,ts1,ti1,dt2`, + }, + { + name: "expanded: strange data type changes", + fromSchema: `id int primary key, dt1 datetime, ts1 timestamp, i1 int, d1 date, e1 enum('a', 'b')`, + toSchema: `id int primary key, dt1 char(32), ts1 varchar(32), i1 tinytext, d1 char(2), e1 varchar(2)`, + expandedColumnNames: `dt1,ts1,i1,d1,e1`, + }, + { + name: "expanded: temporal types", + fromSchema: `id int primary key, t1 time, t2 timestamp, t3 date, t4 datetime, t5 time, t6 date`, + toSchema: `id int primary key, t1 datetime, t2 datetime, t3 timestamp, t4 timestamp, t5 timestamp, t6 datetime`, + expandedColumnNames: `t1,t2,t3,t5,t6`, + }, + { + name: "expanded: character sets", + fromSchema: `id int primary key, c1 char(3) charset utf8, c2 char(3) charset utf8mb4, c3 char(3) charset ascii, c4 char(3) charset utf8mb4, c5 char(3) charset utf8, c6 char(3) charset latin1`, + toSchema: `id int primary key, c1 char(3) charset utf8mb4, c2 char(3) charset utf8, c3 char(3) charset utf8, c4 char(3) charset ascii, c5 char(3) charset utf8, c6 char(3) charset utf8mb4`, + expandedColumnNames: `c1,c3,c6`, + }, + { + name: "expanded: enum", + fromSchema: `id int primary key, e1 enum('a', 'b'), e2 enum('a', 'b'), e3 enum('a', 'b'), e4 enum('a', 'b'), e5 enum('a', 'b'), e6 enum('a', 'b'), e7 enum('a', 'b'), e8 enum('a', 'b')`, + toSchema: `id int primary key, e1 enum('a', 'b'), e2 enum('a'), e3 enum('a', 'b', 'c'), e4 enum('a', 'x'), e5 enum('a', 'x', 'b'), e6 enum('b'), e7 varchar(1), e8 tinyint`, + expandedColumnNames: `e3,e4,e5,e6,e7,e8`, + }, + { + name: "expanded: set", + fromSchema: `id int primary key, e1 set('a', 'b'), e2 set('a', 'b'), e3 set('a', 'b'), e4 set('a', 'b'), e5 set('a', 'b'), e6 set('a', 'b'), e7 set('a', 'b'), e8 set('a', 'b')`, + toSchema: `id int primary key, e1 set('a', 'b'), e2 set('a'), e3 set('a', 'b', 'c'), e4 set('a', 'x'), e5 set('a', 'x', 'b'), e6 set('b'), e7 varchar(1), e8 tinyint`, + expandedColumnNames: `e3,e4,e5,e6,e7,e8`, + }, + } + + var ( + createTableWrapper = `CREATE TABLE t (%s)` + ) + + env := NewTestEnv() + diffHints := &DiffHints{} + for _, tcase := range testCases { + t.Run(tcase.name, func(t *testing.T) { + tcase.fromSchema = fmt.Sprintf(createTableWrapper, tcase.fromSchema) + sourceTableEntity, err := NewCreateTableEntityFromSQL(env, tcase.fromSchema) + require.NoError(t, err) + + tcase.toSchema = fmt.Sprintf(createTableWrapper, tcase.toSchema) + targetTableEntity, err := NewCreateTableEntityFromSQL(env, tcase.toSchema) + require.NoError(t, err) + + diff, err := sourceTableEntity.TableDiff(targetTableEntity, diffHints) + require.NoError(t, err) + alterTableAnalysis := OnlineDDLAlterTableAnalysis(diff.AlterTable()) + + analysis, err := OnlineDDLMigrationTablesAnalysis(sourceTableEntity, targetTableEntity, alterTableAnalysis) + require.NoError(t, err) + + toStringSlice := func(s string) []string { + if s == "" { + return []string{} + } + return strings.Split(s, ",") + } + assert.Equal(t, toStringSlice(tcase.removedForeignKeyNames), analysis.RemovedForeignKeyNames) + assert.Equal(t, toStringSlice(tcase.removedUniqueKeyNames), analysis.RemovedUniqueKeys.Names()) + assert.Equal(t, toStringSlice(tcase.droppedNoDefaultColumnNames), analysis.DroppedNoDefaultColumns.Names()) + assert.Equal(t, toStringSlice(tcase.expandedColumnNames), analysis.ExpandedColumns.Names()) + }) + } +} + +func TestValidateAndEditCreateTableStatement(t *testing.T) { + tt := []struct { + name string + query string + allowForeignKeys bool + expectError string + countConstraints int + expectConstraintMap map[string]string + }{ + { + name: "table with FK, not allowed", + query: ` + create table onlineddl_test ( + id int auto_increment, + i int not null, + parent_id int not null, + primary key(id), + constraint test_ibfk foreign key (parent_id) references onlineddl_test_parent (id) on delete no action + ) + `, + expectError: ErrForeignKeyFound.Error(), + }, + { + name: "table with FK, allowed", + query: ` + create table onlineddl_test ( + id int auto_increment, + i int not null, + parent_id int not null, + primary key(id), + constraint test_ibfk foreign key (parent_id) references onlineddl_test_parent (id) on delete no action + ) + `, + allowForeignKeys: true, + countConstraints: 1, + expectConstraintMap: map[string]string{"test_ibfk": "test_ibfk_2wtivm6zk4lthpz14g9uoyaqk"}, + }, + { + name: "table with default FK name, strip table name", + query: ` + create table onlineddl_test ( + id int auto_increment, + i int not null, + parent_id int not null, + primary key(id), + constraint onlineddl_test_ibfk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action + ) + `, + allowForeignKeys: true, + countConstraints: 1, + // we want 'onlineddl_test_' to be stripped out: + expectConstraintMap: map[string]string{"onlineddl_test_ibfk_1": "ibfk_1_2wtivm6zk4lthpz14g9uoyaqk"}, + }, + { + name: "table with anonymous FK, allowed", + query: ` + create table onlineddl_test ( + id int auto_increment, + i int not null, + parent_id int not null, + primary key(id), + foreign key (parent_id) references onlineddl_test_parent (id) on delete no action + ) + `, + allowForeignKeys: true, + countConstraints: 1, + expectConstraintMap: map[string]string{"": "fk_2wtivm6zk4lthpz14g9uoyaqk"}, + }, + { + name: "table with CHECK constraints", + query: ` + create table onlineddl_test ( + id int auto_increment, + i int not null, + primary key(id), + constraint check_1 CHECK ((i >= 0)), + constraint check_2 CHECK ((i <> 5)), + constraint check_3 CHECK ((i >= 0)), + constraint chk_1111033c1d2d5908bf1f956ba900b192_check_4 CHECK ((i >= 0)) + ) + `, + countConstraints: 4, + expectConstraintMap: map[string]string{ + "check_1": "check_1_7dbssrkwdaxhdunwi5zj53q83", + "check_2": "check_2_ehg3rtk6ejvbxpucimeess30o", + "check_3": "check_3_0se0t8x98mf8v7lqmj2la8j9u", + "chk_1111033c1d2d5908bf1f956ba900b192_check_4": "chk_1111033c1d2d5908bf1f956ba900b192_c_0c2c3bxi9jp4evqrct44wg3xh", + }, + }, + { + name: "table with both FOREIGN and CHECK constraints", + query: ` + create table onlineddl_test ( + id int auto_increment, + i int not null, + primary key(id), + constraint check_1 CHECK ((i >= 0)), + constraint test_ibfk foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, + constraint chk_1111033c1d2d5908bf1f956ba900b192_check_4 CHECK ((i >= 0)) + ) + `, + allowForeignKeys: true, + countConstraints: 3, + expectConstraintMap: map[string]string{ + "check_1": "check_1_7dbssrkwdaxhdunwi5zj53q83", + "chk_1111033c1d2d5908bf1f956ba900b192_check_4": "chk_1111033c1d2d5908bf1f956ba900b192_c_0se0t8x98mf8v7lqmj2la8j9u", + "test_ibfk": "test_ibfk_2wtivm6zk4lthpz14g9uoyaqk", + }, + }, + } + env := NewTestEnv() + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + stmt, err := env.Parser().ParseStrictDDL(tc.query) + require.NoError(t, err) + createTable, ok := stmt.(*sqlparser.CreateTable) + require.True(t, ok) + + table := "onlineddl_test" + baseUUID := "a5a563da_dc1a_11ec_a416_0a43f95f28a3" + constraintMap, err := ValidateAndEditCreateTableStatement(table, baseUUID, createTable, tc.allowForeignKeys) + if tc.expectError != "" { + assert.ErrorContains(t, err, tc.expectError) + return + } + assert.NoError(t, err) + assert.Equal(t, tc.expectConstraintMap, constraintMap) + + uniqueConstraintNames := map[string]bool{} + err = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.ConstraintDefinition: + uniqueConstraintNames[node.Name.String()] = true + } + return true, nil + }, createTable) + assert.NoError(t, err) + assert.Equal(t, tc.countConstraints, len(uniqueConstraintNames)) + assert.Equalf(t, tc.countConstraints, len(constraintMap), "got contraints: %v", constraintMap) + }) + } +} + +func TestValidateAndEditAlterTableStatement(t *testing.T) { + capableOf := func(capability capabilities.FlavorCapability) (bool, error) { + switch capability { + case + capabilities.InstantDDLXtrabackupCapability, + capabilities.InstantDDLFlavorCapability, + capabilities.InstantAddLastColumnFlavorCapability, + capabilities.InstantAddDropVirtualColumnFlavorCapability, + capabilities.InstantAddDropColumnFlavorCapability, + capabilities.InstantChangeColumnDefaultFlavorCapability, + capabilities.InstantChangeColumnVisibilityCapability, + capabilities.InstantExpandEnumCapability: + return true, nil + } + return false, nil + } + incapableOf := func(capability capabilities.FlavorCapability) (bool, error) { + return false, nil + } + + tt := []struct { + alter string + capableOf capabilities.CapableOf + m map[string]string + expect []string + }{ + { + alter: "alter table t add column i int", + capableOf: incapableOf, + expect: []string{"alter table t add column i int, algorithm = copy"}, + }, + { + alter: "alter table t add column i int", + capableOf: capableOf, + expect: []string{"alter table t add column i int"}, + }, + { + alter: "alter table t add column i int, add fulltext key name1_ft (name1)", + expect: []string{"alter table t add column i int, add fulltext key name1_ft (name1)"}, + }, + { + alter: "alter table t add column i int, add fulltext key name1_ft (name1), add fulltext key name2_ft (name2)", + expect: []string{"alter table t add column i int, add fulltext key name1_ft (name1)", "alter table t add fulltext key name2_ft (name2)"}, + }, + { + alter: "alter table t add fulltext key name0_ft (name0), add column i int, add fulltext key name1_ft (name1), add fulltext key name2_ft (name2)", + expect: []string{"alter table t add fulltext key name0_ft (name0), add column i int", "alter table t add fulltext key name1_ft (name1)", "alter table t add fulltext key name2_ft (name2)"}, + }, + { + alter: "alter table t add constraint check (id != 1)", + expect: []string{"alter table t add constraint chk_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, + }, + { + alter: "alter table t add constraint t_chk_1 check (id != 1)", + expect: []string{"alter table t add constraint chk_1_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, + }, + { + alter: "alter table t add constraint some_check check (id != 1)", + expect: []string{"alter table t add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, + }, + { + alter: "alter table t add constraint some_check check (id != 1), add constraint another_check check (id != 2)", + expect: []string{"alter table t add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1), add constraint another_check_4fa197273p3w96267pzm3gfi3 check (id != 2)"}, + }, + { + alter: "alter table t add foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", + expect: []string{"alter table t add constraint fk_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, + }, + { + alter: "alter table t add constraint myfk foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", + expect: []string{"alter table t add constraint myfk_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, + }, + { + // strip out table name + alter: "alter table t add constraint t_ibfk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", + expect: []string{"alter table t add constraint ibfk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, + }, + { + // stript out table name + alter: "alter table t add constraint t_ibfk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", + expect: []string{"alter table t add constraint ibfk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, + }, + { + alter: "alter table t add constraint t_ibfk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, add constraint some_check check (id != 1)", + expect: []string{"alter table t add constraint ibfk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, + }, + { + alter: "alter table t drop foreign key t_ibfk_1", + m: map[string]string{ + "t_ibfk_1": "ibfk_1_aaaaaaaaaaaaaa", + }, + expect: []string{"alter table t drop foreign key ibfk_1_aaaaaaaaaaaaaa"}, + }, + } + + env := NewTestEnv() + for _, tc := range tt { + t.Run(tc.alter, func(t *testing.T) { + if tc.capableOf == nil { + tc.capableOf = capableOf + } + stmt, err := env.Parser().ParseStrictDDL(tc.alter) + require.NoError(t, err) + alterTable, ok := stmt.(*sqlparser.AlterTable) + require.True(t, ok) + + m := map[string]string{} + for k, v := range tc.m { + m[k] = v + } + baseUUID := "a5a563da_dc1a_11ec_a416_0a43f95f28a3" + tableName := "t" + alters, err := ValidateAndEditAlterTableStatement(tableName, baseUUID, tc.capableOf, alterTable, m) + assert.NoError(t, err) + var altersStrings []string + for _, alter := range alters { + altersStrings = append(altersStrings, sqlparser.String(alter)) + } + assert.Equal(t, tc.expect, altersStrings) + }) + } +} + +func TestAddInstantAlgorithm(t *testing.T) { + tt := []struct { + alter string + expect string + }{ + { + alter: "alter table t add column i2 int not null", + expect: "ALTER TABLE `t` ADD COLUMN `i2` int NOT NULL, ALGORITHM = INSTANT", + }, + { + alter: "alter table t add column i2 int not null, lock=none", + expect: "ALTER TABLE `t` ADD COLUMN `i2` int NOT NULL, LOCK NONE, ALGORITHM = INSTANT", + }, + { + alter: "alter table t add column i2 int not null, algorithm=inplace", + expect: "ALTER TABLE `t` ADD COLUMN `i2` int NOT NULL, ALGORITHM = INSTANT", + }, + { + alter: "alter table t add column i2 int not null, algorithm=inplace, lock=none", + expect: "ALTER TABLE `t` ADD COLUMN `i2` int NOT NULL, ALGORITHM = INSTANT, LOCK NONE", + }, + } + env := NewTestEnv() + for _, tc := range tt { + t.Run(tc.alter, func(t *testing.T) { + stmt, err := env.Parser().ParseStrictDDL(tc.alter) + require.NoError(t, err) + alterTable, ok := stmt.(*sqlparser.AlterTable) + require.True(t, ok) + + AddInstantAlgorithm(alterTable) + alterInstant := sqlparser.CanonicalString(alterTable) + + assert.Equal(t, tc.expect, alterInstant) + + stmt, err = env.Parser().ParseStrictDDL(alterInstant) + require.NoError(t, err) + _, ok = stmt.(*sqlparser.AlterTable) + require.True(t, ok) + }) + } +} + +func TestDuplicateCreateTable(t *testing.T) { + baseUUID := "a5a563da_dc1a_11ec_a416_0a43f95f28a3" + allowForeignKeys := true + + tcases := []struct { + sql string + newName string + expectSQL string + expectMapSize int + }{ + { + sql: "create table t (id int primary key)", + newName: "mytable", + expectSQL: "create table mytable (\n\tid int primary key\n)", + }, + { + sql: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", + newName: "mytable", + expectSQL: "create table mytable (\n\tid int primary key,\n\ti int,\n\tconstraint f_ewl7lthyax2xxocpib3hyyvxx foreign key (i) references parent (id) on delete cascade\n)", + expectMapSize: 1, + }, + { + sql: "create table self (id int primary key, i int, constraint f foreign key (i) references self (id))", + newName: "mytable", + expectSQL: "create table mytable (\n\tid int primary key,\n\ti int,\n\tconstraint f_6tlv90d9gcf4h6roalfnkdhar foreign key (i) references mytable (id)\n)", + expectMapSize: 1, + }, + { + sql: "create table self (id int primary key, i1 int, i2 int, constraint f1 foreign key (i1) references self (id), constraint f1 foreign key (i2) references parent (id))", + newName: "mytable", + expectSQL: `create table mytable ( + id int primary key, + i1 int, + i2 int, + constraint f1_95jpox7sx4w0cv7dpspzmjbxu foreign key (i1) references mytable (id), + constraint f1_1fg002b1cuqoavgti5zp8pu91 foreign key (i2) references parent (id) +)`, + expectMapSize: 1, + }, + } + env := NewTestEnv() + for _, tcase := range tcases { + t.Run(tcase.sql, func(t *testing.T) { + stmt, err := env.Parser().ParseStrictDDL(tcase.sql) + require.NoError(t, err) + originalCreateTable, ok := stmt.(*sqlparser.CreateTable) + require.True(t, ok) + require.NotNil(t, originalCreateTable) + newCreateTable, constraintMap, err := DuplicateCreateTable(originalCreateTable, baseUUID, tcase.newName, allowForeignKeys) + assert.NoError(t, err) + assert.NotNil(t, newCreateTable) + assert.NotNil(t, constraintMap) + + newSQL := sqlparser.String(newCreateTable) + assert.Equal(t, tcase.expectSQL, newSQL) + assert.Equal(t, tcase.expectMapSize, len(constraintMap)) + }) + } +} diff --git a/go/vt/schemadiff/schema_diff.go b/go/vt/schemadiff/schema_diff.go index 60285265986..1c161ab56bf 100644 --- a/go/vt/schemadiff/schema_diff.go +++ b/go/vt/schemadiff/schema_diff.go @@ -88,28 +88,50 @@ Modified to have an early break // permutateDiffs calls `callback` with each permutation of a. If the function returns `true`, that means // the callback has returned `true` for an early break, thus possibly not all permutations have been evaluated. -func permutateDiffs(ctx context.Context, diffs []EntityDiff, hints *DiffHints, callback func([]EntityDiff, *DiffHints) (earlyBreak bool)) (earlyBreak bool, err error) { +// callback's `errorIndex` indicates the first index at which the permutation has error, or -1 if there's no such error. +// When `errorIndex` is non negative, then the algorithm skips any further recursive dives following `i`. +func permutateDiffs( + ctx context.Context, + diffs []EntityDiff, + hints *DiffHints, + callback func([]EntityDiff, *DiffHints) (earlyBreak bool, errorIndex int), +) (earlyBreak bool, err error) { if len(diffs) == 0 { return false, nil } // Sort by a heuristic (DROPs first, ALTERs next, CREATEs last). This ordering is then used first in the permutation // search and serves as seed for the rest of permutations. - return permDiff(ctx, diffs, hints, callback, 0) + earlyBreak, _, err = permDiff(ctx, diffs, hints, callback, 0) + return earlyBreak, err } // permDiff is a recursive function to permutate given `a` and call `callback` for each permutation. // If `callback` returns `true`, then so does this function, and this indicates a request for an early // break, in which case this function will not be called again. -func permDiff(ctx context.Context, a []EntityDiff, hints *DiffHints, callback func([]EntityDiff, *DiffHints) (earlyBreak bool), i int) (earlyBreak bool, err error) { +func permDiff( + ctx context.Context, + a []EntityDiff, + hints *DiffHints, + callback func([]EntityDiff, *DiffHints) (earlyBreak bool, errorIndex int), + i int, +) (earlyBreak bool, errorIndex int, err error) { if err := ctx.Err(); err != nil { - return true, err // early break + return true, -1, err // early break (due to context) } if i > len(a) { - return callback(a, hints), nil + earlyBreak, errorIndex := callback(a, hints) + return earlyBreak, errorIndex, nil } - if brk, err := permDiff(ctx, a, hints, callback, i+1); brk { - return true, err + earlyBreak, errorIndex, err = permDiff(ctx, a, hints, callback, i+1) + if errorIndex >= 0 && i > errorIndex { + // Means the current permutation failed at `errorIndex`, and we're beyond that point. There's no + // point in continuing to permutate the rest of the array. + return false, errorIndex, err + } + if earlyBreak { + // Found a valid permutation, no need to continue + return true, -1, err } for j := i + 1; j < len(a); j++ { // An optimization: we don't really need all possible permutations. We can skip some of the recursive search. @@ -150,12 +172,18 @@ func permDiff(ctx context.Context, a []EntityDiff, hints *DiffHints, callback fu } // End of optimization a[i], a[j] = a[j], a[i] - if brk, err := permDiff(ctx, a, hints, callback, i+1); brk { - return true, err + earlyBreak, errorIndex, err = permDiff(ctx, a, hints, callback, i+1) + if errorIndex >= 0 && i > errorIndex { + // Means the current permutation failed at `errorIndex`, and we're beyond that point. There's no + // point in continuing to permutate the rest of the array. + return false, errorIndex, err + } + if earlyBreak { + return true, -1, err } a[i], a[j] = a[j], a[i] } - return false, nil + return false, -1, nil } // SchemaDiff is a rich diff between two schemas. It includes the following: @@ -316,7 +344,7 @@ func (d *SchemaDiff) OrderedDiffs(ctx context.Context) ([]EntityDiff, error) { // We will now permutate the diffs in this equivalence class, and hopefully find // a valid permutation (one where if we apply the diffs in-order, the schema remains valid throughout the process) tryPermutateDiffs := func(hints *DiffHints) (bool, error) { - return permutateDiffs(ctx, classDiffs, hints, func(permutatedDiffs []EntityDiff, hints *DiffHints) bool { + return permutateDiffs(ctx, classDiffs, hints, func(permutatedDiffs []EntityDiff, hints *DiffHints) (bool, int) { permutationSchema := lastGoodSchema.copy() // We want to apply the changes one by one, and validate the schema after each change for i := range permutatedDiffs { @@ -338,14 +366,14 @@ func (d *SchemaDiff) OrderedDiffs(ctx context.Context) ([]EntityDiff, error) { } if err := permutationSchema.apply(permutatedDiffs[i:i+1], applyHints); err != nil { // permutation is invalid - return false // continue searching + return false, i // let the algorithm know there's no point in pursuing any path after `i` } } // Good news, we managed to apply all of the permutations! orderedDiffs = append(orderedDiffs, permutatedDiffs...) lastGoodSchema = permutationSchema - return true // early break! No need to keep searching + return true, -1 // early break! No need to keep searching }) } // We prefer stricter strategy, because that gives best chance of finding a valid path. diff --git a/go/vt/schemadiff/schema_diff_test.go b/go/vt/schemadiff/schema_diff_test.go index 8adc4fc8d68..8088cc896ed 100644 --- a/go/vt/schemadiff/schema_diff_test.go +++ b/go/vt/schemadiff/schema_diff_test.go @@ -18,6 +18,8 @@ package schemadiff import ( "context" + "fmt" + "os" "strings" "testing" @@ -195,7 +197,7 @@ func TestPermutations(t *testing.T) { allDiffs := schemaDiff.UnorderedDiffs() originalSingleString := toSingleString(allDiffs) numEquals := 0 - earlyBreak, err := permutateDiffs(ctx, allDiffs, hints, func(pdiffs []EntityDiff, hints *DiffHints) (earlyBreak bool) { + earlyBreak, err := permutateDiffs(ctx, allDiffs, hints, func(pdiffs []EntityDiff, hints *DiffHints) (earlyBreak bool, errorIndex int) { defer func() { iteration++ }() // cover all permutations singleString := toSingleString(pdiffs) @@ -204,7 +206,7 @@ func TestPermutations(t *testing.T) { if originalSingleString == singleString { numEquals++ } - return false + return false, -1 }) assert.NoError(t, err) if len(allDiffs) > 0 { @@ -218,13 +220,13 @@ func TestPermutations(t *testing.T) { allPerms := map[string]bool{} allDiffs := schemaDiff.UnorderedDiffs() originalSingleString := toSingleString(allDiffs) - earlyBreak, err := permutateDiffs(ctx, allDiffs, hints, func(pdiffs []EntityDiff, hints *DiffHints) (earlyBreak bool) { + earlyBreak, err := permutateDiffs(ctx, allDiffs, hints, func(pdiffs []EntityDiff, hints *DiffHints) (earlyBreak bool, errorIndex int) { // Single visit allPerms[toSingleString(pdiffs)] = true // First permutation should be the same as original require.Equal(t, originalSingleString, toSingleString(pdiffs)) // early break; this callback function should not be invoked again - return true + return true, -1 }) assert.NoError(t, err) if len(allDiffs) > 0 { @@ -246,8 +248,8 @@ func TestPermutationsContext(t *testing.T) { hints := &DiffHints{RangeRotationStrategy: RangeRotationDistinctStatements} allDiffs := []EntityDiff{&DropViewEntityDiff{}} - earlyBreak, err := permutateDiffs(ctx, allDiffs, hints, func(pdiffs []EntityDiff, hints *DiffHints) (earlyBreak bool) { - return false + earlyBreak, err := permutateDiffs(ctx, allDiffs, hints, func(pdiffs []EntityDiff, hints *DiffHints) (earlyBreak bool, errorIndex int) { + return false, -1 }) assert.True(t, earlyBreak) // proves that termination was due to context cancel assert.Error(t, err) // proves that termination was due to context cancel @@ -1319,6 +1321,41 @@ func TestSchemaDiff(t *testing.T) { instantCapability := schemaDiff.InstantDDLCapability() assert.Equal(t, tc.instantCapability, instantCapability, "for instant capability") }) + } +} +// TestDiffFiles diffs two schema files on the local file system. It requires the $TEST_SCHEMADIFF_DIFF_FILES +// environment variable to be set to a comma-separated list of two file paths, e.g. "/tmp/from.sql,/tmp/to.sql". +// If the variable is unspecified, the test is skipped. It is useful for ad-hoc testing of schema diffs. +func TestDiffFiles(t *testing.T) { + ctx := context.Background() + + envName := "TEST_SCHEMADIFF_DIFF_FILES" + filesVar := os.Getenv(envName) + if filesVar == "" { + t.Skipf("no diff files specified in $%s", envName) + } + files := strings.Split(filesVar, ",") + require.Len(t, files, 2, "expecting two files in $%s: ,", envName) + fromSchemaSQL, err := os.ReadFile(files[0]) + require.NoError(t, err) + toSchemaSQL, err := os.ReadFile(files[1]) + require.NoError(t, err) + + env := NewTestEnv() + fromSchema, err := NewSchemaFromSQL(env, string(fromSchemaSQL)) + require.NoError(t, err) + toSchema, err := NewSchemaFromSQL(env, string(toSchemaSQL)) + require.NoError(t, err) + + hints := &DiffHints{RangeRotationStrategy: RangeRotationDistinctStatements} + schemaDiff, err := fromSchema.SchemaDiff(toSchema, hints) + require.NoError(t, err) + t.Logf("diff length: %v", len(schemaDiff.UnorderedDiffs())) + orderedDiffs, err := schemaDiff.OrderedDiffs(ctx) + require.NoError(t, err) + t.Logf("ordered diffs length: %v", len(orderedDiffs)) + for _, diff := range orderedDiffs { + fmt.Printf("%s;\n", diff.CanonicalStatementString()) } } diff --git a/go/vt/schemadiff/semantics.go b/go/vt/schemadiff/semantics.go index cbba8c79497..f12f59ef6ae 100644 --- a/go/vt/schemadiff/semantics.go +++ b/go/vt/schemadiff/semantics.go @@ -79,6 +79,11 @@ func (si *declarativeSchemaInformation) GetForeignKeyChecksState() *bool { return nil } +// FindMirrorRule implements semantics.SchemaInformation. +func (si *declarativeSchemaInformation) FindMirrorRule(tablename sqlparser.TableName) (*vindexes.MirrorRule, error) { + return nil, nil +} + // addTable adds a fake table with an empty column list func (si *declarativeSchemaInformation) addTable(tableName string) { tbl := &vindexes.Table{ diff --git a/go/vt/schemadiff/table.go b/go/vt/schemadiff/table.go index 5629210b6c1..c429ab15ba4 100644 --- a/go/vt/schemadiff/table.go +++ b/go/vt/schemadiff/table.go @@ -445,6 +445,18 @@ type CreateTableEntity struct { Env *Environment } +func NewCreateTableEntityFromSQL(env *Environment, sql string) (*CreateTableEntity, error) { + stmt, err := env.Parser().ParseStrictDDL(sql) + if err != nil { + return nil, err + } + createTable, ok := stmt.(*sqlparser.CreateTable) + if !ok { + return nil, ErrExpectedCreateTable + } + return NewCreateTableEntity(env, createTable) +} + func NewCreateTableEntity(env *Environment, c *sqlparser.CreateTable) (*CreateTableEntity, error) { if !c.IsFullyParsed() { return nil, &NotFullyParsedError{Entity: c.Table.Name.String(), Statement: sqlparser.CanonicalString(c)} @@ -454,15 +466,64 @@ func NewCreateTableEntity(env *Environment, c *sqlparser.CreateTable) (*CreateTa return entity, nil } +// ColumnDefinitionEntities returns the list of column entities for the table. func (c *CreateTableEntity) ColumnDefinitionEntities() []*ColumnDefinitionEntity { cc := getTableCharsetCollate(c.Env, &c.CreateTable.TableSpec.Options) + pkColumnsMaps := c.primaryKeyColumnsMap() entities := make([]*ColumnDefinitionEntity, len(c.CreateTable.TableSpec.Columns)) for i := range c.CreateTable.TableSpec.Columns { - entities[i] = NewColumnDefinitionEntity(c.Env, c.CreateTable.TableSpec.Columns[i], cc) + col := c.CreateTable.TableSpec.Columns[i] + _, inPK := pkColumnsMaps[col.Name.Lowered()] + entities[i] = NewColumnDefinitionEntity(c.Env, col, inPK, cc) + } + return entities +} + +// ColumnDefinitionEntities returns the list of column entities for the table. +func (c *CreateTableEntity) ColumnDefinitionEntitiesList() *ColumnDefinitionEntityList { + return NewColumnDefinitionEntityList(c.ColumnDefinitionEntities()) +} + +// ColumnDefinitionEntities returns column entities mapped by their lower cased name +func (c *CreateTableEntity) ColumnDefinitionEntitiesMap() map[string]*ColumnDefinitionEntity { + entities := c.ColumnDefinitionEntities() + m := make(map[string]*ColumnDefinitionEntity, len(entities)) + for _, entity := range entities { + m[entity.NameLowered()] = entity + } + return m +} + +// IndexDefinitionEntities returns the list of index entities for the table. +func (c *CreateTableEntity) IndexDefinitionEntities() []*IndexDefinitionEntity { + colMap := c.ColumnDefinitionEntitiesMap() + keys := c.CreateTable.TableSpec.Indexes + entities := make([]*IndexDefinitionEntity, len(keys)) + for i, key := range keys { + colEntities := make([]*ColumnDefinitionEntity, len(key.Columns)) + for i, keyCol := range key.Columns { + colEntities[i] = colMap[keyCol.Column.Lowered()] + } + entities[i] = NewIndexDefinitionEntity(c.Env, key, NewColumnDefinitionEntityList(colEntities)) } return entities } +// IndexDefinitionEntityList returns the list of index entities for the table. +func (c *CreateTableEntity) IndexDefinitionEntitiesList() *IndexDefinitionEntityList { + return NewIndexDefinitionEntityList(c.IndexDefinitionEntities()) +} + +// IndexDefinitionEntitiesMap returns index entities mapped by their lower cased name. +func (c *CreateTableEntity) IndexDefinitionEntitiesMap() map[string]*IndexDefinitionEntity { + entities := c.IndexDefinitionEntities() + m := make(map[string]*IndexDefinitionEntity, len(entities)) + for _, entity := range entities { + m[entity.NameLowered()] = entity + } + return m +} + // normalize cleans up the table definition: // - setting names to all keys // - table option case (upper/lower/special) @@ -1529,6 +1590,21 @@ func (c *CreateTableEntity) diffKeys(alterTable *sqlparser.AlterTable, t2KeysMap[key.Info.Name.String()] = key } + // A map of index definition text to lost of key names that have that definition. + // For example, in: + // + // create table t ( + // i1 int, + // i2 int, + // key k1 (i1), + // key k2 (i2), + // key k3 (i2) + // ) + // We will have: + // - "KEY `` (i1)": ["k1"] + // - "KEY `` (i2)": ["k2", "k3"] + droppedKeysAnonymousDefinitions := map[string]([]string){} + dropKeyStatement := func(info *sqlparser.IndexInfo) *sqlparser.DropKey { dropKey := &sqlparser.DropKey{} if info.Type == sqlparser.IndexTypePrimary { @@ -1540,14 +1616,25 @@ func (c *CreateTableEntity) diffKeys(alterTable *sqlparser.AlterTable, return dropKey } + anonymizedIndexDefinition := func(indexDefinition *sqlparser.IndexDefinition) string { + currentName := indexDefinition.Info.Name + defer func() { indexDefinition.Info.Name = currentName }() + indexDefinition.Info.Name = sqlparser.NewIdentifierCI("") + return sqlparser.CanonicalString(indexDefinition) + } + // evaluate dropped keys // + dropKeyStatements := map[string]*sqlparser.DropKey{} for _, t1Key := range t1Keys { if _, ok := t2KeysMap[t1Key.Info.Name.String()]; !ok { // column exists in t1 but not in t2, hence it is dropped dropKey := dropKeyStatement(t1Key.Info) - alterTable.AlterOptions = append(alterTable.AlterOptions, dropKey) + dropKeyStatements[t1Key.Info.Name.String()] = dropKey annotations.MarkRemoved(sqlparser.CanonicalString(t1Key)) + + anonymized := anonymizedIndexDefinition(t1Key) + droppedKeysAnonymousDefinitions[anonymized] = append(droppedKeysAnonymousDefinitions[anonymized], t1Key.Info.Name.String()) } } @@ -1583,6 +1670,28 @@ func (c *CreateTableEntity) diffKeys(alterTable *sqlparser.AlterTable, } } else { // key exists in t2 but not in t1, hence it is added + + // But wait! As an optimization, if this index has the exact same definition as a previously dropped index, + // then we convert the drop+add statements in to a `RENAME INDEX` statement. + convertedToRename := false + anonymized := anonymizedIndexDefinition(t2Key) + if droppedKeys := droppedKeysAnonymousDefinitions[anonymized]; len(droppedKeys) > 0 { + if dropKey, ok := dropKeyStatements[droppedKeys[0]]; ok { + delete(dropKeyStatements, droppedKeys[0]) + droppedKeysAnonymousDefinitions[anonymized] = droppedKeys[1:] + renameIndex := &sqlparser.RenameIndex{ + OldName: dropKey.Name, + NewName: t2Key.Info.Name, + } + alterTable.AlterOptions = append(alterTable.AlterOptions, renameIndex) + convertedToRename = true + } + } + if convertedToRename { + continue + } + // End of conversion to RENAME INDEX. Proceed with actual ADD INDEX + addKey := &sqlparser.AddIndexDefinition{ IndexDefinition: t2Key, } @@ -1602,6 +1711,9 @@ func (c *CreateTableEntity) diffKeys(alterTable *sqlparser.AlterTable, } } } + for _, stmt := range dropKeyStatements { + alterTable.AlterOptions = append(alterTable.AlterOptions, stmt) + } return superfluousFulltextKeys } @@ -1670,6 +1782,35 @@ func evaluateColumnReordering(t1SharedColumns, t2SharedColumns []*sqlparser.Colu return minimalColumnReordering } +// This function looks for a non-deterministic function call in the given expression. +// If recurses into all function arguments. +// The known non-deterministic function we handle are: +// - UUID() +// - UUID_SHORT() +// - RAND() +// - RANDOM_BYTES() +// - SYSDATE() +func findNoNondeterministicFunction(expr sqlparser.Expr) (foundFunction string) { + _ = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.CurTimeFuncExpr: + switch node.Name.Lowered() { + case "sysdate": + foundFunction = node.Name.String() + return false, nil + } + case *sqlparser.FuncExpr: + switch node.Name.Lowered() { + case "uuid", "uuid_short", "rand", "random_bytes": + foundFunction = node.Name.String() + return false, nil + } + } + return true, nil + }, expr) + return foundFunction +} + // Diff compares this table statement with another table statement, and sees what it takes to // change this table to look like the other table. // It returns an AlterTable statement if changes are found, or nil if not. @@ -1740,8 +1881,8 @@ func (c *CreateTableEntity) diffColumns(alterTable *sqlparser.AlterTable, t2ColName := t2Col.Name.Lowered() // we know that column exists in both tables t1Col := t1ColumnsMap[t2ColName] - t1ColEntity := NewColumnDefinitionEntity(c.Env, t1Col.col, t1cc) - t2ColEntity := NewColumnDefinitionEntity(c.Env, t2Col, t2cc) + t1ColEntity := NewColumnDefinitionEntity(c.Env, t1Col.col, false, t1cc) + t2ColEntity := NewColumnDefinitionEntity(c.Env, t2Col, false, t2cc) // check diff between before/after columns: modifyColumnDiff, err := t1ColEntity.ColumnDiff(c.Env, c.Name(), t2ColEntity, hints) @@ -1791,6 +1932,16 @@ func (c *CreateTableEntity) diffColumns(alterTable *sqlparser.AlterTable, addColumn := &sqlparser.AddColumns{ Columns: []*sqlparser.ColumnDefinition{t2Col}, } + // See whether this ADD COLUMN has a non-deterministic default value + if t2Col.Type.Options.Default != nil && !t2Col.Type.Options.DefaultLiteral { + if function := findNoNondeterministicFunction(t2Col.Type.Options.Default); function != "" { + return &NonDeterministicDefaultError{ + Table: c.Name(), + Column: t2Col.Name.String(), + Function: function, + } + } + } if t2ColIndex < expectAppendIndex { // This column is added somewhere in between existing columns, not appended at end of column list if t2ColIndex == 0 { @@ -1892,6 +2043,15 @@ func (c *CreateTableEntity) primaryKeyColumns() []*sqlparser.IndexColumn { return nil } +func (c *CreateTableEntity) primaryKeyColumnsMap() map[string]*sqlparser.IndexColumn { + columns := c.primaryKeyColumns() + m := make(map[string]*sqlparser.IndexColumn, len(columns)) + for _, col := range columns { + m[col.Column.Lowered()] = col + } + return m +} + // Create implements Entity interface func (c *CreateTableEntity) Create() EntityDiff { if c == nil { @@ -1927,12 +2087,14 @@ func sortAlterOptions(diff *AlterTableEntityDiff) { return 5 case *sqlparser.AddColumns: return 6 - case *sqlparser.AddIndexDefinition: + case *sqlparser.RenameIndex: return 7 - case *sqlparser.AddConstraintDefinition: + case *sqlparser.AddIndexDefinition: return 8 - case sqlparser.TableOptions, *sqlparser.TableOptions: + case *sqlparser.AddConstraintDefinition: return 9 + case sqlparser.TableOptions, *sqlparser.TableOptions: + return 10 default: return math.MaxInt } @@ -2088,20 +2250,25 @@ func (c *CreateTableEntity) apply(diff *AlterTableEntityDiff) error { return &ApplyKeyNotFoundError{Table: c.Name(), Key: opt.Name.String()} } - // Now, if this is a normal key being dropped, let's validate it does not leave any foreign key constraint uncovered - switch opt.Type { - case sqlparser.PrimaryKeyType, sqlparser.NormalKeyType: - for _, cs := range c.CreateTable.TableSpec.Constraints { - fk, ok := cs.Details.(*sqlparser.ForeignKeyDefinition) - if !ok { - continue - } - if !c.columnsCoveredByInOrderIndex(fk.Source) { - return &IndexNeededByForeignKeyError{Table: c.Name(), Key: opt.Name.String()} - } + case *sqlparser.RenameIndex: + // validate no existing key by same name + newKeyName := opt.NewName.String() + for _, index := range c.TableSpec.Indexes { + if strings.EqualFold(index.Info.Name.String(), newKeyName) { + return &ApplyDuplicateKeyError{Table: c.Name(), Key: newKeyName} } } - + found := false + for _, index := range c.TableSpec.Indexes { + if index.Info.Name.String() == opt.OldName.String() { + index.Info.Name = opt.NewName + found = true + break + } + } + if !found { + return &ApplyKeyNotFoundError{Table: c.Name(), Key: opt.OldName.String()} + } case *sqlparser.AddIndexDefinition: // validate no existing key by same name keyName := opt.IndexDefinition.Info.Name.String() @@ -2298,11 +2465,41 @@ func (c *CreateTableEntity) apply(diff *AlterTableEntityDiff) error { } return nil } + // postApplyOptionsIteration runs on all options, after applyAlterOption does. + // Some validations can only take place after all options have been applied. + postApplyOptionsIteration := func(opt sqlparser.AlterOption) error { + switch opt := opt.(type) { + case *sqlparser.DropKey: + // Now, if this is a normal key being dropped, let's validate it does not leave any foreign key constraint uncovered. + // We must have this in `postApplyOptionsIteration` as opposed to `applyAlterOption` because + // this DROP KEY may have been followed by an ADD KEY that covers the foreign key constraint, so it's wrong + // to error out before applying the ADD KEY. + switch opt.Type { + case sqlparser.PrimaryKeyType, sqlparser.NormalKeyType: + for _, cs := range c.CreateTable.TableSpec.Constraints { + fk, ok := cs.Details.(*sqlparser.ForeignKeyDefinition) + if !ok { + continue + } + if !c.columnsCoveredByInOrderIndex(fk.Source) { + return &IndexNeededByForeignKeyError{Table: c.Name(), Key: opt.Name.String()} + } + } + } + } + return nil + } + for _, alterOption := range diff.alterTable.AlterOptions { if err := applyAlterOption(alterOption); err != nil { return err } } + for _, alterOption := range diff.alterTable.AlterOptions { + if err := postApplyOptionsIteration(alterOption); err != nil { + return err + } + } if err := c.postApplyNormalize(); err != nil { return err } @@ -2648,3 +2845,18 @@ func (c *CreateTableEntity) identicalOtherThanName(other *CreateTableEntity) boo return sqlparser.Equals.RefOfTableSpec(c.TableSpec, other.TableSpec) && sqlparser.Equals.RefOfParsedComments(c.Comments, other.Comments) } + +// AutoIncrementValue returns the value of the AUTO_INCREMENT option, or zero if not exists. +func (c *CreateTableEntity) AutoIncrementValue() (autoIncrement uint64, err error) { + for _, option := range c.CreateTable.TableSpec.Options { + if strings.ToUpper(option.Name) == "AUTO_INCREMENT" { + autoIncrement, err := strconv.ParseUint(option.Value.Val, 10, 64) + if err != nil { + return 0, err + } + return autoIncrement, nil + } + } + // Auto increment not found + return 0, nil +} diff --git a/go/vt/schemadiff/table_test.go b/go/vt/schemadiff/table_test.go index 1168f53f3b6..6526c5ae118 100644 --- a/go/vt/schemadiff/table_test.go +++ b/go/vt/schemadiff/table_test.go @@ -28,16 +28,17 @@ import ( func TestCreateTableDiff(t *testing.T) { tt := []struct { - name string - from string - to string - fromName string - toName string - diff string - diffs []string - cdiff string - cdiffs []string - errorMsg string + name string + from string + to string + fromName string + toName string + diff string + diffs []string + cdiff string + cdiffs []string + errorMsg string + // hints: autoinc int rotation int fulltext int @@ -47,6 +48,7 @@ func TestCreateTableDiff(t *testing.T) { algorithm int enumreorder int subsequent int + // textdiffs []string atomicdiffs []string }{ @@ -449,6 +451,80 @@ func TestCreateTableDiff(t *testing.T) { "+ `y` int,", }, }, + { + name: "added column with non deterministic expression, uuid, reject", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (uuid()))", + errorMsg: (&NonDeterministicDefaultError{Table: "t1", Column: "v", Function: "uuid"}).Error(), + }, + { + name: "added column with non deterministic expression, uuid, reject", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (uuid_short()))", + errorMsg: (&NonDeterministicDefaultError{Table: "t1", Column: "v", Function: "uuid_short"}).Error(), + }, + { + name: "added column with non deterministic expression, UUID, reject", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (UUID()))", + errorMsg: (&NonDeterministicDefaultError{Table: "t1", Column: "v", Function: "UUID"}).Error(), + }, + { + name: "added column with non deterministic expression, uuid, spacing, reject", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (uuid ()))", + errorMsg: (&NonDeterministicDefaultError{Table: "t1", Column: "v", Function: "uuid"}).Error(), + }, + { + name: "added column with non deterministic expression, uuid, inner, reject", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (left(uuid(),10)))", + errorMsg: (&NonDeterministicDefaultError{Table: "t1", Column: "v", Function: "uuid"}).Error(), + }, + { + name: "added column with non deterministic expression, rand, reject", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (2.0 + rand()))", + errorMsg: (&NonDeterministicDefaultError{Table: "t1", Column: "v", Function: "rand"}).Error(), + }, + { + name: "added column with non deterministic expression, random_bytes, reject", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (random_bytes(3)))", + errorMsg: (&NonDeterministicDefaultError{Table: "t1", Column: "v", Function: "random_bytes"}).Error(), + }, + { + name: "added column with non deterministic expression, sysdate, reject", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (sysdate()))", + errorMsg: (&NonDeterministicDefaultError{Table: "t1", Column: "v", Function: "sysdate"}).Error(), + }, + { + name: "added column with non deterministic expression, sysdate, reject", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (to_days(sysdate())))", + errorMsg: (&NonDeterministicDefaultError{Table: "t1", Column: "v", Function: "sysdate"}).Error(), + }, + { + name: "added column with deterministic expression, now, reject does not apply", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (now()))", + diff: "alter table t1 add column v varchar(36) not null default (now())", + cdiff: "ALTER TABLE `t1` ADD COLUMN `v` varchar(36) NOT NULL DEFAULT (now())", + textdiffs: []string{ + "+ `v` varchar(36) NOT NULL DEFAULT (now()),", + }, + }, + { + name: "added column with deterministic expression, curdate, reject does not apply", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, v varchar(36) not null default (to_days(curdate())))", + diff: "alter table t1 add column v varchar(36) not null default (to_days(curdate()))", + cdiff: "ALTER TABLE `t1` ADD COLUMN `v` varchar(36) NOT NULL DEFAULT (to_days(curdate()))", + textdiffs: []string{ + "+ `v` varchar(36) NOT NULL DEFAULT (to_days(curdate())),", + }, + }, // enum { name: "expand enum", @@ -729,6 +805,41 @@ func TestCreateTableDiff(t *testing.T) { "+ KEY `i_idx3` (`id`)", }, }, + { + name: "reordered and renamed key", + from: "create table t1 (`id` int primary key, i int, key i_idx(i), key i2_idx(i, `id`))", + to: "create table t2 (`id` int primary key, i int, key i2_alternative (`i`, id), key i_idx ( i ) )", + diff: "alter table t1 rename index i2_idx to i2_alternative", + cdiff: "ALTER TABLE `t1` RENAME INDEX `i2_idx` TO `i2_alternative`", + }, + { + name: "reordered and renamed keys", + from: "create table t1 (`id` int primary key, i int, key i_idx(i), key i2_idx(i, `id`))", + to: "create table t2 (`id` int primary key, i int, key i2_alternative (`i`, id), key i_alternative ( i ) )", + diff: "alter table t1 rename index i2_idx to i2_alternative, rename index i_idx to i_alternative", + cdiff: "ALTER TABLE `t1` RENAME INDEX `i2_idx` TO `i2_alternative`, RENAME INDEX `i_idx` TO `i_alternative`", + }, + { + name: "multiple similar keys, one rename", + from: "create table t1 (`id` int primary key, i int, key i_idx(i), key i2_idx(i))", + to: "create table t2 (`id` int primary key, i int, key i_idx(i), key i2_alternative(i))", + diff: "alter table t1 rename index i2_idx to i2_alternative", + cdiff: "ALTER TABLE `t1` RENAME INDEX `i2_idx` TO `i2_alternative`", + }, + { + name: "multiple similar keys, two renames", + from: "create table t1 (`id` int primary key, i int, key i_idx(i), key i2_idx(i))", + to: "create table t2 (`id` int primary key, i int, key i_alternative(i), key i2_alternative(i))", + diff: "alter table t1 rename index i_idx to i_alternative, rename index i2_idx to i2_alternative", + cdiff: "ALTER TABLE `t1` RENAME INDEX `i_idx` TO `i_alternative`, RENAME INDEX `i2_idx` TO `i2_alternative`", + }, + { + name: "multiple similar keys, two renames, reorder", + from: "create table t1 (`id` int primary key, i int, key i0 (i, id), key i_idx(i), key i2_idx(i))", + to: "create table t2 (`id` int primary key, i int, key i_alternative(i), key i2_alternative(i), key i0 (i, id))", + diff: "alter table t1 rename index i_idx to i_alternative, rename index i2_idx to i2_alternative", + cdiff: "ALTER TABLE `t1` RENAME INDEX `i_idx` TO `i_alternative`, RENAME INDEX `i2_idx` TO `i2_alternative`", + }, { name: "key made visible", from: "create table t1 (`id` int primary key, i int, key i_idx(i) invisible)", @@ -2712,6 +2823,18 @@ func TestValidate(t *testing.T) { alter: "alter table t drop key `i`", expectErr: &IndexNeededByForeignKeyError{Table: "t", Key: "i"}, }, + { + name: "allow drop key when also adding a different index for foreign key constraint", + from: "create table t (id int primary key, i int, key i_idx (i), constraint f foreign key (i) references parent(id))", + alter: "alter table t drop key `i_idx`, add key i_alternative (i)", + to: "create table t (id int primary key, i int, key i_alternative (i), constraint f foreign key (i) references parent(id))", + }, + { + name: "allow drop key when also adding a different, longer, index for foreign key constraint", + from: "create table t (id int primary key, i int, key i_idx (i), constraint f foreign key (i) references parent(id))", + alter: "alter table t drop key `i_idx`, add key i_alternative (i, id)", + to: "create table t (id int primary key, i int, key i_alternative (i, id), constraint f foreign key (i) references parent(id))", + }, { name: "drop key with alternative key for foreign key constraint, 1", from: "create table t (id int primary key, i int, key i (i), key i2 (i, id), constraint f foreign key (i) references parent(id))", @@ -2781,9 +2904,10 @@ func TestValidate(t *testing.T) { func TestNormalize(t *testing.T) { tt := []struct { - name string - from string - to string + name string + from string + to string + autoinc uint64 }{ { name: "basic table", @@ -2795,6 +2919,17 @@ func TestNormalize(t *testing.T) { from: "create table t (id int primary key, i int)", to: "CREATE TABLE `t` (\n\t`id` int,\n\t`i` int,\n\tPRIMARY KEY (`id`)\n)", }, + { + name: "basic table, auto increment", + from: "create table t (id int auto_increment primary key, i int)", + to: "CREATE TABLE `t` (\n\t`id` int AUTO_INCREMENT,\n\t`i` int,\n\tPRIMARY KEY (`id`)\n)", + }, + { + name: "basic table, auto increment val", + from: "create table t (id int auto_increment primary key, i int) auto_increment = 123", + to: "CREATE TABLE `t` (\n\t`id` int AUTO_INCREMENT,\n\t`i` int,\n\tPRIMARY KEY (`id`)\n) AUTO_INCREMENT 123", + autoinc: 123, + }, { name: "removes default null", from: "create table t (id int, i int default null, primary key (id))", @@ -3067,6 +3202,10 @@ func TestNormalize(t *testing.T) { from, err := NewCreateTableEntity(env, fromCreateTable) require.NoError(t, err) assert.Equal(t, ts.to, sqlparser.CanonicalString(from)) + + autoinc, err := from.AutoIncrementValue() + require.NoError(t, err) + assert.EqualValues(t, ts.autoinc, autoinc) }) } } diff --git a/go/vt/schemadiff/view.go b/go/vt/schemadiff/view.go index d2dc4dfb76f..8783f1803bb 100644 --- a/go/vt/schemadiff/view.go +++ b/go/vt/schemadiff/view.go @@ -310,6 +310,18 @@ func NewCreateViewEntity(env *Environment, c *sqlparser.CreateView) (*CreateView return entity, nil } +func NewCreateViewEntityFromSQL(env *Environment, sql string) (*CreateViewEntity, error) { + stmt, err := env.Parser().ParseStrictDDL(sql) + if err != nil { + return nil, err + } + createView, ok := stmt.(*sqlparser.CreateView) + if !ok { + return nil, ErrExpectedCreateTable + } + return NewCreateViewEntity(env, createView) +} + func (c *CreateViewEntity) normalize() { // Drop the default algorithm if strings.EqualFold(c.CreateView.Algorithm, "undefined") { diff --git a/go/vt/schemadiff/view_test.go b/go/vt/schemadiff/view_test.go index d1a26c3cdaa..d020649b17e 100644 --- a/go/vt/schemadiff/view_test.go +++ b/go/vt/schemadiff/view_test.go @@ -150,19 +150,16 @@ func TestCreateViewDiff(t *testing.T) { for _, ts := range tt { t.Run(ts.name, func(t *testing.T) { fromStmt, err := env.Parser().ParseStrictDDL(ts.from) - assert.NoError(t, err) + require.NoError(t, err) fromCreateView, ok := fromStmt.(*sqlparser.CreateView) assert.True(t, ok) - toStmt, err := env.Parser().ParseStrictDDL(ts.to) - assert.NoError(t, err) - toCreateView, ok := toStmt.(*sqlparser.CreateView) - assert.True(t, ok) - c, err := NewCreateViewEntity(env, fromCreateView) require.NoError(t, err) - other, err := NewCreateViewEntity(env, toCreateView) + // Test from SQL: + other, err := NewCreateViewEntityFromSQL(env, ts.to) require.NoError(t, err) + alter, err := c.Diff(other, hints) switch { case ts.isError: diff --git a/go/vt/servenv/grpc_codec.go b/go/vt/servenv/grpc_codec.go index 7d2b6364d3b..35441feb261 100644 --- a/go/vt/servenv/grpc_codec.go +++ b/go/vt/servenv/grpc_codec.go @@ -17,52 +17,64 @@ limitations under the License. package servenv import ( - "fmt" - - // use the original golang/protobuf package we can continue serializing - // messages from our dependencies, particularly from etcd - "github.com/golang/protobuf/proto" //nolint - "google.golang.org/grpc/encoding" + "google.golang.org/grpc/mem" + + // Guarantee that the built-in proto is called registered before this one + // so that it can be replaced. _ "google.golang.org/grpc/encoding/proto" // nolint:revive ) // Name is the name registered for the proto compressor. const Name = "proto" -type vtprotoCodec struct{} - type vtprotoMessage interface { - MarshalVT() ([]byte, error) + MarshalToSizedBufferVT(data []byte) (int, error) UnmarshalVT([]byte) error + SizeVT() int } -func (vtprotoCodec) Marshal(v any) ([]byte, error) { - switch v := v.(type) { - case vtprotoMessage: - return v.MarshalVT() - case proto.Message: - return proto.Marshal(v) - default: - return nil, fmt.Errorf("failed to marshal, message is %T, must satisfy the vtprotoMessage interface or want proto.Message", v) - } +type Codec struct { + fallback encoding.CodecV2 } -func (vtprotoCodec) Unmarshal(data []byte, v any) error { - switch v := v.(type) { - case vtprotoMessage: - return v.UnmarshalVT(data) - case proto.Message: - return proto.Unmarshal(data, v) - default: - return fmt.Errorf("failed to unmarshal, message is %T, must satisfy the vtprotoMessage interface or want proto.Message", v) +func (Codec) Name() string { return Name } + +var defaultBufferPool = mem.DefaultBufferPool() + +func (c *Codec) Marshal(v any) (mem.BufferSlice, error) { + if m, ok := v.(vtprotoMessage); ok { + size := m.SizeVT() + if mem.IsBelowBufferPoolingThreshold(size) { + buf := make([]byte, size) + if _, err := m.MarshalToSizedBufferVT(buf[:size]); err != nil { + return nil, err + } + return mem.BufferSlice{mem.SliceBuffer(buf)}, nil + } + buf := defaultBufferPool.Get(size) + if _, err := m.MarshalToSizedBufferVT((*buf)[:size]); err != nil { + defaultBufferPool.Put(buf) + return nil, err + } + return mem.BufferSlice{mem.NewBuffer(buf, defaultBufferPool)}, nil } + + return c.fallback.Marshal(v) } -func (vtprotoCodec) Name() string { - return Name +func (c *Codec) Unmarshal(data mem.BufferSlice, v any) error { + if m, ok := v.(vtprotoMessage); ok { + buf := data.MaterializeToBuffer(defaultBufferPool) + defer buf.Free() + return m.UnmarshalVT(buf.ReadOnlyData()) + } + + return c.fallback.Unmarshal(data, v) } func init() { - encoding.RegisterCodec(vtprotoCodec{}) + encoding.RegisterCodecV2(&Codec{ + fallback: encoding.GetCodecV2("proto"), + }) } diff --git a/go/vt/servenv/version.go b/go/vt/servenv/version.go index e02716f3d4a..072938bfdf2 100644 --- a/go/vt/servenv/version.go +++ b/go/vt/servenv/version.go @@ -19,4 +19,4 @@ package servenv // DO NOT EDIT // THIS FILE IS AUTO-GENERATED DURING NEW RELEASES BY THE VITESS-RELEASER -const versionName = "21.0.0-SNAPSHOT" +const versionName = "22.0.0-SNAPSHOT" diff --git a/go/vt/sidecardb/schema/misc/heartbeat.sql b/go/vt/sidecardb/schema/misc/heartbeat.sql index 35668f2c0ab..b95feb57684 100644 --- a/go/vt/sidecardb/schema/misc/heartbeat.sql +++ b/go/vt/sidecardb/schema/misc/heartbeat.sql @@ -20,4 +20,4 @@ CREATE TABLE IF NOT EXISTS heartbeat tabletUid INT UNSIGNED NOT NULL, ts BIGINT UNSIGNED NOT NULL, PRIMARY KEY (`keyspaceShard`) -) engine = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/misc/reparent_journal.sql b/go/vt/sidecardb/schema/misc/reparent_journal.sql index 81e47c69dc5..e9f2f9c4aea 100644 --- a/go/vt/sidecardb/schema/misc/reparent_journal.sql +++ b/go/vt/sidecardb/schema/misc/reparent_journal.sql @@ -22,4 +22,4 @@ CREATE TABLE IF NOT EXISTS reparent_journal `replication_position` varbinary(64000) DEFAULT NULL, PRIMARY KEY (`time_created_ns`) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/onlineddl/schema_migrations.sql b/go/vt/sidecardb/schema/onlineddl/schema_migrations.sql index 2926ec76f28..85d87edefc2 100644 --- a/go/vt/sidecardb/schema/onlineddl/schema_migrations.sql +++ b/go/vt/sidecardb/schema/onlineddl/schema_migrations.sql @@ -42,6 +42,7 @@ CREATE TABLE IF NOT EXISTS schema_migrations `migration_context` varchar(1024) NOT NULL DEFAULT '', `ddl_action` varchar(16) NOT NULL DEFAULT '', `message` text NOT NULL, + `message_timestamp` timestamp(6) NULL DEFAULT NULL, `eta_seconds` bigint NOT NULL DEFAULT '-1', `rows_copied` bigint unsigned NOT NULL DEFAULT '0', `table_rows` bigint NOT NULL DEFAULT '0', @@ -63,6 +64,7 @@ CREATE TABLE IF NOT EXISTS schema_migrations `special_plan` text NOT NULL, `last_throttled_timestamp` timestamp NULL DEFAULT NULL, `component_throttled` tinytext NOT NULL, + `reason_throttled` text NOT NULL, `cancelled_timestamp` timestamp NULL DEFAULT NULL, `postpone_launch` tinyint unsigned NOT NULL DEFAULT '0', `stage` text NOT NULL, @@ -82,4 +84,4 @@ CREATE TABLE IF NOT EXISTS schema_migrations KEY `table_complete_idx` (`migration_status`, `keyspace`(64), `mysql_table`(64), `completed_timestamp`), KEY `migration_context_idx` (`migration_context`(64)), KEY `reverted_uuid_idx` (`reverted_uuid`) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/schemaengine/tables.sql b/go/vt/sidecardb/schema/schemaengine/tables.sql index 3aadc7c9635..1c4f6117ef2 100644 --- a/go/vt/sidecardb/schema/schemaengine/tables.sql +++ b/go/vt/sidecardb/schema/schemaengine/tables.sql @@ -21,4 +21,4 @@ CREATE TABLE IF NOT EXISTS tables CREATE_STATEMENT longtext, CREATE_TIME BIGINT, PRIMARY KEY (TABLE_SCHEMA, TABLE_NAME) -) engine = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/schemaengine/udfs.sql b/go/vt/sidecardb/schema/schemaengine/udfs.sql index 90c6143fbd6..53fa8280252 100644 --- a/go/vt/sidecardb/schema/schemaengine/udfs.sql +++ b/go/vt/sidecardb/schema/schemaengine/udfs.sql @@ -20,4 +20,4 @@ CREATE TABLE IF NOT EXISTS udfs FUNCTION_RETURN_TYPE varchar(20) CHARACTER SET `utf8mb3` COLLATE `utf8mb3_bin` NOT NULL, FUNCTION_TYPE varchar(20) CHARACTER SET `utf8mb3` COLLATE `utf8mb3_bin` NOT NULL, PRIMARY KEY (FUNCTION_NAME) -) engine = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/schemaengine/views.sql b/go/vt/sidecardb/schema/schemaengine/views.sql index dd242e6567f..97a6fa7a2f3 100644 --- a/go/vt/sidecardb/schema/schemaengine/views.sql +++ b/go/vt/sidecardb/schema/schemaengine/views.sql @@ -21,4 +21,4 @@ CREATE TABLE IF NOT EXISTS views CREATE_STATEMENT longtext, VIEW_DEFINITION longtext NOT NULL, PRIMARY KEY (TABLE_SCHEMA, TABLE_NAME) -) engine = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/twopc/dt_participant.sql b/go/vt/sidecardb/schema/twopc/dt_participant.sql index 9f2408497eb..3fe98c726ee 100644 --- a/go/vt/sidecardb/schema/twopc/dt_participant.sql +++ b/go/vt/sidecardb/schema/twopc/dt_participant.sql @@ -21,4 +21,4 @@ CREATE TABLE IF NOT EXISTS dt_participant keyspace varchar(256) NOT NULL, shard varchar(256) NOT NULL, primary key(dtid, id) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/twopc/dt_state.sql b/go/vt/sidecardb/schema/twopc/dt_state.sql index 9247ea5fa3c..7315ea5aa23 100644 --- a/go/vt/sidecardb/schema/twopc/dt_state.sql +++ b/go/vt/sidecardb/schema/twopc/dt_state.sql @@ -21,4 +21,4 @@ CREATE TABLE IF NOT EXISTS dt_state time_created bigint NOT NULL, primary key(dtid), key (time_created) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/twopc/redo_state.sql b/go/vt/sidecardb/schema/twopc/redo_state.sql index 7e583d7fdcd..58e250e435e 100644 --- a/go/vt/sidecardb/schema/twopc/redo_state.sql +++ b/go/vt/sidecardb/schema/twopc/redo_state.sql @@ -18,5 +18,6 @@ CREATE TABLE IF NOT EXISTS redo_state( dtid varbinary(512) NOT NULL, state bigint NOT NULL, time_created bigint NOT NULL, + message text, primary key(dtid) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/twopc/redo_statement.sql b/go/vt/sidecardb/schema/twopc/redo_statement.sql index 9208a0fce65..7f28e7fb0c9 100644 --- a/go/vt/sidecardb/schema/twopc/redo_statement.sql +++ b/go/vt/sidecardb/schema/twopc/redo_statement.sql @@ -19,4 +19,4 @@ CREATE TABLE IF NOT EXISTS redo_statement( id bigint NOT NULL, statement mediumblob NOT NULL, primary key(dtid, id) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/vdiff/vdiff.sql b/go/vt/sidecardb/schema/vdiff/vdiff.sql index 52392bde427..862e6e0e9d3 100644 --- a/go/vt/sidecardb/schema/vdiff/vdiff.sql +++ b/go/vt/sidecardb/schema/vdiff/vdiff.sql @@ -33,4 +33,4 @@ CREATE TABLE IF NOT EXISTS vdiff UNIQUE KEY `uuid_idx` (`vdiff_uuid`), KEY `state` (`state`), KEY `ks_wf_idx` (`keyspace`(64), `workflow`(64)) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/vdiff/vdiff_log.sql b/go/vt/sidecardb/schema/vdiff/vdiff_log.sql index dbc110e5b3a..bedb7824295 100644 --- a/go/vt/sidecardb/schema/vdiff/vdiff_log.sql +++ b/go/vt/sidecardb/schema/vdiff/vdiff_log.sql @@ -21,4 +21,4 @@ CREATE TABLE IF NOT EXISTS vdiff_log `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `message` text NOT NULL, PRIMARY KEY (`id`) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/vdiff/vdiff_table.sql b/go/vt/sidecardb/schema/vdiff/vdiff_table.sql index 580f1ba96ee..2296398e430 100644 --- a/go/vt/sidecardb/schema/vdiff/vdiff_table.sql +++ b/go/vt/sidecardb/schema/vdiff/vdiff_table.sql @@ -27,4 +27,4 @@ CREATE TABLE IF NOT EXISTS vdiff_table `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`vdiff_id`, `table_name`) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/vreplication/copy_state.sql b/go/vt/sidecardb/schema/vreplication/copy_state.sql index 8f27bc9dc86..f3e577156b9 100644 --- a/go/vt/sidecardb/schema/vreplication/copy_state.sql +++ b/go/vt/sidecardb/schema/vreplication/copy_state.sql @@ -22,4 +22,4 @@ CREATE TABLE IF NOT EXISTS copy_state `lastpk` varbinary(2000) DEFAULT NULL, PRIMARY KEY (`id`), KEY `vrepl_id` (`vrepl_id`,`table_name`) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/vreplication/post_copy_action.sql b/go/vt/sidecardb/schema/vreplication/post_copy_action.sql index 85bb44923b0..15a28c0d5fe 100644 --- a/go/vt/sidecardb/schema/vreplication/post_copy_action.sql +++ b/go/vt/sidecardb/schema/vreplication/post_copy_action.sql @@ -21,4 +21,4 @@ CREATE TABLE IF NOT EXISTS post_copy_action( action JSON NOT NULL, UNIQUE KEY (vrepl_id, table_name), PRIMARY KEY(id) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/vreplication/resharding_journal.sql b/go/vt/sidecardb/schema/vreplication/resharding_journal.sql index 5a3dbd64890..fed943a5064 100644 --- a/go/vt/sidecardb/schema/vreplication/resharding_journal.sql +++ b/go/vt/sidecardb/schema/vreplication/resharding_journal.sql @@ -20,4 +20,4 @@ CREATE TABLE IF NOT EXISTS resharding_journal `db_name` varbinary(255) DEFAULT NULL, `val` blob, PRIMARY KEY (`id`) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/vreplication/schema_version.sql b/go/vt/sidecardb/schema/vreplication/schema_version.sql index 2b7cbc08dec..be327215071 100644 --- a/go/vt/sidecardb/schema/vreplication/schema_version.sql +++ b/go/vt/sidecardb/schema/vreplication/schema_version.sql @@ -22,4 +22,4 @@ CREATE TABLE IF NOT EXISTS schema_version ddl BLOB DEFAULT NULL, schemax LONGBLOB NOT NULL, PRIMARY KEY (id) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/vreplication/vreplication.sql b/go/vt/sidecardb/schema/vreplication/vreplication.sql index 8d2ec41d1a6..6670b671f4f 100644 --- a/go/vt/sidecardb/schema/vreplication/vreplication.sql +++ b/go/vt/sidecardb/schema/vreplication/vreplication.sql @@ -36,6 +36,7 @@ CREATE TABLE IF NOT EXISTS vreplication `workflow_type` int NOT NULL DEFAULT '0', `time_throttled` bigint NOT NULL DEFAULT '0', `component_throttled` varchar(255) NOT NULL DEFAULT '', + `reason_throttled` varchar(1000) NOT NULL DEFAULT '', `workflow_sub_type` int NOT NULL DEFAULT '0', `defer_secondary_keys` tinyint(1) NOT NULL DEFAULT '0', /* @@ -46,4 +47,4 @@ CREATE TABLE IF NOT EXISTS vreplication `options` json NOT NULL, PRIMARY KEY (`id`), KEY `workflow_idx` (`workflow`(64)) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/schema/vreplication/vreplication_log.sql b/go/vt/sidecardb/schema/vreplication/vreplication_log.sql index 19360fb0c04..950c52ab4aa 100644 --- a/go/vt/sidecardb/schema/vreplication/vreplication_log.sql +++ b/go/vt/sidecardb/schema/vreplication/vreplication_log.sql @@ -26,4 +26,4 @@ CREATE TABLE IF NOT EXISTS vreplication_log `count` bigint NOT NULL DEFAULT '1', PRIMARY KEY (`id`), KEY `vrepl_id_idx` (`vrepl_id`) -) ENGINE = InnoDB +) ENGINE = InnoDB CHARSET = utf8mb4 diff --git a/go/vt/sidecardb/sidecardb.go b/go/vt/sidecardb/sidecardb.go index 0947355cd46..9cbe0540033 100644 --- a/go/vt/sidecardb/sidecardb.go +++ b/go/vt/sidecardb/sidecardb.go @@ -396,7 +396,7 @@ func (si *schemaInit) getCurrentSchema(tableName string) (string, error) { // or an ALTER if the table exists but has a different schema. func (si *schemaInit) findTableSchemaDiff(tableName, current, desired string) (string, error) { hints := &schemadiff.DiffHints{ - TableCharsetCollateStrategy: schemadiff.TableCharsetCollateIgnoreAlways, + TableCharsetCollateStrategy: schemadiff.TableCharsetCollateIgnoreEmpty, AlterTableAlgorithmStrategy: schemadiff.AlterTableAlgorithmStrategyCopy, } env := schemadiff.NewEnv(si.env, si.coll) diff --git a/go/vt/sidecardb/sidecardb_test.go b/go/vt/sidecardb/sidecardb_test.go index 55c2c6cd6b5..78210f19150 100644 --- a/go/vt/sidecardb/sidecardb_test.go +++ b/go/vt/sidecardb/sidecardb_test.go @@ -18,6 +18,7 @@ package sidecardb import ( "context" + "errors" "expvar" "fmt" "sort" @@ -80,7 +81,7 @@ func TestInitErrors(t *testing.T) { if ok { for _, e := range schemaErrors { if strings.EqualFold(e.tableName, createTable.Table.Name.String()) { - return nil, fmt.Errorf(e.errorValue) + return nil, errors.New(e.errorValue) } } } @@ -249,3 +250,89 @@ func TestAlterTableAlgorithm(t *testing.T) { }) } } + +// TestTableSchemaDiff ensures that the diff produced by schemaInit.findTableSchemaDiff +// is resulting in the expected alter table statements in a variety of scenarios. +func TestTableSchemaDiff(t *testing.T) { + si := &schemaInit{ + env: vtenv.NewTestEnv(), + } + + type testCase struct { + name string + table string + oldSchema string + newSchema string + expectNoDiff bool + expectedAlter string + } + testCases := []testCase{ + { + name: "modify table charset", + table: "t1", + oldSchema: "create table if not exists _vt.t1(i int) charset=utf8mb4", + newSchema: "create table if not exists _vt.t(i int) charset=utf8mb3", + expectedAlter: "alter table _vt.t1 charset utf8mb3, algorithm = copy", + }, + { + name: "empty charset", + table: "t1", + oldSchema: "create table if not exists _vt.t1(i int) charset=utf8mb4", + newSchema: "create table if not exists _vt.t(i int)", + expectNoDiff: true, // We're not specifying an explicit charset in the new schema, so we shouldn't see a diff. + }, + { + name: "modify table engine", + table: "t1", + oldSchema: "create table if not exists _vt.t1(i int) engine=myisam", + newSchema: "create table if not exists _vt.t(i int) engine=innodb", + expectedAlter: "alter table _vt.t1 engine innodb, algorithm = copy", + }, + { + name: "add, modify, transfer PK", + table: "t1", + oldSchema: "create table _vt.t1 (i int primary key, i1 varchar(10)) charset utf8mb4", + newSchema: "create table _vt.t1 (i int, i1 varchar(20) character set utf8mb3 collate utf8mb3_bin, i2 int, primary key (i2)) charset utf8mb4", + expectedAlter: "alter table _vt.t1 drop primary key, modify column i1 varchar(20) character set utf8mb3 collate utf8mb3_bin, add column i2 int, add primary key (i2), algorithm = copy", + }, + { + name: "modify visibility and add comment", + table: "t1", + oldSchema: "create table if not exists _vt.t1(c1 int, c2 int, c3 varchar(100)) charset utf8mb4", + newSchema: "create table if not exists _vt.t1(c1 int, c2 int, c3 varchar(100) invisible comment 'hoping to drop') charset utf8mb4", + expectedAlter: "alter table _vt.t1 modify column c3 varchar(100) comment 'hoping to drop' invisible, algorithm = copy", + }, + { + name: "add PK and remove index", + table: "t1", + oldSchema: "create table if not exists _vt.t1(c1 int, c2 int, c3 varchar(100), key (c2)) charset utf8mb4", + newSchema: "create table if not exists _vt.t1(c1 int primary key, c2 int, c3 varchar(100)) charset utf8mb4", + expectedAlter: "alter table _vt.t1 drop key c2, add primary key (c1), algorithm = copy", + }, + { + name: "add generated col", + table: "t1", + oldSchema: "create table if not exists _vt.t1(c1 int primary key) charset utf8mb4", + newSchema: "create table if not exists _vt.t1(c1 int primary key, c2 varchar(10) generated always as ('hello')) charset utf8mb4", + expectedAlter: "alter table _vt.t1 add column c2 varchar(10) as ('hello') virtual, algorithm = copy", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + diff, err := si.findTableSchemaDiff(tc.table, tc.oldSchema, tc.newSchema) + require.NoError(t, err) + if tc.expectNoDiff { + require.Empty(t, diff) + return + } + stmt, err := si.env.Parser().Parse(diff) + require.NoError(t, err) + alter, ok := stmt.(*sqlparser.AlterTable) + require.True(t, ok) + require.NotNil(t, alter) + t.Logf("alter: %s", sqlparser.String(alter)) + require.Equal(t, strings.ToLower(tc.expectedAlter), strings.ToLower(sqlparser.String(alter))) + }) + } +} diff --git a/go/vt/sqlparser/analyzer.go b/go/vt/sqlparser/analyzer.go index ea0773d99cc..98b7677a1f3 100644 --- a/go/vt/sqlparser/analyzer.go +++ b/go/vt/sqlparser/analyzer.go @@ -137,7 +137,7 @@ func ASTToStatementType(stmt Statement) StatementType { // CanNormalize takes Statement and returns if the statement can be normalized. func CanNormalize(stmt Statement) bool { switch stmt.(type) { - case *Select, *Union, *Insert, *Update, *Delete, *Set, *CallProc, *Stream: // TODO: we could merge this logic into ASTrewriter + case *Select, *Union, *Insert, *Update, *Delete, *Set, *CallProc, *Stream, *VExplainStmt: // TODO: we could merge this logic into ASTrewriter return true } return false diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 35d093e2d39..3d4f56ef628 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -161,7 +161,7 @@ type ( CommonTableExpr struct { ID IdentifierCS Columns Columns - Subquery *Subquery + Subquery SelectStatement } // ChangeColumn is used to change the column definition, can also rename the column in alter table command ChangeColumn struct { @@ -262,7 +262,11 @@ type ( Select struct { Cache *bool // a reference here so it can be nil Distinct bool + HighPriority bool StraightJoinHint bool + SQLSmallResult bool + SQLBigResult bool + SQLBufferResult bool SQLCalcFoundRows bool // The With field needs to come before the FROM clause, so any CTEs have been handled before we analyze it With *With @@ -413,6 +417,7 @@ type ( // AlterDatabase represents a ALTER database statement. AlterDatabase struct { + Comments *ParsedComments DBName IdentifierCS UpdateDataDirectory bool AlterOptions []DatabaseOption @@ -1667,6 +1672,12 @@ type ( Filter *ShowFilter } + // ShowTransactionStatus is used to see the status of a distributed transaction in progress. + ShowTransactionStatus struct { + Keyspace string + TransactionID string + } + // ShowCreate is of ShowInternal type, holds SHOW CREATE queries. ShowCreate struct { Command ShowCommandType @@ -1679,9 +1690,10 @@ type ( } ) -func (*ShowBasic) isShowInternal() {} -func (*ShowCreate) isShowInternal() {} -func (*ShowOther) isShowInternal() {} +func (*ShowBasic) isShowInternal() {} +func (*ShowCreate) isShowInternal() {} +func (*ShowOther) isShowInternal() {} +func (*ShowTransactionStatus) isShowInternal() {} // InsertRows represents the rows for an INSERT statement. type InsertRows interface { diff --git a/go/vt/sqlparser/ast_clone.go b/go/vt/sqlparser/ast_clone.go index 2342237f806..03a5fabe552 100644 --- a/go/vt/sqlparser/ast_clone.go +++ b/go/vt/sqlparser/ast_clone.go @@ -461,6 +461,8 @@ func CloneSQLNode(in SQLNode) SQLNode { return CloneRefOfShowThrottledApps(in) case *ShowThrottlerStatus: return CloneRefOfShowThrottlerStatus(in) + case *ShowTransactionStatus: + return CloneRefOfShowTransactionStatus(in) case *StarExpr: return CloneRefOfStarExpr(in) case *Std: @@ -660,6 +662,7 @@ func CloneRefOfAlterDatabase(n *AlterDatabase) *AlterDatabase { return nil } out := *n + out.Comments = CloneRefOfParsedComments(n.Comments) out.DBName = CloneIdentifierCS(n.DBName) out.AlterOptions = CloneSliceOfDatabaseOption(n.AlterOptions) return &out @@ -1020,7 +1023,7 @@ func CloneRefOfCommonTableExpr(n *CommonTableExpr) *CommonTableExpr { out := *n out.ID = CloneIdentifierCS(n.ID) out.Columns = CloneColumns(n.Columns) - out.Subquery = CloneRefOfSubquery(n.Subquery) + out.Subquery = CloneSelectStatement(n.Subquery) return &out } @@ -2909,6 +2912,15 @@ func CloneRefOfShowThrottlerStatus(n *ShowThrottlerStatus) *ShowThrottlerStatus return &out } +// CloneRefOfShowTransactionStatus creates a deep clone of the input. +func CloneRefOfShowTransactionStatus(n *ShowTransactionStatus) *ShowTransactionStatus { + if n == nil { + return nil + } + out := *n + return &out +} + // CloneRefOfStarExpr creates a deep clone of the input. func CloneRefOfStarExpr(n *StarExpr) *StarExpr { if n == nil { @@ -4147,6 +4159,8 @@ func CloneShowInternal(in ShowInternal) ShowInternal { return CloneRefOfShowCreate(in) case *ShowOther: return CloneRefOfShowOther(in) + case *ShowTransactionStatus: + return CloneRefOfShowTransactionStatus(in) default: // this should never happen return nil diff --git a/go/vt/sqlparser/ast_copy_on_rewrite.go b/go/vt/sqlparser/ast_copy_on_rewrite.go index c6bcf71bd6c..9b952b36dc7 100644 --- a/go/vt/sqlparser/ast_copy_on_rewrite.go +++ b/go/vt/sqlparser/ast_copy_on_rewrite.go @@ -460,6 +460,8 @@ func (c *cow) copyOnRewriteSQLNode(n SQLNode, parent SQLNode) (out SQLNode, chan return c.copyOnRewriteRefOfShowThrottledApps(n, parent) case *ShowThrottlerStatus: return c.copyOnRewriteRefOfShowThrottlerStatus(n, parent) + case *ShowTransactionStatus: + return c.copyOnRewriteRefOfShowTransactionStatus(n, parent) case *StarExpr: return c.copyOnRewriteRefOfStarExpr(n, parent) case *Std: @@ -759,9 +761,11 @@ func (c *cow) copyOnRewriteRefOfAlterDatabase(n *AlterDatabase, parent SQLNode) } out = n if c.pre == nil || c.pre(n, parent) { + _Comments, changedComments := c.copyOnRewriteRefOfParsedComments(n.Comments, n) _DBName, changedDBName := c.copyOnRewriteIdentifierCS(n.DBName, n) - if changedDBName { + if changedComments || changedDBName { res := *n + res.Comments, _ = _Comments.(*ParsedComments) res.DBName, _ = _DBName.(IdentifierCS) out = &res if c.cloned != nil { @@ -1520,12 +1524,12 @@ func (c *cow) copyOnRewriteRefOfCommonTableExpr(n *CommonTableExpr, parent SQLNo if c.pre == nil || c.pre(n, parent) { _ID, changedID := c.copyOnRewriteIdentifierCS(n.ID, n) _Columns, changedColumns := c.copyOnRewriteColumns(n.Columns, n) - _Subquery, changedSubquery := c.copyOnRewriteRefOfSubquery(n.Subquery, n) + _Subquery, changedSubquery := c.copyOnRewriteSelectStatement(n.Subquery, n) if changedID || changedColumns || changedSubquery { res := *n res.ID, _ = _ID.(IdentifierCS) res.Columns, _ = _Columns.(Columns) - res.Subquery, _ = _Subquery.(*Subquery) + res.Subquery, _ = _Subquery.(SelectStatement) out = &res if c.cloned != nil { c.cloned(n, out) @@ -5525,6 +5529,18 @@ func (c *cow) copyOnRewriteRefOfShowThrottlerStatus(n *ShowThrottlerStatus, pare } return } +func (c *cow) copyOnRewriteRefOfShowTransactionStatus(n *ShowTransactionStatus, parent SQLNode) (out SQLNode, changed bool) { + if n == nil || c.cursor.stop { + return n, false + } + out = n + if c.pre == nil || c.pre(n, parent) { + } + if c.post != nil { + out, changed = c.postVisit(out, parent, changed) + } + return +} func (c *cow) copyOnRewriteRefOfStarExpr(n *StarExpr, parent SQLNode) (out SQLNode, changed bool) { if n == nil || c.cursor.stop { return n, false @@ -7396,6 +7412,8 @@ func (c *cow) copyOnRewriteShowInternal(n ShowInternal, parent SQLNode) (out SQL return c.copyOnRewriteRefOfShowCreate(n, parent) case *ShowOther: return c.copyOnRewriteRefOfShowOther(n, parent) + case *ShowTransactionStatus: + return c.copyOnRewriteRefOfShowTransactionStatus(n, parent) default: // this should never happen return nil, false diff --git a/go/vt/sqlparser/ast_equals.go b/go/vt/sqlparser/ast_equals.go index 9f798f798a6..502a4a78d88 100644 --- a/go/vt/sqlparser/ast_equals.go +++ b/go/vt/sqlparser/ast_equals.go @@ -1340,6 +1340,12 @@ func (cmp *Comparator) SQLNode(inA, inB SQLNode) bool { return false } return cmp.RefOfShowThrottlerStatus(a, b) + case *ShowTransactionStatus: + b, ok := inB.(*ShowTransactionStatus) + if !ok { + return false + } + return cmp.RefOfShowTransactionStatus(a, b) case *StarExpr: b, ok := inB.(*StarExpr) if !ok { @@ -1757,6 +1763,7 @@ func (cmp *Comparator) RefOfAlterDatabase(a, b *AlterDatabase) bool { } return a.UpdateDataDirectory == b.UpdateDataDirectory && a.FullyParsed == b.FullyParsed && + cmp.RefOfParsedComments(a.Comments, b.Comments) && cmp.IdentifierCS(a.DBName, b.DBName) && cmp.SliceOfDatabaseOption(a.AlterOptions, b.AlterOptions) } @@ -2187,7 +2194,7 @@ func (cmp *Comparator) RefOfCommonTableExpr(a, b *CommonTableExpr) bool { } return cmp.IdentifierCS(a.ID, b.ID) && cmp.Columns(a.Columns, b.Columns) && - cmp.RefOfSubquery(a.Subquery, b.Subquery) + cmp.SelectStatement(a.Subquery, b.Subquery) } // RefOfComparisonExpr does deep equals between the two objects. @@ -4184,7 +4191,11 @@ func (cmp *Comparator) RefOfSelect(a, b *Select) bool { return false } return a.Distinct == b.Distinct && + a.HighPriority == b.HighPriority && a.StraightJoinHint == b.StraightJoinHint && + a.SQLSmallResult == b.SQLSmallResult && + a.SQLBigResult == b.SQLBigResult && + a.SQLBufferResult == b.SQLBufferResult && a.SQLCalcFoundRows == b.SQLCalcFoundRows && cmp.RefOfBool(a.Cache, b.Cache) && cmp.RefOfWith(a.With, b.With) && @@ -4363,6 +4374,18 @@ func (cmp *Comparator) RefOfShowThrottlerStatus(a, b *ShowThrottlerStatus) bool return cmp.Comments(a.Comments, b.Comments) } +// RefOfShowTransactionStatus does deep equals between the two objects. +func (cmp *Comparator) RefOfShowTransactionStatus(a, b *ShowTransactionStatus) bool { + if a == b { + return true + } + if a == nil || b == nil { + return false + } + return a.Keyspace == b.Keyspace && + a.TransactionID == b.TransactionID +} + // RefOfStarExpr does deep equals between the two objects. func (cmp *Comparator) RefOfStarExpr(a, b *StarExpr) bool { if a == b { @@ -6774,6 +6797,12 @@ func (cmp *Comparator) ShowInternal(inA, inB ShowInternal) bool { return false } return cmp.RefOfShowOther(a, b) + case *ShowTransactionStatus: + b, ok := inB.(*ShowTransactionStatus) + if !ok { + return false + } + return cmp.RefOfShowTransactionStatus(a, b) default: // this should never happen return false diff --git a/go/vt/sqlparser/ast_format.go b/go/vt/sqlparser/ast_format.go index da88129ee63..b9af85d410e 100644 --- a/go/vt/sqlparser/ast_format.go +++ b/go/vt/sqlparser/ast_format.go @@ -37,9 +37,21 @@ func (node *Select) Format(buf *TrackedBuffer) { buf.literal(SQLNoCacheStr) } } + if node.HighPriority { + buf.literal(HighPriorityStr) + } if node.StraightJoinHint { buf.literal(StraightJoinHint) } + if node.SQLSmallResult { + buf.literal(SQLSmallResultStr) + } + if node.SQLBigResult { + buf.literal(SQLBigResultStr) + } + if node.SQLBufferResult { + buf.literal(SQLBufferResultStr) + } if node.SQLCalcFoundRows { buf.literal(SQLCalcFoundRowsStr) } @@ -155,7 +167,7 @@ func (node *With) Format(buf *TrackedBuffer) { // Format formats the node. func (node *CommonTableExpr) Format(buf *TrackedBuffer) { - buf.astPrintf(node, "%v%v as %v ", node.ID, node.Columns, node.Subquery) + buf.astPrintf(node, "%v%v as (%v) ", node.ID, node.Columns, node.Subquery) } // Format formats the node. @@ -284,6 +296,8 @@ func (node *AlterMigration) Format(buf *TrackedBuffer) { alterType = "retry" case CleanupMigrationType: alterType = "cleanup" + case CleanupAllMigrationType: + alterType = "cleanup all" case LaunchMigrationType: alterType = "launch" case LaunchAllMigrationType: @@ -1343,7 +1357,7 @@ func (node *AssignmentExpr) Format(buf *TrackedBuffer) { func (node *Literal) Format(buf *TrackedBuffer) { switch node.Type { case StrVal: - sqltypes.MakeTrusted(sqltypes.VarBinary, node.Bytes()).EncodeSQL(buf) + sqltypes.MakeTrusted(sqltypes.VarChar, node.Bytes()).EncodeSQL(buf) case IntVal, FloatVal, DecimalVal, HexNum, BitNum: buf.astPrintf(node, "%#s", node.Val) case HexVal: @@ -2137,6 +2151,17 @@ func (node *ShowBasic) Format(buf *TrackedBuffer) { buf.astPrintf(node, "%v", node.Filter) } +func (node *ShowTransactionStatus) Format(buf *TrackedBuffer) { + if node.TransactionID == "" { + buf.astPrintf(node, "show unresolved transactions") + if node.Keyspace != "" { + buf.astPrintf(node, " for %#s", node.Keyspace) + } + return + } + buf.astPrintf(node, "show transaction status for '%#s'", node.TransactionID) +} + // Format formats the node. func (node *ShowCreate) Format(buf *TrackedBuffer) { buf.astPrintf(node, "show%s %v", node.Command.ToString(), node.Op) @@ -2161,7 +2186,7 @@ func (node *SelectInto) Format(buf *TrackedBuffer) { // Format formats the node. func (node *CreateDatabase) Format(buf *TrackedBuffer) { - buf.astPrintf(node, "create database %v", node.Comments) + buf.astPrintf(node, "create %vdatabase ", node.Comments) if node.IfNotExists { buf.literal("if not exists ") } @@ -2180,7 +2205,7 @@ func (node *CreateDatabase) Format(buf *TrackedBuffer) { // Format formats the node. func (node *AlterDatabase) Format(buf *TrackedBuffer) { - buf.literal("alter database") + buf.astPrintf(node, "alter %vdatabase", node.Comments) if node.DBName.NotEmpty() { buf.astPrintf(node, " %v", node.DBName) } diff --git a/go/vt/sqlparser/ast_format_fast.go b/go/vt/sqlparser/ast_format_fast.go index b1dd010f5ed..1950a79a613 100644 --- a/go/vt/sqlparser/ast_format_fast.go +++ b/go/vt/sqlparser/ast_format_fast.go @@ -41,9 +41,21 @@ func (node *Select) FormatFast(buf *TrackedBuffer) { buf.WriteString(SQLNoCacheStr) } } + if node.HighPriority { + buf.WriteString(HighPriorityStr) + } if node.StraightJoinHint { buf.WriteString(StraightJoinHint) } + if node.SQLSmallResult { + buf.WriteString(SQLSmallResultStr) + } + if node.SQLBigResult { + buf.WriteString(SQLBigResultStr) + } + if node.SQLBufferResult { + buf.WriteString(SQLBufferResultStr) + } if node.SQLCalcFoundRows { buf.WriteString(SQLCalcFoundRowsStr) } @@ -231,9 +243,9 @@ func (node *With) FormatFast(buf *TrackedBuffer) { func (node *CommonTableExpr) FormatFast(buf *TrackedBuffer) { node.ID.FormatFast(buf) node.Columns.FormatFast(buf) - buf.WriteString(" as ") + buf.WriteString(" as (") node.Subquery.FormatFast(buf) - buf.WriteByte(' ') + buf.WriteString(") ") } // FormatFast formats the node. @@ -410,6 +422,8 @@ func (node *AlterMigration) FormatFast(buf *TrackedBuffer) { alterType = "retry" case CleanupMigrationType: alterType = "cleanup" + case CleanupAllMigrationType: + alterType = "cleanup all" case LaunchMigrationType: alterType = "launch" case LaunchAllMigrationType: @@ -1754,7 +1768,7 @@ func (node *AssignmentExpr) FormatFast(buf *TrackedBuffer) { func (node *Literal) FormatFast(buf *TrackedBuffer) { switch node.Type { case StrVal: - sqltypes.MakeTrusted(sqltypes.VarBinary, node.Bytes()).EncodeSQL(buf) + sqltypes.MakeTrusted(sqltypes.VarChar, node.Bytes()).EncodeSQL(buf) case IntVal, FloatVal, DecimalVal, HexNum, BitNum: buf.WriteString(node.Val) case HexVal: @@ -2817,6 +2831,20 @@ func (node *ShowBasic) FormatFast(buf *TrackedBuffer) { node.Filter.FormatFast(buf) } +func (node *ShowTransactionStatus) FormatFast(buf *TrackedBuffer) { + if node.TransactionID == "" { + buf.WriteString("show unresolved transactions") + if node.Keyspace != "" { + buf.WriteString(" for ") + buf.WriteString(node.Keyspace) + } + return + } + buf.WriteString("show transaction status for '") + buf.WriteString(node.TransactionID) + buf.WriteByte('\'') +} + // FormatFast formats the node. func (node *ShowCreate) FormatFast(buf *TrackedBuffer) { buf.WriteString("show") @@ -2850,8 +2878,9 @@ func (node *SelectInto) FormatFast(buf *TrackedBuffer) { // FormatFast formats the node. func (node *CreateDatabase) FormatFast(buf *TrackedBuffer) { - buf.WriteString("create database ") + buf.WriteString("create ") node.Comments.FormatFast(buf) + buf.WriteString("database ") if node.IfNotExists { buf.WriteString("if not exists ") } @@ -2870,7 +2899,9 @@ func (node *CreateDatabase) FormatFast(buf *TrackedBuffer) { // FormatFast formats the node. func (node *AlterDatabase) FormatFast(buf *TrackedBuffer) { - buf.WriteString("alter database") + buf.WriteString("alter ") + node.Comments.FormatFast(buf) + buf.WriteString("database") if node.DBName.NotEmpty() { buf.WriteByte(' ') node.DBName.FormatFast(buf) diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index f4f1e3a5455..836c824010d 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -293,6 +293,8 @@ func SQLTypeToQueryType(typeName string, unsigned bool) querypb.Type { return sqltypes.Set case JSON: return sqltypes.TypeJSON + case VECTOR: + return sqltypes.Vector case GEOMETRY: return sqltypes.Geometry case POINT: @@ -426,6 +428,20 @@ func (node *AliasedTableExpr) TableName() (TableName, error) { return tableName, nil } +// TableNameString returns a TableNameString pointing to this table expr +func (node *AliasedTableExpr) TableNameString() string { + if node.As.NotEmpty() { + return node.As.String() + } + + tableName, ok := node.Expr.(TableName) + if !ok { + panic(vterrors.VT13001("Derived table should have an alias. This should not be possible")) + } + + return tableName.Name.String() +} + // IsEmpty returns true if TableName is nil or empty. func (node TableName) IsEmpty() bool { // If Name is empty, Qualifier is also empty. @@ -501,6 +517,70 @@ func (node *ComparisonExpr) IsImpossible() bool { return false } +func (op ComparisonExprOperator) Inverse() ComparisonExprOperator { + switch op { + case EqualOp: + return NotEqualOp + case LessThanOp: + return GreaterEqualOp + case GreaterThanOp: + return LessEqualOp + case LessEqualOp: + return GreaterThanOp + case GreaterEqualOp: + return LessThanOp + case NotEqualOp: + return EqualOp + case NullSafeEqualOp: + return NotEqualOp + case InOp: + return NotInOp + case NotInOp: + return InOp + case LikeOp: + return NotLikeOp + case NotLikeOp: + return LikeOp + case RegexpOp: + return NotRegexpOp + case NotRegexpOp: + return RegexpOp + } + panic("unreachable") +} + +// SwitchSides returns the reversed comparison operator if applicable, along with a boolean indicating success. +// For symmetric operators like '=', '!=', and '<=>', it returns the same operator and true. +// For directional comparison operators ('<', '>', '<=', '>='), it returns the opposite operator and true. +// For operators that imply directionality or cannot be logically reversed (such as 'IN', 'LIKE', 'REGEXP'), +// it returns the original operator and false, indicating that switching sides is not valid. +func (op ComparisonExprOperator) SwitchSides() (ComparisonExprOperator, bool) { + switch op { + case EqualOp, NotEqualOp, NullSafeEqualOp: + // These operators are symmetric, so switching sides has no effect + return op, true + case LessThanOp: + return GreaterThanOp, true + case GreaterThanOp: + return LessThanOp, true + case LessEqualOp: + return GreaterEqualOp, true + case GreaterEqualOp: + return LessEqualOp, true + default: + return op, false + } +} + +func (op ComparisonExprOperator) IsCommutative() bool { + switch op { + case EqualOp, NotEqualOp, NullSafeEqualOp: + return true + default: + return false + } +} + // NewStrLiteral builds a new StrVal. func NewStrLiteral(in string) *Literal { return &Literal{Type: StrVal, Val: in} @@ -800,7 +880,7 @@ func NewSelect( windows NamedWindows, ) *Select { var cache *bool - var distinct, straightJoinHint, sqlFoundRows bool + var distinct, highPriority, straightJoinHint, sqlSmallResult, sqlBigResult, SQLBufferResult, sqlFoundRows bool for _, option := range selectOptions { switch strings.ToLower(option) { case DistinctStr: @@ -811,8 +891,16 @@ func NewSelect( case SQLNoCacheStr: truth := false cache = &truth + case HighPriorityStr: + highPriority = true case StraightJoinHint: straightJoinHint = true + case SQLSmallResultStr: + sqlSmallResult = true + case SQLBigResultStr: + sqlBigResult = true + case SQLBufferResultStr: + SQLBufferResult = true case SQLCalcFoundRowsStr: sqlFoundRows = true } @@ -821,7 +909,11 @@ func NewSelect( Cache: cache, Comments: comments.Parsed(), Distinct: distinct, + HighPriority: highPriority, StraightJoinHint: straightJoinHint, + SQLSmallResult: sqlSmallResult, + SQLBigResult: sqlBigResult, + SQLBufferResult: SQLBufferResult, SQLCalcFoundRows: sqlFoundRows, SelectExprs: exprs, Into: into, @@ -1470,6 +1562,65 @@ func (op ComparisonExprOperator) ToString() string { } } +func ComparisonExprOperatorFromJson(s string) (ComparisonExprOperator, error) { + switch s { + case EqualStr: + return EqualOp, nil + case JsonLessThanStr: + return LessThanOp, nil + case JsonGreaterThanStr: + return GreaterThanOp, nil + case JsonLessThanOrEqualStr: + return LessEqualOp, nil + case JsonGreaterThanOrEqualStr: + return GreaterEqualOp, nil + case NotEqualStr: + return NotEqualOp, nil + case NullSafeEqualStr: + return NullSafeEqualOp, nil + case InStr: + return InOp, nil + case NotInStr: + return NotInOp, nil + case LikeStr: + return LikeOp, nil + case NotLikeStr: + return NotLikeOp, nil + case RegexpStr: + return RegexpOp, nil + case NotRegexpStr: + return NotRegexpOp, nil + default: + return 0, fmt.Errorf("unknown ComparisonExpOperator: %s", s) + } +} + +const ( + JsonGreaterThanStr = "gt" + JsonLessThanStr = "lt" + JsonGreaterThanOrEqualStr = "ge" + JsonLessThanOrEqualStr = "le" +) + +// JSONString returns a string representation for this operator that does not need escaping in JSON +func (op ComparisonExprOperator) JSONString() string { + switch op { + case EqualOp, NotEqualOp, NullSafeEqualOp, InOp, NotInOp, LikeOp, NotLikeOp, RegexpOp, NotRegexpOp: + // These operators are safe for JSON output, so we delegate to ToString + return op.ToString() + case LessThanOp: + return JsonLessThanStr + case GreaterThanOp: + return JsonGreaterThanStr + case LessEqualOp: + return JsonLessThanOrEqualStr + case GreaterEqualOp: + return JsonGreaterThanOrEqualStr + default: + panic("unreachable") + } +} + // ToString returns the operator as a string func (op IsExprOperator) ToString() string { switch op { @@ -1515,10 +1666,6 @@ func (op BinaryExprOperator) ToString() string { return ShiftLeftStr case ShiftRightOp: return ShiftRightStr - case JSONExtractOp: - return JSONExtractOpStr - case JSONUnquoteExtractOp: - return JSONUnquoteExtractOpStr default: return "Unknown BinaryExprOperator" } @@ -1895,6 +2042,10 @@ func (ty VExplainType) ToString() string { return QueriesStr case AllVExplainType: return AllVExplainStr + case TraceVExplainType: + return TraceStr + case KeysVExplainType: + return KeysStr default: return "Unknown VExplainType" } @@ -2790,3 +2941,24 @@ func (lock Lock) GetHighestOrderLock(newLock Lock) Lock { func Clone[K SQLNode](x K) K { return CloneSQLNode(x).(K) } + +// ExtractAllTables returns all the table names in the SQLNode as slice of string +func ExtractAllTables(stmt Statement) []string { + var tables []string + tableMap := make(map[string]any) + _ = Walk(func(node SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *AliasedTableExpr: + if tblName, ok := node.Expr.(TableName); ok { + name := String(tblName) + if _, exists := tableMap[name]; !exists { + tableMap[name] = nil + tables = append(tables, name) + } + return false, nil + } + } + return true, nil + }, stmt) + return tables +} diff --git a/go/vt/sqlparser/ast_funcs_test.go b/go/vt/sqlparser/ast_funcs_test.go index 7bec47df96f..a3b744729f4 100644 --- a/go/vt/sqlparser/ast_funcs_test.go +++ b/go/vt/sqlparser/ast_funcs_test.go @@ -172,3 +172,50 @@ func TestColumns_Indexes(t *testing.T) { }) } } + +// TestExtractTables verifies the functionality of extracting all the tables from the SQLNode. +func TestExtractTables(t *testing.T) { + tcases := []struct { + sql string + expected []string + }{{ + sql: "select 1 from a", + expected: []string{"a"}, + }, { + sql: "select 1 from a, b", + expected: []string{"a", "b"}, + }, { + sql: "select 1 from a join b on a.id = b.id", + expected: []string{"a", "b"}, + }, { + sql: "select 1 from a join b on a.id = b.id join c on b.id = c.id", + expected: []string{"a", "b", "c"}, + }, { + sql: "select 1 from a join (select id from b) as c on a.id = c.id", + expected: []string{"a", "b"}, + }, { + sql: "(select 1 from a) union (select 1 from b)", + expected: []string{"a", "b"}, + }, { + sql: "select 1 from a where exists (select 1 from (select id from c) b where a.id = b.id)", + expected: []string{"a", "c"}, + }, { + sql: "select 1 from k.a join k.b on a.id = b.id", + expected: []string{"k.a", "k.b"}, + }, { + sql: "select 1 from k.a join l.a on k.a.id = l.a.id", + expected: []string{"k.a", "l.a"}, + }, { + sql: "select 1 from a join (select id from a) as c on a.id = c.id", + expected: []string{"a"}, + }} + parser := NewTestParser() + for _, tcase := range tcases { + t.Run(tcase.sql, func(t *testing.T) { + stmt, err := parser.Parse(tcase.sql) + require.NoError(t, err) + tables := ExtractAllTables(stmt) + require.Equal(t, tcase.expected, tables) + }) + } +} diff --git a/go/vt/sqlparser/ast_rewrite.go b/go/vt/sqlparser/ast_rewrite.go index 9605e71a7ae..e65b243d7e1 100644 --- a/go/vt/sqlparser/ast_rewrite.go +++ b/go/vt/sqlparser/ast_rewrite.go @@ -460,6 +460,8 @@ func (a *application) rewriteSQLNode(parent SQLNode, node SQLNode, replacer repl return a.rewriteRefOfShowThrottledApps(parent, node, replacer) case *ShowThrottlerStatus: return a.rewriteRefOfShowThrottlerStatus(parent, node, replacer) + case *ShowTransactionStatus: + return a.rewriteRefOfShowTransactionStatus(parent, node, replacer) case *StarExpr: return a.rewriteRefOfStarExpr(parent, node, replacer) case *Std: @@ -829,6 +831,11 @@ func (a *application) rewriteRefOfAlterDatabase(parent SQLNode, node *AlterDatab return true } } + if !a.rewriteRefOfParsedComments(node, node.Comments, func(newNode, parent SQLNode) { + parent.(*AlterDatabase).Comments = newNode.(*ParsedComments) + }) { + return false + } if !a.rewriteIdentifierCS(node, node.DBName, func(newNode, parent SQLNode) { parent.(*AlterDatabase).DBName = newNode.(IdentifierCS) }) { @@ -1962,8 +1969,8 @@ func (a *application) rewriteRefOfCommonTableExpr(parent SQLNode, node *CommonTa }) { return false } - if !a.rewriteRefOfSubquery(node, node.Subquery, func(newNode, parent SQLNode) { - parent.(*CommonTableExpr).Subquery = newNode.(*Subquery) + if !a.rewriteSelectStatement(node, node.Subquery, func(newNode, parent SQLNode) { + parent.(*CommonTableExpr).Subquery = newNode.(SelectStatement) }) { return false } @@ -7934,6 +7941,30 @@ func (a *application) rewriteRefOfShowThrottlerStatus(parent SQLNode, node *Show } return true } +func (a *application) rewriteRefOfShowTransactionStatus(parent SQLNode, node *ShowTransactionStatus, replacer replacerFunc) bool { + if node == nil { + return true + } + if a.pre != nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + if !a.pre(&a.cur) { + return true + } + } + if a.post != nil { + if a.pre == nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + } + if !a.post(&a.cur) { + return false + } + } + return true +} func (a *application) rewriteRefOfStarExpr(parent SQLNode, node *StarExpr, replacer replacerFunc) bool { if node == nil { return true @@ -10373,6 +10404,8 @@ func (a *application) rewriteShowInternal(parent SQLNode, node ShowInternal, rep return a.rewriteRefOfShowCreate(parent, node, replacer) case *ShowOther: return a.rewriteRefOfShowOther(parent, node, replacer) + case *ShowTransactionStatus: + return a.rewriteRefOfShowTransactionStatus(parent, node, replacer) default: // this should never happen return true diff --git a/go/vt/sqlparser/ast_rewriting.go b/go/vt/sqlparser/ast_rewriting.go index 64de1f9d920..ef46b124875 100644 --- a/go/vt/sqlparser/ast_rewriting.go +++ b/go/vt/sqlparser/ast_rewriting.go @@ -301,10 +301,12 @@ func (er *astRewriter) rewriteVariable(cursor *Cursor, node *Variable) { if v, isSet := cursor.Parent().(*SetExpr); isSet && v.Var == node { return } + // no rewriting for global scope variable. + // this should be returned from the underlying database. switch node.Scope { case VariableScope: er.udvRewrite(cursor, node) - case GlobalScope, SessionScope, NextTxScope: + case SessionScope, NextTxScope: er.sysVarRewrite(cursor, node) } } diff --git a/go/vt/sqlparser/ast_visit.go b/go/vt/sqlparser/ast_visit.go index ecc15c47143..439d0bffeec 100644 --- a/go/vt/sqlparser/ast_visit.go +++ b/go/vt/sqlparser/ast_visit.go @@ -460,6 +460,8 @@ func VisitSQLNode(in SQLNode, f Visit) error { return VisitRefOfShowThrottledApps(in, f) case *ShowThrottlerStatus: return VisitRefOfShowThrottlerStatus(in, f) + case *ShowTransactionStatus: + return VisitRefOfShowTransactionStatus(in, f) case *StarExpr: return VisitRefOfStarExpr(in, f) case *Std: @@ -688,6 +690,9 @@ func VisitRefOfAlterDatabase(in *AlterDatabase, f Visit) error { if cont, err := f(in); err != nil || !cont { return err } + if err := VisitRefOfParsedComments(in.Comments, f); err != nil { + return err + } if err := VisitIdentifierCS(in.DBName, f); err != nil { return err } @@ -1170,7 +1175,7 @@ func VisitRefOfCommonTableExpr(in *CommonTableExpr, f Visit) error { if err := VisitColumns(in.Columns, f); err != nil { return err } - if err := VisitRefOfSubquery(in.Subquery, f); err != nil { + if err := VisitSelectStatement(in.Subquery, f); err != nil { return err } return nil @@ -3714,6 +3719,15 @@ func VisitRefOfShowThrottlerStatus(in *ShowThrottlerStatus, f Visit) error { } return nil } +func VisitRefOfShowTransactionStatus(in *ShowTransactionStatus, f Visit) error { + if in == nil { + return nil + } + if cont, err := f(in); err != nil || !cont { + return err + } + return nil +} func VisitRefOfStarExpr(in *StarExpr, f Visit) error { if in == nil { return nil @@ -5130,6 +5144,8 @@ func VisitShowInternal(in ShowInternal, f Visit) error { return VisitRefOfShowCreate(in, f) case *ShowOther: return VisitRefOfShowOther(in, f) + case *ShowTransactionStatus: + return VisitRefOfShowTransactionStatus(in, f) default: // this should never happen return nil diff --git a/go/vt/sqlparser/cached_size.go b/go/vt/sqlparser/cached_size.go index 6e29c346338..9703d189b7a 100644 --- a/go/vt/sqlparser/cached_size.go +++ b/go/vt/sqlparser/cached_size.go @@ -177,6 +177,8 @@ func (cached *AlterDatabase) CachedSize(alloc bool) int64 { if alloc { size += int64(64) } + // field Comments *vitess.io/vitess/go/vt/sqlparser.ParsedComments + size += cached.Comments.CachedSize(true) // field DBName vitess.io/vitess/go/vt/sqlparser.IdentifierCS size += cached.DBName.CachedSize(false) // field AlterOptions []vitess.io/vitess/go/vt/sqlparser.DatabaseOption @@ -834,7 +836,7 @@ func (cached *CommonTableExpr) CachedSize(alloc bool) int64 { } size := int64(0) if alloc { - size += int64(48) + size += int64(64) } // field ID vitess.io/vitess/go/vt/sqlparser.IdentifierCS size += cached.ID.CachedSize(false) @@ -845,8 +847,10 @@ func (cached *CommonTableExpr) CachedSize(alloc bool) int64 { size += elem.CachedSize(false) } } - // field Subquery *vitess.io/vitess/go/vt/sqlparser.Subquery - size += cached.Subquery.CachedSize(true) + // field Subquery vitess.io/vitess/go/vt/sqlparser.SelectStatement + if cc, ok := cached.Subquery.(cachedObject); ok { + size += cc.CachedSize(true) + } return size } func (cached *ComparisonExpr) CachedSize(alloc bool) int64 { @@ -3922,6 +3926,20 @@ func (cached *ShowThrottlerStatus) CachedSize(alloc bool) int64 { } return size } +func (cached *ShowTransactionStatus) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(32) + } + // field Keyspace string + size += hack.RuntimeAllocSize(int64(len(cached.Keyspace))) + // field TransactionID string + size += hack.RuntimeAllocSize(int64(len(cached.TransactionID))) + return size +} func (cached *StarExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/sqlparser/comments.go b/go/vt/sqlparser/comments.go index 780f1e67594..dff6f60e531 100644 --- a/go/vt/sqlparser/comments.go +++ b/go/vt/sqlparser/comments.go @@ -554,27 +554,6 @@ func AllowScatterDirective(stmt Statement) bool { return checkDirective(stmt, DirectiveAllowScatter) } -// ForeignKeyChecksState returns the state of foreign_key_checks variable if it is part of a SET_VAR optimizer hint in the comments. -func ForeignKeyChecksState(stmt Statement) *bool { - cmt, ok := stmt.(Commented) - if ok { - fkChecksVal := cmt.GetParsedComments().GetMySQLSetVarValue(sysvars.ForeignKeyChecks) - // If the value of the `foreign_key_checks` optimizer hint is something that doesn't make sense, - // then MySQL just ignores it and treats it like the case, where it is unspecified. We are choosing - // to have the same behaviour here. If the value doesn't match any of the acceptable values, we return nil, - // that signifies that no value was specified. - switch strings.ToLower(fkChecksVal) { - case "on", "1": - fkState := true - return &fkState - case "off", "0": - fkState := false - return &fkState - } - } - return nil -} - func checkDirective(stmt Statement, key string) bool { cmt, ok := stmt.(Commented) if ok { @@ -583,42 +562,43 @@ func checkDirective(stmt Statement, key string) bool { return false } -// GetPriorityFromStatement gets the priority from the provided Statement, using DirectivePriority -func GetPriorityFromStatement(statement Statement) (string, error) { - commentedStatement, ok := statement.(Commented) - // This would mean that the statement lacks comments, so we can't obtain the workload from it. Hence default to - // empty priority +type QueryHints struct { + IgnoreMaxMemoryRows bool + Consolidator querypb.ExecuteOptions_Consolidator + Workload string + ForeignKeyChecks *bool + Priority string + Timeout *int +} + +func BuildQueryHints(stmt Statement) (qh QueryHints, err error) { + qh = QueryHints{} + + comment, ok := stmt.(Commented) if !ok { - return "", nil + return qh, nil } - directives := commentedStatement.GetParsedComments().Directives() - priority, ok := directives.GetString(DirectivePriority, "") - if !ok || priority == "" { - return "", nil - } + directives := comment.GetParsedComments().Directives() - intPriority, err := strconv.Atoi(priority) - if err != nil || intPriority < 0 || intPriority > MaxPriorityValue { - return "", ErrInvalidPriority + qh.Priority, err = getPriority(directives) + if err != nil { + return qh, err } + qh.IgnoreMaxMemoryRows = directives.IsSet(DirectiveIgnoreMaxMemoryRows) + qh.Consolidator = getConsolidator(stmt, directives) + qh.Workload = getWorkload(directives) + qh.ForeignKeyChecks = getForeignKeyChecksState(comment) + qh.Timeout = getQueryTimeout(directives) - return priority, nil + return qh, nil } -// Consolidator returns the consolidator option. -func Consolidator(stmt Statement) querypb.ExecuteOptions_Consolidator { - var comments *ParsedComments - switch stmt := stmt.(type) { - case *Select: - comments = stmt.Comments - default: - return querypb.ExecuteOptions_CONSOLIDATOR_UNSPECIFIED - } - if comments == nil { +// getConsolidator returns the consolidator option. +func getConsolidator(stmt Statement, directives *CommentDirectives) querypb.ExecuteOptions_Consolidator { + if _, isSelect := stmt.(SelectStatement); !isSelect { return querypb.ExecuteOptions_CONSOLIDATOR_UNSPECIFIED } - directives := comments.Directives() strv, isSet := directives.GetString(DirectiveConsolidator, "") if !isSet { return querypb.ExecuteOptions_CONSOLIDATOR_UNSPECIFIED @@ -629,18 +609,56 @@ func Consolidator(stmt Statement) querypb.ExecuteOptions_Consolidator { return querypb.ExecuteOptions_CONSOLIDATOR_UNSPECIFIED } -// GetWorkloadNameFromStatement gets the workload name from the provided Statement, using workloadLabel as the name of +// getWorkload gets the workload name from the provided Statement, using workloadLabel as the name of // the query directive that specifies it. -func GetWorkloadNameFromStatement(statement Statement) string { - commentedStatement, ok := statement.(Commented) - // This would mean that the statement lacks comments, so we can't obtain the workload from it. Hence default to - // empty workload name - if !ok { - return "" +func getWorkload(directives *CommentDirectives) string { + workloadName, _ := directives.GetString(DirectiveWorkloadName, "") + return workloadName +} + +// getForeignKeyChecksState returns the state of foreign_key_checks variable if it is part of a SET_VAR optimizer hint in the comments. +func getForeignKeyChecksState(cmt Commented) *bool { + fkChecksVal := cmt.GetParsedComments().GetMySQLSetVarValue(sysvars.ForeignKeyChecks) + // If the value of the `foreign_key_checks` optimizer hint is something that doesn't make sense, + // then MySQL just ignores it and treats it like the case, where it is unspecified. We are choosing + // to have the same behaviour here. If the value doesn't match any of the acceptable values, we return nil, + // that signifies that no value was specified. + switch strings.ToLower(fkChecksVal) { + case "on", "1": + fkState := true + return &fkState + case "off", "0": + fkState := false + return &fkState } + return nil +} - directives := commentedStatement.GetParsedComments().Directives() - workloadName, _ := directives.GetString(DirectiveWorkloadName, "") +// getPriority gets the priority from the provided Statement, using DirectivePriority +func getPriority(directives *CommentDirectives) (string, error) { + priority, ok := directives.GetString(DirectivePriority, "") + if !ok || priority == "" { + return "", nil + } - return workloadName + intPriority, err := strconv.Atoi(priority) + if err != nil || intPriority < 0 || intPriority > MaxPriorityValue { + return "", ErrInvalidPriority + } + + return priority, nil +} + +// getQueryTimeout gets the query timeout from the provided Statement, using DirectiveQueryTimeout +func getQueryTimeout(directives *CommentDirectives) *int { + timeoutString, ok := directives.GetString(DirectiveQueryTimeout, "") + if !ok || timeoutString == "" { + return nil + } + + timeout, err := strconv.Atoi(timeoutString) + if err != nil || timeout < 0 { + return nil + } + return &timeout } diff --git a/go/vt/sqlparser/comments_test.go b/go/vt/sqlparser/comments_test.go index 42d02e35652..7f36645901c 100644 --- a/go/vt/sqlparser/comments_test.go +++ b/go/vt/sqlparser/comments_test.go @@ -474,8 +474,10 @@ func TestConsolidator(t *testing.T) { for _, test := range testCases { t.Run(test.query, func(t *testing.T) { stmt, _ := parser.Parse(test.query) - got := Consolidator(stmt) - assert.Equalf(t, test.expected, got, fmt.Sprintf("Consolidator(stmt) returned %v but expected %v", got, test.expected)) + qh, err := BuildQueryHints(stmt) + require.NoError(t, err) + assert.Equalf(t, test.expected, qh.Consolidator, + "Consolidator(stmt) returned %v but expected %v", qh.Consolidator, test.expected) }) } } @@ -534,12 +536,12 @@ func TestGetPriorityFromStatement(t *testing.T) { t.Parallel() stmt, err := parser.Parse(testCase.query) assert.NoError(t, err) - actualPriority, actualError := GetPriorityFromStatement(stmt) + qh, err := BuildQueryHints(stmt) if testCase.expectedError != nil { - assert.ErrorIs(t, actualError, testCase.expectedError) + assert.ErrorIs(t, err, testCase.expectedError) } else { assert.NoError(t, err) - assert.Equal(t, testCase.expectedPriority, actualPriority) + assert.Equal(t, testCase.expectedPriority, qh.Priority) } }) } @@ -661,3 +663,38 @@ func TestSetMySQLSetVarValue(t *testing.T) { }) } } + +// TestQueryTimeout tests the extraction of Query_Timeout_MS from the comments. +func TestQueryTimeout(t *testing.T) { + testCases := []struct { + query string + expTimeout int + noTimeout bool + }{{ + query: "select * from a_table", + noTimeout: true, + }, { + query: "select /*vt+ QUERY_TIMEOUT_MS=21 */ * from another_table", + expTimeout: 21, + }, { + query: "select /*vt+ QUERY_TIMEOUT_MS=0 */ * from another_table", + expTimeout: 0, + }, { + query: "select /*vt+ PRIORITY=-42 */ * from another_table", + noTimeout: true, + }} + + parser := NewTestParser() + for _, tc := range testCases { + t.Run(tc.query, func(t *testing.T) { + stmt, err := parser.Parse(tc.query) + assert.NoError(t, err) + qh, _ := BuildQueryHints(stmt) + if tc.noTimeout { + assert.Nil(t, qh.Timeout) + } else { + assert.Equal(t, tc.expTimeout, *qh.Timeout) + } + }) + } +} diff --git a/go/vt/sqlparser/constants.go b/go/vt/sqlparser/constants.go index 228546cb422..1c8f831274c 100644 --- a/go/vt/sqlparser/constants.go +++ b/go/vt/sqlparser/constants.go @@ -23,7 +23,11 @@ const ( // Select.Distinct AllStr = "all " DistinctStr = "distinct " + HighPriorityStr = "high_priority " StraightJoinHint = "straight_join " + SQLSmallResultStr = "sql_small_result " + SQLBigResultStr = "sql_big_result " + SQLBufferResultStr = "sql_buffer_result " SQLCalcFoundRowsStr = "sql_calc_found_rows " // Select.Lock @@ -165,19 +169,17 @@ const ( IsNotFalseStr = "is not false" // BinaryExpr.Operator - BitAndStr = "&" - BitOrStr = "|" - BitXorStr = "^" - PlusStr = "+" - MinusStr = "-" - MultStr = "*" - DivStr = "/" - IntDivStr = "div" - ModStr = "%" - ShiftLeftStr = "<<" - ShiftRightStr = ">>" - JSONExtractOpStr = "->" - JSONUnquoteExtractOpStr = "->>" + BitAndStr = "&" + BitOrStr = "|" + BitXorStr = "^" + PlusStr = "+" + MinusStr = "-" + MultStr = "*" + DivStr = "/" + IntDivStr = "div" + ModStr = "%" + ShiftLeftStr = "<<" + ShiftRightStr = ">>" // UnaryExpr.Operator UPlusStr = "+" @@ -272,6 +274,8 @@ const ( QueriesStr = "queries" AllVExplainStr = "all" PlanStr = "plan" + TraceStr = "trace" + KeysStr = "keys" // Lock Types ReadStr = "read" @@ -686,47 +690,6 @@ const ( All ) -func (op ComparisonExprOperator) Inverse() ComparisonExprOperator { - switch op { - case EqualOp: - return NotEqualOp - case LessThanOp: - return GreaterEqualOp - case GreaterThanOp: - return LessEqualOp - case LessEqualOp: - return GreaterThanOp - case GreaterEqualOp: - return LessThanOp - case NotEqualOp: - return EqualOp - case NullSafeEqualOp: - return NotEqualOp - case InOp: - return NotInOp - case NotInOp: - return InOp - case LikeOp: - return NotLikeOp - case NotLikeOp: - return LikeOp - case RegexpOp: - return NotRegexpOp - case NotRegexpOp: - return RegexpOp - } - panic("unreachable") -} - -func (op ComparisonExprOperator) IsCommutative() bool { - switch op { - case EqualOp, NotEqualOp, NullSafeEqualOp: - return true - default: - return false - } -} - // Constant for Enum Type - IsExprOperator const ( IsNullOp IsExprOperator = iota @@ -750,8 +713,6 @@ const ( ModOp ShiftLeftOp ShiftRightOp - JSONExtractOp - JSONUnquoteExtractOp ) // Constant for Enum Type - UnaryExprOperator @@ -842,6 +803,8 @@ const ( QueriesVExplainType VExplainType = iota PlanVExplainType AllVExplainType + TraceVExplainType + KeysVExplainType ) // Constant for Enum Type - SelectIntoType @@ -945,6 +908,7 @@ const ( CancelMigrationType CancelAllMigrationType CleanupMigrationType + CleanupAllMigrationType ThrottleMigrationType ThrottleAllMigrationType UnthrottleMigrationType diff --git a/go/vt/sqlparser/encodable_test.go b/go/vt/sqlparser/encodable_test.go index f11be5e6452..dcbaa893595 100644 --- a/go/vt/sqlparser/encodable_test.go +++ b/go/vt/sqlparser/encodable_test.go @@ -28,6 +28,15 @@ func TestEncodable(t *testing.T) { in Encodable out string }{{ + in: InsertValues{{ + sqltypes.NewInt64(1), + sqltypes.NewVarChar("foo('a')"), + }, { + sqltypes.NewInt64(2), + sqltypes.NewVarChar("bar(`b`)"), + }}, + out: "(1, 'foo(\\'a\\')'), (2, 'bar(`b`)')", + }, { in: InsertValues{{ sqltypes.NewInt64(1), sqltypes.NewVarBinary("foo('a')"), @@ -35,14 +44,14 @@ func TestEncodable(t *testing.T) { sqltypes.NewInt64(2), sqltypes.NewVarBinary("bar(`b`)"), }}, - out: "(1, 'foo(\\'a\\')'), (2, 'bar(`b`)')", + out: "(1, _binary'foo(\\'a\\')'), (2, _binary'bar(`b`)')", }, { // Single column. in: &TupleEqualityList{ Columns: []IdentifierCI{NewIdentifierCI("pk")}, Rows: [][]sqltypes.Value{ {sqltypes.NewInt64(1)}, - {sqltypes.NewVarBinary("aa")}, + {sqltypes.NewVarChar("aa")}, }, }, out: "pk in (1, 'aa')", @@ -53,11 +62,11 @@ func TestEncodable(t *testing.T) { Rows: [][]sqltypes.Value{ { sqltypes.NewInt64(1), - sqltypes.NewVarBinary("aa"), + sqltypes.NewVarChar("aa"), }, { sqltypes.NewInt64(2), - sqltypes.NewVarBinary("bb"), + sqltypes.NewVarChar("bb"), }, }, }, diff --git a/go/vt/sqlparser/goyacc/goyacc.go b/go/vt/sqlparser/goyacc/goyacc.go index 51650b0891e..14ab8c2eed7 100644 --- a/go/vt/sqlparser/goyacc/goyacc.go +++ b/go/vt/sqlparser/goyacc/goyacc.go @@ -85,7 +85,7 @@ const ( ERRCODE = 8190 ACCEPTCODE = 8191 YYLEXUNK = 3 - TOKSTART = 4 //index of first defined token + TOKSTART = 4 // index of first defined token ) // no, left, right, binary assoc. @@ -617,7 +617,7 @@ outer: } j = chfind(2, tokname) if j >= NTBASE { - lerrorf(ruleline, "nonterminal "+nontrst[j-NTBASE].name+" illegal after %%prec") + lerrorf(ruleline, "nonterminal %s illegal after %%prec", nontrst[j-NTBASE].name) } levprd[nprod] = toklev[j] t = gettok() @@ -1730,7 +1730,7 @@ more: } if pempty[i] != OK { fatfl = 0 - errorf("nonterminal " + nontrst[i].name + " never derives any token string") + errorf("nonterminal %s never derives any token string", nontrst[i].name) } } @@ -2937,7 +2937,7 @@ func others() { aryfil(temp1, nprod, 0) // - //yyr2 is the number of rules for each production + // yyr2 is the number of rules for each production // for i = 1; i < nprod; i++ { temp1[i] = len(prdptr[i]) - 2 @@ -3276,7 +3276,7 @@ func getrune(f *bufio.Reader) rune { if err != nil { errorf("read error: %v", err) } - //fmt.Printf("rune = %v n=%v\n", string(c), n); + // fmt.Printf("rune = %v n=%v\n", string(c), n); return c } @@ -3295,7 +3295,7 @@ func open(s string) *bufio.Reader { if err != nil { errorf("error opening %v: %v", s, err) } - //fmt.Printf("open %v\n", s); + // fmt.Printf("open %v\n", s); return bufio.NewReader(fi) } @@ -3304,7 +3304,7 @@ func create(s string) *bufio.Writer { if err != nil { errorf("error creating %v: %v", s, err) } - //fmt.Printf("create %v mode %v\n", s); + // fmt.Printf("create %v mode %v\n", s); return bufio.NewWriter(fo) } diff --git a/go/vt/sqlparser/keywords.go b/go/vt/sqlparser/keywords.go index a10fbd8384a..e32d7d0b72a 100644 --- a/go/vt/sqlparser/keywords.go +++ b/go/vt/sqlparser/keywords.go @@ -315,7 +315,7 @@ var keywords = []keyword{ {"hash", HASH}, {"having", HAVING}, {"header", HEADER}, - {"high_priority", UNUSED}, + {"high_priority", HIGH_PRIORITY}, {"hosts", HOSTS}, {"hour", HOUR}, {"hour_microsecond", HOUR_MICROSECOND}, @@ -594,11 +594,12 @@ var keywords = []keyword{ {"sqlexception", UNUSED}, {"sqlstate", UNUSED}, {"sqlwarning", UNUSED}, - {"sql_big_result", UNUSED}, + {"sql_big_result", SQL_BIG_RESULT}, {"sql_cache", SQL_CACHE}, {"sql_calc_found_rows", SQL_CALC_FOUND_ROWS}, {"sql_no_cache", SQL_NO_CACHE}, - {"sql_small_result", UNUSED}, + {"sql_small_result", SQL_SMALL_RESULT}, + {"sql_buffer_result", SQL_BUFFER_RESULT}, {"sql_tsi_day", SQL_TSI_DAY}, {"sql_tsi_week", SQL_TSI_WEEK}, {"sql_tsi_hour", SQL_TSI_HOUR}, @@ -710,8 +711,10 @@ var keywords = []keyword{ {"tinyint", TINYINT}, {"tinytext", TINYTEXT}, {"to", TO}, + {"trace", TRACE}, {"trailing", TRAILING}, {"transaction", TRANSACTION}, + {"transactions", TRANSACTIONS}, {"tree", TREE}, {"traditional", TRADITIONAL}, {"trigger", TRIGGER}, @@ -728,6 +731,7 @@ var keywords = []keyword{ {"unique", UNIQUE}, {"unknown", UNKNOWN}, {"unlock", UNLOCK}, + {"unresolved", UNRESOLVED}, {"unsigned", UNSIGNED}, {"unthrottle", UNTHROTTLE}, {"update", UPDATE}, @@ -751,6 +755,7 @@ var keywords = []keyword{ {"varcharacter", UNUSED}, {"variance", VARIANCE}, {"varying", UNUSED}, + {"vector", VECTOR}, {"vexplain", VEXPLAIN}, {"vgtid_executed", VGTID_EXECUTED}, {"virtual", VIRTUAL}, diff --git a/go/vt/sqlparser/normalizer_test.go b/go/vt/sqlparser/normalizer_test.go index c574b00832d..7919a321c91 100644 --- a/go/vt/sqlparser/normalizer_test.go +++ b/go/vt/sqlparser/normalizer_test.go @@ -230,6 +230,23 @@ func TestNormalize(t *testing.T) { outbv: map[string]*querypb.BindVariable{ "v1": sqltypes.BitNumBindVariable([]byte("0b11")), }, + }, { + // json value in insert + in: "insert into t values ('{\"k\", \"v\"}')", + outstmt: "insert into t values (:bv1 /* VARCHAR */)", + outbv: map[string]*querypb.BindVariable{ + "bv1": sqltypes.StringBindVariable("{\"k\", \"v\"}"), + }, + }, { + // json function in insert + in: "insert into t values (JSON_OBJECT('_id', 27, 'name', 'carrot'))", + outstmt: "insert into t values (json_object(:bv1 /* VARCHAR */, :bv2 /* INT64 */, :bv3 /* VARCHAR */, :bv4 /* VARCHAR */))", + outbv: map[string]*querypb.BindVariable{ + "bv1": sqltypes.StringBindVariable("_id"), + "bv2": sqltypes.Int64BindVariable(27), + "bv3": sqltypes.StringBindVariable("name"), + "bv4": sqltypes.StringBindVariable("carrot"), + }, }, { // ORDER BY column_position in: "select a, b from t order by 1 asc", @@ -418,6 +435,13 @@ func TestNormalize(t *testing.T) { "bv2": sqltypes.Int64BindVariable(2), "bv3": sqltypes.TestBindVariable([]any{1, 2}), }, + }, { + in: "SELECT 1 WHERE (~ (1||0)) IS NULL", + outstmt: "select :bv1 /* INT64 */ from dual where ~(:bv1 /* INT64 */ or :bv2 /* INT64 */) is null", + outbv: map[string]*querypb.BindVariable{ + "bv1": sqltypes.Int64BindVariable(1), + "bv2": sqltypes.Int64BindVariable(0), + }, }} parser := NewTestParser() for _, tc := range testcases { @@ -508,6 +532,7 @@ func TestNormalizeOneCasae(t *testing.T) { err = Normalize(tree, NewReservedVars("vtg", known), bv) require.NoError(t, err) normalizerOutput := String(tree) + require.EqualValues(t, testOne.output, normalizerOutput) if normalizerOutput == "otheradmin" || normalizerOutput == "otherread" { return } diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 4875bcc5f63..3a769f05688 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -1005,9 +1005,11 @@ var ( }, { input: "select /* u~ */ 1 from t where a = ~b", }, { - input: "select /* -> */ a.b -> 'ab' from t", + input: "select /* -> */ a.b -> 'ab' from t", + output: "select /* -> */ json_extract(a.b, 'ab') from t", }, { - input: "select /* -> */ a.b ->> 'ab' from t", + input: "select /* -> */ a.b ->> 'ab' from t", + output: "select /* -> */ json_unquote(json_extract(a.b, 'ab')) from t", }, { input: "select /* empty function */ 1 from t where a = b()", }, { @@ -1228,6 +1230,9 @@ var ( input: "select /* bool in order by */ * from t order by a is null or b asc", }, { input: "select /* string in case statement */ if(max(case a when 'foo' then 1 else 0 end) = 1, 'foo', 'bar') as foobar from t", + }, { + input: "select 1 as vector", + output: "select 1 as `vector` from dual", }, { input: "/*!show databases*/", output: "show databases", @@ -1782,6 +1787,12 @@ var ( }, { input: `create index Indexes on b (col1)`, output: "alter table b add key `Indexes` (col1)", + }, { + input: `create /*vt+ foo=1 */ index Indexes on b (col1)`, + output: "alter /*vt+ foo=1 */ table b add key `Indexes` (col1)", + }, { + input: `alter /*vt+ foo=1 */ table b add key Indexes (col1)`, + output: "alter /*vt+ foo=1 */ table b add key `Indexes` (col1)", }, { input: `create fulltext index Indexes on b (col1)`, output: "alter table b add fulltext key `Indexes` (col1)", @@ -2428,6 +2439,21 @@ var ( input: "show vitess_migrations like '9748c3b7_7fdb_11eb_ac2c_f875a4d24e90'", }, { input: "show vitess_migration '9748c3b7_7fdb_11eb_ac2c_f875a4d24e90' logs", + }, { + input: "show transaction status for 'ks:-80:232323238342'", + }, { + input: "show transaction status for \"ks:-80:232323238342\"", + output: "show transaction status for 'ks:-80:232323238342'", + }, { + input: "show transaction status 'ks:-80:232323238342'", + output: "show transaction status for 'ks:-80:232323238342'", + }, { + input: "show transaction status \"ks:-80:232323238342\"", + output: "show transaction status for 'ks:-80:232323238342'", + }, { + input: "show unresolved transactions", + }, { + input: "show unresolved transactions for ks", }, { input: "revert vitess_migration '9748c3b7_7fdb_11eb_ac2c_f875a4d24e90'", }, { @@ -2436,6 +2462,8 @@ var ( input: "alter vitess_migration '9748c3b7_7fdb_11eb_ac2c_f875a4d24e90' retry", }, { input: "alter vitess_migration '9748c3b7_7fdb_11eb_ac2c_f875a4d24e90' cleanup", + }, { + input: "alter vitess_migration cleanup all", }, { input: "alter vitess_migration '9748c3b7_7fdb_11eb_ac2c_f875a4d24e90' launch", }, { @@ -2547,6 +2575,10 @@ var ( }, { input: "vexplain select * from t", output: "vexplain plan select * from t", + }, { + input: "vexplain trace select * from t", + }, { + input: "vexplain keys select * from t", }, { input: "explain analyze select * from t", }, { @@ -2646,9 +2678,24 @@ var ( }, { input: "select sql_no_cache straight_join distinct 'foo' from t", output: "select distinct sql_no_cache straight_join 'foo' from t", + }, { + input: "select sql_buffer_result 'foo' from t", + output: "select sql_buffer_result 'foo' from t", + }, { + input: "select high_priority 'foo' from t", + output: "select high_priority 'foo' from t", }, { input: "select straight_join distinct sql_no_cache 'foo' from t", output: "select distinct sql_no_cache straight_join 'foo' from t", + }, { + input: "select sql_small_result 'foo' from t", + output: "select sql_small_result 'foo' from t", + }, { + input: "select distinct sql_small_result 'foo' from t", + output: "select distinct sql_small_result 'foo' from t", + }, { + input: "select sql_big_result 'foo' from t", + output: "select sql_big_result 'foo' from t", }, { input: "select sql_calc_found_rows 'foo' from t", output: "select sql_calc_found_rows 'foo' from t", @@ -2762,12 +2809,12 @@ var ( }, { input: "rollback", }, { - input: "create database /* simple */ test_db", + input: "create /* simple */ database test_db", }, { input: "create schema test_db", output: "create database test_db", }, { - input: "create database /* simple */ if not exists test_db", + input: "create /* simple */ database if not exists test_db", }, { input: "create schema if not exists test_db", output: "create database if not exists test_db", @@ -4069,6 +4116,9 @@ func TestInvalid(t *testing.T) { }, { input: "select * from foo where b <=> any (select id from t1)", err: "syntax error at position 42", + }, { + input: "select _binary foo", + err: "syntax error at position 19 near 'foo'", }, } @@ -5892,12 +5942,16 @@ partition by range (YEAR(purchased)) subpartition by hash (TO_DAYS(purchased)) }, { input: "create table t (id int, info JSON, INDEX zips((CAST(info->'$.field' AS unsigned ARRAY))))", - output: "create table t (\n\tid int,\n\tinfo JSON,\n\tkey zips ((cast(info -> '$.field' as unsigned array)))\n)", + output: "create table t (\n\tid int,\n\tinfo JSON,\n\tkey zips ((cast(json_extract(info, '$.field') as unsigned array)))\n)", }, { input: "create table t (id int, s varchar(255) default 'foo\"bar')", output: "create table t (\n\tid int,\n\ts varchar(255) default 'foo\"bar'\n)", }, + { + input: "create table t (id int, vec VECTOR(4))", + output: "create table t (\n\tid int,\n\tvec VECTOR(4)\n)", + }, } parser := NewTestParser() for _, test := range createTableQueries { @@ -6426,8 +6480,11 @@ func testFile(t *testing.T, filename, tempDir string) { errPresent := "" if err != nil { errPresent = err.Error() + expected.WriteString(fmt.Sprintf("ERROR\n%s\nEND\n", escapeNewLines(errPresent))) + } else { + out := String(tree) + expected.WriteString(fmt.Sprintf("OUTPUT\n%s\nEND\n", escapeNewLines(out))) } - expected.WriteString(fmt.Sprintf("ERROR\n%s\nEND\n", escapeNewLines(errPresent))) if err == nil || tcase.errStr != err.Error() { fail = true t.Errorf("File: %s, Line: %d\nDiff:\n%s\n[%s] \n[%s]", filename, tcase.lineno, cmp.Diff(tcase.errStr, errPresent), tcase.errStr, errPresent) diff --git a/go/vt/sqlparser/parsed_query.go b/go/vt/sqlparser/parsed_query.go index a612e555ee8..491e7400988 100644 --- a/go/vt/sqlparser/parsed_query.go +++ b/go/vt/sqlparser/parsed_query.go @@ -101,7 +101,7 @@ func EncodeValue(buf *strings.Builder, value *querypb.BindVariable) { sqltypes.ProtoToValue(bv).EncodeSQLStringBuilder(buf) } buf.WriteByte(')') - case querypb.Type_JSON: + case querypb.Type_RAW: v, _ := sqltypes.BindVariableToValue(value) buf.Write(v.Raw()) default: diff --git a/go/vt/sqlparser/parsed_query_test.go b/go/vt/sqlparser/parsed_query_test.go index 8ade9d4d31c..1458a3e6527 100644 --- a/go/vt/sqlparser/parsed_query_test.go +++ b/go/vt/sqlparser/parsed_query_test.go @@ -81,6 +81,14 @@ func TestGenerateQuery(t *testing.T) { "vals": sqltypes.TestBindVariable([]any{1, "aa"}), }, output: "select * from a where id in (1, 'aa')", + }, { + desc: "json bindvar and raw bindvar", + query: "insert into t values (:v1, :v2)", + bindVars: map[string]*querypb.BindVariable{ + "v1": sqltypes.ValueBindVariable(sqltypes.MakeTrusted(querypb.Type_JSON, []byte(`{"key": "value"}`))), + "v2": sqltypes.ValueBindVariable(sqltypes.MakeTrusted(querypb.Type_RAW, []byte(`json_object("k", "v")`))), + }, + output: `insert into t values ('{"key": "value"}', json_object("k", "v"))`, }, { desc: "list bind vars 0 arguments", query: "select * from a where id in ::vals", @@ -110,7 +118,7 @@ func TestGenerateQuery(t *testing.T) { Columns: []IdentifierCI{NewIdentifierCI("pk")}, Rows: [][]sqltypes.Value{ {sqltypes.NewInt64(1)}, - {sqltypes.NewVarBinary("aa")}, + {sqltypes.NewVarChar("aa")}, }, }, }, @@ -124,11 +132,11 @@ func TestGenerateQuery(t *testing.T) { Rows: [][]sqltypes.Value{ { sqltypes.NewInt64(1), - sqltypes.NewVarBinary("aa"), + sqltypes.NewVarChar("aa"), }, { sqltypes.NewInt64(2), - sqltypes.NewVarBinary("bb"), + sqltypes.NewVarChar("bb"), }, }, }, @@ -139,20 +147,19 @@ func TestGenerateQuery(t *testing.T) { parser := NewTestParser() for _, tcase := range tcases { - tree, err := parser.Parse(tcase.query) - if err != nil { - t.Errorf("parse failed for %s: %v", tcase.desc, err) - continue - } - buf := NewTrackedBuffer(nil) - buf.Myprintf("%v", tree) - pq := buf.ParsedQuery() - bytes, err := pq.GenerateQuery(tcase.bindVars, tcase.extras) - if err != nil { - assert.Equal(t, tcase.output, err.Error()) - } else { - assert.Equal(t, tcase.output, string(bytes)) - } + t.Run(tcase.query, func(t *testing.T) { + tree, err := parser.Parse(tcase.query) + require.NoError(t, err) + buf := NewTrackedBuffer(nil) + buf.Myprintf("%v", tree) + pq := buf.ParsedQuery() + bytes, err := pq.GenerateQuery(tcase.bindVars, tcase.extras) + if err != nil { + assert.Equal(t, tcase.output, err.Error()) + } else { + assert.Equal(t, tcase.output, bytes) + } + }) } } diff --git a/go/vt/sqlparser/precedence.go b/go/vt/sqlparser/precedence.go index ec590b23f95..1b5576f65b1 100644 --- a/go/vt/sqlparser/precedence.go +++ b/go/vt/sqlparser/precedence.go @@ -38,7 +38,6 @@ const ( P14 P15 P16 - P17 ) // precedenceFor returns the precedence of an expression. @@ -58,10 +57,7 @@ func precedenceFor(in Expr) Precendence { case *BetweenExpr: return P12 case *ComparisonExpr: - switch node.Operator { - case EqualOp, NotEqualOp, GreaterThanOp, GreaterEqualOp, LessThanOp, LessEqualOp, LikeOp, InOp, RegexpOp, NullSafeEqualOp: - return P11 - } + return P11 case *IsExpr: return P11 case *BinaryExpr: @@ -83,7 +79,7 @@ func precedenceFor(in Expr) Precendence { switch node.Operator { case UPlusOp, UMinusOp: return P4 - case BangOp: + default: return P3 } } diff --git a/go/vt/sqlparser/precedence_test.go b/go/vt/sqlparser/precedence_test.go index 0d29d8b87e3..690e6df8647 100644 --- a/go/vt/sqlparser/precedence_test.go +++ b/go/vt/sqlparser/precedence_test.go @@ -158,6 +158,9 @@ func TestParens(t *testing.T) { {in: "(10 - 2) - 1", expected: "10 - 2 - 1"}, {in: "10 - (2 - 1)", expected: "10 - (2 - 1)"}, {in: "0 <=> (1 and 0)", expected: "0 <=> (1 and 0)"}, + {in: "(~ (1||0)) IS NULL", expected: "~(1 or 0) is null"}, + {in: "1 not like ('a' is null)", expected: "1 not like ('a' is null)"}, + {in: ":vtg1 not like (:vtg2 is null)", expected: ":vtg1 not like (:vtg2 is null)"}, } parser := NewTestParser() diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 35bcad9362d..682efc9f6ec 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -40,722 +40,731 @@ const MULTIPLE_TEXT_LITERAL = 57347 const FUNCTION_CALL_NON_KEYWORD = 57348 const STRING_TYPE_PREFIX_NON_KEYWORD = 57349 const ANY_SOME = 57350 -const LEX_ERROR = 57351 -const UNION = 57352 -const SELECT = 57353 -const STREAM = 57354 -const VSTREAM = 57355 -const INSERT = 57356 -const UPDATE = 57357 -const DELETE = 57358 -const FROM = 57359 -const WHERE = 57360 -const GROUP = 57361 -const HAVING = 57362 -const ORDER = 57363 -const BY = 57364 -const LIMIT = 57365 -const OFFSET = 57366 -const FOR = 57367 -const DISTINCT = 57368 -const AS = 57369 -const EXISTS = 57370 -const ASC = 57371 -const DESC = 57372 -const INTO = 57373 -const DUPLICATE = 57374 -const DEFAULT = 57375 -const SET = 57376 -const LOCK = 57377 -const UNLOCK = 57378 -const KEYS = 57379 -const DO = 57380 -const CALL = 57381 -const ALL = 57382 -const ANY = 57383 -const SOME = 57384 -const DISTINCTROW = 57385 -const PARSER = 57386 -const GENERATED = 57387 -const ALWAYS = 57388 -const OUTFILE = 57389 -const S3 = 57390 -const DATA = 57391 -const LOAD = 57392 -const LINES = 57393 -const TERMINATED = 57394 -const ESCAPED = 57395 -const ENCLOSED = 57396 -const DUMPFILE = 57397 -const CSV = 57398 -const HEADER = 57399 -const MANIFEST = 57400 -const OVERWRITE = 57401 -const STARTING = 57402 -const OPTIONALLY = 57403 -const VALUES = 57404 -const LAST_INSERT_ID = 57405 -const NEXT = 57406 -const VALUE = 57407 -const SHARE = 57408 -const MODE = 57409 -const SQL_NO_CACHE = 57410 -const SQL_CACHE = 57411 -const SQL_CALC_FOUND_ROWS = 57412 -const JOIN = 57413 -const STRAIGHT_JOIN = 57414 -const LEFT = 57415 -const RIGHT = 57416 -const INNER = 57417 -const OUTER = 57418 -const CROSS = 57419 -const NATURAL = 57420 -const USE = 57421 -const FORCE = 57422 -const ON = 57423 -const USING = 57424 -const INPLACE = 57425 -const COPY = 57426 -const INSTANT = 57427 -const ALGORITHM = 57428 -const NONE = 57429 -const SHARED = 57430 -const EXCLUSIVE = 57431 -const SUBQUERY_AS_EXPR = 57432 -const STRING = 57433 -const ID = 57434 -const AT_ID = 57435 -const AT_AT_ID = 57436 -const HEX = 57437 -const NCHAR_STRING = 57438 -const INTEGRAL = 57439 -const FLOAT = 57440 -const DECIMAL = 57441 -const HEXNUM = 57442 -const COMMENT = 57443 -const COMMENT_KEYWORD = 57444 -const BITNUM = 57445 -const BIT_LITERAL = 57446 -const COMPRESSION = 57447 -const VALUE_ARG = 57448 -const LIST_ARG = 57449 -const OFFSET_ARG = 57450 -const JSON_PRETTY = 57451 -const JSON_STORAGE_SIZE = 57452 -const JSON_STORAGE_FREE = 57453 -const JSON_CONTAINS = 57454 -const JSON_CONTAINS_PATH = 57455 -const JSON_EXTRACT = 57456 -const JSON_KEYS = 57457 -const JSON_OVERLAPS = 57458 -const JSON_SEARCH = 57459 -const JSON_VALUE = 57460 -const JSON_ARRAYAGG = 57461 -const JSON_OBJECTAGG = 57462 -const EXTRACT = 57463 -const NULL = 57464 -const UNKNOWN = 57465 -const TRUE = 57466 -const FALSE = 57467 -const OFF = 57468 -const DISCARD = 57469 -const IMPORT = 57470 -const ENABLE = 57471 -const DISABLE = 57472 -const TABLESPACE = 57473 -const VIRTUAL = 57474 -const STORED = 57475 -const BOTH = 57476 -const LEADING = 57477 -const TRAILING = 57478 -const KILL = 57479 -const EMPTY_FROM_CLAUSE = 57480 -const LOWER_THAN_CHARSET = 57481 -const CHARSET = 57482 -const UNIQUE = 57483 -const KEY = 57484 -const EXPRESSION_PREC_SETTER = 57485 -const OR = 57486 -const XOR = 57487 -const AND = 57488 -const NOT = 57489 -const BETWEEN = 57490 -const CASE = 57491 -const WHEN = 57492 -const THEN = 57493 -const ELSE = 57494 -const END = 57495 -const LE = 57496 -const GE = 57497 -const NE = 57498 -const NULL_SAFE_EQUAL = 57499 -const IS = 57500 -const LIKE = 57501 -const REGEXP = 57502 -const RLIKE = 57503 -const IN = 57504 -const ASSIGNMENT_OPT = 57505 -const SHIFT_LEFT = 57506 -const SHIFT_RIGHT = 57507 -const DIV = 57508 -const MOD = 57509 -const UNARY = 57510 -const COLLATE = 57511 -const BINARY = 57512 -const UNDERSCORE_ARMSCII8 = 57513 -const UNDERSCORE_ASCII = 57514 -const UNDERSCORE_BIG5 = 57515 -const UNDERSCORE_BINARY = 57516 -const UNDERSCORE_CP1250 = 57517 -const UNDERSCORE_CP1251 = 57518 -const UNDERSCORE_CP1256 = 57519 -const UNDERSCORE_CP1257 = 57520 -const UNDERSCORE_CP850 = 57521 -const UNDERSCORE_CP852 = 57522 -const UNDERSCORE_CP866 = 57523 -const UNDERSCORE_CP932 = 57524 -const UNDERSCORE_DEC8 = 57525 -const UNDERSCORE_EUCJPMS = 57526 -const UNDERSCORE_EUCKR = 57527 -const UNDERSCORE_GB18030 = 57528 -const UNDERSCORE_GB2312 = 57529 -const UNDERSCORE_GBK = 57530 -const UNDERSCORE_GEOSTD8 = 57531 -const UNDERSCORE_GREEK = 57532 -const UNDERSCORE_HEBREW = 57533 -const UNDERSCORE_HP8 = 57534 -const UNDERSCORE_KEYBCS2 = 57535 -const UNDERSCORE_KOI8R = 57536 -const UNDERSCORE_KOI8U = 57537 -const UNDERSCORE_LATIN1 = 57538 -const UNDERSCORE_LATIN2 = 57539 -const UNDERSCORE_LATIN5 = 57540 -const UNDERSCORE_LATIN7 = 57541 -const UNDERSCORE_MACCE = 57542 -const UNDERSCORE_MACROMAN = 57543 -const UNDERSCORE_SJIS = 57544 -const UNDERSCORE_SWE7 = 57545 -const UNDERSCORE_TIS620 = 57546 -const UNDERSCORE_UCS2 = 57547 -const UNDERSCORE_UJIS = 57548 -const UNDERSCORE_UTF16 = 57549 -const UNDERSCORE_UTF16LE = 57550 -const UNDERSCORE_UTF32 = 57551 -const UNDERSCORE_UTF8 = 57552 -const UNDERSCORE_UTF8MB4 = 57553 -const UNDERSCORE_UTF8MB3 = 57554 -const INTERVAL = 57555 -const WINDOW_EXPR = 57556 -const JSON_EXTRACT_OP = 57557 -const JSON_UNQUOTE_EXTRACT_OP = 57558 -const CREATE = 57559 -const ALTER = 57560 -const DROP = 57561 -const RENAME = 57562 -const ANALYZE = 57563 -const ADD = 57564 -const FLUSH = 57565 -const CHANGE = 57566 -const MODIFY = 57567 -const DEALLOCATE = 57568 -const REVERT = 57569 -const QUERIES = 57570 -const SCHEMA = 57571 -const TABLE = 57572 -const INDEX = 57573 -const VIEW = 57574 -const TO = 57575 -const IGNORE = 57576 -const IF = 57577 -const PRIMARY = 57578 -const COLUMN = 57579 -const SPATIAL = 57580 -const FULLTEXT = 57581 -const KEY_BLOCK_SIZE = 57582 -const CHECK = 57583 -const INDEXES = 57584 -const ACTION = 57585 -const CASCADE = 57586 -const CONSTRAINT = 57587 -const FOREIGN = 57588 -const NO = 57589 -const REFERENCES = 57590 -const RESTRICT = 57591 -const SHOW = 57592 -const DESCRIBE = 57593 -const EXPLAIN = 57594 -const DATE = 57595 -const ESCAPE = 57596 -const REPAIR = 57597 -const OPTIMIZE = 57598 -const TRUNCATE = 57599 -const COALESCE = 57600 -const EXCHANGE = 57601 -const REBUILD = 57602 -const PARTITIONING = 57603 -const REMOVE = 57604 -const PREPARE = 57605 -const EXECUTE = 57606 -const MAXVALUE = 57607 -const PARTITION = 57608 -const REORGANIZE = 57609 -const LESS = 57610 -const THAN = 57611 -const PROCEDURE = 57612 -const TRIGGER = 57613 -const VINDEX = 57614 -const VINDEXES = 57615 -const DIRECTORY = 57616 -const NAME = 57617 -const UPGRADE = 57618 -const STATUS = 57619 -const VARIABLES = 57620 -const WARNINGS = 57621 -const CASCADED = 57622 -const DEFINER = 57623 -const OPTION = 57624 -const SQL = 57625 -const UNDEFINED = 57626 -const SEQUENCE = 57627 -const MERGE = 57628 -const TEMPORARY = 57629 -const TEMPTABLE = 57630 -const INVOKER = 57631 -const SECURITY = 57632 -const FIRST = 57633 -const AFTER = 57634 -const LAST = 57635 -const VITESS_MIGRATION = 57636 -const CANCEL = 57637 -const RETRY = 57638 -const LAUNCH = 57639 -const COMPLETE = 57640 -const CLEANUP = 57641 -const THROTTLE = 57642 -const UNTHROTTLE = 57643 -const FORCE_CUTOVER = 57644 -const EXPIRE = 57645 -const RATIO = 57646 -const VITESS_THROTTLER = 57647 -const BEGIN = 57648 -const START = 57649 -const TRANSACTION = 57650 -const COMMIT = 57651 -const ROLLBACK = 57652 -const SAVEPOINT = 57653 -const RELEASE = 57654 -const WORK = 57655 -const CONSISTENT = 57656 -const SNAPSHOT = 57657 -const BIT = 57658 -const TINYINT = 57659 -const SMALLINT = 57660 -const MEDIUMINT = 57661 -const INT = 57662 -const INTEGER = 57663 -const BIGINT = 57664 -const INTNUM = 57665 -const REAL = 57666 -const DOUBLE = 57667 -const FLOAT_TYPE = 57668 -const FLOAT4_TYPE = 57669 -const FLOAT8_TYPE = 57670 -const DECIMAL_TYPE = 57671 -const NUMERIC = 57672 -const TIME = 57673 -const TIMESTAMP = 57674 -const DATETIME = 57675 -const YEAR = 57676 -const CHAR = 57677 -const VARCHAR = 57678 -const BOOL = 57679 -const CHARACTER = 57680 -const VARBINARY = 57681 -const NCHAR = 57682 -const TEXT = 57683 -const TINYTEXT = 57684 -const MEDIUMTEXT = 57685 -const LONGTEXT = 57686 -const BLOB = 57687 -const TINYBLOB = 57688 -const MEDIUMBLOB = 57689 -const LONGBLOB = 57690 -const JSON = 57691 -const JSON_SCHEMA_VALID = 57692 -const JSON_SCHEMA_VALIDATION_REPORT = 57693 -const ENUM = 57694 -const GEOMETRY = 57695 -const POINT = 57696 -const LINESTRING = 57697 -const POLYGON = 57698 -const GEOMCOLLECTION = 57699 -const GEOMETRYCOLLECTION = 57700 -const MULTIPOINT = 57701 -const MULTILINESTRING = 57702 -const MULTIPOLYGON = 57703 -const ASCII = 57704 -const UNICODE = 57705 -const NULLX = 57706 -const AUTO_INCREMENT = 57707 -const APPROXNUM = 57708 -const SIGNED = 57709 -const UNSIGNED = 57710 -const ZEROFILL = 57711 -const PURGE = 57712 -const BEFORE = 57713 -const CODE = 57714 -const COLLATION = 57715 -const COLUMNS = 57716 -const DATABASES = 57717 -const ENGINES = 57718 -const EVENT = 57719 -const EXTENDED = 57720 -const FIELDS = 57721 -const FULL = 57722 -const FUNCTION = 57723 -const GTID_EXECUTED = 57724 -const KEYSPACES = 57725 -const OPEN = 57726 -const PLUGINS = 57727 -const PRIVILEGES = 57728 -const PROCESSLIST = 57729 -const SCHEMAS = 57730 -const TABLES = 57731 -const TRIGGERS = 57732 -const USER = 57733 -const VGTID_EXECUTED = 57734 -const VITESS_KEYSPACES = 57735 -const VITESS_METADATA = 57736 -const VITESS_MIGRATIONS = 57737 -const VITESS_REPLICATION_STATUS = 57738 -const VITESS_SHARDS = 57739 -const VITESS_TABLETS = 57740 -const VITESS_TARGET = 57741 -const VSCHEMA = 57742 -const VITESS_THROTTLED_APPS = 57743 -const NAMES = 57744 -const GLOBAL = 57745 -const SESSION = 57746 -const ISOLATION = 57747 -const LEVEL = 57748 -const READ = 57749 -const WRITE = 57750 -const ONLY = 57751 -const REPEATABLE = 57752 -const COMMITTED = 57753 -const UNCOMMITTED = 57754 -const SERIALIZABLE = 57755 -const ADDDATE = 57756 -const CURRENT_TIMESTAMP = 57757 -const DATABASE = 57758 -const CURRENT_DATE = 57759 -const CURDATE = 57760 -const DATE_ADD = 57761 -const DATE_SUB = 57762 -const NOW = 57763 -const SUBDATE = 57764 -const CURTIME = 57765 -const CURRENT_TIME = 57766 -const LOCALTIME = 57767 -const LOCALTIMESTAMP = 57768 -const CURRENT_USER = 57769 -const UTC_DATE = 57770 -const UTC_TIME = 57771 -const UTC_TIMESTAMP = 57772 -const SYSDATE = 57773 -const DAY = 57774 -const DAY_HOUR = 57775 -const DAY_MICROSECOND = 57776 -const DAY_MINUTE = 57777 -const DAY_SECOND = 57778 -const HOUR = 57779 -const HOUR_MICROSECOND = 57780 -const HOUR_MINUTE = 57781 -const HOUR_SECOND = 57782 -const MICROSECOND = 57783 -const MINUTE = 57784 -const MINUTE_MICROSECOND = 57785 -const MINUTE_SECOND = 57786 -const MONTH = 57787 -const QUARTER = 57788 -const SECOND = 57789 -const SECOND_MICROSECOND = 57790 -const YEAR_MONTH = 57791 -const WEEK = 57792 -const SQL_TSI_DAY = 57793 -const SQL_TSI_WEEK = 57794 -const SQL_TSI_HOUR = 57795 -const SQL_TSI_MINUTE = 57796 -const SQL_TSI_MONTH = 57797 -const SQL_TSI_QUARTER = 57798 -const SQL_TSI_SECOND = 57799 -const SQL_TSI_MICROSECOND = 57800 -const SQL_TSI_YEAR = 57801 -const REPLACE = 57802 -const CONVERT = 57803 -const CAST = 57804 -const SUBSTR = 57805 -const SUBSTRING = 57806 -const MID = 57807 -const SEPARATOR = 57808 -const TIMESTAMPADD = 57809 -const TIMESTAMPDIFF = 57810 -const WEIGHT_STRING = 57811 -const LTRIM = 57812 -const RTRIM = 57813 -const TRIM = 57814 -const JSON_ARRAY = 57815 -const JSON_OBJECT = 57816 -const JSON_QUOTE = 57817 -const JSON_DEPTH = 57818 -const JSON_TYPE = 57819 -const JSON_LENGTH = 57820 -const JSON_VALID = 57821 -const JSON_ARRAY_APPEND = 57822 -const JSON_ARRAY_INSERT = 57823 -const JSON_INSERT = 57824 -const JSON_MERGE = 57825 -const JSON_MERGE_PATCH = 57826 -const JSON_MERGE_PRESERVE = 57827 -const JSON_REMOVE = 57828 -const JSON_REPLACE = 57829 -const JSON_SET = 57830 -const JSON_UNQUOTE = 57831 -const COUNT = 57832 -const AVG = 57833 -const MAX = 57834 -const MIN = 57835 -const SUM = 57836 -const GROUP_CONCAT = 57837 -const BIT_AND = 57838 -const BIT_OR = 57839 -const BIT_XOR = 57840 -const STD = 57841 -const STDDEV = 57842 -const STDDEV_POP = 57843 -const STDDEV_SAMP = 57844 -const VAR_POP = 57845 -const VAR_SAMP = 57846 -const VARIANCE = 57847 -const ANY_VALUE = 57848 -const REGEXP_INSTR = 57849 -const REGEXP_LIKE = 57850 -const REGEXP_REPLACE = 57851 -const REGEXP_SUBSTR = 57852 -const ExtractValue = 57853 -const UpdateXML = 57854 -const GET_LOCK = 57855 -const RELEASE_LOCK = 57856 -const RELEASE_ALL_LOCKS = 57857 -const IS_FREE_LOCK = 57858 -const IS_USED_LOCK = 57859 -const LOCATE = 57860 -const POSITION = 57861 -const ST_GeometryCollectionFromText = 57862 -const ST_GeometryFromText = 57863 -const ST_LineStringFromText = 57864 -const ST_MultiLineStringFromText = 57865 -const ST_MultiPointFromText = 57866 -const ST_MultiPolygonFromText = 57867 -const ST_PointFromText = 57868 -const ST_PolygonFromText = 57869 -const ST_GeometryCollectionFromWKB = 57870 -const ST_GeometryFromWKB = 57871 -const ST_LineStringFromWKB = 57872 -const ST_MultiLineStringFromWKB = 57873 -const ST_MultiPointFromWKB = 57874 -const ST_MultiPolygonFromWKB = 57875 -const ST_PointFromWKB = 57876 -const ST_PolygonFromWKB = 57877 -const ST_AsBinary = 57878 -const ST_AsText = 57879 -const ST_Dimension = 57880 -const ST_Envelope = 57881 -const ST_IsSimple = 57882 -const ST_IsEmpty = 57883 -const ST_GeometryType = 57884 -const ST_X = 57885 -const ST_Y = 57886 -const ST_Latitude = 57887 -const ST_Longitude = 57888 -const ST_EndPoint = 57889 -const ST_IsClosed = 57890 -const ST_Length = 57891 -const ST_NumPoints = 57892 -const ST_StartPoint = 57893 -const ST_PointN = 57894 -const ST_Area = 57895 -const ST_Centroid = 57896 -const ST_ExteriorRing = 57897 -const ST_InteriorRingN = 57898 -const ST_NumInteriorRings = 57899 -const ST_NumGeometries = 57900 -const ST_GeometryN = 57901 -const ST_LongFromGeoHash = 57902 -const ST_PointFromGeoHash = 57903 -const ST_LatFromGeoHash = 57904 -const ST_GeoHash = 57905 -const ST_AsGeoJSON = 57906 -const ST_GeomFromGeoJSON = 57907 -const MATCH = 57908 -const AGAINST = 57909 -const BOOLEAN = 57910 -const LANGUAGE = 57911 -const WITH = 57912 -const QUERY = 57913 -const EXPANSION = 57914 -const WITHOUT = 57915 -const VALIDATION = 57916 -const ROLLUP = 57917 -const UNUSED = 57918 -const ARRAY = 57919 -const BYTE = 57920 -const CUME_DIST = 57921 -const DESCRIPTION = 57922 -const DENSE_RANK = 57923 -const EMPTY = 57924 -const EXCEPT = 57925 -const FIRST_VALUE = 57926 -const GROUPING = 57927 -const GROUPS = 57928 -const JSON_TABLE = 57929 -const LAG = 57930 -const LAST_VALUE = 57931 -const LATERAL = 57932 -const LEAD = 57933 -const NTH_VALUE = 57934 -const NTILE = 57935 -const OF = 57936 -const OVER = 57937 -const PERCENT_RANK = 57938 -const RANK = 57939 -const RECURSIVE = 57940 -const ROW_NUMBER = 57941 -const SYSTEM = 57942 -const WINDOW = 57943 -const ACTIVE = 57944 -const ADMIN = 57945 -const AUTOEXTEND_SIZE = 57946 -const BUCKETS = 57947 -const CLONE = 57948 -const COLUMN_FORMAT = 57949 -const COMPONENT = 57950 -const DEFINITION = 57951 -const ENFORCED = 57952 -const ENGINE_ATTRIBUTE = 57953 -const EXCLUDE = 57954 -const FOLLOWING = 57955 -const GET_MASTER_PUBLIC_KEY = 57956 -const HISTOGRAM = 57957 -const HISTORY = 57958 -const INACTIVE = 57959 -const INVISIBLE = 57960 -const LOCKED = 57961 -const MASTER_COMPRESSION_ALGORITHMS = 57962 -const MASTER_PUBLIC_KEY_PATH = 57963 -const MASTER_TLS_CIPHERSUITES = 57964 -const MASTER_ZSTD_COMPRESSION_LEVEL = 57965 -const NESTED = 57966 -const NETWORK_NAMESPACE = 57967 -const NOWAIT = 57968 -const NULLS = 57969 -const OJ = 57970 -const OLD = 57971 -const OPTIONAL = 57972 -const ORDINALITY = 57973 -const ORGANIZATION = 57974 -const OTHERS = 57975 -const PARTIAL = 57976 -const PATH = 57977 -const PERSIST = 57978 -const PERSIST_ONLY = 57979 -const PRECEDING = 57980 -const PRIVILEGE_CHECKS_USER = 57981 -const PROCESS = 57982 -const RANDOM = 57983 -const REFERENCE = 57984 -const REQUIRE_ROW_FORMAT = 57985 -const RESOURCE = 57986 -const RESPECT = 57987 -const RESTART = 57988 -const RETAIN = 57989 -const REUSE = 57990 -const ROLE = 57991 -const SECONDARY = 57992 -const SECONDARY_ENGINE = 57993 -const SECONDARY_ENGINE_ATTRIBUTE = 57994 -const SECONDARY_LOAD = 57995 -const SECONDARY_UNLOAD = 57996 -const SIMPLE = 57997 -const SKIP = 57998 -const SRID = 57999 -const THREAD_PRIORITY = 58000 -const TIES = 58001 -const UNBOUNDED = 58002 -const VCPU = 58003 -const VISIBLE = 58004 -const RETURNING = 58005 -const FORMAT_BYTES = 58006 -const FORMAT_PICO_TIME = 58007 -const PS_CURRENT_THREAD_ID = 58008 -const PS_THREAD_ID = 58009 -const GTID_SUBSET = 58010 -const GTID_SUBTRACT = 58011 -const WAIT_FOR_EXECUTED_GTID_SET = 58012 -const WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS = 58013 -const FORMAT = 58014 -const TREE = 58015 -const VITESS = 58016 -const TRADITIONAL = 58017 -const VTEXPLAIN = 58018 -const VEXPLAIN = 58019 -const PLAN = 58020 -const LOCAL = 58021 -const LOW_PRIORITY = 58022 -const NO_WRITE_TO_BINLOG = 58023 -const LOGS = 58024 -const ERROR = 58025 -const GENERAL = 58026 -const HOSTS = 58027 -const OPTIMIZER_COSTS = 58028 -const USER_RESOURCES = 58029 -const SLOW = 58030 -const CHANNEL = 58031 -const RELAY = 58032 -const EXPORT = 58033 -const CURRENT = 58034 -const ROW = 58035 -const ROWS = 58036 -const AVG_ROW_LENGTH = 58037 -const CONNECTION = 58038 -const CHECKSUM = 58039 -const DELAY_KEY_WRITE = 58040 -const ENCRYPTION = 58041 -const ENGINE = 58042 -const INSERT_METHOD = 58043 -const MAX_ROWS = 58044 -const MIN_ROWS = 58045 -const PACK_KEYS = 58046 -const PASSWORD = 58047 -const FIXED = 58048 -const DYNAMIC = 58049 -const COMPRESSED = 58050 -const REDUNDANT = 58051 -const COMPACT = 58052 -const ROW_FORMAT = 58053 -const STATS_AUTO_RECALC = 58054 -const STATS_PERSISTENT = 58055 -const STATS_SAMPLE_PAGES = 58056 -const STORAGE = 58057 -const MEMORY = 58058 -const DISK = 58059 -const PARTITIONS = 58060 -const LINEAR = 58061 -const RANGE = 58062 -const LIST = 58063 -const SUBPARTITION = 58064 -const SUBPARTITIONS = 58065 -const HASH = 58066 +const SELECT_OPTIONS = 57351 +const LEX_ERROR = 57352 +const UNION = 57353 +const SELECT = 57354 +const STREAM = 57355 +const VSTREAM = 57356 +const INSERT = 57357 +const UPDATE = 57358 +const DELETE = 57359 +const FROM = 57360 +const WHERE = 57361 +const GROUP = 57362 +const HAVING = 57363 +const ORDER = 57364 +const BY = 57365 +const LIMIT = 57366 +const OFFSET = 57367 +const FOR = 57368 +const DISTINCT = 57369 +const AS = 57370 +const EXISTS = 57371 +const ASC = 57372 +const DESC = 57373 +const INTO = 57374 +const DUPLICATE = 57375 +const DEFAULT = 57376 +const SET = 57377 +const LOCK = 57378 +const UNLOCK = 57379 +const KEYS = 57380 +const DO = 57381 +const CALL = 57382 +const ALL = 57383 +const ANY = 57384 +const SOME = 57385 +const DISTINCTROW = 57386 +const PARSER = 57387 +const GENERATED = 57388 +const ALWAYS = 57389 +const OUTFILE = 57390 +const S3 = 57391 +const DATA = 57392 +const LOAD = 57393 +const LINES = 57394 +const TERMINATED = 57395 +const ESCAPED = 57396 +const ENCLOSED = 57397 +const DUMPFILE = 57398 +const CSV = 57399 +const HEADER = 57400 +const MANIFEST = 57401 +const OVERWRITE = 57402 +const STARTING = 57403 +const OPTIONALLY = 57404 +const VALUES = 57405 +const LAST_INSERT_ID = 57406 +const NEXT = 57407 +const VALUE = 57408 +const SHARE = 57409 +const MODE = 57410 +const SQL_NO_CACHE = 57411 +const SQL_CACHE = 57412 +const SQL_CALC_FOUND_ROWS = 57413 +const SQL_SMALL_RESULT = 57414 +const SQL_BIG_RESULT = 57415 +const HIGH_PRIORITY = 57416 +const JOIN = 57417 +const STRAIGHT_JOIN = 57418 +const LEFT = 57419 +const RIGHT = 57420 +const INNER = 57421 +const OUTER = 57422 +const CROSS = 57423 +const NATURAL = 57424 +const USE = 57425 +const FORCE = 57426 +const ON = 57427 +const USING = 57428 +const INPLACE = 57429 +const COPY = 57430 +const INSTANT = 57431 +const ALGORITHM = 57432 +const NONE = 57433 +const SHARED = 57434 +const EXCLUSIVE = 57435 +const SUBQUERY_AS_EXPR = 57436 +const STRING = 57437 +const SQL_BUFFER_RESULT = 57438 +const ID = 57439 +const AT_ID = 57440 +const AT_AT_ID = 57441 +const HEX = 57442 +const NCHAR_STRING = 57443 +const INTEGRAL = 57444 +const FLOAT = 57445 +const DECIMAL = 57446 +const HEXNUM = 57447 +const COMMENT = 57448 +const COMMENT_KEYWORD = 57449 +const BITNUM = 57450 +const BIT_LITERAL = 57451 +const COMPRESSION = 57452 +const VALUE_ARG = 57453 +const LIST_ARG = 57454 +const OFFSET_ARG = 57455 +const JSON_PRETTY = 57456 +const JSON_STORAGE_SIZE = 57457 +const JSON_STORAGE_FREE = 57458 +const JSON_CONTAINS = 57459 +const JSON_CONTAINS_PATH = 57460 +const JSON_EXTRACT = 57461 +const JSON_KEYS = 57462 +const JSON_OVERLAPS = 57463 +const JSON_SEARCH = 57464 +const JSON_VALUE = 57465 +const JSON_ARRAYAGG = 57466 +const JSON_OBJECTAGG = 57467 +const EXTRACT = 57468 +const NULL = 57469 +const UNKNOWN = 57470 +const TRUE = 57471 +const FALSE = 57472 +const OFF = 57473 +const DISCARD = 57474 +const IMPORT = 57475 +const ENABLE = 57476 +const DISABLE = 57477 +const TABLESPACE = 57478 +const VIRTUAL = 57479 +const STORED = 57480 +const BOTH = 57481 +const LEADING = 57482 +const TRAILING = 57483 +const KILL = 57484 +const TRACE = 57485 +const EMPTY_FROM_CLAUSE = 57486 +const LOWER_THAN_CHARSET = 57487 +const CHARSET = 57488 +const UNIQUE = 57489 +const KEY = 57490 +const EXPRESSION_PREC_SETTER = 57491 +const OR = 57492 +const XOR = 57493 +const AND = 57494 +const NOT = 57495 +const BETWEEN = 57496 +const CASE = 57497 +const WHEN = 57498 +const THEN = 57499 +const ELSE = 57500 +const END = 57501 +const LE = 57502 +const GE = 57503 +const NE = 57504 +const NULL_SAFE_EQUAL = 57505 +const IS = 57506 +const LIKE = 57507 +const REGEXP = 57508 +const RLIKE = 57509 +const IN = 57510 +const ASSIGNMENT_OPT = 57511 +const SHIFT_LEFT = 57512 +const SHIFT_RIGHT = 57513 +const DIV = 57514 +const MOD = 57515 +const UNARY = 57516 +const COLLATE = 57517 +const BINARY = 57518 +const UNDERSCORE_ARMSCII8 = 57519 +const UNDERSCORE_ASCII = 57520 +const UNDERSCORE_BIG5 = 57521 +const UNDERSCORE_BINARY = 57522 +const UNDERSCORE_CP1250 = 57523 +const UNDERSCORE_CP1251 = 57524 +const UNDERSCORE_CP1256 = 57525 +const UNDERSCORE_CP1257 = 57526 +const UNDERSCORE_CP850 = 57527 +const UNDERSCORE_CP852 = 57528 +const UNDERSCORE_CP866 = 57529 +const UNDERSCORE_CP932 = 57530 +const UNDERSCORE_DEC8 = 57531 +const UNDERSCORE_EUCJPMS = 57532 +const UNDERSCORE_EUCKR = 57533 +const UNDERSCORE_GB18030 = 57534 +const UNDERSCORE_GB2312 = 57535 +const UNDERSCORE_GBK = 57536 +const UNDERSCORE_GEOSTD8 = 57537 +const UNDERSCORE_GREEK = 57538 +const UNDERSCORE_HEBREW = 57539 +const UNDERSCORE_HP8 = 57540 +const UNDERSCORE_KEYBCS2 = 57541 +const UNDERSCORE_KOI8R = 57542 +const UNDERSCORE_KOI8U = 57543 +const UNDERSCORE_LATIN1 = 57544 +const UNDERSCORE_LATIN2 = 57545 +const UNDERSCORE_LATIN5 = 57546 +const UNDERSCORE_LATIN7 = 57547 +const UNDERSCORE_MACCE = 57548 +const UNDERSCORE_MACROMAN = 57549 +const UNDERSCORE_SJIS = 57550 +const UNDERSCORE_SWE7 = 57551 +const UNDERSCORE_TIS620 = 57552 +const UNDERSCORE_UCS2 = 57553 +const UNDERSCORE_UJIS = 57554 +const UNDERSCORE_UTF16 = 57555 +const UNDERSCORE_UTF16LE = 57556 +const UNDERSCORE_UTF32 = 57557 +const UNDERSCORE_UTF8 = 57558 +const UNDERSCORE_UTF8MB4 = 57559 +const UNDERSCORE_UTF8MB3 = 57560 +const INTERVAL = 57561 +const WINDOW_EXPR = 57562 +const JSON_EXTRACT_OP = 57563 +const JSON_UNQUOTE_EXTRACT_OP = 57564 +const CREATE = 57565 +const ALTER = 57566 +const DROP = 57567 +const RENAME = 57568 +const ANALYZE = 57569 +const ADD = 57570 +const FLUSH = 57571 +const CHANGE = 57572 +const MODIFY = 57573 +const DEALLOCATE = 57574 +const REVERT = 57575 +const QUERIES = 57576 +const SCHEMA = 57577 +const TABLE = 57578 +const INDEX = 57579 +const VIEW = 57580 +const TO = 57581 +const IGNORE = 57582 +const IF = 57583 +const PRIMARY = 57584 +const COLUMN = 57585 +const SPATIAL = 57586 +const FULLTEXT = 57587 +const KEY_BLOCK_SIZE = 57588 +const CHECK = 57589 +const INDEXES = 57590 +const ACTION = 57591 +const CASCADE = 57592 +const CONSTRAINT = 57593 +const FOREIGN = 57594 +const NO = 57595 +const REFERENCES = 57596 +const RESTRICT = 57597 +const SHOW = 57598 +const DESCRIBE = 57599 +const EXPLAIN = 57600 +const DATE = 57601 +const ESCAPE = 57602 +const REPAIR = 57603 +const OPTIMIZE = 57604 +const TRUNCATE = 57605 +const COALESCE = 57606 +const EXCHANGE = 57607 +const REBUILD = 57608 +const PARTITIONING = 57609 +const REMOVE = 57610 +const PREPARE = 57611 +const EXECUTE = 57612 +const MAXVALUE = 57613 +const PARTITION = 57614 +const REORGANIZE = 57615 +const LESS = 57616 +const THAN = 57617 +const PROCEDURE = 57618 +const TRIGGER = 57619 +const VINDEX = 57620 +const VINDEXES = 57621 +const DIRECTORY = 57622 +const NAME = 57623 +const UPGRADE = 57624 +const STATUS = 57625 +const VARIABLES = 57626 +const WARNINGS = 57627 +const CASCADED = 57628 +const DEFINER = 57629 +const OPTION = 57630 +const SQL = 57631 +const UNDEFINED = 57632 +const SEQUENCE = 57633 +const MERGE = 57634 +const TEMPORARY = 57635 +const TEMPTABLE = 57636 +const INVOKER = 57637 +const SECURITY = 57638 +const FIRST = 57639 +const AFTER = 57640 +const LAST = 57641 +const VITESS_MIGRATION = 57642 +const CANCEL = 57643 +const RETRY = 57644 +const LAUNCH = 57645 +const COMPLETE = 57646 +const CLEANUP = 57647 +const THROTTLE = 57648 +const UNTHROTTLE = 57649 +const FORCE_CUTOVER = 57650 +const EXPIRE = 57651 +const RATIO = 57652 +const VITESS_THROTTLER = 57653 +const BEGIN = 57654 +const START = 57655 +const TRANSACTION = 57656 +const COMMIT = 57657 +const ROLLBACK = 57658 +const SAVEPOINT = 57659 +const RELEASE = 57660 +const WORK = 57661 +const CONSISTENT = 57662 +const SNAPSHOT = 57663 +const UNRESOLVED = 57664 +const TRANSACTIONS = 57665 +const BIT = 57666 +const TINYINT = 57667 +const SMALLINT = 57668 +const MEDIUMINT = 57669 +const INT = 57670 +const INTEGER = 57671 +const BIGINT = 57672 +const INTNUM = 57673 +const REAL = 57674 +const DOUBLE = 57675 +const FLOAT_TYPE = 57676 +const FLOAT4_TYPE = 57677 +const FLOAT8_TYPE = 57678 +const DECIMAL_TYPE = 57679 +const NUMERIC = 57680 +const TIME = 57681 +const TIMESTAMP = 57682 +const DATETIME = 57683 +const YEAR = 57684 +const CHAR = 57685 +const VARCHAR = 57686 +const BOOL = 57687 +const CHARACTER = 57688 +const VARBINARY = 57689 +const NCHAR = 57690 +const TEXT = 57691 +const TINYTEXT = 57692 +const MEDIUMTEXT = 57693 +const LONGTEXT = 57694 +const BLOB = 57695 +const TINYBLOB = 57696 +const MEDIUMBLOB = 57697 +const LONGBLOB = 57698 +const JSON = 57699 +const JSON_SCHEMA_VALID = 57700 +const JSON_SCHEMA_VALIDATION_REPORT = 57701 +const ENUM = 57702 +const GEOMETRY = 57703 +const POINT = 57704 +const LINESTRING = 57705 +const POLYGON = 57706 +const GEOMCOLLECTION = 57707 +const GEOMETRYCOLLECTION = 57708 +const MULTIPOINT = 57709 +const MULTILINESTRING = 57710 +const MULTIPOLYGON = 57711 +const ASCII = 57712 +const UNICODE = 57713 +const VECTOR = 57714 +const NULLX = 57715 +const AUTO_INCREMENT = 57716 +const APPROXNUM = 57717 +const SIGNED = 57718 +const UNSIGNED = 57719 +const ZEROFILL = 57720 +const PURGE = 57721 +const BEFORE = 57722 +const CODE = 57723 +const COLLATION = 57724 +const COLUMNS = 57725 +const DATABASES = 57726 +const ENGINES = 57727 +const EVENT = 57728 +const EXTENDED = 57729 +const FIELDS = 57730 +const FULL = 57731 +const FUNCTION = 57732 +const GTID_EXECUTED = 57733 +const KEYSPACES = 57734 +const OPEN = 57735 +const PLUGINS = 57736 +const PRIVILEGES = 57737 +const PROCESSLIST = 57738 +const SCHEMAS = 57739 +const TABLES = 57740 +const TRIGGERS = 57741 +const USER = 57742 +const VGTID_EXECUTED = 57743 +const VITESS_KEYSPACES = 57744 +const VITESS_METADATA = 57745 +const VITESS_MIGRATIONS = 57746 +const VITESS_REPLICATION_STATUS = 57747 +const VITESS_SHARDS = 57748 +const VITESS_TABLETS = 57749 +const VITESS_TARGET = 57750 +const VSCHEMA = 57751 +const VITESS_THROTTLED_APPS = 57752 +const NAMES = 57753 +const GLOBAL = 57754 +const SESSION = 57755 +const ISOLATION = 57756 +const LEVEL = 57757 +const READ = 57758 +const WRITE = 57759 +const ONLY = 57760 +const REPEATABLE = 57761 +const COMMITTED = 57762 +const UNCOMMITTED = 57763 +const SERIALIZABLE = 57764 +const ADDDATE = 57765 +const CURRENT_TIMESTAMP = 57766 +const DATABASE = 57767 +const CURRENT_DATE = 57768 +const CURDATE = 57769 +const DATE_ADD = 57770 +const DATE_SUB = 57771 +const NOW = 57772 +const SUBDATE = 57773 +const CURTIME = 57774 +const CURRENT_TIME = 57775 +const LOCALTIME = 57776 +const LOCALTIMESTAMP = 57777 +const CURRENT_USER = 57778 +const UTC_DATE = 57779 +const UTC_TIME = 57780 +const UTC_TIMESTAMP = 57781 +const SYSDATE = 57782 +const DAY = 57783 +const DAY_HOUR = 57784 +const DAY_MICROSECOND = 57785 +const DAY_MINUTE = 57786 +const DAY_SECOND = 57787 +const HOUR = 57788 +const HOUR_MICROSECOND = 57789 +const HOUR_MINUTE = 57790 +const HOUR_SECOND = 57791 +const MICROSECOND = 57792 +const MINUTE = 57793 +const MINUTE_MICROSECOND = 57794 +const MINUTE_SECOND = 57795 +const MONTH = 57796 +const QUARTER = 57797 +const SECOND = 57798 +const SECOND_MICROSECOND = 57799 +const YEAR_MONTH = 57800 +const WEEK = 57801 +const SQL_TSI_DAY = 57802 +const SQL_TSI_WEEK = 57803 +const SQL_TSI_HOUR = 57804 +const SQL_TSI_MINUTE = 57805 +const SQL_TSI_MONTH = 57806 +const SQL_TSI_QUARTER = 57807 +const SQL_TSI_SECOND = 57808 +const SQL_TSI_MICROSECOND = 57809 +const SQL_TSI_YEAR = 57810 +const REPLACE = 57811 +const CONVERT = 57812 +const CAST = 57813 +const SUBSTR = 57814 +const SUBSTRING = 57815 +const MID = 57816 +const SEPARATOR = 57817 +const TIMESTAMPADD = 57818 +const TIMESTAMPDIFF = 57819 +const WEIGHT_STRING = 57820 +const LTRIM = 57821 +const RTRIM = 57822 +const TRIM = 57823 +const JSON_ARRAY = 57824 +const JSON_OBJECT = 57825 +const JSON_QUOTE = 57826 +const JSON_DEPTH = 57827 +const JSON_TYPE = 57828 +const JSON_LENGTH = 57829 +const JSON_VALID = 57830 +const JSON_ARRAY_APPEND = 57831 +const JSON_ARRAY_INSERT = 57832 +const JSON_INSERT = 57833 +const JSON_MERGE = 57834 +const JSON_MERGE_PATCH = 57835 +const JSON_MERGE_PRESERVE = 57836 +const JSON_REMOVE = 57837 +const JSON_REPLACE = 57838 +const JSON_SET = 57839 +const JSON_UNQUOTE = 57840 +const COUNT = 57841 +const AVG = 57842 +const MAX = 57843 +const MIN = 57844 +const SUM = 57845 +const GROUP_CONCAT = 57846 +const BIT_AND = 57847 +const BIT_OR = 57848 +const BIT_XOR = 57849 +const STD = 57850 +const STDDEV = 57851 +const STDDEV_POP = 57852 +const STDDEV_SAMP = 57853 +const VAR_POP = 57854 +const VAR_SAMP = 57855 +const VARIANCE = 57856 +const ANY_VALUE = 57857 +const REGEXP_INSTR = 57858 +const REGEXP_LIKE = 57859 +const REGEXP_REPLACE = 57860 +const REGEXP_SUBSTR = 57861 +const ExtractValue = 57862 +const UpdateXML = 57863 +const GET_LOCK = 57864 +const RELEASE_LOCK = 57865 +const RELEASE_ALL_LOCKS = 57866 +const IS_FREE_LOCK = 57867 +const IS_USED_LOCK = 57868 +const LOCATE = 57869 +const POSITION = 57870 +const ST_GeometryCollectionFromText = 57871 +const ST_GeometryFromText = 57872 +const ST_LineStringFromText = 57873 +const ST_MultiLineStringFromText = 57874 +const ST_MultiPointFromText = 57875 +const ST_MultiPolygonFromText = 57876 +const ST_PointFromText = 57877 +const ST_PolygonFromText = 57878 +const ST_GeometryCollectionFromWKB = 57879 +const ST_GeometryFromWKB = 57880 +const ST_LineStringFromWKB = 57881 +const ST_MultiLineStringFromWKB = 57882 +const ST_MultiPointFromWKB = 57883 +const ST_MultiPolygonFromWKB = 57884 +const ST_PointFromWKB = 57885 +const ST_PolygonFromWKB = 57886 +const ST_AsBinary = 57887 +const ST_AsText = 57888 +const ST_Dimension = 57889 +const ST_Envelope = 57890 +const ST_IsSimple = 57891 +const ST_IsEmpty = 57892 +const ST_GeometryType = 57893 +const ST_X = 57894 +const ST_Y = 57895 +const ST_Latitude = 57896 +const ST_Longitude = 57897 +const ST_EndPoint = 57898 +const ST_IsClosed = 57899 +const ST_Length = 57900 +const ST_NumPoints = 57901 +const ST_StartPoint = 57902 +const ST_PointN = 57903 +const ST_Area = 57904 +const ST_Centroid = 57905 +const ST_ExteriorRing = 57906 +const ST_InteriorRingN = 57907 +const ST_NumInteriorRings = 57908 +const ST_NumGeometries = 57909 +const ST_GeometryN = 57910 +const ST_LongFromGeoHash = 57911 +const ST_PointFromGeoHash = 57912 +const ST_LatFromGeoHash = 57913 +const ST_GeoHash = 57914 +const ST_AsGeoJSON = 57915 +const ST_GeomFromGeoJSON = 57916 +const MATCH = 57917 +const AGAINST = 57918 +const BOOLEAN = 57919 +const LANGUAGE = 57920 +const WITH = 57921 +const QUERY = 57922 +const EXPANSION = 57923 +const WITHOUT = 57924 +const VALIDATION = 57925 +const ROLLUP = 57926 +const UNUSED = 57927 +const ARRAY = 57928 +const BYTE = 57929 +const CUME_DIST = 57930 +const DESCRIPTION = 57931 +const DENSE_RANK = 57932 +const EMPTY = 57933 +const EXCEPT = 57934 +const FIRST_VALUE = 57935 +const GROUPING = 57936 +const GROUPS = 57937 +const JSON_TABLE = 57938 +const LAG = 57939 +const LAST_VALUE = 57940 +const LATERAL = 57941 +const LEAD = 57942 +const NTH_VALUE = 57943 +const NTILE = 57944 +const OF = 57945 +const OVER = 57946 +const PERCENT_RANK = 57947 +const RANK = 57948 +const RECURSIVE = 57949 +const ROW_NUMBER = 57950 +const SYSTEM = 57951 +const WINDOW = 57952 +const ACTIVE = 57953 +const ADMIN = 57954 +const AUTOEXTEND_SIZE = 57955 +const BUCKETS = 57956 +const CLONE = 57957 +const COLUMN_FORMAT = 57958 +const COMPONENT = 57959 +const DEFINITION = 57960 +const ENFORCED = 57961 +const ENGINE_ATTRIBUTE = 57962 +const EXCLUDE = 57963 +const FOLLOWING = 57964 +const GET_MASTER_PUBLIC_KEY = 57965 +const HISTOGRAM = 57966 +const HISTORY = 57967 +const INACTIVE = 57968 +const INVISIBLE = 57969 +const LOCKED = 57970 +const MASTER_COMPRESSION_ALGORITHMS = 57971 +const MASTER_PUBLIC_KEY_PATH = 57972 +const MASTER_TLS_CIPHERSUITES = 57973 +const MASTER_ZSTD_COMPRESSION_LEVEL = 57974 +const NESTED = 57975 +const NETWORK_NAMESPACE = 57976 +const NOWAIT = 57977 +const NULLS = 57978 +const OJ = 57979 +const OLD = 57980 +const OPTIONAL = 57981 +const ORDINALITY = 57982 +const ORGANIZATION = 57983 +const OTHERS = 57984 +const PARTIAL = 57985 +const PATH = 57986 +const PERSIST = 57987 +const PERSIST_ONLY = 57988 +const PRECEDING = 57989 +const PRIVILEGE_CHECKS_USER = 57990 +const PROCESS = 57991 +const RANDOM = 57992 +const REFERENCE = 57993 +const REQUIRE_ROW_FORMAT = 57994 +const RESOURCE = 57995 +const RESPECT = 57996 +const RESTART = 57997 +const RETAIN = 57998 +const REUSE = 57999 +const ROLE = 58000 +const SECONDARY = 58001 +const SECONDARY_ENGINE = 58002 +const SECONDARY_ENGINE_ATTRIBUTE = 58003 +const SECONDARY_LOAD = 58004 +const SECONDARY_UNLOAD = 58005 +const SIMPLE = 58006 +const SKIP = 58007 +const SRID = 58008 +const THREAD_PRIORITY = 58009 +const TIES = 58010 +const UNBOUNDED = 58011 +const VCPU = 58012 +const VISIBLE = 58013 +const RETURNING = 58014 +const FORMAT_BYTES = 58015 +const FORMAT_PICO_TIME = 58016 +const PS_CURRENT_THREAD_ID = 58017 +const PS_THREAD_ID = 58018 +const GTID_SUBSET = 58019 +const GTID_SUBTRACT = 58020 +const WAIT_FOR_EXECUTED_GTID_SET = 58021 +const WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS = 58022 +const FORMAT = 58023 +const TREE = 58024 +const VITESS = 58025 +const TRADITIONAL = 58026 +const VTEXPLAIN = 58027 +const VEXPLAIN = 58028 +const PLAN = 58029 +const LOCAL = 58030 +const LOW_PRIORITY = 58031 +const NO_WRITE_TO_BINLOG = 58032 +const LOGS = 58033 +const ERROR = 58034 +const GENERAL = 58035 +const HOSTS = 58036 +const OPTIMIZER_COSTS = 58037 +const USER_RESOURCES = 58038 +const SLOW = 58039 +const CHANNEL = 58040 +const RELAY = 58041 +const EXPORT = 58042 +const CURRENT = 58043 +const ROW = 58044 +const ROWS = 58045 +const AVG_ROW_LENGTH = 58046 +const CONNECTION = 58047 +const CHECKSUM = 58048 +const DELAY_KEY_WRITE = 58049 +const ENCRYPTION = 58050 +const ENGINE = 58051 +const INSERT_METHOD = 58052 +const MAX_ROWS = 58053 +const MIN_ROWS = 58054 +const PACK_KEYS = 58055 +const PASSWORD = 58056 +const FIXED = 58057 +const DYNAMIC = 58058 +const COMPRESSED = 58059 +const REDUNDANT = 58060 +const COMPACT = 58061 +const ROW_FORMAT = 58062 +const STATS_AUTO_RECALC = 58063 +const STATS_PERSISTENT = 58064 +const STATS_SAMPLE_PAGES = 58065 +const STORAGE = 58066 +const MEMORY = 58067 +const DISK = 58068 +const PARTITIONS = 58069 +const LINEAR = 58070 +const RANGE = 58071 +const LIST = 58072 +const SUBPARTITION = 58073 +const SUBPARTITIONS = 58074 +const HASH = 58075 var yyToknames = [...]string{ "$end", @@ -766,6 +775,7 @@ var yyToknames = [...]string{ "FUNCTION_CALL_NON_KEYWORD", "STRING_TYPE_PREFIX_NON_KEYWORD", "ANY_SOME", + "SELECT_OPTIONS", "LEX_ERROR", "UNION", "SELECT", @@ -828,6 +838,9 @@ var yyToknames = [...]string{ "SQL_NO_CACHE", "SQL_CACHE", "SQL_CALC_FOUND_ROWS", + "SQL_SMALL_RESULT", + "SQL_BIG_RESULT", + "HIGH_PRIORITY", "JOIN", "STRAIGHT_JOIN", "LEFT", @@ -852,6 +865,7 @@ var yyToknames = [...]string{ "','", "')'", "STRING", + "SQL_BUFFER_RESULT", "ID", "AT_ID", "AT_AT_ID", @@ -898,6 +912,7 @@ var yyToknames = [...]string{ "LEADING", "TRAILING", "KILL", + "TRACE", "EMPTY_FROM_CLAUSE", "LOWER_THAN_CHARSET", "CHARSET", @@ -1090,6 +1105,8 @@ var yyToknames = [...]string{ "WORK", "CONSISTENT", "SNAPSHOT", + "UNRESOLVED", + "TRANSACTIONS", "BIT", "TINYINT", "SMALLINT", @@ -1138,6 +1155,7 @@ var yyToknames = [...]string{ "MULTIPOLYGON", "ASCII", "UNICODE", + "VECTOR", "NULLX", "AUTO_INCREMENT", "APPROXNUM", @@ -1514,1333 +1532,1354 @@ var yyExca = [...]int{ 1, -1, -2, 0, -1, 2, - 15, 49, 16, 49, + 17, 49, -2, 40, -1, 52, 1, 157, - 742, 157, + 751, 157, -2, 165, -1, 53, - 143, 165, - 185, 165, - 355, 165, + 149, 165, + 191, 165, + 363, 165, -2, 523, -1, 61, - 37, 777, - 248, 777, - 259, 777, - 294, 791, - 295, 791, - -2, 779, + 38, 783, + 254, 783, + 265, 783, + 300, 797, + 301, 797, + -2, 785, -1, 66, - 250, 815, - -2, 813, + 256, 821, + -2, 819, -1, 122, - 247, 1608, + 253, 1620, -2, 131, -1, 124, 1, 158, - 742, 158, + 751, 158, -2, 165, -1, 135, - 144, 408, - 253, 408, + 150, 408, + 259, 408, -2, 512, -1, 154, - 143, 165, - 185, 165, - 355, 165, + 149, 165, + 191, 165, + 363, 165, -2, 532, - -1, 741, - 171, 41, + -1, 748, + 177, 41, -2, 43, - -1, 950, - 91, 1625, - -2, 1469, - -1, 951, - 91, 1626, - 230, 1630, - -2, 1470, - -1, 952, - 230, 1629, + -1, 957, + 95, 1637, + -2, 1481, + -1, 958, + 95, 1638, + 236, 1642, + -2, 1482, + -1, 959, + 236, 1641, -2, 42, - -1, 1036, - 64, 887, - -2, 900, - -1, 1124, - 258, 1096, - 263, 1096, + -1, 1043, + 65, 895, + -2, 908, + -1, 1131, + 264, 1108, + 269, 1108, -2, 419, - -1, 1209, + -1, 1216, 1, 580, - 742, 580, + 751, 580, -2, 165, - -1, 1513, - 230, 1630, - -2, 1470, - -1, 1726, - 64, 888, - -2, 904, - -1, 1727, - 64, 889, - -2, 905, - -1, 1783, - 143, 165, - 185, 165, - 355, 165, + -1, 1527, + 236, 1642, + -2, 1482, + -1, 1739, + 65, 896, + -2, 912, + -1, 1740, + 65, 897, + -2, 913, + -1, 1800, + 149, 165, + 191, 165, + 363, 165, -2, 458, - -1, 1864, - 144, 408, - 253, 408, + -1, 1883, + 150, 408, + 259, 408, -2, 512, - -1, 1873, - 258, 1097, - 263, 1097, + -1, 1892, + 264, 1109, + 269, 1109, -2, 420, - -1, 2318, - 230, 1634, - -2, 1628, - -1, 2319, - 230, 1630, - -2, 1626, - -1, 2422, - 143, 165, - 185, 165, - 355, 165, + -1, 2341, + 236, 1646, + -2, 1640, + -1, 2342, + 236, 1642, + -2, 1638, + -1, 2445, + 149, 165, + 191, 165, + 363, 165, -2, 459, - -1, 2429, - 27, 186, + -1, 2452, + 28, 186, -2, 188, - -1, 2888, - 82, 96, - 92, 96, - -2, 963, - -1, 2957, - 717, 700, - -2, 674, - -1, 3181, - 54, 1573, - -2, 1567, - -1, 4019, - 717, 700, - -2, 688, - -1, 4111, - 94, 632, - 99, 632, - 109, 632, - 187, 632, - 188, 632, - 189, 632, - 190, 632, - 191, 632, - 192, 632, - 193, 632, - 194, 632, - 195, 632, - 196, 632, - 197, 632, - 198, 632, - 199, 632, - 200, 632, - 201, 632, - 202, 632, - 203, 632, - 204, 632, - 205, 632, - 206, 632, - 207, 632, - 208, 632, - 209, 632, - 210, 632, - 211, 632, - 212, 632, - 213, 632, - 214, 632, - 215, 632, - 216, 632, - 217, 632, - 218, 632, - 219, 632, - 220, 632, - 221, 632, - 222, 632, - 223, 632, - 224, 632, - 225, 632, - 226, 632, - 227, 632, - 228, 632, - -2, 2002, + -1, 2915, + 86, 96, + 96, 96, + -2, 975, + -1, 2983, + 726, 701, + -2, 675, + -1, 3207, + 55, 1585, + -2, 1579, + -1, 4044, + 726, 701, + -2, 689, + -1, 4136, + 98, 633, + 104, 633, + 114, 633, + 193, 633, + 194, 633, + 195, 633, + 196, 633, + 197, 633, + 198, 633, + 199, 633, + 200, 633, + 201, 633, + 202, 633, + 203, 633, + 204, 633, + 205, 633, + 206, 633, + 207, 633, + 208, 633, + 209, 633, + 210, 633, + 211, 633, + 212, 633, + 213, 633, + 214, 633, + 215, 633, + 216, 633, + 217, 633, + 218, 633, + 219, 633, + 220, 633, + 221, 633, + 222, 633, + 223, 633, + 224, 633, + 225, 633, + 226, 633, + 227, 633, + 228, 633, + 229, 633, + 230, 633, + 231, 633, + 232, 633, + 233, 633, + 234, 633, + -2, 2017, } const yyPrivate = 57344 -const yyLast = 56576 +const yyLast = 56607 var yyAct = [...]int{ - 966, 3669, 4109, 87, 4186, 3670, 4199, 3671, 4090, 4153, - 1277, 961, 4154, 953, 4000, 3333, 2111, 4078, 2419, 3233, - 3240, 2347, 3905, 3469, 3982, 2123, 3282, 3194, 3291, 1275, - 3296, 3980, 3047, 1786, 3293, 3292, 3290, 3295, 3294, 1993, - 3619, 3606, 4051, 3311, 2349, 3132, 2049, 3248, 2493, 5, - 3310, 745, 3198, 3195, 3515, 3509, 3712, 3021, 954, 3046, - 3182, 739, 2848, 740, 2374, 2922, 915, 773, 914, 2456, - 3313, 3003, 2923, 2390, 1742, 919, 3340, 2954, 42, 2481, - 2461, 3499, 2924, 2524, 2393, 163, 1034, 2407, 87, 1054, - 1842, 2873, 1086, 2394, 1061, 43, 1031, 2840, 2824, 2107, - 2271, 3537, 41, 2995, 1132, 2502, 2480, 1034, 2854, 2303, - 2270, 2395, 149, 2463, 2541, 2915, 2145, 3192, 2057, 1871, - 2382, 1114, 1096, 1119, 1775, 2890, 2397, 1755, 100, 1707, - 1889, 1526, 104, 2151, 1156, 2082, 2071, 1451, 1989, 105, - 1436, 1093, 1878, 1970, 1125, 3197, 1090, 755, 1094, 2478, - 2452, 1120, 2861, 1774, 750, 2453, 1071, 1121, 1073, 1760, - 2375, 1033, 1729, 1037, 1043, 99, 3707, 2159, 2178, 2822, - 1053, 107, 1485, 1040, 2048, 1265, 85, 2001, 3470, 1863, - 132, 133, 1056, 1039, 1066, 3526, 1509, 84, 3699, 1122, - 1038, 1205, 732, 106, 1041, 742, 1029, 749, 1530, 98, - 4187, 93, 167, 3607, 127, 916, 1273, 1065, 1251, 125, - 126, 2495, 2496, 2497, 2495, 3279, 4035, 1535, 2977, 2976, - 2539, 2945, 677, 3599, 4136, 1028, 3011, 743, 1046, 3562, - 3012, 1452, 4031, 134, 2344, 2345, 2064, 2063, 2062, 2061, - 1161, 1136, 4036, 1087, 2060, 2059, 2032, 4030, 3674, 1221, - 674, 2820, 675, 2589, 3178, 128, 4157, 1746, 4130, 4209, - 1468, 1744, 3136, 1169, 4152, 733, 1047, 4177, 3473, 4192, - 4140, 1080, 3472, 1032, 1447, 3983, 2850, 1081, 1030, 2371, - 2370, 2526, 3301, 2970, 1098, 95, 1158, 1747, 2146, 1111, - 95, 1745, 2785, 1955, 4191, 4139, 1103, 2528, 2069, 1175, - 1176, 1177, 3359, 1180, 1181, 1182, 1183, 2, 1055, 1186, - 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, - 1197, 1198, 1199, 1200, 1201, 1202, 1135, 128, 1178, 1110, - 3301, 2368, 4009, 717, 1109, 1108, 2947, 4105, 3299, 1462, - 3673, 2527, 1222, 3298, 4138, 1162, 1165, 1166, 4031, 920, - 1027, 3901, 111, 112, 113, 3900, 116, 711, 717, 122, - 3674, 3612, 191, 735, 3613, 669, 1160, 3305, 1159, 4137, - 4167, 3911, 95, 4134, 3631, 1438, 3620, 730, 731, 190, - 4079, 711, 86, 969, 970, 971, 3299, 1022, 1023, 1024, - 1025, 2967, 95, 86, 1036, 128, 4087, 2116, 2521, 1112, - 86, 3910, 129, 1465, 4114, 1466, 1467, 1709, 1079, 1083, - 918, 2085, 3385, 1852, 2821, 3305, 2864, 1776, 172, 1777, - 1736, 3229, 1068, 1069, 708, 3010, 2899, 2593, 1102, 2898, - 2413, 1104, 2900, 3726, 3230, 3231, 4091, 969, 970, 971, - 2414, 2415, 2041, 2042, 2865, 2994, 1241, 1020, 1458, 1270, - 2596, 1450, 3673, 1019, 3630, 2948, 711, 1107, 1229, 1214, - 1215, 2904, 95, 1230, 4001, 2911, 671, 86, 1486, 1242, - 88, 711, 693, 95, 169, 1235, 4014, 170, 1997, 1448, - 95, 3302, 1464, 711, 3367, 691, 1021, 2187, 1204, 1452, - 3356, 1217, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1495, - 1494, 1496, 1497, 189, 2432, 2431, 711, 2346, 1229, 3337, - 4158, 3365, 4095, 1230, 2472, 1105, 1258, 2594, 1260, 1246, - 1247, 1228, 4119, 1227, 3068, 688, 2378, 2587, 1092, 3302, - 1107, 4159, 1099, 2040, 703, 725, 3335, 2466, 1437, 1101, - 1100, 2044, 4117, 3022, 2857, 2858, 729, 95, 1179, 698, - 3341, 723, 4123, 4124, 1711, 2996, 1257, 1259, 2955, 1269, - 701, 3250, 3251, 2503, 1243, 1268, 4095, 2542, 4118, 712, - 1236, 2980, 3328, 3953, 1945, 3954, 4189, 2590, 1971, 2591, - 3329, 2984, 2985, 1244, 1245, 2179, 1262, 2565, 1105, 2566, - 2181, 2567, 2548, 712, 2186, 2182, 1267, 1462, 2183, 2184, - 2185, 1250, 3338, 2180, 2188, 2189, 2190, 2191, 2192, 2193, - 2194, 2195, 2196, 3601, 1210, 2998, 1998, 173, 1946, 3885, - 1947, 3600, 2568, 1185, 1248, 1184, 179, 3024, 678, 3336, - 680, 694, 2546, 714, 1249, 713, 684, 2544, 682, 686, - 695, 687, 2506, 681, 1106, 692, 1714, 2549, 683, 696, - 697, 700, 704, 705, 706, 702, 699, 4131, 690, 715, - 1115, 3512, 3678, 1255, 1116, 1856, 2391, 1256, 712, 1116, - 3249, 1154, 1155, 3135, 2545, 1153, 1152, 1261, 1151, 1150, - 1149, 1148, 3252, 712, 1147, 1142, 3252, 2547, 1772, 2465, - 3069, 1079, 1083, 918, 4210, 712, 1091, 4164, 3034, 3033, - 3032, 1128, 1254, 3026, 1091, 3030, 1458, 3025, 1274, 3023, - 1274, 1274, 1091, 1127, 3028, 1990, 1089, 1106, 712, 2376, - 2377, 2479, 1067, 3027, 2555, 2551, 2553, 2554, 2552, 2556, - 2557, 2558, 1082, 1076, 1074, 2999, 2532, 1850, 2531, 711, - 1986, 3029, 3031, 1439, 1457, 1454, 1455, 1456, 1461, 1463, - 1460, 164, 1459, 1172, 3272, 2949, 2979, 2525, 1034, 1510, - 1515, 1516, 1453, 1519, 1521, 1522, 1523, 1524, 1525, 1849, - 1528, 1529, 1531, 1531, 1848, 1531, 1531, 1536, 1536, 1536, - 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, - 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, - 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, - 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, - 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, - 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, - 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, - 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, - 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, - 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, - 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, - 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, - 1659, 1660, 1661, 1662, 967, 1507, 1263, 3357, 1663, 967, - 1665, 1666, 1667, 1668, 1669, 3672, 1430, 1431, 1773, 3560, - 3561, 1072, 1536, 1536, 1536, 1536, 1536, 1536, 4008, 1446, - 1113, 2982, 2946, 89, 716, 2913, 3457, 1676, 1677, 1678, - 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, - 1689, 712, 3303, 3304, 1213, 709, 1226, 3597, 94, 1520, - 4093, 3629, 1429, 3513, 1511, 3307, 1216, 1500, 1704, 94, - 710, 1532, 1134, 1533, 1534, 1145, 94, 4054, 1500, 1503, - 1504, 1505, 1506, 1957, 1956, 1958, 1959, 1960, 1239, 1517, - 165, 1134, 4092, 2969, 1877, 1537, 1538, 177, 1143, 2594, - 3303, 3304, 1457, 1454, 1455, 1456, 1461, 1463, 1460, 1075, - 1459, 967, 2595, 3307, 4093, 1082, 1076, 1074, 1134, 2469, - 1453, 1225, 1710, 1231, 1232, 1233, 1234, 3672, 711, 2825, - 2827, 1034, 1735, 3002, 1164, 1034, 2965, 2968, 185, 4203, - 1127, 1034, 1701, 94, 1163, 1208, 4092, 1271, 1272, 1987, - 1846, 1220, 4122, 3015, 1134, 668, 2993, 3144, 2523, 2992, - 2470, 1501, 1502, 4132, 2611, 3996, 3551, 2468, 3533, 1702, - 1976, 2378, 3596, 2895, 2860, 1133, 1212, 2797, 1218, 2119, - 2143, 166, 171, 168, 174, 175, 176, 178, 180, 181, - 182, 183, 1764, 1664, 1133, 1219, 4121, 184, 186, 187, - 188, 2471, 2855, 1876, 3143, 3236, 1718, 124, 676, 2420, - 1722, 2467, 1500, 1497, 3228, 2622, 1033, 1480, 1050, 1266, - 4022, 1133, 1157, 1720, 1146, 1171, 1736, 104, 2160, 3592, - 1721, 1224, 3525, 1252, 105, 3163, 119, 1702, 1441, 1670, - 1671, 1672, 1673, 1674, 1675, 2161, 1708, 1144, 2543, 2002, - 2053, 1983, 1778, 3237, 3042, 2152, 2152, 1133, 2631, 1695, - 2938, 4168, 3161, 1127, 1130, 1131, 107, 1091, 3005, 1466, - 1467, 1124, 1128, 3004, 3721, 1467, 3567, 3239, 2135, 2124, - 2125, 2126, 2127, 2137, 2128, 2129, 2130, 2142, 2138, 2131, - 2132, 2139, 2140, 2141, 2133, 2134, 2136, 3234, 1134, 1238, - 1716, 2826, 3005, 1975, 1738, 1107, 1203, 3004, 2622, 1134, - 1240, 1705, 120, 3566, 2510, 1869, 3250, 3251, 1886, 1885, - 1875, 1134, 2520, 3235, 2518, 2515, 1030, 1145, 1032, 1719, - 1995, 1862, 1717, 1940, 2515, 1879, 1879, 1741, 1143, 4055, - 712, 1045, 4160, 1134, 3552, 4205, 1853, 1854, 1855, 3626, - 4211, 3627, 1881, 1769, 1770, 1703, 3988, 3241, 2308, 1922, - 2522, 3893, 1274, 3892, 2376, 2377, 4201, 2519, 1837, 4202, - 1207, 4200, 3883, 1891, 1880, 1892, 2517, 1894, 1896, 2158, - 1223, 1900, 1902, 1904, 1906, 1908, 1253, 4056, 1979, 1845, - 1977, 1978, 1075, 1980, 1981, 1982, 3643, 1859, 1860, 1858, - 1209, 1133, 2003, 1872, 3989, 1965, 3642, 1127, 1130, 1131, - 1468, 1091, 1133, 1930, 1931, 1124, 1128, 1137, 1127, 1936, - 1937, 3574, 1139, 3573, 1133, 3249, 1140, 1138, 1736, 1137, - 1127, 3563, 3280, 1926, 1139, 2157, 1123, 3252, 1140, 1138, - 3268, 1883, 4212, 1723, 1468, 2920, 1133, 1141, 1170, 969, - 970, 971, 1167, 2919, 1963, 1991, 1972, 1486, 1973, 3014, - 2918, 1974, 1492, 1493, 1495, 1494, 1496, 1497, 1918, 2475, - 1966, 1921, 1964, 1923, 1952, 1950, 1206, 1949, 1948, 2087, - 1938, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1495, 1494, - 1496, 1497, 1106, 2088, 1498, 1499, 2086, 1932, 4173, 1736, - 190, 1488, 1489, 1490, 1491, 1492, 1493, 1495, 1494, 1496, - 1497, 1851, 128, 1929, 1110, 2008, 1928, 1927, 1898, 1109, - 1108, 1962, 1715, 129, 2075, 2076, 2601, 2602, 3332, 1274, - 1274, 3557, 717, 717, 1468, 1433, 2004, 2005, 2030, 172, - 1772, 1951, 101, 87, 2902, 717, 87, 2668, 2491, 2490, - 2009, 1486, 102, 1465, 3238, 1466, 1467, 2016, 2017, 2018, - 1490, 1491, 1492, 1493, 1495, 1494, 1496, 1497, 2029, 2489, - 2488, 2487, 2486, 2672, 1768, 1487, 1488, 1489, 1490, 1491, - 1492, 1493, 1495, 1494, 1496, 1497, 1749, 1465, 4161, 1466, - 1467, 2846, 4188, 1785, 4017, 169, 3044, 4016, 170, 1487, - 1488, 1489, 1490, 1491, 1492, 1493, 1495, 1494, 1496, 1497, - 1736, 4148, 1736, 2114, 2114, 2112, 2112, 1486, 42, 2115, - 1482, 42, 1483, 1736, 189, 3992, 1468, 3991, 1486, 3990, - 2610, 1468, 1750, 2846, 1736, 2077, 1484, 1498, 1499, 1481, - 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1495, 1494, - 1496, 1497, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1495, - 1494, 1496, 1497, 3888, 1487, 1488, 1489, 1490, 1491, 1492, - 1493, 1495, 1494, 1496, 1497, 3872, 1924, 1465, 2006, 1466, - 1467, 2670, 1464, 1736, 2198, 2010, 3871, 2012, 2013, 2014, - 2015, 1464, 1736, 1736, 2019, 2846, 4086, 1701, 1474, 1475, - 1476, 1477, 1478, 1479, 1473, 1470, 2031, 2075, 2076, 2073, - 2074, 1969, 3720, 2308, 4171, 1736, 85, 2305, 3718, 85, - 2054, 2846, 4065, 4010, 1702, 3639, 2307, 1700, 1996, 2084, - 1699, 1468, 110, 2072, 1698, 2037, 2038, 3571, 173, 3556, - 2147, 3342, 965, 109, 2007, 108, 110, 179, 2846, 4061, - 1468, 2011, 3339, 103, 1468, 2089, 3271, 109, 3270, 108, - 3973, 1736, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 1465, - 2929, 1466, 1467, 2916, 1465, 2318, 1466, 1467, 1697, 2090, - 1468, 2092, 2093, 2094, 2095, 2096, 2097, 2099, 2101, 2102, - 2103, 2104, 2105, 2106, 2316, 2222, 3242, 2118, 1468, 1690, - 3246, 3610, 4007, 1468, 2317, 3896, 1736, 3245, 2162, 2163, - 2164, 2165, 2091, 2846, 3884, 1736, 1511, 2578, 2306, 4101, - 1736, 3920, 2176, 2304, 3374, 2577, 2197, 1468, 2537, 1736, - 3919, 1486, 2536, 1468, 2153, 3610, 1736, 3876, 4099, 1736, - 3875, 3247, 4097, 1736, 2846, 3608, 3243, 2515, 1736, 103, - 1468, 3244, 3531, 1736, 3618, 1487, 1488, 1489, 1490, 1491, - 1492, 1493, 1495, 1494, 1496, 1497, 2214, 1468, 3966, 1736, - 2399, 2373, 164, 2352, 1465, 2318, 1466, 1467, 2752, 1736, - 2315, 3261, 3260, 2321, 2322, 2033, 3964, 1736, 3258, 3259, - 2956, 104, 1736, 1465, 2316, 1466, 1467, 1465, 105, 1466, - 1467, 3256, 3257, 101, 2388, 2429, 1999, 1468, 1961, 103, - 1703, 1736, 104, 102, 1953, 3961, 1736, 3256, 3255, 105, - 2363, 3943, 1736, 1465, 1468, 1466, 1467, 2351, 1468, 2870, - 1736, 2083, 2383, 2384, 1468, 2594, 2978, 2862, 3498, 1736, - 2843, 1465, 1096, 1466, 1467, 2401, 1465, 2658, 1466, 1467, - 1841, 2959, 2952, 2953, 103, 3491, 1736, 2212, 2058, 1468, - 2891, 1943, 2438, 2439, 2440, 2441, 1939, 1046, 2339, 2423, - 1465, 1736, 1466, 1467, 1935, 1096, 1465, 2424, 1466, 1467, - 2891, 1934, 2433, 1933, 2434, 2435, 2436, 2437, 1751, 2405, - 2357, 2364, 2358, 1465, 1264, 1466, 1467, 2846, 2845, 2934, - 2444, 2445, 2446, 2447, 2862, 2366, 2458, 2516, 2427, 1468, - 1465, 2870, 1466, 1467, 2504, 2841, 3488, 1736, 1468, 2428, - 2464, 2386, 3486, 1736, 3524, 2892, 1080, 2411, 2410, 1753, - 2409, 3528, 1081, 3193, 2143, 2894, 2426, 2295, 2296, 2297, - 2298, 2299, 2425, 1468, 3524, 2892, 3223, 3449, 1736, 1464, - 1465, 109, 1466, 1467, 2320, 2594, 2594, 2323, 2324, 2117, - 1736, 2501, 4049, 2474, 1841, 1840, 2618, 1465, 2515, 1466, - 1467, 1465, 1136, 1466, 1467, 1784, 1783, 1465, 3524, 1466, - 1467, 4021, 1879, 2846, 2459, 2455, 2448, 2450, 2451, 2477, - 2473, 2870, 3477, 2341, 1468, 2509, 3527, 1752, 2512, 3258, - 2513, 2485, 1465, 3166, 1466, 1467, 3447, 1736, 1468, 2412, - 2869, 165, 2752, 2655, 2529, 2654, 2508, 2507, 177, 2459, - 2511, 3575, 1464, 2515, 2498, 1468, 2533, 2381, 2530, 1740, - 2534, 2535, 2135, 2124, 2125, 2126, 2127, 2137, 2128, 2129, - 2130, 2142, 2138, 2131, 2132, 2139, 2140, 2141, 2133, 2134, - 2136, 2342, 1465, 1468, 1466, 1467, 2117, 1135, 1468, 185, - 2055, 1465, 1468, 1466, 1467, 2039, 2627, 1468, 2870, 1985, - 2599, 1737, 1739, 1468, 1771, 3576, 3577, 3578, 1468, 1034, - 1034, 1034, 3443, 1736, 1035, 1118, 1465, 2540, 1466, 1467, - 1117, 95, 4127, 4068, 3907, 3334, 3440, 1736, 1743, 1521, - 3873, 1521, 166, 171, 168, 174, 175, 176, 178, 180, - 181, 182, 183, 3438, 1736, 3733, 3591, 2614, 184, 186, - 187, 188, 3588, 3569, 3390, 3389, 2571, 1914, 1843, 2457, - 2318, 3330, 3285, 3281, 2960, 2454, 2620, 1465, 2449, 1466, - 1467, 2626, 1016, 1468, 2308, 3283, 2619, 1017, 2443, 2617, - 3915, 1465, 2442, 1466, 1467, 3436, 1736, 2113, 1968, 2317, - 4183, 3434, 1736, 1874, 95, 2385, 3432, 1736, 1465, 1870, - 1466, 1467, 1839, 2389, 121, 2392, 2926, 1208, 2058, 3908, - 2586, 1915, 1916, 1917, 2472, 2875, 2878, 2879, 2880, 2876, - 1468, 2877, 2881, 2592, 3538, 3539, 1465, 2355, 1466, 1467, - 4181, 1465, 4155, 1466, 1467, 1465, 4029, 1466, 1467, 2600, - 1465, 1468, 1466, 1467, 3948, 3541, 1465, 1468, 1466, 1467, - 3544, 1465, 2606, 1466, 1467, 3277, 2603, 2604, 2605, 2035, - 3579, 3430, 1736, 3276, 2084, 974, 975, 976, 977, 978, - 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1910, 3428, 1736, - 3580, 3581, 3582, 2607, 2630, 2609, 1465, 2925, 1466, 1467, - 3275, 3193, 2939, 2036, 2612, 2572, 2613, 3215, 1468, 3426, - 1736, 673, 3216, 3213, 3543, 3424, 1736, 3212, 3214, 3217, - 1468, 2879, 2880, 3211, 1468, 4025, 2608, 2796, 1468, 3698, - 3909, 3697, 2372, 2615, 1748, 1468, 1048, 1911, 1912, 1913, - 2361, 1468, 3532, 1465, 2784, 1466, 1467, 1468, 2926, 2666, - 3171, 3170, 1468, 3987, 3183, 3185, 3711, 2580, 2581, 2828, - 3713, 1468, 2583, 3186, 1465, 3520, 1466, 1467, 1468, 3180, - 1465, 2584, 1466, 1467, 3517, 2114, 1051, 2112, 1034, 1984, - 2831, 3696, 3516, 1468, 1052, 734, 2058, 1049, 2875, 2878, - 2879, 2880, 2876, 2550, 2877, 2881, 3422, 1736, 3538, 3539, - 1018, 2867, 2868, 2569, 2570, 2829, 3254, 2574, 3420, 1736, - 2399, 1468, 3546, 1034, 2887, 2909, 3418, 1736, 2930, 2579, - 2160, 2564, 2563, 3416, 1736, 2832, 2582, 2834, 2562, 3414, - 1736, 2561, 1468, 2560, 1174, 3412, 1736, 2161, 2559, 1173, - 3410, 1736, 1468, 2080, 2078, 2079, 2083, 2866, 2847, 3396, - 1736, 1465, 2585, 1466, 1467, 3350, 3372, 1736, 2637, 2925, - 1468, 3008, 2966, 1465, 1432, 1466, 1467, 1465, 129, 1466, - 1467, 1465, 1736, 1466, 1467, 2652, 42, 1468, 1465, 1708, - 1466, 1467, 2819, 1468, 1465, 2884, 1466, 1467, 2886, 1060, - 1465, 1468, 1466, 1467, 2885, 1465, 2856, 1466, 1467, 2817, - 1736, 2839, 3522, 1059, 1465, 101, 1466, 1467, 1468, 2912, - 2914, 1465, 1702, 1466, 1467, 102, 1468, 103, 2905, 2859, - 2815, 1736, 4197, 1468, 110, 2844, 1465, 2964, 1466, 1467, - 2790, 1736, 4104, 2889, 101, 109, 1468, 108, 3273, 2575, - 103, 3500, 2893, 1468, 102, 103, 2598, 2896, 2767, 1736, - 1468, 4006, 2464, 2903, 1465, 3903, 1466, 1467, 2906, 2383, - 2384, 3253, 2975, 2883, 2367, 2759, 1736, 108, 3169, 2917, - 3972, 2750, 1736, 109, 2155, 1465, 3168, 1466, 1467, 2156, - 4162, 3971, 110, 1468, 3951, 1465, 2927, 1466, 1467, 3719, - 3717, 3716, 3709, 109, 1468, 108, 2748, 1736, 3589, 2940, - 2941, 2942, 2936, 1465, 3493, 1466, 1467, 2935, 3521, 3519, - 2928, 2735, 1736, 1468, 3286, 2931, 2932, 2218, 2972, 1468, - 1465, 1862, 1466, 1467, 2733, 1736, 1465, 2499, 1466, 1467, - 1857, 2731, 1736, 110, 1465, 1058, 1466, 1467, 2729, 1736, - 2961, 2962, 1468, 3510, 109, 2971, 1468, 3708, 3018, 3019, - 2862, 1465, 3682, 1466, 1467, 4185, 4184, 3, 2843, 1465, - 1468, 1466, 1467, 3072, 1468, 2656, 1465, 2353, 1466, 1467, - 1765, 2727, 1736, 1468, 1757, 4184, 2997, 4185, 1468, 1465, - 3993, 1466, 1467, 4005, 3016, 3555, 1465, 3035, 1466, 1467, - 1468, 114, 115, 1465, 97, 1466, 1467, 2301, 1, 1026, - 3000, 2725, 1736, 2052, 1435, 1468, 10, 2723, 1736, 1434, - 3559, 4116, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, - 3061, 3062, 2050, 1468, 689, 9, 1465, 2333, 1466, 1467, - 3036, 3880, 3070, 2051, 2721, 1736, 8, 1465, 2343, 1466, - 1467, 1706, 4156, 4112, 4113, 1737, 2340, 2973, 2719, 1736, - 1954, 1944, 2717, 1736, 3621, 2269, 1465, 3904, 1466, 1467, - 3289, 3489, 1465, 2505, 1466, 1467, 2715, 1736, 1468, 3587, - 2462, 1126, 154, 2421, 2422, 4081, 118, 1084, 2713, 1736, - 3074, 2365, 1468, 1730, 117, 1465, 1129, 1466, 1467, 1465, - 1237, 1466, 1467, 2711, 1736, 2500, 3130, 1734, 3006, 3611, - 1731, 3007, 2910, 1465, 2430, 1466, 1467, 1465, 1790, 1466, - 1467, 2709, 1736, 1788, 1789, 1787, 1465, 1792, 1466, 1467, - 3020, 1465, 2888, 1466, 1467, 2359, 2360, 1733, 3037, 1732, - 3137, 1791, 4053, 1465, 3358, 1466, 1467, 3148, 2657, 3456, - 2043, 2951, 724, 2882, 718, 3139, 192, 1779, 1465, 3017, - 1466, 1467, 1758, 1168, 2399, 679, 2707, 1736, 3262, 3063, - 2306, 2538, 2306, 3110, 685, 2304, 1465, 2304, 1466, 1467, - 2705, 1736, 1518, 2034, 3167, 2897, 3200, 1078, 87, 1070, - 2354, 2399, 2399, 2399, 2399, 2399, 2833, 2476, 1077, 3120, - 3121, 3122, 3123, 3124, 3881, 3201, 2937, 3514, 3179, 3181, - 3148, 2399, 2849, 3184, 2399, 3177, 3986, 3205, 3138, 3710, - 3140, 1465, 4066, 1466, 1467, 2907, 1995, 1468, 1754, 3476, - 3222, 1468, 3038, 3147, 2629, 1465, 2150, 1466, 1467, 2401, - 1508, 2398, 3159, 1468, 3677, 2070, 747, 746, 3175, 744, - 3160, 3162, 3164, 2835, 1468, 2863, 3174, 3172, 1468, 1472, - 1471, 955, 1468, 1037, 2823, 1766, 2401, 2401, 2401, 2401, - 2401, 2874, 2986, 2987, 2988, 2989, 2990, 2991, 3306, 3165, - 3187, 3188, 2872, 1039, 3206, 2871, 2401, 3209, 3314, 2401, - 1038, 2573, 2406, 3218, 104, 3224, 3540, 3536, 3225, 2058, - 3001, 105, 3226, 3207, 3208, 1468, 3210, 4108, 2400, 2396, - 3232, 2842, 906, 3173, 1468, 2703, 1736, 3265, 1468, 3204, - 3593, 905, 3009, 756, 1468, 3263, 3264, 748, 738, 968, - 904, 2701, 1736, 1468, 903, 3316, 3317, 2981, 3331, 2983, - 2908, 3327, 2696, 1736, 1449, 1725, 2692, 1736, 1468, 1728, - 2690, 1736, 3190, 2362, 3318, 3315, 3319, 1097, 1468, 2464, - 3308, 3355, 4012, 2597, 3112, 3287, 3114, 3384, 1724, 3325, - 1465, 4019, 1466, 1467, 1465, 3297, 1466, 1467, 3605, 3278, - 3266, 3267, 3125, 3126, 3127, 3128, 1465, 3346, 1466, 1467, - 3196, 2957, 3345, 3455, 3343, 3196, 2492, 1465, 3353, 1466, - 1467, 1465, 3451, 1466, 1467, 1465, 3387, 1466, 1467, 69, - 1730, 46, 2683, 1736, 3981, 4050, 3363, 898, 895, 3679, - 3680, 2681, 1736, 3681, 1734, 3133, 3134, 1731, 3379, 3380, - 3381, 3382, 3383, 3360, 3361, 4032, 3362, 2921, 4033, 3364, - 894, 3366, 4034, 3368, 2207, 1445, 3386, 1442, 1465, 4129, - 1466, 1467, 1726, 1727, 1733, 2045, 1732, 1465, 96, 1466, - 1467, 1465, 1521, 1466, 1467, 36, 1521, 1465, 35, 1466, - 1467, 2616, 34, 33, 32, 2621, 1465, 26, 1466, 1467, - 25, 3288, 3501, 24, 3503, 3471, 23, 22, 29, 19, - 21, 1465, 3475, 1466, 1467, 20, 18, 3300, 2624, 4151, - 2625, 1465, 4196, 1466, 1467, 123, 2633, 55, 52, 50, - 2635, 2636, 131, 130, 53, 49, 1211, 47, 31, 2642, - 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, 30, - 2653, 17, 16, 15, 14, 3199, 13, 12, 11, 7, - 6, 39, 38, 37, 2399, 28, 27, 40, 3506, 4, - 2944, 2494, 0, 2659, 2660, 2661, 2662, 3553, 2664, 2665, - 3511, 2667, 3518, 3354, 3502, 2669, 3504, 0, 0, 2674, - 2675, 0, 2676, 0, 1468, 2679, 2680, 2682, 2684, 2685, - 2686, 2687, 2688, 2689, 2691, 2693, 2694, 2695, 2697, 0, - 2699, 2700, 2702, 2704, 2706, 2708, 2710, 2712, 2714, 2716, - 2718, 2720, 2722, 2724, 2726, 2728, 2730, 2732, 2734, 2736, - 2737, 2738, 3309, 2740, 3545, 2742, 3547, 2744, 2745, 2401, - 2747, 2749, 2751, 3318, 3315, 3319, 2754, 3554, 3548, 736, - 2758, 3542, 3523, 0, 2763, 2764, 2765, 2766, 1468, 0, - 3570, 0, 3572, 1468, 0, 3508, 0, 2777, 2778, 2779, - 2780, 2781, 2782, 0, 0, 2786, 2787, 3478, 0, 3480, - 3481, 3482, 3378, 2789, 0, 1468, 0, 3274, 2795, 3348, - 3349, 0, 0, 2798, 2799, 2800, 2801, 2802, 3535, 0, - 0, 0, 0, 0, 2809, 2810, 1468, 2811, 0, 0, - 2814, 2816, 2365, 3312, 2818, 0, 0, 3549, 3550, 3615, - 3616, 3564, 3565, 0, 2830, 0, 0, 3326, 0, 1468, - 0, 0, 0, 1468, 0, 0, 0, 1465, 1468, 1466, - 1467, 3617, 0, 0, 1468, 0, 3376, 3344, 1468, 0, - 3347, 2813, 0, 0, 0, 0, 0, 0, 1057, 0, - 0, 1063, 1063, 0, 0, 0, 3633, 0, 0, 0, - 0, 0, 0, 2812, 3598, 0, 1468, 0, 3602, 3603, - 3604, 1468, 0, 0, 0, 0, 0, 0, 0, 1468, - 0, 3644, 0, 0, 2808, 0, 0, 1468, 0, 0, - 0, 1465, 0, 1466, 1467, 0, 1465, 0, 1466, 1467, - 0, 0, 0, 0, 0, 0, 0, 2807, 1468, 0, - 0, 2806, 0, 1468, 0, 0, 2805, 0, 1465, 1703, - 1466, 1467, 2804, 0, 0, 0, 2803, 1468, 0, 0, - 3695, 1468, 0, 3702, 3685, 3704, 3686, 3687, 3688, 1465, - 0, 1466, 1467, 0, 0, 3675, 1468, 0, 0, 0, - 1468, 0, 0, 0, 2794, 0, 0, 3705, 3200, 2793, - 0, 87, 1465, 3200, 1466, 1467, 1465, 2792, 1466, 1467, - 0, 1465, 0, 1466, 1467, 2791, 0, 1465, 0, 1466, - 1467, 1465, 0, 1466, 1467, 3638, 0, 0, 2114, 0, - 2112, 0, 0, 3735, 3706, 1468, 2788, 0, 0, 3715, - 3714, 2783, 0, 3725, 0, 3507, 1468, 3727, 3722, 1465, - 3724, 1466, 1467, 0, 1465, 2776, 1466, 1467, 0, 2775, - 0, 0, 1465, 0, 1466, 1467, 0, 0, 3887, 0, - 1465, 0, 1466, 1467, 2774, 0, 42, 3739, 2773, 0, - 0, 0, 0, 0, 0, 0, 0, 3594, 3595, 0, - 0, 1465, 0, 1466, 1467, 0, 1465, 0, 1466, 1467, - 0, 0, 0, 0, 0, 0, 0, 0, 3879, 3878, - 1465, 0, 1466, 1467, 1465, 0, 1466, 1467, 0, 3894, - 3906, 0, 0, 2772, 3899, 0, 3898, 0, 3877, 1465, - 3568, 1466, 1467, 1465, 2771, 1466, 1467, 0, 0, 0, - 3048, 3049, 3050, 3051, 3052, 3945, 0, 3946, 3729, 0, - 3583, 0, 0, 3584, 3585, 3586, 2114, 0, 2112, 0, - 3067, 3949, 3703, 0, 0, 0, 0, 0, 0, 0, - 3736, 3737, 0, 0, 0, 0, 0, 0, 1465, 0, - 1466, 1467, 0, 0, 0, 0, 0, 0, 0, 1465, - 0, 1466, 1467, 0, 0, 3952, 3994, 3200, 0, 3955, - 3196, 0, 3731, 0, 3889, 3890, 3891, 0, 0, 0, - 3666, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, - 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, - 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, - 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, - 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, - 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, - 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, - 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, - 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, - 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1638, 1639, - 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, - 1650, 1651, 1652, 1653, 1659, 1660, 1661, 1662, 1676, 1677, - 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, - 1688, 1689, 3995, 3979, 3950, 3978, 0, 3199, 0, 1468, - 0, 0, 3199, 1468, 3969, 0, 4013, 1468, 0, 0, - 0, 3975, 1468, 3977, 0, 0, 1468, 0, 0, 0, - 3202, 0, 3998, 0, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3997, 1468, 0, 3220, 0, - 0, 1468, 0, 3882, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4002, 4015, 0, 0, 0, 4018, 0, - 0, 0, 0, 0, 0, 0, 1468, 3886, 0, 0, - 4020, 0, 1468, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2770, 0, 0, - 0, 2769, 0, 0, 0, 2768, 0, 0, 0, 42, - 2762, 0, 0, 0, 2761, 4038, 0, 0, 4039, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3985, 0, - 0, 0, 4063, 0, 2760, 0, 0, 87, 0, 2757, - 0, 4048, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4057, 1465, 0, 1466, 1467, 1465, 0, 1466, 1467, - 1465, 0, 1466, 1467, 2756, 1465, 4069, 1466, 1467, 1465, - 2755, 1466, 1467, 0, 4080, 0, 3352, 1469, 4072, 0, - 4077, 3906, 4083, 4067, 4074, 4073, 4071, 4076, 4075, 1465, - 0, 1466, 1467, 0, 1465, 3999, 1466, 1467, 3369, 3370, - 0, 3371, 3373, 3375, 4102, 0, 3199, 0, 1527, 0, - 0, 0, 42, 0, 4107, 4125, 4115, 4120, 0, 1465, - 0, 1466, 1467, 4094, 0, 1465, 0, 1466, 1467, 3388, - 4135, 0, 4133, 0, 3391, 4146, 3393, 3394, 3395, 3397, - 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, - 3408, 3409, 3411, 3413, 3415, 3417, 3419, 3421, 3423, 3425, - 3427, 3429, 3431, 3433, 3435, 3437, 3439, 3441, 3442, 3444, - 3445, 3446, 3448, 1995, 4150, 3450, 4145, 3452, 3453, 3454, - 4094, 4176, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, - 3466, 3467, 3468, 2114, 4182, 2112, 4180, 4169, 4179, 4178, - 4175, 3474, 4165, 4064, 4166, 3479, 1703, 4190, 1468, 3483, - 3484, 4059, 3485, 3487, 1468, 3490, 3492, 0, 3494, 3495, - 3496, 3497, 4204, 4206, 4198, 1468, 0, 0, 3505, 3196, - 0, 1468, 0, 0, 0, 4004, 1468, 0, 0, 0, - 1468, 0, 0, 0, 0, 4214, 1468, 0, 0, 4215, - 4216, 2114, 3946, 2112, 1468, 0, 4213, 4094, 0, 1468, - 0, 0, 4027, 3529, 3530, 4011, 0, 3534, 0, 4023, - 4037, 0, 0, 0, 1468, 0, 0, 0, 0, 1468, - 0, 0, 0, 0, 1468, 0, 0, 0, 0, 0, - 0, 0, 1468, 0, 0, 0, 2753, 0, 0, 1468, - 0, 0, 2746, 0, 0, 0, 4149, 0, 0, 0, - 0, 0, 0, 2743, 0, 1807, 0, 0, 0, 2741, - 0, 4141, 0, 0, 2739, 0, 0, 0, 2698, 0, - 0, 0, 1703, 0, 2678, 0, 0, 0, 0, 0, - 0, 0, 2677, 0, 0, 0, 4024, 2673, 0, 0, - 0, 1465, 0, 1466, 1467, 0, 4058, 1465, 0, 1466, - 1467, 0, 2671, 0, 0, 0, 0, 2663, 1465, 0, - 1466, 1467, 2634, 3609, 1465, 0, 1466, 1467, 0, 1465, - 2628, 1466, 1467, 1465, 0, 1466, 1467, 2623, 0, 1465, - 0, 1466, 1467, 0, 0, 0, 0, 1465, 1756, 1466, - 1467, 0, 1465, 0, 1466, 1467, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1465, 3628, 1466, - 1467, 3632, 1465, 0, 1466, 1467, 0, 1465, 0, 1466, - 1467, 0, 0, 0, 0, 1465, 1844, 1466, 1467, 0, - 0, 0, 1465, 0, 1466, 1467, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3645, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1795, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4163, - 0, 951, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3668, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3676, 0, 0, 0, 0, 0, 0, 3683, - 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 195, 1808, 0, 0, 722, 0, 0, 0, 0, 728, - 0, 0, 0, 0, 2000, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, + 973, 3695, 3696, 87, 3694, 4025, 4179, 4211, 961, 4115, + 4134, 2146, 3358, 2370, 4007, 4224, 4103, 1282, 4178, 1284, + 968, 3644, 960, 2134, 3259, 2442, 3266, 2072, 3930, 3220, + 5, 3307, 3494, 3316, 3321, 4005, 3318, 3317, 3315, 3320, + 3319, 3073, 3631, 2372, 3158, 3336, 3274, 2517, 2013, 752, + 3335, 3224, 3221, 3534, 3047, 3072, 3540, 3218, 2875, 3737, + 2397, 747, 3338, 3208, 3524, 2480, 746, 922, 2949, 3365, + 1860, 1803, 780, 3029, 2504, 2980, 2485, 1759, 1093, 4076, + 921, 2951, 2950, 2430, 163, 2413, 1041, 2548, 87, 2881, + 2418, 1061, 1038, 1068, 2867, 1908, 2851, 2900, 2326, 2416, + 926, 41, 1163, 42, 1139, 2130, 2294, 1041, 2080, 2417, + 2293, 2526, 3021, 2503, 43, 3562, 2168, 2405, 1890, 2487, + 2565, 2942, 1103, 1126, 1121, 149, 1792, 2917, 1772, 2420, + 100, 1720, 1540, 2174, 104, 105, 2105, 2094, 1465, 1448, + 2009, 1897, 1100, 1097, 1869, 3223, 762, 1132, 1989, 2476, + 1101, 1127, 1128, 1791, 2477, 1777, 1078, 1129, 757, 1080, + 1742, 1050, 2201, 1523, 2182, 2888, 3732, 1499, 749, 1047, + 2849, 2071, 85, 107, 1272, 2021, 167, 127, 2398, 125, + 126, 3495, 1882, 1060, 132, 3724, 1040, 133, 1044, 1045, + 1073, 1212, 93, 923, 3551, 99, 1549, 1036, 1048, 98, + 4212, 750, 1046, 739, 1544, 3632, 1072, 1063, 1280, 3304, + 2519, 1258, 84, 2519, 2520, 2521, 4060, 3003, 3002, 2563, + 2971, 106, 1466, 3624, 1035, 4161, 3037, 3038, 3587, 128, + 1053, 4055, 4056, 2367, 2368, 2087, 134, 3699, 3699, 1168, + 682, 1143, 4061, 1094, 2086, 2085, 2084, 2083, 2082, 2052, + 1228, 679, 2847, 680, 1165, 2616, 3204, 3162, 4234, 2552, + 4177, 4182, 4202, 1176, 4155, 1110, 1105, 1182, 1183, 1184, + 3498, 1187, 1188, 1189, 1190, 1087, 740, 1193, 1194, 1195, + 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, + 1206, 1207, 1208, 1209, 1142, 1088, 1054, 1763, 1039, 1062, + 1753, 128, 1117, 2551, 1116, 1115, 1037, 1118, 2, 1761, + 1482, 95, 3326, 1169, 1172, 1173, 1974, 4034, 95, 2877, + 724, 3497, 3326, 1229, 2394, 4217, 2973, 1764, 1462, 2393, + 1476, 1459, 4056, 3698, 3698, 3323, 2996, 4008, 724, 1762, + 2391, 2812, 95, 4165, 2092, 3384, 1185, 4130, 2993, 1034, + 4216, 4163, 927, 111, 112, 113, 3926, 116, 3925, 1167, + 122, 718, 2108, 191, 1166, 4192, 674, 95, 4164, 128, + 190, 3936, 3324, 1086, 1090, 925, 4162, 3637, 737, 738, + 3638, 4159, 3324, 86, 976, 977, 978, 718, 1029, 1030, + 1031, 1032, 86, 129, 3656, 1043, 86, 1450, 3645, 4104, + 4112, 3330, 2545, 1119, 2623, 3935, 2891, 2139, 4139, 172, + 3410, 3330, 976, 977, 978, 1871, 3256, 3257, 2848, 1086, + 1090, 925, 718, 1075, 1076, 2926, 3655, 1793, 2925, 1794, + 713, 2927, 2437, 2438, 2892, 3255, 1461, 3036, 4116, 2064, + 2065, 2620, 1472, 2550, 2436, 1464, 3020, 3751, 1248, 1253, + 1254, 1277, 1027, 1026, 4026, 2931, 2974, 1211, 1236, 1479, + 1249, 1480, 1481, 1237, 1242, 2938, 95, 718, 718, 169, + 718, 1478, 170, 2017, 2621, 95, 2455, 2454, 698, 95, + 1236, 718, 3362, 3360, 3392, 1237, 1114, 3094, 1221, 1222, + 3390, 696, 4144, 1235, 1443, 1234, 2884, 2885, 189, 2614, + 2063, 732, 2067, 736, 4039, 1995, 2369, 2210, 730, 718, + 2401, 3366, 4142, 1724, 4120, 4183, 3327, 3022, 2572, 2527, + 1224, 2496, 4148, 4149, 2401, 86, 3327, 1789, 88, 2981, + 1964, 693, 3276, 3277, 2566, 3978, 4184, 3979, 3006, 4143, + 708, 1460, 4120, 1466, 1112, 2490, 3353, 1990, 2590, 4214, + 2591, 1186, 2592, 1269, 3354, 703, 1442, 1255, 1250, 1274, + 1449, 1257, 1243, 1500, 1276, 1217, 706, 1256, 2570, 716, + 1275, 1251, 1252, 2573, 1965, 719, 1966, 717, 3363, 3361, + 2617, 3024, 2618, 2568, 3626, 3381, 3625, 1501, 1502, 1503, + 1504, 1505, 1506, 1507, 1509, 1508, 1510, 1511, 2593, 1192, + 1191, 719, 3910, 1727, 1079, 1152, 2202, 1141, 95, 1141, + 2569, 2204, 1150, 173, 2018, 2209, 2205, 2530, 3622, 2206, + 2207, 2208, 179, 2571, 2203, 2211, 2212, 2213, 2214, 2215, + 2216, 2217, 2218, 2219, 1122, 3703, 719, 683, 1123, 685, + 699, 3275, 721, 2414, 720, 689, 1123, 687, 691, 700, + 692, 1476, 686, 3278, 697, 3095, 1875, 688, 701, 702, + 705, 709, 710, 711, 707, 704, 4156, 695, 722, 1162, + 1161, 3161, 3010, 1514, 3011, 1160, 1113, 1159, 1158, 3537, + 1157, 719, 719, 1156, 719, 2579, 2575, 2577, 2578, 2576, + 2580, 2581, 2582, 1155, 1154, 719, 3278, 1149, 2489, 4235, + 4189, 1089, 1083, 1081, 1098, 2399, 2400, 1098, 1171, 1135, + 1140, 1096, 1140, 1281, 1134, 1281, 1281, 1098, 1170, 2399, + 2400, 1134, 2010, 719, 1074, 1999, 1870, 1997, 1998, 1996, + 2000, 2001, 2002, 3621, 3025, 2556, 2555, 2006, 1471, 1468, + 1469, 1470, 1475, 1477, 1474, 1451, 1473, 1089, 1083, 1081, + 164, 3189, 1179, 3187, 3298, 1153, 1467, 3005, 1790, 3041, + 1868, 2975, 1151, 1472, 1867, 1041, 1524, 1529, 1530, 1866, + 1533, 1535, 1536, 1537, 1538, 1539, 2991, 1542, 1543, 1545, + 1545, 2007, 1545, 1545, 1550, 1550, 1550, 1553, 1554, 1555, + 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, + 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, + 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, + 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, + 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, + 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, + 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, + 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, + 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, + 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, + 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, + 1676, 1521, 3697, 3697, 1270, 1677, 4033, 1679, 1680, 1681, + 1682, 1683, 2549, 1440, 1441, 2972, 3585, 3586, 1439, 1550, + 1550, 1550, 1550, 1550, 1550, 974, 2940, 1120, 3654, 1534, + 1223, 1220, 974, 723, 1690, 1691, 1692, 1693, 1694, 1695, + 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 2995, 1525, + 1517, 1518, 1519, 1520, 714, 4118, 974, 94, 1514, 2621, + 1531, 4079, 2852, 2854, 2622, 1717, 94, 1864, 1082, 715, + 94, 1551, 1552, 1227, 1546, 1896, 1547, 1548, 3538, 165, + 3328, 3329, 1215, 4118, 1458, 3482, 177, 4117, 1141, 89, + 3328, 3329, 2994, 3332, 1233, 3382, 673, 1232, 4157, 1238, + 1239, 1240, 1241, 3332, 1976, 1975, 1977, 1978, 1979, 3170, + 3019, 1515, 1516, 3018, 1082, 4117, 4147, 3008, 2547, 1723, + 4021, 2493, 190, 1278, 1279, 3576, 3558, 185, 1041, 2922, + 1752, 3028, 1041, 2887, 1141, 2824, 1246, 1109, 1041, 2142, + 1111, 1265, 1781, 1267, 2638, 129, 1678, 1226, 3169, 1471, + 1468, 1469, 1470, 1475, 1477, 1474, 4228, 1473, 2882, 681, + 4146, 172, 2494, 2443, 1714, 1715, 1178, 1467, 2166, 2492, + 166, 171, 168, 174, 175, 176, 178, 180, 181, 182, + 183, 1264, 1266, 1141, 1895, 1514, 184, 186, 187, 188, + 124, 1140, 1506, 1507, 1509, 1508, 1510, 1511, 1994, 94, + 1511, 3254, 2649, 2495, 1259, 1141, 1753, 1494, 2183, 1057, + 119, 2022, 1273, 2491, 4047, 1684, 1685, 1686, 1687, 1688, + 1689, 169, 1733, 1734, 170, 2184, 104, 105, 1731, 1164, + 3031, 3617, 1735, 1715, 3550, 3030, 2853, 1140, 1040, 1114, + 2110, 1106, 1144, 1134, 1114, 1210, 1721, 1146, 1108, 1107, + 189, 1147, 1145, 2567, 2111, 1512, 1513, 2109, 1141, 2076, + 2003, 1795, 2175, 1231, 3068, 107, 4193, 2158, 2147, 2148, + 2149, 2150, 2160, 2151, 2152, 2153, 2165, 2161, 2154, 2155, + 2162, 2163, 2164, 2156, 2157, 2159, 1140, 1482, 120, 1141, + 2649, 1262, 1134, 1137, 1138, 1263, 1098, 1112, 1888, 2509, + 1131, 1135, 3031, 1481, 2175, 1268, 2658, 3030, 1140, 1214, + 1729, 1872, 1873, 1874, 1134, 1137, 1138, 3746, 1098, 1718, + 1730, 1130, 1131, 1135, 3592, 2546, 3591, 1732, 2534, 1959, + 1261, 1755, 1898, 1898, 1905, 1910, 2015, 1911, 1758, 1913, + 1915, 1881, 1941, 1919, 1921, 1923, 1925, 1927, 1900, 3262, + 1039, 1037, 1245, 1991, 1904, 1992, 1786, 1787, 1993, 1281, + 2169, 1140, 1260, 1247, 2181, 173, 1144, 1134, 1855, 2023, + 1899, 1146, 1480, 1481, 179, 1147, 1145, 1894, 1949, 1950, + 1753, 2539, 1500, 1216, 1955, 1956, 1863, 2539, 4226, 1482, + 2544, 4227, 1140, 4225, 1177, 2542, 1148, 1878, 1174, 1879, + 3263, 1152, 1877, 1891, 1150, 4236, 1501, 1502, 1503, 1504, + 1505, 1506, 1507, 1509, 1508, 1510, 1511, 1230, 1213, 2098, + 2099, 2096, 2097, 4185, 2543, 3265, 1902, 3577, 1052, 1113, + 2541, 3048, 1753, 1984, 1113, 742, 1479, 4230, 1480, 1481, + 2180, 1736, 4080, 724, 4013, 3260, 2095, 3651, 1945, 3652, + 3918, 1482, 3917, 1937, 2011, 3908, 1940, 1982, 1942, 2098, + 2099, 2628, 2629, 3668, 1971, 3276, 3277, 976, 977, 978, + 3667, 3599, 3261, 1502, 1503, 1504, 1505, 1506, 1507, 1509, + 1508, 1510, 1511, 128, 1117, 3598, 1116, 1115, 3588, 1482, + 1789, 4081, 1500, 4014, 3305, 1496, 3294, 1497, 2947, 2946, + 2945, 4237, 164, 2499, 1983, 1985, 3267, 1969, 1482, 1968, + 2028, 1498, 1512, 1513, 1495, 3050, 1501, 1502, 1503, 1504, + 1505, 1506, 1507, 1509, 1508, 1510, 1511, 1967, 1981, 1281, + 1281, 1957, 1951, 1948, 2050, 1970, 2024, 2025, 1479, 1947, + 1480, 1481, 2331, 4198, 1753, 87, 2328, 3070, 87, 1946, + 2029, 1500, 4186, 3040, 1917, 2330, 1728, 2036, 2037, 2038, + 1482, 3582, 2331, 724, 2929, 3357, 724, 2049, 2515, 1482, + 2514, 972, 1445, 4042, 3275, 1501, 1502, 1503, 1504, 1505, + 1506, 1507, 1509, 1508, 1510, 1511, 3278, 2166, 3060, 3059, + 3058, 1500, 2513, 3052, 2512, 3056, 2511, 3051, 2510, 3049, + 1479, 4187, 1480, 1481, 3054, 1504, 1505, 1506, 1507, 1509, + 1508, 1510, 1511, 3053, 4041, 1501, 1502, 1503, 1504, 1505, + 1506, 1507, 1509, 1508, 1510, 1511, 2137, 2137, 2135, 2135, + 2138, 1482, 3055, 3057, 101, 4017, 2697, 2100, 1479, 4016, + 1480, 1481, 1482, 4015, 102, 42, 1478, 1753, 42, 1482, + 2873, 4213, 4196, 1753, 1482, 3913, 2026, 1479, 1766, 1480, + 1481, 4126, 1753, 2030, 1482, 2032, 2033, 2034, 2035, 4173, + 1753, 3399, 2039, 3897, 2221, 1488, 1489, 1490, 1491, 1492, + 1493, 1487, 1484, 3896, 2051, 3745, 2158, 2147, 2148, 2149, + 2150, 2160, 2151, 2152, 2153, 2165, 2161, 2154, 2155, 2162, + 2163, 2164, 2156, 2157, 2159, 1753, 3264, 1767, 3743, 1479, + 3664, 1480, 1481, 1713, 85, 2873, 1753, 85, 1479, 2077, + 1480, 1481, 1712, 4124, 1753, 1753, 1714, 1715, 1711, 1482, + 1478, 1753, 2107, 3596, 4122, 1753, 4035, 2057, 2058, 110, + 3581, 165, 1753, 101, 2170, 3367, 3991, 1753, 177, 103, + 109, 3364, 108, 102, 2112, 3297, 2113, 4030, 2115, 2116, + 2117, 2118, 2119, 2120, 2122, 2124, 2125, 2126, 2127, 2128, + 2129, 1710, 3296, 2956, 1482, 2943, 1708, 1710, 2141, 1704, + 1479, 1706, 1480, 1481, 1707, 1705, 2339, 1709, 2341, 185, + 2114, 1479, 1482, 1480, 1481, 2873, 4111, 3945, 1479, 2245, + 1480, 1481, 1482, 1479, 2611, 1480, 1481, 2603, 1525, 2185, + 2186, 2187, 2188, 1479, 1753, 1480, 1481, 2340, 2406, 2407, + 2602, 3989, 1753, 2199, 2220, 1753, 2176, 2329, 2327, 1482, + 1500, 2561, 166, 171, 168, 174, 175, 176, 178, 180, + 181, 182, 183, 2237, 2560, 1482, 2873, 4090, 184, 186, + 187, 188, 2699, 1482, 1501, 1502, 1503, 1504, 1505, 1506, + 1507, 1509, 1508, 1510, 1511, 1482, 3986, 1753, 3944, 1482, + 2873, 4086, 3998, 1753, 1500, 2396, 2637, 2422, 1479, 2375, + 1480, 1481, 3635, 4032, 2338, 3921, 1753, 2344, 2345, 2339, + 1482, 2341, 2873, 3909, 3968, 1753, 104, 105, 1501, 1502, + 1503, 1504, 1505, 1506, 1507, 1509, 1508, 1510, 1511, 2053, + 1482, 2647, 3635, 1753, 2873, 3633, 3901, 104, 105, 2452, + 2411, 2646, 2386, 1479, 2019, 1480, 1481, 2539, 1753, 3900, + 2374, 3556, 1753, 1482, 2685, 2779, 1753, 3940, 2106, 3287, + 3286, 1479, 103, 1480, 1481, 3523, 1753, 2695, 3268, 1980, + 1103, 1479, 3272, 1480, 1481, 3284, 3285, 3516, 1753, 3271, + 1972, 3513, 1753, 3282, 3283, 2461, 2462, 2463, 2464, 2456, + 2447, 2457, 2458, 2459, 2460, 2446, 1053, 2424, 1479, 1962, + 1480, 1481, 3511, 1753, 1103, 2466, 2428, 1958, 2468, 2469, + 2470, 2471, 2387, 3273, 1479, 1954, 1480, 1481, 3269, 3282, + 3281, 2362, 1479, 3270, 1480, 1481, 2380, 1753, 2381, 2389, + 2482, 1953, 1482, 1952, 1479, 2450, 1480, 1481, 1479, 2870, + 1480, 1481, 1482, 2488, 2409, 2528, 1753, 86, 44, 45, + 88, 2897, 1753, 103, 2434, 2433, 1768, 1087, 2432, 1479, + 1271, 1480, 1481, 2449, 2448, 2918, 92, 1482, 2621, 3004, + 48, 76, 77, 2889, 74, 78, 2525, 1088, 1482, 1479, + 3643, 1480, 1481, 1859, 2985, 2982, 75, 3553, 2498, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1509, 1508, 1510, 1511, + 2918, 1143, 1479, 2961, 1480, 1481, 2978, 2979, 109, 2483, + 3219, 1898, 2479, 2472, 2474, 2475, 1482, 2868, 62, 2502, + 2497, 3549, 2501, 2533, 3474, 1753, 2536, 2889, 2537, 2553, + 95, 1482, 3249, 2919, 3472, 1753, 2873, 2872, 2140, 1753, + 1859, 1858, 2621, 2921, 1482, 2483, 2532, 2540, 2535, 2531, + 2897, 1482, 1801, 1800, 1142, 3552, 2896, 2451, 3549, 3468, + 1753, 2557, 190, 2554, 1478, 2558, 2559, 1482, 2919, 4074, + 3465, 1753, 4046, 2976, 2873, 2897, 3502, 110, 2621, 1482, + 83, 1479, 1478, 1480, 1481, 129, 1482, 151, 109, 3600, + 108, 1479, 3284, 1480, 1481, 3192, 1754, 1756, 103, 1482, + 1770, 172, 2435, 2626, 3549, 2779, 2564, 2682, 3463, 1753, + 2645, 2539, 1041, 1041, 1041, 2681, 1479, 2897, 1480, 1481, + 2539, 2522, 2404, 3461, 1753, 1757, 2365, 1479, 2140, 1480, + 1481, 1482, 1535, 2078, 1535, 162, 3459, 1753, 2062, 2005, + 1933, 150, 1788, 3457, 1753, 1125, 3601, 3602, 3603, 1124, + 2641, 1042, 1482, 95, 4152, 4093, 3932, 1760, 2596, 3455, + 1753, 169, 3898, 1753, 170, 1479, 3758, 1480, 1481, 1482, + 2644, 1769, 2341, 3616, 3613, 51, 54, 57, 56, 59, + 1479, 73, 1480, 1481, 82, 79, 1884, 1885, 161, 160, + 189, 3453, 1753, 1479, 1482, 1480, 1481, 1934, 1935, 1936, + 1479, 2340, 1480, 1481, 3594, 3415, 3414, 1861, 61, 91, + 90, 2481, 2613, 71, 72, 58, 1479, 1482, 1480, 1481, + 3355, 80, 81, 3451, 1753, 3310, 1482, 2619, 1479, 3306, + 1480, 1481, 1482, 2986, 95, 1479, 1482, 1480, 1481, 2478, + 1482, 2473, 2467, 2627, 3449, 1753, 1482, 2465, 1479, 1987, + 1480, 1481, 1893, 1889, 1716, 1857, 2633, 121, 2630, 2631, + 2632, 3447, 1753, 1482, 63, 64, 2107, 65, 66, 67, + 68, 3308, 2953, 2952, 1215, 3359, 3563, 3564, 3933, 2496, + 1479, 2378, 1480, 1481, 2055, 4208, 3445, 1753, 4206, 2634, + 4180, 2636, 155, 1886, 158, 4054, 1883, 3973, 156, 157, + 2639, 1479, 2640, 1480, 1481, 173, 3566, 1482, 3302, 3443, + 1753, 1482, 3301, 3569, 179, 3300, 3219, 2657, 1479, 3905, + 1480, 1481, 3568, 2635, 3441, 1753, 1482, 2953, 3439, 1753, + 1482, 60, 3437, 1753, 2965, 2597, 1482, 3238, 3435, 1753, + 3237, 2384, 1482, 1479, 2642, 1480, 1481, 1482, 3241, 3239, + 2823, 2056, 1482, 3242, 3240, 3421, 1753, 1482, 2605, 2606, + 4050, 1482, 3723, 2608, 3722, 1482, 1479, 678, 1480, 1481, + 3934, 1765, 2609, 2693, 2395, 1479, 2811, 1480, 1481, 2654, + 3557, 1479, 2855, 1480, 1481, 1479, 3197, 1480, 1481, 1479, + 3196, 1480, 1481, 1482, 3542, 1479, 1055, 1480, 1481, 3397, + 1753, 1041, 3541, 2844, 1753, 4012, 3736, 2137, 3738, 2135, + 2858, 3545, 1479, 2004, 1480, 1481, 3206, 3721, 2842, 1753, + 1025, 89, 2817, 1753, 2894, 2895, 1482, 2856, 2794, 1753, + 1058, 1482, 3280, 2422, 2786, 1753, 1041, 2914, 1059, 2777, + 1753, 741, 164, 2936, 2775, 1753, 2957, 1056, 2589, 2762, + 1753, 2893, 2183, 2859, 3618, 2861, 1479, 2653, 1480, 1481, + 1479, 1482, 1480, 1481, 3209, 3211, 1482, 2874, 3375, 2184, + 1482, 2588, 2106, 3212, 1482, 1479, 1067, 1480, 1481, 1479, + 2587, 1480, 1481, 2586, 2585, 1479, 2948, 1480, 1481, 2584, + 1066, 1479, 1482, 1480, 1481, 3604, 1479, 1482, 1480, 1481, + 2883, 1479, 1482, 1480, 1481, 1721, 1479, 2846, 1480, 1481, + 1479, 1181, 1480, 1481, 1479, 1929, 1480, 1481, 2760, 1753, + 2583, 1180, 1482, 3571, 42, 2952, 2866, 101, 2939, 2941, + 3034, 94, 2912, 2911, 1715, 1482, 2913, 102, 159, 1444, + 2932, 1482, 1479, 2886, 1480, 1481, 2916, 2871, 3605, 3606, + 3607, 2990, 3547, 2758, 1753, 2103, 2101, 2102, 2756, 1753, + 2992, 129, 2754, 1753, 103, 1482, 3518, 2920, 1930, 1931, + 1932, 2488, 2923, 1482, 4222, 1479, 2969, 1480, 1481, 2930, + 1479, 2933, 1480, 1481, 2752, 1753, 2406, 2407, 2600, 2750, + 1753, 4129, 4031, 3001, 2748, 1753, 2178, 3525, 3928, 2944, + 3279, 2179, 2955, 2910, 2390, 1482, 2625, 2958, 2959, 1482, + 1479, 2061, 1480, 1481, 3514, 1479, 2954, 1480, 1481, 1479, + 2060, 1480, 1481, 1479, 108, 1480, 1481, 3480, 2962, 2966, + 2967, 2968, 2963, 2746, 1753, 1482, 3997, 3195, 70, 2241, + 2998, 1479, 109, 1480, 1481, 3194, 1479, 152, 1480, 1481, + 153, 1479, 3996, 1480, 1481, 3976, 3744, 3476, 1881, 1482, + 3742, 3044, 3045, 2987, 2988, 2744, 1753, 3243, 3741, 2906, + 2907, 1479, 101, 1480, 1481, 2997, 3734, 3614, 103, 3546, + 3544, 165, 102, 110, 1479, 3311, 1480, 1481, 177, 2523, + 1479, 1876, 1480, 1481, 109, 110, 108, 2742, 1753, 1065, + 3733, 2740, 1753, 3535, 1482, 2889, 109, 3707, 1482, 3042, + 3023, 3061, 2870, 1482, 1479, 3026, 1480, 1481, 4209, 2324, + 3098, 2683, 1479, 2376, 1480, 1481, 1482, 2738, 1753, 185, + 4210, 4209, 3, 1482, 1782, 3079, 3080, 3081, 3082, 3083, + 3084, 3085, 3086, 3087, 3088, 1774, 114, 115, 1482, 2356, + 4210, 2736, 1753, 4018, 1479, 3096, 1480, 1481, 1479, 2999, + 1480, 1481, 3580, 3062, 97, 2075, 1754, 2363, 10, 1, + 1033, 1447, 166, 171, 168, 174, 175, 176, 178, 180, + 181, 182, 183, 1446, 1479, 3584, 1480, 1481, 184, 186, + 187, 188, 2073, 4141, 694, 9, 2734, 1753, 2366, 2074, + 2732, 1753, 8, 1719, 4181, 3412, 2388, 4137, 1479, 4138, + 1480, 1481, 1973, 3100, 1963, 3646, 1716, 2292, 2730, 1753, + 3046, 3929, 3314, 3156, 2529, 3411, 3032, 3612, 3063, 3033, + 2486, 1133, 154, 1482, 2444, 2445, 4106, 1482, 118, 1091, + 2728, 1753, 2902, 2905, 2906, 2907, 2903, 117, 2904, 2908, + 3043, 1136, 3174, 1479, 1244, 1480, 1481, 1479, 2524, 1480, + 1481, 3636, 1479, 2235, 1480, 1481, 3163, 2937, 2453, 1807, + 1805, 3165, 1806, 1482, 2977, 1479, 1804, 1480, 1481, 1809, + 1808, 2422, 1479, 1482, 1480, 1481, 4078, 3089, 3383, 2684, + 3481, 2066, 2329, 2327, 2329, 2327, 3136, 1479, 1482, 1480, + 1481, 731, 2909, 3226, 1482, 87, 725, 192, 2422, 2422, + 2422, 2422, 2422, 2500, 1796, 3174, 3146, 3147, 3148, 3149, + 3150, 110, 1775, 2059, 3164, 3403, 3166, 1175, 2422, 2723, + 1753, 2422, 109, 684, 108, 3288, 3231, 1482, 2562, 3248, + 690, 1482, 103, 2318, 2319, 2320, 2321, 2322, 1532, 2054, + 3173, 3193, 2015, 1482, 2924, 1085, 1077, 3185, 2377, 2860, + 2343, 3191, 1482, 2346, 2347, 2719, 1753, 3186, 3188, 3190, + 1482, 3198, 3200, 1084, 3906, 2717, 1753, 3227, 3213, 3214, + 3201, 2424, 1479, 3539, 1480, 1481, 1479, 3205, 1480, 1481, + 2710, 1753, 3207, 2876, 3331, 3210, 2708, 1753, 2364, 3233, + 3234, 3230, 3236, 3203, 3339, 1044, 1045, 1482, 2424, 2424, + 2424, 2424, 2424, 104, 105, 3252, 3244, 3232, 4011, 1046, + 3235, 3735, 1479, 1482, 1480, 1481, 3258, 3250, 2424, 3401, + 3251, 2424, 1479, 2840, 1480, 1481, 4091, 2934, 1771, 1482, + 3501, 2656, 3290, 3199, 3291, 2839, 3289, 1479, 2173, 1480, + 1481, 1522, 756, 1479, 2835, 1480, 1481, 1482, 2421, 3702, + 2093, 754, 2834, 1482, 753, 3292, 3293, 3312, 751, 2862, + 2488, 3343, 3333, 1482, 2890, 1486, 3340, 1482, 1485, 962, + 2850, 1783, 3216, 3350, 3344, 1482, 1479, 2901, 1480, 1481, + 1479, 2899, 1480, 1481, 2898, 3222, 2598, 2429, 3565, 2833, + 3222, 3561, 1479, 3368, 1480, 1481, 3371, 1482, 4133, 2423, + 3370, 1479, 3378, 1480, 1481, 2832, 2419, 2869, 913, 1479, + 912, 1480, 1481, 763, 755, 745, 975, 911, 3388, 3385, + 3386, 2831, 3387, 910, 3341, 3389, 3342, 3391, 3007, 3393, + 3404, 3405, 3406, 3407, 3408, 3356, 3009, 2935, 3352, 2830, + 1463, 1738, 1741, 2385, 1104, 2821, 1479, 3380, 1480, 1481, + 2902, 2905, 2906, 2907, 2903, 2820, 2904, 2908, 4037, 2819, + 3563, 3564, 1479, 2624, 1480, 1481, 3409, 2818, 1535, 1737, + 4044, 3322, 1535, 3630, 3303, 3313, 2983, 2516, 1479, 69, + 1480, 1481, 2643, 46, 4006, 4075, 2648, 905, 3526, 2815, + 3528, 902, 3704, 3705, 3706, 3159, 1479, 3160, 1480, 1481, + 3496, 4057, 1479, 4058, 1480, 1481, 901, 3500, 4059, 2651, + 2230, 2652, 1479, 1457, 1480, 1481, 1479, 2660, 1480, 1481, + 1454, 2662, 2663, 4154, 1479, 2068, 1480, 1481, 96, 36, + 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, + 35, 2680, 34, 3379, 33, 3225, 1479, 32, 1480, 1481, + 2422, 26, 25, 3527, 24, 3529, 23, 22, 29, 3531, + 19, 21, 3536, 3578, 2686, 2687, 2688, 2689, 20, 2691, + 2692, 3543, 2694, 1482, 18, 3325, 2696, 4176, 3548, 4221, + 2701, 2702, 123, 2703, 55, 1482, 2706, 2707, 2709, 2711, + 2712, 2713, 2714, 2715, 2716, 2718, 2720, 2721, 2722, 2724, + 743, 2726, 2727, 2729, 2731, 2733, 2735, 2737, 2739, 2741, + 2743, 2745, 2747, 2749, 2751, 2753, 2755, 2757, 2759, 2761, + 2763, 2764, 2765, 3570, 2767, 3579, 2769, 3334, 2771, 2772, + 3343, 2774, 2776, 2778, 3572, 3340, 3503, 2781, 3505, 3506, + 3507, 2785, 3595, 3344, 3597, 2790, 2791, 2792, 2793, 3573, + 2424, 3567, 1482, 52, 3640, 3641, 3373, 3374, 2804, 2805, + 2806, 2807, 2808, 2809, 3533, 2810, 2813, 2814, 50, 131, + 130, 1482, 53, 49, 2816, 3589, 3590, 2803, 1218, 2822, + 47, 31, 1482, 30, 2825, 2826, 2827, 2828, 2829, 1482, + 17, 16, 15, 14, 1482, 2836, 2837, 3560, 2838, 1482, + 13, 2841, 2843, 2388, 12, 2845, 11, 7, 1482, 1064, + 6, 39, 1070, 1070, 1482, 2857, 3574, 3575, 1482, 38, + 37, 28, 1479, 27, 1480, 1481, 40, 3623, 4, 3642, + 2970, 3627, 3628, 3629, 1479, 2518, 1480, 1481, 0, 0, + 0, 0, 0, 0, 2802, 0, 0, 3658, 0, 0, + 0, 0, 0, 2664, 0, 0, 0, 1482, 0, 0, + 0, 0, 1482, 2801, 0, 0, 0, 0, 0, 1482, + 2679, 0, 3669, 0, 2800, 0, 1482, 0, 0, 0, + 1482, 2799, 0, 0, 1482, 0, 2798, 0, 1482, 0, + 0, 2797, 1482, 0, 0, 0, 1482, 0, 0, 0, + 2796, 1479, 0, 1480, 1481, 0, 2795, 0, 1482, 0, + 2789, 0, 0, 0, 0, 3710, 0, 3711, 3712, 3713, + 1479, 0, 1480, 1481, 0, 3720, 0, 1482, 3727, 0, + 3729, 1479, 0, 1480, 1481, 0, 0, 3700, 1479, 0, + 1480, 1481, 1482, 1479, 3730, 1480, 1481, 0, 1479, 2788, + 1480, 1481, 0, 3226, 2787, 0, 87, 1479, 3226, 1480, + 1481, 2784, 0, 1479, 0, 1480, 1481, 1479, 2783, 1480, + 1481, 0, 2782, 0, 0, 0, 2780, 0, 0, 0, + 2773, 0, 1482, 3752, 2770, 0, 0, 3731, 2768, 0, + 0, 0, 2137, 3663, 2135, 3760, 3740, 3750, 3739, 0, + 2766, 0, 3747, 0, 3749, 0, 1479, 0, 1480, 1481, + 1482, 1479, 0, 1480, 1481, 0, 0, 0, 1479, 2725, + 1480, 1481, 0, 3912, 0, 1479, 0, 1480, 1481, 1479, + 3764, 1480, 1481, 1479, 2705, 1480, 1481, 1479, 0, 1480, + 1481, 1479, 0, 1480, 1481, 1479, 0, 1480, 1481, 0, + 0, 3619, 3620, 0, 0, 0, 42, 1479, 0, 1480, + 1481, 0, 3904, 3931, 3903, 0, 0, 0, 0, 0, + 0, 0, 0, 3919, 2704, 0, 1479, 0, 1480, 1481, + 3923, 3924, 0, 0, 0, 0, 3902, 0, 0, 0, + 0, 1479, 0, 1480, 1481, 0, 3970, 3971, 0, 0, + 0, 0, 2700, 3754, 0, 3074, 3075, 3076, 3077, 3078, + 0, 0, 0, 0, 3728, 0, 0, 0, 0, 0, + 2137, 0, 2135, 3974, 0, 3093, 0, 3914, 3915, 3916, + 0, 1479, 0, 1480, 1481, 0, 0, 0, 3761, 3762, + 0, 0, 0, 3222, 0, 0, 0, 0, 0, 3977, + 0, 4019, 3226, 3980, 0, 0, 0, 0, 3756, 1479, + 0, 1480, 1481, 0, 0, 0, 1553, 1554, 1555, 1556, + 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, + 1567, 1568, 1569, 1570, 1571, 1573, 1574, 1575, 1576, 1577, + 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, + 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, + 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, + 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, + 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, + 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, + 1648, 1649, 1650, 1652, 1653, 1654, 1655, 1656, 1657, 1658, + 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1673, + 1674, 1675, 1676, 1690, 1691, 1692, 1693, 1694, 1695, 1696, + 1697, 1698, 1699, 1700, 1701, 1702, 1703, 4020, 4004, 0, + 3975, 4003, 0, 0, 0, 3225, 3994, 0, 0, 1482, + 3225, 4038, 0, 4000, 0, 4002, 0, 0, 1482, 0, + 0, 3064, 0, 0, 1743, 0, 0, 0, 0, 87, + 0, 0, 0, 0, 1743, 3228, 0, 0, 1751, 1482, + 4023, 1744, 0, 1482, 0, 0, 0, 0, 1751, 4022, + 0, 1744, 0, 3246, 0, 0, 4045, 3907, 4040, 4027, + 0, 0, 1482, 0, 4043, 0, 2382, 2383, 1750, 1748, + 1749, 1745, 0, 1746, 0, 3911, 1739, 1740, 1750, 1748, + 1749, 1745, 0, 1746, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1747, 0, 0, 0, + 0, 2698, 0, 0, 0, 0, 1747, 0, 0, 0, + 2690, 0, 0, 0, 0, 0, 0, 0, 0, 4063, + 0, 0, 4064, 0, 0, 0, 0, 4088, 0, 42, + 0, 2661, 87, 0, 0, 2655, 0, 0, 0, 0, + 4073, 0, 0, 0, 0, 1483, 0, 0, 4082, 0, + 0, 0, 0, 3138, 2650, 3140, 0, 0, 1479, 4092, + 1480, 1481, 0, 0, 3931, 4108, 4094, 1479, 4119, 1480, + 1481, 3151, 3152, 3153, 3154, 4105, 1541, 0, 4097, 4102, + 3377, 4099, 4098, 4096, 4101, 4100, 0, 0, 1479, 4127, + 1480, 1481, 1479, 0, 1480, 1481, 0, 0, 0, 4024, + 0, 4132, 3394, 3395, 3225, 3396, 3398, 3400, 0, 4150, + 0, 1479, 0, 1480, 1481, 0, 4140, 0, 4145, 0, + 0, 0, 0, 0, 4158, 4119, 4160, 0, 0, 0, + 4171, 0, 42, 3413, 0, 0, 0, 0, 3416, 0, + 3418, 3419, 3420, 3422, 3423, 3424, 3425, 3426, 3427, 3428, + 3429, 3430, 3431, 3432, 3433, 3434, 3436, 3438, 3440, 3442, + 3444, 3446, 3448, 3450, 3452, 3454, 3456, 3458, 3460, 3462, + 3464, 3466, 3467, 3469, 3470, 3471, 3473, 2015, 4194, 3475, + 4191, 3477, 3478, 3479, 4201, 4205, 3483, 3484, 3485, 3486, + 3487, 3488, 3489, 3490, 3491, 3492, 3493, 2137, 4207, 2135, + 4204, 4203, 4119, 4215, 4200, 3499, 4190, 4175, 4170, 3504, + 4223, 4089, 3222, 3508, 3509, 4084, 3510, 3512, 0, 3515, + 3517, 4231, 3519, 3520, 3521, 3522, 4229, 0, 4174, 0, + 0, 0, 3530, 0, 0, 0, 0, 1825, 0, 4029, + 4240, 4241, 3971, 4239, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2137, 0, 2135, 4238, 0, + 0, 0, 0, 4036, 0, 0, 0, 3554, 3555, 0, + 0, 3559, 0, 4048, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1825, 0, 0, 4166, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4083, 0, 0, 0, 0, 0, 1773, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3634, 0, 0, 0, + 0, 0, 1722, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1812, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1862, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3653, 0, 0, 3657, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 676, 0, 1812, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3670, 0, + 0, 1028, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1826, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4188, 0, 0, 0, 1716, 0, 0, + 0, 0, 0, 1099, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3693, 0, 0, 0, 0, 1826, 0, 0, + 0, 0, 2020, 0, 0, 3701, 0, 0, 0, 0, + 0, 0, 3708, 1839, 1842, 1843, 1844, 1845, 1846, 1847, + 0, 1848, 1849, 1851, 1852, 1850, 1853, 1854, 1827, 1828, + 1829, 1830, 1810, 1811, 1840, 0, 1813, 0, 1814, 1815, + 1816, 1817, 1818, 1819, 1820, 1821, 1822, 0, 0, 1823, + 1831, 1832, 1833, 1834, 0, 1835, 1836, 1837, 1838, 0, + 0, 1824, 1839, 1842, 1843, 1844, 1845, 1846, 1847, 0, + 1848, 1849, 1851, 1852, 1850, 1853, 1854, 1827, 1828, 1829, + 1830, 1810, 1811, 1840, 0, 1813, 0, 1814, 1815, 1816, + 1817, 1818, 1819, 1820, 1821, 1822, 0, 0, 1823, 1831, + 1832, 1833, 1834, 0, 1835, 1836, 1837, 1838, 0, 0, + 1824, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3920, 0, 0, 0, 0, 0, 0, 0, 0, + 3927, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3937, 3938, 3939, 0, 3941, 0, 3942, 3943, 0, 0, + 0, 0, 3946, 3947, 3948, 3949, 3950, 3951, 3952, 3953, + 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, + 3964, 3965, 3966, 3967, 0, 3969, 3972, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3691, 0, 0, + 0, 3981, 3982, 3983, 3984, 3985, 3987, 3988, 3990, 3992, + 3993, 3995, 0, 0, 0, 3999, 0, 0, 0, 4001, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2088, + 2089, 2090, 2091, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2104, 1841, 0, 0, 0, + 0, 0, 0, 0, 4028, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2143, 2144, 0, 0, 0, 0, 2167, 0, 0, 2171, + 2172, 0, 0, 0, 2177, 1841, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2189, + 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 0, + 2200, 0, 0, 0, 2222, 2223, 2224, 2225, 2226, 2227, + 2228, 2229, 2231, 0, 2236, 0, 2238, 2239, 2240, 0, + 2242, 2243, 2244, 0, 2246, 2247, 2248, 2249, 2250, 2251, + 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, + 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, + 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, + 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, + 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, + 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, + 2315, 2316, 2317, 0, 0, 0, 0, 0, 2323, 0, + 2325, 0, 2332, 2333, 2334, 2335, 2336, 2337, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 0, + 2357, 2358, 2359, 2360, 2361, 4010, 0, 0, 0, 0, + 0, 4053, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4068, 0, 0, 0, 1070, + 0, 4071, 0, 4072, 0, 0, 0, 0, 0, 0, + 0, 0, 190, 0, 0, 0, 1219, 0, 1225, 0, + 0, 0, 0, 0, 0, 0, 4087, 0, 0, 0, + 2402, 2403, 0, 0, 0, 129, 0, 151, 958, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 172, 4113, 4114, 0, 0, 2441, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4121, 4123, 4125, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1453, 0, 0, 0, 4131, 162, 0, 0, 0, 0, + 0, 150, 0, 0, 195, 0, 4153, 195, 0, 0, + 0, 729, 0, 0, 0, 0, 735, 0, 0, 0, + 0, 169, 0, 0, 170, 0, 0, 195, 2484, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 195, 4172, 0, 138, 139, 161, 160, + 189, 0, 0, 1716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 735, 195, + 735, 0, 0, 0, 0, 0, 0, 0, 4195, 4197, + 4199, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4052, + 0, 4220, 0, 0, 0, 0, 0, 4062, 0, 0, + 0, 0, 0, 0, 0, 95, 0, 0, 1023, 4232, + 4233, 0, 0, 963, 1024, 976, 977, 978, 964, 0, + 0, 965, 966, 0, 967, 0, 0, 0, 0, 0, + 0, 0, 155, 136, 158, 143, 135, 0, 156, 157, + 972, 0, 979, 980, 0, 173, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 144, 0, 0, 0, 1716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, + 145, 140, 141, 142, 146, 0, 0, 0, 0, 0, + 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 3345, 3346, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 981, 982, 983, 984, 985, 986, 987, + 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, + 1018, 1019, 1020, 1021, 1022, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 164, 0, 0, 0, 3347, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1785, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1802, 2659, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2665, 2666, 2667, 2668, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3348, 3349, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, + 0, 1541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1943, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1988, 0, 0, 0, 0, 0, 0, + 0, 928, 0, 0, 0, 0, 0, 932, 0, 0, + 2016, 929, 930, 0, 0, 0, 931, 933, 0, 0, + 0, 0, 0, 0, 0, 0, 2027, 0, 0, 0, + 0, 0, 0, 2031, 0, 0, 0, 152, 0, 0, + 153, 0, 0, 0, 2042, 2043, 2044, 2045, 2046, 2047, + 2048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 728, 195, 728, 1821, 1824, 1825, 1826, 1827, 1828, - 1829, 0, 1830, 1831, 1833, 1834, 1832, 1835, 1836, 1809, - 1810, 1811, 1812, 1793, 1794, 1822, 0, 1796, 0, 1797, - 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 0, 0, - 1806, 1813, 1814, 1815, 1816, 0, 1817, 1818, 1819, 1820, - 0, 0, 0, 0, 0, 0, 0, 0, 3895, 0, - 0, 0, 0, 0, 0, 0, 0, 3902, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3912, 3913, 3914, - 0, 3916, 0, 3917, 3918, 0, 0, 0, 0, 3921, - 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, - 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, - 3942, 0, 3944, 3947, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3956, 3957, - 3958, 3959, 3960, 3962, 3963, 3965, 3967, 3968, 3970, 0, - 0, 0, 3974, 0, 0, 0, 3976, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4003, 0, 0, 2065, 2066, 2067, 2068, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2081, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2120, 2121, 0, 0, 0, - 0, 2144, 0, 0, 2148, 2149, 1823, 0, 0, 2154, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2166, 2167, 2168, 2169, 2170, 2171, - 2172, 2173, 2174, 2175, 0, 2177, 0, 0, 0, 2199, - 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2208, 0, 2213, - 0, 2215, 2216, 2217, 0, 2219, 2220, 2221, 0, 2223, - 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, - 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, - 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, - 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, - 2264, 2265, 2266, 2267, 2268, 2272, 2273, 2274, 2275, 2276, - 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, - 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 0, 0, - 0, 0, 0, 2300, 0, 2302, 0, 2309, 2310, 2311, - 2312, 2313, 2314, 0, 0, 0, 0, 0, 4028, 0, - 0, 0, 0, 0, 0, 0, 2325, 2326, 2327, 2328, - 2329, 2330, 2331, 2332, 0, 2334, 2335, 2336, 2337, 2338, - 0, 0, 4043, 0, 0, 0, 0, 0, 4046, 0, - 4047, 0, 0, 86, 44, 45, 88, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 190, 0, 92, 4062, 0, 1063, 48, 76, 77, 0, - 74, 78, 0, 0, 1807, 0, 0, 0, 0, 0, - 0, 0, 75, 129, 0, 151, 0, 0, 0, 4088, - 4089, 0, 2379, 2380, 0, 0, 0, 0, 0, 172, - 0, 0, 0, 4096, 4098, 4100, 0, 0, 0, 0, - 0, 62, 0, 0, 0, 0, 0, 0, 2418, 0, - 0, 4106, 0, 95, 0, 0, 0, 0, 0, 0, - 162, 0, 0, 4128, 0, 0, 150, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 169, 0, 0, 170, 0, - 195, 0, 195, 0, 0, 0, 0, 0, 0, 0, - 0, 4147, 83, 0, 0, 0, 0, 0, 0, 2460, - 138, 139, 161, 160, 189, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 728, - 0, 728, 728, 0, 0, 4170, 4172, 4174, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 728, 195, 0, 0, 0, 1795, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4195, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1513, 0, 0, 0, 0, 0, 4207, 4208, 0, 0, - 0, 0, 0, 0, 0, 0, 51, 54, 57, 56, - 59, 0, 73, 0, 0, 82, 79, 0, 0, 0, - 0, 0, 0, 0, 0, 155, 136, 158, 143, 135, - 0, 156, 157, 0, 0, 0, 0, 0, 173, 61, - 91, 90, 0, 0, 71, 72, 58, 179, 144, 0, - 1808, 0, 80, 81, 0, 0, 0, 0, 0, 0, - 0, 0, 147, 145, 140, 141, 142, 146, 0, 0, - 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, - 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 63, 64, 0, 65, 66, - 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1821, 1824, 1825, 1826, 1827, 1828, 1829, - 0, 1830, 1831, 1833, 1834, 1832, 1835, 1836, 1809, 1810, - 1811, 1812, 1793, 1794, 1822, 0, 1796, 0, 1797, 1798, - 1799, 1800, 1801, 1802, 1803, 1804, 1805, 0, 0, 1806, - 1813, 1814, 1815, 1816, 0, 1817, 1818, 1819, 1820, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1513, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2632, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2638, 2639, 2640, 2641, 0, 0, 0, 89, - 0, 195, 0, 0, 0, 728, 728, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, - 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1527, 0, 0, - 0, 0, 0, 0, 0, 728, 0, 0, 195, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 728, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 0, 728, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 728, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 728, 0, 728, 0, 0, 94, - 0, 0, 0, 0, 728, 1823, 0, 1513, 728, 0, - 0, 728, 728, 728, 728, 0, 728, 152, 728, 728, - 153, 728, 728, 728, 728, 728, 728, 0, 0, 0, - 0, 0, 0, 0, 1513, 728, 728, 1513, 728, 1513, - 195, 728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 177, 0, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 1016, - 0, 0, 0, 728, 1017, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 2113, 0, 728, 0, 0, 728, - 0, 195, 195, 0, 0, 0, 0, 0, 0, 185, - 0, 1756, 0, 0, 0, 0, 70, 0, 195, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 728, 0, 0, 0, 0, 0, 0, - 0, 0, 166, 171, 168, 174, 175, 176, 178, 180, - 181, 182, 183, 0, 0, 0, 0, 0, 184, 186, - 187, 188, 974, 975, 976, 977, 978, 979, 980, 981, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1773, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1880, 0, 0, 0, + 0, 0, 195, 0, 195, 0, 0, 0, 129, 0, + 151, 0, 166, 171, 168, 174, 175, 176, 178, 180, + 181, 182, 183, 0, 172, 0, 0, 0, 184, 186, + 187, 188, 1023, 0, 0, 2331, 0, 0, 1024, 0, + 0, 735, 0, 735, 735, 0, 0, 0, 2136, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, + 0, 0, 0, 0, 150, 735, 195, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 169, 0, 0, 170, 0, 0, + 0, 0, 0, 0, 1527, 0, 0, 2081, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1884, + 1885, 161, 160, 189, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 981, 982, 983, + 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 0, + 0, 0, 0, 0, 0, 0, 0, 3039, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3065, 3066, 3067, 0, 0, 3069, + 0, 0, 3071, 0, 0, 155, 1886, 158, 0, 1883, + 0, 156, 157, 0, 0, 0, 0, 0, 173, 0, + 0, 0, 3090, 3091, 3092, 0, 0, 179, 0, 0, + 0, 3097, 0, 0, 0, 0, 3099, 0, 0, 3101, + 3102, 3103, 0, 0, 0, 3104, 3105, 0, 0, 3106, + 0, 3107, 0, 0, 0, 0, 0, 0, 3108, 0, + 3109, 0, 0, 0, 3110, 0, 3111, 0, 0, 3112, + 0, 3113, 0, 3114, 0, 3115, 0, 3116, 0, 3117, + 0, 3118, 0, 3119, 0, 3120, 0, 3121, 0, 3122, + 0, 3123, 0, 3124, 0, 3125, 0, 3126, 0, 3127, + 0, 3128, 0, 3129, 0, 0, 0, 3130, 0, 3131, + 0, 3132, 0, 0, 3133, 0, 3134, 0, 3135, 0, + 2295, 3137, 0, 0, 3139, 0, 0, 3141, 3142, 3143, + 3144, 0, 0, 0, 0, 3145, 2295, 2295, 2295, 2295, + 2295, 0, 0, 0, 0, 195, 0, 0, 0, 735, + 735, 3155, 0, 0, 0, 164, 0, 0, 0, 3168, + 0, 0, 3172, 0, 0, 0, 0, 0, 195, 0, + 0, 3175, 3176, 3177, 3178, 3179, 3180, 0, 0, 0, + 3181, 3182, 0, 3183, 0, 3184, 0, 0, 0, 735, + 0, 0, 195, 0, 0, 0, 0, 2408, 0, 0, + 0, 0, 0, 0, 735, 2412, 0, 2415, 0, 1070, + 2081, 195, 0, 0, 0, 735, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 735, 0, 0, 0, 0, + 3217, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, + 735, 159, 0, 0, 0, 3247, 0, 0, 735, 0, + 0, 1527, 735, 0, 0, 735, 735, 735, 735, 0, + 735, 0, 735, 735, 0, 735, 735, 735, 735, 735, + 735, 0, 0, 0, 0, 0, 0, 0, 1527, 735, + 735, 1527, 735, 1527, 195, 735, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 195, 3309, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 735, 0, 195, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 735, 0, 0, 735, 0, 195, 195, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 152, 0, 195, 153, 0, 0, 0, 0, 0, 195, + 0, 0, 0, 0, 0, 0, 0, 0, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 735, 0, 0, + 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 2081, 3402, 0, 0, 1023, 0, 0, 2574, 0, 0, + 1024, 0, 0, 0, 0, 0, 0, 0, 2594, 2595, + 2136, 0, 2599, 0, 0, 0, 0, 0, 0, 3417, + 0, 0, 185, 0, 2604, 0, 0, 0, 0, 0, + 0, 2607, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2610, 0, 0, + 0, 0, 0, 0, 0, 166, 171, 168, 174, 175, + 176, 178, 180, 181, 182, 183, 0, 0, 0, 0, + 0, 184, 186, 187, 188, 0, 0, 0, 0, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, - 1012, 1013, 1014, 1015, 0, 0, 0, 0, 0, 0, + 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 0, 0, 0, 0, 0, 0, 735, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1527, 0, 0, 0, 3615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1527, 0, 957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 728, 728, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 728, 0, 0, 0, 0, 0, 3013, - 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3039, 3040, 3041, 0, - 0, 3043, 0, 0, 3045, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 728, 0, 3064, 3065, 3066, 0, 0, 0, - 0, 0, 1513, 3071, 0, 0, 0, 0, 3073, 0, - 0, 3075, 3076, 3077, 0, 0, 0, 3078, 3079, 0, - 1513, 3080, 0, 3081, 0, 0, 0, 0, 0, 0, - 3082, 0, 3083, 0, 0, 0, 3084, 0, 3085, 0, - 0, 3086, 0, 3087, 0, 3088, 0, 3089, 0, 3090, - 0, 3091, 0, 3092, 0, 3093, 0, 3094, 0, 3095, - 0, 3096, 0, 3097, 0, 3098, 0, 3099, 0, 3100, - 0, 3101, 0, 3102, 0, 3103, 0, 0, 0, 3104, - 0, 3105, 0, 3106, 0, 0, 3107, 0, 3108, 0, - 3109, 0, 2272, 3111, 0, 0, 3113, 0, 0, 3115, - 3116, 3117, 3118, 0, 0, 0, 0, 3119, 2272, 2272, - 2272, 2272, 2272, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3129, 0, 0, 0, 0, 0, 0, - 0, 3142, 0, 0, 3146, 0, 0, 0, 0, 0, - 0, 0, 0, 3149, 3150, 3151, 3152, 3153, 3154, 0, - 0, 0, 3155, 3156, 0, 3157, 2319, 3158, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1063, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 3191, 0, 0, 0, 728, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 190, 0, 3221, 0, 0, - 0, 0, 195, 0, 0, 728, 2950, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 129, 195, - 151, 0, 0, 728, 0, 0, 2319, 195, 0, 195, - 0, 195, 195, 0, 172, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 728, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3284, 0, - 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, - 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 169, 0, 0, 170, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 728, 0, 0, 0, 0, 0, 0, - 728, 728, 728, 0, 0, 1865, 1866, 161, 160, 189, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 728, 0, 0, 0, 0, 0, 728, 728, 0, 0, - 728, 0, 728, 0, 0, 0, 0, 0, 728, 950, - 0, 0, 0, 0, 3377, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3392, 728, 0, 0, 0, 0, 728, 0, - 0, 0, 728, 728, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 707, 0, 0, 0, 0, 0, 727, 190, 0, - 155, 1867, 158, 0, 1864, 0, 156, 157, 0, 1861, - 195, 0, 0, 173, 0, 0, 0, 195, 0, 0, - 0, 129, 179, 151, 0, 0, 0, 195, 195, 0, - 0, 195, 0, 195, 0, 0, 0, 172, 0, 0, - 0, 0, 0, 195, 0, 0, 0, 0, 0, 727, - 195, 727, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, - 0, 0, 0, 0, 150, 0, 195, 0, 0, 0, - 0, 0, 0, 0, 0, 728, 0, 0, 0, 0, - 0, 0, 0, 169, 0, 0, 170, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1865, 1866, - 161, 160, 189, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1513, - 0, 2319, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3614, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 155, 1867, 158, 0, 1864, 0, 156, - 157, 0, 0, 0, 0, 0, 173, 0, 0, 0, - 0, 0, 0, 159, 0, 179, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3634, 0, 3635, 0, 3636, 0, 3637, 0, - 0, 0, 0, 0, 0, 0, 3640, 3641, 0, 0, - 0, 0, 0, 0, 0, 0, 3646, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3647, 0, 3648, 0, 3649, 0, 3650, 0, 3651, 0, - 3652, 0, 3653, 0, 3654, 0, 3655, 0, 3656, 0, - 3657, 0, 3658, 0, 3659, 0, 3660, 0, 3661, 0, - 3662, 0, 0, 3663, 0, 0, 0, 3664, 0, 3665, - 0, 0, 0, 0, 0, 3667, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 153, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3684, 0, 0, - 164, 0, 0, 0, 0, 0, 3689, 0, 3690, 3691, - 0, 3692, 0, 3693, 195, 0, 165, 0, 3694, 0, - 0, 0, 195, 177, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 728, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3723, 0, 728, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3732, 0, - 0, 3734, 0, 0, 185, 0, 0, 0, 0, 0, - 0, 195, 0, 3738, 0, 0, 195, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3874, - 0, 0, 0, 0, 0, 0, 159, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 166, 171, 168, - 174, 175, 176, 178, 180, 181, 182, 183, 0, 0, - 0, 0, 0, 184, 186, 187, 188, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 728, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 728, 0, 0, 0, 0, 0, 0, 728, 0, - 0, 0, 728, 728, 0, 0, 0, 728, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1513, 728, 152, 0, 0, 153, 0, - 0, 0, 0, 0, 0, 0, 195, 195, 195, 195, - 195, 195, 0, 0, 0, 0, 0, 0, 3984, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, - 0, 0, 0, 195, 195, 0, 177, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 195, 727, 1428, 727, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 185, 0, 727, - 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1512, 0, + 0, 0, 0, 0, 0, 712, 0, 0, 0, 0, + 0, 734, 0, 0, 0, 0, 0, 0, 3659, 0, + 3660, 0, 3661, 0, 3662, 0, 0, 0, 0, 0, + 0, 0, 3665, 3666, 0, 0, 0, 0, 0, 0, + 0, 0, 3671, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3672, 0, 3673, 0, + 3674, 0, 3675, 734, 3676, 734, 3677, 0, 3678, 0, + 3679, 0, 3680, 0, 3681, 0, 3682, 2342, 3683, 0, + 3684, 0, 3685, 0, 3686, 0, 3687, 0, 0, 3688, + 0, 0, 0, 3689, 0, 3690, 0, 0, 0, 0, + 0, 3692, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 195, 0, 3709, 0, 0, 735, 0, 0, 0, + 2915, 0, 3714, 0, 3715, 3716, 0, 3717, 0, 3718, + 0, 0, 0, 0, 3719, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 735, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3748, 0, 195, 0, 0, 0, 735, 0, 0, + 2342, 195, 0, 195, 3757, 195, 195, 3759, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3763, + 735, 0, 0, 0, 0, 2964, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3899, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, + 0, 0, 0, 0, 0, 735, 735, 735, 195, 0, + 0, 3012, 3013, 3014, 3015, 3016, 3017, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, + 0, 0, 735, 735, 0, 0, 735, 0, 735, 2081, + 3027, 0, 0, 0, 735, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3035, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, + 0, 0, 0, 0, 735, 0, 0, 0, 735, 735, + 0, 0, 0, 0, 4009, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 195, 195, 0, 0, 195, 0, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 195, 0, 0, 0, 914, 0, 0, 195, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, + 195, 0, 0, 0, 0, 735, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 166, 171, 168, 174, 175, 176, 178, 180, 181, 182, - 183, 0, 728, 0, 0, 0, 184, 186, 187, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1527, + 0, 2342, 0, 0, 1095, 0, 1102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4065, 0, 0, + 4066, 0, 4067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4026, 0, 0, 0, 0, - 0, 907, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 728, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4040, 0, 0, 4041, 0, 4042, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 734, 1438, 734, 734, + 0, 0, 0, 0, 0, 0, 0, 0, 3299, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3337, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3351, 1526, + 0, 0, 0, 0, 4151, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3369, 0, + 0, 3372, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4167, 0, 4168, 0, 4169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 728, 0, 0, 0, 0, 0, 0, 0, 0, 726, - 0, 0, 0, 0, 0, 195, 0, 0, 728, 0, - 0, 1512, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 728, 0, 0, 0, 1513, 0, 0, 728, - 728, 1513, 195, 195, 195, 195, 195, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, - 195, 1088, 195, 1095, 0, 195, 195, 195, 0, 0, + 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 727, 727, 0, 0, 0, 4126, 0, + 0, 0, 0, 0, 0, 0, 0, 4218, 0, 4219, + 0, 195, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 0, 0, 0, 0, 0, 4142, 0, 4143, - 0, 4144, 0, 727, 728, 0, 0, 1513, 0, 0, - 0, 0, 728, 0, 0, 0, 0, 195, 727, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 727, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 0, 0, 195, 0, 0, 0, 0, 0, - 0, 0, 727, 0, 727, 0, 0, 0, 0, 0, - 0, 4193, 727, 4194, 0, 1512, 727, 0, 0, 727, - 727, 727, 727, 0, 727, 0, 727, 727, 0, 727, - 727, 727, 727, 727, 727, 0, 0, 0, 0, 0, - 0, 0, 1512, 727, 727, 1512, 727, 1512, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 727, 0, 0, 727, 0, 0, + 0, 0, 0, 0, 0, 735, 3532, 0, 0, 0, + 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 735, 0, 0, 0, 0, 0, 0, 735, + 0, 0, 0, 735, 735, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1527, 735, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 195, 195, 195, + 195, 195, 195, 0, 734, 734, 0, 0, 0, 0, + 0, 3593, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 195, 195, 0, 0, 0, + 0, 3608, 0, 3609, 3610, 3611, 0, 0, 0, 0, + 0, 0, 0, 0, 734, 0, 0, 0, 0, 0, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, + 734, 0, 0, 0, 0, 0, 735, 0, 0, 0, + 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 734, 0, 734, 0, 0, 0, 0, + 0, 0, 0, 734, 0, 0, 1526, 734, 0, 0, + 734, 734, 734, 734, 0, 734, 735, 734, 734, 0, + 734, 734, 734, 734, 734, 734, 0, 0, 0, 0, + 0, 0, 0, 1526, 734, 734, 1526, 734, 1526, 0, + 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1283, 0, 1283, + 1283, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, + 0, 1452, 0, 0, 0, 734, 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 735, 734, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, + 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, + 1527, 0, 0, 735, 735, 1527, 195, 195, 195, 195, + 195, 0, 0, 0, 0, 0, 0, 0, 195, 0, + 0, 0, 0, 0, 195, 0, 195, 0, 0, 195, + 195, 195, 915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 735, 193, 0, + 1527, 677, 734, 734, 0, 735, 0, 0, 0, 0, + 195, 0, 0, 0, 0, 0, 0, 734, 0, 0, + 0, 677, 0, 0, 195, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1051, 0, 0, + 0, 0, 0, 0, 195, 0, 0, 195, 0, 0, + 0, 0, 0, 0, 1071, 1071, 0, 0, 0, 0, + 0, 0, 0, 677, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1725, 1726, 0, 734, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1526, 0, + 0, 0, 0, 0, 0, 0, 0, 2145, 0, 0, + 0, 0, 0, 0, 0, 0, 1526, 0, 0, 0, + 0, 0, 0, 0, 0, 1779, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 195, 0, 0, 195, 195, 195, - 0, 0, 0, 0, 0, 0, 0, 728, 728, 0, + 1797, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1856, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1095, 735, 1892, 0, 0, 0, + 0, 0, 0, 0, 1901, 0, 0, 0, 1903, 0, + 0, 1906, 1907, 1909, 1909, 0, 1909, 0, 1909, 1909, + 0, 1918, 1909, 1909, 1909, 1909, 1909, 0, 0, 0, + 0, 0, 195, 0, 0, 1938, 1939, 0, 1095, 0, + 0, 1944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 727, 727, + 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1986, 0, 0, 4049, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2008, 0, 195, 2012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 0, 0, 0, 0, 728, 728, 728, 728, - 0, 0, 0, 908, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 734, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1283, 0, 0, 0, 195, 0, 195, + 195, 195, 0, 0, 734, 0, 0, 0, 0, 735, + 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 734, 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 735, 735, + 735, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 193, - 1512, 0, 672, 0, 0, 0, 0, 0, 0, 2122, - 0, 0, 0, 0, 0, 0, 0, 0, 1512, 0, - 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1064, 1064, 0, 0, 0, - 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1276, - 0, 1276, 1276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1440, 0, 728, 0, 728, 0, 195, 0, 0, + 0, 0, 0, 734, 0, 0, 0, 0, 0, 0, + 734, 734, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1513, 0, 0, 0, - 195, 0, 0, 728, 0, 728, 0, 0, 0, 0, + 0, 734, 0, 0, 0, 0, 0, 734, 734, 0, + 0, 734, 0, 734, 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, + 0, 0, 0, 1283, 1283, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2069, 0, + 0, 0, 0, 0, 734, 0, 0, 0, 0, 734, + 0, 0, 0, 734, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 735, 0, 735, 0, 195, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2131, + 0, 0, 0, 0, 0, 0, 0, 0, 1527, 0, + 0, 0, 195, 0, 0, 735, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 728, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 727, 0, 195, 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 0, 0, 727, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 677, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, + 734, 0, 0, 0, 0, 735, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, + 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 728, 0, 0, - 0, 0, 0, 0, 728, 0, 728, 0, 0, 0, + 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1526, 0, 734, 0, 1528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 0, 0, 0, 728, 0, 0, 727, 727, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 727, 0, - 0, 0, 0, 0, 727, 727, 0, 0, 727, 0, - 727, 0, 0, 0, 0, 0, 727, 0, 0, 0, + 0, 0, 0, 1283, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, + 0, 0, 0, 0, 0, 0, 735, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1712, 1713, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 0, 0, 0, 0, 727, 0, 0, 0, - 727, 727, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1762, 0, 0, 0, 0, + 0, 0, 2379, 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1780, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1838, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1847, 0, 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 0, 0, 1088, 0, 1873, 0, 0, 0, - 0, 0, 0, 0, 1882, 0, 0, 0, 1884, 728, - 195, 1887, 1888, 1890, 1890, 0, 1890, 0, 1890, 1890, - 0, 1899, 1890, 1890, 1890, 1890, 1890, 0, 0, 0, - 0, 0, 0, 727, 0, 1919, 1920, 0, 1088, 0, - 0, 1925, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1779, 0, 0, 1283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1967, 0, 728, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 728, 1988, 0, 0, 1992, - 0, 0, 0, 0, 0, 1513, 728, 0, 728, 0, - 0, 0, 0, 0, 0, 0, 0, 1512, 0, 727, - 0, 0, 672, 0, 672, 0, 0, 0, 0, 0, - 0, 0, 0, 728, 2319, 0, 0, 0, 0, 0, - 0, 0, 0, 1276, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 195, 728, 0, 0, 0, 0, - 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1514, 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 728, - 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 728, 0, - 728, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1102, 0, 0, 0, 0, 0, + 0, 2505, 2506, 2507, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1095, 195, 0, 0, 0, 0, 1102, 1901, + 0, 0, 1901, 0, 1901, 0, 0, 0, 734, 0, + 2538, 735, 195, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 734, 0, 0, 0, 0, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1095, 0, 0, 0, 0, + 2131, 0, 1051, 0, 2131, 2131, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2928, 0, 0, + 0, 0, 0, 0, 0, 0, 677, 735, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, + 0, 0, 0, 0, 0, 677, 0, 1527, 735, 0, + 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 734, 0, 0, 0, 0, 735, 2342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1276, 1276, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2046, 0, 0, 0, 0, 95, 0, - 0, 1016, 0, 0, 0, 956, 1017, 969, 970, 971, - 957, 0, 0, 958, 959, 0, 960, 0, 0, 0, + 0, 0, 0, 0, 0, 1528, 0, 734, 0, 0, + 0, 0, 0, 0, 734, 0, 0, 0, 734, 734, + 0, 0, 0, 734, 0, 0, 195, 735, 0, 0, + 0, 2615, 1528, 0, 0, 1528, 0, 1528, 677, 1526, + 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1960, 0, + 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, + 0, 0, 0, 677, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2014, + 677, 735, 0, 0, 0, 0, 195, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 677, 1283, 0, 0, + 735, 0, 735, 677, 0, 0, 0, 0, 0, 0, + 0, 0, 2040, 2041, 677, 677, 677, 677, 677, 677, + 677, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 965, 0, 972, 973, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, - 0, 0, 2108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3320, 3321, 0, 1514, 0, 0, 0, 0, - 2901, 0, 0, 0, 974, 975, 976, 977, 978, 979, - 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 1015, 0, 0, 0, 0, - 0, 0, 727, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1044, 0, 0, 727, - 0, 0, 0, 0, 0, 0, 727, 3322, 0, 0, - 727, 727, 0, 0, 0, 727, 0, 0, 0, 0, - 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1512, 727, 0, 0, 0, 0, 0, 0, 672, - 0, 0, 0, 0, 0, 0, 1276, 0, 0, 0, + 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3323, 3324, 0, 0, 1514, - 0, 0, 0, 0, 0, 0, 2356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1514, 0, 0, 1514, - 727, 1514, 672, 0, 0, 2369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1941, 1762, 0, 0, 1276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 672, 0, 0, - 0, 0, 0, 0, 0, 0, 1088, 0, 0, 921, - 727, 0, 0, 1994, 672, 925, 0, 0, 0, 922, - 923, 0, 0, 0, 924, 926, 0, 0, 0, 0, - 672, 0, 0, 0, 0, 0, 0, 672, 0, 0, - 0, 0, 0, 0, 0, 0, 2020, 2021, 672, 672, - 672, 672, 672, 672, 672, 0, 0, 0, 0, 0, - 0, 0, 0, 1095, 0, 0, 0, 0, 0, 0, - 2482, 2483, 2484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1088, 0, 0, 0, 0, 0, 1095, 1882, 0, 0, - 1882, 0, 1882, 0, 0, 0, 0, 0, 2514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 727, 0, 0, - 0, 0, 0, 1088, 0, 0, 0, 0, 2108, 0, - 0, 0, 2108, 2108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 727, 0, 0, 0, 1512, 0, 0, 727, 727, 1512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 734, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 677, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 734, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2863, + 0, 0, 0, 0, 0, 0, 0, 734, 0, 0, + 0, 0, 0, 2878, 0, 0, 0, 0, 0, 0, + 0, 734, 0, 0, 0, 1526, 0, 0, 734, 734, + 1526, 0, 0, 0, 0, 0, 0, 1528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2588, 0, 0, 0, 0, - 3269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 727, 0, 0, 1512, 0, 0, 0, 0, - 727, 0, 0, 0, 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1514, 0, 0, 0, 0, 0, 0, 0, + 0, 3295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1276, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3351, 0, 0, 0, 0, 0, 0, 0, + 0, 2960, 734, 0, 0, 1526, 0, 0, 0, 0, + 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2392, 0, + 0, 0, 0, 0, 0, 2984, 0, 0, 0, 1901, + 1901, 0, 0, 0, 2989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3000, 3376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1071, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2131, 0, 0, 0, 0, 0, 0, 0, + 1051, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 677, 0, 0, + 734, 0, 0, 0, 2014, 677, 0, 677, 0, 677, + 2431, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1994, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1941, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1064, + 0, 0, 2508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1044, 0, 0, 0, 0, 0, + 0, 3583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 672, 0, 0, 0, 0, 0, 0, 1994, 672, - 0, 672, 0, 672, 2408, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1283, + 0, 0, 0, 0, 734, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3558, 0, 2836, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1909, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3202, 0, + 0, 0, 0, 734, 734, 734, 734, 0, 0, 0, + 677, 0, 1283, 0, 0, 0, 0, 677, 0, 3229, + 1909, 0, 0, 0, 0, 0, 0, 0, 677, 677, + 0, 0, 677, 0, 2601, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 677, 0, 0, 0, 0, 0, + 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 727, 727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 677, 0, 0, + 0, 0, 0, 0, 2612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1095, 0, 0, 0, 0, 0, 0, + 0, 2392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 727, 727, 727, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2933, 0, 0, 0, 0, 0, + 0, 0, 0, 1528, 0, 2014, 0, 0, 0, 0, + 734, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1526, 0, 0, 0, 0, 0, 0, + 734, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2369, 0, 0, 0, 0, 0, 0, 2958, 0, - 0, 0, 1882, 1882, 0, 0, 0, 2963, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2974, 0, 0, 0, 0, 0, - 0, 0, 672, 0, 0, 0, 0, 0, 0, 672, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 672, - 672, 0, 0, 672, 0, 2576, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 672, 0, 0, 0, 0, - 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 2108, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1512, 0, 0, 0, 0, 0, - 0, 727, 0, 727, 0, 0, 0, 0, 0, 0, + 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 734, 0, 0, 0, + 0, 1856, 0, 0, 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1514, 0, 1994, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3131, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1276, + 0, 0, 0, 0, 734, 0, 0, 0, 0, 0, + 0, 734, 0, 734, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 677, 0, + 0, 0, 0, 0, 0, 0, 1960, 0, 0, 0, + 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, - 0, 0, 727, 0, 727, 0, 0, 0, 0, 0, - 1890, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3176, 0, - 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, - 0, 0, 1276, 0, 0, 0, 0, 0, 0, 3203, - 1890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2392, 2392, 0, 0, 0, + 0, 0, 0, 0, 0, 677, 0, 0, 0, 0, + 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 672, 0, 0, 0, - 0, 0, 0, 0, 1941, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3647, 3648, 3649, 3650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1088, 0, 0, 0, 0, 0, - 0, 0, 2369, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 672, 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 734, 0, 1528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 672, 0, 0, 0, 0, 0, 0, 2943, + 0, 677, 677, 677, 677, 677, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 677, + 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 734, 0, 677, 0, 0, 0, 0, 0, + 0, 3725, 734, 3725, 0, 0, 0, 0, 0, 0, + 0, 0, 1526, 734, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 727, 0, 1514, 0, 0, 0, 0, - 0, 0, 0, 1512, 727, 0, 727, 0, 672, 672, - 672, 672, 672, 672, 0, 0, 0, 0, 0, 0, - 0, 0, 1838, 0, 0, 0, 0, 0, 0, 0, - 0, 727, 727, 0, 0, 672, 672, 0, 0, 0, + 0, 3753, 0, 3755, 0, 0, 0, 0, 0, 0, + 734, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, + 0, 2392, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1283, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 727, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 727, 0, 0, + 0, 0, 0, 0, 0, 734, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 727, 0, 727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2369, 2369, 0, + 0, 0, 0, 0, 0, 3725, 0, 0, 0, 0, + 0, 0, 3725, 0, 3725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2392, 0, 0, 0, 0, 0, 0, + 0, 1071, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1528, 0, 0, 0, 0, 1528, + 677, 677, 677, 677, 677, 0, 0, 0, 0, 0, + 0, 0, 3245, 0, 0, 0, 0, 0, 1960, 0, + 677, 0, 0, 677, 3253, 2014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3622, 3623, 3624, 3625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1528, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 677, 0, 0, 0, 0, 0, + 0, 0, 0, 2392, 0, 0, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 677, 0, + 0, 677, 0, 0, 0, 0, 0, 2392, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3785, + 3787, 3786, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3788, + 3789, 805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1064, 0, 672, 0, 0, + 0, 0, 0, 4069, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4077, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2392, 0, 4085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1514, 0, - 0, 0, 0, 1514, 672, 672, 672, 672, 672, 0, - 0, 0, 0, 0, 0, 0, 3219, 0, 0, 0, - 0, 0, 1941, 0, 672, 0, 0, 672, 3227, 1994, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1283, 1283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3700, 0, 3700, 0, 0, 0, 0, - 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1514, - 0, 0, 0, 3728, 0, 3730, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4135, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 672, 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2369, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1276, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4077, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 677, 0, 0, 0, 0, 2392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1856, 0, 4135, 0, + 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3793, 0, 0, 0, 0, 0, 0, 0, + 0, 677, 0, 677, 677, 677, 0, 3801, 3802, 0, + 0, 3877, 3876, 3875, 0, 0, 3873, 3874, 3872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3700, 0, 0, - 0, 0, 0, 0, 3700, 0, 3700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3878, 928, 0, 781, 782, 3879, 3880, 932, + 3881, 784, 785, 929, 930, 0, 779, 783, 931, 933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2369, 0, 0, 0, 0, - 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3782, 3783, 3784, 3790, 3791, + 3792, 3803, 3850, 3851, 3859, 3861, 884, 3860, 3862, 3863, + 3864, 3867, 3868, 3869, 3870, 3865, 3866, 3871, 3765, 3769, + 3766, 3767, 3768, 3780, 3770, 3771, 3772, 3773, 3774, 3775, + 3776, 3777, 3778, 3779, 3781, 3882, 3883, 3884, 3885, 3886, + 3887, 3796, 3800, 3799, 3797, 3798, 3794, 3795, 3822, 3821, + 3823, 3824, 3825, 3826, 3827, 3828, 3830, 3829, 3831, 3832, + 3833, 3834, 3835, 3836, 3804, 3805, 3808, 3809, 3807, 3806, + 3810, 3819, 3820, 3811, 3812, 3813, 3814, 3815, 3816, 3818, + 3817, 3837, 3838, 3839, 3840, 3841, 3843, 3842, 3846, 3847, + 3845, 3844, 3849, 3848, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1960, 0, 0, 0, 934, 0, 935, + 0, 0, 939, 0, 0, 0, 941, 940, 0, 942, + 904, 903, 1528, 0, 936, 937, 1960, 938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 672, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3760, 3762, - 3761, 3827, 3828, 3829, 3830, 3831, 3832, 3833, 3763, 3764, - 798, 0, 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 672, 0, 0, 672, - 672, 672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2369, + 0, 0, 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, + 0, 0, 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4044, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4052, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2369, 0, 4060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1276, 1276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3776, 3777, 4110, 0, 3852, 3851, 3850, - 0, 0, 3848, 3849, 3847, 0, 0, 0, 0, 1941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1514, 0, - 0, 0, 1941, 0, 0, 4052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3853, 921, 2369, - 774, 775, 3854, 3855, 925, 3856, 777, 778, 922, 923, - 0, 772, 776, 924, 926, 0, 0, 0, 1838, 0, - 4110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1941, 0, - 3757, 3758, 3759, 3765, 3766, 3767, 3778, 3825, 3826, 3834, - 3836, 877, 3835, 3837, 3838, 3839, 3842, 3843, 3844, 3845, - 3840, 3841, 3846, 3740, 3744, 3741, 3742, 3743, 3755, 3745, - 3746, 3747, 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3756, - 3857, 3858, 3859, 3860, 3861, 3862, 3771, 3775, 3774, 3772, - 3773, 3769, 3770, 3797, 3796, 3798, 3799, 3800, 3801, 3802, - 3803, 3805, 3804, 3806, 3807, 3808, 3809, 3810, 3811, 3779, - 3780, 3783, 3784, 3782, 3781, 3785, 3794, 3795, 3786, 3787, - 3788, 3789, 3790, 3791, 3793, 3792, 3812, 3813, 3814, 3815, - 3816, 3818, 3817, 3821, 3822, 3820, 3819, 3824, 3823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 927, 0, 928, 0, 0, 932, 0, 0, - 0, 934, 933, 0, 935, 897, 896, 0, 0, 929, - 930, 0, 931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3863, 3864, 3865, - 3866, 3867, 3868, 3869, 3870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2848,2900 +2887,1529 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4082, 0, 0, 0, + 0, 1528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1941, 0, 0, 0, - 396, 0, 0, 0, 0, 0, 1411, 1397, 527, 0, - 1339, 1414, 1308, 1327, 1424, 1330, 1333, 1376, 1286, 1354, - 416, 1324, 1312, 1281, 1319, 1282, 1310, 1341, 270, 1307, - 1399, 1358, 1413, 366, 267, 1288, 1279, 204, 505, 1313, - 430, 1329, 203, 1378, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 1420, 370, - 1364, 0, 497, 401, 0, 0, 1994, 1343, 1403, 1352, - 1390, 1338, 1377, 1296, 1363, 1415, 1325, 1373, 1416, 323, - 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, - 4084, 952, 0, 0, 0, 0, 4085, 0, 0, 0, - 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 1321, 1370, 606, 1410, 1322, 1372, 265, 321, 272, 264, - 579, 1421, 1402, 1285, 1351, 1409, 1346, 0, 0, 229, - 1412, 1345, 0, 1375, 0, 1427, 1280, 1366, 0, 1283, - 1287, 1423, 1407, 1316, 275, 0, 0, 0, 0, 0, - 0, 0, 1342, 1353, 1387, 1391, 1336, 0, 0, 0, - 0, 0, 0, 0, 0, 1314, 0, 1362, 0, 0, - 0, 1292, 1284, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, - 1295, 0, 1315, 1388, 0, 1278, 297, 1289, 402, 257, - 0, 453, 1395, 1406, 1337, 624, 1408, 1335, 1334, 1382, - 1293, 1401, 1328, 365, 1291, 330, 197, 225, 0, 1326, - 412, 461, 473, 1400, 1311, 1320, 253, 1318, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 1361, 1380, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 1290, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 1306, 279, - 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 1396, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 1385, 1426, 425, 472, 240, 603, 496, 199, 1300, 1305, - 1298, 0, 254, 255, 1367, 574, 1301, 1299, 1356, 1357, - 1302, 1417, 1418, 1419, 1404, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 1389, 1294, 0, 1303, 1304, 398, 1398, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, - 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 1360, - 196, 221, 368, 1422, 454, 288, 645, 614, 484, 609, - 206, 223, 1297, 262, 1309, 1317, 0, 1323, 1331, 1332, - 1344, 1347, 1348, 1349, 1350, 1368, 1369, 1371, 1379, 1381, - 1384, 1386, 1393, 1405, 1425, 198, 200, 209, 222, 232, - 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, - 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, - 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, - 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, - 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 1359, 1365, 381, 281, 305, 320, 1374, - 613, 502, 227, 466, 290, 251, 1392, 1394, 211, 246, - 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 1355, 1383, 376, 575, 576, 316, 396, 0, - 0, 0, 0, 0, 1411, 1397, 527, 0, 1339, 1414, - 1308, 1327, 1424, 1330, 1333, 1376, 1286, 1354, 416, 1324, - 1312, 1281, 1319, 1282, 1310, 1341, 270, 1307, 1399, 1358, - 1413, 366, 267, 1288, 1279, 204, 505, 1313, 430, 1329, - 203, 1378, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 1420, 370, 1364, 0, - 497, 401, 0, 0, 0, 1343, 1403, 1352, 1390, 1338, - 1377, 1296, 1363, 1415, 1325, 1373, 1416, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 0, 194, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1960, 0, 0, 396, 0, 0, 0, 0, 0, 0, + 1421, 1405, 528, 0, 1347, 1424, 1315, 1334, 1434, 1337, + 1340, 1384, 1293, 1362, 416, 1331, 1319, 1288, 1326, 1289, + 1317, 1349, 270, 1314, 1407, 1366, 1423, 366, 267, 1295, + 1286, 204, 505, 1320, 430, 1336, 203, 1386, 487, 252, + 377, 374, 583, 282, 273, 269, 250, 317, 385, 428, + 518, 422, 1430, 370, 1372, 0, 497, 401, 0, 0, + 2014, 1411, 1410, 1341, 1351, 1413, 1360, 1398, 1346, 1385, + 1303, 1371, 1425, 1332, 1381, 1426, 323, 248, 325, 202, + 413, 498, 286, 0, 0, 0, 0, 4109, 507, 959, + 0, 0, 0, 0, 4110, 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 1321, 1370, - 606, 1410, 1322, 1372, 265, 321, 272, 264, 579, 1421, - 1402, 1285, 1351, 1409, 1346, 0, 0, 229, 1412, 1345, - 0, 1375, 0, 1427, 1280, 1366, 0, 1283, 1287, 1423, - 1407, 1316, 275, 0, 0, 0, 0, 0, 0, 0, - 1342, 1353, 1387, 1391, 1336, 0, 0, 0, 0, 0, - 0, 3228, 0, 1314, 0, 1362, 0, 0, 0, 1292, - 1284, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1340, 0, 0, 0, 0, 1295, 0, - 1315, 1388, 0, 1278, 297, 1289, 402, 257, 0, 453, - 1395, 1406, 1337, 624, 1408, 1335, 1334, 1382, 1293, 1401, - 1328, 365, 1291, 330, 197, 225, 0, 1326, 412, 461, - 473, 1400, 1311, 1320, 253, 1318, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 1361, 1380, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, + 340, 342, 344, 350, 357, 363, 336, 345, 1328, 1378, + 609, 1420, 1329, 1380, 265, 321, 272, 264, 580, 1431, + 1412, 1292, 1359, 1419, 1354, 596, 0, 0, 229, 1422, + 1353, 0, 1383, 0, 1437, 1287, 1374, 0, 1290, 1294, + 1433, 1417, 1323, 275, 0, 0, 0, 0, 0, 0, + 0, 1350, 1361, 1395, 1399, 1344, 0, 0, 0, 0, + 0, 0, 0, 0, 1321, 0, 1370, 0, 0, 0, + 1299, 1291, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1348, 0, 0, 0, 0, 1302, + 0, 1322, 1396, 0, 1285, 297, 1296, 402, 257, 0, + 453, 1403, 1416, 1345, 629, 1418, 1343, 1342, 1390, 1300, + 1409, 1335, 365, 1298, 330, 197, 225, 0, 1333, 412, + 461, 473, 1408, 1318, 1327, 253, 1325, 471, 426, 604, + 233, 284, 458, 432, 469, 440, 287, 1369, 1388, 470, + 372, 585, 450, 601, 630, 631, 263, 406, 615, 522, + 623, 648, 226, 260, 420, 506, 607, 494, 397, 581, + 582, 329, 493, 295, 201, 369, 636, 224, 479, 371, + 242, 231, 587, 612, 299, 289, 456, 643, 213, 517, + 598, 239, 483, 0, 0, 651, 247, 504, 610, 599, + 215, 594, 503, 393, 326, 327, 214, 0, 457, 268, + 293, 0, 0, 258, 415, 589, 590, 256, 652, 228, + 622, 220, 1297, 621, 408, 584, 595, 394, 383, 219, + 593, 392, 382, 334, 355, 356, 280, 307, 447, 375, + 448, 306, 308, 404, 403, 405, 207, 608, 626, 0, + 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, + 1313, 279, 283, 291, 294, 303, 304, 313, 367, 419, + 446, 442, 451, 1404, 579, 602, 616, 628, 634, 635, + 637, 638, 639, 640, 641, 644, 642, 407, 311, 495, + 333, 373, 1393, 1436, 425, 472, 240, 606, 496, 199, + 1307, 1312, 1305, 0, 254, 255, 1375, 575, 1308, 1306, + 1364, 1365, 1309, 1427, 1428, 1429, 1414, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 649, 508, 514, 509, 510, + 511, 512, 513, 0, 515, 1397, 1301, 0, 1310, 1311, + 398, 1406, 591, 592, 672, 384, 486, 603, 335, 349, + 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, + 348, 353, 354, 358, 364, 249, 210, 390, 399, 578, + 312, 216, 217, 218, 524, 525, 526, 527, 619, 620, + 624, 205, 462, 463, 464, 465, 292, 614, 309, 468, + 467, 331, 332, 379, 449, 540, 542, 553, 557, 559, + 561, 567, 570, 541, 543, 554, 558, 560, 562, 568, + 571, 530, 532, 534, 536, 549, 548, 545, 573, 574, + 551, 556, 535, 547, 552, 565, 572, 569, 529, 533, + 537, 546, 564, 563, 544, 555, 566, 550, 538, 531, + 539, 1368, 196, 221, 368, 1432, 454, 288, 650, 618, + 484, 613, 206, 223, 1304, 262, 1316, 1324, 0, 1330, + 1338, 1339, 1352, 1355, 1356, 1357, 1358, 1376, 1377, 1379, + 1387, 1389, 1392, 1394, 1401, 1415, 1435, 198, 200, 209, + 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, + 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, + 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, + 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, + 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, + 500, 501, 516, 586, 588, 605, 625, 632, 480, 301, + 302, 444, 445, 314, 315, 646, 647, 300, 600, 633, + 597, 645, 627, 438, 378, 1367, 1373, 381, 281, 305, + 320, 1382, 617, 502, 227, 466, 290, 251, 1400, 1402, + 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, + 434, 296, 271, 244, 459, 241, 485, 519, 520, 521, + 523, 395, 266, 433, 1363, 1391, 376, 576, 577, 316, + 396, 0, 0, 0, 0, 0, 0, 1421, 1405, 528, + 0, 1347, 1424, 1315, 1334, 1434, 1337, 1340, 1384, 1293, + 1362, 416, 1331, 1319, 1288, 1326, 1289, 1317, 1349, 270, + 1314, 1407, 1366, 1423, 366, 267, 1295, 1286, 204, 505, + 1320, 430, 1336, 203, 1386, 487, 252, 377, 374, 583, + 282, 273, 269, 250, 317, 385, 428, 518, 422, 1430, + 370, 1372, 0, 497, 401, 0, 0, 0, 1411, 1410, + 1341, 1351, 1413, 1360, 1398, 1346, 1385, 1303, 1371, 1425, + 1332, 1381, 1426, 323, 248, 325, 202, 413, 498, 286, + 0, 0, 0, 0, 0, 507, 194, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, + 0, 0, 0, 351, 360, 359, 339, 340, 342, 344, + 350, 357, 363, 336, 345, 1328, 1378, 609, 1420, 1329, + 1380, 265, 321, 272, 264, 580, 1431, 1412, 1292, 1359, + 1419, 1354, 596, 0, 0, 229, 1422, 1353, 0, 1383, + 0, 1437, 1287, 1374, 0, 1290, 1294, 1433, 1417, 1323, + 275, 0, 0, 0, 0, 0, 0, 0, 1350, 1361, + 1395, 1399, 1344, 0, 0, 0, 0, 0, 0, 3254, + 0, 1321, 0, 1370, 0, 0, 0, 1299, 1291, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1348, 0, 0, 0, 0, 1302, 0, 1322, 1396, + 0, 1285, 297, 1296, 402, 257, 0, 453, 1403, 1416, + 1345, 629, 1418, 1343, 1342, 1390, 1300, 1409, 1335, 365, + 1298, 330, 197, 225, 0, 1333, 412, 461, 473, 1408, + 1318, 1327, 253, 1325, 471, 426, 604, 233, 284, 458, + 432, 469, 440, 287, 1369, 1388, 470, 372, 585, 450, + 601, 630, 631, 263, 406, 615, 522, 623, 648, 226, + 260, 420, 506, 607, 494, 397, 581, 582, 329, 493, + 295, 201, 369, 636, 224, 479, 371, 242, 231, 587, + 612, 299, 289, 456, 643, 213, 517, 598, 239, 483, + 0, 0, 651, 247, 504, 610, 599, 215, 594, 503, 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 1290, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, + 258, 415, 589, 590, 256, 652, 228, 622, 220, 1297, + 621, 408, 584, 595, 394, 383, 219, 593, 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 1306, 279, 283, 291, - 294, 303, 304, 313, 367, 419, 446, 442, 451, 1396, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 1385, 1426, - 425, 472, 240, 603, 496, 199, 1300, 1305, 1298, 0, - 254, 255, 1367, 574, 1301, 1299, 1356, 1357, 1302, 1417, - 1418, 1419, 1404, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 1389, 1294, 0, 1303, 1304, 398, 1398, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, - 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 1360, 196, 221, - 368, 1422, 454, 288, 645, 614, 484, 609, 206, 223, - 1297, 262, 1309, 1317, 0, 1323, 1331, 1332, 1344, 1347, - 1348, 1349, 1350, 1368, 1369, 1371, 1379, 1381, 1384, 1386, - 1393, 1405, 1425, 198, 200, 209, 222, 232, 236, 243, - 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, - 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, - 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, - 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 1359, 1365, 381, 281, 305, 320, 1374, 613, 502, - 227, 466, 290, 251, 1392, 1394, 211, 246, 230, 259, - 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 1355, 1383, 376, 575, 576, 316, 396, 0, 0, 0, - 0, 0, 1411, 1397, 527, 0, 1339, 1414, 1308, 1327, - 1424, 1330, 1333, 1376, 1286, 1354, 416, 1324, 1312, 1281, - 1319, 1282, 1310, 1341, 270, 1307, 1399, 1358, 1413, 366, - 267, 1288, 1279, 204, 505, 1313, 430, 1329, 203, 1378, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 1420, 370, 1364, 0, 497, 401, - 0, 0, 0, 1343, 1403, 1352, 1390, 1338, 1377, 1296, - 1363, 1415, 1325, 1373, 1416, 323, 248, 325, 202, 413, - 498, 286, 0, 0, 0, 0, 0, 717, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, - 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 1321, 1370, 606, 1410, - 1322, 1372, 265, 321, 272, 264, 579, 1421, 1402, 1285, - 1351, 1409, 1346, 0, 0, 229, 1412, 1345, 0, 1375, - 0, 1427, 1280, 1366, 0, 1283, 1287, 1423, 1407, 1316, - 275, 0, 0, 0, 0, 0, 0, 0, 1342, 1353, - 1387, 1391, 1336, 0, 0, 0, 0, 0, 0, 3189, - 0, 1314, 0, 1362, 0, 0, 0, 1292, 1284, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1340, 0, 0, 0, 0, 1295, 0, 1315, 1388, - 0, 1278, 297, 1289, 402, 257, 0, 453, 1395, 1406, - 1337, 624, 1408, 1335, 1334, 1382, 1293, 1401, 1328, 365, - 1291, 330, 197, 225, 0, 1326, 412, 461, 473, 1400, - 1311, 1320, 253, 1318, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 1361, 1380, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 1290, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, - 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, - 212, 234, 235, 237, 1306, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 1396, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 1385, 1426, 425, 472, - 240, 603, 496, 199, 1300, 1305, 1298, 0, 254, 255, - 1367, 574, 1301, 1299, 1356, 1357, 1302, 1417, 1418, 1419, - 1404, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 1389, - 1294, 0, 1303, 1304, 398, 1398, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, + 404, 403, 405, 207, 608, 626, 0, 208, 0, 499, + 611, 653, 452, 212, 234, 235, 237, 1313, 279, 283, + 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, + 1404, 579, 602, 616, 628, 634, 635, 637, 638, 639, + 640, 641, 644, 642, 407, 311, 495, 333, 373, 1393, + 1436, 425, 472, 240, 606, 496, 199, 1307, 1312, 1305, + 0, 254, 255, 1375, 575, 1308, 1306, 1364, 1365, 1309, + 1427, 1428, 1429, 1414, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 649, 508, 514, 509, 510, 511, 512, 513, + 0, 515, 1397, 1301, 0, 1310, 1311, 398, 1406, 591, + 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, + 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, + 358, 364, 249, 210, 390, 399, 578, 312, 216, 217, + 218, 524, 525, 526, 527, 619, 620, 624, 205, 462, + 463, 464, 465, 292, 614, 309, 468, 467, 331, 332, + 379, 449, 540, 542, 553, 557, 559, 561, 567, 570, + 541, 543, 554, 558, 560, 562, 568, 571, 530, 532, + 534, 536, 549, 548, 545, 573, 574, 551, 556, 535, + 547, 552, 565, 572, 569, 529, 533, 537, 546, 564, + 563, 544, 555, 566, 550, 538, 531, 539, 1368, 196, + 221, 368, 1432, 454, 288, 650, 618, 484, 613, 206, + 223, 1304, 262, 1316, 1324, 0, 1330, 1338, 1339, 1352, + 1355, 1356, 1357, 1358, 1376, 1377, 1379, 1387, 1389, 1392, + 1394, 1401, 1415, 1435, 198, 200, 209, 222, 232, 236, + 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, + 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, + 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, + 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, + 481, 482, 488, 489, 490, 491, 492, 500, 501, 516, + 586, 588, 605, 625, 632, 480, 301, 302, 444, 445, + 314, 315, 646, 647, 300, 600, 633, 597, 645, 627, + 438, 378, 1367, 1373, 381, 281, 305, 320, 1382, 617, + 502, 227, 466, 290, 251, 1400, 1402, 211, 246, 230, + 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, + 244, 459, 241, 485, 519, 520, 521, 523, 395, 266, + 433, 1363, 1391, 376, 576, 577, 316, 396, 0, 0, + 0, 0, 0, 0, 1421, 1405, 528, 0, 1347, 1424, + 1315, 1334, 1434, 1337, 1340, 1384, 1293, 1362, 416, 1331, + 1319, 1288, 1326, 1289, 1317, 1349, 270, 1314, 1407, 1366, + 1423, 366, 267, 1295, 1286, 204, 505, 1320, 430, 1336, + 203, 1386, 487, 252, 377, 374, 583, 282, 273, 269, + 250, 317, 385, 428, 518, 422, 1430, 370, 1372, 0, + 497, 401, 0, 0, 0, 1411, 1410, 1341, 1351, 1413, + 1360, 1398, 1346, 1385, 1303, 1371, 1425, 1332, 1381, 1426, + 323, 248, 325, 202, 413, 498, 286, 0, 0, 0, + 0, 0, 507, 724, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, + 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, + 336, 345, 1328, 1378, 609, 1420, 1329, 1380, 265, 321, + 272, 264, 580, 1431, 1412, 1292, 1359, 1419, 1354, 596, + 0, 0, 229, 1422, 1353, 0, 1383, 0, 1437, 1287, + 1374, 0, 1290, 1294, 1433, 1417, 1323, 275, 0, 0, + 0, 0, 0, 0, 0, 1350, 1361, 1395, 1399, 1344, + 0, 0, 0, 0, 0, 0, 3215, 0, 1321, 0, + 1370, 0, 0, 0, 1299, 1291, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1348, 0, + 0, 0, 0, 1302, 0, 1322, 1396, 0, 1285, 297, + 1296, 402, 257, 0, 453, 1403, 1416, 1345, 629, 1418, + 1343, 1342, 1390, 1300, 1409, 1335, 365, 1298, 330, 197, + 225, 0, 1333, 412, 461, 473, 1408, 1318, 1327, 253, + 1325, 471, 426, 604, 233, 284, 458, 432, 469, 440, + 287, 1369, 1388, 470, 372, 585, 450, 601, 630, 631, + 263, 406, 615, 522, 623, 648, 226, 260, 420, 506, + 607, 494, 397, 581, 582, 329, 493, 295, 201, 369, + 636, 224, 479, 371, 242, 231, 587, 612, 299, 289, + 456, 643, 213, 517, 598, 239, 483, 0, 0, 651, + 247, 504, 610, 599, 215, 594, 503, 393, 326, 327, + 214, 0, 457, 268, 293, 0, 0, 258, 415, 589, + 590, 256, 652, 228, 622, 220, 1297, 621, 408, 584, + 595, 394, 383, 219, 593, 392, 382, 334, 355, 356, + 280, 307, 447, 375, 448, 306, 308, 404, 403, 405, + 207, 608, 626, 0, 208, 0, 499, 611, 653, 452, + 212, 234, 235, 237, 1313, 279, 283, 291, 294, 303, + 304, 313, 367, 419, 446, 442, 451, 1404, 579, 602, + 616, 628, 634, 635, 637, 638, 639, 640, 641, 644, + 642, 407, 311, 495, 333, 373, 1393, 1436, 425, 472, + 240, 606, 496, 199, 1307, 1312, 1305, 0, 254, 255, + 1375, 575, 1308, 1306, 1364, 1365, 1309, 1427, 1428, 1429, + 1414, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 649, + 508, 514, 509, 510, 511, 512, 513, 0, 515, 1397, + 1301, 0, 1310, 1311, 398, 1406, 591, 592, 672, 384, + 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 1360, 196, 221, 368, 1422, - 454, 288, 645, 614, 484, 609, 206, 223, 1297, 262, - 1309, 1317, 0, 1323, 1331, 1332, 1344, 1347, 1348, 1349, - 1350, 1368, 1369, 1371, 1379, 1381, 1384, 1386, 1393, 1405, - 1425, 198, 200, 209, 222, 232, 236, 243, 261, 276, + 210, 390, 399, 578, 312, 216, 217, 218, 524, 525, + 526, 527, 619, 620, 624, 205, 462, 463, 464, 465, + 292, 614, 309, 468, 467, 331, 332, 379, 449, 540, + 542, 553, 557, 559, 561, 567, 570, 541, 543, 554, + 558, 560, 562, 568, 571, 530, 532, 534, 536, 549, + 548, 545, 573, 574, 551, 556, 535, 547, 552, 565, + 572, 569, 529, 533, 537, 546, 564, 563, 544, 555, + 566, 550, 538, 531, 539, 1368, 196, 221, 368, 1432, + 454, 288, 650, 618, 484, 613, 206, 223, 1304, 262, + 1316, 1324, 0, 1330, 1338, 1339, 1352, 1355, 1356, 1357, + 1358, 1376, 1377, 1379, 1387, 1389, 1392, 1394, 1401, 1415, + 1435, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 300, 597, 628, 595, 640, 622, 438, 378, 1359, - 1365, 381, 281, 305, 320, 1374, 613, 502, 227, 466, - 290, 251, 1392, 1394, 211, 246, 230, 259, 274, 277, + 489, 490, 491, 492, 500, 501, 516, 586, 588, 605, + 625, 632, 480, 301, 302, 444, 445, 314, 315, 646, + 647, 300, 600, 633, 597, 645, 627, 438, 378, 1367, + 1373, 381, 281, 305, 320, 1382, 617, 502, 227, 466, + 290, 251, 1400, 1402, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 1355, 1383, - 376, 575, 576, 316, 396, 0, 0, 0, 0, 0, - 1411, 1397, 527, 0, 1339, 1414, 1308, 1327, 1424, 1330, - 1333, 1376, 1286, 1354, 416, 1324, 1312, 1281, 1319, 1282, - 1310, 1341, 270, 1307, 1399, 1358, 1413, 366, 267, 1288, - 1279, 204, 505, 1313, 430, 1329, 203, 1378, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 1420, 370, 1364, 0, 497, 401, 0, 0, - 0, 1343, 1403, 1352, 1390, 1338, 1377, 1296, 1363, 1415, - 1325, 1373, 1416, 323, 248, 325, 202, 413, 498, 286, - 0, 0, 0, 0, 0, 952, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, - 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, - 357, 363, 336, 345, 1321, 1370, 606, 1410, 1322, 1372, - 265, 321, 272, 264, 579, 1421, 1402, 1285, 1351, 1409, - 1346, 0, 0, 229, 1412, 1345, 0, 1375, 0, 1427, - 1280, 1366, 0, 1283, 1287, 1423, 1407, 1316, 275, 0, - 0, 0, 0, 0, 0, 0, 1342, 1353, 1387, 1391, - 1336, 0, 0, 0, 0, 0, 0, 2387, 0, 1314, - 0, 1362, 0, 0, 0, 1292, 1284, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1340, - 0, 0, 0, 0, 1295, 0, 1315, 1388, 0, 1278, - 297, 1289, 402, 257, 0, 453, 1395, 1406, 1337, 624, - 1408, 1335, 1334, 1382, 1293, 1401, 1328, 365, 1291, 330, - 197, 225, 0, 1326, 412, 461, 473, 1400, 1311, 1320, - 253, 1318, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 1361, 1380, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 588, 589, - 256, 647, 228, 618, 220, 1290, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 355, 356, 280, - 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, - 235, 237, 1306, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 1396, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 1385, 1426, 425, 472, 240, 603, - 496, 199, 1300, 1305, 1298, 0, 254, 255, 1367, 574, - 1301, 1299, 1356, 1357, 1302, 1417, 1418, 1419, 1404, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 1389, 1294, 0, - 1303, 1304, 398, 1398, 590, 591, 667, 384, 486, 600, - 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, - 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, - 399, 577, 312, 216, 217, 218, 523, 524, 525, 526, - 615, 616, 620, 205, 462, 463, 464, 465, 292, 610, - 309, 468, 467, 331, 332, 379, 449, 539, 541, 552, - 556, 558, 560, 566, 569, 540, 542, 553, 557, 559, - 561, 567, 570, 529, 531, 533, 535, 548, 547, 544, - 572, 573, 550, 555, 534, 546, 551, 564, 571, 568, - 528, 532, 536, 545, 563, 562, 543, 554, 565, 549, - 537, 530, 538, 1360, 196, 221, 368, 1422, 454, 288, - 645, 614, 484, 609, 206, 223, 1297, 262, 1309, 1317, - 0, 1323, 1331, 1332, 1344, 1347, 1348, 1349, 1350, 1368, - 1369, 1371, 1379, 1381, 1384, 1386, 1393, 1405, 1425, 198, - 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, - 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, - 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, - 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, - 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 301, 302, 444, 445, 314, 315, 641, 642, 300, - 597, 628, 595, 640, 622, 438, 378, 1359, 1365, 381, - 281, 305, 320, 1374, 613, 502, 227, 466, 290, 251, - 1392, 1394, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 1355, 1383, 376, 575, - 576, 316, 396, 0, 0, 0, 0, 0, 1411, 1397, - 527, 0, 1339, 1414, 1308, 1327, 1424, 1330, 1333, 1376, - 1286, 1354, 416, 1324, 1312, 1281, 1319, 1282, 1310, 1341, - 270, 1307, 1399, 1358, 1413, 366, 267, 1288, 1279, 204, - 505, 1313, 430, 1329, 203, 1378, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 1420, 370, 1364, 0, 497, 401, 0, 0, 0, 1343, - 1403, 1352, 1390, 1338, 1377, 1296, 1363, 1415, 1325, 1373, - 1416, 323, 248, 325, 202, 413, 498, 286, 0, 95, - 0, 0, 0, 717, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, - 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, - 336, 345, 1321, 1370, 606, 1410, 1322, 1372, 265, 321, - 272, 264, 579, 1421, 1402, 1285, 1351, 1409, 1346, 0, - 0, 229, 1412, 1345, 0, 1375, 0, 1427, 1280, 1366, - 0, 1283, 1287, 1423, 1407, 1316, 275, 0, 0, 0, - 0, 0, 0, 0, 1342, 1353, 1387, 1391, 1336, 0, - 0, 0, 0, 0, 0, 0, 0, 1314, 0, 1362, - 0, 0, 0, 1292, 1284, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1340, 0, 0, - 0, 0, 1295, 0, 1315, 1388, 0, 1278, 297, 1289, - 402, 257, 0, 453, 1395, 1406, 1337, 624, 1408, 1335, - 1334, 1382, 1293, 1401, 1328, 365, 1291, 330, 197, 225, - 0, 1326, 412, 461, 473, 1400, 1311, 1320, 253, 1318, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 1361, 1380, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 588, 589, 256, 647, - 228, 618, 220, 1290, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 355, 356, 280, 307, 447, - 375, 448, 306, 308, 404, 403, 405, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, - 1306, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 1396, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 1385, 1426, 425, 472, 240, 603, 496, 199, - 1300, 1305, 1298, 0, 254, 255, 1367, 574, 1301, 1299, - 1356, 1357, 1302, 1417, 1418, 1419, 1404, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 1389, 1294, 0, 1303, 1304, - 398, 1398, 590, 591, 667, 384, 486, 600, 335, 349, - 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, - 348, 353, 354, 358, 364, 249, 210, 390, 399, 577, - 312, 216, 217, 218, 523, 524, 525, 526, 615, 616, - 620, 205, 462, 463, 464, 465, 292, 610, 309, 468, - 467, 331, 332, 379, 449, 539, 541, 552, 556, 558, - 560, 566, 569, 540, 542, 553, 557, 559, 561, 567, - 570, 529, 531, 533, 535, 548, 547, 544, 572, 573, - 550, 555, 534, 546, 551, 564, 571, 568, 528, 532, - 536, 545, 563, 562, 543, 554, 565, 549, 537, 530, - 538, 1360, 196, 221, 368, 1422, 454, 288, 645, 614, - 484, 609, 206, 223, 1297, 262, 1309, 1317, 0, 1323, - 1331, 1332, 1344, 1347, 1348, 1349, 1350, 1368, 1369, 1371, - 1379, 1381, 1384, 1386, 1393, 1405, 1425, 198, 200, 209, - 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, - 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, - 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, - 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, - 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 301, - 302, 444, 445, 314, 315, 641, 642, 300, 597, 628, - 595, 640, 622, 438, 378, 1359, 1365, 381, 281, 305, - 320, 1374, 613, 502, 227, 466, 290, 251, 1392, 1394, - 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 1355, 1383, 376, 575, 576, 316, - 396, 0, 0, 0, 0, 0, 1411, 1397, 527, 0, - 1339, 1414, 1308, 1327, 1424, 1330, 1333, 1376, 1286, 1354, - 416, 1324, 1312, 1281, 1319, 1282, 1310, 1341, 270, 1307, - 1399, 1358, 1413, 366, 267, 1288, 1279, 204, 505, 1313, - 430, 1329, 203, 1378, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 1420, 370, - 1364, 0, 497, 401, 0, 0, 0, 1343, 1403, 1352, - 1390, 1338, 1377, 1296, 1363, 1415, 1325, 1373, 1416, 323, - 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, - 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 1321, 1370, 606, 1410, 1322, 1372, 265, 321, 272, 264, - 579, 1421, 1402, 1285, 1351, 1409, 1346, 0, 0, 229, - 1412, 1345, 0, 1375, 0, 1427, 1280, 1366, 0, 1283, - 1287, 1423, 1407, 1316, 275, 0, 0, 0, 0, 0, - 0, 0, 1342, 1353, 1387, 1391, 1336, 0, 0, 0, - 0, 0, 0, 0, 0, 1314, 0, 1362, 0, 0, - 0, 1292, 1284, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, - 1295, 0, 1315, 1388, 0, 1278, 297, 1289, 402, 257, - 0, 453, 1395, 1406, 1337, 624, 1408, 1335, 1334, 1382, - 1293, 1401, 1328, 365, 1291, 330, 197, 225, 0, 1326, - 412, 461, 473, 1400, 1311, 1320, 253, 1318, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 1361, 1380, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 1290, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 1306, 279, + 485, 519, 520, 521, 523, 395, 266, 433, 1363, 1391, + 376, 576, 577, 316, 396, 0, 0, 0, 0, 0, + 0, 1421, 1405, 528, 0, 1347, 1424, 1315, 1334, 1434, + 1337, 1340, 1384, 1293, 1362, 416, 1331, 1319, 1288, 1326, + 1289, 1317, 1349, 270, 1314, 1407, 1366, 1423, 366, 267, + 1295, 1286, 204, 505, 1320, 430, 1336, 203, 1386, 487, + 252, 377, 374, 583, 282, 273, 269, 250, 317, 385, + 428, 518, 422, 1430, 370, 1372, 0, 497, 401, 0, + 0, 0, 1411, 1410, 1341, 1351, 1413, 1360, 1398, 1346, + 1385, 1303, 1371, 1425, 1332, 1381, 1426, 323, 248, 325, + 202, 413, 498, 286, 0, 0, 0, 0, 0, 507, + 959, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 238, 0, 0, 245, 0, 0, 0, 351, 360, 359, + 339, 340, 342, 344, 350, 357, 363, 336, 345, 1328, + 1378, 609, 1420, 1329, 1380, 265, 321, 272, 264, 580, + 1431, 1412, 1292, 1359, 1419, 1354, 596, 0, 0, 229, + 1422, 1353, 0, 1383, 0, 1437, 1287, 1374, 0, 1290, + 1294, 1433, 1417, 1323, 275, 0, 0, 0, 0, 0, + 0, 0, 1350, 1361, 1395, 1399, 1344, 0, 0, 0, + 0, 0, 0, 2410, 0, 1321, 0, 1370, 0, 0, + 0, 1299, 1291, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1348, 0, 0, 0, 0, + 1302, 0, 1322, 1396, 0, 1285, 297, 1296, 402, 257, + 0, 453, 1403, 1416, 1345, 629, 1418, 1343, 1342, 1390, + 1300, 1409, 1335, 365, 1298, 330, 197, 225, 0, 1333, + 412, 461, 473, 1408, 1318, 1327, 253, 1325, 471, 426, + 604, 233, 284, 458, 432, 469, 440, 287, 1369, 1388, + 470, 372, 585, 450, 601, 630, 631, 263, 406, 615, + 522, 623, 648, 226, 260, 420, 506, 607, 494, 397, + 581, 582, 329, 493, 295, 201, 369, 636, 224, 479, + 371, 242, 231, 587, 612, 299, 289, 456, 643, 213, + 517, 598, 239, 483, 0, 0, 651, 247, 504, 610, + 599, 215, 594, 503, 393, 326, 327, 214, 0, 457, + 268, 293, 0, 0, 258, 415, 589, 590, 256, 652, + 228, 622, 220, 1297, 621, 408, 584, 595, 394, 383, + 219, 593, 392, 382, 334, 355, 356, 280, 307, 447, + 375, 448, 306, 308, 404, 403, 405, 207, 608, 626, + 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, + 237, 1313, 279, 283, 291, 294, 303, 304, 313, 367, + 419, 446, 442, 451, 1404, 579, 602, 616, 628, 634, + 635, 637, 638, 639, 640, 641, 644, 642, 407, 311, + 495, 333, 373, 1393, 1436, 425, 472, 240, 606, 496, + 199, 1307, 1312, 1305, 0, 254, 255, 1375, 575, 1308, + 1306, 1364, 1365, 1309, 1427, 1428, 1429, 1414, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 649, 508, 514, 509, + 510, 511, 512, 513, 0, 515, 1397, 1301, 0, 1310, + 1311, 398, 1406, 591, 592, 672, 384, 486, 603, 335, + 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, + 347, 348, 353, 354, 358, 364, 249, 210, 390, 399, + 578, 312, 216, 217, 218, 524, 525, 526, 527, 619, + 620, 624, 205, 462, 463, 464, 465, 292, 614, 309, + 468, 467, 331, 332, 379, 449, 540, 542, 553, 557, + 559, 561, 567, 570, 541, 543, 554, 558, 560, 562, + 568, 571, 530, 532, 534, 536, 549, 548, 545, 573, + 574, 551, 556, 535, 547, 552, 565, 572, 569, 529, + 533, 537, 546, 564, 563, 544, 555, 566, 550, 538, + 531, 539, 1368, 196, 221, 368, 1432, 454, 288, 650, + 618, 484, 613, 206, 223, 1304, 262, 1316, 1324, 0, + 1330, 1338, 1339, 1352, 1355, 1356, 1357, 1358, 1376, 1377, + 1379, 1387, 1389, 1392, 1394, 1401, 1415, 1435, 198, 200, + 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, + 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, + 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, + 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, + 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, + 492, 500, 501, 516, 586, 588, 605, 625, 632, 480, + 301, 302, 444, 445, 314, 315, 646, 647, 300, 600, + 633, 597, 645, 627, 438, 378, 1367, 1373, 381, 281, + 305, 320, 1382, 617, 502, 227, 466, 290, 251, 1400, + 1402, 211, 246, 230, 259, 274, 277, 324, 391, 400, + 429, 434, 296, 271, 244, 459, 241, 485, 519, 520, + 521, 523, 395, 266, 433, 1363, 1391, 376, 576, 577, + 316, 396, 0, 0, 0, 0, 0, 0, 1421, 1405, + 528, 0, 1347, 1424, 1315, 1334, 1434, 1337, 1340, 1384, + 1293, 1362, 416, 1331, 1319, 1288, 1326, 1289, 1317, 1349, + 270, 1314, 1407, 1366, 1423, 366, 267, 1295, 1286, 204, + 505, 1320, 430, 1336, 203, 1386, 487, 252, 377, 374, + 583, 282, 273, 269, 250, 317, 385, 428, 518, 422, + 1430, 370, 1372, 0, 497, 401, 0, 0, 0, 1411, + 1410, 1341, 1351, 1413, 1360, 1398, 1346, 1385, 1303, 1371, + 1425, 1332, 1381, 1426, 323, 248, 325, 202, 413, 498, + 286, 0, 95, 0, 0, 0, 507, 724, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, + 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, + 344, 350, 357, 363, 336, 345, 1328, 1378, 609, 1420, + 1329, 1380, 265, 321, 272, 264, 580, 1431, 1412, 1292, + 1359, 1419, 1354, 596, 0, 0, 229, 1422, 1353, 0, + 1383, 0, 1437, 1287, 1374, 0, 1290, 1294, 1433, 1417, + 1323, 275, 0, 0, 0, 0, 0, 0, 0, 1350, + 1361, 1395, 1399, 1344, 0, 0, 0, 0, 0, 0, + 0, 0, 1321, 0, 1370, 0, 0, 0, 1299, 1291, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1348, 0, 0, 0, 0, 1302, 0, 1322, + 1396, 0, 1285, 297, 1296, 402, 257, 0, 453, 1403, + 1416, 1345, 629, 1418, 1343, 1342, 1390, 1300, 1409, 1335, + 365, 1298, 330, 197, 225, 0, 1333, 412, 461, 473, + 1408, 1318, 1327, 253, 1325, 471, 426, 604, 233, 284, + 458, 432, 469, 440, 287, 1369, 1388, 470, 372, 585, + 450, 601, 630, 631, 263, 406, 615, 522, 623, 648, + 226, 260, 420, 506, 607, 494, 397, 581, 582, 329, + 493, 295, 201, 369, 636, 224, 479, 371, 242, 231, + 587, 612, 299, 289, 456, 643, 213, 517, 598, 239, + 483, 0, 0, 651, 247, 504, 610, 599, 215, 594, + 503, 393, 326, 327, 214, 0, 457, 268, 293, 0, + 0, 258, 415, 589, 590, 256, 652, 228, 622, 220, + 1297, 621, 408, 584, 595, 394, 383, 219, 593, 392, + 382, 334, 355, 356, 280, 307, 447, 375, 448, 306, + 308, 404, 403, 405, 207, 608, 626, 0, 208, 0, + 499, 611, 653, 452, 212, 234, 235, 237, 1313, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 1396, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 1385, 1426, 425, 472, 240, 603, 496, 199, 1300, 1305, - 1298, 0, 254, 255, 1367, 574, 1301, 1299, 1356, 1357, - 1302, 1417, 1418, 1419, 1404, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 1389, 1294, 0, 1303, 1304, 398, 1398, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, + 451, 1404, 579, 602, 616, 628, 634, 635, 637, 638, + 639, 640, 641, 644, 642, 407, 311, 495, 333, 373, + 1393, 1436, 425, 472, 240, 606, 496, 199, 1307, 1312, + 1305, 0, 254, 255, 1375, 575, 1308, 1306, 1364, 1365, + 1309, 1427, 1428, 1429, 1414, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 649, 508, 514, 509, 510, 511, 512, + 513, 0, 515, 1397, 1301, 0, 1310, 1311, 398, 1406, + 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 1360, - 196, 221, 368, 1422, 454, 288, 645, 614, 484, 609, - 206, 223, 1297, 262, 1309, 1317, 0, 1323, 1331, 1332, - 1344, 1347, 1348, 1349, 1350, 1368, 1369, 1371, 1379, 1381, - 1384, 1386, 1393, 1405, 1425, 198, 200, 209, 222, 232, + 354, 358, 364, 249, 210, 390, 399, 578, 312, 216, + 217, 218, 524, 525, 526, 527, 619, 620, 624, 205, + 462, 463, 464, 465, 292, 614, 309, 468, 467, 331, + 332, 379, 449, 540, 542, 553, 557, 559, 561, 567, + 570, 541, 543, 554, 558, 560, 562, 568, 571, 530, + 532, 534, 536, 549, 548, 545, 573, 574, 551, 556, + 535, 547, 552, 565, 572, 569, 529, 533, 537, 546, + 564, 563, 544, 555, 566, 550, 538, 531, 539, 1368, + 196, 221, 368, 1432, 454, 288, 650, 618, 484, 613, + 206, 223, 1304, 262, 1316, 1324, 0, 1330, 1338, 1339, + 1352, 1355, 1356, 1357, 1358, 1376, 1377, 1379, 1387, 1389, + 1392, 1394, 1401, 1415, 1435, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 1359, 1365, 381, 281, 305, 320, 1374, - 613, 502, 227, 466, 290, 251, 1392, 1394, 211, 246, + 516, 586, 588, 605, 625, 632, 480, 301, 302, 444, + 445, 314, 315, 646, 647, 300, 600, 633, 597, 645, + 627, 438, 378, 1367, 1373, 381, 281, 305, 320, 1382, + 617, 502, 227, 466, 290, 251, 1400, 1402, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 1355, 1383, 376, 575, 576, 316, 396, 0, - 0, 0, 0, 0, 1411, 1397, 527, 0, 1339, 1414, - 1308, 1327, 1424, 1330, 1333, 1376, 1286, 1354, 416, 1324, - 1312, 1281, 1319, 1282, 1310, 1341, 270, 1307, 1399, 1358, - 1413, 366, 267, 1288, 1279, 204, 505, 1313, 430, 1329, - 203, 1378, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 1420, 370, 1364, 0, - 497, 401, 0, 0, 0, 1343, 1403, 1352, 1390, 1338, - 1377, 1296, 1363, 1415, 1325, 1373, 1416, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 0, 717, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 1321, 1370, - 606, 1410, 1322, 1372, 265, 321, 272, 264, 579, 1421, - 1402, 1285, 1351, 1409, 1346, 0, 0, 229, 1412, 1345, - 0, 1375, 0, 1427, 1280, 1366, 0, 1283, 1287, 1423, - 1407, 1316, 275, 0, 0, 0, 0, 0, 0, 0, - 1342, 1353, 1387, 1391, 1336, 0, 0, 0, 0, 0, - 0, 0, 0, 1314, 0, 1362, 0, 0, 0, 1292, - 1284, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1340, 0, 0, 0, 0, 1295, 0, - 1315, 1388, 0, 1278, 297, 1289, 402, 257, 0, 453, - 1395, 1406, 1337, 624, 1408, 1335, 1334, 1382, 1293, 1401, - 1328, 365, 1291, 330, 197, 225, 0, 1326, 412, 461, - 473, 1400, 1311, 1320, 253, 1318, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 1361, 1380, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 1290, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 1306, 279, 283, 291, - 294, 303, 304, 313, 367, 419, 446, 442, 451, 1396, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 1385, 1426, - 425, 472, 240, 603, 496, 199, 1300, 1305, 1298, 0, - 254, 255, 1367, 574, 1301, 1299, 1356, 1357, 1302, 1417, - 1418, 1419, 1404, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 1389, 1294, 0, 1303, 1304, 398, 1398, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, - 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 1360, 196, 221, - 368, 1422, 454, 288, 645, 614, 484, 609, 206, 223, - 1297, 262, 1309, 1317, 0, 1323, 1331, 1332, 1344, 1347, - 1348, 1349, 1350, 1368, 1369, 1371, 1379, 1381, 1384, 1386, - 1393, 1405, 1425, 198, 200, 209, 222, 232, 236, 243, - 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, - 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, - 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, - 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 1359, 1365, 381, 281, 305, 320, 1374, 613, 502, - 227, 466, 290, 251, 1392, 1394, 211, 246, 230, 259, - 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 1355, 1383, 376, 575, 576, 316, 396, 0, 0, 0, - 0, 0, 1411, 1397, 527, 0, 1339, 1414, 1308, 1327, - 1424, 1330, 1333, 1376, 1286, 1354, 416, 1324, 1312, 1281, - 1319, 1282, 1310, 1341, 270, 1307, 1399, 1358, 1413, 366, - 267, 1288, 1279, 204, 505, 1313, 430, 1329, 203, 1378, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 1420, 370, 1364, 0, 497, 401, - 0, 0, 0, 1343, 1403, 1352, 1390, 1338, 1377, 1296, - 1363, 1415, 1325, 1373, 1416, 323, 248, 325, 202, 413, - 498, 286, 0, 0, 0, 0, 0, 952, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, - 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 1321, 1370, 606, 1410, - 1322, 1372, 265, 321, 272, 264, 579, 1421, 1402, 1285, - 1351, 1409, 1346, 0, 0, 229, 1412, 1345, 0, 1375, - 0, 1427, 1280, 1366, 0, 1283, 1287, 1423, 1407, 1316, - 275, 0, 0, 0, 0, 0, 0, 0, 1342, 1353, - 1387, 1391, 1336, 0, 0, 0, 0, 0, 0, 0, - 0, 1314, 0, 1362, 0, 0, 0, 1292, 1284, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1340, 0, 0, 0, 0, 1295, 0, 1315, 1388, - 0, 1278, 297, 1289, 402, 257, 0, 453, 1395, 1406, - 1337, 624, 1408, 1335, 1334, 1382, 1293, 1401, 1328, 365, - 1291, 330, 197, 225, 0, 1326, 412, 461, 473, 1400, - 1311, 1320, 253, 1318, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 1361, 1380, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, + 271, 244, 459, 241, 485, 519, 520, 521, 523, 395, + 266, 433, 1363, 1391, 376, 576, 577, 316, 396, 0, + 0, 0, 0, 0, 0, 1421, 1405, 528, 0, 1347, + 1424, 1315, 1334, 1434, 1337, 1340, 1384, 1293, 1362, 416, + 1331, 1319, 1288, 1326, 1289, 1317, 1349, 270, 1314, 1407, + 1366, 1423, 366, 267, 1295, 1286, 204, 505, 1320, 430, + 1336, 203, 1386, 487, 252, 377, 374, 583, 282, 273, + 269, 250, 317, 385, 428, 518, 422, 1430, 370, 1372, + 0, 497, 401, 0, 0, 0, 1411, 1410, 1341, 1351, + 1413, 1360, 1398, 1346, 1385, 1303, 1371, 1425, 1332, 1381, + 1426, 323, 248, 325, 202, 413, 498, 286, 0, 0, + 0, 0, 0, 507, 194, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, + 0, 351, 360, 359, 339, 340, 342, 344, 350, 357, + 363, 336, 345, 1328, 1378, 609, 1420, 1329, 1380, 265, + 321, 272, 264, 580, 1431, 1412, 1292, 1359, 1419, 1354, + 596, 0, 0, 229, 1422, 1353, 0, 1383, 0, 1437, + 1287, 1374, 0, 1290, 1294, 1433, 1417, 1323, 275, 0, + 0, 0, 0, 0, 0, 0, 1350, 1361, 1395, 1399, + 1344, 0, 0, 0, 0, 0, 0, 0, 0, 1321, + 0, 1370, 0, 0, 0, 1299, 1291, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1348, + 0, 0, 0, 0, 1302, 0, 1322, 1396, 0, 1285, + 297, 1296, 402, 257, 0, 453, 1403, 1416, 1345, 629, + 1418, 1343, 1342, 1390, 1300, 1409, 1335, 365, 1298, 330, + 197, 225, 0, 1333, 412, 461, 473, 1408, 1318, 1327, + 253, 1325, 471, 426, 604, 233, 284, 458, 432, 469, + 440, 287, 1369, 1388, 470, 372, 585, 450, 601, 630, + 631, 263, 406, 615, 522, 623, 648, 226, 260, 420, + 506, 607, 494, 397, 581, 582, 329, 493, 295, 201, + 369, 636, 224, 479, 371, 242, 231, 587, 612, 299, + 289, 456, 643, 213, 517, 598, 239, 483, 0, 0, + 651, 247, 504, 610, 599, 215, 594, 503, 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 1290, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, + 589, 590, 256, 652, 228, 622, 220, 1297, 621, 408, + 584, 595, 394, 383, 219, 593, 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, - 212, 234, 235, 237, 1306, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 1396, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 1385, 1426, 425, 472, - 240, 603, 496, 199, 1300, 1305, 1298, 0, 254, 255, - 1367, 574, 1301, 1299, 1356, 1357, 1302, 1417, 1418, 1419, - 1404, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 1389, - 1294, 0, 1303, 1304, 398, 1398, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, - 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 1360, 196, 221, 368, 1422, - 454, 288, 645, 614, 484, 609, 206, 223, 1297, 262, - 1309, 1317, 0, 1323, 1331, 1332, 1344, 1347, 1348, 1349, - 1350, 1368, 1369, 1371, 1379, 1381, 1384, 1386, 1393, 1405, - 1425, 198, 200, 209, 222, 232, 236, 243, 261, 276, - 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, - 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, - 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, - 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 300, 597, 628, 595, 640, 622, 438, 378, 1359, - 1365, 381, 281, 305, 320, 1374, 613, 502, 227, 466, - 290, 251, 1392, 1394, 211, 246, 230, 259, 274, 277, - 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 1355, 1383, - 376, 575, 576, 316, 396, 0, 0, 0, 0, 0, - 0, 0, 527, 0, 770, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 757, 0, - 0, 0, 270, 762, 0, 0, 0, 366, 267, 0, - 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 769, 370, 0, 0, 497, 401, 0, 0, - 0, 0, 0, 764, 765, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 95, 0, 0, 1016, 952, 741, 918, 956, 1017, - 969, 970, 971, 957, 0, 238, 958, 959, 245, 960, - 0, 917, 800, 802, 801, 867, 868, 869, 870, 871, - 872, 873, 803, 804, 798, 965, 606, 972, 973, 0, - 265, 321, 272, 264, 579, 0, 0, 2209, 2210, 2211, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 737, 754, 0, 768, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 751, 752, 0, 0, 0, - 0, 912, 0, 753, 0, 0, 761, 974, 975, 976, - 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 763, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 911, 0, 0, 624, - 0, 0, 909, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 962, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 963, 964, - 256, 647, 808, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 816, 817, 280, - 307, 893, 892, 891, 306, 308, 889, 890, 888, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, - 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 899, 921, 910, 774, 775, 900, 901, 925, 902, - 777, 778, 922, 923, 771, 772, 776, 924, 926, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 913, 760, 759, - 0, 766, 767, 0, 796, 797, 799, 805, 806, 807, - 818, 865, 866, 874, 876, 877, 875, 878, 879, 880, - 883, 884, 885, 886, 881, 882, 887, 779, 783, 780, - 781, 782, 794, 784, 785, 786, 787, 788, 789, 790, - 791, 792, 793, 795, 936, 937, 938, 939, 940, 941, - 811, 815, 814, 812, 813, 809, 810, 837, 836, 838, - 839, 840, 841, 842, 843, 845, 844, 846, 847, 848, - 849, 850, 851, 819, 820, 823, 824, 822, 821, 825, - 834, 835, 826, 827, 828, 829, 830, 831, 833, 832, - 852, 853, 854, 855, 856, 858, 857, 861, 862, 860, - 859, 864, 863, 758, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 927, 262, 928, 0, - 0, 932, 0, 0, 0, 934, 933, 0, 935, 897, - 896, 0, 0, 929, 930, 0, 931, 0, 0, 198, + 405, 207, 608, 626, 0, 208, 0, 499, 611, 653, + 452, 212, 234, 235, 237, 1313, 279, 283, 291, 294, + 303, 304, 313, 367, 419, 446, 442, 451, 1404, 579, + 602, 616, 628, 634, 635, 637, 638, 639, 640, 641, + 644, 642, 407, 311, 495, 333, 373, 1393, 1436, 425, + 472, 240, 606, 496, 199, 1307, 1312, 1305, 0, 254, + 255, 1375, 575, 1308, 1306, 1364, 1365, 1309, 1427, 1428, + 1429, 1414, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 649, 508, 514, 509, 510, 511, 512, 513, 0, 515, + 1397, 1301, 0, 1310, 1311, 398, 1406, 591, 592, 672, + 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, + 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, + 249, 210, 390, 399, 578, 312, 216, 217, 218, 524, + 525, 526, 527, 619, 620, 624, 205, 462, 463, 464, + 465, 292, 614, 309, 468, 467, 331, 332, 379, 449, + 540, 542, 553, 557, 559, 561, 567, 570, 541, 543, + 554, 558, 560, 562, 568, 571, 530, 532, 534, 536, + 549, 548, 545, 573, 574, 551, 556, 535, 547, 552, + 565, 572, 569, 529, 533, 537, 546, 564, 563, 544, + 555, 566, 550, 538, 531, 539, 1368, 196, 221, 368, + 1432, 454, 288, 650, 618, 484, 613, 206, 223, 1304, + 262, 1316, 1324, 0, 1330, 1338, 1339, 1352, 1355, 1356, + 1357, 1358, 1376, 1377, 1379, 1387, 1389, 1392, 1394, 1401, + 1415, 1435, 198, 200, 209, 222, 232, 236, 243, 261, + 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, + 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, + 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, + 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, + 488, 489, 490, 491, 492, 500, 501, 516, 586, 588, + 605, 625, 632, 480, 301, 302, 444, 445, 314, 315, + 646, 647, 300, 600, 633, 597, 645, 627, 438, 378, + 1367, 1373, 381, 281, 305, 320, 1382, 617, 502, 227, + 466, 290, 251, 1400, 1402, 211, 246, 230, 259, 274, + 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, + 241, 485, 519, 520, 521, 523, 395, 266, 433, 1363, + 1391, 376, 576, 577, 316, 396, 0, 0, 0, 0, + 0, 0, 1421, 1405, 528, 0, 1347, 1424, 1315, 1334, + 1434, 1337, 1340, 1384, 1293, 1362, 416, 1331, 1319, 1288, + 1326, 1289, 1317, 1349, 270, 1314, 1407, 1366, 1423, 366, + 267, 1295, 1286, 204, 505, 1320, 430, 1336, 203, 1386, + 487, 252, 377, 374, 583, 282, 273, 269, 250, 317, + 385, 428, 518, 422, 1430, 370, 1372, 0, 497, 401, + 0, 0, 0, 1411, 1410, 1341, 1351, 1413, 1360, 1398, + 1346, 1385, 1303, 1371, 1425, 1332, 1381, 1426, 323, 248, + 325, 202, 413, 498, 286, 0, 0, 0, 0, 0, + 507, 724, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, + 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, + 1328, 1378, 609, 1420, 1329, 1380, 265, 321, 272, 264, + 580, 1431, 1412, 1292, 1359, 1419, 1354, 596, 0, 0, + 229, 1422, 1353, 0, 1383, 0, 1437, 1287, 1374, 0, + 1290, 1294, 1433, 1417, 1323, 275, 0, 0, 0, 0, + 0, 0, 0, 1350, 1361, 1395, 1399, 1344, 0, 0, + 0, 0, 0, 0, 0, 0, 1321, 0, 1370, 0, + 0, 0, 1299, 1291, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1348, 0, 0, 0, + 0, 1302, 0, 1322, 1396, 0, 1285, 297, 1296, 402, + 257, 0, 453, 1403, 1416, 1345, 629, 1418, 1343, 1342, + 1390, 1300, 1409, 1335, 365, 1298, 330, 197, 225, 0, + 1333, 412, 461, 473, 1408, 1318, 1327, 253, 1325, 471, + 426, 604, 233, 284, 458, 432, 469, 440, 287, 1369, + 1388, 470, 372, 585, 450, 601, 630, 631, 263, 406, + 615, 522, 623, 648, 226, 260, 420, 506, 607, 494, + 397, 581, 582, 329, 493, 295, 201, 369, 636, 224, + 479, 371, 242, 231, 587, 612, 299, 289, 456, 643, + 213, 517, 598, 239, 483, 0, 0, 651, 247, 504, + 610, 599, 215, 594, 503, 393, 326, 327, 214, 0, + 457, 268, 293, 0, 0, 258, 415, 589, 590, 256, + 652, 228, 622, 220, 1297, 621, 408, 584, 595, 394, + 383, 219, 593, 392, 382, 334, 355, 356, 280, 307, + 447, 375, 448, 306, 308, 404, 403, 405, 207, 608, + 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, + 235, 237, 1313, 279, 283, 291, 294, 303, 304, 313, + 367, 419, 446, 442, 451, 1404, 579, 602, 616, 628, + 634, 635, 637, 638, 639, 640, 641, 644, 642, 407, + 311, 495, 333, 373, 1393, 1436, 425, 472, 240, 606, + 496, 199, 1307, 1312, 1305, 0, 254, 255, 1375, 575, + 1308, 1306, 1364, 1365, 1309, 1427, 1428, 1429, 1414, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 649, 508, 514, + 509, 510, 511, 512, 513, 0, 515, 1397, 1301, 0, + 1310, 1311, 398, 1406, 591, 592, 672, 384, 486, 603, + 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, + 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, + 399, 578, 312, 216, 217, 218, 524, 525, 526, 527, + 619, 620, 624, 205, 462, 463, 464, 465, 292, 614, + 309, 468, 467, 331, 332, 379, 449, 540, 542, 553, + 557, 559, 561, 567, 570, 541, 543, 554, 558, 560, + 562, 568, 571, 530, 532, 534, 536, 549, 548, 545, + 573, 574, 551, 556, 535, 547, 552, 565, 572, 569, + 529, 533, 537, 546, 564, 563, 544, 555, 566, 550, + 538, 531, 539, 1368, 196, 221, 368, 1432, 454, 288, + 650, 618, 484, 613, 206, 223, 1304, 262, 1316, 1324, + 0, 1330, 1338, 1339, 1352, 1355, 1356, 1357, 1358, 1376, + 1377, 1379, 1387, 1389, 1392, 1394, 1401, 1415, 1435, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 942, 943, 944, 945, 946, 947, 948, 949, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, - 967, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 770, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 757, 0, 0, 0, 270, 762, 0, 0, 0, 366, - 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 769, 370, 0, 0, 497, 401, - 0, 0, 0, 0, 0, 764, 765, 0, 0, 0, - 0, 0, 0, 2416, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 95, 0, 0, 1016, 952, 741, 918, - 956, 1017, 969, 970, 971, 957, 0, 238, 958, 959, - 245, 960, 0, 917, 800, 802, 801, 867, 868, 869, - 870, 871, 872, 873, 803, 804, 798, 965, 606, 972, - 973, 2417, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 737, 754, 0, 768, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 751, 752, 0, - 0, 0, 0, 912, 0, 753, 0, 0, 761, 974, - 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, - 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, - 1015, 763, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 911, 0, - 0, 624, 0, 0, 909, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 962, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 963, 964, 256, 647, 808, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 816, - 817, 280, 307, 893, 892, 891, 306, 308, 889, 890, - 888, 207, 605, 0, 208, 0, 499, 607, 648, 452, - 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 899, 921, 910, 774, 775, 900, 901, - 925, 902, 777, 778, 922, 923, 771, 772, 776, 924, - 926, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 913, - 760, 759, 0, 766, 767, 0, 796, 797, 799, 805, - 806, 807, 818, 865, 866, 874, 876, 877, 875, 878, - 879, 880, 883, 884, 885, 886, 881, 882, 887, 779, - 783, 780, 781, 782, 794, 784, 785, 786, 787, 788, - 789, 790, 791, 792, 793, 795, 936, 937, 938, 939, - 940, 941, 811, 815, 814, 812, 813, 809, 810, 837, - 836, 838, 839, 840, 841, 842, 843, 845, 844, 846, - 847, 848, 849, 850, 851, 819, 820, 823, 824, 822, - 821, 825, 834, 835, 826, 827, 828, 829, 830, 831, - 833, 832, 852, 853, 854, 855, 856, 858, 857, 861, - 862, 860, 859, 864, 863, 758, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 927, 262, - 928, 0, 0, 932, 0, 0, 0, 934, 933, 0, - 935, 897, 896, 0, 0, 929, 930, 0, 931, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, - 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, - 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, - 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, - 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 942, 943, 944, 945, 946, 947, 948, - 949, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, - 290, 251, 967, 0, 211, 246, 230, 259, 274, 277, - 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 86, 527, 0, 770, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 757, 0, 0, 0, 270, 762, 0, 0, - 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 769, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 764, 765, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 95, 0, 0, 1016, 952, - 741, 918, 956, 1017, 969, 970, 971, 957, 0, 238, - 958, 959, 245, 960, 0, 917, 800, 802, 801, 867, - 868, 869, 870, 871, 872, 873, 803, 804, 798, 965, - 606, 972, 973, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 737, 754, 0, 768, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 751, - 752, 0, 0, 0, 0, 912, 0, 753, 0, 0, - 761, 974, 975, 976, 977, 978, 979, 980, 981, 982, + 491, 492, 500, 501, 516, 586, 588, 605, 625, 632, + 480, 301, 302, 444, 445, 314, 315, 646, 647, 300, + 600, 633, 597, 645, 627, 438, 378, 1367, 1373, 381, + 281, 305, 320, 1382, 617, 502, 227, 466, 290, 251, + 1400, 1402, 211, 246, 230, 259, 274, 277, 324, 391, + 400, 429, 434, 296, 271, 244, 459, 241, 485, 519, + 520, 521, 523, 395, 266, 433, 1363, 1391, 376, 576, + 577, 316, 396, 0, 0, 0, 0, 0, 0, 1421, + 1405, 528, 0, 1347, 1424, 1315, 1334, 1434, 1337, 1340, + 1384, 1293, 1362, 416, 1331, 1319, 1288, 1326, 1289, 1317, + 1349, 270, 1314, 1407, 1366, 1423, 366, 267, 1295, 1286, + 204, 505, 1320, 430, 1336, 203, 1386, 487, 252, 377, + 374, 583, 282, 273, 269, 250, 317, 385, 428, 518, + 422, 1430, 370, 1372, 0, 497, 401, 0, 0, 0, + 1411, 1410, 1341, 1351, 1413, 1360, 1398, 1346, 1385, 1303, + 1371, 1425, 1332, 1381, 1426, 323, 248, 325, 202, 413, + 498, 286, 0, 0, 0, 0, 0, 507, 959, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, + 0, 245, 0, 0, 0, 351, 360, 359, 339, 340, + 342, 344, 350, 357, 363, 336, 345, 1328, 1378, 609, + 1420, 1329, 1380, 265, 321, 272, 264, 580, 1431, 1412, + 1292, 1359, 1419, 1354, 596, 0, 0, 229, 1422, 1353, + 0, 1383, 0, 1437, 1287, 1374, 0, 1290, 1294, 1433, + 1417, 1323, 275, 0, 0, 0, 0, 0, 0, 0, + 1350, 1361, 1395, 1399, 1344, 0, 0, 0, 0, 0, + 0, 0, 0, 1321, 0, 1370, 0, 0, 0, 1299, + 1291, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1348, 0, 0, 0, 0, 1302, 0, + 1322, 1396, 0, 1285, 297, 1296, 402, 257, 0, 453, + 1403, 1416, 1345, 629, 1418, 1343, 1342, 1390, 1300, 1409, + 1335, 365, 1298, 330, 197, 225, 0, 1333, 412, 461, + 473, 1408, 1318, 1327, 253, 1325, 471, 426, 604, 233, + 284, 458, 432, 469, 440, 287, 1369, 1388, 470, 372, + 585, 450, 601, 630, 631, 263, 406, 615, 522, 623, + 648, 226, 260, 420, 506, 607, 494, 397, 581, 582, + 329, 493, 295, 201, 369, 636, 224, 479, 371, 242, + 231, 587, 612, 299, 289, 456, 643, 213, 517, 598, + 239, 483, 0, 0, 651, 247, 504, 610, 599, 215, + 594, 503, 393, 326, 327, 214, 0, 457, 268, 293, + 0, 0, 258, 415, 589, 590, 256, 652, 228, 622, + 220, 1297, 621, 408, 584, 595, 394, 383, 219, 593, + 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, + 306, 308, 404, 403, 405, 207, 608, 626, 0, 208, + 0, 499, 611, 653, 452, 212, 234, 235, 237, 1313, + 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, + 442, 451, 1404, 579, 602, 616, 628, 634, 635, 637, + 638, 639, 640, 641, 644, 642, 407, 311, 495, 333, + 373, 1393, 1436, 425, 472, 240, 606, 496, 199, 1307, + 1312, 1305, 0, 254, 255, 1375, 575, 1308, 1306, 1364, + 1365, 1309, 1427, 1428, 1429, 1414, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 649, 508, 514, 509, 510, 511, + 512, 513, 0, 515, 1397, 1301, 0, 1310, 1311, 398, + 1406, 591, 592, 672, 384, 486, 603, 335, 349, 352, + 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, + 353, 354, 358, 364, 249, 210, 390, 399, 578, 312, + 216, 217, 218, 524, 525, 526, 527, 619, 620, 624, + 205, 462, 463, 464, 465, 292, 614, 309, 468, 467, + 331, 332, 379, 449, 540, 542, 553, 557, 559, 561, + 567, 570, 541, 543, 554, 558, 560, 562, 568, 571, + 530, 532, 534, 536, 549, 548, 545, 573, 574, 551, + 556, 535, 547, 552, 565, 572, 569, 529, 533, 537, + 546, 564, 563, 544, 555, 566, 550, 538, 531, 539, + 1368, 196, 221, 368, 1432, 454, 288, 650, 618, 484, + 613, 206, 223, 1304, 262, 1316, 1324, 0, 1330, 1338, + 1339, 1352, 1355, 1356, 1357, 1358, 1376, 1377, 1379, 1387, + 1389, 1392, 1394, 1401, 1415, 1435, 198, 200, 209, 222, + 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, + 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, + 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, + 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, + 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, + 501, 516, 586, 588, 605, 625, 632, 480, 301, 302, + 444, 445, 314, 315, 646, 647, 300, 600, 633, 597, + 645, 627, 438, 378, 1367, 1373, 381, 281, 305, 320, + 1382, 617, 502, 227, 466, 290, 251, 1400, 1402, 211, + 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, + 296, 271, 244, 459, 241, 485, 519, 520, 521, 523, + 395, 266, 433, 1363, 1391, 376, 576, 577, 316, 396, + 0, 0, 0, 0, 0, 0, 0, 0, 528, 0, + 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 416, 0, 0, 0, 764, 0, 0, 0, 270, 769, + 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, + 430, 0, 203, 0, 487, 252, 377, 374, 583, 282, + 273, 269, 250, 317, 385, 428, 518, 422, 776, 370, + 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, + 0, 0, 771, 772, 0, 0, 0, 0, 0, 0, + 0, 0, 323, 248, 325, 202, 413, 498, 286, 0, + 95, 0, 0, 1023, 507, 959, 748, 925, 963, 1024, + 976, 977, 978, 964, 0, 238, 965, 966, 245, 967, + 0, 924, 807, 809, 808, 874, 875, 876, 877, 878, + 879, 880, 810, 811, 805, 972, 609, 979, 980, 0, + 265, 321, 272, 264, 580, 0, 0, 2232, 2233, 2234, + 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, + 0, 0, 744, 761, 0, 775, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 758, 759, 0, 0, + 0, 0, 919, 0, 760, 0, 0, 768, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, - 1013, 1014, 1015, 763, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 911, 0, 0, 624, 0, 0, 909, 0, 0, 0, - 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 962, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 963, 964, 256, 647, 808, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 816, 817, 280, 307, 893, 892, 891, 306, 308, - 889, 890, 888, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, + 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, + 770, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 297, 0, 402, 257, 0, 453, 918, 0, 0, + 629, 0, 0, 916, 0, 0, 0, 0, 365, 0, + 330, 197, 225, 0, 0, 412, 461, 473, 0, 0, + 0, 969, 0, 471, 426, 604, 233, 284, 458, 432, + 469, 440, 287, 0, 0, 470, 372, 585, 450, 601, + 630, 631, 263, 406, 615, 522, 623, 648, 226, 260, + 420, 506, 607, 494, 397, 581, 582, 329, 493, 295, + 201, 369, 636, 224, 479, 371, 242, 231, 587, 612, + 299, 289, 456, 643, 213, 517, 598, 239, 483, 0, + 0, 651, 247, 504, 610, 599, 215, 594, 503, 393, + 326, 327, 214, 0, 457, 268, 293, 0, 0, 258, + 415, 970, 971, 256, 652, 815, 622, 220, 0, 621, + 408, 584, 595, 394, 383, 219, 593, 392, 382, 334, + 823, 824, 280, 307, 900, 899, 898, 306, 308, 896, + 897, 895, 207, 608, 626, 0, 208, 0, 499, 611, + 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 899, 921, 910, 774, 775, - 900, 901, 925, 902, 777, 778, 922, 923, 771, 772, - 776, 924, 926, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 913, 760, 759, 0, 766, 767, 0, 796, 797, - 799, 805, 806, 807, 818, 865, 866, 874, 876, 877, - 875, 878, 879, 880, 883, 884, 885, 886, 881, 882, - 887, 779, 783, 780, 781, 782, 794, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 795, 936, 937, - 938, 939, 940, 941, 811, 815, 814, 812, 813, 809, - 810, 837, 836, 838, 839, 840, 841, 842, 843, 845, - 844, 846, 847, 848, 849, 850, 851, 819, 820, 823, - 824, 822, 821, 825, 834, 835, 826, 827, 828, 829, - 830, 831, 833, 832, 852, 853, 854, 855, 856, 858, - 857, 861, 862, 860, 859, 864, 863, 758, 196, 221, - 368, 94, 454, 288, 645, 614, 484, 609, 206, 223, - 927, 262, 928, 0, 0, 932, 0, 0, 0, 934, - 933, 0, 935, 897, 896, 0, 0, 929, 930, 0, - 931, 0, 0, 198, 200, 209, 222, 232, 236, 243, + 579, 602, 616, 628, 634, 635, 637, 638, 639, 640, + 641, 644, 642, 407, 311, 495, 333, 373, 0, 0, + 425, 472, 240, 606, 496, 906, 928, 917, 781, 782, + 907, 908, 932, 909, 784, 785, 929, 930, 778, 779, + 783, 931, 933, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 649, 508, 514, 509, 510, 511, 512, 513, 0, + 515, 920, 767, 766, 0, 773, 774, 0, 803, 804, + 806, 812, 813, 814, 825, 872, 873, 881, 883, 884, + 882, 885, 886, 887, 890, 891, 892, 893, 888, 889, + 894, 786, 790, 787, 788, 789, 801, 791, 792, 793, + 794, 795, 796, 797, 798, 799, 800, 802, 943, 944, + 945, 946, 947, 948, 818, 822, 821, 819, 820, 816, + 817, 844, 843, 845, 846, 847, 848, 849, 850, 852, + 851, 853, 854, 855, 856, 857, 858, 826, 827, 830, + 831, 829, 828, 832, 841, 842, 833, 834, 835, 836, + 837, 838, 840, 839, 859, 860, 861, 862, 863, 865, + 864, 868, 869, 867, 866, 871, 870, 765, 196, 221, + 368, 0, 454, 288, 650, 618, 484, 613, 206, 223, + 934, 262, 935, 0, 0, 939, 0, 0, 0, 941, + 940, 0, 942, 904, 903, 0, 0, 936, 937, 0, + 938, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 942, 943, 944, 945, 946, - 947, 948, 949, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, - 227, 466, 290, 251, 967, 0, 211, 246, 230, 259, + 482, 488, 489, 490, 491, 492, 500, 501, 516, 586, + 588, 605, 625, 632, 480, 949, 950, 951, 952, 953, + 954, 955, 956, 300, 600, 633, 597, 645, 627, 438, + 378, 0, 0, 381, 281, 305, 320, 0, 617, 502, + 227, 466, 290, 251, 974, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, - 770, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 0, 757, 0, 0, 0, 270, 762, - 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 769, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 764, - 765, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 95, 0, 0, - 1016, 952, 741, 918, 956, 1017, 969, 970, 971, 957, - 0, 238, 958, 959, 245, 960, 0, 917, 800, 802, - 801, 867, 868, 869, 870, 871, 872, 873, 803, 804, - 798, 965, 606, 972, 973, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 737, 754, 0, - 768, 0, 0, 0, 275, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 751, 752, 0, 0, 0, 0, 912, 0, 753, - 0, 0, 761, 974, 975, 976, 977, 978, 979, 980, + 459, 241, 485, 519, 520, 521, 523, 395, 266, 433, + 396, 0, 376, 576, 577, 316, 0, 0, 0, 528, + 0, 777, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 416, 0, 0, 0, 764, 0, 0, 0, 270, + 769, 0, 0, 0, 366, 267, 0, 0, 204, 505, + 0, 430, 0, 203, 0, 487, 252, 377, 374, 583, + 282, 273, 269, 250, 317, 385, 428, 518, 422, 776, + 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, + 0, 0, 0, 771, 772, 0, 0, 0, 0, 0, + 0, 2439, 0, 323, 248, 325, 202, 413, 498, 286, + 0, 95, 0, 0, 1023, 507, 959, 748, 925, 963, + 1024, 976, 977, 978, 964, 0, 238, 965, 966, 245, + 967, 0, 924, 807, 809, 808, 874, 875, 876, 877, + 878, 879, 880, 810, 811, 805, 972, 609, 979, 980, + 2440, 265, 321, 272, 264, 580, 0, 0, 0, 0, + 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, + 0, 0, 0, 744, 761, 0, 775, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 758, 759, 0, + 0, 0, 0, 919, 0, 760, 0, 0, 768, 981, + 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 770, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 297, 0, 402, 257, 0, 453, 918, 0, + 0, 629, 0, 0, 916, 0, 0, 0, 0, 365, + 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, + 0, 0, 969, 0, 471, 426, 604, 233, 284, 458, + 432, 469, 440, 287, 0, 0, 470, 372, 585, 450, + 601, 630, 631, 263, 406, 615, 522, 623, 648, 226, + 260, 420, 506, 607, 494, 397, 581, 582, 329, 493, + 295, 201, 369, 636, 224, 479, 371, 242, 231, 587, + 612, 299, 289, 456, 643, 213, 517, 598, 239, 483, + 0, 0, 651, 247, 504, 610, 599, 215, 594, 503, + 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, + 258, 415, 970, 971, 256, 652, 815, 622, 220, 0, + 621, 408, 584, 595, 394, 383, 219, 593, 392, 382, + 334, 823, 824, 280, 307, 900, 899, 898, 306, 308, + 896, 897, 895, 207, 608, 626, 0, 208, 0, 499, + 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, + 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, + 0, 579, 602, 616, 628, 634, 635, 637, 638, 639, + 640, 641, 644, 642, 407, 311, 495, 333, 373, 0, + 0, 425, 472, 240, 606, 496, 906, 928, 917, 781, + 782, 907, 908, 932, 909, 784, 785, 929, 930, 778, + 779, 783, 931, 933, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 649, 508, 514, 509, 510, 511, 512, 513, + 0, 515, 920, 767, 766, 0, 773, 774, 0, 803, + 804, 806, 812, 813, 814, 825, 872, 873, 881, 883, + 884, 882, 885, 886, 887, 890, 891, 892, 893, 888, + 889, 894, 786, 790, 787, 788, 789, 801, 791, 792, + 793, 794, 795, 796, 797, 798, 799, 800, 802, 943, + 944, 945, 946, 947, 948, 818, 822, 821, 819, 820, + 816, 817, 844, 843, 845, 846, 847, 848, 849, 850, + 852, 851, 853, 854, 855, 856, 857, 858, 826, 827, + 830, 831, 829, 828, 832, 841, 842, 833, 834, 835, + 836, 837, 838, 840, 839, 859, 860, 861, 862, 863, + 865, 864, 868, 869, 867, 866, 871, 870, 765, 196, + 221, 368, 0, 454, 288, 650, 618, 484, 613, 206, + 223, 934, 262, 935, 0, 0, 939, 0, 0, 0, + 941, 940, 0, 942, 904, 903, 0, 0, 936, 937, + 0, 938, 0, 0, 198, 200, 209, 222, 232, 236, + 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, + 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, + 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, + 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, + 481, 482, 488, 489, 490, 491, 492, 500, 501, 516, + 586, 588, 605, 625, 632, 480, 949, 950, 951, 952, + 953, 954, 955, 956, 300, 600, 633, 597, 645, 627, + 438, 378, 0, 0, 381, 281, 305, 320, 0, 617, + 502, 227, 466, 290, 251, 974, 0, 211, 246, 230, + 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, + 244, 459, 241, 485, 519, 520, 521, 523, 395, 266, + 433, 396, 0, 376, 576, 577, 316, 0, 0, 86, + 528, 0, 777, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 416, 0, 0, 0, 764, 0, 0, 0, + 270, 769, 0, 0, 0, 366, 267, 0, 0, 204, + 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, + 583, 282, 273, 269, 250, 317, 385, 428, 518, 422, + 776, 370, 0, 0, 497, 401, 0, 0, 0, 0, + 0, 0, 0, 0, 771, 772, 0, 0, 0, 0, + 0, 0, 0, 0, 323, 248, 325, 202, 413, 498, + 286, 0, 95, 0, 0, 1023, 507, 959, 748, 925, + 963, 1024, 976, 977, 978, 964, 0, 238, 965, 966, + 245, 967, 0, 924, 807, 809, 808, 874, 875, 876, + 877, 878, 879, 880, 810, 811, 805, 972, 609, 979, + 980, 0, 265, 321, 272, 264, 580, 0, 0, 0, + 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, + 0, 0, 0, 0, 744, 761, 0, 775, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 758, 759, + 0, 0, 0, 0, 919, 0, 760, 0, 0, 768, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 763, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 911, 0, 0, 624, 0, 0, 909, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 962, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 4070, 0, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 963, 964, 256, 647, 808, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 816, 817, 280, 307, 893, 892, 891, - 306, 308, 889, 890, 888, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, + 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, + 1021, 1022, 770, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 297, 0, 402, 257, 0, 453, 918, + 0, 0, 629, 0, 0, 916, 0, 0, 0, 0, + 365, 0, 330, 197, 225, 0, 0, 412, 461, 473, + 0, 0, 0, 969, 0, 471, 426, 604, 233, 284, + 458, 432, 469, 440, 287, 0, 0, 470, 372, 585, + 450, 601, 630, 631, 263, 406, 615, 522, 623, 648, + 226, 260, 420, 506, 607, 494, 397, 581, 582, 329, + 493, 295, 201, 369, 636, 224, 479, 371, 242, 231, + 587, 612, 299, 289, 456, 643, 213, 517, 598, 239, + 483, 0, 0, 651, 247, 504, 610, 599, 215, 594, + 503, 393, 326, 327, 214, 0, 457, 268, 293, 0, + 0, 258, 415, 970, 971, 256, 652, 815, 622, 220, + 0, 621, 408, 584, 595, 394, 383, 219, 593, 392, + 382, 334, 823, 824, 280, 307, 900, 899, 898, 306, + 308, 896, 897, 895, 207, 608, 626, 0, 208, 0, + 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 899, 921, 910, - 774, 775, 900, 901, 925, 902, 777, 778, 922, 923, - 771, 772, 776, 924, 926, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 913, 760, 759, 0, 766, 767, 0, - 796, 797, 799, 805, 806, 807, 818, 865, 866, 874, - 876, 877, 875, 878, 879, 880, 883, 884, 885, 886, - 881, 882, 887, 779, 783, 780, 781, 782, 794, 784, - 785, 786, 787, 788, 789, 790, 791, 792, 793, 795, - 936, 937, 938, 939, 940, 941, 811, 815, 814, 812, - 813, 809, 810, 837, 836, 838, 839, 840, 841, 842, - 843, 845, 844, 846, 847, 848, 849, 850, 851, 819, - 820, 823, 824, 822, 821, 825, 834, 835, 826, 827, - 828, 829, 830, 831, 833, 832, 852, 853, 854, 855, - 856, 858, 857, 861, 862, 860, 859, 864, 863, 758, - 196, 221, 368, 0, 454, 288, 645, 614, 484, 609, - 206, 223, 927, 262, 928, 0, 0, 932, 0, 0, - 0, 934, 933, 0, 935, 897, 896, 0, 0, 929, - 930, 0, 931, 0, 0, 198, 200, 209, 222, 232, + 451, 0, 579, 602, 616, 628, 634, 635, 637, 638, + 639, 640, 641, 644, 642, 407, 311, 495, 333, 373, + 0, 0, 425, 472, 240, 606, 496, 906, 928, 917, + 781, 782, 907, 908, 932, 909, 784, 785, 929, 930, + 778, 779, 783, 931, 933, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 649, 508, 514, 509, 510, 511, 512, + 513, 0, 515, 920, 767, 766, 0, 773, 774, 0, + 803, 804, 806, 812, 813, 814, 825, 872, 873, 881, + 883, 884, 882, 885, 886, 887, 890, 891, 892, 893, + 888, 889, 894, 786, 790, 787, 788, 789, 801, 791, + 792, 793, 794, 795, 796, 797, 798, 799, 800, 802, + 943, 944, 945, 946, 947, 948, 818, 822, 821, 819, + 820, 816, 817, 844, 843, 845, 846, 847, 848, 849, + 850, 852, 851, 853, 854, 855, 856, 857, 858, 826, + 827, 830, 831, 829, 828, 832, 841, 842, 833, 834, + 835, 836, 837, 838, 840, 839, 859, 860, 861, 862, + 863, 865, 864, 868, 869, 867, 866, 871, 870, 765, + 196, 221, 368, 94, 454, 288, 650, 618, 484, 613, + 206, 223, 934, 262, 935, 0, 0, 939, 0, 0, + 0, 941, 940, 0, 942, 904, 903, 0, 0, 936, + 937, 0, 938, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 942, 943, 944, - 945, 946, 947, 948, 949, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 967, 0, 211, 246, + 516, 586, 588, 605, 625, 632, 480, 949, 950, 951, + 952, 953, 954, 955, 956, 300, 600, 633, 597, 645, + 627, 438, 378, 0, 0, 381, 281, 305, 320, 0, + 617, 502, 227, 466, 290, 251, 974, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 0, - 527, 0, 770, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 757, 0, 0, 0, - 270, 762, 0, 0, 0, 366, 267, 0, 0, 204, - 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 769, 370, 0, 0, 497, 401, 0, 0, 0, 0, - 0, 764, 765, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 95, - 0, 1736, 1016, 952, 741, 918, 956, 1017, 969, 970, - 971, 957, 0, 238, 958, 959, 245, 960, 0, 917, - 800, 802, 801, 867, 868, 869, 870, 871, 872, 873, - 803, 804, 798, 965, 606, 972, 973, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 737, - 754, 0, 768, 0, 0, 0, 275, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 751, 752, 0, 0, 0, 0, 912, - 0, 753, 0, 0, 761, 974, 975, 976, 977, 978, - 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 271, 244, 459, 241, 485, 519, 520, 521, 523, 395, + 266, 433, 396, 0, 376, 576, 577, 316, 0, 0, + 0, 528, 0, 777, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 416, 0, 0, 0, 764, 0, 0, + 0, 270, 769, 0, 0, 0, 366, 267, 0, 0, + 204, 505, 0, 430, 0, 203, 0, 487, 252, 377, + 374, 583, 282, 273, 269, 250, 317, 385, 428, 518, + 422, 776, 370, 0, 0, 497, 401, 0, 0, 0, + 0, 0, 0, 0, 0, 771, 772, 0, 0, 0, + 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, + 498, 286, 0, 95, 0, 0, 1023, 507, 959, 748, + 925, 963, 1024, 976, 977, 978, 964, 0, 238, 965, + 966, 245, 967, 0, 924, 807, 809, 808, 874, 875, + 876, 877, 878, 879, 880, 810, 811, 805, 972, 609, + 979, 980, 0, 265, 321, 272, 264, 580, 0, 0, + 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, + 0, 0, 0, 0, 0, 744, 761, 0, 775, 0, + 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 758, + 759, 0, 0, 0, 0, 919, 0, 760, 0, 0, + 768, 981, 982, 983, 984, 985, 986, 987, 988, 989, + 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, + 1020, 1021, 1022, 770, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, + 918, 0, 0, 629, 0, 0, 916, 0, 0, 0, + 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, + 473, 0, 0, 0, 969, 0, 471, 426, 604, 233, + 284, 458, 432, 469, 440, 287, 4095, 0, 470, 372, + 585, 450, 601, 630, 631, 263, 406, 615, 522, 623, + 648, 226, 260, 420, 506, 607, 494, 397, 581, 582, + 329, 493, 295, 201, 369, 636, 224, 479, 371, 242, + 231, 587, 612, 299, 289, 456, 643, 213, 517, 598, + 239, 483, 0, 0, 651, 247, 504, 610, 599, 215, + 594, 503, 393, 326, 327, 214, 0, 457, 268, 293, + 0, 0, 258, 415, 970, 971, 256, 652, 815, 622, + 220, 0, 621, 408, 584, 595, 394, 383, 219, 593, + 392, 382, 334, 823, 824, 280, 307, 900, 899, 898, + 306, 308, 896, 897, 895, 207, 608, 626, 0, 208, + 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, + 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, + 442, 451, 0, 579, 602, 616, 628, 634, 635, 637, + 638, 639, 640, 641, 644, 642, 407, 311, 495, 333, + 373, 0, 0, 425, 472, 240, 606, 496, 906, 928, + 917, 781, 782, 907, 908, 932, 909, 784, 785, 929, + 930, 778, 779, 783, 931, 933, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 649, 508, 514, 509, 510, 511, + 512, 513, 0, 515, 920, 767, 766, 0, 773, 774, + 0, 803, 804, 806, 812, 813, 814, 825, 872, 873, + 881, 883, 884, 882, 885, 886, 887, 890, 891, 892, + 893, 888, 889, 894, 786, 790, 787, 788, 789, 801, + 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, + 802, 943, 944, 945, 946, 947, 948, 818, 822, 821, + 819, 820, 816, 817, 844, 843, 845, 846, 847, 848, + 849, 850, 852, 851, 853, 854, 855, 856, 857, 858, + 826, 827, 830, 831, 829, 828, 832, 841, 842, 833, + 834, 835, 836, 837, 838, 840, 839, 859, 860, 861, + 862, 863, 865, 864, 868, 869, 867, 866, 871, 870, + 765, 196, 221, 368, 0, 454, 288, 650, 618, 484, + 613, 206, 223, 934, 262, 935, 0, 0, 939, 0, + 0, 0, 941, 940, 0, 942, 904, 903, 0, 0, + 936, 937, 0, 938, 0, 0, 198, 200, 209, 222, + 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, + 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, + 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, + 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, + 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, + 501, 516, 586, 588, 605, 625, 632, 480, 949, 950, + 951, 952, 953, 954, 955, 956, 300, 600, 633, 597, + 645, 627, 438, 378, 0, 0, 381, 281, 305, 320, + 0, 617, 502, 227, 466, 290, 251, 974, 0, 211, + 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, + 296, 271, 244, 459, 241, 485, 519, 520, 521, 523, + 395, 266, 433, 396, 0, 376, 576, 577, 316, 0, + 0, 0, 528, 0, 777, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 416, 0, 0, 0, 764, 0, + 0, 0, 270, 769, 0, 0, 0, 366, 267, 0, + 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, + 377, 374, 583, 282, 273, 269, 250, 317, 385, 428, + 518, 422, 776, 370, 0, 0, 497, 401, 0, 0, + 0, 0, 0, 0, 0, 0, 771, 772, 0, 0, + 0, 0, 0, 0, 0, 0, 323, 248, 325, 202, + 413, 498, 286, 0, 95, 0, 1753, 1023, 507, 959, + 748, 925, 963, 1024, 976, 977, 978, 964, 0, 238, + 965, 966, 245, 967, 0, 924, 807, 809, 808, 874, + 875, 876, 877, 878, 879, 880, 810, 811, 805, 972, + 609, 979, 980, 0, 265, 321, 272, 264, 580, 0, + 0, 0, 0, 0, 0, 596, 0, 0, 229, 0, + 0, 0, 0, 0, 0, 0, 744, 761, 0, 775, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 758, 759, 0, 0, 0, 0, 919, 0, 760, 0, + 0, 768, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 763, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 911, 0, 0, 624, 0, 0, - 909, 0, 0, 0, 0, 365, 0, 330, 197, 225, - 0, 0, 412, 461, 473, 0, 0, 0, 962, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 963, 964, 256, 647, - 808, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 816, 817, 280, 307, 893, - 892, 891, 306, 308, 889, 890, 888, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, + 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, + 1019, 1020, 1021, 1022, 770, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 297, 0, 402, 257, 0, + 453, 918, 0, 0, 629, 0, 0, 916, 0, 0, + 0, 0, 365, 0, 330, 197, 225, 0, 0, 412, + 461, 473, 0, 0, 0, 969, 0, 471, 426, 604, + 233, 284, 458, 432, 469, 440, 287, 0, 0, 470, + 372, 585, 450, 601, 630, 631, 263, 406, 615, 522, + 623, 648, 226, 260, 420, 506, 607, 494, 397, 581, + 582, 329, 493, 295, 201, 369, 636, 224, 479, 371, + 242, 231, 587, 612, 299, 289, 456, 643, 213, 517, + 598, 239, 483, 0, 0, 651, 247, 504, 610, 599, + 215, 594, 503, 393, 326, 327, 214, 0, 457, 268, + 293, 0, 0, 258, 415, 970, 971, 256, 652, 815, + 622, 220, 0, 621, 408, 584, 595, 394, 383, 219, + 593, 392, 382, 334, 823, 824, 280, 307, 900, 899, + 898, 306, 308, 896, 897, 895, 207, 608, 626, 0, + 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 899, - 921, 910, 774, 775, 900, 901, 925, 902, 777, 778, - 922, 923, 771, 772, 776, 924, 926, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 913, 760, 759, 0, 766, - 767, 0, 796, 797, 799, 805, 806, 807, 818, 865, - 866, 874, 876, 877, 875, 878, 879, 880, 883, 884, - 885, 886, 881, 882, 887, 779, 783, 780, 781, 782, - 794, 784, 785, 786, 787, 788, 789, 790, 791, 792, - 793, 795, 936, 937, 938, 939, 940, 941, 811, 815, - 814, 812, 813, 809, 810, 837, 836, 838, 839, 840, - 841, 842, 843, 845, 844, 846, 847, 848, 849, 850, - 851, 819, 820, 823, 824, 822, 821, 825, 834, 835, - 826, 827, 828, 829, 830, 831, 833, 832, 852, 853, - 854, 855, 856, 858, 857, 861, 862, 860, 859, 864, - 863, 758, 196, 221, 368, 0, 454, 288, 645, 614, - 484, 609, 206, 223, 927, 262, 928, 0, 0, 932, - 0, 0, 0, 934, 933, 0, 935, 897, 896, 0, - 0, 929, 930, 0, 931, 0, 0, 198, 200, 209, + 446, 442, 451, 0, 579, 602, 616, 628, 634, 635, + 637, 638, 639, 640, 641, 644, 642, 407, 311, 495, + 333, 373, 0, 0, 425, 472, 240, 606, 496, 906, + 928, 917, 781, 782, 907, 908, 932, 909, 784, 785, + 929, 930, 778, 779, 783, 931, 933, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 649, 508, 514, 509, 510, + 511, 512, 513, 0, 515, 920, 767, 766, 0, 773, + 774, 0, 803, 804, 806, 812, 813, 814, 825, 872, + 873, 881, 883, 884, 882, 885, 886, 887, 890, 891, + 892, 893, 888, 889, 894, 786, 790, 787, 788, 789, + 801, 791, 792, 793, 794, 795, 796, 797, 798, 799, + 800, 802, 943, 944, 945, 946, 947, 948, 818, 822, + 821, 819, 820, 816, 817, 844, 843, 845, 846, 847, + 848, 849, 850, 852, 851, 853, 854, 855, 856, 857, + 858, 826, 827, 830, 831, 829, 828, 832, 841, 842, + 833, 834, 835, 836, 837, 838, 840, 839, 859, 860, + 861, 862, 863, 865, 864, 868, 869, 867, 866, 871, + 870, 765, 196, 221, 368, 0, 454, 288, 650, 618, + 484, 613, 206, 223, 934, 262, 935, 0, 0, 939, + 0, 0, 0, 941, 940, 0, 942, 904, 903, 0, + 0, 936, 937, 0, 938, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 942, - 943, 944, 945, 946, 947, 948, 949, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 967, 0, + 500, 501, 516, 586, 588, 605, 625, 632, 480, 949, + 950, 951, 952, 953, 954, 955, 956, 300, 600, 633, + 597, 645, 627, 438, 378, 0, 0, 381, 281, 305, + 320, 0, 617, 502, 227, 466, 290, 251, 974, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 396, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 770, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 757, 0, - 0, 0, 270, 762, 0, 0, 0, 366, 267, 0, - 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 769, 370, 0, 0, 497, 401, 0, 0, - 0, 0, 0, 764, 765, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 95, 0, 0, 1016, 952, 741, 918, 956, 1017, - 969, 970, 971, 957, 0, 238, 958, 959, 245, 960, - 0, 917, 800, 802, 801, 867, 868, 869, 870, 871, - 872, 873, 803, 804, 798, 965, 606, 972, 973, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 737, 754, 0, 768, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 751, 752, 1062, 0, 0, - 0, 912, 0, 753, 0, 0, 761, 974, 975, 976, - 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, + 434, 296, 271, 244, 459, 241, 485, 519, 520, 521, + 523, 395, 266, 433, 396, 0, 376, 576, 577, 316, + 0, 0, 0, 528, 0, 777, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 0, 764, + 0, 0, 0, 270, 769, 0, 0, 0, 366, 267, + 0, 0, 204, 505, 0, 430, 0, 203, 0, 487, + 252, 377, 374, 583, 282, 273, 269, 250, 317, 385, + 428, 518, 422, 776, 370, 0, 0, 497, 401, 0, + 0, 0, 0, 0, 0, 0, 0, 771, 772, 0, + 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, + 202, 413, 498, 286, 0, 95, 0, 0, 1023, 507, + 959, 748, 925, 963, 1024, 976, 977, 978, 964, 0, + 238, 965, 966, 245, 967, 0, 924, 807, 809, 808, + 874, 875, 876, 877, 878, 879, 880, 810, 811, 805, + 972, 609, 979, 980, 0, 265, 321, 272, 264, 580, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 229, + 0, 0, 0, 0, 0, 0, 0, 744, 761, 0, + 775, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 758, 759, 1069, 0, 0, 0, 919, 0, 760, + 0, 0, 768, 981, 982, 983, 984, 985, 986, 987, + 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, + 1018, 1019, 1020, 1021, 1022, 770, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, + 0, 453, 918, 0, 0, 629, 0, 0, 916, 0, + 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, + 412, 461, 473, 0, 0, 0, 969, 0, 471, 426, + 604, 233, 284, 458, 432, 469, 440, 287, 0, 0, + 470, 372, 585, 450, 601, 630, 631, 263, 406, 615, + 522, 623, 648, 226, 260, 420, 506, 607, 494, 397, + 581, 582, 329, 493, 295, 201, 369, 636, 224, 479, + 371, 242, 231, 587, 612, 299, 289, 456, 643, 213, + 517, 598, 239, 483, 0, 0, 651, 247, 504, 610, + 599, 215, 594, 503, 393, 326, 327, 214, 0, 457, + 268, 293, 0, 0, 258, 415, 970, 971, 256, 652, + 815, 622, 220, 0, 621, 408, 584, 595, 394, 383, + 219, 593, 392, 382, 334, 823, 824, 280, 307, 900, + 899, 898, 306, 308, 896, 897, 895, 207, 608, 626, + 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, + 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, + 419, 446, 442, 451, 0, 579, 602, 616, 628, 634, + 635, 637, 638, 639, 640, 641, 644, 642, 407, 311, + 495, 333, 373, 0, 0, 425, 472, 240, 606, 496, + 906, 928, 917, 781, 782, 907, 908, 932, 909, 784, + 785, 929, 930, 778, 779, 783, 931, 933, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 649, 508, 514, 509, + 510, 511, 512, 513, 0, 515, 920, 767, 766, 0, + 773, 774, 0, 803, 804, 806, 812, 813, 814, 825, + 872, 873, 881, 883, 884, 882, 885, 886, 887, 890, + 891, 892, 893, 888, 889, 894, 786, 790, 787, 788, + 789, 801, 791, 792, 793, 794, 795, 796, 797, 798, + 799, 800, 802, 943, 944, 945, 946, 947, 948, 818, + 822, 821, 819, 820, 816, 817, 844, 843, 845, 846, + 847, 848, 849, 850, 852, 851, 853, 854, 855, 856, + 857, 858, 826, 827, 830, 831, 829, 828, 832, 841, + 842, 833, 834, 835, 836, 837, 838, 840, 839, 859, + 860, 861, 862, 863, 865, 864, 868, 869, 867, 866, + 871, 870, 765, 196, 221, 368, 0, 454, 288, 650, + 618, 484, 613, 206, 223, 934, 262, 935, 0, 0, + 939, 0, 0, 0, 941, 940, 0, 942, 904, 903, + 0, 0, 936, 937, 0, 938, 0, 0, 198, 200, + 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, + 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, + 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, + 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, + 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, + 492, 500, 501, 516, 586, 588, 605, 625, 632, 480, + 949, 950, 951, 952, 953, 954, 955, 956, 300, 600, + 633, 597, 645, 627, 438, 378, 0, 0, 381, 281, + 305, 320, 0, 617, 502, 227, 466, 290, 251, 974, + 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, + 429, 434, 296, 271, 244, 459, 241, 485, 519, 520, + 521, 523, 395, 266, 433, 396, 0, 376, 576, 577, + 316, 0, 0, 0, 528, 0, 777, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, + 764, 0, 0, 0, 270, 769, 0, 0, 0, 366, + 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, + 487, 252, 377, 374, 583, 282, 273, 269, 250, 317, + 385, 428, 518, 422, 776, 370, 0, 0, 497, 401, + 0, 0, 0, 0, 0, 0, 0, 0, 771, 772, + 0, 0, 0, 0, 0, 0, 0, 0, 323, 248, + 325, 202, 413, 498, 286, 0, 95, 0, 0, 1023, + 507, 959, 748, 925, 963, 1024, 976, 977, 978, 964, + 0, 238, 965, 966, 245, 967, 0, 924, 807, 809, + 808, 874, 875, 876, 877, 878, 879, 880, 810, 811, + 805, 972, 609, 979, 980, 0, 265, 321, 272, 264, + 580, 0, 0, 0, 0, 0, 0, 596, 0, 0, + 229, 0, 0, 0, 0, 0, 0, 0, 744, 761, + 0, 775, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 758, 759, 0, 0, 0, 0, 919, 0, + 760, 0, 0, 768, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 763, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 911, 0, 0, 624, - 0, 0, 909, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 962, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 963, 964, - 256, 647, 808, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 816, 817, 280, - 307, 893, 892, 891, 306, 308, 889, 890, 888, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, + 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, + 1017, 1018, 1019, 1020, 1021, 1022, 770, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 297, 0, 402, + 257, 0, 453, 918, 0, 0, 629, 0, 0, 916, + 0, 0, 0, 0, 365, 0, 330, 197, 225, 0, + 0, 412, 461, 473, 0, 0, 0, 969, 0, 471, + 426, 604, 233, 284, 458, 432, 469, 440, 287, 0, + 0, 470, 372, 585, 450, 601, 630, 631, 263, 406, + 615, 522, 623, 648, 226, 260, 420, 506, 607, 494, + 397, 581, 582, 329, 493, 295, 201, 369, 636, 224, + 479, 371, 242, 231, 587, 612, 299, 289, 456, 643, + 213, 517, 598, 239, 483, 0, 0, 651, 247, 504, + 610, 599, 215, 594, 503, 393, 326, 327, 214, 0, + 457, 268, 293, 0, 0, 258, 415, 970, 971, 256, + 652, 815, 622, 220, 0, 621, 408, 584, 595, 394, + 383, 219, 593, 392, 382, 334, 823, 824, 280, 307, + 900, 899, 898, 306, 308, 896, 897, 895, 207, 608, + 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 899, 921, 910, 774, 775, 900, 901, 925, 902, - 777, 778, 922, 923, 771, 772, 776, 924, 926, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 913, 760, 759, - 0, 766, 767, 0, 796, 797, 799, 805, 806, 807, - 818, 865, 866, 874, 876, 877, 875, 878, 879, 880, - 883, 884, 885, 886, 881, 882, 887, 779, 783, 780, - 781, 782, 794, 784, 785, 786, 787, 788, 789, 790, - 791, 792, 793, 795, 936, 937, 938, 939, 940, 941, - 811, 815, 814, 812, 813, 809, 810, 837, 836, 838, - 839, 840, 841, 842, 843, 845, 844, 846, 847, 848, - 849, 850, 851, 819, 820, 823, 824, 822, 821, 825, - 834, 835, 826, 827, 828, 829, 830, 831, 833, 832, - 852, 853, 854, 855, 856, 858, 857, 861, 862, 860, - 859, 864, 863, 758, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 927, 262, 928, 0, - 0, 932, 0, 0, 0, 934, 933, 0, 935, 897, - 896, 0, 0, 929, 930, 0, 931, 0, 0, 198, + 367, 419, 446, 442, 451, 0, 579, 602, 616, 628, + 634, 635, 637, 638, 639, 640, 641, 644, 642, 407, + 311, 495, 333, 373, 0, 0, 425, 472, 240, 606, + 496, 906, 928, 917, 781, 782, 907, 908, 932, 909, + 784, 785, 929, 930, 778, 779, 783, 931, 933, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 649, 508, 514, + 509, 510, 511, 512, 513, 0, 515, 920, 767, 766, + 0, 773, 774, 0, 803, 804, 806, 812, 813, 814, + 825, 872, 873, 881, 883, 884, 882, 885, 886, 887, + 890, 891, 892, 893, 888, 889, 894, 786, 790, 787, + 788, 789, 801, 791, 792, 793, 794, 795, 796, 797, + 798, 799, 800, 802, 943, 944, 945, 946, 947, 948, + 818, 822, 821, 819, 820, 816, 817, 844, 843, 845, + 846, 847, 848, 849, 850, 852, 851, 853, 854, 855, + 856, 857, 858, 826, 827, 830, 831, 829, 828, 832, + 841, 842, 833, 834, 835, 836, 837, 838, 840, 839, + 859, 860, 861, 862, 863, 865, 864, 868, 869, 867, + 866, 871, 870, 765, 196, 221, 368, 0, 454, 288, + 650, 618, 484, 613, 206, 223, 934, 262, 935, 0, + 0, 939, 0, 0, 0, 941, 940, 0, 942, 904, + 903, 0, 0, 936, 937, 0, 938, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 942, 943, 944, 945, 946, 947, 948, 949, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, - 967, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 770, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 757, 0, 0, 0, 270, 762, 0, 0, 0, 366, - 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 769, 370, 0, 0, 497, 401, - 0, 0, 0, 0, 0, 764, 765, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 95, 0, 0, 1016, 952, 741, 918, - 956, 1017, 969, 970, 971, 957, 0, 238, 958, 959, - 245, 960, 0, 917, 800, 802, 801, 867, 868, 869, - 870, 871, 872, 873, 803, 804, 798, 965, 606, 972, - 973, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 737, 754, 0, 768, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 751, 752, 0, - 0, 0, 0, 912, 0, 753, 0, 0, 761, 974, - 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, + 491, 492, 500, 501, 516, 586, 588, 605, 625, 632, + 480, 949, 950, 951, 952, 953, 954, 955, 956, 300, + 600, 633, 597, 645, 627, 438, 378, 0, 0, 381, + 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, + 974, 0, 211, 246, 230, 259, 274, 277, 324, 391, + 400, 429, 434, 296, 271, 244, 459, 241, 485, 519, + 520, 521, 523, 395, 266, 433, 396, 0, 376, 576, + 577, 316, 0, 0, 0, 528, 0, 777, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, + 0, 764, 0, 0, 0, 270, 769, 0, 0, 0, + 366, 267, 0, 0, 204, 505, 0, 430, 0, 203, + 0, 487, 252, 377, 374, 583, 282, 273, 269, 250, + 317, 385, 428, 518, 422, 776, 370, 0, 0, 497, + 401, 0, 0, 0, 0, 0, 0, 0, 0, 771, + 772, 0, 0, 0, 0, 0, 0, 0, 0, 323, + 248, 325, 202, 413, 498, 286, 0, 95, 0, 0, + 1023, 507, 959, 748, 925, 963, 1024, 976, 977, 978, + 964, 0, 238, 965, 966, 245, 967, 0, 924, 807, + 809, 808, 874, 875, 876, 877, 878, 879, 880, 810, + 811, 805, 972, 609, 979, 980, 0, 265, 321, 272, + 264, 580, 0, 0, 0, 0, 0, 0, 596, 0, + 0, 229, 0, 0, 0, 0, 0, 0, 0, 744, + 761, 0, 775, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 758, 759, 0, 0, 0, 0, 919, + 0, 760, 0, 0, 768, 981, 982, 983, 984, 985, + 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, + 1016, 1017, 1018, 1019, 1020, 1021, 1022, 3171, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, + 402, 257, 0, 453, 918, 0, 0, 629, 0, 0, + 916, 0, 0, 0, 0, 365, 0, 330, 197, 225, + 0, 0, 412, 461, 473, 0, 0, 0, 969, 0, + 471, 426, 604, 233, 284, 458, 432, 469, 440, 287, + 0, 0, 470, 372, 585, 450, 601, 630, 631, 263, + 406, 615, 522, 623, 648, 226, 260, 420, 506, 607, + 494, 397, 581, 582, 329, 493, 295, 201, 369, 636, + 224, 479, 371, 242, 231, 587, 612, 299, 289, 456, + 643, 213, 517, 598, 239, 483, 0, 0, 651, 247, + 504, 610, 599, 215, 594, 503, 393, 326, 327, 214, + 0, 457, 268, 293, 0, 0, 258, 415, 970, 971, + 256, 652, 815, 622, 220, 0, 621, 408, 584, 595, + 394, 383, 219, 593, 392, 382, 334, 823, 824, 280, + 307, 900, 899, 898, 306, 308, 896, 897, 895, 207, + 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, + 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, + 313, 367, 419, 446, 442, 451, 0, 579, 602, 616, + 628, 634, 635, 637, 638, 639, 640, 641, 644, 642, + 407, 311, 495, 333, 373, 0, 0, 425, 472, 240, + 606, 496, 906, 928, 917, 781, 782, 907, 908, 932, + 909, 784, 785, 929, 930, 778, 779, 783, 931, 933, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 649, 508, + 514, 509, 510, 511, 512, 513, 0, 515, 920, 767, + 766, 0, 773, 774, 0, 803, 804, 806, 812, 813, + 814, 825, 872, 873, 881, 883, 884, 882, 885, 886, + 887, 890, 891, 892, 893, 888, 889, 894, 786, 790, + 787, 788, 789, 801, 791, 792, 793, 794, 795, 796, + 797, 798, 799, 800, 802, 943, 944, 945, 946, 947, + 948, 818, 822, 821, 819, 820, 816, 817, 844, 843, + 845, 846, 847, 848, 849, 850, 852, 851, 853, 854, + 855, 856, 857, 858, 826, 827, 830, 831, 829, 828, + 832, 841, 842, 833, 834, 835, 836, 837, 838, 840, + 839, 859, 860, 861, 862, 863, 865, 864, 868, 869, + 867, 866, 871, 870, 765, 196, 221, 368, 0, 454, + 288, 650, 618, 484, 613, 206, 223, 934, 262, 935, + 0, 0, 939, 0, 0, 0, 941, 940, 0, 942, + 904, 903, 0, 0, 936, 937, 0, 938, 0, 0, + 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, + 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, + 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, + 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, + 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, + 490, 491, 492, 500, 501, 516, 586, 588, 605, 625, + 632, 480, 949, 950, 951, 952, 953, 954, 955, 956, + 300, 600, 633, 597, 645, 627, 438, 378, 0, 0, + 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, + 251, 974, 0, 211, 246, 230, 259, 274, 277, 324, + 391, 400, 429, 434, 296, 271, 244, 459, 241, 485, + 519, 520, 521, 523, 395, 266, 433, 396, 0, 376, + 576, 577, 316, 0, 0, 0, 528, 0, 777, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, + 0, 0, 764, 0, 0, 0, 270, 769, 0, 0, + 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, + 203, 0, 487, 252, 377, 374, 583, 282, 273, 269, + 250, 317, 385, 428, 518, 422, 776, 370, 0, 0, + 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, + 771, 772, 0, 0, 0, 0, 0, 0, 0, 0, + 323, 248, 325, 202, 413, 498, 286, 0, 95, 0, + 0, 1023, 507, 959, 748, 925, 963, 1024, 976, 977, + 978, 964, 0, 238, 965, 966, 245, 967, 0, 924, + 807, 809, 808, 874, 875, 876, 877, 878, 879, 880, + 810, 811, 805, 972, 609, 979, 980, 0, 265, 321, + 272, 264, 580, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, + 744, 761, 0, 775, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 758, 759, 0, 0, 0, 0, + 919, 0, 760, 0, 0, 768, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, - 1015, 763, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 911, 0, - 0, 624, 0, 0, 909, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 962, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 963, 964, 256, 647, 808, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 816, - 817, 280, 307, 893, 892, 891, 306, 308, 889, 890, - 888, 207, 605, 0, 208, 0, 499, 607, 648, 452, + 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 3167, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, + 0, 402, 257, 0, 453, 918, 0, 0, 629, 0, + 0, 916, 0, 0, 0, 0, 365, 0, 330, 197, + 225, 0, 0, 412, 461, 473, 0, 0, 0, 969, + 0, 471, 426, 604, 233, 284, 458, 432, 469, 440, + 287, 0, 0, 470, 372, 585, 450, 601, 630, 631, + 263, 406, 615, 522, 623, 648, 226, 260, 420, 506, + 607, 494, 397, 581, 582, 329, 493, 295, 201, 369, + 636, 224, 479, 371, 242, 231, 587, 612, 299, 289, + 456, 643, 213, 517, 598, 239, 483, 0, 0, 651, + 247, 504, 610, 599, 215, 594, 503, 393, 326, 327, + 214, 0, 457, 268, 293, 0, 0, 258, 415, 970, + 971, 256, 652, 815, 622, 220, 0, 621, 408, 584, + 595, 394, 383, 219, 593, 392, 382, 334, 823, 824, + 280, 307, 900, 899, 898, 306, 308, 896, 897, 895, + 207, 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 899, 921, 910, 774, 775, 900, 901, - 925, 902, 777, 778, 922, 923, 771, 772, 776, 924, - 926, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 913, - 760, 759, 0, 766, 767, 0, 796, 797, 799, 805, - 806, 807, 818, 865, 866, 874, 876, 877, 875, 878, - 879, 880, 883, 884, 885, 886, 881, 882, 887, 779, - 783, 780, 781, 782, 794, 784, 785, 786, 787, 788, - 789, 790, 791, 792, 793, 795, 936, 937, 938, 939, - 940, 941, 811, 815, 814, 812, 813, 809, 810, 837, - 836, 838, 839, 840, 841, 842, 843, 845, 844, 846, - 847, 848, 849, 850, 851, 819, 820, 823, 824, 822, - 821, 825, 834, 835, 826, 827, 828, 829, 830, 831, - 833, 832, 852, 853, 854, 855, 856, 858, 857, 861, - 862, 860, 859, 864, 863, 758, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 927, 262, - 928, 0, 0, 932, 0, 0, 0, 934, 933, 0, - 935, 897, 896, 0, 0, 929, 930, 0, 931, 0, + 304, 313, 367, 419, 446, 442, 451, 0, 579, 602, + 616, 628, 634, 635, 637, 638, 639, 640, 641, 644, + 642, 407, 311, 495, 333, 373, 0, 0, 425, 472, + 240, 606, 496, 906, 928, 917, 781, 782, 907, 908, + 932, 909, 784, 785, 929, 930, 778, 779, 783, 931, + 933, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 649, + 508, 514, 509, 510, 511, 512, 513, 0, 515, 920, + 767, 766, 0, 773, 774, 0, 803, 804, 806, 812, + 813, 814, 825, 872, 873, 881, 883, 884, 882, 885, + 886, 887, 890, 891, 892, 893, 888, 889, 894, 786, + 790, 787, 788, 789, 801, 791, 792, 793, 794, 795, + 796, 797, 798, 799, 800, 802, 943, 944, 945, 946, + 947, 948, 818, 822, 821, 819, 820, 816, 817, 844, + 843, 845, 846, 847, 848, 849, 850, 852, 851, 853, + 854, 855, 856, 857, 858, 826, 827, 830, 831, 829, + 828, 832, 841, 842, 833, 834, 835, 836, 837, 838, + 840, 839, 859, 860, 861, 862, 863, 865, 864, 868, + 869, 867, 866, 871, 870, 765, 196, 221, 368, 0, + 454, 288, 650, 618, 484, 613, 206, 223, 934, 262, + 935, 0, 0, 939, 0, 0, 0, 941, 940, 0, + 942, 904, 903, 0, 0, 936, 937, 0, 938, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 942, 943, 944, 945, 946, 947, 948, - 949, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, - 290, 251, 967, 0, 211, 246, 230, 259, 274, 277, + 489, 490, 491, 492, 500, 501, 516, 586, 588, 605, + 625, 632, 480, 949, 950, 951, 952, 953, 954, 955, + 956, 300, 600, 633, 597, 645, 627, 438, 378, 0, + 0, 381, 281, 305, 320, 0, 617, 502, 227, 466, + 290, 251, 974, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 770, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 757, 0, 0, 0, 270, 762, 0, 0, - 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 769, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 764, 765, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 95, 0, 0, 1016, 952, - 741, 918, 956, 1017, 969, 970, 971, 957, 0, 238, - 958, 959, 245, 960, 0, 917, 800, 802, 801, 867, - 868, 869, 870, 871, 872, 873, 803, 804, 798, 965, - 606, 972, 973, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 737, 754, 0, 768, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 751, - 752, 0, 0, 0, 0, 912, 0, 753, 0, 0, - 761, 974, 975, 976, 977, 978, 979, 980, 981, 982, + 485, 519, 520, 521, 523, 395, 266, 433, 396, 0, + 376, 576, 577, 316, 0, 0, 0, 528, 0, 777, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, + 0, 0, 0, 764, 0, 0, 0, 270, 769, 0, + 0, 0, 366, 267, 0, 0, 204, 505, 0, 430, + 0, 203, 0, 487, 252, 377, 374, 583, 282, 273, + 269, 250, 317, 385, 428, 518, 422, 776, 370, 0, + 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, + 0, 771, 772, 0, 0, 0, 0, 0, 0, 0, + 0, 323, 248, 325, 202, 413, 498, 286, 0, 95, + 0, 0, 1023, 507, 959, 1090, 925, 963, 1024, 976, + 977, 978, 964, 0, 238, 965, 966, 245, 967, 0, + 924, 807, 809, 808, 874, 875, 876, 877, 878, 879, + 880, 810, 811, 805, 972, 609, 979, 980, 0, 265, + 321, 272, 264, 580, 0, 0, 0, 0, 0, 0, + 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, + 0, 0, 761, 0, 775, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 758, 759, 0, 0, 0, + 0, 919, 0, 760, 0, 0, 768, 981, 982, 983, + 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, + 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 770, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 297, 0, 402, 257, 0, 453, 918, 0, 0, 629, + 0, 0, 916, 0, 0, 0, 0, 365, 0, 330, + 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, + 969, 0, 471, 426, 604, 233, 284, 458, 432, 469, + 440, 287, 0, 0, 470, 372, 585, 450, 601, 630, + 631, 263, 406, 615, 522, 623, 648, 226, 260, 420, + 506, 607, 494, 397, 581, 582, 329, 493, 295, 201, + 369, 636, 224, 479, 371, 242, 231, 587, 612, 299, + 289, 456, 643, 213, 517, 598, 239, 483, 0, 0, + 651, 247, 504, 610, 599, 215, 594, 503, 393, 326, + 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, + 970, 971, 256, 652, 815, 622, 220, 0, 621, 408, + 584, 595, 394, 383, 219, 593, 392, 382, 334, 823, + 824, 280, 307, 900, 899, 898, 306, 308, 896, 897, + 895, 207, 608, 626, 0, 208, 0, 499, 611, 653, + 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, + 303, 304, 313, 367, 419, 446, 442, 451, 0, 579, + 602, 616, 628, 634, 635, 637, 638, 639, 640, 641, + 644, 642, 407, 311, 495, 333, 373, 0, 0, 425, + 472, 240, 606, 496, 906, 928, 917, 781, 782, 907, + 908, 932, 909, 784, 785, 929, 930, 778, 779, 783, + 931, 933, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 649, 508, 514, 509, 510, 511, 512, 513, 0, 515, + 920, 767, 766, 0, 773, 774, 0, 803, 804, 806, + 812, 813, 814, 825, 872, 873, 881, 883, 884, 882, + 885, 886, 887, 890, 891, 892, 893, 888, 889, 894, + 786, 790, 787, 788, 789, 801, 791, 792, 793, 794, + 795, 796, 797, 798, 799, 800, 802, 943, 944, 945, + 946, 947, 948, 818, 822, 821, 819, 820, 816, 817, + 844, 843, 845, 846, 847, 848, 849, 850, 852, 851, + 853, 854, 855, 856, 857, 858, 826, 827, 830, 831, + 829, 828, 832, 841, 842, 833, 834, 835, 836, 837, + 838, 840, 839, 859, 860, 861, 862, 863, 865, 864, + 868, 869, 867, 866, 871, 870, 765, 196, 221, 368, + 0, 454, 288, 650, 618, 484, 613, 206, 223, 934, + 262, 935, 0, 0, 939, 0, 0, 0, 941, 940, + 0, 942, 904, 903, 0, 0, 936, 937, 0, 938, + 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, + 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, + 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, + 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, + 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, + 488, 489, 490, 491, 492, 500, 501, 516, 586, 588, + 605, 625, 632, 480, 949, 950, 951, 952, 953, 954, + 955, 956, 300, 600, 633, 597, 645, 627, 438, 378, + 0, 0, 381, 281, 305, 320, 0, 617, 502, 227, + 466, 290, 251, 974, 0, 211, 246, 230, 259, 274, + 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, + 241, 485, 519, 520, 521, 523, 395, 266, 433, 396, + 0, 376, 576, 577, 316, 0, 0, 0, 528, 0, + 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 416, 0, 0, 0, 764, 0, 0, 0, 270, 769, + 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, + 430, 0, 203, 0, 487, 252, 377, 374, 583, 282, + 273, 269, 250, 317, 385, 428, 518, 422, 776, 370, + 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, + 0, 0, 771, 772, 0, 0, 0, 0, 0, 0, + 0, 0, 323, 248, 325, 202, 413, 498, 286, 0, + 95, 0, 0, 1023, 507, 959, 1090, 925, 963, 1024, + 976, 977, 978, 964, 0, 238, 965, 966, 245, 967, + 0, 924, 807, 809, 808, 874, 875, 876, 877, 878, + 879, 880, 810, 811, 805, 972, 609, 979, 980, 0, + 265, 321, 272, 264, 580, 0, 0, 0, 0, 0, + 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, + 0, 0, 0, 761, 0, 775, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 758, 759, 0, 0, + 0, 0, 919, 0, 760, 0, 0, 768, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, - 1013, 1014, 1015, 3145, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 911, 0, 0, 624, 0, 0, 909, 0, 0, 0, - 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 962, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 963, 964, 256, 647, 808, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 816, 817, 280, 307, 893, 892, 891, 306, 308, - 889, 890, 888, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, + 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, + 2123, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 297, 0, 402, 257, 0, 453, 918, 0, 0, + 629, 0, 0, 916, 0, 0, 0, 0, 365, 0, + 330, 197, 225, 0, 0, 412, 461, 473, 0, 0, + 0, 969, 0, 471, 426, 604, 233, 284, 458, 432, + 469, 440, 287, 0, 0, 470, 372, 585, 450, 601, + 630, 631, 263, 406, 615, 522, 623, 648, 226, 260, + 420, 506, 607, 494, 397, 581, 582, 329, 493, 295, + 201, 369, 636, 224, 479, 371, 242, 231, 587, 612, + 299, 289, 456, 643, 213, 517, 598, 239, 483, 0, + 0, 651, 247, 504, 610, 599, 215, 594, 503, 393, + 326, 327, 214, 0, 457, 268, 293, 0, 0, 258, + 415, 970, 971, 256, 652, 815, 622, 220, 0, 621, + 408, 584, 595, 394, 383, 219, 593, 392, 382, 334, + 823, 824, 280, 307, 900, 899, 898, 306, 308, 896, + 897, 895, 207, 608, 626, 0, 208, 0, 499, 611, + 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 899, 921, 910, 774, 775, - 900, 901, 925, 902, 777, 778, 922, 923, 771, 772, - 776, 924, 926, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 913, 760, 759, 0, 766, 767, 0, 796, 797, - 799, 805, 806, 807, 818, 865, 866, 874, 876, 877, - 875, 878, 879, 880, 883, 884, 885, 886, 881, 882, - 887, 779, 783, 780, 781, 782, 794, 784, 785, 786, - 787, 788, 789, 790, 791, 792, 793, 795, 936, 937, - 938, 939, 940, 941, 811, 815, 814, 812, 813, 809, - 810, 837, 836, 838, 839, 840, 841, 842, 843, 845, - 844, 846, 847, 848, 849, 850, 851, 819, 820, 823, - 824, 822, 821, 825, 834, 835, 826, 827, 828, 829, - 830, 831, 833, 832, 852, 853, 854, 855, 856, 858, - 857, 861, 862, 860, 859, 864, 863, 758, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, - 927, 262, 928, 0, 0, 932, 0, 0, 0, 934, - 933, 0, 935, 897, 896, 0, 0, 929, 930, 0, - 931, 0, 0, 198, 200, 209, 222, 232, 236, 243, + 579, 602, 616, 628, 634, 635, 637, 638, 639, 640, + 641, 644, 642, 407, 311, 495, 333, 373, 0, 0, + 425, 472, 240, 606, 496, 906, 928, 917, 781, 782, + 907, 908, 932, 909, 784, 785, 929, 930, 778, 779, + 783, 931, 933, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 649, 508, 514, 509, 510, 511, 512, 513, 0, + 515, 920, 767, 766, 0, 773, 774, 0, 803, 804, + 806, 812, 813, 814, 825, 872, 873, 881, 883, 884, + 882, 885, 886, 887, 890, 891, 892, 893, 888, 889, + 894, 786, 790, 787, 788, 789, 801, 791, 792, 793, + 794, 795, 796, 797, 798, 799, 800, 802, 943, 944, + 945, 946, 947, 948, 818, 822, 821, 819, 820, 816, + 817, 844, 843, 845, 846, 847, 848, 849, 850, 852, + 851, 853, 854, 855, 856, 857, 858, 826, 827, 830, + 831, 829, 828, 832, 841, 842, 833, 834, 835, 836, + 837, 838, 840, 839, 859, 860, 861, 862, 863, 865, + 864, 868, 869, 867, 866, 871, 870, 765, 196, 221, + 368, 0, 454, 288, 650, 618, 484, 613, 206, 223, + 934, 262, 935, 0, 0, 939, 0, 0, 0, 941, + 940, 0, 942, 904, 903, 0, 0, 936, 937, 0, + 938, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 942, 943, 944, 945, 946, - 947, 948, 949, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, - 227, 466, 290, 251, 967, 0, 211, 246, 230, 259, + 482, 488, 489, 490, 491, 492, 500, 501, 516, 586, + 588, 605, 625, 632, 480, 949, 950, 951, 952, 953, + 954, 955, 956, 300, 600, 633, 597, 645, 627, 438, + 378, 0, 0, 381, 281, 305, 320, 0, 617, 502, + 227, 466, 290, 251, 974, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, - 770, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 0, 757, 0, 0, 0, 270, 762, - 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 769, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 764, - 765, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 95, 0, 0, - 1016, 952, 741, 918, 956, 1017, 969, 970, 971, 957, - 0, 238, 958, 959, 245, 960, 0, 917, 800, 802, - 801, 867, 868, 869, 870, 871, 872, 873, 803, 804, - 798, 965, 606, 972, 973, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 737, 754, 0, - 768, 0, 0, 0, 275, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 751, 752, 0, 0, 0, 0, 912, 0, 753, - 0, 0, 761, 974, 975, 976, 977, 978, 979, 980, - 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 3141, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 911, 0, 0, 624, 0, 0, 909, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 962, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 0, 0, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 963, 964, 256, 647, 808, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 816, 817, 280, 307, 893, 892, 891, - 306, 308, 889, 890, 888, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, - 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 899, 921, 910, - 774, 775, 900, 901, 925, 902, 777, 778, 922, 923, - 771, 772, 776, 924, 926, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 913, 760, 759, 0, 766, 767, 0, - 796, 797, 799, 805, 806, 807, 818, 865, 866, 874, - 876, 877, 875, 878, 879, 880, 883, 884, 885, 886, - 881, 882, 887, 779, 783, 780, 781, 782, 794, 784, - 785, 786, 787, 788, 789, 790, 791, 792, 793, 795, - 936, 937, 938, 939, 940, 941, 811, 815, 814, 812, - 813, 809, 810, 837, 836, 838, 839, 840, 841, 842, - 843, 845, 844, 846, 847, 848, 849, 850, 851, 819, - 820, 823, 824, 822, 821, 825, 834, 835, 826, 827, - 828, 829, 830, 831, 833, 832, 852, 853, 854, 855, - 856, 858, 857, 861, 862, 860, 859, 864, 863, 758, - 196, 221, 368, 0, 454, 288, 645, 614, 484, 609, - 206, 223, 927, 262, 928, 0, 0, 932, 0, 0, - 0, 934, 933, 0, 935, 897, 896, 0, 0, 929, - 930, 0, 931, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, - 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, - 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, - 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, - 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 942, 943, 944, - 945, 946, 947, 948, 949, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 967, 0, 211, 246, - 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 0, - 527, 0, 770, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 757, 0, 0, 0, - 270, 762, 0, 0, 0, 366, 267, 0, 0, 204, + 459, 241, 485, 519, 520, 521, 523, 395, 266, 433, + 396, 0, 376, 576, 577, 316, 0, 0, 0, 528, + 0, 777, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 416, 0, 0, 0, 764, 0, 0, 0, 270, + 769, 0, 0, 0, 366, 267, 0, 0, 204, 505, + 0, 430, 0, 203, 0, 487, 252, 377, 374, 583, + 282, 273, 269, 250, 317, 385, 428, 518, 422, 776, + 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, + 0, 0, 0, 771, 772, 0, 0, 0, 0, 0, + 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, + 0, 95, 0, 0, 1023, 507, 959, 1090, 925, 963, + 1024, 976, 977, 978, 964, 0, 238, 965, 966, 245, + 967, 0, 924, 807, 809, 808, 874, 875, 876, 877, + 878, 879, 880, 810, 811, 805, 972, 609, 979, 980, + 0, 265, 321, 272, 264, 580, 0, 0, 0, 0, + 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, + 0, 0, 0, 0, 761, 0, 775, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 758, 759, 0, + 0, 0, 0, 919, 0, 760, 0, 0, 768, 981, + 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, + 1022, 2121, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 297, 0, 402, 257, 0, 453, 918, 0, + 0, 629, 0, 0, 916, 0, 0, 0, 0, 365, + 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, + 0, 0, 969, 0, 471, 426, 604, 233, 284, 458, + 432, 469, 440, 287, 0, 0, 470, 372, 585, 450, + 601, 630, 631, 263, 406, 615, 522, 623, 648, 226, + 260, 420, 506, 607, 494, 397, 581, 582, 329, 493, + 295, 201, 369, 636, 224, 479, 371, 242, 231, 587, + 612, 299, 289, 456, 643, 213, 517, 598, 239, 483, + 0, 0, 651, 247, 504, 610, 599, 215, 594, 503, + 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, + 258, 415, 970, 971, 256, 652, 815, 622, 220, 0, + 621, 408, 584, 595, 394, 383, 219, 593, 392, 382, + 334, 823, 824, 280, 307, 900, 899, 898, 306, 308, + 896, 897, 895, 207, 608, 626, 0, 208, 0, 499, + 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, + 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, + 0, 579, 602, 616, 628, 634, 635, 637, 638, 639, + 640, 641, 644, 642, 407, 311, 495, 333, 373, 0, + 0, 425, 472, 240, 606, 496, 906, 928, 917, 781, + 782, 907, 908, 932, 909, 784, 785, 929, 930, 778, + 779, 783, 931, 933, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 649, 508, 514, 509, 510, 511, 512, 513, + 0, 515, 920, 767, 766, 0, 773, 774, 0, 803, + 804, 806, 812, 813, 814, 825, 872, 873, 881, 883, + 884, 882, 885, 886, 887, 890, 891, 892, 893, 888, + 889, 894, 786, 790, 787, 788, 789, 801, 791, 792, + 793, 794, 795, 796, 797, 798, 799, 800, 802, 943, + 944, 945, 946, 947, 948, 818, 822, 821, 819, 820, + 816, 817, 844, 843, 845, 846, 847, 848, 849, 850, + 852, 851, 853, 854, 855, 856, 857, 858, 826, 827, + 830, 831, 829, 828, 832, 841, 842, 833, 834, 835, + 836, 837, 838, 840, 839, 859, 860, 861, 862, 863, + 865, 864, 868, 869, 867, 866, 871, 870, 765, 196, + 221, 368, 0, 454, 288, 650, 618, 484, 613, 206, + 223, 934, 262, 935, 0, 0, 939, 0, 0, 0, + 941, 940, 0, 942, 904, 903, 0, 0, 936, 937, + 0, 938, 0, 0, 198, 200, 209, 222, 232, 236, + 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, + 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, + 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, + 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, + 481, 482, 488, 489, 490, 491, 492, 500, 501, 516, + 586, 588, 605, 625, 632, 480, 949, 950, 951, 952, + 953, 954, 955, 956, 300, 600, 633, 597, 645, 627, + 438, 378, 0, 0, 381, 281, 305, 320, 0, 617, + 502, 227, 466, 290, 251, 974, 0, 211, 246, 230, + 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, + 244, 459, 241, 485, 519, 520, 521, 523, 395, 266, + 433, 396, 0, 376, 576, 577, 316, 0, 0, 0, + 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, + 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 769, 370, 0, 0, 497, 401, 0, 0, 0, 0, - 0, 764, 765, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 95, - 0, 0, 1016, 952, 1083, 918, 956, 1017, 969, 970, - 971, 957, 0, 238, 958, 959, 245, 960, 0, 917, - 800, 802, 801, 867, 868, 869, 870, 871, 872, 873, - 803, 804, 798, 965, 606, 972, 973, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 754, 0, 768, 0, 0, 0, 275, 0, 0, 0, + 583, 282, 273, 269, 250, 317, 385, 428, 518, 422, + 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 751, 752, 0, 0, 0, 0, 912, - 0, 753, 0, 0, 761, 974, 975, 976, 977, 978, - 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 763, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 911, 0, 0, 624, 0, 0, - 909, 0, 0, 0, 0, 365, 0, 330, 197, 225, - 0, 0, 412, 461, 473, 0, 0, 0, 962, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 963, 964, 256, 647, - 808, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 816, 817, 280, 307, 893, - 892, 891, 306, 308, 889, 890, 888, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, - 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 899, - 921, 910, 774, 775, 900, 901, 925, 902, 777, 778, - 922, 923, 771, 772, 776, 924, 926, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 913, 760, 759, 0, 766, - 767, 0, 796, 797, 799, 805, 806, 807, 818, 865, - 866, 874, 876, 877, 875, 878, 879, 880, 883, 884, - 885, 886, 881, 882, 887, 779, 783, 780, 781, 782, - 794, 784, 785, 786, 787, 788, 789, 790, 791, 792, - 793, 795, 936, 937, 938, 939, 940, 941, 811, 815, - 814, 812, 813, 809, 810, 837, 836, 838, 839, 840, - 841, 842, 843, 845, 844, 846, 847, 848, 849, 850, - 851, 819, 820, 823, 824, 822, 821, 825, 834, 835, - 826, 827, 828, 829, 830, 831, 833, 832, 852, 853, - 854, 855, 856, 858, 857, 861, 862, 860, 859, 864, - 863, 758, 196, 221, 368, 0, 454, 288, 645, 614, - 484, 609, 206, 223, 927, 262, 928, 0, 0, 932, - 0, 0, 0, 934, 933, 0, 935, 897, 896, 0, - 0, 929, 930, 0, 931, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, - 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, - 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, - 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, - 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 942, - 943, 944, 945, 946, 947, 948, 949, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 967, 0, - 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 396, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 770, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 757, 0, - 0, 0, 270, 762, 0, 0, 0, 366, 267, 0, - 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 769, 370, 0, 0, 497, 401, 0, 0, - 0, 0, 0, 764, 765, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 95, 0, 0, 1016, 952, 1083, 918, 956, 1017, - 969, 970, 971, 957, 0, 238, 958, 959, 245, 960, - 0, 917, 800, 802, 801, 867, 868, 869, 870, 871, - 872, 873, 803, 804, 798, 965, 606, 972, 973, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 754, 0, 768, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 751, 752, 0, 0, 0, - 0, 912, 0, 753, 0, 0, 761, 974, 975, 976, - 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, - 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 2100, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 911, 0, 0, 624, - 0, 0, 909, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 962, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 963, 964, - 256, 647, 808, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 816, 817, 280, - 307, 893, 892, 891, 306, 308, 889, 890, 888, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, - 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 899, 921, 910, 774, 775, 900, 901, 925, 902, - 777, 778, 922, 923, 771, 772, 776, 924, 926, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 913, 760, 759, - 0, 766, 767, 0, 796, 797, 799, 805, 806, 807, - 818, 865, 866, 874, 876, 877, 875, 878, 879, 880, - 883, 884, 885, 886, 881, 882, 887, 779, 783, 780, - 781, 782, 794, 784, 785, 786, 787, 788, 789, 790, - 791, 792, 793, 795, 936, 937, 938, 939, 940, 941, - 811, 815, 814, 812, 813, 809, 810, 837, 836, 838, - 839, 840, 841, 842, 843, 845, 844, 846, 847, 848, - 849, 850, 851, 819, 820, 823, 824, 822, 821, 825, - 834, 835, 826, 827, 828, 829, 830, 831, 833, 832, - 852, 853, 854, 855, 856, 858, 857, 861, 862, 860, - 859, 864, 863, 758, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 927, 262, 928, 0, - 0, 932, 0, 0, 0, 934, 933, 0, 935, 897, - 896, 0, 0, 929, 930, 0, 931, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, - 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, - 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, - 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, - 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 942, 943, 944, 945, 946, 947, 948, 949, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, - 967, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 770, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 757, 0, 0, 0, 270, 762, 0, 0, 0, 366, - 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 769, 370, 0, 0, 497, 401, - 0, 0, 0, 0, 0, 764, 765, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 95, 0, 0, 1016, 952, 1083, 918, - 956, 1017, 969, 970, 971, 957, 0, 238, 958, 959, - 245, 960, 0, 917, 800, 802, 801, 867, 868, 869, - 870, 871, 872, 873, 803, 804, 798, 965, 606, 972, - 973, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 754, 0, 768, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 751, 752, 0, - 0, 0, 0, 912, 0, 753, 0, 0, 761, 974, - 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, - 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, - 1015, 2098, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 911, 0, - 0, 624, 0, 0, 909, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 962, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 963, 964, 256, 647, 808, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 816, - 817, 280, 307, 893, 892, 891, 306, 308, 889, 890, - 888, 207, 605, 0, 208, 0, 499, 607, 648, 452, - 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 899, 921, 910, 774, 775, 900, 901, - 925, 902, 777, 778, 922, 923, 771, 772, 776, 924, - 926, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 913, - 760, 759, 0, 766, 767, 0, 796, 797, 799, 805, - 806, 807, 818, 865, 866, 874, 876, 877, 875, 878, - 879, 880, 883, 884, 885, 886, 881, 882, 887, 779, - 783, 780, 781, 782, 794, 784, 785, 786, 787, 788, - 789, 790, 791, 792, 793, 795, 936, 937, 938, 939, - 940, 941, 811, 815, 814, 812, 813, 809, 810, 837, - 836, 838, 839, 840, 841, 842, 843, 845, 844, 846, - 847, 848, 849, 850, 851, 819, 820, 823, 824, 822, - 821, 825, 834, 835, 826, 827, 828, 829, 830, 831, - 833, 832, 852, 853, 854, 855, 856, 858, 857, 861, - 862, 860, 859, 864, 863, 758, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 927, 262, - 928, 0, 0, 932, 0, 0, 0, 934, 933, 0, - 935, 897, 896, 0, 0, 929, 930, 0, 931, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, - 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, - 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, - 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, - 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 942, 943, 944, 945, 946, 947, 948, - 949, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, - 290, 251, 967, 0, 211, 246, 230, 259, 274, 277, - 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, - 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 0, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 0, 717, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, - 606, 0, 0, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 1134, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 0, 0, 1133, 624, 0, 0, 0, 0, 0, 1130, - 1131, 365, 1091, 330, 197, 225, 1124, 1128, 412, 461, - 473, 0, 0, 0, 253, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, - 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 199, 0, 0, 0, 0, - 254, 255, 0, 574, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 0, 0, 0, 0, 0, 398, 0, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, - 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 0, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, - 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, - 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, - 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, - 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, - 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, - 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 0, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, - 1697, 952, 0, 0, 1694, 0, 0, 0, 0, 1692, - 0, 238, 1693, 1691, 245, 1696, 0, 917, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 0, 0, 606, 0, 0, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 0, 0, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 0, 0, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, - 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 199, 0, 0, - 0, 0, 254, 255, 0, 574, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 0, 0, 0, 0, 0, 398, 0, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, - 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 0, - 196, 221, 368, 0, 454, 288, 645, 614, 484, 609, - 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, - 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, - 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, - 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, - 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 0, 0, 211, 246, - 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 86, - 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, - 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, - 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 95, - 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, - 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, - 336, 345, 0, 0, 606, 0, 0, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 0, 0, 0, 624, 0, 0, - 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, - 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 588, 589, 256, 647, - 228, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 355, 356, 280, 307, 447, - 375, 448, 306, 308, 404, 403, 405, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, - 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 199, - 0, 0, 0, 0, 254, 255, 0, 574, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 0, 0, 0, 0, 0, - 398, 0, 590, 591, 667, 384, 486, 600, 335, 349, - 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, - 348, 353, 354, 358, 364, 249, 210, 390, 399, 577, - 312, 216, 217, 218, 523, 524, 525, 526, 615, 616, - 620, 205, 462, 463, 464, 465, 292, 610, 309, 468, - 467, 331, 332, 379, 449, 539, 541, 552, 556, 558, - 560, 566, 569, 540, 542, 553, 557, 559, 561, 567, - 570, 529, 531, 533, 535, 548, 547, 544, 572, 573, - 550, 555, 534, 546, 551, 564, 571, 568, 528, 532, - 536, 545, 563, 562, 543, 554, 565, 549, 537, 530, - 538, 0, 196, 221, 368, 94, 454, 288, 645, 614, - 484, 609, 206, 223, 0, 262, 0, 0, 0, 0, - 0, 0, 2403, 0, 0, 2402, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, - 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, - 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, - 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, - 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 301, - 302, 444, 445, 314, 315, 641, 642, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 0, 0, - 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 1759, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 1761, 0, 0, - 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, - 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 0, 370, 0, 0, 497, 401, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 0, 0, 0, 1763, 717, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, - 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, - 357, 363, 336, 345, 0, 0, 606, 0, 0, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 1465, 0, 1466, - 1467, 0, 0, 0, 0, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 0, 0, 0, 624, - 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 253, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 588, 589, - 256, 647, 228, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 355, 356, 280, - 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, - 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 199, 0, 0, 0, 0, 254, 255, 0, 574, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 0, 0, 0, - 0, 0, 398, 0, 590, 591, 667, 384, 486, 600, - 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, - 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, - 399, 577, 312, 216, 217, 218, 523, 524, 525, 526, - 615, 616, 620, 205, 462, 463, 464, 465, 292, 610, - 309, 468, 467, 331, 332, 379, 449, 539, 541, 552, - 556, 558, 560, 566, 569, 540, 542, 553, 557, 559, - 561, 567, 570, 529, 531, 533, 535, 548, 547, 544, - 572, 573, 550, 555, 534, 546, 551, 564, 571, 568, - 528, 532, 536, 545, 563, 562, 543, 554, 565, 549, - 537, 530, 538, 0, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 0, 262, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, - 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, - 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, - 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, - 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 301, 302, 444, 445, 314, 315, 641, 642, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, - 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 86, 527, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, - 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 0, 370, 0, 0, 497, 401, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 95, 0, 1736, 0, 717, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, - 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 0, 0, 606, 0, - 0, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, - 0, 624, 0, 0, 0, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 253, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, - 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, - 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 199, 0, 0, 0, 0, 254, 255, - 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 0, - 0, 0, 0, 0, 398, 0, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, - 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 0, 196, 221, 368, 94, - 454, 288, 645, 614, 484, 609, 206, 223, 0, 262, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, - 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, - 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, - 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, - 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, - 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, - 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, - 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 0, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 95, 0, 0, 0, 194, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, - 606, 0, 0, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, - 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 253, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, - 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 199, 0, 0, 0, 0, - 254, 255, 0, 574, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 0, 0, 0, 0, 0, 398, 0, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, - 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 0, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, - 0, 262, 0, 0, 0, 0, 0, 0, 2403, 0, - 0, 2402, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, - 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, - 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, - 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, - 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, - 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 2350, 0, 0, 0, 0, 270, 0, - 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 0, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, - 1942, 194, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 0, 0, 606, 0, 0, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 0, 0, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 0, 2348, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, - 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 199, 0, 0, - 0, 0, 254, 255, 0, 574, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 0, 0, 0, 0, 0, 398, 0, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, - 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 0, - 196, 221, 368, 0, 454, 288, 645, 614, 484, 609, - 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, - 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, - 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, - 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, - 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 0, 0, 211, 246, - 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 0, - 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, - 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, - 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, - 0, 0, 0, 717, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, - 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, - 336, 345, 0, 0, 606, 0, 0, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 0, 0, 0, 0, 1085, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 0, 0, 0, 624, 0, 0, - 0, 0, 0, 0, 0, 365, 1091, 330, 197, 225, - 1089, 0, 412, 461, 473, 0, 0, 0, 253, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 588, 589, 256, 647, - 228, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 355, 356, 280, 307, 447, - 375, 448, 306, 308, 404, 403, 405, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, - 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 199, - 0, 0, 0, 0, 254, 255, 0, 574, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 0, 0, 0, 0, 0, - 398, 0, 590, 591, 667, 384, 486, 600, 335, 349, - 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, - 348, 353, 354, 358, 364, 249, 210, 390, 399, 577, - 312, 216, 217, 218, 523, 524, 525, 526, 615, 616, - 620, 205, 462, 463, 464, 465, 292, 610, 309, 468, - 467, 331, 332, 379, 449, 539, 541, 552, 556, 558, - 560, 566, 569, 540, 542, 553, 557, 559, 561, 567, - 570, 529, 531, 533, 535, 548, 547, 544, 572, 573, - 550, 555, 534, 546, 551, 564, 571, 568, 528, 532, - 536, 545, 563, 562, 543, 554, 565, 549, 537, 530, - 538, 0, 196, 221, 368, 0, 454, 288, 645, 614, - 484, 609, 206, 223, 0, 262, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, - 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, - 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, - 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, - 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 301, - 302, 444, 445, 314, 315, 641, 642, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 0, 0, - 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 396, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 2350, 0, 0, - 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, - 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 0, 370, 0, 0, 497, 401, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 0, 0, 0, 1942, 194, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, - 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, - 357, 363, 336, 345, 0, 0, 606, 0, 0, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 0, 0, 0, 624, - 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 253, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 588, 589, - 256, 647, 228, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 355, 356, 280, - 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, - 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 199, 0, 0, 0, 0, 254, 255, 0, 574, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 0, 0, 0, - 0, 0, 398, 0, 590, 591, 667, 384, 486, 600, - 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, - 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, - 399, 577, 312, 216, 217, 218, 523, 524, 525, 526, - 615, 616, 620, 205, 462, 463, 464, 465, 292, 610, - 309, 468, 467, 331, 332, 379, 449, 539, 541, 552, - 556, 558, 560, 566, 569, 540, 542, 553, 557, 559, - 561, 567, 570, 529, 531, 533, 535, 548, 547, 544, - 572, 573, 550, 555, 534, 546, 551, 564, 571, 568, - 528, 532, 536, 545, 563, 562, 543, 554, 565, 549, - 537, 530, 538, 0, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 0, 262, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, - 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, - 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, - 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, - 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 301, 302, 444, 445, 314, 315, 641, 642, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, - 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, - 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 0, 370, 0, 0, 497, 401, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 0, 0, 1736, 0, 717, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, - 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 0, 0, 606, 0, - 0, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, - 0, 624, 0, 0, 0, 3701, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 253, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, - 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, - 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 199, 0, 0, 0, 0, 254, 255, - 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 0, - 0, 0, 0, 0, 398, 0, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, - 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 0, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 0, 262, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, - 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, - 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, - 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, - 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, - 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, - 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, - 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 0, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 2109, 717, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, - 606, 0, 0, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2110, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, - 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 253, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, - 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 199, 0, 0, 0, 0, - 254, 255, 0, 574, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 0, 0, 0, 0, 0, 398, 0, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, - 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 0, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, - 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, - 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, - 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, - 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, - 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, - 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 0, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, - 2852, 717, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 0, 0, 606, 0, 0, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2853, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 0, 0, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 0, 0, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, - 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 199, 0, 0, - 0, 0, 254, 255, 0, 574, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 0, 0, 0, 0, 0, 398, 0, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, - 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 0, - 196, 221, 368, 0, 454, 288, 645, 614, 484, 609, - 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, - 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, - 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, - 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, - 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 0, 0, 211, 246, - 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 0, - 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, - 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, - 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, - 0, 0, 0, 717, 0, 0, 0, 0, 2837, 0, - 0, 0, 0, 238, 0, 0, 245, 2838, 0, 0, - 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, - 336, 345, 0, 0, 606, 0, 0, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 0, 0, 0, 624, 0, 0, - 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, - 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 588, 589, 256, 647, - 228, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 355, 356, 280, 307, 447, - 375, 448, 306, 308, 404, 403, 405, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, - 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 199, - 0, 0, 0, 0, 254, 255, 0, 574, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 0, 0, 0, 0, 0, - 398, 0, 590, 591, 667, 384, 486, 600, 335, 349, - 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, - 348, 353, 354, 358, 364, 249, 210, 390, 399, 577, - 312, 216, 217, 218, 523, 524, 525, 526, 615, 616, - 620, 205, 462, 463, 464, 465, 292, 610, 309, 468, - 467, 331, 332, 379, 449, 539, 541, 552, 556, 558, - 560, 566, 569, 540, 542, 553, 557, 559, 561, 567, - 570, 529, 531, 533, 535, 548, 547, 544, 572, 573, - 550, 555, 534, 546, 551, 564, 571, 568, 528, 532, - 536, 545, 563, 562, 543, 554, 565, 549, 537, 530, - 538, 0, 196, 221, 368, 0, 454, 288, 645, 614, - 484, 609, 206, 223, 0, 262, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, - 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, - 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, - 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, - 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 301, - 302, 444, 445, 314, 315, 641, 642, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 0, 0, - 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 396, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, - 0, 0, 270, 1782, 0, 0, 0, 366, 267, 0, - 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 0, 370, 0, 0, 497, 401, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 0, 0, 0, 1781, 717, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, - 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, - 357, 363, 336, 345, 0, 0, 606, 0, 0, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 0, 0, 0, 624, - 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 253, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 588, 589, - 256, 647, 228, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 355, 356, 280, - 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, - 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 199, 0, 0, 0, 0, 254, 255, 0, 574, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 0, 0, 0, - 0, 0, 398, 0, 590, 591, 667, 384, 486, 600, - 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, - 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, - 399, 577, 312, 216, 217, 218, 523, 524, 525, 526, - 615, 616, 620, 205, 462, 463, 464, 465, 292, 610, - 309, 468, 467, 331, 332, 379, 449, 539, 541, 552, - 556, 558, 560, 566, 569, 540, 542, 553, 557, 559, - 561, 567, 570, 529, 531, 533, 535, 548, 547, 544, - 572, 573, 550, 555, 534, 546, 551, 564, 571, 568, - 528, 532, 536, 545, 563, 562, 543, 554, 565, 549, - 537, 530, 538, 0, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 0, 262, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, - 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, - 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, - 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, - 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 301, 302, 444, 445, 314, 315, 641, 642, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, - 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, - 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 0, 370, 0, 0, 497, 401, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 0, 0, 0, 0, 719, 720, 721, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, - 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 0, 0, 606, 0, - 0, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, - 0, 624, 0, 0, 0, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 253, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, - 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, - 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 199, 0, 0, 0, 0, 254, 255, - 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 0, - 0, 0, 0, 0, 398, 0, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, - 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 0, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 0, 262, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, - 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, - 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, - 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, - 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, - 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, - 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, - 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 0, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 0, 717, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, - 606, 0, 0, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 0, 0, 0, 624, 0, 0, 0, 4045, 0, 0, - 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 253, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, - 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 199, 0, 0, 0, 0, - 254, 255, 0, 574, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 0, 0, 0, 0, 0, 398, 0, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, - 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 0, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, - 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, - 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, - 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, - 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, - 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, - 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 0, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, - 1942, 194, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 0, 0, 606, 0, 0, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 0, 0, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 0, 0, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, - 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 199, 0, 0, - 0, 0, 254, 255, 0, 574, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 0, 0, 0, 0, 0, 398, 0, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, - 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 0, - 196, 221, 368, 0, 454, 288, 645, 614, 484, 609, - 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, - 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, - 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, - 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, - 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 0, 0, 211, 246, - 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 0, - 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, - 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, - 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, - 0, 0, 0, 717, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, - 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, - 336, 345, 0, 0, 606, 0, 0, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 0, 0, 0, 624, 0, 0, - 0, 3701, 0, 0, 0, 365, 0, 330, 197, 225, - 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 588, 589, 256, 647, - 228, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 355, 356, 280, 307, 447, - 375, 448, 306, 308, 404, 403, 405, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, - 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 199, - 0, 0, 0, 0, 254, 255, 0, 574, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 0, 0, 0, 0, 0, - 398, 0, 590, 591, 667, 384, 486, 600, 335, 349, - 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, - 348, 353, 354, 358, 364, 249, 210, 390, 399, 577, - 312, 216, 217, 218, 523, 524, 525, 526, 615, 616, - 620, 205, 462, 463, 464, 465, 292, 610, 309, 468, - 467, 331, 332, 379, 449, 539, 541, 552, 556, 558, - 560, 566, 569, 540, 542, 553, 557, 559, 561, 567, - 570, 529, 531, 533, 535, 548, 547, 544, 572, 573, - 550, 555, 534, 546, 551, 564, 571, 568, 528, 532, - 536, 545, 563, 562, 543, 554, 565, 549, 537, 530, - 538, 0, 196, 221, 368, 0, 454, 288, 645, 614, - 484, 609, 206, 223, 0, 262, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, - 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, - 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, - 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, - 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, - 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 301, - 302, 444, 445, 314, 315, 641, 642, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 0, 0, - 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 396, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, - 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, - 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 0, 370, 0, 0, 497, 401, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 95, 0, 0, 0, 717, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, - 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, - 357, 363, 336, 345, 0, 0, 606, 0, 0, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 0, 0, 0, 624, - 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 253, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 588, 589, - 256, 647, 228, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 355, 356, 280, - 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, - 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 199, 0, 0, 0, 0, 254, 255, 0, 574, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 0, 0, 0, - 0, 0, 398, 0, 590, 591, 667, 384, 486, 600, - 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, - 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, - 399, 577, 312, 216, 217, 218, 523, 524, 525, 526, - 615, 616, 620, 205, 462, 463, 464, 465, 292, 610, - 309, 468, 467, 331, 332, 379, 449, 539, 541, 552, - 556, 558, 560, 566, 569, 540, 542, 553, 557, 559, - 561, 567, 570, 529, 531, 533, 535, 548, 547, 544, - 572, 573, 550, 555, 534, 546, 551, 564, 571, 568, - 528, 532, 536, 545, 563, 562, 543, 554, 565, 549, - 537, 530, 538, 0, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 0, 262, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, - 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, - 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, - 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, - 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 301, 302, 444, 445, 314, 315, 641, 642, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, - 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 0, 0, 0, 2404, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, - 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 0, 370, 0, 0, 497, 401, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 0, 0, 0, 0, 194, 0, 0, + 0, 0, 0, 0, 323, 248, 325, 202, 413, 498, + 286, 0, 0, 0, 0, 0, 507, 724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 0, 0, 606, 0, - 0, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, + 344, 350, 357, 363, 336, 345, 0, 0, 609, 0, + 0, 0, 265, 321, 272, 264, 580, 0, 0, 0, + 0, 0, 0, 596, 0, 0, 229, 0, 1141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5749,70 +4417,71 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, - 0, 624, 0, 0, 0, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 253, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, - 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, - 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 199, 0, 0, 0, 0, 254, 255, - 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 0, - 0, 0, 0, 0, 398, 0, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, - 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 0, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 0, 262, + 0, 0, 0, 297, 0, 402, 257, 0, 453, 0, + 0, 1140, 629, 0, 0, 0, 0, 0, 1137, 1138, + 365, 1098, 330, 197, 225, 1131, 1135, 412, 461, 473, + 0, 0, 0, 253, 0, 471, 426, 604, 233, 284, + 458, 432, 469, 440, 287, 0, 0, 470, 372, 585, + 450, 601, 630, 631, 263, 406, 615, 522, 623, 648, + 226, 260, 420, 506, 607, 494, 397, 581, 582, 329, + 493, 295, 201, 369, 636, 224, 479, 371, 242, 231, + 587, 612, 299, 289, 456, 643, 213, 517, 598, 239, + 483, 0, 0, 651, 247, 504, 610, 599, 215, 594, + 503, 393, 326, 327, 214, 0, 457, 268, 293, 0, + 0, 258, 415, 589, 590, 256, 652, 228, 622, 220, + 0, 621, 408, 584, 595, 394, 383, 219, 593, 392, + 382, 334, 355, 356, 280, 307, 447, 375, 448, 306, + 308, 404, 403, 405, 207, 608, 626, 0, 208, 0, + 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, + 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, + 451, 0, 579, 602, 616, 628, 634, 635, 637, 638, + 639, 640, 641, 644, 642, 407, 311, 495, 333, 373, + 0, 0, 425, 472, 240, 606, 496, 199, 0, 0, + 0, 0, 254, 255, 0, 575, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 649, 508, 514, 509, 510, 511, 512, + 513, 0, 515, 0, 0, 0, 0, 0, 398, 0, + 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, + 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, + 354, 358, 364, 249, 210, 390, 399, 578, 312, 216, + 217, 218, 524, 525, 526, 527, 619, 620, 624, 205, + 462, 463, 464, 465, 292, 614, 309, 468, 467, 331, + 332, 379, 449, 540, 542, 553, 557, 559, 561, 567, + 570, 541, 543, 554, 558, 560, 562, 568, 571, 530, + 532, 534, 536, 549, 548, 545, 573, 574, 551, 556, + 535, 547, 552, 565, 572, 569, 529, 533, 537, 546, + 564, 563, 544, 555, 566, 550, 538, 531, 539, 0, + 196, 221, 368, 0, 454, 288, 650, 618, 484, 613, + 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, + 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, + 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, + 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, + 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, + 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, + 516, 586, 588, 605, 625, 632, 480, 301, 302, 444, + 445, 314, 315, 646, 647, 300, 600, 633, 597, 645, + 627, 438, 378, 0, 0, 381, 281, 305, 320, 0, + 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, + 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, + 271, 244, 459, 241, 485, 519, 520, 521, 523, 395, + 266, 433, 396, 0, 376, 576, 577, 316, 0, 0, + 86, 528, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, + 0, 270, 0, 0, 0, 0, 366, 267, 0, 0, + 204, 505, 0, 430, 0, 203, 0, 487, 252, 377, + 374, 583, 282, 273, 269, 250, 317, 385, 428, 518, + 422, 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, - 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, - 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, - 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, - 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, - 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, - 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, - 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 0, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 1763, 717, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, - 606, 0, 0, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, + 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, + 498, 286, 0, 95, 0, 0, 0, 507, 194, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, + 0, 245, 0, 0, 0, 351, 360, 359, 339, 340, + 342, 344, 350, 357, 363, 336, 345, 0, 0, 609, + 0, 0, 0, 265, 321, 272, 264, 580, 0, 0, + 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5823,144 +4492,72 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 253, 0, 471, 426, 601, 233, + 473, 0, 0, 0, 253, 0, 471, 426, 604, 233, 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, - 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 199, 0, 0, 0, 0, - 254, 255, 0, 574, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 0, 0, 0, 0, 0, 398, 0, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, - 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 0, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, - 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, - 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, - 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, - 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, - 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, - 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, - 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, - 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 0, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, - 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 0, 0, 606, 0, 0, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 0, 0, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 0, 0, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, + 585, 450, 601, 630, 631, 263, 406, 615, 522, 623, + 648, 226, 260, 420, 506, 607, 494, 397, 581, 582, + 329, 493, 295, 201, 369, 636, 224, 479, 371, 242, + 231, 587, 612, 299, 289, 456, 643, 213, 517, 598, + 239, 483, 0, 0, 651, 247, 504, 610, 599, 215, + 594, 503, 393, 326, 327, 214, 0, 457, 268, 293, + 0, 0, 258, 415, 589, 590, 256, 652, 228, 622, + 220, 0, 621, 408, 584, 595, 394, 383, 219, 593, 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, - 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 199, 0, 0, - 0, 0, 254, 255, 0, 574, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 0, 0, 0, 0, 0, 398, 0, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, - 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 0, - 196, 221, 368, 2056, 454, 288, 645, 614, 484, 609, - 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, - 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, - 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, - 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, - 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 0, 0, 211, 246, - 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 0, - 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, - 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, - 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, + 306, 308, 404, 403, 405, 207, 608, 626, 0, 208, + 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, + 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, + 442, 451, 0, 579, 602, 616, 628, 634, 635, 637, + 638, 639, 640, 641, 644, 642, 407, 311, 495, 333, + 373, 0, 0, 425, 472, 240, 606, 496, 199, 0, + 0, 0, 0, 254, 255, 0, 575, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 649, 508, 514, 509, 510, 511, + 512, 513, 0, 515, 0, 0, 0, 0, 0, 398, + 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, + 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, + 353, 354, 358, 364, 249, 210, 390, 399, 578, 312, + 216, 217, 218, 524, 525, 526, 527, 619, 620, 624, + 205, 462, 463, 464, 465, 292, 614, 309, 468, 467, + 331, 332, 379, 449, 540, 542, 553, 557, 559, 561, + 567, 570, 541, 543, 554, 558, 560, 562, 568, 571, + 530, 532, 534, 536, 549, 548, 545, 573, 574, 551, + 556, 535, 547, 552, 565, 572, 569, 529, 533, 537, + 546, 564, 563, 544, 555, 566, 550, 538, 531, 539, + 0, 196, 221, 368, 94, 454, 288, 650, 618, 484, + 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, + 0, 2426, 0, 0, 2425, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, + 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, + 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, + 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, + 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, + 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, + 501, 516, 586, 588, 605, 625, 632, 480, 301, 302, + 444, 445, 314, 315, 646, 647, 300, 600, 633, 597, + 645, 627, 438, 378, 0, 0, 381, 281, 305, 320, + 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, + 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, + 296, 271, 244, 459, 241, 485, 519, 520, 521, 523, + 395, 266, 433, 1776, 0, 376, 576, 577, 316, 0, + 0, 0, 528, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 416, 0, 0, 1778, 0, 0, + 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, + 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, + 377, 374, 583, 282, 273, 269, 250, 317, 385, 428, + 518, 422, 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, - 0, 0, 2047, 717, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, - 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, - 336, 345, 0, 0, 606, 0, 0, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 323, 248, 325, 202, + 413, 498, 286, 0, 0, 0, 0, 1780, 507, 724, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, + 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, + 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, + 609, 0, 0, 0, 265, 321, 272, 264, 580, 0, + 0, 0, 0, 0, 0, 596, 0, 0, 229, 0, + 0, 0, 1479, 0, 1480, 1481, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5968,43 +4565,43 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 0, 0, 0, 624, 0, 0, - 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, - 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 588, 589, 256, 647, - 228, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 355, 356, 280, 307, 447, - 375, 448, 306, 308, 404, 403, 405, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, + 0, 0, 0, 0, 0, 297, 0, 402, 257, 0, + 453, 0, 0, 0, 629, 0, 0, 0, 0, 0, + 0, 0, 365, 0, 330, 197, 225, 0, 0, 412, + 461, 473, 0, 0, 0, 253, 0, 471, 426, 604, + 233, 284, 458, 432, 469, 440, 287, 0, 0, 470, + 372, 585, 450, 601, 630, 631, 263, 406, 615, 522, + 623, 648, 226, 260, 420, 506, 607, 494, 397, 581, + 582, 329, 493, 295, 201, 369, 636, 224, 479, 371, + 242, 231, 587, 612, 299, 289, 456, 643, 213, 517, + 598, 239, 483, 0, 0, 651, 247, 504, 610, 599, + 215, 594, 503, 393, 326, 327, 214, 0, 457, 268, + 293, 0, 0, 258, 415, 589, 590, 256, 652, 228, + 622, 220, 0, 621, 408, 584, 595, 394, 383, 219, + 593, 392, 382, 334, 355, 356, 280, 307, 447, 375, + 448, 306, 308, 404, 403, 405, 207, 608, 626, 0, + 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 199, - 0, 0, 0, 0, 254, 255, 0, 574, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 0, 0, 0, 0, 0, - 398, 0, 590, 591, 667, 384, 486, 600, 335, 349, + 446, 442, 451, 0, 579, 602, 616, 628, 634, 635, + 637, 638, 639, 640, 641, 644, 642, 407, 311, 495, + 333, 373, 0, 0, 425, 472, 240, 606, 496, 199, + 0, 0, 0, 0, 254, 255, 0, 575, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 649, 508, 514, 509, 510, + 511, 512, 513, 0, 515, 0, 0, 0, 0, 0, + 398, 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, - 348, 353, 354, 358, 364, 249, 210, 390, 399, 577, - 312, 216, 217, 218, 523, 524, 525, 526, 615, 616, - 620, 205, 462, 463, 464, 465, 292, 610, 309, 468, - 467, 331, 332, 379, 449, 539, 541, 552, 556, 558, - 560, 566, 569, 540, 542, 553, 557, 559, 561, 567, - 570, 529, 531, 533, 535, 548, 547, 544, 572, 573, - 550, 555, 534, 546, 551, 564, 571, 568, 528, 532, - 536, 545, 563, 562, 543, 554, 565, 549, 537, 530, - 538, 0, 196, 221, 368, 0, 454, 288, 645, 614, - 484, 609, 206, 223, 0, 262, 0, 0, 0, 0, + 348, 353, 354, 358, 364, 249, 210, 390, 399, 578, + 312, 216, 217, 218, 524, 525, 526, 527, 619, 620, + 624, 205, 462, 463, 464, 465, 292, 614, 309, 468, + 467, 331, 332, 379, 449, 540, 542, 553, 557, 559, + 561, 567, 570, 541, 543, 554, 558, 560, 562, 568, + 571, 530, 532, 534, 536, 549, 548, 545, 573, 574, + 551, 556, 535, 547, 552, 565, 572, 569, 529, 533, + 537, 546, 564, 563, 544, 555, 566, 550, 538, 531, + 539, 0, 196, 221, 368, 0, 454, 288, 650, 618, + 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, @@ -6012,29 +4609,29 @@ var yyAct = [...]int{ 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 301, - 302, 444, 445, 314, 315, 641, 642, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 0, 0, + 500, 501, 516, 586, 588, 605, 625, 632, 480, 301, + 302, 444, 445, 314, 315, 646, 647, 300, 600, 633, + 597, 645, 627, 438, 378, 0, 0, 381, 281, 305, + 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 396, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, - 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, - 1909, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 0, 370, 0, 0, 497, 401, 0, 0, + 434, 296, 271, 244, 459, 241, 485, 519, 520, 521, + 523, 395, 266, 433, 396, 0, 376, 576, 577, 316, + 0, 0, 86, 528, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, + 0, 0, 0, 270, 0, 0, 0, 0, 366, 267, + 0, 0, 204, 505, 0, 430, 0, 203, 0, 487, + 252, 377, 374, 583, 282, 273, 269, 250, 317, 385, + 428, 518, 422, 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 0, 0, 0, 0, 717, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, - 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, - 357, 363, 336, 345, 0, 0, 606, 0, 0, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, + 202, 413, 498, 286, 0, 95, 0, 1753, 0, 507, + 724, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 238, 0, 0, 245, 0, 0, 0, 351, 360, 359, + 339, 340, 342, 344, 350, 357, 363, 336, 345, 0, + 0, 609, 0, 0, 0, 265, 321, 272, 264, 580, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6042,115 +4639,265 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 0, 0, 0, 624, - 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 253, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 588, 589, - 256, 647, 228, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 355, 356, 280, - 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, + 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, + 0, 453, 0, 0, 0, 629, 0, 0, 0, 0, + 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, + 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, + 604, 233, 284, 458, 432, 469, 440, 287, 0, 0, + 470, 372, 585, 450, 601, 630, 631, 263, 406, 615, + 522, 623, 648, 226, 260, 420, 506, 607, 494, 397, + 581, 582, 329, 493, 295, 201, 369, 636, 224, 479, + 371, 242, 231, 587, 612, 299, 289, 456, 643, 213, + 517, 598, 239, 483, 0, 0, 651, 247, 504, 610, + 599, 215, 594, 503, 393, 326, 327, 214, 0, 457, + 268, 293, 0, 0, 258, 415, 589, 590, 256, 652, + 228, 622, 220, 0, 621, 408, 584, 595, 394, 383, + 219, 593, 392, 382, 334, 355, 356, 280, 307, 447, + 375, 448, 306, 308, 404, 403, 405, 207, 608, 626, + 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, + 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, + 419, 446, 442, 451, 0, 579, 602, 616, 628, 634, + 635, 637, 638, 639, 640, 641, 644, 642, 407, 311, + 495, 333, 373, 0, 0, 425, 472, 240, 606, 496, + 199, 0, 0, 0, 0, 254, 255, 0, 575, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 649, 508, 514, 509, + 510, 511, 512, 513, 0, 515, 0, 0, 0, 0, + 0, 398, 0, 591, 592, 672, 384, 486, 603, 335, + 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, + 347, 348, 353, 354, 358, 364, 249, 210, 390, 399, + 578, 312, 216, 217, 218, 524, 525, 526, 527, 619, + 620, 624, 205, 462, 463, 464, 465, 292, 614, 309, + 468, 467, 331, 332, 379, 449, 540, 542, 553, 557, + 559, 561, 567, 570, 541, 543, 554, 558, 560, 562, + 568, 571, 530, 532, 534, 536, 549, 548, 545, 573, + 574, 551, 556, 535, 547, 552, 565, 572, 569, 529, + 533, 537, 546, 564, 563, 544, 555, 566, 550, 538, + 531, 539, 0, 196, 221, 368, 94, 454, 288, 650, + 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, + 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, + 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, + 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, + 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, + 492, 500, 501, 516, 586, 588, 605, 625, 632, 480, + 301, 302, 444, 445, 314, 315, 646, 647, 300, 600, + 633, 597, 645, 627, 438, 378, 0, 0, 381, 281, + 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, + 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, + 429, 434, 296, 271, 244, 459, 241, 485, 519, 520, + 521, 523, 395, 266, 433, 396, 0, 376, 576, 577, + 316, 0, 0, 0, 528, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, + 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, + 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, + 487, 252, 377, 374, 583, 282, 273, 269, 250, 317, + 385, 428, 518, 422, 0, 370, 0, 0, 497, 401, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 323, 248, + 325, 202, 413, 498, 286, 0, 95, 0, 0, 0, + 507, 194, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, + 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, + 0, 0, 609, 0, 0, 0, 265, 321, 272, 264, + 580, 0, 0, 0, 0, 0, 0, 596, 0, 0, + 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 297, 0, 402, + 257, 0, 453, 0, 0, 0, 629, 0, 0, 0, + 0, 0, 0, 0, 365, 0, 330, 197, 225, 0, + 0, 412, 461, 473, 0, 0, 0, 253, 0, 471, + 426, 604, 233, 284, 458, 432, 469, 440, 287, 0, + 0, 470, 372, 585, 450, 601, 630, 631, 263, 406, + 615, 522, 623, 648, 226, 260, 420, 506, 607, 494, + 397, 581, 582, 329, 493, 295, 201, 369, 636, 224, + 479, 371, 242, 231, 587, 612, 299, 289, 456, 643, + 213, 517, 598, 239, 483, 0, 0, 651, 247, 504, + 610, 599, 215, 594, 503, 393, 326, 327, 214, 0, + 457, 268, 293, 0, 0, 258, 415, 589, 590, 256, + 652, 228, 622, 220, 0, 621, 408, 584, 595, 394, + 383, 219, 593, 392, 382, 334, 355, 356, 280, 307, + 447, 375, 448, 306, 308, 404, 403, 405, 207, 608, + 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 199, 0, 0, 0, 0, 254, 255, 0, 574, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 0, 0, 0, - 0, 0, 398, 0, 590, 591, 667, 384, 486, 600, + 367, 419, 446, 442, 451, 0, 579, 602, 616, 628, + 634, 635, 637, 638, 639, 640, 641, 644, 642, 407, + 311, 495, 333, 373, 0, 0, 425, 472, 240, 606, + 496, 199, 0, 0, 0, 0, 254, 255, 0, 575, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 649, 508, 514, + 509, 510, 511, 512, 513, 0, 515, 0, 0, 0, + 0, 0, 398, 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, - 399, 577, 312, 216, 217, 218, 523, 524, 525, 526, - 615, 616, 620, 205, 462, 463, 464, 465, 292, 610, - 309, 468, 467, 331, 332, 379, 449, 539, 541, 552, - 556, 558, 560, 566, 569, 540, 542, 553, 557, 559, - 561, 567, 570, 529, 531, 533, 535, 548, 547, 544, - 572, 573, 550, 555, 534, 546, 551, 564, 571, 568, - 528, 532, 536, 545, 563, 562, 543, 554, 565, 549, - 537, 530, 538, 0, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 0, 262, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 399, 578, 312, 216, 217, 218, 524, 525, 526, 527, + 619, 620, 624, 205, 462, 463, 464, 465, 292, 614, + 309, 468, 467, 331, 332, 379, 449, 540, 542, 553, + 557, 559, 561, 567, 570, 541, 543, 554, 558, 560, + 562, 568, 571, 530, 532, 534, 536, 549, 548, 545, + 573, 574, 551, 556, 535, 547, 552, 565, 572, 569, + 529, 533, 537, 546, 564, 563, 544, 555, 566, 550, + 538, 531, 539, 0, 196, 221, 368, 0, 454, 288, + 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, + 0, 0, 0, 0, 2426, 0, 0, 2425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 301, 302, 444, 445, 314, 315, 641, 642, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, + 491, 492, 500, 501, 516, 586, 588, 605, 625, 632, + 480, 301, 302, 444, 445, 314, 315, 646, 647, 300, + 600, 633, 597, 645, 627, 438, 378, 0, 0, 381, + 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, - 267, 0, 1907, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 0, 370, 0, 0, 497, 401, + 400, 429, 434, 296, 271, 244, 459, 241, 485, 519, + 520, 521, 523, 395, 266, 433, 396, 0, 376, 576, + 577, 316, 0, 0, 0, 528, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, + 2373, 0, 0, 0, 0, 270, 0, 0, 0, 0, + 366, 267, 0, 0, 204, 505, 0, 430, 0, 203, + 0, 487, 252, 377, 374, 583, 282, 273, 269, 250, + 317, 385, 428, 518, 422, 0, 370, 0, 0, 497, + 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, + 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, + 1961, 507, 194, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 238, 0, 0, 245, 0, 0, 0, 351, + 360, 359, 339, 340, 342, 344, 350, 357, 363, 336, + 345, 0, 0, 609, 0, 0, 0, 265, 321, 272, + 264, 580, 0, 0, 0, 0, 0, 0, 596, 0, + 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 0, 0, 0, 0, 717, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, - 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 0, 0, 606, 0, - 0, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, + 402, 257, 0, 453, 0, 0, 0, 629, 0, 0, + 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, + 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, + 471, 426, 604, 233, 284, 458, 432, 469, 440, 287, + 0, 2371, 470, 372, 585, 450, 601, 630, 631, 263, + 406, 615, 522, 623, 648, 226, 260, 420, 506, 607, + 494, 397, 581, 582, 329, 493, 295, 201, 369, 636, + 224, 479, 371, 242, 231, 587, 612, 299, 289, 456, + 643, 213, 517, 598, 239, 483, 0, 0, 651, 247, + 504, 610, 599, 215, 594, 503, 393, 326, 327, 214, + 0, 457, 268, 293, 0, 0, 258, 415, 589, 590, + 256, 652, 228, 622, 220, 0, 621, 408, 584, 595, + 394, 383, 219, 593, 392, 382, 334, 355, 356, 280, + 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, + 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, + 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, + 313, 367, 419, 446, 442, 451, 0, 579, 602, 616, + 628, 634, 635, 637, 638, 639, 640, 641, 644, 642, + 407, 311, 495, 333, 373, 0, 0, 425, 472, 240, + 606, 496, 199, 0, 0, 0, 0, 254, 255, 0, + 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 649, 508, + 514, 509, 510, 511, 512, 513, 0, 515, 0, 0, + 0, 0, 0, 398, 0, 591, 592, 672, 384, 486, + 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, + 343, 346, 347, 348, 353, 354, 358, 364, 249, 210, + 390, 399, 578, 312, 216, 217, 218, 524, 525, 526, + 527, 619, 620, 624, 205, 462, 463, 464, 465, 292, + 614, 309, 468, 467, 331, 332, 379, 449, 540, 542, + 553, 557, 559, 561, 567, 570, 541, 543, 554, 558, + 560, 562, 568, 571, 530, 532, 534, 536, 549, 548, + 545, 573, 574, 551, 556, 535, 547, 552, 565, 572, + 569, 529, 533, 537, 546, 564, 563, 544, 555, 566, + 550, 538, 531, 539, 0, 196, 221, 368, 0, 454, + 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, + 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, + 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, + 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, + 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, + 490, 491, 492, 500, 501, 516, 586, 588, 605, 625, + 632, 480, 301, 302, 444, 445, 314, 315, 646, 647, + 300, 600, 633, 597, 645, 627, 438, 378, 0, 0, + 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, + 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, + 391, 400, 429, 434, 296, 271, 244, 459, 241, 485, + 519, 520, 521, 523, 395, 266, 433, 396, 0, 376, + 576, 577, 316, 0, 0, 0, 528, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, + 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, + 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, + 203, 0, 487, 252, 377, 374, 583, 282, 273, 269, + 250, 317, 385, 428, 518, 422, 0, 370, 0, 0, + 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 323, 248, 325, 202, 413, 498, 286, 0, 0, 0, + 0, 0, 507, 724, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, + 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, + 336, 345, 0, 0, 609, 0, 0, 0, 265, 321, + 272, 264, 580, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 0, 0, 1092, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, - 0, 624, 0, 0, 0, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 253, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, - 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, + 0, 402, 257, 0, 453, 0, 0, 0, 629, 0, + 0, 0, 0, 0, 0, 0, 365, 1098, 330, 197, + 225, 1096, 0, 412, 461, 473, 0, 0, 0, 253, + 0, 471, 426, 604, 233, 284, 458, 432, 469, 440, + 287, 0, 0, 470, 372, 585, 450, 601, 630, 631, + 263, 406, 615, 522, 623, 648, 226, 260, 420, 506, + 607, 494, 397, 581, 582, 329, 493, 295, 201, 369, + 636, 224, 479, 371, 242, 231, 587, 612, 299, 289, + 456, 643, 213, 517, 598, 239, 483, 0, 0, 651, + 247, 504, 610, 599, 215, 594, 503, 393, 326, 327, + 214, 0, 457, 268, 293, 0, 0, 258, 415, 589, + 590, 256, 652, 228, 622, 220, 0, 621, 408, 584, + 595, 394, 383, 219, 593, 392, 382, 334, 355, 356, + 280, 307, 447, 375, 448, 306, 308, 404, 403, 405, + 207, 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 199, 0, 0, 0, 0, 254, 255, - 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 0, - 0, 0, 0, 0, 398, 0, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, + 304, 313, 367, 419, 446, 442, 451, 0, 579, 602, + 616, 628, 634, 635, 637, 638, 639, 640, 641, 644, + 642, 407, 311, 495, 333, 373, 0, 0, 425, 472, + 240, 606, 496, 199, 0, 0, 0, 0, 254, 255, + 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 649, + 508, 514, 509, 510, 511, 512, 513, 0, 515, 0, + 0, 0, 0, 0, 398, 0, 591, 592, 672, 384, + 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 0, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 0, 262, + 210, 390, 399, 578, 312, 216, 217, 218, 524, 525, + 526, 527, 619, 620, 624, 205, 462, 463, 464, 465, + 292, 614, 309, 468, 467, 331, 332, 379, 449, 540, + 542, 553, 557, 559, 561, 567, 570, 541, 543, 554, + 558, 560, 562, 568, 571, 530, 532, 534, 536, 549, + 548, 545, 573, 574, 551, 556, 535, 547, 552, 565, + 572, 569, 529, 533, 537, 546, 564, 563, 544, 555, + 566, 550, 538, 531, 539, 0, 196, 221, 368, 0, + 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, @@ -6158,29 +4905,29 @@ var yyAct = [...]int{ 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, + 489, 490, 491, 492, 500, 501, 516, 586, 588, 605, + 625, 632, 480, 301, 302, 444, 445, 314, 315, 646, + 647, 300, 600, 633, 597, 645, 627, 438, 378, 0, + 0, 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, - 0, 366, 267, 0, 1905, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 0, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 0, 717, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, - 606, 0, 0, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, + 485, 519, 520, 521, 523, 395, 266, 433, 396, 0, + 376, 576, 577, 316, 0, 0, 0, 528, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, + 0, 0, 2373, 0, 0, 0, 0, 270, 0, 0, + 0, 0, 366, 267, 0, 0, 204, 505, 0, 430, + 0, 203, 0, 487, 252, 377, 374, 583, 282, 273, + 269, 250, 317, 385, 428, 518, 422, 0, 370, 0, + 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, + 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, + 0, 0, 1961, 507, 194, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, + 0, 351, 360, 359, 339, 340, 342, 344, 350, 357, + 363, 336, 345, 0, 0, 609, 0, 0, 0, 265, + 321, 272, 264, 580, 0, 0, 0, 0, 0, 0, + 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6188,42 +4935,117 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, - 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 253, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 297, 0, 402, 257, 0, 453, 0, 0, 0, 629, + 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, + 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, + 253, 0, 471, 426, 604, 233, 284, 458, 432, 469, + 440, 287, 0, 0, 470, 372, 585, 450, 601, 630, + 631, 263, 406, 615, 522, 623, 648, 226, 260, 420, + 506, 607, 494, 397, 581, 582, 329, 493, 295, 201, + 369, 636, 224, 479, 371, 242, 231, 587, 612, 299, + 289, 456, 643, 213, 517, 598, 239, 483, 0, 0, + 651, 247, 504, 610, 599, 215, 594, 503, 393, 326, + 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, + 589, 590, 256, 652, 228, 622, 220, 0, 621, 408, + 584, 595, 394, 383, 219, 593, 392, 382, 334, 355, + 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, + 405, 207, 608, 626, 0, 208, 0, 499, 611, 653, + 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, + 303, 304, 313, 367, 419, 446, 442, 451, 0, 579, + 602, 616, 628, 634, 635, 637, 638, 639, 640, 641, + 644, 642, 407, 311, 495, 333, 373, 0, 0, 425, + 472, 240, 606, 496, 199, 0, 0, 0, 0, 254, + 255, 0, 575, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 649, 508, 514, 509, 510, 511, 512, 513, 0, 515, + 0, 0, 0, 0, 0, 398, 0, 591, 592, 672, + 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, + 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, + 249, 210, 390, 399, 578, 312, 216, 217, 218, 524, + 525, 526, 527, 619, 620, 624, 205, 462, 463, 464, + 465, 292, 614, 309, 468, 467, 331, 332, 379, 449, + 540, 542, 553, 557, 559, 561, 567, 570, 541, 543, + 554, 558, 560, 562, 568, 571, 530, 532, 534, 536, + 549, 548, 545, 573, 574, 551, 556, 535, 547, 552, + 565, 572, 569, 529, 533, 537, 546, 564, 563, 544, + 555, 566, 550, 538, 531, 539, 0, 196, 221, 368, + 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, + 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, + 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, + 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, + 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, + 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, + 488, 489, 490, 491, 492, 500, 501, 516, 586, 588, + 605, 625, 632, 480, 301, 302, 444, 445, 314, 315, + 646, 647, 300, 600, 633, 597, 645, 627, 438, 378, + 0, 0, 381, 281, 305, 320, 0, 617, 502, 227, + 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, + 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, + 241, 485, 519, 520, 521, 523, 395, 266, 433, 396, + 0, 376, 576, 577, 316, 0, 0, 0, 528, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, + 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, + 430, 0, 203, 0, 487, 252, 377, 374, 583, 282, + 273, 269, 250, 317, 385, 428, 518, 422, 0, 370, + 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 323, 248, 325, 202, 413, 498, 286, 0, + 0, 0, 1753, 0, 507, 724, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, + 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, + 357, 363, 336, 345, 0, 0, 609, 0, 0, 0, + 265, 321, 272, 264, 580, 0, 0, 0, 0, 0, + 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 297, 0, 402, 257, 0, 453, 0, 0, 0, + 629, 0, 0, 0, 3726, 0, 0, 0, 365, 0, + 330, 197, 225, 0, 0, 412, 461, 473, 0, 0, + 0, 253, 0, 471, 426, 604, 233, 284, 458, 432, + 469, 440, 287, 0, 0, 470, 372, 585, 450, 601, + 630, 631, 263, 406, 615, 522, 623, 648, 226, 260, + 420, 506, 607, 494, 397, 581, 582, 329, 493, 295, + 201, 369, 636, 224, 479, 371, 242, 231, 587, 612, + 299, 289, 456, 643, 213, 517, 598, 239, 483, 0, + 0, 651, 247, 504, 610, 599, 215, 594, 503, 393, + 326, 327, 214, 0, 457, 268, 293, 0, 0, 258, + 415, 589, 590, 256, 652, 228, 622, 220, 0, 621, + 408, 584, 595, 394, 383, 219, 593, 392, 382, 334, + 355, 356, 280, 307, 447, 375, 448, 306, 308, 404, + 403, 405, 207, 608, 626, 0, 208, 0, 499, 611, + 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 199, 0, 0, 0, 0, - 254, 255, 0, 574, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 0, 0, 0, 0, 0, 398, 0, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, + 579, 602, 616, 628, 634, 635, 637, 638, 639, 640, + 641, 644, 642, 407, 311, 495, 333, 373, 0, 0, + 425, 472, 240, 606, 496, 199, 0, 0, 0, 0, + 254, 255, 0, 575, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 649, 508, 514, 509, 510, 511, 512, 513, 0, + 515, 0, 0, 0, 0, 0, 398, 0, 591, 592, + 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 0, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, + 364, 249, 210, 390, 399, 578, 312, 216, 217, 218, + 524, 525, 526, 527, 619, 620, 624, 205, 462, 463, + 464, 465, 292, 614, 309, 468, 467, 331, 332, 379, + 449, 540, 542, 553, 557, 559, 561, 567, 570, 541, + 543, 554, 558, 560, 562, 568, 571, 530, 532, 534, + 536, 549, 548, 545, 573, 574, 551, 556, 535, 547, + 552, 565, 572, 569, 529, 533, 537, 546, 564, 563, + 544, 555, 566, 550, 538, 531, 539, 0, 196, 221, + 368, 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, @@ -6231,102 +5053,252 @@ var yyAct = [...]int{ 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, + 482, 488, 489, 490, 491, 492, 500, 501, 516, 586, + 588, 605, 625, 632, 480, 301, 302, 444, 445, 314, + 315, 646, 647, 300, 600, 633, 597, 645, 627, 438, + 378, 0, 0, 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, + 459, 241, 485, 519, 520, 521, 523, 395, 266, 433, + 396, 0, 376, 576, 577, 316, 0, 0, 0, 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, - 0, 0, 0, 366, 267, 0, 1903, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 0, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, - 0, 717, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 0, 0, 606, 0, 0, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, + 0, 416, 0, 0, 0, 0, 0, 0, 0, 270, + 0, 0, 0, 0, 366, 267, 0, 0, 204, 505, + 0, 430, 0, 203, 0, 487, 252, 377, 374, 583, + 282, 273, 269, 250, 317, 385, 428, 518, 422, 0, + 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, + 0, 0, 0, 0, 2132, 507, 724, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, + 0, 0, 0, 351, 360, 359, 339, 340, 342, 344, + 350, 357, 363, 336, 345, 0, 0, 609, 0, 0, + 0, 265, 321, 272, 264, 580, 0, 0, 0, 0, + 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 0, 0, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 0, 0, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, + 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, + 0, 629, 0, 0, 0, 0, 0, 0, 0, 365, + 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, + 0, 0, 253, 0, 471, 426, 604, 233, 284, 458, + 432, 469, 440, 287, 0, 0, 470, 372, 585, 450, + 601, 630, 631, 263, 406, 615, 522, 623, 648, 226, + 260, 420, 506, 607, 494, 397, 581, 582, 329, 493, + 295, 201, 369, 636, 224, 479, 371, 242, 231, 587, + 612, 299, 289, 456, 643, 213, 517, 598, 239, 483, + 0, 0, 651, 247, 504, 610, 599, 215, 594, 503, + 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, + 258, 415, 589, 590, 256, 652, 228, 622, 220, 0, + 621, 408, 584, 595, 394, 383, 219, 593, 392, 382, + 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, + 404, 403, 405, 207, 608, 626, 0, 208, 0, 499, + 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, + 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, + 0, 579, 602, 616, 628, 634, 635, 637, 638, 639, + 640, 641, 644, 642, 407, 311, 495, 333, 373, 0, + 0, 425, 472, 240, 606, 496, 199, 0, 0, 0, + 0, 254, 255, 0, 575, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 649, 508, 514, 509, 510, 511, 512, 513, + 0, 515, 0, 0, 0, 0, 0, 398, 0, 591, + 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, + 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, + 358, 364, 249, 210, 390, 399, 578, 312, 216, 217, + 218, 524, 525, 526, 527, 619, 620, 624, 205, 462, + 463, 464, 465, 292, 614, 309, 468, 467, 331, 332, + 379, 449, 540, 542, 553, 557, 559, 561, 567, 570, + 541, 543, 554, 558, 560, 562, 568, 571, 530, 532, + 534, 536, 549, 548, 545, 573, 574, 551, 556, 535, + 547, 552, 565, 572, 569, 529, 533, 537, 546, 564, + 563, 544, 555, 566, 550, 538, 531, 539, 0, 196, + 221, 368, 0, 454, 288, 650, 618, 484, 613, 206, + 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, + 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, + 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, + 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, + 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, + 481, 482, 488, 489, 490, 491, 492, 500, 501, 516, + 586, 588, 605, 625, 632, 480, 301, 302, 444, 445, + 314, 315, 646, 647, 300, 600, 633, 597, 645, 627, + 438, 378, 0, 0, 381, 281, 305, 320, 0, 617, + 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, + 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, + 244, 459, 241, 485, 519, 520, 521, 523, 395, 266, + 433, 396, 0, 376, 576, 577, 316, 0, 0, 0, + 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, + 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, + 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, + 583, 282, 273, 269, 250, 317, 385, 428, 518, 422, + 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 323, 248, 325, 202, 413, 498, + 286, 0, 0, 0, 0, 2879, 507, 724, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, + 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, + 344, 350, 357, 363, 336, 345, 0, 0, 609, 0, + 0, 0, 265, 321, 272, 264, 580, 0, 0, 0, + 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2880, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 297, 0, 402, 257, 0, 453, 0, + 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, + 365, 0, 330, 197, 225, 0, 0, 412, 461, 473, + 0, 0, 0, 253, 0, 471, 426, 604, 233, 284, + 458, 432, 469, 440, 287, 0, 0, 470, 372, 585, + 450, 601, 630, 631, 263, 406, 615, 522, 623, 648, + 226, 260, 420, 506, 607, 494, 397, 581, 582, 329, + 493, 295, 201, 369, 636, 224, 479, 371, 242, 231, + 587, 612, 299, 289, 456, 643, 213, 517, 598, 239, + 483, 0, 0, 651, 247, 504, 610, 599, 215, 594, + 503, 393, 326, 327, 214, 0, 457, 268, 293, 0, + 0, 258, 415, 589, 590, 256, 652, 228, 622, 220, + 0, 621, 408, 584, 595, 394, 383, 219, 593, 392, + 382, 334, 355, 356, 280, 307, 447, 375, 448, 306, + 308, 404, 403, 405, 207, 608, 626, 0, 208, 0, + 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 199, 0, 0, - 0, 0, 254, 255, 0, 574, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 0, 0, 0, 0, 0, 398, 0, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, + 451, 0, 579, 602, 616, 628, 634, 635, 637, 638, + 639, 640, 641, 644, 642, 407, 311, 495, 333, 373, + 0, 0, 425, 472, 240, 606, 496, 199, 0, 0, + 0, 0, 254, 255, 0, 575, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 649, 508, 514, 509, 510, 511, 512, + 513, 0, 515, 0, 0, 0, 0, 0, 398, 0, + 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 0, - 196, 221, 368, 0, 454, 288, 645, 614, 484, 609, + 354, 358, 364, 249, 210, 390, 399, 578, 312, 216, + 217, 218, 524, 525, 526, 527, 619, 620, 624, 205, + 462, 463, 464, 465, 292, 614, 309, 468, 467, 331, + 332, 379, 449, 540, 542, 553, 557, 559, 561, 567, + 570, 541, 543, 554, 558, 560, 562, 568, 571, 530, + 532, 534, 536, 549, 548, 545, 573, 574, 551, 556, + 535, 547, 552, 565, 572, 569, 529, 533, 537, 546, + 564, 563, 544, 555, 566, 550, 538, 531, 539, 0, + 196, 221, 368, 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, - 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, - 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, - 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, - 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, - 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 0, 0, 211, 246, - 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 0, - 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, - 270, 0, 0, 0, 0, 366, 267, 0, 1901, 204, - 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, + 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, + 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, + 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, + 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, + 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, + 516, 586, 588, 605, 625, 632, 480, 301, 302, 444, + 445, 314, 315, 646, 647, 300, 600, 633, 597, 645, + 627, 438, 378, 0, 0, 381, 281, 305, 320, 0, + 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, + 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, + 271, 244, 459, 241, 485, 519, 520, 521, 523, 395, + 266, 433, 396, 0, 376, 576, 577, 316, 0, 0, + 0, 528, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, + 0, 270, 0, 0, 0, 0, 366, 267, 0, 0, + 204, 505, 0, 430, 0, 203, 0, 487, 252, 377, + 374, 583, 282, 273, 269, 250, 317, 385, 428, 518, + 422, 0, 370, 0, 0, 497, 401, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, + 498, 286, 0, 0, 0, 0, 0, 507, 724, 0, + 0, 0, 0, 2864, 0, 0, 0, 0, 238, 0, + 0, 245, 2865, 0, 0, 351, 360, 359, 339, 340, + 342, 344, 350, 357, 363, 336, 345, 0, 0, 609, + 0, 0, 0, 265, 321, 272, 264, 580, 0, 0, + 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, + 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, + 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, + 473, 0, 0, 0, 253, 0, 471, 426, 604, 233, + 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, + 585, 450, 601, 630, 631, 263, 406, 615, 522, 623, + 648, 226, 260, 420, 506, 607, 494, 397, 581, 582, + 329, 493, 295, 201, 369, 636, 224, 479, 371, 242, + 231, 587, 612, 299, 289, 456, 643, 213, 517, 598, + 239, 483, 0, 0, 651, 247, 504, 610, 599, 215, + 594, 503, 393, 326, 327, 214, 0, 457, 268, 293, + 0, 0, 258, 415, 589, 590, 256, 652, 228, 622, + 220, 0, 621, 408, 584, 595, 394, 383, 219, 593, + 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, + 306, 308, 404, 403, 405, 207, 608, 626, 0, 208, + 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, + 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, + 442, 451, 0, 579, 602, 616, 628, 634, 635, 637, + 638, 639, 640, 641, 644, 642, 407, 311, 495, 333, + 373, 0, 0, 425, 472, 240, 606, 496, 199, 0, + 0, 0, 0, 254, 255, 0, 575, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 649, 508, 514, 509, 510, 511, + 512, 513, 0, 515, 0, 0, 0, 0, 0, 398, + 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, + 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, + 353, 354, 358, 364, 249, 210, 390, 399, 578, 312, + 216, 217, 218, 524, 525, 526, 527, 619, 620, 624, + 205, 462, 463, 464, 465, 292, 614, 309, 468, 467, + 331, 332, 379, 449, 540, 542, 553, 557, 559, 561, + 567, 570, 541, 543, 554, 558, 560, 562, 568, 571, + 530, 532, 534, 536, 549, 548, 545, 573, 574, 551, + 556, 535, 547, 552, 565, 572, 569, 529, 533, 537, + 546, 564, 563, 544, 555, 566, 550, 538, 531, 539, + 0, 196, 221, 368, 0, 454, 288, 650, 618, 484, + 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, + 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, + 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, + 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, + 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, + 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, + 501, 516, 586, 588, 605, 625, 632, 480, 301, 302, + 444, 445, 314, 315, 646, 647, 300, 600, 633, 597, + 645, 627, 438, 378, 0, 0, 381, 281, 305, 320, + 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, + 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, + 296, 271, 244, 459, 241, 485, 519, 520, 521, 523, + 395, 266, 433, 396, 0, 376, 576, 577, 316, 0, + 0, 0, 528, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, + 0, 0, 270, 1799, 0, 0, 0, 366, 267, 0, + 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, + 377, 374, 583, 282, 273, 269, 250, 317, 385, 428, + 518, 422, 0, 370, 0, 0, 497, 401, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 323, 248, 325, 202, + 413, 498, 286, 0, 0, 0, 0, 1798, 507, 724, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, + 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, + 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, + 609, 0, 0, 0, 265, 321, 272, 264, 580, 0, + 0, 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, - 0, 0, 0, 717, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, - 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, - 336, 345, 0, 0, 606, 0, 0, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6334,43 +5306,43 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 0, 0, 0, 624, 0, 0, - 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, - 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 588, 589, 256, 647, - 228, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 355, 356, 280, 307, 447, - 375, 448, 306, 308, 404, 403, 405, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, + 0, 0, 0, 0, 0, 297, 0, 402, 257, 0, + 453, 0, 0, 0, 629, 0, 0, 0, 0, 0, + 0, 0, 365, 0, 330, 197, 225, 0, 0, 412, + 461, 473, 0, 0, 0, 253, 0, 471, 426, 604, + 233, 284, 458, 432, 469, 440, 287, 0, 0, 470, + 372, 585, 450, 601, 630, 631, 263, 406, 615, 522, + 623, 648, 226, 260, 420, 506, 607, 494, 397, 581, + 582, 329, 493, 295, 201, 369, 636, 224, 479, 371, + 242, 231, 587, 612, 299, 289, 456, 643, 213, 517, + 598, 239, 483, 0, 0, 651, 247, 504, 610, 599, + 215, 594, 503, 393, 326, 327, 214, 0, 457, 268, + 293, 0, 0, 258, 415, 589, 590, 256, 652, 228, + 622, 220, 0, 621, 408, 584, 595, 394, 383, 219, + 593, 392, 382, 334, 355, 356, 280, 307, 447, 375, + 448, 306, 308, 404, 403, 405, 207, 608, 626, 0, + 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 199, - 0, 0, 0, 0, 254, 255, 0, 574, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 0, 0, 0, 0, 0, - 398, 0, 590, 591, 667, 384, 486, 600, 335, 349, + 446, 442, 451, 0, 579, 602, 616, 628, 634, 635, + 637, 638, 639, 640, 641, 644, 642, 407, 311, 495, + 333, 373, 0, 0, 425, 472, 240, 606, 496, 199, + 0, 0, 0, 0, 254, 255, 0, 575, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 649, 508, 514, 509, 510, + 511, 512, 513, 0, 515, 0, 0, 0, 0, 0, + 398, 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, - 348, 353, 354, 358, 364, 249, 210, 390, 399, 577, - 312, 216, 217, 218, 523, 524, 525, 526, 615, 616, - 620, 205, 462, 463, 464, 465, 292, 610, 309, 468, - 467, 331, 332, 379, 449, 539, 541, 552, 556, 558, - 560, 566, 569, 540, 542, 553, 557, 559, 561, 567, - 570, 529, 531, 533, 535, 548, 547, 544, 572, 573, - 550, 555, 534, 546, 551, 564, 571, 568, 528, 532, - 536, 545, 563, 562, 543, 554, 565, 549, 537, 530, - 538, 0, 196, 221, 368, 0, 454, 288, 645, 614, - 484, 609, 206, 223, 0, 262, 0, 0, 0, 0, + 348, 353, 354, 358, 364, 249, 210, 390, 399, 578, + 312, 216, 217, 218, 524, 525, 526, 527, 619, 620, + 624, 205, 462, 463, 464, 465, 292, 614, 309, 468, + 467, 331, 332, 379, 449, 540, 542, 553, 557, 559, + 561, 567, 570, 541, 543, 554, 558, 560, 562, 568, + 571, 530, 532, 534, 536, 549, 548, 545, 573, 574, + 551, 556, 535, 547, 552, 565, 572, 569, 529, 533, + 537, 546, 564, 563, 544, 555, 566, 550, 538, 531, + 539, 0, 196, 221, 368, 0, 454, 288, 650, 618, + 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, @@ -6378,29 +5350,29 @@ var yyAct = [...]int{ 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 301, - 302, 444, 445, 314, 315, 641, 642, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 0, 0, + 500, 501, 516, 586, 588, 605, 625, 632, 480, 301, + 302, 444, 445, 314, 315, 646, 647, 300, 600, 633, + 597, 645, 627, 438, 378, 0, 0, 381, 281, 305, + 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 396, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, - 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, - 1897, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 0, 370, 0, 0, 497, 401, 0, 0, + 434, 296, 271, 244, 459, 241, 485, 519, 520, 521, + 523, 395, 266, 433, 396, 0, 376, 576, 577, 316, + 0, 0, 0, 528, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, + 0, 0, 0, 270, 0, 0, 0, 0, 366, 267, + 0, 0, 204, 505, 0, 430, 0, 203, 0, 487, + 252, 377, 374, 583, 282, 273, 269, 250, 317, 385, + 428, 518, 422, 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 0, 0, 0, 0, 717, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, - 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, - 357, 363, 336, 345, 0, 0, 606, 0, 0, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, + 202, 413, 498, 286, 0, 0, 0, 0, 0, 507, + 726, 727, 728, 0, 0, 0, 0, 0, 0, 0, + 238, 0, 0, 245, 0, 0, 0, 351, 360, 359, + 339, 340, 342, 344, 350, 357, 363, 336, 345, 0, + 0, 609, 0, 0, 0, 265, 321, 272, 264, 580, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6408,42 +5380,117 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 0, 0, 0, 624, - 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 253, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 588, 589, - 256, 647, 228, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 355, 356, 280, - 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, + 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, + 0, 453, 0, 0, 0, 629, 0, 0, 0, 0, + 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, + 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, + 604, 233, 284, 458, 432, 469, 440, 287, 0, 0, + 470, 372, 585, 450, 601, 630, 631, 263, 406, 615, + 522, 623, 648, 226, 260, 420, 506, 607, 494, 397, + 581, 582, 329, 493, 295, 201, 369, 636, 224, 479, + 371, 242, 231, 587, 612, 299, 289, 456, 643, 213, + 517, 598, 239, 483, 0, 0, 651, 247, 504, 610, + 599, 215, 594, 503, 393, 326, 327, 214, 0, 457, + 268, 293, 0, 0, 258, 415, 589, 590, 256, 652, + 228, 622, 220, 0, 621, 408, 584, 595, 394, 383, + 219, 593, 392, 382, 334, 355, 356, 280, 307, 447, + 375, 448, 306, 308, 404, 403, 405, 207, 608, 626, + 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, + 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, + 419, 446, 442, 451, 0, 579, 602, 616, 628, 634, + 635, 637, 638, 639, 640, 641, 644, 642, 407, 311, + 495, 333, 373, 0, 0, 425, 472, 240, 606, 496, + 199, 0, 0, 0, 0, 254, 255, 0, 575, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 649, 508, 514, 509, + 510, 511, 512, 513, 0, 515, 0, 0, 0, 0, + 0, 398, 0, 591, 592, 672, 384, 486, 603, 335, + 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, + 347, 348, 353, 354, 358, 364, 249, 210, 390, 399, + 578, 312, 216, 217, 218, 524, 525, 526, 527, 619, + 620, 624, 205, 462, 463, 464, 465, 292, 614, 309, + 468, 467, 331, 332, 379, 449, 540, 542, 553, 557, + 559, 561, 567, 570, 541, 543, 554, 558, 560, 562, + 568, 571, 530, 532, 534, 536, 549, 548, 545, 573, + 574, 551, 556, 535, 547, 552, 565, 572, 569, 529, + 533, 537, 546, 564, 563, 544, 555, 566, 550, 538, + 531, 539, 0, 196, 221, 368, 0, 454, 288, 650, + 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, + 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, + 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, + 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, + 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, + 492, 500, 501, 516, 586, 588, 605, 625, 632, 480, + 301, 302, 444, 445, 314, 315, 646, 647, 300, 600, + 633, 597, 645, 627, 438, 378, 0, 0, 381, 281, + 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, + 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, + 429, 434, 296, 271, 244, 459, 241, 485, 519, 520, + 521, 523, 395, 266, 433, 396, 0, 376, 576, 577, + 316, 0, 0, 0, 528, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, + 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, + 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, + 487, 252, 377, 374, 583, 282, 273, 269, 250, 317, + 385, 428, 518, 422, 0, 370, 0, 0, 497, 401, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 323, 248, + 325, 202, 413, 498, 286, 0, 0, 0, 0, 0, + 507, 724, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, + 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, + 0, 0, 609, 0, 0, 0, 265, 321, 272, 264, + 580, 0, 0, 0, 0, 0, 0, 596, 0, 0, + 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 297, 0, 402, + 257, 0, 453, 0, 0, 0, 629, 0, 0, 0, + 4070, 0, 0, 0, 365, 0, 330, 197, 225, 0, + 0, 412, 461, 473, 0, 0, 0, 253, 0, 471, + 426, 604, 233, 284, 458, 432, 469, 440, 287, 0, + 0, 470, 372, 585, 450, 601, 630, 631, 263, 406, + 615, 522, 623, 648, 226, 260, 420, 506, 607, 494, + 397, 581, 582, 329, 493, 295, 201, 369, 636, 224, + 479, 371, 242, 231, 587, 612, 299, 289, 456, 643, + 213, 517, 598, 239, 483, 0, 0, 651, 247, 504, + 610, 599, 215, 594, 503, 393, 326, 327, 214, 0, + 457, 268, 293, 0, 0, 258, 415, 589, 590, 256, + 652, 228, 622, 220, 0, 621, 408, 584, 595, 394, + 383, 219, 593, 392, 382, 334, 355, 356, 280, 307, + 447, 375, 448, 306, 308, 404, 403, 405, 207, 608, + 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 199, 0, 0, 0, 0, 254, 255, 0, 574, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 0, 0, 0, - 0, 0, 398, 0, 590, 591, 667, 384, 486, 600, + 367, 419, 446, 442, 451, 0, 579, 602, 616, 628, + 634, 635, 637, 638, 639, 640, 641, 644, 642, 407, + 311, 495, 333, 373, 0, 0, 425, 472, 240, 606, + 496, 199, 0, 0, 0, 0, 254, 255, 0, 575, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 649, 508, 514, + 509, 510, 511, 512, 513, 0, 515, 0, 0, 0, + 0, 0, 398, 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, - 399, 577, 312, 216, 217, 218, 523, 524, 525, 526, - 615, 616, 620, 205, 462, 463, 464, 465, 292, 610, - 309, 468, 467, 331, 332, 379, 449, 539, 541, 552, - 556, 558, 560, 566, 569, 540, 542, 553, 557, 559, - 561, 567, 570, 529, 531, 533, 535, 548, 547, 544, - 572, 573, 550, 555, 534, 546, 551, 564, 571, 568, - 528, 532, 536, 545, 563, 562, 543, 554, 565, 549, - 537, 530, 538, 0, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 0, 262, 0, 0, + 399, 578, 312, 216, 217, 218, 524, 525, 526, 527, + 619, 620, 624, 205, 462, 463, 464, 465, 292, 614, + 309, 468, 467, 331, 332, 379, 449, 540, 542, 553, + 557, 559, 561, 567, 570, 541, 543, 554, 558, 560, + 562, 568, 571, 530, 532, 534, 536, 549, 548, 545, + 573, 574, 551, 556, 535, 547, 552, 565, 572, 569, + 529, 533, 537, 546, 564, 563, 544, 555, 566, 550, + 538, 531, 539, 0, 196, 221, 368, 0, 454, 288, + 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, @@ -6451,72 +5498,147 @@ var yyAct = [...]int{ 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 301, 302, 444, 445, 314, 315, 641, 642, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, + 491, 492, 500, 501, 516, 586, 588, 605, 625, 632, + 480, 301, 302, 444, 445, 314, 315, 646, 647, 300, + 600, 633, 597, 645, 627, 438, 378, 0, 0, 381, + 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, - 267, 0, 1895, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 0, 370, 0, 0, 497, 401, + 400, 429, 434, 296, 271, 244, 459, 241, 485, 519, + 520, 521, 523, 395, 266, 433, 396, 0, 376, 576, + 577, 316, 0, 0, 0, 528, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, + 0, 0, 0, 0, 0, 270, 0, 0, 0, 0, + 366, 267, 0, 0, 204, 505, 0, 430, 0, 203, + 0, 487, 252, 377, 374, 583, 282, 273, 269, 250, + 317, 385, 428, 518, 422, 0, 370, 0, 0, 497, + 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, + 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, + 1961, 507, 194, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 238, 0, 0, 245, 0, 0, 0, 351, + 360, 359, 339, 340, 342, 344, 350, 357, 363, 336, + 345, 0, 0, 609, 0, 0, 0, 265, 321, 272, + 264, 580, 0, 0, 0, 0, 0, 0, 596, 0, + 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 0, 0, 0, 0, 717, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, - 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 0, 0, 606, 0, - 0, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, + 402, 257, 0, 453, 0, 0, 0, 629, 0, 0, + 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, + 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, + 471, 426, 604, 233, 284, 458, 432, 469, 440, 287, + 0, 0, 470, 372, 585, 450, 601, 630, 631, 263, + 406, 615, 522, 623, 648, 226, 260, 420, 506, 607, + 494, 397, 581, 582, 329, 493, 295, 201, 369, 636, + 224, 479, 371, 242, 231, 587, 612, 299, 289, 456, + 643, 213, 517, 598, 239, 483, 0, 0, 651, 247, + 504, 610, 599, 215, 594, 503, 393, 326, 327, 214, + 0, 457, 268, 293, 0, 0, 258, 415, 589, 590, + 256, 652, 228, 622, 220, 0, 621, 408, 584, 595, + 394, 383, 219, 593, 392, 382, 334, 355, 356, 280, + 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, + 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, + 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, + 313, 367, 419, 446, 442, 451, 0, 579, 602, 616, + 628, 634, 635, 637, 638, 639, 640, 641, 644, 642, + 407, 311, 495, 333, 373, 0, 0, 425, 472, 240, + 606, 496, 199, 0, 0, 0, 0, 254, 255, 0, + 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 649, 508, + 514, 509, 510, 511, 512, 513, 0, 515, 0, 0, + 0, 0, 0, 398, 0, 591, 592, 672, 384, 486, + 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, + 343, 346, 347, 348, 353, 354, 358, 364, 249, 210, + 390, 399, 578, 312, 216, 217, 218, 524, 525, 526, + 527, 619, 620, 624, 205, 462, 463, 464, 465, 292, + 614, 309, 468, 467, 331, 332, 379, 449, 540, 542, + 553, 557, 559, 561, 567, 570, 541, 543, 554, 558, + 560, 562, 568, 571, 530, 532, 534, 536, 549, 548, + 545, 573, 574, 551, 556, 535, 547, 552, 565, 572, + 569, 529, 533, 537, 546, 564, 563, 544, 555, 566, + 550, 538, 531, 539, 0, 196, 221, 368, 0, 454, + 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, + 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, + 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, + 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, + 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, + 490, 491, 492, 500, 501, 516, 586, 588, 605, 625, + 632, 480, 301, 302, 444, 445, 314, 315, 646, 647, + 300, 600, 633, 597, 645, 627, 438, 378, 0, 0, + 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, + 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, + 391, 400, 429, 434, 296, 271, 244, 459, 241, 485, + 519, 520, 521, 523, 395, 266, 433, 396, 0, 376, + 576, 577, 316, 0, 0, 0, 528, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, + 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, + 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, + 203, 0, 487, 252, 377, 374, 583, 282, 273, 269, + 250, 317, 385, 428, 518, 422, 0, 370, 0, 0, + 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 323, 248, 325, 202, 413, 498, 286, 0, 0, 0, + 0, 0, 507, 724, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, + 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, + 336, 345, 0, 0, 609, 0, 0, 0, 265, 321, + 272, 264, 580, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, - 0, 624, 0, 0, 0, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 253, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, - 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, + 0, 402, 257, 0, 453, 0, 0, 0, 629, 0, + 0, 0, 3726, 0, 0, 0, 365, 0, 330, 197, + 225, 0, 0, 412, 461, 473, 0, 0, 0, 253, + 0, 471, 426, 604, 233, 284, 458, 432, 469, 440, + 287, 0, 0, 470, 372, 585, 450, 601, 630, 631, + 263, 406, 615, 522, 623, 648, 226, 260, 420, 506, + 607, 494, 397, 581, 582, 329, 493, 295, 201, 369, + 636, 224, 479, 371, 242, 231, 587, 612, 299, 289, + 456, 643, 213, 517, 598, 239, 483, 0, 0, 651, + 247, 504, 610, 599, 215, 594, 503, 393, 326, 327, + 214, 0, 457, 268, 293, 0, 0, 258, 415, 589, + 590, 256, 652, 228, 622, 220, 0, 621, 408, 584, + 595, 394, 383, 219, 593, 392, 382, 334, 355, 356, + 280, 307, 447, 375, 448, 306, 308, 404, 403, 405, + 207, 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 199, 0, 0, 0, 0, 254, 255, - 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 0, - 0, 0, 0, 0, 398, 0, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, + 304, 313, 367, 419, 446, 442, 451, 0, 579, 602, + 616, 628, 634, 635, 637, 638, 639, 640, 641, 644, + 642, 407, 311, 495, 333, 373, 0, 0, 425, 472, + 240, 606, 496, 199, 0, 0, 0, 0, 254, 255, + 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 649, + 508, 514, 509, 510, 511, 512, 513, 0, 515, 0, + 0, 0, 0, 0, 398, 0, 591, 592, 672, 384, + 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 0, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 0, 262, + 210, 390, 399, 578, 312, 216, 217, 218, 524, 525, + 526, 527, 619, 620, 624, 205, 462, 463, 464, 465, + 292, 614, 309, 468, 467, 331, 332, 379, 449, 540, + 542, 553, 557, 559, 561, 567, 570, 541, 543, 554, + 558, 560, 562, 568, 571, 530, 532, 534, 536, 549, + 548, 545, 573, 574, 551, 556, 535, 547, 552, 565, + 572, 569, 529, 533, 537, 546, 564, 563, 544, 555, + 566, 550, 538, 531, 539, 0, 196, 221, 368, 0, + 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, @@ -6524,29 +5646,29 @@ var yyAct = [...]int{ 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, + 489, 490, 491, 492, 500, 501, 516, 586, 588, 605, + 625, 632, 480, 301, 302, 444, 445, 314, 315, 646, + 647, 300, 600, 633, 597, 645, 627, 438, 378, 0, + 0, 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, - 0, 366, 267, 0, 1893, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 0, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 0, 717, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, - 606, 0, 0, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, + 485, 519, 520, 521, 523, 395, 266, 433, 396, 0, + 376, 576, 577, 316, 0, 0, 0, 528, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, + 0, 0, 0, 0, 0, 0, 0, 270, 0, 0, + 0, 0, 366, 267, 0, 0, 204, 505, 0, 430, + 0, 203, 0, 487, 252, 377, 374, 583, 282, 273, + 269, 250, 317, 385, 428, 518, 422, 0, 370, 0, + 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, + 0, 323, 248, 325, 202, 413, 498, 286, 0, 95, + 0, 0, 0, 507, 724, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, + 0, 351, 360, 359, 339, 340, 342, 344, 350, 357, + 363, 336, 345, 0, 0, 609, 0, 0, 0, 265, + 321, 272, 264, 580, 0, 0, 0, 0, 0, 0, + 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6554,42 +5676,117 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, - 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 253, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 297, 0, 402, 257, 0, 453, 0, 0, 0, 629, + 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, + 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, + 253, 0, 471, 426, 604, 233, 284, 458, 432, 469, + 440, 287, 0, 0, 470, 372, 585, 450, 601, 630, + 631, 263, 406, 615, 522, 623, 648, 226, 260, 420, + 506, 607, 494, 397, 581, 582, 329, 493, 295, 201, + 369, 636, 224, 479, 371, 242, 231, 587, 612, 299, + 289, 456, 643, 213, 517, 598, 239, 483, 0, 0, + 651, 247, 504, 610, 599, 215, 594, 503, 393, 326, + 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, + 589, 590, 256, 652, 228, 622, 220, 0, 621, 408, + 584, 595, 394, 383, 219, 593, 392, 382, 334, 355, + 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, + 405, 207, 608, 626, 0, 208, 0, 499, 611, 653, + 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, + 303, 304, 313, 367, 419, 446, 442, 451, 0, 579, + 602, 616, 628, 634, 635, 637, 638, 639, 640, 641, + 644, 642, 407, 311, 495, 333, 373, 0, 0, 425, + 472, 240, 606, 496, 199, 0, 0, 0, 0, 254, + 255, 0, 575, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 649, 508, 514, 509, 510, 511, 512, 513, 0, 515, + 0, 0, 0, 0, 0, 398, 0, 591, 592, 672, + 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, + 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, + 249, 210, 390, 399, 578, 312, 216, 217, 218, 524, + 525, 526, 527, 619, 620, 624, 205, 462, 463, 464, + 465, 292, 614, 309, 468, 467, 331, 332, 379, 449, + 540, 542, 553, 557, 559, 561, 567, 570, 541, 543, + 554, 558, 560, 562, 568, 571, 530, 532, 534, 536, + 549, 548, 545, 573, 574, 551, 556, 535, 547, 552, + 565, 572, 569, 529, 533, 537, 546, 564, 563, 544, + 555, 566, 550, 538, 531, 539, 0, 196, 221, 368, + 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, + 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, + 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, + 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, + 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, + 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, + 488, 489, 490, 491, 492, 500, 501, 516, 586, 588, + 605, 625, 632, 480, 301, 302, 444, 445, 314, 315, + 646, 647, 300, 600, 633, 597, 645, 627, 438, 378, + 0, 0, 381, 281, 305, 320, 0, 617, 502, 227, + 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, + 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, + 241, 485, 519, 520, 521, 523, 395, 266, 433, 396, + 0, 376, 576, 577, 316, 0, 0, 0, 528, 0, + 0, 0, 0, 2427, 0, 0, 0, 0, 0, 0, + 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, + 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, + 430, 0, 203, 0, 487, 252, 377, 374, 583, 282, + 273, 269, 250, 317, 385, 428, 518, 422, 0, 370, + 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 323, 248, 325, 202, 413, 498, 286, 0, + 0, 0, 0, 0, 507, 194, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, + 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, + 357, 363, 336, 345, 0, 0, 609, 0, 0, 0, + 265, 321, 272, 264, 580, 0, 0, 0, 0, 0, + 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 297, 0, 402, 257, 0, 453, 0, 0, 0, + 629, 0, 0, 0, 0, 0, 0, 0, 365, 0, + 330, 197, 225, 0, 0, 412, 461, 473, 0, 0, + 0, 253, 0, 471, 426, 604, 233, 284, 458, 432, + 469, 440, 287, 0, 0, 470, 372, 585, 450, 601, + 630, 631, 263, 406, 615, 522, 623, 648, 226, 260, + 420, 506, 607, 494, 397, 581, 582, 329, 493, 295, + 201, 369, 636, 224, 479, 371, 242, 231, 587, 612, + 299, 289, 456, 643, 213, 517, 598, 239, 483, 0, + 0, 651, 247, 504, 610, 599, 215, 594, 503, 393, + 326, 327, 214, 0, 457, 268, 293, 0, 0, 258, + 415, 589, 590, 256, 652, 228, 622, 220, 0, 621, + 408, 584, 595, 394, 383, 219, 593, 392, 382, 334, + 355, 356, 280, 307, 447, 375, 448, 306, 308, 404, + 403, 405, 207, 608, 626, 0, 208, 0, 499, 611, + 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 199, 0, 0, 0, 0, - 254, 255, 0, 574, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 0, 0, 0, 0, 0, 398, 0, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, + 579, 602, 616, 628, 634, 635, 637, 638, 639, 640, + 641, 644, 642, 407, 311, 495, 333, 373, 0, 0, + 425, 472, 240, 606, 496, 199, 0, 0, 0, 0, + 254, 255, 0, 575, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 649, 508, 514, 509, 510, 511, 512, 513, 0, + 515, 0, 0, 0, 0, 0, 398, 0, 591, 592, + 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 0, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, + 364, 249, 210, 390, 399, 578, 312, 216, 217, 218, + 524, 525, 526, 527, 619, 620, 624, 205, 462, 463, + 464, 465, 292, 614, 309, 468, 467, 331, 332, 379, + 449, 540, 542, 553, 557, 559, 561, 567, 570, 541, + 543, 554, 558, 560, 562, 568, 571, 530, 532, 534, + 536, 549, 548, 545, 573, 574, 551, 556, 535, 547, + 552, 565, 572, 569, 529, 533, 537, 546, 564, 563, + 544, 555, 566, 550, 538, 531, 539, 0, 196, 221, + 368, 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, @@ -6597,72 +5794,147 @@ var yyAct = [...]int{ 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, + 482, 488, 489, 490, 491, 492, 500, 501, 516, 586, + 588, 605, 625, 632, 480, 301, 302, 444, 445, 314, + 315, 646, 647, 300, 600, 633, 597, 645, 627, 438, + 378, 0, 0, 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, + 459, 241, 485, 519, 520, 521, 523, 395, 266, 433, + 396, 0, 376, 576, 577, 316, 0, 0, 0, 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, - 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 0, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 1868, 0, 0, - 0, 717, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 0, 0, 606, 0, 0, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, + 0, 416, 0, 0, 0, 0, 0, 0, 0, 270, + 0, 0, 0, 0, 366, 267, 0, 0, 204, 505, + 0, 430, 0, 203, 0, 487, 252, 377, 374, 583, + 282, 273, 269, 250, 317, 385, 428, 518, 422, 0, + 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, + 0, 0, 0, 0, 1780, 507, 724, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, + 0, 0, 0, 351, 360, 359, 339, 340, 342, 344, + 350, 357, 363, 336, 345, 0, 0, 609, 0, 0, + 0, 265, 321, 272, 264, 580, 0, 0, 0, 0, + 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 0, 0, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 0, 0, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, + 0, 629, 0, 0, 0, 0, 0, 0, 0, 365, + 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, + 0, 0, 253, 0, 471, 426, 604, 233, 284, 458, + 432, 469, 440, 287, 0, 0, 470, 372, 585, 450, + 601, 630, 631, 263, 406, 615, 522, 623, 648, 226, + 260, 420, 506, 607, 494, 397, 581, 582, 329, 493, + 295, 201, 369, 636, 224, 479, 371, 242, 231, 587, + 612, 299, 289, 456, 643, 213, 517, 598, 239, 483, + 0, 0, 651, 247, 504, 610, 599, 215, 594, 503, + 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, + 258, 415, 589, 590, 256, 652, 228, 622, 220, 0, + 621, 408, 584, 595, 394, 383, 219, 593, 392, 382, + 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, + 404, 403, 405, 207, 608, 626, 0, 208, 0, 499, + 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, + 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, + 0, 579, 602, 616, 628, 634, 635, 637, 638, 639, + 640, 641, 644, 642, 407, 311, 495, 333, 373, 0, + 0, 425, 472, 240, 606, 496, 199, 0, 0, 0, + 0, 254, 255, 0, 575, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 649, 508, 514, 509, 510, 511, 512, 513, + 0, 515, 0, 0, 0, 0, 0, 398, 0, 591, + 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, + 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, + 358, 364, 249, 210, 390, 399, 578, 312, 216, 217, + 218, 524, 525, 526, 527, 619, 620, 624, 205, 462, + 463, 464, 465, 292, 614, 309, 468, 467, 331, 332, + 379, 449, 540, 542, 553, 557, 559, 561, 567, 570, + 541, 543, 554, 558, 560, 562, 568, 571, 530, 532, + 534, 536, 549, 548, 545, 573, 574, 551, 556, 535, + 547, 552, 565, 572, 569, 529, 533, 537, 546, 564, + 563, 544, 555, 566, 550, 538, 531, 539, 0, 196, + 221, 368, 0, 454, 288, 650, 618, 484, 613, 206, + 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, + 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, + 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, + 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, + 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, + 481, 482, 488, 489, 490, 491, 492, 500, 501, 516, + 586, 588, 605, 625, 632, 480, 301, 302, 444, 445, + 314, 315, 646, 647, 300, 600, 633, 597, 645, 627, + 438, 378, 0, 0, 381, 281, 305, 320, 0, 617, + 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, + 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, + 244, 459, 241, 485, 519, 520, 521, 523, 395, 266, + 433, 396, 0, 376, 576, 577, 316, 0, 0, 0, + 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, + 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, + 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, + 583, 282, 273, 269, 250, 317, 385, 428, 518, 422, + 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 323, 248, 325, 202, 413, 498, + 286, 0, 0, 0, 0, 0, 507, 194, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, + 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, + 344, 350, 357, 363, 336, 345, 0, 0, 609, 0, + 0, 0, 265, 321, 272, 264, 580, 0, 0, 0, + 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 297, 0, 402, 257, 0, 453, 0, + 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, + 365, 0, 330, 197, 225, 0, 0, 412, 461, 473, + 0, 0, 0, 253, 0, 471, 426, 604, 233, 284, + 458, 432, 469, 440, 287, 0, 0, 470, 372, 585, + 450, 601, 630, 631, 263, 406, 615, 522, 623, 648, + 226, 260, 420, 506, 607, 494, 397, 581, 582, 329, + 493, 295, 201, 369, 636, 224, 479, 371, 242, 231, + 587, 612, 299, 289, 456, 643, 213, 517, 598, 239, + 483, 0, 0, 651, 247, 504, 610, 599, 215, 594, + 503, 393, 326, 327, 214, 0, 457, 268, 293, 0, + 0, 258, 415, 589, 590, 256, 652, 228, 622, 220, + 0, 621, 408, 584, 595, 394, 383, 219, 593, 392, + 382, 334, 355, 356, 280, 307, 447, 375, 448, 306, + 308, 404, 403, 405, 207, 608, 626, 0, 208, 0, + 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 199, 0, 0, - 0, 0, 254, 255, 0, 574, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 0, 0, 0, 0, 0, 398, 0, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, + 451, 0, 579, 602, 616, 628, 634, 635, 637, 638, + 639, 640, 641, 644, 642, 407, 311, 495, 333, 373, + 0, 0, 425, 472, 240, 606, 496, 199, 0, 0, + 0, 0, 254, 255, 0, 575, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 649, 508, 514, 509, 510, 511, 512, + 513, 0, 515, 0, 0, 0, 0, 0, 398, 0, + 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 0, - 196, 221, 368, 0, 454, 288, 645, 614, 484, 609, + 354, 358, 364, 249, 210, 390, 399, 578, 312, 216, + 217, 218, 524, 525, 526, 527, 619, 620, 624, 205, + 462, 463, 464, 465, 292, 614, 309, 468, 467, 331, + 332, 379, 449, 540, 542, 553, 557, 559, 561, 567, + 570, 541, 543, 554, 558, 560, 562, 568, 571, 530, + 532, 534, 536, 549, 548, 545, 573, 574, 551, 556, + 535, 547, 552, 565, 572, 569, 529, 533, 537, 546, + 564, 563, 544, 555, 566, 550, 538, 531, 539, 0, + 196, 221, 368, 2079, 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, @@ -6671,72 +5943,147 @@ var yyAct = [...]int{ 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 0, 0, 211, 246, + 516, 586, 588, 605, 625, 632, 480, 301, 302, 444, + 445, 314, 315, 646, 647, 300, 600, 633, 597, 645, + 627, 438, 378, 0, 0, 381, 281, 305, 320, 0, + 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 0, - 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 0, 0, 0, 1767, - 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, - 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, + 271, 244, 459, 241, 485, 519, 520, 521, 523, 395, + 266, 433, 396, 0, 376, 576, 577, 316, 0, 0, + 0, 528, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, + 0, 270, 0, 0, 0, 0, 366, 267, 0, 0, + 204, 505, 0, 430, 0, 203, 0, 487, 252, 377, + 374, 583, 282, 273, 269, 250, 317, 385, 428, 518, + 422, 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, - 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, - 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, - 336, 345, 0, 0, 606, 0, 0, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, + 498, 286, 0, 0, 0, 0, 2070, 507, 724, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, + 0, 245, 0, 0, 0, 351, 360, 359, 339, 340, + 342, 344, 350, 357, 363, 336, 345, 0, 0, 609, + 0, 0, 0, 265, 321, 272, 264, 580, 0, 0, + 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 0, 0, 0, 624, 0, 0, - 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, - 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 588, 589, 256, 647, - 228, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 355, 356, 280, 307, 447, - 375, 448, 306, 308, 404, 403, 405, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, + 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, + 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, + 473, 0, 0, 0, 253, 0, 471, 426, 604, 233, + 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, + 585, 450, 601, 630, 631, 263, 406, 615, 522, 623, + 648, 226, 260, 420, 506, 607, 494, 397, 581, 582, + 329, 493, 295, 201, 369, 636, 224, 479, 371, 242, + 231, 587, 612, 299, 289, 456, 643, 213, 517, 598, + 239, 483, 0, 0, 651, 247, 504, 610, 599, 215, + 594, 503, 393, 326, 327, 214, 0, 457, 268, 293, + 0, 0, 258, 415, 589, 590, 256, 652, 228, 622, + 220, 0, 621, 408, 584, 595, 394, 383, 219, 593, + 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, + 306, 308, 404, 403, 405, 207, 608, 626, 0, 208, + 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, + 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, + 442, 451, 0, 579, 602, 616, 628, 634, 635, 637, + 638, 639, 640, 641, 644, 642, 407, 311, 495, 333, + 373, 0, 0, 425, 472, 240, 606, 496, 199, 0, + 0, 0, 0, 254, 255, 0, 575, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 649, 508, 514, 509, 510, 511, + 512, 513, 0, 515, 0, 0, 0, 0, 0, 398, + 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, + 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, + 353, 354, 358, 364, 249, 210, 390, 399, 578, 312, + 216, 217, 218, 524, 525, 526, 527, 619, 620, 624, + 205, 462, 463, 464, 465, 292, 614, 309, 468, 467, + 331, 332, 379, 449, 540, 542, 553, 557, 559, 561, + 567, 570, 541, 543, 554, 558, 560, 562, 568, 571, + 530, 532, 534, 536, 549, 548, 545, 573, 574, 551, + 556, 535, 547, 552, 565, 572, 569, 529, 533, 537, + 546, 564, 563, 544, 555, 566, 550, 538, 531, 539, + 0, 196, 221, 368, 0, 454, 288, 650, 618, 484, + 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, + 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, + 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, + 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, + 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, + 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, + 501, 516, 586, 588, 605, 625, 632, 480, 301, 302, + 444, 445, 314, 315, 646, 647, 300, 600, 633, 597, + 645, 627, 438, 378, 0, 0, 381, 281, 305, 320, + 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, + 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, + 296, 271, 244, 459, 241, 485, 519, 520, 521, 523, + 395, 266, 433, 396, 0, 376, 576, 577, 316, 0, + 0, 0, 528, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, + 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, + 1928, 204, 505, 0, 430, 0, 203, 0, 487, 252, + 377, 374, 583, 282, 273, 269, 250, 317, 385, 428, + 518, 422, 0, 370, 0, 0, 497, 401, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 323, 248, 325, 202, + 413, 498, 286, 0, 0, 0, 0, 0, 507, 724, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, + 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, + 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, + 609, 0, 0, 0, 265, 321, 272, 264, 580, 0, + 0, 0, 0, 0, 0, 596, 0, 0, 229, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 297, 0, 402, 257, 0, + 453, 0, 0, 0, 629, 0, 0, 0, 0, 0, + 0, 0, 365, 0, 330, 197, 225, 0, 0, 412, + 461, 473, 0, 0, 0, 253, 0, 471, 426, 604, + 233, 284, 458, 432, 469, 440, 287, 0, 0, 470, + 372, 585, 450, 601, 630, 631, 263, 406, 615, 522, + 623, 648, 226, 260, 420, 506, 607, 494, 397, 581, + 582, 329, 493, 295, 201, 369, 636, 224, 479, 371, + 242, 231, 587, 612, 299, 289, 456, 643, 213, 517, + 598, 239, 483, 0, 0, 651, 247, 504, 610, 599, + 215, 594, 503, 393, 326, 327, 214, 0, 457, 268, + 293, 0, 0, 258, 415, 589, 590, 256, 652, 228, + 622, 220, 0, 621, 408, 584, 595, 394, 383, 219, + 593, 392, 382, 334, 355, 356, 280, 307, 447, 375, + 448, 306, 308, 404, 403, 405, 207, 608, 626, 0, + 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 199, - 0, 0, 0, 0, 254, 255, 0, 574, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 0, 0, 0, 0, 0, - 398, 0, 590, 591, 667, 384, 486, 600, 335, 349, + 446, 442, 451, 0, 579, 602, 616, 628, 634, 635, + 637, 638, 639, 640, 641, 644, 642, 407, 311, 495, + 333, 373, 0, 0, 425, 472, 240, 606, 496, 199, + 0, 0, 0, 0, 254, 255, 0, 575, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 649, 508, 514, 509, 510, + 511, 512, 513, 0, 515, 0, 0, 0, 0, 0, + 398, 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, - 348, 353, 354, 358, 364, 249, 210, 390, 399, 577, - 312, 216, 217, 218, 523, 524, 525, 526, 615, 616, - 620, 205, 462, 463, 464, 465, 292, 610, 309, 468, - 467, 331, 332, 379, 449, 539, 541, 552, 556, 558, - 560, 566, 569, 540, 542, 553, 557, 559, 561, 567, - 570, 529, 531, 533, 535, 548, 547, 544, 572, 573, - 550, 555, 534, 546, 551, 564, 571, 568, 528, 532, - 536, 545, 563, 562, 543, 554, 565, 549, 537, 530, - 538, 0, 196, 221, 368, 0, 454, 288, 645, 614, - 484, 609, 206, 223, 0, 262, 0, 0, 0, 0, + 348, 353, 354, 358, 364, 249, 210, 390, 399, 578, + 312, 216, 217, 218, 524, 525, 526, 527, 619, 620, + 624, 205, 462, 463, 464, 465, 292, 614, 309, 468, + 467, 331, 332, 379, 449, 540, 542, 553, 557, 559, + 561, 567, 570, 541, 543, 554, 558, 560, 562, 568, + 571, 530, 532, 534, 536, 549, 548, 545, 573, 574, + 551, 556, 535, 547, 552, 565, 572, 569, 529, 533, + 537, 546, 564, 563, 544, 555, 566, 550, 538, 531, + 539, 0, 196, 221, 368, 0, 454, 288, 650, 618, + 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, @@ -6744,29 +6091,29 @@ var yyAct = [...]int{ 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 301, - 302, 444, 445, 314, 315, 641, 642, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 0, 0, + 500, 501, 516, 586, 588, 605, 625, 632, 480, 301, + 302, 444, 445, 314, 315, 646, 647, 300, 600, 633, + 597, 645, 627, 438, 378, 0, 0, 381, 281, 305, + 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 396, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, - 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, - 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 0, 370, 0, 0, 497, 401, 0, 0, + 434, 296, 271, 244, 459, 241, 485, 519, 520, 521, + 523, 395, 266, 433, 396, 0, 376, 576, 577, 316, + 0, 0, 0, 528, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, + 0, 0, 0, 270, 0, 0, 0, 0, 366, 267, + 0, 1926, 204, 505, 0, 430, 0, 203, 0, 487, + 252, 377, 374, 583, 282, 273, 269, 250, 317, 385, + 428, 518, 422, 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 95, 0, 0, 0, 952, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, - 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, - 357, 363, 336, 345, 0, 0, 606, 0, 0, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, + 202, 413, 498, 286, 0, 0, 0, 0, 0, 507, + 724, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 238, 0, 0, 245, 0, 0, 0, 351, 360, 359, + 339, 340, 342, 344, 350, 357, 363, 336, 345, 0, + 0, 609, 0, 0, 0, 265, 321, 272, 264, 580, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6774,42 +6121,117 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 0, 0, 0, 624, - 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 253, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 588, 589, - 256, 647, 228, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 355, 356, 280, - 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, + 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, + 0, 453, 0, 0, 0, 629, 0, 0, 0, 0, + 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, + 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, + 604, 233, 284, 458, 432, 469, 440, 287, 0, 0, + 470, 372, 585, 450, 601, 630, 631, 263, 406, 615, + 522, 623, 648, 226, 260, 420, 506, 607, 494, 397, + 581, 582, 329, 493, 295, 201, 369, 636, 224, 479, + 371, 242, 231, 587, 612, 299, 289, 456, 643, 213, + 517, 598, 239, 483, 0, 0, 651, 247, 504, 610, + 599, 215, 594, 503, 393, 326, 327, 214, 0, 457, + 268, 293, 0, 0, 258, 415, 589, 590, 256, 652, + 228, 622, 220, 0, 621, 408, 584, 595, 394, 383, + 219, 593, 392, 382, 334, 355, 356, 280, 307, 447, + 375, 448, 306, 308, 404, 403, 405, 207, 608, 626, + 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, + 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, + 419, 446, 442, 451, 0, 579, 602, 616, 628, 634, + 635, 637, 638, 639, 640, 641, 644, 642, 407, 311, + 495, 333, 373, 0, 0, 425, 472, 240, 606, 496, + 199, 0, 0, 0, 0, 254, 255, 0, 575, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 649, 508, 514, 509, + 510, 511, 512, 513, 0, 515, 0, 0, 0, 0, + 0, 398, 0, 591, 592, 672, 384, 486, 603, 335, + 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, + 347, 348, 353, 354, 358, 364, 249, 210, 390, 399, + 578, 312, 216, 217, 218, 524, 525, 526, 527, 619, + 620, 624, 205, 462, 463, 464, 465, 292, 614, 309, + 468, 467, 331, 332, 379, 449, 540, 542, 553, 557, + 559, 561, 567, 570, 541, 543, 554, 558, 560, 562, + 568, 571, 530, 532, 534, 536, 549, 548, 545, 573, + 574, 551, 556, 535, 547, 552, 565, 572, 569, 529, + 533, 537, 546, 564, 563, 544, 555, 566, 550, 538, + 531, 539, 0, 196, 221, 368, 0, 454, 288, 650, + 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, + 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, + 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, + 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, + 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, + 492, 500, 501, 516, 586, 588, 605, 625, 632, 480, + 301, 302, 444, 445, 314, 315, 646, 647, 300, 600, + 633, 597, 645, 627, 438, 378, 0, 0, 381, 281, + 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, + 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, + 429, 434, 296, 271, 244, 459, 241, 485, 519, 520, + 521, 523, 395, 266, 433, 396, 0, 376, 576, 577, + 316, 0, 0, 0, 528, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, + 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, + 267, 0, 1924, 204, 505, 0, 430, 0, 203, 0, + 487, 252, 377, 374, 583, 282, 273, 269, 250, 317, + 385, 428, 518, 422, 0, 370, 0, 0, 497, 401, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 323, 248, + 325, 202, 413, 498, 286, 0, 0, 0, 0, 0, + 507, 724, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, + 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, + 0, 0, 609, 0, 0, 0, 265, 321, 272, 264, + 580, 0, 0, 0, 0, 0, 0, 596, 0, 0, + 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 297, 0, 402, + 257, 0, 453, 0, 0, 0, 629, 0, 0, 0, + 0, 0, 0, 0, 365, 0, 330, 197, 225, 0, + 0, 412, 461, 473, 0, 0, 0, 253, 0, 471, + 426, 604, 233, 284, 458, 432, 469, 440, 287, 0, + 0, 470, 372, 585, 450, 601, 630, 631, 263, 406, + 615, 522, 623, 648, 226, 260, 420, 506, 607, 494, + 397, 581, 582, 329, 493, 295, 201, 369, 636, 224, + 479, 371, 242, 231, 587, 612, 299, 289, 456, 643, + 213, 517, 598, 239, 483, 0, 0, 651, 247, 504, + 610, 599, 215, 594, 503, 393, 326, 327, 214, 0, + 457, 268, 293, 0, 0, 258, 415, 589, 590, 256, + 652, 228, 622, 220, 0, 621, 408, 584, 595, 394, + 383, 219, 593, 392, 382, 334, 355, 356, 280, 307, + 447, 375, 448, 306, 308, 404, 403, 405, 207, 608, + 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 199, 0, 0, 0, 0, 254, 255, 0, 574, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 0, 0, 0, - 0, 0, 398, 0, 590, 591, 667, 384, 486, 600, + 367, 419, 446, 442, 451, 0, 579, 602, 616, 628, + 634, 635, 637, 638, 639, 640, 641, 644, 642, 407, + 311, 495, 333, 373, 0, 0, 425, 472, 240, 606, + 496, 199, 0, 0, 0, 0, 254, 255, 0, 575, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 649, 508, 514, + 509, 510, 511, 512, 513, 0, 515, 0, 0, 0, + 0, 0, 398, 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, - 399, 577, 312, 216, 217, 218, 523, 524, 525, 526, - 615, 616, 620, 205, 462, 463, 464, 465, 292, 610, - 309, 468, 467, 331, 332, 379, 449, 539, 541, 552, - 556, 558, 560, 566, 569, 540, 542, 553, 557, 559, - 561, 567, 570, 529, 531, 533, 535, 548, 547, 544, - 572, 573, 550, 555, 534, 546, 551, 564, 571, 568, - 528, 532, 536, 545, 563, 562, 543, 554, 565, 549, - 537, 530, 538, 0, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 0, 262, 0, 0, + 399, 578, 312, 216, 217, 218, 524, 525, 526, 527, + 619, 620, 624, 205, 462, 463, 464, 465, 292, 614, + 309, 468, 467, 331, 332, 379, 449, 540, 542, 553, + 557, 559, 561, 567, 570, 541, 543, 554, 558, 560, + 562, 568, 571, 530, 532, 534, 536, 549, 548, 545, + 573, 574, 551, 556, 535, 547, 552, 565, 572, 569, + 529, 533, 537, 546, 564, 563, 544, 555, 566, 550, + 538, 531, 539, 0, 196, 221, 368, 0, 454, 288, + 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, @@ -6817,72 +6239,147 @@ var yyAct = [...]int{ 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 301, 302, 444, 445, 314, 315, 641, 642, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, + 491, 492, 500, 501, 516, 586, 588, 605, 625, 632, + 480, 301, 302, 444, 445, 314, 315, 646, 647, 300, + 600, 633, 597, 645, 627, 438, 378, 0, 0, 381, + 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, - 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 0, 370, 0, 0, 497, 401, + 400, 429, 434, 296, 271, 244, 459, 241, 485, 519, + 520, 521, 523, 395, 266, 433, 396, 0, 376, 576, + 577, 316, 0, 0, 0, 528, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, + 0, 0, 0, 0, 0, 270, 0, 0, 0, 0, + 366, 267, 0, 1922, 204, 505, 0, 430, 0, 203, + 0, 487, 252, 377, 374, 583, 282, 273, 269, 250, + 317, 385, 428, 518, 422, 0, 370, 0, 0, 497, + 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, + 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, + 0, 507, 724, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 238, 0, 0, 245, 0, 0, 0, 351, + 360, 359, 339, 340, 342, 344, 350, 357, 363, 336, + 345, 0, 0, 609, 0, 0, 0, 265, 321, 272, + 264, 580, 0, 0, 0, 0, 0, 0, 596, 0, + 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 0, 0, 0, 0, 194, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, - 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 0, 0, 606, 0, - 0, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, + 402, 257, 0, 453, 0, 0, 0, 629, 0, 0, + 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, + 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, + 471, 426, 604, 233, 284, 458, 432, 469, 440, 287, + 0, 0, 470, 372, 585, 450, 601, 630, 631, 263, + 406, 615, 522, 623, 648, 226, 260, 420, 506, 607, + 494, 397, 581, 582, 329, 493, 295, 201, 369, 636, + 224, 479, 371, 242, 231, 587, 612, 299, 289, 456, + 643, 213, 517, 598, 239, 483, 0, 0, 651, 247, + 504, 610, 599, 215, 594, 503, 393, 326, 327, 214, + 0, 457, 268, 293, 0, 0, 258, 415, 589, 590, + 256, 652, 228, 622, 220, 0, 621, 408, 584, 595, + 394, 383, 219, 593, 392, 382, 334, 355, 356, 280, + 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, + 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, + 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, + 313, 367, 419, 446, 442, 451, 0, 579, 602, 616, + 628, 634, 635, 637, 638, 639, 640, 641, 644, 642, + 407, 311, 495, 333, 373, 0, 0, 425, 472, 240, + 606, 496, 199, 0, 0, 0, 0, 254, 255, 0, + 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 649, 508, + 514, 509, 510, 511, 512, 513, 0, 515, 0, 0, + 0, 0, 0, 398, 0, 591, 592, 672, 384, 486, + 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, + 343, 346, 347, 348, 353, 354, 358, 364, 249, 210, + 390, 399, 578, 312, 216, 217, 218, 524, 525, 526, + 527, 619, 620, 624, 205, 462, 463, 464, 465, 292, + 614, 309, 468, 467, 331, 332, 379, 449, 540, 542, + 553, 557, 559, 561, 567, 570, 541, 543, 554, 558, + 560, 562, 568, 571, 530, 532, 534, 536, 549, 548, + 545, 573, 574, 551, 556, 535, 547, 552, 565, 572, + 569, 529, 533, 537, 546, 564, 563, 544, 555, 566, + 550, 538, 531, 539, 0, 196, 221, 368, 0, 454, + 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, + 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, + 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, + 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, + 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, + 490, 491, 492, 500, 501, 516, 586, 588, 605, 625, + 632, 480, 301, 302, 444, 445, 314, 315, 646, 647, + 300, 600, 633, 597, 645, 627, 438, 378, 0, 0, + 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, + 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, + 391, 400, 429, 434, 296, 271, 244, 459, 241, 485, + 519, 520, 521, 523, 395, 266, 433, 396, 0, 376, + 576, 577, 316, 0, 0, 0, 528, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, + 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, + 0, 366, 267, 0, 1920, 204, 505, 0, 430, 0, + 203, 0, 487, 252, 377, 374, 583, 282, 273, 269, + 250, 317, 385, 428, 518, 422, 0, 370, 0, 0, + 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 323, 248, 325, 202, 413, 498, 286, 0, 0, 0, + 0, 0, 507, 724, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, + 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, + 336, 345, 0, 0, 609, 0, 0, 0, 265, 321, + 272, 264, 580, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1444, 0, 297, 0, 402, 257, 0, 453, 0, 0, - 0, 624, 0, 0, 0, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 253, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, - 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, + 0, 402, 257, 0, 453, 0, 0, 0, 629, 0, + 0, 0, 0, 0, 0, 0, 365, 0, 330, 197, + 225, 0, 0, 412, 461, 473, 0, 0, 0, 253, + 0, 471, 426, 604, 233, 284, 458, 432, 469, 440, + 287, 0, 0, 470, 372, 585, 450, 601, 630, 631, + 263, 406, 615, 522, 623, 648, 226, 260, 420, 506, + 607, 494, 397, 581, 582, 329, 493, 295, 201, 369, + 636, 224, 479, 371, 242, 231, 587, 612, 299, 289, + 456, 643, 213, 517, 598, 239, 483, 0, 0, 651, + 247, 504, 610, 599, 215, 594, 503, 393, 326, 327, + 214, 0, 457, 268, 293, 0, 0, 258, 415, 589, + 590, 256, 652, 228, 622, 220, 0, 621, 408, 584, + 595, 394, 383, 219, 593, 392, 382, 334, 355, 356, + 280, 307, 447, 375, 448, 306, 308, 404, 403, 405, + 207, 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 199, 0, 0, 0, 0, 254, 255, - 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 0, - 0, 0, 0, 0, 398, 0, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, + 304, 313, 367, 419, 446, 442, 451, 0, 579, 602, + 616, 628, 634, 635, 637, 638, 639, 640, 641, 644, + 642, 407, 311, 495, 333, 373, 0, 0, 425, 472, + 240, 606, 496, 199, 0, 0, 0, 0, 254, 255, + 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 649, + 508, 514, 509, 510, 511, 512, 513, 0, 515, 0, + 0, 0, 0, 0, 398, 0, 591, 592, 672, 384, + 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 0, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 0, 262, + 210, 390, 399, 578, 312, 216, 217, 218, 524, 525, + 526, 527, 619, 620, 624, 205, 462, 463, 464, 465, + 292, 614, 309, 468, 467, 331, 332, 379, 449, 540, + 542, 553, 557, 559, 561, 567, 570, 541, 543, 554, + 558, 560, 562, 568, 571, 530, 532, 534, 536, 549, + 548, 545, 573, 574, 551, 556, 535, 547, 552, 565, + 572, 569, 529, 533, 537, 546, 564, 563, 544, 555, + 566, 550, 538, 531, 539, 0, 196, 221, 368, 0, + 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, @@ -6890,145 +6387,295 @@ var yyAct = [...]int{ 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 1443, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, + 489, 490, 491, 492, 500, 501, 516, 586, 588, 605, + 625, 632, 480, 301, 302, 444, 445, 314, 315, 646, + 647, 300, 600, 633, 597, 645, 627, 438, 378, 0, + 0, 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, - 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 0, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 0, 194, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, - 606, 0, 0, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, + 485, 519, 520, 521, 523, 395, 266, 433, 396, 0, + 376, 576, 577, 316, 0, 0, 0, 528, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, + 0, 0, 0, 0, 0, 0, 0, 270, 0, 0, + 0, 0, 366, 267, 0, 1916, 204, 505, 0, 430, + 0, 203, 0, 487, 252, 377, 374, 583, 282, 273, + 269, 250, 317, 385, 428, 518, 422, 0, 370, 0, + 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, + 0, 0, 0, 507, 724, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, + 0, 351, 360, 359, 339, 340, 342, 344, 350, 357, + 363, 336, 345, 0, 0, 609, 0, 0, 0, 265, + 321, 272, 264, 580, 0, 0, 0, 0, 0, 0, + 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 297, 0, 402, 257, 0, 453, 0, 0, 0, 629, + 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, + 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, + 253, 0, 471, 426, 604, 233, 284, 458, 432, 469, + 440, 287, 0, 0, 470, 372, 585, 450, 601, 630, + 631, 263, 406, 615, 522, 623, 648, 226, 260, 420, + 506, 607, 494, 397, 581, 582, 329, 493, 295, 201, + 369, 636, 224, 479, 371, 242, 231, 587, 612, 299, + 289, 456, 643, 213, 517, 598, 239, 483, 0, 0, + 651, 247, 504, 610, 599, 215, 594, 503, 393, 326, + 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, + 589, 590, 256, 652, 228, 622, 220, 0, 621, 408, + 584, 595, 394, 383, 219, 593, 392, 382, 334, 355, + 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, + 405, 207, 608, 626, 0, 208, 0, 499, 611, 653, + 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, + 303, 304, 313, 367, 419, 446, 442, 451, 0, 579, + 602, 616, 628, 634, 635, 637, 638, 639, 640, 641, + 644, 642, 407, 311, 495, 333, 373, 0, 0, 425, + 472, 240, 606, 496, 199, 0, 0, 0, 0, 254, + 255, 0, 575, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 649, 508, 514, 509, 510, 511, 512, 513, 0, 515, + 0, 0, 0, 0, 0, 398, 0, 591, 592, 672, + 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, + 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, + 249, 210, 390, 399, 578, 312, 216, 217, 218, 524, + 525, 526, 527, 619, 620, 624, 205, 462, 463, 464, + 465, 292, 614, 309, 468, 467, 331, 332, 379, 449, + 540, 542, 553, 557, 559, 561, 567, 570, 541, 543, + 554, 558, 560, 562, 568, 571, 530, 532, 534, 536, + 549, 548, 545, 573, 574, 551, 556, 535, 547, 552, + 565, 572, 569, 529, 533, 537, 546, 564, 563, 544, + 555, 566, 550, 538, 531, 539, 0, 196, 221, 368, + 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, + 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, + 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, + 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, + 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, + 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, + 488, 489, 490, 491, 492, 500, 501, 516, 586, 588, + 605, 625, 632, 480, 301, 302, 444, 445, 314, 315, + 646, 647, 300, 600, 633, 597, 645, 627, 438, 378, + 0, 0, 381, 281, 305, 320, 0, 617, 502, 227, + 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, + 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, + 241, 485, 519, 520, 521, 523, 395, 266, 433, 396, + 0, 376, 576, 577, 316, 0, 0, 0, 528, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, + 0, 0, 0, 366, 267, 0, 1914, 204, 505, 0, + 430, 0, 203, 0, 487, 252, 377, 374, 583, 282, + 273, 269, 250, 317, 385, 428, 518, 422, 0, 370, + 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 323, 248, 325, 202, 413, 498, 286, 0, + 0, 0, 0, 0, 507, 724, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, + 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, + 357, 363, 336, 345, 0, 0, 609, 0, 0, 0, + 265, 321, 272, 264, 580, 0, 0, 0, 0, 0, + 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, - 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 253, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 297, 0, 402, 257, 0, 453, 0, 0, 0, + 629, 0, 0, 0, 0, 0, 0, 0, 365, 0, + 330, 197, 225, 0, 0, 412, 461, 473, 0, 0, + 0, 253, 0, 471, 426, 604, 233, 284, 458, 432, + 469, 440, 287, 0, 0, 470, 372, 585, 450, 601, + 630, 631, 263, 406, 615, 522, 623, 648, 226, 260, + 420, 506, 607, 494, 397, 581, 582, 329, 493, 295, + 201, 369, 636, 224, 479, 371, 242, 231, 587, 612, + 299, 289, 456, 643, 213, 517, 598, 239, 483, 0, + 0, 651, 247, 504, 610, 599, 215, 594, 503, 393, + 326, 327, 214, 0, 457, 268, 293, 0, 0, 258, + 415, 589, 590, 256, 652, 228, 622, 220, 0, 621, + 408, 584, 595, 394, 383, 219, 593, 392, 382, 334, + 355, 356, 280, 307, 447, 375, 448, 306, 308, 404, + 403, 405, 207, 608, 626, 0, 208, 0, 499, 611, + 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 199, 0, 0, 0, 0, - 254, 255, 0, 574, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 0, 0, 0, 0, 0, 398, 0, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, + 579, 602, 616, 628, 634, 635, 637, 638, 639, 640, + 641, 644, 642, 407, 311, 495, 333, 373, 0, 0, + 425, 472, 240, 606, 496, 199, 0, 0, 0, 0, + 254, 255, 0, 575, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 649, 508, 514, 509, 510, 511, 512, 513, 0, + 515, 0, 0, 0, 0, 0, 398, 0, 591, 592, + 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 0, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, + 364, 249, 210, 390, 399, 578, 312, 216, 217, 218, + 524, 525, 526, 527, 619, 620, 624, 205, 462, 463, + 464, 465, 292, 614, 309, 468, 467, 331, 332, 379, + 449, 540, 542, 553, 557, 559, 561, 567, 570, 541, + 543, 554, 558, 560, 562, 568, 571, 530, 532, 534, + 536, 549, 548, 545, 573, 574, 551, 556, 535, 547, + 552, 565, 572, 569, 529, 533, 537, 546, 564, 563, + 544, 555, 566, 550, 538, 531, 539, 0, 196, 221, + 368, 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1042, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, + 482, 488, 489, 490, 491, 492, 500, 501, 516, 586, + 588, 605, 625, 632, 480, 301, 302, 444, 445, 314, + 315, 646, 647, 300, 600, 633, 597, 645, 627, 438, + 378, 0, 0, 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 396, 0, 376, 575, 576, 316, 0, 0, 527, 0, + 459, 241, 485, 519, 520, 521, 523, 395, 266, 433, + 396, 0, 376, 576, 577, 316, 0, 0, 0, 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, - 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, - 430, 0, 203, 0, 487, 252, 377, 374, 582, 282, - 273, 269, 250, 317, 385, 428, 517, 422, 0, 370, - 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, - 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, - 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, - 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, - 0, 0, 606, 0, 0, 0, 265, 321, 272, 264, - 579, 0, 0, 0, 0, 0, 0, 0, 0, 229, + 0, 416, 0, 0, 0, 0, 0, 0, 0, 270, + 0, 0, 0, 0, 366, 267, 0, 1912, 204, 505, + 0, 430, 0, 203, 0, 487, 252, 377, 374, 583, + 282, 273, 269, 250, 317, 385, 428, 518, 422, 0, + 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, + 0, 0, 0, 0, 0, 507, 724, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, + 0, 0, 0, 351, 360, 359, 339, 340, 342, 344, + 350, 357, 363, 336, 345, 0, 0, 609, 0, 0, + 0, 265, 321, 272, 264, 580, 0, 0, 0, 0, + 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 0, 402, 257, - 0, 453, 0, 670, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, - 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, - 601, 233, 284, 458, 432, 469, 440, 287, 0, 0, - 470, 372, 584, 450, 598, 625, 626, 263, 406, 611, - 521, 619, 643, 226, 260, 420, 506, 604, 494, 397, - 580, 581, 329, 493, 295, 201, 369, 631, 224, 479, - 371, 242, 231, 586, 608, 299, 289, 456, 638, 213, - 516, 596, 239, 483, 0, 0, 646, 247, 504, 215, - 593, 503, 393, 326, 327, 214, 0, 457, 268, 293, - 0, 0, 258, 415, 588, 589, 256, 647, 228, 618, - 220, 0, 617, 408, 583, 594, 394, 383, 219, 592, - 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, - 306, 308, 404, 403, 405, 207, 605, 0, 208, 0, - 499, 607, 648, 452, 212, 234, 235, 237, 0, 279, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, + 0, 629, 0, 0, 0, 0, 0, 0, 0, 365, + 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, + 0, 0, 253, 0, 471, 426, 604, 233, 284, 458, + 432, 469, 440, 287, 0, 0, 470, 372, 585, 450, + 601, 630, 631, 263, 406, 615, 522, 623, 648, 226, + 260, 420, 506, 607, 494, 397, 581, 582, 329, 493, + 295, 201, 369, 636, 224, 479, 371, 242, 231, 587, + 612, 299, 289, 456, 643, 213, 517, 598, 239, 483, + 0, 0, 651, 247, 504, 610, 599, 215, 594, 503, + 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, + 258, 415, 589, 590, 256, 652, 228, 622, 220, 0, + 621, 408, 584, 595, 394, 383, 219, 593, 392, 382, + 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, + 404, 403, 405, 207, 608, 626, 0, 208, 0, 499, + 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, + 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, + 0, 579, 602, 616, 628, 634, 635, 637, 638, 639, + 640, 641, 644, 642, 407, 311, 495, 333, 373, 0, + 0, 425, 472, 240, 606, 496, 199, 0, 0, 0, + 0, 254, 255, 0, 575, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 649, 508, 514, 509, 510, 511, 512, 513, + 0, 515, 0, 0, 0, 0, 0, 398, 0, 591, + 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, + 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, + 358, 364, 249, 210, 390, 399, 578, 312, 216, 217, + 218, 524, 525, 526, 527, 619, 620, 624, 205, 462, + 463, 464, 465, 292, 614, 309, 468, 467, 331, 332, + 379, 449, 540, 542, 553, 557, 559, 561, 567, 570, + 541, 543, 554, 558, 560, 562, 568, 571, 530, 532, + 534, 536, 549, 548, 545, 573, 574, 551, 556, 535, + 547, 552, 565, 572, 569, 529, 533, 537, 546, 564, + 563, 544, 555, 566, 550, 538, 531, 539, 0, 196, + 221, 368, 0, 454, 288, 650, 618, 484, 613, 206, + 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, + 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, + 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, + 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, + 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, + 481, 482, 488, 489, 490, 491, 492, 500, 501, 516, + 586, 588, 605, 625, 632, 480, 301, 302, 444, 445, + 314, 315, 646, 647, 300, 600, 633, 597, 645, 627, + 438, 378, 0, 0, 381, 281, 305, 320, 0, 617, + 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, + 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, + 244, 459, 241, 485, 519, 520, 521, 523, 395, 266, + 433, 396, 0, 376, 576, 577, 316, 0, 0, 0, + 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, + 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, + 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, + 583, 282, 273, 269, 250, 317, 385, 428, 518, 422, + 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 323, 248, 325, 202, 413, 498, + 286, 0, 1887, 0, 0, 0, 507, 724, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, + 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, + 344, 350, 357, 363, 336, 345, 0, 0, 609, 0, + 0, 0, 265, 321, 272, 264, 580, 0, 0, 0, + 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 297, 0, 402, 257, 0, 453, 0, + 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, + 365, 0, 330, 197, 225, 0, 0, 412, 461, 473, + 0, 0, 0, 253, 0, 471, 426, 604, 233, 284, + 458, 432, 469, 440, 287, 0, 0, 470, 372, 585, + 450, 601, 630, 631, 263, 406, 615, 522, 623, 648, + 226, 260, 420, 506, 607, 494, 397, 581, 582, 329, + 493, 295, 201, 369, 636, 224, 479, 371, 242, 231, + 587, 612, 299, 289, 456, 643, 213, 517, 598, 239, + 483, 0, 0, 651, 247, 504, 610, 599, 215, 594, + 503, 393, 326, 327, 214, 0, 457, 268, 293, 0, + 0, 258, 415, 589, 590, 256, 652, 228, 622, 220, + 0, 621, 408, 584, 595, 394, 383, 219, 593, 392, + 382, 334, 355, 356, 280, 307, 447, 375, 448, 306, + 308, 404, 403, 405, 207, 608, 626, 0, 208, 0, + 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, - 451, 0, 578, 599, 612, 623, 629, 630, 632, 633, - 634, 635, 636, 639, 637, 407, 311, 495, 333, 373, - 0, 0, 425, 472, 240, 603, 496, 199, 0, 0, - 0, 0, 254, 255, 0, 574, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 644, 507, 513, 508, 509, 510, 511, - 512, 0, 514, 0, 0, 0, 0, 0, 398, 0, - 590, 591, 667, 384, 486, 600, 335, 349, 352, 341, + 451, 0, 579, 602, 616, 628, 634, 635, 637, 638, + 639, 640, 641, 644, 642, 407, 311, 495, 333, 373, + 0, 0, 425, 472, 240, 606, 496, 199, 0, 0, + 0, 0, 254, 255, 0, 575, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 649, 508, 514, 509, 510, 511, 512, + 513, 0, 515, 0, 0, 0, 0, 0, 398, 0, + 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, - 354, 358, 364, 249, 210, 390, 399, 577, 312, 216, - 217, 218, 523, 524, 525, 526, 615, 616, 620, 205, - 462, 463, 464, 465, 292, 610, 309, 468, 467, 331, - 332, 379, 449, 539, 541, 552, 556, 558, 560, 566, - 569, 540, 542, 553, 557, 559, 561, 567, 570, 529, - 531, 533, 535, 548, 547, 544, 572, 573, 550, 555, - 534, 546, 551, 564, 571, 568, 528, 532, 536, 545, - 563, 562, 543, 554, 565, 549, 537, 530, 538, 0, - 196, 221, 368, 0, 454, 288, 645, 614, 484, 609, + 354, 358, 364, 249, 210, 390, 399, 578, 312, 216, + 217, 218, 524, 525, 526, 527, 619, 620, 624, 205, + 462, 463, 464, 465, 292, 614, 309, 468, 467, 331, + 332, 379, 449, 540, 542, 553, 557, 559, 561, 567, + 570, 541, 543, 554, 558, 560, 562, 568, 571, 530, + 532, 534, 536, 549, 548, 545, 573, 574, 551, 556, + 535, 547, 552, 565, 572, 569, 529, 533, 537, 546, + 564, 563, 544, 555, 566, 550, 538, 531, 539, 0, + 196, 221, 368, 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, @@ -7037,102 +6684,177 @@ var yyAct = [...]int{ 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, 501, - 515, 585, 587, 602, 621, 627, 480, 301, 302, 444, - 445, 314, 315, 641, 642, 300, 597, 628, 595, 640, - 622, 438, 378, 0, 0, 381, 281, 305, 320, 0, - 613, 502, 227, 466, 290, 251, 0, 0, 211, 246, + 516, 586, 588, 605, 625, 632, 480, 301, 302, 444, + 445, 314, 315, 646, 647, 300, 600, 633, 597, 645, + 627, 438, 378, 0, 0, 381, 281, 305, 320, 0, + 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, - 271, 244, 459, 241, 485, 518, 519, 520, 522, 395, - 266, 433, 396, 0, 376, 575, 576, 316, 0, 0, - 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, - 270, 0, 0, 0, 0, 366, 267, 0, 0, 204, - 505, 0, 430, 0, 203, 0, 487, 252, 377, 374, - 582, 282, 273, 269, 250, 317, 385, 428, 517, 422, - 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, + 271, 244, 459, 241, 485, 519, 520, 521, 523, 395, + 266, 433, 396, 0, 376, 576, 577, 316, 0, 0, + 0, 528, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, + 1784, 270, 0, 0, 0, 0, 366, 267, 0, 0, + 204, 505, 0, 430, 0, 203, 0, 487, 252, 377, + 374, 583, 282, 273, 269, 250, 317, 385, 428, 518, + 422, 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, - 0, 0, 0, 717, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, - 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, - 336, 345, 0, 0, 606, 0, 0, 0, 265, 321, - 272, 264, 579, 0, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, + 498, 286, 0, 0, 0, 0, 0, 507, 194, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, + 0, 245, 0, 0, 0, 351, 360, 359, 339, 340, + 342, 344, 350, 357, 363, 336, 345, 0, 0, 609, + 0, 0, 0, 265, 321, 272, 264, 580, 0, 0, + 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, - 402, 257, 0, 453, 0, 0, 0, 624, 0, 0, - 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, - 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, - 471, 426, 601, 233, 284, 458, 432, 469, 440, 287, - 0, 0, 470, 372, 584, 450, 598, 625, 626, 263, - 406, 611, 521, 619, 643, 226, 260, 420, 506, 604, - 494, 397, 580, 581, 329, 493, 295, 201, 369, 631, - 224, 479, 371, 242, 231, 586, 608, 299, 289, 456, - 638, 213, 516, 596, 239, 483, 0, 0, 646, 247, - 504, 215, 593, 503, 393, 326, 327, 214, 0, 457, - 268, 293, 0, 0, 258, 415, 588, 589, 256, 647, - 228, 618, 220, 0, 617, 408, 583, 594, 394, 383, - 219, 592, 392, 382, 334, 355, 356, 280, 307, 447, - 375, 448, 306, 308, 404, 403, 405, 207, 605, 0, - 208, 0, 499, 607, 648, 452, 212, 234, 235, 237, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, + 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, + 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, + 473, 0, 0, 0, 253, 0, 471, 426, 604, 233, + 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, + 585, 450, 601, 630, 631, 263, 406, 615, 522, 623, + 648, 226, 260, 420, 506, 607, 494, 397, 581, 582, + 329, 493, 295, 201, 369, 636, 224, 479, 371, 242, + 231, 587, 612, 299, 289, 456, 643, 213, 517, 598, + 239, 483, 0, 0, 651, 247, 504, 610, 599, 215, + 594, 503, 393, 326, 327, 214, 0, 457, 268, 293, + 0, 0, 258, 415, 589, 590, 256, 652, 228, 622, + 220, 0, 621, 408, 584, 595, 394, 383, 219, 593, + 392, 382, 334, 355, 356, 280, 307, 447, 375, 448, + 306, 308, 404, 403, 405, 207, 608, 626, 0, 208, + 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, + 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, + 442, 451, 0, 579, 602, 616, 628, 634, 635, 637, + 638, 639, 640, 641, 644, 642, 407, 311, 495, 333, + 373, 0, 0, 425, 472, 240, 606, 496, 199, 0, + 0, 0, 0, 254, 255, 0, 575, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 649, 508, 514, 509, 510, 511, + 512, 513, 0, 515, 0, 0, 0, 0, 0, 398, + 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, + 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, + 353, 354, 358, 364, 249, 210, 390, 399, 578, 312, + 216, 217, 218, 524, 525, 526, 527, 619, 620, 624, + 205, 462, 463, 464, 465, 292, 614, 309, 468, 467, + 331, 332, 379, 449, 540, 542, 553, 557, 559, 561, + 567, 570, 541, 543, 554, 558, 560, 562, 568, 571, + 530, 532, 534, 536, 549, 548, 545, 573, 574, 551, + 556, 535, 547, 552, 565, 572, 569, 529, 533, 537, + 546, 564, 563, 544, 555, 566, 550, 538, 531, 539, + 0, 196, 221, 368, 0, 454, 288, 650, 618, 484, + 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, + 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, + 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, + 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, + 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, + 477, 478, 481, 482, 488, 489, 490, 491, 492, 500, + 501, 516, 586, 588, 605, 625, 632, 480, 301, 302, + 444, 445, 314, 315, 646, 647, 300, 600, 633, 597, + 645, 627, 438, 378, 0, 0, 381, 281, 305, 320, + 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, + 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, + 296, 271, 244, 459, 241, 485, 519, 520, 521, 523, + 395, 266, 433, 396, 0, 376, 576, 577, 316, 0, + 0, 0, 528, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, + 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, + 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, + 377, 374, 583, 282, 273, 269, 250, 317, 385, 428, + 518, 422, 0, 370, 0, 0, 497, 401, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 323, 248, 325, 202, + 413, 498, 286, 0, 95, 0, 0, 0, 507, 959, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, + 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, + 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, + 609, 0, 0, 0, 265, 321, 272, 264, 580, 0, + 0, 0, 0, 0, 0, 596, 0, 0, 229, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 297, 0, 402, 257, 0, + 453, 0, 0, 0, 629, 0, 0, 0, 0, 0, + 0, 0, 365, 0, 330, 197, 225, 0, 0, 412, + 461, 473, 0, 0, 0, 253, 0, 471, 426, 604, + 233, 284, 458, 432, 469, 440, 287, 0, 0, 470, + 372, 585, 450, 601, 630, 631, 263, 406, 615, 522, + 623, 648, 226, 260, 420, 506, 607, 494, 397, 581, + 582, 329, 493, 295, 201, 369, 636, 224, 479, 371, + 242, 231, 587, 612, 299, 289, 456, 643, 213, 517, + 598, 239, 483, 0, 0, 651, 247, 504, 610, 599, + 215, 594, 503, 393, 326, 327, 214, 0, 457, 268, + 293, 0, 0, 258, 415, 589, 590, 256, 652, 228, + 622, 220, 0, 621, 408, 584, 595, 394, 383, 219, + 593, 392, 382, 334, 355, 356, 280, 307, 447, 375, + 448, 306, 308, 404, 403, 405, 207, 608, 626, 0, + 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, - 446, 442, 451, 0, 578, 599, 612, 623, 629, 630, - 632, 633, 634, 635, 636, 639, 637, 407, 311, 495, - 333, 373, 0, 0, 425, 472, 240, 603, 496, 199, - 0, 0, 0, 0, 254, 255, 0, 574, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 664, 665, 666, 644, 507, 513, 508, 509, - 510, 511, 512, 0, 514, 0, 0, 0, 0, 0, - 398, 0, 590, 591, 667, 384, 486, 600, 335, 349, + 446, 442, 451, 0, 579, 602, 616, 628, 634, 635, + 637, 638, 639, 640, 641, 644, 642, 407, 311, 495, + 333, 373, 0, 0, 425, 472, 240, 606, 496, 199, + 0, 0, 0, 0, 254, 255, 0, 575, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 649, 508, 514, 509, 510, + 511, 512, 513, 0, 515, 0, 0, 0, 0, 0, + 398, 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, - 348, 353, 354, 358, 364, 249, 210, 390, 399, 577, - 312, 216, 217, 218, 523, 524, 525, 526, 615, 616, - 620, 205, 462, 463, 464, 465, 292, 610, 309, 468, - 467, 331, 332, 379, 449, 539, 541, 552, 556, 558, - 560, 566, 569, 540, 542, 553, 557, 559, 561, 567, - 570, 529, 531, 533, 535, 548, 547, 544, 572, 573, - 550, 555, 534, 546, 551, 564, 571, 568, 528, 532, - 536, 545, 563, 562, 543, 554, 565, 549, 537, 530, - 538, 0, 196, 221, 368, 0, 454, 288, 645, 614, - 484, 609, 206, 223, 0, 262, 0, 0, 0, 0, + 348, 353, 354, 358, 364, 249, 210, 390, 399, 578, + 312, 216, 217, 218, 524, 525, 526, 527, 619, 620, + 624, 205, 462, 463, 464, 465, 292, 614, 309, 468, + 467, 331, 332, 379, 449, 540, 542, 553, 557, 559, + 561, 567, 570, 541, 543, 554, 558, 560, 562, 568, + 571, 530, 532, 534, 536, 549, 548, 545, 573, 574, + 551, 556, 535, 547, 552, 565, 572, 569, 529, 533, + 537, 546, 564, 563, 544, 555, 566, 550, 538, 531, + 539, 0, 196, 221, 368, 0, 454, 288, 650, 618, + 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, - 318, 319, 322, 328, 380, 386, 387, 388, 389, 4111, + 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, 492, - 500, 501, 515, 585, 587, 602, 621, 627, 480, 301, - 302, 444, 445, 314, 315, 641, 642, 300, 597, 628, - 595, 640, 622, 438, 378, 0, 0, 381, 281, 305, - 320, 0, 613, 502, 227, 466, 290, 251, 0, 0, + 500, 501, 516, 586, 588, 605, 625, 632, 480, 301, + 302, 444, 445, 314, 315, 646, 647, 300, 600, 633, + 597, 645, 627, 438, 378, 0, 0, 381, 281, 305, + 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, - 434, 296, 271, 244, 459, 241, 485, 518, 519, 520, - 522, 395, 266, 433, 396, 0, 376, 575, 576, 316, - 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, - 0, 0, 270, 0, 0, 0, 0, 366, 267, 0, - 0, 204, 505, 0, 430, 0, 203, 0, 487, 252, - 377, 374, 582, 282, 273, 269, 250, 317, 385, 428, - 517, 422, 0, 370, 0, 0, 497, 401, 0, 0, + 434, 296, 271, 244, 459, 241, 485, 519, 520, 521, + 523, 395, 266, 433, 396, 0, 376, 576, 577, 316, + 0, 0, 0, 528, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, + 0, 0, 0, 270, 0, 0, 0, 0, 366, 267, + 0, 0, 204, 505, 0, 430, 0, 203, 0, 487, + 252, 377, 374, 583, 282, 273, 269, 250, 317, 385, + 428, 518, 422, 0, 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, - 0, 0, 0, 0, 0, 717, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, - 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, - 357, 363, 336, 345, 0, 0, 606, 0, 0, 0, - 265, 321, 272, 264, 579, 0, 0, 0, 0, 0, - 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, + 202, 413, 498, 286, 0, 0, 0, 0, 0, 507, + 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 238, 0, 0, 245, 0, 0, 0, 351, 360, 359, + 339, 340, 342, 344, 350, 357, 363, 336, 345, 0, + 0, 609, 0, 0, 0, 265, 321, 272, 264, 580, + 0, 0, 0, 0, 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7140,145 +6862,295 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 402, 257, 0, 453, 0, 0, 0, 624, - 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, - 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, - 253, 0, 471, 426, 601, 233, 284, 458, 432, 469, - 440, 287, 0, 0, 470, 372, 584, 450, 598, 625, - 626, 263, 406, 611, 521, 619, 643, 226, 260, 420, - 506, 604, 494, 397, 580, 581, 329, 493, 295, 201, - 369, 631, 224, 479, 371, 242, 231, 586, 608, 299, - 289, 456, 638, 213, 516, 596, 239, 483, 0, 0, - 646, 247, 504, 215, 593, 503, 393, 326, 327, 214, - 0, 457, 268, 293, 0, 0, 258, 415, 588, 589, - 256, 647, 228, 618, 220, 0, 617, 408, 583, 594, - 394, 383, 219, 592, 392, 382, 334, 355, 356, 280, - 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, - 605, 0, 208, 0, 499, 607, 648, 452, 212, 234, + 0, 0, 0, 0, 1456, 0, 297, 0, 402, 257, + 0, 453, 0, 0, 0, 629, 0, 0, 0, 0, + 0, 0, 0, 365, 0, 330, 197, 225, 0, 0, + 412, 461, 473, 0, 0, 0, 253, 0, 471, 426, + 604, 233, 284, 458, 432, 469, 440, 287, 0, 0, + 470, 372, 585, 450, 601, 630, 631, 263, 406, 615, + 522, 623, 648, 226, 260, 420, 506, 607, 494, 397, + 581, 582, 329, 493, 295, 201, 369, 636, 224, 479, + 371, 242, 231, 587, 612, 299, 289, 456, 643, 213, + 517, 598, 239, 483, 0, 0, 651, 247, 504, 610, + 599, 215, 594, 503, 393, 326, 327, 214, 0, 457, + 268, 293, 0, 0, 258, 415, 589, 590, 256, 652, + 228, 622, 220, 0, 621, 408, 584, 595, 394, 383, + 219, 593, 392, 382, 334, 355, 356, 280, 307, 447, + 375, 448, 306, 308, 404, 403, 405, 207, 608, 626, + 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, + 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, + 419, 446, 442, 451, 0, 579, 602, 616, 628, 634, + 635, 637, 638, 639, 640, 641, 644, 642, 407, 311, + 495, 333, 373, 0, 0, 425, 472, 240, 606, 496, + 199, 0, 0, 0, 0, 254, 255, 0, 575, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 649, 508, 514, 509, + 510, 511, 512, 513, 0, 515, 0, 0, 0, 0, + 0, 398, 0, 591, 592, 672, 384, 486, 603, 335, + 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, + 347, 348, 353, 354, 358, 364, 249, 210, 390, 399, + 578, 312, 216, 217, 218, 524, 525, 526, 527, 619, + 620, 624, 205, 462, 463, 464, 465, 292, 614, 309, + 468, 467, 331, 332, 379, 449, 540, 542, 553, 557, + 559, 561, 567, 570, 541, 543, 554, 558, 560, 562, + 568, 571, 530, 532, 534, 536, 549, 548, 545, 573, + 574, 551, 556, 535, 547, 552, 565, 572, 569, 529, + 533, 537, 546, 564, 563, 544, 555, 566, 550, 538, + 531, 539, 0, 196, 221, 368, 0, 454, 288, 650, + 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, + 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, + 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, + 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, + 475, 476, 477, 478, 481, 482, 488, 489, 490, 491, + 492, 500, 501, 516, 586, 588, 605, 625, 632, 480, + 301, 302, 444, 445, 314, 315, 646, 647, 1455, 600, + 633, 597, 645, 627, 438, 378, 0, 0, 381, 281, + 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, + 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, + 429, 434, 296, 271, 244, 459, 241, 485, 519, 520, + 521, 523, 395, 266, 433, 396, 0, 376, 576, 577, + 316, 0, 0, 0, 528, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, + 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, + 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, + 487, 252, 377, 374, 583, 282, 273, 269, 250, 317, + 385, 428, 518, 422, 0, 370, 0, 0, 497, 401, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 323, 248, + 325, 202, 413, 498, 286, 0, 0, 0, 0, 0, + 507, 194, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 238, 0, 0, 245, 0, 0, 0, 351, 360, + 359, 339, 340, 342, 344, 350, 357, 363, 336, 345, + 0, 0, 609, 0, 0, 0, 265, 321, 272, 264, + 580, 0, 0, 0, 0, 0, 0, 596, 0, 0, + 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 297, 0, 402, + 257, 0, 453, 0, 0, 0, 629, 0, 0, 0, + 0, 0, 0, 0, 365, 0, 330, 197, 225, 0, + 0, 412, 461, 473, 0, 0, 0, 253, 0, 471, + 426, 604, 233, 284, 458, 432, 469, 440, 287, 0, + 0, 470, 372, 585, 450, 601, 630, 631, 263, 406, + 615, 522, 623, 648, 226, 260, 420, 506, 607, 494, + 397, 581, 582, 329, 493, 295, 201, 369, 636, 224, + 479, 371, 242, 231, 587, 612, 299, 289, 456, 643, + 213, 517, 598, 239, 483, 0, 0, 651, 247, 504, + 610, 599, 215, 594, 503, 393, 326, 327, 214, 0, + 457, 268, 293, 0, 0, 258, 415, 589, 590, 256, + 652, 228, 622, 220, 0, 621, 408, 584, 595, 394, + 383, 219, 593, 392, 382, 334, 355, 356, 280, 307, + 447, 375, 448, 306, 308, 404, 403, 405, 207, 608, + 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, - 367, 419, 446, 442, 451, 0, 578, 599, 612, 623, - 629, 630, 632, 633, 634, 635, 636, 639, 637, 407, - 311, 495, 333, 373, 0, 0, 425, 472, 240, 603, - 496, 199, 0, 0, 0, 0, 254, 255, 0, 574, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 644, 507, 513, - 508, 509, 510, 511, 512, 0, 514, 0, 0, 0, - 0, 0, 398, 0, 590, 591, 667, 384, 486, 600, + 367, 419, 446, 442, 451, 0, 579, 602, 616, 628, + 634, 635, 637, 638, 639, 640, 641, 644, 642, 407, + 311, 495, 333, 373, 0, 0, 425, 472, 240, 606, + 496, 199, 0, 0, 0, 0, 254, 255, 0, 575, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 649, 508, 514, + 509, 510, 511, 512, 513, 0, 515, 0, 0, 0, + 0, 0, 398, 0, 591, 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, 210, 390, - 399, 577, 312, 216, 217, 218, 523, 524, 525, 526, - 615, 616, 620, 205, 462, 463, 464, 465, 292, 610, - 309, 468, 467, 331, 332, 379, 449, 539, 541, 552, - 556, 558, 560, 566, 569, 540, 542, 553, 557, 559, - 561, 567, 570, 529, 531, 533, 535, 548, 547, 544, - 572, 573, 550, 555, 534, 546, 551, 564, 571, 568, - 528, 532, 536, 545, 563, 562, 543, 554, 565, 549, - 537, 530, 538, 0, 196, 221, 368, 0, 454, 288, - 645, 614, 484, 609, 206, 223, 0, 262, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 399, 578, 312, 216, 217, 218, 524, 525, 526, 527, + 619, 620, 624, 205, 462, 463, 464, 465, 292, 614, + 309, 468, 467, 331, 332, 379, 449, 540, 542, 553, + 557, 559, 561, 567, 570, 541, 543, 554, 558, 560, + 562, 568, 571, 530, 532, 534, 536, 549, 548, 545, + 573, 574, 551, 556, 535, 547, 552, 565, 572, 569, + 529, 533, 537, 546, 564, 563, 544, 555, 566, 550, + 538, 531, 539, 0, 196, 221, 368, 0, 454, 288, + 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1049, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, 490, - 491, 492, 500, 501, 515, 585, 587, 602, 621, 627, - 480, 301, 302, 444, 445, 314, 315, 641, 642, 300, - 597, 628, 595, 640, 622, 438, 378, 0, 0, 381, - 281, 305, 320, 0, 613, 502, 227, 466, 290, 251, + 491, 492, 500, 501, 516, 586, 588, 605, 625, 632, + 480, 301, 302, 444, 445, 314, 315, 646, 647, 300, + 600, 633, 597, 645, 627, 438, 378, 0, 0, 381, + 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, - 400, 429, 434, 296, 271, 244, 459, 241, 485, 518, - 519, 520, 522, 395, 266, 433, 396, 0, 376, 575, - 576, 316, 0, 0, 527, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, - 0, 0, 0, 0, 270, 0, 0, 0, 0, 366, - 267, 0, 0, 204, 505, 0, 430, 0, 203, 0, - 487, 252, 377, 374, 582, 282, 273, 269, 250, 317, - 385, 428, 517, 422, 0, 370, 0, 0, 497, 401, + 400, 429, 434, 296, 271, 244, 459, 241, 485, 519, + 520, 521, 523, 395, 266, 433, 396, 0, 376, 576, + 577, 316, 0, 0, 0, 528, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, + 0, 0, 0, 0, 0, 270, 0, 0, 0, 0, + 366, 267, 0, 0, 204, 505, 0, 430, 0, 203, + 0, 487, 252, 377, 374, 583, 282, 273, 269, 250, + 317, 385, 428, 518, 422, 0, 370, 0, 0, 497, + 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, + 248, 325, 202, 413, 498, 286, 0, 0, 0, 0, + 0, 507, 194, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 238, 0, 0, 245, 0, 0, 0, 351, + 360, 359, 339, 340, 342, 344, 350, 357, 363, 336, + 345, 0, 0, 609, 0, 0, 0, 265, 321, 272, + 264, 580, 0, 0, 0, 0, 0, 0, 596, 0, + 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 323, 248, 325, 202, 413, - 498, 286, 0, 0, 0, 0, 0, 952, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, - 245, 0, 0, 0, 351, 360, 359, 339, 340, 342, - 344, 350, 357, 363, 336, 345, 0, 0, 606, 0, - 0, 0, 265, 321, 272, 264, 579, 0, 0, 0, - 0, 0, 0, 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, + 402, 257, 0, 453, 0, 675, 0, 629, 0, 0, + 0, 0, 0, 0, 0, 365, 0, 330, 197, 225, + 0, 0, 412, 461, 473, 0, 0, 0, 253, 0, + 471, 426, 604, 233, 284, 458, 432, 469, 440, 287, + 0, 0, 470, 372, 585, 450, 601, 630, 631, 263, + 406, 615, 522, 623, 648, 226, 260, 420, 506, 607, + 494, 397, 581, 582, 329, 493, 295, 201, 369, 636, + 224, 479, 371, 242, 231, 587, 612, 299, 289, 456, + 643, 213, 517, 598, 239, 483, 0, 0, 651, 247, + 504, 610, 599, 215, 594, 503, 393, 326, 327, 214, + 0, 457, 268, 293, 0, 0, 258, 415, 589, 590, + 256, 652, 228, 622, 220, 0, 621, 408, 584, 595, + 394, 383, 219, 593, 392, 382, 334, 355, 356, 280, + 307, 447, 375, 448, 306, 308, 404, 403, 405, 207, + 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, + 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, + 313, 367, 419, 446, 442, 451, 0, 579, 602, 616, + 628, 634, 635, 637, 638, 639, 640, 641, 644, 642, + 407, 311, 495, 333, 373, 0, 0, 425, 472, 240, + 606, 496, 199, 0, 0, 0, 0, 254, 255, 0, + 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 649, 508, + 514, 509, 510, 511, 512, 513, 0, 515, 0, 0, + 0, 0, 0, 398, 0, 591, 592, 672, 384, 486, + 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, + 343, 346, 347, 348, 353, 354, 358, 364, 249, 210, + 390, 399, 578, 312, 216, 217, 218, 524, 525, 526, + 527, 619, 620, 624, 205, 462, 463, 464, 465, 292, + 614, 309, 468, 467, 331, 332, 379, 449, 540, 542, + 553, 557, 559, 561, 567, 570, 541, 543, 554, 558, + 560, 562, 568, 571, 530, 532, 534, 536, 549, 548, + 545, 573, 574, 551, 556, 535, 547, 552, 565, 572, + 569, 529, 533, 537, 546, 564, 563, 544, 555, 566, + 550, 538, 531, 539, 0, 196, 221, 368, 0, 454, + 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, + 285, 298, 310, 318, 319, 322, 328, 380, 386, 387, + 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, + 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, + 460, 474, 475, 476, 477, 478, 481, 482, 488, 489, + 490, 491, 492, 500, 501, 516, 586, 588, 605, 625, + 632, 480, 301, 302, 444, 445, 314, 315, 646, 647, + 300, 600, 633, 597, 645, 627, 438, 378, 0, 0, + 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, + 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, + 391, 400, 429, 434, 296, 271, 244, 459, 241, 485, + 519, 520, 521, 523, 395, 266, 433, 396, 0, 376, + 576, 577, 316, 0, 0, 0, 528, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, + 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, + 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, + 203, 0, 487, 252, 377, 374, 583, 282, 273, 269, + 250, 317, 385, 428, 518, 422, 0, 370, 0, 0, + 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 323, 248, 325, 202, 413, 498, 286, 0, 0, 0, + 0, 0, 507, 724, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 238, 0, 0, 245, 0, 0, 0, + 351, 360, 359, 339, 340, 342, 344, 350, 357, 363, + 336, 345, 0, 0, 609, 0, 0, 0, 265, 321, + 272, 264, 580, 0, 0, 0, 0, 0, 0, 596, + 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, - 0, 624, 0, 0, 0, 0, 0, 0, 0, 365, - 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, - 0, 0, 253, 0, 471, 426, 601, 233, 284, 458, - 432, 469, 440, 287, 0, 0, 470, 372, 584, 450, - 598, 625, 626, 263, 406, 611, 521, 619, 643, 226, - 260, 420, 506, 604, 494, 397, 580, 581, 329, 493, - 295, 201, 369, 631, 224, 479, 371, 242, 231, 586, - 608, 299, 289, 456, 638, 213, 516, 596, 239, 483, - 0, 0, 646, 247, 504, 215, 593, 503, 393, 326, - 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, - 588, 589, 256, 647, 228, 618, 220, 0, 617, 408, - 583, 594, 394, 383, 219, 592, 392, 382, 334, 355, - 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, - 405, 207, 605, 0, 208, 0, 499, 607, 648, 452, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, + 0, 402, 257, 0, 453, 0, 0, 0, 629, 0, + 0, 0, 0, 0, 0, 0, 365, 0, 330, 197, + 225, 0, 0, 412, 461, 473, 0, 0, 0, 253, + 0, 471, 426, 604, 233, 284, 458, 432, 469, 440, + 287, 0, 0, 470, 372, 585, 450, 601, 630, 631, + 263, 406, 615, 522, 623, 648, 226, 260, 420, 506, + 607, 494, 397, 581, 582, 329, 493, 295, 201, 369, + 636, 224, 479, 371, 242, 231, 587, 612, 299, 289, + 456, 643, 213, 517, 598, 239, 483, 0, 0, 651, + 247, 504, 610, 599, 215, 594, 503, 393, 326, 327, + 214, 0, 457, 268, 293, 0, 0, 258, 415, 589, + 590, 256, 652, 228, 622, 220, 0, 621, 408, 584, + 595, 394, 383, 219, 593, 392, 382, 334, 355, 356, + 280, 307, 447, 375, 448, 306, 308, 404, 403, 405, + 207, 608, 626, 0, 208, 0, 499, 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, - 304, 313, 367, 419, 446, 442, 451, 0, 578, 599, - 612, 623, 629, 630, 632, 633, 634, 635, 636, 639, - 637, 407, 311, 495, 333, 373, 0, 0, 425, 472, - 240, 603, 496, 199, 0, 0, 0, 0, 254, 255, - 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 644, - 507, 513, 508, 509, 510, 511, 512, 0, 514, 0, - 0, 0, 0, 0, 398, 0, 590, 591, 667, 384, - 486, 600, 335, 349, 352, 341, 361, 0, 362, 337, + 304, 313, 367, 419, 446, 442, 451, 0, 579, 602, + 616, 628, 634, 635, 637, 638, 639, 640, 641, 644, + 642, 407, 311, 495, 333, 373, 0, 0, 425, 472, + 240, 606, 496, 199, 0, 0, 0, 0, 254, 255, + 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 649, + 508, 514, 509, 510, 511, 512, 513, 0, 515, 0, + 0, 0, 0, 0, 398, 0, 591, 592, 672, 384, + 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, 249, - 210, 390, 399, 577, 312, 216, 217, 218, 523, 524, - 525, 526, 615, 616, 620, 205, 462, 463, 464, 465, - 292, 610, 309, 468, 467, 331, 332, 379, 449, 539, - 541, 552, 556, 558, 560, 566, 569, 540, 542, 553, - 557, 559, 561, 567, 570, 529, 531, 533, 535, 548, - 547, 544, 572, 573, 550, 555, 534, 546, 551, 564, - 571, 568, 528, 532, 536, 545, 563, 562, 543, 554, - 565, 549, 537, 530, 538, 0, 196, 221, 368, 0, - 454, 288, 645, 614, 484, 609, 206, 223, 0, 262, + 210, 390, 399, 578, 312, 216, 217, 218, 524, 525, + 526, 527, 619, 620, 624, 205, 462, 463, 464, 465, + 292, 614, 309, 468, 467, 331, 332, 379, 449, 540, + 542, 553, 557, 559, 561, 567, 570, 541, 543, 554, + 558, 560, 562, 568, 571, 530, 532, 534, 536, 549, + 548, 545, 573, 574, 551, 556, 535, 547, 552, 565, + 572, 569, 529, 533, 537, 546, 564, 563, 544, 555, + 566, 550, 538, 531, 539, 0, 196, 221, 368, 0, + 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, 386, - 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, + 387, 388, 389, 4136, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, 488, - 489, 490, 491, 492, 500, 501, 515, 585, 587, 602, - 621, 627, 480, 301, 302, 444, 445, 314, 315, 641, - 642, 300, 597, 628, 595, 640, 622, 438, 378, 0, - 0, 381, 281, 305, 320, 0, 613, 502, 227, 466, + 489, 490, 491, 492, 500, 501, 516, 586, 588, 605, + 625, 632, 480, 301, 302, 444, 445, 314, 315, 646, + 647, 300, 600, 633, 597, 645, 627, 438, 378, 0, + 0, 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, 241, - 485, 518, 519, 520, 522, 395, 266, 433, 396, 0, - 376, 575, 576, 316, 0, 0, 527, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, - 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, - 0, 366, 267, 0, 0, 204, 505, 0, 430, 0, - 203, 0, 487, 252, 377, 374, 582, 282, 273, 269, - 250, 317, 385, 428, 517, 422, 0, 370, 0, 0, - 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 248, 325, - 202, 413, 498, 286, 0, 0, 0, 0, 0, 194, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 0, 245, 0, 0, 0, 351, 360, 359, 339, - 340, 342, 344, 350, 357, 363, 336, 345, 0, 0, - 606, 0, 0, 0, 265, 321, 272, 264, 579, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, + 485, 519, 520, 521, 523, 395, 266, 433, 396, 0, + 376, 576, 577, 316, 0, 0, 0, 528, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, + 0, 0, 0, 0, 0, 0, 0, 270, 0, 0, + 0, 0, 366, 267, 0, 0, 204, 505, 0, 430, + 0, 203, 0, 487, 252, 377, 374, 583, 282, 273, + 269, 250, 317, 385, 428, 518, 422, 0, 370, 0, + 0, 497, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, + 0, 323, 248, 325, 202, 413, 498, 286, 0, 0, + 0, 0, 0, 507, 724, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 0, 245, 0, 0, + 0, 351, 360, 359, 339, 340, 342, 344, 350, 357, + 363, 336, 345, 0, 0, 609, 0, 0, 0, 265, + 321, 272, 264, 580, 0, 0, 0, 0, 0, 0, + 596, 0, 0, 229, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7286,42 +7158,117 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 297, 0, 402, 257, 0, 453, - 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, - 0, 365, 0, 330, 197, 225, 0, 0, 412, 461, - 473, 0, 0, 0, 253, 0, 471, 426, 601, 233, - 284, 458, 432, 469, 440, 287, 0, 0, 470, 372, - 584, 450, 598, 625, 626, 263, 406, 611, 521, 619, - 643, 226, 260, 420, 506, 604, 494, 397, 580, 581, - 329, 493, 295, 201, 369, 631, 224, 479, 371, 242, - 231, 586, 608, 299, 289, 456, 638, 213, 516, 596, - 239, 483, 0, 0, 646, 247, 504, 215, 593, 503, - 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, - 258, 415, 588, 589, 256, 647, 228, 618, 220, 0, - 617, 408, 583, 594, 394, 383, 219, 592, 392, 382, - 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, - 404, 403, 405, 207, 605, 0, 208, 0, 499, 607, - 648, 452, 212, 234, 235, 237, 0, 279, 283, 291, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 297, 0, 402, 257, 0, 453, 0, 0, 0, 629, + 0, 0, 0, 0, 0, 0, 0, 365, 0, 330, + 197, 225, 0, 0, 412, 461, 473, 0, 0, 0, + 253, 0, 471, 426, 604, 233, 284, 458, 432, 469, + 440, 287, 0, 0, 470, 372, 585, 450, 601, 630, + 631, 263, 406, 615, 522, 623, 648, 226, 260, 420, + 506, 607, 494, 397, 581, 582, 329, 493, 295, 201, + 369, 636, 224, 479, 371, 242, 231, 587, 612, 299, + 289, 456, 643, 213, 517, 598, 239, 483, 0, 0, + 651, 247, 504, 610, 599, 215, 594, 503, 393, 326, + 327, 214, 0, 457, 268, 293, 0, 0, 258, 415, + 589, 590, 256, 652, 228, 622, 220, 0, 621, 408, + 584, 595, 394, 383, 219, 593, 392, 382, 334, 355, + 356, 280, 307, 447, 375, 448, 306, 308, 404, 403, + 405, 207, 608, 626, 0, 208, 0, 499, 611, 653, + 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, + 303, 304, 313, 367, 419, 446, 442, 451, 0, 579, + 602, 616, 628, 634, 635, 637, 638, 639, 640, 641, + 644, 642, 407, 311, 495, 333, 373, 0, 0, 425, + 472, 240, 606, 496, 199, 0, 0, 0, 0, 254, + 255, 0, 575, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 649, 508, 514, 509, 510, 511, 512, 513, 0, 515, + 0, 0, 0, 0, 0, 398, 0, 591, 592, 672, + 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, + 337, 338, 343, 346, 347, 348, 353, 354, 358, 364, + 249, 210, 390, 399, 578, 312, 216, 217, 218, 524, + 525, 526, 527, 619, 620, 624, 205, 462, 463, 464, + 465, 292, 614, 309, 468, 467, 331, 332, 379, 449, + 540, 542, 553, 557, 559, 561, 567, 570, 541, 543, + 554, 558, 560, 562, 568, 571, 530, 532, 534, 536, + 549, 548, 545, 573, 574, 551, 556, 535, 547, 552, + 565, 572, 569, 529, 533, 537, 546, 564, 563, 544, + 555, 566, 550, 538, 531, 539, 0, 196, 221, 368, + 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, + 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 209, 222, 232, 236, 243, 261, + 276, 278, 285, 298, 310, 318, 319, 322, 328, 380, + 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, + 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, + 443, 455, 460, 474, 475, 476, 477, 478, 481, 482, + 488, 489, 490, 491, 492, 500, 501, 516, 586, 588, + 605, 625, 632, 480, 301, 302, 444, 445, 314, 315, + 646, 647, 300, 600, 633, 597, 645, 627, 438, 378, + 0, 0, 381, 281, 305, 320, 0, 617, 502, 227, + 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, + 277, 324, 391, 400, 429, 434, 296, 271, 244, 459, + 241, 485, 519, 520, 521, 523, 395, 266, 433, 396, + 0, 376, 576, 577, 316, 0, 0, 0, 528, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 416, 0, 0, 0, 0, 0, 0, 0, 270, 0, + 0, 0, 0, 366, 267, 0, 0, 204, 505, 0, + 430, 0, 203, 0, 487, 252, 377, 374, 583, 282, + 273, 269, 250, 317, 385, 428, 518, 422, 0, 370, + 0, 0, 497, 401, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 323, 248, 325, 202, 413, 498, 286, 0, + 0, 0, 0, 0, 507, 959, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 238, 0, 0, 245, 0, + 0, 0, 351, 360, 359, 339, 340, 342, 344, 350, + 357, 363, 336, 345, 0, 0, 609, 0, 0, 0, + 265, 321, 272, 264, 580, 0, 0, 0, 0, 0, + 0, 596, 0, 0, 229, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 297, 0, 402, 257, 0, 453, 0, 0, 0, + 629, 0, 0, 0, 0, 0, 0, 0, 365, 0, + 330, 197, 225, 0, 0, 412, 461, 473, 0, 0, + 0, 253, 0, 471, 426, 604, 233, 284, 458, 432, + 469, 440, 287, 0, 0, 470, 372, 585, 450, 601, + 630, 631, 263, 406, 615, 522, 623, 648, 226, 260, + 420, 506, 607, 494, 397, 581, 582, 329, 493, 295, + 201, 369, 636, 224, 479, 371, 242, 231, 587, 612, + 299, 289, 456, 643, 213, 517, 598, 239, 483, 0, + 0, 651, 247, 504, 610, 599, 215, 594, 503, 393, + 326, 327, 214, 0, 457, 268, 293, 0, 0, 258, + 415, 589, 590, 256, 652, 228, 622, 220, 0, 621, + 408, 584, 595, 394, 383, 219, 593, 392, 382, 334, + 355, 356, 280, 307, 447, 375, 448, 306, 308, 404, + 403, 405, 207, 608, 626, 0, 208, 0, 499, 611, + 653, 452, 212, 234, 235, 237, 0, 279, 283, 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, 0, - 578, 599, 612, 623, 629, 630, 632, 633, 634, 635, - 636, 639, 637, 407, 311, 495, 333, 373, 0, 0, - 425, 472, 240, 603, 496, 199, 0, 0, 0, 0, - 254, 255, 0, 574, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, - 666, 644, 507, 513, 508, 509, 510, 511, 512, 0, - 514, 0, 0, 0, 0, 0, 398, 0, 590, 591, - 667, 384, 486, 600, 335, 349, 352, 341, 361, 0, + 579, 602, 616, 628, 634, 635, 637, 638, 639, 640, + 641, 644, 642, 407, 311, 495, 333, 373, 0, 0, + 425, 472, 240, 606, 496, 199, 0, 0, 0, 0, + 254, 255, 0, 575, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 649, 508, 514, 509, 510, 511, 512, 513, 0, + 515, 0, 0, 0, 0, 0, 398, 0, 591, 592, + 672, 384, 486, 603, 335, 349, 352, 341, 361, 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, 358, - 364, 249, 210, 390, 399, 577, 312, 216, 217, 218, - 523, 524, 525, 526, 615, 616, 620, 205, 462, 463, - 464, 465, 292, 610, 309, 468, 467, 331, 332, 379, - 449, 539, 541, 552, 556, 558, 560, 566, 569, 540, - 542, 553, 557, 559, 561, 567, 570, 529, 531, 533, - 535, 548, 547, 544, 572, 573, 550, 555, 534, 546, - 551, 564, 571, 568, 528, 532, 536, 545, 563, 562, - 543, 554, 565, 549, 537, 530, 538, 0, 196, 221, - 368, 0, 454, 288, 645, 614, 484, 609, 206, 223, + 364, 249, 210, 390, 399, 578, 312, 216, 217, 218, + 524, 525, 526, 527, 619, 620, 624, 205, 462, 463, + 464, 465, 292, 614, 309, 468, 467, 331, 332, 379, + 449, 540, 542, 553, 557, 559, 561, 567, 570, 541, + 543, 554, 558, 560, 562, 568, 571, 530, 532, 534, + 536, 549, 548, 545, 573, 574, 551, 556, 535, 547, + 552, 565, 572, 569, 529, 533, 537, 546, 564, 563, + 544, 555, 566, 550, 538, 531, 539, 0, 196, 221, + 368, 0, 454, 288, 650, 618, 484, 613, 206, 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, 243, @@ -7329,37 +7276,111 @@ var yyAct = [...]int{ 380, 386, 387, 388, 389, 409, 410, 411, 414, 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, 481, - 482, 488, 489, 490, 491, 492, 500, 501, 515, 585, - 587, 602, 621, 627, 480, 301, 302, 444, 445, 314, - 315, 641, 642, 300, 597, 628, 595, 640, 622, 438, - 378, 0, 0, 381, 281, 305, 320, 0, 613, 502, + 482, 488, 489, 490, 491, 492, 500, 501, 516, 586, + 588, 605, 625, 632, 480, 301, 302, 444, 445, 314, + 315, 646, 647, 300, 600, 633, 597, 645, 627, 438, + 378, 0, 0, 381, 281, 305, 320, 0, 617, 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, 244, - 459, 241, 485, 518, 519, 520, 522, 395, 266, 433, - 0, 0, 376, 575, 576, 316, + 459, 241, 485, 519, 520, 521, 523, 395, 266, 433, + 396, 0, 376, 576, 577, 316, 0, 0, 0, 528, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 416, 0, 0, 0, 0, 0, 0, 0, 270, + 0, 0, 0, 0, 366, 267, 0, 0, 204, 505, + 0, 430, 0, 203, 0, 487, 252, 377, 374, 583, + 282, 273, 269, 250, 317, 385, 428, 518, 422, 0, + 370, 0, 0, 497, 401, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 323, 248, 325, 202, 413, 498, 286, + 0, 0, 0, 0, 0, 507, 194, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 238, 0, 0, 245, + 0, 0, 0, 351, 360, 359, 339, 340, 342, 344, + 350, 357, 363, 336, 345, 0, 0, 609, 0, 0, + 0, 265, 321, 272, 264, 580, 0, 0, 0, 0, + 0, 0, 596, 0, 0, 229, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 297, 0, 402, 257, 0, 453, 0, 0, + 0, 629, 0, 0, 0, 0, 0, 0, 0, 365, + 0, 330, 197, 225, 0, 0, 412, 461, 473, 0, + 0, 0, 253, 0, 471, 426, 604, 233, 284, 458, + 432, 469, 440, 287, 0, 0, 470, 372, 585, 450, + 601, 630, 631, 263, 406, 615, 522, 623, 648, 226, + 260, 420, 506, 607, 494, 397, 581, 582, 329, 493, + 295, 201, 369, 636, 224, 479, 371, 242, 231, 587, + 612, 299, 289, 456, 643, 213, 517, 598, 239, 483, + 0, 0, 651, 247, 504, 610, 599, 215, 594, 503, + 393, 326, 327, 214, 0, 457, 268, 293, 0, 0, + 258, 415, 589, 590, 256, 652, 228, 622, 220, 0, + 621, 408, 584, 595, 394, 383, 219, 593, 392, 382, + 334, 355, 356, 280, 307, 447, 375, 448, 306, 308, + 404, 403, 405, 207, 608, 626, 0, 208, 0, 499, + 611, 653, 452, 212, 234, 235, 237, 0, 279, 283, + 291, 294, 303, 304, 313, 367, 419, 446, 442, 451, + 0, 579, 602, 616, 628, 634, 635, 637, 638, 639, + 640, 641, 644, 642, 407, 311, 495, 333, 373, 0, + 0, 425, 472, 240, 606, 496, 199, 0, 0, 0, + 0, 254, 255, 0, 575, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 649, 508, 514, 509, 510, 511, 512, 513, + 0, 515, 0, 0, 0, 0, 0, 398, 0, 591, + 592, 672, 384, 486, 603, 335, 349, 352, 341, 361, + 0, 362, 337, 338, 343, 346, 347, 348, 353, 354, + 358, 364, 249, 210, 390, 399, 578, 312, 216, 217, + 218, 524, 525, 526, 527, 619, 620, 624, 205, 462, + 463, 464, 465, 292, 614, 309, 468, 467, 331, 332, + 379, 449, 540, 542, 553, 557, 559, 561, 567, 570, + 541, 543, 554, 558, 560, 562, 568, 571, 530, 532, + 534, 536, 549, 548, 545, 573, 574, 551, 556, 535, + 547, 552, 565, 572, 569, 529, 533, 537, 546, 564, + 563, 544, 555, 566, 550, 538, 531, 539, 0, 196, + 221, 368, 0, 454, 288, 650, 618, 484, 613, 206, + 223, 0, 262, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 209, 222, 232, 236, + 243, 261, 276, 278, 285, 298, 310, 318, 319, 322, + 328, 380, 386, 387, 388, 389, 409, 410, 411, 414, + 417, 418, 421, 423, 424, 427, 431, 435, 436, 437, + 439, 441, 443, 455, 460, 474, 475, 476, 477, 478, + 481, 482, 488, 489, 490, 491, 492, 500, 501, 516, + 586, 588, 605, 625, 632, 480, 301, 302, 444, 445, + 314, 315, 646, 647, 300, 600, 633, 597, 645, 627, + 438, 378, 0, 0, 381, 281, 305, 320, 0, 617, + 502, 227, 466, 290, 251, 0, 0, 211, 246, 230, + 259, 274, 277, 324, 391, 400, 429, 434, 296, 271, + 244, 459, 241, 485, 519, 520, 521, 523, 395, 266, + 433, 0, 0, 376, 576, 577, 316, } var yyPact = [...]int{ - -1000, -1000, 5002, -1000, -543, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1925, -1000, -552, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2499, 2504, -1000, -1000, -1000, -1000, 2666, -1000, 1045, - 2083, -1000, 2425, 5020, -1000, 55834, 808, -1000, 52906, -446, - 922, 238, 36802, -1000, 226, -1000, 205, 54370, 218, -1000, - -1000, -1000, -1000, -446, 22162, 2341, 47, 41, 55834, -1000, - -1000, -1000, -1000, -363, 2613, 2073, -1000, 389, -1000, -1000, - -1000, -1000, -1000, -1000, 52174, -1000, 1137, -1000, -1000, 2476, - 2470, 2311, 948, 2319, -1000, 2534, 2073, -1000, 22162, 2603, - 2453, 21430, 21430, 471, -1000, -1000, 596, -1000, -1000, 31678, - 55834, 39730, 284, -1000, 2425, -1000, -1000, -1000, 214, -1000, - 381, 1998, -1000, 1993, -1000, 1053, 1064, 402, 864, 841, - 401, 398, 397, 396, 395, 393, 392, 388, 394, -1000, - 963, 963, -223, -225, 1390, 786, 459, 459, 1098, 503, - 2392, 2387, -1000, -1000, 963, 963, 963, 363, 963, 963, - 963, 963, 334, 332, 963, 963, 963, 963, 963, 963, - 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, - 963, 959, 2425, 321, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2636, 2900, -1000, -1000, -1000, -1000, 2720, -1000, 1025, + 2152, -1000, 2517, 5041, -1000, 55856, 753, -1000, 52892, -454, + 877, 238, 36590, -1000, 177, -1000, 165, 54374, 169, -1000, + -1000, -1000, -1000, -454, 22511, 2360, 38, 37, 55856, -1000, + -1000, -1000, -1000, -373, 2674, 2129, -1000, 380, -1000, -1000, + -1000, -1000, -1000, -1000, 52151, -1000, 1229, -1000, -1000, 2522, + 2491, 2370, 943, 2372, -1000, 2590, 2129, -1000, 22511, 2666, + 2439, 21770, 21770, 467, -1000, -1000, 273, -1000, -1000, 31403, + 55856, 39554, 897, -1000, 2517, -1000, -1000, -1000, 212, -1000, + 349, 2043, -1000, 2039, -1000, 942, 1017, 408, 473, 466, + 405, 404, 394, 391, 389, 388, 386, 381, 385, -1000, + 974, 974, -236, -241, 1021, 454, 461, 461, 1048, 496, + 2473, 2463, -1000, -1000, 974, 974, 974, 360, 974, 974, + 974, 974, 303, 302, 974, 974, 974, 974, 974, 974, + 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, + 974, 902, 2517, 266, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7406,69 +7427,68 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 55834, 211, - 55834, -1000, 865, 804, -1000, -1000, -450, 1113, 1113, 117, - 1113, 1113, 1113, 1113, 181, 951, 40, -1000, 175, 289, - 225, 307, 1116, 269, -1000, -1000, 291, 1116, 1800, -1000, - 952, 302, 159, -1000, 1113, 1113, -1000, 14818, 263, 14818, - 14818, -1000, 2420, -1000, -1000, -1000, -1000, -1000, 1339, -1000, - -1000, -1000, -1000, -49, 493, -1000, -1000, -1000, -1000, 54370, - 51442, 234, -1000, -1000, 45, 1857, 1527, 22162, 1439, 946, - -1000, -1000, 1369, 927, -1000, -1000, -1000, -1000, -1000, 829, - -1000, 24358, 24358, 24358, 24358, -1000, -1000, 2000, 50710, 2000, - 2000, 24358, 2000, 24358, 2000, 2000, 2000, 2000, 22162, 2000, - 2000, 2000, 2000, -1000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, -1000, -1000, -1000, -1000, 2000, 863, 2000, - 2000, 2000, 2000, 2000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2000, 2000, 2000, 2000, 2000, 2000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - -1000, -1000, -1000, 1605, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 27286, 1540, 1536, 1533, -1000, 19234, 2000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 55856, 234, 55856, -1000, 821, 730, -1000, + -1000, -458, 1154, 1154, 80, 1154, 1154, 1154, 1154, 164, + 1008, 33, -1000, 160, 271, 149, 261, 1096, 798, -1000, + -1000, 252, 1096, 1852, -1000, 949, 259, 155, -1000, 1154, + 1154, -1000, 15077, 220, 15077, 15077, 256, 154, -1000, 2494, + -1000, -1000, -1000, -1000, -1000, 1381, -1000, -1000, -1000, -1000, + -36, 489, -1000, -1000, -1000, -1000, 54374, 51410, 290, -1000, + -1000, 30, 1958, 1395, 22511, 1420, 940, -1000, -1000, 1248, + 904, -1000, -1000, -1000, -1000, -1000, 783, -1000, 24734, 24734, + 24734, 24734, -1000, -1000, 2048, 50669, 2048, 2048, 24734, 2048, + 24734, 2048, 2048, 2048, 2048, 22511, 2048, 2048, 2048, 2048, + -1000, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + -1000, -1000, -1000, -1000, 2048, 820, 2048, 2048, 2048, 2048, + 2048, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2048, 2048, + 2048, 2048, 2048, 2048, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, -1000, -1000, -1000, + 1591, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1583, 1540, + 1534, 1525, -1000, 19547, 2048, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 55834, - -1000, 2000, 243, 54370, 54370, 366, 1322, -1000, -1000, 2534, - 2073, -1000, 2613, 2562, 389, -1000, 3064, 1622, 1778, 1500, - 2073, 1937, 55834, -1000, 2007, -1000, -1000, -1000, -382, -386, - 2258, 1438, 1794, -1000, -1000, -1000, -1000, 1905, 22162, -1000, - -1000, 2647, -1000, 28750, 862, 2643, 49978, -1000, 471, 471, - 1982, 593, -5, -1000, -1000, -1000, -1000, 993, 36070, -1000, - -1000, -1000, -1000, -1000, 1883, 55834, -1000, -1000, 5010, 54370, - -1000, 2081, -1000, 1872, -1000, 2037, 22162, 2091, 803, 54370, - 526, 521, 489, -1000, -64, -1000, -1000, -1000, -1000, -1000, - -1000, 963, 963, 963, -1000, 387, 2598, 5020, 6408, -1000, - -1000, -1000, 49246, 2078, 54370, -1000, 2072, -1000, 1075, 850, - 827, 827, 54370, -1000, -1000, 55102, 54370, 1074, 1073, 54370, - 54370, 54370, 54370, -1000, 48514, -1000, 47782, 47050, 1318, 54370, - 46318, 45586, 44854, 44122, 43390, -1000, 2244, -1000, 2094, -1000, - -1000, -1000, 55102, 54370, 54370, 55102, 54370, 55102, 55834, 54370, - -1000, -1000, 328, -1000, -1000, 1317, 1316, 1313, 963, 963, - 1297, 1789, 1787, 1780, 963, 963, 1280, 1772, 38266, 1767, - 310, 1278, 1277, 1275, 1341, 1720, 260, 1714, 1321, 1272, - 1270, 54370, 2067, 55834, -1000, 280, 1122, 976, 992, 2425, - 2320, 1977, 490, 802, 54370, 463, 463, 54370, -1000, 15556, - 55834, 228, -1000, 1712, 22162, -1000, 1132, 1116, 1116, -1000, - -1000, -1000, -1000, -1000, -1000, 1113, 55834, 1132, -1000, -1000, - -1000, 1116, 1113, 55834, 1113, 1113, 1113, 1113, 1116, 1116, - 1116, 1113, 55834, 55834, 55834, 55834, 55834, 55834, 55834, 55834, - 55834, 14818, 952, 1113, -453, -1000, 1691, -1000, -1000, -1000, - 2212, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 55856, -1000, 2048, 196, + 54374, 54374, 317, 1361, -1000, -1000, 2590, 2129, -1000, 2674, + 2662, 380, -1000, 3907, 2056, 1627, 1538, 2129, 2019, 55856, + -1000, 2052, -1000, -1000, -1000, -343, -355, 2294, 1519, 1848, + -1000, -1000, -1000, -1000, 2065, 22511, -1000, -1000, 2717, -1000, + 28439, 816, 2706, 49928, -1000, 467, 467, 2036, 427, -4, + -1000, -1000, -1000, -1000, 1006, 35849, -1000, -1000, -1000, -1000, + -1000, 1946, 55856, -1000, -1000, 4251, 54374, -1000, 2150, -1000, + 1934, -1000, 2102, 22511, 2174, 724, 54374, 515, 510, 506, + 468, -71, -1000, -1000, -1000, -1000, -1000, -1000, 974, 974, + 974, -1000, 372, 2658, 5041, 5724, -1000, -1000, -1000, 49187, + 2148, 54374, -1000, 2147, -1000, 1136, 835, 847, 847, 54374, + -1000, -1000, 55115, 54374, 1113, 1093, 54374, 54374, 54374, 54374, + -1000, 48446, -1000, 47705, 46964, 1359, 54374, 46223, 45482, 44741, + 44000, 43259, -1000, 2471, -1000, 2096, -1000, -1000, -1000, 55115, + 54374, 54374, 55115, 54374, 55115, 55856, 54374, -1000, -1000, 321, + -1000, -1000, 1354, 1344, 1338, 974, 974, 1337, 1825, 1823, + 1807, 974, 974, 1336, 1799, 38072, 1791, 260, 1332, 1314, + 1312, 1340, 1772, 282, 1761, 1333, 1309, 1310, 54374, 2144, + 55856, -1000, 243, 1023, 407, 1005, 2517, 2353, 2033, 481, + 528, 54374, 464, 464, 54374, -1000, 15824, 55856, 217, -1000, + 1736, 22511, -1000, 1103, 1096, 1096, -1000, -1000, -1000, -1000, + -1000, -1000, 1154, 55856, 1103, -1000, -1000, -1000, 1096, 1154, + 55856, 1154, 1154, 1154, 1154, 1096, 1096, 1096, 1154, 55856, + 55856, 55856, 55856, 55856, 55856, 55856, 55856, 55856, 15077, 949, + 1154, -459, -1000, 1721, -1000, -1000, -1000, 2256, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7482,335 +7502,339 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 14818, 14818, - -1000, -1000, -1000, -1000, -1000, 1973, -1000, 202, 17, 213, - -1000, 42658, 456, 991, -1000, 456, -1000, -1000, -1000, 1968, - 41926, -1000, -454, -455, -460, -461, -1000, -1000, -1000, -462, - -463, -1000, -1000, -1000, 22162, 22162, 22162, 22162, -313, -1000, - 1482, 24358, 2393, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 22162, 301, 1226, 24358, 24358, 24358, 24358, 24358, 24358, 24358, - 25822, 25090, 24358, 24358, 24358, 24358, 24358, 24358, -1000, -1000, - 33874, 5565, 5565, 927, 927, 927, 927, -1000, -187, 1964, - 55102, -1000, -1000, -1000, 849, 22162, 22162, 927, -1000, 1338, - 1583, 19234, 22162, 22162, 22162, 22162, 1000, 1527, 55102, 22162, - -1000, 1500, -1000, -1000, -1000, -1000, 1235, -1000, -1000, 1102, - 2384, 2384, 2384, 2384, 22162, 22162, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 2384, 22162, 136, 136, 729, 22162, - 22162, 22162, 22162, 22162, 22162, 22162, 22162, 17770, 22162, 22162, - 24358, 22162, 22162, 22162, 1500, 22162, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 1500, 22162, 1517, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 17032, 22162, 22162, 22162, 22162, 22162, - -1000, -1000, -1000, -1000, -1000, -1000, 22162, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 1500, 22162, 22162, 22162, 22162, 22162, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1636, 1417, 1490, 22162, -1000, 1959, -1000, -190, 30946, - 22162, 1679, 2640, 2115, 54370, -1000, -1000, -1000, -1000, 2534, - -1000, 2534, 1636, 2747, 2266, 21430, -1000, -1000, 2747, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1718, -1000, - 55834, 1937, 2527, 54370, -1000, -356, -1000, -357, 2255, 1677, - 885, -1000, 22162, 22162, 1935, -1000, 1803, 55834, -1000, -313, - -1000, 41194, -1000, -1000, 14080, 55834, 383, 55834, -1000, 30214, - 40462, 313, -1000, -5, 1917, -1000, 7, 15, 18502, 924, - -1000, -1000, -1000, 1390, 26554, 1826, 924, 120, -1000, -1000, - -1000, 2037, -1000, 2037, 2037, 2037, 2037, 885, 885, 885, - 885, -1000, -1000, -1000, -1000, -1000, 2061, 2057, -1000, 2037, - 2037, 2037, 2037, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 2047, 2047, 2047, 2044, 2044, 2038, 2038, 446, -1000, 22162, - 432, 39730, 2520, 1269, 2369, 280, 469, 2102, 54370, 54370, - 54370, 469, -1000, 1377, 1375, 1354, -1000, -525, 1932, -1000, - -1000, 2595, -1000, -1000, 909, 1104, 1093, 1076, 54370, 255, - 359, -1000, 438, -1000, 39730, 54370, 1069, 827, 54370, -1000, - 54370, -1000, -1000, -1000, -1000, -1000, 54370, -1000, -1000, 1931, - -1000, 1876, 1142, 1090, 1133, 1088, 1931, -1000, -1000, -189, - 1931, -1000, 1931, -1000, 1931, -1000, 1931, -1000, 1931, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1024, 130, - -338, 54370, 255, 488, -1000, 486, 33874, -1000, -1000, -1000, - 33874, 33874, -1000, -1000, -1000, -1000, 1638, 1634, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 15077, 15077, + -1000, -1000, 2584, 2575, -1000, -1000, -1000, 2032, -1000, 163, + 5, 168, -1000, 42518, 513, 1004, -1000, 513, -1000, -1000, + -1000, -1000, -1000, 2027, 41777, -1000, -460, -461, -462, -463, + -1000, -1000, -1000, -464, -473, -1000, -1000, -1000, 22511, 22511, + 22511, 22511, -276, -1000, 1199, 24734, 2504, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 22511, 247, 991, 24734, 24734, 24734, + 24734, 24734, 24734, 24734, 26216, 25475, 24734, 24734, 24734, 24734, + 24734, 24734, -1000, -1000, 33626, 6276, 6276, 904, 904, 904, + 904, -1000, -186, 2022, 55115, -1000, -1000, -1000, 813, 22511, + 22511, 904, -1000, 1253, 1138, 19547, 22511, 22511, 22511, 22511, + 1011, 1395, 55115, 22511, -1000, 1538, -1000, -1000, -1000, -1000, + 1245, -1000, -1000, 1091, 2415, 2415, 2415, 2415, 22511, 22511, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 2415, 22511, + 148, 148, 719, 22511, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 18065, 22511, 22511, 24734, 22511, 22511, 22511, 1538, 22511, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 1538, 22511, + 1351, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 17318, 22511, + 22511, 22511, 22511, 22511, -1000, -1000, -1000, -1000, -1000, -1000, + 22511, 22511, 22511, 22511, 22511, 22511, 22511, 22511, 1538, 22511, + 22511, 22511, 22511, 22511, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1638, 1518, 1544, 22511, -1000, 2020, + -1000, -200, 30662, 22511, 1691, 2695, 2185, 54374, -1000, -1000, + -1000, -1000, 2590, -1000, 2590, 1638, 3897, 2266, 21770, -1000, + -1000, 3897, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1820, -1000, 55856, 2019, 2566, + 54374, -1000, -316, -1000, -321, 2296, 1687, 318, -1000, 22511, + 22511, 2016, -1000, 1698, 55856, -1000, -276, -1000, 41036, -1000, + -1000, 14330, 55856, 354, 55856, -1000, 29921, 40295, 319, -1000, + -4, 1996, -1000, 12, -2, 18806, 882, -1000, -1000, -1000, + 1021, 26957, 1950, 882, 83, -1000, -1000, -1000, 2102, -1000, + 2102, 2102, 2102, 2102, 318, 318, 318, 318, -1000, -1000, + -1000, -1000, -1000, 2142, 2102, 2137, -1000, 2102, 2102, 2102, + 2102, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2136, 2136, + 2136, 2134, 2134, 2106, 2106, 453, -1000, 22511, 435, 39554, + 2546, 1308, 1193, 243, 468, 2183, 54374, 54374, 54374, 55856, + 1052, -1000, 1408, 1404, 1380, -1000, -532, 2015, -1000, -1000, + 2656, -1000, -1000, 964, 1175, 1172, 893, 54374, 205, 328, + -1000, 440, -1000, 39554, 54374, 1087, 847, 54374, -1000, 54374, + -1000, -1000, -1000, -1000, -1000, 54374, -1000, -1000, 2014, -1000, + 2005, 1201, 1166, 1195, 1161, 2014, -1000, -1000, -194, 2014, + -1000, 2014, -1000, 2014, -1000, 2014, -1000, 2014, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 993, 286, -385, + 54374, 205, 480, -1000, 479, 33626, -1000, -1000, -1000, 33626, + 33626, -1000, -1000, -1000, -1000, 1656, 1643, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -512, 55834, -1000, - 267, 989, 348, 385, 345, 55834, 412, 2388, 2383, 2381, - 2378, 2372, 2371, 286, 331, 55834, 55834, 463, 2214, 55834, - 2501, 55834, -1000, -1000, -1000, -1000, -1000, 1631, 1623, -1000, - 1527, 55834, -1000, -1000, 1113, 1113, -1000, -1000, 55834, 1113, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1113, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -522, 55856, -1000, 228, + 998, 288, 315, 265, 55856, 367, 2469, 2438, 2433, 2432, + 2429, 2420, 2397, 241, 301, 55856, 55856, 464, 2240, 55856, + 2549, 55856, -1000, -1000, -1000, -1000, -1000, 1632, 1619, -1000, + 1395, 55856, -1000, -1000, 1154, 1154, -1000, -1000, 55856, 1154, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1154, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 55834, -1000, -1000, -1000, -1000, -49, - 195, -1000, -1000, 54370, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -113, -1000, 303, 3, 425, -1000, -1000, - -1000, -1000, -1000, 2511, -1000, 1527, 1020, 1025, -1000, 2000, - -1000, -1000, 1299, -1000, -1000, -1000, -1000, -1000, 2000, 2000, - 2000, -1000, -1000, -1000, -1000, -1000, 301, 24358, 24358, 24358, - 1380, 793, 1392, 1327, 1228, 1285, 1285, 1185, 24358, 1185, - 24358, 931, 931, 931, 931, 931, -1000, -1000, -1000, -1000, - -1000, -1000, 1605, -1000, 1584, -1000, 2000, 55102, 1867, 17032, - 1939, 2054, 1500, 940, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 55856, -1000, -1000, -1000, -1000, 1616, + -1000, 55856, -36, 161, -1000, -1000, 54374, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -119, -1000, 351, 8, + 378, -1000, -1000, -1000, -1000, -1000, 2570, -1000, 1395, 1127, + 1057, -1000, 2048, -1000, -1000, 1239, -1000, -1000, -1000, -1000, + -1000, 2048, 2048, 2048, -1000, -1000, -1000, -1000, -1000, 247, + 24734, 24734, 24734, 1630, 777, 1347, 1801, 1204, 1334, 1334, + 919, 24734, 919, 24734, 922, 922, 922, 922, 922, -1000, + -1000, -1000, -1000, -1000, -1000, 1591, -1000, 1589, -1000, 2048, + 55115, 1932, 17318, 2072, 1735, 1538, 931, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 4265, 1500, 1857, 1500, 2049, 4258, - 1001, -1000, 22162, 1500, 4250, -1000, -1000, 1500, 1500, 22162, - -1000, -1000, 22162, 22162, 22162, 22162, 2369, 2369, 2369, 2369, - 2369, 2369, 2369, 2369, 2369, 2369, 22162, 2369, 1923, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3958, 1538, 1958, + 1538, 2351, 3939, 1053, -1000, 22511, 1538, 3935, -1000, -1000, + 1538, 1538, 22511, -1000, -1000, 22511, 22511, 22511, 22511, 1193, + 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 22511, + 1193, 2009, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1921, 2638, 1820, - 2369, 2369, 2369, 2369, 4245, 2369, 2369, 22162, 1430, -1000, - -1000, -1000, 1499, 4240, 1303, 4225, 2369, 2369, -1000, 2369, - 4220, 4212, 1500, 3009, 3000, 2369, 2369, 2369, 2369, 2369, - 2938, 2934, 2369, 2369, 2930, 2369, 4206, 2369, 2919, 2903, - 2768, 2754, 2709, 2691, 2676, 2664, 2650, 2646, 2632, 2605, - 2599, 2569, 2536, 2529, 2522, 2509, 2369, 2369, 2369, 4202, - 2369, 4197, 2369, 4191, 2369, 2369, 4180, 2494, 2469, 1500, - 1920, -1000, 4174, 2369, 3948, 3942, 3917, 2463, 3912, 3892, - 3888, 2369, 2369, 2369, 2446, 3883, 3879, 3875, 3572, 3561, - 3516, 3512, 3497, 3493, 2369, 1490, 1490, 1490, 1490, 1490, - 3479, -320, 2369, 1500, -1000, -1000, -1000, -1000, -1000, 3474, - 2428, 3453, 3445, 3437, 3432, 1500, 2000, 847, -1000, -1000, - 1490, 1500, 1500, 1490, 1490, 3404, 3400, 3394, 3389, 3385, - 3362, 2369, 2369, -1000, 2369, 3341, 3319, 2418, 2397, 1500, - -1000, 1490, 55834, -1000, -445, -1000, -11, 950, 2000, -1000, - 38266, 1500, -1000, 2048, -1000, 1162, -1000, -1000, -1000, -1000, - -1000, 35338, 1823, -1000, -1000, -1000, -1000, 2000, 1805, -1000, - -1000, -1000, -1000, 885, 67, 34606, 916, 916, 165, 1527, - 1527, 22162, -1000, -1000, -1000, -1000, -1000, -1000, 844, 2622, - 382, 2000, -1000, 1976, 2114, -1000, -1000, -1000, 2526, 28018, - -1000, -1000, 2000, 2000, 55834, 1863, 1843, -1000, 843, -1000, - 1345, 1917, -5, 2, -1000, -1000, -1000, -1000, 1527, -1000, - 1350, 386, 369, -1000, 454, -1000, -1000, -1000, -1000, 2360, - 79, -1000, -1000, -1000, 340, 885, -1000, -1000, -1000, -1000, - -1000, -1000, 1579, 1579, -1000, -1000, -1000, -1000, -1000, 1260, - -1000, -1000, -1000, -1000, 1253, -1000, -1000, 1245, -1000, -1000, - 3024, 2252, 432, -1000, -1000, 963, 1576, -1000, -1000, 2364, - 963, 963, 54370, -1000, -1000, 1806, 2520, 267, 55834, 1009, - 2211, -1000, 2102, 2102, 2102, 55834, -1000, -1000, -1000, -1000, - -1000, -1000, -514, 191, 364, -1000, -1000, -1000, 6185, 54370, - 1760, -1000, 249, -1000, 1697, -1000, 54370, -1000, 1758, 2043, - 54370, 54370, -1000, -1000, -1000, 54370, 2000, -1000, -1000, -1000, - -1000, 789, 2419, 358, -1000, -1000, -344, -1000, -1000, 255, - 249, 55102, 54370, 924, -1000, -1000, -1000, -1000, -1000, -515, - 1743, 507, 264, 487, 55834, 55834, 55834, 55834, 55834, 55834, - 820, -1000, -1000, 31, -1000, -1000, 235, -1000, -1000, -1000, - -1000, -1000, 235, -1000, -1000, -1000, -1000, -1000, 323, 485, - -1000, 55834, 55834, 941, -1000, -1000, -1000, -1000, -1000, 1116, - -1000, -1000, 1116, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 2416, 55834, 1, -482, -1000, -476, 22162, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1209, 782, 1392, - 24358, 24358, 1583, 1583, 24358, -1000, -1000, -1000, 357, 357, - 33874, -1000, 24358, 22162, -1000, -1000, 22162, 22162, 22162, 996, - -1000, 22162, 1340, -1000, 22162, -1000, -320, 1490, 2369, 2369, - 2369, 2369, -320, -320, -320, -320, -320, -320, -320, -320, - -320, -320, 1930, -1000, 22162, 22162, 22162, 1500, 338, -1000, - -1000, -1000, -320, 22162, -1000, -1000, 2636, -1000, 22162, -1000, - 33874, 22162, 22162, 22162, -1000, -1000, -1000, 22162, 22162, -1000, - -1000, 22162, -1000, 22162, -1000, -1000, -1000, -1000, -1000, -1000, - 22162, -1000, 22162, -1000, -1000, -1000, 22162, -1000, 22162, -1000, - -1000, 22162, -1000, 22162, -1000, 22162, -1000, 22162, -1000, 22162, - -1000, 22162, -1000, 22162, -1000, 22162, -1000, 22162, -1000, 22162, - -1000, 22162, -1000, 22162, -1000, 22162, -1000, 22162, -1000, 22162, - -1000, 22162, -1000, 22162, -1000, 22162, -1000, -1000, -1000, 22162, - -1000, 22162, -1000, 22162, -1000, -1000, 22162, -1000, 22162, -1000, - 22162, -1000, 22162, 22162, -1000, 22162, 22162, 22162, -1000, 22162, - 22162, 22162, 22162, -1000, -1000, -1000, -1000, 22162, 22162, 22162, - 22162, 22162, 22162, 22162, 22162, 22162, 22162, -1000, -1000, -1000, - -1000, -1000, -1000, 22162, -1000, 39730, 11, -320, 1517, 11, - 1517, 23626, 875, 828, 22894, -1000, 22162, 16294, -1000, -1000, - -1000, -1000, -1000, 22162, 22162, 22162, 22162, 22162, 22162, -1000, - -1000, -1000, 22162, 22162, -1000, 22162, -1000, 22162, -1000, -1000, - -1000, -1000, -1000, 950, -1000, 873, 846, 827, 54370, -1000, - -1000, -1000, -1000, 1911, -1000, 2541, -1000, 2279, 2278, 2631, - 2622, 21430, -1000, 30214, -1000, -1000, 54370, -435, -1000, 2308, - 2292, 916, 916, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 13342, 2534, 22162, 2210, 55102, 199, -1000, 29482, 54370, 55102, - 30214, 30214, 30214, 30214, 30214, -1000, 2242, 2236, -1000, 2232, - 2226, 2238, 55834, -1000, 1636, 1737, -1000, 22162, 32410, 1864, - 30214, -1000, -1000, 30214, 55834, 12604, -1000, -1000, -3, 6, - -1000, -1000, -1000, -1000, 1390, -1000, -1000, 1072, 2524, 2350, - -1000, -1000, -1000, -1000, -1000, 1725, -1000, 1709, 1907, 1696, - 1689, 130, -1000, 2090, 2414, 963, 963, -1000, 1240, -1000, - 1338, 1564, 1562, -1000, -1000, -1000, 505, -1000, 2500, 55834, - 2209, 2152, 2144, -1000, -524, 1232, 2042, 2059, 22162, 2041, - 2582, 1891, 54370, -1000, -1000, 55102, -1000, 281, -1000, 432, - 54370, -1000, -1000, -1000, 359, 55834, -1000, 8587, -1000, -1000, - -1000, 249, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 55834, - 274, -1000, 2040, 1332, -1000, -1000, 2013, -1000, -1000, -1000, - -1000, -1000, 247, 220, 1558, 229, 1547, 229, -1000, 55834, - 907, 2252, 55834, -1000, -1000, -1000, 1113, 1113, -1000, -1000, - 2410, -1000, 1338, 2369, 24358, 24358, -1000, 927, -1000, -1000, - 320, -292, 2037, 2037, -1000, 2037, 2038, -1000, 2037, 173, - 2037, 146, 2037, -1000, -1000, 1500, 1500, -1000, 1490, 2354, - 1699, 3314, -1000, 1527, 22162, 3250, -1000, -1000, -320, -320, - -320, -320, -320, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -71, 3034, 2994, 2369, -1000, 2034, 2033, - -1000, 2369, 22162, 2369, 1500, 2347, 2369, 2369, 2369, 2369, - 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2338, 2333, - 2327, 2321, 2314, 2306, 2294, 2213, 2207, 2186, 2139, 2074, - 2069, 2063, 2021, 2004, 2369, 2369, 1990, 2369, 1914, 1855, - -1000, 1527, 1490, 2990, 1490, 2369, 2369, 2981, 256, 2369, - 1686, 1686, 1686, 1686, 1686, 1490, 1490, 1490, 1490, 2369, - 54370, -1000, -320, -1000, -1000, -372, -376, -1000, 1500, -320, - 1900, 24358, 2369, 24358, 24358, 24358, 2369, 1500, -1000, 1830, - 1824, 2659, 1763, 2369, 2502, 2369, 2369, 2369, 1746, -1000, - 2506, 2000, 2506, 2000, 2506, 1655, 1162, 55834, -1000, -1000, - -1000, -1000, 2622, 2614, -1000, 1899, -1000, 67, 605, -1000, - 2312, 2292, -1000, 2577, 2301, 2576, -1000, -1000, -1000, -1000, - -1000, 1527, -1000, 2460, 1852, -1000, 973, 1904, -1000, -1000, - 20698, 1660, 2270, 838, 1655, 1886, 2114, 2113, 2134, 2307, - -1000, -1000, -1000, -1000, 2233, -1000, 2149, -1000, -1000, 2007, - -1000, 2310, 383, 30214, 1819, 1819, -1000, 836, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1119, 8587, 2660, -1000, 1545, - -1000, 1337, 196, 1231, -1000, -1000, 963, 963, -1000, 1068, - 1031, -1000, 55834, 2032, -1000, 885, 1543, 885, 1223, -1000, - -1000, 1221, -1000, -1000, -1000, -1000, 1988, 2197, -1000, -1000, - -1000, -1000, 55834, -1000, -1000, 55834, 55834, 55834, 2031, 2566, - -1000, 22162, 2025, 970, 2907, 54370, 54370, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 787, 963, - -494, 330, 322, 963, 963, 963, -536, -1000, -1000, 1652, - 1643, -1000, -226, -1000, 22162, -1000, -1000, -1000, -1000, -1000, - 1249, 1249, 1540, 1536, 1533, -1000, 2007, -1000, -1000, -1000, - 1661, -1000, -1000, -211, 54370, 54370, 54370, 54370, -1000, -1000, - -1000, 1149, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 927, 1500, 376, -214, 1500, -1000, - -1000, 885, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 22162, -1000, 22162, -1000, 22162, 1527, 22162, -1000, - -1000, -1000, -1000, -1000, 2534, 1531, 22162, 22162, -1000, 1206, - 1196, -320, 2369, -1000, -1000, -1000, 22162, -1000, -1000, -1000, + 2001, 2693, 1816, 1193, 1193, 1193, 1193, 3914, 1193, 1193, + 22511, 1839, -1000, -1000, -1000, 1460, 3905, 1586, 3606, 1193, + 1193, -1000, 1193, 3578, 3538, 1538, 2890, 2884, 1193, 1193, + 1193, 1193, 1193, 2869, 2859, 1193, 1193, 2823, 1193, 3523, + 1193, 2734, 2712, 2694, 2690, 2645, 2621, 2595, 2591, 2559, + 2527, 2488, 2483, 2478, 2456, 2452, 2447, 2412, 2343, 1193, + 1193, 1193, 3504, 1193, 3492, 1193, 3488, 1193, 1193, 3484, + 2338, 2333, 1538, 1999, -1000, 3480, 1193, 3476, 3472, 3465, + 2328, 3458, 3453, 3414, 1193, 1193, 1193, 2322, 3410, 3404, + 3395, 3390, 3385, 3378, 3367, 3348, 3281, 1193, 1544, 1544, + 1544, 1544, 1544, 3269, -280, 1193, 1538, -1000, -1000, -1000, + -1000, -1000, 3093, 2316, 3071, 3063, 3059, 3049, 1538, 2048, + 809, -1000, -1000, 1544, 1538, 1538, 1544, 1544, 3043, 3025, + 3009, 2993, 2956, 2948, 1193, 1193, -1000, 1193, 2939, 2927, + 2312, 2297, 1538, -1000, 1544, 55856, -1000, -453, -1000, -16, + 889, 2048, -1000, 38072, 1538, -1000, 5684, -1000, 1371, -1000, + -1000, -1000, -1000, -1000, 35108, 1911, -1000, -1000, -1000, -1000, + 2048, 1930, -1000, -1000, -1000, -1000, 318, 58, 34367, 876, + 876, 109, 1395, 1395, 22511, -1000, -1000, -1000, -1000, -1000, + -1000, 807, 2676, 371, 2048, -1000, 2011, 2757, -1000, -1000, + -1000, 2565, 27698, -1000, -1000, 2048, 2048, 55856, 1972, 1937, + -1000, 803, -1000, 1300, 1996, -4, -8, -1000, -1000, -1000, + -1000, 1395, -1000, 1376, 357, 359, -1000, 443, -1000, -1000, + -1000, -1000, 2387, 70, -1000, -1000, -1000, 332, 318, -1000, + -1000, -1000, -1000, -1000, -1000, 1587, -1000, 1587, -1000, -1000, + -1000, -1000, -1000, 1305, -1000, -1000, -1000, -1000, 1304, -1000, + -1000, 1303, -1000, -1000, 2379, 2227, 435, -1000, -1000, 974, + 1585, -1000, -1000, 2391, 974, 974, 54374, -1000, -1000, 1896, + 2546, 228, 55856, 2239, -1000, 2183, 2183, 2183, -1000, 2537, + -1000, -1000, -1000, -1000, -1000, -1000, -524, 175, 361, -1000, + -1000, -1000, 2041, 54374, 1900, -1000, 214, -1000, 1878, -1000, + 54374, -1000, 1877, 2128, 54374, 54374, -1000, -1000, -1000, 54374, + 2048, -1000, -1000, -1000, -1000, 523, 2516, 314, -1000, -1000, + -300, -1000, -1000, 205, 214, 55115, 54374, 882, -1000, -1000, + -1000, -1000, -1000, -525, 1862, 502, 225, 574, 55856, 55856, + 55856, 55856, 55856, 55856, 778, -1000, -1000, 23, -1000, -1000, + 191, -1000, -1000, -1000, -1000, -1000, -1000, 191, -1000, -1000, + -1000, -1000, -1000, 283, 478, -1000, 55856, 55856, 945, -1000, + -1000, -1000, -1000, -1000, 1096, -1000, -1000, 1096, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 22162, -1000, 22162, -1000, 22162, -1000, 22162, -1000, 22162, -1000, - 22162, -1000, 22162, -1000, 22162, -1000, 22162, -1000, 22162, -1000, - 22162, -1000, 22162, -1000, 22162, -1000, 22162, -1000, 22162, -1000, - 22162, -1000, -1000, 22162, -1000, -1000, -1000, 22162, -1000, 22162, - -1000, 22162, -1000, -1000, -1000, 22162, 327, 357, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1500, - 379, -1000, -1000, -1000, 2625, -1000, 1500, 22162, 1583, -1000, - 1583, 1583, 1583, -1000, -1000, -1000, 22162, -1000, 22162, 22162, - -1000, 22162, -1000, 22162, -1000, -1000, -1000, -1000, 22162, 2000, - 2300, 38998, 2000, 38998, 2000, 32410, -1000, -1000, 2614, 2617, - 2560, 2288, 2293, 2293, 2312, -1000, 2559, 2558, -1000, 1524, - 2557, 1518, 1029, -1000, 55102, 22162, -1000, 199, 38266, -1000, - 371, 54370, 199, 54370, -1000, 2542, -1000, -1000, 22162, 2024, - -1000, 22162, -1000, -1000, -1000, -1000, 5565, 2622, 1819, -1000, - -1000, 937, -1000, 22162, -1000, 10926, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1492, 1481, -1000, -1000, 2009, 22162, - -1000, -1000, -1000, 1647, 1644, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 2007, -1000, -1000, -1000, -1000, 359, -522, - 2628, 54370, 1172, -1000, 1621, 1891, 333, 199, 1469, 963, - 963, 963, 1163, 1161, 38266, 1613, -1000, 54370, 421, -1000, - 359, -1000, -236, -240, 2369, -1000, -1000, 2518, -1000, -1000, - 16294, -1000, -1000, 2003, 2097, -1000, -1000, -1000, -1000, 2253, - -185, -218, -1000, -1000, 2369, 2369, 2369, 2058, 1500, -1000, - 2369, 2369, 1637, 1628, -1000, -1000, 2369, 2369, 2369, 2369, - 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369, - 2369, 2369, 2369, 2369, 2369, 2369, 1490, 1729, -1000, 327, - 1500, 2133, -1000, -1000, 5565, -1000, -1000, 2542, 2552, 11, - -1000, -1000, 265, 11, 1527, 1033, 1500, 1500, 1033, 1723, - 2369, 1694, 1676, 2369, 2369, 33142, -1000, 2549, 2538, 1568, - -1000, -1000, 38998, 1568, 38998, 950, 2617, -343, 22162, 22162, - 2284, 1175, -1000, -1000, -1000, -1000, 1435, 1433, -1000, 1431, - -1000, 2655, -1000, 1527, -1000, 2000, 199, -1000, 835, 1904, - -1000, 2534, 1527, 54370, 1527, 73, 2542, -1000, 2369, -1000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, -1000, -1000, 54370, 2580, -1000, -1000, 2514, 1609, 187, - -1000, 1530, 1891, -1000, -1000, 194, -1000, 22162, -1000, 38266, - 1403, 1400, -1000, -1000, -1000, -1000, -536, -1000, -1000, -1000, - -1000, -1000, -1000, 389, 1889, -1000, 961, 54370, 55834, -1000, - 2248, -1000, -1000, -1000, -1000, 22162, -1000, -1000, -1000, -1000, + 2484, 55856, 4, -491, -1000, -488, 22511, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1307, 482, 1347, 24734, 24734, 1138, + 1138, 24734, -1000, -1000, -1000, 1149, 1149, 33626, -1000, 24734, + 22511, -1000, -1000, 22511, 22511, 22511, 1010, -1000, 22511, 1295, + -1000, 22511, -1000, -280, 1544, 1193, 1193, 1193, 1193, -280, + -280, -280, -280, -280, -280, -280, -280, -280, -280, 1976, + -1000, 22511, 22511, 22511, 1538, 295, -1000, -1000, -1000, -280, + 22511, -1000, -1000, 2692, -1000, 22511, -1000, 33626, 22511, 22511, + 22511, -1000, -1000, -1000, 22511, 22511, -1000, -1000, 22511, -1000, + 22511, -1000, -1000, -1000, -1000, -1000, -1000, 22511, -1000, 22511, + -1000, -1000, -1000, 22511, -1000, 22511, -1000, -1000, 22511, -1000, + 22511, -1000, 22511, -1000, 22511, -1000, 22511, -1000, 22511, -1000, + 22511, -1000, 22511, -1000, 22511, -1000, 22511, -1000, 22511, -1000, + 22511, -1000, 22511, -1000, 22511, -1000, 22511, -1000, 22511, -1000, + 22511, -1000, 22511, -1000, -1000, -1000, 22511, -1000, 22511, -1000, + 22511, -1000, -1000, 22511, -1000, 22511, -1000, 22511, -1000, 22511, + 22511, -1000, 22511, 22511, 22511, -1000, 22511, 22511, 22511, 22511, + -1000, -1000, -1000, -1000, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 22511, 22511, 22511, -1000, -1000, -1000, -1000, -1000, -1000, + 22511, -1000, 39554, 0, -280, 1351, 0, 1351, 23993, 823, + 784, 23252, -1000, 22511, 16571, -1000, -1000, -1000, -1000, -1000, + 22511, 22511, 22511, 22511, 22511, 22511, -1000, -1000, -1000, 22511, + 22511, -1000, 22511, -1000, 22511, -1000, -1000, -1000, -1000, -1000, + 889, -1000, 458, 456, 847, 54374, -1000, -1000, -1000, -1000, + 1989, -1000, 2609, -1000, 2317, 2313, 2684, 2676, 21770, -1000, + 29921, -1000, -1000, 54374, -442, -1000, 2354, 2401, 876, 876, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 13583, 2590, 22511, + 2221, 55115, 223, -1000, 29180, 54374, 55115, 29921, 29921, 29921, + 29921, 29921, -1000, 2255, 2252, -1000, 2264, 2263, 2582, 55856, + -1000, 1638, 1845, -1000, 22511, 32144, 1936, 29921, -1000, -1000, + 29921, 55856, 12836, -1000, -1000, 2, -21, -1000, -1000, -1000, + -1000, 1021, -1000, -1000, 1225, 2562, 2375, -1000, -1000, -1000, + -1000, -1000, 1813, -1000, 1777, 1986, 1769, 1753, 286, -1000, + 2172, 2479, 974, 974, -1000, 1301, -1000, 1253, 1584, 1567, + -1000, -1000, -1000, 499, -1000, 55856, 2220, 2217, 2213, -1000, + -539, 1299, 2124, 2171, 22511, 2120, 2652, 1968, 54374, -1000, + -1000, 55115, -1000, 272, -1000, 435, 54374, -1000, -1000, -1000, + 328, 55856, -1000, 5160, -1000, -1000, -1000, 214, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 55856, 242, -1000, 2115, 1374, + -1000, -1000, 2179, -1000, -1000, -1000, -1000, -1000, 188, 187, + 1563, 184, 1557, 184, -1000, 55856, 873, 2227, 55856, -1000, + -1000, -1000, 1154, 1154, -1000, -1000, 2422, -1000, 1253, 1193, + 24734, 24734, -1000, 904, -1000, -1000, 409, -258, 2102, 2102, + -1000, 2102, 2106, -1000, 2102, 144, 2102, 138, 2102, -1000, + -1000, 1538, 1538, -1000, 1544, 2293, 1555, 2923, -1000, 1395, + 22511, 2819, -1000, -1000, -280, -280, -280, -280, -280, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -82, + 2719, 2699, 1193, -1000, 2101, 2100, -1000, 1193, 22511, 1193, + 1538, 2249, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, + 1193, 1193, 1193, 1193, 2232, 2226, 2222, 2218, 2203, 2180, + 2155, 2138, 2117, 2085, 2053, 2037, 2030, 2017, 2002, 1964, + 1193, 1193, 1953, 1193, 1928, 1918, -1000, 1395, 1544, 2551, + 1544, 1193, 1193, 2521, 306, 1193, 1749, 1749, 1749, 1749, + 1749, 1544, 1544, 1544, 1544, 1193, 54374, -1000, -280, -1000, + -1000, -332, -383, -1000, 1538, -280, 1970, 24734, 1193, 24734, + 24734, 24734, 1193, 1538, -1000, 1796, 1775, 2508, 1771, 1193, + 2460, 1193, 1193, 1193, 1759, -1000, 2561, 2048, 2561, 2048, + 2561, 1741, 1371, 55856, -1000, -1000, -1000, -1000, 2676, 2673, + -1000, 1969, -1000, 58, 622, -1000, 2331, 2401, -1000, 2647, + 2346, 2646, -1000, -1000, -1000, -1000, -1000, 1395, -1000, 2509, + 1915, -1000, 979, 1949, -1000, -1000, 21029, 1745, 2307, 800, + 1741, 1998, 2757, 2181, 2211, 3075, -1000, -1000, -1000, -1000, + 2237, -1000, 2228, -1000, -1000, 2052, -1000, 2417, 354, 29921, + 1944, 1944, -1000, 799, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1207, 5160, 2736, -1000, 1552, -1000, 1373, 194, 1293, + -1000, -1000, 974, 974, -1000, 1085, 1083, -1000, 55856, 2099, + -1000, 318, 1545, 318, 1290, -1000, -1000, 1276, -1000, -1000, + -1000, -1000, 2045, 2451, -1000, -1000, -1000, -1000, 55856, -1000, + 55856, 55856, 55856, 2069, 2644, -1000, 22511, 2068, 976, 2347, + 54374, 54374, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 442, 974, -503, 289, 287, 974, 974, + 974, -543, -1000, -1000, 1728, 1726, -1000, -219, -1000, 22511, + -1000, -1000, -1000, -1000, -1000, 1272, 1272, 1540, 1534, 1525, + -1000, 2052, -1000, -1000, -1000, 1873, -1000, -1000, -198, 54374, + 54374, 54374, 54374, -1000, -1000, -1000, 1252, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 904, + 1538, 344, -203, 1538, -1000, -1000, 318, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 22511, -1000, 22511, + -1000, 22511, 1395, 22511, -1000, -1000, -1000, -1000, -1000, 2590, + 1522, 22511, 22511, -1000, 1275, 1268, -280, 1193, -1000, -1000, + -1000, 22511, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 22511, -1000, 22511, -1000, 22511, + -1000, 22511, -1000, 22511, -1000, 22511, -1000, 22511, -1000, 22511, + -1000, 22511, -1000, 22511, -1000, 22511, -1000, 22511, -1000, 22511, + -1000, 22511, -1000, 22511, -1000, 22511, -1000, -1000, 22511, -1000, + -1000, -1000, 22511, -1000, 22511, -1000, 22511, -1000, -1000, -1000, + 22511, 203, 1149, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1538, 346, -1000, -1000, -1000, 2679, + -1000, 1538, 22511, 1138, -1000, 1138, 1138, 1138, -1000, -1000, + -1000, 22511, -1000, 22511, 22511, -1000, 22511, -1000, 22511, -1000, + -1000, -1000, -1000, 22511, 2048, 2332, 38813, 2048, 38813, 2048, + 32144, -1000, -1000, 2673, 2669, 2643, 2337, 2340, 2340, 2331, + -1000, 2635, 2627, -1000, 1520, 2623, 1497, 1076, -1000, 55115, + 22511, -1000, 223, 38072, -1000, 384, 54374, 223, 54374, -1000, + 2610, -1000, -1000, 22511, 2061, -1000, 22511, -1000, -1000, -1000, + -1000, 6276, 2676, 1944, -1000, -1000, 928, -1000, 22511, -1000, + 10932, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1495, + 1485, -1000, -1000, 2057, 22511, -1000, -1000, -1000, 1742, 1729, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2052, -1000, + -1000, -1000, -1000, 328, -535, 2212, 54374, 1260, -1000, 1706, + 1968, 310, 223, 1467, 974, 974, 974, 1257, 1255, 38072, + 1699, -1000, 54374, 425, -1000, 328, -1000, -242, -244, 1193, + -1000, -1000, 2560, -1000, -1000, 16571, -1000, -1000, 2051, 2182, + -1000, -1000, -1000, -1000, 2292, -190, -227, -1000, -1000, 1193, + 1193, 1193, 1751, 1538, -1000, 1193, 1193, 1681, 1610, -1000, + -1000, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, + 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, + 1193, 1544, 1708, -1000, 203, 1538, 2202, -1000, -1000, 6276, + -1000, -1000, 2610, 2622, 0, -1000, -1000, 221, 0, 1395, + 1019, 1538, 1538, 1019, 1680, 1193, 1635, 1560, 1193, 1193, + 32885, -1000, 2619, 2603, 1686, -1000, -1000, 38813, 1686, 38813, + 889, 2669, -290, 22511, 22511, 2335, 1269, -1000, -1000, -1000, + -1000, 1455, 1451, -1000, 1447, -1000, 2727, -1000, 1395, -1000, + 2048, 223, -1000, 794, 1949, -1000, 2590, 1395, 54374, 1395, + 54, 2610, -1000, 1193, -1000, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, -1000, -1000, 54374, 1570, + -1000, -1000, 2554, 1696, 166, -1000, 1549, 1968, -1000, -1000, + 216, -1000, 22511, -1000, 38072, 1426, 1385, -1000, -1000, -1000, + -1000, -543, -1000, -1000, -1000, -1000, -1000, -1000, 380, 1966, + -1000, 959, 54374, 55856, -1000, 2282, -1000, -1000, -1000, -1000, + 22511, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 22162, -1000, 1500, 2125, -1000, -352, -1000, - -495, 22162, -320, -1000, -1000, -320, -1000, -1000, -1000, -1000, - -1000, 22162, -1000, -1000, 22162, -1000, 22162, -1000, -1000, 1568, - -1000, -1000, -1000, 37534, -1000, 1568, -1000, 1568, -1000, -343, - -1000, 1870, -1000, 54370, 1527, 390, -1000, 1158, -1000, -1000, - -1000, -1000, -1000, 55102, 54370, 1904, 54370, -1000, -1000, 1556, - 1500, 2000, 2534, -1000, 1529, -1000, 389, -1000, 2002, 2059, - -1000, -1000, -1000, 19966, -1000, -1000, -1000, -1000, -1000, 233, - -207, 16294, 11866, 1503, -1000, -191, 2369, 1490, -1000, -468, - -1000, -1000, -1000, -1000, 283, -1000, -1000, 1857, -1000, -1000, - 1650, 1646, 1627, -1000, -1000, -1000, -1000, -1000, -1000, -343, - -1000, -1000, 2495, -1000, -255, -1000, -1000, 1832, 1441, -1000, - -1000, -1000, 32410, 53638, -1000, -179, 417, -207, 22162, 2001, - 1500, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -39, - -1000, -1000, 833, -1000, -1000, -1000, 2013, -215, -1000, -1000, - -1000, 337, -486, -286, -360, 24358, -1000, 22162, -1000, 22162, - -1000, 22162, -1000, 54370, 2000, -1000, -1000, -1000, 1419, -1000, - 4251, -388, 2121, -1000, -141, -1000, -1000, -1000, 1117, 1394, - -1000, -1000, -1000, -1000, -1000, -1000, 2477, 54370, -1000, 439, - -1000, -1000, 15556, -211, -219, 1011, -1000, -1000, -1000, -1000, - -1000, 1583, 1522, 1306, 2369, -1000, 54370, -1000, 53638, -381, - 924, 5565, -1000, 2119, 2079, 2630, -1000, -1000, -1000, -1000, - -1000, -1000, -540, 1399, 277, -1000, -1000, -1000, 337, -361, - -1000, 22162, -1000, 22162, -1000, 1500, -1000, -1000, 2484, 73, - -1000, 2652, -1000, 2649, 1005, 1005, -1000, 1145, -540, -1000, - -1000, -1000, -1000, 2369, 2369, -1000, -393, -1000, -1000, -1000, - -1000, -1000, 434, 1217, -1000, -1000, -1000, -1000, -1000, 5565, - -1000, -1000, -1000, 215, 215, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 22511, -1000, + 1538, 2200, -1000, -377, -1000, -504, 22511, -280, -1000, -1000, + -280, -1000, -1000, -1000, -1000, -1000, 22511, -1000, -1000, 22511, + -1000, 22511, -1000, -1000, 1686, -1000, -1000, -1000, 37331, -1000, + 1686, -1000, 1686, -1000, -290, -1000, 1963, -1000, 54374, 1395, + 375, -1000, 1267, -1000, -1000, -1000, -1000, -1000, 55115, 54374, + 1949, 54374, -1000, -1000, 1684, 1538, 2048, 2590, -1000, 1660, + -1000, 380, -1000, 2050, 2171, -1000, -1000, -1000, 20288, -1000, + -1000, -1000, -1000, -1000, 262, -197, 16571, 12089, 1609, -1000, + -196, 1193, 1544, -1000, -477, -1000, -1000, -1000, -1000, 279, + -1000, -1000, 1958, -1000, -1000, 1548, 1537, 1475, -1000, -1000, + -1000, -1000, -1000, -1000, -290, -1000, -1000, 2553, -1000, -254, + -1000, -1000, 1952, 1529, -1000, -1000, -1000, 32144, 53633, -1000, + -184, 382, -197, 22511, 2049, 1538, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -39, -1000, -1000, 772, -1000, -1000, + -1000, 2179, -216, -1000, -1000, -1000, 307, -494, -288, -296, + 24734, -1000, 22511, -1000, 22511, -1000, 22511, -1000, 54374, 2048, + -1000, -1000, -1000, 1483, -1000, 4202, -401, 2195, -1000, -145, + -1000, -1000, -1000, 1203, 1364, -1000, -1000, -1000, -1000, -1000, + -1000, 1414, 54374, -1000, 436, -1000, -1000, 15824, -198, -233, + 1020, -1000, -1000, -1000, -1000, -1000, 1138, 1466, 1357, 1193, + -1000, 54374, -1000, 53633, -395, 882, 6276, -1000, 2193, 2190, + 2704, -1000, -1000, -1000, -1000, -1000, -1000, -549, 1464, 244, + -1000, -1000, -1000, 307, -314, -1000, 22511, -1000, 22511, -1000, + 1538, -1000, -1000, 2535, 54, -1000, 2724, -1000, 2691, 1031, + 1031, -1000, 1242, -549, -1000, -1000, -1000, -1000, 1193, 1193, + -1000, -403, -1000, -1000, -1000, -1000, -1000, 433, 1281, -1000, + -1000, -1000, -1000, -1000, 6276, -1000, -1000, -1000, 204, 204, + -1000, -1000, } var yyPgo = [...]int{ - 0, 3231, 3230, 26, 4, 38, 37, 3229, 3227, 3226, - 174, 3225, 3223, 3222, 3221, 3220, 3219, 2723, 2712, 2693, - 3218, 3217, 3216, 3214, 3213, 3212, 3211, 3209, 3198, 46, - 95, 75, 102, 187, 201, 3197, 173, 164, 194, 3196, - 3195, 3194, 112, 179, 72, 82, 181, 3193, 3192, 65, - 3189, 3188, 3187, 210, 209, 204, 1107, 3185, 202, 105, - 48, 3182, 3179, 3177, 3176, 3175, 3170, 3169, 3168, 3167, - 3166, 3163, 3160, 3157, 3154, 3153, 3152, 3148, 3145, 307, - 3138, 3135, 17, 3129, 71, 3127, 3125, 3124, 3122, 3120, - 8, 3118, 3115, 23, 32, 59, 3106, 3105, 45, 3103, - 3100, 3099, 3098, 3097, 42, 3095, 24, 3094, 31, 3091, - 3089, 121, 3076, 3071, 3059, 41, 3058, 3055, 3051, 25, - 168, 3048, 3047, 137, 3043, 3042, 3041, 167, 193, 3037, - 2301, 3033, 94, 3029, 3025, 3024, 162, 191, 3021, 114, - 3020, 3019, 3018, 143, 3017, 3309, 3016, 3015, 66, 70, - 195, 3014, 3010, 227, 68, 58, 3009, 13, 16, 3008, - 3007, 67, 63, 3003, 109, 3001, 2992, 97, 84, 2991, - 93, 111, 2989, 2988, 2, 14, 2987, 5, 1, 7, - 101, 2977, 2976, 118, 2972, 2971, 2965, 91, 2962, 2951, - 407, 2945, 87, 126, 98, 81, 2944, 169, 152, 2941, - 2940, 2939, 2935, 2933, 2929, 51, 2927, 2926, 2925, 135, - 288, 116, 2924, 145, 349, 52, 147, 2921, 205, 77, - 197, 186, 2920, 2916, 133, 131, 2914, 2909, 55, 166, - 196, 2908, 96, 127, 120, 170, 89, 128, 2905, 2902, - 56, 62, 2899, 2896, 2895, 2893, 172, 2892, 2889, 60, - 2888, 54, 2887, 165, 2885, 331, 74, 2884, 188, 154, - 2878, 61, 2876, 2870, 73, 130, 117, 27, 2869, 153, - 158, 124, 160, 2867, 2865, 53, 2864, 2863, 2862, 184, - 276, 2854, 2851, 342, 175, 138, 149, 83, 2848, 284, - 2845, 2843, 10, 4461, 7231, 178, 29, 159, 2842, 2837, - 7803, 39, 44, 21, 2836, 208, 2834, 185, 2833, 2832, - 2830, 192, 206, 99, 156, 57, 2829, 2828, 2824, 2822, - 33, 2821, 2807, 2805, 2804, 2803, 2798, 36, 35, 34, - 90, 217, 64, 18, 108, 155, 150, 69, 2794, 2792, - 2789, 115, 92, 2785, 157, 151, 123, 104, 2780, 177, - 142, 119, 2776, 134, 30, 2774, 2767, 2766, 2765, 85, - 2764, 2763, 2762, 2761, 148, 141, 113, 79, 2760, 80, - 106, 144, 146, 50, 2759, 43, 2753, 2750, 28, 180, - 22, 2747, 40, 100, 110, 2745, 6349, 2744, 15, 296, - 189, 2741, 2740, 6, 9, 12, 2734, 2733, 2732, 2731, - 129, 2728, 2714, 2701, 2700, 20, 47, 19, 11, 103, - 136, 76, 2699, 2694, 140, 2689, 2688, 2684, 0, 1032, - 125, 2647, 198, + 0, 3435, 3430, 31, 7, 40, 39, 3428, 3426, 3423, + 171, 3421, 3420, 3419, 3411, 3410, 3407, 2789, 2782, 2755, + 3406, 3404, 3400, 3393, 3392, 3391, 3390, 3383, 3381, 27, + 114, 100, 101, 212, 192, 3380, 169, 161, 198, 3378, + 3373, 3372, 125, 182, 82, 81, 187, 3370, 3369, 68, + 3368, 3353, 3284, 180, 179, 177, 1100, 3282, 176, 111, + 47, 3279, 3277, 3275, 3274, 3268, 3261, 3260, 3258, 3257, + 3256, 3254, 3252, 3251, 3247, 3244, 3242, 3240, 3229, 308, + 3228, 3225, 16, 3223, 73, 3220, 3213, 3210, 3208, 3206, + 9, 3203, 3201, 32, 41, 55, 3197, 3195, 44, 3194, + 3193, 3192, 3191, 3187, 79, 3185, 14, 3184, 35, 3183, + 3179, 124, 3177, 3176, 3174, 42, 3173, 3171, 3170, 11, + 162, 3169, 3166, 138, 3163, 3158, 3147, 164, 221, 3144, + 2357, 3143, 93, 3142, 3141, 3140, 160, 191, 3138, 120, + 3137, 3136, 3135, 148, 3128, 3300, 3126, 3124, 67, 62, + 168, 3123, 3117, 201, 80, 8, 3116, 22, 23, 3115, + 3114, 72, 61, 3113, 98, 3110, 3108, 94, 99, 3107, + 109, 90, 3106, 3099, 10, 5, 3098, 1, 4, 2, + 115, 3091, 3088, 108, 3087, 3086, 3084, 97, 3081, 3077, + 4382, 3071, 83, 129, 96, 64, 3070, 170, 165, 3069, + 3068, 3065, 3064, 3059, 3058, 49, 3054, 3051, 3050, 136, + 1270, 116, 3049, 145, 352, 51, 146, 3048, 193, 75, + 3042, 163, 3041, 3038, 133, 132, 3031, 3030, 53, 166, + 197, 3028, 92, 128, 117, 183, 91, 130, 3027, 3026, + 59, 58, 3011, 3008, 2993, 2985, 167, 2983, 2982, 63, + 2977, 56, 2973, 195, 2967, 340, 77, 2964, 185, 158, + 2963, 66, 2949, 2948, 85, 95, 57, 29, 2946, 153, + 159, 126, 178, 2945, 2944, 52, 2941, 2939, 2938, 190, + 319, 2930, 2928, 323, 174, 140, 144, 87, 2925, 266, + 2923, 2917, 2913, 19, 5078, 7104, 181, 17, 155, 2912, + 2904, 8002, 48, 43, 13, 2897, 211, 2896, 194, 2892, + 2891, 2881, 203, 208, 105, 156, 54, 2880, 2879, 2878, + 2876, 71, 2870, 2869, 2866, 2862, 2860, 2859, 38, 37, + 36, 70, 196, 60, 25, 89, 154, 149, 65, 2858, + 2857, 2851, 121, 78, 2848, 152, 151, 123, 104, 2844, + 175, 141, 118, 2841, 102, 34, 2837, 2829, 2828, 2826, + 84, 2825, 2824, 2822, 2821, 150, 142, 119, 74, 2820, + 76, 113, 147, 143, 50, 2817, 45, 2814, 2812, 33, + 184, 28, 2811, 21, 106, 110, 2807, 6623, 2805, 12, + 265, 157, 2804, 2802, 15, 18, 6, 2799, 2797, 2794, + 2793, 131, 2788, 2784, 2783, 2775, 26, 46, 24, 20, + 112, 137, 69, 2773, 2761, 139, 2760, 2759, 2754, 0, + 1040, 127, 2722, 204, } -//line sql.y:8691 +//line sql.y:8755 type yySymType struct { union any empty struct{} @@ -8510,59 +8534,59 @@ func (st *yySymType) withUnion() *With { } var yyR1 = [...]int{ - 0, 416, 417, 417, 7, 7, 7, 7, 7, 7, + 0, 417, 418, 418, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 261, 386, 259, 259, 28, 74, 36, 36, 35, + 7, 261, 387, 259, 259, 28, 74, 36, 36, 35, 35, 38, 38, 37, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 29, 29, 29, 29, 30, 30, 30, 30, 30, 15, 16, 34, 34, 17, 17, 109, 109, 18, 19, 19, - 19, 19, 420, 420, 185, 185, 183, 183, 184, 184, + 19, 19, 421, 421, 185, 185, 183, 183, 184, 184, 264, 264, 20, 268, 268, 270, 270, 270, 270, 260, 260, 260, 21, 21, 269, 269, 271, 271, 271, 274, - 274, 274, 274, 314, 314, 314, 22, 22, 22, 22, - 22, 129, 129, 388, 388, 387, 382, 382, 381, 381, - 380, 385, 385, 384, 384, 383, 40, 41, 50, 50, - 50, 50, 51, 52, 389, 389, 355, 57, 57, 56, + 274, 274, 274, 315, 315, 315, 22, 22, 22, 22, + 22, 129, 129, 389, 389, 388, 383, 383, 382, 382, + 381, 386, 386, 385, 385, 384, 40, 41, 50, 50, + 50, 50, 51, 52, 390, 390, 356, 57, 57, 56, 56, 56, 56, 56, 56, 58, 58, 54, 54, 53, - 53, 55, 55, 357, 357, 343, 343, 356, 356, 356, - 356, 356, 356, 356, 342, 342, 140, 140, 238, 238, + 53, 55, 55, 358, 358, 344, 344, 357, 357, 357, + 357, 357, 357, 357, 343, 343, 140, 140, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 404, 404, 404, 403, 403, + 238, 238, 238, 238, 238, 405, 405, 405, 404, 404, 239, 239, 239, 239, 239, 239, 239, 239, 149, 149, 161, 161, 161, 161, 161, 161, 147, 147, 148, 146, 146, 146, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 408, - 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, - 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, - 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, - 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, - 408, 160, 160, 155, 155, 155, 157, 157, 156, 156, - 156, 158, 158, 405, 405, 405, 405, 320, 320, 320, - 320, 323, 323, 321, 321, 321, 321, 321, 321, 321, - 321, 321, 322, 322, 322, 322, 322, 322, 322, 324, - 324, 324, 324, 324, 325, 325, 325, 325, 325, 325, - 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, - 326, 326, 326, 326, 326, 326, 326, 326, 341, 341, - 330, 330, 335, 335, 336, 336, 337, 337, 337, 338, - 338, 338, 339, 339, 332, 332, 332, 332, 332, 332, - 332, 332, 332, 334, 334, 333, 333, 333, 344, 369, - 369, 368, 368, 366, 366, 366, 366, 366, 366, 366, - 366, 353, 353, 363, 363, 363, 363, 363, 352, 352, - 348, 348, 348, 349, 349, 350, 350, 347, 347, 351, - 351, 365, 365, 364, 364, 345, 345, 346, 346, 371, - 406, 406, 406, 406, 406, 407, 407, 372, 396, 398, - 398, 398, 397, 397, 394, 395, 393, 393, 393, 393, - 393, 84, 84, 84, 287, 287, 288, 288, 361, 361, - 360, 360, 360, 362, 362, 359, 359, 359, 359, 359, - 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, - 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, - 359, 359, 359, 359, 359, 359, 282, 282, 282, 392, - 392, 392, 392, 392, 392, 391, 391, 391, 358, 358, - 358, 358, 390, 390, 59, 59, 219, 219, 409, 409, - 411, 411, 411, 47, 47, 47, 47, 47, 47, 46, + 154, 154, 154, 154, 154, 154, 154, 154, 409, 409, + 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, + 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, + 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, + 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, + 160, 160, 155, 155, 155, 157, 157, 156, 156, 156, + 158, 158, 406, 406, 406, 406, 321, 321, 321, 321, + 324, 324, 322, 322, 322, 322, 322, 322, 322, 322, + 322, 323, 323, 323, 323, 323, 323, 323, 325, 325, + 325, 325, 325, 326, 326, 326, 326, 326, 326, 326, + 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, + 327, 327, 327, 327, 327, 327, 327, 327, 342, 342, + 331, 331, 336, 336, 337, 337, 338, 338, 338, 339, + 339, 339, 340, 340, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 335, 335, 334, 334, 334, 345, 370, + 370, 369, 369, 367, 367, 367, 367, 367, 367, 367, + 367, 354, 354, 364, 364, 364, 364, 364, 353, 353, + 349, 349, 349, 350, 350, 351, 351, 348, 348, 352, + 352, 366, 366, 365, 365, 346, 346, 347, 347, 372, + 407, 407, 407, 407, 407, 408, 408, 373, 397, 399, + 399, 399, 398, 398, 395, 396, 394, 394, 394, 394, + 394, 84, 84, 84, 287, 287, 288, 288, 362, 362, + 361, 361, 361, 363, 363, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 360, 360, 360, 360, 282, 282, 282, 393, + 393, 393, 393, 393, 393, 392, 392, 392, 359, 359, + 359, 359, 391, 391, 59, 59, 219, 219, 410, 410, + 412, 412, 412, 47, 47, 47, 47, 47, 47, 46, 46, 46, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, @@ -8570,62 +8594,64 @@ var yyR1 = [...]int{ 43, 43, 43, 43, 43, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 111, 111, 112, - 112, 112, 112, 114, 114, 114, 374, 374, 60, 60, - 3, 3, 173, 175, 176, 176, 174, 174, 174, 174, - 174, 174, 62, 62, 61, 61, 178, 177, 179, 179, - 179, 1, 1, 2, 2, 4, 4, 379, 379, 379, - 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, - 379, 379, 379, 379, 379, 379, 379, 379, 379, 340, - 340, 340, 373, 373, 375, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 117, 116, 116, 115, 118, - 118, 118, 118, 118, 118, 118, 118, 377, 377, 377, - 63, 63, 378, 327, 328, 329, 5, 6, 354, 376, - 125, 125, 24, 39, 39, 25, 25, 25, 25, 26, - 26, 64, 67, 67, 65, 65, 65, 65, 65, 65, + 23, 23, 23, 23, 23, 23, 23, 23, 111, 111, + 112, 112, 112, 112, 114, 114, 114, 375, 375, 60, + 60, 3, 3, 173, 175, 176, 176, 174, 174, 174, + 174, 174, 174, 62, 62, 61, 61, 178, 177, 179, + 179, 179, 1, 1, 2, 2, 4, 4, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 341, 341, 341, 374, 374, 376, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 117, 116, 116, 115, + 118, 118, 118, 118, 118, 118, 118, 118, 378, 378, + 378, 63, 63, 379, 328, 329, 330, 5, 6, 355, + 377, 125, 125, 24, 39, 39, 25, 25, 25, 25, + 26, 26, 64, 67, 67, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 281, 281, 290, - 290, 280, 280, 305, 305, 305, 283, 283, 283, 284, - 284, 402, 402, 402, 277, 277, 66, 66, 66, 306, - 306, 306, 306, 69, 69, 412, 412, 413, 413, 414, - 414, 414, 70, 71, 71, 309, 309, 310, 310, 72, - 73, 85, 85, 85, 85, 85, 86, 86, 86, 86, - 110, 110, 110, 10, 10, 10, 10, 81, 81, 81, - 9, 9, 11, 68, 68, 75, 399, 399, 400, 401, - 401, 401, 401, 76, 78, 27, 27, 27, 27, 27, - 27, 135, 135, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 123, 123, 130, 130, 130, 124, 124, - 421, 79, 80, 80, 128, 128, 128, 121, 121, 121, - 127, 127, 127, 12, 12, 13, 263, 263, 14, 14, - 134, 134, 133, 133, 136, 136, 136, 136, 136, 136, - 136, 131, 131, 132, 132, 132, 132, 298, 298, 298, - 297, 297, 167, 167, 169, 168, 168, 170, 170, 171, - 171, 171, 171, 217, 217, 193, 193, 256, 256, 257, - 257, 255, 255, 262, 262, 258, 258, 258, 258, 265, - 265, 172, 172, 172, 172, 180, 180, 181, 181, 182, - 182, 308, 308, 303, 303, 303, 302, 302, 186, 186, - 186, 188, 187, 187, 187, 187, 189, 189, 191, 191, - 190, 190, 192, 197, 197, 196, 196, 194, 194, 194, - 194, 194, 194, 195, 195, 195, 195, 198, 198, 145, - 145, 145, 145, 145, 145, 145, 145, 410, 410, 159, - 159, 159, 159, 159, 159, 159, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 246, 246, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 153, 153, 153, 153, 153, 153, + 65, 292, 292, 281, 281, 290, 290, 280, 280, 306, + 306, 306, 283, 283, 283, 284, 284, 403, 403, 403, + 277, 277, 66, 66, 66, 307, 307, 307, 307, 69, + 69, 413, 413, 414, 414, 415, 415, 415, 70, 71, + 71, 310, 310, 311, 311, 72, 73, 85, 85, 85, + 85, 85, 86, 86, 86, 86, 86, 86, 110, 110, + 110, 10, 10, 10, 10, 81, 81, 81, 9, 9, + 11, 68, 68, 75, 400, 400, 401, 402, 402, 402, + 402, 76, 78, 27, 27, 27, 27, 27, 27, 135, + 135, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 130, 130, 130, 124, 124, 422, 79, + 80, 80, 128, 128, 128, 121, 121, 121, 127, 127, + 127, 12, 12, 13, 263, 263, 14, 14, 134, 134, + 133, 133, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 131, 131, 132, 132, 132, 132, 299, + 299, 299, 298, 298, 167, 167, 169, 168, 168, 170, + 170, 171, 171, 171, 171, 217, 217, 193, 193, 256, + 256, 257, 257, 255, 255, 262, 262, 258, 258, 258, + 258, 265, 265, 172, 172, 172, 172, 180, 180, 181, + 181, 182, 182, 309, 309, 304, 304, 304, 303, 303, + 186, 186, 186, 188, 187, 187, 187, 187, 189, 189, + 191, 191, 190, 190, 192, 197, 197, 196, 196, 194, + 194, 194, 194, 194, 194, 195, 195, 195, 195, 198, + 198, 145, 145, 145, 145, 145, 145, 145, 145, 411, + 411, 159, 159, 159, 159, 159, 159, 159, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 246, + 246, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 222, - 222, 221, 221, 87, 87, 87, 88, 88, 89, 89, - 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, - 92, 92, 91, 91, 212, 212, 295, 295, 93, 94, - 94, 95, 95, 98, 98, 97, 96, 96, 102, 102, - 99, 99, 101, 101, 100, 103, 103, 104, 105, 105, - 278, 278, 199, 199, 208, 208, 208, 208, 200, 200, - 201, 201, 201, 201, 201, 201, 209, 209, 209, 216, - 210, 210, 206, 206, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 205, 205, 205, 205, 205, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 222, 222, 221, 221, 87, 87, 87, 88, 88, + 89, 89, 89, 89, 89, 90, 90, 90, 90, 90, + 90, 90, 92, 92, 91, 91, 212, 212, 296, 296, + 93, 94, 94, 95, 95, 98, 98, 97, 96, 96, + 102, 102, 99, 99, 101, 101, 100, 103, 103, 104, + 105, 105, 278, 278, 199, 199, 208, 208, 208, 208, + 200, 200, 201, 201, 201, 201, 201, 201, 209, 209, + 209, 216, 210, 210, 206, 206, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, @@ -8644,63 +8670,36 @@ var yyR1 = [...]int{ 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 164, 164, - 164, 164, 227, 227, 151, 151, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 151, 151, 151, 151, 152, - 152, 165, 165, 165, 165, 166, 166, 166, 166, 166, - 166, 166, 316, 316, 119, 119, 119, 119, 119, 119, + 164, 164, 164, 164, 227, 227, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 152, 152, 165, 165, 165, 165, 166, 166, 166, + 166, 166, 166, 166, 317, 317, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, + 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 422, 422, 331, 331, 331, 207, 207, 207, - 207, 207, 126, 126, 126, 126, 126, 313, 313, 313, - 317, 317, 317, 315, 315, 315, 315, 315, 315, 315, - 315, 315, 315, 315, 315, 315, 315, 315, 318, 318, - 225, 225, 122, 122, 223, 223, 224, 226, 226, 218, - 218, 218, 218, 220, 220, 203, 203, 203, 228, 228, - 319, 319, 229, 229, 106, 107, 107, 108, 108, 230, - 230, 232, 231, 231, 233, 234, 234, 234, 235, 235, - 236, 236, 236, 49, 49, 49, 49, 49, 44, 44, - 44, 44, 45, 45, 45, 45, 137, 137, 137, 137, - 139, 139, 138, 138, 82, 82, 83, 83, 83, 143, - 143, 144, 144, 144, 141, 141, 142, 142, 253, 253, - 253, 253, 253, 253, 253, 237, 237, 237, 244, 244, - 244, 240, 240, 242, 242, 242, 243, 243, 243, 241, - 250, 250, 252, 252, 251, 251, 247, 247, 248, 248, - 249, 249, 249, 245, 245, 202, 202, 202, 202, 202, - 254, 254, 254, 254, 307, 307, 307, 266, 266, 213, - 213, 215, 215, 214, 214, 163, 267, 267, 275, 272, - 272, 273, 273, 299, 299, 299, 276, 276, 289, 289, - 285, 285, 286, 286, 279, 279, 291, 291, 291, 77, - 211, 211, 370, 370, 367, 294, 294, 296, 296, 300, - 300, 304, 304, 301, 301, 8, 415, 415, 415, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, + 120, 120, 120, 120, 423, 423, 332, 332, 332, 207, + 207, 207, 207, 207, 126, 126, 126, 126, 126, 314, + 314, 314, 318, 318, 318, 316, 316, 316, 316, 316, + 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, + 319, 319, 225, 225, 122, 122, 223, 223, 224, 226, + 226, 218, 218, 218, 218, 220, 220, 203, 203, 203, + 228, 228, 320, 320, 229, 229, 106, 107, 107, 108, + 108, 230, 230, 232, 231, 231, 233, 234, 234, 234, + 235, 235, 236, 236, 236, 49, 49, 49, 49, 49, + 44, 44, 44, 44, 45, 45, 45, 45, 137, 137, + 137, 137, 139, 139, 138, 138, 82, 82, 83, 83, + 83, 143, 143, 144, 144, 144, 141, 141, 142, 142, + 253, 253, 253, 253, 253, 253, 253, 237, 237, 237, + 244, 244, 244, 240, 240, 242, 242, 242, 243, 243, + 243, 241, 250, 250, 252, 252, 251, 251, 247, 247, + 248, 248, 249, 249, 249, 245, 245, 202, 202, 202, + 202, 202, 254, 254, 254, 254, 308, 308, 308, 266, + 266, 213, 213, 215, 215, 214, 214, 163, 267, 267, + 275, 272, 272, 273, 273, 300, 300, 300, 276, 276, + 289, 289, 285, 285, 286, 286, 279, 279, 291, 291, + 291, 77, 211, 211, 371, 371, 368, 295, 295, 297, + 297, 301, 301, 305, 305, 302, 302, 8, 416, 416, + 416, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, @@ -8715,28 +8714,55 @@ var yyR1 = [...]int{ 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 418, 419, 311, 312, 312, 312, + 293, 293, 293, 293, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 294, 419, 420, 312, 313, 313, 313, } var yyR2 = [...]int{ @@ -8755,7 +8781,7 @@ var yyR2 = [...]int{ 2, 2, 1, 1, 1, 1, 2, 2, 6, 12, 2, 0, 2, 0, 2, 1, 0, 2, 1, 3, 3, 0, 1, 1, 3, 3, 6, 4, 7, 8, - 8, 8, 6, 3, 1, 1, 5, 0, 1, 1, + 8, 8, 5, 3, 1, 1, 5, 0, 1, 1, 1, 1, 2, 2, 2, 0, 1, 4, 4, 4, 4, 4, 4, 2, 4, 1, 3, 1, 1, 3, 4, 3, 3, 3, 5, 10, 0, 2, 0, 2, @@ -8764,17 +8790,17 @@ var yyR2 = [...]int{ 0, 2, 2, 3, 3, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, - 2, 1, 1, 2, 1, 2, 1, 3, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, - 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, - 2, 2, 2, 1, 1, 1, 1, 1, 5, 5, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, + 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, + 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, + 2, 2, 1, 1, 1, 1, 1, 5, 2, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 0, 3, 0, 5, 1, 3, 0, 3, 5, 0, 1, 1, 0, 1, 0, 3, 3, 2, 2, 2, @@ -8799,111 +8825,113 @@ var yyR2 = [...]int{ 1, 3, 5, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 4, 4, 2, 11, 3, 6, 8, 6, 6, 6, 13, 8, 6, 6, - 10, 7, 5, 5, 5, 7, 5, 5, 5, 5, - 5, 7, 7, 5, 5, 5, 5, 0, 6, 5, - 6, 4, 5, 0, 8, 9, 0, 3, 0, 1, - 0, 3, 8, 4, 1, 3, 3, 6, 7, 7, - 8, 4, 0, 1, 0, 1, 3, 3, 1, 1, - 2, 1, 1, 0, 2, 0, 2, 5, 3, 7, - 4, 4, 4, 4, 3, 3, 3, 7, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 2, 0, - 2, 2, 1, 3, 2, 0, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 1, 3, 3, 0, - 2, 2, 2, 2, 2, 2, 2, 4, 4, 3, - 0, 1, 4, 3, 4, 4, 3, 3, 3, 2, - 1, 3, 3, 3, 5, 7, 7, 6, 5, 3, - 2, 4, 5, 5, 3, 3, 7, 3, 3, 3, - 3, 4, 7, 5, 2, 4, 4, 4, 4, 4, - 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 2, 2, 4, 4, 4, 4, 4, 2, 3, 3, - 3, 3, 3, 5, 2, 3, 3, 2, 3, 4, - 4, 4, 3, 4, 4, 5, 3, 0, 1, 0, - 1, 1, 1, 0, 2, 2, 0, 2, 2, 0, - 2, 0, 1, 1, 1, 1, 2, 1, 3, 1, - 1, 1, 1, 1, 3, 0, 1, 1, 3, 3, - 2, 2, 1, 1, 5, 0, 1, 0, 1, 2, - 3, 0, 3, 3, 3, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, - 4, 4, 4, 2, 2, 3, 1, 3, 2, 1, - 2, 1, 2, 2, 4, 3, 3, 6, 4, 7, - 6, 1, 3, 2, 2, 2, 2, 1, 1, 1, - 3, 2, 1, 1, 1, 0, 1, 1, 0, 3, - 0, 2, 0, 2, 1, 2, 2, 0, 1, 1, - 0, 1, 1, 5, 5, 4, 0, 2, 4, 4, - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 1, 2, 3, 5, 0, 1, 2, - 1, 1, 0, 1, 2, 1, 3, 1, 1, 1, - 4, 3, 1, 1, 2, 3, 7, 0, 3, 0, - 1, 1, 3, 1, 3, 1, 1, 3, 3, 1, - 3, 4, 4, 4, 3, 2, 4, 0, 1, 0, - 2, 0, 1, 0, 1, 2, 1, 1, 1, 2, - 2, 1, 2, 3, 2, 3, 2, 2, 2, 1, - 1, 3, 3, 0, 1, 1, 2, 6, 5, 6, - 6, 5, 5, 0, 2, 3, 3, 0, 2, 3, - 3, 3, 2, 3, 1, 3, 6, 1, 1, 3, - 4, 3, 4, 4, 4, 1, 3, 4, 5, 6, - 3, 4, 5, 6, 3, 4, 1, 1, 1, 3, - 3, 3, 3, 3, 3, 5, 5, 3, 3, 3, - 3, 3, 3, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 2, 2, 2, 2, 1, 1, 2, 7, - 7, 6, 6, 2, 2, 5, 6, 3, 3, 1, - 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 2, 2, 2, 4, 2, 4, - 0, 1, 2, 5, 0, 3, 0, 1, 4, 4, - 2, 1, 0, 0, 1, 1, 2, 2, 1, 1, - 2, 2, 0, 1, 1, 1, 1, 5, 1, 3, - 0, 3, 1, 1, 1, 2, 1, 2, 1, 1, + 10, 7, 5, 5, 5, 5, 7, 5, 5, 5, + 5, 5, 7, 7, 5, 5, 5, 5, 0, 6, + 5, 6, 4, 5, 0, 8, 9, 0, 3, 0, + 1, 0, 3, 8, 4, 1, 3, 3, 6, 7, + 7, 8, 4, 0, 1, 0, 1, 3, 3, 1, + 1, 2, 1, 1, 0, 2, 0, 2, 5, 3, + 7, 4, 4, 4, 4, 3, 3, 3, 7, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 0, 2, 2, 1, 3, 2, 0, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 1, 3, 3, + 0, 2, 2, 2, 2, 2, 2, 2, 4, 4, + 3, 0, 1, 4, 3, 4, 4, 3, 3, 3, + 2, 1, 3, 3, 3, 5, 7, 7, 6, 5, + 3, 2, 4, 5, 5, 3, 3, 7, 3, 3, + 3, 3, 4, 7, 5, 2, 4, 4, 4, 4, + 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, + 4, 2, 2, 4, 4, 4, 4, 4, 2, 3, + 3, 3, 3, 3, 5, 2, 3, 3, 2, 3, + 4, 4, 4, 3, 4, 4, 5, 3, 5, 3, + 5, 0, 1, 0, 1, 0, 1, 1, 1, 0, + 2, 2, 0, 2, 2, 0, 2, 0, 1, 1, + 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, + 3, 0, 1, 1, 3, 3, 2, 2, 1, 1, + 5, 0, 1, 0, 1, 2, 3, 0, 3, 3, + 3, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 4, 4, + 4, 2, 2, 3, 1, 3, 2, 1, 2, 1, + 2, 2, 4, 3, 3, 6, 4, 7, 6, 1, + 3, 2, 2, 2, 2, 1, 1, 1, 3, 2, + 1, 1, 1, 0, 1, 1, 0, 3, 0, 2, + 0, 2, 1, 2, 2, 0, 1, 1, 0, 1, + 1, 5, 5, 4, 0, 2, 4, 4, 0, 1, + 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 1, 2, 3, 5, 0, + 1, 2, 1, 1, 0, 1, 2, 1, 3, 1, + 1, 1, 4, 3, 1, 1, 2, 3, 7, 0, + 3, 0, 1, 1, 3, 1, 3, 1, 1, 3, + 3, 1, 3, 4, 4, 4, 3, 2, 4, 0, + 1, 0, 2, 0, 1, 0, 1, 2, 1, 1, + 1, 2, 2, 1, 2, 3, 2, 3, 2, 2, + 2, 1, 1, 3, 3, 0, 1, 1, 2, 6, + 5, 6, 6, 5, 5, 0, 2, 3, 3, 0, + 2, 3, 3, 3, 2, 3, 1, 3, 6, 1, + 1, 3, 4, 3, 4, 4, 4, 1, 3, 4, + 5, 6, 3, 4, 5, 6, 3, 4, 1, 1, + 1, 3, 3, 3, 3, 3, 3, 5, 5, 3, + 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 2, 2, 2, 2, 1, 1, + 2, 7, 7, 6, 6, 2, 2, 5, 6, 3, + 3, 1, 3, 1, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, + 2, 4, 0, 1, 2, 5, 0, 3, 0, 1, + 4, 4, 2, 1, 0, 0, 1, 1, 2, 2, + 1, 1, 2, 2, 0, 1, 1, 1, 1, 5, + 1, 3, 0, 3, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 4, 6, 4, 4, 8, 8, 6, 8, - 6, 5, 4, 10, 2, 2, 1, 2, 2, 2, - 2, 2, 5, 6, 6, 6, 6, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 8, 4, - 8, 8, 6, 5, 4, 4, 4, 5, 7, 4, - 4, 7, 4, 4, 6, 6, 6, 8, 6, 6, - 4, 4, 3, 4, 6, 6, 4, 4, 6, 4, - 6, 4, 4, 4, 4, 4, 4, 6, 4, 6, - 4, 4, 4, 6, 4, 6, 4, 4, 6, 4, - 6, 4, 6, 8, 4, 6, 8, 4, 6, 8, - 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, + 1, 1, 1, 3, 4, 6, 4, 4, 8, 8, + 6, 8, 6, 5, 4, 10, 2, 2, 1, 2, + 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 8, 4, 8, 8, 6, 5, 4, 4, 4, 5, + 7, 4, 4, 7, 4, 4, 6, 6, 6, 8, + 6, 6, 4, 4, 3, 4, 6, 6, 4, 4, + 6, 4, 6, 4, 4, 4, 4, 4, 4, 6, + 4, 6, 4, 4, 4, 6, 4, 6, 4, 4, + 6, 4, 6, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, - 4, 4, 6, 4, 6, 4, 8, 6, 4, 4, - 6, 4, 6, 8, 4, 6, 8, 4, 4, 6, - 8, 6, 4, 6, 6, 8, 10, 7, 8, 8, - 9, 4, 4, 4, 4, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, - 4, 6, 4, 6, 5, 9, 6, 9, 8, 6, - 8, 8, 8, 6, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 2, 6, 8, 10, 12, 14, 6, - 8, 8, 10, 12, 14, 6, 8, 10, 12, 6, - 8, 4, 4, 3, 4, 6, 6, 4, 6, 4, - 6, 8, 0, 2, 1, 1, 1, 1, 1, 1, + 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, + 8, 4, 4, 4, 6, 4, 6, 4, 8, 6, + 4, 4, 6, 4, 6, 8, 4, 6, 8, 4, + 4, 6, 8, 6, 4, 6, 6, 8, 10, 7, + 8, 8, 9, 4, 4, 4, 4, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, + 4, 4, 4, 6, 4, 6, 5, 9, 6, 9, + 8, 6, 8, 8, 8, 6, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 2, 6, 8, 10, 12, + 14, 6, 8, 8, 10, 12, 14, 6, 8, 10, + 12, 6, 8, 4, 4, 3, 4, 6, 6, 4, + 6, 4, 6, 8, 0, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 2, 0, 2, 3, 4, + 4, 4, 4, 4, 0, 3, 4, 7, 3, 1, + 1, 1, 0, 5, 5, 2, 3, 1, 2, 2, + 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, + 0, 1, 0, 1, 0, 2, 1, 2, 4, 0, + 2, 1, 1, 3, 5, 1, 1, 1, 2, 2, + 0, 4, 0, 2, 0, 2, 2, 1, 3, 0, + 1, 0, 1, 3, 1, 3, 2, 0, 1, 1, + 0, 1, 2, 4, 4, 0, 2, 2, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 0, 3, 1, 1, 0, 4, 0, 1, + 1, 0, 3, 1, 3, 2, 1, 1, 0, 1, + 2, 3, 4, 2, 3, 4, 4, 9, 3, 5, + 0, 3, 3, 0, 1, 0, 2, 2, 0, 2, + 2, 2, 0, 2, 1, 2, 3, 3, 0, 2, + 1, 2, 3, 4, 3, 0, 1, 3, 1, 6, + 5, 4, 1, 3, 3, 5, 0, 2, 5, 0, + 5, 1, 3, 1, 2, 3, 4, 1, 1, 3, + 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 0, 2, 0, 3, 0, 1, 0, 1, + 1, 5, 0, 1, 0, 1, 2, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 2, 0, 2, 3, 4, 4, 4, - 4, 4, 0, 3, 4, 7, 3, 1, 1, 1, - 0, 5, 5, 2, 3, 1, 2, 2, 1, 2, - 1, 2, 2, 1, 2, 2, 1, 1, 0, 1, - 0, 1, 0, 2, 1, 2, 4, 0, 2, 1, - 1, 3, 5, 1, 1, 1, 2, 2, 0, 4, - 0, 2, 0, 2, 2, 1, 3, 0, 1, 0, - 1, 3, 1, 3, 2, 0, 1, 1, 0, 1, - 2, 4, 4, 0, 2, 2, 1, 1, 3, 3, - 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, - 0, 3, 1, 1, 0, 4, 0, 1, 1, 0, - 3, 1, 3, 2, 1, 1, 0, 1, 2, 3, - 4, 2, 3, 4, 4, 9, 3, 5, 0, 3, - 3, 0, 1, 0, 2, 2, 0, 2, 2, 2, - 0, 2, 1, 2, 3, 3, 0, 2, 1, 2, - 3, 4, 3, 0, 1, 3, 1, 6, 5, 4, - 1, 3, 3, 5, 0, 2, 5, 0, 5, 1, - 3, 1, 2, 3, 4, 1, 1, 3, 3, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 0, 2, 0, 3, 0, 1, 0, 1, 1, 5, - 0, 1, 0, 1, 2, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -8970,869 +8998,875 @@ var yyR2 = [...]int{ } var yyChk = [...]int{ - -1000, -416, -79, -421, -7, -29, -15, -16, -17, -18, + -1000, -417, -79, -422, -7, -29, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -64, -67, -65, -66, -69, -70, -71, -72, -73, -9, -11, -68, -27, -28, -74, -75, -76, -77, -78, -12, -13, -14, - -8, -32, -31, -30, 12, 13, -109, -35, 34, -40, - -50, 234, -51, -41, 235, -52, 237, 236, 274, 238, - 387, 267, 79, 323, 324, 326, 327, 328, 329, -110, - 694, 272, 273, 240, 38, 50, 35, 36, 39, 244, - 280, 281, 243, 140, -33, -36, 11, -418, 14, 477, - 269, 268, 30, -34, 587, 91, -80, -417, 742, -253, - -237, 25, 35, 31, -236, -232, -128, -237, 23, 21, - 10, -79, -79, -79, 15, 16, -79, -355, -357, 91, - 167, 91, -79, -57, -56, -54, -53, -55, -58, 33, - -47, -48, -379, -46, -43, 239, 236, 284, 130, 131, - 274, 275, 276, 238, 258, 273, 277, 272, 293, -42, - 86, 35, 587, 590, -362, 235, 241, 242, 237, 478, - 133, 132, 80, -359, 382, 621, 712, -58, 714, 105, - 108, 713, 49, 248, 715, 716, 717, 628, 718, 257, - 719, 720, 721, 722, 728, 669, 729, 730, 731, 134, - 10, -79, -304, -300, 95, -293, 584, 260, 619, 431, - 620, 309, 86, 46, 41, 523, 594, 379, 382, 621, - 508, 712, 388, 323, 339, 333, 513, 514, 515, 362, - 354, 585, 622, 595, 312, 261, 297, 706, 352, 143, - 714, 316, 623, 275, 389, 390, 624, 391, 105, 326, - 428, 727, 315, 625, 725, 108, 713, 331, 84, 507, - 56, 709, 49, 270, 436, 437, 350, 243, 346, 715, - 298, 626, 597, 291, 133, 130, 734, 38, 342, 55, - 32, 724, 132, 54, 716, 158, 627, 717, 628, 393, - 369, 700, 53, 394, 276, 629, 89, 281, 589, 320, - 708, 395, 528, 343, 396, 308, 723, 240, 630, 319, - 689, 681, 682, 397, 398, 701, 374, 370, 375, 530, - 631, 420, 512, 399, 685, 686, 741, 57, 632, 633, - 702, 131, 634, 83, 718, 85, 337, 338, 635, 306, - 259, 533, 534, 422, 366, 490, 122, 497, 498, 115, - 116, 493, 117, 499, 118, 123, 500, 501, 502, 491, - 119, 112, 492, 503, 504, 367, 368, 120, 505, 114, - 113, 494, 496, 121, 506, 257, 37, 400, 586, 310, - 63, 314, 285, 423, 51, 372, 738, 50, 696, 535, - 636, 699, 365, 361, 487, 58, 637, 638, 639, 640, - 509, 719, 364, 336, 360, 733, 4, 303, 482, 510, - 720, 67, 242, 377, 376, 378, 292, 419, 357, 641, - 642, 643, 264, 87, 644, 347, 24, 645, 646, 401, - 299, 647, 61, 648, 649, 426, 273, 650, 59, 721, - 44, 651, 278, 735, 722, 652, 653, 654, 695, 655, - 280, 656, 403, 657, 683, 684, 402, 371, 373, 536, - 287, 404, 387, 245, 588, 658, 321, 341, 277, 726, - 659, 265, 524, 525, 526, 527, 707, 532, 531, 279, - 284, 272, 427, 266, 660, 661, 662, 663, 664, 313, - 680, 665, 666, 327, 592, 728, 488, 48, 667, 668, - 669, 670, 671, 307, 302, 421, 430, 66, 88, 384, - 672, 673, 705, 335, 332, 42, 300, 468, 470, 471, - 472, 473, 474, 469, 476, 674, 324, 60, 729, 730, - 731, 294, 732, 516, 517, 518, 519, 12, 570, 553, - 581, 554, 571, 555, 564, 556, 572, 580, 582, 537, - 545, 538, 546, 576, 559, 573, 565, 558, 557, 579, - 562, 566, 539, 547, 577, 563, 540, 548, 541, 549, - 542, 550, 575, 574, 567, 578, 543, 551, 569, 544, - 552, 568, 560, 561, 439, 739, 740, 511, 406, 134, - 304, 305, 52, 358, 286, 675, 317, 676, 348, 349, - 484, 485, 363, 334, 359, 692, 325, 690, 288, 407, - 489, 274, 677, 429, 301, 380, 126, 385, 318, 593, - 529, 293, 408, 704, 591, 520, 521, 356, 353, 295, - 522, 678, 694, 409, 249, 289, 290, 679, 691, 410, - 411, 311, 412, 413, 414, 415, 416, 418, 322, 417, - 693, 687, 688, 296, 467, 590, 330, 351, 386, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 486, 247, -79, - 247, -190, -300, -130, 696, 698, 186, -272, 390, -290, - 392, 405, 400, 410, 398, -281, 401, 403, 287, -402, - 420, 247, 407, 234, 393, 402, 411, 412, 311, 418, - 413, 322, 417, 296, 414, 415, 416, -386, 186, 717, - 732, 143, 355, 397, 395, 421, 696, 95, -306, 95, - 96, 97, -293, 325, -309, 330, -294, -386, -293, 328, - -79, -79, -311, -311, -130, -210, -145, 151, -159, -261, - -162, 96, -150, -153, -204, -205, -206, -207, -160, -220, - -259, 175, 176, 183, 152, -216, -163, 28, 583, 479, - 478, 186, 33, 229, 73, 74, 481, 482, 154, 62, - 14, 444, 445, -161, 434, 435, 446, 440, 441, 507, - 509, 510, 511, 508, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 512, 523, 484, 485, 124, 486, - 112, 114, 113, 122, 123, 487, 488, 489, 352, 535, - 536, 530, 533, 534, 532, 531, 367, 368, 490, 553, - 554, 558, 557, 555, 556, 559, 562, 563, 564, 565, - 566, 567, 569, 568, 560, 561, 538, 537, 539, 540, - 541, 542, 543, 544, 546, 545, 547, 548, 549, 550, - 551, 552, 570, 571, 572, 573, 574, 576, 575, 580, - 579, 577, 578, 582, 581, 491, 492, 115, 116, 117, - 118, 119, 120, 121, 493, 496, 494, 495, 497, 498, - 499, 504, 505, 500, 501, 502, 503, 506, 378, 376, - 377, 373, 372, 371, -89, -102, 610, 609, -103, 431, - 436, 437, 439, -151, -152, -165, -166, -294, -300, 252, - 433, 246, 181, 477, -154, -148, -218, 111, 97, -31, - -214, 432, 442, 443, 447, 438, 448, 596, 598, 613, - 614, 616, 601, 606, 605, 608, 524, 525, 526, 527, - 528, 529, 681, 682, 683, 684, 685, 686, 687, 688, - -386, -293, 95, -157, -155, -199, 98, 103, 106, 107, - 109, -408, 270, 348, 349, 125, -418, 710, -156, 100, - 101, 102, 127, 128, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 94, 99, 49, 406, - 406, -190, -79, -79, -79, -79, -415, 713, 588, -230, - -128, -232, -33, -31, -418, 11, -79, -31, -32, -30, - -36, -38, 615, -37, -300, 104, -237, -253, 15, 66, - 170, 47, 55, -235, -236, -34, -31, -145, 22, 40, - 26, -132, 177, -145, -300, -132, -279, 251, -79, -79, - -268, -314, 325, -270, 421, 696, 420, -260, -273, 95, - -259, -272, 419, 96, -356, 167, -342, -346, -294, 262, - -372, 258, -190, -365, -364, -294, -418, -129, -289, 248, - 256, 255, 144, -389, 147, 304, 433, 246, -53, -54, - -55, -272, 185, 716, -111, 279, 283, 92, 92, -346, - -345, -344, -390, 283, 262, -371, -363, 254, 263, -352, - 255, 256, -347, 248, 145, -390, -347, 253, 263, 258, - 262, 283, 283, 134, 283, 134, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 278, -353, 159, -353, 591, - 591, -359, -390, 258, 248, -390, -390, 254, -291, -347, - 250, 27, 250, 37, 37, -353, -353, -353, -272, 185, - -353, -353, -353, -353, 291, 291, -353, -353, -353, -353, - -353, -353, -353, -353, -353, -353, -353, -353, -353, -353, - -353, -353, -353, 247, -389, -137, 417, 311, 86, -56, - 293, -39, -190, -289, 248, 249, -389, 280, -190, 230, - 247, 699, -283, 167, 18, -283, -280, 406, 404, 391, - 396, -283, -283, -283, -283, 294, 389, -348, 248, 37, - 259, 406, 294, 389, 294, 295, 294, 295, 399, 409, - 294, -305, 17, 170, 433, 394, 398, 287, 247, 288, - 249, 408, 295, -305, 94, -284, 167, 294, 406, 400, - 290, -283, -283, -312, -418, -296, -294, -292, 239, 40, - 150, 27, 29, 153, 186, 137, 22, 154, 39, 241, - 355, 258, 185, 254, 478, 234, 77, 596, 434, 441, - 432, 440, 444, 480, 481, 433, 392, 33, 16, 598, - 30, 268, 26, 43, 179, 236, 157, 599, 271, 28, - 269, 124, 128, 601, 25, 80, 263, 17, 256, 45, - 19, 602, 603, 20, 252, 251, 170, 248, 75, 14, - 229, 31, 166, 71, 604, 145, 140, 605, 606, 607, - 608, 138, 73, 167, 23, 736, 442, 443, 35, 697, - 583, 282, 181, 78, 64, 698, 151, 438, 609, 610, - 125, 611, 129, 81, 703, 147, 21, 76, 47, 612, - 283, 613, 253, 737, 614, 424, 615, 168, 237, 477, - 74, 169, 710, 616, 711, 246, 405, 11, 483, 34, - 267, 255, 136, 72, 448, 617, 247, 156, 250, 139, - 127, 10, 144, 36, 15, 79, 82, 445, 446, 447, - 62, 135, 587, 155, 18, 618, 425, 149, -386, 699, - -312, -312, 34, 96, -412, -413, -414, 587, 424, 250, - -294, -190, -85, 689, 238, -86, 695, 40, 245, -135, - 406, -123, 186, 717, 700, 701, 702, 699, 403, 707, - 705, 703, 294, 704, 92, 147, 149, 150, 4, -145, - 166, -200, -201, 165, 159, 160, 161, 162, 163, 164, - 171, 170, 151, 153, 167, -246, 148, 172, 173, 174, - 175, 176, 177, 178, 180, 179, 181, 182, 168, 169, - 185, 232, 233, -153, -153, -153, -153, -216, -222, -221, - -418, -218, -386, -293, -300, -418, -418, -153, -278, -418, - -150, -418, -418, -418, -418, -418, -225, -145, -418, -418, - -422, -418, -422, -422, -422, -331, -418, -331, -331, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - -418, -418, -418, -418, 230, -418, -418, -418, -418, -418, - -331, -331, -331, -331, -331, -331, -418, -418, -418, -418, - -418, -418, -418, -418, -418, -418, -418, -418, -418, -418, - 94, 107, 103, 106, 98, -220, 109, 94, 94, 94, - 94, -31, -32, -210, -418, -311, -399, -400, -193, -190, - -418, 311, -294, -294, 280, 100, -235, -34, -31, -230, - -236, -232, -31, -79, -121, -134, 68, 69, -133, -136, - 26, 43, 72, 70, 40, -419, 93, -419, -253, -419, - 92, -38, -256, 91, 643, 673, 643, 673, 66, 48, - 94, 94, 92, 24, -231, -233, -145, 17, -298, 4, - -297, 27, -294, 94, 230, 17, -191, 31, -190, -279, - -279, 92, 95, 325, -269, -271, 422, 424, 159, -299, - -294, 94, 33, 93, 92, -190, -320, -323, -325, -324, - -326, -321, -322, 352, 353, 186, 356, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 369, 34, 270, 348, - 349, 350, 351, 370, 371, 372, 373, 375, 376, 377, - 378, 333, 354, 585, 334, 335, 336, 337, 338, 339, - 341, 342, 345, 343, 344, 346, 347, -295, -294, 91, - 93, 92, -330, 91, -145, -137, 247, -294, 248, 248, - 248, -79, 477, -353, -353, -353, 278, 22, -46, -43, - -379, 21, -42, -43, 239, 130, 131, 236, 91, -342, - 91, -351, -295, -294, 91, 145, 253, 144, -350, -347, - -350, -351, -294, -218, -294, 145, 145, -294, -294, -265, - -294, -265, -265, 40, -265, 40, -265, 40, 100, -294, - -265, 40, -265, 40, -265, 40, -265, 40, -265, 40, - 33, 83, 84, 85, 33, 87, 88, 89, -218, -294, - -294, -218, -342, -218, -190, -294, -272, 100, 100, 100, - -353, -353, 100, 94, 94, 94, -353, -353, 100, 94, - -302, -300, 94, 94, -391, 264, 308, 310, 100, 100, - 100, 100, 33, 94, -392, 33, 724, 723, 725, 726, - 727, 94, 100, 33, 100, 33, 100, -294, 91, -190, - -143, 298, 234, 236, 239, 81, 94, 314, 315, 312, - 317, 318, 319, 159, 49, 92, 250, 247, -294, -285, - 252, -285, -294, -301, -300, -292, -190, 250, 388, 94, - -145, -349, 17, 170, -305, -305, -283, -190, -349, -305, - -283, -190, -283, -283, -283, -283, -305, -305, -305, -283, - -300, -300, -190, -190, -190, -190, -190, -190, -190, -312, - -284, -283, 699, 94, -277, 17, 81, -312, -312, 92, - 331, 425, 426, -310, 328, -81, -294, 94, -10, -29, - -18, -17, -19, 159, -10, 92, 587, -183, -190, 699, - 699, 699, 699, 699, 699, -145, -145, -145, -145, 611, - -208, -410, 151, 127, 128, 125, 126, -162, 41, 42, - 40, -145, -209, -214, -216, 110, 170, 153, 167, -246, - -150, -153, -150, -150, -150, -150, -150, -150, 229, -150, - 229, -150, -150, -150, -150, -150, -150, -313, -294, 94, - 186, -158, -157, 109, -408, -158, 584, 92, -221, 230, - -145, -145, -386, -119, 450, 451, 452, 453, 455, 456, - 457, 460, 461, 465, 466, 449, 467, 454, 459, 462, - 463, 464, 458, 351, -145, -211, -210, -211, -145, -145, - -223, -224, 155, -218, -145, -419, -419, 100, 177, -127, - 26, 43, -127, -127, -127, -127, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -127, -145, -120, 449, - 467, 454, 459, 462, 463, 464, 458, 351, 468, 469, - 470, 471, 472, 473, 474, 475, 476, -120, -119, -145, - -145, -145, -145, -145, -145, -145, -145, -87, -145, 137, - 138, 139, -210, -145, -150, -145, -145, -145, -419, -145, - -145, -145, -211, -145, -145, -145, -145, -145, -145, -145, + -8, -32, -31, -30, 13, 14, -109, -35, 35, -40, + -50, 240, -51, -41, 241, -52, 243, 242, 280, 244, + 396, 273, 83, 329, 330, 332, 333, 334, 335, -110, + 703, 278, 279, 246, 39, 51, 36, 37, 40, 250, + 286, 287, 249, 145, -33, -36, 12, -419, 15, 486, + 275, 274, 31, -34, 596, 95, -80, -418, 751, -253, + -237, 26, 36, 32, -236, -232, -128, -237, 24, 22, + 11, -79, -79, -79, 16, 17, -79, -356, -358, 95, + 173, 95, -79, -57, -56, -54, -53, -55, -58, 34, + -47, -48, -380, -46, -43, 245, 242, 290, 135, 136, + 280, 281, 282, 244, 264, 279, 283, 278, 299, -42, + 90, 36, 596, 599, -363, 241, 247, 248, 243, 487, + 138, 137, 84, -360, 391, 630, 721, -58, 723, 110, + 113, 722, 50, 254, 724, 725, 726, 637, 727, 263, + 728, 729, 730, 731, 737, 678, 738, 739, 740, 139, + 11, -79, -305, -301, 100, -294, 593, 266, 628, 440, + 629, 315, 90, 47, 42, 532, 603, 387, 391, 630, + 517, 721, 397, 329, 347, 341, 522, 523, 524, 370, + 362, 594, 631, 604, 318, 267, 303, 715, 360, 149, + 723, 322, 632, 281, 398, 399, 633, 400, 110, 332, + 437, 736, 321, 634, 734, 113, 722, 337, 88, 516, + 57, 718, 50, 276, 445, 446, 358, 249, 354, 724, + 304, 635, 606, 297, 138, 135, 743, 39, 350, 56, + 33, 733, 137, 55, 725, 164, 636, 726, 637, 402, + 377, 709, 54, 403, 282, 638, 93, 287, 598, 326, + 717, 404, 537, 351, 405, 314, 732, 246, 639, 325, + 698, 690, 691, 406, 407, 710, 382, 378, 383, 539, + 640, 429, 521, 408, 694, 695, 750, 58, 641, 642, + 711, 136, 643, 87, 727, 89, 345, 346, 644, 312, + 265, 542, 543, 431, 374, 499, 127, 506, 507, 120, + 121, 502, 122, 508, 123, 128, 509, 510, 511, 500, + 124, 117, 501, 512, 513, 375, 376, 125, 514, 119, + 118, 503, 505, 126, 515, 263, 38, 409, 595, 316, + 64, 320, 291, 432, 52, 380, 747, 51, 705, 544, + 645, 708, 373, 369, 496, 59, 646, 647, 648, 649, + 518, 728, 372, 344, 368, 742, 4, 309, 491, 519, + 729, 68, 248, 385, 384, 386, 298, 428, 365, 650, + 651, 652, 270, 91, 653, 355, 25, 654, 655, 410, + 305, 656, 62, 657, 658, 435, 279, 659, 60, 730, + 45, 660, 284, 744, 731, 661, 662, 663, 704, 664, + 286, 665, 412, 666, 692, 693, 411, 379, 381, 545, + 293, 413, 396, 251, 597, 667, 327, 349, 283, 735, + 668, 271, 533, 534, 535, 536, 716, 541, 540, 285, + 290, 278, 436, 272, 669, 670, 671, 672, 673, 319, + 689, 674, 675, 333, 601, 737, 497, 49, 676, 677, + 678, 679, 680, 313, 308, 430, 439, 67, 92, 393, + 681, 682, 714, 343, 338, 43, 306, 99, 477, 479, + 480, 481, 482, 483, 478, 485, 683, 330, 61, 738, + 739, 740, 300, 741, 525, 526, 527, 528, 13, 579, + 562, 590, 563, 580, 564, 573, 565, 581, 589, 591, + 546, 554, 547, 555, 585, 568, 582, 574, 567, 566, + 588, 571, 575, 548, 556, 586, 572, 549, 557, 550, + 558, 551, 559, 584, 583, 576, 587, 552, 560, 578, + 553, 561, 577, 569, 570, 448, 748, 749, 520, 415, + 139, 310, 311, 53, 366, 292, 684, 323, 685, 356, + 357, 493, 494, 371, 342, 367, 146, 701, 331, 340, + 699, 294, 416, 498, 280, 686, 438, 307, 388, 131, + 339, 394, 324, 602, 538, 299, 417, 713, 600, 529, + 530, 364, 361, 301, 531, 687, 389, 703, 418, 255, + 295, 296, 688, 700, 419, 420, 317, 421, 422, 423, + 424, 425, 427, 328, 426, 702, 696, 697, 302, 476, + 599, 336, 359, 395, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 495, 253, -79, 253, -190, -301, -130, 705, + 707, 192, -272, 399, -290, 401, 414, 409, 419, 407, + -281, 410, 412, 293, -403, 429, 253, 416, 240, 402, + 411, 420, 421, 317, 427, 422, 328, 426, 302, 423, + 424, 425, -387, 192, 726, 741, 331, 339, 149, 363, + 406, 404, 430, 705, 100, -307, 100, 101, 102, -294, + 331, -310, 336, -295, -387, -294, 334, -79, -79, -312, + -312, -130, -210, -145, 157, -159, -261, -162, 101, -150, + -153, -204, -205, -206, -207, -160, -220, -259, 181, 182, + 189, 158, -216, -163, 29, 592, 488, 487, 192, 34, + 235, 77, 78, 490, 491, 160, 63, 15, 453, 454, + -161, 443, 444, 455, 449, 450, 516, 518, 519, 520, + 517, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 521, 532, 493, 494, 129, 495, 117, 119, 118, + 127, 128, 496, 497, 498, 360, 544, 545, 539, 542, + 543, 541, 540, 375, 376, 499, 562, 563, 567, 566, + 564, 565, 568, 571, 572, 573, 574, 575, 576, 578, + 577, 569, 570, 547, 546, 548, 549, 550, 551, 552, + 553, 555, 554, 556, 557, 558, 559, 560, 561, 579, + 580, 581, 582, 583, 585, 584, 589, 588, 586, 587, + 591, 590, 500, 501, 120, 121, 122, 123, 124, 125, + 126, 502, 505, 503, 504, 506, 507, 508, 513, 514, + 509, 510, 511, 512, 515, 386, 384, 385, 381, 380, + 379, -89, -102, 619, 618, -103, 440, 445, 446, 448, + -151, -152, -165, -166, -295, -301, 258, 442, 252, 187, + 486, -154, -148, -218, 116, 102, -31, -214, 441, 451, + 452, 456, 447, 457, 605, 607, 622, 623, 625, 610, + 615, 614, 617, 533, 534, 535, 536, 537, 538, 690, + 691, 692, 693, 694, 695, 696, 697, -387, -294, 100, + -157, -155, -199, 103, 108, 111, 112, 114, -409, 276, + 356, 357, 130, -419, 719, -156, 105, 106, 107, 132, + 133, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 98, 104, 50, 415, 415, -190, -79, + -79, -79, -79, -416, 722, 597, -230, -128, -232, -33, + -31, -419, 12, -79, -31, -32, -30, -36, -38, 624, + -37, -301, 109, -237, -253, 16, 67, 176, 48, 56, + -235, -236, -34, -31, -145, 23, 41, 27, -132, 183, + -145, -301, -132, -279, 257, -79, -79, -268, -315, 331, + -270, 430, 705, 429, -260, -273, 100, -259, -272, 428, + 101, -357, 173, -343, -347, -295, 268, -373, 264, -190, + -366, -365, -295, -419, -129, -289, 254, 262, 261, 150, + -390, 153, 310, 442, 252, -53, -54, -55, -272, 191, + 725, -111, 285, 289, 96, 96, -347, -346, -345, -391, + 289, 268, -372, -364, 260, 269, -353, 261, 262, -348, + 254, 151, -391, -348, 259, 269, 264, 268, 289, 289, + 139, 289, 139, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 284, -354, 165, -354, 600, 600, -360, -391, + 264, 254, -391, -391, 260, -291, -348, 256, 28, 256, + 38, 38, -354, -354, -354, -272, 191, -354, -354, -354, + -354, 297, 297, -354, -354, -354, -354, -354, -354, -354, + -354, -354, -354, -354, -354, -354, -354, -354, -354, -354, + 253, -390, -137, 426, 317, 90, -56, 299, -39, -190, + -289, 254, 255, -390, 286, -190, 236, 253, 708, -283, + 173, 19, -283, -280, 415, 413, 400, 405, -283, -283, + -283, -283, 300, 398, -349, 254, 38, 265, 415, 300, + 398, 300, 301, 300, 301, 408, 418, 300, -306, 18, + 176, 442, 403, 407, 293, 253, 294, 255, 417, 301, + -306, 98, -284, 173, 300, 415, 409, 296, -283, -283, + -313, -419, -297, -295, -293, 245, 41, 156, 28, 30, + 159, 192, 142, 23, 160, 40, 247, 363, 264, 191, + 260, 487, 240, 81, 605, 443, 450, 441, 449, 453, + 489, 490, 442, 401, 34, 17, 607, 31, 274, 27, + 44, 185, 242, 163, 608, 277, 29, 275, 129, 133, + 610, 26, 84, 269, 18, 262, 46, 20, 611, 612, + 21, 74, 258, 257, 176, 254, 79, 15, 235, 32, + 172, 75, 613, 151, 145, 614, 615, 616, 617, 143, + 77, 173, 24, 745, 451, 452, 36, 706, 592, 288, + 187, 82, 65, 707, 157, 447, 618, 619, 130, 620, + 134, 85, 712, 153, 22, 80, 48, 621, 289, 622, + 259, 746, 623, 433, 624, 174, 243, 486, 78, 175, + 719, 625, 720, 252, 414, 12, 492, 35, 273, 261, + 73, 72, 141, 76, 457, 626, 253, 162, 256, 144, + 132, 11, 150, 37, 16, 83, 86, 454, 455, 456, + 63, 140, 596, 161, 19, 627, 434, 155, -387, 708, + -313, -313, 300, 340, 35, 101, -413, -414, -415, 596, + 433, 256, -295, -190, -85, 698, 244, -86, 704, 41, + 251, 146, 38, -135, 415, -123, 192, 726, 709, 710, + 711, 708, 412, 716, 714, 712, 300, 713, 96, 153, + 155, 156, 4, -145, 172, -200, -201, 171, 165, 166, + 167, 168, 169, 170, 177, 176, 157, 159, 173, -246, + 154, 178, 179, 180, 181, 182, 183, 184, 186, 185, + 187, 188, 174, 175, 191, 238, 239, -153, -153, -153, + -153, -216, -222, -221, -419, -218, -387, -294, -301, -419, + -419, -153, -278, -419, -150, -419, -419, -419, -419, -419, + -225, -145, -419, -419, -423, -419, -423, -423, -423, -332, + -419, -332, -332, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, -419, -419, -419, -419, 236, -419, + -419, -419, -419, -419, -332, -332, -332, -332, -332, -332, + -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, + -419, -419, -419, -419, 98, 112, 108, 111, 103, 114, + 98, 98, 98, 98, -31, -32, -210, -419, -312, -400, + -401, -193, -190, -419, 317, -295, -295, 286, 105, -235, + -34, -31, -230, -236, -232, -31, -79, -121, -134, 69, + 70, -133, -136, 27, 44, 74, 76, 99, 72, 73, + 71, 41, -420, 97, -420, -253, -420, 96, -38, -256, + 95, 652, 682, 652, 682, 67, 49, 98, 98, 96, + 25, -231, -233, -145, 18, -299, 4, -298, 28, -295, + 98, 236, 18, -191, 32, -190, -279, -279, 96, 100, + 331, -269, -271, 431, 433, 165, -300, -295, 98, 34, + 97, 96, -190, -321, -324, -326, -325, -327, -322, -323, + 360, 361, 192, 364, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 377, 389, 35, 276, 356, 357, 358, + 359, 378, 379, 380, 381, 383, 384, 385, 386, 341, + 362, 594, 342, 343, 344, 345, 346, 347, 349, 350, + 353, 351, 352, 354, 355, -296, -295, 95, 97, 96, + -331, 95, -145, -137, 253, -295, 254, 254, 254, -286, + 258, 486, -354, -354, -354, 284, 23, -46, -43, -380, + 22, -42, -43, 245, 135, 136, 242, 95, -343, 95, + -352, -296, -295, 95, 151, 259, 150, -351, -348, -351, + -352, -295, -218, -295, 151, 151, -295, -295, -265, -295, + -265, -265, 41, -265, 41, -265, 41, 105, -295, -265, + 41, -265, 41, -265, 41, -265, 41, -265, 41, 34, + 87, 88, 89, 34, 91, 92, 93, -218, -295, -295, + -218, -343, -218, -190, -295, -272, 105, 105, 105, -354, + -354, 105, 98, 98, 98, -354, -354, 105, 98, -303, + -301, 98, 98, -392, 270, 314, 316, 105, 105, 105, + 105, 34, 98, -393, 34, 733, 732, 734, 735, 736, + 98, 105, 34, 105, 34, 105, -295, 95, -190, -143, + 304, 240, 242, 245, 85, 98, 322, 320, 321, 318, + 323, 324, 325, 165, 50, 96, 256, 253, -295, -285, + 258, -285, -295, -302, -301, -293, -190, 256, 397, 98, + -145, -350, 18, 176, -306, -306, -283, -190, -350, -306, + -283, -190, -283, -283, -283, -283, -306, -306, -306, -283, + -301, -301, -190, -190, -190, -190, -190, -190, -190, -313, + -284, -283, 708, 98, -277, 18, 85, -313, -313, -292, + 26, 26, 96, 337, 434, 435, -311, 334, -81, -295, + 98, -10, -29, -18, -17, -19, 165, -10, 96, 596, + -183, -190, 708, 708, 708, 708, 708, 708, -145, -145, + -145, -145, 620, -208, -411, 157, 132, 133, 130, 131, + -162, 42, 43, 41, -145, -209, -214, -216, 115, 176, + 159, 173, -246, -150, -153, -150, -150, -150, -150, -150, + -150, 235, -150, 235, -150, -150, -150, -150, -150, -150, + -314, -295, 98, 192, -158, -157, 114, -409, -158, 593, + 96, -221, 236, -145, -145, -387, -119, 459, 460, 461, + 462, 464, 465, 466, 469, 470, 474, 475, 458, 476, + 463, 468, 471, 472, 473, 467, 359, -145, -211, -210, + -211, -145, -145, -223, -224, 161, -218, -145, -420, -420, + 105, 183, -127, 27, 44, -127, -127, -127, -127, -145, + -145, -145, -145, -145, -145, -145, -145, -145, -145, -127, + -145, -120, 458, 476, 463, 468, 471, 472, 473, 467, + 359, 477, 478, 479, 480, 481, 482, 483, 484, 485, + -120, -119, -145, -145, -145, -145, -145, -145, -145, -145, + -87, -145, 142, 143, 144, -210, -145, -150, -145, -145, + -145, -420, -145, -145, -145, -211, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -385, - -384, -383, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -210, -210, -210, -210, -210, - -145, -419, -145, -164, -148, 100, -261, 109, 96, -145, - -145, -145, -145, -145, -145, -211, -296, -301, -292, -293, - -210, -211, -211, -210, -210, -145, -145, -145, -145, -145, - -145, -145, -145, -419, -145, -145, -145, -145, -145, -253, - -419, -210, 92, -401, 424, 425, 697, -303, 283, -302, - 27, -211, 94, 17, -263, 82, -294, -235, -235, 68, - 69, 64, -131, -132, -136, -419, -37, 27, -255, -294, - 636, 636, 67, 94, -332, -272, 379, 380, 186, -145, - -145, 92, -234, 29, 30, -190, -297, 177, -301, -190, - -264, 283, -190, -168, -170, -171, -172, -193, -217, -418, - -173, -31, 607, 604, 17, -183, -184, -192, -300, -270, - -314, -269, 92, 423, 425, 426, 81, 129, -145, -333, - 185, -361, -360, -359, -342, -344, -345, -346, 93, -333, - -338, 385, 384, -330, -330, -330, -330, -330, -332, -332, - -332, -332, 91, 91, -330, -330, -330, -330, -335, 91, - -335, -335, -336, -335, 91, -336, -337, 91, -337, -372, - -145, -369, -368, -366, -367, 257, 105, 679, 635, 587, - 628, 669, 82, -364, -234, 100, -419, -143, -286, 252, - -370, -367, -294, -294, -294, -286, 95, 94, 95, 94, - 95, 94, -112, -60, -1, 736, 737, 738, 92, 22, - -343, -342, -59, 308, -375, -376, 283, -371, -365, -351, - 145, -350, -351, -351, -294, 92, 31, 134, 134, 134, - 134, 587, 236, 34, -287, 627, 151, 679, 635, -342, - -59, 250, 250, -313, -313, -313, 94, 94, -282, 732, - -183, -139, 300, 159, 289, 289, 247, 302, 247, 302, - -190, 313, 316, 314, 315, 312, 317, 318, 319, 40, - 40, 40, 40, 40, 40, 301, 303, 305, 291, -190, - -190, -285, 81, -185, -190, 28, -300, 94, 94, -190, - -283, -283, -190, -283, -283, -190, -414, 332, -294, 366, - 690, 692, -123, 424, 92, 587, 25, -124, 25, -418, - -410, 127, 128, -216, -216, -216, -209, -150, -153, -150, - 150, 271, -150, -150, -418, -218, -419, -296, 27, 92, - 82, -419, 175, 92, -419, -419, 92, 17, 92, -226, - -224, 157, -145, -419, 92, -419, -419, -210, -145, -145, - -145, -145, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -210, -419, 92, 92, 17, -317, 27, -419, - -419, -419, -419, 92, -419, -419, -225, -419, 17, -419, - 82, 92, 170, 92, -419, -419, -419, 92, 92, -419, - -419, 92, -419, 92, -419, -419, -419, -419, -419, -419, - 92, -419, 92, -419, -419, -419, 92, -419, 92, -419, - -419, 92, -419, 92, -419, 92, -419, 92, -419, 92, - -419, 92, -419, 92, -419, 92, -419, 92, -419, 92, - -419, 92, -419, 92, -419, 92, -419, 92, -419, 92, - -419, 92, -419, 92, -419, 92, -419, -419, -419, 92, - -419, 92, -419, 92, -419, -419, 92, -419, 92, -419, - 92, -419, 92, 92, -419, 92, 92, 92, -419, 92, - 92, 92, 92, -419, -419, -419, -419, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, -419, -419, -419, - -419, -419, -419, 92, -94, 612, -419, -419, 92, -419, - 92, 92, 92, 92, 92, -419, -418, 230, -419, -419, - -419, -419, -419, 92, 92, 92, 92, 92, 92, -419, - -419, -419, 92, 92, -419, 92, -419, 92, -419, -400, - 696, 425, -197, -196, -194, 79, 251, 80, -418, -302, - -419, -158, -261, -262, -261, -203, -294, 100, 109, -237, - -167, 92, -169, 17, -216, 93, 92, -332, -241, -247, - -280, -294, 94, 186, -334, 186, -334, 379, 380, -233, - 230, -198, 18, -202, 34, 62, -29, -418, -418, 34, - 92, -186, -188, -187, -189, 71, 75, 77, 72, 73, - 74, 78, -308, 27, -31, -168, -31, -418, -190, -183, - -420, 17, 82, -420, 92, 230, -271, -274, 427, 424, - 430, -386, 94, -111, 92, -359, -346, -238, -140, 45, - -339, 386, -332, 595, -332, -341, 94, -341, 100, 100, - 100, 93, -49, -44, -45, 35, 86, -366, -353, 94, - 44, -353, -353, -294, 93, -234, -139, -190, 151, 81, - -370, -370, -370, -300, -2, 735, 741, 145, 91, 391, - 21, -255, 92, 93, -219, 309, 93, -113, -294, 93, - 91, -351, -351, -294, -418, 247, 33, 33, 679, 635, - 627, -59, -219, -218, -294, -333, 734, 733, 93, 249, - 307, -144, 444, -141, 94, 95, -190, -190, -190, -190, - -190, -190, 239, 236, 414, -409, 320, -409, 292, 250, - -183, -190, 92, -84, 266, 261, -305, -305, 35, -190, - 424, 708, 706, -145, 150, 271, -162, -153, -119, -119, - -150, -315, 186, 352, 270, 350, 346, 366, 357, 384, - 348, 385, 343, 342, 341, -315, -313, -150, -210, -145, - -145, -145, 158, -145, 156, -145, -95, -94, -419, -419, - -419, -419, -419, -95, -95, -95, -95, -95, -95, -95, - -95, -95, -95, -230, -145, -145, -145, -419, 186, 352, - -95, -145, 17, -145, -313, -145, -145, -145, -145, -145, + -145, -145, -386, -385, -384, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, + -145, -145, -145, -145, -145, -145, -145, -145, -210, -210, + -210, -210, -210, -145, -420, -145, -164, -148, 105, -261, + 114, 101, -145, -145, -145, -145, -145, -145, -211, -297, + -302, -293, -294, -210, -211, -211, -210, -210, -145, -145, + -145, -145, -145, -145, -145, -145, -420, -145, -145, -145, + -145, -145, -253, -420, -210, 96, -402, 433, 434, 706, + -304, 289, -303, 28, -211, 98, 18, -263, 86, -295, + -235, -235, 69, 70, 65, -131, -132, -136, -420, -37, + 28, -255, -295, 645, 645, 68, 98, -333, -272, 387, + 388, 192, -145, -145, 96, -234, 30, 31, -190, -298, + 183, -302, -190, -264, 289, -190, -168, -170, -171, -172, + -193, -217, -419, -173, -31, 616, 613, 18, -183, -184, + -192, -301, -270, -315, -269, 96, 432, 434, 435, 85, + 134, -145, -334, 191, -362, -361, -360, -343, -345, -346, + -347, 97, -334, -339, 394, 393, -331, -331, -331, -331, + -331, -333, -333, -333, -333, 95, -331, 95, -331, -331, + -331, -331, -336, 95, -336, -336, -337, -336, 95, -337, + -338, 95, -338, -373, -145, -370, -369, -367, -368, 263, + 110, 688, 644, 596, 637, 678, 86, -365, -234, 105, + -420, -143, -286, -371, -368, -295, -295, -295, -301, 157, + 100, 98, 100, 98, 100, 98, -112, -60, -1, 745, + 746, 747, 96, 23, -344, -343, -59, 314, -376, -377, + 289, -372, -366, -352, 151, -351, -352, -352, -295, 96, + 32, 139, 139, 139, 139, 596, 242, 35, -287, 636, + 157, 688, 644, -343, -59, 256, 256, -314, -314, -314, + 98, 98, -282, 741, -183, -139, 306, 165, 295, 295, + 253, 308, 253, 308, -190, 319, 322, 320, 321, 318, + 323, 324, 325, 41, 41, 41, 41, 41, 41, 41, + 307, 309, 311, 297, -190, -190, -285, 85, -185, -190, + 29, -301, 98, 98, -190, -283, -283, -190, -283, -283, + -190, 98, -301, -415, 338, -295, 374, 699, 701, -123, + 433, 96, 596, 26, -124, 26, -419, -411, 132, 133, + -216, -216, -216, -209, -150, -153, -150, 156, 277, -150, + -150, -419, -218, -420, -297, 28, 96, 86, -420, 181, + 96, -420, -420, 96, 18, 96, -226, -224, 163, -145, + -420, 96, -420, -420, -210, -145, -145, -145, -145, -420, + -420, -420, -420, -420, -420, -420, -420, -420, -420, -210, + -420, 96, 96, 18, -318, 28, -420, -420, -420, -420, + 96, -420, -420, -225, -420, 18, -420, 86, 96, 176, + 96, -420, -420, -420, 96, 96, -420, -420, 96, -420, + 96, -420, -420, -420, -420, -420, -420, 96, -420, 96, + -420, -420, -420, 96, -420, 96, -420, -420, 96, -420, + 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, + 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, + 96, -420, 96, -420, 96, -420, 96, -420, 96, -420, + 96, -420, 96, -420, -420, -420, 96, -420, 96, -420, + 96, -420, -420, 96, -420, 96, -420, 96, -420, 96, + 96, -420, 96, 96, 96, -420, 96, 96, 96, 96, + -420, -420, -420, -420, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, -420, -420, -420, -420, -420, -420, + 96, -94, 621, -420, -420, 96, -420, 96, 96, 96, + 96, 96, -420, -419, 236, -420, -420, -420, -420, -420, + 96, 96, 96, 96, 96, 96, -420, -420, -420, 96, + 96, -420, 96, -420, 96, -420, -401, 705, 434, -197, + -196, -194, 83, 257, 84, -419, -303, -420, -158, -261, + -262, -261, -203, -295, 105, 114, -237, -167, 96, -169, + 18, -216, 97, 96, -333, -241, -247, -280, -295, 98, + 192, -335, 192, -335, 387, 388, -233, 236, -198, 19, + -202, 35, 63, -29, -419, -419, 35, 96, -186, -188, + -187, -189, 75, 79, 81, 76, 77, 78, 82, -309, + 28, -31, -168, -31, -419, -190, -183, -421, 18, 86, + -421, 96, 236, -271, -274, 436, 433, 439, -387, 98, + -111, 96, -360, -347, -238, -140, 46, -340, 395, -333, + 604, -333, -342, 98, -342, 105, 105, 105, 97, -49, + -44, -45, 36, 90, -367, -354, 98, 45, -354, -354, + -295, 97, -234, -139, -190, 85, -371, -371, -371, 29, + -2, 744, 750, 151, 95, 400, 22, -255, 96, 97, + -219, 315, 97, -113, -295, 97, 95, -352, -352, -295, + -419, 253, 34, 34, 688, 644, 636, -59, -219, -218, + -295, -334, 743, 742, 97, 255, 313, -144, 453, -141, + 98, 100, -190, -190, -190, -190, -190, -190, 245, 242, + 423, -410, 326, -410, 298, 256, -183, -190, 96, -84, + 272, 267, -306, -306, 36, -190, 433, 717, 715, -145, + 156, 277, -162, -153, -119, -119, -150, -316, 192, 360, + 276, 358, 354, 374, 365, 393, 356, 394, 351, 350, + 349, -316, -314, -150, -210, -145, -145, -145, 164, -145, + 162, -145, -95, -94, -420, -420, -420, -420, -420, -95, + -95, -95, -95, -95, -95, -95, -95, -95, -95, -230, + -145, -145, -145, -420, 192, 360, -95, -145, 18, -145, + -314, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -383, -145, -210, -145, -210, -145, -145, -145, -145, -145, - -384, -384, -384, -384, -384, -210, -210, -210, -210, -145, - -418, -294, -98, -97, -96, 662, 251, -94, -164, -98, - -164, 229, -145, 229, 229, 229, -145, -211, -296, -145, - -145, -145, -145, -145, -145, -145, -145, -145, -145, -194, - -347, 289, -347, 289, -347, -265, 92, -276, 25, 17, - 62, 62, -167, -198, -132, -168, -294, -244, 689, -250, - 51, -248, -249, 52, -245, 53, 61, -334, -334, 177, - -235, -145, -266, 81, -267, -275, -218, -213, -215, -214, - -418, -254, -419, -294, -265, -267, -170, -171, -171, -170, - -171, 71, 71, 71, 76, 71, 76, 71, -187, -300, - -419, -145, -303, 82, -168, -168, -192, -300, 177, 424, - 428, 429, -359, -407, 125, 151, 33, 81, 382, 105, - -405, 185, 624, 674, 679, 635, 628, 669, -406, 253, - 144, 145, 265, 27, 46, 93, 92, 93, 92, 93, - 93, 92, -288, -287, -45, -44, -353, -353, 100, -386, - 94, 94, 249, 28, -190, 81, 81, 81, -114, 739, - 100, 91, -3, 86, -145, 91, 22, -342, -218, -377, - -327, -378, -328, -329, -5, -6, -354, -117, 62, 105, - -63, 49, 248, 719, 720, 134, -418, 732, -369, -255, - -373, -375, -190, -149, -418, -161, -147, -146, -148, -154, - 175, 176, 270, 348, 349, -219, -190, -138, 298, 306, - 91, -142, 96, -388, 82, 289, 382, 289, 382, 94, - -411, 321, 94, -411, -190, -84, -49, -190, -283, -283, - 35, -386, -419, -162, -153, -126, 170, 587, -318, 594, - -330, -330, -330, -337, -330, 338, -330, 338, -330, -419, - -419, -419, 92, -419, 25, -419, 92, -145, 92, -95, - -95, -95, -95, -95, -122, 483, 92, 92, -419, 91, - 91, -419, -145, -419, -419, -419, 92, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - 92, -419, 92, -419, 92, -419, 92, -419, 92, -419, - 92, -419, 92, -419, 92, -419, 92, -419, 92, -419, - 92, -419, 92, -419, 92, -419, 92, -419, 92, -419, - 92, -419, -419, 92, -419, -419, -419, 92, -419, 92, - -419, 92, -419, -419, -419, 92, -316, 680, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -93, - -295, -94, 644, 644, -419, -94, -227, 92, -150, -419, - -150, -150, -150, -419, -419, -419, 92, -419, 92, 92, - -419, 92, -419, 92, -419, -419, -419, -419, 92, -195, - 25, -418, -195, -418, -195, -419, -261, -190, -198, -228, - 19, -241, 56, 358, -252, -251, 60, 52, -249, 22, - 54, 22, 32, -266, 92, 159, -307, 92, 27, -419, - -419, 92, 62, 230, -419, -198, -181, -180, 81, 82, - -182, 81, -180, 71, 71, -256, 92, -264, -168, -198, - -198, 230, 125, -418, -149, 15, 94, 94, -386, -404, - 723, 724, 33, 100, -353, -353, 145, 145, -190, 91, - -332, 94, -332, 100, 100, 33, 87, 88, 89, 33, - 83, 84, 85, -190, -190, -190, -190, -374, 91, 22, - -145, 91, 159, 93, -255, -255, 285, 170, -353, 717, - 291, 291, -353, -353, -353, -116, -115, 739, 93, -419, - 92, -340, 587, 590, -145, -155, -155, -256, 93, -382, - 587, -387, -294, -294, -294, -294, 100, 102, -419, 585, - 78, 588, -419, -332, -145, -145, -145, -145, -235, 94, - -145, -145, 100, 100, -95, -419, -145, -145, -145, -145, + -145, -145, -145, -145, -145, -145, -384, -145, -210, -145, + -210, -145, -145, -145, -145, -145, -385, -385, -385, -385, + -385, -210, -210, -210, -210, -145, -419, -295, -98, -97, + -96, 671, 257, -94, -164, -98, -164, 235, -145, 235, + 235, 235, -145, -211, -297, -145, -145, -145, -145, -145, + -145, -145, -145, -145, -145, -194, -348, 295, -348, 295, + -348, -265, 96, -276, 26, 18, 63, 63, -167, -198, + -132, -168, -295, -244, 698, -250, 52, -248, -249, 53, + -245, 54, 62, -335, -335, 183, -235, -145, -266, 85, + -267, -275, -218, -213, -215, -214, -419, -254, -420, -295, + -265, -267, -170, -171, -171, -170, -171, 75, 75, 75, + 80, 75, 80, 75, -187, -301, -420, -145, -304, 86, + -168, -168, -192, -301, 183, 433, 437, 438, -360, -408, + 130, 157, 34, 85, 391, 110, -406, 191, 633, 683, + 688, 644, 637, 678, -407, 259, 150, 151, 271, 28, + 47, 97, 96, 97, 96, 97, 97, 96, -288, -287, + -45, -44, -354, -354, 105, -387, 98, 98, 255, -190, + 85, 85, 85, -114, 748, 105, 95, -3, 90, -145, + 95, 23, -343, -218, -378, -328, -379, -329, -330, -5, + -6, -355, -117, 63, 110, -63, 50, 254, 728, 729, + 139, -419, 741, -370, -255, -374, -376, -190, -149, -419, + -161, -147, -146, -148, -154, 181, 182, 276, 356, 357, + -219, -190, -138, 304, 312, 95, -142, 101, -389, 86, + 295, 391, 295, 391, 98, -412, 327, 98, -412, -190, + -84, -49, -190, -283, -283, 36, -387, -420, -162, -153, + -126, 176, 596, -319, 603, -331, -331, -331, -338, -331, + 346, -331, 346, -331, -420, -420, -420, 96, -420, 26, + -420, 96, -145, 96, -95, -95, -95, -95, -95, -122, + 492, 96, 96, -420, 95, 95, -420, -145, -420, -420, + -420, 96, -420, -420, -420, -420, -420, -420, -420, -420, + -420, -420, -420, -420, -420, 96, -420, 96, -420, 96, + -420, 96, -420, 96, -420, 96, -420, 96, -420, 96, + -420, 96, -420, 96, -420, 96, -420, 96, -420, 96, + -420, 96, -420, 96, -420, 96, -420, -420, 96, -420, + -420, -420, 96, -420, 96, -420, 96, -420, -420, -420, + 96, -317, 689, -420, -420, -420, -420, -420, -420, -420, + -420, -420, -420, -420, -93, -296, -94, 653, 653, -420, + -94, -227, 96, -150, -420, -150, -150, -150, -420, -420, + -420, 96, -420, 96, 96, -420, 96, -420, 96, -420, + -420, -420, -420, 96, -195, 26, -419, -195, -419, -195, + -420, -261, -190, -198, -228, 20, -241, 57, 366, -252, + -251, 61, 53, -249, 23, 55, 23, 33, -266, 96, + 165, -308, 96, 28, -420, -420, 96, 63, 236, -420, + -198, -181, -180, 85, 86, -182, 85, -180, 75, 75, + -256, 96, -264, -168, -198, -198, 236, 130, -419, -149, + 16, 98, 98, -387, -405, 732, 733, 34, 105, -354, + -354, 151, 151, -190, 95, -333, 98, -333, 105, 105, + 34, 91, 92, 93, 34, 87, 88, 89, -190, -190, + -190, -190, -375, 95, 23, -145, 95, 165, 97, -255, + -255, 291, 176, -354, 726, 297, 297, -354, -354, -354, + -116, -115, 748, 97, -420, 96, -341, 596, 599, -145, + -155, -155, -256, 97, -383, 596, -388, -295, -295, -295, + -295, 105, 107, -420, 594, 82, 597, -420, -333, -145, + -145, -145, -145, -235, 98, -145, -145, 105, 105, -95, + -420, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, -145, - -145, -145, -145, -145, -145, -145, -210, -145, -419, -178, - -177, -179, 700, 125, 33, -315, -419, -212, 283, -101, - -100, -99, 17, -419, -145, -119, -119, -119, -119, -145, - -145, -145, -145, -145, -145, -418, 71, 21, 19, -258, - -294, 253, -418, -258, -418, -303, -228, -229, 20, 22, - -242, 58, -240, 57, -240, -251, 22, 22, 94, 22, - 94, 145, -275, -145, -215, -302, 62, -29, -294, -213, - -294, -230, -145, 91, -145, -158, -198, -198, -145, -205, - 507, 509, 510, 511, 508, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 512, 523, 484, 485, 486, - 112, 114, 113, 122, 123, 487, 488, 489, 352, 535, - 536, 530, 533, 534, 532, 531, 367, 368, 490, 553, - 554, 558, 557, 555, 556, 559, 562, 563, 564, 565, - 566, 567, 569, 568, 560, 561, 538, 537, 539, 540, - 541, 542, 543, 544, 546, 545, 547, 548, 549, 550, - 551, 552, 570, 571, 572, 573, 574, 576, 575, 580, - 579, 577, 578, 582, 581, 491, 492, 115, 116, 117, - 118, 119, 120, 121, 493, 496, 494, 497, 498, 499, - 504, 505, 500, 501, 502, 503, 506, 378, 376, 377, - 373, 372, 371, 431, 436, 437, 439, 524, 525, 526, - 527, 528, 529, 681, 682, 683, 684, 685, 686, 687, - 688, 94, 94, 91, -145, 93, 93, -256, -373, -60, - 93, -257, -255, 100, 93, 286, -214, -418, 94, -353, - -353, -353, 100, 100, -302, -419, 92, -294, -406, -375, - 591, 591, -419, 27, -381, -380, -296, 91, 82, 67, - 586, 589, -419, -419, -419, 92, -419, -419, -419, 93, - 93, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, -419, -419, -419, -419, -419, -419, -419, - -419, -419, -419, 92, -419, -177, -179, -419, 81, -158, - -230, 22, -98, 308, 310, -98, -419, -419, -419, -419, - -419, 92, -419, -419, 92, -419, 92, -419, -419, -258, - -419, 22, 22, 92, -419, -258, -419, -258, -197, -229, - -108, -107, -106, 618, -145, -210, -243, 59, 81, 129, - 94, 94, 94, 15, -418, -213, 230, -307, -235, -255, - -175, 391, -230, -419, -255, 93, 27, 93, 741, 145, - 93, -214, -125, -418, 282, -302, 94, 94, -115, -118, - -29, 92, 159, -255, -190, 67, -145, -210, -419, 81, - 599, 700, -92, -91, -88, 711, 737, -210, -94, -94, - -145, -145, -145, -419, -294, 253, -419, -419, -108, 92, - -105, -104, -294, -319, 587, 81, 129, -267, -255, -307, - -294, 93, -419, -418, -235, 93, -239, -29, 91, -3, - 282, -327, -378, -328, -329, -5, -6, -354, -82, 587, - -380, -358, -300, -296, 94, 100, 93, 587, -419, -419, - -90, 153, 709, 677, -155, 229, -419, 92, -419, 92, - -419, 92, -106, 92, 27, 592, -419, -303, -176, -174, - -294, 641, -397, -396, 583, -407, -403, 125, 151, 105, - -405, 679, 635, 135, 136, -82, -145, 91, -419, -83, - 297, 696, 230, -388, 588, -90, 710, 655, 630, 655, - 630, -150, -145, -145, -145, -104, -418, -419, 92, 25, - -320, -62, 652, -394, -395, 81, -398, 397, 651, 672, - 125, 94, 93, -255, 258, -301, -382, 589, 150, -119, - -419, 92, -419, 92, -419, -93, -174, 648, -333, -158, - -395, 81, -394, 81, 16, 15, -4, 740, 93, 299, - -90, 655, 630, -145, -145, -419, -61, 28, -175, -393, - 266, 261, 264, 34, -393, 100, -4, -419, -419, 652, - 260, 33, 125, -158, -178, -177, -177, + -145, -210, -145, -420, -178, -177, -179, 709, 130, 34, + -316, -420, -212, 289, -101, -100, -99, 18, -420, -145, + -119, -119, -119, -119, -145, -145, -145, -145, -145, -145, + -419, 75, 22, 20, -258, -295, 259, -419, -258, -419, + -304, -228, -229, 21, 23, -242, 59, -240, 58, -240, + -251, 23, 23, 98, 23, 98, 151, -275, -145, -215, + -303, 63, -29, -295, -213, -295, -230, -145, 95, -145, + -158, -198, -198, -145, -205, 516, 518, 519, 520, 517, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 521, 532, 493, 494, 495, 117, 119, 118, 127, 128, + 496, 497, 498, 360, 544, 545, 539, 542, 543, 541, + 540, 375, 376, 499, 562, 563, 567, 566, 564, 565, + 568, 571, 572, 573, 574, 575, 576, 578, 577, 569, + 570, 547, 546, 548, 549, 550, 551, 552, 553, 555, + 554, 556, 557, 558, 559, 560, 561, 579, 580, 581, + 582, 583, 585, 584, 589, 588, 586, 587, 591, 590, + 500, 501, 120, 121, 122, 123, 124, 125, 126, 502, + 505, 503, 506, 507, 508, 513, 514, 509, 510, 511, + 512, 515, 386, 384, 385, 381, 380, 379, 440, 445, + 446, 448, 533, 534, 535, 536, 537, 538, 690, 691, + 692, 693, 694, 695, 696, 697, 98, 98, 95, -145, + 97, 97, -256, -374, -60, 97, -257, -255, 105, 97, + 292, -214, -419, 98, -354, -354, -354, 105, 105, -303, + -420, 96, -295, -407, -376, 600, 600, -420, 28, -382, + -381, -297, 95, 86, 68, 595, 598, -420, -420, -420, + 96, -420, -420, -420, 97, 97, -420, -420, -420, -420, + -420, -420, -420, -420, -420, -420, -420, -420, -420, -420, + -420, -420, -420, -420, -420, -420, -420, -420, 96, -420, + -177, -179, -420, 85, -158, -230, 23, -98, 314, 316, + -98, -420, -420, -420, -420, -420, 96, -420, -420, 96, + -420, 96, -420, -420, -258, -420, 23, 23, 96, -420, + -258, -420, -258, -197, -229, -108, -107, -106, 627, -145, + -210, -243, 60, 85, 134, 98, 98, 98, 16, -419, + -213, 236, -308, -235, -255, -175, 400, -230, -420, -255, + 97, 28, 97, 750, 151, 97, -214, -125, -419, 288, + -303, 98, 98, -115, -118, -29, 96, 165, -255, -190, + 68, -145, -210, -420, 85, 608, 709, -92, -91, -88, + 720, 746, -210, -94, -94, -145, -145, -145, -420, -295, + 259, -420, -420, -108, 96, -105, -104, -295, -320, 596, + 85, 134, -267, -255, -308, -295, 97, -420, -419, -235, + 97, -239, -29, 95, -3, 288, -328, -379, -329, -330, + -5, -6, -355, -82, 596, -381, -359, -301, -297, 98, + 105, 97, 596, -420, -420, -90, 159, 718, 686, -155, + 235, -420, 96, -420, 96, -420, 96, -106, 96, 28, + 601, -420, -304, -176, -174, -295, 650, -398, -397, 592, + -408, -404, 130, 157, 110, -406, 688, 644, 140, 141, + -82, -145, 95, -420, -83, 303, 705, 236, -389, 597, + -90, 719, 664, 639, 664, 639, -150, -145, -145, -145, + -104, -419, -420, 96, 26, -321, -62, 661, -395, -396, + 85, -399, 406, 660, 681, 130, 98, 97, -255, 264, + -302, -383, 598, 156, -119, -420, 96, -420, 96, -420, + -93, -174, 657, -334, -158, -396, 85, -395, 85, 17, + 16, -4, 749, 97, 305, -90, 664, 639, -145, -145, + -420, -61, 29, -175, -394, 272, 267, 270, 35, -394, + 105, -4, -420, -420, 661, 266, 34, 130, -158, -178, + -177, -177, } var yyDef = [...]int{ - 880, -2, -2, 882, 2, 4, 5, 6, 7, 8, + 888, -2, -2, 890, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 70, 72, 73, 880, 880, 880, 0, 880, 0, - 0, 880, -2, -2, 880, 1631, 0, 880, 0, 875, - 0, -2, 797, 803, 0, 812, -2, 0, 0, 880, - 880, 2263, 2263, 875, 0, 0, 0, 0, 0, 880, - 880, 880, 880, 1636, 1489, 50, 880, 0, 85, 86, - 830, 831, 832, 65, 0, 2261, 881, 1, 3, 71, - 75, 0, 0, 0, 58, 1498, 0, 78, 0, 0, - 884, 0, 0, 1614, 880, 880, 0, 126, 127, 0, + 39, 70, 72, 73, 888, 888, 888, 0, 888, 0, + 0, 888, -2, -2, 888, 1643, 0, 888, 0, 883, + 0, -2, 803, 809, 0, 818, -2, 0, 0, 888, + 888, 2283, 2283, 883, 0, 0, 0, 0, 0, 888, + 888, 888, 888, 1648, 1501, 50, 888, 0, 85, 86, + 838, 839, 840, 65, 0, 2281, 889, 1, 3, 71, + 75, 0, 0, 0, 58, 1510, 0, 78, 0, 0, + 892, 0, 0, 1626, 888, 888, 0, 126, 127, 0, 0, 0, -2, 130, -2, 159, 160, 161, 0, 166, - 607, 526, 578, 524, 563, -2, 512, 0, 0, 0, + 608, 526, 578, 524, 563, -2, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 529, - 401, 401, 0, 0, -2, 512, 512, 512, 1616, 0, + 401, 401, 0, 0, -2, 512, 512, 512, 1628, 0, 0, 0, 560, 463, 401, 401, 401, 0, 401, 401, 401, 401, 0, 0, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, - 401, 1516, 165, 1632, 1629, 1630, 1789, 1790, 1791, 1792, - 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, - 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, - 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, - 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, - 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, - 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, - 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, - 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, - 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, - 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, - 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, - 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, - 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, - 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, - 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, - 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, - 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, - 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, - 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, - 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, - 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, - 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, - 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, - 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, - 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, - 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, - 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, - 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, - 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, - 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, - 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, - 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, - 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, - 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, - 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, - 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, - 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, - 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, - 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, - 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, - 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, - 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, - 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, - 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, - 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, - 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 0, 1608, - 0, 720, 980, 0, 876, 877, 0, 786, 786, 0, - 786, 786, 786, 786, 0, 0, 0, 734, 0, 0, - 0, 0, 783, 0, 750, 751, 0, 783, 0, 757, - 789, 0, 0, 764, 786, 786, 767, 2264, 0, 2264, - 2264, 1599, 0, 780, 778, 792, 793, 42, 796, 799, - 800, 801, 802, 805, 0, 816, 819, 1625, 1626, 0, - 821, 826, 843, 844, 0, 45, 1140, 0, 1004, 0, - 1015, -2, 1026, 1043, 1044, 1045, 1046, 1047, 1049, 1050, - 1051, 0, 0, 0, 0, 1056, 1057, 0, 0, 0, - 0, 0, 1120, 0, 0, 0, 0, 1991, 1460, 0, - 0, 1422, 1422, 1156, 1422, 1422, 1424, 1424, 1424, 1842, - 1983, 1992, 2170, 1803, 1809, 1810, 1811, 2116, 2117, 2118, - 2119, 2208, 2209, 2213, 1905, 1798, 2183, 2184, 0, 2260, - 1944, 1952, 1953, 1929, 1938, 1977, 2079, 2193, 1821, 1972, - 2042, 1902, 1924, 1925, 2060, 2061, 1948, 1949, 1928, 2122, - 2124, 2140, 2141, 2126, 2128, 2137, 2143, 2148, 2127, 2139, - 2144, 2157, 2161, 2164, 2165, 2166, 2134, 2132, 2145, 2149, - 2151, 2153, 2159, 2162, 2135, 2133, 2146, 2150, 2152, 2154, - 2160, 2163, 2121, 2125, 2129, 2138, 2156, 2136, 2155, 2130, - 2142, 2147, 2158, 2131, 2123, 1942, 1945, 1932, 1933, 1935, - 1937, 1943, 1950, 1956, 1934, 1955, 1954, 0, 1930, 1931, - 1936, 1947, 1951, 1939, 1940, 1941, 1946, 1957, 1998, 1997, - 1996, 2041, 1968, 2040, 0, 0, 0, 0, 0, 1792, - 1847, 1848, 2167, 1344, 1345, 1346, 1347, 0, 0, 0, - 0, 0, 0, 0, 291, 292, 1473, 1474, 44, 1139, - 1595, 1424, 1424, 1424, 1424, 1424, 1424, 1078, 1079, 1080, - 1081, 1082, 1108, 1109, 1115, 1116, 2055, 2056, 2057, 2058, - 1885, 2203, 1894, 1895, 2037, 2038, 1907, 1908, 2234, 2235, - -2, -2, -2, 232, 233, 234, 235, 236, 237, 238, - 239, 0, 1846, 2181, 2182, 228, 0, 0, 296, 293, - 294, 295, 1122, 1123, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 298, 299, 2263, 0, - 853, 0, 0, 0, 0, 0, 0, 1637, 1638, 1498, - 0, 1490, 1489, 63, 0, 880, -2, 0, 0, 0, - 0, 47, 0, 52, 937, 883, 77, 76, 1538, 1541, - 0, 0, 0, 59, 1499, 67, 69, 1500, 0, 885, - 886, 0, 913, 917, 0, 0, 0, 1615, 1614, 1614, - 102, 0, 0, 103, 123, 124, 125, 0, 0, 109, - 110, 1601, 1602, 43, 0, 0, 177, 178, 0, 1096, - 428, 0, 173, 0, 421, 360, 0, 1516, 0, 0, - 0, 0, 0, 880, 0, 1609, 154, 155, 162, 163, - 164, 401, 401, 401, 575, 0, 0, 165, 165, 533, - 534, 535, 0, 0, -2, 426, 0, 513, 0, 0, - 415, 415, 419, 417, 418, 0, 0, 0, 0, 0, - 0, 0, 0, 552, 0, 553, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 668, 0, 402, 0, 573, - 574, 464, 0, 0, 0, 0, 0, 0, 0, 0, - 1617, 1618, 0, 550, 551, 0, 0, 0, 401, 401, - 0, 0, 0, 0, 401, 401, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 153, 1529, 0, 0, 0, -2, - 0, 712, 0, 0, 0, 1610, 1610, 0, 719, 0, - 0, 0, 724, 0, 0, 725, 0, 783, 783, 781, - 782, 727, 728, 729, 730, 786, 0, 0, 410, 411, - 412, 783, 786, 0, 786, 786, 786, 786, 783, 783, - 783, 786, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2264, 789, 786, 0, 758, 0, 759, 760, 761, - 762, 765, 766, 768, 2265, 2266, 1627, 1628, 1639, 1640, - 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, - 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, - 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, - 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, - 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, - 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, - 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, - 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, - 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, - 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, - 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, - 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, - 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, - 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, - 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 2264, 2264, - 772, 776, 1600, 798, 804, 806, 807, 0, 0, 817, - 820, 837, 49, 1893, 825, 49, 827, 828, 829, 855, - 856, 861, 0, 0, 0, 0, 867, 868, 869, 0, - 0, 872, 873, 874, 0, 0, 0, 0, 0, 1002, - 0, 0, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1027, 1028, - 0, 0, 0, 1052, 1053, 1054, 1055, 1058, 0, 1069, - 0, 1071, 1469, -2, 0, 0, 0, 1063, 1064, 0, - 0, 0, 1620, 1620, 0, 0, 0, 1461, 0, 0, - 1154, 0, 1155, 1157, 1158, 1159, 0, 1160, 1161, 890, - 890, 890, 890, 890, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 890, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1620, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1620, 0, 0, 1620, 1620, 0, 0, - 220, 221, 222, 223, 224, 225, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 240, 241, 242, 243, 244, 245, 300, 246, 247, - 248, 1139, 0, 0, 0, 46, 845, 846, 0, 963, - 1620, 0, 0, 896, 0, 1635, 57, 66, 68, 1498, - 61, 1498, 0, 900, 0, 0, -2, -2, 901, 902, - 906, 907, 908, 909, 910, 54, 2262, 55, 0, 74, - 0, 48, 0, 0, 1539, 0, 1542, 0, 0, 0, - 374, 1546, 0, 0, 1491, 1492, 1495, 0, 914, 1989, - 918, 0, 920, 921, 0, 0, 100, 0, 979, 0, - 0, 0, 111, 0, 113, 114, 0, 0, 0, 385, - 1603, 1604, 1605, -2, 408, 0, 385, 369, 308, 309, - 310, 360, 312, 360, 360, 360, 360, 374, 374, 374, - 374, 343, 344, 345, 346, 347, 0, 0, 329, 360, - 360, 360, 360, 350, 351, 352, 353, 354, 355, 356, - 357, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 362, 362, 362, 362, 362, 366, 366, 0, 1097, 0, - 389, 0, 1495, 0, 0, 1529, 1612, 1622, 0, 0, - 0, 1612, 132, 0, 0, 0, 576, 618, 527, 564, - 577, 0, 530, 531, -2, 0, 0, 512, 0, 514, - 0, 409, 0, -2, 0, 419, 0, 415, 419, 416, - 419, 407, 420, 554, 555, 556, 0, 558, 559, 648, - 949, 0, 0, 0, 0, 0, 654, 655, 656, 0, - 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, - 565, 566, 567, 568, 569, 570, 571, 572, 0, 0, - 0, 0, 514, 0, 561, 0, 0, 465, 466, 467, - 0, 0, 470, 471, 472, 473, 0, 0, 476, 477, - 478, 966, 967, 479, 480, 505, 506, 507, 481, 482, - 483, 484, 485, 486, 487, 499, 500, 501, 502, 503, - 504, 488, 489, 490, 491, 492, 493, 496, 0, 147, - 1520, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1610, 0, 0, - 0, 0, 899, 981, 1633, 1634, 721, 0, 0, 787, - 788, 0, 413, 414, 786, 786, 731, 773, 0, 786, - 735, 774, 736, 738, 737, 739, 752, 753, 786, 742, - 784, 785, 743, 744, 745, 746, 747, 748, 749, 769, - 754, 755, 756, 790, 0, 794, 795, 770, 771, 0, - 0, 810, 811, 0, 818, 840, 838, 839, 841, 833, - 834, 835, 836, 0, 842, 0, 0, 858, 96, 863, - 864, 865, 866, 878, 871, 1141, 999, 1000, 1001, 0, - 1003, 1009, 0, 1124, 1126, 1007, 1008, 1011, 0, 0, - 0, 1005, 1016, 1136, 1137, 1138, 0, 0, 0, 0, - 0, 1020, 1024, 1029, 1030, 1031, 1032, 1033, 0, 1034, - 0, 1037, 1038, 1039, 1040, 1041, 1042, 1048, 1437, 1438, - 1439, 1067, 301, 302, 0, 1068, 0, 0, 0, 0, - 0, 0, 0, 0, 1384, 1385, 1386, 1387, 1388, 1389, - 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, - 1400, 1401, 1402, 1403, 1140, 0, 1621, 0, 0, 0, - 1467, 1464, 0, 0, 0, 1423, 1425, 0, 0, 0, - 891, 892, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1404, - 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, - 1415, 1416, 1417, 1418, 1419, 1420, 1421, 0, 0, 1440, - 0, 0, 0, 0, 0, 0, 0, 1460, 0, 1073, - 1074, 1075, 0, 0, 0, 0, 0, 0, 1202, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 142, 143, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1348, 1349, 1350, 1351, 41, 0, - 0, 0, 0, 0, 0, 0, 1471, 0, -2, -2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1373, 0, 0, 0, 0, 0, 0, - 1593, 0, 0, 848, 849, 851, 0, 983, 0, 964, - 0, 0, 854, 0, 895, 0, 898, 60, 62, 904, - 905, 0, 922, 911, 903, 56, 51, 0, 0, 941, - 1540, 1543, 1544, 374, 1566, 0, 383, 383, 380, 1501, - 1502, 0, 1494, 1496, 1497, 79, 919, 915, 0, 997, - 0, 0, 978, 0, 925, 927, 928, 929, 961, 0, - 932, 933, 0, 0, 0, 0, 0, 98, 980, 104, - 0, 112, 0, 0, 117, 118, 105, 106, 107, 108, - 0, 607, -2, 460, 179, 181, 182, 183, 174, -2, - 372, 370, 371, 311, 374, 374, 337, 338, 339, 340, - 341, 342, 0, 0, 330, 331, 332, 333, 322, 0, - 323, 324, 325, 364, 0, 326, 327, 0, 328, 427, - 0, 1503, 390, 391, 393, 401, 0, 396, 397, 0, - 401, 401, 0, 422, 423, 0, 1495, 1520, 0, 0, - 0, 1623, 1622, 1622, 1622, 0, 167, 168, 169, 170, - 171, 172, 643, 0, 0, 619, 641, 642, 165, 0, - 0, 175, 516, 515, 0, 675, 0, 425, 0, 0, - 419, 419, 404, 405, 557, 0, 0, 650, 651, 652, - 653, 0, 0, 0, 543, 454, 0, 544, 545, 514, - 516, 0, 0, 385, 468, 469, 474, 475, 494, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 592, 593, 594, 597, 599, 518, 603, 605, 596, - 598, 600, 518, 604, 606, 1517, 1518, 1519, 0, 0, - 713, 0, 0, 451, 94, 1611, 718, 722, 723, 783, - 741, 775, 783, 733, 740, 763, 808, 809, 814, 822, - 823, 824, 862, 0, 0, 0, 0, 870, 0, 0, - 1010, 1125, 1127, 1012, 1013, 1014, 1017, 0, 1021, 1025, - 0, 0, 0, 0, 0, 1072, 1070, 1471, 0, 0, - 0, 1121, 0, 0, 1144, 1145, 0, 0, 0, 0, - 1465, 0, 0, 1152, 0, 1426, 1102, 0, 0, 0, - 0, 0, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, - 1102, 1102, 1489, 1179, 0, 0, 0, 0, 0, 1184, - 1185, 1186, 1102, 0, 1189, 1190, 0, 1192, 0, 1193, - 0, 0, 0, 0, 1200, 1201, 1203, 0, 0, 1206, - 1207, 0, 1209, 0, 1211, 1212, 1213, 1214, 1215, 1216, - 0, 1218, 0, 1220, 1221, 1222, 0, 1224, 0, 1226, - 1227, 0, 1229, 0, 1231, 0, 1234, 0, 1237, 0, - 1240, 0, 1243, 0, 1246, 0, 1249, 0, 1252, 0, - 1255, 0, 1258, 0, 1261, 0, 1264, 0, 1267, 0, - 1270, 0, 1273, 0, 1276, 0, 1279, 1280, 1281, 0, - 1283, 0, 1285, 0, 1288, 1289, 0, 1291, 0, 1294, - 0, 1297, 0, 0, 1298, 0, 0, 0, 1302, 0, - 0, 0, 0, 1311, 1312, 1313, 1314, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1325, 1326, 1327, - 1328, 1329, 1330, 0, 1332, 0, 1103, 0, 0, 1103, - 0, 0, 0, 0, 0, 1142, 1620, 0, 1427, 1428, - 1429, 1430, 1431, 0, 0, 0, 0, 0, 0, 1371, - 1372, 1374, 0, 0, 1377, 0, 1379, 0, 1594, 847, - 850, 852, 935, 984, 985, 0, 0, 0, 0, 965, - 1619, 893, 894, 897, 943, 0, 1475, 0, 0, 922, - 997, 0, 923, 0, 53, 938, 0, 1548, 1547, 1560, - 1573, 383, 383, 377, 378, 384, 379, 381, 382, 1493, - 0, 1498, 0, 1587, 0, 0, 1576, 0, 0, 0, - 0, 0, 0, 0, 0, 968, 0, 0, 971, 0, - 0, 0, 0, 962, 933, 0, 934, 0, -2, 0, - 0, 92, 93, 0, 0, 0, 115, 116, 0, 0, - 122, 386, 387, 156, 165, 462, 180, 435, 0, 0, - 307, 373, 334, 335, 336, 0, 358, 0, 0, 0, - 0, 456, 128, 1507, 1506, 401, 401, 392, 0, 395, - 0, 0, 0, 1624, 361, 424, 0, 146, 0, 0, - 0, 0, 0, 152, 613, 0, 0, 620, 0, 0, - 0, 525, 0, 536, 537, 0, 647, -2, 709, 389, - 0, 403, 406, 950, 0, 0, 538, 0, 541, 542, - 455, 516, 547, 548, 562, 549, 497, 498, 495, 0, - 0, 1530, 1531, 1536, 1534, 1535, 133, 583, 585, 589, - 584, 588, 0, 0, 0, 520, 0, 520, 581, 0, - 451, 1503, 0, 717, 452, 453, 786, 786, 857, 97, - 0, 860, 0, 0, 0, 0, 1018, 1022, 1035, 1036, - 1432, 1458, 360, 360, 1445, 360, 366, 1448, 360, 1450, - 360, 1453, 360, 1456, 1457, 0, 0, 1065, 0, 0, - 0, 0, 1151, 1468, 0, 0, 1162, 1101, 1102, 1102, - 1102, 1102, 1102, 1168, 1169, 1170, 1171, 1172, 1173, 1174, - 1175, 1176, 1177, 1462, 0, 0, 0, 1183, 0, 0, - 1187, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 144, 145, 0, 0, 0, 0, 0, 0, 1382, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1096, 1100, 0, 1104, 1105, 0, 0, 1334, 0, 0, - 1352, 0, 0, 0, 0, 0, 0, 0, 1472, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 986, - 993, 0, 993, 0, 993, 0, 0, 0, 1606, 1607, - 1476, 1477, 997, 1478, 912, 924, 942, 1566, 0, 1559, - 0, -2, 1568, 0, 0, 0, 1574, 375, 376, 916, - 80, 998, 83, 0, 1587, 1596, 0, 1584, 1589, 1591, - 0, 0, 0, 1580, 0, 997, 926, 957, 959, 0, - 954, 969, 970, 972, 0, 974, 0, 976, 977, 937, - 931, 0, 100, 0, 997, 997, 99, 0, 982, 119, - 120, 121, 461, 184, 189, 0, 0, 0, 194, 0, - 196, 0, 0, 0, 201, 202, 401, 401, 436, 0, - 304, 306, 0, 0, 187, 374, 0, 374, 0, 365, - 367, 0, 437, 457, 1504, 1505, 0, 0, 394, 398, - 399, 400, 0, 1613, 148, 0, 0, 0, 616, 0, - 644, 0, 0, 0, 0, 0, 0, 176, 517, 676, - 677, 678, 679, 680, 681, 682, 683, 684, 0, 401, - 0, 0, 0, 401, 401, 401, 0, 701, 388, 0, - 0, 672, 669, 539, 0, 218, 219, 226, 227, 229, - 0, 0, 0, 0, 0, 546, 937, 1521, 1522, 1523, - 0, 1533, 1537, 136, 0, 0, 0, 0, 591, 595, - 601, 0, 519, 602, 714, 715, 716, 95, 726, 732, - 859, 879, 1006, 1019, 1023, 0, 0, 0, 0, 1459, - 1443, 374, 1446, 1447, 1449, 1451, 1452, 1454, 1455, 1061, - 1062, 1066, 0, 1148, 0, 1150, 0, 1466, 0, 1163, - 1164, 1165, 1166, 1167, 1498, 0, 0, 0, 1182, 0, - 0, 1102, 0, 1195, 1194, 1196, 0, 1198, 1199, 1204, - 1205, 1208, 1210, 1217, 1219, 1223, 1225, 1228, 1230, 1232, - 0, 1235, 0, 1238, 0, 1241, 0, 1244, 0, 1247, - 0, 1250, 0, 1253, 0, 1256, 0, 1259, 0, 1262, - 0, 1265, 0, 1268, 0, 1271, 0, 1274, 0, 1277, - 0, 1282, 1284, 0, 1287, 1290, 1292, 0, 1295, 0, - 1299, 0, 1301, 1303, 1304, 0, 0, 0, 1315, 1316, - 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1331, 0, - 1094, 1333, 1106, 1107, 1112, 1336, 0, 0, 0, 1339, - 0, 0, 0, 1343, 1143, 1354, 0, 1359, 0, 0, - 1365, 0, 1369, 0, 1375, 1376, 1378, 1380, 0, 0, - 0, 0, 0, 0, 0, 963, 944, 64, 1478, 1482, - 0, 1553, 1551, 1551, 1561, 1562, 0, 0, 1569, 0, - 0, 0, 0, 84, 0, 0, 1575, 0, 0, 1592, - 0, 0, 0, 0, 101, 1489, 951, 958, 0, 0, - 952, 0, 953, 973, 975, 930, 0, 997, 997, 90, - 91, 0, 190, 0, 192, 0, 195, 197, 198, 199, - 205, 206, 207, 200, 0, 0, 303, 305, 0, 0, - 348, 359, 349, 0, 0, 1508, 1509, 1510, 1511, 1512, - 1513, 1514, 1515, 937, 149, 150, 151, 608, 0, 618, - 0, 939, 0, 611, 0, 528, 0, 0, 0, 401, - 401, 401, 0, 0, 0, 0, 686, 0, 0, 649, - 0, 657, 0, 0, 0, 230, 231, 0, 1532, 582, - 0, 134, 135, 0, 0, 587, 521, 522, 1059, 0, - 0, 0, 1060, 1444, 0, 0, 0, 0, 0, 1463, - 0, 0, 0, 0, 1188, 1191, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1307, 0, - 0, 0, 638, 639, 0, 1383, 1099, 1489, 0, 1103, - 1113, 1114, 0, 1103, 1353, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 994, 0, 0, 0, - 945, 946, 0, 0, 0, 983, 1482, 1487, 0, 0, - 1556, 0, 1549, 1552, 1550, 1563, 0, 0, 1570, 0, - 1572, 0, 1597, 1598, 1590, 1585, 0, 1579, 1582, 1584, - 1581, 1498, 955, 0, 960, 0, 1489, 89, 0, 193, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 203, 204, 0, 0, 363, 368, 0, 0, 0, - 609, 0, 940, 621, 612, 0, 699, 0, 703, 0, - 0, 0, 706, 707, 708, 685, 0, 689, 429, 673, - 670, 671, 540, 0, 137, 138, 0, 0, 0, 1433, - 0, 1436, 1146, 1149, 1147, 0, 1178, 1180, 1181, 1441, - 1442, 1197, 1233, 1236, 1239, 1242, 1245, 1248, 1251, 1254, - 1257, 1260, 1263, 1266, 1269, 1272, 1275, 1278, 1286, 1293, - 1296, 1300, 1305, 0, 1308, 0, 0, 1309, 0, 640, - 1090, 0, 0, 1110, 1111, 0, 1338, 1340, 1341, 1342, - 1355, 0, 1360, 1361, 0, 1366, 0, 1370, 1381, 0, - 988, 995, 996, 0, 991, 0, 992, 0, 936, 1487, - 82, 1488, 1485, 0, 1483, 1480, 1545, 0, 1554, 1555, - 1564, 1565, 1571, 0, 0, 1584, 0, 1578, 87, 0, - 0, 0, 1498, 191, 0, 210, 0, 617, 0, 620, - 610, 697, 698, 0, 710, 702, 704, 705, 687, -2, - 1524, 0, 0, 0, 590, 1434, 0, 0, 1310, 0, - 636, 637, 1098, 1091, 0, 1076, 1077, 1095, 1335, 1337, - 0, 0, 0, 987, 947, 948, 989, 990, 81, 0, - 1484, 1118, 0, 1479, 0, 1557, 1558, 1588, 0, 1577, - 1583, 956, 963, 0, 88, 442, 435, 1524, 0, 0, - 0, 690, 691, 692, 693, 694, 695, 696, 579, 1526, - 139, 140, 0, 509, 510, 511, 133, 0, 1153, 1306, - 1092, 0, 0, 0, 0, 0, 1356, 0, 1362, 0, - 1367, 0, 1486, 0, 0, 1481, 1586, 622, 0, 624, - 0, -2, 430, 443, 0, 185, 211, 212, 0, 0, - 215, 216, 217, 208, 209, 129, 0, 0, 711, 0, - 1527, 1528, 0, 136, 0, 0, 1083, 1084, 1085, 1086, - 1088, 0, 0, 0, 0, 1119, 1096, 623, 0, 0, - 385, 0, 633, 431, 432, 0, 438, 439, 440, 441, - 213, 214, 645, 0, 0, 508, 586, 1435, 0, 0, - 1357, 0, 1363, 0, 1368, 0, 625, 626, 634, 0, - 433, 0, 434, 0, 0, 0, 614, 0, 645, 1525, - 1093, 1087, 1089, 0, 0, 1117, 0, 635, 631, 444, - 446, 447, 0, 0, 445, 646, 615, 1358, 1364, 0, - 448, 449, 450, 627, 628, 629, 630, + 401, 1528, 165, 1644, 1641, 1642, 1804, 1805, 1806, 1807, + 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, + 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, + 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, + 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, + 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, + 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, + 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, + 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, + 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, + 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, + 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, + 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, + 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, + 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, + 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, + 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, + 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, + 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, + 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, + 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, + 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, + 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, + 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, + 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, + 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, + 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, + 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, + 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, + 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, + 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, + 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, + 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, + 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, + 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, + 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, + 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, + 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, + 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, + 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, + 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, + 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, + 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, + 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, + 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, + 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, + 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, + 2278, 2279, 2280, 0, 1620, 0, 721, 992, 0, 884, + 885, 0, 792, 792, 0, 792, 792, 792, 792, 0, + 0, 0, 735, 0, 0, 0, 0, 789, 0, 751, + 752, 0, 789, 0, 758, 795, 0, 0, 765, 792, + 792, 768, 2284, 0, 2284, 2284, 0, 0, 1611, 0, + 786, 784, 798, 799, 42, 802, 805, 806, 807, 808, + 811, 0, 822, 825, 1637, 1638, 0, 827, 832, 851, + 852, 0, 45, 1152, 0, 1016, 0, 1027, -2, 1038, + 1055, 1056, 1057, 1058, 1059, 1061, 1062, 1063, 0, 0, + 0, 0, 1068, 1069, 0, 0, 0, 0, 0, 1132, + 0, 0, 0, 0, 2006, 1472, 0, 0, 1434, 1434, + 1168, 1434, 1434, 1436, 1436, 1436, 1857, 1998, 2007, 2186, + 1818, 1824, 1825, 1826, 2132, 2133, 2134, 2135, 2227, 2228, + 2232, 1920, 1813, 2199, 2200, 0, 2280, 1959, 1967, 1968, + 1944, 1953, 1992, 2094, 2211, 1836, 1987, 2057, 1917, 1939, + 1940, 2075, 2076, 1963, 1964, 1943, 2138, 2140, 2156, 2157, + 2142, 2144, 2153, 2159, 2164, 2143, 2155, 2160, 2173, 2177, + 2180, 2181, 2182, 2150, 2148, 2161, 2165, 2167, 2169, 2175, + 2178, 2151, 2149, 2162, 2166, 2168, 2170, 2176, 2179, 2137, + 2141, 2145, 2154, 2172, 2152, 2171, 2146, 2158, 2163, 2174, + 2147, 2139, 1957, 1960, 1947, 1948, 1950, 1952, 1958, 1965, + 1971, 1949, 1970, 1969, 0, 1945, 1946, 1951, 1962, 1966, + 1954, 1955, 1956, 1961, 1972, 2013, 2012, 2011, 2056, 1983, + 2055, 0, 0, 0, 0, 0, 1807, 1862, 1863, 2183, + 1356, 1357, 1358, 1359, 0, 0, 0, 0, 0, 0, + 0, 290, 291, 1485, 1486, 44, 1151, 1607, 1436, 1436, + 1436, 1436, 1436, 1436, 1090, 1091, 1092, 1093, 1094, 1120, + 1121, 1127, 1128, 2070, 2071, 2072, 2073, 1900, 2222, 1909, + 1910, 2052, 2053, 1922, 1923, 2254, 2255, -2, -2, -2, + 232, 233, 234, 235, 236, 237, 238, 239, 0, 1861, + 2197, 2198, 228, 0, 0, 295, 292, 293, 294, 1134, + 1135, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 297, 298, 2283, 0, 861, 0, 0, + 0, 0, 0, 0, 1649, 1650, 1510, 0, 1502, 1501, + 63, 0, 888, -2, 0, 0, 0, 0, 47, 0, + 52, 949, 891, 77, 76, 1550, 1553, 0, 0, 0, + 59, 1511, 67, 69, 1512, 0, 893, 894, 0, 925, + 929, 0, 0, 0, 1627, 1626, 1626, 102, 0, 0, + 103, 123, 124, 125, 0, 0, 109, 110, 1613, 1614, + 43, 0, 0, 177, 178, 0, 1108, 428, 0, 173, + 0, 421, 360, 0, 1528, 0, 0, 0, 0, 0, + 1624, 0, 1621, 154, 155, 162, 163, 164, 401, 401, + 401, 575, 0, 0, 165, 165, 533, 534, 535, 0, + 0, -2, 426, 0, 513, 0, 0, 415, 415, 419, + 417, 418, 0, 0, 0, 0, 0, 0, 0, 0, + 552, 0, 553, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 669, 0, 402, 0, 573, 574, 464, 0, + 0, 0, 0, 0, 0, 0, 0, 1629, 1630, 0, + 550, 551, 0, 0, 0, 401, 401, 0, 0, 0, + 0, 401, 401, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 153, 1541, 0, 0, 0, -2, 0, 713, 0, + 0, 0, 1622, 1622, 0, 720, 0, 0, 0, 725, + 0, 0, 726, 0, 789, 789, 787, 788, 728, 729, + 730, 731, 792, 0, 0, 410, 411, 412, 789, 792, + 0, 792, 792, 792, 792, 789, 789, 789, 792, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2284, 795, + 792, 0, 759, 0, 760, 761, 762, 763, 766, 767, + 769, 2285, 2286, 1639, 1640, 1651, 1652, 1653, 1654, 1655, + 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, + 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, + 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, + 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, + 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, + 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, + 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, + 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, + 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, + 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, + 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, + 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, + 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, + 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, + 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 2284, 2284, + 773, 777, 781, 779, 1612, 804, 810, 812, 813, 0, + 0, 823, 826, 845, 49, 1908, 831, 49, 833, 834, + 835, 836, 837, 863, 864, 869, 0, 0, 0, 0, + 875, 876, 877, 0, 0, 880, 881, 882, 0, 0, + 0, 0, 0, 1014, 0, 0, 1140, 1141, 1142, 1143, + 1144, 1145, 1146, 1147, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1039, 1040, 0, 0, 0, 1064, 1065, 1066, + 1067, 1070, 0, 1081, 0, 1083, 1481, -2, 0, 0, + 0, 1075, 1076, 0, 0, 0, 1632, 1632, 0, 0, + 0, 1473, 0, 0, 1166, 0, 1167, 1169, 1170, 1171, + 0, 1172, 1173, 898, 898, 898, 898, 898, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 898, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1632, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, + 1632, 1632, 0, 0, 220, 221, 222, 223, 224, 225, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 240, 241, 242, 243, 244, + 299, 245, 246, 247, 1151, 0, 0, 0, 46, 853, + 854, 0, 975, 1632, 0, 0, 904, 0, 1647, 57, + 66, 68, 1510, 61, 1510, 0, 908, 0, 0, -2, + -2, 909, 910, 914, 915, 916, 917, 918, 919, 920, + 921, 922, 54, 2282, 55, 0, 74, 0, 48, 0, + 0, 1551, 0, 1554, 0, 0, 0, 374, 1558, 0, + 0, 1503, 1504, 1507, 0, 926, 2004, 930, 0, 932, + 933, 0, 0, 100, 0, 991, 0, 0, 0, 111, + 0, 113, 114, 0, 0, 0, 385, 1615, 1616, 1617, + -2, 408, 0, 385, 369, 307, 308, 309, 360, 311, + 360, 360, 360, 360, 374, 374, 374, 374, 342, 343, + 344, 345, 346, 0, 360, 0, 328, 360, 360, 360, + 360, 350, 351, 352, 353, 354, 355, 356, 357, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 362, 362, + 362, 362, 362, 366, 366, 0, 1109, 0, 389, 0, + 1507, 0, 0, 1541, 1624, 1634, 0, 0, 0, 0, + 0, 132, 0, 0, 0, 576, 619, 527, 564, 577, + 0, 530, 531, -2, 0, 0, 512, 0, 514, 0, + 409, 0, -2, 0, 419, 0, 415, 419, 416, 419, + 407, 420, 554, 555, 556, 0, 558, 559, 649, 961, + 0, 0, 0, 0, 0, 655, 656, 657, 0, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 565, + 566, 567, 568, 569, 570, 571, 572, 0, 0, 0, + 0, 514, 0, 561, 0, 0, 465, 466, 467, 0, + 0, 470, 471, 472, 473, 0, 0, 476, 477, 478, + 978, 979, 479, 480, 505, 506, 507, 481, 482, 483, + 484, 485, 486, 487, 499, 500, 501, 502, 503, 504, + 488, 489, 490, 491, 492, 493, 496, 0, 147, 1532, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1622, 0, 0, + 0, 0, 907, 993, 1645, 1646, 722, 0, 0, 793, + 794, 0, 413, 414, 792, 792, 732, 774, 0, 792, + 736, 775, 737, 739, 738, 740, 753, 754, 792, 743, + 790, 791, 744, 745, 746, 747, 748, 749, 750, 770, + 755, 756, 757, 796, 0, 800, 801, 771, 772, 0, + 782, 0, 0, 0, 816, 817, 0, 824, 848, 846, + 847, 849, 841, 842, 843, 844, 0, 850, 0, 0, + 866, 96, 871, 872, 873, 874, 886, 879, 1153, 1011, + 1012, 1013, 0, 1015, 1021, 0, 1136, 1138, 1019, 1020, + 1023, 0, 0, 0, 1017, 1028, 1148, 1149, 1150, 0, + 0, 0, 0, 0, 1032, 1036, 1041, 1042, 1043, 1044, + 1045, 0, 1046, 0, 1049, 1050, 1051, 1052, 1053, 1054, + 1060, 1449, 1450, 1451, 1079, 300, 301, 0, 1080, 0, + 0, 0, 0, 0, 0, 0, 0, 1396, 1397, 1398, + 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, + 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1152, 0, 1633, + 0, 0, 0, 1479, 1476, 0, 0, 0, 1435, 1437, + 0, 0, 0, 899, 900, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, + 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, + 0, 0, 1452, 0, 0, 0, 0, 0, 0, 0, + 1472, 0, 1085, 1086, 1087, 0, 0, 0, 0, 0, + 0, 1214, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 142, 143, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1360, 1361, 1362, + 1363, 41, 0, 0, 0, 0, 0, 0, 0, 1483, + 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1385, 0, 0, 0, + 0, 0, 0, 1605, 0, 0, 856, 857, 859, 0, + 995, 0, 976, 0, 0, 862, 0, 903, 0, 906, + 60, 62, 912, 913, 0, 934, 923, 911, 56, 51, + 0, 0, 953, 1552, 1555, 1556, 374, 1578, 0, 383, + 383, 380, 1513, 1514, 0, 1506, 1508, 1509, 79, 931, + 927, 0, 1009, 0, 0, 990, 0, 937, 939, 940, + 941, 973, 0, 944, 945, 0, 0, 0, 0, 0, + 98, 992, 104, 0, 112, 0, 0, 117, 118, 105, + 106, 107, 108, 0, 608, -2, 460, 179, 181, 182, + 183, 174, -2, 372, 370, 371, 310, 374, 374, 336, + 337, 338, 339, 340, 341, 0, 348, 0, 329, 330, + 331, 332, 321, 0, 322, 323, 324, 364, 0, 325, + 326, 0, 327, 427, 0, 1515, 390, 391, 393, 401, + 0, 396, 397, 0, 401, 401, 0, 422, 423, 0, + 1507, 1532, 0, 0, 1635, 1634, 1634, 1634, 152, 0, + 167, 168, 169, 170, 171, 172, 644, 0, 0, 620, + 642, 643, 165, 0, 0, 175, 516, 515, 0, 676, + 0, 425, 0, 0, 419, 419, 404, 405, 557, 0, + 0, 651, 652, 653, 654, 0, 0, 0, 543, 454, + 0, 544, 545, 514, 516, 0, 0, 385, 468, 469, + 474, 475, 494, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 592, 593, 595, 598, 600, + 518, 604, 606, 594, 597, 599, 601, 518, 605, 607, + 1529, 1530, 1531, 0, 0, 714, 0, 0, 451, 94, + 1623, 719, 723, 724, 789, 742, 776, 789, 734, 741, + 764, 778, 780, 814, 815, 820, 828, 829, 830, 870, + 0, 0, 0, 0, 878, 0, 0, 1022, 1137, 1139, + 1024, 1025, 1026, 1029, 0, 1033, 1037, 0, 0, 0, + 0, 0, 1084, 1082, 1483, 0, 0, 0, 1133, 0, + 0, 1156, 1157, 0, 0, 0, 0, 1477, 0, 0, + 1164, 0, 1438, 1114, 0, 0, 0, 0, 0, 1114, + 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1501, + 1191, 0, 0, 0, 0, 0, 1196, 1197, 1198, 1114, + 0, 1201, 1202, 0, 1204, 0, 1205, 0, 0, 0, + 0, 1212, 1213, 1215, 0, 0, 1218, 1219, 0, 1221, + 0, 1223, 1224, 1225, 1226, 1227, 1228, 0, 1230, 0, + 1232, 1233, 1234, 0, 1236, 0, 1238, 1239, 0, 1241, + 0, 1243, 0, 1246, 0, 1249, 0, 1252, 0, 1255, + 0, 1258, 0, 1261, 0, 1264, 0, 1267, 0, 1270, + 0, 1273, 0, 1276, 0, 1279, 0, 1282, 0, 1285, + 0, 1288, 0, 1291, 1292, 1293, 0, 1295, 0, 1297, + 0, 1300, 1301, 0, 1303, 0, 1306, 0, 1309, 0, + 0, 1310, 0, 0, 0, 1314, 0, 0, 0, 0, + 1323, 1324, 1325, 1326, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1337, 1338, 1339, 1340, 1341, 1342, + 0, 1344, 0, 1115, 0, 0, 1115, 0, 0, 0, + 0, 0, 1154, 1632, 0, 1439, 1440, 1441, 1442, 1443, + 0, 0, 0, 0, 0, 0, 1383, 1384, 1386, 0, + 0, 1389, 0, 1391, 0, 1606, 855, 858, 860, 947, + 996, 997, 0, 0, 0, 0, 977, 1631, 901, 902, + 905, 955, 0, 1487, 0, 0, 934, 1009, 0, 935, + 0, 53, 950, 0, 1560, 1559, 1572, 1585, 383, 383, + 377, 378, 384, 379, 381, 382, 1505, 0, 1510, 0, + 1599, 0, 0, 1588, 0, 0, 0, 0, 0, 0, + 0, 0, 980, 0, 0, 983, 0, 0, 0, 0, + 974, 945, 0, 946, 0, -2, 0, 0, 92, 93, + 0, 0, 0, 115, 116, 0, 0, 122, 386, 387, + 156, 165, 462, 180, 435, 0, 0, 306, 373, 333, + 334, 335, 0, 358, 0, 0, 0, 0, 456, 128, + 1519, 1518, 401, 401, 392, 0, 395, 0, 0, 0, + 1636, 361, 424, 0, 146, 0, 0, 0, 0, 1625, + 614, 0, 0, 621, 0, 0, 0, 525, 0, 536, + 537, 0, 648, -2, 710, 389, 0, 403, 406, 962, + 0, 0, 538, 0, 541, 542, 455, 516, 547, 548, + 562, 549, 497, 498, 495, 0, 0, 1542, 1543, 1548, + 1546, 1547, 133, 583, 585, 589, 584, 588, 0, 0, + 0, 520, 0, 520, 581, 0, 451, 1515, 0, 718, + 452, 453, 792, 792, 865, 97, 0, 868, 0, 0, + 0, 0, 1030, 1034, 1047, 1048, 1444, 1470, 360, 360, + 1457, 360, 366, 1460, 360, 1462, 360, 1465, 360, 1468, + 1469, 0, 0, 1077, 0, 0, 0, 0, 1163, 1480, + 0, 0, 1174, 1113, 1114, 1114, 1114, 1114, 1114, 1180, + 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1474, + 0, 0, 0, 1195, 0, 0, 1199, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 144, 145, 0, 0, + 0, 0, 0, 0, 1394, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1108, 1112, 0, 1116, + 1117, 0, 0, 1346, 0, 0, 1364, 0, 0, 0, + 0, 0, 0, 0, 1484, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 998, 1005, 0, 1005, 0, + 1005, 0, 0, 0, 1618, 1619, 1488, 1489, 1009, 1490, + 924, 936, 954, 1578, 0, 1571, 0, -2, 1580, 0, + 0, 0, 1586, 375, 376, 928, 80, 1010, 83, 0, + 1599, 1608, 0, 1596, 1601, 1603, 0, 0, 0, 1592, + 0, 1009, 938, 969, 971, 0, 966, 981, 982, 984, + 0, 986, 0, 988, 989, 949, 943, 0, 100, 0, + 1009, 1009, 99, 0, 994, 119, 120, 121, 461, 184, + 189, 0, 0, 0, 194, 0, 196, 0, 0, 0, + 201, 202, 401, 401, 436, 0, 303, 305, 0, 0, + 187, 374, 0, 374, 0, 365, 367, 0, 437, 457, + 1516, 1517, 0, 0, 394, 398, 399, 400, 0, 148, + 0, 0, 0, 617, 0, 645, 0, 0, 0, 0, + 0, 0, 176, 517, 677, 678, 679, 680, 681, 682, + 683, 684, 685, 0, 401, 0, 0, 0, 401, 401, + 401, 0, 702, 388, 0, 0, 673, 670, 539, 0, + 218, 219, 226, 227, 229, 0, 0, 0, 0, 0, + 546, 949, 1533, 1534, 1535, 0, 1545, 1549, 136, 0, + 0, 0, 0, 591, 596, 602, 0, 519, 603, 715, + 716, 717, 95, 727, 733, 867, 887, 1018, 1031, 1035, + 0, 0, 0, 0, 1471, 1455, 374, 1458, 1459, 1461, + 1463, 1464, 1466, 1467, 1073, 1074, 1078, 0, 1160, 0, + 1162, 0, 1478, 0, 1175, 1176, 1177, 1178, 1179, 1510, + 0, 0, 0, 1194, 0, 0, 1114, 0, 1207, 1206, + 1208, 0, 1210, 1211, 1216, 1217, 1220, 1222, 1229, 1231, + 1235, 1237, 1240, 1242, 1244, 0, 1247, 0, 1250, 0, + 1253, 0, 1256, 0, 1259, 0, 1262, 0, 1265, 0, + 1268, 0, 1271, 0, 1274, 0, 1277, 0, 1280, 0, + 1283, 0, 1286, 0, 1289, 0, 1294, 1296, 0, 1299, + 1302, 1304, 0, 1307, 0, 1311, 0, 1313, 1315, 1316, + 0, 0, 0, 1327, 1328, 1329, 1330, 1331, 1332, 1333, + 1334, 1335, 1336, 1343, 0, 1106, 1345, 1118, 1119, 1124, + 1348, 0, 0, 0, 1351, 0, 0, 0, 1355, 1155, + 1366, 0, 1371, 0, 0, 1377, 0, 1381, 0, 1387, + 1388, 1390, 1392, 0, 0, 0, 0, 0, 0, 0, + 975, 956, 64, 1490, 1494, 0, 1565, 1563, 1563, 1573, + 1574, 0, 0, 1581, 0, 0, 0, 0, 84, 0, + 0, 1587, 0, 0, 1604, 0, 0, 0, 0, 101, + 1501, 963, 970, 0, 0, 964, 0, 965, 985, 987, + 942, 0, 1009, 1009, 90, 91, 0, 190, 0, 192, + 0, 195, 197, 198, 199, 205, 206, 207, 200, 0, + 0, 302, 304, 0, 0, 347, 359, 349, 0, 0, + 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 949, 149, + 150, 151, 609, 0, 619, 0, 951, 0, 612, 0, + 528, 0, 0, 0, 401, 401, 401, 0, 0, 0, + 0, 687, 0, 0, 650, 0, 658, 0, 0, 0, + 230, 231, 0, 1544, 582, 0, 134, 135, 0, 0, + 587, 521, 522, 1071, 0, 0, 0, 1072, 1456, 0, + 0, 0, 0, 0, 1475, 0, 0, 0, 0, 1200, + 1203, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1319, 0, 0, 0, 639, 640, 0, + 1395, 1111, 1501, 0, 1115, 1125, 1126, 0, 1115, 1365, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1006, 0, 0, 0, 957, 958, 0, 0, 0, + 995, 1494, 1499, 0, 0, 1568, 0, 1561, 1564, 1562, + 1575, 0, 0, 1582, 0, 1584, 0, 1609, 1610, 1602, + 1597, 0, 1591, 1594, 1596, 1593, 1510, 967, 0, 972, + 0, 1501, 89, 0, 193, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 203, 204, 0, 0, + 363, 368, 0, 0, 0, 610, 0, 952, 622, 613, + 0, 700, 0, 704, 0, 0, 0, 707, 708, 709, + 686, 0, 690, 429, 674, 671, 672, 540, 0, 137, + 138, 0, 0, 0, 1445, 0, 1448, 1158, 1161, 1159, + 0, 1190, 1192, 1193, 1453, 1454, 1209, 1245, 1248, 1251, + 1254, 1257, 1260, 1263, 1266, 1269, 1272, 1275, 1278, 1281, + 1284, 1287, 1290, 1298, 1305, 1308, 1312, 1317, 0, 1320, + 0, 0, 1321, 0, 641, 1102, 0, 0, 1122, 1123, + 0, 1350, 1352, 1353, 1354, 1367, 0, 1372, 1373, 0, + 1378, 0, 1382, 1393, 0, 1000, 1007, 1008, 0, 1003, + 0, 1004, 0, 948, 1499, 82, 1500, 1497, 0, 1495, + 1492, 1557, 0, 1566, 1567, 1576, 1577, 1583, 0, 0, + 1596, 0, 1590, 87, 0, 0, 0, 1510, 191, 0, + 210, 0, 618, 0, 621, 611, 698, 699, 0, 711, + 703, 705, 706, 688, -2, 1536, 0, 0, 0, 590, + 1446, 0, 0, 1322, 0, 637, 638, 1110, 1103, 0, + 1088, 1089, 1107, 1347, 1349, 0, 0, 0, 999, 959, + 960, 1001, 1002, 81, 0, 1496, 1130, 0, 1491, 0, + 1569, 1570, 1600, 0, 1589, 1595, 968, 975, 0, 88, + 442, 435, 1536, 0, 0, 0, 691, 692, 693, 694, + 695, 696, 697, 579, 1538, 139, 140, 0, 509, 510, + 511, 133, 0, 1165, 1318, 1104, 0, 0, 0, 0, + 0, 1368, 0, 1374, 0, 1379, 0, 1498, 0, 0, + 1493, 1598, 623, 0, 625, 0, -2, 430, 443, 0, + 185, 211, 212, 0, 0, 215, 216, 217, 208, 209, + 129, 0, 0, 712, 0, 1539, 1540, 0, 136, 0, + 0, 1095, 1096, 1097, 1098, 1100, 0, 0, 0, 0, + 1131, 1108, 624, 0, 0, 385, 0, 634, 431, 432, + 0, 438, 439, 440, 441, 213, 214, 646, 0, 0, + 508, 586, 1447, 0, 0, 1369, 0, 1375, 0, 1380, + 0, 626, 627, 635, 0, 433, 0, 434, 0, 0, + 0, 615, 0, 646, 1537, 1105, 1099, 1101, 0, 0, + 1129, 0, 636, 632, 444, 446, 447, 0, 0, 445, + 647, 616, 1370, 1376, 0, 448, 449, 450, 628, 629, + 630, 631, } var yyTok1 = [...]int{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 152, 3, 3, 3, 180, 172, 3, - 91, 93, 177, 175, 92, 176, 230, 178, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 742, - 160, 159, 161, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 158, 3, 3, 3, 186, 178, 3, + 95, 97, 183, 181, 96, 182, 236, 184, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 751, + 166, 165, 167, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 182, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 188, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 148, 3, 183, + 3, 3, 3, 3, 154, 3, 189, } var yyTok2 = [...]int{ @@ -9844,20 +9878,20 @@ var yyTok2 = [...]int{ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 149, 150, 151, 153, 154, 155, 156, - 157, 158, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 173, 174, 179, 181, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 155, + 156, 157, 159, 160, 161, 162, 163, 164, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 179, 180, + 185, 187, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, + 228, 229, 230, 231, 232, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, @@ -9958,7 +9992,9 @@ var yyTok3 = [...]int{ 58050, 725, 58051, 726, 58052, 727, 58053, 728, 58054, 729, 58055, 730, 58056, 731, 58057, 732, 58058, 733, 58059, 734, 58060, 735, 58061, 736, 58062, 737, 58063, 738, 58064, 739, - 58065, 740, 58066, 741, 0, + 58065, 740, 58066, 741, 58067, 742, 58068, 743, 58069, 744, + 58070, 745, 58071, 746, 58072, 747, 58073, 748, 58074, 749, + 58075, 750, 0, } var yyErrorMessages = [...]struct { @@ -10308,7 +10344,7 @@ yydefault: case 1: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:622 +//line sql.y:631 { stmt := yyDollar[2].statementUnion() // If the statement is empty and we have comments @@ -10322,46 +10358,46 @@ yydefault: } case 2: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:635 +//line sql.y:644 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:636 +//line sql.y:645 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:640 +//line sql.y:649 { yyLOCAL = yyDollar[1].selStmtUnion() } yyVAL.union = yyLOCAL case 40: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:679 +//line sql.y:688 { setParseTree(yylex, nil) } case 41: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:685 +//line sql.y:694 { yyLOCAL = NewVariableExpression(yyDollar[1].str, SingleAt) } yyVAL.union = yyLOCAL case 42: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:691 +//line sql.y:700 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 43: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:697 +//line sql.y:706 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), SingleAt) } @@ -10369,7 +10405,7 @@ yydefault: case 44: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:701 +//line sql.y:710 { yyLOCAL = NewVariableExpression(string(yyDollar[1].str), DoubleAt) } @@ -10377,7 +10413,7 @@ yydefault: case 45: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:707 +//line sql.y:716 { yyLOCAL = &OtherAdmin{} } @@ -10385,7 +10421,7 @@ yydefault: case 46: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:713 +//line sql.y:722 { yyLOCAL = &Load{} } @@ -10393,7 +10429,7 @@ yydefault: case 47: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *With -//line sql.y:719 +//line sql.y:728 { yyLOCAL = &With{CTEs: yyDollar[2].ctesUnion(), Recursive: false} } @@ -10401,7 +10437,7 @@ yydefault: case 48: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *With -//line sql.y:723 +//line sql.y:732 { yyLOCAL = &With{CTEs: yyDollar[3].ctesUnion(), Recursive: true} } @@ -10409,7 +10445,7 @@ yydefault: case 49: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *With -//line sql.y:728 +//line sql.y:737 { yyLOCAL = nil } @@ -10417,14 +10453,14 @@ yydefault: case 50: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *With -//line sql.y:732 +//line sql.y:741 { yyLOCAL = yyDollar[1].withUnion() } yyVAL.union = yyLOCAL case 51: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:738 +//line sql.y:747 { yySLICE := (*[]*CommonTableExpr)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].cteUnion()) @@ -10432,7 +10468,7 @@ yydefault: case 52: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*CommonTableExpr -//line sql.y:742 +//line sql.y:751 { yyLOCAL = []*CommonTableExpr{yyDollar[1].cteUnion()} } @@ -10440,15 +10476,15 @@ yydefault: case 53: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *CommonTableExpr -//line sql.y:748 +//line sql.y:757 { - yyLOCAL = &CommonTableExpr{ID: yyDollar[1].identifierCS, Columns: yyDollar[2].columnsUnion(), Subquery: yyDollar[4].subqueryUnion()} + yyLOCAL = &CommonTableExpr{ID: yyDollar[1].identifierCS, Columns: yyDollar[2].columnsUnion(), Subquery: yyDollar[4].subqueryUnion().Select} } yyVAL.union = yyLOCAL case 54: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:754 +//line sql.y:763 { yyLOCAL = yyDollar[2].selStmtUnion() } @@ -10456,7 +10492,7 @@ yydefault: case 55: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:758 +//line sql.y:767 { yyLOCAL = yyDollar[2].selStmtUnion() } @@ -10464,7 +10500,7 @@ yydefault: case 56: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:762 +//line sql.y:771 { setLockInSelect(yyDollar[2].selStmtUnion(), yyDollar[3].lockUnion()) yyLOCAL = yyDollar[2].selStmtUnion() @@ -10473,7 +10509,7 @@ yydefault: case 57: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:785 +//line sql.y:794 { yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -10483,7 +10519,7 @@ yydefault: case 58: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:791 +//line sql.y:800 { yyDollar[1].selStmtUnion().SetLimit(yyDollar[2].limitUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -10492,7 +10528,7 @@ yydefault: case 59: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:796 +//line sql.y:805 { yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -10502,7 +10538,7 @@ yydefault: case 60: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:802 +//line sql.y:811 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) @@ -10513,7 +10549,7 @@ yydefault: case 61: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:809 +//line sql.y:818 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -10523,7 +10559,7 @@ yydefault: case 62: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:815 +//line sql.y:824 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) @@ -10533,14 +10569,14 @@ yydefault: yyVAL.union = yyLOCAL case 63: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:822 +//line sql.y:831 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) } case 64: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:826 +//line sql.y:835 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), SelectExprs{&Nextval{Expr: yyDollar[5].exprUnion()}}, []string{yyDollar[3].str} /*options*/, nil, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/, nil) } @@ -10548,7 +10584,7 @@ yydefault: case 65: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:832 +//line sql.y:841 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -10556,7 +10592,7 @@ yydefault: case 66: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:836 +//line sql.y:845 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -10564,7 +10600,7 @@ yydefault: case 67: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:840 +//line sql.y:849 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -10572,7 +10608,7 @@ yydefault: case 68: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:844 +//line sql.y:853 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -10580,7 +10616,7 @@ yydefault: case 69: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:848 +//line sql.y:857 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -10588,7 +10624,7 @@ yydefault: case 70: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:854 +//line sql.y:863 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -10596,7 +10632,7 @@ yydefault: case 71: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:858 +//line sql.y:867 { setLockInSelect(yyDollar[1].selStmtUnion(), yyDollar[2].lockUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -10605,7 +10641,7 @@ yydefault: case 72: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:863 +//line sql.y:872 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -10613,7 +10649,7 @@ yydefault: case 73: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:867 +//line sql.y:876 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -10621,7 +10657,7 @@ yydefault: case 74: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:873 +//line sql.y:882 { yyLOCAL = yyDollar[2].selStmtUnion() } @@ -10629,7 +10665,7 @@ yydefault: case 75: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:877 +//line sql.y:886 { yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -10638,7 +10674,7 @@ yydefault: case 76: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:882 +//line sql.y:891 { yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) yyDollar[1].selStmtUnion().SetLock(yyDollar[3].lockUnion()) @@ -10648,7 +10684,7 @@ yydefault: case 77: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:888 +//line sql.y:897 { yyDollar[1].selStmtUnion().SetInto(yyDollar[3].selectIntoUnion()) yyDollar[1].selStmtUnion().SetLock(yyDollar[2].lockUnion()) @@ -10658,7 +10694,7 @@ yydefault: case 78: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:894 +//line sql.y:903 { yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -10667,7 +10703,7 @@ yydefault: case 79: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:901 +//line sql.y:910 { yyLOCAL = &Stream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName} } @@ -10675,7 +10711,7 @@ yydefault: case 80: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:907 +//line sql.y:916 { yyLOCAL = &VStream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName, Where: NewWhere(WhereClause, yyDollar[6].exprUnion()), Limit: yyDollar[7].limitUnion()} } @@ -10683,7 +10719,7 @@ yydefault: case 81: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:915 +//line sql.y:924 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].selectIntoUnion() /*into*/, yyDollar[6].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[7].exprUnion()), yyDollar[8].groupByUnion(), NewWhere(HavingClause, yyDollar[9].exprUnion()), yyDollar[10].namedWindowsUnion()) } @@ -10691,7 +10727,7 @@ yydefault: case 82: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:919 +//line sql.y:928 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, nil, yyDollar[5].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[6].exprUnion()), yyDollar[7].groupByUnion(), NewWhere(HavingClause, yyDollar[8].exprUnion()), yyDollar[9].namedWindowsUnion()) } @@ -10699,7 +10735,7 @@ yydefault: case 83: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:925 +//line sql.y:934 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].insUnion() @@ -10715,7 +10751,7 @@ yydefault: case 84: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:937 +//line sql.y:946 { cols := make(Columns, 0, len(yyDollar[7].updateExprsUnion())) vals := make(ValTuple, 0, len(yyDollar[8].updateExprsUnion())) @@ -10729,7 +10765,7 @@ yydefault: case 85: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:949 +//line sql.y:958 { yyLOCAL = InsertAct } @@ -10737,7 +10773,7 @@ yydefault: case 86: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:953 +//line sql.y:962 { yyLOCAL = ReplaceAct } @@ -10745,7 +10781,7 @@ yydefault: case 87: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:959 +//line sql.y:968 { yyLOCAL = &Update{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: yyDollar[5].tableExprsUnion(), Exprs: yyDollar[7].updateExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion()), OrderBy: yyDollar[9].orderByUnion(), Limit: yyDollar[10].limitUnion()} } @@ -10753,7 +10789,7 @@ yydefault: case 88: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:965 +//line sql.y:974 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[6].tableName, As: yyDollar[7].identifierCS}}, Partitions: yyDollar[8].partitionsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion()), OrderBy: yyDollar[10].orderByUnion(), Limit: yyDollar[11].limitUnion()} } @@ -10761,7 +10797,7 @@ yydefault: case 89: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Statement -//line sql.y:969 +//line sql.y:978 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[6].tableNamesUnion(), TableExprs: yyDollar[8].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion())} } @@ -10769,7 +10805,7 @@ yydefault: case 90: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:973 +//line sql.y:982 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } @@ -10777,32 +10813,32 @@ yydefault: case 91: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:977 +//line sql.y:986 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } yyVAL.union = yyLOCAL case 92: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:982 +//line sql.y:991 { } case 93: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:983 +//line sql.y:992 { } case 94: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:987 +//line sql.y:996 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 95: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:991 +//line sql.y:1000 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -10810,14 +10846,14 @@ yydefault: case 96: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:997 +//line sql.y:1006 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 97: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1001 +//line sql.y:1010 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -10825,14 +10861,14 @@ yydefault: case 98: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:1007 +//line sql.y:1016 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 99: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1011 +//line sql.y:1020 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -10840,7 +10876,7 @@ yydefault: case 100: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Partitions -//line sql.y:1016 +//line sql.y:1025 { yyLOCAL = nil } @@ -10848,7 +10884,7 @@ yydefault: case 101: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Partitions -//line sql.y:1020 +//line sql.y:1029 { yyLOCAL = yyDollar[3].partitionsUnion() } @@ -10856,7 +10892,7 @@ yydefault: case 102: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:1026 +//line sql.y:1035 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[3].setExprsUnion()) } @@ -10864,14 +10900,14 @@ yydefault: case 103: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1032 +//line sql.y:1041 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL case 104: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1036 +//line sql.y:1045 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) @@ -10879,7 +10915,7 @@ yydefault: case 105: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1042 +//line sql.y:1051 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("on")} } @@ -10887,7 +10923,7 @@ yydefault: case 106: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1046 +//line sql.y:1055 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: NewStrLiteral("off")} } @@ -10895,7 +10931,7 @@ yydefault: case 107: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1050 +//line sql.y:1059 { yyLOCAL = &SetExpr{Var: yyDollar[1].variableUnion(), Expr: yyDollar[3].exprUnion()} } @@ -10903,7 +10939,7 @@ yydefault: case 108: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1054 +//line sql.y:1063 { yyLOCAL = &SetExpr{Var: NewSetVariable(string(yyDollar[1].str), SessionScope), Expr: yyDollar[2].exprUnion()} } @@ -10911,7 +10947,7 @@ yydefault: case 109: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1060 +//line sql.y:1069 { yyLOCAL = NewSetVariable(string(yyDollar[1].str), SessionScope) } @@ -10919,7 +10955,7 @@ yydefault: case 110: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Variable -//line sql.y:1064 +//line sql.y:1073 { yyLOCAL = yyDollar[1].variableUnion() } @@ -10927,7 +10963,7 @@ yydefault: case 111: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Variable -//line sql.y:1068 +//line sql.y:1077 { yyLOCAL = NewSetVariable(string(yyDollar[2].str), yyDollar[1].scopeUnion()) } @@ -10935,7 +10971,7 @@ yydefault: case 112: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:1074 +//line sql.y:1083 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), UpdateSetExprsScope(yyDollar[5].setExprsUnion(), yyDollar[3].scopeUnion())) } @@ -10943,7 +10979,7 @@ yydefault: case 113: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:1078 +//line sql.y:1087 { yyLOCAL = NewSetStatement(Comments(yyDollar[2].strs).Parsed(), yyDollar[4].setExprsUnion()) } @@ -10951,14 +10987,14 @@ yydefault: case 114: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:1084 +//line sql.y:1093 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL case 115: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1088 +//line sql.y:1097 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) @@ -10966,7 +11002,7 @@ yydefault: case 116: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1094 +//line sql.y:1103 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionIsolationStr, NextTxScope), Expr: NewStrLiteral(yyDollar[3].str)} } @@ -10974,7 +11010,7 @@ yydefault: case 117: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1098 +//line sql.y:1107 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("off")} } @@ -10982,39 +11018,39 @@ yydefault: case 118: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:1102 +//line sql.y:1111 { yyLOCAL = &SetExpr{Var: NewSetVariable(TransactionReadOnlyStr, NextTxScope), Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL case 119: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1108 +//line sql.y:1117 { yyVAL.str = RepeatableReadStr } case 120: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1112 +//line sql.y:1121 { yyVAL.str = ReadCommittedStr } case 121: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1116 +//line sql.y:1125 { yyVAL.str = ReadUncommittedStr } case 122: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1120 +//line sql.y:1129 { yyVAL.str = SerializableStr } case 123: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1126 +//line sql.y:1135 { yyLOCAL = SessionScope } @@ -11022,7 +11058,7 @@ yydefault: case 124: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1130 +//line sql.y:1139 { yyLOCAL = SessionScope } @@ -11030,7 +11066,7 @@ yydefault: case 125: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:1134 +//line sql.y:1143 { yyLOCAL = GlobalScope } @@ -11038,7 +11074,7 @@ yydefault: case 126: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1140 +//line sql.y:1149 { yyDollar[1].createTableUnion().TableSpec = yyDollar[2].tableSpecUnion() yyDollar[1].createTableUnion().FullyParsed = true @@ -11048,7 +11084,7 @@ yydefault: case 127: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1146 +//line sql.y:1155 { // Create table [name] like [name] yyDollar[1].createTableUnion().OptLike = yyDollar[2].optLikeUnion() @@ -11059,7 +11095,7 @@ yydefault: case 128: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:1153 +//line sql.y:1162 { indexDef := yyDollar[1].alterTableUnion().AlterOptions[0].(*AddIndexDefinition).IndexDefinition indexDef.Columns = yyDollar[3].indexColumnsUnion() @@ -11072,7 +11108,7 @@ yydefault: case 129: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Statement -//line sql.y:1162 +//line sql.y:1171 { yyLOCAL = &CreateView{ViewName: yyDollar[8].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), IsReplace: yyDollar[3].booleanUnion(), Algorithm: yyDollar[4].str, Definer: yyDollar[5].definerUnion(), Security: yyDollar[6].str, Columns: yyDollar[9].columnsUnion(), Select: yyDollar[11].selStmtUnion(), CheckOption: yyDollar[12].str} } @@ -11080,7 +11116,7 @@ yydefault: case 130: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1166 +//line sql.y:1175 { yyDollar[1].createDatabaseUnion().FullyParsed = true yyDollar[1].createDatabaseUnion().CreateOptions = yyDollar[2].databaseOptionsUnion() @@ -11090,7 +11126,7 @@ yydefault: case 131: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1173 +//line sql.y:1182 { yyLOCAL = false } @@ -11098,33 +11134,33 @@ yydefault: case 132: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:1177 +//line sql.y:1186 { yyLOCAL = true } yyVAL.union = yyLOCAL case 133: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1182 +//line sql.y:1191 { yyVAL.identifierCI = NewIdentifierCI("") } case 134: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1186 +//line sql.y:1195 { yyVAL.identifierCI = yyDollar[2].identifierCI } case 135: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1192 +//line sql.y:1201 { yyVAL.identifierCI = yyDollar[1].identifierCI } case 136: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1197 +//line sql.y:1206 { var v []VindexParam yyLOCAL = v @@ -11133,7 +11169,7 @@ yydefault: case 137: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1202 +//line sql.y:1211 { yyLOCAL = yyDollar[2].vindexParamsUnion() } @@ -11141,7 +11177,7 @@ yydefault: case 138: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1208 +//line sql.y:1217 { yyLOCAL = make([]VindexParam, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].vindexParam) @@ -11149,21 +11185,21 @@ yydefault: yyVAL.union = yyLOCAL case 139: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1213 +//line sql.y:1222 { yySLICE := (*[]VindexParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].vindexParam) } case 140: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1219 +//line sql.y:1228 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].identifierCI, Val: yyDollar[3].str} } case 141: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1224 +//line sql.y:1233 { yyLOCAL = nil } @@ -11171,7 +11207,7 @@ yydefault: case 142: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1228 +//line sql.y:1237 { yyLOCAL = yyDollar[1].jsonObjectParamsUnion() } @@ -11179,28 +11215,28 @@ yydefault: case 143: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1234 +//line sql.y:1243 { yyLOCAL = []*JSONObjectParam{yyDollar[1].jsonObjectParam} } yyVAL.union = yyLOCAL case 144: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1238 +//line sql.y:1247 { yySLICE := (*[]*JSONObjectParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jsonObjectParam) } case 145: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1244 +//line sql.y:1253 { yyVAL.jsonObjectParam = &JSONObjectParam{Key: yyDollar[1].exprUnion(), Value: yyDollar[3].exprUnion()} } case 146: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *CreateTable -//line sql.y:1250 +//line sql.y:1259 { yyLOCAL = &CreateTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[6].tableName, IfNotExists: yyDollar[5].booleanUnion(), Temp: yyDollar[3].booleanUnion()} setDDL(yylex, yyLOCAL) @@ -11209,7 +11245,7 @@ yydefault: case 147: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1257 +//line sql.y:1266 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[4].tableName} setDDL(yylex, yyLOCAL) @@ -11218,61 +11254,61 @@ yydefault: case 148: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1264 +//line sql.y:1273 { - yyLOCAL = &AlterTable{Table: yyDollar[7].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[4].identifierCI}, Options: yyDollar[5].indexOptionsUnion()}}}} + yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[7].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[4].identifierCI}, Options: yyDollar[5].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL case 149: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1269 +//line sql.y:1278 { - yyLOCAL = &AlterTable{Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeFullText}, Options: yyDollar[6].indexOptionsUnion()}}}} + yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeFullText}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL case 150: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1274 +//line sql.y:1283 { - yyLOCAL = &AlterTable{Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeSpatial}, Options: yyDollar[6].indexOptionsUnion()}}}} + yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeSpatial}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL case 151: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1279 +//line sql.y:1288 { - yyLOCAL = &AlterTable{Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeUnique}, Options: yyDollar[6].indexOptionsUnion()}}}} + yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].identifierCI, Type: IndexTypeUnique}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL case 152: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *CreateDatabase -//line sql.y:1286 +//line sql.y:1295 { - yyLOCAL = &CreateDatabase{Comments: Comments(yyDollar[4].strs).Parsed(), DBName: yyDollar[6].identifierCS, IfNotExists: yyDollar[5].booleanUnion()} + yyLOCAL = &CreateDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfNotExists: yyDollar[4].booleanUnion()} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL case 153: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AlterDatabase -//line sql.y:1293 +//line sql.y:1302 { - yyLOCAL = &AlterDatabase{} + yyLOCAL = &AlterDatabase{Comments: Comments(yyDollar[2].strs).Parsed()} setDDL(yylex, yyLOCAL) } yyVAL.union = yyLOCAL case 156: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1304 +//line sql.y:1313 { yyLOCAL = yyDollar[2].tableSpecUnion() yyLOCAL.Options = yyDollar[4].tableOptionsUnion() @@ -11282,7 +11318,7 @@ yydefault: case 157: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1311 +//line sql.y:1320 { yyLOCAL = nil } @@ -11290,7 +11326,7 @@ yydefault: case 158: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1315 +//line sql.y:1324 { yyLOCAL = yyDollar[1].databaseOptionsUnion() } @@ -11298,7 +11334,7 @@ yydefault: case 159: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1321 +//line sql.y:1330 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } @@ -11306,7 +11342,7 @@ yydefault: case 160: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1325 +//line sql.y:1334 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } @@ -11314,28 +11350,28 @@ yydefault: case 161: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []DatabaseOption -//line sql.y:1329 +//line sql.y:1338 { yyLOCAL = []DatabaseOption{yyDollar[1].databaseOption} } yyVAL.union = yyLOCAL case 162: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1333 +//line sql.y:1342 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } case 163: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1337 +//line sql.y:1346 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) } case 164: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1341 +//line sql.y:1350 { yySLICE := (*[]DatabaseOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].databaseOption) @@ -11343,7 +11379,7 @@ yydefault: case 165: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1347 +//line sql.y:1356 { yyLOCAL = false } @@ -11351,51 +11387,51 @@ yydefault: case 166: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:1351 +//line sql.y:1360 { yyLOCAL = true } yyVAL.union = yyLOCAL case 167: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1357 +//line sql.y:1366 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 168: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1361 +//line sql.y:1370 { yyVAL.databaseOption = DatabaseOption{Type: CharacterSetType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 169: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1367 +//line sql.y:1376 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 170: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1371 +//line sql.y:1380 { yyVAL.databaseOption = DatabaseOption{Type: CollateType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 171: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1377 +//line sql.y:1386 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: string(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 172: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1381 +//line sql.y:1390 { yyVAL.databaseOption = DatabaseOption{Type: EncryptionType, Value: encodeSQLString(yyDollar[4].str), IsDefault: yyDollar[1].booleanUnion()} } case 173: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1387 +//line sql.y:1396 { yyLOCAL = &OptLike{LikeTable: yyDollar[2].tableName} } @@ -11403,7 +11439,7 @@ yydefault: case 174: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1391 +//line sql.y:1400 { yyLOCAL = &OptLike{LikeTable: yyDollar[3].tableName} } @@ -11411,14 +11447,14 @@ yydefault: case 175: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColumnDefinition -//line sql.y:1397 +//line sql.y:1406 { yyLOCAL = []*ColumnDefinition{yyDollar[1].columnDefinitionUnion()} } yyVAL.union = yyLOCAL case 176: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1401 +//line sql.y:1410 { yySLICE := (*[]*ColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].columnDefinitionUnion()) @@ -11426,7 +11462,7 @@ yydefault: case 177: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1407 +//line sql.y:1416 { yyLOCAL = &TableSpec{} yyLOCAL.AddColumn(yyDollar[1].columnDefinitionUnion()) @@ -11435,7 +11471,7 @@ yydefault: case 178: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1412 +//line sql.y:1421 { yyLOCAL = &TableSpec{} yyLOCAL.AddConstraint(yyDollar[1].constraintDefinitionUnion()) @@ -11443,39 +11479,39 @@ yydefault: yyVAL.union = yyLOCAL case 179: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1417 +//line sql.y:1426 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) } case 180: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1421 +//line sql.y:1430 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) yyVAL.tableSpecUnion().AddConstraint(yyDollar[4].constraintDefinitionUnion()) } case 181: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1426 +//line sql.y:1435 { yyVAL.tableSpecUnion().AddIndex(yyDollar[3].indexDefinitionUnion()) } case 182: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1430 +//line sql.y:1439 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } case 183: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1434 +//line sql.y:1443 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } case 184: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1445 +//line sql.y:1454 { yyDollar[2].columnType.Options = yyDollar[4].columnTypeOptionsUnion() if yyDollar[2].columnType.Options.Collate == "" { @@ -11488,7 +11524,7 @@ yydefault: case 185: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1454 +//line sql.y:1463 { yyDollar[2].columnType.Options = yyDollar[9].columnTypeOptionsUnion() yyDollar[2].columnType.Options.As = yyDollar[7].exprUnion() @@ -11499,20 +11535,20 @@ yydefault: yyVAL.union = yyLOCAL case 186: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1463 +//line sql.y:1472 { yyVAL.str = "" } case 187: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1467 +//line sql.y:1476 { yyVAL.str = "" } case 188: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1476 +//line sql.y:1485 { yyLOCAL = &ColumnTypeOptions{Null: nil, Default: nil, OnUpdate: nil, Autoincrement: false, KeyOpt: ColKeyNone, Comment: nil, As: nil, Invisible: nil, Format: UnspecifiedFormat, EngineAttribute: nil, SecondaryEngineAttribute: nil} } @@ -11520,7 +11556,7 @@ yydefault: case 189: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1480 +//line sql.y:1489 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11529,7 +11565,7 @@ yydefault: case 190: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1485 +//line sql.y:1494 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11538,7 +11574,7 @@ yydefault: case 191: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1490 +//line sql.y:1499 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11547,7 +11583,7 @@ yydefault: case 192: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1495 +//line sql.y:1504 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[3].exprUnion() yyDollar[1].columnTypeOptionsUnion().DefaultLiteral = true @@ -11557,7 +11593,7 @@ yydefault: case 193: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1501 +//line sql.y:1510 { yyDollar[1].columnTypeOptionsUnion().OnUpdate = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11566,7 +11602,7 @@ yydefault: case 194: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1506 +//line sql.y:1515 { yyDollar[1].columnTypeOptionsUnion().Autoincrement = true yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11575,7 +11611,7 @@ yydefault: case 195: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1511 +//line sql.y:1520 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11584,7 +11620,7 @@ yydefault: case 196: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1516 +//line sql.y:1525 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11592,14 +11628,14 @@ yydefault: yyVAL.union = yyLOCAL case 197: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1521 +//line sql.y:1530 { yyDollar[1].columnTypeOptionsUnion().Collate = encodeSQLString(yyDollar[3].str) } case 198: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1525 +//line sql.y:1534 { yyDollar[1].columnTypeOptionsUnion().Collate = string(yyDollar[3].identifierCI.String()) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11607,14 +11643,14 @@ yydefault: yyVAL.union = yyLOCAL case 199: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1530 +//line sql.y:1539 { yyDollar[1].columnTypeOptionsUnion().Format = yyDollar[3].columnFormatUnion() } case 200: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1534 +//line sql.y:1543 { yyDollar[1].columnTypeOptionsUnion().SRID = NewIntLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11623,7 +11659,7 @@ yydefault: case 201: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1539 +//line sql.y:1548 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11632,7 +11668,7 @@ yydefault: case 202: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1544 +//line sql.y:1553 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11640,20 +11676,20 @@ yydefault: yyVAL.union = yyLOCAL case 203: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1549 +//line sql.y:1558 { yyDollar[1].columnTypeOptionsUnion().EngineAttribute = NewStrLiteral(yyDollar[4].str) } case 204: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1553 +//line sql.y:1562 { yyDollar[1].columnTypeOptionsUnion().SecondaryEngineAttribute = NewStrLiteral(yyDollar[4].str) } case 205: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1559 +//line sql.y:1568 { yyLOCAL = FixedFormat } @@ -11661,7 +11697,7 @@ yydefault: case 206: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1563 +//line sql.y:1572 { yyLOCAL = DynamicFormat } @@ -11669,7 +11705,7 @@ yydefault: case 207: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnFormat -//line sql.y:1567 +//line sql.y:1576 { yyLOCAL = DefaultFormat } @@ -11677,7 +11713,7 @@ yydefault: case 208: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1573 +//line sql.y:1582 { yyLOCAL = VirtualStorage } @@ -11685,7 +11721,7 @@ yydefault: case 209: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1577 +//line sql.y:1586 { yyLOCAL = StoredStorage } @@ -11693,7 +11729,7 @@ yydefault: case 210: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1582 +//line sql.y:1591 { yyLOCAL = &ColumnTypeOptions{} } @@ -11701,7 +11737,7 @@ yydefault: case 211: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1586 +//line sql.y:1595 { yyDollar[1].columnTypeOptionsUnion().Storage = yyDollar[2].columnStorageUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11710,7 +11746,7 @@ yydefault: case 212: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1591 +//line sql.y:1600 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11719,7 +11755,7 @@ yydefault: case 213: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1596 +//line sql.y:1605 { yyDollar[1].columnTypeOptionsUnion().Null = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11728,7 +11764,7 @@ yydefault: case 214: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1601 +//line sql.y:1610 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11737,7 +11773,7 @@ yydefault: case 215: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1606 +//line sql.y:1615 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11746,7 +11782,7 @@ yydefault: case 216: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1611 +//line sql.y:1620 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(false) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11755,7 +11791,7 @@ yydefault: case 217: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1616 +//line sql.y:1625 { yyDollar[1].columnTypeOptionsUnion().Invisible = ptr.Of(true) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -11764,7 +11800,7 @@ yydefault: case 218: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1623 +//line sql.y:1632 { yyLOCAL = yyDollar[1].exprUnion() } @@ -11772,7 +11808,7 @@ yydefault: case 220: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1630 +//line sql.y:1639 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_timestamp"), Fsp: yyDollar[2].integerUnion()} } @@ -11780,7 +11816,7 @@ yydefault: case 221: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1634 +//line sql.y:1643 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtime"), Fsp: yyDollar[2].integerUnion()} } @@ -11788,7 +11824,7 @@ yydefault: case 222: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1638 +//line sql.y:1647 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("localtimestamp"), Fsp: yyDollar[2].integerUnion()} } @@ -11796,7 +11832,7 @@ yydefault: case 223: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1642 +//line sql.y:1651 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_timestamp"), Fsp: yyDollar[2].integerUnion()} } @@ -11804,7 +11840,7 @@ yydefault: case 224: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1646 +//line sql.y:1655 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("now"), Fsp: yyDollar[2].integerUnion()} } @@ -11812,7 +11848,7 @@ yydefault: case 225: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1650 +//line sql.y:1659 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("sysdate"), Fsp: yyDollar[2].integerUnion()} } @@ -11820,7 +11856,7 @@ yydefault: case 228: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1660 +//line sql.y:1669 { yyLOCAL = &NullVal{} } @@ -11828,7 +11864,7 @@ yydefault: case 230: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1667 +//line sql.y:1676 { yyLOCAL = yyDollar[2].exprUnion() } @@ -11836,7 +11872,7 @@ yydefault: case 231: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1671 +//line sql.y:1680 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } @@ -11844,7 +11880,7 @@ yydefault: case 232: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1677 +//line sql.y:1686 { yyLOCAL = yyDollar[1].exprUnion() } @@ -11852,7 +11888,7 @@ yydefault: case 233: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1681 +//line sql.y:1690 { yyLOCAL = yyDollar[1].exprUnion() } @@ -11860,7 +11896,7 @@ yydefault: case 234: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1685 +//line sql.y:1694 { yyLOCAL = yyDollar[1].boolValUnion() } @@ -11868,7 +11904,7 @@ yydefault: case 235: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1689 +//line sql.y:1698 { yyLOCAL = NewHexLiteral(yyDollar[1].str) } @@ -11876,7 +11912,7 @@ yydefault: case 236: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1693 +//line sql.y:1702 { yyLOCAL = NewHexNumLiteral(yyDollar[1].str) } @@ -11884,7 +11920,7 @@ yydefault: case 237: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1697 +//line sql.y:1706 { yyLOCAL = NewBitLiteral(yyDollar[1].str) } @@ -11892,7 +11928,7 @@ yydefault: case 238: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1701 +//line sql.y:1710 { yyLOCAL = NewBitLiteral("0b" + yyDollar[1].str) } @@ -11900,7 +11936,7 @@ yydefault: case 239: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1705 +//line sql.y:1714 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } @@ -11908,7 +11944,7 @@ yydefault: case 240: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1709 +//line sql.y:1718 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral("0b" + yyDollar[2].str)} } @@ -11916,7 +11952,7 @@ yydefault: case 241: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1713 +//line sql.y:1722 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexNumLiteral(yyDollar[2].str)} } @@ -11924,7 +11960,7 @@ yydefault: case 242: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1717 +//line sql.y:1726 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral(yyDollar[2].str)} } @@ -11932,7 +11968,7 @@ yydefault: case 243: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1721 +//line sql.y:1730 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexLiteral(yyDollar[2].str)} } @@ -11940,486 +11976,486 @@ yydefault: case 244: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1725 - { - yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: yyDollar[2].exprUnion()} - } - yyVAL.union = yyLOCAL - case 245: - yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL Expr -//line sql.y:1729 +//line sql.y:1734 { arg := parseBindVariable(yylex, yyDollar[2].str[1:]) yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: arg} } yyVAL.union = yyLOCAL - case 246: + case 245: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1734 +//line sql.y:1739 { yyLOCAL = NewDateLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 247: + case 246: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1738 +//line sql.y:1743 { yyLOCAL = NewTimeLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 248: + case 247: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1742 +//line sql.y:1747 { yyLOCAL = NewTimestampLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 249: + case 248: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1748 +//line sql.y:1753 { yyVAL.str = Armscii8Str } - case 250: + case 249: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1752 +//line sql.y:1757 { yyVAL.str = ASCIIStr } - case 251: + case 250: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1756 +//line sql.y:1761 { yyVAL.str = Big5Str } - case 252: + case 251: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1760 +//line sql.y:1765 { yyVAL.str = UBinaryStr } - case 253: + case 252: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1764 +//line sql.y:1769 { yyVAL.str = Cp1250Str } - case 254: + case 253: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1768 +//line sql.y:1773 { yyVAL.str = Cp1251Str } - case 255: + case 254: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1772 +//line sql.y:1777 { yyVAL.str = Cp1256Str } - case 256: + case 255: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1776 +//line sql.y:1781 { yyVAL.str = Cp1257Str } - case 257: + case 256: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1780 +//line sql.y:1785 { yyVAL.str = Cp850Str } - case 258: + case 257: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1784 +//line sql.y:1789 { yyVAL.str = Cp852Str } - case 259: + case 258: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1788 +//line sql.y:1793 { yyVAL.str = Cp866Str } - case 260: + case 259: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1792 +//line sql.y:1797 { yyVAL.str = Cp932Str } - case 261: + case 260: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1796 +//line sql.y:1801 { yyVAL.str = Dec8Str } - case 262: + case 261: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1800 +//line sql.y:1805 { yyVAL.str = EucjpmsStr } - case 263: + case 262: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1804 +//line sql.y:1809 { yyVAL.str = EuckrStr } - case 264: + case 263: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1808 +//line sql.y:1813 { yyVAL.str = Gb18030Str } - case 265: + case 264: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1812 +//line sql.y:1817 { yyVAL.str = Gb2312Str } - case 266: + case 265: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1816 +//line sql.y:1821 { yyVAL.str = GbkStr } - case 267: + case 266: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1820 +//line sql.y:1825 { yyVAL.str = Geostd8Str } - case 268: + case 267: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1824 +//line sql.y:1829 { yyVAL.str = GreekStr } - case 269: + case 268: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1828 +//line sql.y:1833 { yyVAL.str = HebrewStr } - case 270: + case 269: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1832 +//line sql.y:1837 { yyVAL.str = Hp8Str } - case 271: + case 270: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1836 +//line sql.y:1841 { yyVAL.str = Keybcs2Str } - case 272: + case 271: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1840 +//line sql.y:1845 { yyVAL.str = Koi8rStr } - case 273: + case 272: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1844 +//line sql.y:1849 { yyVAL.str = Koi8uStr } - case 274: + case 273: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1848 +//line sql.y:1853 { yyVAL.str = Latin1Str } - case 275: + case 274: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1852 +//line sql.y:1857 { yyVAL.str = Latin2Str } - case 276: + case 275: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1856 +//line sql.y:1861 { yyVAL.str = Latin5Str } - case 277: + case 276: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1860 +//line sql.y:1865 { yyVAL.str = Latin7Str } - case 278: + case 277: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1864 +//line sql.y:1869 { yyVAL.str = MacceStr } - case 279: + case 278: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1868 +//line sql.y:1873 { yyVAL.str = MacromanStr } - case 280: + case 279: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1872 +//line sql.y:1877 { yyVAL.str = SjisStr } - case 281: + case 280: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1876 +//line sql.y:1881 { yyVAL.str = Swe7Str } - case 282: + case 281: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1880 +//line sql.y:1885 { yyVAL.str = Tis620Str } - case 283: + case 282: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1884 +//line sql.y:1889 { yyVAL.str = Ucs2Str } - case 284: + case 283: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1888 +//line sql.y:1893 { yyVAL.str = UjisStr } - case 285: + case 284: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1892 +//line sql.y:1897 { yyVAL.str = Utf16Str } - case 286: + case 285: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1896 +//line sql.y:1901 { yyVAL.str = Utf16leStr } - case 287: + case 286: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1900 +//line sql.y:1905 { yyVAL.str = Utf32Str } - case 288: + case 287: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1904 +//line sql.y:1909 { yyVAL.str = Utf8mb3Str } - case 289: + case 288: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1908 +//line sql.y:1913 { yyVAL.str = Utf8mb4Str } - case 290: + case 289: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1912 +//line sql.y:1917 { yyVAL.str = Utf8mb3Str } - case 293: + case 292: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1922 +//line sql.y:1927 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 294: + case 293: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1926 +//line sql.y:1931 { yyLOCAL = NewFloatLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 295: + case 294: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1930 +//line sql.y:1935 { yyLOCAL = NewDecimalLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 296: + case 295: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1936 +//line sql.y:1941 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 297: + case 296: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1940 +//line sql.y:1945 { yyLOCAL = AppendString(yyDollar[1].exprUnion(), yyDollar[2].str) } yyVAL.union = yyLOCAL - case 298: + case 297: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1946 +//line sql.y:1951 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 299: + case 298: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1950 +//line sql.y:1955 { yyLOCAL = &UnaryExpr{Operator: NStringOp, Expr: NewStrLiteral(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 300: + case 299: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1954 +//line sql.y:1959 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewStrLiteral(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 301: + case 300: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1960 +//line sql.y:1965 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 302: + case 301: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1964 +//line sql.y:1969 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 303: + case 302: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1970 +//line sql.y:1975 { yyLOCAL = ColKeyPrimary } yyVAL.union = yyLOCAL - case 304: + case 303: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1974 +//line sql.y:1979 { yyLOCAL = ColKeyUnique } yyVAL.union = yyLOCAL - case 305: + case 304: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1978 +//line sql.y:1983 { yyLOCAL = ColKeyUniqueKey } yyVAL.union = yyLOCAL - case 306: + case 305: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1982 +//line sql.y:1987 { yyLOCAL = ColKey } yyVAL.union = yyLOCAL - case 307: + case 306: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1988 +//line sql.y:1993 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].booleanUnion() yyVAL.columnType.Zerofill = yyDollar[3].booleanUnion() } - case 311: + case 310: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1999 +//line sql.y:2004 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].intPtrUnion() } - case 312: + case 311: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2004 +//line sql.y:2009 { yyVAL.columnType = yyDollar[1].columnType } + case 312: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:2015 + { + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} + } case 313: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2010 +//line sql.y:2019 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 314: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2014 +//line sql.y:2023 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 315: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2018 +//line sql.y:2027 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 316: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2022 +//line sql.y:2031 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2026 +//line sql.y:2035 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 318: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2030 +//line sql.y:2039 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 319: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2034 +//line sql.y:2043 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 320: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2038 +//line sql.y:2047 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 321: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2042 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2053 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} + yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length + yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2048 +//line sql.y:2059 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12427,7 +12463,7 @@ yydefault: } case 323: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2054 +//line sql.y:2065 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12435,7 +12471,7 @@ yydefault: } case 324: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2060 +//line sql.y:2071 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12443,7 +12479,7 @@ yydefault: } case 325: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2066 +//line sql.y:2077 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12451,7 +12487,7 @@ yydefault: } case 326: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2072 +//line sql.y:2083 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -12459,213 +12495,211 @@ yydefault: } case 327: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2078 +//line sql.y:2089 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 328: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2084 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:2097 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} - yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length - yyVAL.columnType.Scale = yyDollar[2].LengthScaleOption.Scale } case 329: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2092 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2101 { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 330: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2096 +//line sql.y:2105 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 331: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2100 +//line sql.y:2109 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 332: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2104 +//line sql.y:2113 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 333: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2108 - { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} - } - case 334: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2114 +//line sql.y:2119 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } - case 335: + case 334: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2118 +//line sql.y:2123 { // CHAR BYTE is an alias for binary. See also: // https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html yyVAL.columnType = &ColumnType{Type: "binary", Length: yyDollar[2].intPtrUnion()} } - case 336: + case 335: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2124 +//line sql.y:2129 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } + case 336: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2133 + { + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} + } case 337: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2128 +//line sql.y:2137 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 338: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2132 +//line sql.y:2141 { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 339: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2136 +//line sql.y:2145 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 340: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2140 +//line sql.y:2149 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 341: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2144 +//line sql.y:2153 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} } case 342: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2148 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:2157 { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].columnCharset} + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 343: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2152 +//line sql.y:2161 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 344: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2156 +//line sql.y:2165 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 345: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2160 +//line sql.y:2169 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 346: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2164 +//line sql.y:2173 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 347: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2168 + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:2177 { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } case 348: - yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2172 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2181 { - yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} + yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } case 349: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2177 +//line sql.y:2186 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].columnCharset} } case 350: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2183 +//line sql.y:2192 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 351: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2187 +//line sql.y:2196 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 352: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2191 +//line sql.y:2200 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 353: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2195 +//line sql.y:2204 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 354: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2199 +//line sql.y:2208 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 355: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2203 +//line sql.y:2212 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 356: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2207 +//line sql.y:2216 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 357: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2211 +//line sql.y:2220 { yyVAL.columnType = &ColumnType{Type: string(yyDollar[1].str)} } case 358: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2217 +//line sql.y:2226 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, encodeSQLString(yyDollar[1].str)) } case 359: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2222 +//line sql.y:2231 { yyVAL.strs = append(yyDollar[1].strs, encodeSQLString(yyDollar[3].str)) } case 360: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *int -//line sql.y:2227 +//line sql.y:2236 { yyLOCAL = nil } @@ -12673,20 +12707,20 @@ yydefault: case 361: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *int -//line sql.y:2231 +//line sql.y:2240 { yyLOCAL = ptr.Of(convertStringToInt(yyDollar[2].str)) } yyVAL.union = yyLOCAL case 362: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2236 +//line sql.y:2245 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 363: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2240 +//line sql.y:2249 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), @@ -12695,13 +12729,13 @@ yydefault: } case 364: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2249 +//line sql.y:2258 { yyVAL.LengthScaleOption = yyDollar[1].LengthScaleOption } case 365: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2253 +//line sql.y:2262 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), @@ -12709,13 +12743,13 @@ yydefault: } case 366: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2260 +//line sql.y:2269 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 367: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2264 +//line sql.y:2273 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), @@ -12723,7 +12757,7 @@ yydefault: } case 368: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2270 +//line sql.y:2279 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: ptr.Of(convertStringToInt(yyDollar[2].str)), @@ -12733,7 +12767,7 @@ yydefault: case 369: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2278 +//line sql.y:2287 { yyLOCAL = false } @@ -12741,7 +12775,7 @@ yydefault: case 370: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2282 +//line sql.y:2291 { yyLOCAL = true } @@ -12749,7 +12783,7 @@ yydefault: case 371: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2286 +//line sql.y:2295 { yyLOCAL = false } @@ -12757,7 +12791,7 @@ yydefault: case 372: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2291 +//line sql.y:2300 { yyLOCAL = false } @@ -12765,66 +12799,66 @@ yydefault: case 373: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2295 +//line sql.y:2304 { yyLOCAL = true } yyVAL.union = yyLOCAL case 374: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2300 +//line sql.y:2309 { yyVAL.columnCharset = ColumnCharset{} } case 375: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2304 +//line sql.y:2313 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].identifierCI.String()), Binary: yyDollar[3].booleanUnion()} } case 376: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2308 +//line sql.y:2317 { yyVAL.columnCharset = ColumnCharset{Name: encodeSQLString(yyDollar[2].str), Binary: yyDollar[3].booleanUnion()} } case 377: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2312 +//line sql.y:2321 { yyVAL.columnCharset = ColumnCharset{Name: string(yyDollar[2].str)} } case 378: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2316 +//line sql.y:2325 { // ASCII: Shorthand for CHARACTER SET latin1. yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: yyDollar[2].booleanUnion()} } case 379: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2321 +//line sql.y:2330 { // UNICODE: Shorthand for CHARACTER SET ucs2. yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: yyDollar[2].booleanUnion()} } case 380: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2326 +//line sql.y:2335 { // BINARY: Shorthand for default CHARACTER SET but with binary collation yyVAL.columnCharset = ColumnCharset{Name: "", Binary: true} } case 381: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2331 +//line sql.y:2340 { // BINARY ASCII: Shorthand for CHARACTER SET latin1 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "latin1", Binary: true} } case 382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2336 +//line sql.y:2345 { // BINARY UNICODE: Shorthand for CHARACTER SET ucs2 with binary collation yyVAL.columnCharset = ColumnCharset{Name: "ucs2", Binary: true} @@ -12832,7 +12866,7 @@ yydefault: case 383: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2342 +//line sql.y:2351 { yyLOCAL = false } @@ -12840,33 +12874,33 @@ yydefault: case 384: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2346 +//line sql.y:2355 { yyLOCAL = true } yyVAL.union = yyLOCAL case 385: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2351 +//line sql.y:2360 { yyVAL.str = "" } case 386: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2355 +//line sql.y:2364 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } case 387: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2359 +//line sql.y:2368 { yyVAL.str = encodeSQLString(yyDollar[2].str) } case 388: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexDefinition -//line sql.y:2365 +//line sql.y:2374 { yyLOCAL = &IndexDefinition{Info: yyDollar[1].indexInfoUnion(), Columns: yyDollar[3].indexColumnsUnion(), Options: yyDollar[5].indexOptionsUnion()} } @@ -12874,7 +12908,7 @@ yydefault: case 389: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2370 +//line sql.y:2379 { yyLOCAL = nil } @@ -12882,7 +12916,7 @@ yydefault: case 390: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2374 +//line sql.y:2383 { yyLOCAL = yyDollar[1].indexOptionsUnion() } @@ -12890,14 +12924,14 @@ yydefault: case 391: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2380 +//line sql.y:2389 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL case 392: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2384 +//line sql.y:2393 { yySLICE := (*[]*IndexOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexOptionUnion()) @@ -12905,7 +12939,7 @@ yydefault: case 393: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2390 +//line sql.y:2399 { yyLOCAL = yyDollar[1].indexOptionUnion() } @@ -12913,7 +12947,7 @@ yydefault: case 394: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2394 +//line sql.y:2403 { // should not be string yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} @@ -12922,7 +12956,7 @@ yydefault: case 395: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2399 +//line sql.y:2408 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[2].str)} } @@ -12930,7 +12964,7 @@ yydefault: case 396: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2403 +//line sql.y:2412 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } @@ -12938,7 +12972,7 @@ yydefault: case 397: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2407 +//line sql.y:2416 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str)} } @@ -12946,7 +12980,7 @@ yydefault: case 398: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2411 +//line sql.y:2420 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str) + " " + string(yyDollar[2].str), String: yyDollar[3].identifierCI.String()} } @@ -12954,7 +12988,7 @@ yydefault: case 399: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2415 +//line sql.y:2424 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -12962,27 +12996,27 @@ yydefault: case 400: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2419 +//line sql.y:2428 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL case 401: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2425 +//line sql.y:2434 { yyVAL.str = "" } case 402: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2429 +//line sql.y:2438 { yyVAL.str = string(yyDollar[1].str) } case 403: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2435 +//line sql.y:2444 { yyLOCAL = &IndexInfo{Type: IndexTypePrimary, ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI("PRIMARY")} } @@ -12990,7 +13024,7 @@ yydefault: case 404: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2439 +//line sql.y:2448 { yyLOCAL = &IndexInfo{Type: IndexTypeSpatial, Name: NewIdentifierCI(yyDollar[3].str)} } @@ -12998,7 +13032,7 @@ yydefault: case 405: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2443 +//line sql.y:2452 { yyLOCAL = &IndexInfo{Type: IndexTypeFullText, Name: NewIdentifierCI(yyDollar[3].str)} } @@ -13006,7 +13040,7 @@ yydefault: case 406: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2447 +//line sql.y:2456 { yyLOCAL = &IndexInfo{Type: IndexTypeUnique, ConstraintName: NewIdentifierCI(yyDollar[1].str), Name: NewIdentifierCI(yyDollar[4].str)} } @@ -13014,100 +13048,100 @@ yydefault: case 407: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2451 +//line sql.y:2460 { yyLOCAL = &IndexInfo{Type: IndexTypeDefault, Name: NewIdentifierCI(yyDollar[2].str)} } yyVAL.union = yyLOCAL case 408: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2456 +//line sql.y:2465 { yyVAL.str = "" } case 409: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2460 +//line sql.y:2469 { yyVAL.str = yyDollar[2].str } case 410: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2466 +//line sql.y:2475 { yyVAL.str = string(yyDollar[1].str) } case 411: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2470 +//line sql.y:2479 { yyVAL.str = string(yyDollar[1].str) } case 412: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2474 +//line sql.y:2483 { yyVAL.str = string(yyDollar[1].str) } case 413: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2480 +//line sql.y:2489 { yyVAL.str = string(yyDollar[1].str) } case 414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2484 +//line sql.y:2493 { yyVAL.str = string(yyDollar[1].str) } case 415: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2489 +//line sql.y:2498 { yyVAL.str = "" } case 416: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2493 +//line sql.y:2502 { yyVAL.str = yyDollar[1].str } case 417: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2499 +//line sql.y:2508 { yyVAL.str = string(yyDollar[1].str) } case 418: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2503 +//line sql.y:2512 { yyVAL.str = string(yyDollar[1].str) } case 419: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2508 +//line sql.y:2517 { yyVAL.str = "" } case 420: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2512 +//line sql.y:2521 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } case 421: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexColumn -//line sql.y:2518 +//line sql.y:2527 { yyLOCAL = []*IndexColumn{yyDollar[1].indexColumnUnion()} } yyVAL.union = yyLOCAL case 422: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2522 +//line sql.y:2531 { yySLICE := (*[]*IndexColumn)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].indexColumnUnion()) @@ -13115,7 +13149,7 @@ yydefault: case 423: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2528 +//line sql.y:2537 { yyLOCAL = &IndexColumn{Column: yyDollar[1].identifierCI, Length: yyDollar[2].intPtrUnion(), Direction: yyDollar[3].orderDirectionUnion()} } @@ -13123,7 +13157,7 @@ yydefault: case 424: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2532 +//line sql.y:2541 { yyLOCAL = &IndexColumn{Expression: yyDollar[2].exprUnion(), Direction: yyDollar[4].orderDirectionUnion()} } @@ -13131,7 +13165,7 @@ yydefault: case 425: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2538 +//line sql.y:2547 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } @@ -13139,7 +13173,7 @@ yydefault: case 426: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2542 +//line sql.y:2551 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } @@ -13147,7 +13181,7 @@ yydefault: case 427: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2548 +//line sql.y:2557 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].identifierCI, Details: yyDollar[3].constraintInfoUnion()} } @@ -13155,7 +13189,7 @@ yydefault: case 428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2552 +//line sql.y:2561 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } @@ -13163,7 +13197,7 @@ yydefault: case 429: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2558 +//line sql.y:2567 { yyLOCAL = &ForeignKeyDefinition{IndexName: NewIdentifierCI(yyDollar[3].str), Source: yyDollar[5].columnsUnion(), ReferenceDefinition: yyDollar[7].referenceDefinitionUnion()} } @@ -13171,7 +13205,7 @@ yydefault: case 430: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2564 +//line sql.y:2573 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion()} } @@ -13179,7 +13213,7 @@ yydefault: case 431: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2568 +//line sql.y:2577 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion()} } @@ -13187,7 +13221,7 @@ yydefault: case 432: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2572 +//line sql.y:2581 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion()} } @@ -13195,7 +13229,7 @@ yydefault: case 433: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2576 +//line sql.y:2585 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnDelete: yyDollar[7].referenceActionUnion(), OnUpdate: yyDollar[8].referenceActionUnion()} } @@ -13203,7 +13237,7 @@ yydefault: case 434: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2580 +//line sql.y:2589 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), Match: yyDollar[6].matchActionUnion(), OnUpdate: yyDollar[7].referenceActionUnion(), OnDelete: yyDollar[8].referenceActionUnion()} } @@ -13211,7 +13245,7 @@ yydefault: case 435: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2585 +//line sql.y:2594 { yyLOCAL = nil } @@ -13219,7 +13253,7 @@ yydefault: case 436: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2589 +//line sql.y:2598 { yyLOCAL = yyDollar[1].referenceDefinitionUnion() } @@ -13227,7 +13261,7 @@ yydefault: case 437: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2595 +//line sql.y:2604 { yyLOCAL = &CheckConstraintDefinition{Expr: yyDollar[3].exprUnion(), Enforced: yyDollar[5].booleanUnion()} } @@ -13235,7 +13269,7 @@ yydefault: case 438: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2601 +//line sql.y:2610 { yyLOCAL = yyDollar[2].matchActionUnion() } @@ -13243,7 +13277,7 @@ yydefault: case 439: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2607 +//line sql.y:2616 { yyLOCAL = Full } @@ -13251,7 +13285,7 @@ yydefault: case 440: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2611 +//line sql.y:2620 { yyLOCAL = Partial } @@ -13259,7 +13293,7 @@ yydefault: case 441: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2615 +//line sql.y:2624 { yyLOCAL = Simple } @@ -13267,7 +13301,7 @@ yydefault: case 442: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2620 +//line sql.y:2629 { yyLOCAL = DefaultMatch } @@ -13275,7 +13309,7 @@ yydefault: case 443: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL MatchAction -//line sql.y:2624 +//line sql.y:2633 { yyLOCAL = yyDollar[1].matchActionUnion() } @@ -13283,7 +13317,7 @@ yydefault: case 444: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2630 +//line sql.y:2639 { yyLOCAL = yyDollar[3].referenceActionUnion() } @@ -13291,7 +13325,7 @@ yydefault: case 445: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2636 +//line sql.y:2645 { yyLOCAL = yyDollar[3].referenceActionUnion() } @@ -13299,7 +13333,7 @@ yydefault: case 446: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2642 +//line sql.y:2651 { yyLOCAL = Restrict } @@ -13307,7 +13341,7 @@ yydefault: case 447: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2646 +//line sql.y:2655 { yyLOCAL = Cascade } @@ -13315,7 +13349,7 @@ yydefault: case 448: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2650 +//line sql.y:2659 { yyLOCAL = NoAction } @@ -13323,7 +13357,7 @@ yydefault: case 449: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2654 +//line sql.y:2663 { yyLOCAL = SetDefault } @@ -13331,33 +13365,33 @@ yydefault: case 450: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2658 +//line sql.y:2667 { yyLOCAL = SetNull } yyVAL.union = yyLOCAL case 451: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2663 +//line sql.y:2672 { yyVAL.str = "" } case 452: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2667 +//line sql.y:2676 { yyVAL.str = string(yyDollar[1].str) } case 453: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2671 +//line sql.y:2680 { yyVAL.str = string(yyDollar[1].str) } case 454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2677 +//line sql.y:2686 { yyLOCAL = true } @@ -13365,7 +13399,7 @@ yydefault: case 455: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:2681 +//line sql.y:2690 { yyLOCAL = false } @@ -13373,7 +13407,7 @@ yydefault: case 456: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2686 +//line sql.y:2695 { yyLOCAL = true } @@ -13381,7 +13415,7 @@ yydefault: case 457: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2690 +//line sql.y:2699 { yyLOCAL = yyDollar[1].booleanUnion() } @@ -13389,7 +13423,7 @@ yydefault: case 458: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2695 +//line sql.y:2704 { yyLOCAL = nil } @@ -13397,7 +13431,7 @@ yydefault: case 459: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2699 +//line sql.y:2708 { yyLOCAL = yyDollar[1].tableOptionsUnion() } @@ -13405,21 +13439,21 @@ yydefault: case 460: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2705 +//line sql.y:2714 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL case 461: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2709 +//line sql.y:2718 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableOptionUnion()) } case 462: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2713 +//line sql.y:2722 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) @@ -13427,14 +13461,14 @@ yydefault: case 463: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2719 +//line sql.y:2728 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL case 464: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2723 +//line sql.y:2732 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) @@ -13442,7 +13476,7 @@ yydefault: case 465: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2729 +//line sql.y:2738 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13450,7 +13484,7 @@ yydefault: case 466: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2733 +//line sql.y:2742 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13458,7 +13492,7 @@ yydefault: case 467: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2737 +//line sql.y:2746 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13466,7 +13500,7 @@ yydefault: case 468: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2741 +//line sql.y:2750 { yyLOCAL = &TableOption{Name: (string(yyDollar[2].str)), String: yyDollar[4].str, CaseSensitive: true} } @@ -13474,7 +13508,7 @@ yydefault: case 469: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2745 +//line sql.y:2754 { yyLOCAL = &TableOption{Name: string(yyDollar[2].str), String: yyDollar[4].str, CaseSensitive: true} } @@ -13482,7 +13516,7 @@ yydefault: case 470: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2749 +//line sql.y:2758 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13490,7 +13524,7 @@ yydefault: case 471: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2753 +//line sql.y:2762 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13498,7 +13532,7 @@ yydefault: case 472: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2757 +//line sql.y:2766 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13506,7 +13540,7 @@ yydefault: case 473: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2761 +//line sql.y:2770 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13514,7 +13548,7 @@ yydefault: case 474: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2765 +//line sql.y:2774 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } @@ -13522,7 +13556,7 @@ yydefault: case 475: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2769 +//line sql.y:2778 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } @@ -13530,7 +13564,7 @@ yydefault: case 476: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2773 +//line sql.y:2782 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13538,7 +13572,7 @@ yydefault: case 477: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2777 +//line sql.y:2786 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13546,7 +13580,7 @@ yydefault: case 478: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2781 +//line sql.y:2790 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: yyDollar[3].identifierCS.String(), CaseSensitive: true} } @@ -13554,7 +13588,7 @@ yydefault: case 479: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2785 +//line sql.y:2794 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13562,7 +13596,7 @@ yydefault: case 480: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2789 +//line sql.y:2798 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13570,7 +13604,7 @@ yydefault: case 481: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2793 +//line sql.y:2802 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13578,7 +13612,7 @@ yydefault: case 482: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2797 +//line sql.y:2806 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13586,7 +13620,7 @@ yydefault: case 483: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2801 +//line sql.y:2810 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13594,7 +13628,7 @@ yydefault: case 484: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2805 +//line sql.y:2814 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13602,7 +13636,7 @@ yydefault: case 485: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2809 +//line sql.y:2818 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13610,7 +13644,7 @@ yydefault: case 486: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2813 +//line sql.y:2822 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13618,7 +13652,7 @@ yydefault: case 487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2817 +//line sql.y:2826 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13626,7 +13660,7 @@ yydefault: case 488: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2821 +//line sql.y:2830 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -13634,7 +13668,7 @@ yydefault: case 489: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2825 +//line sql.y:2834 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13642,7 +13676,7 @@ yydefault: case 490: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2829 +//line sql.y:2838 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13650,7 +13684,7 @@ yydefault: case 491: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2833 +//line sql.y:2842 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13658,7 +13692,7 @@ yydefault: case 492: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2837 +//line sql.y:2846 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -13666,7 +13700,7 @@ yydefault: case 493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2841 +//line sql.y:2850 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -13674,7 +13708,7 @@ yydefault: case 494: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2845 +//line sql.y:2854 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: (yyDollar[3].identifierCI.String() + yyDollar[4].str), CaseSensitive: true} } @@ -13682,63 +13716,63 @@ yydefault: case 495: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2849 +//line sql.y:2858 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Tables: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL case 496: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2854 +//line sql.y:2863 { yyVAL.str = "" } case 497: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2858 +//line sql.y:2867 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 498: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2862 +//line sql.y:2871 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 508: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2881 +//line sql.y:2890 { yyVAL.str = String(TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}) } case 509: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2885 +//line sql.y:2894 { yyVAL.str = yyDollar[1].identifierCI.String() } case 510: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2889 +//line sql.y:2898 { yyVAL.str = encodeSQLString(yyDollar[1].str) } case 511: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2893 +//line sql.y:2902 { yyVAL.str = string(yyDollar[1].str) } case 512: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2898 +//line sql.y:2907 { yyVAL.str = "" } case 514: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2904 +//line sql.y:2913 { yyLOCAL = false } @@ -13746,7 +13780,7 @@ yydefault: case 515: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2908 +//line sql.y:2917 { yyLOCAL = true } @@ -13754,7 +13788,7 @@ yydefault: case 516: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColName -//line sql.y:2913 +//line sql.y:2922 { yyLOCAL = nil } @@ -13762,27 +13796,27 @@ yydefault: case 517: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColName -//line sql.y:2917 +//line sql.y:2926 { yyLOCAL = yyDollar[2].colNameUnion() } yyVAL.union = yyLOCAL case 518: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2922 +//line sql.y:2931 { yyVAL.str = "" } case 519: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2926 +//line sql.y:2935 { yyVAL.str = string(yyDollar[2].str) } case 520: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:2931 +//line sql.y:2940 { yyLOCAL = nil } @@ -13790,7 +13824,7 @@ yydefault: case 521: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2935 +//line sql.y:2944 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } @@ -13798,7 +13832,7 @@ yydefault: case 522: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Literal -//line sql.y:2939 +//line sql.y:2948 { yyLOCAL = NewDecimalLiteral(yyDollar[2].str) } @@ -13806,7 +13840,7 @@ yydefault: case 523: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2944 +//line sql.y:2953 { yyLOCAL = nil } @@ -13814,14 +13848,14 @@ yydefault: case 524: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2948 +//line sql.y:2957 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL case 525: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2952 +//line sql.y:2961 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &OrderByOption{Cols: yyDollar[5].columnsUnion()}) @@ -13829,14 +13863,14 @@ yydefault: case 526: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2956 +//line sql.y:2965 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL case 527: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2960 +//line sql.y:2969 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionsUnion()...) @@ -13844,7 +13878,7 @@ yydefault: case 528: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2964 +//line sql.y:2973 { yyLOCAL = append(append(yyDollar[1].alterOptionsUnion(), yyDollar[3].alterOptionsUnion()...), &OrderByOption{Cols: yyDollar[7].columnsUnion()}) } @@ -13852,21 +13886,21 @@ yydefault: case 529: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2970 +//line sql.y:2979 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 530: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2974 +//line sql.y:2983 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } case 531: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2978 +//line sql.y:2987 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) @@ -13874,7 +13908,7 @@ yydefault: case 532: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2984 +//line sql.y:2993 { yyLOCAL = yyDollar[1].tableOptionsUnion() } @@ -13882,7 +13916,7 @@ yydefault: case 533: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2988 +//line sql.y:2997 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } @@ -13890,7 +13924,7 @@ yydefault: case 534: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2992 +//line sql.y:3001 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } @@ -13898,7 +13932,7 @@ yydefault: case 535: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2996 +//line sql.y:3005 { yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} } @@ -13906,7 +13940,7 @@ yydefault: case 536: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3000 +//line sql.y:3009 { yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} } @@ -13914,7 +13948,7 @@ yydefault: case 537: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3004 +//line sql.y:3013 { yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } @@ -13922,7 +13956,7 @@ yydefault: case 538: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3008 +//line sql.y:3017 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} } @@ -13930,7 +13964,7 @@ yydefault: case 539: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3012 +//line sql.y:3021 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion(), DefaultLiteral: true} } @@ -13938,7 +13972,7 @@ yydefault: case 540: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3016 +//line sql.y:3025 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} } @@ -13946,7 +13980,7 @@ yydefault: case 541: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3020 +//line sql.y:3029 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: ptr.Of(false)} } @@ -13954,7 +13988,7 @@ yydefault: case 542: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3024 +//line sql.y:3033 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), Invisible: ptr.Of(true)} } @@ -13962,7 +13996,7 @@ yydefault: case 543: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3028 +//line sql.y:3037 { yyLOCAL = &AlterCheck{Name: yyDollar[3].identifierCI, Enforced: yyDollar[4].booleanUnion()} } @@ -13970,7 +14004,7 @@ yydefault: case 544: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3032 +//line sql.y:3041 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: false} } @@ -13978,7 +14012,7 @@ yydefault: case 545: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3036 +//line sql.y:3045 { yyLOCAL = &AlterIndex{Name: yyDollar[3].identifierCI, Invisible: true} } @@ -13986,7 +14020,7 @@ yydefault: case 546: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3040 +//line sql.y:3049 { yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} } @@ -13994,7 +14028,7 @@ yydefault: case 547: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3044 +//line sql.y:3053 { yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } @@ -14002,7 +14036,7 @@ yydefault: case 548: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3048 +//line sql.y:3057 { yyLOCAL = &RenameColumn{OldName: yyDollar[3].colNameUnion(), NewName: yyDollar[5].colNameUnion()} } @@ -14010,7 +14044,7 @@ yydefault: case 549: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3052 +//line sql.y:3061 { yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} } @@ -14018,7 +14052,7 @@ yydefault: case 550: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3056 +//line sql.y:3065 { yyLOCAL = &KeyState{Enable: false} } @@ -14026,7 +14060,7 @@ yydefault: case 551: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3060 +//line sql.y:3069 { yyLOCAL = &KeyState{Enable: true} } @@ -14034,7 +14068,7 @@ yydefault: case 552: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3064 +//line sql.y:3073 { yyLOCAL = &TablespaceOperation{Import: false} } @@ -14042,7 +14076,7 @@ yydefault: case 553: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3068 +//line sql.y:3077 { yyLOCAL = &TablespaceOperation{Import: true} } @@ -14050,7 +14084,7 @@ yydefault: case 554: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3072 +//line sql.y:3081 { yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} } @@ -14058,7 +14092,7 @@ yydefault: case 555: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3076 +//line sql.y:3085 { yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].identifierCI} } @@ -14066,7 +14100,7 @@ yydefault: case 556: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3080 +//line sql.y:3089 { yyLOCAL = &DropKey{Type: PrimaryKeyType} } @@ -14074,7 +14108,7 @@ yydefault: case 557: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3084 +//line sql.y:3093 { yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].identifierCI} } @@ -14082,7 +14116,7 @@ yydefault: case 558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3088 +//line sql.y:3097 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } @@ -14090,7 +14124,7 @@ yydefault: case 559: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3092 +//line sql.y:3101 { yyLOCAL = &DropKey{Type: CheckKeyType, Name: yyDollar[3].identifierCI} } @@ -14098,7 +14132,7 @@ yydefault: case 560: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3096 +//line sql.y:3105 { yyLOCAL = &Force{} } @@ -14106,7 +14140,7 @@ yydefault: case 561: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3100 +//line sql.y:3109 { yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} } @@ -14114,7 +14148,7 @@ yydefault: case 562: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3104 +//line sql.y:3113 { yyLOCAL = &RenameIndex{OldName: yyDollar[3].identifierCI, NewName: yyDollar[5].identifierCI} } @@ -14122,14 +14156,14 @@ yydefault: case 563: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:3110 +//line sql.y:3119 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 564: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3114 +//line sql.y:3123 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) @@ -14137,7 +14171,7 @@ yydefault: case 565: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3120 +//line sql.y:3129 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -14145,7 +14179,7 @@ yydefault: case 566: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3124 +//line sql.y:3133 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -14153,7 +14187,7 @@ yydefault: case 567: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3128 +//line sql.y:3137 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -14161,7 +14195,7 @@ yydefault: case 568: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3132 +//line sql.y:3141 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -14169,7 +14203,7 @@ yydefault: case 569: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3136 +//line sql.y:3145 { yyLOCAL = &LockOption{Type: DefaultType} } @@ -14177,7 +14211,7 @@ yydefault: case 570: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3140 +//line sql.y:3149 { yyLOCAL = &LockOption{Type: NoneType} } @@ -14185,7 +14219,7 @@ yydefault: case 571: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3144 +//line sql.y:3153 { yyLOCAL = &LockOption{Type: SharedType} } @@ -14193,7 +14227,7 @@ yydefault: case 572: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3148 +//line sql.y:3157 { yyLOCAL = &LockOption{Type: ExclusiveType} } @@ -14201,7 +14235,7 @@ yydefault: case 573: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3152 +//line sql.y:3161 { yyLOCAL = &Validation{With: true} } @@ -14209,7 +14243,7 @@ yydefault: case 574: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:3156 +//line sql.y:3165 { yyLOCAL = &Validation{With: false} } @@ -14217,7 +14251,7 @@ yydefault: case 575: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3162 +//line sql.y:3171 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14228,7 +14262,7 @@ yydefault: case 576: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3169 +//line sql.y:3178 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14239,7 +14273,7 @@ yydefault: case 577: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3176 +//line sql.y:3185 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -14250,7 +14284,7 @@ yydefault: case 578: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3183 +//line sql.y:3192 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().PartitionSpec = yyDollar[2].partSpecUnion() @@ -14260,7 +14294,7 @@ yydefault: case 579: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:3189 +//line sql.y:3198 { yyLOCAL = &AlterView{ViewName: yyDollar[7].tableName, Comments: Comments(yyDollar[2].strs).Parsed(), Algorithm: yyDollar[3].str, Definer: yyDollar[4].definerUnion(), Security: yyDollar[5].str, Columns: yyDollar[8].columnsUnion(), Select: yyDollar[10].selStmtUnion(), CheckOption: yyDollar[11].str} } @@ -14268,7 +14302,7 @@ yydefault: case 580: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3199 +//line sql.y:3208 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -14279,7 +14313,7 @@ yydefault: case 581: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3206 +//line sql.y:3215 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].identifierCS @@ -14290,7 +14324,7 @@ yydefault: case 582: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3213 +//line sql.y:3222 { yyLOCAL = &AlterVschema{ Action: CreateVindexDDLAction, @@ -14306,7 +14340,7 @@ yydefault: case 583: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3225 +//line sql.y:3234 { yyLOCAL = &AlterVschema{ Action: DropVindexDDLAction, @@ -14320,7 +14354,7 @@ yydefault: case 584: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3235 +//line sql.y:3244 { yyLOCAL = &AlterVschema{Action: AddVschemaTableDDLAction, Table: yyDollar[6].tableName} } @@ -14328,7 +14362,7 @@ yydefault: case 585: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3239 +//line sql.y:3248 { yyLOCAL = &AlterVschema{Action: DropVschemaTableDDLAction, Table: yyDollar[6].tableName} } @@ -14336,7 +14370,7 @@ yydefault: case 586: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL Statement -//line sql.y:3243 +//line sql.y:3252 { yyLOCAL = &AlterVschema{ Action: AddColVindexDDLAction, @@ -14353,7 +14387,7 @@ yydefault: case 587: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:3256 +//line sql.y:3265 { yyLOCAL = &AlterVschema{ Action: DropColVindexDDLAction, @@ -14367,7 +14401,7 @@ yydefault: case 588: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3266 +//line sql.y:3275 { yyLOCAL = &AlterVschema{Action: AddSequenceDDLAction, Table: yyDollar[6].tableName} } @@ -14375,7 +14409,7 @@ yydefault: case 589: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3270 +//line sql.y:3279 { yyLOCAL = &AlterVschema{Action: DropSequenceDDLAction, Table: yyDollar[6].tableName} } @@ -14383,7 +14417,7 @@ yydefault: case 590: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:3274 +//line sql.y:3283 { yyLOCAL = &AlterVschema{ Action: AddAutoIncDDLAction, @@ -14398,7 +14432,7 @@ yydefault: case 591: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3285 +//line sql.y:3294 { yyLOCAL = &AlterVschema{ Action: DropAutoIncDDLAction, @@ -14409,7 +14443,7 @@ yydefault: case 592: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3292 +//line sql.y:3301 { yyLOCAL = &AlterMigration{ Type: RetryMigrationType, @@ -14420,7 +14454,7 @@ yydefault: case 593: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3299 +//line sql.y:3308 { yyLOCAL = &AlterMigration{ Type: CleanupMigrationType, @@ -14431,7 +14465,17 @@ yydefault: case 594: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3306 +//line sql.y:3315 + { + yyLOCAL = &AlterMigration{ + Type: CleanupAllMigrationType, + } + } + yyVAL.union = yyLOCAL + case 595: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL Statement +//line sql.y:3321 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -14439,10 +14483,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 595: + case 596: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3313 +//line sql.y:3328 { yyLOCAL = &AlterMigration{ Type: LaunchMigrationType, @@ -14451,20 +14495,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 596: + case 597: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3321 +//line sql.y:3336 { yyLOCAL = &AlterMigration{ Type: LaunchAllMigrationType, } } yyVAL.union = yyLOCAL - case 597: + case 598: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3327 +//line sql.y:3342 { yyLOCAL = &AlterMigration{ Type: CompleteMigrationType, @@ -14472,20 +14516,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 598: + case 599: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3334 +//line sql.y:3349 { yyLOCAL = &AlterMigration{ Type: CompleteAllMigrationType, } } yyVAL.union = yyLOCAL - case 599: + case 600: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3340 +//line sql.y:3355 { yyLOCAL = &AlterMigration{ Type: CancelMigrationType, @@ -14493,20 +14537,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 600: + case 601: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3347 +//line sql.y:3362 { yyLOCAL = &AlterMigration{ Type: CancelAllMigrationType, } } yyVAL.union = yyLOCAL - case 601: + case 602: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3353 +//line sql.y:3368 { yyLOCAL = &AlterMigration{ Type: ThrottleMigrationType, @@ -14516,10 +14560,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 602: + case 603: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3362 +//line sql.y:3377 { yyLOCAL = &AlterMigration{ Type: ThrottleAllMigrationType, @@ -14528,10 +14572,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 603: + case 604: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3370 +//line sql.y:3385 { yyLOCAL = &AlterMigration{ Type: UnthrottleMigrationType, @@ -14539,20 +14583,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 604: + case 605: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3377 +//line sql.y:3392 { yyLOCAL = &AlterMigration{ Type: UnthrottleAllMigrationType, } } yyVAL.union = yyLOCAL - case 605: + case 606: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3383 +//line sql.y:3398 { yyLOCAL = &AlterMigration{ Type: ForceCutOverMigrationType, @@ -14560,28 +14604,28 @@ yydefault: } } yyVAL.union = yyLOCAL - case 606: + case 607: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3390 +//line sql.y:3405 { yyLOCAL = &AlterMigration{ Type: ForceCutOverAllMigrationType, } } yyVAL.union = yyLOCAL - case 607: + case 608: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3397 +//line sql.y:3412 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 608: + case 609: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3401 +//line sql.y:3416 { yyDollar[3].partitionOptionUnion().Partitions = yyDollar[4].integerUnion() yyDollar[3].partitionOptionUnion().SubPartition = yyDollar[5].subPartitionUnion() @@ -14589,10 +14633,10 @@ yydefault: yyLOCAL = yyDollar[3].partitionOptionUnion() } yyVAL.union = yyLOCAL - case 609: + case 610: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3410 +//line sql.y:3425 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -14601,10 +14645,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 610: + case 611: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3418 +//line sql.y:3433 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -14614,10 +14658,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 611: + case 612: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3427 +//line sql.y:3442 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -14625,10 +14669,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 612: + case 613: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:3434 +//line sql.y:3449 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -14636,18 +14680,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 613: + case 614: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3442 +//line sql.y:3457 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 614: + case 615: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3446 +//line sql.y:3461 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -14657,10 +14701,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 615: + case 616: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:3455 +//line sql.y:3470 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -14671,678 +14715,678 @@ yydefault: } } yyVAL.union = yyLOCAL - case 616: + case 617: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3466 +//line sql.y:3481 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 617: + case 618: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3470 +//line sql.y:3485 { yyLOCAL = yyDollar[2].partDefsUnion() } yyVAL.union = yyLOCAL - case 618: + case 619: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3475 +//line sql.y:3490 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 619: + case 620: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3479 +//line sql.y:3494 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 620: + case 621: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3484 +//line sql.y:3499 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 621: + case 622: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3488 +//line sql.y:3503 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 622: + case 623: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL TableExpr -//line sql.y:3494 +//line sql.y:3509 { yyLOCAL = &JSONTableExpr{Expr: yyDollar[3].exprUnion(), Filter: yyDollar[5].exprUnion(), Columns: yyDollar[6].jtColumnListUnion(), Alias: yyDollar[8].identifierCS} } yyVAL.union = yyLOCAL - case 623: + case 624: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3500 +//line sql.y:3515 { yyLOCAL = yyDollar[3].jtColumnListUnion() } yyVAL.union = yyLOCAL - case 624: + case 625: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:3506 +//line sql.y:3521 { yyLOCAL = []*JtColumnDefinition{yyDollar[1].jtColumnDefinitionUnion()} } yyVAL.union = yyLOCAL - case 625: + case 626: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3510 +//line sql.y:3525 { yySLICE := (*[]*JtColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jtColumnDefinitionUnion()) } - case 626: + case 627: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3516 +//line sql.y:3531 { yyLOCAL = &JtColumnDefinition{JtOrdinal: &JtOrdinalColDef{Name: yyDollar[1].identifierCI}} } yyVAL.union = yyLOCAL - case 627: + case 628: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3520 +//line sql.y:3535 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 628: + case 629: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3526 +//line sql.y:3541 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 629: + case 630: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3532 +//line sql.y:3547 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 630: + case 631: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3538 +//line sql.y:3553 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].identifierCI, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} yyLOCAL = &JtColumnDefinition{JtPath: jtPath} } yyVAL.union = yyLOCAL - case 631: + case 632: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3544 +//line sql.y:3559 { jtNestedPath := &JtNestedPathColDef{Path: yyDollar[3].exprUnion(), Columns: yyDollar[4].jtColumnListUnion()} yyLOCAL = &JtColumnDefinition{JtNestedPath: jtNestedPath} } yyVAL.union = yyLOCAL - case 632: + case 633: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3550 +//line sql.y:3565 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 633: + case 634: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3554 +//line sql.y:3569 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 634: + case 635: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3558 +//line sql.y:3573 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 635: + case 636: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3562 +//line sql.y:3577 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 636: + case 637: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3568 +//line sql.y:3583 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 637: + case 638: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3574 +//line sql.y:3589 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } yyVAL.union = yyLOCAL - case 638: + case 639: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3580 +//line sql.y:3595 { yyLOCAL = &JtOnResponse{ResponseType: ErrorJSONType} } yyVAL.union = yyLOCAL - case 639: + case 640: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3584 +//line sql.y:3599 { yyLOCAL = &JtOnResponse{ResponseType: NullJSONType} } yyVAL.union = yyLOCAL - case 640: + case 641: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3588 +//line sql.y:3603 { yyLOCAL = &JtOnResponse{ResponseType: DefaultJSONType, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 641: + case 642: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3594 +//line sql.y:3609 { yyLOCAL = RangeType } yyVAL.union = yyLOCAL - case 642: + case 643: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3598 +//line sql.y:3613 { yyLOCAL = ListType } yyVAL.union = yyLOCAL - case 643: + case 644: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3603 +//line sql.y:3618 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 644: + case 645: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3607 +//line sql.y:3622 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 645: + case 646: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3612 +//line sql.y:3627 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 646: + case 647: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3616 +//line sql.y:3631 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 647: + case 648: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3622 +//line sql.y:3637 { yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} } yyVAL.union = yyLOCAL - case 648: + case 649: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3626 +//line sql.y:3641 { yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 649: + case 650: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3630 +//line sql.y:3645 { yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} } yyVAL.union = yyLOCAL - case 650: + case 651: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3634 +//line sql.y:3649 { yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 651: + case 652: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3638 +//line sql.y:3653 { yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} } yyVAL.union = yyLOCAL - case 652: + case 653: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3642 +//line sql.y:3657 { yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 653: + case 654: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3646 +//line sql.y:3661 { yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} } yyVAL.union = yyLOCAL - case 654: + case 655: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3650 +//line sql.y:3665 { yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 655: + case 656: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3654 +//line sql.y:3669 { yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} } yyVAL.union = yyLOCAL - case 656: + case 657: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3658 +//line sql.y:3673 { yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 657: + case 658: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3662 +//line sql.y:3677 { yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].identifierCI}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} } yyVAL.union = yyLOCAL - case 658: + case 659: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3666 +//line sql.y:3681 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 659: + case 660: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3670 +//line sql.y:3685 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} } yyVAL.union = yyLOCAL - case 660: + case 661: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3674 +//line sql.y:3689 { yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 661: + case 662: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3678 +//line sql.y:3693 { yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} } yyVAL.union = yyLOCAL - case 662: + case 663: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3682 +//line sql.y:3697 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 663: + case 664: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3686 +//line sql.y:3701 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} } yyVAL.union = yyLOCAL - case 664: + case 665: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3690 +//line sql.y:3705 { yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 665: + case 666: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3694 +//line sql.y:3709 { yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} } yyVAL.union = yyLOCAL - case 666: + case 667: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3698 +//line sql.y:3713 { yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} } yyVAL.union = yyLOCAL - case 667: + case 668: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3702 +//line sql.y:3717 { yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} } yyVAL.union = yyLOCAL - case 668: + case 669: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3706 +//line sql.y:3721 { yyLOCAL = &PartitionSpec{Action: UpgradeAction} } yyVAL.union = yyLOCAL - case 669: + case 670: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3711 +//line sql.y:3726 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 670: + case 671: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3715 +//line sql.y:3730 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 671: + case 672: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3719 +//line sql.y:3734 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 672: + case 673: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3725 +//line sql.y:3740 { yyLOCAL = []*PartitionDefinition{yyDollar[1].partDefUnion()} } yyVAL.union = yyLOCAL - case 673: + case 674: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3729 +//line sql.y:3744 { yySLICE := (*[]*PartitionDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].partDefUnion()) } - case 674: + case 675: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3735 +//line sql.y:3750 { yyVAL.partDefUnion().Options = yyDollar[2].partitionDefinitionOptionsUnion() } - case 675: + case 676: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3740 +//line sql.y:3755 { yyLOCAL = &PartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 676: + case 677: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3744 +//line sql.y:3759 { yyDollar[1].partitionDefinitionOptionsUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 677: + case 678: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3749 +//line sql.y:3764 { yyDollar[1].partitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 678: + case 679: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3754 +//line sql.y:3769 { yyDollar[1].partitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 679: + case 680: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3759 +//line sql.y:3774 { yyDollar[1].partitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 680: + case 681: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3764 +//line sql.y:3779 { yyDollar[1].partitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 681: + case 682: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3769 +//line sql.y:3784 { yyDollar[1].partitionDefinitionOptionsUnion().MaxRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 682: + case 683: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3774 +//line sql.y:3789 { yyDollar[1].partitionDefinitionOptionsUnion().MinRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 683: + case 684: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3779 +//line sql.y:3794 { yyDollar[1].partitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 684: + case 685: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinitionOptions -//line sql.y:3784 +//line sql.y:3799 { yyDollar[1].partitionDefinitionOptionsUnion().SubPartitionDefinitions = yyDollar[2].subPartitionDefinitionsUnion() yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 685: + case 686: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3790 +//line sql.y:3805 { yyLOCAL = yyDollar[2].subPartitionDefinitionsUnion() } yyVAL.union = yyLOCAL - case 686: + case 687: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SubPartitionDefinitions -//line sql.y:3796 +//line sql.y:3811 { yyLOCAL = SubPartitionDefinitions{yyDollar[1].subPartitionDefinitionUnion()} } yyVAL.union = yyLOCAL - case 687: + case 688: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3800 +//line sql.y:3815 { yySLICE := (*SubPartitionDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].subPartitionDefinitionUnion()) } - case 688: + case 689: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SubPartitionDefinition -//line sql.y:3806 +//line sql.y:3821 { yyLOCAL = &SubPartitionDefinition{Name: yyDollar[2].identifierCI, Options: yyDollar[3].subPartitionDefinitionOptionsUnion()} } yyVAL.union = yyLOCAL - case 689: + case 690: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3811 +//line sql.y:3826 { yyLOCAL = &SubPartitionDefinitionOptions{} } yyVAL.union = yyLOCAL - case 690: + case 691: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3815 +//line sql.y:3830 { yyDollar[1].subPartitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 691: + case 692: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3820 +//line sql.y:3835 { yyDollar[1].subPartitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 692: + case 693: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3825 +//line sql.y:3840 { yyDollar[1].subPartitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 693: + case 694: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3830 +//line sql.y:3845 { yyDollar[1].subPartitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 694: + case 695: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3835 +//line sql.y:3850 { yyDollar[1].subPartitionDefinitionOptionsUnion().MaxRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 695: + case 696: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3840 +//line sql.y:3855 { yyDollar[1].subPartitionDefinitionOptionsUnion().MinRows = ptr.Of(yyDollar[2].integerUnion()) yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 696: + case 697: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SubPartitionDefinitionOptions -//line sql.y:3845 +//line sql.y:3860 { yyDollar[1].subPartitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str yyLOCAL = yyDollar[1].subPartitionDefinitionOptionsUnion() } yyVAL.union = yyLOCAL - case 697: + case 698: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3852 +//line sql.y:3867 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -15350,10 +15394,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 698: + case 699: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3859 +//line sql.y:3874 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -15361,10 +15405,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 699: + case 700: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3866 +//line sql.y:3881 { yyLOCAL = &PartitionValueRange{ Type: InType, @@ -15372,1461 +15416,1511 @@ yydefault: } } yyVAL.union = yyLOCAL - case 700: + case 701: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3874 +//line sql.y:3889 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 701: + case 702: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3878 +//line sql.y:3893 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 702: + case 703: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionEngine -//line sql.y:3884 +//line sql.y:3899 { yyLOCAL = &PartitionEngine{Storage: yyDollar[1].booleanUnion(), Name: yyDollar[4].identifierCS.String()} } yyVAL.union = yyLOCAL - case 703: + case 704: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:3890 +//line sql.y:3905 { yyLOCAL = NewStrLiteral(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 704: + case 705: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3896 +//line sql.y:3911 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 705: + case 706: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Literal -//line sql.y:3902 +//line sql.y:3917 { yyLOCAL = NewStrLiteral(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 706: + case 707: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3908 +//line sql.y:3923 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 707: + case 708: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:3914 +//line sql.y:3929 { yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 708: + case 709: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3920 +//line sql.y:3935 { yyVAL.str = yyDollar[3].identifierCS.String() } - case 709: + case 710: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinition -//line sql.y:3926 +//line sql.y:3941 { yyLOCAL = &PartitionDefinition{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 710: + case 711: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3932 +//line sql.y:3947 { yyVAL.str = "" } - case 711: + case 712: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3936 +//line sql.y:3951 { yyVAL.str = "" } - case 712: + case 713: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3942 +//line sql.y:3957 { yyLOCAL = &RenameTable{TablePairs: yyDollar[3].renameTablePairsUnion()} } yyVAL.union = yyLOCAL - case 713: + case 714: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*RenameTablePair -//line sql.y:3948 +//line sql.y:3963 { yyLOCAL = []*RenameTablePair{{FromTable: yyDollar[1].tableName, ToTable: yyDollar[3].tableName}} } yyVAL.union = yyLOCAL - case 714: + case 715: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3952 +//line sql.y:3967 { yySLICE := (*[]*RenameTablePair)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &RenameTablePair{FromTable: yyDollar[3].tableName, ToTable: yyDollar[5].tableName}) } - case 715: + case 716: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3958 +//line sql.y:3973 { yyLOCAL = &DropTable{FromTables: yyDollar[6].tableNamesUnion(), IfExists: yyDollar[5].booleanUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Temp: yyDollar[3].booleanUnion()} } yyVAL.union = yyLOCAL - case 716: + case 717: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3962 +//line sql.y:3977 { // Change this to an alter statement if yyDollar[4].identifierCI.Lowered() == "primary" { - yyLOCAL = &AlterTable{FullyParsed: true, Table: yyDollar[6].tableName, AlterOptions: append([]AlterOption{&DropKey{Type: PrimaryKeyType}}, yyDollar[7].alterOptionsUnion()...)} + yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), FullyParsed: true, Table: yyDollar[6].tableName, AlterOptions: append([]AlterOption{&DropKey{Type: PrimaryKeyType}}, yyDollar[7].alterOptionsUnion()...)} } else { - yyLOCAL = &AlterTable{FullyParsed: true, Table: yyDollar[6].tableName, AlterOptions: append([]AlterOption{&DropKey{Type: NormalKeyType, Name: yyDollar[4].identifierCI}}, yyDollar[7].alterOptionsUnion()...)} + yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), FullyParsed: true, Table: yyDollar[6].tableName, AlterOptions: append([]AlterOption{&DropKey{Type: NormalKeyType, Name: yyDollar[4].identifierCI}}, yyDollar[7].alterOptionsUnion()...)} } } yyVAL.union = yyLOCAL - case 717: + case 718: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3971 +//line sql.y:3986 { yyLOCAL = &DropView{FromTables: yyDollar[5].tableNamesUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 718: + case 719: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3975 +//line sql.y:3990 { yyLOCAL = &DropDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].identifierCS, IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 719: + case 720: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3981 +//line sql.y:3996 { yyLOCAL = &TruncateTable{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 720: + case 721: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3985 +//line sql.y:4000 { yyLOCAL = &TruncateTable{Table: yyDollar[2].tableName} } yyVAL.union = yyLOCAL - case 721: + case 722: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3991 +//line sql.y:4006 { yyLOCAL = &Analyze{IsLocal: yyDollar[2].booleanUnion(), Table: yyDollar[4].tableName} } yyVAL.union = yyLOCAL - case 722: + case 723: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3997 +//line sql.y:4012 { yyLOCAL = &PurgeBinaryLogs{To: string(yyDollar[5].str)} } yyVAL.union = yyLOCAL - case 723: + case 724: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4001 +//line sql.y:4016 { yyLOCAL = &PurgeBinaryLogs{Before: string(yyDollar[5].str)} } yyVAL.union = yyLOCAL - case 724: + case 725: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4007 +//line sql.y:4022 { yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 725: + case 726: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4011 +//line sql.y:4026 { yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 726: + case 727: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4015 +//line sql.y:4030 { yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 727: + case 728: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4019 +//line sql.y:4034 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 728: + case 729: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4023 +//line sql.y:4038 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 729: + case 730: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4027 +//line sql.y:4042 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 730: + case 731: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4031 +//line sql.y:4046 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 731: + case 732: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4035 +//line sql.y:4050 { yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 732: + case 733: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4039 +//line sql.y:4054 { yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].identifierCS, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 733: + case 734: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4043 +//line sql.y:4058 { yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 734: + case 735: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4047 +//line sql.y:4062 { yyLOCAL = &Show{&ShowBasic{Command: Privilege}} } yyVAL.union = yyLOCAL - case 735: + case 736: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4051 +//line sql.y:4066 { yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 736: + case 737: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4055 +//line sql.y:4070 { yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 737: + case 738: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4059 +//line sql.y:4074 { yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 738: + case 739: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4063 +//line sql.y:4078 { yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 739: + case 740: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4067 +//line sql.y:4082 { yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 740: + case 741: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4071 +//line sql.y:4086 { yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 741: + case 742: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4075 +//line sql.y:4090 { yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].identifierCS, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 742: + case 743: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4079 +//line sql.y:4094 { yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].identifierCS, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 743: + case 744: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4083 +//line sql.y:4098 { yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 744: + case 745: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4087 +//line sql.y:4102 { yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 745: + case 746: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4091 +//line sql.y:4106 { yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 746: + case 747: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4095 +//line sql.y:4110 { yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 747: + case 748: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4099 +//line sql.y:4114 { yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 748: + case 749: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4103 +//line sql.y:4118 { yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 749: + case 750: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4107 +//line sql.y:4122 { yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 750: + case 751: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4111 +//line sql.y:4126 { yyLOCAL = &Show{&ShowBasic{Command: Engines}} } yyVAL.union = yyLOCAL - case 751: + case 752: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4115 +//line sql.y:4130 { yyLOCAL = &Show{&ShowBasic{Command: Plugins}} } yyVAL.union = yyLOCAL - case 752: + case 753: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4119 +//line sql.y:4134 { yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL - case 753: + case 754: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4123 +//line sql.y:4138 { yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].identifierCS}} } yyVAL.union = yyLOCAL - case 754: + case 755: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4127 +//line sql.y:4142 { yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 755: + case 756: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4131 +//line sql.y:4146 { yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 756: + case 757: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4135 +//line sql.y:4150 { yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 757: + case 758: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4139 +//line sql.y:4154 { yyLOCAL = &ShowThrottledApps{} } yyVAL.union = yyLOCAL - case 758: + case 759: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4143 +//line sql.y:4158 { yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 759: + case 760: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4147 +//line sql.y:4162 { yyLOCAL = &ShowThrottlerStatus{} } yyVAL.union = yyLOCAL - case 760: + case 761: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4151 +//line sql.y:4166 { yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} } yyVAL.union = yyLOCAL - case 761: + case 762: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4155 +//line sql.y:4170 { yyLOCAL = &Show{&ShowBasic{Command: VschemaKeyspaces}} } yyVAL.union = yyLOCAL - case 762: + case 763: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4159 +//line sql.y:4174 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } yyVAL.union = yyLOCAL - case 763: + case 764: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4163 +//line sql.y:4178 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } yyVAL.union = yyLOCAL - case 764: + case 765: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4167 +//line sql.y:4182 { yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } yyVAL.union = yyLOCAL - case 765: + case 766: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4171 +//line sql.y:4186 { yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 766: + case 767: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4175 +//line sql.y:4190 { yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 767: + case 768: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4179 +//line sql.y:4194 { yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } yyVAL.union = yyLOCAL - case 768: + case 769: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4186 +//line sql.y:4201 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} } yyVAL.union = yyLOCAL - case 769: + case 770: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4190 +//line sql.y:4205 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 770: + case 771: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4194 +//line sql.y:4209 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} } yyVAL.union = yyLOCAL - case 771: + case 772: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4198 +//line sql.y:4213 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 772: + case 773: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4202 +//line sql.y:4217 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL - case 773: + case 774: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4206 +//line sql.y:4221 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL - case 774: + case 775: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4210 +//line sql.y:4225 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL - case 775: + case 776: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4214 +//line sql.y:4229 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 776: + case 777: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL Statement +//line sql.y:4233 + { + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + } + yyVAL.union = yyLOCAL + case 778: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL Statement +//line sql.y:4237 + { + yyLOCAL = &Show{&ShowTransactionStatus{TransactionID: string(yyDollar[5].str)}} + } + yyVAL.union = yyLOCAL + case 779: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4218 +//line sql.y:4241 + { + yyLOCAL = &Show{&ShowTransactionStatus{}} + } + yyVAL.union = yyLOCAL + case 780: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL Statement +//line sql.y:4245 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + yyLOCAL = &Show{&ShowTransactionStatus{Keyspace: yyDollar[5].identifierCS.String()}} } yyVAL.union = yyLOCAL - case 777: + case 781: + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:4250 + { + } + case 782: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4252 + { + } + case 783: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4224 +//line sql.y:4256 { yyVAL.str = "" } - case 778: + case 784: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4228 +//line sql.y:4260 { yyVAL.str = "extended " } - case 779: + case 785: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4234 +//line sql.y:4266 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 780: + case 786: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4238 +//line sql.y:4270 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 781: + case 787: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4244 +//line sql.y:4276 { yyVAL.str = string(yyDollar[1].str) } - case 782: + case 788: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4248 +//line sql.y:4280 { yyVAL.str = string(yyDollar[1].str) } - case 783: + case 789: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4254 +//line sql.y:4286 { yyVAL.identifierCS = NewIdentifierCS("") } - case 784: + case 790: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4258 +//line sql.y:4290 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 785: + case 791: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4262 +//line sql.y:4294 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 786: + case 792: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4268 +//line sql.y:4300 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 787: + case 793: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4272 +//line sql.y:4304 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 788: + case 794: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4276 +//line sql.y:4308 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 789: + case 795: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4282 +//line sql.y:4314 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 790: + case 796: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4286 +//line sql.y:4318 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 791: + case 797: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4292 +//line sql.y:4324 { yyVAL.empty = struct{}{} } - case 792: + case 798: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4296 +//line sql.y:4328 { yyVAL.empty = struct{}{} } - case 793: + case 799: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4300 +//line sql.y:4332 { yyVAL.empty = struct{}{} } - case 794: + case 800: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4306 +//line sql.y:4338 { yyVAL.str = string(yyDollar[1].str) } - case 795: + case 801: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4310 +//line sql.y:4342 { yyVAL.str = string(yyDollar[1].str) } - case 796: + case 802: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4316 +//line sql.y:4348 { yyLOCAL = &Use{DBName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 797: + case 803: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4320 +//line sql.y:4352 { yyLOCAL = &Use{DBName: IdentifierCS{v: ""}} } yyVAL.union = yyLOCAL - case 798: + case 804: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4324 +//line sql.y:4356 { yyLOCAL = &Use{DBName: NewIdentifierCS(yyDollar[2].identifierCS.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL - case 799: + case 805: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4331 +//line sql.y:4363 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 800: + case 806: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4335 +//line sql.y:4367 { yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) } - case 801: + case 807: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4339 +//line sql.y:4371 { yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) } - case 802: + case 808: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4343 +//line sql.y:4375 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 803: + case 809: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4350 +//line sql.y:4382 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 804: + case 810: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4354 +//line sql.y:4386 { yyLOCAL = &Begin{TxAccessModes: yyDollar[3].txAccessModesUnion()} } yyVAL.union = yyLOCAL - case 805: + case 811: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4359 +//line sql.y:4391 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 806: + case 812: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4363 +//line sql.y:4395 { yyLOCAL = yyDollar[1].txAccessModesUnion() } yyVAL.union = yyLOCAL - case 807: + case 813: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4369 +//line sql.y:4401 { yyLOCAL = []TxAccessMode{yyDollar[1].txAccessModeUnion()} } yyVAL.union = yyLOCAL - case 808: + case 814: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4373 +//line sql.y:4405 { yySLICE := (*[]TxAccessMode)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].txAccessModeUnion()) } - case 809: + case 815: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4379 +//line sql.y:4411 { yyLOCAL = WithConsistentSnapshot } yyVAL.union = yyLOCAL - case 810: + case 816: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4383 +//line sql.y:4415 { yyLOCAL = ReadWrite } yyVAL.union = yyLOCAL - case 811: + case 817: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4387 +//line sql.y:4419 { yyLOCAL = ReadOnly } yyVAL.union = yyLOCAL - case 812: + case 818: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4394 +//line sql.y:4426 { yyLOCAL = &Commit{} } yyVAL.union = yyLOCAL - case 813: + case 819: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4400 +//line sql.y:4432 { yyLOCAL = &Rollback{} } yyVAL.union = yyLOCAL - case 814: + case 820: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4404 +//line sql.y:4436 { yyLOCAL = &SRollback{Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 815: + case 821: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4409 +//line sql.y:4441 { yyVAL.empty = struct{}{} } - case 816: + case 822: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4411 +//line sql.y:4443 { yyVAL.empty = struct{}{} } - case 817: + case 823: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4414 +//line sql.y:4446 { yyVAL.empty = struct{}{} } - case 818: + case 824: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4416 +//line sql.y:4448 { yyVAL.empty = struct{}{} } - case 819: + case 825: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4420 +//line sql.y:4452 { yyLOCAL = &Savepoint{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 820: + case 826: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4426 +//line sql.y:4458 { yyLOCAL = &Release{Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 821: + case 827: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4431 +//line sql.y:4463 { yyLOCAL = EmptyType } yyVAL.union = yyLOCAL - case 822: + case 828: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4435 +//line sql.y:4467 { yyLOCAL = JSONType } yyVAL.union = yyLOCAL - case 823: + case 829: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4439 +//line sql.y:4471 { yyLOCAL = TreeType } yyVAL.union = yyLOCAL - case 824: + case 830: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4443 +//line sql.y:4475 { yyLOCAL = TraditionalType } yyVAL.union = yyLOCAL - case 825: + case 831: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ExplainType -//line sql.y:4447 +//line sql.y:4479 { yyLOCAL = AnalyzeType } yyVAL.union = yyLOCAL - case 826: + case 832: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4452 +//line sql.y:4484 { yyLOCAL = PlanVExplainType } yyVAL.union = yyLOCAL - case 827: + case 833: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4456 +//line sql.y:4488 { yyLOCAL = PlanVExplainType } yyVAL.union = yyLOCAL - case 828: + case 834: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4460 +//line sql.y:4492 { yyLOCAL = AllVExplainType } yyVAL.union = yyLOCAL - case 829: + case 835: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL VExplainType -//line sql.y:4464 +//line sql.y:4496 { yyLOCAL = QueriesVExplainType } yyVAL.union = yyLOCAL - case 830: + case 836: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL VExplainType +//line sql.y:4500 + { + yyLOCAL = TraceVExplainType + } + yyVAL.union = yyLOCAL + case 837: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL VExplainType +//line sql.y:4504 + { + yyLOCAL = KeysVExplainType + } + yyVAL.union = yyLOCAL + case 838: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4470 +//line sql.y:4510 { yyVAL.str = yyDollar[1].str } - case 831: + case 839: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4474 +//line sql.y:4514 { yyVAL.str = yyDollar[1].str } - case 832: + case 840: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4478 +//line sql.y:4518 { yyVAL.str = yyDollar[1].str } - case 833: + case 841: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4484 +//line sql.y:4524 { yyLOCAL = yyDollar[1].selStmtUnion() } yyVAL.union = yyLOCAL - case 834: + case 842: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4488 +//line sql.y:4528 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 835: + case 843: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4492 +//line sql.y:4532 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 836: + case 844: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4496 +//line sql.y:4536 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 837: + case 845: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4501 +//line sql.y:4541 { yyVAL.str = "" } - case 838: + case 846: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4505 +//line sql.y:4545 { yyVAL.str = yyDollar[1].identifierCI.val } - case 839: + case 847: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4509 +//line sql.y:4549 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 840: + case 848: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4515 +//line sql.y:4555 { yyLOCAL = &ExplainTab{Table: yyDollar[3].tableName, Wild: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 841: + case 849: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4519 +//line sql.y:4559 { yyLOCAL = &ExplainStmt{Type: yyDollar[3].explainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 842: + case 850: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4525 +//line sql.y:4565 { yyLOCAL = &VExplainStmt{Type: yyDollar[3].vexplainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 843: + case 851: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4531 +//line sql.y:4571 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 844: + case 852: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4535 +//line sql.y:4575 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 845: + case 853: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4541 +//line sql.y:4581 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } yyVAL.union = yyLOCAL - case 846: + case 854: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:4547 +//line sql.y:4587 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL - case 847: + case 855: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4551 +//line sql.y:4591 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) } - case 848: + case 856: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:4557 +//line sql.y:4597 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } yyVAL.union = yyLOCAL - case 849: + case 857: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4563 +//line sql.y:4603 { yyLOCAL = Read } yyVAL.union = yyLOCAL - case 850: + case 858: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4567 +//line sql.y:4607 { yyLOCAL = ReadLocal } yyVAL.union = yyLOCAL - case 851: + case 859: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4571 +//line sql.y:4611 { yyLOCAL = Write } yyVAL.union = yyLOCAL - case 852: + case 860: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4575 +//line sql.y:4615 { yyLOCAL = LowPriorityWrite } yyVAL.union = yyLOCAL - case 853: + case 861: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4581 +//line sql.y:4621 { yyLOCAL = &UnlockTables{} } yyVAL.union = yyLOCAL - case 854: + case 862: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4587 +//line sql.y:4627 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 855: + case 863: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4593 +//line sql.y:4633 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } yyVAL.union = yyLOCAL - case 856: + case 864: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4597 +//line sql.y:4637 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } yyVAL.union = yyLOCAL - case 857: + case 865: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4601 +//line sql.y:4641 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 858: + case 866: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4605 +//line sql.y:4645 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 859: + case 867: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4609 +//line sql.y:4649 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 860: + case 868: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4613 +//line sql.y:4653 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL - case 861: + case 869: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4619 +//line sql.y:4659 { yyVAL.strs = []string{yyDollar[1].str} } - case 862: + case 870: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4623 +//line sql.y:4663 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } - case 863: + case 871: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4629 +//line sql.y:4669 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 864: + case 872: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4633 +//line sql.y:4673 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 865: + case 873: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4637 +//line sql.y:4677 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 866: + case 874: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4641 +//line sql.y:4681 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 867: + case 875: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4645 +//line sql.y:4685 { yyVAL.str = string(yyDollar[1].str) } - case 868: + case 876: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4649 +//line sql.y:4689 { yyVAL.str = string(yyDollar[1].str) } - case 869: + case 877: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4653 +//line sql.y:4693 { yyVAL.str = string(yyDollar[1].str) } - case 870: + case 878: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4657 +//line sql.y:4697 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } - case 871: + case 879: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4661 +//line sql.y:4701 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 872: + case 880: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4665 +//line sql.y:4705 { yyVAL.str = string(yyDollar[1].str) } - case 873: + case 881: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4669 +//line sql.y:4709 { yyVAL.str = string(yyDollar[1].str) } - case 874: + case 882: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4673 +//line sql.y:4713 { yyVAL.str = string(yyDollar[1].str) } - case 875: + case 883: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4678 +//line sql.y:4718 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 876: + case 884: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4682 +//line sql.y:4722 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 877: + case 885: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4686 +//line sql.y:4726 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 878: + case 886: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4691 +//line sql.y:4731 { yyVAL.str = "" } - case 879: + case 887: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4695 +//line sql.y:4735 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String() } - case 880: + case 888: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4700 +//line sql.y:4740 { setAllowComments(yylex, true) } - case 881: + case 889: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4704 +//line sql.y:4744 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } - case 882: + case 890: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4710 +//line sql.y:4750 { yyVAL.strs = nil } - case 883: + case 891: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4714 +//line sql.y:4754 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 884: + case 892: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4720 +//line sql.y:4760 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 885: + case 893: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4724 +//line sql.y:4764 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 886: + case 894: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4728 +//line sql.y:4768 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 887: + case 895: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4733 +//line sql.y:4773 { yyVAL.str = "" } - case 888: + case 896: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4737 +//line sql.y:4777 { yyVAL.str = SQLNoCacheStr } - case 889: + case 897: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4741 +//line sql.y:4781 { yyVAL.str = SQLCacheStr } - case 890: + case 898: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4746 +//line sql.y:4786 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 891: + case 899: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4750 +//line sql.y:4790 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 892: + case 900: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4754 +//line sql.y:4794 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 893: + case 901: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4760 +//line sql.y:4800 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 894: + case 902: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4764 +//line sql.y:4804 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].identifierCI, @@ -16835,573 +16929,597 @@ yydefault: } } yyVAL.union = yyLOCAL - case 895: + case 903: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4774 +//line sql.y:4814 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].variablesUnion()} } yyVAL.union = yyLOCAL - case 896: + case 904: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4779 +//line sql.y:4819 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 897: + case 905: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4783 +//line sql.y:4823 { yyLOCAL = yyDollar[2].variablesUnion() } yyVAL.union = yyLOCAL - case 898: + case 906: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4789 +//line sql.y:4829 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 899: + case 907: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4793 +//line sql.y:4833 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 900: + case 908: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4798 +//line sql.y:4838 { yyVAL.strs = nil } - case 901: + case 909: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4802 +//line sql.y:4842 { yyVAL.strs = yyDollar[1].strs } - case 902: + case 910: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4808 +//line sql.y:4848 { yyVAL.strs = []string{yyDollar[1].str} } - case 903: + case 911: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4812 +//line sql.y:4852 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 904: + case 912: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4818 +//line sql.y:4858 { yyVAL.str = SQLNoCacheStr } - case 905: + case 913: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4822 +//line sql.y:4862 { yyVAL.str = SQLCacheStr } - case 906: + case 914: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4826 +//line sql.y:4866 { yyVAL.str = DistinctStr } - case 907: + case 915: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4830 +//line sql.y:4870 { yyVAL.str = DistinctStr } - case 908: + case 916: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4874 + { + yyVAL.str = HighPriorityStr + } + case 917: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4834 +//line sql.y:4878 { yyVAL.str = StraightJoinHint } - case 909: + case 918: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4838 +//line sql.y:4882 + { + yyVAL.str = SQLBufferResultStr + } + case 919: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4886 + { + yyVAL.str = SQLSmallResultStr + } + case 920: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4890 + { + yyVAL.str = SQLBigResultStr + } + case 921: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4894 { yyVAL.str = SQLCalcFoundRowsStr } - case 910: + case 922: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4842 +//line sql.y:4898 { yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway } - case 911: + case 923: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4848 +//line sql.y:4904 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 912: + case 924: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4852 +//line sql.y:4908 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) } - case 913: + case 925: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4858 +//line sql.y:4914 { yyLOCAL = &StarExpr{} } yyVAL.union = yyLOCAL - case 914: + case 926: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4862 +//line sql.y:4918 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 915: + case 927: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4866 +//line sql.y:4922 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].identifierCS}} } yyVAL.union = yyLOCAL - case 916: + case 928: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4870 +//line sql.y:4926 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 917: + case 929: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4875 +//line sql.y:4931 { yyVAL.identifierCI = IdentifierCI{} } - case 918: + case 930: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4879 +//line sql.y:4935 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 919: + case 931: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4883 +//line sql.y:4939 { yyVAL.identifierCI = yyDollar[2].identifierCI } - case 921: + case 933: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4890 +//line sql.y:4946 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 922: + case 934: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4895 +//line sql.y:4951 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewIdentifierCS("dual")}}} } yyVAL.union = yyLOCAL - case 923: + case 935: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4899 +//line sql.y:4955 { yyLOCAL = yyDollar[1].tableExprsUnion() } yyVAL.union = yyLOCAL - case 924: + case 936: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4905 +//line sql.y:4961 { yyLOCAL = yyDollar[2].tableExprsUnion() } yyVAL.union = yyLOCAL - case 925: + case 937: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4911 +//line sql.y:4967 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL - case 926: + case 938: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4915 +//line sql.y:4971 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) } - case 929: + case 941: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4925 +//line sql.y:4981 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } yyVAL.union = yyLOCAL - case 930: + case 942: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4929 +//line sql.y:4985 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 931: + case 943: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4933 +//line sql.y:4989 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } yyVAL.union = yyLOCAL - case 932: + case 944: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4937 +//line sql.y:4993 { yyLOCAL = yyDollar[1].tableExprUnion() } yyVAL.union = yyLOCAL - case 933: + case 945: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4943 +//line sql.y:4999 { yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 934: + case 946: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4947 +//line sql.y:5003 { yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].selStmtUnion()} } yyVAL.union = yyLOCAL - case 935: + case 947: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4953 +//line sql.y:5009 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].identifierCS, Hints: yyDollar[3].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 936: + case 948: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4957 +//line sql.y:5013 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].identifierCS, Hints: yyDollar[7].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 937: + case 949: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4962 +//line sql.y:5018 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 938: + case 950: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:4966 +//line sql.y:5022 { yyLOCAL = yyDollar[2].columnsUnion() } yyVAL.union = yyLOCAL - case 939: + case 951: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4971 +//line sql.y:5027 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 940: + case 952: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4975 +//line sql.y:5031 { yyLOCAL = yyDollar[1].columnsUnion() } yyVAL.union = yyLOCAL - case 941: + case 953: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4981 +//line sql.y:5037 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 942: + case 954: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4985 +//line sql.y:5041 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 943: + case 955: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4991 +//line sql.y:5047 { yyLOCAL = []*Variable{yyDollar[1].variableUnion()} } yyVAL.union = yyLOCAL - case 944: + case 956: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4995 +//line sql.y:5051 { yySLICE := (*[]*Variable)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].variableUnion()) } - case 945: + case 957: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5001 +//line sql.y:5057 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 946: + case 958: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5005 +//line sql.y:5061 { yyLOCAL = Columns{NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 947: + case 959: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5009 +//line sql.y:5065 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 948: + case 960: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5013 +//line sql.y:5069 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewIdentifierCI(string(yyDollar[3].str))) } - case 949: + case 961: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:5019 +//line sql.y:5075 { yyLOCAL = Partitions{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 950: + case 962: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5023 +//line sql.y:5079 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 951: + case 963: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5036 +//line sql.y:5092 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 952: + case 964: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5040 +//line sql.y:5096 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 953: + case 965: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5044 +//line sql.y:5100 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 954: + case 966: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5048 +//line sql.y:5104 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL - case 955: + case 967: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5054 +//line sql.y:5110 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 956: + case 968: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:5056 +//line sql.y:5112 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } - case 957: + case 969: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5060 +//line sql.y:5116 { yyVAL.joinCondition = &JoinCondition{} } - case 958: + case 970: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5062 +//line sql.y:5118 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 959: + case 971: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5066 +//line sql.y:5122 { yyVAL.joinCondition = &JoinCondition{} } - case 960: + case 972: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5068 +//line sql.y:5124 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 961: + case 973: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5071 +//line sql.y:5127 { yyVAL.empty = struct{}{} } - case 962: + case 974: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5073 +//line sql.y:5129 { yyVAL.empty = struct{}{} } - case 963: + case 975: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5076 +//line sql.y:5132 { yyVAL.identifierCS = NewIdentifierCS("") } - case 964: + case 976: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5080 +//line sql.y:5136 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 965: + case 977: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5084 +//line sql.y:5140 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 967: + case 979: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5091 +//line sql.y:5147 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 968: + case 980: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5097 +//line sql.y:5153 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 969: + case 981: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5101 +//line sql.y:5157 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 970: + case 982: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5105 +//line sql.y:5161 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 971: + case 983: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5111 +//line sql.y:5167 { yyLOCAL = StraightJoinType } yyVAL.union = yyLOCAL - case 972: + case 984: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5117 +//line sql.y:5173 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 973: + case 985: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5121 +//line sql.y:5177 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 974: + case 986: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5125 +//line sql.y:5181 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 975: + case 987: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5129 +//line sql.y:5185 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 976: + case 988: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5135 +//line sql.y:5191 { yyLOCAL = NaturalJoinType } yyVAL.union = yyLOCAL - case 977: + case 989: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5139 +//line sql.y:5195 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -17410,667 +17528,667 @@ yydefault: } } yyVAL.union = yyLOCAL - case 978: + case 990: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5149 +//line sql.y:5205 { yyVAL.tableName = yyDollar[2].tableName } - case 979: + case 991: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5153 +//line sql.y:5209 { yyVAL.tableName = yyDollar[1].tableName } - case 980: + case 992: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5159 +//line sql.y:5215 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 981: + case 993: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5163 +//line sql.y:5219 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS} } - case 982: + case 994: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5169 +//line sql.y:5225 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 983: + case 995: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5174 +//line sql.y:5230 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 984: + case 996: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5178 +//line sql.y:5234 { yyLOCAL = yyDollar[1].indexHintsUnion() } yyVAL.union = yyLOCAL - case 985: + case 997: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5184 +//line sql.y:5240 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 986: + case 998: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5188 +//line sql.y:5244 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) } - case 987: + case 999: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5194 +//line sql.y:5250 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 988: + case 1000: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5198 +//line sql.y:5254 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } yyVAL.union = yyLOCAL - case 989: + case 1001: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5202 +//line sql.y:5258 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 990: + case 1002: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5206 +//line sql.y:5262 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 991: + case 1003: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5210 +//line sql.y:5266 { yyLOCAL = &IndexHint{Type: UseVindexOp, Indexes: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 992: + case 1004: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5214 +//line sql.y:5270 { yyLOCAL = &IndexHint{Type: IgnoreVindexOp, Indexes: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 993: + case 1005: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5219 +//line sql.y:5275 { yyLOCAL = NoForType } yyVAL.union = yyLOCAL - case 994: + case 1006: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5223 +//line sql.y:5279 { yyLOCAL = JoinForType } yyVAL.union = yyLOCAL - case 995: + case 1007: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5227 +//line sql.y:5283 { yyLOCAL = OrderByForType } yyVAL.union = yyLOCAL - case 996: + case 1008: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5231 +//line sql.y:5287 { yyLOCAL = GroupByForType } yyVAL.union = yyLOCAL - case 997: + case 1009: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5237 +//line sql.y:5293 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 998: + case 1010: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5241 +//line sql.y:5297 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 999: + case 1011: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5248 +//line sql.y:5304 { yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1000: + case 1012: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5252 +//line sql.y:5308 { yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1001: + case 1013: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5256 +//line sql.y:5312 { yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1002: + case 1014: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5260 +//line sql.y:5316 { yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1003: + case 1015: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5264 +//line sql.y:5320 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } yyVAL.union = yyLOCAL - case 1004: + case 1016: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5268 +//line sql.y:5324 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1005: + case 1017: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5272 +//line sql.y:5328 { yyLOCAL = &AssignmentExpr{Left: yyDollar[1].variableUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1006: + case 1018: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5276 +//line sql.y:5332 { yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1007: + case 1019: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5282 +//line sql.y:5338 { } - case 1008: + case 1020: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5285 +//line sql.y:5341 { } - case 1009: + case 1021: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5290 +//line sql.y:5346 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } yyVAL.union = yyLOCAL - case 1010: + case 1022: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5294 +//line sql.y:5350 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } yyVAL.union = yyLOCAL - case 1011: + case 1023: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5298 +//line sql.y:5354 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1012: + case 1024: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5302 +//line sql.y:5358 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: Any, Right: yyDollar[4].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1013: + case 1025: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5306 +//line sql.y:5362 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: Any, Right: yyDollar[4].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1014: + case 1026: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5310 +//line sql.y:5366 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Modifier: All, Right: yyDollar[4].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1015: + case 1027: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5314 +//line sql.y:5370 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1016: + case 1028: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5320 +//line sql.y:5376 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } yyVAL.union = yyLOCAL - case 1017: + case 1029: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5324 +//line sql.y:5380 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } yyVAL.union = yyLOCAL - case 1018: + case 1030: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5328 +//line sql.y:5384 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1019: + case 1031: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5332 +//line sql.y:5388 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1020: + case 1032: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5336 +//line sql.y:5392 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1021: + case 1033: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5340 +//line sql.y:5396 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1022: + case 1034: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5344 +//line sql.y:5400 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1023: + case 1035: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5348 +//line sql.y:5404 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1024: + case 1036: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5352 +//line sql.y:5408 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1025: + case 1037: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5356 +//line sql.y:5412 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1026: + case 1038: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5360 +//line sql.y:5416 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1027: + case 1039: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5366 +//line sql.y:5422 { } - case 1028: + case 1040: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5369 +//line sql.y:5425 { } - case 1029: + case 1041: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5375 +//line sql.y:5431 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1030: + case 1042: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5379 +//line sql.y:5435 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1031: + case 1043: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5383 +//line sql.y:5439 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1032: + case 1044: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5387 +//line sql.y:5443 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1033: + case 1045: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5391 +//line sql.y:5447 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1034: + case 1046: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5395 +//line sql.y:5451 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1035: + case 1047: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5399 +//line sql.y:5455 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAdd, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1036: + case 1048: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5403 +//line sql.y:5459 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinarySub, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1037: + case 1049: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5407 +//line sql.y:5463 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1038: + case 1050: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5411 +//line sql.y:5467 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1039: + case 1051: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5415 +//line sql.y:5471 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1040: + case 1052: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5419 +//line sql.y:5475 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1041: + case 1053: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5423 +//line sql.y:5479 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1042: + case 1054: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5427 +//line sql.y:5483 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1043: + case 1055: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5431 +//line sql.y:5487 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1044: + case 1056: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5437 +//line sql.y:5493 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1045: + case 1057: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5441 +//line sql.y:5497 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1046: + case 1058: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5445 +//line sql.y:5501 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1047: + case 1059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5449 +//line sql.y:5505 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1048: + case 1060: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5453 +//line sql.y:5509 { yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 1049: + case 1061: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5457 +//line sql.y:5513 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1050: + case 1062: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5461 +//line sql.y:5517 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1051: + case 1063: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5465 +//line sql.y:5521 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 1052: + case 1064: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5469 +//line sql.y:5525 { yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? } yyVAL.union = yyLOCAL - case 1053: + case 1065: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5473 +//line sql.y:5529 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1054: + case 1066: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5477 +//line sql.y:5533 { yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1055: + case 1067: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5481 +//line sql.y:5537 { yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1056: + case 1068: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5485 +//line sql.y:5541 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1057: + case 1069: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5489 +//line sql.y:5545 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1058: + case 1070: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5493 +//line sql.y:5549 { yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} } yyVAL.union = yyLOCAL - case 1059: + case 1071: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5497 +//line sql.y:5553 { yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} } yyVAL.union = yyLOCAL - case 1060: + case 1072: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:5501 +//line sql.y:5557 { yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} } yyVAL.union = yyLOCAL - case 1061: + case 1073: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5505 +//line sql.y:5561 { yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1062: + case 1074: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5509 +//line sql.y:5565 { yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 1063: + case 1075: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5513 +//line sql.y:5569 { // From: https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#operator_binary // To convert a string expression to a binary string, these constructs are equivalent: @@ -18079,3218 +18197,3218 @@ yydefault: yyLOCAL = &ConvertExpr{Expr: yyDollar[2].exprUnion(), Type: &ConvertType{Type: yyDollar[1].str}} } yyVAL.union = yyLOCAL - case 1064: + case 1076: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5521 +//line sql.y:5577 { yyLOCAL = &Default{ColName: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1065: + case 1077: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5525 +//line sql.y:5581 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAddLeft, Date: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion(), Interval: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1066: + case 1078: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5529 +//line sql.y:5585 { yyLOCAL = &IntervalFuncExpr{Expr: yyDollar[3].exprUnion(), Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1067: + case 1079: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5533 +//line sql.y:5589 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONExtractOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[1].exprUnion(), PathList: []Expr{yyDollar[3].exprUnion()}} } yyVAL.union = yyLOCAL - case 1068: + case 1080: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5537 +//line sql.y:5593 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONUnquoteExtractOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &JSONUnquoteExpr{JSONValue: &JSONExtractExpr{JSONDoc: yyDollar[1].exprUnion(), PathList: []Expr{yyDollar[3].exprUnion()}}} } yyVAL.union = yyLOCAL - case 1069: + case 1081: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5543 +//line sql.y:5599 { yyLOCAL = yyDollar[1].colNamesUnion() } yyVAL.union = yyLOCAL - case 1070: + case 1082: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5547 +//line sql.y:5603 { yyLOCAL = yyDollar[2].colNamesUnion() } yyVAL.union = yyLOCAL - case 1071: + case 1083: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5553 +//line sql.y:5609 { yyLOCAL = []*ColName{yyDollar[1].colNameUnion()} } yyVAL.union = yyLOCAL - case 1072: + case 1084: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5557 +//line sql.y:5613 { yySLICE := (*[]*ColName)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colNameUnion()) } - case 1073: + case 1085: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5563 +//line sql.y:5619 { yyLOCAL = BothTrimType } yyVAL.union = yyLOCAL - case 1074: + case 1086: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5567 +//line sql.y:5623 { yyLOCAL = LeadingTrimType } yyVAL.union = yyLOCAL - case 1075: + case 1087: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:5571 +//line sql.y:5627 { yyLOCAL = TrailingTrimType } yyVAL.union = yyLOCAL - case 1076: + case 1088: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5577 +//line sql.y:5633 { yyLOCAL = FrameRowsType } yyVAL.union = yyLOCAL - case 1077: + case 1089: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FrameUnitType -//line sql.y:5581 +//line sql.y:5637 { yyLOCAL = FrameRangeType } yyVAL.union = yyLOCAL - case 1078: + case 1090: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5588 +//line sql.y:5644 { yyLOCAL = CumeDistExprType } yyVAL.union = yyLOCAL - case 1079: + case 1091: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5592 +//line sql.y:5648 { yyLOCAL = DenseRankExprType } yyVAL.union = yyLOCAL - case 1080: + case 1092: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5596 +//line sql.y:5652 { yyLOCAL = PercentRankExprType } yyVAL.union = yyLOCAL - case 1081: + case 1093: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5600 +//line sql.y:5656 { yyLOCAL = RankExprType } yyVAL.union = yyLOCAL - case 1082: + case 1094: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5604 +//line sql.y:5660 { yyLOCAL = RowNumberExprType } yyVAL.union = yyLOCAL - case 1083: + case 1095: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5610 +//line sql.y:5666 { yyLOCAL = &FramePoint{Type: CurrentRowType} } yyVAL.union = yyLOCAL - case 1084: + case 1096: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5614 +//line sql.y:5670 { yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} } yyVAL.union = yyLOCAL - case 1085: + case 1097: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5618 +//line sql.y:5674 { yyLOCAL = &FramePoint{Type: UnboundedFollowingType} } yyVAL.union = yyLOCAL - case 1086: + case 1098: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5622 +//line sql.y:5678 { yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1087: + case 1099: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5626 +//line sql.y:5682 { yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1088: + case 1100: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5630 +//line sql.y:5686 { yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1089: + case 1101: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *FramePoint -//line sql.y:5634 +//line sql.y:5690 { yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1090: + case 1102: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5639 +//line sql.y:5695 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1091: + case 1103: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5643 +//line sql.y:5699 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 1092: + case 1104: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5649 +//line sql.y:5705 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[2].framePointUnion()} } yyVAL.union = yyLOCAL - case 1093: + case 1105: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5653 +//line sql.y:5709 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[3].framePointUnion(), End: yyDollar[5].framePointUnion()} } yyVAL.union = yyLOCAL - case 1094: + case 1106: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5658 +//line sql.y:5714 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1095: + case 1107: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5662 +//line sql.y:5718 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1096: + case 1108: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5667 +//line sql.y:5723 { yyVAL.identifierCI = IdentifierCI{} } - case 1097: + case 1109: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5671 +//line sql.y:5727 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1098: + case 1110: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *WindowSpecification -//line sql.y:5677 +//line sql.y:5733 { yyLOCAL = &WindowSpecification{Name: yyDollar[1].identifierCI, PartitionClause: yyDollar[2].exprsUnion(), OrderClause: yyDollar[3].orderByUnion(), FrameClause: yyDollar[4].frameClauseUnion()} } yyVAL.union = yyLOCAL - case 1099: + case 1111: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5683 +//line sql.y:5739 { yyLOCAL = &OverClause{WindowSpec: yyDollar[3].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1100: + case 1112: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5687 +//line sql.y:5743 { yyLOCAL = &OverClause{WindowName: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 1101: + case 1113: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5693 +//line sql.y:5749 { yyLOCAL = yyDollar[1].overClauseUnion() } yyVAL.union = yyLOCAL - case 1102: + case 1114: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5697 +//line sql.y:5753 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1103: + case 1115: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5702 +//line sql.y:5758 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1105: + case 1117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5709 +//line sql.y:5765 { yyLOCAL = &NullTreatmentClause{yyDollar[1].nullTreatmentTypeUnion()} } yyVAL.union = yyLOCAL - case 1106: + case 1118: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5715 +//line sql.y:5771 { yyLOCAL = RespectNullsType } yyVAL.union = yyLOCAL - case 1107: + case 1119: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5719 +//line sql.y:5775 { yyLOCAL = IgnoreNullsType } yyVAL.union = yyLOCAL - case 1108: + case 1120: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5725 +//line sql.y:5781 { yyLOCAL = FirstValueExprType } yyVAL.union = yyLOCAL - case 1109: + case 1121: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5729 +//line sql.y:5785 { yyLOCAL = LastValueExprType } yyVAL.union = yyLOCAL - case 1110: + case 1122: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5735 +//line sql.y:5791 { yyLOCAL = FromFirstType } yyVAL.union = yyLOCAL - case 1111: + case 1123: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5739 +//line sql.y:5795 { yyLOCAL = FromLastType } yyVAL.union = yyLOCAL - case 1112: + case 1124: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5744 +//line sql.y:5800 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1114: + case 1126: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5751 +//line sql.y:5807 { yyLOCAL = &FromFirstLastClause{yyDollar[1].fromFirstLastTypeUnion()} } yyVAL.union = yyLOCAL - case 1115: + case 1127: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5757 +//line sql.y:5813 { yyLOCAL = LagExprType } yyVAL.union = yyLOCAL - case 1116: + case 1128: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5761 +//line sql.y:5817 { yyLOCAL = LeadExprType } yyVAL.union = yyLOCAL - case 1117: + case 1129: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *WindowDefinition -//line sql.y:5767 +//line sql.y:5823 { yyLOCAL = &WindowDefinition{Name: yyDollar[1].identifierCI, WindowSpec: yyDollar[4].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1118: + case 1130: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL WindowDefinitions -//line sql.y:5773 +//line sql.y:5829 { yyLOCAL = WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL - case 1119: + case 1131: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5777 +//line sql.y:5833 { yySLICE := (*WindowDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].windowDefinitionUnion()) } - case 1120: + case 1132: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5783 +//line sql.y:5839 { yyVAL.str = "" } - case 1121: + case 1133: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5787 +//line sql.y:5843 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } - case 1122: + case 1134: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5793 +//line sql.y:5849 { yyLOCAL = BoolVal(true) } yyVAL.union = yyLOCAL - case 1123: + case 1135: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5797 +//line sql.y:5853 { yyLOCAL = BoolVal(false) } yyVAL.union = yyLOCAL - case 1124: + case 1136: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5804 +//line sql.y:5860 { yyLOCAL = IsTrueOp } yyVAL.union = yyLOCAL - case 1125: + case 1137: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5808 +//line sql.y:5864 { yyLOCAL = IsNotTrueOp } yyVAL.union = yyLOCAL - case 1126: + case 1138: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5812 +//line sql.y:5868 { yyLOCAL = IsFalseOp } yyVAL.union = yyLOCAL - case 1127: + case 1139: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5816 +//line sql.y:5872 { yyLOCAL = IsNotFalseOp } yyVAL.union = yyLOCAL - case 1128: + case 1140: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5822 +//line sql.y:5878 { yyLOCAL = yyDollar[1].comparisonExprOperatorUnion() } yyVAL.union = yyLOCAL - case 1129: + case 1141: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5826 +//line sql.y:5882 { yyLOCAL = NullSafeEqualOp } yyVAL.union = yyLOCAL - case 1130: + case 1142: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5832 +//line sql.y:5888 { yyLOCAL = EqualOp } yyVAL.union = yyLOCAL - case 1131: + case 1143: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5836 +//line sql.y:5892 { yyLOCAL = LessThanOp } yyVAL.union = yyLOCAL - case 1132: + case 1144: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5840 +//line sql.y:5896 { yyLOCAL = GreaterThanOp } yyVAL.union = yyLOCAL - case 1133: + case 1145: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5844 +//line sql.y:5900 { yyLOCAL = LessEqualOp } yyVAL.union = yyLOCAL - case 1134: + case 1146: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5848 +//line sql.y:5904 { yyLOCAL = GreaterEqualOp } yyVAL.union = yyLOCAL - case 1135: + case 1147: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:5852 +//line sql.y:5908 { yyLOCAL = NotEqualOp } yyVAL.union = yyLOCAL - case 1136: + case 1148: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5858 +//line sql.y:5914 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1137: + case 1149: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5862 +//line sql.y:5918 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1138: + case 1150: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:5866 +//line sql.y:5922 { yyLOCAL = ListArg(yyDollar[1].str[2:]) markBindVariable(yylex, yyDollar[1].str[2:]) } yyVAL.union = yyLOCAL - case 1139: + case 1151: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:5873 +//line sql.y:5929 { yyLOCAL = &Subquery{yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1140: + case 1152: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:5879 +//line sql.y:5935 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1141: + case 1153: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5883 +//line sql.y:5939 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) } - case 1142: + case 1154: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5893 +//line sql.y:5949 { yyLOCAL = &FuncExpr{Name: yyDollar[1].identifierCI, Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1143: + case 1155: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5897 +//line sql.y:5953 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCI, Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1144: + case 1156: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5907 +//line sql.y:5963 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1145: + case 1157: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5911 +//line sql.y:5967 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1146: + case 1158: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5915 +//line sql.y:5971 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1147: + case 1159: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5919 +//line sql.y:5975 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1148: + case 1160: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5923 +//line sql.y:5979 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1149: + case 1161: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5927 +//line sql.y:5983 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1150: + case 1162: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5931 +//line sql.y:5987 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1151: + case 1163: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5935 +//line sql.y:5991 { yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1152: + case 1164: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5939 +//line sql.y:5995 { yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL - case 1153: + case 1165: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:5943 +//line sql.y:5999 { yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1154: + case 1166: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5947 +//line sql.y:6003 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1155: + case 1167: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5958 +//line sql.y:6014 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} } yyVAL.union = yyLOCAL - case 1156: + case 1168: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5962 +//line sql.y:6018 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1157: + case 1169: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5968 +//line sql.y:6024 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} } yyVAL.union = yyLOCAL - case 1158: + case 1170: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5972 +//line sql.y:6028 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("curdate")} } yyVAL.union = yyLOCAL - case 1159: + case 1171: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5976 +//line sql.y:6032 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 1160: + case 1172: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5981 +//line sql.y:6037 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("curtime"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 1161: + case 1173: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5986 +//line sql.y:6042 { yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL - case 1162: + case 1174: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5990 +//line sql.y:6046 { yyLOCAL = &CountStar{OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1163: + case 1175: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5994 +//line sql.y:6050 { yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1164: + case 1176: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5998 +//line sql.y:6054 { yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1165: + case 1177: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6002 +//line sql.y:6058 { yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1166: + case 1178: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6006 +//line sql.y:6062 { yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1167: + case 1179: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6010 +//line sql.y:6066 { yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1168: + case 1180: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6014 +//line sql.y:6070 { yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1169: + case 1181: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6018 +//line sql.y:6074 { yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1170: + case 1182: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6022 +//line sql.y:6078 { yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1171: + case 1183: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6026 +//line sql.y:6082 { yyLOCAL = &Std{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1172: + case 1184: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6030 +//line sql.y:6086 { yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1173: + case 1185: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6034 +//line sql.y:6090 { yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1174: + case 1186: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6038 +//line sql.y:6094 { yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1175: + case 1187: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6042 +//line sql.y:6098 { yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1176: + case 1188: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6046 +//line sql.y:6102 { yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1177: + case 1189: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6050 +//line sql.y:6106 { yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1178: + case 1190: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6054 +//line sql.y:6110 { yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} } yyVAL.union = yyLOCAL - case 1179: + case 1191: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6058 +//line sql.y:6114 { yyLOCAL = &AnyValue{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1180: + case 1192: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6062 +//line sql.y:6118 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprTimestampadd, Date: yyDollar[7].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1181: + case 1193: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6066 +//line sql.y:6122 { yyLOCAL = &TimestampDiffExpr{Unit: yyDollar[3].intervalTypeUnion(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1182: + case 1194: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6070 +//line sql.y:6126 { yyLOCAL = &ExtractFuncExpr{IntervalType: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1183: + case 1195: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6074 +//line sql.y:6130 { yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1184: + case 1196: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6078 +//line sql.y:6134 { yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1185: + case 1197: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6082 +//line sql.y:6138 { yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1186: + case 1198: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6086 +//line sql.y:6142 { yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1187: + case 1199: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6090 +//line sql.y:6146 { yyLOCAL = &JSONArrayAgg{Expr: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1188: + case 1200: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6094 +//line sql.y:6150 { yyLOCAL = &JSONObjectAgg{Key: yyDollar[3].exprUnion(), Value: yyDollar[5].exprUnion(), OverClause: yyDollar[7].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1189: + case 1201: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6098 +//line sql.y:6154 { yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, Type: LeadingTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1190: + case 1202: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6102 +//line sql.y:6158 { yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, Type: TrailingTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1191: + case 1203: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6106 +//line sql.y:6162 { yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 1192: + case 1204: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6110 +//line sql.y:6166 { yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1193: + case 1205: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6114 +//line sql.y:6170 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1194: + case 1206: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6118 +//line sql.y:6174 { yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 1195: + case 1207: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6122 +//line sql.y:6178 { yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1196: + case 1208: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6126 +//line sql.y:6182 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1197: + case 1209: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6130 +//line sql.y:6186 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1198: + case 1210: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6134 +//line sql.y:6190 { yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1199: + case 1211: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6138 +//line sql.y:6194 { yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1200: + case 1212: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6142 +//line sql.y:6198 { yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1201: + case 1213: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6146 +//line sql.y:6202 { yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1202: + case 1214: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6150 +//line sql.y:6206 { yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} } yyVAL.union = yyLOCAL - case 1203: + case 1215: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6154 +//line sql.y:6210 { yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1204: + case 1216: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6158 +//line sql.y:6214 { yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1205: + case 1217: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6162 +//line sql.y:6218 { yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1206: + case 1218: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6166 +//line sql.y:6222 { yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1207: + case 1219: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6170 +//line sql.y:6226 { yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1208: + case 1220: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6174 +//line sql.y:6230 { yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1209: + case 1221: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6178 +//line sql.y:6234 { yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1210: + case 1222: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6182 +//line sql.y:6238 { yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1211: + case 1223: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6186 +//line sql.y:6242 { yyLOCAL = &GeomPropertyFuncExpr{Property: IsEmpty, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1212: + case 1224: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6190 +//line sql.y:6246 { yyLOCAL = &GeomPropertyFuncExpr{Property: IsSimple, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1213: + case 1225: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6194 +//line sql.y:6250 { yyLOCAL = &GeomPropertyFuncExpr{Property: Dimension, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1214: + case 1226: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6198 +//line sql.y:6254 { yyLOCAL = &GeomPropertyFuncExpr{Property: Envelope, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1215: + case 1227: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6202 +//line sql.y:6258 { yyLOCAL = &GeomPropertyFuncExpr{Property: GeometryType, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1216: + case 1228: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6206 +//line sql.y:6262 { yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1217: + case 1229: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6210 +//line sql.y:6266 { yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1218: + case 1230: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6214 +//line sql.y:6270 { yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1219: + case 1231: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6218 +//line sql.y:6274 { yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1220: + case 1232: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6222 +//line sql.y:6278 { yyLOCAL = &LinestrPropertyFuncExpr{Property: EndPoint, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1221: + case 1233: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6226 +//line sql.y:6282 { yyLOCAL = &LinestrPropertyFuncExpr{Property: IsClosed, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1222: + case 1234: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6230 +//line sql.y:6286 { yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1223: + case 1235: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6234 +//line sql.y:6290 { yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1224: + case 1236: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6238 +//line sql.y:6294 { yyLOCAL = &LinestrPropertyFuncExpr{Property: NumPoints, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1225: + case 1237: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6242 +//line sql.y:6298 { yyLOCAL = &LinestrPropertyFuncExpr{Property: PointN, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1226: + case 1238: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6246 +//line sql.y:6302 { yyLOCAL = &LinestrPropertyFuncExpr{Property: StartPoint, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1227: + case 1239: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6250 +//line sql.y:6306 { yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1228: + case 1240: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6254 +//line sql.y:6310 { yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1229: + case 1241: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6258 +//line sql.y:6314 { yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1230: + case 1242: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6262 +//line sql.y:6318 { yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1231: + case 1243: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6266 +//line sql.y:6322 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1232: + case 1244: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6270 +//line sql.y:6326 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1233: + case 1245: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6274 +//line sql.y:6330 { yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1234: + case 1246: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6278 +//line sql.y:6334 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1235: + case 1247: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6282 +//line sql.y:6338 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1236: + case 1248: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6286 +//line sql.y:6342 { yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1237: + case 1249: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6290 +//line sql.y:6346 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1238: + case 1250: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6294 +//line sql.y:6350 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1239: + case 1251: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6298 +//line sql.y:6354 { yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1240: + case 1252: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6302 +//line sql.y:6358 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1241: + case 1253: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6306 +//line sql.y:6362 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1242: + case 1254: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6310 +//line sql.y:6366 { yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1243: + case 1255: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6314 +//line sql.y:6370 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1244: + case 1256: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6318 +//line sql.y:6374 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1245: + case 1257: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6322 +//line sql.y:6378 { yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1246: + case 1258: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6326 +//line sql.y:6382 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1247: + case 1259: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6330 +//line sql.y:6386 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1248: + case 1260: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6334 +//line sql.y:6390 { yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1249: + case 1261: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6338 +//line sql.y:6394 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1250: + case 1262: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6342 +//line sql.y:6398 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1251: + case 1263: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6346 +//line sql.y:6402 { yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1252: + case 1264: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6350 +//line sql.y:6406 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1253: + case 1265: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6354 +//line sql.y:6410 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1254: + case 1266: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6358 +//line sql.y:6414 { yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1255: + case 1267: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6362 +//line sql.y:6418 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1256: + case 1268: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6366 +//line sql.y:6422 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1257: + case 1269: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6370 +//line sql.y:6426 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1258: + case 1270: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6374 +//line sql.y:6430 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1259: + case 1271: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6378 +//line sql.y:6434 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1260: + case 1272: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6382 +//line sql.y:6438 { yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1261: + case 1273: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6386 +//line sql.y:6442 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1262: + case 1274: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6390 +//line sql.y:6446 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1263: + case 1275: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6394 +//line sql.y:6450 { yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1264: + case 1276: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6398 +//line sql.y:6454 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1265: + case 1277: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6402 +//line sql.y:6458 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1266: + case 1278: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6406 +//line sql.y:6462 { yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1267: + case 1279: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6410 +//line sql.y:6466 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1268: + case 1280: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6414 +//line sql.y:6470 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1269: + case 1281: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6418 +//line sql.y:6474 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1270: + case 1282: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6422 +//line sql.y:6478 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1271: + case 1283: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6426 +//line sql.y:6482 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1272: + case 1284: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6430 +//line sql.y:6486 { yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1273: + case 1285: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6434 +//line sql.y:6490 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1274: + case 1286: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6438 +//line sql.y:6494 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1275: + case 1287: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6442 +//line sql.y:6498 { yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1276: + case 1288: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6446 +//line sql.y:6502 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1277: + case 1289: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6450 +//line sql.y:6506 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1278: + case 1290: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6454 +//line sql.y:6510 { yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1279: + case 1291: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6458 +//line sql.y:6514 { yyLOCAL = &PolygonPropertyFuncExpr{Property: Area, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1280: + case 1292: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6462 +//line sql.y:6518 { yyLOCAL = &PolygonPropertyFuncExpr{Property: Centroid, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1281: + case 1293: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6466 +//line sql.y:6522 { yyLOCAL = &PolygonPropertyFuncExpr{Property: ExteriorRing, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1282: + case 1294: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6470 +//line sql.y:6526 { yyLOCAL = &PolygonPropertyFuncExpr{Property: InteriorRingN, Polygon: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1283: + case 1295: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6474 +//line sql.y:6530 { yyLOCAL = &PolygonPropertyFuncExpr{Property: NumInteriorRings, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1284: + case 1296: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6478 +//line sql.y:6534 { yyLOCAL = &GeomCollPropertyFuncExpr{Property: GeometryN, GeomColl: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1285: + case 1297: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6482 +//line sql.y:6538 { yyLOCAL = &GeomCollPropertyFuncExpr{Property: NumGeometries, GeomColl: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1286: + case 1298: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6486 +//line sql.y:6542 { yyLOCAL = &GeoHashFromLatLongExpr{Longitude: yyDollar[3].exprUnion(), Latitude: yyDollar[5].exprUnion(), MaxLength: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1287: + case 1299: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6490 +//line sql.y:6546 { yyLOCAL = &GeoHashFromPointExpr{Point: yyDollar[3].exprUnion(), MaxLength: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1288: + case 1300: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6494 +//line sql.y:6550 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: LatitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1289: + case 1301: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6498 +//line sql.y:6554 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: LongitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1290: + case 1302: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6502 +//line sql.y:6558 { yyLOCAL = &GeomFromGeoHashExpr{GeomType: PointFromHash, GeoHash: yyDollar[3].exprUnion(), SridOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1291: + case 1303: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6506 +//line sql.y:6562 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1292: + case 1304: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6510 +//line sql.y:6566 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1293: + case 1305: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6514 +//line sql.y:6570 { yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion(), Srid: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1294: + case 1306: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6518 +//line sql.y:6574 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1295: + case 1307: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6522 +//line sql.y:6578 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1296: + case 1308: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6526 +//line sql.y:6582 { yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion(), Bitmask: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1297: + case 1309: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6530 +//line sql.y:6586 { yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1298: + case 1310: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6534 +//line sql.y:6590 { yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1299: + case 1311: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6538 +//line sql.y:6594 { yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} } yyVAL.union = yyLOCAL - case 1300: + case 1312: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6542 +//line sql.y:6598 { yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} } yyVAL.union = yyLOCAL - case 1301: + case 1313: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6546 +//line sql.y:6602 { yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1302: + case 1314: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6550 +//line sql.y:6606 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1303: + case 1315: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6554 +//line sql.y:6610 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1304: + case 1316: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6558 +//line sql.y:6614 { yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1305: + case 1317: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6562 +//line sql.y:6618 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1306: + case 1318: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6566 +//line sql.y:6622 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} } yyVAL.union = yyLOCAL - case 1307: + case 1319: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:6570 +//line sql.y:6626 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 1308: + case 1320: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6574 +//line sql.y:6630 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL - case 1309: + case 1321: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6578 +//line sql.y:6634 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL - case 1310: + case 1322: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6582 +//line sql.y:6638 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} } yyVAL.union = yyLOCAL - case 1311: + case 1323: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6586 +//line sql.y:6642 { yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1312: + case 1324: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6590 +//line sql.y:6646 { yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1313: + case 1325: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6594 +//line sql.y:6650 { yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1314: + case 1326: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6598 +//line sql.y:6654 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1315: + case 1327: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6602 +//line sql.y:6658 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1316: + case 1328: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6606 +//line sql.y:6662 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1317: + case 1329: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6610 +//line sql.y:6666 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1318: + case 1330: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6614 +//line sql.y:6670 { yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1319: + case 1331: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6618 +//line sql.y:6674 { yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1320: + case 1332: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6622 +//line sql.y:6678 { yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 1321: + case 1333: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6626 +//line sql.y:6682 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1322: + case 1334: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6630 +//line sql.y:6686 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1323: + case 1335: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6634 +//line sql.y:6690 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1324: + case 1336: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6638 +//line sql.y:6694 { yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1325: + case 1337: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6642 +//line sql.y:6698 { yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1326: + case 1338: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6646 +//line sql.y:6702 { yyLOCAL = &MultiPolygonExpr{PolygonParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1327: + case 1339: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6650 +//line sql.y:6706 { yyLOCAL = &MultiPointExpr{PointParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1328: + case 1340: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6654 +//line sql.y:6710 { yyLOCAL = &MultiLinestringExpr{LinestringParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1329: + case 1341: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6658 +//line sql.y:6714 { yyLOCAL = &PolygonExpr{LinestringParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1330: + case 1342: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6662 +//line sql.y:6718 { yyLOCAL = &LineStringExpr{PointParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1331: + case 1343: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6666 +//line sql.y:6722 { yyLOCAL = &PointExpr{XCordinate: yyDollar[3].exprUnion(), YCordinate: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1332: + case 1344: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6670 +//line sql.y:6726 { yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1333: + case 1345: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6674 +//line sql.y:6730 { yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1334: + case 1346: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:6678 +//line sql.y:6734 { yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1335: + case 1347: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6682 +//line sql.y:6738 { yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1336: + case 1348: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6686 +//line sql.y:6742 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1337: + case 1349: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:6690 +//line sql.y:6746 { yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL - case 1338: + case 1350: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6694 +//line sql.y:6750 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1339: + case 1351: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6698 +//line sql.y:6754 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } yyVAL.union = yyLOCAL - case 1340: + case 1352: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6702 +//line sql.y:6758 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateAdd, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1341: + case 1353: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6706 +//line sql.y:6762 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateSub, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1342: + case 1354: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6710 +//line sql.y:6766 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1343: + case 1355: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6714 +//line sql.y:6770 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } yyVAL.union = yyLOCAL - case 1348: + case 1360: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6724 +//line sql.y:6780 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1349: + case 1361: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6728 +//line sql.y:6784 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1350: + case 1362: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6732 +//line sql.y:6788 { yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL - case 1351: + case 1363: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:6736 +//line sql.y:6792 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1352: + case 1364: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6741 +//line sql.y:6797 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1353: + case 1365: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6745 +//line sql.y:6801 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1354: + case 1366: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6751 +//line sql.y:6807 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1355: + case 1367: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6755 +//line sql.y:6811 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1356: + case 1368: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6759 +//line sql.y:6815 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1357: + case 1369: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6763 +//line sql.y:6819 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1358: + case 1370: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6767 +//line sql.y:6823 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1359: + case 1371: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6772 +//line sql.y:6828 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1360: + case 1372: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6776 +//line sql.y:6832 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), MatchType: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1361: + case 1373: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6780 +//line sql.y:6836 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1362: + case 1374: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6784 +//line sql.y:6840 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1363: + case 1375: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6788 +//line sql.y:6844 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1364: + case 1376: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6792 +//line sql.y:6848 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1365: + case 1377: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6797 +//line sql.y:6853 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1366: + case 1378: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6801 +//line sql.y:6857 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1367: + case 1379: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6805 +//line sql.y:6861 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1368: + case 1380: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6809 +//line sql.y:6865 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), MatchType: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1369: + case 1381: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6816 +//line sql.y:6872 { yyLOCAL = &ExtractValueExpr{Fragment: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1370: + case 1382: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6820 +//line sql.y:6876 { yyLOCAL = &UpdateXMLExpr{Target: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion(), NewXML: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1371: + case 1383: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6826 +//line sql.y:6882 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatBytesType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1372: + case 1384: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6830 +//line sql.y:6886 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatPicoTimeType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1373: + case 1385: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6834 +//line sql.y:6890 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsCurrentThreadIDType} } yyVAL.union = yyLOCAL - case 1374: + case 1386: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6838 +//line sql.y:6894 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsThreadIDType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1375: + case 1387: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6844 +//line sql.y:6900 { yyLOCAL = >IDFuncExpr{Type: GTIDSubsetType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1376: + case 1388: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6848 +//line sql.y:6904 { yyLOCAL = >IDFuncExpr{Type: GTIDSubtractType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1377: + case 1389: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6852 +//line sql.y:6908 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1378: + case 1390: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6856 +//line sql.y:6912 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1379: + case 1391: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6860 +//line sql.y:6916 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1380: + case 1392: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6864 +//line sql.y:6920 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1381: + case 1393: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6868 +//line sql.y:6924 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion(), Channel: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1382: + case 1394: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6873 +//line sql.y:6929 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1383: + case 1395: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6877 +//line sql.y:6933 { yyLOCAL = yyDollar[2].convertTypeUnion() } yyVAL.union = yyLOCAL - case 1384: + case 1396: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6883 +//line sql.y:6939 { yyLOCAL = IntervalDayHour } yyVAL.union = yyLOCAL - case 1385: + case 1397: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6887 +//line sql.y:6943 { yyLOCAL = IntervalDayMicrosecond } yyVAL.union = yyLOCAL - case 1386: + case 1398: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6891 +//line sql.y:6947 { yyLOCAL = IntervalDayMinute } yyVAL.union = yyLOCAL - case 1387: + case 1399: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6895 +//line sql.y:6951 { yyLOCAL = IntervalDaySecond } yyVAL.union = yyLOCAL - case 1388: + case 1400: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6899 +//line sql.y:6955 { yyLOCAL = IntervalHourMicrosecond } yyVAL.union = yyLOCAL - case 1389: + case 1401: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6903 +//line sql.y:6959 { yyLOCAL = IntervalHourMinute } yyVAL.union = yyLOCAL - case 1390: + case 1402: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6907 +//line sql.y:6963 { yyLOCAL = IntervalHourSecond } yyVAL.union = yyLOCAL - case 1391: + case 1403: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6911 +//line sql.y:6967 { yyLOCAL = IntervalMinuteMicrosecond } yyVAL.union = yyLOCAL - case 1392: + case 1404: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6915 +//line sql.y:6971 { yyLOCAL = IntervalMinuteSecond } yyVAL.union = yyLOCAL - case 1393: + case 1405: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6919 +//line sql.y:6975 { yyLOCAL = IntervalSecondMicrosecond } yyVAL.union = yyLOCAL - case 1394: + case 1406: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6923 +//line sql.y:6979 { yyLOCAL = IntervalYearMonth } yyVAL.union = yyLOCAL - case 1395: + case 1407: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6927 +//line sql.y:6983 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1396: + case 1408: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6931 +//line sql.y:6987 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1397: + case 1409: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6935 +//line sql.y:6991 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1398: + case 1410: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6939 +//line sql.y:6995 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1399: + case 1411: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6943 +//line sql.y:6999 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1400: + case 1412: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6947 +//line sql.y:7003 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1401: + case 1413: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6951 +//line sql.y:7007 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1402: + case 1414: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6955 +//line sql.y:7011 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1403: + case 1415: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6959 +//line sql.y:7015 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1404: + case 1416: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6965 +//line sql.y:7021 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1405: + case 1417: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6969 +//line sql.y:7025 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1406: + case 1418: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6973 +//line sql.y:7029 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1407: + case 1419: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6977 +//line sql.y:7033 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1408: + case 1420: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6981 +//line sql.y:7037 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1409: + case 1421: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6985 +//line sql.y:7041 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1410: + case 1422: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6989 +//line sql.y:7045 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1411: + case 1423: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6993 +//line sql.y:7049 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1412: + case 1424: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6997 +//line sql.y:7053 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1413: + case 1425: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7001 +//line sql.y:7057 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1414: + case 1426: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7005 +//line sql.y:7061 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1415: + case 1427: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7009 +//line sql.y:7065 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1416: + case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7013 +//line sql.y:7069 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1417: + case 1429: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7017 +//line sql.y:7073 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1418: + case 1430: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7021 +//line sql.y:7077 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1419: + case 1431: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7025 +//line sql.y:7081 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1420: + case 1432: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7029 +//line sql.y:7085 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1421: + case 1433: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:7033 +//line sql.y:7089 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1424: + case 1436: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:7043 +//line sql.y:7099 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1425: + case 1437: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:7047 +//line sql.y:7103 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1426: + case 1438: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:7051 +//line sql.y:7107 { yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1427: + case 1439: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7061 +//line sql.y:7117 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1428: + case 1440: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7065 +//line sql.y:7121 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1429: + case 1441: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7069 +//line sql.y:7125 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1430: + case 1442: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7073 +//line sql.y:7129 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1431: + case 1443: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:7077 +//line sql.y:7133 { yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 1432: + case 1444: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7083 +//line sql.y:7139 { yyLOCAL = NoOption } yyVAL.union = yyLOCAL - case 1433: + case 1445: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7087 +//line sql.y:7143 { yyLOCAL = BooleanModeOpt } yyVAL.union = yyLOCAL - case 1434: + case 1446: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7091 +//line sql.y:7147 { yyLOCAL = NaturalLanguageModeOpt } yyVAL.union = yyLOCAL - case 1435: + case 1447: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7095 +//line sql.y:7151 { yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } yyVAL.union = yyLOCAL - case 1436: + case 1448: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:7099 +//line sql.y:7155 { yyLOCAL = QueryExpansionOpt } yyVAL.union = yyLOCAL - case 1437: + case 1449: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7105 +//line sql.y:7161 { yyVAL.str = string(yyDollar[1].identifierCI.String()) } - case 1438: + case 1450: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7109 +//line sql.y:7165 { yyVAL.str = string(yyDollar[1].str) } - case 1439: + case 1451: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7113 +//line sql.y:7169 { yyVAL.str = string(yyDollar[1].str) } - case 1440: + case 1452: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7119 +//line sql.y:7175 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1441: + case 1453: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7123 +//line sql.y:7179 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: ptr.Of(convertStringToInt(yyDollar[4].str))} } yyVAL.union = yyLOCAL - case 1442: + case 1454: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7127 +//line sql.y:7183 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: ptr.Of(convertStringToInt(yyDollar[4].str))} } yyVAL.union = yyLOCAL - case 1443: + case 1455: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7133 +//line sql.y:7189 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1444: + case 1456: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7137 +//line sql.y:7193 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion(), Charset: yyDollar[3].columnCharset} } yyVAL.union = yyLOCAL - case 1445: + case 1457: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7141 +//line sql.y:7197 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1446: + case 1458: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7145 +//line sql.y:7201 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1447: + case 1459: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7149 +//line sql.y:7205 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale } yyVAL.union = yyLOCAL - case 1448: + case 1460: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7155 +//line sql.y:7211 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1449: + case 1461: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7159 +//line sql.y:7215 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1450: + case 1462: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7163 +//line sql.y:7219 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1451: + case 1463: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7167 +//line sql.y:7223 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1452: + case 1464: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7171 +//line sql.y:7227 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1453: + case 1465: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7175 +//line sql.y:7231 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1454: + case 1466: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7179 +//line sql.y:7235 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1455: + case 1467: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7183 +//line sql.y:7239 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].intPtrUnion()} } yyVAL.union = yyLOCAL - case 1456: + case 1468: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7187 +//line sql.y:7243 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1457: + case 1469: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7191 +//line sql.y:7247 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1458: + case 1470: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7197 +//line sql.y:7253 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1459: + case 1471: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7201 +//line sql.y:7257 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1460: + case 1472: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7206 +//line sql.y:7262 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1461: + case 1473: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7210 +//line sql.y:7266 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1462: + case 1474: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7215 +//line sql.y:7271 { yyVAL.str = string("") } - case 1463: + case 1475: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7219 +//line sql.y:7275 { yyVAL.str = encodeSQLString(yyDollar[2].str) } - case 1464: + case 1476: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:7225 +//line sql.y:7281 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL - case 1465: + case 1477: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7229 +//line sql.y:7285 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) } - case 1466: + case 1478: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:7235 +//line sql.y:7291 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1467: + case 1479: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7240 +//line sql.y:7296 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1468: + case 1480: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7244 +//line sql.y:7300 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1469: + case 1481: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7250 +//line sql.y:7306 { yyLOCAL = &ColName{Name: yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1470: + case 1482: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7254 +//line sql.y:7310 { yyLOCAL = &ColName{Name: NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 1471: + case 1483: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:7258 +//line sql.y:7314 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].identifierCS}, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1472: + case 1484: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:7262 +//line sql.y:7318 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}, Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 1473: + case 1485: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7268 +//line sql.y:7324 { yyLOCAL = yyDollar[1].colNameUnion() } yyVAL.union = yyLOCAL - case 1474: + case 1486: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7272 +//line sql.y:7328 { yyLOCAL = &Offset{V: convertStringToInt(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1475: + case 1487: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7278 +//line sql.y:7334 { // TODO(sougou): Deprecate this construct. if yyDollar[1].identifierCI.Lowered() != "value" { @@ -21300,442 +21418,442 @@ yydefault: yyLOCAL = NewIntLiteral("1") } yyVAL.union = yyLOCAL - case 1476: + case 1488: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7287 +//line sql.y:7343 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1477: + case 1489: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7291 +//line sql.y:7347 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1478: + case 1490: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *GroupBy -//line sql.y:7296 +//line sql.y:7352 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1479: + case 1491: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *GroupBy -//line sql.y:7300 +//line sql.y:7356 { yyLOCAL = &GroupBy{Exprs: yyDollar[3].exprsUnion(), WithRollup: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 1480: + case 1492: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7305 +//line sql.y:7361 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1481: + case 1493: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7309 +//line sql.y:7365 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1482: + case 1494: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7315 +//line sql.y:7371 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1483: + case 1495: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7319 +//line sql.y:7375 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1484: + case 1496: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *NamedWindow -//line sql.y:7325 +//line sql.y:7381 { yyLOCAL = &NamedWindow{yyDollar[2].windowDefinitionsUnion()} } yyVAL.union = yyLOCAL - case 1485: + case 1497: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7331 +//line sql.y:7387 { yyLOCAL = NamedWindows{yyDollar[1].namedWindowUnion()} } yyVAL.union = yyLOCAL - case 1486: + case 1498: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7335 +//line sql.y:7391 { yySLICE := (*NamedWindows)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].namedWindowUnion()) } - case 1487: + case 1499: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7340 +//line sql.y:7396 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1488: + case 1500: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7344 +//line sql.y:7400 { yyLOCAL = yyDollar[1].namedWindowsUnion() } yyVAL.union = yyLOCAL - case 1489: + case 1501: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7349 +//line sql.y:7405 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1490: + case 1502: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7353 +//line sql.y:7409 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1491: + case 1503: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7359 +//line sql.y:7415 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1492: + case 1504: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7365 +//line sql.y:7421 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1493: + case 1505: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7369 +//line sql.y:7425 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) } - case 1494: + case 1506: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:7375 +//line sql.y:7431 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 1495: + case 1507: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7380 +//line sql.y:7436 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1496: + case 1508: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7384 +//line sql.y:7440 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1497: + case 1509: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7388 +//line sql.y:7444 { yyLOCAL = DescOrder } yyVAL.union = yyLOCAL - case 1498: + case 1510: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:7393 +//line sql.y:7449 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1499: + case 1511: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:7397 +//line sql.y:7453 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1500: + case 1512: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:7403 +//line sql.y:7459 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1501: + case 1513: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7407 +//line sql.y:7463 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1502: + case 1514: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7411 +//line sql.y:7467 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1503: + case 1515: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7416 +//line sql.y:7472 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1504: + case 1516: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7420 +//line sql.y:7476 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1505: + case 1517: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7424 +//line sql.y:7480 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1506: + case 1518: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7428 +//line sql.y:7484 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1507: + case 1519: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:7432 +//line sql.y:7488 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1508: + case 1520: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7439 +//line sql.y:7495 { yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL - case 1509: + case 1521: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7443 +//line sql.y:7499 { yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL - case 1510: + case 1522: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7447 +//line sql.y:7503 { yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL - case 1511: + case 1523: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7451 +//line sql.y:7507 { yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL - case 1512: + case 1524: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7457 +//line sql.y:7513 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1513: + case 1525: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7461 +//line sql.y:7517 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1514: + case 1526: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7465 +//line sql.y:7521 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1515: + case 1527: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7469 +//line sql.y:7525 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1516: + case 1528: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7474 +//line sql.y:7530 { yyVAL.str = "" } - case 1517: + case 1529: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7478 +//line sql.y:7534 { yyVAL.str = string(yyDollar[3].str) } - case 1518: + case 1530: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7482 +//line sql.y:7538 { yyVAL.str = string(yyDollar[3].str) } - case 1519: + case 1531: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7486 +//line sql.y:7542 { yyVAL.str = string(yyDollar[3].str) } - case 1520: + case 1532: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7491 +//line sql.y:7547 { yyVAL.str = "" } - case 1521: + case 1533: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7495 +//line sql.y:7551 { yyVAL.str = yyDollar[3].str } - case 1522: + case 1534: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7501 +//line sql.y:7557 { yyVAL.str = string(yyDollar[1].str) } - case 1523: + case 1535: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7505 +//line sql.y:7561 { yyVAL.str = string(yyDollar[1].str) } - case 1524: + case 1536: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7510 +//line sql.y:7566 { yyVAL.str = "" } - case 1525: + case 1537: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7514 +//line sql.y:7570 { yyVAL.str = yyDollar[2].str } - case 1526: + case 1538: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7519 +//line sql.y:7575 { yyVAL.str = "cascaded" } - case 1527: + case 1539: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7523 +//line sql.y:7579 { yyVAL.str = string(yyDollar[1].str) } - case 1528: + case 1540: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7527 +//line sql.y:7583 { yyVAL.str = string(yyDollar[1].str) } - case 1529: + case 1541: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:7532 +//line sql.y:7588 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1530: + case 1542: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7536 +//line sql.y:7592 { yyLOCAL = yyDollar[3].definerUnion() } yyVAL.union = yyLOCAL - case 1531: + case 1543: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:7542 +//line sql.y:7598 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1532: + case 1544: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7548 +//line sql.y:7604 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1533: + case 1545: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:7554 +//line sql.y:7610 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -21743,433 +21861,433 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1534: + case 1546: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7563 +//line sql.y:7619 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 1535: + case 1547: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7567 +//line sql.y:7623 { yyVAL.str = formatIdentifier(yyDollar[1].str) } - case 1536: + case 1548: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7572 +//line sql.y:7628 { yyVAL.str = "" } - case 1537: + case 1549: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7576 +//line sql.y:7632 { yyVAL.str = formatAddress(yyDollar[1].str) } - case 1538: + case 1550: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7582 +//line sql.y:7638 { yyLOCAL = ForUpdateLock } yyVAL.union = yyLOCAL - case 1539: + case 1551: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock -//line sql.y:7586 +//line sql.y:7642 { yyLOCAL = ForUpdateLockNoWait } yyVAL.union = yyLOCAL - case 1540: + case 1552: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7590 +//line sql.y:7646 { yyLOCAL = ForUpdateLockSkipLocked } yyVAL.union = yyLOCAL - case 1541: + case 1553: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7594 +//line sql.y:7650 { yyLOCAL = ForShareLock } yyVAL.union = yyLOCAL - case 1542: + case 1554: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock -//line sql.y:7598 +//line sql.y:7654 { yyLOCAL = ForShareLockNoWait } yyVAL.union = yyLOCAL - case 1543: + case 1555: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7602 +//line sql.y:7658 { yyLOCAL = ForShareLockSkipLocked } yyVAL.union = yyLOCAL - case 1544: + case 1556: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7606 +//line sql.y:7662 { yyLOCAL = ShareModeLock } yyVAL.union = yyLOCAL - case 1545: + case 1557: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7612 +//line sql.y:7668 { yyLOCAL = &SelectInto{Type: IntoOutfileS3, FileName: encodeSQLString(yyDollar[4].str), Charset: yyDollar[5].columnCharset, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } yyVAL.union = yyLOCAL - case 1546: + case 1558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7616 +//line sql.y:7672 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1547: + case 1559: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7620 +//line sql.y:7676 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1548: + case 1560: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7625 +//line sql.y:7681 { yyVAL.str = "" } - case 1549: + case 1561: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7629 +//line sql.y:7685 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1550: + case 1562: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7633 +//line sql.y:7689 { yyVAL.str = " format text" + yyDollar[3].str } - case 1551: + case 1563: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7638 +//line sql.y:7694 { yyVAL.str = "" } - case 1552: + case 1564: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7642 +//line sql.y:7698 { yyVAL.str = " header" } - case 1553: + case 1565: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7647 +//line sql.y:7703 { yyVAL.str = "" } - case 1554: + case 1566: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7651 +//line sql.y:7707 { yyVAL.str = " manifest on" } - case 1555: + case 1567: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7655 +//line sql.y:7711 { yyVAL.str = " manifest off" } - case 1556: + case 1568: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7660 +//line sql.y:7716 { yyVAL.str = "" } - case 1557: + case 1569: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7664 +//line sql.y:7720 { yyVAL.str = " overwrite on" } - case 1558: + case 1570: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7668 +//line sql.y:7724 { yyVAL.str = " overwrite off" } - case 1559: + case 1571: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7674 +//line sql.y:7730 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1560: + case 1572: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7679 +//line sql.y:7735 { yyVAL.str = "" } - case 1561: + case 1573: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7683 +//line sql.y:7739 { yyVAL.str = " lines" + yyDollar[2].str } - case 1562: + case 1574: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7689 +//line sql.y:7745 { yyVAL.str = yyDollar[1].str } - case 1563: + case 1575: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7693 +//line sql.y:7749 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1564: + case 1576: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7699 +//line sql.y:7755 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1565: + case 1577: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7703 +//line sql.y:7759 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1566: + case 1578: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7708 +//line sql.y:7764 { yyVAL.str = "" } - case 1567: + case 1579: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7712 +//line sql.y:7768 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1568: + case 1580: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7718 +//line sql.y:7774 { yyVAL.str = yyDollar[1].str } - case 1569: + case 1581: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7722 +//line sql.y:7778 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1570: + case 1582: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7728 +//line sql.y:7784 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1571: + case 1583: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7732 +//line sql.y:7788 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1572: + case 1584: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7736 +//line sql.y:7792 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1573: + case 1585: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7741 +//line sql.y:7797 { yyVAL.str = "" } - case 1574: + case 1586: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7745 +//line sql.y:7801 { yyVAL.str = " optionally" } - case 1575: + case 1587: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Insert -//line sql.y:7758 +//line sql.y:7814 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion(), RowAlias: yyDollar[3].rowAliasUnion()} } yyVAL.union = yyLOCAL - case 1576: + case 1588: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7762 +//line sql.y:7818 { yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1577: + case 1589: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *Insert -//line sql.y:7766 +//line sql.y:7822 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion(), RowAlias: yyDollar[6].rowAliasUnion()} } yyVAL.union = yyLOCAL - case 1578: + case 1590: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7770 +//line sql.y:7826 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion(), RowAlias: yyDollar[5].rowAliasUnion()} } yyVAL.union = yyLOCAL - case 1579: + case 1591: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7774 +//line sql.y:7830 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1580: + case 1592: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7780 +//line sql.y:7836 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1581: + case 1593: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7784 +//line sql.y:7840 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1582: + case 1594: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7788 +//line sql.y:7844 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 1583: + case 1595: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7792 +//line sql.y:7848 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) } - case 1584: + case 1596: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7797 +//line sql.y:7853 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1585: + case 1597: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7801 +//line sql.y:7857 { yyLOCAL = &RowAlias{TableName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 1586: + case 1598: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *RowAlias -//line sql.y:7805 +//line sql.y:7861 { yyLOCAL = &RowAlias{TableName: yyDollar[2].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 1587: + case 1599: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7810 +//line sql.y:7866 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1588: + case 1600: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7814 +//line sql.y:7870 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1589: + case 1601: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7820 +//line sql.y:7876 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1590: + case 1602: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7824 +//line sql.y:7880 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1591: + case 1603: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7830 +//line sql.y:7886 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1592: + case 1604: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7834 +//line sql.y:7890 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1593: + case 1605: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7840 +//line sql.y:7896 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1594: + case 1606: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7844 +//line sql.y:7900 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1595: + case 1607: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7849 +//line sql.y:7905 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -22178,300 +22296,300 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1596: + case 1608: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7859 +//line sql.y:7915 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1597: + case 1609: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7863 +//line sql.y:7919 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1598: + case 1610: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7869 +//line sql.y:7925 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1600: + case 1612: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7876 +//line sql.y:7932 { yyVAL.str = "charset" } - case 1603: + case 1615: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7886 +//line sql.y:7942 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } yyVAL.union = yyLOCAL - case 1604: + case 1616: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7890 +//line sql.y:7946 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1605: + case 1617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7894 +//line sql.y:7950 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1608: + case 1620: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7903 +//line sql.y:7959 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1609: + case 1621: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7905 +//line sql.y:7961 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1610: + case 1622: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7908 +//line sql.y:7964 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1611: + case 1623: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7910 +//line sql.y:7966 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1612: + case 1624: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7913 +//line sql.y:7969 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1613: + case 1625: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7915 +//line sql.y:7971 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1614: + case 1626: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7918 +//line sql.y:7974 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1615: + case 1627: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7920 +//line sql.y:7976 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1616: + case 1628: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7923 +//line sql.y:7979 { yyVAL.empty = struct{}{} } - case 1617: + case 1629: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7925 +//line sql.y:7981 { yyVAL.empty = struct{}{} } - case 1618: + case 1630: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7927 +//line sql.y:7983 { yyVAL.empty = struct{}{} } - case 1619: + case 1631: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7931 +//line sql.y:7987 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1620: + case 1632: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:7936 +//line sql.y:7992 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1621: + case 1633: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:7940 +//line sql.y:7996 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1622: + case 1634: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7945 +//line sql.y:8001 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1623: + case 1635: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7947 +//line sql.y:8003 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1624: + case 1636: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:7951 +//line sql.y:8007 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL - case 1625: + case 1637: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7957 +//line sql.y:8013 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1626: + case 1638: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7961 +//line sql.y:8017 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1628: + case 1640: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7968 +//line sql.y:8024 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1629: + case 1641: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7974 +//line sql.y:8030 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1630: + case 1642: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7978 +//line sql.y:8034 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1631: + case 1643: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7984 +//line sql.y:8040 { yyVAL.identifierCS = NewIdentifierCS("") } - case 1632: + case 1644: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7988 +//line sql.y:8044 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 1634: + case 1646: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7995 +//line sql.y:8051 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1635: + case 1647: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:8001 +//line sql.y:8057 { yyLOCAL = &Kill{Type: yyDollar[2].killTypeUnion(), ProcesslistID: convertStringToUInt64(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 1636: + case 1648: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL KillType -//line sql.y:8007 +//line sql.y:8063 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1637: + case 1649: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:8011 +//line sql.y:8067 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1638: + case 1650: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:8015 +//line sql.y:8071 { yyLOCAL = QueryType } yyVAL.union = yyLOCAL - case 2261: + case 2281: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8666 +//line sql.y:8730 { } - case 2262: + case 2282: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8671 +//line sql.y:8735 { } - case 2263: + case 2283: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8675 +//line sql.y:8739 { skipToEnd(yylex) } - case 2264: + case 2284: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8680 +//line sql.y:8744 { skipToEnd(yylex) } - case 2265: + case 2285: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8684 +//line sql.y:8748 { skipToEnd(yylex) } - case 2266: + case 2286: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8688 +//line sql.y:8752 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 7686aeaa726..18db4d2eb08 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -242,6 +242,12 @@ func markBindVariable(yylex yyLexer, bvar string) { // predicates as column modifiers, shifting on a '(' conflicts with reducing the keywords to a non_reserved_keyword. Since we want shifting to // take precedence, we add this precedence to the reduction rules. %nonassoc ANY_SOME +// SELECT_OPTIONS is used to resolve shift-reduce conflicts occurring due to select options that are non-reserved keywords. +// When parsing select_options_opt if we encounter a select option like `SQL_BUFFER_RESULT`, we can either reduce select_options_opt and use it as a table name +// or we can shift and use it as a select option. Since we want the latter option, we want to prioritize shifting over reducing. +// Adding no precedence also works, since shifting is the default, but it reports some conflicts +// We need to add a lower precedence to reducing the select_options_opt rule than shifting. +%nonassoc SELECT_OPTIONS %token LEX_ERROR %left UNION @@ -253,12 +259,12 @@ func markBindVariable(yylex yyLexer, bvar string) { %token DUMPFILE CSV HEADER MANIFEST OVERWRITE STARTING OPTIONALLY %token VALUES LAST_INSERT_ID %token NEXT VALUE SHARE MODE -%token SQL_NO_CACHE SQL_CACHE SQL_CALC_FOUND_ROWS +%token SQL_NO_CACHE SQL_CACHE SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT SQL_BIG_RESULT HIGH_PRIORITY %left JOIN STRAIGHT_JOIN LEFT RIGHT INNER OUTER CROSS NATURAL USE FORCE %left ON USING INPLACE COPY INSTANT ALGORITHM NONE SHARED EXCLUSIVE %left SUBQUERY_AS_EXPR %left '(' ',' ')' -%nonassoc STRING +%nonassoc STRING SQL_BUFFER_RESULT %token ID AT_ID AT_AT_ID HEX NCHAR_STRING INTEGRAL FLOAT DECIMAL HEXNUM COMMENT COMMENT_KEYWORD BITNUM BIT_LITERAL COMPRESSION %token VALUE_ARG LIST_ARG OFFSET_ARG %token JSON_PRETTY JSON_STORAGE_SIZE JSON_STORAGE_FREE JSON_CONTAINS JSON_CONTAINS_PATH JSON_EXTRACT JSON_KEYS JSON_OVERLAPS JSON_SEARCH JSON_VALUE @@ -268,7 +274,7 @@ func markBindVariable(yylex yyLexer, bvar string) { %token DISCARD IMPORT ENABLE DISABLE TABLESPACE %token VIRTUAL STORED %token BOTH LEADING TRAILING -%token KILL +%token KILL TRACE %left EMPTY_FROM_CLAUSE %right INTO @@ -330,6 +336,7 @@ func markBindVariable(yylex yyLexer, bvar string) { // Transaction Tokens %token BEGIN START TRANSACTION COMMIT ROLLBACK SAVEPOINT RELEASE WORK %token CONSISTENT SNAPSHOT +%token UNRESOLVED TRANSACTIONS // Type Tokens %token BIT TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINT INTNUM @@ -341,6 +348,8 @@ func markBindVariable(yylex yyLexer, bvar string) { %token GEOMETRY POINT LINESTRING POLYGON GEOMCOLLECTION GEOMETRYCOLLECTION MULTIPOINT MULTILINESTRING MULTIPOLYGON %token ASCII UNICODE // used in CONVERT/CAST types +%nonassoc VECTOR + // Type Modifiers %token NULLX AUTO_INCREMENT APPROXNUM SIGNED UNSIGNED ZEROFILL @@ -545,7 +554,7 @@ func markBindVariable(yylex yyLexer, bvar string) { %type columns_or_fields extended_opt storage_opt %type like_or_where_opt like_opt %type exists_opt not_exists_opt enforced enforced_opt temp_opt full_opt -%type to_opt +%type to_opt for_opt %type reserved_keyword non_reserved_keyword %type sql_id sql_id_opt reserved_sql_id col_alias as_ci_opt %type charset_value @@ -746,7 +755,7 @@ with_list: common_table_expr: table_id column_list_opt AS subquery { - $$ = &CommonTableExpr{ID: $1, Columns: $2, Subquery: $4} + $$ = &CommonTableExpr{ID: $1, Columns: $2, Subquery: $4.Select} } query_expression_parens: @@ -1262,36 +1271,36 @@ alter_table_prefix: create_index_prefix: CREATE comment_opt INDEX sql_id using_opt ON table_name { - $$ = &AlterTable{Table: $7, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition:&IndexDefinition{Info: &IndexInfo{Name:$4}, Options:$5}}}} + $$ = &AlterTable{Comments: Comments($2).Parsed(), Table: $7, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition:&IndexDefinition{Info: &IndexInfo{Name:$4}, Options:$5}}}} setDDL(yylex, $$) } | CREATE comment_opt FULLTEXT INDEX sql_id using_opt ON table_name { - $$ = &AlterTable{Table: $8, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition:&IndexDefinition{Info: &IndexInfo{Name:$5, Type: IndexTypeFullText}, Options:$6}}}} + $$ = &AlterTable{Comments: Comments($2).Parsed(), Table: $8, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition:&IndexDefinition{Info: &IndexInfo{Name:$5, Type: IndexTypeFullText}, Options:$6}}}} setDDL(yylex, $$) } | CREATE comment_opt SPATIAL INDEX sql_id using_opt ON table_name { - $$ = &AlterTable{Table: $8, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition:&IndexDefinition{Info: &IndexInfo{Name:$5, Type: IndexTypeSpatial}, Options:$6}}}} + $$ = &AlterTable{Comments: Comments($2).Parsed(), Table: $8, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition:&IndexDefinition{Info: &IndexInfo{Name:$5, Type: IndexTypeSpatial}, Options:$6}}}} setDDL(yylex, $$) } | CREATE comment_opt UNIQUE INDEX sql_id using_opt ON table_name { - $$ = &AlterTable{Table: $8, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition:&IndexDefinition{Info: &IndexInfo{Name:$5, Type: IndexTypeUnique}, Options:$6}}}} + $$ = &AlterTable{Comments: Comments($2).Parsed(), Table: $8, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition:&IndexDefinition{Info: &IndexInfo{Name:$5, Type: IndexTypeUnique}, Options:$6}}}} setDDL(yylex, $$) } create_database_prefix: - CREATE comment_opt database_or_schema comment_opt not_exists_opt table_id + CREATE comment_opt database_or_schema not_exists_opt table_id { - $$ = &CreateDatabase{Comments: Comments($4).Parsed(), DBName: $6, IfNotExists: $5} + $$ = &CreateDatabase{Comments: Comments($2).Parsed(), DBName: $5, IfNotExists: $4} setDDL(yylex,$$) } alter_database_prefix: ALTER comment_opt database_or_schema { - $$ = &AlterDatabase{} + $$ = &AlterDatabase{Comments: Comments($2).Parsed()} setDDL(yylex,$$) } @@ -1721,10 +1730,6 @@ text_literal %prec MULTIPLE_TEXT_LITERAL { $$ = &IntroducerExpr{CharacterSet: $1, Expr: NewHexLiteral($2)} } -| underscore_charsets column_name_or_offset %prec UNARY - { - $$ = &IntroducerExpr{CharacterSet: $1, Expr: $2} - } | underscore_charsets VALUE_ARG %prec UNARY { arg := parseBindVariable(yylex, $2[1:]) @@ -2172,6 +2177,10 @@ char_type: { $$ = &ColumnType{Type: string($1), EnumValues: $3, Charset: $5} } +| VECTOR length_opt + { + $$ = &ColumnType{Type: string($1), Length: $2} + } // need set_values / SetValues ? | SET '(' enum_values ')' charset_opt { @@ -3302,6 +3311,12 @@ alter_statement: UUID: string($4), } } +| ALTER comment_opt VITESS_MIGRATION CLEANUP ALL + { + $$ = &AlterMigration{ + Type: CleanupAllMigrationType, + } + } | ALTER comment_opt VITESS_MIGRATION STRING LAUNCH { $$ = &AlterMigration{ @@ -3962,9 +3977,9 @@ drop_statement: { // Change this to an alter statement if $4.Lowered() == "primary" { - $$ = &AlterTable{FullyParsed:true, Table: $6,AlterOptions: append([]AlterOption{&DropKey{Type:PrimaryKeyType}},$7...)} + $$ = &AlterTable{Comments: Comments($2).Parsed(), FullyParsed:true, Table: $6,AlterOptions: append([]AlterOption{&DropKey{Type:PrimaryKeyType}},$7...)} } else { - $$ = &AlterTable{FullyParsed: true, Table: $6,AlterOptions: append([]AlterOption{&DropKey{Type:NormalKeyType, Name:$4}},$7...)} + $$ = &AlterTable{Comments: Comments($2).Parsed(), FullyParsed: true, Table: $6,AlterOptions: append([]AlterOption{&DropKey{Type:NormalKeyType, Name:$4}},$7...)} } } | DROP comment_opt VIEW exists_opt view_name_list restrict_or_cascade_opt @@ -4218,6 +4233,23 @@ show_statement: { $$ = &Show{&ShowOther{Command: string($2)}} } +| SHOW TRANSACTION STATUS for_opt STRING + { + $$ = &Show{&ShowTransactionStatus{TransactionID: string($5)}} + } +| SHOW UNRESOLVED TRANSACTIONS + { + $$ = &Show{&ShowTransactionStatus{}} + } +| SHOW UNRESOLVED TRANSACTIONS FOR table_id + { + $$ = &Show{&ShowTransactionStatus{Keyspace: $5.String()}} + } + +for_opt: + {} +| FOR + {} extended_opt: /* empty */ @@ -4464,6 +4496,14 @@ vexplain_type_opt: { $$ = QueriesVExplainType } +| TRACE + { + $$ = TraceVExplainType + } +| KEYS + { + $$ = KeysVExplainType + } explain_synonyms: EXPLAIN @@ -4795,10 +4835,10 @@ deallocate_statement: } select_options_opt: - { + %prec SELECT_OPTIONS { $$ = nil } -| select_options +| select_options %prec SELECT_OPTIONS { $$ = $1 } @@ -4830,10 +4870,26 @@ select_option: { $$ = DistinctStr } +| HIGH_PRIORITY + { + $$ = HighPriorityStr + } | STRAIGHT_JOIN { $$ = StraightJoinHint } +| SQL_BUFFER_RESULT + { + $$ = SQLBufferResultStr + } +| SQL_SMALL_RESULT + { + $$ = SQLSmallResultStr + } +| SQL_BIG_RESULT + { + $$ = SQLBigResultStr + } | SQL_CALC_FOUND_ROWS { $$ = SQLCalcFoundRowsStr @@ -5531,11 +5587,11 @@ function_call_keyword } | column_name_or_offset JSON_EXTRACT_OP text_literal_or_arg { - $$ = &BinaryExpr{Left: $1, Operator: JSONExtractOp, Right: $3} + $$ = &JSONExtractExpr{JSONDoc: $1, PathList: []Expr{$3}} } | column_name_or_offset JSON_UNQUOTE_EXTRACT_OP text_literal_or_arg { - $$ = &BinaryExpr{Left: $1, Operator: JSONUnquoteExtractOp, Right: $3} + $$ = &JSONUnquoteExpr{JSONValue: &JSONExtractExpr{JSONDoc: $1, PathList: []Expr{$3}}} } column_names_opt_paren: @@ -8083,6 +8139,7 @@ reserved_keyword: | GROUPING | GROUPS | HAVING +| HIGH_PRIORITY | IF | IGNORE | IN @@ -8151,6 +8208,8 @@ reserved_keyword: | SET | SHOW | SPATIAL +| SQL_BIG_RESULT +| SQL_SMALL_RESULT | STORED | STRAIGHT_JOIN | SYSDATE @@ -8497,6 +8556,7 @@ non_reserved_keyword: | SNAPSHOT | SOME %prec ANY_SOME | SQL +| SQL_BUFFER_RESULT | SQL_TSI_DAY | SQL_TSI_HOUR | SQL_TSI_MINUTE @@ -8585,8 +8645,10 @@ non_reserved_keyword: | TINYBLOB | TINYINT | TINYTEXT +| TRACE | TRADITIONAL | TRANSACTION +| TRANSACTIONS | TREE | TRIGGER | TRIGGERS @@ -8597,6 +8659,7 @@ non_reserved_keyword: | UNDEFINED | UNICODE | UNKNOWN +| UNRESOLVED | UNSIGNED | UNTHROTTLE | UNUSED @@ -8612,6 +8675,7 @@ non_reserved_keyword: | VARIABLES | VARIANCE %prec FUNCTION_CALL_NON_KEYWORD | VCPU +| VECTOR | VEXPLAIN | VGTID_EXECUTED | VIEW diff --git a/go/vt/sqlparser/testdata/select_cases.txt b/go/vt/sqlparser/testdata/select_cases.txt index 6fedca5ddfd..453bc54381a 100644 --- a/go/vt/sqlparser/testdata/select_cases.txt +++ b/go/vt/sqlparser/testdata/select_cases.txt @@ -1501,8 +1501,8 @@ END INPUT select sql_big_result distinct t1.a from t1,t2; END -ERROR -syntax error at position 31 near 'distinct' +OUTPUT +select distinct sql_big_result t1.a from t1, t2 END INPUT select * from t1 where a = 'b' and a = 'b'; @@ -1921,8 +1921,8 @@ END INPUT select sql_small_result t2.id, avg(rating+0.0e0) from t2 group by t2.id; END -ERROR -syntax error at position 28 +OUTPUT +select sql_small_result t2.id, avg(rating + 0.0e0) from t2 group by t2.id END INPUT select 12 % null as 'NULL'; @@ -2317,8 +2317,8 @@ END INPUT select sql_big_result trim(t),count(t) from t1 group by t order by t limit 10; END -ERROR -syntax error at position 28 +OUTPUT +select sql_big_result trim(t), count(t) from t1 group by t order by t asc limit 10 END INPUT select cast(rtrim(' 20.06 ') as decimal(19,2)); @@ -3080,7 +3080,7 @@ INPUT select sql_big_result score,count(*) from t1 group by score order by score desc; END OUTPUT -select `sql_big_result` as score, count(*) from t1 group by score order by score desc +select sql_big_result score, count(*) from t1 group by score order by score desc END INPUT select * from information_schema.TABLE_CONSTRAINTS where TABLE_SCHEMA= "test" order by constraint_name; @@ -4022,7 +4022,7 @@ INPUT select SQL_BIG_RESULT distinct from t1, t2 order by 1, 2, 3, 4; END ERROR -syntax error at position 31 near 'distinct' +syntax error at position 36 near 'from' END INPUT select benchmark(100, (select avg(func_26093_b(a, rand())) from table_26093)); @@ -4831,8 +4831,8 @@ END INPUT select sql_big_result trim(v),count(t) from t1 group by v order by v limit 10; END -ERROR -syntax error at position 28 +OUTPUT +select sql_big_result trim(v), count(t) from t1 group by v order by v asc limit 10 END INPUT select count(distinct x.id_aams) into not_installed from (select * from (select t1.id_aams, t2.* from t1 left join t2 on t2.code_id = vlt_code_id and t1.id_aams = t2.id_game where t1.id_aams = 1715000360 order by t2.id desc ) as g group by g.id_aams having g.id is null ) as x; @@ -5348,7 +5348,7 @@ INPUT select sql_big_result spid,sum(userid) from t1 group by spid order by spid desc; END OUTPUT -select `sql_big_result` as spid, sum(userid) from t1 group by spid order by spid desc +select sql_big_result spid, sum(userid) from t1 group by spid order by spid desc END INPUT select * from t1 where f1='test' and (f2= md5("test") or f2= md5("TEST")); @@ -6643,8 +6643,8 @@ END INPUT select SQL_BIG_RESULT t1.b from t1, t2 group by t1.b order by 1; END -ERROR -syntax error at position 26 +OUTPUT +select sql_big_result t1.b from t1, t2 group by t1.b order by 1 asc END INPUT select group_concat(c1 order by binary c1 separator '') from t1 group by c1 collate utf32_spanish_ci; @@ -7238,7 +7238,7 @@ INPUT select trace from information_schema.optimizer_trace; END OUTPUT -select trace from information_schema.optimizer_trace +select `trace` from information_schema.optimizer_trace END INPUT select collation(group_concat(a,_koi8r 0xC1C2)) from t1; @@ -7585,8 +7585,8 @@ END INPUT select sql_buffer_result max(f1) is null from t1; END -ERROR -syntax error at position 30 +OUTPUT +select sql_buffer_result max(f1) is null from t1 END INPUT select substring('hello', -1, -1); @@ -10640,7 +10640,7 @@ INPUT select sql_big_result c,count(t) from t1 group by c order by c limit 10; END OUTPUT -select `sql_big_result` as c, count(t) from t1 group by c order by c asc limit 10 +select sql_big_result c, count(t) from t1 group by c order by c asc limit 10 END INPUT select * from t3 where b in (select a from t1); @@ -12007,8 +12007,8 @@ END INPUT select sql_small_result t2.id, avg(rating) from t2 group by t2.id; END -ERROR -syntax error at position 28 +OUTPUT +select sql_small_result t2.id, avg(rating) from t2 group by t2.id END INPUT select mid('hello',1,null),mid('hello',null,1),mid(null,1,1); @@ -15391,8 +15391,8 @@ END INPUT select SQL_BIG_RESULT distinct t1.a from t1, t2 group by t1.b order by 1; END -ERROR -syntax error at position 31 near 'distinct' +OUTPUT +select distinct sql_big_result t1.a from t1, t2 group by t1.b order by 1 asc END INPUT select t1.time+0,t1.date+0,t1.timestamp+0,concat(date," ",time), t1.quarter+t1.week, t1.year+timestampadd, timestampdiff from t1; @@ -16831,8 +16831,8 @@ END INPUT select SQL_BUFFER_RESULT from t1 order by 1, 2; END -OUTPUT -select SQL_BUFFER_RESULT from t1 order by 1 asc, 2 asc +ERROR +syntax error at position 30 near 'from' END INPUT select collation(convert('a',char(2) ascii)), collation(convert('a',char(2) ascii binary)); @@ -19129,8 +19129,8 @@ END INPUT select sql_big_result trim(v),count(c) from t1 group by v order by v limit 10; END -ERROR -syntax error at position 28 +OUTPUT +select sql_big_result trim(v), count(c) from t1 group by v order by v asc limit 10 END INPUT select 1, min(a) from t1m where a=99; @@ -19171,8 +19171,8 @@ END INPUT select SQL_BIG_RESULT bit_and(col), bit_or(col) from t1 group by col; END -ERROR -syntax error at position 31 +OUTPUT +select sql_big_result bit_and(col), bit_or(col) from t1 group by col END INPUT select 3; @@ -19681,8 +19681,8 @@ END INPUT select sql_big_result t2.id, avg(rating+0.0e0) from t2 group by t2.id; END -ERROR -syntax error at position 26 +OUTPUT +select sql_big_result t2.id, avg(rating + 0.0e0) from t2 group by t2.id END INPUT select cast(NULL as signed); @@ -19705,8 +19705,8 @@ END INPUT select sql_big_result distinct t1.a from t1,t2 order by t2.a; END -ERROR -syntax error at position 31 near 'distinct' +OUTPUT +select distinct sql_big_result t1.a from t1, t2 order by t2.a asc END INPUT select reverse('abc'),reverse('abcd'); @@ -20000,7 +20000,7 @@ INPUT select SQL_BIG_RESULT a,count(b), sum(b), avg(b), std(b), min(b), max(b), bit_and(b), bit_or(b), bit_xor(b) from t1 group by a; END OUTPUT -select `SQL_BIG_RESULT` as a, count(b), sum(b), avg(b), std(b), min(b), max(b), bit_and(b), bit_or(b), bit_xor(b) from t1 group by a +select sql_big_result a, count(b), sum(b), avg(b), std(b), min(b), max(b), bit_and(b), bit_or(b), bit_xor(b) from t1 group by a END INPUT select * from (t2 join t4 on b + 1 = y) join t1 on t1.c = t4.c; @@ -20371,8 +20371,8 @@ END INPUT select sql_big_result t2.id, avg(rating) from t2 group by t2.id; END -ERROR -syntax error at position 26 +OUTPUT +select sql_big_result t2.id, avg(rating) from t2 group by t2.id END INPUT select ST_Astext(ST_Envelope(ST_MPointFromWKB(ST_AsWKB(MultiPoint(Point('0', '-0'),Point('-0', '0'), Point('0', '0')))))) as result; @@ -20852,7 +20852,7 @@ INPUT select SQL_BIG_RESULT a,count(b), sum(b), avg(b), std(b), min(b), max(b), bit_and(b), bit_or(b) from t1 group by a; END OUTPUT -select `SQL_BIG_RESULT` as a, count(b), sum(b), avg(b), std(b), min(b), max(b), bit_and(b), bit_or(b) from t1 group by a +select sql_big_result a, count(b), sum(b), avg(b), std(b), min(b), max(b), bit_and(b), bit_or(b) from t1 group by a END INPUT select lpad('hello', 18446744073709551617, '1'); @@ -20911,8 +20911,8 @@ END INPUT select sql_buffer_result max(f1)+1 from t1; END -ERROR -syntax error at position 30 +OUTPUT +select sql_buffer_result max(f1) + 1 from t1 END INPUT select t1Aa.col1 from t1aA,t2Aa where t1Aa.col1 = t2aA.col1; @@ -21721,8 +21721,8 @@ END INPUT select SQL_BUFFER_RESULT from t1 WHERE (SEQ = 1); END -OUTPUT -select SQL_BUFFER_RESULT from t1 where SEQ = 1 +ERROR +syntax error at position 30 near 'from' END INPUT select i, count(*), std(s1/s2) from bug22555 group by i order by i; diff --git a/go/vt/sqlparser/tracked_buffer.go b/go/vt/sqlparser/tracked_buffer.go index aec206f3b3d..48efe9547af 100644 --- a/go/vt/sqlparser/tracked_buffer.go +++ b/go/vt/sqlparser/tracked_buffer.go @@ -18,6 +18,7 @@ package sqlparser import ( "fmt" + "strconv" "strings" ) @@ -211,7 +212,32 @@ func (buf *TrackedBuffer) astPrintf(currentNode SQLNode, format string, values . } } case 'd': - buf.WriteString(fmt.Sprintf("%d", values[fieldnum])) + switch v := values[fieldnum].(type) { + case int: + buf.WriteInt(int64(v)) + case int8: + buf.WriteInt(int64(v)) + case int16: + buf.WriteInt(int64(v)) + case int32: + buf.WriteInt(int64(v)) + case int64: + buf.WriteInt(v) + case uint: + buf.WriteUint(uint64(v)) + case uint8: + buf.WriteUint(uint64(v)) + case uint16: + buf.WriteUint(uint64(v)) + case uint32: + buf.WriteUint(uint64(v)) + case uint64: + buf.WriteUint(v) + case uintptr: + buf.WriteUint(uint64(v)) + default: + panic(fmt.Sprintf("unexepcted TrackedBuffer type %T", v)) + } case 'a': buf.WriteArg("", values[fieldnum].(string)) default: @@ -288,14 +314,26 @@ func areBothISExpr(op Expr, val Expr) bool { // WriteArg writes a value argument into the buffer along with // tracking information for future substitutions. func (buf *TrackedBuffer) WriteArg(prefix, arg string) { + length := len(prefix) + len(arg) buf.bindLocations = append(buf.bindLocations, BindLocation{ Offset: buf.Len(), - Length: len(prefix) + len(arg), + Length: length, }) + buf.Grow(length) buf.WriteString(prefix) buf.WriteString(arg) } +// WriteInt writes a signed integer into the buffer. +func (buf *TrackedBuffer) WriteInt(v int64) { + buf.WriteString(strconv.FormatInt(v, 10)) +} + +// WriteUint writes an unsigned integer into the buffer. +func (buf *TrackedBuffer) WriteUint(v uint64) { + buf.WriteString(strconv.FormatUint(v, 10)) +} + // ParsedQuery returns a ParsedQuery that contains bind // locations for easy substitution. func (buf *TrackedBuffer) ParsedQuery() *ParsedQuery { @@ -335,7 +373,6 @@ func UnescapedString(node SQLNode) string { buf.SetEscapeNoIdentifier() node.Format(buf) return buf.String() - } // CanonicalString returns a canonical string representation of an SQLNode where all identifiers diff --git a/go/vt/sqlparser/tracked_buffer_test.go b/go/vt/sqlparser/tracked_buffer_test.go index 4dff65634e8..13b1363421e 100644 --- a/go/vt/sqlparser/tracked_buffer_test.go +++ b/go/vt/sqlparser/tracked_buffer_test.go @@ -270,7 +270,7 @@ func TestCanonicalOutput(t *testing.T) { }, { "create table t (id int, info JSON, INDEX zips((CAST(info->'$.field' AS unsigned array))))", - "CREATE TABLE `t` (\n\t`id` int,\n\t`info` JSON,\n\tKEY `zips` ((CAST(`info` -> '$.field' AS unsigned array)))\n)", + "CREATE TABLE `t` (\n\t`id` int,\n\t`info` JSON,\n\tKEY `zips` ((CAST(JSON_EXTRACT(`info`, '$.field') AS unsigned array)))\n)", }, { "select 1 from t1 into outfile 'test/t1.txt'", @@ -295,3 +295,35 @@ func TestCanonicalOutput(t *testing.T) { }) } } + +func TestTrackedBufferMyprintf(t *testing.T) { + testcases := []struct { + input string + output string + args []any + }{ + { + input: "nothing", + output: "nothing", + args: []any{}, + }, + { + input: "my name is %s", + output: "my name is Homer", + args: []any{"Homer"}, + }, + { + input: "%d %d %d %d %d %d %d %d %d %d %d", + output: "1 2 3 4 5 6 7 8 9 10 11", + args: []any{int(1), int8(2), int16(3), int32(4), int64(5), uint(6), uint8(7), uint16(8), uint32(9), uint64(10), uintptr(11)}, + }, + } + for _, tc := range testcases { + t.Run(tc.input, func(t *testing.T) { + buf := NewTrackedBuffer(nil) + buf.Myprintf(tc.input, tc.args...) + got := buf.String() + assert.Equal(t, tc.output, got) + }) + } +} diff --git a/go/vt/srvtopo/discover.go b/go/vt/srvtopo/discover.go index 2997dc42e21..2b020e89887 100644 --- a/go/vt/srvtopo/discover.go +++ b/go/vt/srvtopo/discover.go @@ -17,9 +17,8 @@ limitations under the License. package srvtopo import ( - "sync" - "context" + "sync" "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/log" @@ -29,15 +28,16 @@ import ( topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) -// FindAllTargets goes through all serving shards in the topology for the provided keyspaces +// FindAllTargetsAndKeyspaces goes through all serving shards in the topology for the provided keyspaces // and tablet types. If no keyspaces are provided all available keyspaces in the topo are // fetched. It returns one Target object per keyspace/shard/matching TabletType. -func FindAllTargets(ctx context.Context, ts Server, cell string, keyspaces []string, tabletTypes []topodatapb.TabletType) ([]*querypb.Target, error) { +// It also returns all the keyspaces that it found. +func FindAllTargetsAndKeyspaces(ctx context.Context, ts Server, cell string, keyspaces []string, tabletTypes []topodatapb.TabletType) ([]*querypb.Target, []string, error) { var err error if len(keyspaces) == 0 { keyspaces, err = ts.GetSrvKeyspaceNames(ctx, cell, true) if err != nil { - return nil, err + return nil, nil, err } } @@ -95,8 +95,8 @@ func FindAllTargets(ctx context.Context, ts Server, cell string, keyspaces []str } wg.Wait() if errRecorder.HasErrors() { - return nil, errRecorder.Error() + return nil, nil, errRecorder.Error() } - return targets, nil + return targets, keyspaces, nil } diff --git a/go/vt/srvtopo/discover_test.go b/go/vt/srvtopo/discover_test.go index 75c5f25cc6e..90929586702 100644 --- a/go/vt/srvtopo/discover_test.go +++ b/go/vt/srvtopo/discover_test.go @@ -49,7 +49,7 @@ func (a TargetArray) Less(i, j int) bool { return a[i].TabletType < a[j].TabletType } -func TestFindAllTargets(t *testing.T) { +func TestFindAllTargetsAndKeyspaces(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1", "cell2") @@ -65,9 +65,10 @@ func TestFindAllTargets(t *testing.T) { rs := NewResilientServer(ctx, ts, counts) // No keyspace / shards. - ks, err := FindAllTargets(ctx, rs, "cell1", []string{"test_keyspace"}, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}) + targets, ksList, err := FindAllTargetsAndKeyspaces(ctx, rs, "cell1", []string{"test_keyspace"}, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}) assert.NoError(t, err) - assert.Len(t, ks, 0) + assert.Len(t, targets, 0) + assert.EqualValues(t, []string{"test_keyspace"}, ksList) // Add one. assert.NoError(t, ts.UpdateSrvKeyspace(ctx, "cell1", "test_keyspace", &topodatapb.SrvKeyspace{ @@ -84,7 +85,7 @@ func TestFindAllTargets(t *testing.T) { })) // Get it. - ks, err = FindAllTargets(ctx, rs, "cell1", []string{"test_keyspace"}, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}) + targets, ksList, err = FindAllTargetsAndKeyspaces(ctx, rs, "cell1", []string{"test_keyspace"}, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}) assert.NoError(t, err) assert.EqualValues(t, []*querypb.Target{ { @@ -93,10 +94,11 @@ func TestFindAllTargets(t *testing.T) { Shard: "test_shard0", TabletType: topodatapb.TabletType_PRIMARY, }, - }, ks) + }, targets) + assert.EqualValues(t, []string{"test_keyspace"}, ksList) // Get any keyspace. - ks, err = FindAllTargets(ctx, rs, "cell1", nil, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}) + targets, ksList, err = FindAllTargetsAndKeyspaces(ctx, rs, "cell1", nil, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}) assert.NoError(t, err) assert.EqualValues(t, []*querypb.Target{ { @@ -105,7 +107,8 @@ func TestFindAllTargets(t *testing.T) { Shard: "test_shard0", TabletType: topodatapb.TabletType_PRIMARY, }, - }, ks) + }, targets) + assert.EqualValues(t, []string{"test_keyspace"}, ksList) // Add another one. assert.NoError(t, ts.UpdateSrvKeyspace(ctx, "cell1", "test_keyspace2", &topodatapb.SrvKeyspace{ @@ -130,9 +133,9 @@ func TestFindAllTargets(t *testing.T) { })) // Get it for any keyspace, all types. - ks, err = FindAllTargets(ctx, rs, "cell1", nil, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY, topodatapb.TabletType_REPLICA}) + targets, ksList, err = FindAllTargetsAndKeyspaces(ctx, rs, "cell1", nil, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY, topodatapb.TabletType_REPLICA}) assert.NoError(t, err) - sort.Sort(TargetArray(ks)) + sort.Sort(TargetArray(targets)) assert.EqualValues(t, []*querypb.Target{ { Cell: "cell1", @@ -152,10 +155,12 @@ func TestFindAllTargets(t *testing.T) { Shard: "test_shard2", TabletType: topodatapb.TabletType_REPLICA, }, - }, ks) + }, targets) + sort.Strings(ksList) + assert.EqualValues(t, []string{"test_keyspace", "test_keyspace2"}, ksList) // Only get 1 keyspace for all types. - ks, err = FindAllTargets(ctx, rs, "cell1", []string{"test_keyspace2"}, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY, topodatapb.TabletType_REPLICA}) + targets, ksList, err = FindAllTargetsAndKeyspaces(ctx, rs, "cell1", []string{"test_keyspace2"}, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY, topodatapb.TabletType_REPLICA}) assert.NoError(t, err) assert.EqualValues(t, []*querypb.Target{ { @@ -170,10 +175,11 @@ func TestFindAllTargets(t *testing.T) { Shard: "test_shard2", TabletType: topodatapb.TabletType_REPLICA, }, - }, ks) + }, targets) + assert.EqualValues(t, []string{"test_keyspace2"}, ksList) // Only get the REPLICA targets for any keyspace. - ks, err = FindAllTargets(ctx, rs, "cell1", []string{}, []topodatapb.TabletType{topodatapb.TabletType_REPLICA}) + targets, ksList, err = FindAllTargetsAndKeyspaces(ctx, rs, "cell1", []string{}, []topodatapb.TabletType{topodatapb.TabletType_REPLICA}) assert.NoError(t, err) assert.Equal(t, []*querypb.Target{ { @@ -182,10 +188,13 @@ func TestFindAllTargets(t *testing.T) { Shard: "test_shard2", TabletType: topodatapb.TabletType_REPLICA, }, - }, ks) + }, targets) + sort.Strings(ksList) + assert.EqualValues(t, []string{"test_keyspace", "test_keyspace2"}, ksList) // Get non-existent keyspace. - ks, err = FindAllTargets(ctx, rs, "cell1", []string{"doesnt-exist"}, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY, topodatapb.TabletType_REPLICA}) + targets, ksList, err = FindAllTargetsAndKeyspaces(ctx, rs, "cell1", []string{"doesnt-exist"}, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY, topodatapb.TabletType_REPLICA}) assert.NoError(t, err) - assert.Len(t, ks, 0) + assert.Len(t, targets, 0) + assert.EqualValues(t, []string{"doesnt-exist"}, ksList) } diff --git a/go/vt/sysvars/sysvars.go b/go/vt/sysvars/sysvars.go index c8037563ca1..297ed956bf8 100644 --- a/go/vt/sysvars/sysvars.go +++ b/go/vt/sysvars/sysvars.go @@ -191,6 +191,7 @@ var ( {Name: ForeignKeyChecks, IsBoolean: true, SupportSetVar: true}, {Name: "group_concat_max_len", SupportSetVar: true}, {Name: "information_schema_stats_expiry"}, + {Name: "innodb_lock_wait_timeout"}, {Name: "max_heap_table_size", SupportSetVar: true}, {Name: "max_seeks_for_key", SupportSetVar: true}, {Name: "max_tmp_tables"}, @@ -246,7 +247,6 @@ var ( {Name: "collation_server"}, {Name: "completion_type"}, {Name: "div_precision_increment", SupportSetVar: true}, - {Name: "innodb_lock_wait_timeout"}, {Name: "interactive_timeout"}, {Name: "lc_time_names"}, {Name: "lock_wait_timeout", SupportSetVar: true}, diff --git a/go/vt/throttler/demo/throttler_demo.go b/go/vt/throttler/demo/throttler_demo.go index 032b1fae3ca..13927f90c12 100644 --- a/go/vt/throttler/demo/throttler_demo.go +++ b/go/vt/throttler/demo/throttler_demo.go @@ -239,7 +239,7 @@ func newClient(ctx context.Context, primary *primary, replica *replica, ts *topo log.Fatal(err) } - healthCheck := discovery.NewHealthCheck(ctx, 5*time.Second, 1*time.Minute, ts, "cell1", "") + healthCheck := discovery.NewHealthCheck(ctx, 5*time.Second, 1*time.Minute, ts, "cell1", "", nil) c := &client{ primary: primary, healthCheck: healthCheck, diff --git a/go/vt/throttler/replication_lag_cache.go b/go/vt/throttler/replication_lag_cache.go index c9c2e94f113..d47b82474ac 100644 --- a/go/vt/throttler/replication_lag_cache.go +++ b/go/vt/throttler/replication_lag_cache.go @@ -18,6 +18,7 @@ package throttler import ( "sort" + "sync" "time" "vitess.io/vitess/go/vt/discovery" @@ -30,6 +31,8 @@ type replicationLagCache struct { // The map key is replicationLagRecord.LegacyTabletStats.Key. entries map[string]*replicationLagHistory + mu sync.Mutex + // slowReplicas is a set of slow replicas. // The map key is replicationLagRecord.LegacyTabletStats.Key. // This map will always be recomputed by sortByLag() and must not be modified @@ -60,6 +63,9 @@ func newReplicationLagCache(historyCapacityPerReplica int) *replicationLagCache // add inserts or updates "r" in the cache for the replica with the key "r.Key". func (c *replicationLagCache) add(r replicationLagRecord) { + c.mu.Lock() + defer c.mu.Unlock() + if !r.Serving { // Tablet is down. Do no longer track it. delete(c.entries, discovery.TabletToMapKey(r.Tablet)) @@ -76,9 +82,35 @@ func (c *replicationLagCache) add(r replicationLagRecord) { entry.add(r) } +// maxLag returns the maximum replication lag for the entries in cache. +func (c *replicationLagCache) maxLag() (maxLag uint32) { + c.mu.Lock() + defer c.mu.Unlock() + + for key := range c.entries { + if c.isIgnored(key) { + continue + } + + entry := c.entries[key] + if entry == nil { + continue + } + + latest := entry.latest() + if lag := latest.Stats.ReplicationLagSeconds; lag > maxLag { + maxLag = lag + } + } + + return maxLag +} + // latest returns the current lag record for the given LegacyTabletStats.Key string. // A zero record is returned if there is no latest entry. func (c *replicationLagCache) latest(key string) replicationLagRecord { + c.mu.Lock() + defer c.mu.Unlock() entry, ok := c.entries[key] if !ok { return replicationLagRecord{} @@ -90,6 +122,8 @@ func (c *replicationLagCache) latest(key string) replicationLagRecord { // or just after it. // If there is no such record, a zero record is returned. func (c *replicationLagCache) atOrAfter(key string, at time.Time) replicationLagRecord { + c.mu.Lock() + defer c.mu.Unlock() entry, ok := c.entries[key] if !ok { return replicationLagRecord{} @@ -100,6 +134,9 @@ func (c *replicationLagCache) atOrAfter(key string, at time.Time) replicationLag // sortByLag sorts all replicas by their latest replication lag value and // tablet uid and updates the c.slowReplicas set. func (c *replicationLagCache) sortByLag(ignoreNSlowestReplicas int, minimumReplicationLag int64) { + c.mu.Lock() + defer c.mu.Unlock() + // Reset the current list of ignored replicas. c.slowReplicas = make(map[string]bool) @@ -142,6 +179,9 @@ func (a byLagAndTabletUID) Less(i, j int) bool { // this slow replica. // "key" refers to ReplicationLagRecord.LegacyTabletStats.Key. func (c *replicationLagCache) ignoreSlowReplica(key string) bool { + c.mu.Lock() + defer c.mu.Unlock() + if len(c.slowReplicas) == 0 { // No slow replicas at all. return false diff --git a/go/vt/throttler/replication_lag_cache_test.go b/go/vt/throttler/replication_lag_cache_test.go index 135c0f03956..a81c800ebbe 100644 --- a/go/vt/throttler/replication_lag_cache_test.go +++ b/go/vt/throttler/replication_lag_cache_test.go @@ -84,3 +84,10 @@ func TestReplicationLagCache_SortByLag(t *testing.T) { require.True(t, c.slowReplicas[r1Key], "r1 should be tracked as a slow replica") } + +func TestReplicationLagCache_MaxLag(t *testing.T) { + c := newReplicationLagCache(2) + c.add(lagRecord(sinceZero(1*time.Second), r1, 30)) + c.add(lagRecord(sinceZero(1*time.Second), r2, 1)) + require.Equal(t, uint32(30), c.maxLag()) +} diff --git a/go/vt/throttler/throttler.go b/go/vt/throttler/throttler.go index a12d8f241a2..83ea1a18d97 100644 --- a/go/vt/throttler/throttler.go +++ b/go/vt/throttler/throttler.go @@ -245,22 +245,10 @@ func (t *ThrottlerImpl) Throttle(threadID int) time.Duration { // the provided type, excluding ignored tablets. func (t *ThrottlerImpl) MaxLag(tabletType topodata.TabletType) uint32 { cache := t.maxReplicationLagModule.lagCacheByType(tabletType) - - var maxLag uint32 - cacheEntries := cache.entries - - for key := range cacheEntries { - if cache.isIgnored(key) { - continue - } - - lag := cache.latest(key).Stats.ReplicationLagSeconds - if lag > maxLag { - maxLag = lag - } + if cache == nil { + return 0 } - - return maxLag + return cache.maxLag() } // ThreadFinished marks threadID as finished and redistributes the thread's diff --git a/go/vt/throttler/throttler_test.go b/go/vt/throttler/throttler_test.go index 74e8784f021..d321207b8ca 100644 --- a/go/vt/throttler/throttler_test.go +++ b/go/vt/throttler/throttler_test.go @@ -17,13 +17,25 @@ limitations under the License. package throttler import ( + "context" "runtime" + "sync" "testing" "time" "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/discovery" + "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/proto/topodata" ) +// testTabletTypes is the list of tablet types to test. +var testTabletTypes = []topodata.TabletType{ + topodata.TabletType_REPLICA, + topodata.TabletType_RDONLY, +} + // The main purpose of the benchmarks below is to demonstrate the functionality // of the throttler in the real-world (using a non-faked time.Now). // The benchmark values should be as close as possible to the request interval @@ -402,3 +414,73 @@ func TestThreadFinished_SecondCallPanics(t *testing.T) { }() throttler.ThreadFinished(0) } + +func TestThrottlerMaxLag(t *testing.T) { + fc := &fakeClock{} + th, err := newThrottlerWithClock(t.Name(), "queries", 1, 1, 10, fc.now) + require.NoError(t, err) + throttler := th.(*ThrottlerImpl) + defer throttler.Close() + + require.NotNil(t, throttler) + require.NotNil(t, throttler.maxReplicationLagModule) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + var wg sync.WaitGroup + + // run .add() and .MaxLag() concurrently to detect races + for _, tabletType := range testTabletTypes { + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case <-ctx.Done(): + return + default: + throttler.MaxLag(tabletType) + } + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case <-ctx.Done(): + return + default: + cache := throttler.maxReplicationLagModule.lagCacheByType(tabletType) + require.NotNil(t, cache) + cache.add(replicationLagRecord{ + time: time.Now(), + TabletHealth: discovery.TabletHealth{ + Serving: true, + Stats: &query.RealtimeStats{ + ReplicationLagSeconds: 5, + }, + Tablet: &topodata.Tablet{ + Hostname: t.Name(), + Type: tabletType, + PortMap: map[string]int32{ + "test": 15999, + }, + }, + }, + }) + } + } + }() + } + time.Sleep(time.Second) + cancel() + wg.Wait() + + // check .MaxLag() + for _, tabletType := range testTabletTypes { + require.Equal(t, uint32(5), throttler.MaxLag(tabletType)) + } +} diff --git a/go/vt/topo/shard.go b/go/vt/topo/shard.go index 77983f20d2d..ba3a02a68ca 100644 --- a/go/vt/topo/shard.go +++ b/go/vt/topo/shard.go @@ -19,6 +19,7 @@ package topo import ( "context" "encoding/hex" + "errors" "fmt" "path" "slices" @@ -393,7 +394,7 @@ func (si *ShardInfo) UpdateDeniedTables(ctx context.Context, tabletType topodata return err } if tabletType == topodatapb.TabletType_PRIMARY && len(cells) > 0 { - return fmt.Errorf(dlNoCellsForPrimary) + return errors.New(dlNoCellsForPrimary) } tc := si.GetTabletControl(tabletType) if tc == nil { diff --git a/go/vt/topotools/tablet.go b/go/vt/topotools/tablet.go index 397af9ddf7c..9fae44ac5e1 100644 --- a/go/vt/topotools/tablet.go +++ b/go/vt/topotools/tablet.go @@ -36,6 +36,7 @@ import ( "context" "errors" "fmt" + "maps" "google.golang.org/protobuf/proto" @@ -59,6 +60,47 @@ func ConfigureTabletHook(hk *hook.Hook, tabletAlias *topodatapb.TabletAlias) { hk.ExtraEnv["TABLET_ALIAS"] = topoproto.TabletAliasString(tabletAlias) } +// ChangeTags changes the tags of the tablet. Make this external, since these +// transitions need to be forced from time to time. +// +// If successful, the updated tablet record is returned. +func ChangeTags(ctx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, tabletTags map[string]string, replace bool) (*topodatapb.Tablet, error) { + var result *topodatapb.Tablet + _, err := ts.UpdateTabletFields(ctx, tabletAlias, func(tablet *topodatapb.Tablet) error { + if replace && maps.Equal(tablet.Tags, tabletTags) { + result = tablet + return topo.NewError(topo.NoUpdateNeeded, topoproto.TabletAliasString(tabletAlias)) + } + if replace || tablet.Tags == nil { + tablet.Tags = tabletTags + } else { + var doUpdate bool + for key, val := range tabletTags { + if val == "" { + if _, found := tablet.Tags[key]; found { + delete(tablet.Tags, key) + doUpdate = true + } + continue + } + if tablet.Tags[key] != val { + tablet.Tags[key] = val + doUpdate = true + } + } + if !doUpdate { + return topo.NewError(topo.NoUpdateNeeded, topoproto.TabletAliasString(tabletAlias)) + } + } + result = tablet + return nil + }) + if err != nil { + return nil, err + } + return result, nil +} + // ChangeType changes the type of the tablet. Make this external, since these // transitions need to be forced from time to time. // diff --git a/go/vt/vitessdriver/fakeserver_test.go b/go/vt/vitessdriver/fakeserver_test.go index a74e44e682c..a4b17fc65d6 100644 --- a/go/vt/vitessdriver/fakeserver_test.go +++ b/go/vt/vitessdriver/fakeserver_test.go @@ -18,7 +18,6 @@ package vitessdriver import ( "context" - "errors" "fmt" "reflect" @@ -156,14 +155,6 @@ func (f *fakeVTGateService) CloseSession(ctx context.Context, session *vtgatepb. return nil } -// ResolveTransaction is part of the VTGateService interface -func (f *fakeVTGateService) ResolveTransaction(ctx context.Context, dtid string) error { - if dtid != dtid2 { - return errors.New("ResolveTransaction: dtid mismatch") - } - return nil -} - func (f *fakeVTGateService) VStream(ctx context.Context, tabletType topodatapb.TabletType, vgtid *binlogdatapb.VGtid, filter *binlogdatapb.Filter, flags *vtgatepb.VStreamFlags, send func([]*binlogdatapb.VEvent) error) error { return nil } diff --git a/go/vt/vitessdriver/rows.go b/go/vt/vitessdriver/rows.go index 1af88e64ec3..d3c5ca7e4d4 100644 --- a/go/vt/vitessdriver/rows.go +++ b/go/vt/vitessdriver/rows.go @@ -110,7 +110,7 @@ func (ri *rows) ColumnTypeScanType(index int) reflect.Type { case query.Type_TIMESTAMP, query.Type_DECIMAL, query.Type_VARCHAR, query.Type_TEXT, query.Type_BLOB, query.Type_VARBINARY, query.Type_CHAR, query.Type_BINARY, query.Type_BIT, query.Type_ENUM, query.Type_SET, query.Type_TUPLE, query.Type_GEOMETRY, query.Type_JSON, - query.Type_HEXNUM, query.Type_HEXVAL, query.Type_BITNUM: + query.Type_HEXNUM, query.Type_HEXVAL, query.Type_BITNUM, query.Type_VECTOR: return typeRawBytes case query.Type_DATE, query.Type_TIME, query.Type_DATETIME: @@ -179,6 +179,8 @@ func (ri *rows) ColumnTypeDatabaseTypeName(index int) string { return "GEOMETRY" case query.Type_JSON: return "JSON" + case query.Type_VECTOR: + return "VECTOR" case query.Type_TIMESTAMP: return "TIMESTAMP" case query.Type_DATE: diff --git a/go/vt/vtadmin/api.go b/go/vt/vtadmin/api.go index 1e83875de35..db3f16d8426 100644 --- a/go/vt/vtadmin/api.go +++ b/go/vt/vtadmin/api.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "fmt" + "math" "net/http" "net/http/pprof" "net/url" @@ -28,17 +29,22 @@ import ( "sync" "time" + "github.com/google/uuid" "github.com/gorilla/handlers" "github.com/gorilla/mux" "github.com/patrickmn/go-cache" - "vitess.io/vitess/go/stats" - "vitess.io/vitess/go/vt/vtenv" - + vreplcommon "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/common" + vdiffcmd "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/vdiff" + "vitess.io/vitess/go/protoutil" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/sets" + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/stats" "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/topo/topoproto" @@ -53,9 +59,14 @@ import ( "vitess.io/vitess/go/vt/vtadmin/rbac" "vitess.io/vitess/go/vt/vtadmin/sort" "vitess.io/vitess/go/vt/vtadmin/vtadminproto" + "vitess.io/vitess/go/vt/vtctl/workflow" + "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtexplain" + "vitess.io/vitess/go/vt/vttablet/tabletmanager/vdiff" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtadminpb "vitess.io/vitess/go/vt/proto/vtadmin" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" @@ -381,6 +392,7 @@ func (api *API) Handler() http.Handler { router.HandleFunc("/migration/{cluster_id}/{keyspace}/launch", httpAPI.Adapt(vtadminhttp.LaunchSchemaMigration)).Name("API.LaunchSchemaMigration").Methods("PUT", "OPTIONS") router.HandleFunc("/migration/{cluster_id}/{keyspace}/retry", httpAPI.Adapt(vtadminhttp.RetrySchemaMigration)).Name("API.RetrySchemaMigration").Methods("PUT", "OPTIONS") router.HandleFunc("/migrations/", httpAPI.Adapt(vtadminhttp.GetSchemaMigrations)).Name("API.GetSchemaMigrations") + router.HandleFunc("/movetables/{cluster_id}/complete", httpAPI.Adapt(vtadminhttp.MoveTablesComplete)).Name("API.MoveTablesComplete") router.HandleFunc("/schema/{table}", httpAPI.Adapt(vtadminhttp.FindSchema)).Name("API.FindSchema") router.HandleFunc("/schema/{cluster_id}/{keyspace}/{table}", httpAPI.Adapt(vtadminhttp.GetSchema)).Name("API.GetSchema") router.HandleFunc("/schemas", httpAPI.Adapt(vtadminhttp.GetSchemas)).Name("API.GetSchemas") @@ -411,12 +423,24 @@ func (api *API) Handler() http.Handler { router.HandleFunc("/tablet/{tablet}/start_replication", httpAPI.Adapt(vtadminhttp.StartReplication)).Name("API.StartReplication").Methods("PUT", "OPTIONS") router.HandleFunc("/tablet/{tablet}/stop_replication", httpAPI.Adapt(vtadminhttp.StopReplication)).Name("API.StopReplication").Methods("PUT", "OPTIONS") router.HandleFunc("/tablet/{tablet}/externally_promoted", httpAPI.Adapt(vtadminhttp.TabletExternallyPromoted)).Name("API.TabletExternallyPromoted").Methods("POST") + router.HandleFunc("/transactions/{cluster_id}/{keyspace}", httpAPI.Adapt(vtadminhttp.GetUnresolvedTransactions)).Name("API.GetUnresolvedTransactions").Methods("GET") + router.HandleFunc("/transaction/{cluster_id}/{dtid}/conclude", httpAPI.Adapt(vtadminhttp.ConcludeTransaction)).Name("API.ConcludeTransaction") router.HandleFunc("/vschema/{cluster_id}/{keyspace}", httpAPI.Adapt(vtadminhttp.GetVSchema)).Name("API.GetVSchema") router.HandleFunc("/vschemas", httpAPI.Adapt(vtadminhttp.GetVSchemas)).Name("API.GetVSchemas") + router.HandleFunc("/vdiff/{cluster_id}/", httpAPI.Adapt(vtadminhttp.VDiffCreate)).Name("API.VDiffCreate").Methods("POST") + router.HandleFunc("/vdiff/{cluster_id}/show", httpAPI.Adapt(vtadminhttp.VDiffShow)).Name("API.VDiffShow") router.HandleFunc("/vtctlds", httpAPI.Adapt(vtadminhttp.GetVtctlds)).Name("API.GetVtctlds") router.HandleFunc("/vtexplain", httpAPI.Adapt(vtadminhttp.VTExplain)).Name("API.VTExplain") router.HandleFunc("/workflow/{cluster_id}/{keyspace}/{name}", httpAPI.Adapt(vtadminhttp.GetWorkflow)).Name("API.GetWorkflow") router.HandleFunc("/workflows", httpAPI.Adapt(vtadminhttp.GetWorkflows)).Name("API.GetWorkflows") + router.HandleFunc("/workflow/{cluster_id}/{keyspace}/{name}/status", httpAPI.Adapt(vtadminhttp.GetWorkflowStatus)).Name("API.GetWorkflowStatus") + router.HandleFunc("/workflow/{cluster_id}/{keyspace}/{name}/start", httpAPI.Adapt(vtadminhttp.StartWorkflow)).Name("API.StartWorkflow") + router.HandleFunc("/workflow/{cluster_id}/{keyspace}/{name}/stop", httpAPI.Adapt(vtadminhttp.StopWorkflow)).Name("API.StopWorkflow") + router.HandleFunc("/workflow/{cluster_id}/switchtraffic", httpAPI.Adapt(vtadminhttp.WorkflowSwitchTraffic)).Name("API.WorkflowSwitchTraffic") + router.HandleFunc("/workflow/{cluster_id}/delete", httpAPI.Adapt(vtadminhttp.WorkflowDelete)).Name("API.WorkflowDelete") + router.HandleFunc("/workflow/{cluster_id}/materialize", httpAPI.Adapt(vtadminhttp.MaterializeCreate)).Name("API.MaterializeCreate").Methods("POST") + router.HandleFunc("/workflow/{cluster_id}/movetables", httpAPI.Adapt(vtadminhttp.MoveTablesCreate)).Name("API.MoveTablesCreate").Methods("POST") + router.HandleFunc("/workflow/{cluster_id}/reshard", httpAPI.Adapt(vtadminhttp.ReshardCreate)).Name("API.ReshardCreate").Methods("POST") experimentalRouter := router.PathPrefix("/experimental").Subrouter() experimentalRouter.HandleFunc("/tablet/{tablet}/debug/vars", httpAPI.Adapt(experimental.TabletDebugVarsPassthrough)).Name("API.TabletDebugVarsPassthrough") @@ -523,6 +547,27 @@ func (api *API) CompleteSchemaMigration(ctx context.Context, req *vtadminpb.Comp return c.CompleteSchemaMigration(ctx, req.Request) } +// ConcludeTransaction is part of the vtadminpb.VTAdminServer interface. +func (api *API) ConcludeTransaction(ctx context.Context, req *vtadminpb.ConcludeTransactionRequest) (*vtctldatapb.ConcludeTransactionResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.ConcludeTransaction") + defer span.Finish() + + if !api.authz.IsAuthorized(ctx, req.ClusterId, rbac.ClusterResource, rbac.GetAction) { + return nil, nil + } + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + cluster.AnnotateSpan(c, span) + + return c.Vtctld.ConcludeTransaction(ctx, &vtctldatapb.ConcludeTransactionRequest{ + Dtid: req.Dtid, + }) +} + // CreateKeyspace is part of the vtadminpb.VTAdminServer interface. func (api *API) CreateKeyspace(ctx context.Context, req *vtadminpb.CreateKeyspaceRequest) (*vtadminpb.CreateKeyspaceResponse, error) { span, ctx := trace.NewSpan(ctx, "API.CreateKeyspace") @@ -1476,6 +1521,28 @@ func (api *API) GetTopologyPath(ctx context.Context, req *vtadminpb.GetTopologyP return c.Vtctld.GetTopologyPath(ctx, &vtctldatapb.GetTopologyPathRequest{Path: req.Path}) } +// GetUnresolvedTransactions is part of the vtadminpb.VTAdminServer interface. +func (api *API) GetUnresolvedTransactions(ctx context.Context, req *vtadminpb.GetUnresolvedTransactionsRequest) (*vtctldatapb.GetUnresolvedTransactionsResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.GetUnresolvedTransactions") + defer span.Finish() + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + cluster.AnnotateSpan(c, span) + + if !api.authz.IsAuthorized(ctx, c.ID, rbac.KeyspaceResource, rbac.GetAction) { + return nil, nil + } + + return c.Vtctld.GetUnresolvedTransactions(ctx, &vtctldatapb.GetUnresolvedTransactionsRequest{ + Keyspace: req.Keyspace, + AbandonAge: req.AbandonAge, + }) +} + // GetVSchema is part of the vtadminpb.VTAdminServer interface. func (api *API) GetVSchema(ctx context.Context, req *vtadminpb.GetVSchemaRequest) (*vtadminpb.VSchema, error) { span, ctx := trace.NewSpan(ctx, "API.GetVSchema") @@ -1592,6 +1659,100 @@ func (api *API) GetVSchemas(ctx context.Context, req *vtadminpb.GetVSchemasReque }, nil } +// VDiffCreate is part of the vtadminpb.VTAdminServer interface. +func (api *API) VDiffCreate(ctx context.Context, req *vtadminpb.VDiffCreateRequest) (*vtctldatapb.VDiffCreateResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.VDiffCreate") + defer span.Finish() + + if !api.authz.IsAuthorized(ctx, req.ClusterId, rbac.ClusterResource, rbac.GetAction) { + return nil, nil + } + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + cluster.AnnotateSpan(c, span) + + // Set the default options + req.Request.Uuid = uuid.New().String() + req.Request.TabletTypes = vdiffcmd.TabletTypesDefault + req.Request.TabletSelectionPreference = tabletmanagerdatapb.TabletSelectionPreference_INORDER + req.Request.FilteredReplicationWaitTime = protoutil.DurationToProto(workflow.DefaultTimeout) + req.Request.Limit = math.MaxInt64 + req.Request.MaxReportSampleRows = 10 + req.Request.MaxExtraRowsToCompare = 1000 + req.Request.WaitUpdateInterval = protoutil.DurationToProto(time.Duration(1 * time.Minute)) + req.Request.AutoRetry = true + req.Request.RowDiffColumnTruncateAt = 128 + + defaultAutoStart := true + req.Request.AutoStart = &defaultAutoStart + + return c.Vtctld.VDiffCreate(ctx, req.Request) +} + +// VDiffShow is part of the vtadminpb.VTAdminServer interface. +func (api *API) VDiffShow(ctx context.Context, req *vtadminpb.VDiffShowRequest) (*vtadminpb.VDiffShowResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.VDiffShow") + defer span.Finish() + + if !api.authz.IsAuthorized(ctx, req.ClusterId, rbac.ClusterResource, rbac.GetAction) { + return nil, nil + } + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + cluster.AnnotateSpan(c, span) + + res, err := c.Vtctld.VDiffShow(ctx, req.Request) + if err != nil { + return nil, err + } + + shardReports := map[string]*vtadminpb.VDiffShardReport{} + for shard, resp := range res.TabletResponses { + report := &vtadminpb.VDiffShardReport{} + totalRowsToCompare := int64(0) + first := true + if resp != nil && resp.Output != nil { + qr := sqltypes.Proto3ToResult(resp.Output) + for _, row := range qr.Named().Rows { + // Since these values will be the same for all subsequent rows we only use + // the first row. + if first { + first = false + report.StartedAt = row.AsString("started_at", "") + report.CompletedAt = row.AsString("completed_at", "") + report.State = strings.ToLower(row.AsString("vdiff_state", "")) + } + + report.RowsCompared += row.AsInt64("rows_compared", 0) + totalRowsToCompare += row.AsInt64("table_rows", 0) + if mm, _ := row.ToBool("has_mismatch"); mm { + report.HasMismatch = true + } + } + } + if report.State == string(vdiff.StartedState) { + progress := vdiffcmd.BuildProgressReport(report.RowsCompared, totalRowsToCompare, report.StartedAt) + report.Progress = &vtadminpb.VDiffProgress{ + Percentage: progress.Percentage, + Eta: progress.ETA, + } + } + shardReports[shard] = report + } + + return &vtadminpb.VDiffShowResponse{ + ShardReport: shardReports, + }, nil +} + // GetVtctlds is part of the vtadminpb.VTAdminServer interface. func (api *API) GetVtctlds(ctx context.Context, req *vtadminpb.GetVtctldsRequest) (*vtadminpb.GetVtctldsResponse, error) { span, ctx := trace.NewSpan(ctx, "API.GetVtctlds") @@ -1662,6 +1823,91 @@ func (api *API) GetWorkflow(ctx context.Context, req *vtadminpb.GetWorkflowReque }) } +// GetWorkflowStatus is part of the vtadminpb.VTAdminServer interface. +func (api *API) GetWorkflowStatus(ctx context.Context, req *vtadminpb.GetWorkflowStatusRequest) (*vtctldatapb.WorkflowStatusResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.GetWorkflowStatus") + defer span.Finish() + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + cluster.AnnotateSpan(c, span) + span.Annotate("keyspace", req.Keyspace) + span.Annotate("workflow_name", req.Name) + + if !api.authz.IsAuthorized(ctx, c.ID, rbac.WorkflowResource, rbac.GetAction) { + return nil, nil + } + + return c.Vtctld.WorkflowStatus(ctx, &vtctldatapb.WorkflowStatusRequest{ + Keyspace: req.Keyspace, + Workflow: req.Name, + }) +} + +// StartWorkflow is part of the vtadminpb.VTAdminServer interface. +func (api *API) StartWorkflow(ctx context.Context, req *vtadminpb.StartWorkflowRequest) (*vtctldatapb.WorkflowUpdateResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.StartWorkflow") + defer span.Finish() + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + cluster.AnnotateSpan(c, span) + span.Annotate("keyspace", req.Keyspace) + span.Annotate("workflow_name", req.Workflow) + + if !api.authz.IsAuthorized(ctx, c.ID, rbac.WorkflowResource, rbac.PutAction) { + return nil, nil + } + + vreplcommon.SetClient(c.Vtctld) + vreplcommon.SetCommandCtx(ctx) + + if err := vreplcommon.CanRestartWorkflow(req.Keyspace, req.Workflow); err != nil { + return nil, err + } + + return c.Vtctld.WorkflowUpdate(ctx, &vtctldatapb.WorkflowUpdateRequest{ + Keyspace: req.Keyspace, + TabletRequest: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: req.Workflow, + State: ptr.Of(binlogdatapb.VReplicationWorkflowState_Running), + }, + }) +} + +// StopWorkflow is part of the vtadminpb.VTAdminServer interface. +func (api *API) StopWorkflow(ctx context.Context, req *vtadminpb.StopWorkflowRequest) (*vtctldatapb.WorkflowUpdateResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.StopWorkflow") + defer span.Finish() + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + cluster.AnnotateSpan(c, span) + span.Annotate("keyspace", req.Keyspace) + span.Annotate("workflow_name", req.Workflow) + + if !api.authz.IsAuthorized(ctx, c.ID, rbac.WorkflowResource, rbac.PutAction) { + return nil, nil + } + + return c.Vtctld.WorkflowUpdate(ctx, &vtctldatapb.WorkflowUpdateRequest{ + Keyspace: req.Keyspace, + TabletRequest: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: req.Workflow, + State: ptr.Of(binlogdatapb.VReplicationWorkflowState_Stopped), + }, + }) +} + // GetWorkflows is part of the vtadminpb.VTAdminServer interface. func (api *API) GetWorkflows(ctx context.Context, req *vtadminpb.GetWorkflowsRequest) (*vtadminpb.GetWorkflowsResponse, error) { span, ctx := trace.NewSpan(ctx, "API.GetWorkflows") @@ -1732,6 +1978,95 @@ func (api *API) LaunchSchemaMigration(ctx context.Context, req *vtadminpb.Launch return c.LaunchSchemaMigration(ctx, req.Request) } +// MaterializeCreate is part of the vtadminpb.VTAdminServer interface. +func (api *API) MaterializeCreate(ctx context.Context, req *vtadminpb.MaterializeCreateRequest) (*vtctldatapb.MaterializeCreateResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.MaterializeCreate") + defer span.Finish() + + span.Annotate("cluster_id", req.ClusterId) + + if !api.authz.IsAuthorized(ctx, req.ClusterId, rbac.WorkflowResource, rbac.CreateAction) { + return nil, fmt.Errorf("%w: cannot create workflow in %s", errors.ErrUnauthorized, req.ClusterId) + } + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + // Parser with default options. New() itself initializes with default MySQL version. + parser, err := sqlparser.New(sqlparser.Options{ + TruncateUILen: 512, + TruncateErrLen: 0, + }) + if err != nil { + return nil, err + } + req.Request.Settings.TableSettings, err = vreplcommon.ParseTableMaterializeSettings(req.TableSettings, parser) + if err != nil { + return nil, err + } + + return c.Vtctld.MaterializeCreate(ctx, req.Request) +} + +// MoveTablesComplete is part of the vtadminpb.VTAdminServer interface. +func (api *API) MoveTablesComplete(ctx context.Context, req *vtadminpb.MoveTablesCompleteRequest) (*vtctldatapb.MoveTablesCompleteResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.MoveTablesComplete") + defer span.Finish() + + span.Annotate("cluster_id", req.ClusterId) + + if !api.authz.IsAuthorized(ctx, req.ClusterId, rbac.WorkflowResource, rbac.CompleteAction) { + return nil, fmt.Errorf("%w: cannot complete workflow in %s", errors.ErrUnauthorized, req.ClusterId) + } + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + return c.Vtctld.MoveTablesComplete(ctx, req.Request) +} + +// MoveTablesCreate is part of the vtadminpb.VTAdminServer interface. +func (api *API) MoveTablesCreate(ctx context.Context, req *vtadminpb.MoveTablesCreateRequest) (*vtctldatapb.WorkflowStatusResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.MoveTablesCreate") + defer span.Finish() + + span.Annotate("cluster_id", req.ClusterId) + + if !api.authz.IsAuthorized(ctx, req.ClusterId, rbac.WorkflowResource, rbac.CreateAction) { + return nil, fmt.Errorf("%w: cannot create workflow in %s", errors.ErrUnauthorized, req.ClusterId) + } + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + return c.Vtctld.MoveTablesCreate(ctx, req.Request) +} + +// ReshardCreate is part of the vtadminpb.VTAdminServer interface. +func (api *API) ReshardCreate(ctx context.Context, req *vtadminpb.ReshardCreateRequest) (*vtctldatapb.WorkflowStatusResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.ReshardCreate") + defer span.Finish() + + span.Annotate("cluster_id", req.ClusterId) + + if !api.authz.IsAuthorized(ctx, req.ClusterId, rbac.WorkflowResource, rbac.CreateAction) { + return nil, fmt.Errorf("%w: cannot create workflow in %s", errors.ErrUnauthorized, req.ClusterId) + } + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + return c.Vtctld.ReshardCreate(ctx, req.Request) +} + // PingTablet is part of the vtadminpb.VTAdminServer interface. func (api *API) PingTablet(ctx context.Context, req *vtadminpb.PingTabletRequest) (*vtadminpb.PingTabletResponse, error) { span, ctx := trace.NewSpan(ctx, "API.PingTablet") @@ -2407,6 +2742,55 @@ func (api *API) VTExplain(ctx context.Context, req *vtadminpb.VTExplainRequest) }, nil } +// WorkflowDelete is part of the vtadminpb.VTAdminServer interface. +func (api *API) WorkflowDelete(ctx context.Context, req *vtadminpb.WorkflowDeleteRequest) (*vtctldatapb.WorkflowDeleteResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.WorkflowDelete") + defer span.Finish() + + span.Annotate("cluster_id", req.ClusterId) + + if !api.authz.IsAuthorized(ctx, req.ClusterId, rbac.WorkflowResource, rbac.DeleteAction) { + return nil, fmt.Errorf("%w: cannot delete workflow in %s", errors.ErrUnauthorized, req.ClusterId) + } + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + // Set the default options which are not supported in VTAdmin Web. + return c.Vtctld.WorkflowDelete(ctx, req.Request) +} + +// WorkflowSwitchTraffic is part of the vtadminpb.VTAdminServer interface. +func (api *API) WorkflowSwitchTraffic(ctx context.Context, req *vtadminpb.WorkflowSwitchTrafficRequest) (*vtctldatapb.WorkflowSwitchTrafficResponse, error) { + span, ctx := trace.NewSpan(ctx, "API.WorkflowSwitchTraffic") + defer span.Finish() + + span.Annotate("cluster_id", req.ClusterId) + + if !api.authz.IsAuthorized(ctx, req.ClusterId, rbac.WorkflowResource, rbac.CreateAction) { + return nil, fmt.Errorf("%w: cannot switch traffic for workflow in %s", errors.ErrUnauthorized, req.ClusterId) + } + + c, err := api.getClusterForRequest(req.ClusterId) + if err != nil { + return nil, err + } + + // Set the default options which are not supported in VTAdmin Web. + req.Request.TabletTypes = []topodatapb.TabletType{ + topodatapb.TabletType_PRIMARY, + topodatapb.TabletType_REPLICA, + topodatapb.TabletType_RDONLY, + } + req.Request.Timeout = protoutil.DurationToProto(workflow.DefaultTimeout) + req.Request.MaxReplicationLagAllowed = protoutil.DurationToProto(vreplcommon.MaxReplicationLagDefault) + req.Request.EnableReverseReplication = true + + return c.Vtctld.WorkflowSwitchTraffic(ctx, req.Request) +} + func (api *API) getClusterForRequest(id string) (*cluster.Cluster, error) { api.clusterMu.Lock() defer api.clusterMu.Unlock() diff --git a/go/vt/vtadmin/http/request.go b/go/vt/vtadmin/http/request.go index 9d38b88ed91..2c31715c630 100644 --- a/go/vt/vtadmin/http/request.go +++ b/go/vt/vtadmin/http/request.go @@ -78,7 +78,7 @@ func (r Request) ParseQueryParamAsUint32(name string, defaultVal uint32) (uint32 } // ParseQueryParamAsInt32 attempts to parse the query parameter of the given -// name into a uint32 value. If the parameter is not set, the provided default +// name into a int32 value. If the parameter is not set, the provided default // value is returned. func (r Request) ParseQueryParamAsInt32(name string, defaultVal int32) (int32, error) { if param := r.URL.Query().Get(name); param != "" { @@ -96,6 +96,25 @@ func (r Request) ParseQueryParamAsInt32(name string, defaultVal int32) (int32, e return defaultVal, nil } +// ParseQueryParamAsInt64 attempts to parse the query parameter of the given +// name into a int64 value. If the parameter is not set, the provided default +// value is returned. +func (r Request) ParseQueryParamAsInt64(name string, defaultVal int64) (int64, error) { + if param := r.URL.Query().Get(name); param != "" { + val, err := strconv.ParseInt(param, 10, 64) + if err != nil { + return defaultVal, &errors.BadRequest{ + Err: err, + ErrDetails: fmt.Sprintf("could not parse query parameter %s (= %v) into int64 value", name, param), + } + } + + return val, nil + } + + return defaultVal, nil +} + // Vars is a mapping of the route variable values in a given request. // // See (gorilla/mux).Vars for details. We define a type here to add some diff --git a/go/vt/vtadmin/http/transactions.go b/go/vt/vtadmin/http/transactions.go new file mode 100644 index 00000000000..5846b814524 --- /dev/null +++ b/go/vt/vtadmin/http/transactions.go @@ -0,0 +1,55 @@ +/* +Copyright 2024 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 http + +import ( + "context" + + vtadminpb "vitess.io/vitess/go/vt/proto/vtadmin" +) + +// GetUnresolvedTransactions implements the http wrapper for the +// /transactions/{cluster_id}/{keyspace}[?abandon_age=] route. +func GetUnresolvedTransactions(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + + abandonAge, err := r.ParseQueryParamAsInt64("abandon_age", 0) + if err != nil { + return NewJSONResponse(nil, err) + } + + res, err := api.server.GetUnresolvedTransactions(ctx, &vtadminpb.GetUnresolvedTransactionsRequest{ + ClusterId: vars["cluster_id"], + Keyspace: vars["keyspace"], + AbandonAge: abandonAge, + }) + + return NewJSONResponse(res, err) +} + +// ConcludeTransaction implements the http wrapper for the +// /transaction/{cluster_id}/{dtid}/conclude route. +func ConcludeTransaction(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + + res, err := api.server.ConcludeTransaction(ctx, &vtadminpb.ConcludeTransactionRequest{ + ClusterId: vars["cluster_id"], + Dtid: vars["dtid"], + }) + + return NewJSONResponse(res, err) +} diff --git a/go/vt/vtadmin/http/vdiff.go b/go/vt/vtadmin/http/vdiff.go new file mode 100644 index 00000000000..590a0cc5e95 --- /dev/null +++ b/go/vt/vtadmin/http/vdiff.go @@ -0,0 +1,73 @@ +/* +Copyright 2024 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 http + +import ( + "context" + "encoding/json" + + "vitess.io/vitess/go/vt/vtadmin/errors" + + vtadminpb "vitess.io/vitess/go/vt/proto/vtadmin" + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" +) + +// VDiffCreate implements the http wrapper for the +// /vdiff/{cluster_id} route. +func VDiffCreate(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + + var req vtctldatapb.VDiffCreateRequest + if err := decoder.Decode(&req); err != nil { + return NewJSONResponse(nil, &errors.BadRequest{ + Err: err, + }) + } + + res, err := api.server.VDiffCreate(ctx, &vtadminpb.VDiffCreateRequest{ + ClusterId: vars["cluster_id"], + Request: &req, + }) + + return NewJSONResponse(res, err) +} + +// VDiffShow implements the http wrapper for the +// /vdiff/{cluster_id}/show route. +func VDiffShow(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + + var req vtctldatapb.VDiffShowRequest + if err := decoder.Decode(&req); err != nil { + return NewJSONResponse(nil, &errors.BadRequest{ + Err: err, + }) + } + + res, err := api.server.VDiffShow(ctx, &vtadminpb.VDiffShowRequest{ + ClusterId: vars["cluster_id"], + Request: &req, + }) + + return NewJSONResponse(res, err) +} diff --git a/go/vt/vtadmin/http/workflows.go b/go/vt/vtadmin/http/workflows.go index 80c6dff775b..ecaf92e192e 100644 --- a/go/vt/vtadmin/http/workflows.go +++ b/go/vt/vtadmin/http/workflows.go @@ -18,8 +18,12 @@ package http import ( "context" + "encoding/json" + + "vitess.io/vitess/go/vt/vtadmin/errors" vtadminpb "vitess.io/vitess/go/vt/proto/vtadmin" + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) // GetWorkflow implements the http wrapper for the VTAdminServer.GetWorkflow @@ -69,3 +73,200 @@ func GetWorkflows(ctx context.Context, r Request, api *API) *JSONResponse { return NewJSONResponse(workflows, err) } + +// GetWorkflowStatus implements the http wrapper for the VTAdminServer.GetWorkflowStatus +// method. +// +// Its route is /workflow/{cluster_id}/{keyspace}/{name}/status +func GetWorkflowStatus(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + + workflowStatus, err := api.server.GetWorkflowStatus(ctx, &vtadminpb.GetWorkflowStatusRequest{ + ClusterId: vars["cluster_id"], + Keyspace: vars["keyspace"], + Name: vars["name"], + }) + + return NewJSONResponse(workflowStatus, err) +} + +// StartWorkflow implements the http wrapper for the VTAdminServer.StartWorkflow +// method. +// +// Its route is /workflow/{cluster_id}/{keyspace}/{name}/start +func StartWorkflow(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + + res, err := api.server.StartWorkflow(ctx, &vtadminpb.StartWorkflowRequest{ + ClusterId: vars["cluster_id"], + Keyspace: vars["keyspace"], + Workflow: vars["name"], + }) + + return NewJSONResponse(res, err) +} + +// StopWorkflow implements the http wrapper for the VTAdminServer.StopWorkflow +// method. +// +// Its route is /workflow/{cluster_id}/{keyspace}/{name}/stop +func StopWorkflow(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + + res, err := api.server.StopWorkflow(ctx, &vtadminpb.StopWorkflowRequest{ + ClusterId: vars["cluster_id"], + Keyspace: vars["keyspace"], + Workflow: vars["name"], + }) + + return NewJSONResponse(res, err) +} + +// MoveTablesComplete implements the http wrapper for the VTAdminServer.MoveTablesComplete +// method. +// +// Its route is /movetables/{cluster_id}/complete +func MoveTablesComplete(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + + var req vtctldatapb.MoveTablesCompleteRequest + if err := decoder.Decode(&req); err != nil { + return NewJSONResponse(nil, &errors.BadRequest{ + Err: err, + }) + } + + res, err := api.server.MoveTablesComplete(ctx, &vtadminpb.MoveTablesCompleteRequest{ + ClusterId: vars["cluster_id"], + Request: &req, + }) + + return NewJSONResponse(res, err) +} + +// MoveTablesCreate implements the http wrapper for the VTAdminServer.MoveTablesCreate +// method. +// +// Its route is /workflow/{cluster_id}/movetables +func MoveTablesCreate(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + + var req vtctldatapb.MoveTablesCreateRequest + if err := decoder.Decode(&req); err != nil { + return NewJSONResponse(nil, &errors.BadRequest{ + Err: err, + }) + } + + res, err := api.server.MoveTablesCreate(ctx, &vtadminpb.MoveTablesCreateRequest{ + ClusterId: vars["cluster_id"], + Request: &req, + }) + + return NewJSONResponse(res, err) +} + +// WorkflowSwitchTraffic implements the http wrapper for the VTAdminServer.WorkflowSwitchTraffic +// method. +// +// Its route is /workflow/{cluster_id}/switchtraffic +func WorkflowSwitchTraffic(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + + var req vtctldatapb.WorkflowSwitchTrafficRequest + if err := decoder.Decode(&req); err != nil { + return NewJSONResponse(nil, &errors.BadRequest{ + Err: err, + }) + } + + res, err := api.server.WorkflowSwitchTraffic(ctx, &vtadminpb.WorkflowSwitchTrafficRequest{ + ClusterId: vars["cluster_id"], + Request: &req, + }) + + return NewJSONResponse(res, err) +} + +// ReshardCreate implements the http wrapper for the VTAdminServer.ReshardCreate +// method. +// +// Its route is /workflow/{cluster_id}/reshard +func ReshardCreate(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + + var req vtctldatapb.ReshardCreateRequest + if err := decoder.Decode(&req); err != nil { + return NewJSONResponse(nil, &errors.BadRequest{ + Err: err, + }) + } + + res, err := api.server.ReshardCreate(ctx, &vtadminpb.ReshardCreateRequest{ + ClusterId: vars["cluster_id"], + Request: &req, + }) + + return NewJSONResponse(res, err) +} + +// WorkflowDelete implements the http wrapper for the VTAdminServer.WorkflowDelete +// method. +// +// Its route is /workflow/{cluster_id}/delete +func WorkflowDelete(ctx context.Context, r Request, api *API) *JSONResponse { + vars := r.Vars() + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + + var req vtctldatapb.WorkflowDeleteRequest + if err := decoder.Decode(&req); err != nil { + return NewJSONResponse(nil, &errors.BadRequest{ + Err: err, + }) + } + + res, err := api.server.WorkflowDelete(ctx, &vtadminpb.WorkflowDeleteRequest{ + ClusterId: vars["cluster_id"], + Request: &req, + }) + + return NewJSONResponse(res, err) +} + +// MaterializeCreate implements the http wrapper for the VTAdminServer.MaterializeCreate +// method. +// +// Its route is /workflow/{cluster_id}/materialize +func MaterializeCreate(ctx context.Context, r Request, api *API) *JSONResponse { + var req struct { + TableSettings string `json:"table_settings"` + Request vtctldatapb.MaterializeCreateRequest `json:"request"` + } + + vars := r.Vars() + decoder := json.NewDecoder(r.Body) + defer r.Body.Close() + + if err := decoder.Decode(&req); err != nil { + return NewJSONResponse(nil, &errors.BadRequest{ + Err: err, + }) + } + + res, err := api.server.MaterializeCreate(ctx, &vtadminpb.MaterializeCreateRequest{ + ClusterId: vars["cluster_id"], + TableSettings: req.TableSettings, + Request: &req.Request, + }) + + return NewJSONResponse(res, err) +} diff --git a/go/vt/vtadmin/rbac/config.go b/go/vt/vtadmin/rbac/config.go index 19179f0fa29..dd90257374e 100644 --- a/go/vt/vtadmin/rbac/config.go +++ b/go/vt/vtadmin/rbac/config.go @@ -173,6 +173,7 @@ func DefaultConfig() *Config { string(CreateAction), string(DeleteAction), string(PutAction), + string(CompleteAction), string(PingAction), string(ReloadAction), string(EmergencyFailoverShardAction), diff --git a/go/vt/vtadmin/rbac/rbac.go b/go/vt/vtadmin/rbac/rbac.go index 3f15a0d22d2..038db46fbd5 100644 --- a/go/vt/vtadmin/rbac/rbac.go +++ b/go/vt/vtadmin/rbac/rbac.go @@ -65,14 +65,15 @@ type Action string const ( /* generic actions */ - CancelAction Action = "cancel" - CreateAction Action = "create" - DeleteAction Action = "delete" - GetAction Action = "get" - PingAction Action = "ping" - PutAction Action = "put" - ReloadAction Action = "reload" - RetryAction Action = "retry" + CancelAction Action = "cancel" + CompleteAction Action = "complete" + CreateAction Action = "create" + DeleteAction Action = "delete" + GetAction Action = "get" + PingAction Action = "ping" + PutAction Action = "put" + ReloadAction Action = "reload" + RetryAction Action = "retry" // cancel, complete, cleanup, launch, retry diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 77b7446fc1d..34ec957ebe5 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -254,7 +254,11 @@ func DeleteKs( tablet.tm.Stop() tablet.tm.Close() tablet.qsc.SchemaEngine().Close() - err := ts.DeleteTablet(ctx, tablet.alias) + err := tablet.qsc.QueryService().Close(ctx) + if err != nil { + return err + } + err = ts.DeleteTablet(ctx, tablet.alias) if err != nil { return err } @@ -559,8 +563,8 @@ func (itc *internalTabletConn) ReadTransaction(ctx context.Context, target *quer } // UnresolvedTransactions is part of queryservice.QueryService -func (itc *internalTabletConn) UnresolvedTransactions(ctx context.Context, target *querypb.Target) (transactions []*querypb.TransactionMetadata, err error) { - transactions, err = itc.tablet.qsc.QueryService().UnresolvedTransactions(ctx, target) +func (itc *internalTabletConn) UnresolvedTransactions(ctx context.Context, target *querypb.Target, abandonAgeSeconds int64) (transactions []*querypb.TransactionMetadata, err error) { + transactions, err = itc.tablet.qsc.QueryService().UnresolvedTransactions(ctx, target, abandonAgeSeconds) return transactions, tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err)) } @@ -807,6 +811,20 @@ func (itmc *internalTabletManagerClient) SetReadWrite(ctx context.Context, table return fmt.Errorf("not implemented in vtcombo") } +func (itmc *internalTabletManagerClient) ChangeTags(ctx context.Context, tablet *topodatapb.Tablet, tabletTags map[string]string, replace bool) (*tabletmanagerdatapb.ChangeTagsResponse, error) { + t, ok := tabletMap[tablet.Alias.Uid] + if !ok { + return nil, fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid) + } + afterTags, err := t.tm.ChangeTags(ctx, tabletTags, replace) + if err != nil { + return nil, err + } + return &tabletmanagerdatapb.ChangeTagsResponse{ + Tags: afterTags, + }, nil +} + func (itmc *internalTabletManagerClient) ChangeType(ctx context.Context, tablet *topodatapb.Tablet, dbType topodatapb.TabletType, semiSync bool) error { t, ok := tabletMap[tablet.Alias.Uid] if !ok { @@ -890,6 +908,22 @@ func (itmc *internalTabletManagerClient) ExecuteFetchAsApp(context.Context, *top return nil, fmt.Errorf("not implemented in vtcombo") } +func (itmc *internalTabletManagerClient) GetUnresolvedTransactions(ctx context.Context, tablet *topodatapb.Tablet) ([]*querypb.TransactionMetadata, error) { + return nil, fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) ConcludeTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string, mm bool) error { + return fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) MysqlHostMetrics(context.Context, *topodatapb.Tablet, *tabletmanagerdatapb.MysqlHostMetricsRequest) (*tabletmanagerdatapb.MysqlHostMetricsResponse, error) { + return nil, fmt.Errorf("not implemented in vtcombo") +} + +func (itmc *internalTabletManagerClient) ReadTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string) (*querypb.TransactionMetadata, error) { + return nil, fmt.Errorf("not implemented in vtcombo") +} + func (itmc *internalTabletManagerClient) PrimaryStatus(context.Context, *topodatapb.Tablet) (*replicationdatapb.PrimaryStatus, error) { return nil, fmt.Errorf("not implemented in vtcombo") } @@ -910,6 +944,10 @@ func (itmc *internalTabletManagerClient) CreateVReplicationWorkflow(context.Cont return nil, fmt.Errorf("not implemented in vtcombo") } +func (itmc *internalTabletManagerClient) DeleteTableData(context.Context, *topodatapb.Tablet, *tabletmanagerdatapb.DeleteTableDataRequest) (*tabletmanagerdatapb.DeleteTableDataResponse, error) { + return nil, fmt.Errorf("not implemented in vtcombo") +} + func (itmc *internalTabletManagerClient) DeleteVReplicationWorkflow(context.Context, *topodatapb.Tablet, *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (*tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, error) { return nil, fmt.Errorf("not implemented in vtcombo") } @@ -926,6 +964,10 @@ func (itmc *internalTabletManagerClient) ReadVReplicationWorkflow(context.Contex return nil, fmt.Errorf("not implemented in vtcombo") } +func (itmc *internalTabletManagerClient) ValidateVReplicationPermissions(context.Context, *topodatapb.Tablet, *tabletmanagerdatapb.ValidateVReplicationPermissionsRequest) (*tabletmanagerdatapb.ValidateVReplicationPermissionsResponse, error) { + return nil, fmt.Errorf("not implemented in vtcombo") +} + func (itmc *internalTabletManagerClient) VReplicationExec(context.Context, *topodatapb.Tablet, string) (*querypb.QueryResult, error) { return nil, fmt.Errorf("not implemented in vtcombo") } @@ -954,6 +996,11 @@ func (itmc *internalTabletManagerClient) PopulateReparentJournal(context.Context return fmt.Errorf("not implemented in vtcombo") } +// ReadReparentJournalInfo is part of the tmclient.TabletManagerClient interface. +func (itmc *internalTabletManagerClient) ReadReparentJournalInfo(ctx context.Context, tablet *topodatapb.Tablet) (int, error) { + return 0, fmt.Errorf("not implemented in vtcombo") +} + func (itmc *internalTabletManagerClient) DemotePrimary(context.Context, *topodatapb.Tablet) (*replicationdatapb.PrimaryStatus, error) { return nil, fmt.Errorf("not implemented in vtcombo") } diff --git a/go/vt/vtctl/backup.go b/go/vt/vtctl/backup.go index e832b1f79d1..d2d19ec77d9 100644 --- a/go/vt/vtctl/backup.go +++ b/go/vt/vtctl/backup.go @@ -209,6 +209,7 @@ func commandRestoreFromBackup(ctx context.Context, wr *wrangler.Wrangler, subFla backupTimestampStr := subFlags.String("backup_timestamp", "", "Use the backup taken at or before this timestamp rather than using the latest backup.") restoreToPos := subFlags.String("restore_to_pos", "", "Run a point in time recovery that ends with the given position. This will attempt to use one full backup followed by zero or more incremental backups") restoreToTimestampStr := subFlags.String("restore_to_timestamp", "", "Run a point in time recovery that restores up to, and excluding, given timestamp in RFC3339 format (`2006-01-02T15:04:05Z07:00`). This will attempt to use one full backup followed by zero or more incremental backups") + dryRun := subFlags.Bool("dry_run", false, "Only validate restore steps, do not actually restore data") if err := subFlags.Parse(args); err != nil { return err diff --git a/go/vt/vtctl/grpcvtctldclient/client_gen.go b/go/vt/vtctl/grpcvtctldclient/client_gen.go index 2153d2c94f4..d28d803ad3c 100644 --- a/go/vt/vtctl/grpcvtctldclient/client_gen.go +++ b/go/vt/vtctl/grpcvtctldclient/client_gen.go @@ -119,6 +119,15 @@ func (client *gRPCVtctldClient) CancelSchemaMigration(ctx context.Context, in *v return client.c.CancelSchemaMigration(ctx, in, opts...) } +// ChangeTabletTags is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) ChangeTabletTags(ctx context.Context, in *vtctldatapb.ChangeTabletTagsRequest, opts ...grpc.CallOption) (*vtctldatapb.ChangeTabletTagsResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.ChangeTabletTags(ctx, in, opts...) +} + // ChangeTabletType is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) ChangeTabletType(ctx context.Context, in *vtctldatapb.ChangeTabletTypeRequest, opts ...grpc.CallOption) (*vtctldatapb.ChangeTabletTypeResponse, error) { if client.c == nil { @@ -155,6 +164,15 @@ func (client *gRPCVtctldClient) CompleteSchemaMigration(ctx context.Context, in return client.c.CompleteSchemaMigration(ctx, in, opts...) } +// ConcludeTransaction is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) ConcludeTransaction(ctx context.Context, in *vtctldatapb.ConcludeTransactionRequest, opts ...grpc.CallOption) (*vtctldatapb.ConcludeTransactionResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.ConcludeTransaction(ctx, in, opts...) +} + // CreateKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) CreateKeyspace(ctx context.Context, in *vtctldatapb.CreateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.CreateKeyspaceResponse, error) { if client.c == nil { @@ -506,6 +524,15 @@ func (client *gRPCVtctldClient) GetTopologyPath(ctx context.Context, in *vtctlda return client.c.GetTopologyPath(ctx, in, opts...) } +// GetUnresolvedTransactions is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) GetUnresolvedTransactions(ctx context.Context, in *vtctldatapb.GetUnresolvedTransactionsRequest, opts ...grpc.CallOption) (*vtctldatapb.GetUnresolvedTransactionsResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.GetUnresolvedTransactions(ctx, in, opts...) +} + // GetVSchema is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) GetVSchema(ctx context.Context, in *vtctldatapb.GetVSchemaRequest, opts ...grpc.CallOption) (*vtctldatapb.GetVSchemaResponse, error) { if client.c == nil { diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index 0ab76e6b523..aaf13fb864a 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -31,6 +31,7 @@ import ( "sync" "time" + "golang.org/x/sync/errgroup" "golang.org/x/sync/semaphore" "google.golang.org/grpc" @@ -43,6 +44,7 @@ import ( "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/callerid" "vitess.io/vitess/go/vt/concurrency" + "vitess.io/vitess/go/vt/dtids" hk "vitess.io/vitess/go/vt/hook" "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/log" @@ -51,6 +53,16 @@ import ( "vitess.io/vitess/go/vt/mysqlctl/backupstorage" "vitess.io/vitess/go/vt/mysqlctl/mysqlctlproto" "vitess.io/vitess/go/vt/mysqlctl/tmutils" + logutilpb "vitess.io/vitess/go/vt/proto/logutil" + mysqlctlpb "vitess.io/vitess/go/vt/proto/mysqlctl" + querypb "vitess.io/vitess/go/vt/proto/query" + replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vschemapb "vitess.io/vitess/go/vt/proto/vschema" + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" + vtctlservicepb "vitess.io/vitess/go/vt/proto/vtctlservice" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/schemamanager" "vitess.io/vitess/go/vt/sqlparser" @@ -66,17 +78,6 @@ import ( "vitess.io/vitess/go/vt/vtgate/vindexes" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" "vitess.io/vitess/go/vt/vttablet/tmclient" - - logutilpb "vitess.io/vitess/go/vt/proto/logutil" - mysqlctlpb "vitess.io/vitess/go/vt/proto/mysqlctl" - querypb "vitess.io/vitess/go/vt/proto/query" - replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" - tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" - vschemapb "vitess.io/vitess/go/vt/proto/vschema" - vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" - vtctlservicepb "vitess.io/vitess/go/vt/proto/vtctlservice" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) const ( @@ -437,6 +438,7 @@ func (s *VtctldServer) Backup(req *vtctldatapb.BackupRequest, stream vtctlservic span.Annotate("allow_primary", req.AllowPrimary) span.Annotate("concurrency", req.Concurrency) span.Annotate("incremental_from_pos", req.IncrementalFromPos) + span.Annotate("backup_engine", req.BackupEngine) ti, err := s.ts.GetTablet(ctx, req.TabletAlias) if err != nil { @@ -523,6 +525,7 @@ func (s *VtctldServer) backupTablet(ctx context.Context, tablet *topodatapb.Tabl AllowPrimary: req.AllowPrimary, IncrementalFromPos: req.IncrementalFromPos, UpgradeSafe: req.UpgradeSafe, + BackupEngine: req.BackupEngine, } logStream, err := s.tmc.Backup(ctx, tablet, r) if err != nil { @@ -583,6 +586,39 @@ func (s *VtctldServer) CancelSchemaMigration(ctx context.Context, req *vtctldata return resp, nil } +// ChangeTabletTags is part of the vtctlservicepb.VtctldServer interface. +func (s *VtctldServer) ChangeTabletTags(ctx context.Context, req *vtctldatapb.ChangeTabletTagsRequest) (resp *vtctldatapb.ChangeTabletTagsResponse, err error) { + span, ctx := trace.NewSpan(ctx, "VtctldServer.ChangeTabletTags") + defer span.Finish() + + defer panicHandler(&err) + + span.Annotate("tablet_alias", topoproto.TabletAliasString(req.TabletAlias)) + span.Annotate("replace", req.Replace) + + ctx, cancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) + defer cancel() + + tablet, err := s.ts.GetTablet(ctx, req.TabletAlias) + if err != nil { + return nil, err + } + + span.Annotate("before_tablet_tags", tablet.Tags) + + changeTagsResp, err := s.tmc.ChangeTags(ctx, tablet.Tablet, req.Tags, req.Replace) + if err != nil { + return nil, err + } + + span.Annotate("after_tablet_tags", changeTagsResp.Tags) + + return &vtctldatapb.ChangeTabletTagsResponse{ + BeforeTags: tablet.Tags, + AfterTags: changeTagsResp.Tags, + }, nil +} + // ChangeTabletType is part of the vtctlservicepb.VtctldServer interface. func (s *VtctldServer) ChangeTabletType(ctx context.Context, req *vtctldatapb.ChangeTabletTypeRequest) (resp *vtctldatapb.ChangeTabletTypeResponse, err error) { span, ctx := trace.NewSpan(ctx, "VtctldServer.ChangeTabletType") @@ -1233,6 +1269,7 @@ func (s *VtctldServer) EmergencyReparentShard(ctx context.Context, req *vtctldat WaitReplicasTimeout: waitReplicasTimeout, WaitAllTablets: req.WaitForAllTablets, PreventCrossCellPromotion: req.PreventCrossCellPromotion, + ExpectedPrimaryAlias: req.ExpectedPrimary, }, ) @@ -2393,6 +2430,124 @@ func (s *VtctldServer) GetTopologyPath(ctx context.Context, req *vtctldatapb.Get }, nil } +// GetUnresolvedTransactions is part of the vtctlservicepb.VtctldServer interface. +// It returns the unresolved distributed transactions list for the provided keyspace. +func (s *VtctldServer) GetUnresolvedTransactions(ctx context.Context, req *vtctldatapb.GetUnresolvedTransactionsRequest) (*vtctldatapb.GetUnresolvedTransactionsResponse, error) { + span, ctx := trace.NewSpan(ctx, "VtctldServer.GetUnresolvedTransactions") + defer span.Finish() + + span.Annotate("keyspace", req.Keyspace) + + shards, err := s.ts.GetShardNames(ctx, req.Keyspace) + if err != nil { + return nil, err + } + var mu sync.Mutex + var transactions []*querypb.TransactionMetadata + + eg, newCtx := errgroup.WithContext(ctx) + eg.SetLimit(10) + for _, shard := range shards { + eg.Go(func() error { + si, err := s.ts.GetShard(newCtx, req.Keyspace, shard) + if err != nil { + return err + } + primary, err := s.ts.GetTablet(newCtx, si.PrimaryAlias) + if err != nil { + return err + } + shardTrnxs, err := s.tmc.GetUnresolvedTransactions(newCtx, primary.Tablet) + if err != nil { + return err + } + // The metadata manager is itself not part of the list of participants. + // We should it to the list before showing it to the users. + for _, trnx := range shardTrnxs { + trnx.Participants = append(trnx.Participants, &querypb.Target{ + Keyspace: req.Keyspace, + Shard: shard, + TabletType: topodatapb.TabletType_PRIMARY, + }) + } + mu.Lock() + defer mu.Unlock() + transactions = append(transactions, shardTrnxs...) + return nil + }) + } + if err = eg.Wait(); err != nil { + return nil, err + } + + return &vtctldatapb.GetUnresolvedTransactionsResponse{ + Transactions: transactions, + }, nil +} + +// ConcludeTransaction is part of the vtctlservicepb.VtctldServer interface. +// It concludes the unresolved distributed transaction. +func (s *VtctldServer) ConcludeTransaction(ctx context.Context, req *vtctldatapb.ConcludeTransactionRequest) (resp *vtctldatapb.ConcludeTransactionResponse, err error) { + span, ctx := trace.NewSpan(ctx, "VtctldServer.ConcludeTransaction") + defer span.Finish() + + span.Annotate("dtid", req.Dtid) + span.Annotate("participants", req.Participants) + + ss, err := dtids.ShardSession(req.Dtid) + if err != nil { + return nil, err + } + primary, err := s.getPrimaryTablet(ctx, ss.Target) + if err != nil { + return nil, err + } + + participants := req.Participants + if len(participants) == 0 { + // Read the transaction metadata if participating resource manager list is not provided in the request. + transaction, err := s.tmc.ReadTransaction(ctx, primary.Tablet, req.Dtid) + if transaction == nil || err != nil { + // no transaction record for the given ID. It is already concluded or does not exist. + return nil, err + } + participants = transaction.Participants + } + + eg, newCtx := errgroup.WithContext(ctx) + eg.SetLimit(10) + for _, rm := range participants { + eg.Go(func() error { + primary, err := s.getPrimaryTablet(newCtx, rm) + if err != nil { + return err + } + return s.tmc.ConcludeTransaction(newCtx, primary.Tablet, req.Dtid, false) + }) + } + if err = eg.Wait(); err != nil { + return nil, err + } + + if err = s.tmc.ConcludeTransaction(ctx, primary.Tablet, req.Dtid, true); err != nil { + return nil, err + } + + return &vtctldatapb.ConcludeTransactionResponse{}, nil +} + +func (s *VtctldServer) getPrimaryTablet(newCtx context.Context, rm *querypb.Target) (*topo.TabletInfo, error) { + si, err := s.ts.GetShard(newCtx, rm.Keyspace, rm.Shard) + if err != nil { + return nil, err + } + primary, err := s.ts.GetTablet(newCtx, si.PrimaryAlias) + if err != nil { + return nil, err + } + return primary, nil +} + // GetVersion returns the version of a tablet from its debug vars func (s *VtctldServer) GetVersion(ctx context.Context, req *vtctldatapb.GetVersionRequest) (resp *vtctldatapb.GetVersionResponse, err error) { span, ctx := trace.NewSpan(ctx, "VtctldServer.GetVersion") @@ -2959,6 +3114,10 @@ func (s *VtctldServer) PlannedReparentShard(ctx context.Context, req *vtctldatap span.Annotate("avoid_primary_alias", topoproto.TabletAliasString(req.AvoidPrimary)) } + if req.ExpectedPrimary != nil { + span.Annotate("expected_primary_alias", topoproto.TabletAliasString(req.ExpectedPrimary)) + } + if req.NewPrimary != nil { span.Annotate("new_primary_alias", topoproto.TabletAliasString(req.NewPrimary)) } @@ -2976,10 +3135,12 @@ func (s *VtctldServer) PlannedReparentShard(ctx context.Context, req *vtctldatap req.Keyspace, req.Shard, reparentutil.PlannedReparentOptions{ - AvoidPrimaryAlias: req.AvoidPrimary, - NewPrimaryAlias: req.NewPrimary, - WaitReplicasTimeout: waitReplicasTimeout, - TolerableReplLag: tolerableReplLag, + AvoidPrimaryAlias: req.AvoidPrimary, + NewPrimaryAlias: req.NewPrimary, + ExpectedPrimaryAlias: req.ExpectedPrimary, + WaitReplicasTimeout: waitReplicasTimeout, + TolerableReplLag: tolerableReplLag, + AllowCrossCellPromotion: req.AllowCrossCellPromotion, }, ) @@ -3415,10 +3576,11 @@ func (s *VtctldServer) RestoreFromBackup(req *vtctldatapb.RestoreFromBackupReque span.Annotate("shard", ti.Shard) r := &tabletmanagerdatapb.RestoreFromBackupRequest{ - BackupTime: req.BackupTime, - RestoreToPos: req.RestoreToPos, - RestoreToTimestamp: req.RestoreToTimestamp, - DryRun: req.DryRun, + BackupTime: req.BackupTime, + RestoreToPos: req.RestoreToPos, + RestoreToTimestamp: req.RestoreToTimestamp, + DryRun: req.DryRun, + AllowedBackupEngines: req.AllowedBackupEngines, } logStream, err := s.tmc.RestoreFromBackup(ctx, ti.Tablet, r) if err != nil { @@ -5033,6 +5195,7 @@ func (s *VtctldServer) VDiffCreate(ctx context.Context, req *vtctldatapb.VDiffCr span.Annotate("target_cells", req.TargetCells) span.Annotate("tablet_types", req.TabletTypes) span.Annotate("tables", req.Tables) + span.Annotate("auto_start", req.AutoStart) span.Annotate("auto_retry", req.AutoRetry) span.Annotate("max_diff_duration", req.MaxDiffDuration) @@ -5065,6 +5228,7 @@ func (s *VtctldServer) VDiffResume(ctx context.Context, req *vtctldatapb.VDiffRe span.Annotate("keyspace", req.TargetKeyspace) span.Annotate("workflow", req.Workflow) span.Annotate("uuid", req.Uuid) + span.Annotate("shards", req.TargetShards) resp, err = s.ws.VDiffResume(ctx, req) return resp, err @@ -5095,6 +5259,7 @@ func (s *VtctldServer) VDiffStop(ctx context.Context, req *vtctldatapb.VDiffStop span.Annotate("keyspace", req.TargetKeyspace) span.Annotate("workflow", req.Workflow) span.Annotate("uuid", req.Uuid) + span.Annotate("shards", req.TargetShards) resp, err = s.ws.VDiffStop(ctx, req) return resp, err @@ -5109,6 +5274,9 @@ func (s *VtctldServer) WorkflowDelete(ctx context.Context, req *vtctldatapb.Work span.Annotate("keyspace", req.Keyspace) span.Annotate("workflow", req.Workflow) + span.Annotate("keep_data", req.KeepData) + span.Annotate("keep_routing_rules", req.KeepRoutingRules) + span.Annotate("shards", req.Shards) resp, err = s.ws.WorkflowDelete(ctx, req) return resp, err @@ -5140,6 +5308,7 @@ func (s *VtctldServer) WorkflowSwitchTraffic(ctx context.Context, req *vtctldata span.Annotate("tablet-types", req.TabletTypes) span.Annotate("direction", req.Direction) span.Annotate("enable-reverse-replication", req.EnableReverseReplication) + span.Annotate("force", req.Force) resp, err = s.ws.WorkflowSwitchTraffic(ctx, req) return resp, err diff --git a/go/vt/vtctl/grpcvtctldserver/server_slow_test.go b/go/vt/vtctl/grpcvtctldserver/server_slow_test.go index 4d7c5aa1943..6c73bb1d264 100644 --- a/go/vt/vtctl/grpcvtctldserver/server_slow_test.go +++ b/go/vt/vtctl/grpcvtctldserver/server_slow_test.go @@ -25,6 +25,7 @@ import ( "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql/replication" + "vitess.io/vitess/go/vt/vtctl/reparentutil" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/protoutil" @@ -402,19 +403,24 @@ func TestPlannedReparentShardSlow(t *testing.T) { Error: nil, }, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000101": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, }, PrimaryPositionResults: map[string]struct { @@ -519,19 +525,24 @@ func TestPlannedReparentShardSlow(t *testing.T) { Error: nil, }, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000101": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, }, PrimaryPositionResults: map[string]struct { diff --git a/go/vt/vtctl/grpcvtctldserver/server_test.go b/go/vt/vtctl/grpcvtctldserver/server_test.go index 1b641488e1a..87e465c0f7d 100644 --- a/go/vt/vtctl/grpcvtctldserver/server_test.go +++ b/go/vt/vtctl/grpcvtctldserver/server_test.go @@ -29,6 +29,7 @@ import ( "time" _flag "vitess.io/vitess/go/internal/flag" + "vitess.io/vitess/go/vt/vtctl/reparentutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -1457,6 +1458,206 @@ func TestCancelSchemaMigration(t *testing.T) { } } +func TestChangeTabletTags(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + cells []string + tablet *topodatapb.Tablet + req *vtctldatapb.ChangeTabletTagsRequest + expected *vtctldatapb.ChangeTabletTagsResponse + shouldErr bool + }{ + { + name: "success", + cells: []string{"zone1"}, + tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: "ks", + Shard: "0", + }, + req: &vtctldatapb.ChangeTabletTagsRequest{ + TabletAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Tags: map[string]string{ + "test": t.Name(), + }, + }, + expected: &vtctldatapb.ChangeTabletTagsResponse{ + AfterTags: map[string]string{ + "test": t.Name(), + }, + }, + shouldErr: false, + }, + { + name: "success with existing", + cells: []string{"zone1"}, + tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: "ks", + Shard: "0", + Tags: map[string]string{ + "delete": "me", + "hello": "world!", + }, + }, + req: &vtctldatapb.ChangeTabletTagsRequest{ + TabletAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Tags: map[string]string{ + "delete": "", + "test": t.Name(), + }, + }, + expected: &vtctldatapb.ChangeTabletTagsResponse{ + BeforeTags: map[string]string{ + "delete": "me", + "hello": "world!", + }, + AfterTags: map[string]string{ + "hello": "world!", + "test": t.Name(), + }, + }, + shouldErr: false, + }, + { + name: "success with replace", + cells: []string{"zone1"}, + tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: "ks", + Shard: "0", + Tags: map[string]string{ + "hello": "world!", + }, + }, + req: &vtctldatapb.ChangeTabletTagsRequest{ + TabletAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Tags: map[string]string{ + "test": t.Name(), + }, + Replace: true, + }, + expected: &vtctldatapb.ChangeTabletTagsResponse{ + BeforeTags: map[string]string{ + "hello": "world!", + }, + AfterTags: map[string]string{ + "test": t.Name(), + }, + }, + shouldErr: false, + }, + { + name: "tablet not found", + cells: []string{"zone1"}, + tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 200, + }, + Keyspace: "ks", + Shard: "0", + }, + req: &vtctldatapb.ChangeTabletTagsRequest{ + TabletAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Tags: map[string]string{ + "test": t.Name(), + }, + }, + expected: nil, + shouldErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ts := memorytopo.NewServer(ctx, tt.cells...) + vtctld := testutil.NewVtctldServerWithTabletManagerClient(t, ts, &testutil.TabletManagerClient{ + TopoServer: ts, + }, func(ts *topo.Server) vtctlservicepb.VtctldServer { + return NewVtctldServer(vtenv.NewTestEnv(), ts) + }) + + testutil.AddTablets(ctx, t, ts, &testutil.AddTabletOptions{ + AlsoSetShardPrimary: true, + }, tt.tablet) + + resp, err := vtctld.ChangeTabletTags(ctx, tt.req) + if tt.shouldErr { + assert.Error(t, err) + return + } + assert.NoError(t, err) + utils.MustMatch(t, tt.expected, resp) + + tablet, err := ts.GetTablet(ctx, tt.req.TabletAlias) + assert.NoError(t, err) + utils.MustMatch(t, resp.AfterTags, tablet.Tags) + }) + } + + t.Run("tabletmanager failure", func(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ts := memorytopo.NewServer(ctx, "zone1") + vtctld := testutil.NewVtctldServerWithTabletManagerClient(t, ts, &testutil.TabletManagerClient{ + TopoServer: nil, + }, func(ts *topo.Server) vtctlservicepb.VtctldServer { + return NewVtctldServer(vtenv.NewTestEnv(), ts) + }) + + testutil.AddTablet(ctx, t, ts, &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: "ks", + Shard: "0", + Type: topodatapb.TabletType_REPLICA, + }, nil) + + _, err := vtctld.ChangeTabletTags(ctx, &vtctldatapb.ChangeTabletTagsRequest{ + TabletAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Tags: map[string]string{ + "test": t.Name(), + }, + }) + assert.Error(t, err) + }) +} + func TestChangeTabletType(t *testing.T) { t.Parallel() @@ -5167,6 +5368,182 @@ func TestExecuteHook(t *testing.T) { } } +func TestGetUnresolvedTransactions(t *testing.T) { + ks := "testkeyspace" + shard1Target := &querypb.Target{ + Keyspace: ks, + Shard: "-80", + TabletType: topodatapb.TabletType_PRIMARY, + } + shard2Target := &querypb.Target{ + Keyspace: ks, + Shard: "80-", + TabletType: topodatapb.TabletType_PRIMARY, + } + + tests := []struct { + name string + tmc *testutil.TabletManagerClient + keyspace string + expected []*querypb.TransactionMetadata + shouldErr bool + }{ + { + name: "unresolved transaction on both shards", + tmc: &testutil.TabletManagerClient{ + GetUnresolvedTransactionsResults: map[string][]*querypb.TransactionMetadata{ + "-80": {{Dtid: "aa", Participants: []*querypb.Target{shard2Target}}}, + "80-": {{Dtid: "bb", Participants: []*querypb.Target{shard1Target}}}, + }, + }, + keyspace: "testkeyspace", + expected: []*querypb.TransactionMetadata{ + {Dtid: "aa", Participants: []*querypb.Target{shard2Target, shard1Target}}, + {Dtid: "bb", Participants: []*querypb.Target{shard1Target, shard2Target}}, + }, + }, { + name: "unresolved transaction on one shard", + tmc: &testutil.TabletManagerClient{ + GetUnresolvedTransactionsResults: map[string][]*querypb.TransactionMetadata{ + "80-": {{Dtid: "bb", Participants: []*querypb.Target{shard1Target}}}, + }, + }, + keyspace: "testkeyspace", + expected: []*querypb.TransactionMetadata{ + {Dtid: "bb", Participants: []*querypb.Target{shard1Target, shard2Target}}, + }, + }, + { + name: "keyspace not found", + tmc: &testutil.TabletManagerClient{}, + keyspace: "unknown", + shouldErr: true, + }, + } + + tablets := []*topodatapb.Tablet{{ + Alias: &topodatapb.TabletAlias{Cell: "zone1", Uid: 100}, + Keyspace: ks, + Shard: "-80", + Type: topodatapb.TabletType_PRIMARY, + }, { + Alias: &topodatapb.TabletAlias{Cell: "zone1", Uid: 200}, + Keyspace: ks, + Shard: "80-", + Type: topodatapb.TabletType_PRIMARY, + }} + ts := memorytopo.NewServer(context.Background(), "zone1") + testutil.AddTablets(context.Background(), t, ts, &testutil.AddTabletOptions{AlsoSetShardPrimary: true}, tablets...) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + vtctld := testutil.NewVtctldServerWithTabletManagerClient(t, ts, tt.tmc, func(ts *topo.Server) vtctlservicepb.VtctldServer { + return NewVtctldServer(vtenv.NewTestEnv(), ts) + }) + req := &vtctldatapb.GetUnresolvedTransactionsRequest{Keyspace: tt.keyspace} + resp, err := vtctld.GetUnresolvedTransactions(ctx, req) + if tt.shouldErr { + assert.Error(t, err) + return + } + + require.NoError(t, err) + slices.SortFunc(resp.Transactions, func(a, b *querypb.TransactionMetadata) int { + return strings.Compare(a.Dtid, b.Dtid) + }) + utils.MustMatch(t, tt.expected, resp.Transactions) + }) + } +} + +func TestConcludeTransaction(t *testing.T) { + ks := "testkeyspace" + + tests := []struct { + name string + tmc *testutil.TabletManagerClient + dtid string + expErr string + participant []*querypb.Target + }{{ + name: "invalid dtid", + tmc: &testutil.TabletManagerClient{}, + dtid: "dtid01", + expErr: "invalid parts in dtid: dtid01", + }, { + name: "invalid transaction id", + tmc: &testutil.TabletManagerClient{}, + dtid: "ks:80-:013c", + expErr: "invalid transaction id in dtid: ks:80-:013c", + }, { + name: "only dtid", + tmc: &testutil.TabletManagerClient{ + ReadTransactionResult: map[string]*querypb.TransactionMetadata{ + "80-": {Dtid: "bb"}, + }, + }, + dtid: "testkeyspace:80-:1234", + }, { + name: "only dtid - empty metadata", + tmc: &testutil.TabletManagerClient{ + ReadTransactionResult: map[string]*querypb.TransactionMetadata{}, + }, + dtid: "testkeyspace:80-:1234", + }, { + name: "only dtid - fail", + tmc: &testutil.TabletManagerClient{}, + dtid: "testkeyspace:80-:1234", + expErr: "no ReadTransaction result on fake TabletManagerClient", + }, { + name: "with participant", + tmc: &testutil.TabletManagerClient{}, + dtid: "testkeyspace:80-:1234", + participant: []*querypb.Target{{Keyspace: ks, Shard: "-80"}}, + }, { + name: "call error", + tmc: &testutil.TabletManagerClient{CallError: true}, + dtid: "testkeyspace:80-:1234", + participant: []*querypb.Target{{Keyspace: ks, Shard: "-80"}}, + expErr: "blocked call for ConcludeTransaction on fake TabletManagerClient", + }} + + tablets := []*topodatapb.Tablet{{ + Alias: &topodatapb.TabletAlias{Cell: "zone1", Uid: 100}, + Keyspace: ks, + Shard: "-80", + Type: topodatapb.TabletType_PRIMARY, + }, { + Alias: &topodatapb.TabletAlias{Cell: "zone1", Uid: 200}, + Keyspace: ks, + Shard: "80-", + Type: topodatapb.TabletType_PRIMARY, + }} + ts := memorytopo.NewServer(context.Background(), "zone1") + testutil.AddTablets(context.Background(), t, ts, &testutil.AddTabletOptions{AlsoSetShardPrimary: true}, tablets...) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + vtctld := testutil.NewVtctldServerWithTabletManagerClient(t, ts, tt.tmc, func(ts *topo.Server) vtctlservicepb.VtctldServer { + return NewVtctldServer(vtenv.NewTestEnv(), ts) + }) + req := &vtctldatapb.ConcludeTransactionRequest{Dtid: tt.dtid, Participants: tt.participant} + _, err := vtctld.ConcludeTransaction(ctx, req) + if tt.expErr != "" { + require.ErrorContains(t, err, tt.expErr) + return + } + + require.NoError(t, err) + }) + } +} + func TestFindAllShardsInKeyspace(t *testing.T) { t.Parallel() @@ -8296,19 +8673,24 @@ func TestPlannedReparentShard(t *testing.T) { Error: nil, }, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000101": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, }, PrimaryPositionResults: map[string]struct { @@ -8425,19 +8807,22 @@ func TestPlannedReparentShard(t *testing.T) { }, }, tmc: &testutil.TabletManagerClient{ - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Error: fmt.Errorf("primary status failed"), + Error: fmt.Errorf("global status vars failed"), }, "zone1-0000000101": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + reparentutil.InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -8451,7 +8836,7 @@ func TestPlannedReparentShard(t *testing.T) { WaitReplicasTimeout: protoutil.DurationToProto(time.Millisecond * 10), }, expectEventsToOccur: true, - expectedErr: "primary status failed", + expectedErr: "global status vars failed", }, } @@ -12819,7 +13204,7 @@ func TestTabletExternallyReparented(t *testing.T) { defer func() { topofactory.SetError(nil) - ctx, cancel := context.WithTimeout(ctx, time.Millisecond*10) + ctx, cancel := context.WithTimeout(ctx, time.Second*10) defer cancel() resp, err := vtctld.GetTablets(ctx, &vtctldatapb.GetTabletsRequest{}) diff --git a/go/vt/vtctl/grpcvtctldserver/testutil/test_tmclient.go b/go/vt/vtctl/grpcvtctldserver/testutil/test_tmclient.go index ba560129459..0a2a271d77e 100644 --- a/go/vt/vtctl/grpcvtctldserver/testutil/test_tmclient.go +++ b/go/vt/vtctl/grpcvtctldserver/testutil/test_tmclient.go @@ -174,6 +174,10 @@ func init() { // with mock delays and response values, for use in unit tests. type TabletManagerClient struct { tmclient.TabletManagerClient + + // If true, the call will return an error. + CallError bool + // TopoServer is used for certain TabletManagerClient rpcs that update topo // information, e.g. ChangeType. To force an error result for those rpcs in // a test, set tmc.TopoServer = nil. @@ -185,6 +189,11 @@ type TabletManagerClient struct { ErrorAfter time.Duration } // keyed by tablet alias. + ChangeTagsResult map[string]struct { + Response *tabletmanagerdatapb.ChangeTagsResponse + Error error + } + ChangeTagsDelays map[string]time.Duration ChangeTabletTypeResult map[string]error ChangeTabletTypeDelays map[string]time.Duration // keyed by tablet alias. @@ -250,10 +259,13 @@ type TabletManagerClient struct { Schema *tabletmanagerdatapb.SchemaDefinition Error error } + GetGlobalStatusVarsDelays map[string]time.Duration GetGlobalStatusVarsResults map[string]struct { Statuses map[string]string Error error } + GetUnresolvedTransactionsResults map[string][]*querypb.TransactionMetadata + ReadTransactionResult map[string]*querypb.TransactionMetadata // keyed by tablet alias. InitPrimaryDelays map[string]time.Duration // keyed by tablet alias. injects a sleep to the end of the function @@ -279,6 +291,8 @@ type TabletManagerClient struct { PopulateReparentJournalDelays map[string]time.Duration // keyed by tablet alias PopulateReparentJournalResults map[string]error + // keyed by tablet alias + ReadReparentJournalInfoResults map[string]int // keyed by tablet alias. PromoteReplicaDelays map[string]time.Duration // keyed by tablet alias. injects a sleep to the end of the function @@ -471,6 +485,39 @@ func (fake *TabletManagerClient) Backup(ctx context.Context, tablet *topodatapb. return stream, nil } +// ChangeTags is part of the tmclient.TabletManagerClient interface. +func (fake *TabletManagerClient) ChangeTags(ctx context.Context, tablet *topodatapb.Tablet, tabletTags map[string]string, replace bool) (*tabletmanagerdatapb.ChangeTagsResponse, error) { + key := topoproto.TabletAliasString(tablet.Alias) + + if fake.ChangeTagsDelays != nil { + if delay, ok := fake.ChangeTagsDelays[key]; ok { + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-time.After(delay): + // proceed to results + } + } + } + + if result, ok := fake.ChangeTagsResult[key]; ok { + return result.Response, result.Error + } + + if fake.TopoServer == nil { + return nil, assert.AnError + } + + tablet, err := topotools.ChangeTags(ctx, fake.TopoServer, tablet.Alias, tabletTags, replace) + if err != nil { + return nil, err + } + + return &tabletmanagerdatapb.ChangeTagsResponse{ + Tags: tablet.Tags, + }, nil +} + // ChangeType is part of the tmclient.TabletManagerClient interface. func (fake *TabletManagerClient) ChangeType(ctx context.Context, tablet *topodatapb.Tablet, newType topodatapb.TabletType, semiSync bool) error { key := topoproto.TabletAliasString(tablet.Alias) @@ -648,6 +695,35 @@ func (fake *TabletManagerClient) ExecuteQuery(ctx context.Context, tablet *topod return nil, fmt.Errorf("%w: no ExecuteQuery result set for tablet %s", assert.AnError, key) } +// GetUnresolvedTransactions is part of the tmclient.TabletManagerClient interface. +func (fake *TabletManagerClient) GetUnresolvedTransactions(ctx context.Context, tablet *topodatapb.Tablet) ([]*querypb.TransactionMetadata, error) { + if len(fake.GetUnresolvedTransactionsResults) == 0 { + return nil, fmt.Errorf("%w: no GetUnresolvedTransactions results on fake TabletManagerClient", assert.AnError) + } + + return fake.GetUnresolvedTransactionsResults[tablet.Shard], nil +} + +// ReadTransaction is part of the tmclient.TabletManagerClient interface. +func (fake *TabletManagerClient) ReadTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string) (*querypb.TransactionMetadata, error) { + if fake.CallError { + return nil, fmt.Errorf("%w: blocked call for ReadTransaction on fake TabletManagerClient", assert.AnError) + } + if fake.ReadTransactionResult == nil { + return nil, fmt.Errorf("%w: no ReadTransaction result on fake TabletManagerClient", assert.AnError) + } + + return fake.ReadTransactionResult[tablet.Shard], nil +} + +// ConcludeTransaction is part of the tmclient.TabletManagerClient interface. +func (fake *TabletManagerClient) ConcludeTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string, mm bool) error { + if fake.CallError { + return fmt.Errorf("%w: blocked call for ConcludeTransaction on fake TabletManagerClient", assert.AnError) + } + return nil +} + // FullStatus is part of the tmclient.TabletManagerClient interface. func (fake *TabletManagerClient) FullStatus(ctx context.Context, tablet *topodatapb.Tablet) (*replicationdatapb.FullStatus, error) { if fake.FullStatusResult != nil { @@ -742,6 +818,17 @@ func (fake *TabletManagerClient) GetGlobalStatusVars(ctx context.Context, tablet } key := topoproto.TabletAliasString(tablet.Alias) + if fake.GetGlobalStatusVarsDelays != nil { + if delay, ok := fake.GetGlobalStatusVarsDelays[key]; ok { + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-time.After(delay): + // proceed to results + } + } + } + if result, ok := fake.GetGlobalStatusVarsResults[key]; ok { return result.Statuses, result.Error } @@ -871,6 +958,19 @@ func (fake *TabletManagerClient) PopulateReparentJournal(ctx context.Context, ta return assert.AnError } +// ReadReparentJournalInfo is part of the tmclient.TabletManagerClient interface. +func (fake *TabletManagerClient) ReadReparentJournalInfo(ctx context.Context, tablet *topodatapb.Tablet) (int, error) { + if fake.ReadReparentJournalInfoResults == nil { + return 1, nil + } + key := topoproto.TabletAliasString(tablet.Alias) + if result, ok := fake.ReadReparentJournalInfoResults[key]; ok { + return result, nil + } + + return 0, assert.AnError +} + // PromoteReplica is part of the tmclient.TabletManagerClient interface. func (fake *TabletManagerClient) PromoteReplica(ctx context.Context, tablet *topodatapb.Tablet, semiSync bool) (string, error) { if fake.PromoteReplicaResults == nil { diff --git a/go/vt/vtctl/localvtctldclient/client_gen.go b/go/vt/vtctl/localvtctldclient/client_gen.go index 2738c771be3..9aa6c3f729e 100644 --- a/go/vt/vtctl/localvtctldclient/client_gen.go +++ b/go/vt/vtctl/localvtctldclient/client_gen.go @@ -171,6 +171,11 @@ func (client *localVtctldClient) CancelSchemaMigration(ctx context.Context, in * return client.s.CancelSchemaMigration(ctx, in) } +// ChangeTabletTags is part of the vtctlservicepb.VtctldClient interface. +func (client *localVtctldClient) ChangeTabletTags(ctx context.Context, in *vtctldatapb.ChangeTabletTagsRequest, opts ...grpc.CallOption) (*vtctldatapb.ChangeTabletTagsResponse, error) { + return client.s.ChangeTabletTags(ctx, in) +} + // ChangeTabletType is part of the vtctlservicepb.VtctldClient interface. func (client *localVtctldClient) ChangeTabletType(ctx context.Context, in *vtctldatapb.ChangeTabletTypeRequest, opts ...grpc.CallOption) (*vtctldatapb.ChangeTabletTypeResponse, error) { return client.s.ChangeTabletType(ctx, in) @@ -191,6 +196,11 @@ func (client *localVtctldClient) CompleteSchemaMigration(ctx context.Context, in return client.s.CompleteSchemaMigration(ctx, in) } +// ConcludeTransaction is part of the vtctlservicepb.VtctldClient interface. +func (client *localVtctldClient) ConcludeTransaction(ctx context.Context, in *vtctldatapb.ConcludeTransactionRequest, opts ...grpc.CallOption) (*vtctldatapb.ConcludeTransactionResponse, error) { + return client.s.ConcludeTransaction(ctx, in) +} + // CreateKeyspace is part of the vtctlservicepb.VtctldClient interface. func (client *localVtctldClient) CreateKeyspace(ctx context.Context, in *vtctldatapb.CreateKeyspaceRequest, opts ...grpc.CallOption) (*vtctldatapb.CreateKeyspaceResponse, error) { return client.s.CreateKeyspace(ctx, in) @@ -386,6 +396,11 @@ func (client *localVtctldClient) GetTopologyPath(ctx context.Context, in *vtctld return client.s.GetTopologyPath(ctx, in) } +// GetUnresolvedTransactions is part of the vtctlservicepb.VtctldClient interface. +func (client *localVtctldClient) GetUnresolvedTransactions(ctx context.Context, in *vtctldatapb.GetUnresolvedTransactionsRequest, opts ...grpc.CallOption) (*vtctldatapb.GetUnresolvedTransactionsResponse, error) { + return client.s.GetUnresolvedTransactions(ctx, in) +} + // GetVSchema is part of the vtctlservicepb.VtctldClient interface. func (client *localVtctldClient) GetVSchema(ctx context.Context, in *vtctldatapb.GetVSchemaRequest, opts ...grpc.CallOption) (*vtctldatapb.GetVSchemaResponse, error) { return client.s.GetVSchema(ctx, in) diff --git a/go/vt/vtctl/reparent.go b/go/vt/vtctl/reparent.go index 4498228d9c7..192d19ed7ee 100644 --- a/go/vt/vtctl/reparent.go +++ b/go/vt/vtctl/reparent.go @@ -119,6 +119,7 @@ func commandPlannedReparentShard(ctx context.Context, wr *wrangler.Wrangler, sub keyspaceShard := subFlags.String("keyspace_shard", "", "keyspace/shard of the shard that needs to be reparented") newPrimary := subFlags.String("new_primary", "", "alias of a tablet that should be the new primary") avoidTablet := subFlags.String("avoid_tablet", "", "alias of a tablet that should not be the primary, i.e. reparent to any other tablet if this one is the primary") + allowCrossCellPromotion := subFlags.Bool("allow-cross-cell-promotion", false, "allow cross cell promotions") if err := subFlags.Parse(args); err != nil { return err @@ -153,10 +154,11 @@ func commandPlannedReparentShard(ctx context.Context, wr *wrangler.Wrangler, sub } return wr.PlannedReparentShard(ctx, keyspace, shard, reparentutil.PlannedReparentOptions{ - NewPrimaryAlias: newPrimaryAlias, - AvoidPrimaryAlias: avoidTabletAlias, - WaitReplicasTimeout: *waitReplicasTimeout, - TolerableReplLag: *tolerableReplicationLag, + NewPrimaryAlias: newPrimaryAlias, + AvoidPrimaryAlias: avoidTabletAlias, + WaitReplicasTimeout: *waitReplicasTimeout, + TolerableReplLag: *tolerableReplicationLag, + AllowCrossCellPromotion: *allowCrossCellPromotion, }) } diff --git a/go/vt/vtctl/reparentutil/emergency_reparenter.go b/go/vt/vtctl/reparentutil/emergency_reparenter.go index e65f1891872..ef30f48e8ac 100644 --- a/go/vt/vtctl/reparentutil/emergency_reparenter.go +++ b/go/vt/vtctl/reparentutil/emergency_reparenter.go @@ -23,6 +23,7 @@ import ( "time" "vitess.io/vitess/go/mysql/replication" + "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/event" "vitess.io/vitess/go/sets" @@ -60,6 +61,7 @@ type EmergencyReparentOptions struct { WaitAllTablets bool WaitReplicasTimeout time.Duration PreventCrossCellPromotion bool + ExpectedPrimaryAlias *topodatapb.TabletAlias // Private options managed internally. We use value passing to avoid leaking // these details back out. @@ -157,6 +159,7 @@ func (erp *EmergencyReparenter) reparentShardLocked(ctx context.Context, ev *eve validReplacementCandidates []*topodatapb.Tablet betterCandidate *topodatapb.Tablet isIdeal bool + isGTIDBased bool ) shardInfo, err = erp.ts.GetShard(ctx, keyspace, shard) @@ -165,6 +168,13 @@ func (erp *EmergencyReparenter) reparentShardLocked(ctx context.Context, ev *eve } ev.ShardInfo = *shardInfo + if opts.ExpectedPrimaryAlias != nil && !topoproto.TabletAliasEqual(opts.ExpectedPrimaryAlias, shardInfo.PrimaryAlias) { + return vterrors.Errorf(vtrpc.Code_FAILED_PRECONDITION, "primary %s is not equal to expected alias %s", + topoproto.TabletAliasString(shardInfo.PrimaryAlias), + topoproto.TabletAliasString(opts.ExpectedPrimaryAlias), + ) + } + keyspaceDurability, err := erp.ts.GetKeyspaceDurability(ctx, keyspace) if err != nil { return err @@ -205,9 +215,8 @@ func (erp *EmergencyReparenter) reparentShardLocked(ctx context.Context, ev *eve return vterrors.Wrap(err, lostTopologyLockMsg) } - // find the valid candidates for becoming the primary - // this is where we check for errant GTIDs and remove the tablets that have them from consideration - validCandidates, err = FindValidEmergencyReparentCandidates(stoppedReplicationSnapshot.statusMap, stoppedReplicationSnapshot.primaryStatusMap) + // find the positions of all the valid candidates. + validCandidates, isGTIDBased, err = FindPositionsOfAllCandidates(stoppedReplicationSnapshot.statusMap, stoppedReplicationSnapshot.primaryStatusMap) if err != nil { return err } @@ -224,6 +233,14 @@ func (erp *EmergencyReparenter) reparentShardLocked(ctx context.Context, ev *eve return err } + // For GTID based replication, we will run errant GTID detection. + if isGTIDBased { + validCandidates, err = erp.findErrantGTIDs(ctx, validCandidates, stoppedReplicationSnapshot.statusMap, tabletMap, opts.WaitReplicasTimeout) + if err != nil { + return err + } + } + // Find the intermediate source for replication that we want other tablets to replicate from. // This step chooses the most advanced tablet. Further ties are broken by using the promotion rule. // In case the user has specified a tablet specifically, then it is selected, as long as it is the most advanced. @@ -390,7 +407,7 @@ func (erp *EmergencyReparenter) findMostAdvanced( } // sort the tablets for finding the best intermediate source in ERS - err = sortTabletsForReparent(validTablets, tabletPositions, opts.durability) + err = sortTabletsForReparent(validTablets, tabletPositions, nil, opts.durability) if err != nil { return nil, nil, err } @@ -753,3 +770,162 @@ func (erp *EmergencyReparenter) filterValidCandidates(validTablets []*topodatapb } return restrictedValidTablets, nil } + +// findErrantGTIDs tries to find errant GTIDs for the valid candidates and returns the updated list of valid candidates. +// This function does not actually return the identities of errant GTID tablets, if any. It only returns the identities of non-errant GTID tablets, which are eligible for promotion. +// The caller of this function (ERS) will then choose from among the list of candidate tablets, based on higher-level criteria. +func (erp *EmergencyReparenter) findErrantGTIDs( + ctx context.Context, + validCandidates map[string]replication.Position, + statusMap map[string]*replicationdatapb.StopReplicationStatus, + tabletMap map[string]*topo.TabletInfo, + waitReplicasTimeout time.Duration, +) (map[string]replication.Position, error) { + // First we need to collect the reparent journal length for all the candidates. + // This will tell us, which of the tablets are severly lagged, and haven't even seen all the primary promotions. + // Such severely lagging tablets cannot be used to find errant GTIDs in other tablets, seeing that they themselves don't have enough information. + reparentJournalLen, err := erp.gatherReparenJournalInfo(ctx, validCandidates, tabletMap, waitReplicasTimeout) + if err != nil { + return nil, err + } + + // Find the maximum length of the reparent journal among all the candidates. + var maxLen int + for _, length := range reparentJournalLen { + maxLen = max(maxLen, length) + } + + // Find the candidates with the maximum length of the reparent journal. + var maxLenCandidates []string + for alias, length := range reparentJournalLen { + if length == maxLen { + maxLenCandidates = append(maxLenCandidates, alias) + } + } + + // We use all the candidates with the maximum length of the reparent journal to find the errant GTIDs amongst them. + var maxLenPositions []replication.Position + updatedValidCandidates := make(map[string]replication.Position) + for _, candidate := range maxLenCandidates { + status, ok := statusMap[candidate] + if !ok { + // If the tablet is not in the status map, and has the maximum length of the reparent journal, + // then it should be the latest primary and we don't need to run any errant GTID detection on it! + // There is a very unlikely niche case that can happen where we see two tablets report themselves as having + // the maximum reparent journal length and also be primaries. Here is the outline of it - + // 1. Tablet A is the primary and reparent journal length is 3. + // 2. It gets network partitioned, and we promote tablet B as the new primary. + // 3. tablet B gets network partitioned before it has written to the reparent journal, and a new ERS call ensues. + // 4. During this ERS call, both A and B are seen online. They would both report being primary tablets with the same reparent journal length. + // Even in this case, the best we can do is not run errant GTID detection on either, and let the split brain detection code + // deal with it, if A in fact has errant GTIDs. + maxLenPositions = append(maxLenPositions, validCandidates[candidate]) + updatedValidCandidates[candidate] = validCandidates[candidate] + continue + } + // Store all the other candidate's positions so that we can run errant GTID detection using them. + otherPositions := make([]replication.Position, 0, len(maxLenCandidates)-1) + for _, otherCandidate := range maxLenCandidates { + if otherCandidate == candidate { + continue + } + otherPositions = append(otherPositions, validCandidates[otherCandidate]) + } + // Run errant GTID detection and throw away any tablet that has errant GTIDs. + afterStatus := replication.ProtoToReplicationStatus(status.After) + errantGTIDs, err := replication.FindErrantGTIDs(afterStatus.RelayLogPosition, afterStatus.SourceUUID, otherPositions) + if err != nil { + return nil, err + } + if errantGTIDs != nil { + log.Errorf("skipping %v with GTIDSet:%v because we detected errant GTIDs - %v", candidate, afterStatus.RelayLogPosition.GTIDSet, errantGTIDs) + continue + } + maxLenPositions = append(maxLenPositions, validCandidates[candidate]) + updatedValidCandidates[candidate] = validCandidates[candidate] + } + + // For all the other tablets, that are lagged enough that they haven't seen all the reparent journal entries, + // we run errant GTID detection by using the tablets with the maximum length of the reparent journal. + // We throw away any tablet that has errant GTIDs. + for alias, length := range reparentJournalLen { + if length == maxLen { + continue + } + // Here we don't want to send the source UUID. The reason is that all of these tablets are lagged, + // so we don't need to use the source UUID to discount any GTIDs. + // To explain this point further, let me use an example. Consider the following situation - + // 1. Tablet A is the primary and B is a rdonly replica. + // 2. They both get network partitioned, and then a new ERS call ensues, and we promote tablet C. + // 3. Tablet C also fails, and we run a new ERS call. + // 4. During this ERS, B comes back online and is visible. Since it hasn't seen the last reparent journal entry + // it will be considered lagged. + // 5. If it has an errant GTID that was written by A, then we want to find that errant GTID. Since B hasn't reparented to a + // different tablet, it would still be replicating from A. This means its server UUID would be A. + // 6. Because we don't want to discount the writes from tablet A, when we're doing the errant GTID detection on B, we + // choose not to pass in the server UUID. + // This exact scenario outlined above, can be found in the test for this function, subtest `Case 5a`. + // The idea is that if the tablet is lagged, then even the server UUID that it is replicating from + // should not be considered a valid source of writes that no other tablet has. + errantGTIDs, err := replication.FindErrantGTIDs(validCandidates[alias], replication.SID{}, maxLenPositions) + if err != nil { + return nil, err + } + if errantGTIDs != nil { + log.Errorf("skipping %v with GTIDSet:%v because we detected errant GTIDs - %v", alias, validCandidates[alias], errantGTIDs) + continue + } + updatedValidCandidates[alias] = validCandidates[alias] + } + + return updatedValidCandidates, nil +} + +// gatherReparenJournalInfo reads the reparent journal information from all the tablets in the valid candidates list. +func (erp *EmergencyReparenter) gatherReparenJournalInfo( + ctx context.Context, + validCandidates map[string]replication.Position, + tabletMap map[string]*topo.TabletInfo, + waitReplicasTimeout time.Duration, +) (map[string]int, error) { + reparentJournalLen := make(map[string]int) + var mu sync.Mutex + errCh := make(chan concurrency.Error) + defer close(errCh) + + groupCtx, groupCancel := context.WithTimeout(ctx, waitReplicasTimeout) + defer groupCancel() + + waiterCount := 0 + + for candidate := range validCandidates { + go func(alias string) { + var err error + var length int + defer func() { + errCh <- concurrency.Error{ + Err: err, + } + }() + length, err = erp.tmc.ReadReparentJournalInfo(groupCtx, tabletMap[alias].Tablet) + mu.Lock() + defer mu.Unlock() + reparentJournalLen[alias] = length + }(candidate) + + waiterCount++ + } + + errgroup := concurrency.ErrorGroup{ + NumGoroutines: waiterCount, + NumRequiredSuccesses: waiterCount, + NumAllowedErrors: 0, + } + rec := errgroup.Wait(groupCancel, errCh) + + if len(rec.Errors) != 0 { + return nil, vterrors.Wrapf(rec.Error(), "could not read reparent journal information within the provided waitReplicasTimeout (%s): %v", waitReplicasTimeout, rec.Error()) + } + + return reparentJournalLen, nil +} diff --git a/go/vt/vtctl/reparentutil/emergency_reparenter_test.go b/go/vt/vtctl/reparentutil/emergency_reparenter_test.go index ffd2c4a3926..ea6e768d036 100644 --- a/go/vt/vtctl/reparentutil/emergency_reparenter_test.go +++ b/go/vt/vtctl/reparentutil/emergency_reparenter_test.go @@ -19,6 +19,7 @@ package reparentutil import ( "context" "fmt" + "slices" "testing" "time" @@ -26,6 +27,8 @@ import ( "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql/replication" + logutilpb "vitess.io/vitess/go/vt/proto/logutil" + "vitess.io/vitess/go/vt/vttablet/tmclient" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sets" @@ -1810,6 +1813,55 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { shouldErr: true, errShouldContain: "proposed primary zone1-0000000102 will not be able to make forward progress on being promoted", }, + { + name: "expected primary mismatch", + durability: "none", + emergencyReparentOps: EmergencyReparentOptions{ + ExpectedPrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + }, + tmc: &testutil.TabletManagerClient{}, + shards: []*vtctldatapb.Shard{ + { + Keyspace: "testkeyspace", + Name: "-", + Shard: &topodatapb.Shard{ + IsPrimaryServing: true, + PrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + }, + }, + }, + tablets: []*topodatapb.Tablet{ + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Type: topodatapb.TabletType_PRIMARY, + Keyspace: "testkeyspace", + Shard: "-", + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Type: topodatapb.TabletType_REPLICA, + Keyspace: "testkeyspace", + Shard: "-", + }, + }, + keyspace: "testkeyspace", + shard: "-", + cells: []string{"zone1"}, + shouldErr: true, + errShouldContain: "primary zone1-0000000100 is not equal to expected alias zone1-0000000101", + }, } for _, tt := range tests { @@ -1851,7 +1903,7 @@ func TestEmergencyReparenter_reparentShardLocked(t *testing.T) { err := erp.reparentShardLocked(ctx, ev, tt.keyspace, tt.shard, tt.emergencyReparentOps) if tt.shouldErr { assert.Error(t, err) - assert.Contains(t, err.Error(), tt.errShouldContain) + assert.ErrorContains(t, err, tt.errShouldContain) return } @@ -4510,3 +4562,942 @@ func TestEmergencyReparenter_filterValidCandidates(t *testing.T) { }) } } + +// getRelayLogPosition is a helper function that prints out the relay log positions. +func getRelayLogPosition(gtidSets ...string) string { + u1 := "00000000-0000-0000-0000-000000000001" + u2 := "00000000-0000-0000-0000-000000000002" + u3 := "00000000-0000-0000-0000-000000000003" + u4 := "00000000-0000-0000-0000-000000000004" + uuids := []string{u1, u2, u3, u4} + + res := "MySQL56/" + first := true + for idx, set := range gtidSets { + if set == "" { + continue + } + if !first { + res += "," + } + first = false + res += fmt.Sprintf("%s:%s", uuids[idx], set) + } + return res +} + +// TestEmergencyReparenterFindErrantGTIDs tests that ERS can find the most advanced replica after marking tablets as errant. +func TestEmergencyReparenterFindErrantGTIDs(t *testing.T) { + u1 := "00000000-0000-0000-0000-000000000001" + u2 := "00000000-0000-0000-0000-000000000002" + tests := []struct { + name string + tmc tmclient.TabletManagerClient + statusMap map[string]*replicationdatapb.StopReplicationStatus + primaryStatusMap map[string]*replicationdatapb.PrimaryStatus + tabletMap map[string]*topo.TabletInfo + wantedCandidates []string + wantMostAdvancedPossible []string + wantErr string + }{ + { + name: "Case 1a: No Errant GTIDs. This is the first reparent. A replica is the most advanced.", + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 1, + "zone1-0000000103": 1, + "zone1-0000000104": 1, + }, + }, + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-99"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100"), + SourceUuid: u1, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000102", "zone1-0000000103", "zone1-0000000104"}, + wantMostAdvancedPossible: []string{"zone1-0000000102"}, + }, + { + name: "Case 1b: No Errant GTIDs. This is not the first reparent. A replica is the most advanced.", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 2, + "zone1-0000000103": 2, + "zone1-0000000104": 2, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-99", "1-30"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30"), + SourceUuid: u1, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000102", "zone1-0000000103", "zone1-0000000104"}, + wantMostAdvancedPossible: []string{"zone1-0000000102"}, + }, + { + name: "Case 1c: No Errant GTIDs. This is not the first reparent. A rdonly is the most advanced.", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 2, + "zone1-0000000103": 2, + "zone1-0000000104": 2, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-99", "1-30"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-101", "1-30"), + SourceUuid: u1, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000102", "zone1-0000000103", "zone1-0000000104"}, + wantMostAdvancedPossible: []string{"zone1-0000000104"}, + }, + { + name: "Case 2: Only 1 tablet is recent and all others are severely lagged", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 3, + "zone1-0000000103": 2, + "zone1-0000000104": 1, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-100"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-30"), + SourceUuid: u1, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000102", "zone1-0000000103", "zone1-0000000104"}, + wantMostAdvancedPossible: []string{"zone1-0000000102"}, + }, + { + name: "Case 3: All replicas severely lagged (Primary tablet dies with t1: u1-100, u2:1-30, u3:1-100)", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 2, + "zone1-0000000103": 2, + "zone1-0000000104": 1, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-30"), + SourceUuid: u1, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000102", "zone1-0000000103", "zone1-0000000104"}, + wantMostAdvancedPossible: []string{"zone1-0000000102", "zone1-0000000103"}, + }, + { + name: "Case 4: Primary dies and comes back, has an extra UUID, right at the point when a new ERS has started.", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 2, + "zone1-0000000103": 3, + "zone1-0000000104": 3, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-90", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + }, + primaryStatusMap: map[string]*replicationdatapb.PrimaryStatus{ + "zone1-0000000102": { + Position: getRelayLogPosition("", "1-31", "1-50"), + }, + }, + wantedCandidates: []string{"zone1-0000000103", "zone1-0000000104"}, + wantMostAdvancedPossible: []string{"zone1-0000000103"}, + }, + { + name: "Case 5a: Old Primary and a rdonly have errant GTID. Old primary is permanently lost and comes up from backup and ronly comes up during ERS", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 2, + "zone1-0000000103": 3, + "zone1-0000000104": 2, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-20", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-31", "1-50"), + SourceUuid: u2, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000102", "zone1-0000000103"}, + wantMostAdvancedPossible: []string{"zone1-0000000103"}, + }, + { + name: "Case 5b: Old Primary and a rdonly have errant GTID. Both come up during ERS", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 2, + "zone1-0000000103": 3, + "zone1-0000000104": 2, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-31", "1-50"), + SourceUuid: u2, + }, + }, + }, + primaryStatusMap: map[string]*replicationdatapb.PrimaryStatus{ + "zone1-0000000102": { + Position: getRelayLogPosition("", "1-31", "1-50"), + }, + }, + wantedCandidates: []string{"zone1-0000000103"}, + wantMostAdvancedPossible: []string{"zone1-0000000103"}, + }, + { + name: "Case 6a: Errant GTID introduced on a replica server by a write that shouldn't happen. The replica with errant GTID is not the most advanced.", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 3, + "zone1-0000000103": 3, + "zone1-0000000104": 3, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-99", "1-31", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000103", "zone1-0000000104"}, + wantMostAdvancedPossible: []string{"zone1-0000000103", "zone1-0000000104"}, + }, + { + name: "Case 6b: Errant GTID introduced on a replica server by a write that shouldn't happen. The replica with errant GTID is the most advanced.", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 3, + "zone1-0000000103": 3, + "zone1-0000000104": 2, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-101", "1-31", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000103", "zone1-0000000104"}, + wantMostAdvancedPossible: []string{"zone1-0000000103"}, + }, + { + name: "Case 6c: Errant GTID introduced on a replica server by a write that shouldn't happen. Only 2 tablets exist.", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 3, + "zone1-0000000103": 3, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-31", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000103"}, + wantMostAdvancedPossible: []string{"zone1-0000000103"}, + }, + { + name: "Case 7: Both replicas with errant GTIDs", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 3, + "zone1-0000000103": 3, + "zone1-0000000104": 3, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000102": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-31", "1-50"), + SourceUuid: u1, + }, + }, + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-51"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-90", "1-30", "1-50"), + SourceUuid: u1, + }, + }, + }, + wantedCandidates: []string{"zone1-0000000104"}, + wantMostAdvancedPossible: []string{"zone1-0000000104"}, + }, + { + name: "Case 8a: Old primary and rdonly have errant GTID and come up during ERS and replica has an errant GTID introduced by the user.", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{ + "zone1-0000000102": 2, + "zone1-0000000103": 3, + "zone1-0000000104": 2, + }, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-51"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-31", "1-50"), + SourceUuid: u2, + }, + }, + }, + primaryStatusMap: map[string]*replicationdatapb.PrimaryStatus{ + "zone1-0000000102": { + Position: getRelayLogPosition("", "1-31", "1-50"), + }, + }, + wantedCandidates: []string{"zone1-0000000103"}, + wantMostAdvancedPossible: []string{"zone1-0000000103"}, + }, + { + name: "Reading reparent journal fails", + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000102": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000102", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + "zone1-0000000103": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000103", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 103, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000104": { + Tablet: &topodatapb.Tablet{ + Hostname: "zone1-0000000104", + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 104, + }, + Type: topodatapb.TabletType_RDONLY, + }, + }, + }, + tmc: &testutil.TabletManagerClient{ + ReadReparentJournalInfoResults: map[string]int{}, + }, + statusMap: map[string]*replicationdatapb.StopReplicationStatus{ + "zone1-0000000103": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("1-100", "1-30", "1-51"), + SourceUuid: u1, + }, + }, + "zone1-0000000104": { + After: &replicationdatapb.Status{ + RelayLogPosition: getRelayLogPosition("", "1-31", "1-50"), + SourceUuid: u2, + }, + }, + }, + primaryStatusMap: map[string]*replicationdatapb.PrimaryStatus{ + "zone1-0000000102": { + Position: getRelayLogPosition("", "1-31", "1-50"), + }, + }, + wantErr: "could not read reparent journal information", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + erp := &EmergencyReparenter{ + tmc: tt.tmc, + } + validCandidates, isGtid, err := FindPositionsOfAllCandidates(tt.statusMap, tt.primaryStatusMap) + require.NoError(t, err) + require.True(t, isGtid) + candidates, err := erp.findErrantGTIDs(context.Background(), validCandidates, tt.statusMap, tt.tabletMap, 10*time.Second) + if tt.wantErr != "" { + require.ErrorContains(t, err, tt.wantErr) + return + } + require.NoError(t, err) + keys := make([]string, 0, len(candidates)) + for key := range candidates { + keys = append(keys, key) + } + slices.Sort(keys) + require.ElementsMatch(t, tt.wantedCandidates, keys) + + dp, err := GetDurabilityPolicy("semi_sync") + require.NoError(t, err) + ers := EmergencyReparenter{logger: logutil.NewCallbackLogger(func(*logutilpb.Event) {})} + winningPrimary, _, err := ers.findMostAdvanced(candidates, tt.tabletMap, EmergencyReparentOptions{durability: dp}) + require.NoError(t, err) + require.True(t, slices.Contains(tt.wantMostAdvancedPossible, winningPrimary.Hostname), winningPrimary.Hostname) + }) + } +} diff --git a/go/vt/vtctl/reparentutil/planned_reparenter.go b/go/vt/vtctl/reparentutil/planned_reparenter.go index 49741f44574..91669e33b5f 100644 --- a/go/vt/vtctl/reparentutil/planned_reparenter.go +++ b/go/vt/vtctl/reparentutil/planned_reparenter.go @@ -19,6 +19,7 @@ package reparentutil import ( "context" "fmt" + "strconv" "sync" "time" @@ -44,6 +45,7 @@ var ( prsCounter = stats.NewCountersWithMultiLabels("PlannedReparentCounts", "Number of times Planned Reparent Shard has been run", []string{"Keyspace", "Shard", "Result"}, ) + InnodbBufferPoolsDataVar = "Innodb_buffer_pool_pages_data" ) // PlannedReparenter performs PlannedReparentShard operations. @@ -57,10 +59,12 @@ type PlannedReparenter struct { // operations. Options are passed by value, so it is safe for callers to mutate // resue options structs for multiple calls. type PlannedReparentOptions struct { - NewPrimaryAlias *topodatapb.TabletAlias - AvoidPrimaryAlias *topodatapb.TabletAlias - WaitReplicasTimeout time.Duration - TolerableReplLag time.Duration + NewPrimaryAlias *topodatapb.TabletAlias + AvoidPrimaryAlias *topodatapb.TabletAlias + ExpectedPrimaryAlias *topodatapb.TabletAlias + WaitReplicasTimeout time.Duration + TolerableReplLag time.Duration + AllowCrossCellPromotion bool // Private options managed internally. We use value-passing semantics to // set these options inside a PlannedReparent without leaking these details @@ -158,6 +162,7 @@ func (pr *PlannedReparenter) preflightChecks( ctx context.Context, ev *events.Reparent, tabletMap map[string]*topo.TabletInfo, + innodbBufferPoolData map[string]int, opts *PlannedReparentOptions, // we take a pointer here to set NewPrimaryAlias ) (isNoop bool, err error) { // We don't want to fail when both NewPrimaryAlias and AvoidPrimaryAlias are nil. @@ -178,7 +183,7 @@ func (pr *PlannedReparenter) preflightChecks( } event.DispatchUpdate(ev, "electing a primary candidate") - opts.NewPrimaryAlias, err = ElectNewPrimary(ctx, pr.tmc, &ev.ShardInfo, tabletMap, opts.NewPrimaryAlias, opts.AvoidPrimaryAlias, opts.WaitReplicasTimeout, opts.TolerableReplLag, opts.durability, pr.logger) + opts.NewPrimaryAlias, err = ElectNewPrimary(ctx, pr.tmc, &ev.ShardInfo, tabletMap, innodbBufferPoolData, opts, pr.logger) if err != nil { return true, err } @@ -503,6 +508,13 @@ func (pr *PlannedReparenter) reparentShardLocked( return err } + if opts.ExpectedPrimaryAlias != nil && !topoproto.TabletAliasEqual(opts.ExpectedPrimaryAlias, shardInfo.PrimaryAlias) { + return vterrors.Errorf(vtrpc.Code_FAILED_PRECONDITION, "primary %s is not equal to expected alias %s", + topoproto.TabletAliasString(shardInfo.PrimaryAlias), + topoproto.TabletAliasString(opts.ExpectedPrimaryAlias), + ) + } + keyspaceDurability, err := pr.ts.GetKeyspaceDurability(ctx, keyspace) if err != nil { return err @@ -523,13 +535,13 @@ func (pr *PlannedReparenter) reparentShardLocked( return err } - err = pr.verifyAllTabletsReachable(ctx, tabletMap) + innodbBufferPoolData, err := pr.verifyAllTabletsReachable(ctx, tabletMap) if err != nil { return err } // Check invariants that PlannedReparentShard depends on. - if isNoop, err := pr.preflightChecks(ctx, ev, tabletMap, &opts); err != nil { + if isNoop, err := pr.preflightChecks(ctx, ev, tabletMap, innodbBufferPoolData, &opts); err != nil { return err } else if isNoop { return nil @@ -730,18 +742,30 @@ func (pr *PlannedReparenter) reparentTablets( } // verifyAllTabletsReachable verifies that all the tablets are reachable when running PRS. -func (pr *PlannedReparenter) verifyAllTabletsReachable(ctx context.Context, tabletMap map[string]*topo.TabletInfo) error { +func (pr *PlannedReparenter) verifyAllTabletsReachable(ctx context.Context, tabletMap map[string]*topo.TabletInfo) (map[string]int, error) { // Create a cancellable context for the entire set of RPCs to verify reachability. verifyCtx, verifyCancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) defer verifyCancel() + innodbBufferPoolsData := make(map[string]int) + var mu sync.Mutex errorGroup, groupCtx := errgroup.WithContext(verifyCtx) - for _, info := range tabletMap { + for tblStr, info := range tabletMap { tablet := info.Tablet errorGroup.Go(func() error { - _, err := pr.tmc.PrimaryStatus(groupCtx, tablet) - return err + statusValues, err := pr.tmc.GetGlobalStatusVars(groupCtx, tablet, []string{InnodbBufferPoolsDataVar}) + if err != nil { + return err + } + // We are ignoring the error in conversion because some MySQL variants might not have this + // status variable like MariaDB. + val, _ := strconv.Atoi(statusValues[InnodbBufferPoolsDataVar]) + mu.Lock() + defer mu.Unlock() + innodbBufferPoolsData[tblStr] = val + return nil }) } - return errorGroup.Wait() + err := errorGroup.Wait() + return innodbBufferPoolsData, err } diff --git a/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go b/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go index 779390179b9..8e2ee8f9df7 100644 --- a/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go +++ b/go/vt/vtctl/reparentutil/planned_reparenter_flaky_test.go @@ -108,16 +108,19 @@ func TestPlannedReparenter_ReparentShard(t *testing.T) { SetReadWriteResults: map[string]error{ "zone1-0000000100": nil, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -229,16 +232,19 @@ func TestPlannedReparenter_ReparentShard(t *testing.T) { PopulateReparentJournalResults: map[string]error{ "zone1-0000000200": nil, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -318,16 +324,19 @@ func TestPlannedReparenter_ReparentShard(t *testing.T) { SetReadWriteResults: map[string]error{ "zone1-0000000100": nil, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -390,13 +399,14 @@ func TestPlannedReparenter_ReparentShard(t *testing.T) { // thoroughly to cover all the cases. name: "reparent fails", tmc: &testutil.TabletManagerClient{ - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -556,11 +566,12 @@ func TestPlannedReparenter_preflightChecks(t *testing.T) { tmc tmclient.TabletManagerClient tablets []*topodatapb.Tablet - ev *events.Reparent - keyspace string - shard string - tabletMap map[string]*topo.TabletInfo - opts *PlannedReparentOptions + ev *events.Reparent + keyspace string + shard string + tabletMap map[string]*topo.TabletInfo + innodbBufferPoolData map[string]int + opts *PlannedReparentOptions expectedIsNoop bool expectedEvent *events.Reparent @@ -812,6 +823,104 @@ func TestPlannedReparenter_preflightChecks(t *testing.T) { }, shouldErr: false, }, + { + name: "primary selection based on buffer pool", + tmc: &testutil.TabletManagerClient{ + ReplicationStatusResults: map[string]struct { + Position *replicationdatapb.Status + Error error + }{ + "zone1-0000000100": { // most advanced position + Position: &replicationdatapb.Status{ + Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", + }, + }, + "zone1-0000000101": { + Position: &replicationdatapb.Status{ + Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10", + }, + }, + }, + }, + innodbBufferPoolData: map[string]int{ + "zone1-0000000100": 100, + "zone1-0000000101": 200, + }, + ev: &events.Reparent{ + ShardInfo: *topo.NewShardInfo("testkeyspace", "-", &topodatapb.Shard{ + PrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 500, + }, + }, nil), + }, + tabletMap: map[string]*topo.TabletInfo{ + "zone1-0000000100": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000101": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "zone1-0000000500": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 500, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + }, + opts: &PlannedReparentOptions{ + // Avoid the current primary. + AvoidPrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 500, + }, + durability: &durabilityNone{}, + }, + expectedIsNoop: false, + expectedEvent: &events.Reparent{ + ShardInfo: *topo.NewShardInfo("testkeyspace", "-", &topodatapb.Shard{ + PrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 500, + }, + }, nil), + NewPrimary: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + expectedOpts: &PlannedReparentOptions{ + AvoidPrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 500, + }, + // NewPrimaryAlias gets populated by the preflightCheck code + NewPrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + durability: &durabilityNone{}, + }, + shouldErr: false, + }, { name: "new-primary and avoid-primary match", opts: &PlannedReparentOptions{ @@ -1081,7 +1190,7 @@ func TestPlannedReparenter_preflightChecks(t *testing.T) { require.NoError(t, err) tt.opts.durability = durability } - isNoop, err := pr.preflightChecks(ctx, tt.ev, tt.tabletMap, tt.opts) + isNoop, err := pr.preflightChecks(ctx, tt.ev, tt.tabletMap, tt.innodbBufferPoolData, tt.opts) if tt.shouldErr { assert.Error(t, err) assert.Equal(t, tt.expectedIsNoop, isNoop, "preflightChecks returned wrong isNoop signal") @@ -2401,6 +2510,7 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { name string tmc tmclient.TabletManagerClient tablets []*topodatapb.Tablet + shards []*vtctldatapb.Shard unlockTopo bool ev *events.Reparent @@ -2408,8 +2518,9 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { shard string opts PlannedReparentOptions - shouldErr bool - expectedEvent *events.Reparent + shouldErr bool + errShouldContain string + expectedEvent *events.Reparent }{ { name: "success: current primary cannot be determined", // "Case (1)" @@ -2431,16 +2542,19 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { Error: nil, }, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, PopulateReparentJournalResults: map[string]error{ @@ -2523,16 +2637,19 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { SetReadWriteResults: map[string]error{ "zone1-0000000100": nil, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -2603,16 +2720,19 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { Error: nil, }, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, PrimaryPositionResults: map[string]struct { @@ -2715,16 +2835,19 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { SetReplicationSourceResults: map[string]error{ "zone1-0000000100": nil, // called during reparentTablets to make this tablet a replica of newPrimary }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -2808,16 +2931,19 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { SetReplicationSourceResults: map[string]error{ "zone1-0000000100": nil, // called during reparentTablets to make this tablet a replica of newPrimary }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -2867,16 +2993,19 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { { name: "preflight checks determine PRS is no-op", tmc: &testutil.TabletManagerClient{ - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -2930,16 +3059,19 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { SetReadWriteResults: map[string]error{ "zone1-0000000100": assert.AnError, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, }, @@ -2998,16 +3130,19 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { { name: "lost topology lock", tmc: &testutil.TabletManagerClient{ - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, PrimaryPositionResults: map[string]struct { @@ -3089,16 +3224,19 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { Error: nil, }, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, PopulateReparentJournalResults: map[string]error{ @@ -3160,6 +3298,57 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { }, }, }, + { + name: "expected primary mismatch", + tmc: &testutil.TabletManagerClient{}, + shards: []*vtctldatapb.Shard{ + { + Keyspace: "testkeyspace", + Name: "-", + Shard: &topodatapb.Shard{ + IsPrimaryServing: true, + PrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + }, + }, + }, + tablets: []*topodatapb.Tablet{ + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Type: topodatapb.TabletType_PRIMARY, + Keyspace: "testkeyspace", + Shard: "-", + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 200, + }, + Type: topodatapb.TabletType_REPLICA, + Keyspace: "testkeyspace", + Shard: "-", + }, + }, + + ev: &events.Reparent{}, + keyspace: "testkeyspace", + shard: "-", + opts: PlannedReparentOptions{ + // This is not the shard primary, so it should cause an error. + ExpectedPrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 200, + }, + }, + shouldErr: true, + errShouldContain: "primary zone1-0000000100 is not equal to expected alias zone1-0000000200", + expectedEvent: nil, + }, } logger := logutil.NewMemoryLogger() @@ -3176,9 +3365,13 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { testutil.AddTablets(ctx, t, ts, &testutil.AddTabletOptions{ AlsoSetShardPrimary: true, ForceSetShardPrimary: true, // Some of our test cases count on having multiple primaries, so let the last one "win". - SkipShardCreation: false, + SkipShardCreation: len(tt.shards) > 0, }, tt.tablets...) + if len(tt.shards) > 0 { + testutil.AddShards(ctx, t, ts, tt.shards...) + } + if !tt.unlockTopo { lctx, unlock, err := ts.LockShard(ctx, tt.keyspace, tt.shard, "locking for testing") require.NoError(t, err, "could not lock %s/%s for testing", tt.keyspace, tt.shard) @@ -3202,7 +3395,7 @@ func TestPlannedReparenter_reparentShardLocked(t *testing.T) { err := pr.reparentShardLocked(ctx, tt.ev, tt.keyspace, tt.shard, tt.opts) if tt.shouldErr { assert.Error(t, err) - + assert.ErrorContains(t, err, tt.errShouldContain) return } @@ -3849,27 +4042,34 @@ func AssertReparentEventsEqual(t *testing.T, expected *events.Reparent, actual * // TestPlannedReparenter_verifyAllTabletsReachable tests the functionality of verifyAllTabletsReachable. func TestPlannedReparenter_verifyAllTabletsReachable(t *testing.T) { tests := []struct { - name string - tmc tmclient.TabletManagerClient - tabletMap map[string]*topo.TabletInfo - remoteOpTime time.Duration - wantErr string + name string + tmc tmclient.TabletManagerClient + tabletMap map[string]*topo.TabletInfo + remoteOpTime time.Duration + wantErr string + wantBufferPoolsData map[string]int }{ { name: "Success", tmc: &testutil.TabletManagerClient{ - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000201": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "1234", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "1231", + }, }, }, }, @@ -3902,21 +4102,30 @@ func TestPlannedReparenter_verifyAllTabletsReachable(t *testing.T) { }, }, }, + wantBufferPoolsData: map[string]int{ + "zone1-0000000200": 123, + "zone1-0000000201": 1234, + "zone1-0000000100": 1231, + }, }, { name: "Failure", tmc: &testutil.TabletManagerClient{ - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { Error: fmt.Errorf("primary status failed"), }, "zone1-0000000201": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "1234", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "1231", + }, }, }, }, @@ -3953,21 +4162,27 @@ func TestPlannedReparenter_verifyAllTabletsReachable(t *testing.T) { }, { name: "Timeout", tmc: &testutil.TabletManagerClient{ - PrimaryStatusDelays: map[string]time.Duration{ + GetGlobalStatusVarsDelays: map[string]time.Duration{ "zone1-0000000100": 20 * time.Second, }, - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000200": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000201": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "1234", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "1231", + }, }, }, }, @@ -4022,9 +4237,13 @@ func TestPlannedReparenter_verifyAllTabletsReachable(t *testing.T) { topo.RemoteOperationTimeout = oldTime }() } - err := pr.verifyAllTabletsReachable(context.Background(), tt.tabletMap) + innodbBufferPoolsData, err := pr.verifyAllTabletsReachable(context.Background(), tt.tabletMap) if tt.wantErr == "" { require.NoError(t, err) + require.EqualValues(t, len(tt.wantBufferPoolsData), len(innodbBufferPoolsData)) + for str, val := range tt.wantBufferPoolsData { + require.EqualValues(t, val, innodbBufferPoolsData[str]) + } return } require.ErrorContains(t, err, tt.wantErr) @@ -4055,16 +4274,19 @@ func TestPlannedReparenterStats(t *testing.T) { SetReadWriteResults: map[string]error{ "zone1-0000000100": nil, }, - // This is only needed to verify reachability, so empty results are fine. - PrimaryStatusResults: map[string]struct { - Status *replicationdatapb.PrimaryStatus - Error error + GetGlobalStatusVarsResults: map[string]struct { + Statuses map[string]string + Error error }{ "zone1-0000000101": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, "zone1-0000000100": { - Status: &replicationdatapb.PrimaryStatus{}, + Statuses: map[string]string{ + InnodbBufferPoolsDataVar: "123", + }, }, }, } diff --git a/go/vt/vtctl/reparentutil/reparent_sorter.go b/go/vt/vtctl/reparentutil/reparent_sorter.go index e4461b78064..ea7367bd36b 100644 --- a/go/vt/vtctl/reparentutil/reparent_sorter.go +++ b/go/vt/vtctl/reparentutil/reparent_sorter.go @@ -29,17 +29,19 @@ import ( // reparentSorter sorts tablets by GTID positions and Promotion rules aimed at finding the best // candidate for intermediate promotion in emergency reparent shard, and the new primary in planned reparent shard type reparentSorter struct { - tablets []*topodatapb.Tablet - positions []replication.Position - durability Durabler + tablets []*topodatapb.Tablet + positions []replication.Position + innodbBufferPool []int + durability Durabler } // newReparentSorter creates a new reparentSorter -func newReparentSorter(tablets []*topodatapb.Tablet, positions []replication.Position, durability Durabler) *reparentSorter { +func newReparentSorter(tablets []*topodatapb.Tablet, positions []replication.Position, innodbBufferPool []int, durability Durabler) *reparentSorter { return &reparentSorter{ - tablets: tablets, - positions: positions, - durability: durability, + tablets: tablets, + positions: positions, + durability: durability, + innodbBufferPool: innodbBufferPool, } } @@ -50,6 +52,9 @@ func (rs *reparentSorter) Len() int { return len(rs.tablets) } func (rs *reparentSorter) Swap(i, j int) { rs.tablets[i], rs.tablets[j] = rs.tablets[j], rs.tablets[i] rs.positions[i], rs.positions[j] = rs.positions[j], rs.positions[i] + if len(rs.innodbBufferPool) != 0 { + rs.innodbBufferPool[i], rs.innodbBufferPool[j] = rs.innodbBufferPool[j], rs.innodbBufferPool[i] + } } // Less implements the Interface for sorting @@ -79,18 +84,29 @@ func (rs *reparentSorter) Less(i, j int) bool { // so we check their promotion rules jPromotionRule := PromotionRule(rs.durability, rs.tablets[j]) iPromotionRule := PromotionRule(rs.durability, rs.tablets[i]) + + // If the promotion rules are different then we want to sort by the promotion rules. + if len(rs.innodbBufferPool) != 0 && jPromotionRule == iPromotionRule { + if rs.innodbBufferPool[i] > rs.innodbBufferPool[j] { + return true + } + if rs.innodbBufferPool[j] > rs.innodbBufferPool[i] { + return false + } + } + return !jPromotionRule.BetterThan(iPromotionRule) } // sortTabletsForReparent sorts the tablets, given their positions for emergency reparent shard and planned reparent shard. // Tablets are sorted first by their replication positions, with ties broken by the promotion rules. -func sortTabletsForReparent(tablets []*topodatapb.Tablet, positions []replication.Position, durability Durabler) error { +func sortTabletsForReparent(tablets []*topodatapb.Tablet, positions []replication.Position, innodbBufferPool []int, durability Durabler) error { // throw an error internal error in case of unequal number of tablets and positions // fail-safe code prevents panic in sorting in case the lengths are unequal if len(tablets) != len(positions) { return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "unequal number of tablets and positions") } - sort.Sort(newReparentSorter(tablets, positions, durability)) + sort.Sort(newReparentSorter(tablets, positions, innodbBufferPool, durability)) return nil } diff --git a/go/vt/vtctl/reparentutil/reparent_sorter_test.go b/go/vt/vtctl/reparentutil/reparent_sorter_test.go index c21c95ad22b..ae5d56e884e 100644 --- a/go/vt/vtctl/reparentutil/reparent_sorter_test.go +++ b/go/vt/vtctl/reparentutil/reparent_sorter_test.go @@ -89,17 +89,24 @@ func TestReparentSorter(t *testing.T) { positionIntermediate2.GTIDSet = positionIntermediate2.GTIDSet.AddGTID(mysqlGTID2) testcases := []struct { - name string - tablets []*topodatapb.Tablet - positions []replication.Position - containsErr string - sortedTablets []*topodatapb.Tablet + name string + tablets []*topodatapb.Tablet + innodbBufferPool []int + positions []replication.Position + containsErr string + sortedTablets []*topodatapb.Tablet }{ { name: "all advanced, sort via promotion rules", tablets: []*topodatapb.Tablet{nil, tabletReplica1_100, tabletRdonly1_102}, positions: []replication.Position{positionMostAdvanced, positionMostAdvanced, positionMostAdvanced}, sortedTablets: []*topodatapb.Tablet{tabletReplica1_100, tabletRdonly1_102, nil}, + }, { + name: "all advanced, sort via innodb buffer pool", + tablets: []*topodatapb.Tablet{tabletReplica1_101, tabletReplica2_100, tabletReplica1_100}, + positions: []replication.Position{positionMostAdvanced, positionMostAdvanced, positionMostAdvanced}, + innodbBufferPool: []int{10, 40, 25}, + sortedTablets: []*topodatapb.Tablet{tabletReplica2_100, tabletReplica1_100, tabletReplica1_101}, }, { name: "ordering by position", tablets: []*topodatapb.Tablet{tabletReplica1_101, tabletReplica2_100, tabletReplica1_100, tabletRdonly1_102}, @@ -120,6 +127,12 @@ func TestReparentSorter(t *testing.T) { tablets: []*topodatapb.Tablet{tabletReplica1_101, tabletReplica2_100, tabletReplica1_100, tabletRdonly1_102}, positions: []replication.Position{positionEmpty, positionIntermediate1, positionMostAdvanced, positionIntermediate1}, sortedTablets: []*topodatapb.Tablet{tabletReplica1_100, tabletReplica2_100, tabletRdonly1_102, tabletReplica1_101}, + }, { + name: "mixed - another", + tablets: []*topodatapb.Tablet{tabletReplica1_101, tabletReplica2_100, tabletReplica1_100, tabletRdonly1_102}, + positions: []replication.Position{positionIntermediate1, positionIntermediate1, positionMostAdvanced, positionIntermediate1}, + innodbBufferPool: []int{100, 200, 0, 200}, + sortedTablets: []*topodatapb.Tablet{tabletReplica1_100, tabletReplica2_100, tabletReplica1_101, tabletRdonly1_102}, }, } @@ -127,7 +140,7 @@ func TestReparentSorter(t *testing.T) { require.NoError(t, err) for _, testcase := range testcases { t.Run(testcase.name, func(t *testing.T) { - err := sortTabletsForReparent(testcase.tablets, testcase.positions, durability) + err := sortTabletsForReparent(testcase.tablets, testcase.positions, testcase.innodbBufferPool, durability) if testcase.containsErr != "" { require.EqualError(t, err, testcase.containsErr) } else { diff --git a/go/vt/vtctl/reparentutil/replication.go b/go/vt/vtctl/reparentutil/replication.go index da67e735882..8642de84fc7 100644 --- a/go/vt/vtctl/reparentutil/replication.go +++ b/go/vt/vtctl/reparentutil/replication.go @@ -39,13 +39,13 @@ import ( "vitess.io/vitess/go/vt/vttablet/tmclient" ) -// FindValidEmergencyReparentCandidates will find candidates for an emergency +// FindPositionsOfAllCandidates will find candidates for an emergency // reparent, and, if successful, return a mapping of those tablet aliases (as // raw strings) to their replication positions for later comparison. -func FindValidEmergencyReparentCandidates( +func FindPositionsOfAllCandidates( statusMap map[string]*replicationdatapb.StopReplicationStatus, primaryStatusMap map[string]*replicationdatapb.PrimaryStatus, -) (map[string]replication.Position, error) { +) (map[string]replication.Position, bool, error) { replicationStatusMap := make(map[string]*replication.ReplicationStatus, len(statusMap)) positionMap := make(map[string]replication.Position) @@ -79,68 +79,33 @@ func FindValidEmergencyReparentCandidates( } if isGTIDBased && emptyRelayPosErrorRecorder.HasErrors() { - return nil, emptyRelayPosErrorRecorder.Error() + return nil, false, emptyRelayPosErrorRecorder.Error() } if isGTIDBased && isNonGTIDBased { - return nil, vterrors.Errorf(vtrpc.Code_FAILED_PRECONDITION, "encountered mix of GTID-based and non GTID-based relay logs") + return nil, false, vterrors.Errorf(vtrpc.Code_FAILED_PRECONDITION, "encountered mix of GTID-based and non GTID-based relay logs") } - // Create relevant position list of errant GTID-based positions for later - // comparison. + // Store the final positions in the map. for alias, status := range replicationStatusMap { - // If we're not GTID-based, no need to search for errant GTIDs, so just - // add the position to the map and continue. if !isGTIDBased { positionMap[alias] = status.Position continue } - - // This condition should really never happen, since we did the same cast - // in the earlier loop, but let's be doubly sure. - relayLogGTIDSet, ok := status.RelayLogPosition.GTIDSet.(replication.Mysql56GTIDSet) - if !ok { - return nil, vterrors.Errorf(vtrpc.Code_FAILED_PRECONDITION, "we got a filled-in relay log position, but it's not of type Mysql56GTIDSet, even though we've determined we need to use GTID based assesment") - } - - // We need to remove this alias's status from the list, otherwise the - // GTID diff will always be empty. - statusList := make([]*replication.ReplicationStatus, 0, len(replicationStatusMap)-1) - - for a, s := range replicationStatusMap { - if a != alias { - statusList = append(statusList, s) - } - } - - errantGTIDs, err := status.FindErrantGTIDs(statusList) - switch { - case err != nil: - // Could not look up GTIDs to determine if we have any. It's not - // safe to continue. - return nil, err - case len(errantGTIDs) != 0: - // This tablet has errant GTIDs. It's not a valid candidate for - // reparent, so don't insert it into the final mapping. - log.Errorf("skipping %v because we detected errant GTIDs - %v", alias, errantGTIDs) - continue - } - - pos := replication.Position{GTIDSet: relayLogGTIDSet} - positionMap[alias] = pos + positionMap[alias] = status.RelayLogPosition } for alias, primaryStatus := range primaryStatusMap { executedPosition, err := replication.DecodePosition(primaryStatus.Position) if err != nil { - return nil, vterrors.Wrapf(err, "could not decode a primary status executed position for tablet %v: %v", alias, err) + return nil, false, vterrors.Wrapf(err, "could not decode a primary status executed position for tablet %v: %v", alias, err) } positionMap[alias] = executedPosition } - return positionMap, nil + return positionMap, isGTIDBased, nil } // ReplicaWasRunning returns true if a StopReplicationStatus indicates that the diff --git a/go/vt/vtctl/reparentutil/replication_test.go b/go/vt/vtctl/reparentutil/replication_test.go index 922dc6bc2da..4a449b1189c 100644 --- a/go/vt/vtctl/reparentutil/replication_test.go +++ b/go/vt/vtctl/reparentutil/replication_test.go @@ -46,7 +46,7 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } -func TestFindValidEmergencyReparentCandidates(t *testing.T) { +func TestFindPositionsOfAllCandidates(t *testing.T) { t.Parallel() tests := []struct { @@ -64,8 +64,9 @@ func TestFindValidEmergencyReparentCandidates(t *testing.T) { // point is, the combination of (1) whether the test should error and // (2) the set of keys we expect in the map is enough to fully assert on // the correctness of the behavior of this functional unit. - expected []string - shouldErr bool + expected []string + expectedGTIDBased bool + shouldErr bool }{ { name: "success", @@ -88,8 +89,9 @@ func TestFindValidEmergencyReparentCandidates(t *testing.T) { Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5", }, }, - expected: []string{"r1", "r2", "p1"}, - shouldErr: false, + expected: []string{"r1", "r2", "p1"}, + expectedGTIDBased: true, + shouldErr: false, }, { name: "success for single tablet", statusMap: map[string]*replicationdatapb.StopReplicationStatus{ @@ -100,9 +102,10 @@ func TestFindValidEmergencyReparentCandidates(t *testing.T) { }, }, }, - primaryStatusMap: map[string]*replicationdatapb.PrimaryStatus{}, - expected: []string{"r1"}, - shouldErr: false, + primaryStatusMap: map[string]*replicationdatapb.PrimaryStatus{}, + expected: []string{"r1"}, + expectedGTIDBased: true, + shouldErr: false, }, { name: "mixed replication modes", @@ -160,30 +163,6 @@ func TestFindValidEmergencyReparentCandidates(t *testing.T) { expected: []string{"r1", "r2"}, shouldErr: false, }, - { - name: "tablet with errant GTIDs is excluded", - statusMap: map[string]*replicationdatapb.StopReplicationStatus{ - "r1": { - After: &replicationdatapb.Status{ - SourceUuid: "3E11FA47-71CA-11E1-9E33-C80AA9429562", - RelayLogPosition: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5", - }, - }, - "errant": { - After: &replicationdatapb.Status{ - SourceUuid: "3E11FA47-71CA-11E1-9E33-C80AA9429562", - RelayLogPosition: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5,AAAAAAAA-71CA-11E1-9E33-C80AA9429562:1", - }, - }, - }, - primaryStatusMap: map[string]*replicationdatapb.PrimaryStatus{ - "p1": { - Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5", - }, - }, - expected: []string{"r1", "p1"}, - shouldErr: false, - }, { name: "bad primary position fails the call", statusMap: map[string]*replicationdatapb.StopReplicationStatus{ @@ -208,7 +187,8 @@ func TestFindValidEmergencyReparentCandidates(t *testing.T) { t.Run(tt.name, func(t *testing.T) { t.Parallel() - actual, err := FindValidEmergencyReparentCandidates(tt.statusMap, tt.primaryStatusMap) + actual, isGTIDBased, err := FindPositionsOfAllCandidates(tt.statusMap, tt.primaryStatusMap) + require.EqualValues(t, tt.expectedGTIDBased, isGTIDBased) if tt.shouldErr { assert.Error(t, err) return diff --git a/go/vt/vtctl/reparentutil/util.go b/go/vt/vtctl/reparentutil/util.go index f35ea2695b8..fd701f8c69b 100644 --- a/go/vt/vtctl/reparentutil/util.go +++ b/go/vt/vtctl/reparentutil/util.go @@ -68,11 +68,8 @@ func ElectNewPrimary( tmc tmclient.TabletManagerClient, shardInfo *topo.ShardInfo, tabletMap map[string]*topo.TabletInfo, - newPrimaryAlias *topodatapb.TabletAlias, - avoidPrimaryAlias *topodatapb.TabletAlias, - waitReplicasTimeout time.Duration, - tolerableReplLag time.Duration, - durability Durabler, + innodbBufferPoolData map[string]int, + opts *PlannedReparentOptions, // (TODO:@ajm188) it's a little gross we need to pass this, maybe embed in the context? logger logutil.Logger, ) (*topodatapb.TabletAlias, error) { @@ -88,6 +85,7 @@ func ElectNewPrimary( // tablets that are possible candidates to be the new primary and their positions validTablets []*topodatapb.Tablet tabletPositions []replication.Position + innodbBufferPool []int errorGroup, groupCtx = errgroup.WithContext(ctx) ) @@ -96,16 +94,16 @@ func ElectNewPrimary( reasonsToInvalidate := strings.Builder{} for _, tablet := range tabletMap { switch { - case newPrimaryAlias != nil: + case opts.NewPrimaryAlias != nil: // If newPrimaryAlias is provided, then that is the only valid tablet, even if it is not of type replica or in a different cell. - if !topoproto.TabletAliasEqual(tablet.Alias, newPrimaryAlias) { + if !topoproto.TabletAliasEqual(tablet.Alias, opts.NewPrimaryAlias) { reasonsToInvalidate.WriteString(fmt.Sprintf("\n%v does not match the new primary alias provided", topoproto.TabletAliasString(tablet.Alias))) continue } - case primaryCell != "" && tablet.Alias.Cell != primaryCell: + case !opts.AllowCrossCellPromotion && primaryCell != "" && tablet.Alias.Cell != primaryCell: reasonsToInvalidate.WriteString(fmt.Sprintf("\n%v is not in the same cell as the previous primary", topoproto.TabletAliasString(tablet.Alias))) continue - case avoidPrimaryAlias != nil && topoproto.TabletAliasEqual(tablet.Alias, avoidPrimaryAlias): + case opts.AvoidPrimaryAlias != nil && topoproto.TabletAliasEqual(tablet.Alias, opts.AvoidPrimaryAlias): reasonsToInvalidate.WriteString(fmt.Sprintf("\n%v matches the primary alias to avoid", topoproto.TabletAliasString(tablet.Alias))) continue case tablet.Tablet.Type != topodatapb.TabletType_REPLICA: @@ -120,7 +118,7 @@ func ElectNewPrimary( // then we don't need to find the position of the said tablet for sorting. // We can just return the tablet quickly. // This check isn't required, but it saves us an RPC call that is otherwise unnecessary. - if len(candidates) == 1 && tolerableReplLag == 0 { + if len(candidates) == 1 && opts.TolerableReplLag == 0 { return candidates[0].Alias, nil } @@ -128,12 +126,13 @@ func ElectNewPrimary( tb := tablet errorGroup.Go(func() error { // find and store the positions for the tablet - pos, replLag, err := findPositionAndLagForTablet(groupCtx, tb, logger, tmc, waitReplicasTimeout) + pos, replLag, err := findPositionAndLagForTablet(groupCtx, tb, logger, tmc, opts.WaitReplicasTimeout) mu.Lock() defer mu.Unlock() - if err == nil && (tolerableReplLag == 0 || tolerableReplLag >= replLag) { + if err == nil && (opts.TolerableReplLag == 0 || opts.TolerableReplLag >= replLag) { validTablets = append(validTablets, tb) tabletPositions = append(tabletPositions, pos) + innodbBufferPool = append(innodbBufferPool, innodbBufferPoolData[topoproto.TabletAliasString(tb.Alias)]) } else { reasonsToInvalidate.WriteString(fmt.Sprintf("\n%v has %v replication lag which is more than the tolerable amount", topoproto.TabletAliasString(tablet.Alias), replLag)) } @@ -152,7 +151,7 @@ func ElectNewPrimary( } // sort the tablets for finding the best primary - err = sortTabletsForReparent(validTablets, tabletPositions, durability) + err = sortTabletsForReparent(validTablets, tabletPositions, innodbBufferPool, opts.durability) if err != nil { return nil, err } diff --git a/go/vt/vtctl/reparentutil/util_test.go b/go/vt/vtctl/reparentutil/util_test.go index dd13e48f7b7..f4e9092fc3f 100644 --- a/go/vt/vtctl/reparentutil/util_test.go +++ b/go/vt/vtctl/reparentutil/util_test.go @@ -67,15 +67,17 @@ func TestElectNewPrimary(t *testing.T) { ctx := context.Background() logger := logutil.NewMemoryLogger() tests := []struct { - name string - tmc *chooseNewPrimaryTestTMClient - shardInfo *topo.ShardInfo - tabletMap map[string]*topo.TabletInfo - newPrimaryAlias *topodatapb.TabletAlias - avoidPrimaryAlias *topodatapb.TabletAlias - tolerableReplLag time.Duration - expected *topodatapb.TabletAlias - errContains []string + name string + tmc *chooseNewPrimaryTestTMClient + shardInfo *topo.ShardInfo + tabletMap map[string]*topo.TabletInfo + innodbBufferPoolData map[string]int + newPrimaryAlias *topodatapb.TabletAlias + avoidPrimaryAlias *topodatapb.TabletAlias + tolerableReplLag time.Duration + allowCrossCellPromotion bool + expected *topodatapb.TabletAlias + errContains []string }{ { name: "found a replica", @@ -472,6 +474,68 @@ func TestElectNewPrimary(t *testing.T) { }, errContains: nil, }, + { + name: "found a replica - more advanced innodb buffer pool", + tmc: &chooseNewPrimaryTestTMClient{ + replicationStatuses: map[string]*replicationdatapb.Status{ + "zone1-0000000101": { + Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-2", + }, + "zone1-0000000102": { + Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1", + RelayLogPosition: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-2", + }, + }, + }, + innodbBufferPoolData: map[string]int{ + "zone1-0000000101": 200, + "zone1-0000000102": 100, + }, + shardInfo: topo.NewShardInfo("testkeyspace", "-", &topodatapb.Shard{ + PrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + }, nil), + tabletMap: map[string]*topo.TabletInfo{ + "primary": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + "replica1": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "replica2": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + }, + avoidPrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 0, + }, + expected: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + errContains: nil, + }, { name: "no active primary in shard", tmc: &chooseNewPrimaryTestTMClient{ @@ -653,6 +717,64 @@ func TestElectNewPrimary(t *testing.T) { `zone1-0000000102 is not in the same cell as the previous primary`, }, }, + { + name: "no replicas in primary cell but cross cell allowed", + tmc: &chooseNewPrimaryTestTMClient{ + // zone1-101 is behind zone1-102 + replicationStatuses: map[string]*replicationdatapb.Status{ + "zone1-0000000101": { + Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1", + }, + "zone1-0000000102": { + Position: "MySQL56/3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5", + }, + }, + }, + allowCrossCellPromotion: true, + shardInfo: topo.NewShardInfo("testkeyspace", "-", &topodatapb.Shard{ + PrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone2", + Uid: 200, + }, + }, nil), + tabletMap: map[string]*topo.TabletInfo{ + "primary": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone2", + Uid: 200, + }, + Type: topodatapb.TabletType_PRIMARY, + }, + }, + "replica1": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + "replica2": { + Tablet: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + Type: topodatapb.TabletType_REPLICA, + }, + }, + }, + avoidPrimaryAlias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 0, + }, + expected: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 102, + }, + }, { name: "only available tablet is AvoidPrimary", tmc: &chooseNewPrimaryTestTMClient{ @@ -731,7 +853,15 @@ zone1-0000000100 is not a replica`, t.Run(tt.name, func(t *testing.T) { t.Parallel() - actual, err := ElectNewPrimary(ctx, tt.tmc, tt.shardInfo, tt.tabletMap, tt.newPrimaryAlias, tt.avoidPrimaryAlias, time.Millisecond*50, tt.tolerableReplLag, durability, logger) + options := &PlannedReparentOptions{ + NewPrimaryAlias: tt.newPrimaryAlias, + AvoidPrimaryAlias: tt.avoidPrimaryAlias, + TolerableReplLag: tt.tolerableReplLag, + durability: durability, + AllowCrossCellPromotion: tt.allowCrossCellPromotion, + WaitReplicasTimeout: time.Millisecond * 50, + } + actual, err := ElectNewPrimary(ctx, tt.tmc, tt.shardInfo, tt.tabletMap, tt.innodbBufferPoolData, options, logger) if len(tt.errContains) > 0 { for _, errC := range tt.errContains { assert.ErrorContains(t, err, errC) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 03b9e3d7077..1a4735b1c82 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -99,6 +99,7 @@ import ( "vitess.io/vitess/go/constants/sidecar" "vitess.io/vitess/go/mysql/collations" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/cmd/vtctldclient/cli" "vitess.io/vitess/go/flagutil" @@ -2242,24 +2243,24 @@ func commandVReplicationWorkflow(ctx context.Context, wr *wrangler.Wrangler, sub } if *atomicCopy { - var errors []string + var errs []string if !*allTables { - errors = append(errors, "atomic copy requires --all.") + errs = append(errs, "atomic copy requires --all.") } if *tables != "" { - errors = append(errors, "atomic copy does not support specifying tables.") + errs = append(errs, "atomic copy does not support specifying tables.") } if *excludes != "" { - errors = append(errors, "atomic copy does not support specifying excludes.") + errs = append(errs, "atomic copy does not support specifying excludes.") } - if len(errors) > 0 { - errors = append(errors, "Found options incompatible with atomic copy:") - return fmt.Errorf(strings.Join(errors, " ")) + if len(errs) > 0 { + errs = append(errs, "Found options incompatible with atomic copy:") + return errors.New(strings.Join(errs, " ")) } } if !*allTables && *tables == "" { - return fmt.Errorf("no tables specified to move") + return errors.New("no tables specified to move") } vrwp.SourceKeyspace = *sourceKeyspace vrwp.Tables = *tables @@ -3740,7 +3741,7 @@ func commandWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pflag return err } if subFlags.NArg() < 2 { - return fmt.Errorf(usage) + return errors.New(usage) } if len(*shards) > 0 { log.Infof("Subset of shards specified: %d, %v", len(*shards), strings.Join(*shards, ",")) @@ -3775,7 +3776,7 @@ func commandWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pflag } } else { if subFlags.NArg() != 2 { - return fmt.Errorf(usage) + return errors.New(usage) } var rpcReq any = nil if action == "update" { @@ -3805,7 +3806,7 @@ func commandWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pflag } } } else { - tabletTypes = []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)} + tabletTypes = textutil.SimulatedNullTabletTypeSlice } onddl := int32(textutil.SimulatedNullInt) // To signify no value has been provided if subFlags.Lookup("on-ddl").Changed { // Validate the provided value @@ -3817,7 +3818,7 @@ func commandWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pflag onddl = ival } if !changes { - return fmt.Errorf(errWorkflowUpdateWithoutChanges) + return errors.New(errWorkflowUpdateWithoutChanges) } tsp := tabletmanagerdatapb.TabletSelectionPreference_UNKNOWN if inorder { @@ -3827,9 +3828,10 @@ func commandWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *pflag Workflow: workflow, Cells: *cells, TabletTypes: tabletTypes, - TabletSelectionPreference: tsp, - OnDdl: binlogdatapb.OnDDLAction(onddl), - State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), // We don't allow changing this in the client command + TabletSelectionPreference: &tsp, + } + if onddl != int32(textutil.SimulatedNullInt) { + rpcReq.(*tabletmanagerdatapb.UpdateVReplicationWorkflowRequest).OnDdl = ptr.Of(binlogdatapb.OnDDLAction(onddl)) } } results, err = wr.WorkflowAction(ctx, workflow, keyspace, action, *dryRun, rpcReq, *shards) // Only update currently uses the new RPC path diff --git a/go/vt/vtctl/workflow/framework_test.go b/go/vt/vtctl/workflow/framework_test.go index e2ccde0a0e7..249ff07cf41 100644 --- a/go/vt/vtctl/workflow/framework_test.go +++ b/go/vt/vtctl/workflow/framework_test.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "os" + "reflect" "regexp" "slices" "strings" @@ -38,6 +39,7 @@ import ( "vitess.io/vitess/go/vt/mysqlctl/tmutils" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" + "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" @@ -58,6 +60,12 @@ const ( tabletUIDStep = 10 ) +var defaultTabletTypes = []topodatapb.TabletType{ + topodatapb.TabletType_PRIMARY, + topodatapb.TabletType_REPLICA, + topodatapb.TabletType_RDONLY, +} + type testKeyspace struct { KeyspaceName string ShardNames []string @@ -66,6 +74,7 @@ type testKeyspace struct { type queryResult struct { query string result *querypb.QueryResult + err error } func TestMain(m *testing.M) { @@ -140,7 +149,7 @@ func initSrvKeyspace(t *testing.T, topo *topo.Server, keyspace string, sources, for _, shard := range shards { keyRange, err := key.ParseShardingSpec(shard) require.NoError(t, err) - require.Equal(t, 1, len(keyRange)) + require.Len(t, keyRange, 1) partition.ShardReferences = append(partition.ShardReferences, &topodatapb.ShardReference{ Name: shard, KeyRange: keyRange[0], @@ -176,6 +185,7 @@ func (env *testEnv) addTablet(t *testing.T, ctx context.Context, id int, keyspac Shard: shard, KeyRange: &topodatapb.KeyRange{}, Type: tabletType, + Hostname: "localhost", // Without a hostname the RefreshState call is skipped PortMap: map[string]int32{ "test": int32(id), }, @@ -197,30 +207,38 @@ func (env *testEnv) addTablet(t *testing.T, ctx context.Context, id int, keyspac return tablet } -// addTableRoutingRules adds routing rules from the test env's source keyspace to -// its target keyspace for the given tablet types and tables. -func (env *testEnv) addTableRoutingRules(t *testing.T, ctx context.Context, tabletTypes []topodatapb.TabletType, tables []string) { - ks := env.targetKeyspace.KeyspaceName - rules := make(map[string][]string, len(tables)*(len(tabletTypes)*3)) +func (env *testEnv) saveRoutingRules(t *testing.T, rules map[string][]string) { + err := topotools.SaveRoutingRules(context.Background(), env.ts, rules) + require.NoError(t, err) + err = env.ts.RebuildSrvVSchema(context.Background(), nil) + require.NoError(t, err) +} + +func (env *testEnv) updateTableRoutingRules(t *testing.T, ctx context.Context, + tabletTypes []topodatapb.TabletType, tables []string, sourceKeyspace, targetKeyspace, toKeyspace string) { + + if len(tabletTypes) == 0 { + tabletTypes = defaultTabletTypes + } + rr, err := env.ts.GetRoutingRules(ctx) + require.NoError(t, err) + rules := topotools.GetRoutingRulesMap(rr) for _, tabletType := range tabletTypes { for _, tableName := range tables { - toTarget := []string{ks + "." + tableName} + toTarget := []string{toKeyspace + "." + tableName} tt := strings.ToLower(tabletType.String()) if tabletType == topodatapb.TabletType_PRIMARY { rules[tableName] = toTarget - rules[ks+"."+tableName] = toTarget - rules[env.sourceKeyspace.KeyspaceName+"."+tableName] = toTarget + rules[targetKeyspace+"."+tableName] = toTarget + rules[sourceKeyspace+"."+tableName] = toTarget } else { rules[tableName+"@"+tt] = toTarget - rules[ks+"."+tableName+"@"+tt] = toTarget - rules[env.sourceKeyspace.KeyspaceName+"."+tableName+"@"+tt] = toTarget + rules[targetKeyspace+"."+tableName+"@"+tt] = toTarget + rules[sourceKeyspace+"."+tableName+"@"+tt] = toTarget } } } - err := topotools.SaveRoutingRules(ctx, env.ts, rules) - require.NoError(t, err) - err = env.ts.RebuildSrvVSchema(ctx, nil) - require.NoError(t, err) + env.saveRoutingRules(t, rules) } func (env *testEnv) deleteTablet(tablet *topodatapb.Tablet) { @@ -228,25 +246,59 @@ func (env *testEnv) deleteTablet(tablet *topodatapb.Tablet) { delete(env.tablets[tablet.Keyspace], int(tablet.Alias.Uid)) } +func (env *testEnv) confirmRoutingAllTablesToTarget(t *testing.T) { + t.Helper() + env.tmc.mu.Lock() + defer env.tmc.mu.Unlock() + wantRR := make(map[string][]string) + for _, sd := range env.tmc.schema { + for _, td := range sd.TableDefinitions { + for _, tt := range []string{"", "@rdonly", "@replica"} { + wantRR[td.Name+tt] = []string{fmt.Sprintf("%s.%s", env.targetKeyspace.KeyspaceName, td.Name)} + wantRR[fmt.Sprintf("%s.%s", env.sourceKeyspace.KeyspaceName, td.Name+tt)] = []string{fmt.Sprintf("%s.%s", env.targetKeyspace.KeyspaceName, td.Name)} + wantRR[fmt.Sprintf("%s.%s", env.targetKeyspace.KeyspaceName, td.Name+tt)] = []string{fmt.Sprintf("%s.%s", env.targetKeyspace.KeyspaceName, td.Name)} + } + } + } + checkRouting(t, env.ws, wantRR) +} + type testTMClient struct { tmclient.TabletManagerClient schema map[string]*tabletmanagerdatapb.SchemaDefinition mu sync.Mutex vrQueries map[int][]*queryResult - createVReplicationWorkflowRequests map[uint32]*tabletmanagerdatapb.CreateVReplicationWorkflowRequest - readVReplicationWorkflowRequests map[uint32]*tabletmanagerdatapb.ReadVReplicationWorkflowRequest + createVReplicationWorkflowRequests map[uint32]*createVReplicationWorkflowRequestResponse + readVReplicationWorkflowRequests map[uint32]*readVReplicationWorkflowRequestResponse + applySchemaRequests map[uint32]*applySchemaRequestResponse + primaryPositions map[uint32]string + vdiffRequests map[uint32]*vdiffRequestResponse + refreshStateErrors map[uint32]error + + // Stack of ReadVReplicationWorkflowsResponse to return, in order, for each shard + readVReplicationWorkflowsResponses map[string][]*tabletmanagerdatapb.ReadVReplicationWorkflowsResponse env *testEnv // For access to the env config from tmc methods. reverse atomic.Bool // Are we reversing traffic? + frozen atomic.Bool // Are the workflows frozen? + + // Can be used to return an error if an unexpected request is made or + // an expected request is NOT made. + strict bool } func newTestTMClient(env *testEnv) *testTMClient { return &testTMClient{ schema: make(map[string]*tabletmanagerdatapb.SchemaDefinition), vrQueries: make(map[int][]*queryResult), - createVReplicationWorkflowRequests: make(map[uint32]*tabletmanagerdatapb.CreateVReplicationWorkflowRequest), - readVReplicationWorkflowRequests: make(map[uint32]*tabletmanagerdatapb.ReadVReplicationWorkflowRequest), + createVReplicationWorkflowRequests: make(map[uint32]*createVReplicationWorkflowRequestResponse), + readVReplicationWorkflowRequests: make(map[uint32]*readVReplicationWorkflowRequestResponse), + applySchemaRequests: make(map[uint32]*applySchemaRequestResponse), + readVReplicationWorkflowsResponses: make(map[string][]*tabletmanagerdatapb.ReadVReplicationWorkflowsResponse), + primaryPositions: make(map[uint32]string), + vdiffRequests: make(map[uint32]*vdiffRequestResponse), + refreshStateErrors: make(map[uint32]error), env: env, } } @@ -256,21 +308,32 @@ func (tmc *testTMClient) CreateVReplicationWorkflow(ctx context.Context, tablet defer tmc.mu.Unlock() if expect := tmc.createVReplicationWorkflowRequests[tablet.Alias.Uid]; expect != nil { - if !proto.Equal(expect, req) { - return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected CreateVReplicationWorkflow request: got %+v, want %+v", req, expect) + if expect.req != nil && !proto.Equal(expect.req, req) { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected CreateVReplicationWorkflow request on tablet %s: got %+v, want %+v", + topoproto.TabletAliasString(tablet.Alias), req, expect) + } + if expect.res != nil { + return expect.res, expect.err } } res := sqltypes.MakeTestResult(sqltypes.MakeTestFields("rowsaffected", "int64"), "1") return &tabletmanagerdatapb.CreateVReplicationWorkflowResponse{Result: sqltypes.ResultToProto3(res)}, nil } +func (tmc *testTMClient) GetWorkflowKey(keyspace, shard string) string { + return fmt.Sprintf("%s/%s", keyspace, shard) +} + func (tmc *testTMClient) ReadVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.ReadVReplicationWorkflowRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowResponse, error) { tmc.mu.Lock() defer tmc.mu.Unlock() - if expect := tmc.readVReplicationWorkflowRequests[tablet.Alias.Uid]; expect != nil { - if !proto.Equal(expect, req) { - return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected ReadVReplicationWorkflow request: got %+v, want %+v", req, expect) + if !proto.Equal(expect.req, req) { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected ReadVReplicationWorkflow request on tablet %s: got %+v, want %+v", + topoproto.TabletAliasString(tablet.Alias), req, expect) + } + if expect.res != nil { + return expect.res, expect.err } } workflowType := binlogdatapb.VReplicationWorkflowType_MoveTables @@ -305,12 +368,19 @@ func (tmc *testTMClient) ReadVReplicationWorkflow(ctx context.Context, tablet *t }, }, } + if tmc.frozen.Load() { + stream.Message = Frozen + } res.Streams = append(res.Streams, stream) } return res, nil } +func (tmc *testTMClient) DeleteTableData(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.DeleteTableDataRequest) (response *tabletmanagerdatapb.DeleteTableDataResponse, err error) { + return &tabletmanagerdatapb.DeleteTableDataResponse{}, nil +} + func (tmc *testTMClient) DeleteVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (response *tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, err error) { return &tabletmanagerdatapb.DeleteVReplicationWorkflowResponse{ Result: &querypb.QueryResult{ @@ -364,20 +434,45 @@ func (tmc *testTMClient) expectVRQueryResultOnKeyspaceTablets(keyspace string, q } } -func (tmc *testTMClient) expectCreateVReplicationWorkflowRequest(tabletID uint32, req *tabletmanagerdatapb.CreateVReplicationWorkflowRequest) { +func (tmc *testTMClient) expectCreateVReplicationWorkflowRequest(tabletID uint32, req *createVReplicationWorkflowRequestResponse) { tmc.mu.Lock() defer tmc.mu.Unlock() tmc.createVReplicationWorkflowRequests[tabletID] = req } +func (tmc *testTMClient) expectCreateVReplicationWorkflowRequestOnTargetTablets(req *createVReplicationWorkflowRequestResponse) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + for _, tablet := range tmc.env.tablets[tmc.env.targetKeyspace.KeyspaceName] { + tmc.createVReplicationWorkflowRequests[tablet.Alias.Uid] = req + } +} + +func (tmc *testTMClient) expectReadVReplicationWorkflowRequest(tabletID uint32, req *readVReplicationWorkflowRequestResponse) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + tmc.readVReplicationWorkflowRequests[tabletID] = req +} + +func (tmc *testTMClient) expectReadVReplicationWorkflowRequestOnTargetTablets(req *readVReplicationWorkflowRequestResponse) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + for _, tablet := range tmc.env.tablets[tmc.env.targetKeyspace.KeyspaceName] { + tmc.readVReplicationWorkflowRequests[tablet.Alias.Uid] = req + } +} + func (tmc *testTMClient) VReplicationExec(ctx context.Context, tablet *topodatapb.Tablet, query string) (*querypb.QueryResult, error) { tmc.mu.Lock() defer tmc.mu.Unlock() qrs := tmc.vrQueries[int(tablet.Alias.Uid)] if len(qrs) == 0 { - return nil, fmt.Errorf("tablet %v does not expect any more queries: %s", tablet, query) + return nil, fmt.Errorf("tablet %v does not expect any more queries: %q", tablet, query) } matched := false if qrs[0].query[0] == '/' { @@ -389,7 +484,7 @@ func (tmc *testTMClient) VReplicationExec(ctx context.Context, tablet *topodatap return nil, fmt.Errorf("tablet %v:\nunexpected query\n%s\nwant:\n%s", tablet, query, qrs[0].query) } tmc.vrQueries[int(tablet.Alias.Uid)] = qrs[1:] - return qrs[0].result, nil + return qrs[0].result, qrs[0].err } func (tmc *testTMClient) ExecuteFetchAsDba(ctx context.Context, tablet *topodatapb.Tablet, usePool bool, req *tabletmanagerdatapb.ExecuteFetchAsDbaRequest) (*querypb.QueryResult, error) { @@ -401,8 +496,30 @@ func (tmc *testTMClient) ExecuteFetchAsAllPrivs(ctx context.Context, tablet *top return nil, nil } +func (tmc *testTMClient) expectApplySchemaRequest(tabletID uint32, req *applySchemaRequestResponse) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if tmc.applySchemaRequests == nil { + tmc.applySchemaRequests = make(map[uint32]*applySchemaRequestResponse) + } + + tmc.applySchemaRequests[tabletID] = req +} + // Note: ONLY breaks up change.SQL into individual statements and executes it. Does NOT fully implement ApplySchema. func (tmc *testTMClient) ApplySchema(ctx context.Context, tablet *topodatapb.Tablet, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if expect, ok := tmc.applySchemaRequests[tablet.Alias.Uid]; ok { + if !reflect.DeepEqual(change, expect.change) { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected ApplySchema request on tablet %s: got %+v, want %+v", + topoproto.TabletAliasString(tablet.Alias), change, expect.change) + } + return expect.res, expect.err + } + stmts := strings.Split(change.SQL, ";") for _, stmt := range stmts { @@ -419,7 +536,57 @@ func (tmc *testTMClient) ApplySchema(ctx context.Context, tablet *topodatapb.Tab return nil, nil } +type vdiffRequestResponse struct { + req *tabletmanagerdatapb.VDiffRequest + res *tabletmanagerdatapb.VDiffResponse + err error +} + +type createVReplicationWorkflowRequestResponse struct { + req *tabletmanagerdatapb.CreateVReplicationWorkflowRequest + res *tabletmanagerdatapb.CreateVReplicationWorkflowResponse + err error +} + +type readVReplicationWorkflowRequestResponse struct { + req *tabletmanagerdatapb.ReadVReplicationWorkflowRequest + res *tabletmanagerdatapb.ReadVReplicationWorkflowResponse + err error +} + +type applySchemaRequestResponse struct { + change *tmutils.SchemaChange + res *tabletmanagerdatapb.SchemaChangeResult + err error +} + +func (tmc *testTMClient) expectVDiffRequest(tablet *topodatapb.Tablet, vrr *vdiffRequestResponse) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if tmc.vdiffRequests == nil { + tmc.vdiffRequests = make(map[uint32]*vdiffRequestResponse) + } + tmc.vdiffRequests[tablet.Alias.Uid] = vrr +} + func (tmc *testTMClient) VDiff(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.VDiffRequest) (*tabletmanagerdatapb.VDiffResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if vrr, ok := tmc.vdiffRequests[tablet.Alias.Uid]; ok { + if !proto.Equal(vrr.req, req) { + return nil, fmt.Errorf("unexpected VDiff request on tablet %s; got %+v, want %+v", + topoproto.TabletAliasString(tablet.Alias), req, vrr.req) + } + delete(tmc.vdiffRequests, tablet.Alias.Uid) + return vrr.res, vrr.err + } + if tmc.strict { + return nil, fmt.Errorf("unexpected VDiff request on tablet %s: %+v", + topoproto.TabletAliasString(tablet.Alias), req) + } + return &tabletmanagerdatapb.VDiffResponse{ Id: 1, VdiffUuid: req.VdiffUuid, @@ -429,6 +596,21 @@ func (tmc *testTMClient) VDiff(ctx context.Context, tablet *topodatapb.Tablet, r }, nil } +func (tmc *testTMClient) confirmVDiffRequests(t *testing.T) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + reqString := func([]*vdiffRequestResponse) string { + str := strings.Builder{} + for _, vrr := range tmc.vdiffRequests { + str.WriteString(fmt.Sprintf("\n%+v", vrr.req)) + } + return str.String() + } + + require.Len(t, tmc.vdiffRequests, 0, "expected VDiff requests not made: %s", reqString(maps.Values(tmc.vdiffRequests))) +} + func (tmc *testTMClient) HasVReplicationWorkflows(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.HasVReplicationWorkflowsRequest) (*tabletmanagerdatapb.HasVReplicationWorkflowsResponse, error) { return &tabletmanagerdatapb.HasVReplicationWorkflowsResponse{ Has: false, @@ -439,6 +621,10 @@ func (tmc *testTMClient) ReadVReplicationWorkflows(ctx context.Context, tablet * tmc.mu.Lock() defer tmc.mu.Unlock() + workflowKey := tmc.GetWorkflowKey(tablet.Keyspace, tablet.Shard) + if resp := tmc.getVReplicationWorkflowsResponse(workflowKey); resp != nil { + return resp, nil + } workflowType := binlogdatapb.VReplicationWorkflowType_MoveTables if len(req.IncludeWorkflows) > 0 { for _, wf := range req.IncludeWorkflows { @@ -470,7 +656,7 @@ func (tmc *testTMClient) ReadVReplicationWorkflows(ctx context.Context, tablet * }, }, }, - Pos: "MySQL56/" + position, + Pos: position, TimeUpdated: protoutil.TimeToProto(time.Now()), TimeHeartbeat: protoutil.TimeToProto(time.Now()), }, @@ -491,7 +677,28 @@ func (tmc *testTMClient) UpdateVReplicationWorkflow(ctx context.Context, tablet }, nil } +func (tmc *testTMClient) ValidateVReplicationPermissions(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.ValidateVReplicationPermissionsRequest) (*tabletmanagerdatapb.ValidateVReplicationPermissionsResponse, error) { + return &tabletmanagerdatapb.ValidateVReplicationPermissionsResponse{ + User: "vt_filtered", + Ok: true, + }, nil +} + +func (tmc *testTMClient) setPrimaryPosition(tablet *topodatapb.Tablet, position string) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + if tmc.primaryPositions == nil { + tmc.primaryPositions = make(map[uint32]string) + } + tmc.primaryPositions[tablet.Alias.Uid] = position +} + func (tmc *testTMClient) PrimaryPosition(ctx context.Context, tablet *topodatapb.Tablet) (string, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + if tmc.primaryPositions != nil && tmc.primaryPositions[tablet.Alias.Uid] != "" { + return tmc.primaryPositions[tablet.Alias.Uid], nil + } return position, nil } @@ -502,3 +709,129 @@ func (tmc *testTMClient) WaitForPosition(ctx context.Context, tablet *topodatapb func (tmc *testTMClient) VReplicationWaitForPos(ctx context.Context, tablet *topodatapb.Tablet, id int32, pos string) error { return nil } + +func (tmc *testTMClient) SetRefreshStateError(tablet *topodatapb.Tablet, err error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if tmc.refreshStateErrors == nil { + tmc.refreshStateErrors = make(map[uint32]error) + } + tmc.refreshStateErrors[tablet.Alias.Uid] = err +} + +func (tmc *testTMClient) RefreshState(ctx context.Context, tablet *topodatapb.Tablet) error { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if tmc.refreshStateErrors == nil { + tmc.refreshStateErrors = make(map[uint32]error) + } + return tmc.refreshStateErrors[tablet.Alias.Uid] +} + +func (tmc *testTMClient) AddVReplicationWorkflowsResponse(key string, resp *tabletmanagerdatapb.ReadVReplicationWorkflowsResponse) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + tmc.readVReplicationWorkflowsResponses[key] = append(tmc.readVReplicationWorkflowsResponses[key], resp) +} + +func (tmc *testTMClient) getVReplicationWorkflowsResponse(key string) *tabletmanagerdatapb.ReadVReplicationWorkflowsResponse { + if len(tmc.readVReplicationWorkflowsResponses) == 0 { + return nil + } + responses, ok := tmc.readVReplicationWorkflowsResponses[key] + if !ok || len(responses) == 0 { + return nil + } + resp := tmc.readVReplicationWorkflowsResponses[key][0] + tmc.readVReplicationWorkflowsResponses[key] = tmc.readVReplicationWorkflowsResponses[key][1:] + return resp +} + +// +// Utility / helper functions. +// + +func checkRouting(t *testing.T, ws *Server, want map[string][]string) { + t.Helper() + ctx := context.Background() + got, err := topotools.GetRoutingRules(ctx, ws.ts) + require.NoError(t, err) + require.EqualValues(t, got, want, "routing rules don't match: got: %v, want: %v", got, want) + cells, err := ws.ts.GetCellInfoNames(ctx) + require.NoError(t, err) + for _, cell := range cells { + checkCellRouting(t, ws, cell, want) + } +} + +func checkCellRouting(t *testing.T, ws *Server, cell string, want map[string][]string) { + t.Helper() + ctx := context.Background() + svs, err := ws.ts.GetSrvVSchema(ctx, cell) + require.NoError(t, err) + got := make(map[string][]string, len(svs.RoutingRules.Rules)) + for _, rr := range svs.RoutingRules.Rules { + got[rr.FromTable] = append(got[rr.FromTable], rr.ToTables...) + } + require.EqualValues(t, got, want, "routing rules don't match for cell %s: got: %v, want: %v", cell, got, want) +} + +func checkDenyList(t *testing.T, ts *topo.Server, keyspace, shard string, want []string) { + t.Helper() + ctx := context.Background() + si, err := ts.GetShard(ctx, keyspace, shard) + require.NoError(t, err) + tc := si.GetTabletControl(topodatapb.TabletType_PRIMARY) + var got []string + if tc != nil { + got = tc.DeniedTables + } + require.EqualValues(t, got, want, "denied tables for %s/%s: got: %v, want: %v", keyspace, shard, got, want) +} + +func checkServedTypes(t *testing.T, ts *topo.Server, keyspace, shard string, want int) { + t.Helper() + ctx := context.Background() + si, err := ts.GetShard(ctx, keyspace, shard) + require.NoError(t, err) + servedTypes, err := ts.GetShardServingTypes(ctx, si) + require.NoError(t, err) + require.Equal(t, want, len(servedTypes), "shard %s/%s has wrong served types: got: %v, want: %v", + keyspace, shard, len(servedTypes), want) +} + +func checkCellServedTypes(t *testing.T, ts *topo.Server, keyspace, shard, cell string, want int) { + t.Helper() + ctx := context.Background() + srvKeyspace, err := ts.GetSrvKeyspace(ctx, cell, keyspace) + require.NoError(t, err) + count := 0 +outer: + for _, partition := range srvKeyspace.GetPartitions() { + for _, ref := range partition.ShardReferences { + if ref.Name == shard { + count++ + continue outer + } + } + } + require.Equal(t, want, count, "serving types for %s/%s in cell %s: got: %d, want: %d", keyspace, shard, cell, count, want) +} + +func checkIfPrimaryServing(t *testing.T, ts *topo.Server, keyspace, shard string, want bool) { + t.Helper() + ctx := context.Background() + si, err := ts.GetShard(ctx, keyspace, shard) + require.NoError(t, err) + require.Equal(t, want, si.IsPrimaryServing, "primary serving for %s/%s: got: %v, want: %v", keyspace, shard, si.IsPrimaryServing, want) +} + +func checkIfTableExistInVSchema(ctx context.Context, t *testing.T, ts *topo.Server, keyspace, table string) bool { + vschema, err := ts.GetVSchema(ctx, keyspace) + require.NoError(t, err) + require.NotNil(t, vschema) + _, ok := vschema.Tables[table] + return ok +} diff --git a/go/vt/vtctl/workflow/materializer.go b/go/vt/vtctl/workflow/materializer.go index f0171f31cab..3bcff5a02a1 100644 --- a/go/vt/vtctl/workflow/materializer.go +++ b/go/vt/vtctl/workflow/materializer.go @@ -24,6 +24,11 @@ import ( "sync" "time" + "golang.org/x/exp/maps" + "golang.org/x/sync/errgroup" + + "vitess.io/vitess/go/ptr" + "vitess.io/vitess/go/sqlescape" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/concurrency" @@ -42,15 +47,19 @@ import ( binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" vschemapb "vitess.io/vitess/go/vt/proto/vschema" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) const ( createDDLAsCopy = "copy" createDDLAsCopyDropConstraint = "copy:drop_constraint" createDDLAsCopyDropForeignKeys = "copy:drop_foreign_keys" + // For automatically created sequence tables, use a standard format + // of tableName_seq. + autoSequenceTableFormat = "%s_seq" + getNonEmptyTableQuery = "select 1 from %s limit 1" ) type materializer struct { @@ -113,13 +122,11 @@ func (mz *materializer) createWorkflowStreams(req *tabletmanagerdatapb.CreateVRe if err := validateNewWorkflow(mz.ctx, mz.ts, mz.tmc, mz.ms.TargetKeyspace, mz.ms.Workflow); err != nil { return err } + err := mz.buildMaterializer() if err != nil { return err } - if err := mz.deploySchema(); err != nil { - return err - } var workflowSubType binlogdatapb.VReplicationWorkflowSubType workflowSubType, err = mz.getWorkflowSubType() @@ -127,12 +134,16 @@ func (mz *materializer) createWorkflowStreams(req *tabletmanagerdatapb.CreateVRe return err } req.WorkflowSubType = workflowSubType - optionsJSON, err := mz.getOptionsJSON() + optionsJSON, err := getOptionsJSON(mz.ms.GetWorkflowOptions()) if err != nil { return err } req.Options = optionsJSON + if err := mz.deploySchema(); err != nil { + return err + } + return mz.forAllTargets(func(target *topo.ShardInfo) error { targetPrimary, err := mz.ts.GetTablet(mz.ctx, target.PrimaryAlias) if err != nil { @@ -227,7 +238,20 @@ func (mz *materializer) generateBinlogSources(ctx context.Context, targetShard * for _, mappedCol := range mappedCols { subExprs = append(subExprs, mappedCol) } - vindexName := fmt.Sprintf("%s.%s", mz.ms.TargetKeyspace, cv.Name) + var vindexName string + if mz.workflowType == binlogdatapb.VReplicationWorkflowType_Migrate { + // For a Migrate, if the TargetKeyspace name is different from the SourceKeyspace name, we need to use the + // SourceKeyspace name to determine the vindex since the TargetKeyspace name is not known to the source. + // Note: it is expected that the source and target keyspaces have the same vindex name and data type. + keyspace := mz.ms.TargetKeyspace + if mz.ms.ExternalCluster != "" { + keyspace = mz.ms.SourceKeyspace + } + vindexName = fmt.Sprintf("%s.%s", keyspace, cv.Name) + } else { + vindexName = fmt.Sprintf("%s.%s", mz.ms.TargetKeyspace, cv.Name) + } + subExprs = append(subExprs, sqlparser.NewStrLiteral(vindexName)) subExprs = append(subExprs, sqlparser.NewStrLiteral(key.KeyRangeString(targetShard.KeyRange))) inKeyRange := &sqlparser.FuncExpr{ @@ -259,13 +283,29 @@ func (mz *materializer) deploySchema() error { // to remove them. // We do, however, allow the user to override this behavior and retain them. removeAutoInc := false + updatedVSchema := false + var targetVSchema *vschemapb.Keyspace if mz.workflowType == binlogdatapb.VReplicationWorkflowType_MoveTables && (mz.targetVSchema != nil && mz.targetVSchema.Keyspace != nil && mz.targetVSchema.Keyspace.Sharded) && - (mz.ms != nil && mz.ms.GetWorkflowOptions().GetStripShardedAutoIncrement()) { + (mz.ms.GetWorkflowOptions() != nil && mz.ms.GetWorkflowOptions().ShardedAutoIncrementHandling != vtctldatapb.ShardedAutoIncrementHandling_LEAVE) { removeAutoInc = true + var err error + targetVSchema, err = mz.ts.GetVSchema(mz.ctx, mz.ms.TargetKeyspace) + if err != nil { + return err + } } - return forAllShards(mz.targetShards, func(target *topo.ShardInfo) error { + // Check if any table being moved is already non-empty in the target keyspace. + // Skip this check for multi-tenant migrations. + if !mz.IsMultiTenantMigration() { + err := mz.validateEmptyTables() + if err != nil { + return vterrors.Wrap(err, "failed to validate that all target tables are empty") + } + } + + err := forAllShards(mz.targetShards, func(target *topo.ShardInfo) error { allTables := []string{"/.*/"} hasTargetTable := map[string]bool{} @@ -291,7 +331,7 @@ func (mz *materializer) deploySchema() error { continue } if ts.CreateDdl == "" { - return fmt.Errorf("target table %v does not exist and there is no create ddl defined", ts.TargetTable) + return fmt.Errorf("target table %s does not exist and there is no create ddl defined", ts.TargetTable) } var err error @@ -347,7 +387,28 @@ func (mz *materializer) deploySchema() error { } if removeAutoInc { - ddl, err = stripAutoIncrement(ddl, mz.env.Parser()) + var replaceFunc func(columnName string) + if mz.ms.GetWorkflowOptions().ShardedAutoIncrementHandling == vtctldatapb.ShardedAutoIncrementHandling_REPLACE { + replaceFunc = func(columnName string) { + mu.Lock() + defer mu.Unlock() + // At this point we've already confirmed that the table exists in the target + // vschema. + table := targetVSchema.Tables[ts.TargetTable] + // Don't override or redo anything that already exists. + if table != nil && table.AutoIncrement == nil { + seqTableName := fmt.Sprintf(autoSequenceTableFormat, ts.TargetTable) + // Create a Vitess AutoIncrement definition -- which uses a sequence -- to + // replace the MySQL auto_increment definition that we removed. + table.AutoIncrement = &vschemapb.AutoIncrement{ + Column: columnName, + Sequence: seqTableName, + } + updatedVSchema = true + } + } + } + ddl, err = stripAutoIncrement(ddl, mz.env.Parser(), replaceFunc) if err != nil { return err } @@ -392,6 +453,15 @@ func (mz *materializer) deploySchema() error { return nil }) + if err != nil { + return err + } + + if updatedVSchema { + return mz.ts.SaveVSchema(mz.ctx, mz.ms.TargetKeyspace, targetVSchema) + } + + return nil } func (mz *materializer) buildMaterializer() error { @@ -489,6 +559,66 @@ func (mz *materializer) buildMaterializer() error { return nil } +// validateEmptyTables checks if all tables are empty across all target shards. +// It queries each shard's primary tablet and if any non-empty table is found, +// returns an error containing a list of non-empty tables. +func (mz *materializer) validateEmptyTables() error { + var mu sync.Mutex + isNonEmptyTable := map[string]bool{} + + err := forAllShards(mz.targetShards, func(shard *topo.ShardInfo) error { + primary := shard.PrimaryAlias + if primary == nil { + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "no primary tablet found for shard %s/%s", shard.Keyspace(), shard.ShardName()) + } + + ti, err := mz.ts.GetTablet(mz.ctx, primary) + if err != nil { + return err + } + + eg, groupCtx := errgroup.WithContext(mz.ctx) + eg.SetLimit(20) + + for _, ts := range mz.ms.TableSettings { + eg.Go(func() error { + table, err := sqlescape.EnsureEscaped(ts.TargetTable) + if err != nil { + return err + } + query := fmt.Sprintf(getNonEmptyTableQuery, table) + res, err := mz.tmc.ExecuteFetchAsAllPrivs(groupCtx, ti.Tablet, &tabletmanagerdatapb.ExecuteFetchAsAllPrivsRequest{ + Query: []byte(query), + MaxRows: 1, + }) + // Ignore table not found error + if err != nil && !IsTableDidNotExistError(err) { + return err + } + if res != nil && len(res.Rows) > 0 { + mu.Lock() + isNonEmptyTable[ts.TargetTable] = true + mu.Unlock() + } + return nil + }) + } + if err = eg.Wait(); err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + + nonEmptyTables := maps.Keys(isNonEmptyTable) + if len(nonEmptyTables) > 0 { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "non-empty tables found in target keyspace(%s): %s", mz.ms.TargetKeyspace, strings.Join(nonEmptyTables, ", ")) + } + return nil +} + func (mz *materializer) startStreams(ctx context.Context) error { return forAllShards(mz.targetShards, func(target *topo.ShardInfo) error { targetPrimary, err := mz.ts.GetTablet(ctx, target.PrimaryAlias) @@ -497,13 +627,10 @@ func (mz *materializer) startStreams(ctx context.Context) error { } if _, err := mz.tmc.UpdateVReplicationWorkflow(ctx, targetPrimary.Tablet, &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: mz.ms.Workflow, - State: binlogdatapb.VReplicationWorkflowState_Running, + State: ptr.Of(binlogdatapb.VReplicationWorkflowState_Running), // Don't change anything else, so pass simulated NULLs. - Cells: textutil.SimulatedNullStringSlice, - TabletTypes: []topodatapb.TabletType{ - topodatapb.TabletType(textutil.SimulatedNullInt), - }, - OnDdl: binlogdatapb.OnDDLAction(textutil.SimulatedNullInt), + Cells: textutil.SimulatedNullStringSlice, + TabletTypes: textutil.SimulatedNullTabletTypeSlice, }); err != nil { return vterrors.Wrap(err, "failed to update workflow") } diff --git a/go/vt/vtctl/workflow/materializer_env_test.go b/go/vt/vtctl/workflow/materializer_env_test.go index 569651f85ca..20374f7ef46 100644 --- a/go/vt/vtctl/workflow/materializer_env_test.go +++ b/go/vt/vtctl/workflow/materializer_env_test.go @@ -25,6 +25,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" @@ -33,8 +34,10 @@ import ( "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/tmutils" + "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" + "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" @@ -61,7 +64,7 @@ type testMaterializerEnv struct { venv *vtenv.Environment } -//---------------------------------------------- +// ---------------------------------------------- // testMaterializerEnv func newTestMaterializerEnv(t *testing.T, ctx context.Context, ms *vtctldatapb.MaterializeSettings, sourceShards, targetShards []string) *testMaterializerEnv { @@ -91,18 +94,18 @@ func newTestMaterializerEnv(t *testing.T, ctx context.Context, ms *vtctldatapb.M logger := logutil.NewConsoleLogger() require.NoError(t, topoServ.RebuildSrvVSchema(ctx, []string{"cell"})) - tabletID := 100 + tabletID := startingSourceTabletUID sourceShardsMap := make(map[string]any) for _, shard := range sourceShards { sourceShardsMap[shard] = nil require.NoError(t, topoServ.CreateShard(ctx, ms.SourceKeyspace, shard)) _ = env.addTablet(t, tabletID, env.ms.SourceKeyspace, shard, topodatapb.TabletType_PRIMARY) - tabletID += 10 + tabletID += tabletUIDStep } require.NoError(t, topotools.RebuildKeyspace(ctx, logger, topoServ, ms.SourceKeyspace, []string{"cell"}, false)) - tabletID = 200 + tabletID = startingTargetTabletUID for _, shard := range targetShards { if ms.SourceKeyspace == ms.TargetKeyspace { if _, ok := sourceShardsMap[shard]; ok { @@ -111,7 +114,7 @@ func newTestMaterializerEnv(t *testing.T, ctx context.Context, ms *vtctldatapb.M } require.NoError(t, topoServ.CreateShard(ctx, ms.TargetKeyspace, shard)) _ = env.addTablet(t, tabletID, env.ms.TargetKeyspace, shard, topodatapb.TabletType_PRIMARY) - tabletID += 10 + tabletID += tabletUIDStep } for _, ts := range ms.TableSettings { @@ -120,16 +123,39 @@ func newTestMaterializerEnv(t *testing.T, ctx context.Context, ms *vtctldatapb.M if err == nil { tableName = table.Name.String() } + var ( + cols []string + fields []*querypb.Field + ) + if ts.CreateDdl != "" { + stmt, err := env.venv.Parser().ParseStrictDDL(ts.CreateDdl) + require.NoError(t, err) + ddl, ok := stmt.(*sqlparser.CreateTable) + require.True(t, ok) + cols = make([]string, len(ddl.TableSpec.Columns)) + fields = make([]*querypb.Field, len(ddl.TableSpec.Columns)) + for i, col := range ddl.TableSpec.Columns { + cols[i] = col.Name.String() + fields[i] = &querypb.Field{ + Name: col.Name.String(), + Type: col.Type.SQLType(), + } + } + } env.tmc.schema[ms.SourceKeyspace+"."+tableName] = &tabletmanagerdatapb.SchemaDefinition{ TableDefinitions: []*tabletmanagerdatapb.TableDefinition{{ - Name: tableName, - Schema: fmt.Sprintf("%s_schema", tableName), + Name: tableName, + Schema: ts.CreateDdl, + Columns: cols, + Fields: fields, }}, } env.tmc.schema[ms.TargetKeyspace+"."+ts.TargetTable] = &tabletmanagerdatapb.SchemaDefinition{ TableDefinitions: []*tabletmanagerdatapb.TableDefinition{{ - Name: ts.TargetTable, - Schema: fmt.Sprintf("%s_schema", ts.TargetTable), + Name: ts.TargetTable, + Schema: ts.CreateDdl, + Columns: cols, + Fields: fields, }}, } } @@ -199,13 +225,17 @@ type testMaterializerTMClient struct { mu sync.Mutex vrQueries map[int][]*queryResult - createVReplicationWorkflowRequests map[uint32]*tabletmanagerdatapb.CreateVReplicationWorkflowRequest + fetchAsAllPrivsQueries map[int]map[string]*queryResult + createVReplicationWorkflowRequests map[uint32]*createVReplicationWorkflowRequestResponse // Used to confirm the number of times WorkflowDelete was called. workflowDeleteCalls int // Used to override the response to ReadVReplicationWorkflow. readVReplicationWorkflow readVReplicationWorkflowFunc + + // Responses to GetSchema RPCs for individual tablets. + getSchemaResponses map[uint32]*tabletmanagerdatapb.SchemaDefinition } func newTestMaterializerTMClient(keyspace string, sourceShards []string, tableSettings []*vtctldatapb.TableMaterializeSettings) *testMaterializerTMClient { @@ -215,14 +245,22 @@ func newTestMaterializerTMClient(keyspace string, sourceShards []string, tableSe sourceShards: sourceShards, tableSettings: tableSettings, vrQueries: make(map[int][]*queryResult), - createVReplicationWorkflowRequests: make(map[uint32]*tabletmanagerdatapb.CreateVReplicationWorkflowRequest), + fetchAsAllPrivsQueries: make(map[int]map[string]*queryResult), + createVReplicationWorkflowRequests: make(map[uint32]*createVReplicationWorkflowRequestResponse), + getSchemaResponses: make(map[uint32]*tabletmanagerdatapb.SchemaDefinition), } } func (tmc *testMaterializerTMClient) CreateVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.CreateVReplicationWorkflowRequest) (*tabletmanagerdatapb.CreateVReplicationWorkflowResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() if expect := tmc.createVReplicationWorkflowRequests[tablet.Alias.Uid]; expect != nil { - if !proto.Equal(expect, request) { - return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected CreateVReplicationWorkflow request: got %+v, want %+v", request, expect) + if expect.req != nil && !proto.Equal(expect.req, request) { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unexpected CreateVReplicationWorkflow request on tablet %s: got %+v, want %+v", + topoproto.TabletAliasString(tablet.Alias), request, expect) + } + if expect.res != nil { + return expect.res, expect.err } } res := sqltypes.MakeTestResult(sqltypes.MakeTestFields("rowsaffected", "int64"), "1") @@ -230,6 +268,9 @@ func (tmc *testMaterializerTMClient) CreateVReplicationWorkflow(ctx context.Cont } func (tmc *testMaterializerTMClient) ReadVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.ReadVReplicationWorkflowRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + if tmc.readVReplicationWorkflow != nil { return tmc.readVReplicationWorkflow(ctx, tablet, request) } @@ -282,7 +323,24 @@ func (tmc *testMaterializerTMClient) DeleteVReplicationWorkflow(ctx context.Cont }, nil } +func (tmc *testMaterializerTMClient) SetGetSchemaResponse(tabletUID int, res *tabletmanagerdatapb.SchemaDefinition) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if tmc.getSchemaResponses == nil { + tmc.getSchemaResponses = make(map[uint32]*tabletmanagerdatapb.SchemaDefinition) + } + tmc.getSchemaResponses[uint32(tabletUID)] = res +} + func (tmc *testMaterializerTMClient) GetSchema(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.GetSchemaRequest) (*tabletmanagerdatapb.SchemaDefinition, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if tmc.getSchemaResponses != nil && tmc.getSchemaResponses[tablet.Alias.Uid] != nil { + return tmc.getSchemaResponses[tablet.Alias.Uid], nil + } + schemaDefn := &tabletmanagerdatapb.SchemaDefinition{} for _, table := range request.Tables { if table == "/.*/" { @@ -315,7 +373,21 @@ func (tmc *testMaterializerTMClient) expectVRQuery(tabletID int, query string, r }) } -func (tmc *testMaterializerTMClient) expectCreateVReplicationWorkflowRequest(tabletID uint32, req *tabletmanagerdatapb.CreateVReplicationWorkflowRequest) { +func (tmc *testMaterializerTMClient) expectFetchAsAllPrivsQuery(tabletID int, query string, result *sqltypes.Result) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if tmc.fetchAsAllPrivsQueries[tabletID] == nil { + tmc.fetchAsAllPrivsQueries[tabletID] = make(map[string]*queryResult) + } + + tmc.fetchAsAllPrivsQueries[tabletID][query] = &queryResult{ + query: query, + result: sqltypes.ResultToProto3(result), + } +} + +func (tmc *testMaterializerTMClient) expectCreateVReplicationWorkflowRequest(tabletID uint32, req *createVReplicationWorkflowRequestResponse) { tmc.mu.Lock() defer tmc.mu.Unlock() @@ -344,7 +416,7 @@ func (tmc *testMaterializerTMClient) VReplicationExec(ctx context.Context, table qrs := tmc.vrQueries[int(tablet.Alias.Uid)] if len(qrs) == 0 { - return nil, fmt.Errorf("tablet %v does not expect any more queries: %s", tablet, query) + return nil, fmt.Errorf("tablet %v does not expect any more queries: %q", tablet, query) } matched := false if qrs[0].query[0] == '/' { @@ -365,7 +437,16 @@ func (tmc *testMaterializerTMClient) ExecuteFetchAsDba(ctx context.Context, tabl } func (tmc *testMaterializerTMClient) ExecuteFetchAsAllPrivs(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.ExecuteFetchAsAllPrivsRequest) (*querypb.QueryResult, error) { - return nil, nil + tmc.mu.Lock() + defer tmc.mu.Unlock() + + if resultsForTablet, ok := tmc.fetchAsAllPrivsQueries[int(tablet.Alias.Uid)]; ok { + if result, ok := resultsForTablet[string(req.Query)]; ok { + return result.result, result.err + } + } + + return nil, fmt.Errorf("%w: no ExecuteFetchAsAllPrivs result set for tablet %d", assert.AnError, int(tablet.Alias.Uid)) } // Note: ONLY breaks up change.SQL into individual statements and executes it. Does NOT fully implement ApplySchema. @@ -403,6 +484,9 @@ func (tmc *testMaterializerTMClient) HasVReplicationWorkflows(ctx context.Contex } func (tmc *testMaterializerTMClient) ReadVReplicationWorkflows(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.ReadVReplicationWorkflowsRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowsResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + workflowType := binlogdatapb.VReplicationWorkflowType_MoveTables if len(req.IncludeWorkflows) > 0 { for _, wf := range req.IncludeWorkflows { @@ -426,7 +510,7 @@ func (tmc *testMaterializerTMClient) ReadVReplicationWorkflows(ctx context.Conte }, }, }, - Pos: "MySQL56/" + position, + Pos: position, TimeUpdated: protoutil.TimeToProto(time.Now()), TimeHeartbeat: protoutil.TimeToProto(time.Now()), } diff --git a/go/vt/vtctl/workflow/materializer_test.go b/go/vt/vtctl/workflow/materializer_test.go index 51a7d22d5eb..fa3f25ca917 100644 --- a/go/vt/vtctl/workflow/materializer_test.go +++ b/go/vt/vtctl/workflow/materializer_test.go @@ -18,12 +18,14 @@ package workflow import ( "context" + "errors" "fmt" "slices" "strings" "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/exp/maps" "google.golang.org/protobuf/proto" @@ -31,6 +33,7 @@ import ( "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vtgate/vindexes" @@ -44,18 +47,27 @@ import ( ) const ( - position = "9d10e6ec-07a0-11ee-ae73-8e53f4cf3083:1-97" + position = "MySQL56/9d10e6ec-07a0-11ee-ae73-8e53f4cf3083:1-97" mzSelectFrozenQuery = "select 1 from _vt.vreplication where db_name='vt_targetks' and message='FROZEN' and workflow_sub_type != 1" mzCheckJournal = "/select val from _vt.resharding_journal where id=" mzGetCopyState = "select distinct table_name from _vt.copy_state cs, _vt.vreplication vr where vr.id = cs.vrepl_id and vr.id = 1" mzGetLatestCopyState = "select vrepl_id, table_name, lastpk from _vt.copy_state where vrepl_id in (1) and id in (select max(id) from _vt.copy_state where vrepl_id in (1) group by vrepl_id, table_name)" insertPrefix = `/insert into _vt.vreplication\(workflow, source, pos, max_tps, max_replication_lag, cell, tablet_types, time_updated, transaction_timestamp, state, db_name, workflow_type, workflow_sub_type, defer_secondary_keys, options\) values ` + getNonEmptyTable = "select 1 from `t1` limit 1" ) var ( defaultOnDDL = binlogdatapb.OnDDLAction_IGNORE.String() ) +func gtid(position string) string { + arr := strings.Split(position, "/") + if len(arr) != 2 { + return "" + } + return arr[1] +} + func TestStripForeignKeys(t *testing.T) { tcs := []struct { desc string @@ -277,7 +289,7 @@ func TestStripAutoIncrement(t *testing.T) { } for _, tc := range tcs { - strippedDDL, err := stripAutoIncrement(tc.ddl, parser) + strippedDDL, err := stripAutoIncrement(tc.ddl, parser, nil) require.Equal(t, tc.expectErr, (err != nil), "unexpected error result", "expected error %t, got: %v", tc.expectErr, err) require.Equal(t, tc.want, strippedDDL, fmt.Sprintf("stripped DDL %q does not match our expected result: %q", strippedDDL, tc.want)) } @@ -511,6 +523,7 @@ func TestMigrateVSchema(t *testing.T) { defer env.close() env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) + env.tmc.expectFetchAsAllPrivsQuery(200, getNonEmptyTable, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzGetCopyState, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzGetLatestCopyState, &sqltypes.Result{}) @@ -569,6 +582,7 @@ func TestMoveTablesDDLFlag(t *testing.T) { // a circular dependency. // The TabletManager portion is tested in rpc_vreplication_test.go. env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) + env.tmc.expectFetchAsAllPrivsQuery(200, getNonEmptyTable, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzGetCopyState, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzGetLatestCopyState, &sqltypes.Result{}) @@ -577,7 +591,7 @@ func TestMoveTablesDDLFlag(t *testing.T) { sourceShard, err := env.topoServ.GetShardNames(ctx, ms.SourceKeyspace) require.NoError(t, err) want := fmt.Sprintf("shard_streams:{key:\"%s/%s\" value:{streams:{id:1 tablet:{cell:\"%s\" uid:200} source_shard:\"%s/%s\" position:\"%s\" status:\"Running\" info:\"VStream Lag: 0s\"}}} traffic_state:\"Reads Not Switched. Writes Not Switched\"", - ms.TargetKeyspace, targetShard[0], env.cell, ms.SourceKeyspace, sourceShard[0], position) + ms.TargetKeyspace, targetShard[0], env.cell, ms.SourceKeyspace, sourceShard[0], gtid(position)) res, err := env.ws.MoveTablesCreate(ctx, &vtctldatapb.MoveTablesCreateRequest{ Workflow: ms.Workflow, @@ -592,7 +606,340 @@ func TestMoveTablesDDLFlag(t *testing.T) { } } -// TestMoveTablesNoRoutingRules confirms that MoveTables does not create routing rules if --no-routing-rules is specified. +// TestShardedAutoIncHandling tests the optional behaviors available when moving +// tables to a sharded keyspace and the tables being copied contain MySQL +// auto_increment clauses. The optional behaviors are: +// 1. LEAVE the tables' MySQL auto_increment clauses alone +// 2. REMOVE the tables' MySQL auto_increment clauses +// 3. REPLACE the table's MySQL auto_increment clauses with Vitess sequences +func TestShardedAutoIncHandling(t *testing.T) { + tableName := "t1" + tableDDL := fmt.Sprintf("create table %s (id int not null auto_increment primary key, c1 varchar(10))", tableName) + validateEmptyTableQuery := fmt.Sprintf("select 1 from `%s` limit 1", tableName) + ms := &vtctldatapb.MaterializeSettings{ + Workflow: "workflow", + SourceKeyspace: "sourceks", + TargetKeyspace: "targetks", + TableSettings: []*vtctldatapb.TableMaterializeSettings{{ + TargetTable: tableName, + CreateDdl: tableDDL, + SourceExpression: fmt.Sprintf("select * from %s", tableName), + }}, + WorkflowOptions: &vtctldatapb.WorkflowOptions{}, + } + + type testcase struct { + name string + value vtctldatapb.ShardedAutoIncrementHandling + globalKeyspace string + targetShards []string + targetVSchema *vschemapb.Keyspace + wantTargetVSchema *vschemapb.Keyspace + expectQueries []string + expectAllPrivsQueries []string + expectErr string + } + testcases := []testcase{ + { + name: "global-keyspace does not exist", + globalKeyspace: "foo", + expectErr: "global-keyspace foo does not exist", + }, + { + name: "global keyspace is sharded", + globalKeyspace: ms.TargetKeyspace, + targetShards: []string{"-80", "80-"}, + targetVSchema: &vschemapb.Keyspace{ + Sharded: true, + Tables: map[string]*vschemapb.Table{ + tableName: { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Name: "xxhash", + Column: "id", + }, + }, + }, + }, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + }, + expectErr: fmt.Sprintf("global-keyspace %s is sharded and thus cannot be used for global resources", + ms.TargetKeyspace), + }, + { + name: "leave", + globalKeyspace: ms.SourceKeyspace, + targetShards: []string{"-80", "80-"}, + targetVSchema: &vschemapb.Keyspace{ + Sharded: true, + Tables: map[string]*vschemapb.Table{ + tableName: { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Name: "xxhash", + Column: "id", + }, + }, + }, + }, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + }, + value: vtctldatapb.ShardedAutoIncrementHandling_LEAVE, + wantTargetVSchema: &vschemapb.Keyspace{ + Sharded: true, + Tables: map[string]*vschemapb.Table{ + tableName: { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Name: "xxhash", + Column: "id", + }, + }, + }, + }, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + }, + expectQueries: []string{ + tableDDL, // Unchanged + }, + expectAllPrivsQueries: []string{ + validateEmptyTableQuery, + }, + }, + { + name: "remove", + globalKeyspace: ms.SourceKeyspace, + targetShards: []string{"-80", "80-"}, + targetVSchema: &vschemapb.Keyspace{ + Sharded: true, + Tables: map[string]*vschemapb.Table{ + tableName: { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Name: "xxhash", + Column: "id", + }, + }, + }, + }, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + }, + value: vtctldatapb.ShardedAutoIncrementHandling_REMOVE, + wantTargetVSchema: &vschemapb.Keyspace{ + Sharded: true, + Tables: map[string]*vschemapb.Table{ + tableName: { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Name: "xxhash", + Column: "id", + }, + }, + }, + }, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + }, + expectQueries: []string{ // auto_increment clause removed + fmt.Sprintf(`create table %s ( + id int not null primary key, + c1 varchar(10) +)`, tableName), + }, + expectAllPrivsQueries: []string{ + validateEmptyTableQuery, + }, + }, + { + name: "replace, but vschema AutoIncrement already in place", + globalKeyspace: ms.SourceKeyspace, + targetShards: []string{"-80", "80-"}, + targetVSchema: &vschemapb.Keyspace{ + Sharded: true, + Tables: map[string]*vschemapb.Table{ + tableName: { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Name: "xxhash", + Column: "id", + }, + }, + AutoIncrement: &vschemapb.AutoIncrement{ // AutoIncrement definition exists + Column: "id", + Sequence: fmt.Sprintf("%s_non_default_seq_name", tableName), + }, + }, + }, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + }, + value: vtctldatapb.ShardedAutoIncrementHandling_REPLACE, + wantTargetVSchema: &vschemapb.Keyspace{ + Sharded: true, + Tables: map[string]*vschemapb.Table{ + tableName: { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Name: "xxhash", + Column: "id", + }, + }, + AutoIncrement: &vschemapb.AutoIncrement{ // AutoIncrement definition left alone + Column: "id", + Sequence: fmt.Sprintf("%s_non_default_seq_name", tableName), + }, + }, + }, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + }, + expectQueries: []string{ // auto_increment clause removed + fmt.Sprintf(`create table %s ( + id int not null primary key, + c1 varchar(10) +)`, tableName), + }, + expectAllPrivsQueries: []string{ + validateEmptyTableQuery, + }, + }, + { + name: "replace", + globalKeyspace: ms.SourceKeyspace, + targetShards: []string{"-80", "80-"}, + targetVSchema: &vschemapb.Keyspace{ + Sharded: true, + Tables: map[string]*vschemapb.Table{ + tableName: { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Name: "xxhash", + Column: "id", + }, + }, + }, + }, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + }, + value: vtctldatapb.ShardedAutoIncrementHandling_REPLACE, + wantTargetVSchema: &vschemapb.Keyspace{ + Sharded: true, + Tables: map[string]*vschemapb.Table{ + tableName: { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Name: "xxhash", + Column: "id", + }, + }, + AutoIncrement: &vschemapb.AutoIncrement{ // AutoIncrement definition added + Column: "id", + Sequence: fmt.Sprintf(autoSequenceTableFormat, tableName), + }, + }, + }, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + }, + expectQueries: []string{ // auto_increment clause removed + fmt.Sprintf(`create table %s ( + id int not null primary key, + c1 varchar(10) +)`, tableName), + }, + expectAllPrivsQueries: []string{ + validateEmptyTableQuery, + }, + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + if tc.targetShards == nil { + tc.targetShards = []string{"0"} + } + env := newTestMaterializerEnv(t, ctx, ms, []string{"0"}, tc.targetShards) + defer env.close() + + env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) + for i := range tc.targetShards { + uid := startingTargetTabletUID + (i * tabletUIDStep) + for _, query := range tc.expectQueries { + env.tmc.expectVRQuery(uid, query, &sqltypes.Result{}) + } + for _, query := range tc.expectAllPrivsQueries { + env.tmc.expectFetchAsAllPrivsQuery(uid, query, &sqltypes.Result{}) + } + env.tmc.expectVRQuery(uid, mzGetCopyState, &sqltypes.Result{}) + env.tmc.expectVRQuery(uid, mzGetLatestCopyState, &sqltypes.Result{}) + env.tmc.SetGetSchemaResponse(uid, &tabletmanagerdatapb.SchemaDefinition{}) // So that the schema is copied from the source + } + + if tc.targetVSchema != nil { + err := env.ws.ts.SaveVSchema(ctx, ms.TargetKeyspace, tc.targetVSchema) + require.NoError(t, err) + } + + _, err := env.ws.MoveTablesCreate(ctx, &vtctldatapb.MoveTablesCreateRequest{ + Workflow: ms.Workflow, + SourceKeyspace: ms.SourceKeyspace, + TargetKeyspace: ms.TargetKeyspace, + IncludeTables: []string{tableName}, + WorkflowOptions: &vtctldatapb.WorkflowOptions{ + ShardedAutoIncrementHandling: tc.value, + GlobalKeyspace: tc.globalKeyspace, + }, + }) + if tc.expectErr != "" { + require.EqualError(t, err, tc.expectErr) + } else { + require.NoError(t, err) + if tc.wantTargetVSchema != nil { + targetVSchema, err := env.ws.ts.GetVSchema(ctx, ms.TargetKeyspace) + require.NoError(t, err) + require.True(t, proto.Equal(targetVSchema, tc.wantTargetVSchema)) + } + } + }) + } +} + +// TestMoveTablesNoRoutingRules confirms that MoveTables does not create routing rules if +// --no-routing-rules is specified. func TestMoveTablesNoRoutingRules(t *testing.T) { ms := &vtctldatapb.MaterializeSettings{ Workflow: "workflow", @@ -618,6 +965,7 @@ func TestMoveTablesNoRoutingRules(t *testing.T) { // a circular dependency. // The TabletManager portion is tested in rpc_vreplication_test.go. env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) + env.tmc.expectFetchAsAllPrivsQuery(200, getNonEmptyTable, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzGetCopyState, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzGetLatestCopyState, &sqltypes.Result{}) @@ -636,7 +984,7 @@ func TestMoveTablesNoRoutingRules(t *testing.T) { Uid: 200, }, SourceShard: fmt.Sprintf("%s/%s", ms.SourceKeyspace, sourceShard[0]), - Position: position, + Position: gtid(position), Status: binlogdatapb.VReplicationWorkflowState_Running.String(), Info: "VStream Lag: 0s", }, @@ -736,6 +1084,7 @@ func TestCreateLookupVindexFull(t *testing.T) { } env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) + env.tmc.expectFetchAsAllPrivsQuery(200, "select 1 from `lookup` limit 1", &sqltypes.Result{}) env.tmc.expectVRQuery(200, "/CREATE TABLE `lookup`", &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzGetCopyState, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzGetLatestCopyState, &sqltypes.Result{}) @@ -1166,13 +1515,16 @@ func TestCreateLookupVindexCreateDDL(t *testing.T) { setStartingVschema() }() } - outms, _, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.SourceKeyspace, tcase.specs, false) + outms, _, _, cancelFunc, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.SourceKeyspace, tcase.specs, false) if tcase.err != "" { require.Error(t, err) require.Contains(t, err.Error(), tcase.err, "prepareCreateLookup(%s) err: %v, does not contain %v", tcase.description, err, tcase.err) return } require.NoError(t, err) + // All of these test cases create a table and thus change the target + // vschema. + require.NotNil(t, cancelFunc) want := strings.Split(tcase.out, "\n") got := strings.Split(outms.TableSettings[0].CreateDdl, "\n") require.Equal(t, want, got, tcase.description) @@ -1411,7 +1763,7 @@ func TestCreateLookupVindexSourceVSchema(t *testing.T) { t.Fatal(err) } - _, got, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.SourceKeyspace, specs, false) + _, got, _, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.SourceKeyspace, specs, false) require.NoError(t, err) if !proto.Equal(got, tcase.out) { t.Errorf("%s: got:\n%v, want\n%v", tcase.description, got, tcase.out) @@ -1646,7 +1998,7 @@ func TestCreateLookupVindexTargetVSchema(t *testing.T) { t.Fatal(err) } - _, _, got, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.SourceKeyspace, specs, false) + _, _, got, cancelFunc, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.SourceKeyspace, specs, false) if tcase.err != "" { if err == nil || !strings.Contains(err.Error(), tcase.err) { t.Errorf("prepareCreateLookup(%s) err: %v, must contain %v", tcase.description, err, tcase.err) @@ -1654,6 +2006,9 @@ func TestCreateLookupVindexTargetVSchema(t *testing.T) { continue } require.NoError(t, err) + // withTable is a vschema that already contains the table and thus + // we don't make any vschema changes and there's nothing to cancel. + require.True(t, (cancelFunc != nil) == (tcase.targetVSchema != withTable)) utils.MustMatch(t, tcase.out, got, tcase.description) } } @@ -1764,7 +2119,7 @@ func TestCreateLookupVindexSameKeyspace(t *testing.T) { t.Fatal(err) } - _, got, _, err := env.ws.prepareCreateLookup(ctx, "keyspace", ms.TargetKeyspace, specs, false) + _, got, _, _, err := env.ws.prepareCreateLookup(ctx, "keyspace", ms.TargetKeyspace, specs, false) require.NoError(t, err) if !proto.Equal(got, want) { t.Errorf("same keyspace: got:\n%v, want\n%v", got, want) @@ -1890,7 +2245,7 @@ func TestCreateCustomizedVindex(t *testing.T) { t.Fatal(err) } - _, got, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.TargetKeyspace, specs, false) + _, got, _, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.TargetKeyspace, specs, false) require.NoError(t, err) if !proto.Equal(got, want) { t.Errorf("customize create lookup error same: got:\n%v, want\n%v", got, want) @@ -2008,7 +2363,7 @@ func TestCreateLookupVindexIgnoreNulls(t *testing.T) { t.Fatal(err) } - ms, ks, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.TargetKeyspace, specs, false) + ms, ks, _, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.TargetKeyspace, specs, false) require.NoError(t, err) if !proto.Equal(wantKs, ks) { t.Errorf("unexpected keyspace value: got:\n%v, want\n%v", ks, wantKs) @@ -2088,21 +2443,34 @@ func TestStopAfterCopyFlag(t *testing.T) { t.Fatal(err) } - ms1, _, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.TargetKeyspace, specs, false) + ms1, _, _, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.TargetKeyspace, specs, false) require.NoError(t, err) require.Equal(t, ms1.StopAfterCopy, true) - ms2, _, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.TargetKeyspace, specs, true) + ms2, _, _, _, err := env.ws.prepareCreateLookup(ctx, "workflow", ms.TargetKeyspace, specs, true) require.NoError(t, err) require.Equal(t, ms2.StopAfterCopy, false) } func TestCreateLookupVindexFailures(t *testing.T) { ms := &vtctldatapb.MaterializeSettings{ - // Keyspace where the vindex is created. - SourceKeyspace: "sourceks", - // Keyspace where the lookup table and VReplication workflow is created. + SourceKeyspace: "sourceks", // Not used + // Keyspace where the lookup table, vindex, and VReplication workflow is created. TargetKeyspace: "targetks", + TableSettings: []*vtctldatapb.TableMaterializeSettings{ + { + TargetTable: "t1", + CreateDdl: "CREATE TABLE `t1` (\n`c1` INT,\n PRIMARY KEY(`c1`)\n)", + }, + { + TargetTable: "t2", + CreateDdl: "CREATE TABLE `t2` (\n`c2` INT,\n PRIMARY KEY(`c2`)\n)", + }, + { + TargetTable: "t3", + CreateDdl: "CREATE TABLE `t3` (\n`c3` INT,\n PRIMARY KEY(`c3`)\n)", + }, + }, } ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -2114,7 +2482,7 @@ func TestCreateLookupVindexFailures(t *testing.T) { "v": { Type: "lookup_unique", Params: map[string]string{ - "table": "targetks.t", + "table": fmt.Sprintf("%s.t", ms.TargetKeyspace), "from": "c1", "to": "c2", }, @@ -2127,10 +2495,10 @@ func TestCreateLookupVindexFailures(t *testing.T) { "xxhash": { Type: "xxhash", }, - "v": { + "v1": { Type: "lookup_unique", Params: map[string]string{ - "table": "targetks.t", + "table": fmt.Sprintf("%s.t", ms.TargetKeyspace), "from": "c1", "to": "c2", "write_only": "true", @@ -2140,19 +2508,29 @@ func TestCreateLookupVindexFailures(t *testing.T) { Tables: map[string]*vschemapb.Table{ "t1": { ColumnVindexes: []*vschemapb.ColumnVindex{{ - Name: "v", + Name: "v1", Column: "c1", }}, }, + "t2": { + ColumnVindexes: []*vschemapb.ColumnVindex{{ + Name: "v2", + Column: "c2", + }}, + }, }, } err := env.topoServ.SaveVSchema(ctx, ms.TargetKeyspace, vs) require.NoError(t, err) testcases := []struct { - description string - input *vschemapb.Keyspace - err string + description string + input *vschemapb.Keyspace + createRequest *createVReplicationWorkflowRequestResponse + vrepExecQueries []string + fetchAsAllPrivsQueries []string + schemaAdditions []*tabletmanagerdatapb.TableDefinition + err string }{ { description: "dup vindex", @@ -2200,7 +2578,7 @@ func TestCreateLookupVindexFailures(t *testing.T) { "v": { Type: "lookup_unique", Params: map[string]string{ - "table": "targetks.t", + "table": fmt.Sprintf("%s.t", ms.TargetKeyspace), "from": "c1,c2", "to": "c3", }, @@ -2216,7 +2594,7 @@ func TestCreateLookupVindexFailures(t *testing.T) { "v": { Type: "lookup", Params: map[string]string{ - "table": "targetks.t", + "table": fmt.Sprintf("%s.t", ms.TargetKeyspace), "from": "c1", "to": "c2", }, @@ -2232,7 +2610,7 @@ func TestCreateLookupVindexFailures(t *testing.T) { "v": { Type: "lookup_noexist", Params: map[string]string{ - "table": "targetks.t", + "table": fmt.Sprintf("%s.t", ms.TargetKeyspace), "from": "c1,c2", "to": "c2", }, @@ -2256,7 +2634,7 @@ func TestCreateLookupVindexFailures(t *testing.T) { "v": { Type: "lookup_unique", Params: map[string]string{ - "table": "targetks.t", + "table": fmt.Sprintf("%s.t", ms.TargetKeyspace), "from": "c1", "to": "c2", }, @@ -2316,7 +2694,7 @@ func TestCreateLookupVindexFailures(t *testing.T) { "v": { Type: "lookup_unique", Params: map[string]string{ - "table": "targetks.t", + "table": fmt.Sprintf("%s.t", ms.TargetKeyspace), "from": "c1", "to": "c2", }, @@ -2369,7 +2747,7 @@ func TestCreateLookupVindexFailures(t *testing.T) { "xxhash": { Type: "lookup_unique", Params: map[string]string{ - "table": "targetks.t", + "table": fmt.Sprintf("%s.t", ms.TargetKeyspace), "from": "c1", "to": "c2", }, @@ -2385,7 +2763,7 @@ func TestCreateLookupVindexFailures(t *testing.T) { }, }, }, - err: "a conflicting vindex named xxhash already exists in the targetks keyspace", + err: fmt.Sprintf("a conflicting vindex named xxhash already exists in the %s keyspace", ms.TargetKeyspace), }, { description: "source table not in vschema", @@ -2400,7 +2778,42 @@ func TestCreateLookupVindexFailures(t *testing.T) { }, }, }, - err: "table other not found in the targetks keyspace", + err: fmt.Sprintf("table other not found in the %s keyspace", ms.TargetKeyspace), + }, + { + description: "workflow creation error", + input: &vschemapb.Keyspace{ + Vindexes: map[string]*vschemapb.Vindex{ + "v2": { + Type: "consistent_lookup_unique", + Params: map[string]string{ + "table": fmt.Sprintf("%s.t1_lkp", ms.TargetKeyspace), + "from": "c1", + "to": "keyspace_id", + }, + }, + }, + Tables: map[string]*vschemapb.Table{ + "t2": { + ColumnVindexes: []*vschemapb.ColumnVindex{{ + Name: "v2", + Column: "c2", + }}, + }, + }, + }, + vrepExecQueries: []string{ + "CREATE TABLE `t1_lkp` (\n`c1` INT,\n `keyspace_id` varbinary(128),\n PRIMARY KEY (`c1`)\n)", + }, + fetchAsAllPrivsQueries: []string{ + "select 1 from `t1_lkp` limit 1", + }, + createRequest: &createVReplicationWorkflowRequestResponse{ + req: nil, // We don't care about defining it in this case + res: &tabletmanagerdatapb.CreateVReplicationWorkflowResponse{}, + err: errors.New("we gots us an error"), + }, + err: "we gots us an error", }, } for _, tcase := range testcases { @@ -2410,10 +2823,43 @@ func TestCreateLookupVindexFailures(t *testing.T) { Keyspace: ms.TargetKeyspace, Vindex: tcase.input, } + if len(tcase.schemaAdditions) > 0 { + ogs := env.tmc.schema + defer func() { + env.tmc.schema = ogs + }() + // The tables are created in the target keyspace. + for _, tbl := range tcase.schemaAdditions { + env.tmc.schema[ms.TargetKeyspace+"."+tbl.Name] = &tabletmanagerdatapb.SchemaDefinition{ + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{tbl}, + } + } + } + for _, tablet := range env.tablets { + if tablet.Keyspace == ms.TargetKeyspace { + for _, vrq := range tcase.vrepExecQueries { + env.tmc.expectVRQuery(int(tablet.Alias.Uid), vrq, &sqltypes.Result{}) + } + for _, q := range tcase.fetchAsAllPrivsQueries { + env.tmc.expectFetchAsAllPrivsQuery(int(tablet.Alias.Uid), q, &sqltypes.Result{}) + } + if tcase.createRequest != nil { + env.tmc.expectCreateVReplicationWorkflowRequest(tablet.Alias.Uid, tcase.createRequest) + } + } + } _, err := env.ws.LookupVindexCreate(ctx, req) if !strings.Contains(err.Error(), tcase.err) { t.Errorf("CreateLookupVindex(%s) err: %v, must contain %v", tcase.description, err, tcase.err) } + // Confirm that the original vschema where the vindex would + // be created is still in place -- since the workflow + // creation failed in each test case. That vindex is created + // in the target keyspace based on the MaterializeSettings + // definition. + cvs, err := env.ws.ts.GetVSchema(ctx, ms.TargetKeyspace) + require.NoError(t, err) + require.True(t, proto.Equal(vs, cvs), "expected: %+v, got: %+v", vs, cvs) }) } } @@ -2683,12 +3129,16 @@ func TestKeyRangesEqualOptimization(t *testing.T) { if tablet.Keyspace != targetKs || tablet.Type != topodatapb.TabletType_PRIMARY { continue } + env.tmc.expectFetchAsAllPrivsQuery(int(tablet.Alias.Uid), getNonEmptyTable, &sqltypes.Result{}) // If we are doing a partial MoveTables, we will only perform the workflow // stream creation / INSERT statment on the shard(s) we're migrating. if len(tc.moveTablesReq.SourceShards) > 0 && !slices.Contains(tc.moveTablesReq.SourceShards, tablet.Shard) { continue } - env.tmc.expectCreateVReplicationWorkflowRequest(tablet.Alias.Uid, tc.wantReqs[tablet.Alias.Uid]) + reqRes := &createVReplicationWorkflowRequestResponse{ + req: tc.wantReqs[tablet.Alias.Uid], + } + env.tmc.expectCreateVReplicationWorkflowRequest(tablet.Alias.Uid, reqRes) } mz := &materializer{ @@ -2715,3 +3165,121 @@ func TestKeyRangesEqualOptimization(t *testing.T) { }) } } + +func TestValidateEmptyTables(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ts := memorytopo.NewServer(ctx, "zone1") + defer ts.Close() + + ks := "test_keyspace" + shard1 := "-40" + shard2 := "40-80" + shard3 := "80-" + err := ts.CreateKeyspace(ctx, ks, &topodatapb.Keyspace{}) + require.NoError(t, err) + + err = ts.CreateShard(ctx, ks, shard1) + require.NoError(t, err) + err = ts.CreateShard(ctx, ks, shard2) + require.NoError(t, err) + err = ts.CreateShard(ctx, ks, shard3) + require.NoError(t, err) + + tablet1 := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: ks, + Shard: shard1, + } + tablet2 := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 200, + }, + Keyspace: ks, + Shard: shard2, + } + tablet3 := &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 300, + }, + Keyspace: ks, + Shard: shard3, + } + err = ts.CreateTablet(ctx, tablet1) + require.NoError(t, err) + err = ts.CreateTablet(ctx, tablet2) + require.NoError(t, err) + err = ts.CreateTablet(ctx, tablet3) + require.NoError(t, err) + + s1, err := ts.UpdateShardFields(ctx, ks, shard1, func(si *topo.ShardInfo) error { + si.Shard.PrimaryAlias = tablet1.Alias + return nil + }) + require.NoError(t, err) + s2, err := ts.UpdateShardFields(ctx, ks, shard2, func(si *topo.ShardInfo) error { + si.Shard.PrimaryAlias = tablet2.Alias + return nil + }) + require.NoError(t, err) + s3, err := ts.UpdateShardFields(ctx, ks, shard3, func(si *topo.ShardInfo) error { + si.Shard.PrimaryAlias = tablet3.Alias + return nil + }) + require.NoError(t, err) + + tableSettings := []*vtctldatapb.TableMaterializeSettings{ + { + TargetTable: "table1", + }, + { + TargetTable: "table2", + }, + { + TargetTable: "table3", + }, + } + + tmc := newTestMaterializerTMClient(ks, []string{shard1, shard2, shard3}, tableSettings) + + table1Query := "select 1 from `table1` limit 1" + table2Query := "select 1 from `table2` limit 1" + table3Query := "select 1 from `table3` limit 1" + nonEmptyTableResult := &sqltypes.Result{Rows: []sqltypes.Row{{sqltypes.NewInt64(1)}}} + + tmc.expectFetchAsAllPrivsQuery(int(tablet1.Alias.Uid), table1Query, &sqltypes.Result{}) + tmc.expectFetchAsAllPrivsQuery(int(tablet2.Alias.Uid), table1Query, &sqltypes.Result{}) + tmc.expectFetchAsAllPrivsQuery(int(tablet3.Alias.Uid), table1Query, nonEmptyTableResult) + tmc.expectFetchAsAllPrivsQuery(int(tablet1.Alias.Uid), table2Query, &sqltypes.Result{}) + tmc.expectFetchAsAllPrivsQuery(int(tablet2.Alias.Uid), table2Query, &sqltypes.Result{}) + tmc.expectFetchAsAllPrivsQuery(int(tablet3.Alias.Uid), table2Query, &sqltypes.Result{}) + tmc.expectFetchAsAllPrivsQuery(int(tablet1.Alias.Uid), table3Query, nonEmptyTableResult) + tmc.expectFetchAsAllPrivsQuery(int(tablet2.Alias.Uid), table3Query, nonEmptyTableResult) + tmc.expectFetchAsAllPrivsQuery(int(tablet3.Alias.Uid), table3Query, nonEmptyTableResult) + + ms := &vtctldatapb.MaterializeSettings{ + TargetKeyspace: ks, + TableSettings: tableSettings, + } + + mz := &materializer{ + ctx: ctx, + ts: ts, + sourceTs: ts, + tmc: tmc, + ms: ms, + targetShards: []*topo.ShardInfo{s1, s2, s3}, + } + + err = mz.validateEmptyTables() + + assert.ErrorContains(t, err, "table1") + assert.NotContains(t, err.Error(), "table2") + // Check if the error message doesn't include duplicate tables + assert.Equal(t, strings.Count(err.Error(), "table3"), 1) +} diff --git a/go/vt/vtctl/workflow/mount_test.go b/go/vt/vtctl/workflow/mount_test.go new file mode 100644 index 00000000000..2fec275e4cb --- /dev/null +++ b/go/vt/vtctl/workflow/mount_test.go @@ -0,0 +1,77 @@ +/* +Copyright 2024 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 workflow + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" + "vitess.io/vitess/go/vt/topo/memorytopo" + "vitess.io/vitess/go/vt/vtenv" +) + +// TestMount tests various Mount-related methods. +func TestMount(t *testing.T) { + const ( + extCluster = "extcluster" + topoType = "etcd2" + topoServer = "localhost:2379" + topoRoot = "/vitess/global" + ) + ctx := context.Background() + ts := memorytopo.NewServer(ctx, "cell") + tmc := &fakeTMC{} + s := NewServer(vtenv.NewTestEnv(), ts, tmc) + + resp, err := s.MountRegister(ctx, &vtctldatapb.MountRegisterRequest{ + Name: extCluster, + TopoType: topoType, + TopoServer: topoServer, + TopoRoot: topoRoot, + }) + require.NoError(t, err) + require.NotNil(t, resp) + + respList, err := s.MountList(ctx, &vtctldatapb.MountListRequest{}) + require.NoError(t, err) + require.NotNil(t, respList) + require.Equal(t, []string{extCluster}, respList.Names) + + respShow, err := s.MountShow(ctx, &vtctldatapb.MountShowRequest{ + Name: extCluster, + }) + require.NoError(t, err) + require.NotNil(t, respShow) + require.Equal(t, extCluster, respShow.Name) + require.Equal(t, topoType, respShow.TopoType) + require.Equal(t, topoServer, respShow.TopoServer) + require.Equal(t, topoRoot, respShow.TopoRoot) + + respUnregister, err := s.MountUnregister(ctx, &vtctldatapb.MountUnregisterRequest{ + Name: extCluster, + }) + require.NoError(t, err) + require.NotNil(t, respUnregister) + + respList, err = s.MountList(ctx, &vtctldatapb.MountListRequest{}) + require.NoError(t, err) + require.NotNil(t, respList) + require.Nil(t, respList.Names) +} diff --git a/go/vt/vtctl/workflow/resharder.go b/go/vt/vtctl/workflow/resharder.go index 4f4ed34963a..57c860bdfaf 100644 --- a/go/vt/vtctl/workflow/resharder.go +++ b/go/vt/vtctl/workflow/resharder.go @@ -21,13 +21,15 @@ import ( "context" "fmt" "slices" + "strings" "sync" "time" - "vitess.io/vitess/go/textutil" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/key" + "vitess.io/vitess/go/vt/proto/vtctldata" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topotools" @@ -58,6 +60,7 @@ type resharder struct { stopAfterCopy bool onDDL string deferSecondaryKeys bool + workflowOptions *vtctldata.WorkflowOptions } type refStream struct { @@ -69,7 +72,14 @@ type refStream struct { workflowSubType binlogdatapb.VReplicationWorkflowSubType } -func (s *Server) buildResharder(ctx context.Context, keyspace, workflow string, sources, targets []string, cell, tabletTypes string) (*resharder, error) { +func (s *Server) buildResharder(ctx context.Context, req *vtctldata.ReshardCreateRequest) (*resharder, error) { + keyspace := req.GetKeyspace() + workflow := req.GetWorkflow() + cell := strings.Join(req.GetCells(), ",") + tabletTypes := discovery.BuildTabletTypesString(req.GetTabletTypes(), req.GetTabletSelectionPreference()) + sources := req.GetSourceShards() + targets := req.GetTargetShards() + rs := &resharder{ s: s, keyspace: keyspace, @@ -78,6 +88,7 @@ func (s *Server) buildResharder(ctx context.Context, keyspace, workflow string, targetPrimaries: make(map[string]*topo.TabletInfo), cell: cell, tabletTypes: tabletTypes, + workflowOptions: req.GetWorkflowOptions(), } for _, shard := range sources { si, err := s.ts.GetShard(ctx, keyspace, shard) @@ -283,6 +294,11 @@ func (rs *resharder) createStreams(ctx context.Context) error { // Clone excludeRules to prevent data races. copyExcludeRules := slices.Clone(excludeRules) + optionsJSON, err := getOptionsJSON(rs.workflowOptions) + if err != nil { + return err + } + optionsJSON = fmt.Sprintf("'%s'", optionsJSON) for _, source := range rs.sourceShards { if !key.KeyRangeIntersect(target.KeyRange, source.KeyRange) { continue @@ -303,14 +319,14 @@ func (rs *resharder) createStreams(ctx context.Context) error { ig.AddRow(rs.workflow, bls, "", rs.cell, rs.tabletTypes, binlogdatapb.VReplicationWorkflowType_Reshard, binlogdatapb.VReplicationWorkflowSubType_None, - rs.deferSecondaryKeys) + rs.deferSecondaryKeys, optionsJSON) } for _, rstream := range rs.refStreams { ig.AddRow(rstream.workflow, rstream.bls, "", rstream.cell, rstream.tabletTypes, rstream.workflowType, rstream.workflowSubType, - rs.deferSecondaryKeys) + rs.deferSecondaryKeys, optionsJSON) } query := ig.String() if _, err := rs.s.tmc.VReplicationExec(ctx, targetPrimary.Tablet, query); err != nil { @@ -331,10 +347,7 @@ func (rs *resharder) startStreams(ctx context.Context) error { // that we've created on the new shards as we're migrating them. req := &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ AllWorkflows: true, - State: binlogdatapb.VReplicationWorkflowState_Running, - // We don't want to update anything else so use simulated NULLs. - Message: textutil.SimulatedNullString, - StopPosition: textutil.SimulatedNullString, + State: ptr.Of(binlogdatapb.VReplicationWorkflowState_Running), } if _, err := rs.s.tmc.UpdateVReplicationWorkflows(ctx, targetPrimary.Tablet, req); err != nil { return vterrors.Wrapf(err, "UpdateVReplicationWorkflows(%v, 'state='%s')", diff --git a/go/vt/vtctl/workflow/resharder_test.go b/go/vt/vtctl/workflow/resharder_test.go index 1bb2f065e0f..6353f36db9f 100644 --- a/go/vt/vtctl/workflow/resharder_test.go +++ b/go/vt/vtctl/workflow/resharder_test.go @@ -84,7 +84,7 @@ func TestReshardCreate(t *testing.T) { { Id: 1, Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID}, - SourceShard: "targetks/0", Position: position, Status: "Running", Info: "VStream Lag: 0s", + SourceShard: "targetks/0", Position: gtid(position), Status: "Running", Info: "VStream Lag: 0s", }, }, }, @@ -93,7 +93,7 @@ func TestReshardCreate(t *testing.T) { { Id: 1, Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID + tabletUIDStep}, - SourceShard: "targetks/0", Position: position, Status: "Running", Info: "VStream Lag: 0s", + SourceShard: "targetks/0", Position: gtid(position), Status: "Running", Info: "VStream Lag: 0s", }, }, }, diff --git a/go/vt/vtctl/workflow/server.go b/go/vt/vtctl/workflow/server.go index 5b6c3f05343..1828b0af814 100644 --- a/go/vt/vtctl/workflow/server.go +++ b/go/vt/vtctl/workflow/server.go @@ -29,14 +29,18 @@ import ( "text/template" "time" + "github.com/google/uuid" "golang.org/x/exp/maps" "golang.org/x/sync/errgroup" "golang.org/x/sync/semaphore" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" - "vitess.io/vitess/go/mysql/sqlerror" + "vitess.io/vitess/go/constants/sidecar" "vitess.io/vitess/go/protoutil" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/sets" "vitess.io/vitess/go/sqlescape" "vitess.io/vitess/go/sqltypes" @@ -66,7 +70,6 @@ import ( binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" - "vitess.io/vitess/go/vt/proto/topodata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vschemapb "vitess.io/vitess/go/vt/proto/vschema" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" @@ -156,18 +159,26 @@ type Server struct { ts *topo.Server tmc tmclient.TabletManagerClient // Limit the number of concurrent background goroutines if needed. - sem *semaphore.Weighted - env *vtenv.Environment + sem *semaphore.Weighted + env *vtenv.Environment + options serverOptions } // NewServer returns a new server instance with the given topo.Server and // TabletManagerClient. -func NewServer(env *vtenv.Environment, ts *topo.Server, tmc tmclient.TabletManagerClient) *Server { - return &Server{ +func NewServer(env *vtenv.Environment, ts *topo.Server, tmc tmclient.TabletManagerClient, opts ...ServerOption) *Server { + s := &Server{ ts: ts, tmc: tmc, env: env, } + for _, o := range opts { + o.apply(&s.options) + } + if s.options.logger == nil { + s.options.logger = logutil.NewConsoleLogger() // Use the default system logger + } + return s } func (s *Server) SQLParser() *sqlparser.Parser { @@ -294,7 +305,8 @@ func (s *Server) GetCellsWithShardReadsSwitched( // keyspace. func (s *Server) GetCellsWithTableReadsSwitched( ctx context.Context, - keyspace string, + sourceKeyspace string, + targetKeyspace string, table string, tabletType topodatapb.TabletType, ) (cellsSwitched []string, cellsNotSwitched []string, err error) { @@ -324,18 +336,18 @@ func (s *Server) GetCellsWithTableReadsSwitched( ) for _, rule := range srvVSchema.RoutingRules.Rules { - ruleName := fmt.Sprintf("%s.%s@%s", keyspace, table, strings.ToLower(tabletType.String())) + ruleName := fmt.Sprintf("%s.%s@%s", sourceKeyspace, table, strings.ToLower(tabletType.String())) if rule.FromTable == ruleName { found = true for _, to := range rule.ToTables { ks, err := getKeyspace(to) if err != nil { - log.Errorf(err.Error()) + s.Logger().Errorf(err.Error()) return nil, nil, err } - if ks == keyspace { + if ks != sourceKeyspace { switched = true break // if one table in the workflow switched, we are done. } @@ -852,9 +864,9 @@ ORDER BY } if stream.Id > streamLog.StreamId { - log.Warningf("Found stream log for nonexistent stream: %+v", streamLog) - // This can happen on manual/failed workflow cleanup so keep going. - continue + s.Logger().Warningf("Found stream log for nonexistent stream: %+v", streamLog) + // This can happen on manual/failed workflow cleanup so move to the next log. + break } // stream.Id == streamLog.StreamId @@ -939,10 +951,14 @@ ORDER BY }, nil } +func (s *Server) GetWorkflowState(ctx context.Context, targetKeyspace, workflowName string) (*trafficSwitcher, *State, error) { + return s.getWorkflowState(ctx, targetKeyspace, workflowName) +} + func (s *Server) getWorkflowState(ctx context.Context, targetKeyspace, workflowName string) (*trafficSwitcher, *State, error) { ts, err := s.buildTrafficSwitcher(ctx, targetKeyspace, workflowName) if err != nil { - log.Errorf("buildTrafficSwitcher failed: %v", err) + s.Logger().Errorf("buildTrafficSwitcher failed: %v", err) return nil, nil, err } @@ -1008,12 +1024,12 @@ func (s *Server) getWorkflowState(ctx context.Context, targetKeyspace, workflowN } } } else { - state.RdonlyCellsSwitched, state.RdonlyCellsNotSwitched, err = s.GetCellsWithTableReadsSwitched(ctx, targetKeyspace, table, topodatapb.TabletType_RDONLY) + state.RdonlyCellsSwitched, state.RdonlyCellsNotSwitched, err = s.GetCellsWithTableReadsSwitched(ctx, sourceKeyspace, targetKeyspace, table, topodatapb.TabletType_RDONLY) if err != nil { return nil, nil, err } - state.ReplicaCellsSwitched, state.ReplicaCellsNotSwitched, err = s.GetCellsWithTableReadsSwitched(ctx, targetKeyspace, table, topodatapb.TabletType_REPLICA) + state.ReplicaCellsSwitched, state.ReplicaCellsNotSwitched, err = s.GetCellsWithTableReadsSwitched(ctx, sourceKeyspace, targetKeyspace, table, topodatapb.TabletType_REPLICA) if err != nil { return nil, nil, err } @@ -1022,10 +1038,11 @@ func (s *Server) getWorkflowState(ctx context.Context, targetKeyspace, workflowN return nil, nil, err } for _, table := range ts.Tables() { - rr := globalRules[table] - // If a rule exists for the table and points to the target keyspace, then - // writes have been switched. - if len(rr) > 0 && rr[0] == fmt.Sprintf("%s.%s", targetKeyspace, table) { + // If a rule for the primary tablet type exists for any table and points to the target keyspace, + // then writes have been switched. + ruleKey := fmt.Sprintf("%s.%s", sourceKeyspace, table) + rr := globalRules[ruleKey] + if len(rr) > 0 && rr[0] != ruleKey { state.WritesSwitched = true break } @@ -1121,22 +1138,33 @@ func (s *Server) LookupVindexCreate(ctx context.Context, req *vtctldatapb.Lookup span.Annotate("cells", req.Cells) span.Annotate("tablet_types", req.TabletTypes) - ms, sourceVSchema, targetVSchema, err := s.prepareCreateLookup(ctx, req.Workflow, req.Keyspace, req.Vindex, req.ContinueAfterCopyWithOwner) + ms, sourceVSchema, targetVSchema, cancelFunc, err := s.prepareCreateLookup(ctx, req.Workflow, req.Keyspace, req.Vindex, req.ContinueAfterCopyWithOwner) if err != nil { return nil, err } + if err := s.ts.SaveVSchema(ctx, ms.TargetKeyspace, targetVSchema); err != nil { - return nil, err + return nil, vterrors.Wrapf(err, "failed to save updated vschema '%v' in the %s keyspace", + targetVSchema, ms.TargetKeyspace) } - ms.TabletTypes = topoproto.MakeStringTypeCSV(req.TabletTypes) ms.TabletSelectionPreference = req.TabletSelectionPreference if err := s.Materialize(ctx, ms); err != nil { + if cancelFunc != nil { + if cerr := cancelFunc(); cerr != nil { + err = vterrors.Wrapf(err, "failed to restore original vschema '%v' in the %s keyspace: %v", + targetVSchema, ms.TargetKeyspace, cerr) + } + } return nil, err } - if err := s.ts.SaveVSchema(ctx, req.Keyspace, sourceVSchema); err != nil { - return nil, err + if ms.SourceKeyspace != ms.TargetKeyspace { + if err := s.ts.SaveVSchema(ctx, ms.SourceKeyspace, sourceVSchema); err != nil { + return nil, vterrors.Wrapf(err, "failed to save updated vschema '%v' in the %s keyspace", + sourceVSchema, ms.SourceKeyspace) + } } + if err := s.ts.RebuildSrvVSchema(ctx, nil); err != nil { return nil, err } @@ -1272,6 +1300,21 @@ func (s *Server) Materialize(ctx context.Context, ms *vtctldatapb.MaterializeSet cells[i] = strings.TrimSpace(cells[i]) } + switch { + case len(ms.ReferenceTables) == 0 && len(ms.TableSettings) == 0: + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "either --table-settings or --reference-tables must be specified") + case len(ms.ReferenceTables) > 0 && len(ms.TableSettings) > 0: + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "cannot specify both --table-settings and --reference-tables") + } + + for _, table := range ms.ReferenceTables { + ms.TableSettings = append(ms.TableSettings, &vtctldatapb.TableMaterializeSettings{ + TargetTable: table, + SourceExpression: fmt.Sprintf("select * from %s", table), + CreateDdl: createDDLAsCopyDropForeignKeys, + }) + } + err = mz.createWorkflowStreams(&tabletmanagerdatapb.CreateVReplicationWorkflowRequest{ Workflow: ms.Workflow, Cells: strings.Split(ms.Cell, ","), @@ -1317,6 +1360,21 @@ func (s *Server) moveTablesCreate(ctx context.Context, req *vtctldatapb.MoveTabl sourceTopo = s.ts ) + if req.GetWorkflowOptions() != nil && req.WorkflowOptions.GlobalKeyspace != "" { + // Confirm that the keyspace exists and it is unsharded. + gvs, err := s.ts.GetVSchema(ctx, req.WorkflowOptions.GlobalKeyspace) + if err != nil { + if topo.IsErrType(err, topo.NoNode) { + return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "global-keyspace %s does not exist", req.WorkflowOptions.GlobalKeyspace) + } + return nil, vterrors.Wrapf(err, "failed to validate global-keyspace") + } + if gvs.Sharded { + return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "global-keyspace %s is sharded and thus cannot be used for global resources", + req.WorkflowOptions.GlobalKeyspace) + } + } + // When the source is an external cluster mounted using the Mount command. if req.ExternalClusterName != "" { externalTopo, err = s.ts.OpenExternalVitessClusterServer(ctx, req.ExternalClusterName) @@ -1324,7 +1382,7 @@ func (s *Server) moveTablesCreate(ctx context.Context, req *vtctldatapb.MoveTabl return nil, err } sourceTopo = externalTopo - log.Infof("Successfully opened external topo: %+v", externalTopo) + s.Logger().Infof("Successfully opened external topo: %+v", externalTopo) } var vschema *vschemapb.Keyspace @@ -1381,15 +1439,18 @@ func (s *Server) moveTablesCreate(ctx context.Context, req *vtctldatapb.MoveTabl if len(tables) == 0 { return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "no tables to move") } - log.Infof("Found tables to move: %s", strings.Join(tables, ",")) + s.Logger().Infof("Found tables to move: %s", strings.Join(tables, ",")) if !vschema.Sharded { - // Save the original in case we need to restore it for a late failure - // in the defer(). + // Save the original in case we need to restore it for a late failure in + // the defer(). origVSchema = vschema.CloneVT() if err := s.addTablesToVSchema(ctx, sourceKeyspace, vschema, tables, externalTopo == nil); err != nil { return nil, err } + if err := s.ts.SaveVSchema(ctx, targetKeyspace, vschema); err != nil { + return nil, err + } } ms := &vtctldatapb.MaterializeSettings{ Workflow: req.Workflow, @@ -1463,7 +1524,7 @@ func (s *Server) moveTablesCreate(ctx context.Context, req *vtctldatapb.MoveTabl ctx, workflowUnlock, lockErr := s.ts.LockName(ctx, lockName, "MoveTablesCreate") if lockErr != nil { ts.Logger().Errorf("Locking the workflow %s failed: %v", lockName, lockErr) - return nil, lockErr + return nil, vterrors.Wrapf(lockErr, "failed to lock the %s workflow", lockName) } defer workflowUnlock(&err) ctx, targetUnlock, lockErr := sw.lockKeyspace(ctx, ts.TargetKeyspaceName(), "MoveTablesCreate") @@ -1500,11 +1561,6 @@ func (s *Server) moveTablesCreate(ctx context.Context, req *vtctldatapb.MoveTabl if err := s.setupInitialRoutingRules(ctx, req, mz, tables); err != nil { return nil, err } - - // We added to the vschema. - if err := s.ts.SaveVSchema(ctx, targetKeyspace, vschema); err != nil { - return nil, err - } } if isStandardMoveTables() { // Non-standard ones do not use shard scoped mechanisms if err := s.setupInitialDeniedTables(ctx, ts); err != nil { @@ -1537,12 +1593,12 @@ func (s *Server) moveTablesCreate(ctx context.Context, req *vtctldatapb.MoveTabl return nil, err } if exists { - log.Errorf("Found a previous journal entry for %d", migrationID) + s.Logger().Errorf("Found a previous journal entry for %d", migrationID) msg := fmt.Sprintf("found an entry from a previous run for migration id %d in _vt.resharding_journal on tablets %s, ", migrationID, strings.Join(tablets, ",")) msg += fmt.Sprintf("please review and delete it before proceeding and then start the workflow using: MoveTables --workflow %s --target-keyspace %s start", req.Workflow, req.TargetKeyspace) - return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, msg) + return nil, vterrors.New(vtrpcpb.Code_INTERNAL, msg) } } @@ -1600,7 +1656,7 @@ func (s *Server) setupInitialRoutingRules(ctx context.Context, req *vtctldatapb. targetKeyspace := req.TargetKeyspace if req.NoRoutingRules { - log.Warningf("Found --no-routing-rules flag, not creating routing rules for workflow %s.%s", targetKeyspace, req.Workflow) + s.Logger().Warningf("Found --no-routing-rules flag, not creating routing rules for workflow %s.%s", targetKeyspace, req.Workflow) return nil } @@ -1613,7 +1669,7 @@ func (s *Server) setupInitialRoutingRules(ctx context.Context, req *vtctldatapb. } if mz.IsMultiTenantMigration() { - log.Infof("Setting up keyspace routing rules for workflow %s.%s", targetKeyspace, req.Workflow) + s.Logger().Infof("Setting up keyspace routing rules for workflow %s.%s", targetKeyspace, req.Workflow) // Note that you can never point the target keyspace to the source keyspace in a multi-tenant migration // since the target takes write traffic for all tenants! routes := make(map[string]string) @@ -1665,6 +1721,15 @@ func (s *Server) MoveTablesComplete(ctx context.Context, req *vtctldatapb.MoveTa return nil, err } + // Lock the workflow while we complete it. + lockName := fmt.Sprintf("%s/%s", ts.TargetKeyspaceName(), ts.WorkflowName()) + ctx, workflowUnlock, lockErr := s.ts.LockName(ctx, lockName, "MoveTablesComplete") + if lockErr != nil { + ts.Logger().Errorf("Locking the workflow %s failed: %v", lockName, lockErr) + return nil, vterrors.Wrapf(lockErr, "failed to lock the %s workflow", lockName) + } + defer workflowUnlock(&err) + var summary string if req.DryRun { summary = fmt.Sprintf("Complete dry run results for workflow %s.%s at %v", req.TargetKeyspace, req.Workflow, time.Now().UTC().Format(time.RFC822)) @@ -1730,11 +1795,10 @@ func (s *Server) ReshardCreate(ctx context.Context, req *vtctldatapb.ReshardCrea if err := s.ts.ValidateSrvKeyspace(ctx, keyspace, strings.Join(cells, ",")); err != nil { err2 := vterrors.Wrapf(err, "SrvKeyspace for keyspace %s is corrupt for cell(s) %s", keyspace, cells) - log.Errorf("%v", err2) + s.Logger().Errorf("%v", err2) return nil, err } - tabletTypesStr := discovery.BuildTabletTypesString(req.TabletTypes, req.TabletSelectionPreference) - rs, err := s.buildResharder(ctx, keyspace, req.Workflow, req.SourceShards, req.TargetShards, strings.Join(cells, ","), tabletTypesStr) + rs, err := s.buildResharder(ctx, req) if err != nil { return nil, vterrors.Wrap(err, "buildResharder") } @@ -1755,7 +1819,7 @@ func (s *Server) ReshardCreate(ctx context.Context, req *vtctldatapb.ReshardCrea return nil, vterrors.Wrap(err, "startStreams") } } else { - log.Warningf("Streams will not be started since --auto-start is set to false") + s.Logger().Warningf("Streams will not be started since --auto-start is set to false") } return s.WorkflowStatus(ctx, &vtctldatapb.WorkflowStatusRequest{ Keyspace: req.Keyspace, @@ -1780,9 +1844,25 @@ func (s *Server) VDiffCreate(ctx context.Context, req *vtctldatapb.VDiffCreateRe span.Annotate("tables", req.Tables) span.Annotate("auto_retry", req.AutoRetry) span.Annotate("max_diff_duration", req.MaxDiffDuration) + if req.AutoStart != nil { + span.Annotate("auto_start", req.GetAutoStart()) + } + + var err error + req.Uuid = strings.TrimSpace(req.Uuid) + if req.Uuid == "" { // Generate a UUID + req.Uuid = uuid.New().String() + } else { // Validate UUID if provided + if err = uuid.Validate(req.Uuid); err != nil { + return nil, vterrors.Wrapf(err, "invalid UUID provided: %s", req.Uuid) + } + } tabletTypesStr := discovery.BuildTabletTypesString(req.TabletTypes, req.TabletSelectionPreference) + if req.Limit == 0 { // This would produce no useful results + req.Limit = math.MaxInt64 + } // This is a pointer so there's no ZeroValue in the message // and an older v18 client will not provide it. if req.MaxDiffDuration == nil { @@ -1792,12 +1872,20 @@ func (s *Server) VDiffCreate(ctx context.Context, req *vtctldatapb.VDiffCreateRe // client should always provide them, but we check anyway to // be safe. if req.FilteredReplicationWaitTime == nil { - req.FilteredReplicationWaitTime = &vttimepb.Duration{} + // A value of 0 is not valid as the vdiff will never succeed. + req.FilteredReplicationWaitTime = &vttimepb.Duration{ + Seconds: int64(DefaultTimeout.Seconds()), + } } if req.WaitUpdateInterval == nil { req.WaitUpdateInterval = &vttimepb.Duration{} } + autoStart := true + if req.AutoStart != nil { + autoStart = req.GetAutoStart() + } + options := &tabletmanagerdatapb.VDiffOptions{ PickerOptions: &tabletmanagerdatapb.VDiffPickerOptions{ TabletTypes: tabletTypesStr, @@ -1812,11 +1900,13 @@ func (s *Server) VDiffCreate(ctx context.Context, req *vtctldatapb.VDiffCreateRe MaxExtraRowsToCompare: req.MaxExtraRowsToCompare, UpdateTableStats: req.UpdateTableStats, MaxDiffSeconds: req.MaxDiffDuration.Seconds, + AutoStart: &autoStart, }, ReportOptions: &tabletmanagerdatapb.VDiffReportOptions{ - OnlyPks: req.OnlyPKs, - DebugQuery: req.DebugQuery, - MaxSampleRows: req.MaxReportSampleRows, + OnlyPks: req.OnlyPKs, + DebugQuery: req.DebugQuery, + MaxSampleRows: req.MaxReportSampleRows, + RowDiffColumnTruncateAt: req.RowDiffColumnTruncateAt, }, } @@ -1842,7 +1932,7 @@ func (s *Server) VDiffCreate(ctx context.Context, req *vtctldatapb.VDiffCreateRe return nil, err } if workflowStatus != binlogdatapb.VReplicationWorkflowState_Running { - log.Infof("Workflow %s.%s is not running, cannot start VDiff in state %s", req.TargetKeyspace, req.Workflow, workflowStatus) + s.Logger().Infof("Workflow %s.%s is not running, cannot start VDiff in state %s", req.TargetKeyspace, req.Workflow, workflowStatus) return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "not all streams are running in workflow %s.%s", req.TargetKeyspace, req.Workflow) } @@ -1852,7 +1942,7 @@ func (s *Server) VDiffCreate(ctx context.Context, req *vtctldatapb.VDiffCreateRe return err }) if err != nil { - log.Errorf("Error executing vdiff create action: %v", err) + s.Logger().Errorf("Error executing vdiff create action: %v", err) return nil, err } @@ -1887,7 +1977,7 @@ func (s *Server) VDiffDelete(ctx context.Context, req *vtctldatapb.VDiffDeleteRe return err }) if err != nil { - log.Errorf("Error executing vdiff delete action: %v", err) + s.Logger().Errorf("Error executing vdiff delete action: %v", err) return nil, err } @@ -1899,9 +1989,12 @@ func (s *Server) VDiffResume(ctx context.Context, req *vtctldatapb.VDiffResumeRe span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffResume") defer span.Finish() + targetShards := req.GetTargetShards() + span.Annotate("keyspace", req.TargetKeyspace) span.Annotate("workflow", req.Workflow) span.Annotate("uuid", req.Uuid) + span.Annotate("target_shards", targetShards) tabletreq := &tabletmanagerdatapb.VDiffRequest{ Keyspace: req.TargetKeyspace, @@ -1915,12 +2008,18 @@ func (s *Server) VDiffResume(ctx context.Context, req *vtctldatapb.VDiffResumeRe return nil, err } + if len(targetShards) > 0 { + if err := applyTargetShards(ts, targetShards); err != nil { + return nil, err + } + } + err = ts.ForAllTargets(func(target *MigrationTarget) error { _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) return err }) if err != nil { - log.Errorf("Error executing vdiff resume action: %v", err) + s.Logger().Errorf("Error executing vdiff resume action: %v", err) return nil, err } @@ -1960,7 +2059,7 @@ func (s *Server) VDiffShow(ctx context.Context, req *vtctldatapb.VDiffShowReques return err }) if output.err != nil { - log.Errorf("Error executing vdiff show action: %v", output.err) + s.Logger().Errorf("Error executing vdiff show action: %v", output.err) return nil, output.err } return &vtctldatapb.VDiffShowResponse{ @@ -1973,9 +2072,12 @@ func (s *Server) VDiffStop(ctx context.Context, req *vtctldatapb.VDiffStopReques span, ctx := trace.NewSpan(ctx, "workflow.Server.VDiffStop") defer span.Finish() + targetShards := req.GetTargetShards() + span.Annotate("keyspace", req.TargetKeyspace) span.Annotate("workflow", req.Workflow) span.Annotate("uuid", req.Uuid) + span.Annotate("target_shards", targetShards) tabletreq := &tabletmanagerdatapb.VDiffRequest{ Keyspace: req.TargetKeyspace, @@ -1989,12 +2091,18 @@ func (s *Server) VDiffStop(ctx context.Context, req *vtctldatapb.VDiffStopReques return nil, err } + if len(targetShards) > 0 { + if err := applyTargetShards(ts, targetShards); err != nil { + return nil, err + } + } + err = ts.ForAllTargets(func(target *MigrationTarget) error { _, err := s.tmc.VDiff(ctx, target.GetPrimary().Tablet, tabletreq) return err }) if err != nil { - log.Errorf("Error executing vdiff stop action: %v", err) + s.Logger().Errorf("Error executing vdiff stop action: %v", err) return nil, err } @@ -2016,7 +2124,7 @@ func (s *Server) WorkflowDelete(ctx context.Context, req *vtctldatapb.WorkflowDe ts, state, err := s.getWorkflowState(ctx, req.GetKeyspace(), req.GetWorkflow()) if err != nil { - log.Errorf("failed to get VReplication workflow state for %s.%s: %v", req.GetKeyspace(), req.GetWorkflow(), err) + s.Logger().Errorf("failed to get VReplication workflow state for %s.%s: %v", req.GetKeyspace(), req.GetWorkflow(), err) return nil, err } @@ -2027,6 +2135,15 @@ func (s *Server) WorkflowDelete(ctx context.Context, req *vtctldatapb.WorkflowDe } } + // Lock the workflow for deletion. + lockName := fmt.Sprintf("%s/%s", ts.TargetKeyspaceName(), ts.WorkflowName()) + ctx, workflowUnlock, lockErr := s.ts.LockName(ctx, lockName, "WorkflowDelete") + if lockErr != nil { + ts.Logger().Errorf("Locking the workflow %s failed: %v", lockName, lockErr) + return nil, vterrors.Wrapf(lockErr, "failed to lock the %s workflow", lockName) + } + defer workflowUnlock(&err) + if state.WorkflowType == TypeMigrate { _, err := s.finalizeMigrateWorkflow(ctx, ts, "", true, req.GetKeepData(), req.GetKeepRoutingRules(), false) return nil, err @@ -2047,6 +2164,39 @@ func (s *Server) WorkflowDelete(ctx context.Context, req *vtctldatapb.WorkflowDe s.optimizeCopyStateTable(tablet.Tablet) return res.Result, err } + + // Multi-tenant migrations delete only that tenant's records from the target tables + // in batches and we may not be able to complete that work before the timeout. We + // delete the workflow only after the cleanup work completes successfully so the + // workflow can be canceled multiple times if needed in order to fully cleanup + // all of the tenant's data that we had copied. + if ts.IsMultiTenantMigration() { + if ts.workflowType != binlogdatapb.VReplicationWorkflowType_MoveTables { // Should never happen + return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "unsupported workflow type %q for multi-tenant migration", + ts.workflowType) + } + // We need to delete the rows that the target tables would have for the tenant. + // We don't cleanup other related artifacts since they are not tied to the tenant. + if !req.GetKeepData() { + if err := s.deleteTenantData(ctx, ts, req.DeleteBatchSize); err != nil { + return nil, vterrors.Wrapf(err, "failed to fully delete all migrated data for tenant %s, please retry the operation", + ts.options.TenantId) + } + } + } else { + // Cleanup related data and artifacts. There are none for a LookupVindex workflow. + if ts.workflowType != binlogdatapb.VReplicationWorkflowType_CreateLookupIndex { + if _, err := s.dropTargets(ctx, ts, req.GetKeepData(), req.GetKeepRoutingRules(), false); err != nil { + if topo.IsErrType(err, topo.NoNode) { + return nil, vterrors.Wrapf(err, "%s keyspace does not exist", req.GetKeyspace()) + } + return nil, err + } + } + } + + // Now that we've succesfully cleaned up everything else, we can finally delete + // the workflow. delCtx, delCancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout*2) defer delCancel() res, err := vx.CallbackContext(delCtx, callback) @@ -2054,20 +2204,6 @@ func (s *Server) WorkflowDelete(ctx context.Context, req *vtctldatapb.WorkflowDe return nil, err } - if len(res) == 0 { - return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "the %s workflow does not exist in the %s keyspace", req.Workflow, req.Keyspace) - } - - // Cleanup related data and artifacts. There are none for a LookupVindex workflow. - if ts.workflowType != binlogdatapb.VReplicationWorkflowType_CreateLookupIndex { - if _, err := s.DropTargets(delCtx, ts, req.GetKeepData(), req.GetKeepRoutingRules(), false); err != nil { - if topo.IsErrType(err, topo.NoNode) { - return nil, vterrors.Wrapf(err, "%s keyspace does not exist", req.GetKeyspace()) - } - return nil, err - } - } - response := &vtctldatapb.WorkflowDeleteResponse{} response.Summary = fmt.Sprintf("Successfully cancelled the %s workflow in the %s keyspace", req.Workflow, req.Keyspace) details := make([]*vtctldatapb.WorkflowDeleteResponse_TabletInfo, 0, len(res)) @@ -2129,7 +2265,6 @@ func (s *Server) WorkflowStatus(ctx context.Context, req *vtctldatapb.WorkflowSt if err != nil { return nil, err } - // The stream key is target keyspace/tablet alias, e.g. 0/test-0000000100. // We sort the keys for intuitive and consistent output. streamKeys := make([]string, 0, len(workflow.ShardStreams)) @@ -2185,9 +2320,13 @@ func (s *Server) WorkflowStatus(ctx context.Context, req *vtctldatapb.WorkflowSt return resp, nil } -// GetCopyProgress returns the progress of all tables being copied in the -// workflow. +// GetCopyProgress returns the progress of all tables being copied in the workflow. func (s *Server) GetCopyProgress(ctx context.Context, ts *trafficSwitcher, state *State) (*copyProgress, error) { + if ts.workflowType == binlogdatapb.VReplicationWorkflowType_Migrate { + // The logic below expects the source primaries to be in the same cluster as the target. + // For now we don't report progress for Migrate workflows. + return nil, nil + } getTablesQuery := "select distinct table_name from _vt.copy_state cs, _vt.vreplication vr where vr.id = cs.vrepl_id and vr.id = %d" getRowCountQuery := "select table_name, table_rows, data_length from information_schema.tables where table_schema = %s and table_name in (%s)" tables := make(map[string]bool) @@ -2329,6 +2468,7 @@ func (s *Server) WorkflowUpdate(ctx context.Context, req *vtctldatapb.WorkflowUp span.Annotate("tablet_types", req.TabletRequest.TabletTypes) span.Annotate("on_ddl", req.TabletRequest.OnDdl) span.Annotate("state", req.TabletRequest.State) + span.Annotate("config_overrides", req.TabletRequest.ConfigOverrides) vx := vexec.NewVExec(req.Keyspace, req.TabletRequest.Workflow, s.ts, s.tmc, s.env.Parser()) callback := func(ctx context.Context, tablet *topo.TabletInfo) (*querypb.QueryResult, error) { @@ -2510,7 +2650,7 @@ func (s *Server) deleteWorkflowVDiffData(ctx context.Context, tablet *topodatapb Action: string(vdiff.DeleteAction), ActionArg: vdiff.AllActionArg, }); err != nil { - log.Errorf("Error deleting vdiff data for %s.%s workflow: %v", tablet.Keyspace, workflow, err) + s.Logger().Errorf("Error deleting vdiff data for %s.%s workflow: %v", tablet.Keyspace, workflow, err) } } @@ -2530,7 +2670,7 @@ func (s *Server) deleteWorkflowVDiffData(ctx context.Context, tablet *topodatapb func (s *Server) optimizeCopyStateTable(tablet *topodatapb.Tablet) { if s.sem != nil { if !s.sem.TryAcquire(1) { - log.Warningf("Deferring work to optimize the copy_state table on %q due to hitting the maximum concurrent background job limit.", + s.Logger().Warningf("Deferring work to optimize the copy_state table on %q due to hitting the maximum concurrent background job limit.", tablet.Alias.String()) return } @@ -2548,10 +2688,10 @@ func (s *Server) optimizeCopyStateTable(tablet *topodatapb.Tablet) { Query: []byte(sqlOptimizeTable), MaxRows: uint64(100), // always produces 1+rows with notes and status }); err != nil { - if sqlErr, ok := err.(*sqlerror.SQLError); ok && sqlErr.Num == sqlerror.ERNoSuchTable { // the table may not exist + if IsTableDidNotExistError(err) { return } - log.Warningf("Failed to optimize the copy_state table on %q: %v", tablet.Alias.String(), err) + s.Logger().Warningf("Failed to optimize the copy_state table on %q: %v", tablet.Alias.String(), err) } // This will automatically set the value to 1 or the current max value in the // table, whichever is greater. @@ -2560,15 +2700,15 @@ func (s *Server) optimizeCopyStateTable(tablet *topodatapb.Tablet) { Query: []byte(sqlResetAutoInc), MaxRows: uint64(0), }); err != nil { - log.Warningf("Failed to reset the auto_increment value for the copy_state table on %q: %v", + s.Logger().Warningf("Failed to reset the auto_increment value for the copy_state table on %q: %v", tablet.Alias.String(), err) } }() } -// DropTargets cleans up target tables, shards and denied tables if a MoveTables/Reshard -// is cancelled. -func (s *Server) DropTargets(ctx context.Context, ts *trafficSwitcher, keepData, keepRoutingRules, dryRun bool) (*[]string, error) { +// dropTargets cleans up target tables, shards and denied tables if a MoveTables/Reshard +// is canceled. +func (s *Server) dropTargets(ctx context.Context, ts *trafficSwitcher, keepData, keepRoutingRules, dryRun bool) (*[]string, error) { var err error ts.keepRoutingRules = keepRoutingRules var sw iswitcher @@ -2578,29 +2718,43 @@ func (s *Server) DropTargets(ctx context.Context, ts *trafficSwitcher, keepData, sw = &switcher{s: s, ts: ts} } - // Lock the workflow along with its source and target keyspaces. - lockName := fmt.Sprintf("%s/%s", ts.TargetKeyspaceName(), ts.WorkflowName()) - ctx, workflowUnlock, lockErr := s.ts.LockName(ctx, lockName, "DropTargets") - if lockErr != nil { - ts.Logger().Errorf("Locking the workflow %s failed: %v", lockName, lockErr) - } - defer workflowUnlock(&err) + // Lock the source and target keyspaces. ctx, sourceUnlock, lockErr := sw.lockKeyspace(ctx, ts.SourceKeyspaceName(), "DropTargets") if lockErr != nil { - ts.Logger().Errorf("Source LockKeyspace failed: %v", lockErr) - return nil, lockErr + return defaultErrorHandler(ts.Logger(), fmt.Sprintf("failed to lock the %s keyspace", ts.SourceKeyspaceName()), + lockErr) } defer sourceUnlock(&err) if ts.TargetKeyspaceName() != ts.SourceKeyspaceName() { lockCtx, targetUnlock, lockErr := sw.lockKeyspace(ctx, ts.TargetKeyspaceName(), "DropTargets") if lockErr != nil { - ts.Logger().Errorf("Target LockKeyspace failed: %v", lockErr) - return nil, lockErr + return defaultErrorHandler(ts.Logger(), fmt.Sprintf("failed to lock the %s keyspace", ts.TargetKeyspaceName()), + lockErr) } defer targetUnlock(&err) ctx = lockCtx } + // Stop the workflow before we delete the artifacts so that it doesn't try and + // continue doing work, and producing errors, as we delete the related artifacts. + if err = ts.ForAllTargets(func(target *MigrationTarget) error { + primary := target.GetPrimary() + if primary == nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "no primary tablet found for target shard %s/%s", + ts.targetKeyspace, target.GetShard()) + } + _, err := ts.ws.tmc.UpdateVReplicationWorkflow(ctx, primary.Tablet, &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: ts.workflow, + State: ptr.Of(binlogdatapb.VReplicationWorkflowState_Stopped), + }) + if err != nil { + return vterrors.Wrapf(err, "failed to stop workflow %s on shard %s/%s", ts.workflow, primary.Keyspace, primary.Shard) + } + return nil + }); err != nil { + return nil, err + } + if !keepData { switch ts.MigrationType() { case binlogdatapb.MigrationType_TABLES: @@ -2628,17 +2782,67 @@ func (s *Server) DropTargets(ctx context.Context, ts *trafficSwitcher, keepData, return sw.logs(), nil } +// deleteTenantData attempts to delete all of the tenant's data that was migrated +// in the workflow that we are canceling or deleting. This work can take some +// time so if the context ends then the user will need to retry. +func (s *Server) deleteTenantData(ctx context.Context, ts *trafficSwitcher, batchSize int64) error { + if ts.workflowType != binlogdatapb.VReplicationWorkflowType_MoveTables { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "unsupported workflow type %q for multi-tenant migration", + ts.workflowType) + } + if ts.options == nil || strings.TrimSpace(ts.options.TenantId) == "" { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "missing tenant ID in the workflow options") + } + if len(ts.tables) == 0 { // Nothing to delete + return nil + } + + tenantPredicate, err := ts.buildTenantPredicate(ctx) + if err != nil { + return vterrors.Wrap(err, "failed to build delete filter") + } + deleteFilter := sqlparser.String(&sqlparser.Where{Expr: *tenantPredicate}) + + tableFilters := make(map[string]string, len(ts.tables)) + for _, table := range ts.tables { + tableFilters[table] = deleteFilter + } + + return ts.ForAllTargets(func(target *MigrationTarget) error { + primary := target.GetPrimary() + if primary == nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "no primary tablet found for target shard %s/%s", + ts.targetKeyspace, target.GetShard()) + } + // Let's be sure that the workflow is stopped so that it's not generating more data. + _, err := ts.ws.tmc.UpdateVReplicationWorkflow(ctx, primary.Tablet, &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: ts.workflow, + State: ptr.Of(binlogdatapb.VReplicationWorkflowState_Stopped), + }) + if err != nil { + return vterrors.Wrapf(err, "failed to stop workflow %s on shard %s/%s", ts.workflow, primary.Keyspace, primary.Shard) + } + s.Logger().Infof("Deleting tenant %s data that was migrated in mulit-tenant workflow %s", + ts.workflow, ts.options.TenantId) + _, err = ts.ws.tmc.DeleteTableData(ctx, primary.Tablet, &tabletmanagerdatapb.DeleteTableDataRequest{ + TableFilters: tableFilters, + BatchSize: batchSize, + }) + return err + }) +} + func (s *Server) buildTrafficSwitcher(ctx context.Context, targetKeyspace, workflowName string) (*trafficSwitcher, error) { tgtInfo, err := BuildTargets(ctx, s.ts, s.tmc, targetKeyspace, workflowName) if err != nil { - log.Infof("Error building targets: %s", err) + s.Logger().Infof("Error building targets: %s", err) return nil, err } targets, frozen, optCells, optTabletTypes := tgtInfo.Targets, tgtInfo.Frozen, tgtInfo.OptCells, tgtInfo.OptTabletTypes ts := &trafficSwitcher{ ws: s, - logger: logutil.NewConsoleLogger(), + logger: s.Logger(), workflow: workflowName, reverseWorkflow: ReverseWorkflowName(workflowName), id: HashStreams(targetKeyspace, targets), @@ -2652,7 +2856,7 @@ func (s *Server) buildTrafficSwitcher(ctx context.Context, targetKeyspace, workf workflowSubType: tgtInfo.WorkflowSubType, options: tgtInfo.Options, } - log.Infof("Migration ID for workflow %s: %d", workflowName, ts.id) + s.Logger().Infof("Migration ID for workflow %s: %d", workflowName, ts.id) sourceTopo := s.ts // Build the sources. @@ -2675,6 +2879,10 @@ func (s *Server) buildTrafficSwitcher(ctx context.Context, targetKeyspace, workf return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "source keyspaces are mismatched across streams: %v vs %v", ts.sourceKeyspace, bls.Keyspace) } + if bls.Filter == nil || bls.Filter.Rules == nil { + return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "missing filters for %s/%s", bls.Keyspace, bls.Shard) + } + if ts.tables == nil { for _, rule := range bls.Filter.Rules { ts.tables = append(ts.tables, rule.Match) @@ -2739,7 +2947,7 @@ func (s *Server) buildTrafficSwitcher(ctx context.Context, targetKeyspace, workf return nil, err } if ts.isPartialMigration { - log.Infof("Migration is partial, for shards %+v", sourceShards) + s.Logger().Infof("Migration is partial, for shards %+v", sourceShards) } return ts, nil } @@ -2776,24 +2984,16 @@ func (s *Server) dropSources(ctx context.Context, ts *trafficSwitcher, removalTy sw = &switcher{ts: ts, s: s} } - // Lock the workflow and its source and target keyspaces. - lockName := fmt.Sprintf("%s/%s", ts.TargetKeyspaceName(), ts.WorkflowName()) - ctx, workflowUnlock, lockErr := s.ts.LockName(ctx, lockName, "DropSources") - if lockErr != nil { - ts.Logger().Errorf("Locking the workflow %s failed: %v", lockName, lockErr) - } - defer workflowUnlock(&err) + // Lock the source and target keyspaces. ctx, sourceUnlock, lockErr := sw.lockKeyspace(ctx, ts.SourceKeyspaceName(), "DropSources") if lockErr != nil { - ts.Logger().Errorf("Source LockKeyspace failed: %v", lockErr) - return nil, lockErr + return defaultErrorHandler(ts.Logger(), fmt.Sprintf("failed to lock the %s keyspace", ts.SourceKeyspaceName()), lockErr) } defer sourceUnlock(&err) if ts.TargetKeyspaceName() != ts.SourceKeyspaceName() { lockCtx, targetUnlock, lockErr := sw.lockKeyspace(ctx, ts.TargetKeyspaceName(), "DropSources") if lockErr != nil { - ts.Logger().Errorf("Target LockKeyspace failed: %v", lockErr) - return nil, lockErr + return defaultErrorHandler(ts.Logger(), fmt.Sprintf("failed to lock the %s keyspace", ts.TargetKeyspaceName()), lockErr) } defer targetUnlock(&err) ctx = lockCtx @@ -2808,7 +3008,7 @@ func (s *Server) dropSources(ctx context.Context, ts *trafficSwitcher, removalTy if !keepData { switch ts.MigrationType() { case binlogdatapb.MigrationType_TABLES: - log.Infof("Deleting tables") + s.Logger().Infof("Deleting tables") if err := sw.removeSourceTables(ctx, removalType); err != nil { return nil, err } @@ -2820,7 +3020,7 @@ func (s *Server) dropSources(ctx context.Context, ts *trafficSwitcher, removalTy } case binlogdatapb.MigrationType_SHARDS: - log.Infof("Removing shards") + s.Logger().Infof("Removing shards") if err := sw.dropSourceShards(ctx); err != nil { return nil, err } @@ -2867,7 +3067,7 @@ func (s *Server) DeleteShard(ctx context.Context, keyspace, shard string, recurs shardInfo, err := s.ts.GetShard(ctx, keyspace, shard) if err != nil { if topo.IsErrType(err, topo.NoNode) { - log.Warningf("Shard %v/%v did not exist when attempting to remove it", keyspace, shard) + s.Logger().Warningf("Shard %v/%v did not exist when attempting to remove it", keyspace, shard) return nil } return err @@ -2940,11 +3140,11 @@ func (s *Server) DeleteShard(ctx context.Context, keyspace, shard string, recurs return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "shard %v/%v still has %v tablets in cell %v; use --recursive or remove them manually", keyspace, shard, len(tabletMap), cell) } - log.Infof("Deleting all tablets in shard %v/%v cell %v", keyspace, shard, cell) + s.Logger().Infof("Deleting all tablets in shard %v/%v cell %v", keyspace, shard, cell) for tabletAlias, tabletInfo := range tabletMap { // We don't care about scrapping or updating the replication graph, // because we're about to delete the entire replication graph. - log.Infof("Deleting tablet %v", tabletAlias) + s.Logger().Infof("Deleting tablet %v", tabletAlias) if err := s.ts.DeleteTablet(ctx, tabletInfo.Alias); err != nil && !topo.IsErrType(err, topo.NoNode) { // We don't want to continue if a DeleteTablet fails for // any good reason (other than missing tablet, in which @@ -2965,7 +3165,7 @@ func (s *Server) DeleteShard(ctx context.Context, keyspace, shard string, recurs // regardless of its existence. for _, cell := range cells { if err := s.ts.DeleteShardReplication(ctx, cell, keyspace, shard); err != nil && !topo.IsErrType(err, topo.NoNode) { - log.Warningf("Cannot delete ShardReplication in cell %v for %v/%v: %v", cell, keyspace, shard, err) + s.Logger().Warningf("Cannot delete ShardReplication in cell %v for %v/%v: %v", cell, keyspace, shard, err) } } @@ -2980,7 +3180,7 @@ func (s *Server) updateShardRecords(ctx context.Context, keyspace string, shards } // refreshPrimaryTablets will just RPC-ping all the primary tablets with RefreshState -func (s *Server) refreshPrimaryTablets(ctx context.Context, shards []*topo.ShardInfo) error { +func (s *Server) refreshPrimaryTablets(ctx context.Context, shards []*topo.ShardInfo, force bool) error { wg := sync.WaitGroup{} rec := concurrency.AllErrorRecorder{} for _, si := range shards { @@ -2994,9 +3194,11 @@ func (s *Server) refreshPrimaryTablets(ctx context.Context, shards []*topo.Shard } if err := s.tmc.RefreshState(ctx, ti.Tablet); err != nil { - rec.RecordError(err) - } else { - log.Infof("%v responded", topoproto.TabletAliasString(si.PrimaryAlias)) + if !force { + rec.RecordError(err) + return + } + s.Logger().Warningf("%v encountered error on tablet refresh: %v", topoproto.TabletAliasString(si.PrimaryAlias), err) } }(si) } @@ -3017,17 +3219,10 @@ func (s *Server) finalizeMigrateWorkflow(ctx context.Context, ts *trafficSwitche sw = &switcher{s: s, ts: ts} } - // Lock the workflow and its target keyspace. - lockName := fmt.Sprintf("%s/%s", ts.TargetKeyspaceName(), ts.WorkflowName()) - ctx, workflowUnlock, lockErr := s.ts.LockName(ctx, lockName, "completeMigrateWorkflow") - if lockErr != nil { - ts.Logger().Errorf("Locking the workflow %s failed: %v", lockName, lockErr) - } - defer workflowUnlock(&err) + // Lock the target keyspace. ctx, targetUnlock, lockErr := sw.lockKeyspace(ctx, ts.TargetKeyspaceName(), "completeMigrateWorkflow") if lockErr != nil { - ts.Logger().Errorf("Target LockKeyspace failed: %v", lockErr) - return nil, lockErr + return defaultErrorHandler(ts.Logger(), fmt.Sprintf("failed to lock the %s keyspace", ts.TargetKeyspaceName()), lockErr) } defer targetUnlock(&err) @@ -3042,7 +3237,7 @@ func (s *Server) finalizeMigrateWorkflow(ctx context.Context, ts *trafficSwitche return nil, err } } - log.Infof("cancel is %t, keepData %t", cancel, keepData) + s.Logger().Infof("cancel is %t, keepData %t", cancel, keepData) if cancel && !keepData { if err := sw.removeTargetTables(ctx); err != nil { return nil, err @@ -3053,10 +3248,21 @@ func (s *Server) finalizeMigrateWorkflow(ctx context.Context, ts *trafficSwitche // WorkflowSwitchTraffic switches traffic in the direction passed for specified tablet types. func (s *Server) WorkflowSwitchTraffic(ctx context.Context, req *vtctldatapb.WorkflowSwitchTrafficRequest) (*vtctldatapb.WorkflowSwitchTrafficResponse, error) { + span, ctx := trace.NewSpan(ctx, "workflow.Server.WorkflowSwitchTraffic") + defer span.Finish() + + span.Annotate("keyspace", req.Keyspace) + span.Annotate("workflow", req.Workflow) + span.Annotate("tablet-types", req.TabletTypes) + span.Annotate("direction", req.Direction) + span.Annotate("enable-reverse-replication", req.EnableReverseReplication) + span.Annotate("shards", req.Shards) + span.Annotate("force", req.Force) + var ( - dryRunResults []string - rdDryRunResults, wrDryRunResults *[]string - hasReplica, hasRdonly, hasPrimary bool + dryRunResults []string + rdDryRunResults, wrDryRunResults *[]string + switchReplica, switchRdonly, switchPrimary bool ) timeout, set, err := protoutil.DurationFromProto(req.GetTimeout()) if err != nil { @@ -3070,7 +3276,20 @@ func (s *Server) WorkflowSwitchTraffic(ctx context.Context, req *vtctldatapb.Wor // a seconds value so you'd get unexpected behavior if you e.g. set the timeout to // 500ms as Etcd would get a value of 0 or a never-ending TTL. if timeout.Seconds() < 1 { - return nil, vterrors.Wrap(err, "Timeout must be at least 1 second") + return nil, vterrors.Wrap(err, "timeout must be at least 1 second") + } + maxReplicationLagAllowed, set, err := protoutil.DurationFromProto(req.MaxReplicationLagAllowed) + if err != nil { + err = vterrors.Wrapf(err, "unable to parse MaxReplicationLagAllowed into a valid duration") + return nil, err + } + if !set { + maxReplicationLagAllowed = DefaultTimeout + } + direction := TrafficSwitchDirection(req.Direction) + switchReplica, switchRdonly, switchPrimary, err = parseTabletTypes(req.TabletTypes) + if err != nil { + return nil, err } ts, startState, err := s.getWorkflowState(ctx, req.Keyspace, req.Workflow) if err != nil { @@ -3081,54 +3300,75 @@ func (s *Server) WorkflowSwitchTraffic(ctx context.Context, req *vtctldatapb.Wor return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid action for Migrate workflow: SwitchTraffic") } - maxReplicationLagAllowed, set, err := protoutil.DurationFromProto(req.MaxReplicationLagAllowed) - if err != nil { - err = vterrors.Wrapf(err, "unable to parse MaxReplicationLagAllowed into a valid duration") - return nil, err + if direction == DirectionBackward && ts.IsMultiTenantMigration() { + // In a multi-tenant migration, multiple migrations would be writing to the same + // table, so we can't stop writes like we do with MoveTables, using denied tables, + // since it would block all other migrations as well as traffic for tenants which + // have already been migrated. + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "cannot reverse traffic for multi-tenant migrations") } - if !set { - maxReplicationLagAllowed = DefaultTimeout - } - direction := TrafficSwitchDirection(req.Direction) - if direction == DirectionBackward { - ts, startState, err = s.getWorkflowState(ctx, startState.SourceKeyspace, ts.reverseWorkflow) + + // We need this to know when there isn't a (non-FROZEN) reverse workflow to use. + onlySwitchingReads := !startState.WritesSwitched && !switchPrimary + + // We need this for idempotency and to avoid unnecessary work and resulting risk. + writesAlreadySwitched := (direction == DirectionForward && startState.WritesSwitched) || + (direction == DirectionBackward && !startState.WritesSwitched) + + if direction == DirectionBackward && !onlySwitchingReads { + // This means that the main workflow is FROZEN and the reverse workflow + // exists. So we update the starting state so that we're using the reverse + // workflow and we can move forward with a normal traffic switch forward + // operation, from the reverse workflow's perspective. + ts, startState, err = s.getWorkflowState(ctx, ts.sourceKeyspace, ts.reverseWorkflow) if err != nil { return nil, err } - if ts.IsMultiTenantMigration() { - // In a multi-tenant migration, multiple migrations would be writing to the same table, so we can't stop writes like - // we do with MoveTables, using denied tables, since it would block all other migrations as well as traffic for - // tenants which have already been migrated. - return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "cannot reverse traffic for multi-tenant migrations") - } + direction = DirectionForward } - reason, err := s.canSwitch(ctx, ts, startState, direction, int64(maxReplicationLagAllowed.Seconds()), req.Shards) - if err != nil { - return nil, err - } - if reason != "" { - return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "cannot switch traffic for workflow %s at this time: %s", startState.Workflow, reason) + + // Lock the workflow for the traffic switching work. + lockName := fmt.Sprintf("%s/%s", ts.TargetKeyspaceName(), ts.WorkflowName()) + ctx, workflowUnlock, lockErr := s.ts.LockName(ctx, lockName, "WorkflowSwitchTraffic") + if lockErr != nil { + ts.Logger().Errorf("Locking the workflow %s failed: %v", lockName, lockErr) + return nil, vterrors.Wrapf(lockErr, "failed to lock the %s workflow", lockName) } - hasReplica, hasRdonly, hasPrimary, err = parseTabletTypes(req.TabletTypes) - if err != nil { - return nil, err + defer workflowUnlock(&err) + + ts.force = req.GetForce() + + if writesAlreadySwitched { + s.Logger().Infof("Writes already switched no need to check lag for the %s.%s workflow", + ts.targetKeyspace, ts.workflow) + } else { + reason, err := s.canSwitch(ctx, ts, int64(maxReplicationLagAllowed.Seconds()), req.GetShards()) + if err != nil { + return nil, err + } + if reason != "" { + return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "cannot switch traffic for workflow %s at this time: %s", + startState.Workflow, reason) + } } - if hasReplica || hasRdonly { + + if switchReplica || switchRdonly { // If we're going to switch writes immediately after then we don't need to // rebuild the SrvVSchema here as we will do it after switching writes. - if rdDryRunResults, err = s.switchReads(ctx, req, ts, startState, !hasPrimary /* rebuildSrvVSchema */, direction); err != nil { + if rdDryRunResults, err = s.switchReads(ctx, req, ts, startState, !switchPrimary /* rebuildSrvVSchema */, direction); err != nil { return nil, err } - log.Infof("Switch Reads done for workflow %s.%s", req.Keyspace, req.Workflow) + s.Logger().Infof("Switch Reads done for workflow %s.%s", req.Keyspace, req.Workflow) } if rdDryRunResults != nil { dryRunResults = append(dryRunResults, *rdDryRunResults...) } - if hasPrimary { + + if switchPrimary { if _, wrDryRunResults, err = s.switchWrites(ctx, req, ts, timeout, false); err != nil { return nil, err } - log.Infof("Switch Writes done for workflow %s.%s", req.Keyspace, req.Workflow) + s.Logger().Infof("Switch Writes done for workflow %s.%s", req.Keyspace, req.Workflow) } if wrDryRunResults != nil { @@ -3137,36 +3377,34 @@ func (s *Server) WorkflowSwitchTraffic(ctx context.Context, req *vtctldatapb.Wor if req.DryRun && len(dryRunResults) == 0 { dryRunResults = append(dryRunResults, "No changes required") } + cmd := "SwitchTraffic" - if direction == DirectionBackward { + // We must check the original direction requested. + if TrafficSwitchDirection(req.Direction) == DirectionBackward { cmd = "ReverseTraffic" } - log.Infof("%s done for workflow %s.%s", cmd, req.Keyspace, req.Workflow) + s.Logger().Infof("%s done for workflow %s.%s", cmd, req.Keyspace, req.Workflow) resp := &vtctldatapb.WorkflowSwitchTrafficResponse{} if req.DryRun { - resp.Summary = fmt.Sprintf("%s dry run results for workflow %s.%s at %v", cmd, req.Keyspace, req.Workflow, time.Now().UTC().Format(time.RFC822)) + resp.Summary = fmt.Sprintf("%s dry run results for workflow %s.%s at %v", + cmd, req.Keyspace, req.Workflow, time.Now().UTC().Format(time.RFC822)) resp.DryRunResults = dryRunResults } else { - log.Infof("%s done for workflow %s.%s", cmd, req.Keyspace, req.Workflow) + s.Logger().Infof("%s done for workflow %s.%s", cmd, req.Keyspace, req.Workflow) resp.Summary = fmt.Sprintf("%s was successful for workflow %s.%s", cmd, req.Keyspace, req.Workflow) - // Reload the state after the SwitchTraffic operation - // and return that as a string. - keyspace := req.Keyspace - workflow := req.Workflow - if direction == DirectionBackward { - keyspace = startState.SourceKeyspace - workflow = ts.reverseWorkflow - } + // Reload the state after the SwitchTraffic operation and return that + // as a string. resp.StartState = startState.String() - log.Infof("Before reloading workflow state after switching traffic: %+v\n", resp.StartState) - _, currentState, err := s.getWorkflowState(ctx, keyspace, workflow) + s.Logger().Infof("Before reloading workflow state after switching traffic: %+v\n", resp.StartState) + _, currentState, err := s.getWorkflowState(ctx, ts.targetKeyspace, ts.workflow) if err != nil { resp.CurrentState = fmt.Sprintf("Error reloading workflow state after switching traffic: %v", err) } else { resp.CurrentState = currentState.String() } - log.Infof("%s done for workflow %s.%s, returning response %v", cmd, req.Keyspace, req.Workflow, resp) + s.Logger().Infof("%s done for workflow %s.%s, returning response %v", cmd, req.Keyspace, req.Workflow, resp) } + return resp, nil } @@ -3194,16 +3432,12 @@ func (s *Server) switchReads(ctx context.Context, req *vtctldatapb.WorkflowSwitc cellsStr := strings.Join(req.Cells, ",") - // Consistently handle errors by logging and returning them. - handleError := func(message string, err error) (*[]string, error) { - werr := vterrors.Wrapf(err, message) - ts.Logger().Error(werr) - return nil, werr - } - - log.Infof("Switching reads: %s.%s tablet types: %s, cells: %s, workflow state: %s", ts.targetKeyspace, ts.workflow, roTypesToSwitchStr, cellsStr, state.String()) + s.Logger().Infof("Switching reads: %s.%s tablet types: %s, cells: %s, workflow state: %s", + ts.targetKeyspace, ts.workflow, roTypesToSwitchStr, cellsStr, state.String()) if !switchReplica && !switchRdonly { - return handleError("invalid tablet types", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "tablet types must be REPLICA or RDONLY: %s", roTypesToSwitchStr)) + return defaultErrorHandler(ts.Logger(), "invalid tablet types", + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "tablet types must be REPLICA or RDONLY: %s", + roTypesToSwitchStr)) } // For partial (shard-by-shard migrations) or multi-tenant migrations, traffic for all tablet types // is expected to be switched at once. For other MoveTables migrations where we use table routing rules @@ -3215,24 +3449,34 @@ func (s *Server) switchReads(ctx context.Context, req *vtctldatapb.WorkflowSwitc trafficSwitchingIsAllOrNothing = true case ts.MigrationType() == binlogdatapb.MigrationType_TABLES && ts.IsMultiTenantMigration(): if direction == DirectionBackward { - return handleError("invalid request", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "requesting reversal of read traffic for multi-tenant migrations is not supported")) + return defaultErrorHandler(ts.Logger(), "invalid request", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, + "requesting reversal of read traffic for multi-tenant migrations is not supported")) } // For multi-tenant migrations, we only support switching traffic to all cells at once allCells, err := ts.TopoServer().GetCellInfoNames(ctx) if err != nil { return nil, err } - if len(req.GetCells()) != 0 && len(req.GetCells()) != len(allCells) { - return handleError("invalid request", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "requesting read traffic for multi-tenant migrations must include all cells")) + + if len(req.GetCells()) > 0 { + slices.Sort(req.GetCells()) + slices.Sort(allCells) + if !slices.Equal(req.GetCells(), allCells) { + return defaultErrorHandler(ts.Logger(), "invalid request", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, + "requesting switch of read traffic for multi-tenant migrations must include all cells; all cells: %v, requested cells: %v", + strings.Join(allCells, ","), strings.Join(req.GetCells(), ","))) + } } } if !trafficSwitchingIsAllOrNothing { if direction == DirectionBackward && switchReplica && len(state.ReplicaCellsSwitched) == 0 { - return handleError("invalid request", vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "requesting reversal of read traffic for REPLICAs but REPLICA reads have not been switched")) + return defaultErrorHandler(ts.Logger(), "invalid request", vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, + "requesting reversal of read traffic for REPLICAs but REPLICA reads have not been switched")) } if direction == DirectionBackward && switchRdonly && len(state.RdonlyCellsSwitched) == 0 { - return handleError("invalid request", vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "requesting reversal of SwitchReads for RDONLYs but RDONLY reads have not been switched")) + return defaultErrorHandler(ts.Logger(), "invalid request", vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, + "requesting reversal of SwitchReads for RDONLYs but RDONLY reads have not been switched")) } } @@ -3251,14 +3495,14 @@ func (s *Server) switchReads(ctx context.Context, req *vtctldatapb.WorkflowSwitc } } - // If journals exist notify user and fail. journalsExist, _, err := ts.checkJournals(ctx) - if err != nil { - return handleError(fmt.Sprintf("failed to read journal in the %s keyspace", ts.SourceKeyspaceName()), err) + if err != nil && !req.GetForce() { + return defaultErrorHandler(ts.Logger(), fmt.Sprintf("failed to read journal in the %s keyspace", ts.SourceKeyspaceName()), err) } if journalsExist { - log.Infof("Found a previous journal entry for %d", ts.id) + s.Logger().Infof("Found a previous journal entry for %d", ts.id) } + var sw iswitcher if req.DryRun { sw = &switcherDryRun{ts: ts, drLog: NewLogRecorder()} @@ -3267,7 +3511,7 @@ func (s *Server) switchReads(ctx context.Context, req *vtctldatapb.WorkflowSwitc } if err := ts.validate(ctx); err != nil { - return handleError("workflow validation failed", err) + return defaultErrorHandler(ts.Logger(), "workflow validation failed", err) } // For switching reads, locking the source keyspace is sufficient. @@ -3283,7 +3527,7 @@ func (s *Server) switchReads(ctx context.Context, req *vtctldatapb.WorkflowSwitc // For reads, locking the source keyspace is sufficient. ctx, unlock, lockErr := sw.lockKeyspace(ctx, ts.SourceKeyspaceName(), "SwitchReads", topo.WithTTL(ksLockTTL)) if lockErr != nil { - return handleError(fmt.Sprintf("failed to lock the %s keyspace", ts.SourceKeyspaceName()), lockErr) + return defaultErrorHandler(ts.Logger(), fmt.Sprintf("failed to lock the %s keyspace", ts.SourceKeyspaceName()), lockErr) } defer unlock(&err) confirmKeyspaceLocksHeld := func() error { @@ -3298,7 +3542,7 @@ func (s *Server) switchReads(ctx context.Context, req *vtctldatapb.WorkflowSwitc // Remove mirror rules for the specified tablet types. if err := sw.mirrorTableTraffic(ctx, roTabletTypes, 0); err != nil { - return handleError(fmt.Sprintf("failed to remove mirror rules from source keyspace %s to target keyspace %s, workflow %s, for read-only tablet types", + return defaultErrorHandler(ts.Logger(), fmt.Sprintf("failed to remove mirror rules from source keyspace %s to target keyspace %s, workflow %s, for read-only tablet types", ts.SourceKeyspaceName(), ts.TargetKeyspaceName(), ts.WorkflowName()), err) } @@ -3307,7 +3551,7 @@ func (s *Server) switchReads(ctx context.Context, req *vtctldatapb.WorkflowSwitc case ts.IsMultiTenantMigration(): err := sw.switchKeyspaceReads(ctx, roTabletTypes) if err != nil { - return handleError(fmt.Sprintf("failed to switch read traffic, from source keyspace %s to target keyspace %s, workflow %s", + return defaultErrorHandler(ts.Logger(), fmt.Sprintf("failed to switch read traffic, from source keyspace %s to target keyspace %s, workflow %s", ts.SourceKeyspaceName(), ts.TargetKeyspaceName(), ts.WorkflowName()), err) } case ts.isPartialMigration: @@ -3315,28 +3559,28 @@ func (s *Server) switchReads(ctx context.Context, req *vtctldatapb.WorkflowSwitc default: err := sw.switchTableReads(ctx, req.Cells, roTabletTypes, rebuildSrvVSchema, direction) if err != nil { - return handleError("failed to switch read traffic for the tables", err) + return defaultErrorHandler(ts.Logger(), "failed to switch read traffic for the tables", err) } } return sw.logs(), nil } if err := confirmKeyspaceLocksHeld(); err != nil { - return handleError("locks were lost", err) + return defaultErrorHandler(ts.Logger(), "locks were lost", err) } ts.Logger().Infof("About to switchShardReads: cells: %s, tablet types: %s, direction: %d", cellsStr, roTypesToSwitchStr, direction) if err := sw.switchShardReads(ctx, req.Cells, roTabletTypes, direction); err != nil { - return handleError("failed to switch read traffic for the shards", err) + return defaultErrorHandler(ts.Logger(), "failed to switch read traffic for the shards", err) } if err := confirmKeyspaceLocksHeld(); err != nil { - return handleError("locks were lost", err) + return defaultErrorHandler(ts.Logger(), "locks were lost", err) } ts.Logger().Infof("switchShardReads Completed: cells: %s, tablet types: %s, direction: %d", cellsStr, roTypesToSwitchStr, direction) if err := s.ts.ValidateSrvKeyspace(ctx, ts.targetKeyspace, cellsStr); err != nil { err2 := vterrors.Wrapf(err, "after switching shard reads, found SrvKeyspace for %s is corrupt in cell %s", ts.targetKeyspace, cellsStr) - return handleError("failed to validate SrvKeyspace record", err2) + return defaultErrorHandler(ts.Logger(), "failed to validate SrvKeyspace record", err2) } return sw.logs(), nil } @@ -3354,7 +3598,7 @@ func (s *Server) switchWrites(ctx context.Context, req *vtctldatapb.WorkflowSwit // Consistently handle errors by logging and returning them. handleError := func(message string, err error) (int64, *[]string, error) { - werr := vterrors.Wrapf(err, message) + werr := vterrors.Wrap(err, message) ts.Logger().Error(werr) return 0, nil, werr } @@ -3369,19 +3613,19 @@ func (s *Server) switchWrites(ctx context.Context, req *vtctldatapb.WorkflowSwit } if req.EnableReverseReplication { + // Does the source keyspace have tablets that are able to manage + // the reverse workflow? + if err := s.validateShardsHaveVReplicationPermissions(ctx, ts.SourceKeyspaceName(), ts.SourceShards()); err != nil { + return handleError(fmt.Sprintf("primary tablets are not able to fully manage the reverse vreplication workflow in the %s keyspace", + ts.SourceKeyspaceName()), err) + } + // Does the target keyspace have tablets available to stream from + // for the reverse workflow? if err := areTabletsAvailableToStreamFrom(ctx, req, ts, ts.TargetKeyspaceName(), ts.TargetShards()); err != nil { - return handleError(fmt.Sprintf("no tablets were available to stream from in the %s keyspace", ts.SourceKeyspaceName()), err) + return handleError(fmt.Sprintf("no tablets were available to stream from in the %s keyspace", ts.TargetKeyspaceName()), err) } } - // Lock the workflow and its source and target keyspaces. - lockName := fmt.Sprintf("%s/%s", ts.TargetKeyspaceName(), ts.WorkflowName()) - ctx, workflowUnlock, lockErr := s.ts.LockName(ctx, lockName, "SwitchWrites") - if lockErr != nil { - return handleError(fmt.Sprintf("failed to lock the %s workflow", lockName), lockErr) - } - defer workflowUnlock(&err) - // We need to hold the keyspace locks longer than waitTimeout*X -- where X // is the number of sub-steps where the waitTimeout value is used: stopping // existing streams, waiting for replication to catch up, and initializing @@ -3417,7 +3661,7 @@ func (s *Server) switchWrites(ctx context.Context, req *vtctldatapb.WorkflowSwit } // Remove mirror rules for the primary tablet type. - if err := sw.mirrorTableTraffic(ctx, []topodata.TabletType{topodatapb.TabletType_PRIMARY}, 0); err != nil { + if err := sw.mirrorTableTraffic(ctx, []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}, 0); err != nil { return handleError(fmt.Sprintf("failed to remove mirror rules from source keyspace %s to target keyspace %s, workflow %s, for primary tablet type", ts.SourceKeyspaceName(), ts.TargetKeyspaceName(), ts.WorkflowName()), err) } @@ -3499,6 +3743,13 @@ func (s *Server) switchWrites(ctx context.Context, req *vtctldatapb.WorkflowSwit } } + // Get the source positions now that writes are stopped, the streams were stopped (e.g. + // intra-keyspace materializations that write on the source), and we know for certain + // that any in progress writes are done. + if err := ts.gatherSourcePositions(ctx); err != nil { + return handleError("failed to gather replication positions on migration sources", err) + } + if err := confirmKeyspaceLocksHeld(); err != nil { return handleError("locks were lost", err) } @@ -3591,14 +3842,8 @@ func (s *Server) switchWrites(ctx context.Context, req *vtctldatapb.WorkflowSwit return ts.id, sw.logs(), nil } -func (s *Server) canSwitch(ctx context.Context, ts *trafficSwitcher, state *State, direction TrafficSwitchDirection, - maxAllowedReplLagSecs int64, shards []string) (reason string, err error) { - if direction == DirectionForward && state.WritesSwitched || - direction == DirectionBackward && !state.WritesSwitched { - log.Infof("writes already switched no need to check lag") - return "", nil - } - wf, err := s.GetWorkflow(ctx, state.TargetKeyspace, state.Workflow, false, shards) +func (s *Server) canSwitch(ctx context.Context, ts *trafficSwitcher, maxAllowedReplLagSecs int64, shards []string) (reason string, err error) { + wf, err := s.GetWorkflow(ctx, ts.targetKeyspace, ts.workflow, false, shards) if err != nil { return "", err } @@ -3631,10 +3876,15 @@ func (s *Server) canSwitch(ctx context.Context, ts *trafficSwitcher, state *Stat defer wg.Done() for _, si := range shards { if partial, partialDetails, err := topotools.RefreshTabletsByShard(rtbsCtx, s.ts, s.tmc, si, nil, ts.Logger()); err != nil || partial { - m.Lock() - refreshErrors.WriteString(fmt.Sprintf("failed to successfully refresh all tablets in the %s/%s %s shard (%v):\n %v\n", - si.Keyspace(), si.ShardName(), stype, err, partialDetails)) - m.Unlock() + msg := fmt.Sprintf("failed to successfully refresh all tablets in the %s/%s %s shard (%v):\n %v\n", + si.Keyspace(), si.ShardName(), stype, err, partialDetails) + if partial && ts.force { + log.Warning(msg) + } else { + m.Lock() + refreshErrors.WriteString(msg) + m.Unlock() + } } } } @@ -3727,9 +3977,9 @@ func (s *Server) CopySchemaShard(ctx context.Context, sourceTabletAlias *topodat // Notify Replicas to reload schema. This is best-effort. reloadCtx, cancel := context.WithTimeout(ctx, waitReplicasTimeout) defer cancel() - _, ok := schematools.ReloadShard(reloadCtx, s.ts, s.tmc, logutil.NewMemoryLogger(), destKeyspace, destShard, destPrimaryPos, nil, true) + _, ok := schematools.ReloadShard(reloadCtx, s.ts, s.tmc, s.Logger(), destKeyspace, destShard, destPrimaryPos, nil, true) if !ok { - log.Error(vterrors.Errorf(vtrpcpb.Code_INTERNAL, "CopySchemaShard: failed to reload schema on all replicas")) + s.Logger().Error(vterrors.Errorf(vtrpcpb.Code_INTERNAL, "CopySchemaShard: failed to reload schema on all replicas")) } return err @@ -3772,7 +4022,8 @@ func fillStringTemplate(tmpl string, vars any) (string, error) { // prepareCreateLookup performs the preparatory steps for creating a // Lookup Vindex. -func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace string, specs *vschemapb.Keyspace, continueAfterCopyWithOwner bool) (ms *vtctldatapb.MaterializeSettings, sourceVSchema, targetVSchema *vschemapb.Keyspace, err error) { +func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace string, specs *vschemapb.Keyspace, continueAfterCopyWithOwner bool) ( + ms *vtctldatapb.MaterializeSettings, sourceVSchema, targetVSchema *vschemapb.Keyspace, cancelFunc func() error, err error) { // Important variables are pulled out here. var ( vindexName string @@ -3798,19 +4049,19 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str // Validate input vindex. if specs == nil { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "no vindex provided") + return nil, nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "no vindex provided") } if len(specs.Vindexes) != 1 { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "only one vindex must be specified") + return nil, nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "only one vindex must be specified") } vindexName = maps.Keys(specs.Vindexes)[0] vindex = maps.Values(specs.Vindexes)[0] if !strings.Contains(vindex.Type, "lookup") { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "vindex %s is not a lookup type", vindex.Type) + return nil, nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "vindex %s is not a lookup type", vindex.Type) } targetKeyspace, targetTableName, err = s.env.Parser().ParseTable(vindex.Params["table"]) if err != nil || targetKeyspace == "" { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "vindex table name (%s) must be in the form .", vindex.Params["table"]) + return nil, nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "vindex table name (%s) must be in the form .
", vindex.Params["table"]) } vindexFromCols = strings.Split(vindex.Params["from"], ",") for i, col := range vindexFromCols { @@ -3818,11 +4069,11 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str } if strings.Contains(vindex.Type, "unique") { if len(vindexFromCols) != 1 { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unique vindex 'from' should have only one column") + return nil, nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unique vindex 'from' should have only one column") } } else { if len(vindexFromCols) < 2 { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "non-unique vindex 'from' should have more than one column") + return nil, nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "non-unique vindex 'from' should have more than one column") } } vindexToCol = vindex.Params["to"] @@ -3831,7 +4082,7 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str vindex.Params["write_only"] = "true" // See if we can create the vindex without errors. if _, err := vindexes.CreateVindex(vindex.Type, vindexName, vindex.Params); err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } if ignoreNullsStr, ok := vindex.Params["ignore_nulls"]; ok { // This mirrors the behavior of vindexes.boolFromMap(). @@ -3841,19 +4092,22 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str case "false": vindexIgnoreNulls = false default: - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "ignore_nulls (%s) value must be 'true' or 'false'", - ignoreNullsStr) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "ignore_nulls (%s) value must be 'true' or 'false'", + ignoreNullsStr) } } // Validate input table. if len(specs.Tables) < 1 || len(specs.Tables) > 2 { - return nil, nil, nil, fmt.Errorf("one or two tables must be specified") + return nil, nil, nil, nil, fmt.Errorf("one or two tables must be specified") } // Loop executes once or twice. for tableName, table := range specs.Tables { if len(table.ColumnVindexes) != 1 { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "exactly one ColumnVindex must be specified for the %s table", tableName) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "exactly one ColumnVindex must be specified for the %s table", + tableName) } if tableName != targetTableName { // This is the source table. sourceTableName = tableName @@ -3867,42 +4121,55 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str vindexCols = table.ColumnVindexes[0].Columns } else { if table.ColumnVindexes[0].Column == "" { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "at least one column must be specified in ColumnVindexes for the %s table", tableName) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "at least one column must be specified in ColumnVindexes for the %s table", + tableName) } vindexCols = []string{table.ColumnVindexes[0].Column} } if !slices.Equal(vindexCols, vindexFromCols) { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "columns in the lookup table %s primary vindex (%s) don't match the 'from' columns specified (%s)", - tableName, strings.Join(vindexCols, ","), strings.Join(vindexFromCols, ",")) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "columns in the lookup table %s primary vindex (%s) don't match the 'from' columns specified (%s)", + tableName, strings.Join(vindexCols, ","), strings.Join(vindexFromCols, ",")) } } // Validate input table and vindex consistency. if sourceTable == nil || len(sourceTable.ColumnVindexes) != 1 { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "No ColumnVindex found for the owner table in the %s keyspace", keyspace) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "No ColumnVindex found for the owner table (%s) in the %s keyspace", + sourceTable, keyspace) } if sourceTable.ColumnVindexes[0].Name != vindexName { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "ColumnVindex name (%s) must match vindex name (%s)", sourceTable.ColumnVindexes[0].Name, vindexName) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "ColumnVindex name (%s) must match vindex name (%s)", + sourceTable.ColumnVindexes[0].Name, vindexName) } if vindex.Owner != "" && vindex.Owner != sourceTableName { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "vindex owner (%s) must match table name (%s)", vindex.Owner, sourceTableName) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "vindex owner (%s) must match table name (%s)", + vindex.Owner, sourceTableName) } if len(sourceTable.ColumnVindexes[0].Columns) != 0 { sourceVindexColumns = sourceTable.ColumnVindexes[0].Columns } else { if sourceTable.ColumnVindexes[0].Column == "" { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "at least one column must be specified in ColumnVindexes for the %s table", sourceTableName) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "at least one column must be specified in ColumnVindexes for the %s table", + sourceTableName) } sourceVindexColumns = []string{sourceTable.ColumnVindexes[0].Column} } if len(sourceVindexColumns) != len(vindexFromCols) { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "length of table columns (%d) differs from length of vindex columns (%d)", len(sourceVindexColumns), len(vindexFromCols)) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "length of table columns (%d) differs from length of vindex columns (%d)", + len(sourceVindexColumns), len(vindexFromCols)) } // Validate against source vschema. sourceVSchema, err = s.ts.GetVSchema(ctx, keyspace) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } if sourceVSchema.Vindexes == nil { sourceVSchema.Vindexes = make(map[string]*vschemapb.Vindex) @@ -3914,7 +4181,7 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str } else { targetVSchema, err = s.ts.GetVSchema(ctx, targetKeyspace) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } } if targetVSchema.Vindexes == nil { @@ -3925,12 +4192,15 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str } if existing, ok := sourceVSchema.Vindexes[vindexName]; ok { if !proto.Equal(existing, vindex) { // If the exact same vindex already exists then we can re-use it - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "a conflicting vindex named %s already exists in the %s keyspace", vindexName, keyspace) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INTERNAL, "a conflicting vindex named %s already exists in the %s keyspace", + vindexName, keyspace) } } sourceVSchemaTable = sourceVSchema.Tables[sourceTableName] if sourceVSchemaTable == nil && !schema.IsInternalOperationTableName(sourceTableName) { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "table %s not found in the %s keyspace", sourceTableName, keyspace) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INTERNAL, "table %s not found in the %s keyspace", sourceTableName, keyspace) } for _, colVindex := range sourceVSchemaTable.ColumnVindexes { // For a conflict, the vindex name and column should match. @@ -3947,41 +4217,47 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str // are not the same then they are two distinct conflicting vindexes and we should // not proceed. if !slices.Equal(colNames, sourceVindexColumns) { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "a conflicting ColumnVindex on column(s) %s in table %s already exists in the %s keyspace", - strings.Join(colNames, ","), sourceTableName, keyspace) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "a conflicting ColumnVindex on column(s) %s in table %s already exists in the %s keyspace", + strings.Join(colNames, ","), sourceTableName, keyspace) } } // Validate against source schema. sourceShards, err := s.ts.GetServingShards(ctx, keyspace) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } onesource := sourceShards[0] if onesource.PrimaryAlias == nil { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "source shard %s has no primary", onesource.ShardName()) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INTERNAL, "source shard %s has no primary", onesource.ShardName()) } req := &tabletmanagerdatapb.GetSchemaRequest{Tables: []string{sourceTableName}} tableSchema, err := schematools.GetSchema(ctx, s.ts, s.tmc, onesource.PrimaryAlias, req) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } if len(tableSchema.TableDefinitions) != 1 { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "unexpected number of tables (%d) returned from %s schema", len(tableSchema.TableDefinitions), keyspace) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INTERNAL, "unexpected number of tables (%d) returned from %s schema", + len(tableSchema.TableDefinitions), keyspace) } // Generate "create table" statement. lines := strings.Split(tableSchema.TableDefinitions[0].Schema, "\n") if len(lines) < 3 { // Should never happen. - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "schema looks incorrect: %s, expecting at least four lines", tableSchema.TableDefinitions[0].Schema) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INTERNAL, "schema looks incorrect: %s, expecting at least four lines", + tableSchema.TableDefinitions[0].Schema) } var modified []string modified = append(modified, strings.Replace(lines[0], sourceTableName, targetTableName, 1)) for i := range sourceVindexColumns { line, err := generateColDef(lines, sourceVindexColumns[i], vindexFromCols[i]) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } modified = append(modified, line) } @@ -4004,7 +4280,8 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str createDDL = strings.Join(modified, "\n") // Confirm that our DDL is valid before we create anything. if _, err = s.env.Parser().ParseStrictDDL(createDDL); err != nil { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "error: %v; invalid lookup table definition generated: %s", err, createDDL) + return nil, nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "error: %v; invalid lookup table definition generated: %s", + err, createDDL) } // Generate vreplication query. @@ -4039,6 +4316,11 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str } materializeQuery = buf.String() + // Save a copy of the original vschema if we modify it and need to provide + // a cancelFunc. + ogTargetVSchema := targetVSchema.CloneVT() + targetChanged := false + // Update targetVSchema. targetTable := specs.Tables[targetTableName] if targetVSchema.Sharded { @@ -4054,7 +4336,7 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str if targetVindexType == "" { targetVindexType, err = vindexes.ChooseVindexForType(field.Type) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } } targetVindex = &vschemapb.Vindex{ @@ -4065,14 +4347,19 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str } if targetVindex == nil { // Unreachable. We validated column names when generating the DDL. - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "column %s not found in target schema %s", sourceVindexColumns[0], tableSchema.TableDefinitions[0].Schema) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INTERNAL, "column %s not found in target schema %s", + sourceVindexColumns[0], tableSchema.TableDefinitions[0].Schema) } if existing, ok := targetVSchema.Vindexes[targetVindexType]; ok { if !proto.Equal(existing, targetVindex) { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "a conflicting vindex named %v already exists in the %s keyspace", targetVindexType, targetKeyspace) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "a conflicting vindex named %v already exists in the %s keyspace", + targetVindexType, targetKeyspace) } } else { targetVSchema.Vindexes[targetVindexType] = targetVindex + targetChanged = true } targetTable = &vschemapb.Table{ @@ -4086,10 +4373,20 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str } if existing, ok := targetVSchema.Tables[targetTableName]; ok { if !proto.Equal(existing, targetTable) { - return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "a conflicting table named %s already exists in the %s vschema", targetTableName, targetKeyspace) + return nil, nil, nil, nil, + vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "a conflicting table named %s already exists in the %s vschema", + targetTableName, targetKeyspace) } } else { targetVSchema.Tables[targetTableName] = targetTable + targetChanged = true + } + + if targetChanged { + cancelFunc = func() error { + // Restore the original target vschema. + return s.ts.SaveVSchema(ctx, targetKeyspace, ogTargetVSchema) + } } ms = &vtctldatapb.MaterializeSettings{ @@ -4109,7 +4406,7 @@ func (s *Server) prepareCreateLookup(ctx context.Context, workflow, keyspace str sourceVSchema.Vindexes[vindexName] = vindex sourceVSchemaTable.ColumnVindexes = append(sourceVSchemaTable.ColumnVindexes, sourceTable.ColumnVindexes[0]) - return ms, sourceVSchema, targetVSchema, nil + return ms, sourceVSchema, targetVSchema, cancelFunc, nil } func generateColDef(lines []string, sourceVindexCol, vindexFromCol string) (string, error) { @@ -4223,7 +4520,9 @@ func (s *Server) WorkflowMirrorTraffic(ctx context.Context, req *vtctldatapb.Wor } } if len(cannotSwitchTabletTypes) > 0 { - return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "cannot mirror [%s] traffic for workflow %s at this time: traffic for those tablet types is switched", strings.Join(cannotSwitchTabletTypes, ","), startState.Workflow) + return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, + "cannot mirror [%s] traffic for workflow %s at this time: traffic for those tablet types is switched", + strings.Join(cannotSwitchTabletTypes, ","), startState.Workflow) } if err := s.mirrorTraffic(ctx, req, ts, startState); err != nil { @@ -4232,14 +4531,14 @@ func (s *Server) WorkflowMirrorTraffic(ctx context.Context, req *vtctldatapb.Wor cmd := "MirrorTraffic" resp := &vtctldatapb.WorkflowMirrorTrafficResponse{} - log.Infof("Mirror Traffic done for workflow %s.%s", req.Keyspace, req.Workflow) + s.Logger().Infof("Mirror Traffic done for workflow %s.%s", req.Keyspace, req.Workflow) resp.Summary = fmt.Sprintf("%s was successful for workflow %s.%s", cmd, req.Keyspace, req.Workflow) // Reload the state after the MirrorTraffic operation // and return that as a string. keyspace := req.Keyspace workflow := req.Workflow resp.StartState = startState.String() - log.Infof("Before reloading workflow state after mirror traffic: %+v\n", resp.StartState) + s.Logger().Infof("Before reloading workflow state after mirror traffic: %+v\n", resp.StartState) _, currentState, err := s.getWorkflowState(ctx, keyspace, workflow) if err != nil { resp.CurrentState = fmt.Sprintf("Error reloading workflow state after mirror traffic: %v", err) @@ -4257,7 +4556,7 @@ func (s *Server) mirrorTraffic(ctx context.Context, req *vtctldatapb.WorkflowMir return err } - log.Infof("Mirroring traffic: %s.%s, workflow state: %s", ts.targetKeyspace, ts.workflow, state.String()) + s.Logger().Infof("Mirroring traffic: %s.%s, workflow state: %s", ts.targetKeyspace, ts.workflow, state.String()) sw := &switcher{ts: ts, s: s} @@ -4271,3 +4570,54 @@ func (s *Server) mirrorTraffic(ctx context.Context, req *vtctldatapb.WorkflowMir return nil } + +// validateShardsHaveVReplicationPermissions checks that the primary tablets +// in the given keyspace shards have the required permissions necessary to +// perform actions on the workflow. +func (s *Server) validateShardsHaveVReplicationPermissions(ctx context.Context, keyspace string, shards []*topo.ShardInfo) error { + validateEg, validateCtx := errgroup.WithContext(ctx) + for _, shard := range shards { + primary := shard.PrimaryAlias + if primary == nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "%s/%s shard does not have a primary tablet", + keyspace, shard.ShardName()) + } + validateEg.Go(func() error { + tablet, err := s.ts.GetTablet(validateCtx, primary) + if err != nil { + return vterrors.Wrapf(err, "failed to get primary tablet for the %s/%s shard", keyspace, shard.ShardName()) + } + // Ensure the tablet has the minimum privileges required on the sidecar database + // table(s) in order to manage the workflow. + req := &tabletmanagerdatapb.ValidateVReplicationPermissionsRequest{} + res, err := s.tmc.ValidateVReplicationPermissions(validateCtx, tablet.Tablet, req) + if err != nil { + // This older tablet handling can be removed in v22 or later. + if st, ok := status.FromError(err); ok && st.Code() == codes.Unimplemented { + // This is a pre v21 tablet, so don't return an error since the + // permissions not being there should be very rare. + return nil + } + return vterrors.Wrapf(err, "failed to validate required vreplication metadata permissions on tablet %s", + topoproto.TabletAliasString(tablet.Alias)) + } + if !res.GetOk() { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, + "user %s does not have the required set of permissions (select,insert,update,delete) on the %s.vreplication table on tablet %s", + res.GetUser(), sidecar.GetIdentifier(), topoproto.TabletAliasString(tablet.Alias)) + } + return nil + }) + } + if err := validateEg.Wait(); err != nil { + return err + } + return nil +} + +func (s *Server) Logger() logutil.Logger { + if s.options.logger == nil { + s.options.logger = logutil.NewConsoleLogger() // Use default system logger + } + return s.options.logger +} diff --git a/go/vt/vtctl/workflow/server_options.go b/go/vt/vtctl/workflow/server_options.go new file mode 100644 index 00000000000..ed6fdf284a9 --- /dev/null +++ b/go/vt/vtctl/workflow/server_options.go @@ -0,0 +1,56 @@ +/* +Copyright 2024 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 workflow + +import ( + "vitess.io/vitess/go/vt/logutil" +) + +// serverOptions configure a Workflow Server. serverOptions are set by +// the ServerOption values passed to the server functions. +type serverOptions struct { + logger logutil.Logger +} + +// ServerOption configures how we perform the certain operations. +type ServerOption interface { + apply(*serverOptions) +} + +// funcServerOption wraps a function that modifies serverOptions into +// an implementation of the ServerOption interface. +type funcServerOption struct { + f func(*serverOptions) +} + +func (fso *funcServerOption) apply(so *serverOptions) { + fso.f(so) +} + +func newFuncServerOption(f func(*serverOptions)) *funcServerOption { + return &funcServerOption{ + f: f, + } +} + +// WithLogger determines the customer logger to use. If this option +// is not provided then the default system logger will be used. +func WithLogger(l logutil.Logger) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.logger = l + }) +} diff --git a/go/vt/vtctl/workflow/server_test.go b/go/vt/vtctl/workflow/server_test.go index c67d45bb9e6..b7783fc2945 100644 --- a/go/vt/vtctl/workflow/server_test.go +++ b/go/vt/vtctl/workflow/server_test.go @@ -19,6 +19,7 @@ package workflow import ( "context" "encoding/json" + "errors" "fmt" "slices" "sort" @@ -26,26 +27,42 @@ import ( "testing" "time" + "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/encoding/prototext" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/test/utils" + "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/topo" - "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vtenv" + "vitess.io/vitess/go/vt/vttablet/tabletmanager/vdiff" "vitess.io/vitess/go/vt/vttablet/tmclient" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vschemapb "vitess.io/vitess/go/vt/proto/vschema" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) +var ( + allTabletTypes = []topodatapb.TabletType{ + topodatapb.TabletType_PRIMARY, + topodatapb.TabletType_REPLICA, + topodatapb.TabletType_RDONLY, + } + + roTabletTypes = []topodatapb.TabletType{ + topodatapb.TabletType_REPLICA, + topodatapb.TabletType_RDONLY, + } +) + type fakeTMC struct { tmclient.TabletManagerClient vrepQueriesByTablet map[string]map[string]*querypb.QueryResult @@ -178,9 +195,17 @@ func TestCheckReshardingJournalExistsOnTablet(t *testing.T) { // to ensure that it behaves as expected given a specific request. func TestVDiffCreate(t *testing.T) { ctx := context.Background() - ts := memorytopo.NewServer(ctx, "cell") - tmc := &fakeTMC{} - s := NewServer(vtenv.NewTestEnv(), ts, tmc) + workflowName := "wf1" + sourceKeyspace := &testKeyspace{ + KeyspaceName: "source", + ShardNames: []string{"0"}, + } + targetKeyspace := &testKeyspace{ + KeyspaceName: "target", + ShardNames: []string{"-80", "80-"}, + } + env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) + defer env.close() tests := []struct { name string @@ -193,17 +218,485 @@ func TestVDiffCreate(t *testing.T) { // We did not provide any keyspace or shard. wantErr: "FindAllShardsInKeyspace() invalid keyspace name: UnescapeID err: invalid input identifier ''", }, + { + name: "generated UUID", + req: &vtctldatapb.VDiffCreateRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + Workflow: workflowName, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := s.VDiffCreate(ctx, tt.req) + if tt.wantErr == "" { + env.tmc.expectVRQueryResultOnKeyspaceTablets(targetKeyspace.KeyspaceName, &queryResult{ + query: "select vrepl_id, table_name, lastpk from _vt.copy_state where vrepl_id in (1) and id in (select max(id) from _vt.copy_state where vrepl_id in (1) group by vrepl_id, table_name)", + result: &querypb.QueryResult{}, + }) + } + got, err := env.ws.VDiffCreate(ctx, tt.req) if tt.wantErr != "" { require.EqualError(t, err, tt.wantErr) return } require.NoError(t, err) require.NotNil(t, got) - require.NotEmpty(t, got.UUID) + // Ensure that we always use a valid UUID. + err = uuid.Validate(got.UUID) + require.NoError(t, err) + }) + } +} + +func TestVDiffResume(t *testing.T) { + ctx := context.Background() + sourceKeyspace := &testKeyspace{ + KeyspaceName: "sourceks", + ShardNames: []string{"0"}, + } + targetKeyspace := &testKeyspace{ + KeyspaceName: "targetks", + ShardNames: []string{"-80", "80-"}, + } + workflow := "testwf" + uuid := uuid.New().String() + env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) + defer env.close() + + env.tmc.strict = true + action := string(vdiff.ResumeAction) + + tests := []struct { + name string + req *vtctldatapb.VDiffResumeRequest // vtctld requests + expectedVDiffRequests map[*topodatapb.Tablet]*vdiffRequestResponse // tablet requests + wantErr string + }{ + { + name: "basic resume", // Both target shards + req: &vtctldatapb.VDiffResumeRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Uuid: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+tabletUIDStep]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + }, + }, + { + name: "resume on first shard", + req: &vtctldatapb.VDiffResumeRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + TargetShards: targetKeyspace.ShardNames[:1], + Workflow: workflow, + Uuid: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + }, + }, + { + name: "resume on invalid shard", + req: &vtctldatapb.VDiffResumeRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + TargetShards: []string{"0"}, + Workflow: workflow, + Uuid: uuid, + }, + wantErr: fmt.Sprintf("specified target shard 0 not a valid target for workflow %s", workflow), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for tab, vdr := range tt.expectedVDiffRequests { + env.tmc.expectVDiffRequest(tab, vdr) + } + got, err := env.ws.VDiffResume(ctx, tt.req) + if tt.wantErr != "" { + require.EqualError(t, err, tt.wantErr) + } else { + require.NoError(t, err) + require.NotNil(t, got) + } + env.tmc.confirmVDiffRequests(t) + }) + } +} + +func TestVDiffStop(t *testing.T) { + ctx := context.Background() + sourceKeyspace := &testKeyspace{ + KeyspaceName: "sourceks", + ShardNames: []string{"0"}, + } + targetKeyspace := &testKeyspace{ + KeyspaceName: "targetks", + ShardNames: []string{"-80", "80-"}, + } + workflow := "testwf" + uuid := uuid.New().String() + env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) + defer env.close() + + env.tmc.strict = true + action := string(vdiff.StopAction) + + tests := []struct { + name string + req *vtctldatapb.VDiffStopRequest // vtctld requests + expectedVDiffRequests map[*topodatapb.Tablet]*vdiffRequestResponse // tablet requests + wantErr string + }{ + { + name: "basic stop", // Both target shards + req: &vtctldatapb.VDiffStopRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Uuid: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+tabletUIDStep]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + }, + }, + { + name: "stop on first shard", + req: &vtctldatapb.VDiffStopRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + TargetShards: targetKeyspace.ShardNames[:1], + Workflow: workflow, + Uuid: uuid, + }, + expectedVDiffRequests: map[*topodatapb.Tablet]*vdiffRequestResponse{ + env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID]: { + req: &tabletmanagerdatapb.VDiffRequest{ + Keyspace: targetKeyspace.KeyspaceName, + Workflow: workflow, + Action: action, + VdiffUuid: uuid, + }, + }, + }, + }, + { + name: "stop on invalid shard", + req: &vtctldatapb.VDiffStopRequest{ + TargetKeyspace: targetKeyspace.KeyspaceName, + TargetShards: []string{"0"}, + Workflow: workflow, + Uuid: uuid, + }, + wantErr: fmt.Sprintf("specified target shard 0 not a valid target for workflow %s", workflow), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for tab, vdr := range tt.expectedVDiffRequests { + env.tmc.expectVDiffRequest(tab, vdr) + } + got, err := env.ws.VDiffStop(ctx, tt.req) + if tt.wantErr != "" { + require.EqualError(t, err, tt.wantErr) + } else { + require.NoError(t, err) + require.NotNil(t, got) + } + env.tmc.confirmVDiffRequests(t) + }) + } +} + +func TestMoveTablesComplete(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + workflowName := "wf1" + table1Name := "t1" + table2Name := "t1_2" + table3Name := "t1_3" + tableTemplate := "CREATE TABLE %s (id BIGINT, name VARCHAR(64), PRIMARY KEY (id))" + sourceKeyspaceName := "sourceks" + targetKeyspaceName := "targetks" + lockName := fmt.Sprintf("%s/%s", targetKeyspaceName, workflowName) + schema := map[string]*tabletmanagerdatapb.SchemaDefinition{ + table1Name: { + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: table1Name, + Schema: fmt.Sprintf(tableTemplate, table1Name), + }, + }, + }, + table2Name: { + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: table2Name, + Schema: fmt.Sprintf(tableTemplate, table2Name), + }, + }, + }, + table3Name: { + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: table3Name, + Schema: fmt.Sprintf(tableTemplate, table3Name), + }, + }, + }, + } + + testcases := []struct { + name string + sourceKeyspace, targetKeyspace *testKeyspace + preFunc func(t *testing.T, env *testEnv) + req *vtctldatapb.MoveTablesCompleteRequest + expectedSourceQueries []*queryResult + expectedTargetQueries []*queryResult + want *vtctldatapb.MoveTablesCompleteResponse + wantErr string + postFunc func(t *testing.T, env *testEnv) + }{ + { + name: "basic", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.MoveTablesCompleteRequest{ + TargetKeyspace: targetKeyspaceName, + Workflow: workflowName, + }, + expectedSourceQueries: []*queryResult{ + { + query: fmt.Sprintf("drop table `vt_%s`.`%s`", sourceKeyspaceName, table1Name), + result: &querypb.QueryResult{}, + }, + { + query: fmt.Sprintf("drop table `vt_%s`.`%s`", sourceKeyspaceName, table2Name), + result: &querypb.QueryResult{}, + }, + { + query: fmt.Sprintf("drop table `vt_%s`.`%s`", sourceKeyspaceName, table3Name), + result: &querypb.QueryResult{}, + }, + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + sourceKeyspaceName, ReverseWorkflowName(workflowName)), + result: &querypb.QueryResult{}, + }, + }, + expectedTargetQueries: []*queryResult{ + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + targetKeyspaceName, workflowName), + result: &querypb.QueryResult{}, + }, + }, + want: &vtctldatapb.MoveTablesCompleteResponse{ + Summary: fmt.Sprintf("Successfully completed the %s workflow in the %s keyspace", + workflowName, targetKeyspaceName), + }, + }, + { + name: "keep routing rules and data", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.MoveTablesCompleteRequest{ + TargetKeyspace: targetKeyspaceName, + Workflow: workflowName, + KeepRoutingRules: true, + KeepData: true, + }, + expectedSourceQueries: []*queryResult{ + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + sourceKeyspaceName, ReverseWorkflowName(workflowName)), + result: &querypb.QueryResult{}, + }, + }, + expectedTargetQueries: []*queryResult{ + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + targetKeyspaceName, workflowName), + result: &querypb.QueryResult{}, + }, + }, + postFunc: func(t *testing.T, env *testEnv) { + env.confirmRoutingAllTablesToTarget(t) + }, + want: &vtctldatapb.MoveTablesCompleteResponse{ + Summary: fmt.Sprintf("Successfully completed the %s workflow in the %s keyspace", + workflowName, targetKeyspaceName), + }, + }, + { + name: "rename tables", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.MoveTablesCompleteRequest{ + TargetKeyspace: targetKeyspaceName, + Workflow: workflowName, + RenameTables: true, + }, + expectedSourceQueries: []*queryResult{ + { + query: fmt.Sprintf("rename table `vt_%s`.`%s` TO `vt_%s`.`_%s_old`", sourceKeyspaceName, table1Name, sourceKeyspaceName, table1Name), + result: &querypb.QueryResult{}, + }, + { + query: fmt.Sprintf("rename table `vt_%s`.`%s` TO `vt_%s`.`_%s_old`", sourceKeyspaceName, table2Name, sourceKeyspaceName, table2Name), + result: &querypb.QueryResult{}, + }, + { + query: fmt.Sprintf("rename table `vt_%s`.`%s` TO `vt_%s`.`_%s_old`", sourceKeyspaceName, table3Name, sourceKeyspaceName, table3Name), + result: &querypb.QueryResult{}, + }, + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + sourceKeyspaceName, ReverseWorkflowName(workflowName)), + result: &querypb.QueryResult{}, + }, + }, + expectedTargetQueries: []*queryResult{ + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + targetKeyspaceName, workflowName), + result: &querypb.QueryResult{}, + }, + }, + want: &vtctldatapb.MoveTablesCompleteResponse{ + Summary: fmt.Sprintf("Successfully completed the %s workflow in the %s keyspace", + workflowName, targetKeyspaceName), + }, + }, + { + name: "named lock held", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.MoveTablesCompleteRequest{ + TargetKeyspace: targetKeyspaceName, + Workflow: workflowName, + KeepRoutingRules: true, + }, + preFunc: func(t *testing.T, env *testEnv) { + _, _, err := env.ts.LockName(ctx, lockName, "test") + require.NoError(t, err) + topo.LockTimeout = 500 * time.Millisecond + }, + postFunc: func(t *testing.T, env *testEnv) { + topo.LockTimeout = 45 * time.Second // reset it to the default + }, + wantErr: fmt.Sprintf("failed to lock the %s workflow: deadline exceeded: internal/named_locks/%s", lockName, lockName), + }, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + require.NotNil(t, tc.sourceKeyspace) + require.NotNil(t, tc.targetKeyspace) + require.NotNil(t, tc.req) + env := newTestEnv(t, ctx, defaultCellName, tc.sourceKeyspace, tc.targetKeyspace) + defer env.close() + env.tmc.schema = schema + env.tmc.frozen.Store(true) + if tc.expectedSourceQueries != nil { + require.NotNil(t, env.tablets[tc.sourceKeyspace.KeyspaceName]) + for _, eq := range tc.expectedSourceQueries { + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, eq) + } + } + if tc.expectedTargetQueries != nil { + require.NotNil(t, env.tablets[tc.targetKeyspace.KeyspaceName]) + for _, eq := range tc.expectedTargetQueries { + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, eq) + } + } + if tc.preFunc != nil { + tc.preFunc(t, env) + } + // Setup the routing rules as they would be after having previously done SwitchTraffic. + env.updateTableRoutingRules(t, ctx, nil, []string{table1Name, table2Name, table3Name}, + tc.sourceKeyspace.KeyspaceName, tc.targetKeyspace.KeyspaceName, tc.targetKeyspace.KeyspaceName) + got, err := env.ws.MoveTablesComplete(ctx, tc.req) + if tc.wantErr != "" { + require.EqualError(t, err, tc.wantErr) + } else { + require.NoError(t, err) + require.EqualValues(t, got, tc.want, "Server.MoveTablesComplete() = %v, want %v", got, tc.want) + } + if tc.postFunc != nil { + tc.postFunc(t, env) + } else { // Default post checks + // Confirm that we have no routing rules. + rr, err := env.ts.GetRoutingRules(ctx) + require.NoError(t, err) + require.Zero(t, rr.Rules) + + // Confirm that we have no shard tablet controls, which is where + // DeniedTables live. + for _, keyspace := range []*testKeyspace{tc.sourceKeyspace, tc.targetKeyspace} { + for _, shardName := range keyspace.ShardNames { + checkDenyList(t, env.ts, keyspace.KeyspaceName, shardName, nil) + } + } + } }) } } @@ -213,33 +706,284 @@ func TestWorkflowDelete(t *testing.T) { defer cancel() workflowName := "wf1" - tableName := "t1" + table1Name := "t1" + table2Name := "t1_2" + table3Name := "t1_3" + tableTemplate := "CREATE TABLE %s (id BIGINT, name VARCHAR(64), PRIMARY KEY (id))" sourceKeyspaceName := "sourceks" targetKeyspaceName := "targetks" + lockName := fmt.Sprintf("%s/%s", targetKeyspaceName, workflowName) schema := map[string]*tabletmanagerdatapb.SchemaDefinition{ - "t1": { + table1Name: { TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ { - Name: tableName, - Schema: fmt.Sprintf("CREATE TABLE %s (id BIGINT, name VARCHAR(64), PRIMARY KEY (id))", tableName), + Name: table1Name, + Schema: fmt.Sprintf(tableTemplate, table1Name), + }, + }, + }, + table2Name: { + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: table2Name, + Schema: fmt.Sprintf(tableTemplate, table2Name), + }, + }, + }, + table3Name: { + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: table3Name, + Schema: fmt.Sprintf(tableTemplate, table3Name), + }, + }, + }, + } + + testcases := []struct { + name string + sourceKeyspace, targetKeyspace *testKeyspace + preFunc func(t *testing.T, env *testEnv) + req *vtctldatapb.WorkflowDeleteRequest + expectedSourceQueries []*queryResult + expectedTargetQueries []*queryResult + readVReplicationWorkflowRequest *readVReplicationWorkflowRequestResponse + want *vtctldatapb.WorkflowDeleteResponse + wantErr string + postFunc func(t *testing.T, env *testEnv) + expectedLogs []string + }{ + { + name: "missing table", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowDeleteRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + }, + expectedSourceQueries: []*queryResult{ + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + sourceKeyspaceName, ReverseWorkflowName(workflowName)), + result: &querypb.QueryResult{}, + }, + }, + expectedTargetQueries: []*queryResult{ + { + query: fmt.Sprintf("drop table `vt_%s`.`%s`", targetKeyspaceName, table1Name), + result: &querypb.QueryResult{}, + }, + { + query: fmt.Sprintf("drop table `vt_%s`.`%s`", targetKeyspaceName, table2Name), + result: &querypb.QueryResult{}, + // We don't care that the cell and tablet info is off in the error message, only that + // it contains the expected SQL error we'd encounter when attempting to drop a table + // that doesn't exist. That will then cause this error to be non-fatal and the workflow + // delete work will continue. + err: fmt.Errorf("rpc error: code = Unknown desc = TabletManager.ExecuteFetchAsDba on cell-01: rpc error: code = Unknown desc = Unknown table 'vt_%s.%s' (errno 1051) (sqlstate 42S02) during query: drop table `vt_%s`.`%s`", + targetKeyspaceName, table2Name, targetKeyspaceName, table2Name), + }, + { + query: fmt.Sprintf("drop table `vt_%s`.`%s`", targetKeyspaceName, table3Name), + result: &querypb.QueryResult{}, + }, + }, + expectedLogs: []string{ // Confirm that the custom logger is working as expected + fmt.Sprintf("Table `%s` did not exist when attempting to remove it", table2Name), + }, + want: &vtctldatapb.WorkflowDeleteResponse{ + Summary: fmt.Sprintf("Successfully cancelled the %s workflow in the %s keyspace", + workflowName, targetKeyspaceName), + Details: []*vtctldatapb.WorkflowDeleteResponse_TabletInfo{ + { + Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID}, + Deleted: true, + }, + { + Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID + tabletUIDStep}, + Deleted: true, + }, + }, + }, + }, + { + name: "multi-tenant workflow", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowDeleteRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + }, + expectedSourceQueries: []*queryResult{ + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + sourceKeyspaceName, ReverseWorkflowName(workflowName)), + result: &querypb.QueryResult{}, + }, + }, + readVReplicationWorkflowRequest: &readVReplicationWorkflowRequestResponse{ + req: &tabletmanagerdatapb.ReadVReplicationWorkflowRequest{ + Workflow: workflowName, + }, + res: &tabletmanagerdatapb.ReadVReplicationWorkflowResponse{ + Workflow: workflowName, + WorkflowType: binlogdatapb.VReplicationWorkflowType_MoveTables, + Options: `{"tenant_id": "1"}`, + Streams: []*tabletmanagerdatapb.ReadVReplicationWorkflowResponse_Stream{ + { + Id: 1, + Bls: &binlogdatapb.BinlogSource{ + Keyspace: sourceKeyspaceName, + Shard: "0", + Filter: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{ + { + Match: "t1", + Filter: "select * from t1 where tenant_id = 1", + }, + }, + }, + }, + }, + }, + }, + }, + preFunc: func(t *testing.T, env *testEnv) { + err := env.ts.SaveVSchema(ctx, targetKeyspaceName, &vschemapb.Keyspace{ + Sharded: true, + MultiTenantSpec: &vschemapb.MultiTenantSpec{ + TenantIdColumnName: "tenant_id", + TenantIdColumnType: sqltypes.Int64, + }, + }) + require.NoError(t, err) + }, + want: &vtctldatapb.WorkflowDeleteResponse{ + Summary: fmt.Sprintf("Successfully cancelled the %s workflow in the %s keyspace", + workflowName, targetKeyspaceName), + Details: []*vtctldatapb.WorkflowDeleteResponse_TabletInfo{ + { + Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID}, + Deleted: true, + }, + { + Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID + tabletUIDStep}, + Deleted: true, + }, + }, + }, + }, + { + name: "multi-tenant workflow with keep-data", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowDeleteRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + KeepData: true, + }, + expectedSourceQueries: []*queryResult{ + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + sourceKeyspaceName, ReverseWorkflowName(workflowName)), + result: &querypb.QueryResult{}, + }, + }, + want: &vtctldatapb.WorkflowDeleteResponse{ + Summary: fmt.Sprintf("Successfully cancelled the %s workflow in the %s keyspace", + workflowName, targetKeyspaceName), + Details: []*vtctldatapb.WorkflowDeleteResponse_TabletInfo{ + { + Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID}, + Deleted: true, + }, + { + Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID + tabletUIDStep}, + Deleted: true, + }, + }, + }, + }, + { + name: "multi-tenant reshard", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowDeleteRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + }, + expectedSourceQueries: []*queryResult{ + { + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + sourceKeyspaceName, ReverseWorkflowName(workflowName)), + result: &querypb.QueryResult{}, + }, + }, + readVReplicationWorkflowRequest: &readVReplicationWorkflowRequestResponse{ + req: &tabletmanagerdatapb.ReadVReplicationWorkflowRequest{ + Workflow: workflowName, + }, + res: &tabletmanagerdatapb.ReadVReplicationWorkflowResponse{ + Workflow: workflowName, + WorkflowType: binlogdatapb.VReplicationWorkflowType_Reshard, + Options: `{"tenant_id": "1"}`, + Streams: []*tabletmanagerdatapb.ReadVReplicationWorkflowResponse_Stream{ + { + Id: 1, + Bls: &binlogdatapb.BinlogSource{ + Keyspace: sourceKeyspaceName, + Shard: "0", + Filter: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{ + { + Match: "t1", + Filter: "select * from t1 where tenant_id = 1", + }, + }, + }, + }, + }, + }, }, }, + preFunc: func(t *testing.T, env *testEnv) { + err := env.ts.SaveVSchema(ctx, targetKeyspaceName, &vschemapb.Keyspace{ + Sharded: true, + MultiTenantSpec: &vschemapb.MultiTenantSpec{ + TenantIdColumnName: "tenant_id", + TenantIdColumnType: sqltypes.Int64, + }, + }) + require.NoError(t, err) + }, + wantErr: "unsupported workflow type \"Reshard\" for multi-tenant migration", }, - } - - testcases := []struct { - name string - sourceKeyspace, targetKeyspace *testKeyspace - preFunc func(t *testing.T, env *testEnv) - req *vtctldatapb.WorkflowDeleteRequest - expectedSourceQueries []*queryResult - expectedTargetQueries []*queryResult - want *vtctldatapb.WorkflowDeleteResponse - wantErr bool - postFunc func(t *testing.T, env *testEnv) - }{ { - name: "basic", + name: "multi-tenant workflow without predicate ", sourceKeyspace: &testKeyspace{ KeyspaceName: sourceKeyspaceName, ShardNames: []string{"0"}, @@ -259,29 +1003,97 @@ func TestWorkflowDelete(t *testing.T) { result: &querypb.QueryResult{}, }, }, - expectedTargetQueries: []*queryResult{ + readVReplicationWorkflowRequest: &readVReplicationWorkflowRequestResponse{ + req: &tabletmanagerdatapb.ReadVReplicationWorkflowRequest{ + Workflow: workflowName, + }, + res: &tabletmanagerdatapb.ReadVReplicationWorkflowResponse{ + Workflow: workflowName, + WorkflowType: binlogdatapb.VReplicationWorkflowType_Reshard, + Options: `{"tenant_id": "1"}`, + Streams: []*tabletmanagerdatapb.ReadVReplicationWorkflowResponse_Stream{ + { + Id: 1, + Bls: &binlogdatapb.BinlogSource{ + Keyspace: sourceKeyspaceName, + Shard: "0", + Filter: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{ + { + Match: "t1", + Filter: "select * from t1 where tenant_id = 1", + }, + }, + }, + }, + }, + }, + }, + }, + preFunc: func(t *testing.T, env *testEnv) { + err := env.ts.SaveVSchema(ctx, targetKeyspaceName, &vschemapb.Keyspace{ + Sharded: true, + MultiTenantSpec: &vschemapb.MultiTenantSpec{ + TenantIdColumnName: "tenant_id", + TenantIdColumnType: sqltypes.Int64, + }, + }) + require.NoError(t, err) + }, + wantErr: "unsupported workflow type \"Reshard\" for multi-tenant migration", + }, + { + name: "multi-tenant workflow without multi-tenant-spec in vschema", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowDeleteRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + }, + expectedSourceQueries: []*queryResult{ { - query: fmt.Sprintf("drop table `vt_%s`.`%s`", targetKeyspaceName, tableName), + query: fmt.Sprintf("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'", + sourceKeyspaceName, ReverseWorkflowName(workflowName)), result: &querypb.QueryResult{}, }, }, - want: &vtctldatapb.WorkflowDeleteResponse{ - Summary: fmt.Sprintf("Successfully cancelled the %s workflow in the %s keyspace", - workflowName, targetKeyspaceName), - Details: []*vtctldatapb.WorkflowDeleteResponse_TabletInfo{ - { - Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID}, - Deleted: true, - }, - { - Tablet: &topodatapb.TabletAlias{Cell: defaultCellName, Uid: startingTargetTabletUID + tabletUIDStep}, - Deleted: true, + readVReplicationWorkflowRequest: &readVReplicationWorkflowRequestResponse{ + req: &tabletmanagerdatapb.ReadVReplicationWorkflowRequest{ + Workflow: workflowName, + }, + res: &tabletmanagerdatapb.ReadVReplicationWorkflowResponse{ + Workflow: workflowName, + WorkflowType: binlogdatapb.VReplicationWorkflowType_MoveTables, + Options: `{"tenant_id": "1"}`, + Streams: []*tabletmanagerdatapb.ReadVReplicationWorkflowResponse_Stream{ + { + Id: 1, + Bls: &binlogdatapb.BinlogSource{ + Keyspace: sourceKeyspaceName, + Shard: "0", + Filter: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{ + { + Match: "t1", + Filter: "select * from t1 where tenant_id = 1", + }, + }, + }, + }, + }, }, }, }, + wantErr: "failed to fully delete all migrated data for tenant 1, please retry the operation: failed to build delete filter: target keyspace not defined, or it does not have multi-tenant spec", }, { - name: "basic with existing denied table entries", + name: "missing denied table entries", sourceKeyspace: &testKeyspace{ KeyspaceName: sourceKeyspaceName, ShardNames: []string{"0"}, @@ -298,7 +1110,9 @@ func TestWorkflowDelete(t *testing.T) { defer targetUnlock(&err) for _, shard := range env.targetKeyspace.ShardNames { _, err := env.ts.UpdateShardFields(lockCtx, targetKeyspaceName, shard, func(si *topo.ShardInfo) error { - err := si.UpdateDeniedTables(lockCtx, topodatapb.TabletType_PRIMARY, nil, false, []string{tableName, "t2", "t3"}) + // So t1_2 and t1_3 do not exist in the denied table list when we go + // to remove t1, t1_2, and t1_3. + err := si.UpdateDeniedTables(lockCtx, topodatapb.TabletType_PRIMARY, nil, false, []string{table1Name, "t2", "t3"}) return err }) require.NoError(t, err) @@ -317,7 +1131,15 @@ func TestWorkflowDelete(t *testing.T) { }, expectedTargetQueries: []*queryResult{ { - query: fmt.Sprintf("drop table `vt_%s`.`%s`", targetKeyspaceName, tableName), + query: fmt.Sprintf("drop table `vt_%s`.`%s`", targetKeyspaceName, table1Name), + result: &querypb.QueryResult{}, + }, + { + query: fmt.Sprintf("drop table `vt_%s`.`%s`", targetKeyspaceName, table2Name), + result: &querypb.QueryResult{}, + }, + { + query: fmt.Sprintf("drop table `vt_%s`.`%s`", targetKeyspaceName, table3Name), result: &querypb.QueryResult{}, }, }, @@ -346,6 +1168,30 @@ func TestWorkflowDelete(t *testing.T) { } }, }, + { + name: "named lock held", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowDeleteRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + }, + preFunc: func(t *testing.T, env *testEnv) { + _, _, err := env.ts.LockName(ctx, lockName, "test") + require.NoError(t, err) + topo.LockTimeout = 500 * time.Millisecond + }, + postFunc: func(t *testing.T, env *testEnv) { + topo.LockTimeout = 45 * time.Second // reset it to the default + }, + wantErr: fmt.Sprintf("failed to lock the %s workflow: deadline exceeded: internal/named_locks/%s", lockName, lockName), + }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { @@ -354,6 +1200,9 @@ func TestWorkflowDelete(t *testing.T) { require.NotNil(t, tc.req) env := newTestEnv(t, ctx, defaultCellName, tc.sourceKeyspace, tc.targetKeyspace) defer env.close() + memlogger := logutil.NewMemoryLogger() + defer memlogger.Clear() + env.ws.options.logger = memlogger env.tmc.schema = schema if tc.expectedSourceQueries != nil { require.NotNil(t, env.tablets[tc.sourceKeyspace.KeyspaceName]) @@ -367,15 +1216,23 @@ func TestWorkflowDelete(t *testing.T) { env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, eq) } } + if tc.readVReplicationWorkflowRequest != nil { + targetTablets := env.tablets[tc.targetKeyspace.KeyspaceName] + require.NotNil(t, targetTablets) + for _, tablet := range targetTablets { + env.tmc.expectReadVReplicationWorkflowRequest(tablet.Alias.Uid, tc.readVReplicationWorkflowRequest) + } + } if tc.preFunc != nil { tc.preFunc(t, env) } got, err := env.ws.WorkflowDelete(ctx, tc.req) - if (err != nil) != tc.wantErr { - require.Fail(t, "unexpected error value", "Server.WorkflowDelete() error = %v, wantErr %v", err, tc.wantErr) - return + if tc.wantErr != "" { + require.EqualError(t, err, tc.wantErr) + } else { + require.NoError(t, err) + require.EqualValues(t, got, tc.want, "Server.WorkflowDelete() = %v, want %v", got, tc.want) } - require.EqualValues(t, got, tc.want, "Server.WorkflowDelete() = %v, want %v", got, tc.want) if tc.postFunc != nil { tc.postFunc(t, env) } else { // Default post checks @@ -388,12 +1245,15 @@ func TestWorkflowDelete(t *testing.T) { // DeniedTables live. for _, keyspace := range []*testKeyspace{tc.sourceKeyspace, tc.targetKeyspace} { for _, shardName := range keyspace.ShardNames { - si, err := env.ts.GetShard(ctx, keyspace.KeyspaceName, shardName) - require.NoError(t, err) - require.Zero(t, si.Shard.TabletControls) + checkDenyList(t, env.ts, keyspace.KeyspaceName, shardName, nil) } } } + logs := memlogger.String() + // Confirm that the custom logger was passed on to the trafficSwitcher. + for _, expectedLog := range tc.expectedLogs { + require.Contains(t, logs, expectedLog) + } }) } } @@ -408,12 +1268,6 @@ func TestMoveTablesTrafficSwitching(t *testing.T) { targetKeyspaceName := "targetks" vrID := 1 - tabletTypes := []topodatapb.TabletType{ - topodatapb.TabletType_PRIMARY, - topodatapb.TabletType_REPLICA, - topodatapb.TabletType_RDONLY, - } - schema := map[string]*tabletmanagerdatapb.SchemaDefinition{ tableName: { TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ @@ -485,6 +1339,7 @@ func TestMoveTablesTrafficSwitching(t *testing.T) { name string sourceKeyspace, targetKeyspace *testKeyspace req *vtctldatapb.WorkflowSwitchTrafficRequest + preFunc func(env *testEnv) want *vtctldatapb.WorkflowSwitchTrafficResponse wantErr bool }{ @@ -502,7 +1357,7 @@ func TestMoveTablesTrafficSwitching(t *testing.T) { Keyspace: targetKeyspaceName, Workflow: workflowName, Direction: int32(DirectionForward), - TabletTypes: tabletTypes, + TabletTypes: allTabletTypes, }, want: &vtctldatapb.WorkflowSwitchTrafficResponse{ Summary: fmt.Sprintf("SwitchTraffic was successful for workflow %s.%s", targetKeyspaceName, workflowName), @@ -524,7 +1379,7 @@ func TestMoveTablesTrafficSwitching(t *testing.T) { Keyspace: targetKeyspaceName, Workflow: workflowName, Direction: int32(DirectionBackward), - TabletTypes: tabletTypes, + TabletTypes: allTabletTypes, }, want: &vtctldatapb.WorkflowSwitchTrafficResponse{ Summary: fmt.Sprintf("ReverseTraffic was successful for workflow %s.%s", targetKeyspaceName, workflowName), @@ -532,6 +1387,77 @@ func TestMoveTablesTrafficSwitching(t *testing.T) { CurrentState: "Reads Not Switched. Writes Not Switched", }, }, + { + name: "backward for read-only tablets", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowSwitchTrafficRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + Direction: int32(DirectionBackward), + TabletTypes: roTabletTypes, + }, + want: &vtctldatapb.WorkflowSwitchTrafficResponse{ + Summary: fmt.Sprintf("ReverseTraffic was successful for workflow %s.%s", targetKeyspaceName, workflowName), + StartState: "All Reads Switched. Writes Not Switched", + CurrentState: "Reads Not Switched. Writes Not Switched", + }, + }, + { + name: "forward with tablet refresh error", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowSwitchTrafficRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + Direction: int32(DirectionForward), + TabletTypes: allTabletTypes, + }, + preFunc: func(env *testEnv) { + env.tmc.SetRefreshStateError(env.tablets[sourceKeyspaceName][startingSourceTabletUID], errors.New("tablet refresh error")) + env.tmc.SetRefreshStateError(env.tablets[targetKeyspaceName][startingTargetTabletUID], errors.New("tablet refresh error")) + }, + wantErr: true, + }, + { + name: "forward with tablet refresh error and force", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowSwitchTrafficRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + Direction: int32(DirectionForward), + TabletTypes: allTabletTypes, + Force: true, + }, + preFunc: func(env *testEnv) { + env.tmc.SetRefreshStateError(env.tablets[sourceKeyspaceName][startingSourceTabletUID], errors.New("tablet refresh error")) + env.tmc.SetRefreshStateError(env.tablets[targetKeyspaceName][startingTargetTabletUID], errors.New("tablet refresh error")) + }, + want: &vtctldatapb.WorkflowSwitchTrafficResponse{ + Summary: fmt.Sprintf("SwitchTraffic was successful for workflow %s.%s", targetKeyspaceName, workflowName), + StartState: "Reads Not Switched. Writes Not Switched", + CurrentState: "All Reads Switched. Writes Switched", + }, + }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { @@ -559,55 +1485,84 @@ func TestMoveTablesTrafficSwitching(t *testing.T) { } else { env.tmc.reverse.Store(true) // Setup the routing rules as they would be after having previously done SwitchTraffic. - env.addTableRoutingRules(t, ctx, tabletTypes, []string{tableName}) - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, copyTableQR) - for i := 0; i < len(tc.targetKeyspace.ShardNames); i++ { // Per stream - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, cutoverQR) - } - for i := 0; i < len(tc.targetKeyspace.ShardNames); i++ { // Per stream - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, journalQR) - } - for i := 0; i < len(tc.targetKeyspace.ShardNames); i++ { // Per stream - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, lockTableQR) + env.updateTableRoutingRules(t, ctx, tc.req.TabletTypes, []string{tableName}, + tc.sourceKeyspace.KeyspaceName, tc.targetKeyspace.KeyspaceName, tc.targetKeyspace.KeyspaceName) + if !slices.Contains(tc.req.TabletTypes, topodatapb.TabletType_PRIMARY) { + for i := 0; i < len(tc.targetKeyspace.ShardNames); i++ { // Per stream + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, journalQR) + } + } else { + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, copyTableQR) + for i := 0; i < len(tc.targetKeyspace.ShardNames); i++ { // Per stream + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, journalQR) + } + for i := 0; i < len(tc.targetKeyspace.ShardNames); i++ { // Per stream + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, lockTableQR) + } + for i := 0; i < len(tc.targetKeyspace.ShardNames); i++ { // Per stream + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, cutoverQR) + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, deleteWFQR) + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, createWFQR) + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, createJournalQR) + } + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, freezeReverseWFQR) } - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, deleteWFQR) - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, createWFQR) - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, createJournalQR) - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, freezeReverseWFQR) + } + if tc.preFunc != nil { + tc.preFunc(env) } got, err := env.ws.WorkflowSwitchTraffic(ctx, tc.req) - if (err != nil) != tc.wantErr { - require.Fail(t, "unexpected error value", "Server.WorkflowSwitchTraffic() error = %v, wantErr %v", err, tc.wantErr) + if tc.wantErr { + require.Error(t, err) return } + require.NoError(t, err) require.Equal(t, tc.want.String(), got.String(), "Server.WorkflowSwitchTraffic() = %v, want %v", got, tc.want) // Confirm that we have the expected routing rules. rr, err := env.ts.GetRoutingRules(ctx) require.NoError(t, err) - to := fmt.Sprintf("%s.%s", tc.targetKeyspace.KeyspaceName, tableName) - if tc.req.Direction == int32(DirectionBackward) { - to = fmt.Sprintf("%s.%s", tc.sourceKeyspace.KeyspaceName, tableName) - } for _, rr := range rr.Rules { + _, rrTabletType, found := strings.Cut(rr.FromTable, "@") + if !found { // No @ is primary + rrTabletType = topodatapb.TabletType_PRIMARY.String() + } + tabletType, err := topoproto.ParseTabletType(rrTabletType) + require.NoError(t, err) + + var to string + if slices.Contains(tc.req.TabletTypes, tabletType) { + to = fmt.Sprintf("%s.%s", tc.targetKeyspace.KeyspaceName, tableName) + if tc.req.Direction == int32(DirectionBackward) { + to = fmt.Sprintf("%s.%s", tc.sourceKeyspace.KeyspaceName, tableName) + } + } else { + to = fmt.Sprintf("%s.%s", tc.sourceKeyspace.KeyspaceName, tableName) + if tc.req.Direction == int32(DirectionBackward) { + to = fmt.Sprintf("%s.%s", tc.targetKeyspace.KeyspaceName, tableName) + } + } for _, tt := range rr.ToTables { - require.Equal(t, to, tt) + require.Equal(t, to, tt, "Additional info: tablet type: %s, rr.FromTable: %s, rr.ToTables: %v, to string: %s", + tabletType.String(), rr.FromTable, rr.ToTables, to) } } - // Confirm that we have the expected denied tables entires. - for _, keyspace := range []*testKeyspace{tc.sourceKeyspace, tc.targetKeyspace} { - for _, shardName := range keyspace.ShardNames { - si, err := env.ts.GetShard(ctx, keyspace.KeyspaceName, shardName) - require.NoError(t, err) - switch { - case keyspace == tc.sourceKeyspace && tc.req.Direction == int32(DirectionForward): - require.True(t, hasDeniedTableEntry(si)) - case keyspace == tc.sourceKeyspace && tc.req.Direction == int32(DirectionBackward): - require.False(t, hasDeniedTableEntry(si)) - case keyspace == tc.targetKeyspace && tc.req.Direction == int32(DirectionForward): - require.False(t, hasDeniedTableEntry(si)) - case keyspace == tc.targetKeyspace && tc.req.Direction == int32(DirectionBackward): - require.True(t, hasDeniedTableEntry(si)) + // Confirm that we have the expected denied tables entries. + if slices.Contains(tc.req.TabletTypes, topodatapb.TabletType_PRIMARY) { + for _, keyspace := range []*testKeyspace{tc.sourceKeyspace, tc.targetKeyspace} { + for _, shardName := range keyspace.ShardNames { + si, err := env.ts.GetShard(ctx, keyspace.KeyspaceName, shardName) + require.NoError(t, err) + switch { + case keyspace == tc.sourceKeyspace && tc.req.Direction == int32(DirectionForward): + require.True(t, hasDeniedTableEntry(si)) + case keyspace == tc.sourceKeyspace && tc.req.Direction == int32(DirectionBackward): + require.False(t, hasDeniedTableEntry(si)) + case keyspace == tc.targetKeyspace && tc.req.Direction == int32(DirectionForward): + require.False(t, hasDeniedTableEntry(si)) + case keyspace == tc.targetKeyspace && tc.req.Direction == int32(DirectionBackward): + require.True(t, hasDeniedTableEntry(si)) + } } } } @@ -628,11 +1583,6 @@ func TestMoveTablesTrafficSwitchingDryRun(t *testing.T) { sourceKeyspaceName := "sourceks" targetKeyspaceName := "targetks" vrID := 1 - tabletTypes := []topodatapb.TabletType{ - topodatapb.TabletType_PRIMARY, - topodatapb.TabletType_REPLICA, - topodatapb.TabletType_RDONLY, - } schema := map[string]*tabletmanagerdatapb.SchemaDefinition{ table1Name: { TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ @@ -685,7 +1635,7 @@ func TestMoveTablesTrafficSwitchingDryRun(t *testing.T) { Keyspace: targetKeyspaceName, Workflow: workflowName, Direction: int32(DirectionForward), - TabletTypes: tabletTypes, + TabletTypes: allTabletTypes, DryRun: true, }, want: []string{ @@ -726,13 +1676,13 @@ func TestMoveTablesTrafficSwitchingDryRun(t *testing.T) { Keyspace: targetKeyspaceName, Workflow: workflowName, Direction: int32(DirectionBackward), - TabletTypes: tabletTypes, + TabletTypes: allTabletTypes, DryRun: true, }, want: []string{ fmt.Sprintf("Lock keyspace %s", targetKeyspaceName), fmt.Sprintf("Mirroring 0.00 percent of traffic from keyspace %s to keyspace %s for tablet types [REPLICA,RDONLY]", targetKeyspaceName, sourceKeyspaceName), - fmt.Sprintf("Switch reads for tables [%s] to keyspace %s for tablet types [REPLICA,RDONLY]", tablesStr, targetKeyspaceName), + fmt.Sprintf("Switch reads for tables [%s] to keyspace %s for tablet types [REPLICA,RDONLY]", tablesStr, sourceKeyspaceName), fmt.Sprintf("Routing rules for tables [%s] will be updated", tablesStr), fmt.Sprintf("Unlock keyspace %s", targetKeyspaceName), fmt.Sprintf("Lock keyspace %s", targetKeyspaceName), @@ -753,6 +1703,32 @@ func TestMoveTablesTrafficSwitchingDryRun(t *testing.T) { fmt.Sprintf("Unlock keyspace %s", targetKeyspaceName), }, }, + { + name: "backward for read-only tablets", + sourceKeyspace: &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + targetKeyspace: &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"-80", "80-"}, + }, + req: &vtctldatapb.WorkflowSwitchTrafficRequest{ + Keyspace: targetKeyspaceName, + Workflow: workflowName, + Direction: int32(DirectionBackward), + TabletTypes: roTabletTypes, + DryRun: true, + }, + want: []string{ + fmt.Sprintf("Lock keyspace %s", sourceKeyspaceName), + fmt.Sprintf("Mirroring 0.00 percent of traffic from keyspace %s to keyspace %s for tablet types [REPLICA,RDONLY]", sourceKeyspaceName, targetKeyspaceName), + fmt.Sprintf("Switch reads for tables [%s] to keyspace %s for tablet types [REPLICA,RDONLY]", tablesStr, sourceKeyspaceName), + fmt.Sprintf("Routing rules for tables [%s] will be updated", tablesStr), + fmt.Sprintf("Serving VSchema will be rebuilt for the %s keyspace", sourceKeyspaceName), + fmt.Sprintf("Unlock keyspace %s", sourceKeyspaceName), + }, + }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { @@ -773,13 +1749,20 @@ func TestMoveTablesTrafficSwitchingDryRun(t *testing.T) { } else { env.tmc.reverse.Store(true) // Setup the routing rules as they would be after having previously done SwitchTraffic. - env.addTableRoutingRules(t, ctx, tabletTypes, tables) - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, copyTableQR) - for i := 0; i < len(tc.targetKeyspace.ShardNames); i++ { // Per stream - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, journalQR) - } - for i := 0; i < len(tc.targetKeyspace.ShardNames); i++ { // Per stream - env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, lockTableQR) + env.updateTableRoutingRules(t, ctx, tc.req.TabletTypes, tables, + tc.sourceKeyspace.KeyspaceName, tc.targetKeyspace.KeyspaceName, tc.targetKeyspace.KeyspaceName) + if !slices.Contains(tc.req.TabletTypes, topodatapb.TabletType_PRIMARY) { + for i := 0; i < len(tc.sourceKeyspace.ShardNames); i++ { // Per stream + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, journalQR) + } + } else { + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.sourceKeyspace.KeyspaceName, copyTableQR) + for i := 0; i < len(tc.sourceKeyspace.ShardNames); i++ { // Per stream + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, journalQR) + } + for i := 0; i < len(tc.sourceKeyspace.ShardNames); i++ { // Per stream + env.tmc.expectVRQueryResultOnKeyspaceTablets(tc.targetKeyspace.KeyspaceName, lockTableQR) + } } } got, err := env.ws.WorkflowSwitchTraffic(ctx, tc.req) @@ -812,6 +1795,15 @@ func TestMirrorTraffic(t *testing.T) { topodatapb.TabletType_RDONLY, } + initialRoutingRules := map[string][]string{ + fmt.Sprintf("%s.%s", sourceKs, table1): {fmt.Sprintf("%s.%s", sourceKs, table1)}, + fmt.Sprintf("%s.%s", sourceKs, table2): {fmt.Sprintf("%s.%s", sourceKs, table2)}, + fmt.Sprintf("%s.%s@replica", sourceKs, table1): {fmt.Sprintf("%s.%s@replica", sourceKs, table1)}, + fmt.Sprintf("%s.%s@replica", sourceKs, table2): {fmt.Sprintf("%s.%s@replica", sourceKs, table2)}, + fmt.Sprintf("%s.%s@rdonly", sourceKs, table1): {fmt.Sprintf("%s.%s@rdonly", sourceKs, table1)}, + fmt.Sprintf("%s.%s@rdonly", sourceKs, table2): {fmt.Sprintf("%s.%s@rdonly", sourceKs, table2)}, + } + tests := []struct { name string @@ -899,8 +1891,8 @@ func TestMirrorTraffic(t *testing.T) { Percent: 50.0, }, routingRules: map[string][]string{ - fmt.Sprintf("%s.%s@rdonly", targetKs, table1): {fmt.Sprintf("%s.%s@rdonly", targetKs, table1)}, - fmt.Sprintf("%s.%s@rdonly", targetKs, table2): {fmt.Sprintf("%s.%s@rdonly", targetKs, table2)}, + fmt.Sprintf("%s.%s@rdonly", sourceKs, table1): {fmt.Sprintf("%s.%s@rdonly", targetKs, table1)}, + fmt.Sprintf("%s.%s@rdonly", sourceKs, table2): {fmt.Sprintf("%s.%s@rdonly", targetKs, table2)}, }, wantErr: "cannot mirror [rdonly] traffic for workflow src2target at this time: traffic for those tablet types is switched", wantMirrorRules: make(map[string]map[string]float32), @@ -914,8 +1906,8 @@ func TestMirrorTraffic(t *testing.T) { Percent: 50.0, }, routingRules: map[string][]string{ - fmt.Sprintf("%s.%s@replica", targetKs, table1): {fmt.Sprintf("%s.%s@replica", targetKs, table1)}, - fmt.Sprintf("%s.%s@replica", targetKs, table2): {fmt.Sprintf("%s.%s@replica", targetKs, table2)}, + fmt.Sprintf("%s.%s@replica", sourceKs, table1): {fmt.Sprintf("%s.%s@replica", targetKs, table1)}, + fmt.Sprintf("%s.%s@replica", sourceKs, table2): {fmt.Sprintf("%s.%s@replica", targetKs, table2)}, }, wantErr: "cannot mirror [replica] traffic for workflow src2target at this time: traffic for those tablet types is switched", wantMirrorRules: make(map[string]map[string]float32), @@ -929,8 +1921,8 @@ func TestMirrorTraffic(t *testing.T) { Percent: 50.0, }, routingRules: map[string][]string{ - table1: {fmt.Sprintf("%s.%s", targetKs, table1)}, - table2: {fmt.Sprintf("%s.%s", targetKs, table2)}, + fmt.Sprintf("%s.%s", sourceKs, table1): {fmt.Sprintf("%s.%s", targetKs, table1)}, + fmt.Sprintf("%s.%s", sourceKs, table2): {fmt.Sprintf("%s.%s", targetKs, table2)}, }, wantErr: "cannot mirror [primary] traffic for workflow src2target at this time: traffic for those tablet types is switched", wantMirrorRules: make(map[string]map[string]float32), @@ -1011,6 +2003,7 @@ func TestMirrorTraffic(t *testing.T) { TabletTypes: tabletTypes, Percent: 50.0, }, + routingRules: initialRoutingRules, wantMirrorRules: map[string]map[string]float32{ fmt.Sprintf("%s.%s", sourceKs, table1): { fmt.Sprintf("%s.%s", targetKs, table1): 50.0, @@ -1045,6 +2038,7 @@ func TestMirrorTraffic(t *testing.T) { TabletTypes: tabletTypes, Percent: 50.0, }, + routingRules: initialRoutingRules, wantMirrorRules: map[string]map[string]float32{ fmt.Sprintf("%s.%s", sourceKs, table1): { fmt.Sprintf("%s.%s", targetKs, table1): 50.0, @@ -1082,6 +2076,7 @@ func TestMirrorTraffic(t *testing.T) { fmt.Sprintf("%s.%s", targetKs, table1): 25.0, }, }, + routingRules: initialRoutingRules, req: &vtctldatapb.WorkflowMirrorTrafficRequest{ Keyspace: targetKs, Workflow: workflow, @@ -1202,3 +2197,62 @@ func createReadVReplicationWorkflowFunc(t *testing.T, workflowType binlogdatapb. }, nil } } + +// Test checks that we don't include logs from non-existent streams in the result. +// Ensures that we just skip the logs from non-existent streams and include the rest. +func TestGetWorkflowsStreamLogs(t *testing.T) { + ctx := context.Background() + + sourceKeyspace := "source_keyspace" + targetKeyspace := "target_keyspace" + workflow := "test_workflow" + + sourceShards := []string{"-"} + targetShards := []string{"-"} + + te := newTestMaterializerEnv(t, ctx, &vtctldatapb.MaterializeSettings{ + SourceKeyspace: sourceKeyspace, + TargetKeyspace: targetKeyspace, + Workflow: workflow, + TableSettings: []*vtctldatapb.TableMaterializeSettings{ + { + TargetTable: "table1", + SourceExpression: fmt.Sprintf("select * from %s", "table1"), + }, + { + TargetTable: "table2", + SourceExpression: fmt.Sprintf("select * from %s", "table2"), + }, + }, + }, sourceShards, targetShards) + + logResult := sqltypes.MakeTestResult( + sqltypes.MakeTestFields("id|vrepl_id|type|state|message|created_at|updated_at|`count`", "int64|int64|varchar|varchar|varchar|varchar|varchar|int64"), + "1|0|State Change|Running|test message for non-existent 1|2006-01-02 15:04:05|2006-01-02 15:04:05|1", + "2|0|State Change|Stopped|test message for non-existent 2|2006-01-02 15:04:06|2006-01-02 15:04:06|1", + "3|1|State Change|Running|log message|2006-01-02 15:04:07|2006-01-02 15:04:07|1", + ) + + te.tmc.expectVRQuery(200, "select vrepl_id, table_name, lastpk from _vt.copy_state where vrepl_id in (1) and id in (select max(id) from _vt.copy_state where vrepl_id in (1) group by vrepl_id, table_name)", &sqltypes.Result{}) + te.tmc.expectVRQuery(200, "select id from _vt.vreplication where db_name = 'vt_target_keyspace' and workflow = 'test_workflow'", &sqltypes.Result{}) + te.tmc.expectVRQuery(200, "select id, vrepl_id, type, state, message, created_at, updated_at, `count` from _vt.vreplication_log where vrepl_id in (1) order by vrepl_id asc, id asc", logResult) + + res, err := te.ws.GetWorkflows(ctx, &vtctldatapb.GetWorkflowsRequest{ + Keyspace: targetKeyspace, + Workflow: workflow, + IncludeLogs: true, + }) + require.NoError(t, err) + + assert.Len(t, res.Workflows, 1) + assert.NotNil(t, res.Workflows[0].ShardStreams["-/cell-0000000200"]) + assert.Len(t, res.Workflows[0].ShardStreams["-/cell-0000000200"].Streams, 1) + + gotLogs := res.Workflows[0].ShardStreams["-/cell-0000000200"].Streams[0].Logs + + // The non-existent stream logs shouldn't be part of the result + assert.Len(t, gotLogs, 1) + assert.Equal(t, gotLogs[0].Message, "log message") + assert.Equal(t, gotLogs[0].State, "Running") + assert.Equal(t, gotLogs[0].Id, int64(3)) +} diff --git a/go/vt/vtctl/workflow/stream_migrator.go b/go/vt/vtctl/workflow/stream_migrator.go index b294ba1fcd0..a700a1338dd 100644 --- a/go/vt/vtctl/workflow/stream_migrator.go +++ b/go/vt/vtctl/workflow/stream_migrator.go @@ -1001,7 +1001,7 @@ func (sm *StreamMigrator) createTargetStreams(ctx context.Context, tmpl []*VRepl } ig.AddRow(vrs.Workflow, vrs.BinlogSource, replication.EncodePosition(vrs.Position), "", "", - vrs.WorkflowType, vrs.WorkflowSubType, vrs.DeferSecondaryKeys) + vrs.WorkflowType, vrs.WorkflowSubType, vrs.DeferSecondaryKeys, "") return nil } diff --git a/go/vt/vtctl/workflow/stream_migrator_test.go b/go/vt/vtctl/workflow/stream_migrator_test.go index 38ae10280f7..5e9c2a79038 100644 --- a/go/vt/vtctl/workflow/stream_migrator_test.go +++ b/go/vt/vtctl/workflow/stream_migrator_test.go @@ -19,17 +19,22 @@ package workflow import ( "context" "encoding/json" + "fmt" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/key" + "vitess.io/vitess/go/vt/proto/tabletmanagerdata" "vitess.io/vitess/go/vt/sqlparser" - + "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vtgate/vindexes" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" vschemapb "vitess.io/vitess/go/vt/proto/vschema" ) @@ -347,3 +352,271 @@ func stringifyVRS(streams []*VReplicationStream) string { b, _ := json.Marshal(converted) return string(b) } + +var testVSchema = &vschemapb.Keyspace{ + Sharded: true, + Vindexes: map[string]*vschemapb.Vindex{ + "xxhash": { + Type: "xxhash", + }, + }, + Tables: map[string]*vschemapb.Table{ + "t1": { + ColumnVindexes: []*vschemapb.ColumnVindex{{ + Columns: []string{"c1"}, + Name: "xxhash", + }}, + }, + "t2": { + ColumnVindexes: []*vschemapb.ColumnVindex{{ + Columns: []string{"c1"}, + Name: "xxhash", + }}, + }, + "ref": { + Type: vindexes.TypeReference, + }, + }, +} + +var ( + commerceKeyspace = &testKeyspace{ + KeyspaceName: "commerce", + ShardNames: []string{"0"}, + } + customerUnshardedKeyspace = &testKeyspace{ + KeyspaceName: "customer", + ShardNames: []string{"0"}, + } + customerShardedKeyspace = &testKeyspace{ + KeyspaceName: "customer", + ShardNames: []string{"-80", "80-"}, + } +) + +type streamMigratorEnv struct { + tenv *testEnv + ts *testTrafficSwitcher + sourceTabletIds []int + targetTabletIds []int +} + +func (env *streamMigratorEnv) close() { + env.tenv.close() +} + +func (env *streamMigratorEnv) addSourceQueries(queries []string) { + for _, id := range env.sourceTabletIds { + for _, q := range queries { + env.tenv.tmc.expectVRQuery(id, q, &sqltypes.Result{}) + } + } +} + +func (env *streamMigratorEnv) addTargetQueries(queries []string) { + for _, id := range env.targetTabletIds { + for _, q := range queries { + env.tenv.tmc.expectVRQuery(id, q, &sqltypes.Result{}) + } + } +} + +func newStreamMigratorEnv(ctx context.Context, t *testing.T, sourceKeyspace, targetKeyspace *testKeyspace) *streamMigratorEnv { + tenv := newTestEnv(t, ctx, "cell1", sourceKeyspace, targetKeyspace) + env := &streamMigratorEnv{tenv: tenv} + + ksschema, err := vindexes.BuildKeyspaceSchema(testVSchema, "ks", sqlparser.NewTestParser()) + require.NoError(t, err, "could not create test keyspace %+v", testVSchema) + sources := make(map[string]*MigrationSource, len(sourceKeyspace.ShardNames)) + targets := make(map[string]*MigrationTarget, len(targetKeyspace.ShardNames)) + for i, shard := range sourceKeyspace.ShardNames { + tablet := tenv.tablets[sourceKeyspace.KeyspaceName][startingSourceTabletUID+(i*tabletUIDStep)] + kr, _ := key.ParseShardingSpec(shard) + sources[shard] = &MigrationSource{ + si: topo.NewShardInfo(sourceKeyspace.KeyspaceName, shard, &topodatapb.Shard{KeyRange: kr[0]}, nil), + primary: &topo.TabletInfo{ + Tablet: tablet, + }, + } + env.sourceTabletIds = append(env.sourceTabletIds, int(tablet.Alias.Uid)) + } + for i, shard := range targetKeyspace.ShardNames { + tablet := tenv.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+(i*tabletUIDStep)] + kr, _ := key.ParseShardingSpec(shard) + targets[shard] = &MigrationTarget{ + si: topo.NewShardInfo(targetKeyspace.KeyspaceName, shard, &topodatapb.Shard{KeyRange: kr[0]}, nil), + primary: &topo.TabletInfo{ + Tablet: tablet, + }, + } + env.targetTabletIds = append(env.targetTabletIds, int(tablet.Alias.Uid)) + } + ts := &testTrafficSwitcher{ + trafficSwitcher: trafficSwitcher{ + migrationType: binlogdatapb.MigrationType_SHARDS, + workflow: "wf1", + id: 1, + sources: sources, + targets: targets, + sourceKeyspace: sourceKeyspace.KeyspaceName, + targetKeyspace: targetKeyspace.KeyspaceName, + sourceKSSchema: ksschema, + workflowType: binlogdatapb.VReplicationWorkflowType_Reshard, + ws: tenv.ws, + }, + sourceKeyspaceSchema: ksschema, + } + env.ts = ts + + return env +} + +func addMaterializeWorkflow(t *testing.T, env *streamMigratorEnv, id int32, sourceShard string) { + var wfs tabletmanagerdata.ReadVReplicationWorkflowsResponse + wfName := "wfMat1" + wfs.Workflows = append(wfs.Workflows, &tabletmanagerdata.ReadVReplicationWorkflowResponse{ + Workflow: wfName, + WorkflowType: binlogdatapb.VReplicationWorkflowType_Materialize, + }) + wfs.Workflows[0].Streams = append(wfs.Workflows[0].Streams, &tabletmanagerdata.ReadVReplicationWorkflowResponse_Stream{ + Id: id, + Bls: &binlogdatapb.BinlogSource{ + Keyspace: env.tenv.sourceKeyspace.KeyspaceName, + Shard: sourceShard, + Filter: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{ + {Match: "t1", Filter: "select * from t1"}, + }, + }, + }, + Pos: position, + State: binlogdatapb.VReplicationWorkflowState_Running, + }) + workflowKey := env.tenv.tmc.GetWorkflowKey(env.tenv.sourceKeyspace.KeyspaceName, sourceShard) + workflowResponses := []*tabletmanagerdata.ReadVReplicationWorkflowsResponse{ + nil, // this is the response for getting stopped workflows + &wfs, &wfs, &wfs, // return the full list for subsequent GetWorkflows calls + } + for _, resp := range workflowResponses { + env.tenv.tmc.AddVReplicationWorkflowsResponse(workflowKey, resp) + } + queries := []string{ + fmt.Sprintf("select distinct vrepl_id from _vt.copy_state where vrepl_id in (%d)", id), + fmt.Sprintf("update _vt.vreplication set state='Stopped', message='for cutover' where id in (%d)", id), + fmt.Sprintf("delete from _vt.vreplication where db_name='vt_%s' and workflow in ('%s')", + env.tenv.sourceKeyspace.KeyspaceName, wfName), + } + env.addSourceQueries(queries) + queries = []string{ + fmt.Sprintf("delete from _vt.vreplication where db_name='vt_%s' and workflow in ('%s')", + env.tenv.sourceKeyspace.KeyspaceName, wfName), + } + env.addTargetQueries(queries) + +} + +func addReferenceWorkflow(t *testing.T, env *streamMigratorEnv, id int32, sourceShard string) { + var wfs tabletmanagerdata.ReadVReplicationWorkflowsResponse + wfName := "wfRef1" + wfs.Workflows = append(wfs.Workflows, &tabletmanagerdata.ReadVReplicationWorkflowResponse{ + Workflow: wfName, + WorkflowType: binlogdatapb.VReplicationWorkflowType_Materialize, + }) + wfs.Workflows[0].Streams = append(wfs.Workflows[0].Streams, &tabletmanagerdata.ReadVReplicationWorkflowResponse_Stream{ + Id: id, + Bls: &binlogdatapb.BinlogSource{ + Keyspace: env.tenv.sourceKeyspace.KeyspaceName, + Shard: sourceShard, + Filter: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{ + {Match: "ref", Filter: "select * from ref"}, + }, + }, + }, + Pos: position, + State: binlogdatapb.VReplicationWorkflowState_Running, + }) + workflowKey := env.tenv.tmc.GetWorkflowKey(env.tenv.sourceKeyspace.KeyspaceName, sourceShard) + workflowResponses := []*tabletmanagerdata.ReadVReplicationWorkflowsResponse{ + nil, // this is the response for getting stopped workflows + &wfs, &wfs, &wfs, // return the full list for subsequent GetWorkflows calls + } + for _, resp := range workflowResponses { + env.tenv.tmc.AddVReplicationWorkflowsResponse(workflowKey, resp) + } +} + +func TestBuildStreamMigratorOneMaterialize(t *testing.T) { + ctx := context.Background() + env := newStreamMigratorEnv(ctx, t, customerUnshardedKeyspace, customerShardedKeyspace) + defer env.close() + tmc := env.tenv.tmc + + addMaterializeWorkflow(t, env, 100, "0") + + // FIXME: Note: currently it is not optimal: we create two streams for each shard from all the + // shards even if the key ranges don't intersect. TBD + getInsert := func(shard string) string { + s := "/insert into _vt.vreplication.*" + s += fmt.Sprintf("shard:\"-80\".*in_keyrange.*c1.*%s.*", shard) + s += fmt.Sprintf("shard:\"80-\".*in_keyrange.*c1.*%s.*", shard) + return s + } + tmc.expectVRQuery(200, getInsert("-80"), &sqltypes.Result{}) + tmc.expectVRQuery(210, getInsert("80-"), &sqltypes.Result{}) + + sm, err := BuildStreamMigrator(ctx, env.ts, false, sqlparser.NewTestParser()) + require.NoError(t, err) + require.NotNil(t, sm) + require.NotNil(t, sm.streams) + require.Equal(t, 1, len(sm.streams)) + + workflows, err := sm.StopStreams(ctx) + require.NoError(t, err) + require.Equal(t, 1, len(workflows)) + require.NoError(t, sm.MigrateStreams(ctx)) + require.Len(t, sm.templates, 1) + env.addTargetQueries([]string{ + fmt.Sprintf("update _vt.vreplication set state='Running' where db_name='vt_%s' and workflow in ('%s')", + env.tenv.sourceKeyspace.KeyspaceName, "wfMat1"), + }) + require.NoError(t, StreamMigratorFinalize(ctx, env.ts, []string{"wfMat1"})) +} + +func TestBuildStreamMigratorNoStreams(t *testing.T) { + ctx := context.Background() + env := newStreamMigratorEnv(ctx, t, customerUnshardedKeyspace, customerShardedKeyspace) + defer env.close() + + sm, err := BuildStreamMigrator(ctx, env.ts, false, sqlparser.NewTestParser()) + require.NoError(t, err) + require.NotNil(t, sm) + require.NotNil(t, sm.streams) + require.Equal(t, 0, len(sm.streams)) + + workflows, err := sm.StopStreams(ctx) + require.NoError(t, err) + require.Equal(t, 0, len(workflows)) + require.NoError(t, sm.MigrateStreams(ctx)) + require.Len(t, sm.templates, 0) +} + +func TestBuildStreamMigratorRefStream(t *testing.T) { + ctx := context.Background() + env := newStreamMigratorEnv(ctx, t, customerUnshardedKeyspace, customerShardedKeyspace) + defer env.close() + + addReferenceWorkflow(t, env, 100, "0") + + sm, err := BuildStreamMigrator(ctx, env.ts, false, sqlparser.NewTestParser()) + require.NoError(t, err) + require.NotNil(t, sm) + require.NotNil(t, sm.streams) + require.Equal(t, 0, len(sm.streams)) + + workflows, err := sm.StopStreams(ctx) + require.NoError(t, err) + require.Equal(t, 0, len(workflows)) + require.NoError(t, sm.MigrateStreams(ctx)) + require.Len(t, sm.templates, 0) +} diff --git a/go/vt/vtctl/workflow/traffic_switcher.go b/go/vt/vtctl/workflow/traffic_switcher.go index c9d9952ef8f..937dffe70b3 100644 --- a/go/vt/vtctl/workflow/traffic_switcher.go +++ b/go/vt/vtctl/workflow/traffic_switcher.go @@ -38,6 +38,7 @@ import ( "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/logutil" + "vitess.io/vitess/go/vt/mysqlctl/tmutils" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" @@ -76,9 +77,10 @@ const ( // Use pt-osc's naming convention, this format also ensures vstreamer ignores such tables. renameTableTemplate = "_%.59s_old" // limit table name to 64 characters - sqlDeleteWorkflow = "delete from _vt.vreplication where db_name = %s and workflow = %s" - sqlGetMaxSequenceVal = "select max(%a) as maxval from %a.%a" - sqlInitSequenceTable = "insert into %a.%a (id, next_id, cache) values (0, %d, 1000) on duplicate key update next_id = if(next_id < %d, %d, next_id)" + sqlDeleteWorkflow = "delete from _vt.vreplication where db_name = %s and workflow = %s" + sqlGetMaxSequenceVal = "select max(%a) as maxval from %a.%a" + sqlInitSequenceTable = "insert into %a.%a (id, next_id, cache) values (0, %d, 1000) on duplicate key update next_id = if(next_id < %d, %d, next_id)" + sqlCreateSequenceTable = "create table if not exists %a (id int, next_id bigint, cache bigint, primary key(id)) comment 'vitess_sequence'" ) // accessType specifies the type of access for a shard (allow/disallow writes). @@ -223,10 +225,13 @@ type trafficSwitcher struct { logger logutil.Logger migrationType binlogdatapb.MigrationType - isPartialMigration bool + isPartialMigration bool // Is this on a subset of shards workflow string - // if frozen is true, the rest of the fields are not set. + // Should we continue if we encounter some potentially non-fatal errors such + // as partial tablet refreshes? + force bool + // If frozen is true, the rest of the fields are not set. frozen bool reverseWorkflow string id int64 @@ -252,7 +257,7 @@ func (ts *trafficSwitcher) TopoServer() *topo.Server { func (ts *trafficSwitcher) TabletManagerClient() tmclient.TabletManagerClient { return ts.ws.tmc } func (ts *trafficSwitcher) Logger() logutil.Logger { if ts.logger == nil { - ts.logger = logutil.NewConsoleLogger() + ts.logger = logutil.NewConsoleLogger() // Use the default system logger } return ts.logger } @@ -290,7 +295,7 @@ func (ts *trafficSwitcher) ForAllSources(f func(source *MigrationSource) error) return allErrors.AggrError(vterrors.Aggregate) } -func (ts *trafficSwitcher) ForAllTargets(f func(source *MigrationTarget) error) error { +func (ts *trafficSwitcher) ForAllTargets(f func(target *MigrationTarget) error) error { var wg sync.WaitGroup allErrors := &concurrency.AllErrorRecorder{} for _, target := range ts.targets { @@ -436,7 +441,7 @@ func (ts *trafficSwitcher) deleteShardRoutingRules(ctx context.Context) error { srr, err := topotools.GetShardRoutingRules(ctx, ts.TopoServer()) if err != nil { if topo.IsErrType(err, topo.NoNode) { - log.Warningf("No shard routing rules found when attempting to delete the ones for the %s keyspace", ts.targetKeyspace) + ts.Logger().Warningf("No shard routing rules found when attempting to delete the ones for the %s keyspace", ts.targetKeyspace) return nil } return err @@ -454,7 +459,7 @@ func (ts *trafficSwitcher) deleteKeyspaceRoutingRules(ctx context.Context) error if !ts.IsMultiTenantMigration() { return nil } - log.Infof("deleteKeyspaceRoutingRules: workflow %s.%s", ts.targetKeyspace, ts.workflow) + ts.Logger().Infof("deleteKeyspaceRoutingRules: workflow %s.%s", ts.targetKeyspace, ts.workflow) reason := fmt.Sprintf("Deleting rules for %s", ts.SourceKeyspaceName()) return topotools.UpdateKeyspaceRoutingRules(ctx, ts.TopoServer(), reason, func(ctx context.Context, rules *map[string]string) error { @@ -474,7 +479,17 @@ func (ts *trafficSwitcher) dropSourceDeniedTables(ctx context.Context) error { } rtbsCtx, cancel := context.WithTimeout(ctx, shardTabletRefreshTimeout) defer cancel() - _, _, err := topotools.RefreshTabletsByShard(rtbsCtx, ts.TopoServer(), ts.TabletManagerClient(), source.GetShard(), nil, ts.Logger()) + isPartial, partialDetails, err := topotools.RefreshTabletsByShard(rtbsCtx, ts.TopoServer(), ts.TabletManagerClient(), source.GetShard(), nil, ts.Logger()) + if isPartial { + msg := fmt.Sprintf("failed to successfully refresh all tablets in the %s/%s source shard (%v):\n %v", + source.GetShard().Keyspace(), source.GetShard().ShardName(), err, partialDetails) + if ts.force { + log.Warning(msg) + return nil + } else { + return errors.New(msg) + } + } return err }) } @@ -488,7 +503,17 @@ func (ts *trafficSwitcher) dropTargetDeniedTables(ctx context.Context) error { } rtbsCtx, cancel := context.WithTimeout(ctx, shardTabletRefreshTimeout) defer cancel() - _, _, err := topotools.RefreshTabletsByShard(rtbsCtx, ts.TopoServer(), ts.TabletManagerClient(), target.GetShard(), nil, ts.Logger()) + isPartial, partialDetails, err := topotools.RefreshTabletsByShard(rtbsCtx, ts.TopoServer(), ts.TabletManagerClient(), target.GetShard(), nil, ts.Logger()) + if isPartial { + msg := fmt.Sprintf("failed to successfully refresh all tablets in the %s/%s target shard (%v):\n %v", + target.GetShard().Keyspace(), target.GetShard().ShardName(), err, partialDetails) + if ts.force { + log.Warning(msg) + return nil + } else { + return errors.New(msg) + } + } return err }) } @@ -548,12 +573,12 @@ func (ts *trafficSwitcher) removeSourceTables(ctx context.Context, removalType T DisableForeignKeyChecks: true, }) if err != nil { - if mysqlErr, ok := err.(*sqlerror.SQLError); ok && mysqlErr.Num == sqlerror.ERNoSuchTable { + if IsTableDidNotExistError(err) { ts.Logger().Warningf("%s: Table %s did not exist when attempting to remove it", topoproto.TabletAliasString(source.GetPrimary().GetAlias()), tableName) - return nil + } else { + ts.Logger().Errorf("%s: Error removing table %s: %v", topoproto.TabletAliasString(source.GetPrimary().GetAlias()), tableName, err) + return err } - ts.Logger().Errorf("%s: Error removing table %s: %v", topoproto.TabletAliasString(source.GetPrimary().GetAlias()), tableName, err) - return err } ts.Logger().Infof("%s: Removed table %s.%s\n", topoproto.TabletAliasString(source.GetPrimary().GetAlias()), source.GetPrimary().DbName(), tableName) @@ -582,20 +607,28 @@ func (ts *trafficSwitcher) dropSourceShards(ctx context.Context) error { } func (ts *trafficSwitcher) switchShardReads(ctx context.Context, cells []string, servedTypes []topodatapb.TabletType, direction TrafficSwitchDirection) error { + ts.Logger().Infof("switchShardReads: workflow: %s, direction: %s, cells: %v, tablet types: %v", + ts.workflow, direction.String(), cells, servedTypes) + + var fromShards, toShards []*topo.ShardInfo + if direction == DirectionForward { + fromShards, toShards = ts.SourceShards(), ts.TargetShards() + } else { + fromShards, toShards = ts.TargetShards(), ts.SourceShards() + } + cellsStr := strings.Join(cells, ",") - log.Infof("switchShardReads: cells: %s, tablet types: %+v, direction %d", cellsStr, servedTypes, direction) - fromShards, toShards := ts.SourceShards(), ts.TargetShards() if err := ts.TopoServer().ValidateSrvKeyspace(ctx, ts.TargetKeyspaceName(), cellsStr); err != nil { err2 := vterrors.Wrapf(err, "Before switching shard reads, found SrvKeyspace for %s is corrupt in cell %s", ts.TargetKeyspaceName(), cellsStr) - log.Errorf("%w", err2) + ts.Logger().Errorf("%w", err2) return err2 } for _, servedType := range servedTypes { - if err := ts.ws.updateShardRecords(ctx, ts.SourceKeyspaceName(), fromShards, cells, servedType, true /* isFrom */, false /* clearSourceShards */, ts.logger); err != nil { + if err := ts.ws.updateShardRecords(ctx, ts.SourceKeyspaceName(), fromShards, cells, servedType, true /* isFrom */, false /* clearSourceShards */, ts.Logger()); err != nil { return err } - if err := ts.ws.updateShardRecords(ctx, ts.SourceKeyspaceName(), toShards, cells, servedType, false, false, ts.logger); err != nil { + if err := ts.ws.updateShardRecords(ctx, ts.SourceKeyspaceName(), toShards, cells, servedType, false, false, ts.Logger()); err != nil { return err } err := ts.TopoServer().MigrateServedType(ctx, ts.SourceKeyspaceName(), toShards, fromShards, servedType, cells) @@ -606,14 +639,16 @@ func (ts *trafficSwitcher) switchShardReads(ctx context.Context, cells []string, if err := ts.TopoServer().ValidateSrvKeyspace(ctx, ts.TargetKeyspaceName(), cellsStr); err != nil { err2 := vterrors.Wrapf(err, "after switching shard reads, found SrvKeyspace for %s is corrupt in cell %s", ts.TargetKeyspaceName(), cellsStr) - log.Errorf("%w", err2) + ts.Logger().Errorf("%w", err2) return err2 } return nil } func (ts *trafficSwitcher) switchTableReads(ctx context.Context, cells []string, servedTypes []topodatapb.TabletType, rebuildSrvVSchema bool, direction TrafficSwitchDirection) error { - log.Infof("switchTableReads: cells: %s, tablet types: %+v, direction: %s", strings.Join(cells, ","), servedTypes, direction) + ts.Logger().Infof("switchTableReads: workflow: %s, direction: %s, cells: %v, tablet types: %v", + ts.workflow, direction.String(), cells, servedTypes) + rules, err := topotools.GetRoutingRules(ctx, ts.TopoServer()) if err != nil { return err @@ -627,13 +662,19 @@ func (ts *trafficSwitcher) switchTableReads(ctx context.Context, cells []string, if servedType != topodatapb.TabletType_REPLICA && servedType != topodatapb.TabletType_RDONLY { return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid tablet type specified when switching reads: %v", servedType) } - tt := strings.ToLower(servedType.String()) for _, table := range ts.Tables() { - toTarget := []string{ts.TargetKeyspaceName() + "." + table} - rules[table+"@"+tt] = toTarget - rules[ts.TargetKeyspaceName()+"."+table+"@"+tt] = toTarget - rules[ts.SourceKeyspaceName()+"."+table+"@"+tt] = toTarget + if direction == DirectionForward { + toTarget := []string{ts.TargetKeyspaceName() + "." + table} + rules[table+"@"+tt] = toTarget + rules[ts.TargetKeyspaceName()+"."+table+"@"+tt] = toTarget + rules[ts.SourceKeyspaceName()+"."+table+"@"+tt] = toTarget + } else { + toSource := []string{ts.SourceKeyspaceName() + "." + table} + rules[table+"@"+tt] = toSource + rules[ts.TargetKeyspaceName()+"."+table+"@"+tt] = toSource + rules[ts.SourceKeyspaceName()+"."+table+"@"+tt] = toSource + } } } if err := topotools.SaveRoutingRules(ctx, ts.TopoServer(), rules); err != nil { @@ -655,7 +696,7 @@ func (ts *trafficSwitcher) startReverseVReplication(ctx context.Context) error { } func (ts *trafficSwitcher) createJournals(ctx context.Context, sourceWorkflows []string) error { - log.Infof("In createJournals for source workflows %+v", sourceWorkflows) + ts.Logger().Infof("In createJournals for source workflows %+v", sourceWorkflows) return ts.ForAllSources(func(source *MigrationSource) error { if source.Journaled { return nil @@ -692,7 +733,6 @@ func (ts *trafficSwitcher) createJournals(ctx context.Context, sourceWorkflows [ }) } - log.Infof("Creating journal %v", journal) ts.Logger().Infof("Creating journal: %v", journal) statement := fmt.Sprintf("insert into _vt.resharding_journal "+ "(id, db_name, val) "+ @@ -709,7 +749,7 @@ func (ts *trafficSwitcher) changeShardsAccess(ctx context.Context, keyspace stri if err := ts.TopoServer().UpdateDisableQueryService(ctx, keyspace, shards, topodatapb.TabletType_PRIMARY, nil, access == disallowWrites /* disable */); err != nil { return err } - return ts.ws.refreshPrimaryTablets(ctx, shards) + return ts.ws.refreshPrimaryTablets(ctx, shards, ts.force) } func (ts *trafficSwitcher) allowTargetWrites(ctx context.Context) error { @@ -773,7 +813,7 @@ func (ts *trafficSwitcher) changeWriteRoute(ctx context.Context) error { func (ts *trafficSwitcher) changeShardRouting(ctx context.Context) error { if err := ts.TopoServer().ValidateSrvKeyspace(ctx, ts.TargetKeyspaceName(), ""); err != nil { err2 := vterrors.Wrapf(err, "Before changing shard routes, found SrvKeyspace for %s is corrupt", ts.TargetKeyspaceName()) - log.Errorf("%w", err2) + ts.Logger().Errorf("%w", err2) return err2 } err := ts.ForAllSources(func(source *MigrationSource) error { @@ -802,7 +842,7 @@ func (ts *trafficSwitcher) changeShardRouting(ctx context.Context) error { } if err := ts.TopoServer().ValidateSrvKeyspace(ctx, ts.TargetKeyspaceName(), ""); err != nil { err2 := vterrors.Wrapf(err, "after changing shard routes, found SrvKeyspace for %s is corrupt", ts.TargetKeyspaceName()) - log.Errorf("%w", err2) + ts.Logger().Errorf("%w", err2) return err2 } return nil @@ -922,7 +962,7 @@ func (ts *trafficSwitcher) createReverseVReplication(ctx context.Context) error Filter: filter, }) } - log.Infof("Creating reverse workflow vreplication stream on tablet %s: workflow %s, startPos %s", + ts.Logger().Infof("Creating reverse workflow vreplication stream on tablet %s: workflow %s, startPos %s", source.GetPrimary().GetAlias(), ts.ReverseWorkflowName(), target.Position) _, err = ts.VReplicationExec(ctx, source.GetPrimary().GetAlias(), binlogplayer.CreateVReplicationState(ts.ReverseWorkflowName(), reverseBls, target.Position, @@ -939,7 +979,7 @@ func (ts *trafficSwitcher) createReverseVReplication(ctx context.Context) error updateQuery := ts.getReverseVReplicationUpdateQuery(target.GetPrimary().GetAlias().GetCell(), source.GetPrimary().GetAlias().GetCell(), source.GetPrimary().DbName(), string(optionsJSON)) if updateQuery != "" { - log.Infof("Updating vreplication stream entry on %s with: %s", source.GetPrimary().GetAlias(), updateQuery) + ts.Logger().Infof("Updating vreplication stream entry on %s with: %s", source.GetPrimary().GetAlias(), updateQuery) _, err = ts.VReplicationExec(ctx, source.GetPrimary().GetAlias(), updateQuery) return err } @@ -950,15 +990,7 @@ func (ts *trafficSwitcher) createReverseVReplication(ctx context.Context) error func (ts *trafficSwitcher) addTenantFilter(ctx context.Context, filter string) (string, error) { parser := ts.ws.env.Parser() - vschema, err := ts.TopoServer().GetVSchema(ctx, ts.targetKeyspace) - if err != nil { - return "", err - } - targetVSchema, err := vindexes.BuildKeyspaceSchema(vschema, ts.targetKeyspace, parser) - if err != nil { - return "", err - } - tenantClause, err := getTenantClause(ts.options, targetVSchema, parser) + tenantClause, err := ts.buildTenantPredicate(ctx) if err != nil { return "", err } @@ -975,6 +1007,23 @@ func (ts *trafficSwitcher) addTenantFilter(ctx context.Context, filter string) ( return filter, nil } +func (ts *trafficSwitcher) buildTenantPredicate(ctx context.Context) (*sqlparser.Expr, error) { + parser := ts.ws.env.Parser() + vschema, err := ts.TopoServer().GetVSchema(ctx, ts.targetKeyspace) + if err != nil { + return nil, err + } + targetVSchema, err := vindexes.BuildKeyspaceSchema(vschema, ts.targetKeyspace, parser) + if err != nil { + return nil, err + } + tenantPredicate, err := getTenantClause(ts.options, targetVSchema, parser) + if err != nil { + return nil, err + } + return tenantPredicate, nil +} + func (ts *trafficSwitcher) waitForCatchup(ctx context.Context, filteredReplicationWaitTime time.Duration) error { ctx, cancel := context.WithTimeout(ctx, filteredReplicationWaitTime) defer cancel() @@ -989,12 +1038,12 @@ func (ts *trafficSwitcher) waitForCatchup(ctx context.Context, filteredReplicati if err := ts.TabletManagerClient().VReplicationWaitForPos(ctx, target.GetPrimary().Tablet, uid, source.Position); err != nil { return err } - log.Infof("After catchup: target keyspace:shard: %v:%v, source position %v, uid %d", + ts.Logger().Infof("After catchup: target keyspace:shard: %v:%v, source position %v, uid %d", ts.TargetKeyspaceName(), target.GetShard().ShardName(), source.Position, uid) ts.Logger().Infof("After catchup: position for keyspace:shard: %v:%v reached, uid %d", ts.TargetKeyspaceName(), target.GetShard().ShardName(), uid) if _, err := ts.TabletManagerClient().VReplicationExec(ctx, target.GetPrimary().Tablet, binlogplayer.StopVReplication(uid, "stopped for cutover")); err != nil { - log.Infof("Error marking stopped for cutover on %s, uid %d", topoproto.TabletAliasString(target.GetPrimary().GetAlias()), uid) + ts.Logger().Infof("Error marking stopped for cutover on %s, uid %d", topoproto.TabletAliasString(target.GetPrimary().GetAlias()), uid) return err } return nil @@ -1018,19 +1067,10 @@ func (ts *trafficSwitcher) stopSourceWrites(ctx context.Context) error { err = ts.changeShardsAccess(ctx, ts.SourceKeyspaceName(), ts.SourceShards(), disallowWrites) } if err != nil { - log.Warningf("Error: %s", err) + ts.Logger().Warningf("Error stopping writes on migration sources: %v", err) return err } - return ts.ForAllSources(func(source *MigrationSource) error { - var err error - source.Position, err = ts.TabletManagerClient().PrimaryPosition(ctx, source.GetPrimary().Tablet) - log.Infof("Stopped Source Writes. Position for source %v:%v: %v", - ts.SourceKeyspaceName(), source.GetShard().ShardName(), source.Position) - if err != nil { - log.Warningf("Error: %s", err) - } - return err - }) + return nil } // switchDeniedTables switches the denied tables rules for the traffic switch. @@ -1052,8 +1092,14 @@ func (ts *trafficSwitcher) switchDeniedTables(ctx context.Context) error { defer cancel() isPartial, partialDetails, err := topotools.RefreshTabletsByShard(rtbsCtx, ts.TopoServer(), ts.TabletManagerClient(), source.GetShard(), nil, ts.Logger()) if isPartial { - err = fmt.Errorf("failed to successfully refresh all tablets in the %s/%s source shard (%v):\n %v", + msg := fmt.Sprintf("failed to successfully refresh all tablets in the %s/%s source shard (%v):\n %v", source.GetShard().Keyspace(), source.GetShard().ShardName(), err, partialDetails) + if ts.force { + log.Warning(msg) + return nil + } else { + return errors.New(msg) + } } return err }) @@ -1069,14 +1115,20 @@ func (ts *trafficSwitcher) switchDeniedTables(ctx context.Context) error { defer cancel() isPartial, partialDetails, err := topotools.RefreshTabletsByShard(rtbsCtx, ts.TopoServer(), ts.TabletManagerClient(), target.GetShard(), nil, ts.Logger()) if isPartial { - err = fmt.Errorf("failed to successfully refresh all tablets in the %s/%s target shard (%v):\n %v", + msg := fmt.Sprintf("failed to successfully refresh all tablets in the %s/%s target shard (%v):\n %v", target.GetShard().Keyspace(), target.GetShard().ShardName(), err, partialDetails) + if ts.force { + log.Warning(msg) + return nil + } else { + return errors.New(msg) + } } return err }) }) if err := egrp.Wait(); err != nil { - log.Warningf("Error in switchDeniedTables: %s", err) + ts.Logger().Warningf("Error in switchDeniedTables: %s", err) return err } @@ -1158,7 +1210,7 @@ func (ts *trafficSwitcher) dropSourceReverseVReplicationStreams(ctx context.Cont func (ts *trafficSwitcher) removeTargetTables(ctx context.Context) error { err := ts.ForAllTargets(func(target *MigrationTarget) error { - log.Infof("ForAllTargets: %+v", target) + ts.Logger().Infof("ForAllTargets: %+v", target) for _, tableName := range ts.Tables() { primaryDbName, err := sqlescape.EnsureEscaped(target.GetPrimary().DbName()) if err != nil { @@ -1177,15 +1229,15 @@ func (ts *trafficSwitcher) removeTargetTables(ctx context.Context) error { ReloadSchema: true, DisableForeignKeyChecks: true, }) - log.Infof("Removed target table with result: %+v", res) + ts.Logger().Infof("Removed target table with result: %+v", res) if err != nil { - if mysqlErr, ok := err.(*sqlerror.SQLError); ok && mysqlErr.Num == sqlerror.ERNoSuchTable { + if IsTableDidNotExistError(err) { // The table was already gone, so we can ignore the error. ts.Logger().Warningf("%s: Table %s did not exist when attempting to remove it", topoproto.TabletAliasString(target.GetPrimary().GetAlias()), tableName) - return nil + } else { + ts.Logger().Errorf("%s: Error removing table %s: %v", topoproto.TabletAliasString(target.GetPrimary().GetAlias()), tableName, err) + return err } - ts.Logger().Errorf("%s: Error removing table %s: %v", topoproto.TabletAliasString(target.GetPrimary().GetAlias()), tableName, err) - return err } ts.Logger().Infof("%s: Removed table %s.%s\n", topoproto.TabletAliasString(target.GetPrimary().GetAlias()), target.GetPrimary().DbName(), tableName) @@ -1216,7 +1268,7 @@ func (ts *trafficSwitcher) dropTargetShards(ctx context.Context) error { func (ts *trafficSwitcher) validate(ctx context.Context) error { if ts.MigrationType() == binlogdatapb.MigrationType_TABLES { if ts.isPartialMigration || - (ts.IsMultiTenantMigration() && len(ts.options.GetShards()) > 0) { + (ts.IsMultiTenantMigration() && ts.options != nil && len(ts.options.GetShards()) > 0) { return nil } sourceTopo := ts.ws.ts @@ -1320,6 +1372,24 @@ func (ts *trafficSwitcher) gatherPositions(ctx context.Context) error { }) } +// gatherSourcePositions will get the current replication position for all +// migration sources. +func (ts *trafficSwitcher) gatherSourcePositions(ctx context.Context) error { + return ts.ForAllSources(func(source *MigrationSource) error { + var err error + tablet := source.GetPrimary().Tablet + tabletAlias := topoproto.TabletAliasString(tablet.Alias) + source.Position, err = ts.TabletManagerClient().PrimaryPosition(ctx, tablet) + if err != nil { + ts.Logger().Errorf("Error getting migration source position on %s: %s", tabletAlias, err) + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "failed to get position on migration source %s: %v", + tabletAlias, err) + } + ts.Logger().Infof("Position on migration source %s after having stopped writes: %s", tabletAlias, source.Position) + return nil + }) +} + func (ts *trafficSwitcher) isSequenceParticipating(ctx context.Context) (bool, error) { vschema, err := ts.TopoServer().GetVSchema(ctx, ts.targetKeyspace) if err != nil { @@ -1374,7 +1444,7 @@ func (ts *trafficSwitcher) getTargetSequenceMetadata(ctx context.Context) (map[s // be in another unsharded keyspace. smMu := sync.Mutex{} tableCount := len(sequencesByBackingTable) - tablesFound := 0 // Used to short circuit the search + tablesFound := make(map[string]struct{}) // Used to short circuit the search // Define the function used to search each keyspace. searchKeyspace := func(sctx context.Context, done chan struct{}, keyspace string) error { kvs, kerr := ts.TopoServer().GetVSchema(sctx, keyspace) @@ -1389,7 +1459,7 @@ func (ts *trafficSwitcher) getTargetSequenceMetadata(ctx context.Context) (map[s // The table name can be escaped in the vschema definition. unescapedTableName, err := sqlescape.UnescapeID(tableName) if err != nil { - return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid table name %s in keyspace %s: %v", + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid table name %q in keyspace %s: %v", tableName, keyspace, err) } select { @@ -1405,13 +1475,13 @@ func (ts *trafficSwitcher) getTargetSequenceMetadata(ctx context.Context) (map[s sm := sequencesByBackingTable[unescapedTableName] if tableDef != nil && tableDef.Type == vindexes.TypeSequence && sm != nil && unescapedTableName == sm.backingTableName { - tablesFound++ // This is also protected by the mutex + tablesFound[tableName] = struct{}{} // This is also protected by the mutex sm.backingTableKeyspace = keyspace // Set the default keyspace name. We will later check to // see if the tablet we send requests to is using a dbname // override and use that if it is. sm.backingTableDBName = "vt_" + keyspace - if tablesFound == tableCount { // Short circuit the search + if len(tablesFound) == tableCount { // Short circuit the search select { case <-done: // It's already been closed return true @@ -1438,7 +1508,7 @@ func (ts *trafficSwitcher) getTargetSequenceMetadata(ctx context.Context) (map[s // The keyspace name could be escaped so we need to unescape it. ks, err := sqlescape.UnescapeID(keyspace) if err != nil { // Should never happen - return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid keyspace name %s: %v", keyspace, err) + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid keyspace name %q: %v", keyspace, err) } searchGroup.Go(func() error { return searchKeyspace(gctx, searchCompleted, ks) @@ -1448,13 +1518,90 @@ func (ts *trafficSwitcher) getTargetSequenceMetadata(ctx context.Context) (map[s return nil, err } - if tablesFound != tableCount { - return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "failed to locate all of the backing sequence tables being used: %s", - strings.Join(maps.Keys(sequencesByBackingTable), ",")) + if len(tablesFound) != tableCount { + // Try and create the missing backing sequence tables if we can. + if err := ts.createMissingSequenceTables(ctx, sequencesByBackingTable, tablesFound); err != nil { + return nil, err + } } + return sequencesByBackingTable, nil } +// createMissingSequenceTables will create the backing sequence tables for those that +// could not be found in any current keyspace. +func (ts trafficSwitcher) createMissingSequenceTables(ctx context.Context, sequencesByBackingTable map[string]*sequenceMetadata, tablesFound map[string]struct{}) error { + globalKeyspace := ts.options.GetGlobalKeyspace() + if globalKeyspace == "" { + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "failed to locate all of the backing sequence tables being used and no global-keyspace was provided to auto create them in: %s", + strings.Join(maps.Keys(sequencesByBackingTable), ",")) + } + shards, err := ts.ws.ts.GetShardNames(ctx, globalKeyspace) + if err != nil { + return err + } + if len(shards) != 1 { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "global-keyspace %s is not unsharded", globalKeyspace) + } + globalVSchema, err := ts.ws.ts.GetVSchema(ctx, globalKeyspace) + if err != nil { + return err + } + updatedGlobalVSchema := false + for tableName, sequenceMetadata := range sequencesByBackingTable { + if _, ok := tablesFound[tableName]; !ok { + // Create the backing table. + shard, err := ts.ws.ts.GetShard(ctx, globalKeyspace, shards[0]) + if err != nil { + return err + } + if shard.PrimaryAlias == nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "global-keyspace %s does not currently have a primary tablet", + globalKeyspace) + } + primary, err := ts.ws.ts.GetTablet(ctx, shard.PrimaryAlias) + if err != nil { + return err + } + escapedTableName, err := sqlescape.EnsureEscaped(tableName) + if err != nil { + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid table name %s: %v", + tableName, err) + } + stmt := sqlparser.BuildParsedQuery(sqlCreateSequenceTable, escapedTableName) + _, err = ts.ws.tmc.ApplySchema(ctx, primary.Tablet, &tmutils.SchemaChange{ + SQL: stmt.Query, + Force: false, + AllowReplication: true, + SQLMode: vreplication.SQLMode, + DisableForeignKeyChecks: true, + }) + if err != nil { + return vterrors.Wrapf(err, "failed to create sequence backing table %s in global-keyspace %s", + tableName, globalKeyspace) + } + if bt := globalVSchema.Tables[sequenceMetadata.backingTableName]; bt == nil { + if globalVSchema.Tables == nil { + globalVSchema.Tables = make(map[string]*vschemapb.Table) + } + globalVSchema.Tables[tableName] = &vschemapb.Table{ + Type: vindexes.TypeSequence, + } + updatedGlobalVSchema = true + sequenceMetadata.backingTableDBName = "vt_" + globalKeyspace // This will be overridden later if needed + sequenceMetadata.backingTableKeyspace = globalKeyspace + } + } + } + if updatedGlobalVSchema { + err = ts.ws.ts.SaveVSchema(ctx, globalKeyspace, globalVSchema) + if err != nil { + return vterrors.Wrapf(err, "failed to update vschema in the global-keyspace %s", globalKeyspace) + } + } + return nil +} + // findSequenceUsageInKeyspace searches the keyspace's vschema for usage // of sequences. It returns a map of sequence metadata keyed by the backing // sequence table name -- if any usage is found -- along with a boolean to @@ -1479,7 +1626,7 @@ func (ts *trafficSwitcher) findSequenceUsageInKeyspace(vschema *vschemapb.Keyspa // in the vschema. unescapedTable, err := sqlescape.UnescapeID(table) if err != nil { - return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid table name %s defined in the sequence table %+v: %v", + return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid table name %q defined in the sequence table %+v: %v", table, seqTable, err) } sm := &sequenceMetadata{ @@ -1491,17 +1638,17 @@ func (ts *trafficSwitcher) findSequenceUsageInKeyspace(vschema *vschemapb.Keyspa if strings.Contains(seqTable.AutoIncrement.Sequence, ".") { keyspace, tableName, found := strings.Cut(seqTable.AutoIncrement.Sequence, ".") if !found { - return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid sequence table name %s defined in the %s keyspace", + return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid sequence table name %q defined in the %s keyspace", seqTable.AutoIncrement.Sequence, ts.targetKeyspace) } // Unescape the table name and keyspace name as they may be escaped in the // vschema definition if they e.g. contain dashes. if keyspace, err = sqlescape.UnescapeID(keyspace); err != nil { - return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid keyspace in qualified sequence table name %s defined in sequence table %+v: %v", + return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid keyspace in qualified sequence table name %q defined in sequence table %+v: %v", seqTable.AutoIncrement.Sequence, seqTable, err) } if tableName, err = sqlescape.UnescapeID(tableName); err != nil { - return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid qualified sequence table name %s defined in sequence table %+v: %v", + return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid qualified sequence table name %q defined in sequence table %+v: %v", seqTable.AutoIncrement.Sequence, seqTable, err) } sm.backingTableKeyspace = keyspace @@ -1515,7 +1662,7 @@ func (ts *trafficSwitcher) findSequenceUsageInKeyspace(vschema *vschemapb.Keyspa } else { sm.backingTableName, err = sqlescape.UnescapeID(seqTable.AutoIncrement.Sequence) if err != nil { - return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid sequence table name %s defined in sequence table %+v: %v", + return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid sequence table name %q defined in sequence table %+v: %v", seqTable.AutoIncrement.Sequence, seqTable, err) } seqTable.AutoIncrement.Sequence = sm.backingTableName @@ -1523,16 +1670,28 @@ func (ts *trafficSwitcher) findSequenceUsageInKeyspace(vschema *vschemapb.Keyspa } // The column names can be escaped in the vschema definition. for i := range seqTable.ColumnVindexes { - unescapedColumn, err := sqlescape.UnescapeID(seqTable.ColumnVindexes[i].Column) + var ( + unescapedColumn string + err error + ) + if len(seqTable.ColumnVindexes[i].Columns) > 0 { + for n := range seqTable.ColumnVindexes[i].Columns { + unescapedColumn, err = sqlescape.UnescapeID(seqTable.ColumnVindexes[i].Columns[n]) + seqTable.ColumnVindexes[i].Columns[n] = unescapedColumn + } + } else { + // This is the legacy vschema definition. + unescapedColumn, err = sqlescape.UnescapeID(seqTable.ColumnVindexes[i].Column) + seqTable.ColumnVindexes[i].Column = unescapedColumn + } if err != nil { - return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid sequence column vindex name %s defined in sequence table %+v: %v", + return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid sequence column vindex name %q defined in sequence table %+v: %v", seqTable.ColumnVindexes[i].Column, seqTable, err) } - seqTable.ColumnVindexes[i].Column = unescapedColumn } unescapedAutoIncCol, err := sqlescape.UnescapeID(seqTable.AutoIncrement.Column) if err != nil { - return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid auto-increment column name %s defined in sequence table %+v: %v", + return nil, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid auto-increment column name %q defined in sequence table %+v: %v", seqTable.AutoIncrement.Column, seqTable, err) } seqTable.AutoIncrement.Column = unescapedAutoIncCol @@ -1546,12 +1705,16 @@ func (ts *trafficSwitcher) findSequenceUsageInKeyspace(vschema *vschemapb.Keyspa // initializeTargetSequences initializes the backing sequence tables // using a map keyed by the backing sequence table name. // -// The backing tables must have already been created. This function will -// then ensure that the next value is set to a value greater than any -// currently stored in the using table on the target keyspace. If the -// backing table is updated to a new higher value then it will also tell -// the primary tablet serving the sequence to refresh/reset its cache to -// be sure that it does not provide a value that is less than the current max. +// The backing tables must have already been created, unless a default +// global keyspace exists for the trafficSwitcher -- in which case we +// will create the backing table there if needed. + +// This function will then ensure that the next value is set to a value +// greater than any currently stored in the using table on the target +// keyspace. If the backing table is updated to a new higher value then +// it will also tell the primary tablet serving the sequence to +// refresh/reset its cache to be sure that it does not provide a value +// that is less than the current max. func (ts *trafficSwitcher) initializeTargetSequences(ctx context.Context, sequencesByBackingTable map[string]*sequenceMetadata) error { initSequenceTable := func(ictx context.Context, sequenceMetadata *sequenceMetadata) error { // Now we need to run this query on the target shards in order @@ -1663,13 +1826,37 @@ func (ts *trafficSwitcher) initializeTargetSequences(ctx context.Context, sequen ) // Now execute this on the primary tablet of the unsharded keyspace // housing the backing table. + initialize: qr, ierr := ts.ws.tmc.ExecuteFetchAsApp(ictx, sequenceTablet.Tablet, true, &tabletmanagerdatapb.ExecuteFetchAsAppRequest{ Query: []byte(query.Query), MaxRows: 1, }) if ierr != nil { - return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "failed to initialize the backing sequence table %s.%s: %v", + vterr := vterrors.Errorf(vtrpcpb.Code_INTERNAL, "failed to initialize the backing sequence table %s.%s: %v", sequenceMetadata.backingTableDBName, sequenceMetadata.backingTableName, ierr) + // If the sequence table doesn't exist, let's try and create it, otherwise + // return the error. + if sqlErr, ok := sqlerror.NewSQLErrorFromError(ierr).(*sqlerror.SQLError); !ok || + (sqlErr.Num != sqlerror.ERNoSuchTable && sqlErr.Num != sqlerror.ERBadTable) { + return vterr + } + stmt := sqlparser.BuildParsedQuery(sqlCreateSequenceTable, backingTable) + _, ierr = ts.ws.tmc.ApplySchema(ctx, sequenceTablet.Tablet, &tmutils.SchemaChange{ + SQL: stmt.Query, + Force: false, + AllowReplication: true, + SQLMode: vreplication.SQLMode, + DisableForeignKeyChecks: true, + }) + if ierr != nil { + return vterrors.Wrapf(vterr, "could not create missing sequence table: %v", err) + } + select { + case <-ctx.Done(): + return vterrors.Wrapf(vterr, "could not create missing sequence table: %v", ctx.Err()) + default: + goto initialize + } } // If we actually updated the backing sequence table, then we need // to tell the primary tablet managing the sequence to refresh/reset diff --git a/go/vt/vtctl/workflow/traffic_switcher_test.go b/go/vt/vtctl/workflow/traffic_switcher_test.go index 5c0b2aba682..325b405b6f0 100644 --- a/go/vt/vtctl/workflow/traffic_switcher_test.go +++ b/go/vt/vtctl/workflow/traffic_switcher_test.go @@ -19,16 +19,24 @@ package workflow import ( "context" "fmt" - "reflect" + "strconv" + "strings" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/sqlescape" + "vitess.io/vitess/go/vt/mysqlctl/tmutils" "vitess.io/vitess/go/vt/proto/vschema" + "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vtgate/vindexes" + "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" + + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) type testTrafficSwitcher struct { @@ -70,6 +78,8 @@ func TestGetTargetSequenceMetadata(t *testing.T) { cell := "cell1" workflow := "wf1" table := "`t1`" + tableDDL := "create table t1 (id int not null auto_increment primary key, c1 varchar(10))" + table2 := "t2" unescapedTable := "t1" sourceKeyspace := &testKeyspace{ KeyspaceName: "source-ks", @@ -87,12 +97,25 @@ func TestGetTargetSequenceMetadata(t *testing.T) { env := newTestEnv(t, ctx, cell, sourceKeyspace, targetKeyspace) defer env.close() + env.tmc.schema = map[string]*tabletmanagerdatapb.SchemaDefinition{ + unescapedTable: { + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: unescapedTable, + Schema: tableDDL, + }, + }, + }, + } + type testCase struct { - name string - sourceVSchema *vschema.Keyspace - targetVSchema *vschema.Keyspace - want map[string]*sequenceMetadata - err string + name string + sourceVSchema *vschema.Keyspace + targetVSchema *vschema.Keyspace + options *vtctldatapb.WorkflowOptions + want map[string]*sequenceMetadata + expectSourceApplySchemaRequestResponse *applySchemaRequestResponse + err string } tests := []testCase{ { @@ -148,6 +171,66 @@ func TestGetTargetSequenceMetadata(t *testing.T) { }, }, }, + { + name: "auto_increment replaced with sequence", + sourceVSchema: &vschema.Keyspace{ + Vindexes: vindexes, + Tables: map[string]*vschema.Table{}, // Sequence table will be created + }, + options: &vtctldatapb.WorkflowOptions{ + ShardedAutoIncrementHandling: vtctldatapb.ShardedAutoIncrementHandling_REPLACE, + GlobalKeyspace: sourceKeyspace.KeyspaceName, + }, + expectSourceApplySchemaRequestResponse: &applySchemaRequestResponse{ + change: &tmutils.SchemaChange{ + SQL: sqlparser.BuildParsedQuery(sqlCreateSequenceTable, + sqlescape.EscapeID(fmt.Sprintf(autoSequenceTableFormat, unescapedTable))).Query, + Force: false, + AllowReplication: true, + SQLMode: vreplication.SQLMode, + DisableForeignKeyChecks: true, + }, + res: &tabletmanagerdatapb.SchemaChangeResult{}, + }, + targetVSchema: &vschema.Keyspace{ + Vindexes: vindexes, + Tables: map[string]*vschema.Table{ + table: { + ColumnVindexes: []*vschema.ColumnVindex{ + { + Name: "xxhash", + Column: "`my-col`", + }, + }, + AutoIncrement: &vschema.AutoIncrement{ + Column: "my-col", + Sequence: fmt.Sprintf(autoSequenceTableFormat, unescapedTable), + }, + }, + }, + }, + want: map[string]*sequenceMetadata{ + fmt.Sprintf(autoSequenceTableFormat, unescapedTable): { + backingTableName: fmt.Sprintf(autoSequenceTableFormat, unescapedTable), + backingTableKeyspace: "source-ks", + backingTableDBName: "vt_source-ks", + usingTableName: unescapedTable, + usingTableDBName: "vt_targetks", + usingTableDefinition: &vschema.Table{ + ColumnVindexes: []*vschema.ColumnVindex{ + { + Column: "my-col", + Name: "xxhash", + }, + }, + AutoIncrement: &vschema.AutoIncrement{ + Column: "my-col", + Sequence: fmt.Sprintf(autoSequenceTableFormat, unescapedTable), + }, + }, + }, + }, + }, { name: "sequences with backticks", sourceVSchema: &vschema.Keyspace{ @@ -197,6 +280,138 @@ func TestGetTargetSequenceMetadata(t *testing.T) { }, }, }, + { + name: "sequences using vindexes with both column definition structures", + sourceVSchema: &vschema.Keyspace{ + Vindexes: vindexes, + Tables: map[string]*vschema.Table{ + "seq1": { + Type: "sequence", + }, + "seq2": { + Type: "sequence", + }, + }, + }, + targetVSchema: &vschema.Keyspace{ + Vindexes: vindexes, + Tables: map[string]*vschema.Table{ + table: { + ColumnVindexes: []*vschema.ColumnVindex{ + { + Name: "xxhash", + Column: "col1", + }, + }, + AutoIncrement: &vschema.AutoIncrement{ + Column: "col1", + Sequence: fmt.Sprintf("%s.seq1", sourceKeyspace.KeyspaceName), + }, + }, + table2: { + ColumnVindexes: []*vschema.ColumnVindex{ + { + Name: "xxhash", + Columns: []string{"col2"}, + }, + }, + AutoIncrement: &vschema.AutoIncrement{ + Column: "col2", + Sequence: fmt.Sprintf("%s.seq2", sourceKeyspace.KeyspaceName), + }, + }, + }, + }, + want: map[string]*sequenceMetadata{ + "seq1": { + backingTableName: "seq1", + backingTableKeyspace: "source-ks", + backingTableDBName: "vt_source-ks", + usingTableName: unescapedTable, + usingTableDBName: "vt_targetks", + usingTableDefinition: &vschema.Table{ + ColumnVindexes: []*vschema.ColumnVindex{ + { + Column: "col1", + Name: "xxhash", + }, + }, + AutoIncrement: &vschema.AutoIncrement{ + Column: "col1", + Sequence: fmt.Sprintf("%s.seq1", sourceKeyspace.KeyspaceName), + }, + }, + }, + "seq2": { + backingTableName: "seq2", + backingTableKeyspace: "source-ks", + backingTableDBName: "vt_source-ks", + usingTableName: table2, + usingTableDBName: "vt_targetks", + usingTableDefinition: &vschema.Table{ + ColumnVindexes: []*vschema.ColumnVindex{ + { + Columns: []string{"col2"}, + Name: "xxhash", + }, + }, + AutoIncrement: &vschema.AutoIncrement{ + Column: "col2", + Sequence: fmt.Sprintf("%s.seq2", sourceKeyspace.KeyspaceName), + }, + }, + }, + }, + }, + { + name: "sequence with table having mult-col vindex", + sourceVSchema: &vschema.Keyspace{ + Vindexes: vindexes, + Tables: map[string]*vschema.Table{ + "seq1": { + Type: "sequence", + }, + }, + }, + targetVSchema: &vschema.Keyspace{ + Vindexes: vindexes, + Tables: map[string]*vschema.Table{ + table: { + ColumnVindexes: []*vschema.ColumnVindex{ + { + Name: "xxhash", + Columns: []string{"col3", "col4"}, + }, + }, + AutoIncrement: &vschema.AutoIncrement{ + Column: "col1", + Sequence: fmt.Sprintf("%s.seq1", sourceKeyspace.KeyspaceName), + }, + }, + }, + }, + want: map[string]*sequenceMetadata{ + "seq1": { + backingTableName: "seq1", + backingTableKeyspace: "source-ks", + backingTableDBName: "vt_source-ks", + usingTableName: unescapedTable, + usingTableDBName: "vt_targetks", + usingTableDefinition: &vschema.Table{ + ColumnVindexes: []*vschema.ColumnVindex{ + { + Columns: []string{"col3", "col4"}, + Name: "xxhash", + }, + }, + AutoIncrement: &vschema.AutoIncrement{ + Column: "col1", + Sequence: fmt.Sprintf("%s.seq1", sourceKeyspace.KeyspaceName), + }, + }, + }, + }, + }, { name: "invalid table name", sourceVSchema: &vschema.Keyspace{ @@ -224,7 +439,7 @@ func TestGetTargetSequenceMetadata(t *testing.T) { }, }, }, - err: "invalid table name `my-`seq1` in keyspace source-ks: UnescapeID err: unexpected single backtick at position 3 in 'my-`seq1'", + err: "invalid table name \"`my-`seq1`\" in keyspace source-ks: UnescapeID err: unexpected single backtick at position 3 in 'my-`seq1'", }, { name: "invalid keyspace name", @@ -253,7 +468,7 @@ func TestGetTargetSequenceMetadata(t *testing.T) { }, }, }, - err: "invalid keyspace in qualified sequence table name `ks`1`.`my-seq1` defined in sequence table column_vindexes:{column:\"`my-col`\" name:\"xxhash\"} auto_increment:{column:\"`my-col`\" sequence:\"`ks`1`.`my-seq1`\"}: UnescapeID err: unexpected single backtick at position 2 in 'ks`1'", + err: "invalid keyspace in qualified sequence table name \"`ks`1`.`my-seq1`\" defined in sequence table column_vindexes:{column:\"`my-col`\" name:\"xxhash\"} auto_increment:{column:\"`my-col`\" sequence:\"`ks`1`.`my-seq1`\"}: UnescapeID err: unexpected single backtick at position 2 in 'ks`1'", }, { name: "invalid auto-inc column name", @@ -282,7 +497,7 @@ func TestGetTargetSequenceMetadata(t *testing.T) { }, }, }, - err: "invalid auto-increment column name `my`-col` defined in sequence table column_vindexes:{column:\"my-col\" name:\"xxhash\"} auto_increment:{column:\"`my`-col`\" sequence:\"my-seq1\"}: UnescapeID err: unexpected single backtick at position 2 in 'my`-col'", + err: "invalid auto-increment column name \"`my`-col`\" defined in sequence table column_vindexes:{column:\"my-col\" name:\"xxhash\"} auto_increment:{column:\"`my`-col`\" sequence:\"my-seq1\"}: UnescapeID err: unexpected single backtick at position 2 in 'my`-col'", }, { name: "invalid sequence name", @@ -311,7 +526,7 @@ func TestGetTargetSequenceMetadata(t *testing.T) { }, }, }, - err: "invalid sequence table name `my-`seq1` defined in sequence table column_vindexes:{column:\"`my-col`\" name:\"xxhash\"} auto_increment:{column:\"`my-col`\" sequence:\"`my-`seq1`\"}: UnescapeID err: unexpected single backtick at position 3 in 'my-`seq1'", + err: "invalid sequence table name \"`my-`seq1`\" defined in sequence table column_vindexes:{column:\"`my-col`\" name:\"xxhash\"} auto_increment:{column:\"`my-col`\" sequence:\"`my-`seq1`\"}: UnescapeID err: unexpected single backtick at position 3 in 'my-`seq1'", }, } @@ -332,6 +547,9 @@ func TestGetTargetSequenceMetadata(t *testing.T) { Tablet: tablet, }, } + if tc.expectSourceApplySchemaRequestResponse != nil { + env.tmc.expectApplySchemaRequest(tablet.Alias.Uid, tc.expectSourceApplySchemaRequestResponse) + } } for i, shard := range targetKeyspace.ShardNames { tablet := env.tablets[targetKeyspace.KeyspaceName][startingTargetTabletUID+(i*tabletUIDStep)] @@ -345,11 +563,12 @@ func TestGetTargetSequenceMetadata(t *testing.T) { id: 1, ws: env.ws, workflow: workflow, - tables: []string{table}, + tables: []string{table, table2}, sourceKeyspace: sourceKeyspace.KeyspaceName, targetKeyspace: targetKeyspace.KeyspaceName, sources: sources, targets: targets, + options: tc.options, } got, err := ts.getTargetSequenceMetadata(ctx) if tc.err != "" { @@ -357,7 +576,76 @@ func TestGetTargetSequenceMetadata(t *testing.T) { } else { require.NoError(t, err) } - require.True(t, reflect.DeepEqual(tc.want, got), "want: %v, got: %v", tc.want, got) + require.EqualValues(t, tc.want, got) }) } } + +// TestSwitchTrafficPositionHandling confirms that if any writes are somehow +// executed against the source between the stop source writes and wait for +// catchup steps, that we have the correct position and do not lose the write(s). +func TestTrafficSwitchPositionHandling(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + workflowName := "wf1" + tableName := "t1" + sourceKeyspaceName := "sourceks" + targetKeyspaceName := "targetks" + + schema := map[string]*tabletmanagerdatapb.SchemaDefinition{ + tableName: { + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: tableName, + Schema: fmt.Sprintf("CREATE TABLE %s (id BIGINT, name VARCHAR(64), PRIMARY KEY (id))", tableName), + }, + }, + }, + } + + sourceKeyspace := &testKeyspace{ + KeyspaceName: sourceKeyspaceName, + ShardNames: []string{"0"}, + } + targetKeyspace := &testKeyspace{ + KeyspaceName: targetKeyspaceName, + ShardNames: []string{"0"}, + } + + env := newTestEnv(t, ctx, defaultCellName, sourceKeyspace, targetKeyspace) + defer env.close() + env.tmc.schema = schema + + ts, _, err := env.ws.getWorkflowState(ctx, targetKeyspaceName, workflowName) + require.NoError(t, err) + sw := &switcher{ts: ts, s: env.ws} + + lockCtx, sourceUnlock, lockErr := sw.lockKeyspace(ctx, ts.SourceKeyspaceName(), "test") + require.NoError(t, lockErr) + ctx = lockCtx + defer sourceUnlock(&err) + lockCtx, targetUnlock, lockErr := sw.lockKeyspace(ctx, ts.TargetKeyspaceName(), "test") + require.NoError(t, lockErr) + ctx = lockCtx + defer targetUnlock(&err) + + err = ts.stopSourceWrites(ctx) + require.NoError(t, err) + + // Now we simulate a write on the source. + newPosition := position[:strings.LastIndex(position, "-")+1] + oldSeqNo, err := strconv.Atoi(position[strings.LastIndex(position, "-")+1:]) + require.NoError(t, err) + newPosition = fmt.Sprintf("%s%d", newPosition, oldSeqNo+1) + env.tmc.setPrimaryPosition(env.tablets[sourceKeyspaceName][startingSourceTabletUID], newPosition) + + // And confirm that we picked up the new position. + err = ts.gatherSourcePositions(ctx) + require.NoError(t, err) + err = ts.ForAllSources(func(ms *MigrationSource) error { + require.Equal(t, newPosition, ms.Position) + return nil + }) + require.NoError(t, err) +} diff --git a/go/vt/vtctl/workflow/utils.go b/go/vt/vtctl/workflow/utils.go index d4e8d7b4ec0..5021e3938c8 100644 --- a/go/vt/vtctl/workflow/utils.go +++ b/go/vt/vtctl/workflow/utils.go @@ -28,27 +28,27 @@ import ( "strings" "sync" - querypb "vitess.io/vitess/go/vt/proto/query" - - "vitess.io/vitess/go/vt/vtgate/vindexes" - "google.golang.org/protobuf/encoding/prototext" + "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/sets" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/vindexes" "vitess.io/vitess/go/vt/vttablet/tmclient" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + querypb "vitess.io/vitess/go/vt/proto/query" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" @@ -123,7 +123,8 @@ func validateNewWorkflow(ctx context.Context, ts *topo.Server, tmc tmclient.Tabl } for _, wf := range res.Workflows { if wf.Workflow == workflow { - allErrors.RecordError(fmt.Errorf("workflow %s already exists in keyspace %s on tablet %v", workflow, keyspace, primary.Alias)) + allErrors.RecordError(fmt.Errorf("workflow %s already exists in keyspace %s on tablet %s", + workflow, keyspace, topoproto.TabletAliasString(primary.Alias))) return } } @@ -217,7 +218,11 @@ func stripTableForeignKeys(ddl string, parser *sqlparser.Parser) (string, error) return newDDL, nil } -func stripAutoIncrement(ddl string, parser *sqlparser.Parser) (string, error) { +// stripAutoIncrement will strip any MySQL auto_increment clause in the given +// table definition. If an optional replace function is specified then that +// callback will be used to e.g. replace the MySQL clause with a Vitess +// VSchema AutoIncrement definition. +func stripAutoIncrement(ddl string, parser *sqlparser.Parser, replace func(columnName string)) (string, error) { newDDL, err := parser.ParseStrictDDL(ddl) if err != nil { return "", err @@ -228,6 +233,9 @@ func stripAutoIncrement(ddl string, parser *sqlparser.Parser) (string, error) { case *sqlparser.ColumnDefinition: if node.Type.Options.Autoincrement { node.Type.Options.Autoincrement = false + if replace != nil { + replace(sqlparser.String(node.Name)) + } } } return true, nil @@ -398,8 +406,7 @@ func BuildTargets(ctx context.Context, ts *topo.Server, tmc tmclient.TabletManag optionsJSON := wf.GetOptions() if optionsJSON != "" { if err := json.Unmarshal([]byte(optionsJSON), &options); err != nil { - log.Errorf("failed to unmarshal options: %v %s", err, optionsJSON) - return nil, err + return nil, vterrors.Wrapf(err, "failed to unmarshal options: %s", optionsJSON) } } @@ -545,7 +552,7 @@ func doValidateWorkflowHasCompleted(ctx context.Context, ts *trafficSwitcher) er _ = ts.ForAllSources(func(source *MigrationSource) error { wg.Add(1) if source.GetShard().IsPrimaryServing { - rec.RecordError(fmt.Errorf(fmt.Sprintf("Shard %s is still serving", source.GetShard().ShardName()))) + rec.RecordError(fmt.Errorf("shard %s is still serving", source.GetShard().ShardName())) } wg.Done() return nil @@ -641,7 +648,7 @@ func parseTabletTypes(tabletTypes []topodatapb.TabletType) (hasReplica, hasRdonl func areTabletsAvailableToStreamFrom(ctx context.Context, req *vtctldatapb.WorkflowSwitchTrafficRequest, ts *trafficSwitcher, keyspace string, shards []*topo.ShardInfo) error { // We use the value from the workflow for the TabletPicker. tabletTypesStr := ts.optTabletTypes - cells := req.Cells + cells := req.GetCells() // If no cells were provided in the command then use the value from the workflow. if len(cells) == 0 && ts.optCells != "" { cells = strings.Split(strings.TrimSpace(ts.optCells), ",") @@ -671,7 +678,7 @@ func areTabletsAvailableToStreamFrom(ctx context.Context, req *vtctldatapb.Workf wg.Wait() if allErrors.HasErrors() { - log.Errorf("%s", allErrors.Error()) + ts.Logger().Error(allErrors.Error()) return allErrors.Error() } return nil @@ -949,3 +956,66 @@ func getTabletTypeSuffix(tabletType topodatapb.TabletType) string { } return "" } + +// IsTableDidNotExistError will convert the given error to an sqlerror.SQLError and if +// the error code is ERNoSuchTable or ERBadTable, it will return true. This is helpful +// when e.g. processing a gRPC error which will be a status.Error that needs to be +// converted to an sqlerror.SQLError before we can examine the error code. +func IsTableDidNotExistError(err error) bool { + if sqlErr, ok := sqlerror.NewSQLErrorFromError(err).(*sqlerror.SQLError); ok { + return sqlErr.Num == sqlerror.ERNoSuchTable || sqlErr.Num == sqlerror.ERBadTable + } + return false +} + +func getOptionsJSON(workflowOptions *vtctldatapb.WorkflowOptions) (string, error) { + defaultJSON := "{}" + if workflowOptions == nil { + return defaultJSON, nil + } + optionsJSON, err := json.Marshal(workflowOptions) + if err != nil || optionsJSON == nil { + return defaultJSON, err + } + return string(optionsJSON), nil +} + +// defaultErrorHandler provides a way to consistently handle errors by logging and +// returning them. +func defaultErrorHandler(logger logutil.Logger, message string, err error) (*[]string, error) { + werr := vterrors.Wrap(err, message) + logger.Error(werr) + return nil, werr +} + +// applyTargetShards applies the targetShards, coming from a command, to the trafficSwitcher's +// migration targets. +// It will return an error if the targetShards list contains a shard that is not a valid shard +// for the workflow. +// It will then remove any migration targets from the trafficSwitcher that are not in the +// targetShards list. +func applyTargetShards(ts *trafficSwitcher, targetShards []string) error { + if ts == nil { + return nil + } + if ts.targets == nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "no targets found for workflow %s", ts.workflow) + } + tsm := make(map[string]struct{}, len(targetShards)) + for _, targetShard := range targetShards { + if _, ok := ts.targets[targetShard]; !ok { + return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "specified target shard %s not a valid target for workflow %s", + targetShard, ts.workflow) + } + tsm[targetShard] = struct{}{} + } + for key, target := range ts.targets { + if target == nil || target.GetShard() == nil { // Should never happen + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid target found for workflow %s", ts.workflow) + } + if _, ok := tsm[target.GetShard().ShardName()]; !ok { + delete(ts.targets, key) + } + } + return nil +} diff --git a/go/vt/vtctl/workflow/utils_test.go b/go/vt/vtctl/workflow/utils_test.go index d79c4710b77..2094421e3c2 100644 --- a/go/vt/vtctl/workflow/utils_test.go +++ b/go/vt/vtctl/workflow/utils_test.go @@ -20,8 +20,82 @@ import ( "vitess.io/vitess/go/vt/topo/etcd2topo" "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/topotools" + + "vitess.io/vitess/go/vt/proto/vtctldata" ) +// TestCreateDefaultShardRoutingRules confirms that the default shard routing rules are created correctly for sharded +// and unsharded keyspaces. +func TestCreateDefaultShardRoutingRules(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ks1 := &testKeyspace{ + KeyspaceName: "sourceks", + } + ks2 := &testKeyspace{ + KeyspaceName: "targetks", + } + + type testCase struct { + name string + sourceKeyspace *testKeyspace + targetKeyspace *testKeyspace + shards []string + want map[string]string + } + getExpectedRules := func(sourceKeyspace, targetKeyspace *testKeyspace) map[string]string { + rules := make(map[string]string) + for _, targetShard := range targetKeyspace.ShardNames { + rules[fmt.Sprintf("%s.%s", targetKeyspace.KeyspaceName, targetShard)] = sourceKeyspace.KeyspaceName + } + return rules + + } + testCases := []testCase{ + { + name: "unsharded", + sourceKeyspace: ks1, + targetKeyspace: ks2, + shards: []string{"0"}, + }, + { + name: "sharded", + sourceKeyspace: ks2, + targetKeyspace: ks1, + shards: []string{"-80", "80-"}, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tc.sourceKeyspace.ShardNames = tc.shards + tc.targetKeyspace.ShardNames = tc.shards + env := newTestEnv(t, ctx, defaultCellName, tc.sourceKeyspace, tc.targetKeyspace) + defer env.close() + ms := &vtctldata.MaterializeSettings{ + Workflow: "wf1", + SourceKeyspace: tc.sourceKeyspace.KeyspaceName, + TargetKeyspace: tc.targetKeyspace.KeyspaceName, + TableSettings: []*vtctldata.TableMaterializeSettings{ + { + TargetTable: "t1", + SourceExpression: "select * from t1", + }, + }, + Cell: "zone1", + SourceShards: tc.sourceKeyspace.ShardNames, + } + err := createDefaultShardRoutingRules(ctx, ms, env.ts) + require.NoError(t, err) + rules, err := topotools.GetShardRoutingRules(ctx, env.ts) + require.NoError(t, err) + require.Len(t, rules, len(tc.shards)) + want := getExpectedRules(tc.sourceKeyspace, tc.targetKeyspace) + require.EqualValues(t, want, rules) + }) + } +} + // TestUpdateKeyspaceRoutingRule confirms that the keyspace routing rules are updated correctly. func TestUpdateKeyspaceRoutingRule(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) diff --git a/go/vt/vtctl/workflow/vreplication_stream_test.go b/go/vt/vtctl/workflow/vreplication_stream_test.go new file mode 100644 index 00000000000..6269cfa978e --- /dev/null +++ b/go/vt/vtctl/workflow/vreplication_stream_test.go @@ -0,0 +1,52 @@ +/* +Copyright 2024 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 workflow + +import ( + "fmt" + "reflect" + "testing" +) + +// TestVReplicationStreams tests various methods of VReplicationStreams. +func TestVReplicationStreams(t *testing.T) { + var streams VReplicationStreams + for i := 1; i <= 3; i++ { + streams = append(streams, &VReplicationStream{ID: int32(i), Workflow: fmt.Sprintf("workflow%d", i)}) + } + + tests := []struct { + name string + funcUnderTest func(VReplicationStreams) interface{} + expectedResult interface{} + }{ + {"Test IDs", func(s VReplicationStreams) interface{} { return s.IDs() }, []int32{1, 2, 3}}, + {"Test Values", func(s VReplicationStreams) interface{} { return s.Values() }, "(1, 2, 3)"}, + {"Test Workflows", func(s VReplicationStreams) interface{} { return s.Workflows() }, []string{"workflow1", "workflow2", "workflow3"}}, + {"Test Copy", func(s VReplicationStreams) interface{} { return s.Copy() }, streams.Copy()}, + {"Test ToSlice", func(s VReplicationStreams) interface{} { return s.ToSlice() }, []*VReplicationStream{streams[0], streams[1], streams[2]}}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := tt.funcUnderTest(streams) + if !reflect.DeepEqual(result, tt.expectedResult) { + t.Errorf("Failed %s: expected %v, got %v", tt.name, tt.expectedResult, result) + } + }) + } +} diff --git a/go/vt/vtctl/workflow/workflow_state_test.go b/go/vt/vtctl/workflow/workflow_state_test.go new file mode 100644 index 00000000000..96f63f8ab31 --- /dev/null +++ b/go/vt/vtctl/workflow/workflow_state_test.go @@ -0,0 +1,167 @@ +/* +Copyright 2024 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 workflow + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" +) + +func setupMoveTables(t *testing.T, ctx context.Context) *testEnv { + schema := map[string]*tabletmanagerdata.SchemaDefinition{ + "t1": { + TableDefinitions: []*tabletmanagerdata.TableDefinition{ + { + Name: "t1", + Schema: fmt.Sprintf("CREATE TABLE %s (id BIGINT, name VARCHAR(64), PRIMARY KEY (id))", "t1"), + }, + }, + }, + } + sourceKeyspace := &testKeyspace{ + KeyspaceName: "source", + ShardNames: []string{"0"}, + } + targetKeyspace := &testKeyspace{ + KeyspaceName: "target", + ShardNames: []string{"0"}, + } + te := newTestEnv(t, ctx, "zone1", sourceKeyspace, targetKeyspace) + te.tmc.schema = schema + var wfs tabletmanagerdata.ReadVReplicationWorkflowsResponse + id := int32(1) + wfs.Workflows = append(wfs.Workflows, &tabletmanagerdata.ReadVReplicationWorkflowResponse{ + Workflow: "wf1", + WorkflowType: binlogdatapb.VReplicationWorkflowType_MoveTables, + }, &tabletmanagerdata.ReadVReplicationWorkflowResponse{ + Workflow: "wf2", + WorkflowType: binlogdatapb.VReplicationWorkflowType_MoveTables, + }) + wfs.Workflows[0].Streams = append(wfs.Workflows[0].Streams, &tabletmanagerdata.ReadVReplicationWorkflowResponse_Stream{ + Id: id, + Bls: &binlogdatapb.BinlogSource{ + Keyspace: te.sourceKeyspace.KeyspaceName, + Shard: "0", + Filter: &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{ + {Match: "t1", Filter: "select * from t1"}, + }, + }, + Tables: []string{"t1"}, + }, + Pos: position, + State: binlogdatapb.VReplicationWorkflowState_Running, + }) + + workflowKey := te.tmc.GetWorkflowKey("target", "wf1") + workflowResponses := []*tabletmanagerdata.ReadVReplicationWorkflowsResponse{ + nil, // this is the response for getting stopped workflows + &wfs, &wfs, &wfs, &wfs, &wfs, &wfs, // return the full list for subsequent GetWorkflows calls + } + for _, resp := range workflowResponses { + te.tmc.AddVReplicationWorkflowsResponse(workflowKey, resp) + } + te.tmc.readVReplicationWorkflowRequests[200] = &readVReplicationWorkflowRequestResponse{ + req: &tabletmanagerdata.ReadVReplicationWorkflowRequest{ + Workflow: "wf1", + }, + } + te.updateTableRoutingRules(t, ctx, nil, []string{"t1"}, + "source", te.targetKeyspace.KeyspaceName, "source") + return te +} + +// TestWorkflowStateMoveTables tests the logic used to determine the state of a MoveTables workflow based on the +// routing rules. We setup two workflows with the same table in both source and target keyspaces. +func TestWorkflowStateMoveTables(t *testing.T) { + ctx := context.Background() + te := setupMoveTables(t, ctx) + require.NotNil(t, te) + type testCase struct { + name string + wf1SwitchedTabletTypes []topodatapb.TabletType + wf1ExpectedState string + // Simulate a second workflow to validate that the logic used to determine the state of the first workflow + // from the routing rules is not affected by the presence of other workflows in different states. + wf2SwitchedTabletTypes []topodatapb.TabletType + } + testCases := []testCase{ + { + name: "switch reads", + wf1SwitchedTabletTypes: []topodatapb.TabletType{topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY}, + wf1ExpectedState: "All Reads Switched. Writes Not Switched", + wf2SwitchedTabletTypes: []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}, + }, + { + name: "switch writes", + wf1SwitchedTabletTypes: []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}, + wf1ExpectedState: "Reads Not Switched. Writes Switched", + wf2SwitchedTabletTypes: []topodatapb.TabletType{topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY}, + }, + { + name: "switch reads and writes", + wf1SwitchedTabletTypes: defaultTabletTypes, + wf1ExpectedState: "All Reads Switched. Writes Switched", + }, + { + name: "switch rdonly only", + wf1SwitchedTabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY}, + wf1ExpectedState: "Reads partially switched. Replica not switched. All Rdonly Reads Switched. Writes Not Switched", + wf2SwitchedTabletTypes: []topodatapb.TabletType{topodatapb.TabletType_PRIMARY}, + }, + { + name: "switch replica only", + wf1SwitchedTabletTypes: []topodatapb.TabletType{topodatapb.TabletType_REPLICA}, + wf1ExpectedState: "Reads partially switched. All Replica Reads Switched. Rdonly not switched. Writes Not Switched", + wf2SwitchedTabletTypes: defaultTabletTypes, + }, + } + tables := []string{"t1"} + + getStateString := func(targetKeyspace, wfName string) string { + tsw, state, err := te.ws.getWorkflowState(ctx, targetKeyspace, wfName) + require.NoError(t, err) + require.NotNil(t, tsw) + require.NotNil(t, state) + return state.String() + } + require.Equal(t, "Reads Not Switched. Writes Not Switched", getStateString("target", "wf1")) + + resetRoutingRules := func() { + te.updateTableRoutingRules(t, ctx, nil, tables, + "source", te.targetKeyspace.KeyspaceName, "source") + te.updateTableRoutingRules(t, ctx, nil, tables, + "source2", "target2", "source2") + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + resetRoutingRules() + te.updateTableRoutingRules(t, ctx, tc.wf1SwitchedTabletTypes, tables, + "source", te.targetKeyspace.KeyspaceName, te.targetKeyspace.KeyspaceName) + te.updateTableRoutingRules(t, ctx, tc.wf2SwitchedTabletTypes, tables, + "source2", "target2", "target2") + require.Equal(t, tc.wf1ExpectedState, getStateString("target", "wf1")) + }) + } +} diff --git a/go/vt/vterrors/code.go b/go/vt/vterrors/code.go index d485c930b77..31c98cef280 100644 --- a/go/vt/vterrors/code.go +++ b/go/vt/vterrors/code.go @@ -96,8 +96,15 @@ var ( VT09022 = errorWithoutState("VT09022", vtrpcpb.Code_FAILED_PRECONDITION, "Destination does not have exactly one shard: %v", "Cannot send query to multiple shards.") VT09023 = errorWithoutState("VT09023", vtrpcpb.Code_FAILED_PRECONDITION, "could not map %v to a keyspace id", "Unable to determine the shard for the given row.") VT09024 = errorWithoutState("VT09024", vtrpcpb.Code_FAILED_PRECONDITION, "could not map %v to a unique keyspace id: %v", "Unable to determine the shard for the given row.") + VT09025 = errorWithoutState("VT09025", vtrpcpb.Code_FAILED_PRECONDITION, "atomic transaction error: %v", "Error in atomic transactions") + VT09026 = errorWithState("VT09026", vtrpcpb.Code_FAILED_PRECONDITION, CTERecursiveRequiresUnion, "Recursive Common Table Expression '%s' should contain a UNION", "") + VT09027 = errorWithState("VT09027", vtrpcpb.Code_FAILED_PRECONDITION, CTERecursiveForbidsAggregation, "Recursive Common Table Expression '%s' can contain neither aggregation nor window functions in recursive query block", "") + VT09028 = errorWithState("VT09028", vtrpcpb.Code_FAILED_PRECONDITION, CTERecursiveForbiddenJoinOrder, "In recursive query block of Recursive Common Table Expression '%s', the recursive table must neither be in the right argument of a LEFT JOIN, nor be forced to be non-first with join order hints", "") + VT09029 = errorWithState("VT09029", vtrpcpb.Code_FAILED_PRECONDITION, CTERecursiveRequiresSingleReference, "In recursive query block of Recursive Common Table Expression %s, the recursive table must be referenced only once, and not in any subquery", "") + VT09030 = errorWithState("VT09030", vtrpcpb.Code_FAILED_PRECONDITION, CTEMaxRecursionDepth, "Recursive query aborted after 1000 iterations.", "") VT10001 = errorWithoutState("VT10001", vtrpcpb.Code_ABORTED, "foreign key constraints are not allowed", "Foreign key constraints are not allowed, see https://vitess.io/blog/2021-06-15-online-ddl-why-no-fk/.") + VT10002 = errorWithoutState("VT10002", vtrpcpb.Code_ABORTED, "atomic distributed transaction not allowed: %s", "The distributed transaction cannot be committed. A rollback decision is taken.") VT12001 = errorWithoutState("VT12001", vtrpcpb.Code_UNIMPLEMENTED, "unsupported: %s", "This statement is unsupported by Vitess. Please rewrite your query to use supported syntax.") VT12002 = errorWithoutState("VT12002", vtrpcpb.Code_UNIMPLEMENTED, "unsupported: cross-shard foreign keys", "Vitess does not support cross shard foreign keys.") @@ -181,7 +188,12 @@ var ( VT09022, VT09023, VT09024, + VT09026, + VT09027, + VT09028, + VT09029, VT10001, + VT10002, VT12001, VT12002, VT13001, diff --git a/go/vt/vterrors/errors_test.go b/go/vt/vterrors/errors_test.go index 49b77ee0385..3444b0986c4 100644 --- a/go/vt/vterrors/errors_test.go +++ b/go/vt/vterrors/errors_test.go @@ -213,7 +213,7 @@ func TestWrapf(t *testing.T) { } for _, tt := range tests { - got := Wrapf(tt.err, tt.message).Error() + got := Wrap(tt.err, tt.message).Error() if got != tt.want { t.Errorf("Wrapf(%v, %q): got: %v, want %v", tt.err, tt.message, got, tt.want) } diff --git a/go/vt/vterrors/state.go b/go/vt/vterrors/state.go index 8223405fc92..528000e9e41 100644 --- a/go/vt/vterrors/state.go +++ b/go/vt/vterrors/state.go @@ -62,6 +62,11 @@ const ( NoReferencedRow2 UnknownStmtHandler KeyDoesNotExist + CTERecursiveRequiresSingleReference + CTERecursiveRequiresUnion + CTERecursiveForbidsAggregation + CTERecursiveForbiddenJoinOrder + CTEMaxRecursionDepth // not found BadDb @@ -120,6 +125,8 @@ const ( CharacterSetMismatch WrongParametersToNativeFct + VectorConversion + // No state should be added below NumOfStates NumOfStates ) diff --git a/go/vt/vterrors/vterrors.go b/go/vt/vterrors/vterrors.go index 6a322837de9..c97a7c8e45f 100644 --- a/go/vt/vterrors/vterrors.go +++ b/go/vt/vterrors/vterrors.go @@ -150,10 +150,14 @@ func Errorf(code vtrpcpb.Code, format string, args ...any) error { // NewErrorf also records the stack trace at the point it was called. // Use this for errors in Vitess that we eventually want to mimic as a MySQL error func NewErrorf(code vtrpcpb.Code, state State, format string, args ...any) error { - msg := format - if len(args) != 0 { - msg = fmt.Sprintf(format, args...) - } + return NewError(code, state, fmt.Sprintf(format, args...)) +} + +// NewErrorf formats according to a format specifier and returns the string +// as a value that satisfies error. +// NewErrorf also records the stack trace at the point it was called. +// Use this for errors in Vitess that we eventually want to mimic as a MySQL error +func NewError(code vtrpcpb.Code, state State, msg string) error { return &fundamental{ msg: msg, code: code, @@ -251,14 +255,7 @@ func Wrap(err error, message string) error { // at the point Wrapf is call, and the format specifier. // If err is nil, Wrapf returns nil. func Wrapf(err error, format string, args ...any) error { - if err == nil { - return nil - } - return &wrapping{ - cause: err, - msg: fmt.Sprintf(format, args...), - stack: callers(), - } + return Wrap(err, fmt.Sprintf(format, args...)) } // Unwrap attempts to return the Cause of the given error, if it is indeed the result of a vterrors.Wrapf() diff --git a/go/vt/vtexplain/vtexplain_test.go b/go/vt/vtexplain/vtexplain_test.go index ed32d0698db..e9420b043c7 100644 --- a/go/vt/vtexplain/vtexplain_test.go +++ b/go/vt/vtexplain/vtexplain_test.go @@ -296,7 +296,7 @@ func TestJSONOutput(t *testing.T) { }` diff := cmp.Diff(wantJSON, string(actionsJSON)) if diff != "" { - t.Errorf(diff) + t.Error(diff) } } diff --git a/go/vt/vtgate/balancer/balancer.go b/go/vt/vtgate/balancer/balancer.go new file mode 100644 index 00000000000..bfe85194c05 --- /dev/null +++ b/go/vt/vtgate/balancer/balancer.go @@ -0,0 +1,367 @@ +/* +Copyright 2024 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 balancer + +import ( + "encoding/json" + "fmt" + "math/rand/v2" + "net/http" + "sync" + + "vitess.io/vitess/go/vt/discovery" + querypb "vitess.io/vitess/go/vt/proto/query" +) + +/* + +The tabletBalancer probabalistically orders the list of available tablets into +a ranked order of preference in order to satisfy two high-level goals: + +1. Balance the load across the available replicas +2. Prefer a replica in the same cell as the vtgate if possible + +In some topologies this is trivial to accomplish by simply preferring tablets in the +local cell, assuming there are a proportional number of local tablets in each cell to +satisfy the inbound traffic to the vtgates in that cell. + +However, for topologies with a relatively small number of tablets in each cell, a simple +affinity algorithm does not effectively balance the load. + +As a simple example: + + Given three cells with vtgates, four replicas spread into those cells, where each vtgate + receives an equal query share. If each routes only to its local cell, the tablets will be + unbalanced since two of them receive 1/3 of the queries, but the two replicas in the same + cell will only receive 1/6 of the queries. + + Cell A: 1/3 --> vtgate --> 1/3 => vttablet + + Cell B: 1/3 --> vtgate --> 1/3 => vttablet + + Cell C: 1/3 --> vtgate --> 1/6 => vttablet + \-> 1/6 => vttablet + +Other topologies that can cause similar pathologies include cases where there may be cells +containing replicas but no local vtgates, and/or cells that have only vtgates but no replicas. + +For these topologies, the tabletBalancer proportionally assigns the output flow to each tablet, +preferring the local cell where possible, but only as long as the global query balance is +maintained. + +To accomplish this goal, the balancer is given: + +* The list of cells that receive inbound traffic to vtgates +* The local cell where the vtgate exists +* The set of tablets and their cells (learned from discovery) + +The model assumes there is an equal probablility of a query coming from each vtgate cell, i.e. +traffic is effectively load balanced between the cells with vtgates. + +Given that information, the balancer builds a simple model to determine how much query load +would go to each tablet if vtgate only routed to its local cell. Then if any tablets are +unbalanced, it shifts the desired allocation away from the local cell preference in order to +even out the query load. + +Based on this global model, the vtgate then probabalistically picks a destination for each +query to be sent and uses these weights to order the available tablets accordingly. + +Assuming each vtgate is configured with and discovers the same information about the topology, +and the input flow is balanced across the vtgate cells (as mentioned above), then each vtgate +should come the the same conclusion about the global flows, and cooperatively should +converge on the desired balanced query load. + +*/ + +type TabletBalancer interface { + // Pick is the main entry point to the balancer. Returns the best tablet out of the list + // for a given query to maintain the desired balanced allocation over multiple executions. + Pick(target *querypb.Target, tablets []*discovery.TabletHealth) *discovery.TabletHealth + + // DebugHandler provides a summary of tablet balancer state + DebugHandler(w http.ResponseWriter, r *http.Request) +} + +func NewTabletBalancer(localCell string, vtGateCells []string) TabletBalancer { + return &tabletBalancer{ + localCell: localCell, + vtGateCells: vtGateCells, + allocations: map[discovery.KeyspaceShardTabletType]*targetAllocation{}, + } +} + +type tabletBalancer struct { + // + // Configuration + // + + // The local cell for the vtgate + localCell string + + // The set of cells that have vtgates + vtGateCells []string + + // mu protects the allocation map + mu sync.Mutex + + // + // Allocations for balanced mode, calculated once per target and invalidated + // whenever the topology changes. + // + allocations map[discovery.KeyspaceShardTabletType]*targetAllocation +} + +type targetAllocation struct { + // Target flow per cell based on the number of tablets discovered in the cell + Target map[string]int // json:target + + // Input flows allocated for each cell + Inflows map[string]int + + // Output flows from each vtgate cell to each target cell + Outflows map[string]map[string]int + + // Allocation routed to each tablet from the local cell used for ranking + Allocation map[uint32]int + + // Tablets that local cell does not route to + Unallocated map[uint32]struct{} + + // Total allocation which is basically 1,000,000 / len(vtgatecells) + TotalAllocation int +} + +func (b *tabletBalancer) print() string { + allocations, _ := json.Marshal(&b.allocations) + return fmt.Sprintf("LocalCell: %s, VtGateCells: %s, allocations: %s", + b.localCell, b.vtGateCells, string(allocations)) +} + +func (b *tabletBalancer) DebugHandler(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "Local Cell: %v\r\n", b.localCell) + fmt.Fprintf(w, "Vtgate Cells: %v\r\n", b.vtGateCells) + + b.mu.Lock() + defer b.mu.Unlock() + allocations, _ := json.MarshalIndent(b.allocations, "", " ") + fmt.Fprintf(w, "Allocations: %v\r\n", string(allocations)) +} + +// Pick is the main entry point to the balancer. +// +// Given the total allocation for the set of tablets, choose the best target +// by a weighted random sample so that over time the system will achieve the +// desired balanced allocation. +func (b *tabletBalancer) Pick(target *querypb.Target, tablets []*discovery.TabletHealth) *discovery.TabletHealth { + + numTablets := len(tablets) + if numTablets == 0 { + return nil + } + + allocationMap, totalAllocation := b.getAllocation(target, tablets) + + r := rand.IntN(totalAllocation) + for i := 0; i < numTablets; i++ { + flow := allocationMap[tablets[i].Tablet.Alias.Uid] + if r < flow { + return tablets[i] + } + r -= flow + } + + return tablets[0] +} + +// To stick with integer arithmetic, use 1,000,000 as the full load +const ALLOCATION = 1000000 + +func (b *tabletBalancer) allocateFlows(allTablets []*discovery.TabletHealth) *targetAllocation { + // Initialization: Set up some data structures and derived values + a := targetAllocation{ + Target: map[string]int{}, + Inflows: map[string]int{}, + Outflows: map[string]map[string]int{}, + Allocation: map[uint32]int{}, + Unallocated: map[uint32]struct{}{}, + } + flowPerVtgateCell := ALLOCATION / len(b.vtGateCells) + flowPerTablet := ALLOCATION / len(allTablets) + cellExistsWithNoTablets := false + + for _, th := range allTablets { + a.Target[th.Tablet.Alias.Cell] += flowPerTablet + } + + // + // First pass: Allocate vtgate flow to the local cell where the vtgate exists + // and along the way figure out if there are any vtgates with no local tablets. + // + for _, cell := range b.vtGateCells { + outflow := map[string]int{} + target := a.Target[cell] + + if target > 0 { + a.Inflows[cell] += flowPerVtgateCell + outflow[cell] = flowPerVtgateCell + } else { + cellExistsWithNoTablets = true + } + + a.Outflows[cell] = outflow + } + + // + // Figure out if there is a shortfall + // + underAllocated := make(map[string]int) + unbalancedFlow := 0 + for cell, allocation := range a.Target { + if a.Inflows[cell] < allocation { + underAllocated[cell] = allocation - a.Inflows[cell] + unbalancedFlow += underAllocated[cell] + } + } + + // + // Second pass: if there are any vtgates with no local tablets, allocate the underallocated amount + // proportionally to all cells that may need it + // + if cellExistsWithNoTablets { + for _, vtgateCell := range b.vtGateCells { + target := a.Target[vtgateCell] + if target != 0 { + continue + } + + for underAllocatedCell, underAllocatedFlow := range underAllocated { + allocation := flowPerVtgateCell * underAllocatedFlow / unbalancedFlow + a.Inflows[underAllocatedCell] += allocation + a.Outflows[vtgateCell][underAllocatedCell] += allocation + } + } + + // Recompute underallocated after these flows were assigned + unbalancedFlow = 0 + underAllocated = make(map[string]int) + for cell, allocation := range a.Target { + if a.Inflows[cell] < allocation { + underAllocated[cell] = allocation - a.Inflows[cell] + unbalancedFlow += underAllocated[cell] + } + } + } + + // + // Third pass: Shift remaining imbalance if any cell is over/under allocated after + // assigning local cell traffic and distributing load from cells without tablets. + // + if /* fudge for integer arithmetic */ unbalancedFlow > 10 { + + // cells which are overallocated + overAllocated := make(map[string]int) + for cell, allocation := range a.Target { + if a.Inflows[cell] > allocation { + overAllocated[cell] = a.Inflows[cell] - allocation + } + } + + // fmt.Printf("outflows %v over %v under %v\n", a.Outflows, overAllocated, underAllocated) + + // + // For each overallocated cell, proportionally shift flow from targets that are overallocated + // to targets that are underallocated. + // + // Note this is an O(N^3) loop, but only over the cells which need adjustment. + // + for _, vtgateCell := range b.vtGateCells { + for underAllocatedCell, underAllocatedFlow := range underAllocated { + for overAllocatedCell, overAllocatedFlow := range overAllocated { + + currentFlow := a.Outflows[vtgateCell][overAllocatedCell] + if currentFlow == 0 { + continue + } + + // Shift a proportional fraction of the amount that the cell is currently allocated weighted + // by the fraction that this vtgate cell is already sending to the overallocated cell, and the + // fraction that the new target is underallocated + // + // Note that the operator order matters -- multiplications need to occur before divisions + // to avoid truncating the integer values. + shiftFlow := overAllocatedFlow * currentFlow * underAllocatedFlow / a.Inflows[overAllocatedCell] / unbalancedFlow + + //fmt.Printf("shift %d %s %s -> %s (over %d current %d in %d under %d unbalanced %d) \n", shiftFlow, vtgateCell, overAllocatedCell, underAllocatedCell, + // overAllocatedFlow, currentFlow, a.Inflows[overAllocatedCell], underAllocatedFlow, unbalancedFlow) + + a.Outflows[vtgateCell][overAllocatedCell] -= shiftFlow + a.Inflows[overAllocatedCell] -= shiftFlow + + a.Inflows[underAllocatedCell] += shiftFlow + a.Outflows[vtgateCell][underAllocatedCell] += shiftFlow + } + } + } + } + + // + // Finally, once the cell flows are all adjusted, figure out the local allocation to each + // tablet in the target cells + // + outflow := a.Outflows[b.localCell] + for _, tablet := range allTablets { + cell := tablet.Tablet.Alias.Cell + flow := outflow[cell] + if flow > 0 { + a.Allocation[tablet.Tablet.Alias.Uid] = flow * flowPerTablet / a.Target[cell] + a.TotalAllocation += flow * flowPerTablet / a.Target[cell] + } else { + a.Unallocated[tablet.Tablet.Alias.Uid] = struct{}{} + } + } + + return &a +} + +// getAllocation builds the allocation map if needed and returns a copy of the map +func (b *tabletBalancer) getAllocation(target *querypb.Target, tablets []*discovery.TabletHealth) (map[uint32]int, int) { + b.mu.Lock() + defer b.mu.Unlock() + + allocation, exists := b.allocations[discovery.KeyFromTarget(target)] + if exists && (len(allocation.Allocation)+len(allocation.Unallocated)) == len(tablets) { + mismatch := false + for _, tablet := range tablets { + if _, ok := allocation.Allocation[tablet.Tablet.Alias.Uid]; !ok { + if _, ok := allocation.Unallocated[tablet.Tablet.Alias.Uid]; !ok { + mismatch = true + break + } + } + } + if !mismatch { + // No change in tablets for this target. Return computed allocation + return allocation.Allocation, allocation.TotalAllocation + } + } + + allocation = b.allocateFlows(tablets) + b.allocations[discovery.KeyFromTarget(target)] = allocation + + return allocation.Allocation, allocation.TotalAllocation +} diff --git a/go/vt/vtgate/balancer/balancer_test.go b/go/vt/vtgate/balancer/balancer_test.go new file mode 100644 index 00000000000..1c6a72421fc --- /dev/null +++ b/go/vt/vtgate/balancer/balancer_test.go @@ -0,0 +1,371 @@ +/* +Copyright 2024 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 balancer + +import ( + "strconv" + "testing" + + "github.com/stretchr/testify/assert" + + "vitess.io/vitess/go/vt/discovery" + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/topo" +) + +var nextTestTabletUID int + +func createTestTablet(cell string) *discovery.TabletHealth { + nextTestTabletUID++ + tablet := topo.NewTablet(uint32(nextTestTabletUID), cell, strconv.Itoa(nextTestTabletUID)) + tablet.PortMap["vt"] = 1 + tablet.PortMap["grpc"] = 2 + tablet.Keyspace = "k" + tablet.Shard = "s" + + return &discovery.TabletHealth{ + Tablet: tablet, + Target: &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA}, + Serving: false, + Stats: nil, + PrimaryTermStartTime: 0, + } +} + +func TestAllocateFlows(t *testing.T) { + cases := []struct { + test string + tablets []*discovery.TabletHealth + vtgateCells []string + }{ + { + "balanced one tablet per cell", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("d"), + }, + []string{"a", "b", "c", "d"}, + }, + { + "balanced multiple tablets per cell", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("d"), + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("d"), + }, + []string{"a", "b", "c", "d"}, + }, + { + "vtgate in cell with no tablets", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("d"), + }, + []string{"a", "b", "c", "d", "e"}, + }, + { + "vtgates in multiple cells with no tablets", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("d"), + }, + []string{"a", "b", "c", "d", "e", "f", "g"}, + }, + { + "imbalanced multiple tablets in one cell", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + }, + []string{"a", "b", "c"}, + }, + { + "imbalanced multiple tablets in multiple cells", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("d"), + createTestTablet("d"), + createTestTablet("d"), + createTestTablet("d"), + }, + []string{"a", "b", "c", "d"}, + }, + { + "heavy imbalance", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("c"), + }, + []string{"a", "b", "c", "d"}, + }, + } + + target := &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA} + + for _, c := range cases { + t.Logf("\n\nTest Case: %s\n\n", c.test) + + tablets := c.tablets + vtGateCells := c.vtgateCells + + tabletsByCell := make(map[string][]*discovery.TabletHealth) + for _, tablet := range tablets { + cell := tablet.Tablet.Alias.Cell + tabletsByCell[cell] = append(tabletsByCell[cell], tablet) + } + + allocationPerTablet := make(map[uint32]int) + expectedPerTablet := ALLOCATION / len(tablets) + + expectedPerCell := make(map[string]int) + for cell := range tabletsByCell { + expectedPerCell[cell] = ALLOCATION / len(tablets) * len(tabletsByCell[cell]) + } + + // Run the balancer over each vtgate cell + for _, localCell := range vtGateCells { + b := NewTabletBalancer(localCell, vtGateCells).(*tabletBalancer) + a := b.allocateFlows(tablets) + b.allocations[discovery.KeyFromTarget(target)] = a + + t.Logf("Target Flows %v, Balancer: %s, Allocations: %v \n", expectedPerCell, b.print(), b.allocations) + + // Accumulate all the output per tablet cell + outflowPerCell := make(map[string]int) + for _, outflow := range a.Outflows { + for tabletCell, flow := range outflow { + assert.GreaterOrEqual(t, flow, 0, b.print()) + outflowPerCell[tabletCell] += flow + } + } + + // Check in / out flow to each tablet cell + for cell := range tabletsByCell { + expectedForCell := expectedPerCell[cell] + + assert.InEpsilonf(t, expectedForCell, a.Inflows[cell], 0.01, + "did not allocate correct inflow to cell %s. Balancer {%s} ExpectedPerCell {%v}", + cell, b.print(), expectedPerCell) + assert.InEpsilonf(t, expectedForCell, outflowPerCell[cell], 0.01, + "did not allocate correct outflow to cell %s. Balancer {%s} ExpectedPerCell {%v}", + cell, b.print(), expectedPerCell) + } + + // Accumulate the allocations for all runs to compare what the system does as a whole + // when routing from all vtgate cells + for uid, flow := range a.Allocation { + allocationPerTablet[uid] += flow + } + } + + // Check that the allocations all add up + for _, tablet := range tablets { + uid := tablet.Tablet.Alias.Uid + + allocation := allocationPerTablet[uid] + assert.InEpsilonf(t, expectedPerTablet, allocation, 0.01, + "did not allocate full allocation to tablet %d", uid) + } + } +} + +func TestBalancedPick(t *testing.T) { + cases := []struct { + test string + tablets []*discovery.TabletHealth + vtgateCells []string + }{ + { + "simple balanced", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("d"), + }, + + []string{"a", "b", "c", "d"}, + }, + { + "simple unbalanced", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("d"), + }, + + []string{"a", "b", "c", "d"}, + }, + { + "mixed unbalanced", + []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("c"), + createTestTablet("c"), + }, + + []string{"a", "b", "c", "d"}, + }, + { + "one target same cell", + []*discovery.TabletHealth{ + createTestTablet("a"), + }, + + []string{"a"}, + }, + { + "one target other cell", + []*discovery.TabletHealth{ + createTestTablet("a"), + }, + + []string{"b", "c", "d"}, + }, + } + + target := &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA} + for _, c := range cases { + t.Logf("\n\nTest Case: %s\n\n", c.test) + + tablets := c.tablets + vtGateCells := c.vtgateCells + + // test unbalanced distribution + + routed := make(map[uint32]int) + + expectedPerCell := make(map[string]int) + for _, tablet := range tablets { + cell := tablet.Tablet.Alias.Cell + expectedPerCell[cell] += ALLOCATION / len(tablets) + } + + // Run the algorithm a bunch of times to get a random enough sample + N := 1000000 + for _, localCell := range vtGateCells { + b := NewTabletBalancer(localCell, vtGateCells).(*tabletBalancer) + + for i := 0; i < N/len(vtGateCells); i++ { + th := b.Pick(target, tablets) + if i == 0 { + t.Logf("Target Flows %v, Balancer: %s\n", expectedPerCell, b.print()) + } + + routed[th.Tablet.Alias.Uid]++ + } + } + + expected := N / len(tablets) + delta := make(map[uint32]int) + for _, tablet := range tablets { + got := routed[tablet.Tablet.Alias.Uid] + delta[tablet.Tablet.Alias.Uid] = got - expected + assert.InEpsilonf(t, expected, got, 0.01, + "routing to tablet %d", tablet.Tablet.Alias.Uid) + } + } +} + +func TestTopologyChanged(t *testing.T) { + allTablets := []*discovery.TabletHealth{ + createTestTablet("a"), + createTestTablet("a"), + createTestTablet("b"), + createTestTablet("b"), + } + target := &querypb.Target{Keyspace: "k", Shard: "s", TabletType: topodatapb.TabletType_REPLICA} + + b := NewTabletBalancer("b", []string{"a", "b"}).(*tabletBalancer) + + N := 1 + + // initially create a slice of tablets with just the two in cell a + tablets := allTablets + tablets = tablets[0:2] + + for i := 0; i < N; i++ { + th := b.Pick(target, tablets) + allocation, totalAllocation := b.getAllocation(target, tablets) + + assert.Equalf(t, ALLOCATION/2, totalAllocation, "totalAllocation mismatch %s", b.print()) + assert.Equalf(t, ALLOCATION/4, allocation[th.Tablet.Alias.Uid], "allocation mismatch %s, cell %s", b.print(), allTablets[0].Tablet.Alias.Cell) + assert.Equalf(t, "a", th.Tablet.Alias.Cell, "shuffle promoted wrong tablet from cell %s", allTablets[0].Tablet.Alias.Cell) + } + + // Run again with the full topology. Now traffic should go to cell b + for i := 0; i < N; i++ { + th := b.Pick(target, allTablets) + + allocation, totalAllocation := b.getAllocation(target, allTablets) + + assert.Equalf(t, ALLOCATION/2, totalAllocation, "totalAllocation mismatch %s", b.print()) + assert.Equalf(t, ALLOCATION/4, allocation[th.Tablet.Alias.Uid], "allocation mismatch %s, cell %s", b.print(), allTablets[0].Tablet.Alias.Cell) + assert.Equalf(t, "b", th.Tablet.Alias.Cell, "shuffle promoted wrong tablet from cell %s", allTablets[0].Tablet.Alias.Cell) + } + + // Run again with a node in the topology replaced. + newTablet := createTestTablet("b") + allTablets[2] = newTablet + for i := 0; i < N; i++ { + th := b.Pick(target, allTablets) + + allocation, totalAllocation := b.getAllocation(target, allTablets) + + assert.Equalf(t, ALLOCATION/2, totalAllocation, "totalAllocation mismatch %s", b.print()) + assert.Equalf(t, ALLOCATION/4, allocation[th.Tablet.Alias.Uid], "allocation mismatch %s, cell %s", b.print(), allTablets[0].Tablet.Alias.Cell) + assert.Equalf(t, "b", th.Tablet.Alias.Cell, "shuffle promoted wrong tablet from cell %s", allTablets[0].Tablet.Alias.Cell) + } + +} diff --git a/go/vt/vtgate/debug_2pc.go b/go/vt/vtgate/debug_2pc.go new file mode 100644 index 00000000000..dc052df33d6 --- /dev/null +++ b/go/vt/vtgate/debug_2pc.go @@ -0,0 +1,69 @@ +//go:build debug2PC + +/* +Copyright 2024 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 vtgate + +import ( + "context" + + "vitess.io/vitess/go/vt/callerid" + "vitess.io/vitess/go/vt/log" + querypb "vitess.io/vitess/go/vt/proto/query" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" +) + +const DebugTwoPc = true + +// checkTestFailure is used to simulate failures in 2PC flow for testing when DebugTwoPc is true. +func checkTestFailure(ctx context.Context, expectCaller string, target *querypb.Target) error { + callerID := callerid.EffectiveCallerIDFromContext(ctx) + if callerID == nil || callerID.GetPrincipal() != expectCaller { + return nil + } + switch callerID.Principal { + case "TRCreated_FailNow": + log.Errorf("Fail After TR created") + // no commit decision is made. Transaction should be a rolled back. + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Fail After TR created") + case "RMPrepare_-40_FailNow": + if target.Shard != "-40" { + return nil + } + log.Errorf("Fail During RM prepare") + // no commit decision is made. Transaction should be a rolled back. + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Fail During RM prepare") + case "RMPrepared_FailNow": + log.Errorf("Fail After RM prepared") + // no commit decision is made. Transaction should be a rolled back. + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Fail After RM prepared") + case "MMCommitted_FailNow": + log.Errorf("Fail After MM commit") + // commit decision is made. Transaction should be committed. + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Fail After MM commit") + case "RMCommit_-40_FailNow": + if target.Shard != "-40" { + return nil + } + log.Errorf("Fail During RM commit") + // commit decision is made. Transaction should be a committed. + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Fail During RM commit") + default: + return nil + } +} diff --git a/go/vt/vtgate/endtoend/aggr_test.go b/go/vt/vtgate/endtoend/aggr_test.go index b37697a72f4..402cecc0c6d 100644 --- a/go/vt/vtgate/endtoend/aggr_test.go +++ b/go/vt/vtgate/endtoend/aggr_test.go @@ -21,37 +21,35 @@ import ( "fmt" "testing" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/test/utils" + "vitess.io/vitess/go/mysql" ) func TestAggregateTypes(t *testing.T) { ctx := context.Background() conn, err := mysql.Connect(ctx, &vtParams) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) defer conn.Close() exec(t, conn, "insert into aggr_test(id, val1, val2) values(1,'a',1), (2,'A',1), (3,'b',1), (4,'c',3), (5,'c',4)") exec(t, conn, "insert into aggr_test(id, val1, val2) values(6,'d',null), (7,'e',null), (8,'E',1)") qr := exec(t, conn, "select val1, count(distinct val2), count(*) from aggr_test group by val1") - if got, want := fmt.Sprintf("%v", qr.Rows), `[[VARCHAR("a") INT64(1) INT64(2)] [VARCHAR("b") INT64(1) INT64(1)] [VARCHAR("c") INT64(2) INT64(2)] [VARCHAR("d") INT64(0) INT64(1)] [VARCHAR("e") INT64(1) INT64(2)]]`; got != want { - t.Errorf("select:\n%v want\n%v", got, want) - } + want := `[[VARCHAR("a") INT64(1) INT64(2)] [VARCHAR("b") INT64(1) INT64(1)] [VARCHAR("c") INT64(2) INT64(2)] [VARCHAR("d") INT64(0) INT64(1)] [VARCHAR("e") INT64(1) INT64(2)]]` + utils.MustMatch(t, want, fmt.Sprintf("%v", qr.Rows)) qr = exec(t, conn, "select val1, sum(distinct val2), sum(val2) from aggr_test group by val1") - if got, want := fmt.Sprintf("%v", qr.Rows), `[[VARCHAR("a") DECIMAL(1) DECIMAL(2)] [VARCHAR("b") DECIMAL(1) DECIMAL(1)] [VARCHAR("c") DECIMAL(7) DECIMAL(7)] [VARCHAR("d") NULL NULL] [VARCHAR("e") DECIMAL(1) DECIMAL(1)]]`; got != want { - t.Errorf("select:\n%v want\n%v", got, want) - } + want = `[[VARCHAR("a") DECIMAL(1) DECIMAL(2)] [VARCHAR("b") DECIMAL(1) DECIMAL(1)] [VARCHAR("c") DECIMAL(7) DECIMAL(7)] [VARCHAR("d") NULL NULL] [VARCHAR("e") DECIMAL(1) DECIMAL(1)]]` + utils.MustMatch(t, want, fmt.Sprintf("%v", qr.Rows)) qr = exec(t, conn, "select val1, count(distinct val2) k, count(*) from aggr_test group by val1 order by k desc, val1") - if got, want := fmt.Sprintf("%v", qr.Rows), `[[VARCHAR("c") INT64(2) INT64(2)] [VARCHAR("a") INT64(1) INT64(2)] [VARCHAR("b") INT64(1) INT64(1)] [VARCHAR("e") INT64(1) INT64(2)] [VARCHAR("d") INT64(0) INT64(1)]]`; got != want { - t.Errorf("select:\n%v want\n%v", got, want) - } + want = `[[VARCHAR("c") INT64(2) INT64(2)] [VARCHAR("a") INT64(1) INT64(2)] [VARCHAR("b") INT64(1) INT64(1)] [VARCHAR("e") INT64(1) INT64(2)] [VARCHAR("d") INT64(0) INT64(1)]]` + utils.MustMatch(t, want, fmt.Sprintf("%v", qr.Rows)) qr = exec(t, conn, "select val1, count(distinct val2) k, count(*) from aggr_test group by val1 order by k desc, val1 limit 4") - if got, want := fmt.Sprintf("%v", qr.Rows), `[[VARCHAR("c") INT64(2) INT64(2)] [VARCHAR("a") INT64(1) INT64(2)] [VARCHAR("b") INT64(1) INT64(1)] [VARCHAR("e") INT64(1) INT64(2)]]`; got != want { - t.Errorf("select:\n%v want\n%v", got, want) - } + want = `[[VARCHAR("c") INT64(2) INT64(2)] [VARCHAR("a") INT64(1) INT64(2)] [VARCHAR("b") INT64(1) INT64(1)] [VARCHAR("e") INT64(1) INT64(2)]]` + utils.MustMatch(t, want, fmt.Sprintf("%v", qr.Rows)) } diff --git a/go/vt/vtgate/endtoend/vstream_test.go b/go/vt/vtgate/endtoend/vstream_test.go index 246d17f88b5..8fed95f5d51 100644 --- a/go/vt/vtgate/endtoend/vstream_test.go +++ b/go/vt/vtgate/endtoend/vstream_test.go @@ -60,6 +60,7 @@ func initialize(ctx context.Context, t *testing.T) (*vtgateconn.VTGateConn, *mys } return gconn, conn, mconn, close } + func TestVStream(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -186,7 +187,7 @@ func TestVStreamCopyBasic(t *testing.T) { Lastpk: qr, }} var shardGtids []*binlogdatapb.ShardGtid - var vgtid = &binlogdatapb.VGtid{} + vgtid := &binlogdatapb.VGtid{} shardGtids = append(shardGtids, &binlogdatapb.ShardGtid{ Keyspace: "ks", Shard: "-80", @@ -264,20 +265,14 @@ func TestVStreamCopyUnspecifiedShardGtid(t *testing.T) { defer cancel() conn, err := mysql.Connect(ctx, &vtParams) - if err != nil { - require.NoError(t, err) - } + require.NoError(t, err) defer conn.Close() _, err = conn.ExecuteFetch("insert into t1_copy_all(id1,id2) values(1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8)", 1, false) - if err != nil { - require.NoError(t, err) - } + require.NoError(t, err) _, err = conn.ExecuteFetch("insert into t1_copy_all_ks2(id1,id2) values(10,10), (20,20)", 1, false) - if err != nil { - require.NoError(t, err) - } + require.NoError(t, err) filter := &binlogdatapb.Filter{ Rules: []*binlogdatapb.Rule{{ @@ -343,13 +338,11 @@ func TestVStreamCopyUnspecifiedShardGtid(t *testing.T) { gconn, conn, mconn, closeConnections := initialize(ctx, t) defer closeConnections() - var vgtid = &binlogdatapb.VGtid{} + vgtid := &binlogdatapb.VGtid{} vgtid.ShardGtids = []*binlogdatapb.ShardGtid{c.shardGtid} reader, err := gconn.VStream(ctx, topodatapb.TabletType_PRIMARY, vgtid, filter, flags) _, _ = conn, mconn - if err != nil { - require.NoError(t, err) - } + require.NoError(t, err) require.NotNil(t, reader) var evs []*binlogdatapb.VEvent var completedEvs []*binlogdatapb.VEvent @@ -426,7 +419,7 @@ func TestVStreamCopyResume(t *testing.T) { } var shardGtids []*binlogdatapb.ShardGtid - var vgtid = &binlogdatapb.VGtid{} + vgtid := &binlogdatapb.VGtid{} shardGtids = append(shardGtids, &binlogdatapb.ShardGtid{ Keyspace: "ks", Shard: "-80", @@ -526,7 +519,7 @@ func TestVStreamCurrent(t *testing.T) { defer closeConnections() var shardGtids []*binlogdatapb.ShardGtid - var vgtid = &binlogdatapb.VGtid{} + vgtid := &binlogdatapb.VGtid{} shardGtids = append(shardGtids, &binlogdatapb.ShardGtid{ Keyspace: "ks", Shard: "-80", @@ -580,7 +573,7 @@ func TestVStreamSharded(t *testing.T) { defer closeConnections() var shardGtids []*binlogdatapb.ShardGtid - var vgtid = &binlogdatapb.VGtid{} + vgtid := &binlogdatapb.VGtid{} shardGtids = append(shardGtids, &binlogdatapb.ShardGtid{ Keyspace: "ks", Shard: "-80", @@ -665,7 +658,6 @@ func TestVStreamSharded(t *testing.T) { t.Fatalf("remote error: %v\n", err) } } - } // TestVStreamCopyTransactions tests that we are properly wrapping @@ -822,9 +814,11 @@ type VEventSorter []*binlogdatapb.VEvent func (v VEventSorter) Len() int { return len(v) } + func (v VEventSorter) Swap(i, j int) { v[i], v[j] = v[j], v[i] } + func (v VEventSorter) Less(i, j int) bool { valsI := v[i].GetRowEvent().RowChanges[0].After if valsI == nil { diff --git a/go/vt/vtgate/engine/aggregations.go b/go/vt/vtgate/engine/aggregations.go index d3f2b7a1c82..769df332b73 100644 --- a/go/vt/vtgate/engine/aggregations.go +++ b/go/vt/vtgate/engine/aggregations.go @@ -42,7 +42,7 @@ type AggregateParams struct { WCol int Type evalengine.Type - Alias string `json:",omitempty"` + Alias string Func sqlparser.AggrFunc Original *sqlparser.AliasedExpr @@ -347,7 +347,8 @@ func isComparable(typ sqltypes.Type) bool { sqltypes.Enum, sqltypes.Set, sqltypes.TypeJSON, - sqltypes.Bit: + sqltypes.Bit, + sqltypes.Vector: return true } return false diff --git a/go/vt/vtgate/engine/cached_size.go b/go/vt/vtgate/engine/cached_size.go index df23f14f6f5..4c0d1009bd1 100644 --- a/go/vt/vtgate/engine/cached_size.go +++ b/go/vt/vtgate/engine/cached_size.go @@ -857,6 +857,40 @@ func (cached *Projection) CachedSize(alloc bool) int64 { } return size } + +//go:nocheckptr +func (cached *RecurseCTE) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(48) + } + // field Seed vitess.io/vitess/go/vt/vtgate/engine.Primitive + if cc, ok := cached.Seed.(cachedObject); ok { + size += cc.CachedSize(true) + } + // field Term vitess.io/vitess/go/vt/vtgate/engine.Primitive + if cc, ok := cached.Term.(cachedObject); ok { + size += cc.CachedSize(true) + } + // field Vars map[string]int + if cached.Vars != nil { + size += int64(48) + hmap := reflect.ValueOf(cached.Vars) + numBuckets := int(math.Pow(2, float64((*(*uint8)(unsafe.Pointer(hmap.Pointer() + uintptr(9))))))) + numOldBuckets := (*(*uint16)(unsafe.Pointer(hmap.Pointer() + uintptr(10)))) + size += hack.RuntimeAllocSize(int64(numOldBuckets * 208)) + if len(cached.Vars) > 0 || numBuckets > 1 { + size += hack.RuntimeAllocSize(int64(numBuckets * 208)) + } + for k := range cached.Vars { + size += hack.RuntimeAllocSize(int64(len(k))) + } + } + return size +} func (cached *RenameFields) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -1293,6 +1327,20 @@ func (cached *ThrottleApp) CachedSize(alloc bool) int64 { size += cached.ThrottledAppRule.CachedSize(true) return size } +func (cached *TransactionStatus) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(32) + } + // field Keyspace string + size += hack.RuntimeAllocSize(int64(len(cached.Keyspace))) + // field TransactionID string + size += hack.RuntimeAllocSize(int64(len(cached.TransactionID))) + return size +} func (cached *UncorrelatedSubquery) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -1549,6 +1597,24 @@ func (cached *VitessMetadata) CachedSize(alloc bool) int64 { size += hack.RuntimeAllocSize(int64(len(cached.Value))) return size } +func (cached *percentBasedMirror) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(48) + } + // field primitive vitess.io/vitess/go/vt/vtgate/engine.Primitive + if cc, ok := cached.primitive.(cachedObject); ok { + size += cc.CachedSize(true) + } + // field target vitess.io/vitess/go/vt/vtgate/engine.Primitive + if cc, ok := cached.target.(cachedObject); ok { + size += cc.CachedSize(true) + } + return size +} //go:nocheckptr func (cached *shardRoute) CachedSize(alloc bool) int64 { diff --git a/go/vt/vtgate/engine/concatenate.go b/go/vt/vtgate/engine/concatenate.go index 13727124e78..eb93711eed2 100644 --- a/go/vt/vtgate/engine/concatenate.go +++ b/go/vt/vtgate/engine/concatenate.go @@ -102,12 +102,14 @@ func (c *Concatenate) TryExecute(ctx context.Context, vcursor VCursor, bindVars } var rows [][]sqltypes.Value - err = c.coerceAndVisitResults(res, fieldTypes, func(result *sqltypes.Result) error { + callback := func(result *sqltypes.Result) error { rows = append(rows, result.Rows...) return nil - }, evalengine.ParseSQLMode(vcursor.SQLMode())) - if err != nil { - return nil, err + } + for _, r := range res { + if err = c.coerceAndVisitResultsForOneSource([]*sqltypes.Result{r}, fields, fieldTypes, callback, evalengine.ParseSQLMode(vcursor.SQLMode())); err != nil { + return nil, err + } } return &sqltypes.Result{ @@ -245,12 +247,14 @@ func (c *Concatenate) parallelStreamExec(inCtx context.Context, vcursor VCursor, // Mutexes for dealing with concurrent access to shared state. var ( - muCallback sync.Mutex // Protects callback - muFields sync.Mutex // Protects field state - condFields = sync.NewCond(&muFields) // Condition var for field arrival - wg errgroup.Group // Wait group for all streaming goroutines - rest = make([]*sqltypes.Result, len(c.Sources)) // Collects first result from each source to derive fields - fieldTypes []evalengine.Type // Cached final field types + muCallback sync.Mutex // Protects callback + muFields sync.Mutex // Protects field state + condFields = sync.NewCond(&muFields) // Condition var for field arrival + wg errgroup.Group // Wait group for all streaming goroutines + rest = make([]*sqltypes.Result, len(c.Sources)) // Collects first result from each source to derive fields + fieldTypes []evalengine.Type // Cached final field types + resultFields []*querypb.Field // Final fields that need to be set for the first result. + needsCoercion = make([]bool, len(c.Sources)) // Tracks if coercion is needed for each individual source ) // Process each result chunk, considering type coercion. @@ -258,19 +262,8 @@ func (c *Concatenate) parallelStreamExec(inCtx context.Context, vcursor VCursor, muCallback.Lock() defer muCallback.Unlock() - // Check if type coercion needed for this source. - // We only need to check if fields are not in NoNeedToTypeCheck set. - needsCoercion := false - for idx, field := range rest[srcIdx].Fields { - _, skip := c.NoNeedToTypeCheck[idx] - if !skip && fieldTypes[idx].Type() != field.Type { - needsCoercion = true - break - } - } - // Apply type coercion if needed. - if needsCoercion { + if needsCoercion[srcIdx] { for _, row := range res.Rows { if err := c.coerceValuesTo(row, fieldTypes, sqlmode); err != nil { return err @@ -296,12 +289,29 @@ func (c *Concatenate) parallelStreamExec(inCtx context.Context, vcursor VCursor, if !slices.Contains(rest, nil) { // We have received fields from all sources. We can now calculate the output types var err error - resultChunk.Fields, fieldTypes, err = c.getFieldTypes(vcursor, rest) + resultFields, fieldTypes, err = c.getFieldTypes(vcursor, rest) if err != nil { muFields.Unlock() return err } + // Check if we need coercion for each source. + for srcIdx, result := range rest { + srcNeedsCoercion := false + for idx, field := range result.Fields { + _, skip := c.NoNeedToTypeCheck[idx] + // We only need to check if fields are not in NoNeedToTypeCheck set. + if !skip && fieldTypes[idx].Type() != field.Type { + srcNeedsCoercion = true + break + } + } + needsCoercion[srcIdx] = srcNeedsCoercion + } + + // We only need to send the fields in the first result. + // We set this field after the coercion check to avoid calculating incorrect needs coercion value. + resultChunk.Fields = resultFields muFields.Unlock() defer condFields.Broadcast() return callback(resultChunk, currIndex) @@ -310,8 +320,11 @@ func (c *Concatenate) parallelStreamExec(inCtx context.Context, vcursor VCursor, // Wait for fields from all sources. for slices.Contains(rest, nil) { + // This wait call lets go of the muFields lock and acquires it again later after waiting. condFields.Wait() } + // We only need to send fields in the first result. + resultChunk.Fields = nil muFields.Unlock() // Context check to avoid extra work. @@ -368,12 +381,12 @@ func (c *Concatenate) sequentialStreamExec(ctx context.Context, vcursor VCursor, firsts[i] = result[0] } - _, fieldTypes, err := c.getFieldTypes(vcursor, firsts) + fields, fieldTypes, err := c.getFieldTypes(vcursor, firsts) if err != nil { return err } for _, res := range results { - if err = c.coerceAndVisitResults(res, fieldTypes, callback, sqlmode); err != nil { + if err = c.coerceAndVisitResultsForOneSource(res, fields, fieldTypes, callback, sqlmode); err != nil { return err } } @@ -381,25 +394,33 @@ func (c *Concatenate) sequentialStreamExec(ctx context.Context, vcursor VCursor, return nil } -func (c *Concatenate) coerceAndVisitResults( +func (c *Concatenate) coerceAndVisitResultsForOneSource( res []*sqltypes.Result, + fields []*querypb.Field, fieldTypes []evalengine.Type, callback func(*sqltypes.Result) error, sqlmode evalengine.SQLMode, ) error { + if len(res) == 0 { + return nil + } + needsCoercion := false + for idx, field := range res[0].Fields { + if fieldTypes[idx].Type() != field.Type { + needsCoercion = true + break + } + } + if res[0].Fields != nil { + res[0].Fields = fields + } + for _, r := range res { if len(r.Rows) > 0 && len(fieldTypes) != len(r.Rows[0]) { return errWrongNumberOfColumnsInSelect } - needsCoercion := false - for idx, field := range r.Fields { - if fieldTypes[idx].Type() != field.Type { - needsCoercion = true - break - } - } if needsCoercion { for _, row := range r.Rows { err := c.coerceValuesTo(row, fieldTypes, sqlmode) diff --git a/go/vt/vtgate/engine/concatenate_test.go b/go/vt/vtgate/engine/concatenate_test.go index dd2b1300e9b..39b9ed961b3 100644 --- a/go/vt/vtgate/engine/concatenate_test.go +++ b/go/vt/vtgate/engine/concatenate_test.go @@ -124,27 +124,24 @@ func TestConcatenate_NoErrors(t *testing.T) { if !tx { txStr = "NotInTx" } - t.Run(fmt.Sprintf("%s-%s-Exec", txStr, tc.testName), func(t *testing.T) { - qr, err := concatenate.TryExecute(context.Background(), vcursor, nil, true) + checkResult := func(t *testing.T, qr *sqltypes.Result, err error) { if tc.expectedError == "" { require.NoError(t, err) utils.MustMatch(t, tc.expectedResult.Fields, qr.Fields, "fields") - utils.MustMatch(t, tc.expectedResult.Rows, qr.Rows) + require.NoError(t, sqltypes.RowsEquals(tc.expectedResult.Rows, qr.Rows)) } else { require.Error(t, err) require.Contains(t, err.Error(), tc.expectedError) } + } + t.Run(fmt.Sprintf("%s-%s-Exec", txStr, tc.testName), func(t *testing.T) { + qr, err := concatenate.TryExecute(context.Background(), vcursor, nil, true) + checkResult(t, qr, err) }) t.Run(fmt.Sprintf("%s-%s-StreamExec", txStr, tc.testName), func(t *testing.T) { qr, err := wrapStreamExecute(concatenate, vcursor, nil, true) - if tc.expectedError == "" { - require.NoError(t, err) - require.NoError(t, sqltypes.RowsEquals(tc.expectedResult.Rows, qr.Rows)) - } else { - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedError) - } + checkResult(t, qr, err) }) } } diff --git a/go/vt/vtgate/engine/dbddl.go b/go/vt/vtgate/engine/dbddl.go index 60bb4a7202b..7783e6bdc12 100644 --- a/go/vt/vtgate/engine/dbddl.go +++ b/go/vt/vtgate/engine/dbddl.go @@ -55,6 +55,8 @@ type DBDDLPlugin interface { DropDatabase(ctx context.Context, name string) error } +const dbDDLDefaultTimeout = 500 * time.Millisecond + // DBDDL is just a container around custom database provisioning plugins // The default behaviour is to just return an error type DBDDL struct { @@ -102,8 +104,12 @@ func (c *DBDDL) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[st log.Errorf("'%s' database ddl plugin is not registered. Falling back to default plugin", name) plugin = databaseCreatorPlugins[defaultDBDDLPlugin] } - ctx, cancelFunc := addQueryTimeout(ctx, vcursor, c.queryTimeout) - defer cancelFunc() + + if c.queryTimeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, time.Duration(c.queryTimeout)*time.Millisecond) + defer cancel() + } if c.create { return c.createDatabase(ctx, vcursor, plugin) @@ -125,9 +131,9 @@ func (c *DBDDL) createDatabase(ctx context.Context, vcursor VCursor, plugin DBDD break } select { - case <-ctx.Done(): //context cancelled + case <-ctx.Done(): // context cancelled return nil, vterrors.Errorf(vtrpc.Code_DEADLINE_EXCEEDED, "could not validate create database: destination not resolved") - case <-time.After(500 * time.Millisecond): //timeout + case <-time.After(dbDDLDefaultTimeout): // timeout } } var queries []*querypb.BoundQuery @@ -146,9 +152,9 @@ func (c *DBDDL) createDatabase(ctx context.Context, vcursor VCursor, plugin DBDD if err != nil { noErr = false select { - case <-ctx.Done(): //context cancelled + case <-ctx.Done(): // context cancelled return nil, vterrors.Errorf(vtrpc.Code_DEADLINE_EXCEEDED, "could not validate create database: tablets not healthy") - case <-time.After(500 * time.Millisecond): //timeout + case <-time.After(dbDDLDefaultTimeout): // timeout } break } @@ -167,9 +173,9 @@ func (c *DBDDL) dropDatabase(ctx context.Context, vcursor VCursor, plugin DBDDLP } for vcursor.KeyspaceAvailable(c.name) { select { - case <-ctx.Done(): //context cancelled + case <-ctx.Done(): // context cancelled return nil, vterrors.Errorf(vtrpc.Code_DEADLINE_EXCEEDED, "could not validate drop database: keyspace still available in vschema") - case <-time.After(500 * time.Millisecond): //timeout + case <-time.After(dbDDLDefaultTimeout): // timeout } } diff --git a/go/vt/vtgate/engine/delete.go b/go/vt/vtgate/engine/delete.go index 6e354aae5f5..91bcca5cf6a 100644 --- a/go/vt/vtgate/engine/delete.go +++ b/go/vt/vtgate/engine/delete.go @@ -42,9 +42,6 @@ type Delete struct { // TryExecute performs a non-streaming exec. func (del *Delete) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, _ bool) (*sqltypes.Result, error) { - ctx, cancelFunc := addQueryTimeout(ctx, vcursor, del.QueryTimeout) - defer cancelFunc() - rss, bvs, err := del.findRoute(ctx, vcursor, bindVars) if err != nil { return nil, err diff --git a/go/vt/vtgate/engine/fake_primitive_test.go b/go/vt/vtgate/engine/fake_primitive_test.go index e992c2a4623..b878c1931c0 100644 --- a/go/vt/vtgate/engine/fake_primitive_test.go +++ b/go/vt/vtgate/engine/fake_primitive_test.go @@ -24,6 +24,7 @@ import ( "testing" "golang.org/x/sync/errgroup" + "google.golang.org/protobuf/proto" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" @@ -80,7 +81,7 @@ func (f *fakePrimitive) TryExecute(ctx context.Context, vcursor VCursor, bindVar if r == nil { return nil, f.sendErr } - return r, nil + return r.Copy(), nil } func (f *fakePrimitive) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { @@ -111,7 +112,7 @@ func (f *fakePrimitive) syncCall(wantfields bool, callback func(*sqltypes.Result } result := &sqltypes.Result{} for i := 0; i < len(r.Rows); i++ { - result.Rows = append(result.Rows, r.Rows[i]) + result.Rows = append(result.Rows, sqltypes.CopyRow(r.Rows[i])) // Send only two rows at a time. if i%2 == 1 { if err := callback(result); err != nil { @@ -188,6 +189,15 @@ func wrapStreamExecute(prim Primitive, vcursor VCursor, bindVars map[string]*que if result == nil { result = r } else { + if r.Fields != nil { + for i, field := range r.Fields { + aField := field + bField := result.Fields[i] + if !proto.Equal(aField, bField) { + return fmt.Errorf("fields differ: %s <> %s", aField.String(), bField.String()) + } + } + } result.Rows = append(result.Rows, r.Rows...) } return nil diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index 1ba0abfa2ef..9ba4fdc6a6b 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -46,17 +46,25 @@ import ( vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" ) -var testMaxMemoryRows = 100 -var testIgnoreMaxMemoryRows = false +var ( + testMaxMemoryRows = 100 + testIgnoreMaxMemoryRows = false +) -var _ VCursor = (*noopVCursor)(nil) -var _ SessionActions = (*noopVCursor)(nil) +var ( + _ VCursor = (*noopVCursor)(nil) + _ SessionActions = (*noopVCursor)(nil) +) // noopVCursor is used to build other vcursors. type noopVCursor struct { inTx bool } +func (t *noopVCursor) SetExecQueryTimeout(timeout *int) { + panic("implement me") +} + // MySQLVersion implements VCursor. func (t *noopVCursor) Commit(ctx context.Context) error { return nil @@ -112,6 +120,22 @@ func (t *noopVCursor) CloneForReplicaWarming(ctx context.Context) VCursor { panic("implement me") } +func (t *noopVCursor) CloneForMirroring(ctx context.Context) VCursor { + panic("implement me") +} + +func (t *noopVCursor) ReadTransaction(ctx context.Context, transactionID string) (*querypb.TransactionMetadata, error) { + panic("implement me") +} + +func (t *noopVCursor) UnresolvedTransactions(ctx context.Context, keyspace string) ([]*querypb.TransactionMetadata, error) { + panic("implement me") +} + +func (t *noopVCursor) StartPrimitiveTrace() func() Stats { + panic("implement me") +} + func (t *noopVCursor) SetExec(ctx context.Context, name string, value string) error { panic("implement me") } @@ -289,10 +313,6 @@ func (t *noopVCursor) SetClientFoundRows(context.Context, bool) error { func (t *noopVCursor) SetQueryTimeout(maxExecutionTime int64) { } -func (t *noopVCursor) GetQueryTimeout(queryTimeoutFromComments int) int { - return queryTimeoutFromComments -} - func (t *noopVCursor) SetSkipQueryPlanCache(context.Context, bool) error { panic("implement me") } @@ -338,7 +358,7 @@ func (t *noopVCursor) ExceedsMaxMemoryRows(numRows int) bool { } func (t *noopVCursor) GetKeyspace() string { - return "" + return "test_ks" } func (t *noopVCursor) RecordWarning(warning *querypb.QueryWarning) { @@ -380,8 +400,10 @@ func (t *noopVCursor) GetDBDDLPluginName() string { panic("unimplemented") } -var _ VCursor = (*loggingVCursor)(nil) -var _ SessionActions = (*loggingVCursor)(nil) +var ( + _ VCursor = (*loggingVCursor)(nil) + _ SessionActions = (*loggingVCursor)(nil) +) // loggingVCursor logs requests and allows you to verify // that the correct requests were made. @@ -397,7 +419,8 @@ type loggingVCursor struct { curResult int resultErr error - warnings []*querypb.QueryWarning + warnings []*querypb.QueryWarning + transactionStatusOutput []*querypb.TransactionMetadata // Optional errors that can be returned from nextResult() alongside the results for // multi-shard queries @@ -421,6 +444,11 @@ type loggingVCursor struct { shardSession []*srvtopo.ResolvedShard parser *sqlparser.Parser + + onMirrorClonesFn func(context.Context) VCursor + onExecuteMultiShardFn func(context.Context, Primitive, []*srvtopo.ResolvedShard, []*querypb.BoundQuery, bool, bool) + onStreamExecuteMultiFn func(context.Context, Primitive, string, []*srvtopo.ResolvedShard, []map[string]*querypb.BindVariable, bool, bool, func(*sqltypes.Result) error) + onRecordMirrorStatsFn func(time.Duration, time.Duration, error) } func (f *loggingVCursor) HasCreatedTempTable() { @@ -536,6 +564,13 @@ func (f *loggingVCursor) CloneForReplicaWarming(ctx context.Context) VCursor { return f } +func (f *loggingVCursor) CloneForMirroring(ctx context.Context) VCursor { + if f.onMirrorClonesFn != nil { + return f.onMirrorClonesFn(ctx) + } + panic("no mirror clones available") +} + func (f *loggingVCursor) Execute(ctx context.Context, method string, query string, bindvars map[string]*querypb.BindVariable, rollbackOnError bool, co vtgatepb.CommitOrder) (*sqltypes.Result, error) { name := "Unknown" switch co { @@ -553,7 +588,12 @@ func (f *loggingVCursor) Execute(ctx context.Context, method string, query strin } func (f *loggingVCursor) ExecuteMultiShard(ctx context.Context, primitive Primitive, rss []*srvtopo.ResolvedShard, queries []*querypb.BoundQuery, rollbackOnError, canAutocommit bool) (*sqltypes.Result, []error) { + f.mu.Lock() + defer f.mu.Unlock() f.log = append(f.log, fmt.Sprintf("ExecuteMultiShard %v%v %v", printResolvedShardQueries(rss, queries), rollbackOnError, canAutocommit)) + if f.onExecuteMultiShardFn != nil { + f.onExecuteMultiShardFn(ctx, primitive, rss, queries, rollbackOnError, canAutocommit) + } res, err := f.nextResult() if err != nil { return nil, []error{err} @@ -574,6 +614,9 @@ func (f *loggingVCursor) ExecuteStandalone(ctx context.Context, primitive Primit func (f *loggingVCursor) StreamExecuteMulti(ctx context.Context, primitive Primitive, query string, rss []*srvtopo.ResolvedShard, bindVars []map[string]*querypb.BindVariable, rollbackOnError bool, autocommit bool, callback func(reply *sqltypes.Result) error) []error { f.mu.Lock() f.log = append(f.log, fmt.Sprintf("StreamExecuteMulti %s %s", query, printResolvedShardsBindVars(rss, bindVars))) + if f.onStreamExecuteMultiFn != nil { + f.onStreamExecuteMultiFn(ctx, primitive, query, rss, bindVars, rollbackOnError, autocommit, callback) + } r, err := f.nextResult() f.mu.Unlock() if err != nil { @@ -725,6 +768,8 @@ func (f *loggingVCursor) ResolveDestinationsMultiCol(ctx context.Context, keyspa func (f *loggingVCursor) ExpectLog(t *testing.T, want []string) { t.Helper() + f.mu.Lock() + defer f.mu.Unlock() if len(f.log) == 0 && len(want) == 0 { return } @@ -742,6 +787,8 @@ func (f *loggingVCursor) ExpectWarnings(t *testing.T, want []*querypb.QueryWarni } func (f *loggingVCursor) Rewind() { + f.mu.Lock() + defer f.mu.Unlock() f.curShardForKsid = 0 f.curResult = 0 f.log = nil @@ -814,6 +861,24 @@ func (f *loggingVCursor) CanUseSetVar() bool { return useSetVar } +func (f *loggingVCursor) ReadTransaction(_ context.Context, _ string) (*querypb.TransactionMetadata, error) { + if f.resultErr != nil { + return nil, f.resultErr + } + var out *querypb.TransactionMetadata + if len(f.transactionStatusOutput) > 0 { + out = f.transactionStatusOutput[0] + } + return out, nil +} + +func (f *loggingVCursor) UnresolvedTransactions(_ context.Context, _ string) ([]*querypb.TransactionMetadata, error) { + if f.resultErr != nil { + return nil, f.resultErr + } + return f.transactionStatusOutput, nil +} + // SQLParser implements VCursor func (t *loggingVCursor) SQLParser() *sqlparser.Parser { if t.parser == nil { @@ -822,15 +887,26 @@ func (t *loggingVCursor) SQLParser() *sqlparser.Parser { return t.parser } +func (t *loggingVCursor) RecordMirrorStats(sourceExecTime, targetExecTime time.Duration, targetErr error) { + if t.onRecordMirrorStatsFn != nil { + t.onRecordMirrorStatsFn(sourceExecTime, targetExecTime, targetErr) + } +} + func (t *noopVCursor) VExplainLogging() {} func (t *noopVCursor) DisableLogging() {} func (t *noopVCursor) GetVExplainLogs() []ExecuteEntry { return nil } + func (t *noopVCursor) GetLogs() ([]ExecuteEntry, error) { return nil, nil } +// RecordMirrorStats implements VCursor. +func (t *noopVCursor) RecordMirrorStats(sourceExecTime, targetExecTime time.Duration, targetErr error) { +} + func expectResult(t *testing.T, result, want *sqltypes.Result) { t.Helper() fieldsResult := fmt.Sprintf("%v", result.Fields) diff --git a/go/vt/vtgate/engine/hash_join.go b/go/vt/vtgate/engine/hash_join.go index 6ac34e1ab79..6b9425a35d1 100644 --- a/go/vt/vtgate/engine/hash_join.go +++ b/go/vt/vtgate/engine/hash_join.go @@ -44,7 +44,7 @@ type ( // Left and Right are the LHS and RHS primitives // of the Join. They can be any primitive. - Left, Right Primitive `json:",omitempty"` + Left, Right Primitive // Cols defines which columns from the left // or right results should be used to build the @@ -53,7 +53,7 @@ type ( // For the right query, they're 1, 2, etc. // If Cols is {-1, -2, 1, 2}, it means that // the returned result will be {Left0, Left1, Right0, Right1}. - Cols []int `json:",omitempty"` + Cols []int // The keys correspond to the column offset in the inputs where // the join columns can be found diff --git a/go/vt/vtgate/engine/insert.go b/go/vt/vtgate/engine/insert.go index af2d290d957..cd462966ccc 100644 --- a/go/vt/vtgate/engine/insert.go +++ b/go/vt/vtgate/engine/insert.go @@ -112,9 +112,6 @@ func (ins *Insert) RouteType() string { // TryExecute performs a non-streaming exec. func (ins *Insert) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, _ bool) (*sqltypes.Result, error) { - ctx, cancelFunc := addQueryTimeout(ctx, vcursor, ins.QueryTimeout) - defer cancelFunc() - switch ins.Opcode { case InsertUnsharded: return ins.insertIntoUnshardedTable(ctx, vcursor, bindVars) diff --git a/go/vt/vtgate/engine/insert_select.go b/go/vt/vtgate/engine/insert_select.go index 88767420508..f8f3936e323 100644 --- a/go/vt/vtgate/engine/insert_select.go +++ b/go/vt/vtgate/engine/insert_select.go @@ -22,6 +22,7 @@ import ( "fmt" "strconv" "sync" + "time" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/key" @@ -93,9 +94,6 @@ func (ins *InsertSelect) RouteType() string { // TryExecute performs a non-streaming exec. func (ins *InsertSelect) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, _ bool) (*sqltypes.Result, error) { - ctx, cancelFunc := addQueryTimeout(ctx, vcursor, ins.QueryTimeout) - defer cancelFunc() - if ins.Keyspace.Sharded { return ins.execInsertSharded(ctx, vcursor, bindVars) } @@ -111,8 +109,11 @@ func (ins *InsertSelect) TryStreamExecute(ctx context.Context, vcursor VCursor, } return callback(res) } - ctx, cancelFunc := addQueryTimeout(ctx, vcursor, ins.QueryTimeout) - defer cancelFunc() + if ins.QueryTimeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, time.Duration(ins.QueryTimeout)*time.Millisecond) + defer cancel() + } sharded := ins.Keyspace.Sharded output := &sqltypes.Result{} diff --git a/go/vt/vtgate/engine/join.go b/go/vt/vtgate/engine/join.go index dc952673cfe..51976396cba 100644 --- a/go/vt/vtgate/engine/join.go +++ b/go/vt/vtgate/engine/join.go @@ -35,7 +35,7 @@ type Join struct { Opcode JoinOpcode // Left and Right are the LHS and RHS primitives // of the Join. They can be any primitive. - Left, Right Primitive `json:",omitempty"` + Left, Right Primitive // Cols defines which columns from the left // or right results should be used to build the @@ -44,12 +44,12 @@ type Join struct { // For the right query, they're 1, 2, etc. // If Cols is {-1, -2, 1, 2}, it means that // the returned result will be {Left0, Left1, Right0, Right1}. - Cols []int `json:",omitempty"` + Cols []int // Vars defines the list of joinVars that need to // be built from the LHS result before invoking // the RHS subqquery. - Vars map[string]int `json:",omitempty"` + Vars map[string]int } // TryExecute performs a non-streaming exec. diff --git a/go/vt/vtgate/engine/memory_sort.go b/go/vt/vtgate/engine/memory_sort.go index d9919045eaf..03e66d0d033 100644 --- a/go/vt/vtgate/engine/memory_sort.go +++ b/go/vt/vtgate/engine/memory_sort.go @@ -41,7 +41,7 @@ type MemorySort struct { // TruncateColumnCount specifies the number of columns to return // in the final result. Rest of the columns are truncated // from the result received. If 0, no truncation happens. - TruncateColumnCount int `json:",omitempty"` + TruncateColumnCount int } // RouteType returns a description of the query routing type used by the primitive. diff --git a/go/vt/vtgate/engine/mirror.go b/go/vt/vtgate/engine/mirror.go new file mode 100644 index 00000000000..6396e4b33ec --- /dev/null +++ b/go/vt/vtgate/engine/mirror.go @@ -0,0 +1,195 @@ +/* +Copyright 2024 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 engine + +import ( + "context" + "math/rand/v2" + "time" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" +) + +var errMirrorTargetQueryTookTooLong = vterrors.Errorf(vtrpc.Code_ABORTED, "Mirror target query took too long") + +type ( + // percentBasedMirror represents the instructions to execute an + // authoritative primitive and, based on whether a die-roll exceeds a + // percentage, to also execute a target Primitive. + percentBasedMirror struct { + percent float32 + primitive Primitive + target Primitive + } + + mirrorResult struct { + execTime time.Duration + err error + } +) + +const ( + // maxMirrorTargetLag limits how long a mirror target may continue + // executing after the main primitive has finished. + maxMirrorTargetLag = 100 * time.Millisecond +) + +var _ Primitive = (*percentBasedMirror)(nil) + +// NewPercentBasedMirror creates a Mirror. +func NewPercentBasedMirror(percentage float32, primitive Primitive, target Primitive) Primitive { + return &percentBasedMirror{percent: percentage, primitive: primitive, target: target} +} + +func (m *percentBasedMirror) RouteType() string { + return "Mirror" +} + +func (m *percentBasedMirror) GetKeyspaceName() string { + return m.primitive.GetKeyspaceName() +} + +func (m *percentBasedMirror) GetTableName() string { + return m.primitive.GetTableName() +} + +func (m *percentBasedMirror) GetFields(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + return m.primitive.GetFields(ctx, vcursor, bindVars) +} + +func (m *percentBasedMirror) NeedsTransaction() bool { + return m.primitive.NeedsTransaction() +} + +func (m *percentBasedMirror) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + if !m.percentAtLeastDieRoll() { + return vcursor.ExecutePrimitive(ctx, m.primitive, bindVars, wantfields) + } + + mirrorCh := make(chan mirrorResult, 1) + mirrorCtx, mirrorCtxCancel := context.WithCancel(ctx) + defer mirrorCtxCancel() + + go func() { + mirrorVCursor := vcursor.CloneForMirroring(mirrorCtx) + targetStartTime := time.Now() + _, targetErr := mirrorVCursor.ExecutePrimitive(mirrorCtx, m.target, bindVars, wantfields) + mirrorCh <- mirrorResult{ + execTime: time.Since(targetStartTime), + err: targetErr, + } + }() + + var ( + sourceExecTime, targetExecTime time.Duration + targetErr error + ) + + sourceStartTime := time.Now() + r, err := vcursor.ExecutePrimitive(ctx, m.primitive, bindVars, wantfields) + sourceExecTime = time.Since(sourceStartTime) + + // Cancel the mirror context if it continues executing too long. + select { + case r := <-mirrorCh: + // Mirror target finished on time. + targetExecTime = r.execTime + targetErr = r.err + case <-time.After(maxMirrorTargetLag): + // Mirror target took too long. + mirrorCtxCancel() + targetExecTime = sourceExecTime + maxMirrorTargetLag + targetErr = errMirrorTargetQueryTookTooLong + } + + vcursor.RecordMirrorStats(sourceExecTime, targetExecTime, targetErr) + + return r, err +} + +func (m *percentBasedMirror) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { + if !m.percentAtLeastDieRoll() { + return vcursor.StreamExecutePrimitive(ctx, m.primitive, bindVars, wantfields, callback) + } + + mirrorCh := make(chan mirrorResult, 1) + mirrorCtx, mirrorCtxCancel := context.WithCancel(ctx) + defer mirrorCtxCancel() + + go func() { + mirrorVCursor := vcursor.CloneForMirroring(mirrorCtx) + mirrorStartTime := time.Now() + targetErr := mirrorVCursor.StreamExecutePrimitive(mirrorCtx, m.target, bindVars, wantfields, func(_ *sqltypes.Result) error { + return nil + }) + mirrorCh <- mirrorResult{ + execTime: time.Since(mirrorStartTime), + err: targetErr, + } + }() + + var ( + sourceExecTime, targetExecTime time.Duration + targetErr error + ) + + sourceStartTime := time.Now() + err := vcursor.StreamExecutePrimitive(ctx, m.primitive, bindVars, wantfields, callback) + sourceExecTime = time.Since(sourceStartTime) + + // Cancel the mirror context if it continues executing too long. + select { + case r := <-mirrorCh: + // Mirror target finished on time. + targetExecTime = r.execTime + targetErr = r.err + case <-time.After(maxMirrorTargetLag): + // Mirror target took too long. + mirrorCtxCancel() + targetExecTime = sourceExecTime + maxMirrorTargetLag + targetErr = errMirrorTargetQueryTookTooLong + } + + vcursor.RecordMirrorStats(sourceExecTime, targetExecTime, targetErr) + + return err +} + +// Inputs is a slice containing the inputs to this Primitive. +// The returned map has additional information about the inputs, that is used in the description. +func (m *percentBasedMirror) Inputs() ([]Primitive, []map[string]any) { + return []Primitive{m.primitive, m.target}, nil +} + +// description is the description, sans the inputs, of this Primitive. +// to get the plan description with all children, use PrimitiveToPlanDescription() +func (m *percentBasedMirror) description() PrimitiveDescription { + return PrimitiveDescription{ + OperatorType: "Mirror", + Variant: "PercentBased", + Other: map[string]any{ + "Percent": m.percent, + }, + } +} + +func (m *percentBasedMirror) percentAtLeastDieRoll() bool { + return m.percent >= (rand.Float32() * 100.0) +} diff --git a/go/vt/vtgate/engine/mirror_test.go b/go/vt/vtgate/engine/mirror_test.go new file mode 100644 index 00000000000..753b1a26429 --- /dev/null +++ b/go/vt/vtgate/engine/mirror_test.go @@ -0,0 +1,549 @@ +/* +Copyright 2024 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 engine + +import ( + "context" + "fmt" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/srvtopo" + "vitess.io/vitess/go/vt/vtgate/evalengine" + "vitess.io/vitess/go/vt/vtgate/vindexes" +) + +func TestMirror(t *testing.T) { + vindex, _ := vindexes.CreateVindex("xxhash", "xxhash_vdx", nil) + + primitive := NewRoute( + Unsharded, + &vindexes.Keyspace{ + Name: "ks1", + }, + "select f.bar from foo f where f.id = 1", + "select 1 from foo f where f.id = 1 and 1 != 1", + ) + + mirrorPrimitive1 := NewRoute( + EqualUnique, + &vindexes.Keyspace{ + Name: "ks2", + Sharded: true, + }, + "select f.bar from foo f where f.id = 1", + "select 1 from foo f where f.id = 1 and 1 != 1", + ) + mirrorPrimitive1.Vindex = vindex.(vindexes.SingleColumn) + mirrorPrimitive1.Values = []evalengine.Expr{ + evalengine.NewLiteralInt(1), + } + + mirror := NewPercentBasedMirror(100, primitive, mirrorPrimitive1) + + mirrorVC := &loggingVCursor{ + shards: []string{"-20", "20-"}, + ksShardMap: map[string][]string{ + "ks2": {"-20", "20-"}, + }, + results: []*sqltypes.Result{ + sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "bar", + "varchar", + ), + "hello", + ), + }, + } + + sourceExecTime := atomic.Pointer[time.Duration]{} + targetExecTime := atomic.Pointer[time.Duration]{} + targetErr := atomic.Pointer[error]{} + + vc := &loggingVCursor{ + shards: []string{"0"}, + ksShardMap: map[string][]string{ + "ks1": {"0"}, + }, + results: []*sqltypes.Result{ + sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "bar", + "varchar", + ), + "hello", + ), + }, + onMirrorClonesFn: func(ctx context.Context) VCursor { + return mirrorVC + }, + onRecordMirrorStatsFn: func(sourceTime time.Duration, targetTime time.Duration, err error) { + sourceExecTime.Store(&sourceTime) + targetExecTime.Store(&targetTime) + targetErr.Store(&err) + }, + } + + t.Run("TryExecute success", func(t *testing.T) { + defer func() { + vc.Rewind() + mirrorVC.Rewind() + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + want := vc.results[0] + res, err := mirror.TryExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, true) + require.Equal(t, want, res) + require.NoError(t, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "ExecuteMultiShard ks1.0: select f.bar from foo f where f.id = 1 {} false false", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "ExecuteMultiShard ks2.-20: select f.bar from foo f where f.id = 1 {} false false", + }) + require.NotNil(t, targetExecTime.Load()) + require.Nil(t, *targetErr.Load()) + }) + + t.Run("TryExecute return primitive error", func(t *testing.T) { + results := vc.results + + defer func() { + vc.Rewind() + vc.results = results + vc.resultErr = nil + mirrorVC.Rewind() + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + vc.results = nil + vc.resultErr = fmt.Errorf("return me") + + ctx := context.Background() + res, err := mirror.TryExecute(ctx, vc, map[string]*querypb.BindVariable{}, true) + require.Nil(t, res) + require.Error(t, err) + require.Equal(t, vc.resultErr, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "ExecuteMultiShard ks1.0: select f.bar from foo f where f.id = 1 {} false false", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "ExecuteMultiShard ks2.-20: select f.bar from foo f where f.id = 1 {} false false", + }) + require.NotNil(t, targetExecTime.Load()) + require.Nil(t, *targetErr.Load()) + }) + + t.Run("TryExecute ignore mirror target error", func(t *testing.T) { + results := mirrorVC.results + + defer func() { + vc.Rewind() + mirrorVC.Rewind() + mirrorVC.results = results + mirrorVC.resultErr = nil + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + mirrorVC.results = nil + mirrorVC.resultErr = fmt.Errorf("ignore me") + + want := vc.results[0] + res, err := mirror.TryExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, true) + require.Equal(t, res, want) + require.NoError(t, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "ExecuteMultiShard ks1.0: select f.bar from foo f where f.id = 1 {} false false", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "ExecuteMultiShard ks2.-20: select f.bar from foo f where f.id = 1 {} false false", + }) + + require.NotNil(t, targetExecTime.Load()) + mirrorErr := targetErr.Load() + require.ErrorContains(t, *mirrorErr, "ignore me") + }) + + t.Run("TryExecute fast mirror target", func(t *testing.T) { + defer func() { + vc.Rewind() + vc.onExecuteMultiShardFn = nil + mirrorVC.Rewind() + mirrorVC.onExecuteMultiShardFn = nil + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + primitiveLatency := 10 * time.Millisecond + vc.onExecuteMultiShardFn = func(ctx context.Context, _ Primitive, _ []*srvtopo.ResolvedShard, _ []*querypb.BoundQuery, _ bool, _ bool) { + time.Sleep(primitiveLatency) + select { + case <-ctx.Done(): + require.Fail(t, "primitive context done") + default: + } + } + + var wg sync.WaitGroup + defer wg.Wait() + mirrorVC.onExecuteMultiShardFn = func(ctx context.Context, _ Primitive, _ []*srvtopo.ResolvedShard, _ []*querypb.BoundQuery, _ bool, _ bool) { + wg.Add(1) + defer wg.Done() + time.Sleep(primitiveLatency / 2) + select { + case <-ctx.Done(): + require.Fail(t, "mirror target context done") + default: + } + } + + want := vc.results[0] + res, err := mirror.TryExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, true) + require.Equal(t, res, want) + require.NoError(t, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "ExecuteMultiShard ks1.0: select f.bar from foo f where f.id = 1 {} false false", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "ExecuteMultiShard ks2.-20: select f.bar from foo f where f.id = 1 {} false false", + }) + + wg.Wait() + + require.Greater(t, *sourceExecTime.Load(), *targetExecTime.Load()) + }) + + t.Run("TryExecute slow mirror target", func(t *testing.T) { + defer func() { + vc.Rewind() + vc.onExecuteMultiShardFn = nil + mirrorVC.Rewind() + mirrorVC.onExecuteMultiShardFn = nil + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + primitiveLatency := 10 * time.Millisecond + vc.onExecuteMultiShardFn = func(ctx context.Context, _ Primitive, _ []*srvtopo.ResolvedShard, _ []*querypb.BoundQuery, _ bool, _ bool) { + time.Sleep(primitiveLatency) + select { + case <-ctx.Done(): + require.Fail(t, "primitive context done") + default: + } + } + + var wg sync.WaitGroup + defer wg.Wait() + mirrorVC.onExecuteMultiShardFn = func(ctx context.Context, _ Primitive, _ []*srvtopo.ResolvedShard, _ []*querypb.BoundQuery, _ bool, _ bool) { + wg.Add(1) + defer wg.Done() + time.Sleep(primitiveLatency + maxMirrorTargetLag + (5 * time.Millisecond)) + select { + case <-ctx.Done(): + require.NotNil(t, ctx.Err()) + require.ErrorContains(t, ctx.Err(), "context canceled") + default: + require.Fail(t, "mirror target context not done") + } + } + + want := vc.results[0] + res, err := mirror.TryExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, true) + require.Equal(t, res, want) + require.NoError(t, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "ExecuteMultiShard ks1.0: select f.bar from foo f where f.id = 1 {} false false", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "ExecuteMultiShard ks2.-20: select f.bar from foo f where f.id = 1 {} false false", + }) + + wg.Wait() + + require.Greater(t, *targetExecTime.Load(), *sourceExecTime.Load()) + require.ErrorContains(t, *targetErr.Load(), "Mirror target query took too long") + }) + + t.Run("TryStreamExecute success", func(t *testing.T) { + defer func() { + vc.Rewind() + mirrorVC.Rewind() + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + want := vc.results[0] + err := mirror.TryStreamExecute( + context.Background(), + vc, + map[string]*querypb.BindVariable{}, + true, + func(result *sqltypes.Result) error { + require.Equal(t, want, result) + return nil + }, + ) + require.NoError(t, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks1.0: {} ", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks2.-20: {} ", + }) + + require.NotNil(t, targetExecTime.Load()) + require.Nil(t, *targetErr.Load()) + }) + + t.Run("TryStreamExecute return primitive error", func(t *testing.T) { + results := vc.results + + defer func() { + vc.Rewind() + vc.results = results + vc.resultErr = nil + mirrorVC.Rewind() + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + vc.results = nil + vc.resultErr = fmt.Errorf("return me") + + err := mirror.TryStreamExecute( + context.Background(), + vc, + map[string]*querypb.BindVariable{}, + true, + func(result *sqltypes.Result) error { + require.Nil(t, result) + return nil + }, + ) + require.Error(t, err) + require.Equal(t, vc.resultErr, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks1.0: {} ", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks2.-20: {} ", + }) + + require.NotNil(t, targetExecTime.Load()) + require.Nil(t, *targetErr.Load()) + }) + + t.Run("TryStreamExecute ignore mirror target error", func(t *testing.T) { + results := mirrorVC.results + + defer func() { + vc.Rewind() + mirrorVC.Rewind() + mirrorVC.results = results + mirrorVC.resultErr = nil + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + mirrorVC.results = nil + mirrorVC.resultErr = fmt.Errorf("ignore me") + + want := vc.results[0] + err := mirror.TryStreamExecute( + context.Background(), + vc, + map[string]*querypb.BindVariable{}, + true, + func(result *sqltypes.Result) error { + require.Equal(t, want, result) + return nil + }, + ) + require.NoError(t, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks1.0: {} ", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks2.-20: {} ", + }) + + require.NotNil(t, targetExecTime.Load()) + require.ErrorContains(t, *targetErr.Load(), "ignore me") + }) + + t.Run("TryStreamExecute fast mirror target", func(t *testing.T) { + defer func() { + vc.Rewind() + vc.onStreamExecuteMultiFn = nil + mirrorVC.Rewind() + mirrorVC.onStreamExecuteMultiFn = nil + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + primitiveLatency := 10 * time.Millisecond + vc.onStreamExecuteMultiFn = func(ctx context.Context, _ Primitive, _ string, _ []*srvtopo.ResolvedShard, _ []map[string]*querypb.BindVariable, _ bool, _ bool, _ func(*sqltypes.Result) error) { + time.Sleep(primitiveLatency) + select { + case <-ctx.Done(): + require.Fail(t, "primitive context done") + default: + } + } + + var wg sync.WaitGroup + defer wg.Wait() + mirrorVC.onStreamExecuteMultiFn = func(ctx context.Context, _ Primitive, _ string, _ []*srvtopo.ResolvedShard, _ []map[string]*querypb.BindVariable, _ bool, _ bool, _ func(*sqltypes.Result) error) { + wg.Add(1) + defer wg.Done() + time.Sleep(primitiveLatency / 2) + select { + case <-ctx.Done(): + require.Fail(t, "mirror target context done") + default: + } + } + + want := vc.results[0] + err := mirror.TryStreamExecute( + context.Background(), + vc, + map[string]*querypb.BindVariable{}, + true, + func(result *sqltypes.Result) error { + require.Equal(t, want, result) + return nil + }, + ) + require.NoError(t, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks1.0: {} ", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks2.-20: {} ", + }) + + require.Greater(t, *sourceExecTime.Load(), *targetExecTime.Load()) + }) + + t.Run("TryStreamExecute slow mirror target", func(t *testing.T) { + defer func() { + vc.Rewind() + vc.onStreamExecuteMultiFn = nil + mirrorVC.Rewind() + mirrorVC.onStreamExecuteMultiFn = nil + sourceExecTime.Store(nil) + targetExecTime.Store(nil) + targetErr.Store(nil) + }() + + primitiveLatency := 10 * time.Millisecond + vc.onStreamExecuteMultiFn = func(ctx context.Context, _ Primitive, _ string, _ []*srvtopo.ResolvedShard, _ []map[string]*querypb.BindVariable, _ bool, _ bool, _ func(*sqltypes.Result) error) { + time.Sleep(primitiveLatency) + select { + case <-ctx.Done(): + require.Fail(t, "primitive context done") + default: + } + } + + var wg sync.WaitGroup + defer wg.Wait() + mirrorVC.onStreamExecuteMultiFn = func(ctx context.Context, _ Primitive, _ string, _ []*srvtopo.ResolvedShard, _ []map[string]*querypb.BindVariable, _ bool, _ bool, _ func(*sqltypes.Result) error) { + wg.Add(1) + defer wg.Done() + time.Sleep(primitiveLatency + maxMirrorTargetLag + (5 * time.Millisecond)) + select { + case <-ctx.Done(): + default: + require.Fail(t, "mirror target context not done") + } + } + + want := vc.results[0] + err := mirror.TryStreamExecute( + context.Background(), + vc, + map[string]*querypb.BindVariable{}, + true, + func(result *sqltypes.Result) error { + require.Equal(t, want, result) + return nil + }, + ) + require.NoError(t, err) + + vc.ExpectLog(t, []string{ + "ResolveDestinations ks1 [] Destinations:DestinationAllShards()", + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks1.0: {} ", + }) + mirrorVC.ExpectLog(t, []string{ + `ResolveDestinations ks2 [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(d46405367612b4b7)`, + "StreamExecuteMulti select f.bar from foo f where f.id = 1 ks2.-20: {} ", + }) + + require.Greater(t, *targetExecTime.Load(), *sourceExecTime.Load()) + require.ErrorContains(t, *targetErr.Load(), "Mirror target query took too long") + }) +} diff --git a/go/vt/vtgate/engine/ordered_aggregate.go b/go/vt/vtgate/engine/ordered_aggregate.go index b67483216cf..324e531c4dd 100644 --- a/go/vt/vtgate/engine/ordered_aggregate.go +++ b/go/vt/vtgate/engine/ordered_aggregate.go @@ -47,7 +47,7 @@ type OrderedAggregate struct { // TruncateColumnCount specifies the number of columns to return // in the final result. Rest of the columns are truncated // from the result received. If 0, no truncation happens. - TruncateColumnCount int `json:",omitempty"` + TruncateColumnCount int // Input is the primitive that will feed into this Primitive. Input Primitive diff --git a/go/vt/vtgate/engine/plan.go b/go/vt/vtgate/engine/plan.go index 769c69aaa06..9ea9f07655c 100644 --- a/go/vt/vtgate/engine/plan.go +++ b/go/vt/vtgate/engine/plan.go @@ -72,7 +72,7 @@ func (p *Plan) Stats() (execCount uint64, execTime time.Duration, shardQueries, func (p *Plan) MarshalJSON() ([]byte, error) { var instructions *PrimitiveDescription if p.Instructions != nil { - description := PrimitiveToPlanDescription(p.Instructions) + description := PrimitiveToPlanDescription(p.Instructions, nil) instructions = &description } diff --git a/go/vt/vtgate/engine/plan_description.go b/go/vt/vtgate/engine/plan_description.go index a8daa25ecd0..dfcad4e5e6b 100644 --- a/go/vt/vtgate/engine/plan_description.go +++ b/go/vt/vtgate/engine/plan_description.go @@ -47,6 +47,9 @@ type PrimitiveDescription struct { InputName string Inputs []PrimitiveDescription + + RowsReceived RowsReceived + ShardsQueried *ShardsQueried } // MarshalJSON serializes the PlanDescription into a JSON representation. @@ -90,6 +93,23 @@ func (pd PrimitiveDescription) MarshalJSON() ([]byte, error) { return nil, err } } + if len(pd.RowsReceived) > 0 { + if err := marshalAdd(prepend, buf, "NoOfCalls", len(pd.RowsReceived)); err != nil { + return nil, err + } + + if err := marshalAdd(prepend, buf, "AvgNumberOfRows", average(pd.RowsReceived)); err != nil { + return nil, err + } + if err := marshalAdd(prepend, buf, "MedianNumberOfRows", median(pd.RowsReceived)); err != nil { + return nil, err + } + } + if pd.ShardsQueried != nil { + if err := marshalAdd(prepend, buf, "ShardsQueried", pd.ShardsQueried); err != nil { + return nil, err + } + } err := addMap(pd.Other, buf) if err != nil { return nil, err @@ -106,6 +126,28 @@ func (pd PrimitiveDescription) MarshalJSON() ([]byte, error) { return buf.Bytes(), nil } +func average(nums []int) float64 { + total := 0 + for _, num := range nums { + total += num + } + return float64(total) / float64(len(nums)) +} + +func median(nums []int) float64 { + sortedNums := make([]int, len(nums)) + copy(sortedNums, nums) + sort.Ints(sortedNums) + + n := len(sortedNums) + if n%2 == 0 { + mid1 := sortedNums[n/2-1] + mid2 := sortedNums[n/2] + return float64(mid1+mid2) / 2.0 + } + return float64(sortedNums[n/2]) +} + func (pd PrimitiveDescription) addToGraph(g *graphviz.Graph) (*graphviz.Node, error) { var nodes []*graphviz.Node for _, input := range pd.Inputs { @@ -146,7 +188,7 @@ func (pd PrimitiveDescription) addToGraph(g *graphviz.Graph) (*graphviz.Node, er func GraphViz(p Primitive) (*graphviz.Graph, error) { g := graphviz.New() - description := PrimitiveToPlanDescription(p) + description := PrimitiveToPlanDescription(p, nil) _, err := description.addToGraph(g) if err != nil { return nil, err @@ -182,12 +224,22 @@ func marshalAdd(prepend string, buf *bytes.Buffer, name string, obj any) error { } // PrimitiveToPlanDescription transforms a primitive tree into a corresponding PlanDescription tree -func PrimitiveToPlanDescription(in Primitive) PrimitiveDescription { +// If stats is not nil, it will be used to populate the stats field of the PlanDescription +func PrimitiveToPlanDescription(in Primitive, stats *Stats) PrimitiveDescription { this := in.description() + if stats != nil { + this.RowsReceived = stats.InterOpStats[in] + + // Only applies to Route primitive + v, ok := stats.ShardsStats[in] + if ok { + this.ShardsQueried = &v + } + } inputs, infos := in.Inputs() for idx, input := range inputs { - pd := PrimitiveToPlanDescription(input) + pd := PrimitiveToPlanDescription(input, stats) if infos != nil { for k, v := range infos[idx] { if k == inputName { diff --git a/go/vt/vtgate/engine/plan_description_test.go b/go/vt/vtgate/engine/plan_description_test.go index dfed7d7f675..9f20e37976a 100644 --- a/go/vt/vtgate/engine/plan_description_test.go +++ b/go/vt/vtgate/engine/plan_description_test.go @@ -31,7 +31,7 @@ import ( func TestCreateRoutePlanDescription(t *testing.T) { route := createRoute() - planDescription := PrimitiveToPlanDescription(route) + planDescription := PrimitiveToPlanDescription(route, nil) expected := PrimitiveDescription{ OperatorType: "Route", @@ -76,7 +76,7 @@ func TestPlanDescriptionWithInputs(t *testing.T) { Input: route, } - planDescription := PrimitiveToPlanDescription(limit) + planDescription := PrimitiveToPlanDescription(limit, nil) expected := PrimitiveDescription{ OperatorType: "Limit", diff --git a/go/vt/vtgate/engine/primitive.go b/go/vt/vtgate/engine/primitive.go index 1c0e7de7a19..4f3a388d04f 100644 --- a/go/vt/vtgate/engine/primitive.go +++ b/go/vt/vtgate/engine/primitive.go @@ -131,6 +131,22 @@ type ( // CloneForReplicaWarming clones the VCursor for re-use in warming queries to replicas CloneForReplicaWarming(ctx context.Context) VCursor + + // CloneForMirroring clones the VCursor for re-use in mirroring queries to other keyspaces + CloneForMirroring(ctx context.Context) VCursor + // + // ReadTransaction reads the state of the given transaction from the metadata manager + ReadTransaction(ctx context.Context, transactionID string) (*querypb.TransactionMetadata, error) + + // UnresolvedTransactions reads the state of all the unresolved atomic transactions in the given keyspace. + UnresolvedTransactions(ctx context.Context, keyspace string) ([]*querypb.TransactionMetadata, error) + + // StartPrimitiveTrace starts a trace for the given primitive, + // and returns a function to get the trace logs after the primitive execution. + StartPrimitiveTrace() func() Stats + + // RecordMirrorStats is used to record stats about a mirror query. + RecordMirrorStats(time.Duration, time.Duration, error) } // SessionActions gives primitives ability to interact with the session state @@ -164,6 +180,7 @@ type ( SetConsolidator(querypb.ExecuteOptions_Consolidator) SetWorkloadName(string) SetPriority(string) + SetExecQueryTimeout(timeout *int) SetFoundRows(uint64) SetDDLStrategy(string) @@ -206,9 +223,6 @@ type ( // This is used to select the right shard session to perform the vindex lookup query. SetCommitOrder(co vtgatepb.CommitOrder) - // GetQueryTimeout gets the query timeout and takes in the query timeout from comments - GetQueryTimeout(queryTimeoutFromComment int) int - // SetQueryTimeout sets the query timeout SetQueryTimeout(queryTimeout int64) diff --git a/go/vt/vtgate/engine/recurse_cte.go b/go/vt/vtgate/engine/recurse_cte.go new file mode 100644 index 00000000000..f523883d280 --- /dev/null +++ b/go/vt/vtgate/engine/recurse_cte.go @@ -0,0 +1,155 @@ +/* +Copyright 2024 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 engine + +import ( + "context" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/vterrors" +) + +// RecurseCTE is used to represent recursive CTEs +// Seed is used to represent the non-recursive part that initializes the result set. +// It's result are then used to start the recursion on the Term side +// The values being sent to the Term side are stored in the Vars map - +// the key is the bindvar name and the value is the index of the column in the recursive result +type RecurseCTE struct { + Seed, Term Primitive + + Vars map[string]int +} + +var _ Primitive = (*RecurseCTE)(nil) + +func (r *RecurseCTE) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + res, err := vcursor.ExecutePrimitive(ctx, r.Seed, bindVars, wantfields) + if err != nil { + return nil, err + } + + // recurseRows contains the rows used in the next recursion + recurseRows := res.Rows + joinVars := make(map[string]*querypb.BindVariable) + loops := 0 + for len(recurseRows) > 0 { + // copy over the results from the previous recursion + theseRows := recurseRows + recurseRows = nil + for _, row := range theseRows { + for k, col := range r.Vars { + joinVars[k] = sqltypes.ValueBindVariable(row[col]) + } + // check if the context is done - we might be in a long running recursion + if err := ctx.Err(); err != nil { + return nil, err + } + rresult, err := vcursor.ExecutePrimitive(ctx, r.Term, combineVars(bindVars, joinVars), false) + if err != nil { + return nil, err + } + recurseRows = append(recurseRows, rresult.Rows...) + res.Rows = append(res.Rows, rresult.Rows...) + loops++ + if loops > 1000 { // TODO: This should be controlled with a system variable setting + return nil, vterrors.VT09030("") + } + } + } + return res, nil +} + +func (r *RecurseCTE) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { + if vcursor.Session().InTransaction() { + res, err := r.TryExecute(ctx, vcursor, bindVars, wantfields) + if err != nil { + return err + } + return callback(res) + } + return vcursor.StreamExecutePrimitive(ctx, r.Seed, bindVars, wantfields, func(result *sqltypes.Result) error { + err := callback(result) + if err != nil { + return err + } + return r.recurse(ctx, vcursor, bindVars, result, callback) + }) +} + +func (r *RecurseCTE) recurse(ctx context.Context, vcursor VCursor, bindvars map[string]*querypb.BindVariable, result *sqltypes.Result, callback func(*sqltypes.Result) error) error { + if len(result.Rows) == 0 { + return nil + } + joinVars := make(map[string]*querypb.BindVariable) + for _, row := range result.Rows { + for k, col := range r.Vars { + joinVars[k] = sqltypes.ValueBindVariable(row[col]) + } + + err := vcursor.StreamExecutePrimitive(ctx, r.Term, combineVars(bindvars, joinVars), false, func(result *sqltypes.Result) error { + err := callback(result) + if err != nil { + return err + } + return r.recurse(ctx, vcursor, bindvars, result, callback) + }) + if err != nil { + return err + } + } + return nil +} + +func (r *RecurseCTE) RouteType() string { + return "RecurseCTE" +} + +func (r *RecurseCTE) GetKeyspaceName() string { + if r.Seed.GetKeyspaceName() == r.Term.GetKeyspaceName() { + return r.Seed.GetKeyspaceName() + } + return r.Seed.GetKeyspaceName() + "_" + r.Term.GetKeyspaceName() +} + +func (r *RecurseCTE) GetTableName() string { + return r.Seed.GetTableName() +} + +func (r *RecurseCTE) GetFields(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + return r.Seed.GetFields(ctx, vcursor, bindVars) +} + +func (r *RecurseCTE) NeedsTransaction() bool { + return r.Seed.NeedsTransaction() || r.Term.NeedsTransaction() +} + +func (r *RecurseCTE) Inputs() ([]Primitive, []map[string]any) { + return []Primitive{r.Seed, r.Term}, nil +} + +func (r *RecurseCTE) description() PrimitiveDescription { + other := map[string]interface{}{ + "JoinVars": orderedStringIntMap(r.Vars), + } + + return PrimitiveDescription{ + OperatorType: "RecurseCTE", + Other: other, + Inputs: nil, + } +} diff --git a/go/vt/vtgate/engine/recurse_cte_test.go b/go/vt/vtgate/engine/recurse_cte_test.go new file mode 100644 index 00000000000..d6826284d21 --- /dev/null +++ b/go/vt/vtgate/engine/recurse_cte_test.go @@ -0,0 +1,129 @@ +/* +Copyright 2024 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 engine + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" +) + +func TestRecurseDualQuery(t *testing.T) { + // Test that the RecurseCTE primitive works as expected. + // The test is testing something like this: + // WITH RECURSIVE cte AS (SELECT 1 as col1 UNION SELECT col1+1 FROM cte WHERE col1 < 5) SELECT * FROM cte; + leftPrim := &fakePrimitive{ + results: []*sqltypes.Result{ + sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "col1", + "int64", + ), + "1", + ), + }, + } + rightFields := sqltypes.MakeTestFields( + "col4", + "int64", + ) + + rightPrim := &fakePrimitive{ + results: []*sqltypes.Result{ + sqltypes.MakeTestResult( + rightFields, + "2", + ), + sqltypes.MakeTestResult( + rightFields, + "3", + ), + sqltypes.MakeTestResult( + rightFields, + "4", + ), sqltypes.MakeTestResult( + rightFields, + ), + }, + } + bv := map[string]*querypb.BindVariable{} + + cte := &RecurseCTE{ + Seed: leftPrim, + Term: rightPrim, + Vars: map[string]int{"col1": 0}, + } + + r, err := cte.TryExecute(context.Background(), &noopVCursor{}, bv, true) + require.NoError(t, err) + + rightPrim.ExpectLog(t, []string{ + `Execute col1: type:INT64 value:"1" false`, + `Execute col1: type:INT64 value:"2" false`, + `Execute col1: type:INT64 value:"3" false`, + `Execute col1: type:INT64 value:"4" false`, + }) + + wantRes := sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "col1", + "int64", + ), + "1", + "2", + "3", + "4", + ) + expectResult(t, r, wantRes) + + // testing the streaming mode. + + leftPrim.rewind() + rightPrim.rewind() + + r, err = wrapStreamExecute(cte, &noopVCursor{}, bv, true) + require.NoError(t, err) + + rightPrim.ExpectLog(t, []string{ + `StreamExecute col1: type:INT64 value:"1" false`, + `StreamExecute col1: type:INT64 value:"2" false`, + `StreamExecute col1: type:INT64 value:"3" false`, + `StreamExecute col1: type:INT64 value:"4" false`, + }) + expectResult(t, r, wantRes) + + // testing the streaming mode with transaction + + leftPrim.rewind() + rightPrim.rewind() + + r, err = wrapStreamExecute(cte, &noopVCursor{inTx: true}, bv, true) + require.NoError(t, err) + + rightPrim.ExpectLog(t, []string{ + `Execute col1: type:INT64 value:"1" false`, + `Execute col1: type:INT64 value:"2" false`, + `Execute col1: type:INT64 value:"3" false`, + `Execute col1: type:INT64 value:"4" false`, + }) + expectResult(t, r, wantRes) + +} diff --git a/go/vt/vtgate/engine/route.go b/go/vt/vtgate/engine/route.go index f28dda01a52..59682dd91fe 100644 --- a/go/vt/vtgate/engine/route.go +++ b/go/vt/vtgate/engine/route.go @@ -130,22 +130,12 @@ func (route *Route) GetTableName() string { // TryExecute performs a non-streaming exec. func (route *Route) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { - ctx, cancelFunc := addQueryTimeout(ctx, vcursor, route.QueryTimeout) - defer cancelFunc() - qr, err := route.executeInternal(ctx, vcursor, bindVars, wantfields) + rss, bvs, err := route.findRoute(ctx, vcursor, bindVars) if err != nil { return nil, err } - return qr.Truncate(route.TruncateColumnCount), nil -} -// addQueryTimeout adds a query timeout to the context it receives and returns the modified context along with the cancel function. -func addQueryTimeout(ctx context.Context, vcursor VCursor, queryTimeout int) (context.Context, context.CancelFunc) { - timeout := vcursor.Session().GetQueryTimeout(queryTimeout) - if timeout != 0 { - return context.WithTimeout(ctx, time.Duration(timeout)*time.Millisecond) - } - return ctx, func() {} + return route.executeShards(ctx, vcursor, bindVars, wantfields, rss, bvs) } type cxtKey int @@ -154,20 +144,6 @@ const ( IgnoreReserveTxn cxtKey = iota ) -func (route *Route) executeInternal( - ctx context.Context, - vcursor VCursor, - bindVars map[string]*querypb.BindVariable, - wantfields bool, -) (*sqltypes.Result, error) { - rss, bvs, err := route.findRoute(ctx, vcursor, bindVars) - if err != nil { - return nil, err - } - - return route.executeShards(ctx, vcursor, bindVars, wantfields, rss, bvs) -} - func (route *Route) executeShards( ctx context.Context, vcursor VCursor, @@ -223,11 +199,15 @@ func (route *Route) executeShards( } } - if len(route.OrderBy) == 0 { - return result, nil + if len(route.OrderBy) != 0 { + var err error + result, err = route.sort(result) + if err != nil { + return nil, err + } } - return route.sort(result) + return result.Truncate(route.TruncateColumnCount), nil } func filterOutNilErrors(errs []error) []error { @@ -384,10 +364,8 @@ func (route *Route) sort(in *sqltypes.Result) (*sqltypes.Result, error) { // the contents of any row. out := in.ShallowCopy() - if err := route.OrderBy.SortResult(out); err != nil { - return nil, err - } - return out.Truncate(route.TruncateColumnCount), nil + err := route.OrderBy.SortResult(out) + return out, err } func (route *Route) description() PrimitiveDescription { diff --git a/go/vt/vtgate/engine/scalar_aggregation.go b/go/vt/vtgate/engine/scalar_aggregation.go index 929536b9cdf..e33204f5c58 100644 --- a/go/vt/vtgate/engine/scalar_aggregation.go +++ b/go/vt/vtgate/engine/scalar_aggregation.go @@ -35,7 +35,7 @@ type ScalarAggregate struct { // TruncateColumnCount specifies the number of columns to return // in the final result. Rest of the columns are truncated // from the result received. If 0, no truncation happens. - TruncateColumnCount int `json:",omitempty"` + TruncateColumnCount int // Input is the primitive that will feed into this Primitive. Input Primitive diff --git a/go/vt/vtgate/engine/semi_join.go b/go/vt/vtgate/engine/semi_join.go index de8eeef5a32..f0dd0d09033 100644 --- a/go/vt/vtgate/engine/semi_join.go +++ b/go/vt/vtgate/engine/semi_join.go @@ -29,12 +29,12 @@ var _ Primitive = (*SemiJoin)(nil) type SemiJoin struct { // Left and Right are the LHS and RHS primitives // of the SemiJoin. They can be any primitive. - Left, Right Primitive `json:",omitempty"` + Left, Right Primitive // Vars defines the list of SemiJoinVars that need to // be built from the LHS result before invoking // the RHS subquery. - Vars map[string]int `json:",omitempty"` + Vars map[string]int } // TryExecute performs a non-streaming exec. diff --git a/go/vt/vtgate/engine/send.go b/go/vt/vtgate/engine/send.go index 31c9e9e0eb0..2ebec5c679e 100644 --- a/go/vt/vtgate/engine/send.go +++ b/go/vt/vtgate/engine/send.go @@ -47,6 +47,8 @@ type Send struct { // IsDML specifies how to deal with autocommit behaviour IsDML bool + IsDDL bool + // SingleShardOnly specifies that the query must be send to only single shard SingleShardOnly bool @@ -91,8 +93,9 @@ func (s *Send) GetTableName() string { // TryExecute implements Primitive interface func (s *Send) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { - ctx, cancelFunc := addQueryTimeout(ctx, vcursor, s.QueryTimeout) - defer cancelFunc() + if err := s.commitIfDDL(ctx, vcursor); err != nil { + return nil, err + } rss, err := s.checkAndReturnShards(ctx, vcursor) if err != nil { @@ -158,6 +161,10 @@ func copyBindVars(in map[string]*querypb.BindVariable) map[string]*querypb.BindV // TryStreamExecute implements Primitive interface func (s *Send) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { + if err := s.commitIfDDL(ctx, vcursor); err != nil { + return err + } + rss, err := s.checkAndReturnShards(ctx, vcursor) if err != nil { return err @@ -204,3 +211,11 @@ func (s *Send) description() PrimitiveDescription { Other: other, } } + +// commitIfDDL commits any open transaction before executing the ddl query. +func (s *Send) commitIfDDL(ctx context.Context, vcursor VCursor) error { + if s.IsDDL { + return vcursor.Session().Commit(ctx) + } + return nil +} diff --git a/go/vt/vtgate/engine/transaction_status.go b/go/vt/vtgate/engine/transaction_status.go new file mode 100644 index 00000000000..9914031009f --- /dev/null +++ b/go/vt/vtgate/engine/transaction_status.go @@ -0,0 +1,134 @@ +/* +Copyright 2024 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 engine + +import ( + "context" + "fmt" + "strings" + "time" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" +) + +var _ Primitive = (*TransactionStatus)(nil) + +// TransactionStatus is a primitive to call into executor via vcursor. +type TransactionStatus struct { + noInputs + noTxNeeded + + Keyspace string + TransactionID string +} + +func (t *TransactionStatus) RouteType() string { + return "TransactionStatus" +} + +func (t *TransactionStatus) GetKeyspaceName() string { + return "" +} + +func (t *TransactionStatus) GetTableName() string { + return "" +} + +func (t *TransactionStatus) GetFields(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + return &sqltypes.Result{ + Fields: t.getFields(), + }, nil +} + +func (t *TransactionStatus) getFields() []*querypb.Field { + return []*querypb.Field{ + { + Name: "id", + Type: sqltypes.VarChar, + }, + { + Name: "state", + Type: sqltypes.VarChar, + }, + { + Name: "record_time", + Type: sqltypes.Datetime, + }, + { + Name: "participants", + Type: sqltypes.VarChar, + }, + } +} + +func (t *TransactionStatus) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { + var transactionStatuses []*querypb.TransactionMetadata + var err error + if t.TransactionID != "" { + var transactionState *querypb.TransactionMetadata + transactionState, err = vcursor.ReadTransaction(ctx, t.TransactionID) + transactionStatuses = append(transactionStatuses, transactionState) + } else { + transactionStatuses, err = vcursor.UnresolvedTransactions(ctx, t.Keyspace) + } + if err != nil { + return nil, err + } + + res := &sqltypes.Result{} + if wantfields { + res.Fields = t.getFields() + } + + for _, transactionState := range transactionStatuses { + if transactionState != nil && transactionState.Dtid != "" { + var participantString []string + for _, participant := range transactionState.Participants { + participantString = append(participantString, fmt.Sprintf("%s:%s", participant.Keyspace, participant.Shard)) + } + res.Rows = append(res.Rows, sqltypes.Row{ + sqltypes.NewVarChar(transactionState.Dtid), + sqltypes.NewVarChar(transactionState.State.String()), + sqltypes.NewDatetime(time.Unix(0, transactionState.TimeCreated).UTC().String()), + sqltypes.NewVarChar(strings.Join(participantString, ",")), + }) + } + } + return res, nil +} + +func (t *TransactionStatus) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { + res, err := t.TryExecute(ctx, vcursor, bindVars, wantfields) + if err != nil { + return err + } + return callback(res) +} + +func (t *TransactionStatus) description() PrimitiveDescription { + otherMap := map[string]any{} + if t.TransactionID == "" { + otherMap["Keyspace"] = t.Keyspace + } else { + otherMap["TransactionID"] = t.TransactionID + } + return PrimitiveDescription{ + OperatorType: "TransactionStatus", + Other: otherMap, + } +} diff --git a/go/vt/vtgate/engine/transaction_status_test.go b/go/vt/vtgate/engine/transaction_status_test.go new file mode 100644 index 00000000000..739a1d32cce --- /dev/null +++ b/go/vt/vtgate/engine/transaction_status_test.go @@ -0,0 +1,146 @@ +/* +Copyright 2024 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 engine + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" +) + +// TestTransactionStatusOutput tests the output and the fields of the transaction state query engine. +func TestTransactionStatusOutput(t *testing.T) { + tests := []struct { + name string + transactionStatusOutput []*querypb.TransactionMetadata + resultErr error + expectedRes *sqltypes.Result + primitive *TransactionStatus + }{ + { + name: "Empty Transaction Status", + transactionStatusOutput: nil, + expectedRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|state|record_time|participants", "varchar|varchar|datetime|varchar")), + primitive: &TransactionStatus{}, + }, { + name: "Valid Transaction Status for a transaction ID", + primitive: &TransactionStatus{ + TransactionID: "ks:-80:v24s7843sf78934l3", + }, + transactionStatusOutput: []*querypb.TransactionMetadata{ + { + Dtid: "ks:-80:v24s7843sf78934l3", + State: querypb.TransactionState_PREPARE, + TimeCreated: 1257894000000000000, + Participants: []*querypb.Target{ + { + Keyspace: "ks", + Shard: "-80", + TabletType: topodatapb.TabletType_PRIMARY, + }, { + Keyspace: "ks", + Shard: "80-a0", + TabletType: topodatapb.TabletType_PRIMARY, + }, { + Keyspace: "ks", + Shard: "a0-", + TabletType: topodatapb.TabletType_PRIMARY, + }, + }, + }, + }, + expectedRes: sqltypes.MakeTestResult( + sqltypes.MakeTestFields("id|state|record_time|participants", "varchar|varchar|datetime|varchar"), + "ks:-80:v24s7843sf78934l3|PREPARE|2009-11-10 23:00:00 +0000 UTC|ks:-80,ks:80-a0,ks:a0-"), + }, { + name: "Error getting transaction metadata", + primitive: &TransactionStatus{ + TransactionID: "ks:-80:v24s7843sf78934l3", + }, + resultErr: fmt.Errorf("failed reading transaction state"), + }, { + name: "Valid Transaction Statuses for a keyspace", + primitive: &TransactionStatus{ + Keyspace: "ks", + }, + transactionStatusOutput: []*querypb.TransactionMetadata{ + { + Dtid: "ks:-80:v24s7843sf78934l3", + State: querypb.TransactionState_PREPARE, + TimeCreated: 1257894000000000000, + Participants: []*querypb.Target{ + { + Keyspace: "ks", + Shard: "-80", + TabletType: topodatapb.TabletType_PRIMARY, + }, { + Keyspace: "ks", + Shard: "80-a0", + TabletType: topodatapb.TabletType_PRIMARY, + }, { + Keyspace: "ks", + Shard: "a0-", + TabletType: topodatapb.TabletType_PRIMARY, + }, + }, + }, + { + Dtid: "ks:-80:v34afdfdsfdfd", + State: querypb.TransactionState_PREPARE, + TimeCreated: 1259894000000000000, + Participants: []*querypb.Target{ + { + Keyspace: "ks", + Shard: "-80", + TabletType: topodatapb.TabletType_PRIMARY, + }, { + Keyspace: "ks", + Shard: "80-", + TabletType: topodatapb.TabletType_PRIMARY, + }, + }, + }, + }, + expectedRes: sqltypes.MakeTestResult( + sqltypes.MakeTestFields("id|state|record_time|participants", "varchar|varchar|datetime|varchar"), + "ks:-80:v24s7843sf78934l3|PREPARE|2009-11-10 23:00:00 +0000 UTC|ks:-80,ks:80-a0,ks:a0-", + "ks:-80:v34afdfdsfdfd|PREPARE|2009-12-04 02:33:20 +0000 UTC|ks:-80,ks:80-", + ), + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + res, err := test.primitive.TryExecute(context.Background(), &loggingVCursor{ + transactionStatusOutput: test.transactionStatusOutput, + resultErr: test.resultErr, + }, nil, true) + if test.resultErr != nil { + require.EqualError(t, err, test.resultErr.Error()) + return + } + require.NoError(t, err) + expectResult(t, res, test.expectedRes) + }) + } +} diff --git a/go/vt/vtgate/engine/update.go b/go/vt/vtgate/engine/update.go index 13c590bbb63..27ca9ad12a1 100644 --- a/go/vt/vtgate/engine/update.go +++ b/go/vt/vtgate/engine/update.go @@ -53,9 +53,6 @@ type Update struct { // TryExecute performs a non-streaming exec. func (upd *Update) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { - ctx, cancelFunc := addQueryTimeout(ctx, vcursor, upd.QueryTimeout) - defer cancelFunc() - rss, bvs, err := upd.findRoute(ctx, vcursor, bindVars) if err != nil { return nil, err diff --git a/go/vt/vtgate/engine/vexplain.go b/go/vt/vtgate/engine/vexplain.go index 010901021fa..78941e8160f 100644 --- a/go/vt/vtgate/engine/vexplain.go +++ b/go/vt/vtgate/engine/vexplain.go @@ -21,6 +21,7 @@ import ( "encoding/json" "fmt" + "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" @@ -42,6 +43,14 @@ type ( Input Primitive Type sqlparser.VExplainType } + + ShardsQueried int + RowsReceived []int + + Stats struct { + InterOpStats map[Primitive]RowsReceived + ShardsStats map[Primitive]ShardsQueried + } ) var _ Primitive = (*VExplain)(nil) @@ -62,8 +71,43 @@ func (v *VExplain) GetTableName() string { } // GetFields implements the Primitive interface -func (v *VExplain) GetFields(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable) (*sqltypes.Result, error) { - return v.Input.GetFields(ctx, vcursor, bindVars) +func (v *VExplain) GetFields(context.Context, VCursor, map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + var fields []*querypb.Field + switch v.Type { + case sqlparser.QueriesVExplainType: + fields = getVExplainQueriesFields() + case sqlparser.AllVExplainType: + fields = getVExplainAllFields() + case sqlparser.TraceVExplainType: + fields = getVExplainTraceFields() + default: + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Unknown type of VExplain plan") + } + return &sqltypes.Result{Fields: fields}, nil +} + +func getVExplainTraceFields() []*querypb.Field { + return []*querypb.Field{{ + Name: "Trace", + Type: sqltypes.VarChar, + Charset: uint32(collations.SystemCollation.Collation), + Flags: uint32(querypb.MySqlFlag_NOT_NULL_FLAG), + }} +} + +func getVExplainQueriesFields() []*querypb.Field { + return []*querypb.Field{ + {Name: "#", Type: sqltypes.Int32}, + {Name: "keyspace", Type: sqltypes.VarChar}, + {Name: "shard", Type: sqltypes.VarChar}, + {Name: "query", Type: sqltypes.VarChar}} + +} + +func getVExplainAllFields() []*querypb.Field { + return []*querypb.Field{{ + Name: "VExplain", Type: sqltypes.VarChar, + }} } // NeedsTransaction implements the Primitive interface @@ -73,42 +117,75 @@ func (v *VExplain) NeedsTransaction() bool { // TryExecute implements the Primitive interface func (v *VExplain) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { - vcursor.Session().VExplainLogging() + var stats func() Stats + if v.Type == sqlparser.TraceVExplainType { + stats = vcursor.StartPrimitiveTrace() + } else { + vcursor.Session().VExplainLogging() + } _, err := vcursor.ExecutePrimitive(ctx, v.Input, bindVars, wantfields) if err != nil { return nil, err } - return v.convertToResult(ctx, vcursor) + return v.convertToResult(ctx, vcursor, stats) +} + +func noOpCallback(*sqltypes.Result) error { + return nil } // TryStreamExecute implements the Primitive interface func (v *VExplain) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { - vcursor.Session().VExplainLogging() - err := vcursor.StreamExecutePrimitive(ctx, v.Input, bindVars, wantfields, func(result *sqltypes.Result) error { - return nil - }) + var stats func() Stats + if v.Type == sqlparser.TraceVExplainType { + stats = vcursor.StartPrimitiveTrace() + } else { + vcursor.Session().VExplainLogging() + } + + err := vcursor.StreamExecutePrimitive(ctx, v.Input, bindVars, wantfields, noOpCallback) if err != nil { return err } - result, err := v.convertToResult(ctx, vcursor) + result, err := v.convertToResult(ctx, vcursor, stats) if err != nil { return err } return callback(result) } -func (v *VExplain) convertToResult(ctx context.Context, vcursor VCursor) (*sqltypes.Result, error) { +func (v *VExplain) convertToResult(ctx context.Context, vcursor VCursor, stats func() Stats) (*sqltypes.Result, error) { switch v.Type { case sqlparser.QueriesVExplainType: result := convertToVExplainQueriesResult(vcursor.Session().GetVExplainLogs()) return result, nil case sqlparser.AllVExplainType: return v.convertToVExplainAllResult(ctx, vcursor) + case sqlparser.TraceVExplainType: + return v.getExplainTraceOutput(stats) + default: return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Unknown type of VExplain plan") } } +func (v *VExplain) getExplainTraceOutput(getOpStats func() Stats) (*sqltypes.Result, error) { + stats := getOpStats() + description := PrimitiveToPlanDescription(v.Input, &stats) + + output, err := json.MarshalIndent(description, "", "\t") + if err != nil { + return nil, err + } + + return &sqltypes.Result{ + Fields: getVExplainTraceFields(), + Rows: []sqltypes.Row{{ + sqltypes.NewVarChar(string(output)), + }}, + }, nil +} + func (v *VExplain) convertToVExplainAllResult(ctx context.Context, vcursor VCursor) (*sqltypes.Result, error) { logEntries := vcursor.Session().GetVExplainLogs() explainResults := make(map[Primitive]string) @@ -144,18 +221,14 @@ func (v *VExplain) convertToVExplainAllResult(ctx context.Context, vcursor VCurs } result := string(resultBytes) - fields := []*querypb.Field{ - { - Name: "VExplain", Type: sqltypes.VarChar, - }, - } + rows := []sqltypes.Row{ { sqltypes.NewVarChar(result), }, } qr := &sqltypes.Result{ - Fields: fields, + Fields: getVExplainAllFields(), Rows: rows, } return qr, nil @@ -193,17 +266,8 @@ func primitiveToPlanDescriptionWithSQLResults(in Primitive, res map[Primitive]st } func convertToVExplainQueriesResult(logs []ExecuteEntry) *sqltypes.Result { - fields := []*querypb.Field{{ - Name: "#", Type: sqltypes.Int32, - }, { - Name: "keyspace", Type: sqltypes.VarChar, - }, { - Name: "shard", Type: sqltypes.VarChar, - }, { - Name: "query", Type: sqltypes.VarChar, - }} qr := &sqltypes.Result{ - Fields: fields, + Fields: getVExplainQueriesFields(), } for _, line := range logs { qr.Rows = append(qr.Rows, sqltypes.Row{ diff --git a/go/vt/vtgate/engine/vindex_func.go b/go/vt/vtgate/engine/vindex_func.go index ecd83baeaad..13507631716 100644 --- a/go/vt/vtgate/engine/vindex_func.go +++ b/go/vt/vtgate/engine/vindex_func.go @@ -153,6 +153,9 @@ func (vf *VindexFunc) mapVindex(ctx context.Context, vcursor VCursor, bindVars m case key.DestinationKeyspaceID: if len(d) > 0 { if vcursor != nil { + if vcursor.GetKeyspace() == "" { + return nil, vterrors.VT09005() + } resolvedShards, _, err := vcursor.ResolveDestinations(ctx, vcursor.GetKeyspace(), nil, []key.Destination{d}) if err != nil { return nil, err diff --git a/go/vt/vtgate/engine/vindex_lookup.go b/go/vt/vtgate/engine/vindex_lookup.go index 8bf8755c40e..2e0e2857498 100644 --- a/go/vt/vtgate/engine/vindex_lookup.go +++ b/go/vt/vtgate/engine/vindex_lookup.go @@ -252,7 +252,7 @@ func (vr *VindexLookup) generateIds(ctx context.Context, vcursor VCursor, bindVa switch vr.Opcode { case Equal, EqualUnique: return []sqltypes.Value{value.Value(vcursor.ConnCollation())}, nil - case IN: + case IN, MultiEqual: return value.TupleValues(), nil } return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "opcode %s not supported for VindexLookup", vr.Opcode.String()) diff --git a/go/vt/vtgate/engine/vindex_lookup_test.go b/go/vt/vtgate/engine/vindex_lookup_test.go new file mode 100644 index 00000000000..d734bf12080 --- /dev/null +++ b/go/vt/vtgate/engine/vindex_lookup_test.go @@ -0,0 +1,135 @@ +/* +Copyright 2024 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 engine + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/vtgate/evalengine" + "vitess.io/vitess/go/vt/vtgate/vindexes" +) + +var ( + vindex, _ = vindexes.CreateVindex("lookup_unique", "", map[string]string{ + "table": "lkp", + "from": "from", + "to": "toc", + "write_only": "true", + }) + ks = &vindexes.Keyspace{Name: "ks", Sharded: true} +) + +func TestVindexLookup(t *testing.T) { + planableVindex, ok := vindex.(vindexes.LookupPlanable) + require.True(t, ok, "not a lookup vindex") + _, args := planableVindex.Query() + + fp := &fakePrimitive{ + results: []*sqltypes.Result{ + sqltypes.MakeTestResult( + sqltypes.MakeTestFields("id|keyspace_id", "int64|varbinary"), + "1|\x10"), + }, + } + route := NewRoute(ByDestination, ks, "dummy_select", "dummy_select_field") + vdxLookup := &VindexLookup{ + Opcode: EqualUnique, + Keyspace: ks, + Vindex: planableVindex, + Arguments: args, + Values: []evalengine.Expr{evalengine.NewLiteralInt(1)}, + Lookup: fp, + SendTo: route, + } + + vc := &loggingVCursor{results: []*sqltypes.Result{defaultSelectResult}} + + result, err := vdxLookup.TryExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, false) + require.NoError(t, err) + fp.ExpectLog(t, []string{`Execute from: type:TUPLE values:{type:INT64 value:"1"} false`}) + vc.ExpectLog(t, []string{ + `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(10)`, + `ExecuteMultiShard ks.-20: dummy_select {} false false`, + }) + expectResult(t, result, defaultSelectResult) + + fp.rewind() + vc.Rewind() + result, err = wrapStreamExecute(vdxLookup, vc, map[string]*querypb.BindVariable{}, false) + require.NoError(t, err) + vc.ExpectLog(t, []string{ + `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(10)`, + `StreamExecuteMulti dummy_select ks.-20: {} `, + }) + expectResult(t, result, defaultSelectResult) +} + +func TestVindexLookupTruncate(t *testing.T) { + planableVindex, ok := vindex.(vindexes.LookupPlanable) + require.True(t, ok, "not a lookup vindex") + _, args := planableVindex.Query() + + fp := &fakePrimitive{ + results: []*sqltypes.Result{ + sqltypes.MakeTestResult( + sqltypes.MakeTestFields("id|keyspace_id", "int64|varbinary"), + "1|\x10"), + }, + } + route := NewRoute(ByDestination, ks, "dummy_select", "dummy_select_field") + route.TruncateColumnCount = 1 + vdxLookup := &VindexLookup{ + Opcode: EqualUnique, + Keyspace: ks, + Vindex: planableVindex, + Arguments: args, + Values: []evalengine.Expr{evalengine.NewLiteralInt(1)}, + Lookup: fp, + SendTo: route, + } + + vc := &loggingVCursor{results: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("name|morecol", "varchar|int64"), + "foo|1", "bar|2", "baz|3"), + }} + + wantRes := sqltypes.MakeTestResult(sqltypes.MakeTestFields("name", "varchar"), + "foo", "bar", "baz") + result, err := vdxLookup.TryExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, false) + require.NoError(t, err) + fp.ExpectLog(t, []string{`Execute from: type:TUPLE values:{type:INT64 value:"1"} false`}) + vc.ExpectLog(t, []string{ + `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(10)`, + `ExecuteMultiShard ks.-20: dummy_select {} false false`, + }) + expectResult(t, result, wantRes) + + fp.rewind() + vc.Rewind() + result, err = wrapStreamExecute(vdxLookup, vc, map[string]*querypb.BindVariable{}, false) + require.NoError(t, err) + vc.ExpectLog(t, []string{ + `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(10)`, + `StreamExecuteMulti dummy_select ks.-20: {} `, + }) + expectResult(t, result, wantRes) +} diff --git a/go/vt/vtgate/evalengine/api_coerce.go b/go/vt/vtgate/evalengine/api_coerce.go index eef83c58422..f26ba5ea758 100644 --- a/go/vt/vtgate/evalengine/api_coerce.go +++ b/go/vt/vtgate/evalengine/api_coerce.go @@ -24,7 +24,7 @@ import ( ) func CoerceTo(value sqltypes.Value, typ Type, sqlmode SQLMode) (sqltypes.Value, error) { - cast, err := valueToEvalCast(value, value.Type(), collations.Unknown, typ.values, sqlmode) + cast, err := valueToEvalCast(value, value.Type(), typ.collation, typ.values, sqlmode) if err != nil { return sqltypes.Value{}, err } diff --git a/go/vt/vtgate/evalengine/cached_size.go b/go/vt/vtgate/evalengine/cached_size.go index 65f0bd37d12..c1ed1f9475c 100644 --- a/go/vt/vtgate/evalengine/cached_size.go +++ b/go/vt/vtgate/evalengine/cached_size.go @@ -1397,6 +1397,30 @@ func (cached *builtinPad) CachedSize(alloc bool) int64 { size += cached.CallExpr.CachedSize(false) return size } +func (cached *builtinPeriodAdd) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(48) + } + // field CallExpr vitess.io/vitess/go/vt/vtgate/evalengine.CallExpr + size += cached.CallExpr.CachedSize(false) + return size +} +func (cached *builtinPeriodDiff) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(48) + } + // field CallExpr vitess.io/vitess/go/vt/vtgate/evalengine.CallExpr + size += cached.CallExpr.CachedSize(false) + return size +} func (cached *builtinPi) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) @@ -2068,6 +2092,16 @@ func (cached *evalUint64) CachedSize(alloc bool) int64 { } return size } +func (cached *evalYear) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(16) + } + return size +} func (cached *typedExpr) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/vtgate/evalengine/compiler_asm.go b/go/vt/vtgate/evalengine/compiler_asm.go index 6c8896bb1f4..dfb1a30bffc 100644 --- a/go/vt/vtgate/evalengine/compiler_asm.go +++ b/go/vt/vtgate/evalengine/compiler_asm.go @@ -2670,15 +2670,22 @@ func (asm *assembler) Fn_MULTICMP_u(args int, lessThan bool) { }, "FN MULTICMP UINT64(SP-%d)...UINT64(SP-1)", args) } -func (asm *assembler) Fn_REPEAT() { +func (asm *assembler) Fn_REPEAT(base sqltypes.Type, fallback sqltypes.Type) { asm.adjustStack(-1) asm.emit(func(env *ExpressionEnv) int { str := env.vm.stack[env.vm.sp-2].(*evalBytes) repeat := env.vm.stack[env.vm.sp-1].(*evalInt64) + if len(str.bytes) == 0 { + str.bytes = nil + env.vm.sp-- + return 1 + } + negative := false if repeat.i < 0 { repeat.i = 0 + negative = true } if !validMaxLength(int64(len(str.bytes)), repeat.i) { @@ -2687,8 +2694,12 @@ func (asm *assembler) Fn_REPEAT() { return 1 } - str.tt = int16(sqltypes.VarChar) str.bytes = bytes.Repeat(str.bytes, int(repeat.i)) + if len(str.bytes) >= repeatTypeChangeLength || negative { + str.tt = int16(fallback) + } else { + str.tt = int16(base) + } env.vm.sp-- return 1 }, "FN REPEAT VARCHAR(SP-2) INT64(SP-1)") @@ -4238,15 +4249,26 @@ func (asm *assembler) Fn_WEEKOFYEAR() { }, "FN WEEKOFYEAR DATE(SP-1)") } -func (asm *assembler) Fn_YEAR() { - asm.emit(func(env *ExpressionEnv) int { - if env.vm.stack[env.vm.sp-1] == nil { +func (asm *assembler) Fn_YEAR(yearType bool) { + if yearType { + asm.emit(func(env *ExpressionEnv) int { + if env.vm.stack[env.vm.sp-1] == nil { + return 1 + } + arg := env.vm.stack[env.vm.sp-1].(*evalTemporal) + env.vm.stack[env.vm.sp-1] = newEvalYear(int64(arg.dt.Date.Year())) return 1 - } - arg := env.vm.stack[env.vm.sp-1].(*evalTemporal) - env.vm.stack[env.vm.sp-1] = env.vm.arena.newEvalInt64(int64(arg.dt.Date.Year())) - return 1 - }, "FN YEAR DATE(SP-1)") + }, "FN YEAR DATE(SP-1)") + } else { + asm.emit(func(env *ExpressionEnv) int { + if env.vm.stack[env.vm.sp-1] == nil { + return 1 + } + arg := env.vm.stack[env.vm.sp-1].(*evalTemporal) + env.vm.stack[env.vm.sp-1] = env.vm.arena.newEvalInt64(int64(arg.dt.Date.Year())) + return 1 + }, "FN YEAR DATE(SP-1)") + } } func (asm *assembler) Fn_YEARWEEK0() { @@ -4277,6 +4299,46 @@ func (asm *assembler) Fn_YEARWEEK() { }, "FN YEARWEEK DATE(SP-1)") } +func (asm *assembler) Fn_PERIOD_ADD() { + asm.adjustStack(-1) + asm.emit(func(env *ExpressionEnv) int { + if env.vm.stack[env.vm.sp-2] == nil { + env.vm.sp-- + return 1 + } + period := env.vm.stack[env.vm.sp-2].(*evalInt64).i + months := env.vm.stack[env.vm.sp-1].(*evalInt64).i + res, err := periodAdd(period, months) + if err != nil { + env.vm.err = err + return 0 + } + env.vm.stack[env.vm.sp-2] = res + env.vm.sp-- + return 1 + }, "FN PERIOD_ADD INT64(SP-2) INT64(SP-1)") +} + +func (asm *assembler) Fn_PERIOD_DIFF() { + asm.adjustStack(-1) + asm.emit(func(env *ExpressionEnv) int { + if env.vm.stack[env.vm.sp-2] == nil { + env.vm.sp-- + return 1 + } + period1 := env.vm.stack[env.vm.sp-2].(*evalInt64).i + period2 := env.vm.stack[env.vm.sp-1].(*evalInt64).i + res, err := periodDiff(period1, period2) + if err != nil { + env.vm.err = err + return 0 + } + env.vm.stack[env.vm.sp-2] = res + env.vm.sp-- + return 1 + }, "FN PERIOD_DIFF INT64(SP-2) INT64(SP-1)") +} + func (asm *assembler) Interval(l int) { asm.adjustStack(-l) asm.emit(func(env *ExpressionEnv) int { diff --git a/go/vt/vtgate/evalengine/compiler_asm_push.go b/go/vt/vtgate/evalengine/compiler_asm_push.go index 87d2ee9af9b..8f2b5d9f28b 100644 --- a/go/vt/vtgate/evalengine/compiler_asm_push.go +++ b/go/vt/vtgate/evalengine/compiler_asm_push.go @@ -97,6 +97,36 @@ func (asm *assembler) PushBVar_bin(key string) { }, "PUSH VARBINARY(:%q)", key) } +func push_vector(env *ExpressionEnv, raw []byte) int { + env.vm.stack[env.vm.sp] = newEvalVector(raw) + env.vm.sp++ + return 1 +} + +func (asm *assembler) PushColumn_vector(offset int) { + asm.adjustStack(1) + asm.emit(func(env *ExpressionEnv) int { + col := env.Row[offset] + if col.IsNull() { + return push_null(env) + } + return push_vector(env, col.Raw()) + }, "PUSH VECTOR(:%d)", offset) +} + +func (asm *assembler) PushBVar_vector(key string) { + asm.adjustStack(1) + + asm.emit(func(env *ExpressionEnv) int { + var bvar *querypb.BindVariable + bvar, env.vm.err = env.lookupBindVar(key) + if env.vm.err != nil { + return 0 + } + return push_vector(env, bvar.Value) + }, "PUSH VECTOR(:%q)", key) +} + func push_d(env *ExpressionEnv, raw []byte) int { var dec decimal.Decimal dec, env.vm.err = decimal.NewFromMySQL(raw) diff --git a/go/vt/vtgate/evalengine/compiler_test.go b/go/vt/vtgate/evalengine/compiler_test.go index 04eb72ad4f2..cb9b99e7776 100644 --- a/go/vt/vtgate/evalengine/compiler_test.go +++ b/go/vt/vtgate/evalengine/compiler_test.go @@ -24,6 +24,8 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" + "github.com/olekukonko/tablewriter" "github.com/stretchr/testify/require" @@ -94,7 +96,18 @@ func (s *Tracker) String() string { return s.buf.String() } +func TestOneCase(t *testing.T) { + query := `` + if query == "" { + t.Skip("no query to test") + } + venv := vtenv.NewTestEnv() + env := evalengine.EmptyExpressionEnv(venv) + testCompilerCase(t, query, venv, nil, env) +} + func TestCompilerReference(t *testing.T) { + // This test runs a lot of queries and compares the results of the evalengine in eval mode to the results of the compiler. now := time.Now() evalengine.SystemTime = func() time.Time { return now } defer func() { evalengine.SystemTime = time.Now }() @@ -108,52 +121,11 @@ func TestCompilerReference(t *testing.T) { tc.Run(func(query string, row []sqltypes.Value) { env.Row = row - - stmt, err := venv.Parser().ParseExpr(query) - if err != nil { - // no need to test un-parseable queries - return - } - - fields := evalengine.FieldResolver(tc.Schema) - cfg := &evalengine.Config{ - ResolveColumn: fields.Column, - ResolveType: fields.Type, - Collation: collations.CollationUtf8mb4ID, - Environment: venv, - NoConstantFolding: true, - } - - converted, err := evalengine.Translate(stmt, cfg) - if err != nil { - return - } - - expected, evalErr := env.EvaluateAST(converted) total++ - - res, vmErr := env.Evaluate(converted) - if vmErr != nil { - switch { - case evalErr == nil: - t.Errorf("failed evaluation from compiler:\nSQL: %s\nError: %s", query, vmErr) - case evalErr.Error() != vmErr.Error(): - t.Errorf("error mismatch:\nSQL: %s\nError eval: %s\nError comp: %s", query, evalErr, vmErr) - default: - supported++ - } - return + testCompilerCase(t, query, venv, tc.Schema, env) + if !t.Failed() { + supported++ } - - eval := expected.String() - comp := res.String() - - if eval != comp { - t.Errorf("bad evaluation from compiler:\nSQL: %s\nEval: %s\nComp: %s", query, eval, comp) - return - } - - supported++ }) track.Add(tc.Name(), supported, total) @@ -163,6 +135,51 @@ func TestCompilerReference(t *testing.T) { t.Logf("\n%s", track.String()) } +func testCompilerCase(t *testing.T, query string, venv *vtenv.Environment, schema []*querypb.Field, env *evalengine.ExpressionEnv) { + stmt, err := venv.Parser().ParseExpr(query) + if err != nil { + // no need to test un-parseable queries + return + } + + fields := evalengine.FieldResolver(schema) + cfg := &evalengine.Config{ + ResolveColumn: fields.Column, + ResolveType: fields.Type, + Collation: collations.CollationUtf8mb4ID, + Environment: venv, + NoConstantFolding: true, + } + + converted, err := evalengine.Translate(stmt, cfg) + if err != nil { + return + } + + var expected evalengine.EvalResult + var evalErr error + assert.NotPanics(t, func() { + expected, evalErr = env.EvaluateAST(converted) + }) + var res evalengine.EvalResult + var vmErr error + assert.NotPanics(t, func() { + res, vmErr = env.Evaluate(converted) + }) + switch { + case vmErr == nil && evalErr == nil: + eval := expected.String() + comp := res.String() + assert.Equalf(t, eval, comp, "bad evaluation from compiler:\nSQL: %s\nEval: %s\nComp: %s", query, eval, comp) + case vmErr == nil: + t.Errorf("failed evaluation from evalengine:\nSQL: %s\nError: %s", query, evalErr) + case evalErr == nil: + t.Errorf("failed evaluation from compiler:\nSQL: %s\nError: %s", query, vmErr) + case evalErr.Error() != vmErr.Error(): + t.Errorf("error mismatch:\nSQL: %s\nError eval: %s\nError comp: %s", query, evalErr, vmErr) + } +} + func TestCompilerSingle(t *testing.T) { var testCases = []struct { expression string diff --git a/go/vt/vtgate/evalengine/eval.go b/go/vt/vtgate/evalengine/eval.go index 49423979379..916c5e200f4 100644 --- a/go/vt/vtgate/evalengine/eval.go +++ b/go/vt/vtgate/evalengine/eval.go @@ -394,6 +394,8 @@ func valueToEval(value sqltypes.Value, collation collations.TypedCollation, valu return newEvalEnum(value.Raw(), values), nil case tt == sqltypes.Set: return newEvalSet(value.Raw(), values), nil + case tt == sqltypes.Vector: + return newEvalVector(value.Raw()), nil case sqltypes.IsText(tt): if tt == sqltypes.HexNum { raw, err := parseHexNumber(value.Raw()) diff --git a/go/vt/vtgate/evalengine/eval_bytes.go b/go/vt/vtgate/evalengine/eval_bytes.go index 027c4bb652d..971c0f3c4a6 100644 --- a/go/vt/vtgate/evalengine/eval_bytes.go +++ b/go/vt/vtgate/evalengine/eval_bytes.go @@ -61,6 +61,10 @@ func newEvalText(raw []byte, col collations.TypedCollation) *evalBytes { return newEvalRaw(sqltypes.VarChar, raw, col) } +func newEvalVector(raw []byte) *evalBytes { + return newEvalRaw(sqltypes.Vector, raw, collationBinary) +} + func evalToBinary(e eval) *evalBytes { if e, ok := e.(*evalBytes); ok && e.isBinary() && !e.isHexOrBitLiteral() { return e diff --git a/go/vt/vtgate/evalengine/eval_numeric.go b/go/vt/vtgate/evalengine/eval_numeric.go index 04f844566b1..3ccdfde68fa 100644 --- a/go/vt/vtgate/evalengine/eval_numeric.go +++ b/go/vt/vtgate/evalengine/eval_numeric.go @@ -58,6 +58,10 @@ type ( dec decimal.Decimal length int32 } + + evalYear struct { + evalInt64 + } ) var _ evalNumeric = (*evalInt64)(nil) @@ -102,6 +106,10 @@ func newEvalBool(b bool) *evalInt64 { return evalBoolFalse } +func newEvalYear(i int64) *evalYear { + return &evalYear{evalInt64{i: i}} +} + func evalToNumeric(e eval, preciseDatetime bool) evalNumeric { switch e := e.(type) { case evalNumeric: @@ -616,3 +624,7 @@ func (e *evalDecimal) toUint64() *evalUint64 { } return newEvalUint64(u) } + +func (e *evalYear) SQLType() sqltypes.Type { + return sqltypes.Year +} diff --git a/go/vt/vtgate/evalengine/expr.go b/go/vt/vtgate/evalengine/expr.go index 44026f97e69..b90390e1ba8 100644 --- a/go/vt/vtgate/evalengine/expr.go +++ b/go/vt/vtgate/evalengine/expr.go @@ -56,7 +56,7 @@ func (expr *BinaryExpr) arguments(env *ExpressionEnv) (eval, eval, error) { } right, err := expr.Right.eval(env) if err != nil { - return nil, nil, err + return left, nil, err } return left, right, nil } diff --git a/go/vt/vtgate/evalengine/expr_bvar.go b/go/vt/vtgate/evalengine/expr_bvar.go index daf64296e98..50f231dbe9c 100644 --- a/go/vt/vtgate/evalengine/expr_bvar.go +++ b/go/vt/vtgate/evalengine/expr_bvar.go @@ -160,6 +160,8 @@ func (bvar *BindVariable) compile(c *compiler) (ctype, error) { c.asm.PushBVar_date(bvar.Key) case tt == sqltypes.Time: c.asm.PushBVar_time(bvar.Key) + case tt == sqltypes.Vector: + c.asm.PushBVar_vector(bvar.Key) default: return ctype{}, vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "Type is not supported: %s", tt) } diff --git a/go/vt/vtgate/evalengine/expr_column.go b/go/vt/vtgate/evalengine/expr_column.go index d53585ceb8b..e52c522d973 100644 --- a/go/vt/vtgate/evalengine/expr_column.go +++ b/go/vt/vtgate/evalengine/expr_column.go @@ -151,6 +151,8 @@ func (column *Column) compile(c *compiler) (ctype, error) { c.asm.PushColumn_date(column.Offset) case tt == sqltypes.Time: c.asm.PushColumn_time(column.Offset) + case tt == sqltypes.Vector: + c.asm.PushColumn_vector(column.Offset) default: return ctype{}, vterrors.Errorf(vtrpc.Code_UNIMPLEMENTED, "Type is not supported: %s", tt) } diff --git a/go/vt/vtgate/evalengine/expr_compare.go b/go/vt/vtgate/evalengine/expr_compare.go index f3bd44588ee..6e6c888ecf6 100644 --- a/go/vt/vtgate/evalengine/expr_compare.go +++ b/go/vt/vtgate/evalengine/expr_compare.go @@ -275,7 +275,7 @@ func evalCompare(left, right eval, collationEnv *collations.Environment) (comp i // TODO: Clean this up as we add more properly supported types and comparisons. func fallbackBinary(t sqltypes.Type) bool { switch t { - case sqltypes.Bit, sqltypes.Enum, sqltypes.Set, sqltypes.Geometry: + case sqltypes.Bit, sqltypes.Enum, sqltypes.Set, sqltypes.Geometry, sqltypes.Vector: return true } return false @@ -592,13 +592,18 @@ func (l *LikeExpr) matchWildcard(left, right []byte, coll collations.ID) bool { } fullColl := colldata.Lookup(coll) wc := fullColl.Wildcard(right, 0, 0, 0) - return wc.Match(left) + return wc.Match(left) == !l.Negate } func (l *LikeExpr) eval(env *ExpressionEnv) (eval, error) { - left, right, err := l.arguments(env) - if left == nil || right == nil || err != nil { - return nil, err + left, err := l.Left.eval(env) + if err != nil || left == nil { + return left, err + } + + right, err := l.Right.eval(env) + if err != nil || right == nil { + return right, err } var col collations.TypedCollation @@ -607,18 +612,9 @@ func (l *LikeExpr) eval(env *ExpressionEnv) (eval, error) { return nil, err } - var matched bool - switch { - case typeIsTextual(left.SQLType()) && typeIsTextual(right.SQLType()): - matched = l.matchWildcard(left.(*evalBytes).bytes, right.(*evalBytes).bytes, col.Collation) - case typeIsTextual(right.SQLType()): - matched = l.matchWildcard(left.ToRawBytes(), right.(*evalBytes).bytes, col.Collation) - case typeIsTextual(left.SQLType()): - matched = l.matchWildcard(left.(*evalBytes).bytes, right.ToRawBytes(), col.Collation) - default: - matched = l.matchWildcard(left.ToRawBytes(), right.ToRawBytes(), collations.CollationBinaryID) - } - return newEvalBool(matched == !l.Negate), nil + matched := l.matchWildcard(left.ToRawBytes(), right.ToRawBytes(), col.Collation) + + return newEvalBool(matched), nil } func (expr *LikeExpr) compile(c *compiler) (ctype, error) { @@ -627,12 +623,14 @@ func (expr *LikeExpr) compile(c *compiler) (ctype, error) { return ctype{}, err } + skip1 := c.compileNullCheck1(lt) + rt, err := expr.Right.compile(c) if err != nil { return ctype{}, err } - skip := c.compileNullCheck2(lt, rt) + skip2 := c.compileNullCheck1(rt) if !lt.isTextual() { c.asm.Convert_xc(2, sqltypes.VarChar, c.collation, nil) @@ -684,6 +682,6 @@ func (expr *LikeExpr) compile(c *compiler) (ctype, error) { }) } - c.asm.jumpDestination(skip) + c.asm.jumpDestination(skip1, skip2) return ctype{Type: sqltypes.Int64, Col: collationNumeric, Flag: flagIsBoolean | flagNullable}, nil } diff --git a/go/vt/vtgate/evalengine/fn_regexp.go b/go/vt/vtgate/evalengine/fn_regexp.go index a94b9a83aee..10aa3f6b6c6 100644 --- a/go/vt/vtgate/evalengine/fn_regexp.go +++ b/go/vt/vtgate/evalengine/fn_regexp.go @@ -167,43 +167,43 @@ func compileRegex(pat eval, c colldata.Charset, flags icuregex.RegexpFlag) (*icu var compileErr *icuregex.CompileError if errors.Is(err, icuerrors.ErrUnsupported) { - err = vterrors.NewErrorf(vtrpcpb.Code_UNIMPLEMENTED, vterrors.RegexpUnimplemented, err.Error()) + err = vterrors.NewError(vtrpcpb.Code_UNIMPLEMENTED, vterrors.RegexpUnimplemented, err.Error()) } else if errors.Is(err, icuerrors.ErrIllegalArgument) { - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpIllegalArgument, err.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpIllegalArgument, err.Error()) } else if errors.As(err, &compileErr) { switch compileErr.Code { case icuregex.InternalError: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInternal, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInternal, compileErr.Error()) case icuregex.RuleSyntax: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpRuleSyntax, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpRuleSyntax, compileErr.Error()) case icuregex.BadEscapeSequence: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpBadEscapeSequence, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpBadEscapeSequence, compileErr.Error()) case icuregex.PropertySyntax: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpRuleSyntax, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpRuleSyntax, compileErr.Error()) case icuregex.Unimplemented: - err = vterrors.NewErrorf(vtrpcpb.Code_UNIMPLEMENTED, vterrors.RegexpUnimplemented, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_UNIMPLEMENTED, vterrors.RegexpUnimplemented, compileErr.Error()) case icuregex.MismatchedParen: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpMismatchParen, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpMismatchParen, compileErr.Error()) case icuregex.BadInterval: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpBadInterval, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpBadInterval, compileErr.Error()) case icuregex.MaxLtMin: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpMaxLtMin, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpMaxLtMin, compileErr.Error()) case icuregex.InvalidBackRef: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInvalidBackRef, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInvalidBackRef, compileErr.Error()) case icuregex.InvalidFlag: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInvalidFlag, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInvalidFlag, compileErr.Error()) case icuregex.LookBehindLimit: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpLookBehindLimit, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpLookBehindLimit, compileErr.Error()) case icuregex.MissingCloseBracket: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpMissingCloseBracket, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpMissingCloseBracket, compileErr.Error()) case icuregex.InvalidRange: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInvalidRange, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInvalidRange, compileErr.Error()) case icuregex.PatternTooBig: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpPatternTooBig, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpPatternTooBig, compileErr.Error()) case icuregex.InvalidCaptureGroupName: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInvalidCaptureGroup, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInvalidCaptureGroup, compileErr.Error()) default: - err = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInternal, compileErr.Error()) + err = vterrors.NewError(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.RegexpInternal, compileErr.Error()) } } diff --git a/go/vt/vtgate/evalengine/fn_string.go b/go/vt/vtgate/evalengine/fn_string.go index 663475327e5..1cca7a94c8d 100644 --- a/go/vt/vtgate/evalengine/fn_string.go +++ b/go/vt/vtgate/evalengine/fn_string.go @@ -20,6 +20,7 @@ import ( "bytes" "math" + "vitess.io/vitess/go/mysql/capabilities" "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/mysql/collations/charset" "vitess.io/vitess/go/mysql/collations/colldata" @@ -889,6 +890,23 @@ func (call *builtinOrd) compile(c *compiler) (ctype, error) { // error: `ERROR 2020 (HY000): Got packet bigger than 'max_allowed_packet' bytes` and the client gets disconnected. // - `> max_allowed_packet`, no error and returns `NULL`. const maxRepeatLength = 1073741824 +const repeatTypeChangeLength = 16384 + +// repeatType returns the type for the REPEAT result. +// MySQL 8.1.x and later has changed this to return TEXT instead of VARCHAR. +func repeatType(version string, base sqltypes.Type) sqltypes.Type { + capability, _ := capabilities.ServerVersionAtLeast(version, 8, 1, 0) + if capability { + if sqltypes.IsBinary(base) { + return sqltypes.Blob + } + return sqltypes.Text + } + if sqltypes.IsBinary(base) { + return sqltypes.VarBinary + } + return sqltypes.VarChar +} func (call *builtinRepeat) eval(env *ExpressionEnv) (eval, error) { arg1, arg2, err := call.arg2(env) @@ -900,22 +918,36 @@ func (call *builtinRepeat) eval(env *ExpressionEnv) (eval, error) { } text, ok := arg1.(*evalBytes) - if !ok { + tt := sqltypes.VarChar + if ok { + tt = text.SQLType() + } else { text, err = evalToVarchar(arg1, call.collate, true) if err != nil { return nil, err } } + if len(text.bytes) == 0 { + return newEvalText(nil, text.col), nil + } + repeat := evalToInt64(arg2).i + negative := false if repeat < 0 { repeat = 0 + negative = true } if !validMaxLength(int64(len(text.bytes)), repeat) { return nil, nil } - return newEvalText(bytes.Repeat(text.bytes, int(repeat)), text.col), nil + b := bytes.Repeat(text.bytes, int(repeat)) + if len(b) >= repeatTypeChangeLength || negative { + tt = repeatType(env.currentVersion(), tt) + } + + return newEvalRaw(tt, b, text.col), nil } func validMaxLength(len, repeat int64) bool { @@ -942,14 +974,16 @@ func (expr *builtinRepeat) compile(c *compiler) (ctype, error) { skip := c.compileNullCheck2(str, repeat) + tt := sqltypes.VarChar switch { case str.isTextual(): + tt = str.Type default: c.asm.Convert_xc(2, sqltypes.VarChar, c.collation, nil) } _ = c.compileToInt64(repeat, 1) - c.asm.Fn_REPEAT() + c.asm.Fn_REPEAT(tt, repeatType(c.env.MySQLVersion(), tt)) c.asm.jumpDestination(skip) return ctype{Type: sqltypes.VarChar, Col: str.Col, Flag: flagNullable}, nil } @@ -1651,24 +1685,17 @@ func (call *builtinLocate) compile(c *compiler) (ctype, error) { return ctype{}, err } + skip1 := c.compileNullCheck1(substr) str, err := call.Arguments[1].compile(c) if err != nil { return ctype{}, err } - skip1 := c.compileNullCheck2(substr, str) - var skip2 *jump - if len(call.Arguments) > 2 { - l, err := call.Arguments[2].compile(c) - if err != nil { - return ctype{}, err - } - skip2 = c.compileNullCheck2(str, l) - _ = c.compileToInt64(l, 1) - } + skip2 := c.compileNullCheck1(str) + var skip3 *jump if !str.isTextual() { - c.asm.Convert_xce(len(call.Arguments)-1, sqltypes.VarChar, c.collation) + c.asm.Convert_xce(1, sqltypes.VarChar, c.collation) str.Col = collations.TypedCollation{ Collation: c.collation, Coercibility: collations.CoerceCoercible, @@ -1679,7 +1706,7 @@ func (call *builtinLocate) compile(c *compiler) (ctype, error) { fromCharset := colldata.Lookup(substr.Col.Collation).Charset() toCharset := colldata.Lookup(str.Col.Collation).Charset() if !substr.isTextual() || (fromCharset != toCharset && !toCharset.IsSuperset(fromCharset)) { - c.asm.Convert_xce(len(call.Arguments), sqltypes.VarChar, str.Col.Collation) + c.asm.Convert_xce(2, sqltypes.VarChar, str.Col.Collation) substr.Col = collations.TypedCollation{ Collation: str.Col.Collation, Coercibility: collations.CoerceCoercible, @@ -1687,6 +1714,15 @@ func (call *builtinLocate) compile(c *compiler) (ctype, error) { } } + if len(call.Arguments) > 2 { + l, err := call.Arguments[2].compile(c) + if err != nil { + return ctype{}, err + } + skip3 = c.compileNullCheck1(l) + _ = c.compileToInt64(l, 1) + } + var coll colldata.Collation if typeIsTextual(substr.Type) && typeIsTextual(str.Type) { coll = colldata.Lookup(str.Col.Collation) @@ -1700,7 +1736,7 @@ func (call *builtinLocate) compile(c *compiler) (ctype, error) { c.asm.Locate2(coll) } - c.asm.jumpDestination(skip1, skip2) + c.asm.jumpDestination(skip1, skip2, skip3) return ctype{Type: sqltypes.Int64, Col: collationNumeric, Flag: flagNullable}, nil } diff --git a/go/vt/vtgate/evalengine/fn_time.go b/go/vt/vtgate/evalengine/fn_time.go index 5a253799b7f..2d5e12f518d 100644 --- a/go/vt/vtgate/evalengine/fn_time.go +++ b/go/vt/vtgate/evalengine/fn_time.go @@ -21,10 +21,14 @@ import ( "time" "vitess.io/vitess/go/hack" + "vitess.io/vitess/go/mysql/capabilities" "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/mysql/datetime" "vitess.io/vitess/go/mysql/decimal" "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/vt/vterrors" + + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) var SystemTime = time.Now @@ -173,6 +177,14 @@ type ( CallExpr } + builtinPeriodAdd struct { + CallExpr + } + + builtinPeriodDiff struct { + CallExpr + } + builtinDateMath struct { CallExpr sub bool @@ -213,6 +225,8 @@ var _ IR = (*builtinWeekDay)(nil) var _ IR = (*builtinWeekOfYear)(nil) var _ IR = (*builtinYear)(nil) var _ IR = (*builtinYearWeek)(nil) +var _ IR = (*builtinPeriodAdd)(nil) +var _ IR = (*builtinPeriodDiff)(nil) func (call *builtinNow) eval(env *ExpressionEnv) (eval, error) { now := env.time(call.utc) @@ -1859,6 +1873,11 @@ func (call *builtinWeekOfYear) compile(c *compiler) (ctype, error) { return ctype{Type: sqltypes.Int64, Col: collationNumeric, Flag: arg.Flag | flagNullable}, nil } +func yearType(version string) bool { + capability, _ := capabilities.ServerVersionAtLeast(version, 8, 1, 0) + return capability +} + func (b *builtinYear) eval(env *ExpressionEnv) (eval, error) { date, err := b.arg1(env) if err != nil { @@ -1872,6 +1891,9 @@ func (b *builtinYear) eval(env *ExpressionEnv) (eval, error) { return nil, nil } + if yearType(env.currentVersion()) { + return newEvalYear(int64(d.dt.Date.Year())), nil + } return newEvalInt64(int64(d.dt.Date.Year())), nil } @@ -1889,7 +1911,7 @@ func (call *builtinYear) compile(c *compiler) (ctype, error) { c.asm.Convert_xD(1, true) } - c.asm.Fn_YEAR() + c.asm.Fn_YEAR(yearType(c.env.MySQLVersion())) c.asm.jumpDestination(skip) return ctype{Type: sqltypes.Int64, Col: collationNumeric, Flag: arg.Flag | flagNullable}, nil } @@ -1955,6 +1977,105 @@ func (call *builtinYearWeek) compile(c *compiler) (ctype, error) { return ctype{Type: sqltypes.Int64, Col: collationNumeric, Flag: arg.Flag | flagNullable}, nil } +func periodAdd(period, months int64) (*evalInt64, error) { + if !datetime.ValidatePeriod(period) { + return nil, vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.WrongArguments, "Incorrect arguments to period_add") + } + return newEvalInt64(datetime.MonthsToPeriod(datetime.PeriodToMonths(period) + months)), nil +} + +func (b *builtinPeriodAdd) eval(env *ExpressionEnv) (eval, error) { + p, m, err := b.arg2(env) + if err != nil { + return nil, err + } + if p == nil || m == nil { + return nil, nil + } + period := evalToInt64(p) + months := evalToInt64(m) + return periodAdd(period.i, months.i) +} + +func (call *builtinPeriodAdd) compile(c *compiler) (ctype, error) { + period, err := call.Arguments[0].compile(c) + if err != nil { + return ctype{}, err + } + months, err := call.Arguments[1].compile(c) + if err != nil { + return ctype{}, err + } + + skip := c.compileNullCheck2(period, months) + + switch period.Type { + case sqltypes.Int64: + default: + c.asm.Convert_xi(2) + } + + switch months.Type { + case sqltypes.Int64: + default: + c.asm.Convert_xi(1) + } + + c.asm.Fn_PERIOD_ADD() + c.asm.jumpDestination(skip) + return ctype{Type: sqltypes.Int64, Flag: period.Flag | months.Flag | flagNullable}, nil +} + +func periodDiff(period1, period2 int64) (*evalInt64, error) { + if !datetime.ValidatePeriod(period1) || !datetime.ValidatePeriod(period2) { + return nil, vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.WrongArguments, "Incorrect arguments to period_diff") + } + res := datetime.PeriodToMonths(period1) - datetime.PeriodToMonths(period2) + return newEvalInt64(res), nil +} + +func (b *builtinPeriodDiff) eval(env *ExpressionEnv) (eval, error) { + p1, p2, err := b.arg2(env) + if err != nil { + return nil, err + } + if p1 == nil || p2 == nil { + return nil, nil + } + period1 := evalToInt64(p1) + period2 := evalToInt64(p2) + return periodDiff(period1.i, period2.i) +} + +func (call *builtinPeriodDiff) compile(c *compiler) (ctype, error) { + period1, err := call.Arguments[0].compile(c) + if err != nil { + return ctype{}, err + } + period2, err := call.Arguments[1].compile(c) + if err != nil { + return ctype{}, err + } + + skip := c.compileNullCheck2(period1, period2) + + switch period1.Type { + case sqltypes.Int64: + default: + c.asm.Convert_xi(2) + } + + switch period2.Type { + case sqltypes.Int64: + default: + c.asm.Convert_xi(1) + } + + c.asm.Fn_PERIOD_DIFF() + c.asm.jumpDestination(skip) + return ctype{Type: sqltypes.Int64, Flag: period1.Flag | period2.Flag | flagNullable}, nil +} + func evalToInterval(itv eval, unit datetime.IntervalType, negate bool) *datetime.Interval { switch itv := itv.(type) { case *evalBytes: diff --git a/go/vt/vtgate/evalengine/integration/fuzz_test.go b/go/vt/vtgate/evalengine/integration/fuzz_test.go index 17a721edde9..7372d6fd731 100644 --- a/go/vt/vtgate/evalengine/integration/fuzz_test.go +++ b/go/vt/vtgate/evalengine/integration/fuzz_test.go @@ -20,6 +20,7 @@ package integration import ( "encoding/json" + "errors" "fmt" "math/rand/v2" "os" @@ -205,11 +206,11 @@ func TestGenerateFuzzCases(t *testing.T) { remote, remoteErr := conn.ExecuteFetch(query, 1, false) if localErr != nil && strings.Contains(localErr.Error(), "syntax error at position") { - localErr = fmt.Errorf(localSyntaxErr) + localErr = errors.New(localSyntaxErr) } if remoteErr != nil && strings.Contains(remoteErr.Error(), "You have an error in your SQL syntax") { - remoteErr = fmt.Errorf(syntaxErr) + remoteErr = errors.New(syntaxErr) } res := mismatch{ diff --git a/go/vt/vtgate/evalengine/testcases/cases.go b/go/vt/vtgate/evalengine/testcases/cases.go index c937e7dbbc0..ff6c0c0f311 100644 --- a/go/vt/vtgate/evalengine/testcases/cases.go +++ b/go/vt/vtgate/evalengine/testcases/cases.go @@ -155,6 +155,8 @@ var Cases = []TestCase{ {Run: FnWeekOfYear}, {Run: FnYear}, {Run: FnYearWeek}, + {Run: FnPeriodAdd}, + {Run: FnPeriodDiff}, {Run: FnInetAton}, {Run: FnInetNtoa}, {Run: FnInet6Aton}, @@ -1095,24 +1097,26 @@ func CollationOperations(yield Query) { } func LikeComparison(yield Query) { - var left = []string{ + var left = append(inputConversions, `'foobar'`, `'FOOBAR'`, `'1234'`, `1234`, `_utf8mb4 'foobar' COLLATE utf8mb4_0900_as_cs`, - `_utf8mb4 'FOOBAR' COLLATE utf8mb4_0900_as_cs`, - } - var right = append([]string{ + `_utf8mb4 'FOOBAR' COLLATE utf8mb4_0900_as_cs`) + + var right = append(left, + `NULL`, `1`, `0`, `'foo%'`, `'FOO%'`, `'foo_ar'`, `'FOO_AR'`, `'12%'`, `'12_4'`, `_utf8mb4 'foo%' COLLATE utf8mb4_0900_as_cs`, `_utf8mb4 'FOO%' COLLATE utf8mb4_0900_as_cs`, `_utf8mb4 'foo_ar' COLLATE utf8mb4_0900_as_cs`, - `_utf8mb4 'FOO_AR' COLLATE utf8mb4_0900_as_cs`, - }, left...) + `_utf8mb4 'FOO_AR' COLLATE utf8mb4_0900_as_cs`) for _, lhs := range left { for _, rhs := range right { - yield(fmt.Sprintf("%s LIKE %s", lhs, rhs), nil) + for _, op := range []string{"LIKE", "NOT LIKE"} { + yield(fmt.Sprintf("%s %s %s", lhs, op, rhs), nil) + } } } } @@ -1960,6 +1964,9 @@ func FnMaketime(yield Query) { "''", "0", "'3'", "59", "60", "0xFF666F6F626172FF", "18446744073709551615", } for _, h := range inputConversions { + if !(bugs{}).MakeTimeValidHours(h) { + continue + } for _, m := range minutes { for _, s := range inputConversions { yield(fmt.Sprintf("MAKETIME(%s, %s, %s)", h, m, s), nil) @@ -2220,6 +2227,48 @@ func FnYearWeek(yield Query) { } } +func FnPeriodAdd(yield Query) { + for _, p := range inputBitwise { + for _, m := range inputBitwise { + yield(fmt.Sprintf("PERIOD_ADD(%s, %s)", p, m), nil) + } + } + for _, p := range inputPeriods { + for _, m := range inputBitwise { + yield(fmt.Sprintf("PERIOD_ADD(%s, %s)", p, m), nil) + } + } + + mysqlDocSamples := []string{ + `PERIOD_ADD(200801,2)`, + } + + for _, q := range mysqlDocSamples { + yield(q, nil) + } +} + +func FnPeriodDiff(yield Query) { + for _, p1 := range inputBitwise { + for _, p2 := range inputBitwise { + yield(fmt.Sprintf("PERIOD_DIFF(%s, %s)", p1, p2), nil) + } + } + for _, p1 := range inputPeriods { + for _, p2 := range inputPeriods { + yield(fmt.Sprintf("PERIOD_DIFF(%s, %s)", p1, p2), nil) + } + } + + mysqlDocSamples := []string{ + `PERIOD_DIFF(200802,200703)`, + } + + for _, q := range mysqlDocSamples { + yield(q, nil) + } +} + func FnInetAton(yield Query) { for _, d := range ipInputs { yield(fmt.Sprintf("INET_ATON(%s)", d), nil) diff --git a/go/vt/vtgate/evalengine/testcases/helpers.go b/go/vt/vtgate/evalengine/testcases/helpers.go index a908b8196c8..71602e12c1c 100644 --- a/go/vt/vtgate/evalengine/testcases/helpers.go +++ b/go/vt/vtgate/evalengine/testcases/helpers.go @@ -21,6 +21,7 @@ import ( "math" "reflect" "runtime" + "strconv" "strings" "time" @@ -134,6 +135,18 @@ func (bugs) CanCompare(elems ...string) bool { return true } +// MakeTimeValidHours returns true if the hour input for MAKETIME +// is not an invalid edge case. Starting with MySQL 8.4.0, it somehow +// truncates this value to a negative zero. This seems pretty much +// broken as other large negative values are not truncated. +func (bugs) MakeTimeValidHours(input string) bool { + i, err := strconv.ParseInt(input, 10, 64) + if err != nil { + return true + } + return i != math.MinInt64 +} + type Comparison struct { Decimals uint32 LooseTime bool diff --git a/go/vt/vtgate/evalengine/testcases/inputs.go b/go/vt/vtgate/evalengine/testcases/inputs.go index eb94235d9b4..ac23281fd54 100644 --- a/go/vt/vtgate/evalengine/testcases/inputs.go +++ b/go/vt/vtgate/evalengine/testcases/inputs.go @@ -59,6 +59,11 @@ var inputBitwise = []string{ "64", "'64'", "_binary '64'", "X'40'", "_binary X'40'", } +var inputPeriods = []string{ + "110192", "'119812'", "2703", "7111", "200103", "200309", "0309", "-110102", "0", + "'032'", "223", "'-119812'", "-2703", "99999999999999999999999911", "'-0309'", +} + var radianInputs = []string{ "0", "1", diff --git a/go/vt/vtgate/evalengine/translate.go b/go/vt/vtgate/evalengine/translate.go index 0091f06a633..e93d338952c 100644 --- a/go/vt/vtgate/evalengine/translate.go +++ b/go/vt/vtgate/evalengine/translate.go @@ -87,7 +87,7 @@ func (ast *astCompiler) translateComparisonExpr2(op sqlparser.ComparisonExprOper Negate: op == sqlparser.NotRegexpOp, }, nil default: - return nil, vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, op.ToString()) + return nil, vterrors.New(vtrpcpb.Code_UNIMPLEMENTED, op.ToString()) } } @@ -309,10 +309,6 @@ func (ast *astCompiler) translateBinaryExpr(binary *sqlparser.BinaryExpr) (IR, e return &BitwiseExpr{BinaryExpr: binaryExpr, Op: &opBitShl{}}, nil case sqlparser.ShiftRightOp: return &BitwiseExpr{BinaryExpr: binaryExpr, Op: &opBitShr{}}, nil - case sqlparser.JSONExtractOp: - return builtinJSONExtractRewrite(left, right) - case sqlparser.JSONUnquoteExtractOp: - return builtinJSONExtractUnquoteRewrite(left, right) default: return nil, translateExprNotSupported(binary) } diff --git a/go/vt/vtgate/evalengine/translate_builtin.go b/go/vt/vtgate/evalengine/translate_builtin.go index d4c6bcdae5a..476ee32483b 100644 --- a/go/vt/vtgate/evalengine/translate_builtin.go +++ b/go/vt/vtgate/evalengine/translate_builtin.go @@ -528,6 +528,20 @@ func (ast *astCompiler) translateFuncExpr(fn *sqlparser.FuncExpr) (IR, error) { default: return nil, argError(method) } + case "period_add": + switch len(args) { + case 2: + return &builtinPeriodAdd{CallExpr: call}, nil + default: + return nil, argError(method) + } + case "period_diff": + switch len(args) { + case 2: + return &builtinPeriodDiff{CallExpr: call}, nil + default: + return nil, argError(method) + } case "inet_aton": if len(args) != 1 { return nil, argError(method) diff --git a/go/vt/vtgate/evalengine/translate_test.go b/go/vt/vtgate/evalengine/translate_test.go index 3702230e22e..2bebae548e1 100644 --- a/go/vt/vtgate/evalengine/translate_test.go +++ b/go/vt/vtgate/evalengine/translate_test.go @@ -89,8 +89,8 @@ func TestTranslateSimplification(t *testing.T) { {"coalesce(NULL, 2, NULL, 4)", ok("coalesce(null, 2, null, 4)"), ok("2")}, {"coalesce(NULL, NULL)", ok("coalesce(null, null)"), ok("null")}, {"coalesce(NULL)", ok("coalesce(null)"), ok("null")}, - {"weight_string('foobar')", ok(`weight_string('foobar')`), ok("'\x1c\xe5\x1d\xdd\x1d\xdd\x1c`\x1cG\x1e3'")}, - {"weight_string('foobar' as char(12))", ok(`weight_string('foobar' as char(12))`), ok("'\x1c\xe5\x1d\xdd\x1d\xdd\x1c`\x1cG\x1e3'")}, + {"weight_string('foobar')", ok(`weight_string('foobar')`), ok("_binary'\x1c\xe5\x1d\xdd\x1d\xdd\x1c`\x1cG\x1e3'")}, + {"weight_string('foobar' as char(12))", ok(`weight_string('foobar' as char(12))`), ok("_binary'\x1c\xe5\x1d\xdd\x1d\xdd\x1c`\x1cG\x1e3'")}, {"case when 1 = 1 then 2 else 3 end", ok("case when 1 = 1 then 2 else 3"), ok("2")}, {"case when null then 2 when 12 = 4 then 'ohnoes' else 42 end", ok(`case when null then 2 when 12 = 4 then 'ohnoes' else 42`), ok(`'42'`)}, {"convert('a', char(2) character set utf8mb4)", ok(`convert('a', CHAR(2) character set utf8mb4_0900_ai_ci)`), ok(`'a'`)}, diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index cec0dba8274..928f42fca30 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -77,6 +77,11 @@ var ( queriesProcessedByTable = stats.NewCountersWithMultiLabels("QueriesProcessedByTable", "Queries processed at vtgate by plan type, keyspace and table", []string{"Plan", "Keyspace", "Table"}) queriesRoutedByTable = stats.NewCountersWithMultiLabels("QueriesRoutedByTable", "Queries routed from vtgate to vttablet by plan type, keyspace and table", []string{"Plan", "Keyspace", "Table"}) + // commitMode records the timing of the commit phase of a transaction. + // It also tracks between different transaction mode i.e. Single, Multi and TwoPC + commitMode = stats.NewTimings("CommitModeTimings", "Commit Mode Time", "mode") + commitUnresolved = stats.NewCounter("CommitUnresolved", "Atomic Commit failed to conclude after commit decision is made") + exceedMemoryRowsLogger = logutil.NewThrottledLogger("ExceedMemoryRows", 1*time.Minute) errorTransform errorTransformer = nullErrorTransformer{} @@ -208,7 +213,7 @@ func NewExecutor( return e.plans.Metrics.Hits() }) stats.NewCounterFunc("QueryPlanCacheMisses", "Query plan cache misses", func() int64 { - return e.plans.Metrics.Hits() + return e.plans.Metrics.Misses() }) servenv.HTTPHandle(pathQueryPlans, e) servenv.HTTPHandle(pathScatterStats, e) @@ -672,7 +677,7 @@ func (e *Executor) executeSPInAllSessions(ctx context.Context, safeSession *Safe }) queries = append(queries, &querypb.BoundQuery{Sql: sql}) } - qr, errs = e.ExecuteMultiShard(ctx, nil, rss, queries, safeSession, false /*autocommit*/, ignoreMaxMemoryRows) + qr, errs = e.ExecuteMultiShard(ctx, nil, rss, queries, safeSession, false /*autocommit*/, ignoreMaxMemoryRows, nullResultsObserver{}) err := vterrors.Aggregate(errs) if err != nil { return nil, err @@ -1105,15 +1110,16 @@ func (e *Executor) getPlan( return nil, vterrors.VT13001("vschema not initialized") } - vcursor.SetIgnoreMaxMemoryRows(sqlparser.IgnoreMaxMaxMemoryRowsDirective(stmt)) - vcursor.SetConsolidator(sqlparser.Consolidator(stmt)) - vcursor.SetWorkloadName(sqlparser.GetWorkloadNameFromStatement(stmt)) - vcursor.UpdateForeignKeyChecksState(sqlparser.ForeignKeyChecksState(stmt)) - priority, err := sqlparser.GetPriorityFromStatement(stmt) + qh, err := sqlparser.BuildQueryHints(stmt) if err != nil { return nil, err } - vcursor.SetPriority(priority) + vcursor.SetIgnoreMaxMemoryRows(qh.IgnoreMaxMemoryRows) + vcursor.SetConsolidator(qh.Consolidator) + vcursor.SetWorkloadName(qh.Workload) + vcursor.UpdateForeignKeyChecksState(qh.ForeignKeyChecks) + vcursor.SetPriority(qh.Priority) + vcursor.SetExecQueryTimeout(qh.Timeout) setVarComment, err := prepareSetVarComment(vcursor, stmt) if err != nil { @@ -1454,13 +1460,13 @@ func parseAndValidateQuery(query string, parser *sqlparser.Parser) (sqlparser.St } // ExecuteMultiShard implements the IExecutor interface -func (e *Executor) ExecuteMultiShard(ctx context.Context, primitive engine.Primitive, rss []*srvtopo.ResolvedShard, queries []*querypb.BoundQuery, session *SafeSession, autocommit bool, ignoreMaxMemoryRows bool) (qr *sqltypes.Result, errs []error) { - return e.scatterConn.ExecuteMultiShard(ctx, primitive, rss, queries, session, autocommit, ignoreMaxMemoryRows) +func (e *Executor) ExecuteMultiShard(ctx context.Context, primitive engine.Primitive, rss []*srvtopo.ResolvedShard, queries []*querypb.BoundQuery, session *SafeSession, autocommit bool, ignoreMaxMemoryRows bool, resultsObserver resultsObserver) (qr *sqltypes.Result, errs []error) { + return e.scatterConn.ExecuteMultiShard(ctx, primitive, rss, queries, session, autocommit, ignoreMaxMemoryRows, resultsObserver) } // StreamExecuteMulti implements the IExecutor interface -func (e *Executor) StreamExecuteMulti(ctx context.Context, primitive engine.Primitive, query string, rss []*srvtopo.ResolvedShard, vars []map[string]*querypb.BindVariable, session *SafeSession, autocommit bool, callback func(reply *sqltypes.Result) error) []error { - return e.scatterConn.StreamExecuteMulti(ctx, primitive, query, rss, vars, session, autocommit, callback) +func (e *Executor) StreamExecuteMulti(ctx context.Context, primitive engine.Primitive, query string, rss []*srvtopo.ResolvedShard, vars []map[string]*querypb.BindVariable, session *SafeSession, autocommit bool, callback func(reply *sqltypes.Result) error, resultsObserver resultsObserver) []error { + return e.scatterConn.StreamExecuteMulti(ctx, primitive, query, rss, vars, session, autocommit, callback, resultsObserver) } // ExecuteLock implements the IExecutor interface @@ -1619,6 +1625,14 @@ func (e *Executor) environment() *vtenv.Environment { return e.env } +func (e *Executor) ReadTransaction(ctx context.Context, transactionID string) (*querypb.TransactionMetadata, error) { + return e.txConn.ReadTransaction(ctx, transactionID) +} + +func (e *Executor) UnresolvedTransactions(ctx context.Context, targets []*querypb.Target) ([]*querypb.TransactionMetadata, error) { + return e.txConn.UnresolvedTransactions(ctx, targets) +} + type ( errorTransformer interface { TransformError(err error) error diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index bd24907af9b..8ba89d25daf 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -121,11 +121,13 @@ func TestSelectDBA(t *testing.T) { query, map[string]*querypb.BindVariable{}, ) require.NoError(t, err) - wantQueries = []*querypb.BoundQuery{{Sql: "select count(*) from INFORMATION_SCHEMA.`TABLES` as ist where ist.table_schema = :__vtschemaname /* VARCHAR */ and ist.table_name = :ist_table_name /* VARCHAR */", + wantQueries = []*querypb.BoundQuery{{ + Sql: "select count(*) from INFORMATION_SCHEMA.`TABLES` as ist where ist.table_schema = :__vtschemaname /* VARCHAR */ and ist.table_name = :ist_table_name /* VARCHAR */", BindVariables: map[string]*querypb.BindVariable{ "__vtschemaname": sqltypes.StringBindVariable("performance_schema"), "ist_table_name": sqltypes.StringBindVariable("foo"), - }}} + }, + }} utils.MustMatch(t, wantQueries, sbc1.Queries) sbc1.Queries = nil @@ -135,11 +137,13 @@ func TestSelectDBA(t *testing.T) { query, map[string]*querypb.BindVariable{}, ) require.NoError(t, err) - wantQueries = []*querypb.BoundQuery{{Sql: "select 1 from information_schema.table_constraints where constraint_schema = :__vtschemaname /* VARCHAR */ and table_name = :table_name /* VARCHAR */", + wantQueries = []*querypb.BoundQuery{{ + Sql: "select 1 from information_schema.table_constraints where constraint_schema = :__vtschemaname /* VARCHAR */ and table_name = :table_name /* VARCHAR */", BindVariables: map[string]*querypb.BindVariable{ "__vtschemaname": sqltypes.StringBindVariable("vt_ks"), "table_name": sqltypes.StringBindVariable("user"), - }}} + }, + }} utils.MustMatch(t, wantQueries, sbc1.Queries) sbc1.Queries = nil @@ -149,10 +153,12 @@ func TestSelectDBA(t *testing.T) { query, map[string]*querypb.BindVariable{}, ) require.NoError(t, err) - wantQueries = []*querypb.BoundQuery{{Sql: "select 1 from information_schema.table_constraints where constraint_schema = :__vtschemaname /* VARCHAR */", + wantQueries = []*querypb.BoundQuery{{ + Sql: "select 1 from information_schema.table_constraints where constraint_schema = :__vtschemaname /* VARCHAR */", BindVariables: map[string]*querypb.BindVariable{ "__vtschemaname": sqltypes.StringBindVariable("vt_ks"), - }}} + }, + }} utils.MustMatch(t, wantQueries, sbc1.Queries) } @@ -427,6 +433,19 @@ func TestSetSystemVariablesWithReservedConnection(t *testing.T) { sbc1.Queries = nil } +func TestSelectVindexFunc(t *testing.T) { + executor, _, _, _, _ := createExecutorEnv(t) + + query := "select * from hash_index where id = 1" + session := NewAutocommitSession(&vtgatepb.Session{}) + _, err := executor.Execute(context.Background(), nil, "TestSelectVindexFunc", session, query, nil) + require.ErrorContains(t, err, "VT09005: no database selected") + + session.TargetString = KsTestSharded + _, err = executor.Execute(context.Background(), nil, "TestSelectVindexFunc", session, query, nil) + require.NoError(t, err) +} + func TestCreateTableValidTimestamp(t *testing.T) { executor, sbc1, _, _, _ := createExecutorEnv(t) executor.normalize = true @@ -468,13 +487,15 @@ func TestGen4SelectDBA(t *testing.T) { query, map[string]*querypb.BindVariable{}, ) require.NoError(t, err) - wantQueries = []*querypb.BoundQuery{{Sql: "select count(*) from INFORMATION_SCHEMA.`TABLES` as ist where ist.table_schema = :__vtschemaname /* VARCHAR */ and ist.table_name = :ist_table_name1 /* VARCHAR */", + wantQueries = []*querypb.BoundQuery{{ + Sql: "select count(*) from INFORMATION_SCHEMA.`TABLES` as ist where ist.table_schema = :__vtschemaname /* VARCHAR */ and ist.table_name = :ist_table_name1 /* VARCHAR */", BindVariables: map[string]*querypb.BindVariable{ "ist_table_schema": sqltypes.StringBindVariable("performance_schema"), "__vtschemaname": sqltypes.StringBindVariable("performance_schema"), "ist_table_name": sqltypes.StringBindVariable("foo"), "ist_table_name1": sqltypes.StringBindVariable("foo"), - }}} + }, + }} utils.MustMatch(t, wantQueries, sbc1.Queries) sbc1.Queries = nil @@ -484,26 +505,30 @@ func TestGen4SelectDBA(t *testing.T) { query, map[string]*querypb.BindVariable{}, ) require.NoError(t, err) - wantQueries = []*querypb.BoundQuery{{Sql: "select :vtg1 /* INT64 */ from information_schema.table_constraints where constraint_schema = :__vtschemaname /* VARCHAR */ and table_name = :table_name1 /* VARCHAR */", + wantQueries = []*querypb.BoundQuery{{ + Sql: "select :vtg1 /* INT64 */ from information_schema.table_constraints where constraint_schema = :__vtschemaname /* VARCHAR */ and table_name = :table_name1 /* VARCHAR */", BindVariables: map[string]*querypb.BindVariable{ "vtg1": sqltypes.Int64BindVariable(1), "constraint_schema": sqltypes.StringBindVariable("vt_ks"), "table_name": sqltypes.StringBindVariable("user"), "__vtschemaname": sqltypes.StringBindVariable("vt_ks"), "table_name1": sqltypes.StringBindVariable("user"), - }}} + }, + }} utils.MustMatch(t, wantQueries, sbc1.Queries) sbc1.Queries = nil query = "select 1 from information_schema.table_constraints where constraint_schema = 'vt_ks'" _, err = executor.Execute(context.Background(), nil, "TestSelectDBA", NewSafeSession(&vtgatepb.Session{TargetString: "TestExecutor"}), query, map[string]*querypb.BindVariable{}) require.NoError(t, err) - wantQueries = []*querypb.BoundQuery{{Sql: "select :vtg1 /* INT64 */ from information_schema.table_constraints where constraint_schema = :__vtschemaname /* VARCHAR */", + wantQueries = []*querypb.BoundQuery{{ + Sql: "select :vtg1 /* INT64 */ from information_schema.table_constraints where constraint_schema = :__vtschemaname /* VARCHAR */", BindVariables: map[string]*querypb.BindVariable{ "vtg1": sqltypes.Int64BindVariable(1), "constraint_schema": sqltypes.StringBindVariable("vt_ks"), "__vtschemaname": sqltypes.StringBindVariable("vt_ks"), - }}} + }, + }} utils.MustMatch(t, wantQueries, sbc1.Queries) sbc1.Queries = nil @@ -513,11 +538,13 @@ func TestGen4SelectDBA(t *testing.T) { query, map[string]*querypb.BindVariable{}, ) require.NoError(t, err) - wantQueries = []*querypb.BoundQuery{{Sql: "select t.table_schema, t.table_name, c.column_name, c.column_type from information_schema.`tables` as t, information_schema.`columns` as c where t.table_schema = :__vtschemaname /* VARCHAR */ and c.table_schema = :__vtschemaname /* VARCHAR */ and c.table_schema = t.table_schema and c.table_name = t.table_name order by t.table_schema asc, t.table_name asc, c.column_name asc", + wantQueries = []*querypb.BoundQuery{{ + Sql: "select t.table_schema, t.table_name, c.column_name, c.column_type from information_schema.`tables` as t, information_schema.`columns` as c where t.table_schema = :__vtschemaname /* VARCHAR */ and c.table_schema = :__vtschemaname /* VARCHAR */ and c.table_schema = t.table_schema and c.table_name = t.table_name order by t.table_schema asc, t.table_name asc, c.column_name asc", BindVariables: map[string]*querypb.BindVariable{ "t_table_schema": sqltypes.StringBindVariable("TestExecutor"), "__replacevtschemaname": sqltypes.Int64BindVariable(1), - }}} + }, + }} utils.MustMatch(t, wantQueries, sbc1.Queries) } @@ -1075,7 +1102,6 @@ func TestSelectDatabase(t *testing.T) { } require.NoError(t, err) utils.MustMatch(t, wantResult, result, "Mismatch") - } func TestSelectBindvars(t *testing.T) { @@ -2940,6 +2966,67 @@ func TestSubQueryAndQueryWithLimit(t *testing.T) { assert.Equal(t, `type:INT64 value:"100"`, sbc2.Queries[1].BindVariables["__upper_limit"].String()) } +func TestSelectUsingMultiEqualOnLookupColumn(t *testing.T) { + executor, sbc1, sbc2, sbclookup, _ := createExecutorEnv(t) + + // No results on shard `-20` (`sbc1`), but some lookup results on shard `40-60` (`sbc2`) + sbclookup.SetResults([]*sqltypes.Result{{ + Fields: []*querypb.Field{ + {Name: "lu_col", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, + {Name: "keyspace_id", Type: sqltypes.VarBinary, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_BINARY_FLAG)}, + }, + Rows: [][]sqltypes.Value{{ + sqltypes.NewInt32(2), + sqltypes.MakeTrusted(sqltypes.VarBinary, []byte("\x45")), + }}, + }}) + + sbc1.SetResults([]*sqltypes.Result{{ + Fields: []*querypb.Field{ + {Name: "nv_lu_col", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, + {Name: "other", Type: sqltypes.VarChar, Charset: collations.CollationUtf8mb4ID}, + }, + Rows: [][]sqltypes.Value{}, + }}) + + sbc2.SetResults([]*sqltypes.Result{{ + Fields: []*querypb.Field{ + {Name: "nv_lu_col", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, + {Name: "other", Type: sqltypes.VarChar, Charset: collations.CollationUtf8mb4ID}, + }, + Rows: [][]sqltypes.Value{{ + sqltypes.NewInt32(2), + sqltypes.NewVarChar("baz"), + }}, + }}) + + result, err := exec(executor, NewSafeSession(&vtgatepb.Session{ + TargetString: KsTestSharded, + }), "select nv_lu_col, other from t2_lookup WHERE (nv_lu_col = 1 AND other = 'bar') OR (nv_lu_col = 2 AND other = 'baz') OR (nv_lu_col = 3 AND other = 'qux') OR (nv_lu_col = 4 AND other = 'brz') OR (nv_lu_col = 5 AND other = 'brz')") + + require.NoError(t, err) + + require.Len(t, sbc1.Queries, 0) + require.Len(t, sbc2.Queries, 1) + + require.Equal(t, []*querypb.BoundQuery{{ + Sql: "select nv_lu_col, other from t2_lookup where nv_lu_col = 1 and other = 'bar' or nv_lu_col = 2 and other = 'baz' or nv_lu_col = 3 and other = 'qux' or nv_lu_col = 4 and other = 'brz' or nv_lu_col = 5 and other = 'brz'", + BindVariables: map[string]*querypb.BindVariable{}, + }}, sbc2.Queries) + + wantResult := &sqltypes.Result{ + Fields: []*querypb.Field{ + {Name: "nv_lu_col", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, + {Name: "other", Type: sqltypes.VarChar, Charset: collations.CollationUtf8mb4ID}, + }, + Rows: [][]sqltypes.Value{{ + sqltypes.NewInt32(2), + sqltypes.NewVarChar("baz"), + }}, + } + require.Equal(t, wantResult, result) +} + func TestCrossShardSubqueryStream(t *testing.T) { executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) result1 := []*sqltypes.Result{{ @@ -3192,7 +3279,6 @@ func TestLockReserve(t *testing.T) { _, err := exec(executor, session, "select get_lock('lock name', 10) from dual") require.NoError(t, err) require.NotNil(t, session.LockSession) - } func TestSelectFromInformationSchema(t *testing.T) { @@ -3900,15 +3986,15 @@ func TestSelectAggregationNoData(t *testing.T) { { sql: `select count(*) from (select col1, col2 from user limit 2) x`, sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col1|col2|1", "int64|int64|int64")), - expSandboxQ: "select x.col1, x.col2, 1 from (select col1, col2 from `user`) as x limit 2", - expField: `[name:"count(*)" type:INT64]`, + expSandboxQ: "select 1 from (select col1, col2 from `user`) as x limit 2", + expField: `[name:"count(*)" type:INT64 charset:63 flags:32769]`, expRow: `[[INT64(0)]]`, }, { sql: `select col2, count(*) from (select col1, col2 from user limit 2) x group by col2`, sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col1|col2|1|weight_string(col2)", "int64|int64|int64|varbinary")), - expSandboxQ: "select x.col1, x.col2, 1, weight_string(x.col2) from (select col1, col2 from `user`) as x limit 2", - expField: `[name:"col2" type:INT64 name:"count(*)" type:INT64]`, + expSandboxQ: "select x.col1, x.col2, weight_string(x.col2) from (select col1, col2 from `user`) as x limit 2", + expField: `[name:"col2" type:INT64 charset:63 flags:32768 name:"count(*)" type:INT64 charset:63 flags:32769]`, expRow: `[]`, }, } @@ -3992,15 +4078,15 @@ func TestSelectAggregationData(t *testing.T) { { sql: `select count(*) from (select col1, col2 from user limit 2) x`, sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col1|col2|1", "int64|int64|int64"), "100|200|1", "200|300|1"), - expSandboxQ: "select x.col1, x.col2, 1 from (select col1, col2 from `user`) as x limit 2", - expField: `[name:"count(*)" type:INT64]`, + expSandboxQ: "select 1 from (select col1, col2 from `user`) as x limit 2", + expField: `[name:"count(*)" type:INT64 charset:63 flags:32769]`, expRow: `[[INT64(2)]]`, }, { sql: `select col2, count(*) from (select col1, col2 from user limit 9) x group by col2`, sandboxRes: sqltypes.MakeTestResult(sqltypes.MakeTestFields("col1|col2|1|weight_string(col2)", "int64|int64|int64|varbinary"), "100|3|1|NULL", "200|2|1|NULL"), - expSandboxQ: "select x.col1, x.col2, 1, weight_string(x.col2) from (select col1, col2 from `user`) as x limit 9", - expField: `[name:"col2" type:INT64 name:"count(*)" type:INT64]`, + expSandboxQ: "select x.col1, x.col2, weight_string(x.col2) from (select col1, col2 from `user`) as x limit 9", + expField: `[name:"col2" type:INT64 charset:63 flags:32768 name:"count(*)" type:INT64 charset:63 flags:32769]`, expRow: `[[INT64(2) INT64(4)] [INT64(3) INT64(5)]]`, }, { @@ -4335,3 +4421,107 @@ func TestStreamJoinQuery(t *testing.T) { utils.MustMatch(t, wantResult.Rows[idx], result.Rows[idx], "mismatched on: ", strconv.Itoa(idx)) } } + +// TestSysVarGlobalAndSession tests that global and session variables are set correctly. +// It also tests that setting a global variable does not affect the session variable and vice versa. +// Also, test what happens on running select @@global and select @@session for a system variable. +func TestSysVarGlobalAndSession(t *testing.T) { + executor, sbc1, _, _, _ := createExecutorEnv(t) + executor.normalize = true + session := NewAutocommitSession(&vtgatepb.Session{EnableSystemSettings: true, SystemVariables: map[string]string{}}) + + sbc1.SetResults([]*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("innodb_lock_wait_timeout", "uint64"), "20"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("innodb_lock_wait_timeout", "uint64"), "20"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("1", "int64")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("new", "uint64"), "40"), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("reserve_execute", "uint64")), + sqltypes.MakeTestResult(sqltypes.MakeTestFields("@@global.innodb_lock_wait_timeout", "uint64"), "20"), + }) + qr, err := executor.Execute(context.Background(), nil, "TestSetStmt", session, + "select @@innodb_lock_wait_timeout", nil) + require.NoError(t, err) + require.Equal(t, `[[UINT64(20)]]`, fmt.Sprintf("%v", qr.Rows)) + + qr, err = executor.Execute(context.Background(), nil, "TestSetStmt", session, + "select @@global.innodb_lock_wait_timeout", nil) + require.NoError(t, err) + require.Equal(t, `[[UINT64(20)]]`, fmt.Sprintf("%v", qr.Rows)) + + _, err = executor.Execute(context.Background(), nil, "TestSetStmt", session, + "set @@global.innodb_lock_wait_timeout = 120", nil) + require.NoError(t, err) + require.Empty(t, session.SystemVariables["innodb_lock_wait_timeout"]) + + _, err = executor.Execute(context.Background(), nil, "TestSetStmt", session, + "set @@innodb_lock_wait_timeout = 40", nil) + require.NoError(t, err) + require.EqualValues(t, "40", session.SystemVariables["innodb_lock_wait_timeout"]) + + qr, err = executor.Execute(context.Background(), nil, "TestSetStmt", session, + "select @@innodb_lock_wait_timeout", nil) + require.NoError(t, err) + require.Equal(t, `[[INT64(40)]]`, fmt.Sprintf("%v", qr.Rows)) + + qr, err = executor.Execute(context.Background(), nil, "TestSetStmt", session, + "select @@global.innodb_lock_wait_timeout", nil) + require.NoError(t, err) + require.Equal(t, `[[UINT64(20)]]`, fmt.Sprintf("%v", qr.Rows)) +} + +func BenchmarkSelectMirror(b *testing.B) { + ctx := context.Background() + cell := "aa" + sql := fmt.Sprintf("select id from %s.user where id = 1", KsTestUnsharded) + + currentSandboxMirrorRules := sandboxMirrorRules + b.Cleanup(func() { + setSandboxMirrorRules(currentSandboxMirrorRules) + }) + + // Don't use createExecutorEnv. Doesn't work with benchmarks because of + // utils.EnsureNoLeak. + createBenchmarkExecutor := func(b *testing.B) (context.Context, *Executor) { + ctx, cancel := context.WithCancel(ctx) + b.Cleanup(cancel) + hc := discovery.NewFakeHealthCheck(nil) + u := createSandbox(KsTestUnsharded) + s := createSandbox(KsTestSharded) + s.VSchema = executorVSchema + u.VSchema = unshardedVSchema + serv := newSandboxForCells(ctx, []string{cell}) + resolver := newTestResolver(ctx, hc, serv, cell) + shards := []string{"-20", "20-40", "40-60", "60-80", "80-a0", "a0-c0", "c0-e0", "e0-"} + for _, shard := range shards { + hc.AddTestTablet(cell, shard, 1, KsTestSharded, shard, topodatapb.TabletType_PRIMARY, true, 1, nil) + } + hc.AddTestTablet(cell, "0", 1, KsTestUnsharded, "0", topodatapb.TabletType_PRIMARY, true, 1, nil) + return ctx, createExecutor(ctx, serv, cell, resolver) + } + + for _, percent := range []float32{0, 1, 5, 10, 25, 50, 100} { + b.Run(fmt.Sprintf("mirror %.2f%%", percent), func(b *testing.B) { + setSandboxMirrorRules(fmt.Sprintf(`{ + "rules": [ + { + "from_table": "%s.user", + "to_table": "%s.user", + "percent": %.2f + } + ] + }`, KsTestUnsharded, KsTestSharded, percent)) + + ctx, executor := createBenchmarkExecutor(b) + session := &vtgatepb.Session{ + TargetString: "@primary", + } + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + executorExec(ctx, executor, session, sql, nil) + } + b.StopTimer() + }) + } +} diff --git a/go/vt/vtgate/executor_set_test.go b/go/vt/vtgate/executor_set_test.go index 5e66899db44..12e8e272bd7 100644 --- a/go/vt/vtgate/executor_set_test.go +++ b/go/vt/vtgate/executor_set_test.go @@ -364,6 +364,13 @@ func TestExecutorSetOp(t *testing.T) { in: "set tx_isolation = 'read-committed'", sysVars: map[string]string{"tx_isolation": "'read-committed'"}, result: returnResult("tx_isolation", "varchar", "read-committed"), + }, { + in: "set @@innodb_lock_wait_timeout=120", + sysVars: map[string]string{"innodb_lock_wait_timeout": "120"}, + result: returnResult("innodb_lock_wait_timeout", "int64", "120"), + }, { + in: "set @@global.innodb_lock_wait_timeout=120", + result: returnResult("innodb_lock_wait_timeout", "int64", "120"), }} for _, tcase := range testcases { t.Run(tcase.in, func(t *testing.T) { @@ -618,3 +625,22 @@ func TestExecutorSetAndSelect(t *testing.T) { }) } } + +// TestTimeZone verifies that setting different time zones in the session +// results in different outputs for the `now()` function. +func TestExecutorTimeZone(t *testing.T) { + e, _, _, _, ctx := createExecutorEnv(t) + + session := NewAutocommitSession(&vtgatepb.Session{TargetString: KsTestUnsharded, EnableSystemSettings: true}) + session.SetSystemVariable("time_zone", "'+08:00'") + + qr, err := e.Execute(ctx, nil, "TestExecutorSetAndSelect", session, "select now()", nil) + + require.NoError(t, err) + session.SetSystemVariable("time_zone", "'+02:00'") + + qrWith, err := e.Execute(ctx, nil, "TestExecutorSetAndSelect", session, "select now()", nil) + require.NoError(t, err) + + assert.False(t, qr.Rows[0][0].Equal(qrWith.Rows[0][0]), "%v vs %v", qr.Rows[0][0].ToString(), qrWith.Rows[0][0].ToString()) +} diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index cce717674d6..3732a37d1d1 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -42,6 +42,11 @@ import ( "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/callerid" "vitess.io/vitess/go/vt/discovery" + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vschemapb "vitess.io/vitess/go/vt/proto/vschema" + vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vtgate/buffer" @@ -50,12 +55,6 @@ import ( "vitess.io/vitess/go/vt/vtgate/vindexes" "vitess.io/vitess/go/vt/vtgate/vschemaacl" "vitess.io/vitess/go/vt/vtgate/vtgateservice" - - querypb "vitess.io/vitess/go/vt/proto/query" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" - vschemapb "vitess.io/vitess/go/vt/proto/vschema" - vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) func TestExecutorResultsExceeded(t *testing.T) { @@ -1105,6 +1104,15 @@ func TestExecutorShowTargeted(t *testing.T) { } } +func TestExecutorShowFromSystemSchema(t *testing.T) { + executor, _, _, _, ctx := createExecutorEnv(t) + + session := NewSafeSession(&vtgatepb.Session{TargetString: "mysql"}) + + _, err := executor.Execute(ctx, nil, "TestExecutorShowFromSystemSchema", session, "show tables", nil) + require.NoError(t, err) +} + func TestExecutorUse(t *testing.T) { executor, _, _, _, ctx := createExecutorEnv(t) @@ -1511,6 +1519,20 @@ func TestExecutorUnrecognized(t *testing.T) { require.Error(t, err, "unrecognized statement: invalid statement'") } +func TestExecutorDeniedErrorNoBuffer(t *testing.T) { + executor, sbc1, _, _, ctx := createExecutorEnv(t) + sbc1.EphemeralShardErr = errors.New("enforce denied tables") + + vschemaWaitTimeout = 500 * time.Millisecond + + session := NewAutocommitSession(&vtgatepb.Session{TargetString: "@primary"}) + startExec := time.Now() + _, err := executor.Execute(ctx, nil, "TestExecutorDeniedErrorNoBuffer", session, "select * from user", nil) + require.NoError(t, err, "enforce denied tables not buffered") + endExec := time.Now() + require.GreaterOrEqual(t, endExec.Sub(startExec).Milliseconds(), int64(500)) +} + // TestVSchemaStats makes sure the building and displaying of the // VSchemaStats works. func TestVSchemaStats(t *testing.T) { @@ -1778,14 +1800,15 @@ func TestGetPlanPriority(t *testing.T) { stmt, err := sqlparser.NewTestParser().Parse(testCase.sql) assert.NoError(t, err) - crticalityFromStatement, _ := sqlparser.GetPriorityFromStatement(stmt) + qh, _ := sqlparser.BuildQueryHints(stmt) + priorityFromStatement := qh.Priority _, err = r.getPlan(context.Background(), vCursor, testCase.sql, stmt, makeComments("/* some comment */"), map[string]*querypb.BindVariable{}, nil, true, logStats) if testCase.expectedError != nil { assert.ErrorIs(t, err, testCase.expectedError) } else { assert.NoError(t, err) - assert.Equal(t, testCase.expectedPriority, crticalityFromStatement) + assert.Equal(t, testCase.expectedPriority, priorityFromStatement) assert.Equal(t, testCase.expectedPriority, vCursor.safeSession.Options.Priority) } }) @@ -2280,7 +2303,7 @@ func TestExecutorVExplain(t *testing.T) { result, err = executorExec(ctx, executor, session, "vexplain plan select 42", bindVars) require.NoError(t, err) - expected := `[[VARCHAR("{\n\t\"OperatorType\": \"Projection\",\n\t\"Expressions\": [\n\t\t\"42 as 42\"\n\t],\n\t\"Inputs\": [\n\t\t{\n\t\t\t\"OperatorType\": \"SingleRow\"\n\t\t}\n\t]\n}")]]` + expected := `[[VARCHAR("{\n\t\"OperatorType\": \"Projection\",\n\t\"Expressions\": [\n\t\t\":vtg1 as :vtg1 /* INT64 */\"\n\t],\n\t\"Inputs\": [\n\t\t{\n\t\t\t\"OperatorType\": \"SingleRow\"\n\t\t}\n\t]\n}")]]` require.Equal(t, expected, fmt.Sprintf("%v", result.Rows)) } @@ -2770,6 +2793,128 @@ func TestExecutorPrepareExecute(t *testing.T) { require.Error(t, err) } +// TestExecutorSettingsInTwoPC tests that settings are supported for multi-shard atomic commit. +func TestExecutorSettingsInTwoPC(t *testing.T) { + executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) + tcases := []struct { + sqls []string + testRes []*sqltypes.Result + expectedQueries [][]string + }{ + { + sqls: []string{ + `set time_zone = "+08:00"`, + `insert into user_extra(user_id) values (1)`, + `insert into user_extra(user_id) values (2)`, + `insert into user_extra(user_id) values (3)`, + }, + testRes: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id", "varchar"), + "+08:00"), + }, + expectedQueries: [][]string{ + { + "select '+08:00' from dual where @@time_zone != '+08:00'", + "set @@time_zone = '+08:00'", + "set @@time_zone = '+08:00'", + "insert into user_extra(user_id) values (1)", + "insert into user_extra(user_id) values (2)", + }, + { + "set @@time_zone = '+08:00'", + "insert into user_extra(user_id) values (3)", + }, + }, + }, + } + + for _, tcase := range tcases { + t.Run(fmt.Sprintf("%v", tcase.sqls), func(t *testing.T) { + sbc1.SetResults(tcase.testRes) + sbc2.SetResults(tcase.testRes) + + // create a new session + session := NewSafeSession(&vtgatepb.Session{ + TargetString: KsTestSharded, + TransactionMode: vtgatepb.TransactionMode_TWOPC, + EnableSystemSettings: true, + }) + + // start transaction + _, err := executor.Execute(ctx, nil, "TestExecutorSettingsInTwoPC", session, "begin", nil) + require.NoError(t, err) + + // execute queries + for _, sql := range tcase.sqls { + _, err = executor.Execute(ctx, nil, "TestExecutorSettingsInTwoPC", session, sql, nil) + require.NoError(t, err) + } + + // commit 2pc + _, err = executor.Execute(ctx, nil, "TestExecutorSettingsInTwoPC", session, "commit", nil) + require.NoError(t, err) + + queriesRecvd, err := sbc1.GetFinalQueries() + require.NoError(t, err) + assert.EqualValues(t, tcase.expectedQueries[0], queriesRecvd) + queriesRecvd, err = sbc2.GetFinalQueries() + require.NoError(t, err) + assert.EqualValues(t, tcase.expectedQueries[1], queriesRecvd) + }) + } +} + +// TestExecutorRejectTwoPC test all the unsupported cases for multi-shard atomic commit. +func TestExecutorRejectTwoPC(t *testing.T) { + executor, sbc1, sbc2, _, ctx := createExecutorEnv(t) + tcases := []struct { + sqls []string + testRes []*sqltypes.Result + + expErr string + }{ + { + sqls: []string{ + `update t1 set unq_col = 1 where id = 1`, + `update t1 set unq_col = 1 where id = 3`, + }, + testRes: []*sqltypes.Result{ + sqltypes.MakeTestResult(sqltypes.MakeTestFields("id|unq_col|unchanged", "int64|int64|int64"), + "1|2|0"), + }, + expErr: "VT12001: unsupported: atomic distributed transaction commit with consistent lookup vindex", + }, + } + + for _, tcase := range tcases { + t.Run(fmt.Sprintf("%v", tcase.sqls), func(t *testing.T) { + sbc1.SetResults(tcase.testRes) + sbc2.SetResults(tcase.testRes) + + // create a new session + session := NewSafeSession(&vtgatepb.Session{ + TargetString: KsTestSharded, + TransactionMode: vtgatepb.TransactionMode_TWOPC, + EnableSystemSettings: true, + }) + + // start transaction + _, err := executor.Execute(ctx, nil, "TestExecutorRejectTwoPC", session, "begin", nil) + require.NoError(t, err) + + // execute queries + for _, sql := range tcase.sqls { + _, err = executor.Execute(ctx, nil, "TestExecutorRejectTwoPC", session, sql, nil) + require.NoError(t, err) + } + + // commit 2pc + _, err = executor.Execute(ctx, nil, "TestExecutorRejectTwoPC", session, "commit", nil) + require.ErrorContains(t, err, tcase.expErr) + }) + } +} + func TestExecutorTruncateErrors(t *testing.T) { executor, _, _, _, ctx := createExecutorEnv(t) diff --git a/go/vt/vtgate/executor_vexplain_test.go b/go/vt/vtgate/executor_vexplain_test.go new file mode 100644 index 00000000000..99eb77c7ed4 --- /dev/null +++ b/go/vt/vtgate/executor_vexplain_test.go @@ -0,0 +1,170 @@ +/* +Copyright 2024 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 vtgate + +import ( + "context" + "encoding/json" + "fmt" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/sqltypes" + "vitess.io/vitess/go/test/utils" + "vitess.io/vitess/go/vt/discovery" + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" + "vitess.io/vitess/go/vt/vttablet/sandboxconn" +) + +func TestSimpleVexplainTrace(t *testing.T) { + ctx := utils.LeakCheckContext(t) + + cell := "aa" + hc := discovery.NewFakeHealthCheck(nil) + u := createSandbox(KsTestUnsharded) + s := createSandbox(KsTestSharded) + s.VSchema = executorVSchema + u.VSchema = unshardedVSchema + serv := newSandboxForCells(ctx, []string{cell}) + resolver := newTestResolver(ctx, hc, serv, cell) + shards := []string{"-20", "20-40", "40-60", "60-80", "80-a0", "a0-c0", "c0-e0", "e0-"} + var conns []*sandboxconn.SandboxConn + for i, shard := range shards { + sbc := hc.AddTestTablet(cell, shard, 1, "TestExecutor", shard, topodatapb.TabletType_PRIMARY, true, 1, nil) + sbc.SetResults([]*sqltypes.Result{{ + Fields: []*querypb.Field{ + {Name: "col1", Type: sqltypes.Int32}, + {Name: "col2", Type: sqltypes.Int32}, + {Name: "weight_string(col2)"}, + }, + InsertID: 0, + Rows: [][]sqltypes.Value{ + {sqltypes.NewInt32(1), sqltypes.NewInt32(int32(i % 4)), sqltypes.NULL}, + {sqltypes.NewInt32(2), sqltypes.NewInt32(int32(i % 4)), sqltypes.NULL}, + }, + }}) + conns = append(conns, sbc) + } + executor := createExecutor(ctx, serv, cell, resolver) + defer executor.Close() + + query := "vexplain trace select count(*), col2 from music group by col2" + session := &vtgatepb.Session{ + TargetString: "@primary", + } + gotResult, err := executorExec(ctx, executor, session, query, nil) + require.NoError(t, err) + + wantQueries := []*querypb.BoundQuery{{ + Sql: "select count(*), col2, weight_string(col2) from music group by col2, weight_string(col2) order by col2 asc", + BindVariables: map[string]*querypb.BindVariable{}, + }} + for _, conn := range conns { + utils.MustMatch(t, wantQueries, conn.Queries) + } + + expectedRowString := `{ + "OperatorType": "Aggregate", + "Variant": "Ordered", + "NoOfCalls": 1, + "AvgNumberOfRows": 4, + "MedianNumberOfRows": 4, + "Aggregates": "sum_count_star(0) AS count(*)", + "GroupBy": "(1|2)", + "ResultColumns": 2, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "TestExecutor", + "Sharded": true + }, + "NoOfCalls": 1, + "AvgNumberOfRows": 16, + "MedianNumberOfRows": 16, + "ShardsQueried": 8, + "FieldQuery": "select count(*), col2, weight_string(col2) from music where 1 != 1 group by col2, weight_string(col2)", + "OrderBy": "(1|2) ASC", + "Query": "select count(*), col2, weight_string(col2) from music group by col2, weight_string(col2) order by col2 asc", + "Table": "music" + } + ] +}` + + gotRowString := gotResult.Rows[0][0].ToString() + require.Equal(t, expectedRowString, gotRowString) +} + +func TestVExplainKeys(t *testing.T) { + type testCase struct { + Query string `json:"query"` + Expected json.RawMessage `json:"expected"` + } + + var tests []testCase + data, err := os.ReadFile("testdata/executor_vexplain.json") + require.NoError(t, err) + + err = json.Unmarshal(data, &tests) + require.NoError(t, err) + + var updatedTests []testCase + + for _, tt := range tests { + t.Run(tt.Query, func(t *testing.T) { + executor, _, _, _, _ := createExecutorEnv(t) + session := NewSafeSession(&vtgatepb.Session{TargetString: "@primary"}) + gotResult, err := executor.Execute(context.Background(), nil, "Execute", session, "vexplain keys "+tt.Query, nil) + require.NoError(t, err) + + gotRowString := gotResult.Rows[0][0].ToString() + assert.JSONEq(t, string(tt.Expected), gotRowString) + + updatedTests = append(updatedTests, testCase{ + Query: tt.Query, + Expected: json.RawMessage(gotRowString), + }) + + if t.Failed() { + fmt.Println("Test failed for query:", tt.Query) + fmt.Println("Got result:", gotRowString) + } + }) + } + + // If anything failed, write the updated test cases to a temp file + if t.Failed() { + tempFilePath := filepath.Join(os.TempDir(), "updated_vexplain_keys_tests.json") + fmt.Println("Writing updated tests to:", tempFilePath) + + updatedTestsData, err := json.MarshalIndent(updatedTests, "", "\t") + require.NoError(t, err) + + err = os.WriteFile(tempFilePath, updatedTestsData, 0644) + require.NoError(t, err) + + fmt.Println("Updated tests written to:", tempFilePath) + } +} diff --git a/go/vt/vtgate/fakerpcvtgateconn/conn.go b/go/vt/vtgate/fakerpcvtgateconn/conn.go index 3f6236ea9ec..372ddfb8cfc 100644 --- a/go/vt/vtgate/fakerpcvtgateconn/conn.go +++ b/go/vt/vtgate/fakerpcvtgateconn/conn.go @@ -182,11 +182,6 @@ func (conn *FakeVTGateConn) CloseSession(ctx context.Context, session *vtgatepb. panic("not implemented") } -// ResolveTransaction please see vtgateconn.Impl.ResolveTransaction -func (conn *FakeVTGateConn) ResolveTransaction(ctx context.Context, dtid string) error { - return nil -} - // VStream streams binlog events. func (conn *FakeVTGateConn) VStream(ctx context.Context, tabletType topodatapb.TabletType, vgtid *binlogdatapb.VGtid, filter *binlogdatapb.Filter, flags *vtgatepb.VStreamFlags) (vtgateconn.VStreamReader, error) { diff --git a/go/vt/vtgate/grpcvtgateconn/conn.go b/go/vt/vtgate/grpcvtgateconn/conn.go index a681e3661cd..fa16fa0d602 100644 --- a/go/vt/vtgate/grpcvtgateconn/conn.go +++ b/go/vt/vtgate/grpcvtgateconn/conn.go @@ -234,15 +234,6 @@ func (conn *vtgateConn) CloseSession(ctx context.Context, session *vtgatepb.Sess return nil } -func (conn *vtgateConn) ResolveTransaction(ctx context.Context, dtid string) error { - request := &vtgatepb.ResolveTransactionRequest{ - CallerId: callerid.EffectiveCallerIDFromContext(ctx), - Dtid: dtid, - } - _, err := conn.c.ResolveTransaction(ctx, request) - return vterrors.FromGRPC(err) -} - type vstreamAdapter struct { stream vtgateservicepb.Vitess_VStreamClient } diff --git a/go/vt/vtgate/grpcvtgateconn/suite_test.go b/go/vt/vtgate/grpcvtgateconn/suite_test.go index e5cd5c3ac81..0e544b05e66 100644 --- a/go/vt/vtgate/grpcvtgateconn/suite_test.go +++ b/go/vt/vtgate/grpcvtgateconn/suite_test.go @@ -23,7 +23,6 @@ package grpcvtgateconn import ( "context" - "errors" "fmt" "io" "strings" @@ -231,21 +230,6 @@ func (f *fakeVTGateService) CloseSession(ctx context.Context, session *vtgatepb. panic("unimplemented") } -// ResolveTransaction is part of the VTGateService interface -func (f *fakeVTGateService) ResolveTransaction(ctx context.Context, dtid string) error { - if f.hasError { - return errTestVtGateError - } - if f.panics { - panic(fmt.Errorf("test forced panic")) - } - f.checkCallerID(ctx, "ResolveTransaction") - if dtid != dtid2 { - return errors.New("ResolveTransaction: dtid mismatch") - } - return nil -} - func (f *fakeVTGateService) VStream(ctx context.Context, tabletType topodatapb.TabletType, vgtid *binlogdatapb.VGtid, filter *binlogdatapb.Filter, flags *vtgatepb.VStreamFlags, send func([]*binlogdatapb.VEvent) error) error { panic("unimplemented") } diff --git a/go/vt/vtgate/grpcvtgateservice/server.go b/go/vt/vtgate/grpcvtgateservice/server.go index bf00db4ea1c..d9fef3d4e31 100644 --- a/go/vt/vtgate/grpcvtgateservice/server.go +++ b/go/vt/vtgate/grpcvtgateservice/server.go @@ -247,18 +247,6 @@ func (vtg *VTGate) CloseSession(ctx context.Context, request *vtgatepb.CloseSess }, nil } -// ResolveTransaction is the RPC version of vtgateservice.VTGateService method -func (vtg *VTGate) ResolveTransaction(ctx context.Context, request *vtgatepb.ResolveTransactionRequest) (response *vtgatepb.ResolveTransactionResponse, err error) { - defer vtg.server.HandlePanic(&err) - ctx = withCallerIDContext(ctx, request.CallerId) - vtgErr := vtg.server.ResolveTransaction(ctx, request.Dtid) - response = &vtgatepb.ResolveTransactionResponse{} - if vtgErr == nil { - return response, nil - } - return nil, vterrors.ToGRPC(vtgErr) -} - // VStream is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) VStream(request *vtgatepb.VStreamRequest, stream vtgateservicepb.Vitess_VStreamServer) (err error) { defer vtg.server.HandlePanic(&err) diff --git a/go/vt/vtgate/legacy_scatter_conn_test.go b/go/vt/vtgate/legacy_scatter_conn_test.go index 7ada1c3ac31..4512fc0724e 100644 --- a/go/vt/vtgate/legacy_scatter_conn_test.go +++ b/go/vt/vtgate/legacy_scatter_conn_test.go @@ -99,7 +99,7 @@ func TestLegacyExecuteFailOnAutocommit(t *testing.T) { }, Autocommit: false, } - _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, NewSafeSession(session), true /*autocommit*/, false) + _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, NewSafeSession(session), true /*autocommit*/, false, nullResultsObserver{}) err := vterrors.Aggregate(errs) require.Error(t, err) require.Contains(t, err.Error(), "in autocommit mode, transactionID should be zero but was: 123") @@ -123,7 +123,7 @@ func TestScatterConnExecuteMulti(t *testing.T) { } } - qr, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, NewSafeSession(nil), false /*autocommit*/, false) + qr, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, NewSafeSession(nil), false /*autocommit*/, false, nullResultsObserver{}) return qr, vterrors.Aggregate(errs) }) } @@ -143,7 +143,7 @@ func TestScatterConnStreamExecuteMulti(t *testing.T) { defer mu.Unlock() qr.AppendResult(r) return nil - }) + }, nullResultsObserver{}) return qr, vterrors.Aggregate(errors) }) } @@ -310,7 +310,7 @@ func TestMaxMemoryRows(t *testing.T) { sbc0.SetResults([]*sqltypes.Result{tworows, tworows}) sbc1.SetResults([]*sqltypes.Result{tworows, tworows}) - _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, session, false, test.ignoreMaxMemoryRows) + _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, session, false, test.ignoreMaxMemoryRows, nullResultsObserver{}) if test.ignoreMaxMemoryRows { require.NoError(t, err) } else { @@ -342,7 +342,7 @@ func TestLegaceHealthCheckFailsOnReservedConnections(t *testing.T) { }) } - _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, session, false, false) + _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, session, false, false, nullResultsObserver{}) require.Error(t, vterrors.Aggregate(errs)) } @@ -365,10 +365,21 @@ func executeOnShardsReturnsErr(t *testing.T, ctx context.Context, res *srvtopo.R }) } - _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, session, false, false) + _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, session, false, false, nullResultsObserver{}) return vterrors.Aggregate(errs) } +type recordingResultsObserver struct { + mu sync.Mutex + recorded []*sqltypes.Result +} + +func (o *recordingResultsObserver) observe(result *sqltypes.Result) { + mu.Lock() + o.recorded = append(o.recorded, result) + mu.Unlock() +} + func TestMultiExecs(t *testing.T) { ctx := utils.LeakCheckContext(t) createSandbox("TestMultiExecs") @@ -409,9 +420,17 @@ func TestMultiExecs(t *testing.T) { }, }, } + results := []*sqltypes.Result{ + {Info: "r0"}, + {Info: "r1"}, + } + sbc0.SetResults(results[0:1]) + sbc1.SetResults(results[1:2]) + + observer := recordingResultsObserver{} session := NewSafeSession(&vtgatepb.Session{}) - _, err := sc.ExecuteMultiShard(ctx, nil, rss, queries, session, false, false) + _, err := sc.ExecuteMultiShard(ctx, nil, rss, queries, session, false, false, &observer) require.NoError(t, vterrors.Aggregate(err)) if len(sbc0.Queries) == 0 || len(sbc1.Queries) == 0 { t.Fatalf("didn't get expected query") @@ -428,8 +447,12 @@ func TestMultiExecs(t *testing.T) { if !reflect.DeepEqual(sbc1.Queries[0].BindVariables, wantVars1) { t.Errorf("got %+v, want %+v", sbc0.Queries[0].BindVariables, wantVars1) } + assert.ElementsMatch(t, results, observer.recorded) + sbc0.Queries = nil sbc1.Queries = nil + sbc0.SetResults(results[0:1]) + sbc1.SetResults(results[1:2]) rss = []*srvtopo.ResolvedShard{ { @@ -455,15 +478,18 @@ func TestMultiExecs(t *testing.T) { "bv1": sqltypes.Int64BindVariable(1), }, } + + observer = recordingResultsObserver{} _ = sc.StreamExecuteMulti(ctx, nil, "query", rss, bvs, session, false /* autocommit */, func(*sqltypes.Result) error { return nil - }) + }, &observer) if !reflect.DeepEqual(sbc0.Queries[0].BindVariables, wantVars0) { t.Errorf("got %+v, want %+v", sbc0.Queries[0].BindVariables, wantVars0) } if !reflect.DeepEqual(sbc1.Queries[0].BindVariables, wantVars1) { t.Errorf("got %+v, want %+v", sbc0.Queries[0].BindVariables, wantVars1) } + assert.ElementsMatch(t, results, observer.recorded) } func TestScatterConnSingleDB(t *testing.T) { @@ -487,27 +513,27 @@ func TestScatterConnSingleDB(t *testing.T) { // TransactionMode_SINGLE in session session := NewSafeSession(&vtgatepb.Session{InTransaction: true, TransactionMode: vtgatepb.TransactionMode_SINGLE}) queries := []*querypb.BoundQuery{{Sql: "query1"}} - _, errors := sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + _, errors := sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) require.Empty(t, errors) - _, errors = sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + _, errors = sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) require.Error(t, errors[0]) assert.Contains(t, errors[0].Error(), want) // TransactionMode_SINGLE in txconn sc.txConn.mode = vtgatepb.TransactionMode_SINGLE session = NewSafeSession(&vtgatepb.Session{InTransaction: true}) - _, errors = sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + _, errors = sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) require.Empty(t, errors) - _, errors = sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + _, errors = sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) require.Error(t, errors[0]) assert.Contains(t, errors[0].Error(), want) // TransactionMode_MULTI in txconn. Should not fail. sc.txConn.mode = vtgatepb.TransactionMode_MULTI session = NewSafeSession(&vtgatepb.Session{InTransaction: true}) - _, errors = sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + _, errors = sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) require.Empty(t, errors) - _, errors = sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + _, errors = sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) require.Empty(t, errors) } @@ -594,6 +620,6 @@ func newTestScatterConn(ctx context.Context, hc discovery.HealthCheck, serv srvt // in '-cells_to_watch' command line parameter, which is // empty by default. So it's unused in this test, set to nil. gw := NewTabletGateway(ctx, hc, serv, cell) - tc := NewTxConn(gw, vtgatepb.TransactionMode_TWOPC) + tc := NewTxConn(gw, vtgatepb.TransactionMode_MULTI) return NewScatterConn("", tc, gw) } diff --git a/go/vt/vtgate/logstats/logstats.go b/go/vt/vtgate/logstats/logstats.go index 8f8ba41e3cd..fdc0e69c8db 100644 --- a/go/vt/vtgate/logstats/logstats.go +++ b/go/vt/vtgate/logstats/logstats.go @@ -33,25 +33,28 @@ import ( // LogStats records the stats for a single vtgate query type LogStats struct { - Ctx context.Context - Method string - TabletType string - StmtType string - SQL string - BindVariables map[string]*querypb.BindVariable - StartTime time.Time - EndTime time.Time - ShardQueries uint64 - RowsAffected uint64 - RowsReturned uint64 - PlanTime time.Duration - ExecuteTime time.Duration - CommitTime time.Duration - Error error - TablesUsed []string - SessionUUID string - CachedPlan bool - ActiveKeyspace string // ActiveKeyspace is the selected keyspace `use ks` + Ctx context.Context + Method string + TabletType string + StmtType string + SQL string + BindVariables map[string]*querypb.BindVariable + StartTime time.Time + EndTime time.Time + ShardQueries uint64 + RowsAffected uint64 + RowsReturned uint64 + PlanTime time.Duration + ExecuteTime time.Duration + CommitTime time.Duration + Error error + TablesUsed []string + SessionUUID string + CachedPlan bool + ActiveKeyspace string // ActiveKeyspace is the selected keyspace `use ks` + MirrorSourceExecuteTime time.Duration + MirrorTargetExecuteTime time.Duration + MirrorTargetError error } // NewLogStats constructs a new LogStats with supplied Method and ctx @@ -116,6 +119,14 @@ func (stats *LogStats) RemoteAddrUsername() (string, string) { return ci.RemoteAddr(), ci.Username() } +// MirorTargetErrorStr returns the mirror target error string or "" +func (stats *LogStats) MirrorTargetErrorStr() string { + if stats.MirrorTargetError != nil { + return stats.MirrorTargetError.Error() + } + return "" +} + // Logf formats the log record to the given writer, either as // tab-separated list of logged fields or as JSON. func (stats *LogStats) Logf(w io.Writer, params url.Values) error { @@ -177,6 +188,12 @@ func (stats *LogStats) Logf(w io.Writer, params url.Values) error { log.Strings(stats.TablesUsed) log.Key("ActiveKeyspace") log.String(stats.ActiveKeyspace) + log.Key("MirrorSourceExecuteTime") + log.Duration(stats.MirrorSourceExecuteTime) + log.Key("MirrorTargetExecuteTime") + log.Duration(stats.MirrorTargetExecuteTime) + log.Key("MirrorTargetError") + log.String(stats.MirrorTargetErrorStr()) return log.Flush(w) } diff --git a/go/vt/vtgate/logstats/logstats_test.go b/go/vt/vtgate/logstats/logstats_test.go index ae3c01e0f0b..872b34c6964 100644 --- a/go/vt/vtgate/logstats/logstats_test.go +++ b/go/vt/vtgate/logstats/logstats_test.go @@ -79,42 +79,42 @@ func TestLogStatsFormat(t *testing.T) { { // 0 redact: false, format: "text", - expected: "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"PRIMARY\"\t\"suuid\"\tfalse\t[\"ks1.tbl1\",\"ks2.tbl2\"]\t\"db\"\n", + expected: "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"PRIMARY\"\t\"suuid\"\tfalse\t[\"ks1.tbl1\",\"ks2.tbl2\"]\t\"db\"\t0.000000\t0.000000\t\"\"\n", bindVars: intBindVar, }, { // 1 redact: true, format: "text", - expected: "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1\"\t\"[REDACTED]\"\t0\t0\t\"\"\t\"PRIMARY\"\t\"suuid\"\tfalse\t[\"ks1.tbl1\",\"ks2.tbl2\"]\t\"db\"\n", + expected: "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1\"\t\"[REDACTED]\"\t0\t0\t\"\"\t\"PRIMARY\"\t\"suuid\"\tfalse\t[\"ks1.tbl1\",\"ks2.tbl2\"]\t\"db\"\t0.000000\t0.000000\t\"\"\n", bindVars: intBindVar, }, { // 2 redact: false, format: "json", - expected: "{\"ActiveKeyspace\":\"db\",\"BindVars\":{\"intVal\":{\"type\":\"INT64\",\"value\":1}},\"Cached Plan\":false,\"CommitTime\":0,\"Effective Caller\":\"\",\"End\":\"2017-01-01 01:02:04.000001\",\"Error\":\"\",\"ExecuteTime\":0,\"ImmediateCaller\":\"\",\"Method\":\"test\",\"PlanTime\":0,\"RemoteAddr\":\"\",\"RowsAffected\":0,\"SQL\":\"sql1\",\"SessionUUID\":\"suuid\",\"ShardQueries\":0,\"Start\":\"2017-01-01 01:02:03.000000\",\"StmtType\":\"\",\"TablesUsed\":[\"ks1.tbl1\",\"ks2.tbl2\"],\"TabletType\":\"PRIMARY\",\"TotalTime\":1.000001,\"Username\":\"\"}", + expected: "{\"ActiveKeyspace\":\"db\",\"BindVars\":{\"intVal\":{\"type\":\"INT64\",\"value\":1}},\"Cached Plan\":false,\"CommitTime\":0,\"Effective Caller\":\"\",\"End\":\"2017-01-01 01:02:04.000001\",\"Error\":\"\",\"ExecuteTime\":0,\"ImmediateCaller\":\"\",\"Method\":\"test\",\"MirrorSourceExecuteTime\":0,\"MirrorTargetError\":\"\",\"MirrorTargetExecuteTime\":0,\"PlanTime\":0,\"RemoteAddr\":\"\",\"RowsAffected\":0,\"SQL\":\"sql1\",\"SessionUUID\":\"suuid\",\"ShardQueries\":0,\"Start\":\"2017-01-01 01:02:03.000000\",\"StmtType\":\"\",\"TablesUsed\":[\"ks1.tbl1\",\"ks2.tbl2\"],\"TabletType\":\"PRIMARY\",\"TotalTime\":1.000001,\"Username\":\"\"}", bindVars: intBindVar, }, { // 3 redact: true, format: "json", - expected: "{\"ActiveKeyspace\":\"db\",\"BindVars\":\"[REDACTED]\",\"Cached Plan\":false,\"CommitTime\":0,\"Effective Caller\":\"\",\"End\":\"2017-01-01 01:02:04.000001\",\"Error\":\"\",\"ExecuteTime\":0,\"ImmediateCaller\":\"\",\"Method\":\"test\",\"PlanTime\":0,\"RemoteAddr\":\"\",\"RowsAffected\":0,\"SQL\":\"sql1\",\"SessionUUID\":\"suuid\",\"ShardQueries\":0,\"Start\":\"2017-01-01 01:02:03.000000\",\"StmtType\":\"\",\"TablesUsed\":[\"ks1.tbl1\",\"ks2.tbl2\"],\"TabletType\":\"PRIMARY\",\"TotalTime\":1.000001,\"Username\":\"\"}", + expected: "{\"ActiveKeyspace\":\"db\",\"BindVars\":\"[REDACTED]\",\"Cached Plan\":false,\"CommitTime\":0,\"Effective Caller\":\"\",\"End\":\"2017-01-01 01:02:04.000001\",\"Error\":\"\",\"ExecuteTime\":0,\"ImmediateCaller\":\"\",\"Method\":\"test\",\"MirrorSourceExecuteTime\":0,\"MirrorTargetError\":\"\",\"MirrorTargetExecuteTime\":0,\"PlanTime\":0,\"RemoteAddr\":\"\",\"RowsAffected\":0,\"SQL\":\"sql1\",\"SessionUUID\":\"suuid\",\"ShardQueries\":0,\"Start\":\"2017-01-01 01:02:03.000000\",\"StmtType\":\"\",\"TablesUsed\":[\"ks1.tbl1\",\"ks2.tbl2\"],\"TabletType\":\"PRIMARY\",\"TotalTime\":1.000001,\"Username\":\"\"}", bindVars: intBindVar, }, { // 4 redact: false, format: "text", - expected: "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1\"\t{\"strVal\": {\"type\": \"VARCHAR\", \"value\": \"abc\"}}\t0\t0\t\"\"\t\"PRIMARY\"\t\"suuid\"\tfalse\t[\"ks1.tbl1\",\"ks2.tbl2\"]\t\"db\"\n", + expected: "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1\"\t{\"strVal\": {\"type\": \"VARCHAR\", \"value\": \"abc\"}}\t0\t0\t\"\"\t\"PRIMARY\"\t\"suuid\"\tfalse\t[\"ks1.tbl1\",\"ks2.tbl2\"]\t\"db\"\t0.000000\t0.000000\t\"\"\n", bindVars: stringBindVar, }, { // 5 redact: true, format: "text", - expected: "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1\"\t\"[REDACTED]\"\t0\t0\t\"\"\t\"PRIMARY\"\t\"suuid\"\tfalse\t[\"ks1.tbl1\",\"ks2.tbl2\"]\t\"db\"\n", + expected: "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1\"\t\"[REDACTED]\"\t0\t0\t\"\"\t\"PRIMARY\"\t\"suuid\"\tfalse\t[\"ks1.tbl1\",\"ks2.tbl2\"]\t\"db\"\t0.000000\t0.000000\t\"\"\n", bindVars: stringBindVar, }, { // 6 redact: false, format: "json", - expected: "{\"ActiveKeyspace\":\"db\",\"BindVars\":{\"strVal\":{\"type\":\"VARCHAR\",\"value\":\"abc\"}},\"Cached Plan\":false,\"CommitTime\":0,\"Effective Caller\":\"\",\"End\":\"2017-01-01 01:02:04.000001\",\"Error\":\"\",\"ExecuteTime\":0,\"ImmediateCaller\":\"\",\"Method\":\"test\",\"PlanTime\":0,\"RemoteAddr\":\"\",\"RowsAffected\":0,\"SQL\":\"sql1\",\"SessionUUID\":\"suuid\",\"ShardQueries\":0,\"Start\":\"2017-01-01 01:02:03.000000\",\"StmtType\":\"\",\"TablesUsed\":[\"ks1.tbl1\",\"ks2.tbl2\"],\"TabletType\":\"PRIMARY\",\"TotalTime\":1.000001,\"Username\":\"\"}", + expected: "{\"ActiveKeyspace\":\"db\",\"BindVars\":{\"strVal\":{\"type\":\"VARCHAR\",\"value\":\"abc\"}},\"Cached Plan\":false,\"CommitTime\":0,\"Effective Caller\":\"\",\"End\":\"2017-01-01 01:02:04.000001\",\"Error\":\"\",\"ExecuteTime\":0,\"ImmediateCaller\":\"\",\"Method\":\"test\",\"MirrorSourceExecuteTime\":0,\"MirrorTargetError\":\"\",\"MirrorTargetExecuteTime\":0,\"PlanTime\":0,\"RemoteAddr\":\"\",\"RowsAffected\":0,\"SQL\":\"sql1\",\"SessionUUID\":\"suuid\",\"ShardQueries\":0,\"Start\":\"2017-01-01 01:02:03.000000\",\"StmtType\":\"\",\"TablesUsed\":[\"ks1.tbl1\",\"ks2.tbl2\"],\"TabletType\":\"PRIMARY\",\"TotalTime\":1.000001,\"Username\":\"\"}", bindVars: stringBindVar, }, { // 7 redact: true, format: "json", - expected: "{\"ActiveKeyspace\":\"db\",\"BindVars\":\"[REDACTED]\",\"Cached Plan\":false,\"CommitTime\":0,\"Effective Caller\":\"\",\"End\":\"2017-01-01 01:02:04.000001\",\"Error\":\"\",\"ExecuteTime\":0,\"ImmediateCaller\":\"\",\"Method\":\"test\",\"PlanTime\":0,\"RemoteAddr\":\"\",\"RowsAffected\":0,\"SQL\":\"sql1\",\"SessionUUID\":\"suuid\",\"ShardQueries\":0,\"Start\":\"2017-01-01 01:02:03.000000\",\"StmtType\":\"\",\"TablesUsed\":[\"ks1.tbl1\",\"ks2.tbl2\"],\"TabletType\":\"PRIMARY\",\"TotalTime\":1.000001,\"Username\":\"\"}", + expected: "{\"ActiveKeyspace\":\"db\",\"BindVars\":\"[REDACTED]\",\"Cached Plan\":false,\"CommitTime\":0,\"Effective Caller\":\"\",\"End\":\"2017-01-01 01:02:04.000001\",\"Error\":\"\",\"ExecuteTime\":0,\"ImmediateCaller\":\"\",\"Method\":\"test\",\"MirrorSourceExecuteTime\":0,\"MirrorTargetError\":\"\",\"MirrorTargetExecuteTime\":0,\"PlanTime\":0,\"RemoteAddr\":\"\",\"RowsAffected\":0,\"SQL\":\"sql1\",\"SessionUUID\":\"suuid\",\"ShardQueries\":0,\"Start\":\"2017-01-01 01:02:03.000000\",\"StmtType\":\"\",\"TablesUsed\":[\"ks1.tbl1\",\"ks2.tbl2\"],\"TabletType\":\"PRIMARY\",\"TotalTime\":1.000001,\"Username\":\"\"}", bindVars: stringBindVar, }, } @@ -156,12 +156,12 @@ func TestLogStatsFilter(t *testing.T) { params := map[string][]string{"full": {}} got := testFormat(t, logStats, params) - want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\n" + want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) streamlog.SetQueryLogFilterTag("LOG_THIS_QUERY") got = testFormat(t, logStats, params) - want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\n" + want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) streamlog.SetQueryLogFilterTag("NOT_THIS_QUERY") @@ -179,12 +179,12 @@ func TestLogStatsRowThreshold(t *testing.T) { params := map[string][]string{"full": {}} got := testFormat(t, logStats, params) - want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\n" + want := "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) streamlog.SetQueryLogRowThreshold(0) got = testFormat(t, logStats, params) - want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\n" + want = "test\t\t\t''\t''\t2017-01-01 01:02:03.000000\t2017-01-01 01:02:04.000001\t1.000001\t0.000000\t0.000000\t0.000000\t\t\"sql1 /* LOG_THIS_QUERY */\"\t{\"intVal\": {\"type\": \"INT64\", \"value\": 1}}\t0\t0\t\"\"\t\"\"\t\"\"\tfalse\t[]\t\"\"\t0.000000\t0.000000\t\"\"\n" assert.Equal(t, want, got) streamlog.SetQueryLogRowThreshold(1) got = testFormat(t, logStats, params) @@ -215,6 +215,18 @@ func TestLogStatsErrorStr(t *testing.T) { } } +func TestLogStatsMirrorTargetErrorStr(t *testing.T) { + logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}) + if logStats.MirrorTargetErrorStr() != "" { + t.Fatalf("should not get error in stats, but got: %s", logStats.ErrorStr()) + } + errStr := "unknown error" + logStats.MirrorTargetError = errors.New(errStr) + if !strings.Contains(logStats.MirrorTargetErrorStr(), errStr) { + t.Fatalf("expect string '%s' in error message, but got: %s", errStr, logStats.ErrorStr()) + } +} + func TestLogStatsRemoteAddrUsername(t *testing.T) { logStats := NewLogStats(context.Background(), "test", "sql1", "", map[string]*querypb.BindVariable{}) addr, user := logStats.RemoteAddrUsername() diff --git a/go/vt/vtgate/plan_execute.go b/go/vt/vtgate/plan_execute.go index 199892842ee..1c0915470ef 100644 --- a/go/vt/vtgate/plan_execute.go +++ b/go/vt/vtgate/plan_execute.go @@ -24,19 +24,20 @@ import ( "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/log" + querypb "vitess.io/vitess/go/vt/proto/query" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/engine" "vitess.io/vitess/go/vt/vtgate/logstats" "vitess.io/vitess/go/vt/vtgate/vtgateservice" - - querypb "vitess.io/vitess/go/vt/proto/query" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) type planExec func(ctx context.Context, plan *engine.Plan, vc *vcursorImpl, bindVars map[string]*querypb.BindVariable, startTime time.Time) error type txResult func(sqlparser.StatementType, *sqltypes.Result) error +var vschemaWaitTimeout = 30 * time.Second + func waitForNewerVSchema(ctx context.Context, e *Executor, lastVSchemaCreated time.Time, timeout time.Duration) bool { pollingInterval := 10 * time.Millisecond waitCtx, cancel := context.WithTimeout(ctx, timeout) @@ -90,6 +91,7 @@ func (e *Executor) newExecute( lastVSchemaCreated = vs.GetCreated() result *sqltypes.Result plan *engine.Plan + cancel context.CancelFunc ) for try := 0; try < MaxBufferingRetries; try++ { @@ -104,7 +106,10 @@ func (e *Executor) newExecute( // based on the buffering configuration. This way we should be able to perform the max retries // within the given window of time for most queries and we should not end up waiting too long // after the traffic switch fails or the buffer window has ended, retrying old queries. - timeout := e.resolver.scatterConn.gateway.buffer.GetConfig().MaxFailoverDuration / (MaxBufferingRetries - 1) + timeout := vschemaWaitTimeout + if e.resolver.scatterConn.gateway.buffer != nil && e.resolver.scatterConn.gateway.buffer.GetConfig() != nil { + timeout = e.resolver.scatterConn.gateway.buffer.GetConfig().MaxFailoverDuration / (MaxBufferingRetries - 1) + } if waitForNewerVSchema(ctx, e, lastVSchemaCreated, timeout) { vs = e.VSchema() lastVSchemaCreated = vs.GetCreated() @@ -140,6 +145,12 @@ func (e *Executor) newExecute( safeSession.RecordWarning(warning) } + // set the overall query timeout if it is not already set + if vcursor.queryTimeout > 0 && cancel == nil { + ctx, cancel = context.WithTimeout(ctx, vcursor.queryTimeout) + defer cancel() + } + result, err = e.handleTransactions(ctx, mysqlCtx, safeSession, plan, logStats, vcursor, stmt) if err != nil { return err diff --git a/go/vt/vtgate/planbuilder/builder.go b/go/vt/vtgate/planbuilder/builder.go index 5d1d4ecd622..27b994b1730 100644 --- a/go/vt/vtgate/planbuilder/builder.go +++ b/go/vt/vtgate/planbuilder/builder.go @@ -73,11 +73,14 @@ func TestBuilder(query string, vschema plancontext.VSchema, keyspace string) (*e // Store the foreign key mode like we do for vcursor. vw, isVw := vschema.(*vschemawrapper.VSchemaWrapper) if isVw { - fkState := sqlparser.ForeignKeyChecksState(stmt) - if fkState != nil { + qh, err := sqlparser.BuildQueryHints(stmt) + if err != nil { + return nil, err + } + if qh.ForeignKeyChecks != nil { // Restore the old volue of ForeignKeyChecksState to not interfere with the next test cases. oldVal := vw.ForeignKeyChecksState - vw.ForeignKeyChecksState = fkState + vw.ForeignKeyChecksState = qh.ForeignKeyChecks defer func() { vw.ForeignKeyChecksState = oldVal }() diff --git a/go/vt/vtgate/planbuilder/ddl.go b/go/vt/vtgate/planbuilder/ddl.go index 4c4b3791c20..f4b8ab6976f 100644 --- a/go/vt/vtgate/planbuilder/ddl.go +++ b/go/vt/vtgate/planbuilder/ddl.go @@ -45,7 +45,7 @@ func (fk *fkContraint) FkWalk(node sqlparser.SQLNode) (kontinue bool, err error) // and which chooses which of the two to invoke at runtime. func buildGeneralDDLPlan(ctx context.Context, sql string, ddlStatement sqlparser.DDLStatement, reservedVars *sqlparser.ReservedVars, vschema plancontext.VSchema, enableOnlineDDL, enableDirectDDL bool) (*planResult, error) { if vschema.Destination() != nil { - return buildByPassPlan(sql, vschema) + return buildByPassPlan(sql, vschema, true) } normalDDLPlan, onlineDDLPlan, err := buildDDLPlans(ctx, sql, ddlStatement, reservedVars, vschema, enableOnlineDDL, enableDirectDDL) if err != nil { @@ -80,7 +80,7 @@ func buildGeneralDDLPlan(ctx context.Context, sql string, ddlStatement sqlparser return newPlanResult(eddl, tc.getTables()...), nil } -func buildByPassPlan(sql string, vschema plancontext.VSchema) (*planResult, error) { +func buildByPassPlan(sql string, vschema plancontext.VSchema, isDDL bool) (*planResult, error) { keyspace, err := vschema.DefaultKeyspace() if err != nil { return nil, err @@ -89,6 +89,7 @@ func buildByPassPlan(sql string, vschema plancontext.VSchema) (*planResult, erro Keyspace: keyspace, TargetDestination: vschema.Destination(), Query: sql, + IsDDL: isDDL, } return newPlanResult(send), nil } diff --git a/go/vt/vtgate/planbuilder/operator_transformers.go b/go/vt/vtgate/planbuilder/operator_transformers.go index 546a9854f26..a22719b4489 100644 --- a/go/vt/vtgate/planbuilder/operator_transformers.go +++ b/go/vt/vtgate/planbuilder/operator_transformers.go @@ -77,11 +77,31 @@ func transformToPrimitive(ctx *plancontext.PlanningContext, op operators.Operato return transformSequential(ctx, op) case *operators.DMLWithInput: return transformDMLWithInput(ctx, op) + case *operators.RecurseCTE: + return transformRecurseCTE(ctx, op) + case *operators.PercentBasedMirror: + return transformPercentBasedMirror(ctx, op) } return nil, vterrors.VT13001(fmt.Sprintf("unknown type encountered: %T (transformToPrimitive)", op)) } +func transformPercentBasedMirror(ctx *plancontext.PlanningContext, op *operators.PercentBasedMirror) (engine.Primitive, error) { + primitive, err := transformToPrimitive(ctx, op.Operator()) + if err != nil { + return nil, err + } + + target, err := transformToPrimitive(ctx.UseMirror(), op.Target()) + // Mirroring is best-effort. If we encounter an error while building the + // mirror target primitive, proceed without mirroring. + if err != nil { + return primitive, nil + } + + return engine.NewPercentBasedMirror(op.Percent, primitive, target), nil +} + func transformDMLWithInput(ctx *plancontext.PlanningContext, op *operators.DMLWithInput) (engine.Primitive, error) { input, err := transformToPrimitive(ctx, op.Source) if err != nil { @@ -149,7 +169,7 @@ func transformSequential(ctx *plancontext.PlanningContext, op *operators.Sequent } func transformInsertionSelection(ctx *plancontext.PlanningContext, op *operators.InsertSelection) (engine.Primitive, error) { - rb, isRoute := op.Insert.(*operators.Route) + rb, isRoute := op.Insert().(*operators.Route) if !isRoute { return nil, vterrors.VT13001(fmt.Sprintf("Incorrect type encountered: %T (transformInsertionSelection)", op.Insert)) } @@ -178,7 +198,7 @@ func transformInsertionSelection(ctx *plancontext.PlanningContext, op *operators eins.Prefix, _, eins.Suffix = generateInsertShardedQuery(ins.AST) - selectionPlan, err := transformToPrimitive(ctx, op.Select) + selectionPlan, err := transformToPrimitive(ctx, op.Select()) if err != nil { return nil, err } @@ -288,7 +308,6 @@ func transformFkVerify(ctx *plancontext.PlanningContext, fkv *operators.FkVerify Verify: verify, Exec: inputLP, }, nil - } func transformAggregator(ctx *plancontext.PlanningContext, op *operators.Aggregator) (engine.Primitive, error) { @@ -451,7 +470,6 @@ func getEvalEngineExpr(ctx *plancontext.PlanningContext, pe *operators.ProjExpr) default: return nil, vterrors.VT13001("project not planned for: %s", pe.String()) } - } // newSimpleProjection creates a simple projections @@ -981,6 +999,22 @@ func transformVindexPlan(ctx *plancontext.PlanningContext, op *operators.Vindex) return prim, nil } +func transformRecurseCTE(ctx *plancontext.PlanningContext, op *operators.RecurseCTE) (engine.Primitive, error) { + seed, err := transformToPrimitive(ctx, op.Seed()) + if err != nil { + return nil, err + } + term, err := transformToPrimitive(ctx, op.Term()) + if err != nil { + return nil, err + } + return &engine.RecurseCTE{ + Seed: seed, + Term: term, + Vars: op.Vars, + }, nil +} + func generateQuery(statement sqlparser.Statement) string { buf := sqlparser.NewTrackedBuffer(dmlFormatter) statement.Format(buf) diff --git a/go/vt/vtgate/planbuilder/operators/SQL_builder.go b/go/vt/vtgate/planbuilder/operators/SQL_builder.go index 08cf3c4801c..20af2a698c3 100644 --- a/go/vt/vtgate/planbuilder/operators/SQL_builder.go +++ b/go/vt/vtgate/planbuilder/operators/SQL_builder.go @@ -55,7 +55,36 @@ func ToSQL(ctx *plancontext.PlanningContext, op Operator) (_ sqlparser.Statement return q.stmt, q.dmlOperator, nil } +// includeTable will return false if the table is a CTE, and it is not merged +// it will return true if the table is not a CTE or if it is a CTE and it is merged +func (qb *queryBuilder) includeTable(op *Table) bool { + if qb.ctx.SemTable == nil { + return true + } + tbl, err := qb.ctx.SemTable.TableInfoFor(op.QTable.ID) + if err != nil { + panic(err) + } + cteTbl, isCTE := tbl.(*semantics.CTETable) + if !isCTE { + return true + } + + return cteTbl.Merged +} + func (qb *queryBuilder) addTable(db, tableName, alias string, tableID semantics.TableSet, hints sqlparser.IndexHints) { + if tableID.NumberOfTables() == 1 && qb.ctx.SemTable != nil { + tblInfo, err := qb.ctx.SemTable.TableInfoFor(tableID) + if err != nil { + panic(err) + } + cte, isCTE := tblInfo.(*semantics.CTETable) + if isCTE { + tableName = cte.TableName + db = "" + } + } tableExpr := sqlparser.TableName{ Name: sqlparser.NewIdentifierCS(tableName), Qualifier: sqlparser.NewIdentifierCS(db), @@ -105,6 +134,12 @@ func (qb *queryBuilder) addPredicate(expr sqlparser.Expr) { addPred = stmt.AddWhere case *sqlparser.Delete: addPred = stmt.AddWhere + case nil: + // this would happen if we are adding a predicate on a dual query. + // we use this when building recursive CTE queries + sel := &sqlparser.Select{} + addPred = sel.AddWhere + qb.stmt = sel default: panic(fmt.Sprintf("cant add WHERE to %T", qb.stmt)) } @@ -207,6 +242,27 @@ func (qb *queryBuilder) unionWith(other *queryBuilder, distinct bool) { } } +func (qb *queryBuilder) recursiveCteWith(other *queryBuilder, name, alias string, distinct bool) { + cteUnion := &sqlparser.Union{ + Left: qb.stmt.(sqlparser.SelectStatement), + Right: other.stmt.(sqlparser.SelectStatement), + Distinct: distinct, + } + + qb.stmt = &sqlparser.Select{ + With: &sqlparser.With{ + Recursive: true, + CTEs: []*sqlparser.CommonTableExpr{{ + ID: sqlparser.NewIdentifierCS(name), + Columns: nil, + Subquery: cteUnion, + }}, + }, + } + + qb.addTable("", name, alias, "", nil) +} + type FromStatement interface { GetFrom() []sqlparser.TableExpr SetFrom([]sqlparser.TableExpr) @@ -401,6 +457,8 @@ func buildQuery(op Operator, qb *queryBuilder) { buildDelete(op, qb) case *Insert: buildDML(op, qb) + case *RecurseCTE: + buildRecursiveCTE(op, qb) default: panic(vterrors.VT13001(fmt.Sprintf("unknown operator to convert to SQL: %T", op))) } @@ -492,6 +550,10 @@ func buildLimit(op *Limit, qb *queryBuilder) { } func buildTable(op *Table, qb *queryBuilder) { + if !qb.includeTable(op) { + return + } + dbName := "" if op.QTable.IsInfSchema { @@ -551,7 +613,16 @@ func buildApplyJoin(op *ApplyJoin, qb *queryBuilder) { qbR := &queryBuilder{ctx: qb.ctx} buildQuery(op.RHS, qbR) - qb.joinWith(qbR, pred, op.JoinType) + + switch { + // if we have a recursive cte, we might be missing a statement from one of the sides + case qbR.stmt == nil: + // do nothing + case qb.stmt == nil: + qb.stmt = qbR.stmt + default: + qb.joinWith(qbR, pred, op.JoinType) + } } func buildUnion(op *Union, qb *queryBuilder) { @@ -636,6 +707,28 @@ func buildHorizon(op *Horizon, qb *queryBuilder) { sqlparser.RemoveKeyspaceInCol(qb.stmt) } +func buildRecursiveCTE(op *RecurseCTE, qb *queryBuilder) { + predicates := slice.Map(op.Predicates, func(jc *plancontext.RecurseExpression) sqlparser.Expr { + // since we are adding these join predicates, we need to mark to broken up version (RHSExpr) of it as done + err := qb.ctx.SkipJoinPredicates(jc.Original) + if err != nil { + panic(err) + } + return jc.Original + }) + pred := sqlparser.AndExpressions(predicates...) + buildQuery(op.Seed(), qb) + qbR := &queryBuilder{ctx: qb.ctx} + buildQuery(op.Term(), qbR) + qbR.addPredicate(pred) + infoFor, err := qb.ctx.SemTable.TableInfoFor(op.OuterID) + if err != nil { + panic(err) + } + + qb.recursiveCteWith(qbR, op.Def.Name, infoFor.GetAliasedTableExpr().As.String(), op.Distinct) +} + func mergeHaving(h1, h2 *sqlparser.Where) *sqlparser.Where { switch { case h1 == nil && h2 == nil: diff --git a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go index 671f4b78954..73169369a41 100644 --- a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go +++ b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go @@ -460,8 +460,8 @@ func createJoinPusher(rootAggr *Aggregator, operator Operator) *joinPusher { return &joinPusher{ orig: rootAggr, pushed: &Aggregator{ - Source: operator, - QP: rootAggr.QP, + unaryOperator: newUnaryOp(operator), + QP: rootAggr.QP, }, columns: initColReUse(len(rootAggr.Columns)), tableID: TableID(operator), diff --git a/go/vt/vtgate/planbuilder/operators/aggregator.go b/go/vt/vtgate/planbuilder/operators/aggregator.go index bb969912f4f..f353ee02d1e 100644 --- a/go/vt/vtgate/planbuilder/operators/aggregator.go +++ b/go/vt/vtgate/planbuilder/operators/aggregator.go @@ -34,7 +34,7 @@ type ( // Both all aggregations and no grouping, and the inverse // of all grouping and no aggregations are valid configurations of this operator Aggregator struct { - Source Operator + unaryOperator Columns []*sqlparser.AliasedExpr WithRollup bool @@ -57,6 +57,9 @@ type ( // This is used to truncate the columns in the final result ResultColumns int + // Truncate is set to true if the columns produced by this operator should be truncated if we added any additional columns + Truncate bool + QP *QueryProjection DT *DerivedTable @@ -72,17 +75,6 @@ func (a *Aggregator) Clone(inputs []Operator) Operator { return &kopy } -func (a *Aggregator) Inputs() []Operator { - return []Operator{a.Source} -} - -func (a *Aggregator) SetInputs(operators []Operator) { - if len(operators) != 1 { - panic(fmt.Sprintf("unexpected number of operators as input in aggregator: %d", len(operators))) - } - a.Source = operators[0] -} - func (a *Aggregator) AddPredicate(_ *plancontext.PlanningContext, expr sqlparser.Expr) Operator { return newFilter(a, expr) } @@ -151,6 +143,8 @@ func (a *Aggregator) checkOffset(offset int) { } func (a *Aggregator) AddColumn(ctx *plancontext.PlanningContext, reuse bool, groupBy bool, ae *sqlparser.AliasedExpr) (offset int) { + a.planOffsets(ctx) + defer func() { a.checkOffset(offset) }() @@ -199,6 +193,10 @@ func (a *Aggregator) AddColumn(ctx *plancontext.PlanningContext, reuse bool, gro } func (a *Aggregator) AddWSColumn(ctx *plancontext.PlanningContext, offset int, underRoute bool) int { + if !underRoute { + a.planOffsets(ctx) + } + if len(a.Columns) <= offset { panic(vterrors.VT13001("offset out of range")) } @@ -221,7 +219,7 @@ func (a *Aggregator) AddWSColumn(ctx *plancontext.PlanningContext, offset int, u } if expr == nil { - for _, aggr := range a.Aggregations { + for i, aggr := range a.Aggregations { if aggr.ColOffset != offset { continue } @@ -230,9 +228,13 @@ func (a *Aggregator) AddWSColumn(ctx *plancontext.PlanningContext, offset int, u return aggr.WSOffset } - panic(vterrors.VT13001("expected to find a weight string for aggregation")) + a.Aggregations[i].WSOffset = len(a.Columns) + expr = a.Columns[offset].Expr + break } + } + if expr == nil { panic(vterrors.VT13001("could not find expression at offset")) } @@ -515,7 +517,7 @@ func (a *Aggregator) pushRemainingGroupingColumnsAndWeightStrings(ctx *planconte continue } - offset := a.internalAddColumn(ctx, aeWrap(weightStringFor(gb.Inner)), false) + offset := a.internalAddWSColumn(ctx, a.Grouping[idx].ColOffset, aeWrap(weightStringFor(gb.Inner))) a.Grouping[idx].WSOffset = offset } for idx, aggr := range a.Aggregations { @@ -524,11 +526,28 @@ func (a *Aggregator) pushRemainingGroupingColumnsAndWeightStrings(ctx *planconte } arg := aggr.getPushColumn() - offset := a.internalAddColumn(ctx, aeWrap(weightStringFor(arg)), false) + offset := a.internalAddWSColumn(ctx, aggr.ColOffset, aeWrap(weightStringFor(arg))) + a.Aggregations[idx].WSOffset = offset } } +func (a *Aggregator) internalAddWSColumn(ctx *plancontext.PlanningContext, inOffset int, aliasedExpr *sqlparser.AliasedExpr) int { + if a.ResultColumns == 0 && a.Truncate { + // if we need to use `internalAddColumn`, it means we are adding columns that are not part of the original list, + // so we need to set the ResultColumns to the current length of the columns list + a.ResultColumns = len(a.Columns) + } + + offset := a.Source.AddWSColumn(ctx, inOffset, false) + + if offset == len(a.Columns) { + // if we get an offset at the end of our current column list, it means we added a new column + a.Columns = append(a.Columns, aliasedExpr) + } + return offset +} + func (a *Aggregator) setTruncateColumnCount(offset int) { a.ResultColumns = offset } @@ -538,7 +557,7 @@ func (a *Aggregator) getTruncateColumnCount() int { } func (a *Aggregator) internalAddColumn(ctx *plancontext.PlanningContext, aliasedExpr *sqlparser.AliasedExpr, addToGroupBy bool) int { - if a.ResultColumns == 0 { + if a.ResultColumns == 0 && a.Truncate { // if we need to use `internalAddColumn`, it means we are adding columns that are not part of the original list, // so we need to set the ResultColumns to the current length of the columns list a.ResultColumns = len(a.Columns) diff --git a/go/vt/vtgate/planbuilder/operators/apply_join.go b/go/vt/vtgate/planbuilder/operators/apply_join.go index cd8f7b94dd5..80bf74708a8 100644 --- a/go/vt/vtgate/planbuilder/operators/apply_join.go +++ b/go/vt/vtgate/planbuilder/operators/apply_join.go @@ -32,13 +32,11 @@ type ( // ApplyJoin is a nested loop join - for each row on the LHS, // we'll execute the plan on the RHS, feeding data from left to right ApplyJoin struct { - LHS, RHS Operator + binaryOperator // JoinType is permitted to store only 3 of the possible values // NormalJoinType, StraightJoinType and LeftJoinType. JoinType sqlparser.JoinType - // LeftJoin will be true in the case of an outer join - LeftJoin bool // JoinColumns keeps track of what AST expression is represented in the Columns array JoinColumns *applyJoinColumns @@ -71,11 +69,10 @@ type ( // so they can be used for the result of this expression that is using data from both sides. // All fields will be used for these applyJoinColumn struct { - Original sqlparser.Expr // this is the original expression being passed through - LHSExprs []BindVarExpr // These are the expressions we are pushing to the left hand side which we'll receive as bind variables - RHSExpr sqlparser.Expr // This the expression that we'll evaluate on the right hand side. This is nil, if the right hand side has nothing. - DTColName *sqlparser.ColName // This is the output column name that the parent of JOIN will be seeing. If this is unset, then the colname is the String(Original). We set this when we push Projections with derived tables underneath a Join. - GroupBy bool // if this is true, we need to push this down to our inputs with addToGroupBy set to true + Original sqlparser.Expr // this is the original expression being passed through + LHSExprs []BindVarExpr // These are the expressions we are pushing to the left hand side which we'll receive as bind variables + RHSExpr sqlparser.Expr // This the expression that we'll evaluate on the right hand side. This is nil, if the right hand side has nothing. + GroupBy bool // if this is true, we need to push this down to our inputs with addToGroupBy set to true } // BindVarExpr is an expression needed from one side of a join/subquery, and the argument name for it. @@ -88,8 +85,7 @@ type ( func NewApplyJoin(ctx *plancontext.PlanningContext, lhs, rhs Operator, predicate sqlparser.Expr, joinType sqlparser.JoinType) *ApplyJoin { aj := &ApplyJoin{ - LHS: lhs, - RHS: rhs, + binaryOperator: newBinaryOp(lhs, rhs), Vars: map[string]int{}, JoinType: joinType, JoinColumns: &applyJoinColumns{}, @@ -116,16 +112,6 @@ func (aj *ApplyJoin) AddPredicate(ctx *plancontext.PlanningContext, expr sqlpars return AddPredicate(ctx, aj, expr, false, newFilterSinglePredicate) } -// Inputs implements the Operator interface -func (aj *ApplyJoin) Inputs() []Operator { - return []Operator{aj.LHS, aj.RHS} -} - -// SetInputs implements the Operator interface -func (aj *ApplyJoin) SetInputs(inputs []Operator) { - aj.LHS, aj.RHS = inputs[0], inputs[1] -} - func (aj *ApplyJoin) GetLHS() Operator { return aj.LHS } @@ -207,7 +193,6 @@ func (aj *ApplyJoin) getJoinColumnFor(ctx *plancontext.PlanningContext, orig *sq rhs := TableID(aj.RHS) both := lhs.Merge(rhs) deps := ctx.SemTable.RecursiveDeps(e) - switch { case deps.IsSolvedBy(lhs): col.LHSExprs = []BindVarExpr{{Expr: e}} @@ -227,8 +212,7 @@ func (aj *ApplyJoin) getJoinColumnFor(ctx *plancontext.PlanningContext, orig *sq func applyJoinCompare(ctx *plancontext.PlanningContext, expr sqlparser.Expr) func(e applyJoinColumn) bool { return func(e applyJoinColumn) bool { - // e.DTColName is how the outside world will be using this expression. So we should check for an equality with that too. - return ctx.SemTable.EqualsExprWithDeps(e.Original, expr) || ctx.SemTable.EqualsExprWithDeps(e.DTColName, expr) + return ctx.SemTable.EqualsExprWithDeps(e.Original, expr) } } @@ -295,7 +279,7 @@ func (aj *ApplyJoin) AddWSColumn(ctx *plancontext.PlanningContext, offset int, u func (aj *ApplyJoin) planOffsets(ctx *plancontext.PlanningContext) Operator { if len(aj.Columns) > 0 { // we've already done offset planning - return aj + return nil } for _, col := range aj.JoinColumns.columns { // Read the type description for applyJoinColumn to understand the following code @@ -304,12 +288,18 @@ func (aj *ApplyJoin) planOffsets(ctx *plancontext.PlanningContext) Operator { for _, col := range aj.JoinPredicates.columns { for _, lhsExpr := range col.LHSExprs { + if _, found := aj.Vars[lhsExpr.Name]; found { + continue + } offset := aj.LHS.AddColumn(ctx, true, false, aeWrap(lhsExpr.Expr)) aj.Vars[lhsExpr.Name] = offset } } for _, lhsExpr := range aj.ExtraLHSVars { + if _, found := aj.Vars[lhsExpr.Name]; found { + continue + } offset := aj.LHS.AddColumn(ctx, true, false, aeWrap(lhsExpr.Expr)) aj.Vars[lhsExpr.Name] = offset } @@ -344,6 +334,10 @@ func (aj *ApplyJoin) ShortDescription() string { } firstPart := fmt.Sprintf("on %s columns: %s", fn(aj.JoinPredicates), fn(aj.JoinColumns)) + if aj.JoinType == sqlparser.LeftJoinType { + firstPart = "LEFT JOIN " + firstPart + } + if len(aj.ExtraLHSVars) == 0 { return firstPart } @@ -439,11 +433,8 @@ func (jc applyJoinColumn) String() string { lhs := slice.Map(jc.LHSExprs, func(e BindVarExpr) string { return sqlparser.String(e.Expr) }) - if jc.DTColName == nil { - return fmt.Sprintf("[%s | %s | %s]", strings.Join(lhs, ", "), rhs, sqlparser.String(jc.Original)) - } - return fmt.Sprintf("[%s | %s | %s | %s]", strings.Join(lhs, ", "), rhs, sqlparser.String(jc.Original), sqlparser.String(jc.DTColName)) + return fmt.Sprintf("[%s | %s | %s]", strings.Join(lhs, ", "), rhs, sqlparser.String(jc.Original)) } func (jc applyJoinColumn) IsPureLeft() bool { @@ -459,16 +450,10 @@ func (jc applyJoinColumn) IsMixedLeftAndRight() bool { } func (jc applyJoinColumn) GetPureLeftExpr() sqlparser.Expr { - if jc.DTColName != nil { - return jc.DTColName - } return jc.LHSExprs[0].Expr } func (jc applyJoinColumn) GetRHSExpr() sqlparser.Expr { - if jc.DTColName != nil { - return jc.DTColName - } return jc.RHSExpr } diff --git a/go/vt/vtgate/planbuilder/operators/ast_to_op.go b/go/vt/vtgate/planbuilder/operators/ast_to_op.go index 0d838610866..12c19bb72a6 100644 --- a/go/vt/vtgate/planbuilder/operators/ast_to_op.go +++ b/go/vt/vtgate/planbuilder/operators/ast_to_op.go @@ -26,8 +26,10 @@ import ( "vitess.io/vitess/go/vt/vtgate/vindexes" ) -const foreignKeyConstraintValues = "fkc_vals" -const foreignKeyUpdateExpr = "fkc_upd" +const ( + foreignKeyConstraintValues = "fkc_vals" + foreignKeyUpdateExpr = "fkc_upd" +) // translateQueryToOp creates an operator tree that represents the input SELECT or UNION query func translateQueryToOp(ctx *plancontext.PlanningContext, selStmt sqlparser.Statement) Operator { @@ -47,19 +49,26 @@ func translateQueryToOp(ctx *plancontext.PlanningContext, selStmt sqlparser.Stat } } +func translateQueryToOpWithMirroring(ctx *plancontext.PlanningContext, stmt sqlparser.Statement) Operator { + op := translateQueryToOp(ctx, stmt) + + if selStmt, ok := stmt.(sqlparser.SelectStatement); ok { + if mi := ctx.SemTable.GetMirrorInfo(); mi.Percent > 0 { + mirrorOp := translateQueryToOp(ctx.UseMirror(), selStmt) + op = NewPercentBasedMirror(mi.Percent, op, mirrorOp) + } + } + + return op +} + func createOperatorFromSelect(ctx *plancontext.PlanningContext, sel *sqlparser.Select) Operator { op := crossJoin(ctx, sel.From) - if sel.Where != nil { - op = addWherePredicates(ctx, sel.Where.Expr, op) - } + op = addWherePredicates(ctx, sel.GetWherePredicate(), op) if sel.Comments != nil || sel.Lock != sqlparser.NoLock { - op = &LockAndComment{ - Source: op, - Comments: sel.Comments, - Lock: sel.Lock, - } + op = newLockAndComment(op, sel.Comments, sel.Lock) } op = newHorizon(op, sel) @@ -73,15 +82,26 @@ func addWherePredicates(ctx *plancontext.PlanningContext, expr sqlparser.Expr, o return sqc.getRootOperator(op, nil) } -func addWherePredsToSubQueryBuilder(ctx *plancontext.PlanningContext, expr sqlparser.Expr, op Operator, sqc *SubQueryBuilder) Operator { +func addWherePredsToSubQueryBuilder(ctx *plancontext.PlanningContext, in sqlparser.Expr, op Operator, sqc *SubQueryBuilder) Operator { outerID := TableID(op) - exprs := sqlparser.SplitAndExpression(nil, expr) - for _, expr := range exprs { + for _, expr := range sqlparser.SplitAndExpression(nil, in) { sqlparser.RemoveKeyspaceInCol(expr) + expr = simplifyPredicates(ctx, expr) subq := sqc.handleSubquery(ctx, expr, outerID) if subq != nil { continue } + boolean := ctx.IsConstantBool(expr) + if boolean != nil { + if *boolean { + // If the predicate is true, we can ignore it. + continue + } + + // If the predicate is false, we push down a false predicate to influence routing + expr = sqlparser.NewIntLiteral("0") + } + op = op.AddPredicate(ctx, expr) addColumnEquality(ctx, expr) } @@ -148,8 +168,8 @@ func createOperatorFromUnion(ctx *plancontext.PlanningContext, node *sqlparser.U if isRHSUnion { panic(vterrors.VT12001("nesting of UNIONs on the right-hand side")) } - opLHS := translateQueryToOp(ctx, node.Left) - opRHS := translateQueryToOp(ctx, node.Right) + opLHS := translateQueryToOpForUnion(ctx, node.Left) + opRHS := translateQueryToOpForUnion(ctx, node.Right) lexprs := ctx.SemTable.SelectExprs(node.Left) rexprs := ctx.SemTable.SelectExprs(node.Right) @@ -158,6 +178,14 @@ func createOperatorFromUnion(ctx *plancontext.PlanningContext, node *sqlparser.U return newHorizon(union, node) } +func translateQueryToOpForUnion(ctx *plancontext.PlanningContext, node sqlparser.SelectStatement) Operator { + op := translateQueryToOp(ctx, node) + if hz, ok := op.(*Horizon); ok { + hz.Truncate = true + } + return op +} + // createOpFromStmt creates an operator from the given statement. It takes in two additional arguments— // 1. verifyAllFKs: For this given statement, do we need to verify validity of all the foreign keys on the vtgate level. // 2. fkToIgnore: The foreign key constraint to specifically ignore while planning the statement. This field is used in UPDATE CASCADE planning, wherein while planning the child update @@ -246,24 +274,47 @@ func getOperatorFromAliasedTableExpr(ctx *plancontext.PlanningContext, tableExpr panic(err) } - if vt, isVindex := tableInfo.(*semantics.VindexTable); isVindex { - solves := tableID + switch tableInfo := tableInfo.(type) { + case *semantics.VindexTable: return &Vindex{ Table: VindexTable{ TableID: tableID, Alias: tableExpr, Table: tbl, - VTable: vt.Table.GetVindexTable(), + VTable: tableInfo.Table.GetVindexTable(), }, - Vindex: vt.Vindex, - Solved: solves, + Vindex: tableInfo.Vindex, + Solved: tableID, } + case *semantics.CTETable: + return createDualCTETable(ctx, tableID, tableInfo) + case *semantics.RealTable: + if tableInfo.CTE != nil { + return createRecursiveCTE(ctx, tableInfo.CTE, tableID) + } + + qg := newQueryGraph() + isInfSchema := tableInfo.IsInfSchema() + if ctx.IsMirrored() { + if mr := tableInfo.GetMirrorRule(); mr != nil { + newTbl := sqlparser.Clone(tbl) + newTbl.Qualifier = sqlparser.NewIdentifierCS(mr.Table.Keyspace.Name) + newTbl.Name = mr.Table.Name + if newTbl.Name.String() != tbl.Name.String() { + tableExpr = sqlparser.Clone(tableExpr) + tableExpr.As = tbl.Name + } + tbl = newTbl + } else { + panic(vterrors.VT13001(fmt.Sprintf("unable to find mirror rule for table: %T", tbl))) + } + } + qt := &QueryTable{Alias: tableExpr, Table: tbl, ID: tableID, IsInfSchema: isInfSchema} + qg.Tables = append(qg.Tables, qt) + return qg + default: + panic(vterrors.VT13001(fmt.Sprintf("unknown table type %T", tableInfo))) } - qg := newQueryGraph() - isInfSchema := tableInfo.IsInfSchema() - qt := &QueryTable{Alias: tableExpr, Table: tbl, ID: tableID, IsInfSchema: isInfSchema} - qg.Tables = append(qg.Tables, qt) - return qg case *sqlparser.DerivedTable: if onlyTable && tbl.Select.GetLimit() == nil { tbl.Select.SetOrderBy(nil) @@ -284,6 +335,56 @@ func getOperatorFromAliasedTableExpr(ctx *plancontext.PlanningContext, tableExpr } } +func createDualCTETable(ctx *plancontext.PlanningContext, tableID semantics.TableSet, tableInfo *semantics.CTETable) Operator { + vschemaTable, _, _, _, _, err := ctx.VSchema.FindTableOrVindex(sqlparser.NewTableName("dual")) + if err != nil { + panic(err) + } + qtbl := &QueryTable{ + ID: tableID, + Alias: tableInfo.ASTNode, + Table: sqlparser.NewTableName("dual"), + } + return createRouteFromVSchemaTable(ctx, qtbl, vschemaTable, false, nil) +} + +func createRecursiveCTE(ctx *plancontext.PlanningContext, def *semantics.CTE, outerID semantics.TableSet) Operator { + union, ok := def.Query.(*sqlparser.Union) + if !ok { + panic(vterrors.VT13001("expected UNION in recursive CTE")) + } + + seed := translateQueryToOp(ctx, union.Left) + + // Push the CTE definition to the stack so that it can be used in the recursive part of the query + ctx.PushCTE(def, *def.IDForRecurse) + + term := translateQueryToOp(ctx, union.Right) + horizon, ok := term.(*Horizon) + if !ok { + panic(vterrors.VT09027(def.Name)) + } + term = horizon.Source + horizon.Source = nil // not sure about this + activeCTE, err := ctx.PopCTE() + if err != nil { + panic(err) + } + + return newRecurse(ctx, def, seed, term, activeCTE.Predicates, horizon, idForRecursiveTable(ctx, def), outerID, union.Distinct) +} + +func idForRecursiveTable(ctx *plancontext.PlanningContext, def *semantics.CTE) semantics.TableSet { + for i, table := range ctx.SemTable.Tables { + tbl, ok := table.(*semantics.CTETable) + if !ok || tbl.CTE.Name != def.Name { + continue + } + return semantics.SingleTableSet(i) + } + panic(vterrors.VT13001("recursive table not found")) +} + func crossJoin(ctx *plancontext.PlanningContext, exprs sqlparser.TableExprs) Operator { var output Operator for _, tableExpr := range exprs { diff --git a/go/vt/vtgate/planbuilder/operators/comments.go b/go/vt/vtgate/planbuilder/operators/comments.go index 7e7749a61b5..9f0202c250a 100644 --- a/go/vt/vtgate/planbuilder/operators/comments.go +++ b/go/vt/vtgate/planbuilder/operators/comments.go @@ -26,25 +26,25 @@ import ( // LockAndComment contains any comments or locking directives we want on all queries down from this operator type LockAndComment struct { - Source Operator + unaryOperator Comments *sqlparser.ParsedComments Lock sqlparser.Lock } +func newLockAndComment(op Operator, comments *sqlparser.ParsedComments, lock sqlparser.Lock) Operator { + return &LockAndComment{ + unaryOperator: newUnaryOp(op), + Comments: comments, + Lock: lock, + } +} + func (l *LockAndComment) Clone(inputs []Operator) Operator { klon := *l klon.Source = inputs[0] return &klon } -func (l *LockAndComment) Inputs() []Operator { - return []Operator{l.Source} -} - -func (l *LockAndComment) SetInputs(operators []Operator) { - l.Source = operators[0] -} - func (l *LockAndComment) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) Operator { l.Source = l.Source.AddPredicate(ctx, expr) return l diff --git a/go/vt/vtgate/planbuilder/operators/cte_merging.go b/go/vt/vtgate/planbuilder/operators/cte_merging.go new file mode 100644 index 00000000000..cb19e06b2a7 --- /dev/null +++ b/go/vt/vtgate/planbuilder/operators/cte_merging.go @@ -0,0 +1,95 @@ +/* +Copyright 2024 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 operators + +import ( + "vitess.io/vitess/go/vt/vtgate/engine" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" +) + +func tryMergeRecurse(ctx *plancontext.PlanningContext, in *RecurseCTE) (Operator, *ApplyResult) { + op := tryMergeCTE(ctx, in.Seed(), in.Term(), in) + if op == nil { + return in, NoRewrite + } + + return op, Rewrote("Merged CTE") +} + +func tryMergeCTE(ctx *plancontext.PlanningContext, seed, term Operator, in *RecurseCTE) *Route { + seedRoute, termRoute, routingA, routingB, a, b, sameKeyspace := prepareInputRoutes(seed, term) + if seedRoute == nil { + return nil + } + + switch { + case a == dual: + return mergeCTE(ctx, seedRoute, termRoute, routingB, in) + case b == dual: + return mergeCTE(ctx, seedRoute, termRoute, routingA, in) + case !sameKeyspace: + return nil + case a == anyShard: + return mergeCTE(ctx, seedRoute, termRoute, routingB, in) + case b == anyShard: + return mergeCTE(ctx, seedRoute, termRoute, routingA, in) + case a == sharded && b == sharded: + return tryMergeCTESharded(ctx, seedRoute, termRoute, in) + default: + return nil + } +} + +func tryMergeCTESharded(ctx *plancontext.PlanningContext, seed, term *Route, in *RecurseCTE) *Route { + tblA := seed.Routing.(*ShardedRouting) + tblB := term.Routing.(*ShardedRouting) + switch tblA.RouteOpCode { + case engine.EqualUnique: + // If the two routes fully match, they can be merged together. + if tblB.RouteOpCode == engine.EqualUnique { + aVdx := tblA.SelectedVindex() + bVdx := tblB.SelectedVindex() + aExpr := tblA.VindexExpressions() + bExpr := tblB.VindexExpressions() + if aVdx == bVdx && gen4ValuesEqual(ctx, aExpr, bExpr) { + return mergeCTE(ctx, seed, term, tblA, in) + } + } + } + + return nil +} + +func mergeCTE(ctx *plancontext.PlanningContext, seed, term *Route, r Routing, in *RecurseCTE) *Route { + in.Def.Merged = true + hz := in.Horizon + hz.Source = term.Source + newTerm, _ := expandHorizon(ctx, hz) + cte := &RecurseCTE{ + binaryOperator: newBinaryOp(seed.Source, newTerm), + Predicates: in.Predicates, + Def: in.Def, + LeftID: in.LeftID, + OuterID: in.OuterID, + Distinct: in.Distinct, + } + return &Route{ + Routing: r, + unaryOperator: newUnaryOp(cte), + MergedWith: []*Route{term}, + } +} diff --git a/go/vt/vtgate/planbuilder/operators/delete.go b/go/vt/vtgate/planbuilder/operators/delete.go index 5bbf5218bd7..4d30d9b9cc1 100644 --- a/go/vt/vtgate/planbuilder/operators/delete.go +++ b/go/vt/vtgate/planbuilder/operators/delete.go @@ -45,9 +45,6 @@ func (d *Delete) Inputs() []Operator { } func (d *Delete) SetInputs(inputs []Operator) { - if len(inputs) != 1 { - panic(vterrors.VT13001("unexpected number of inputs for Delete operator")) - } d.Source = inputs[0] } @@ -55,8 +52,8 @@ func (d *Delete) GetOrdering(*plancontext.PlanningContext) []OrderBy { return nil } -func (d *Delete) TablesUsed() []string { - return SingleQualifiedIdentifier(d.Target.VTable.Keyspace, d.Target.VTable.Name) +func (d *Delete) TablesUsed(in []string) []string { + return append(in, QualifiedString(d.Target.VTable.Keyspace, d.Target.VTable.Name.String())) } func (d *Delete) ShortDescription() string { @@ -78,10 +75,7 @@ func createOperatorFromDelete(ctx *plancontext.PlanningContext, deleteStmt *sqlp op, vTbl = createDeleteOperator(ctx, deleteStmt) if deleteStmt.Comments != nil { - op = &LockAndComment{ - Source: op, - Comments: deleteStmt.Comments, - } + op = newLockAndComment(op, deleteStmt.Comments, sqlparser.NoLock) } var err error @@ -154,10 +148,7 @@ func createDeleteWithInputOp(ctx *plancontext.PlanningContext, del *sqlparser.De } if del.Comments != nil { - op = &LockAndComment{ - Source: op, - Comments: del.Comments, - } + op = newLockAndComment(op, del.Comments, sqlparser.NoLock) } return op } @@ -260,16 +251,13 @@ func createDeleteOperator(ctx *plancontext.PlanningContext, del *sqlparser.Delet Ignore: del.Ignore, Target: targetTbl, OwnedVindexQuery: ovq, - Source: op, }, } if del.Limit != nil { - addOrdering(ctx, del.OrderBy, delOp) - delOp.Source = &Limit{ - Source: delOp.Source, - AST: del.Limit, - } + delOp.Source = newLimit(addOrdering(ctx, op, del.OrderBy), del.Limit, false) + } else { + delOp.Source = op } return sqc.getRootOperator(delOp, nil), vTbl @@ -302,26 +290,24 @@ func makeColName(col sqlparser.IdentifierCI, table TargetTable, isMultiTbl bool) return sqlparser.NewColName(col.String()) } -func addOrdering(ctx *plancontext.PlanningContext, orderBy sqlparser.OrderBy, op Operator) { +func addOrdering(ctx *plancontext.PlanningContext, op Operator, orderBy sqlparser.OrderBy) Operator { es := &expressionSet{} - ordering := &Ordering{} - ordering.SetInputs(op.Inputs()) - for _, order := range orderBy { - if sqlparser.IsNull(order.Expr) { - // ORDER BY null can safely be ignored + var order []OrderBy + for _, ord := range orderBy { + if sqlparser.IsNull(ord.Expr) || !es.add(ctx, ord.Expr) { + // ORDER BY null, or expression repeated can safely be ignored continue } - if !es.add(ctx, order.Expr) { - continue - } - ordering.Order = append(ordering.Order, OrderBy{ - Inner: sqlparser.Clone(order), - SimplifiedExpr: order.Expr, + + order = append(order, OrderBy{ + Inner: sqlparser.Clone(ord), + SimplifiedExpr: ord.Expr, }) } - if len(ordering.Order) > 0 { - op.SetInputs([]Operator{ordering}) + if len(order) == 0 { + return op } + return newOrdering(op, order) } func updateQueryGraphWithSource(ctx *plancontext.PlanningContext, input Operator, tblID semantics.TableSet, vTbl *vindexes.Table) *vindexes.Table { diff --git a/go/vt/vtgate/planbuilder/operators/distinct.go b/go/vt/vtgate/planbuilder/operators/distinct.go index 4fd53725e10..52221498eea 100644 --- a/go/vt/vtgate/planbuilder/operators/distinct.go +++ b/go/vt/vtgate/planbuilder/operators/distinct.go @@ -26,8 +26,8 @@ import ( type ( Distinct struct { - Source Operator - QP *QueryProjection + unaryOperator + QP *QueryProjection // When we go from AST to operator, we place DISTINCT ops in the required places in the op tree // These are marked as `Required`, because they are semantically important to the results of the query. @@ -45,6 +45,14 @@ type ( } ) +func newDistinct(src Operator, qp *QueryProjection, required bool) *Distinct { + return &Distinct{ + unaryOperator: newUnaryOp(src), + QP: qp, + Required: required, + } +} + func (d *Distinct) planOffsets(ctx *plancontext.PlanningContext) Operator { columns := d.GetColumns(ctx) for idx, col := range columns { @@ -66,22 +74,10 @@ func (d *Distinct) planOffsets(ctx *plancontext.PlanningContext) Operator { } func (d *Distinct) Clone(inputs []Operator) Operator { - return &Distinct{ - Required: d.Required, - Source: inputs[0], - Columns: slices.Clone(d.Columns), - QP: d.QP, - PushedPerformance: d.PushedPerformance, - ResultColumns: d.ResultColumns, - } -} - -func (d *Distinct) Inputs() []Operator { - return []Operator{d.Source} -} - -func (d *Distinct) SetInputs(operators []Operator) { - d.Source = operators[0] + kopy := *d + kopy.Columns = slices.Clone(d.Columns) + kopy.Source = inputs[0] + return &kopy } func (d *Distinct) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) Operator { diff --git a/go/vt/vtgate/planbuilder/operators/dml_with_input.go b/go/vt/vtgate/planbuilder/operators/dml_with_input.go index 09859b90bac..720056f1964 100644 --- a/go/vt/vtgate/planbuilder/operators/dml_with_input.go +++ b/go/vt/vtgate/planbuilder/operators/dml_with_input.go @@ -50,9 +50,6 @@ func (d *DMLWithInput) Inputs() []Operator { } func (d *DMLWithInput) SetInputs(inputs []Operator) { - if len(inputs) < 2 { - panic("unexpected number of inputs for DMLWithInput operator") - } d.Source = inputs[0] d.DML = inputs[1:] } @@ -114,7 +111,7 @@ func (d *DMLWithInput) planOffsets(ctx *plancontext.PlanningContext) Operator { } } d.BvList = bvList - return d + return nil } var _ Operator = (*DMLWithInput)(nil) diff --git a/go/vt/vtgate/planbuilder/operators/expressions.go b/go/vt/vtgate/planbuilder/operators/expressions.go index 17b4bc7c3f1..38848693775 100644 --- a/go/vt/vtgate/planbuilder/operators/expressions.go +++ b/go/vt/vtgate/planbuilder/operators/expressions.go @@ -59,3 +59,65 @@ func breakExpressionInLHSandRHS( col.Original = expr return } + +// nothingNeedsFetching will return true if all the nodes in the expression are constant +func nothingNeedsFetching(ctx *plancontext.PlanningContext, expr sqlparser.Expr) (constant bool) { + constant = true + _ = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + if mustFetchFromInput(ctx, node) { + constant = false + } + return true, nil + }, expr) + return +} + +func simplifyPredicates(ctx *plancontext.PlanningContext, in sqlparser.Expr) sqlparser.Expr { + var replace sqlparser.Expr + + // if expr is constant true, replace with trueReplacement, if constant false, replace with falseReplacement + handleExpr := func(expr, trueReplacement, falseReplacement sqlparser.Expr) bool { + b := ctx.IsConstantBool(expr) + if b != nil { + if *b { + replace = trueReplacement + } else { + replace = falseReplacement + } + return true + } + return false + } + + pre := func(node, _ sqlparser.SQLNode) bool { + switch node := node.(type) { + case *sqlparser.OrExpr: + if handleExpr(node.Left, sqlparser.NewIntLiteral("1"), node.Right) { + return false + } + if handleExpr(node.Right, sqlparser.NewIntLiteral("1"), node.Left) { + return false + } + case *sqlparser.AndExpr: + if handleExpr(node.Left, node.Right, sqlparser.NewIntLiteral("0")) { + return false + } + if handleExpr(node.Right, node.Left, sqlparser.NewIntLiteral("0")) { + return false + } + } + return true + } + post := func(cursor *sqlparser.CopyOnWriteCursor) { + if replace != nil { + cursor.Replace(replace) + replace = nil + } + } + output := sqlparser.CopyOnRewrite(in, pre, post, ctx.SemTable.CopySemanticInfo).(sqlparser.Expr) + if in != output { + // we need to do this, since one simplification might lead to another + return simplifyPredicates(ctx, output) + } + return output +} diff --git a/go/vt/vtgate/planbuilder/operators/filter.go b/go/vt/vtgate/planbuilder/operators/filter.go index d68b2a43a24..d58d218908e 100644 --- a/go/vt/vtgate/planbuilder/operators/filter.go +++ b/go/vt/vtgate/planbuilder/operators/filter.go @@ -29,7 +29,7 @@ import ( ) type Filter struct { - Source Operator + unaryOperator Predicates []sqlparser.Expr // PredicateWithOffsets is the evalengine expression that will finally be used. @@ -45,28 +45,17 @@ func newFilterSinglePredicate(op Operator, expr sqlparser.Expr) Operator { func newFilter(op Operator, expr ...sqlparser.Expr) Operator { return &Filter{ - Source: op, Predicates: expr, + unaryOperator: newUnaryOp(op), + Predicates: expr, } } // Clone implements the Operator interface func (f *Filter) Clone(inputs []Operator) Operator { - return &Filter{ - Source: inputs[0], - Predicates: slices.Clone(f.Predicates), - PredicateWithOffsets: f.PredicateWithOffsets, - ResultColumns: f.ResultColumns, - } -} - -// Inputs implements the Operator interface -func (f *Filter) Inputs() []Operator { - return []Operator{f.Source} -} - -// SetInputs implements the Operator interface -func (f *Filter) SetInputs(ops []Operator) { - f.Source = ops[0] + klon := *f + klon.Source = inputs[0] + klon.Predicates = slices.Clone(f.Predicates) + return &klon } // UnsolvedPredicates implements the unresolved interface diff --git a/go/vt/vtgate/planbuilder/operators/fk_cascade.go b/go/vt/vtgate/planbuilder/operators/fk_cascade.go index f24b59ca5ab..0aff5b3bea2 100644 --- a/go/vt/vtgate/planbuilder/operators/fk_cascade.go +++ b/go/vt/vtgate/planbuilder/operators/fk_cascade.go @@ -61,9 +61,6 @@ func (fkc *FkCascade) Inputs() []Operator { // SetInputs implements the Operator interface func (fkc *FkCascade) SetInputs(operators []Operator) { - if len(operators) < 2 { - panic("incorrect count of inputs for FkCascade") - } fkc.Parent = operators[0] fkc.Selection = operators[1] for idx, operator := range operators { diff --git a/go/vt/vtgate/planbuilder/operators/fk_verify.go b/go/vt/vtgate/planbuilder/operators/fk_verify.go index 8275a8d462f..a27f88f3335 100644 --- a/go/vt/vtgate/planbuilder/operators/fk_verify.go +++ b/go/vt/vtgate/planbuilder/operators/fk_verify.go @@ -52,9 +52,6 @@ func (fkv *FkVerify) Inputs() []Operator { // SetInputs implements the Operator interface func (fkv *FkVerify) SetInputs(operators []Operator) { fkv.Input = operators[0] - if len(fkv.Verify) != len(operators)-1 { - panic("mismatched number of verify inputs") - } for i := 1; i < len(operators); i++ { fkv.Verify[i-1].Op = operators[i] } diff --git a/go/vt/vtgate/planbuilder/operators/hash_join.go b/go/vt/vtgate/planbuilder/operators/hash_join.go index 1928f4dda9e..3761c4b87a6 100644 --- a/go/vt/vtgate/planbuilder/operators/hash_join.go +++ b/go/vt/vtgate/planbuilder/operators/hash_join.go @@ -31,7 +31,7 @@ import ( type ( HashJoin struct { - LHS, RHS Operator + binaryOperator // LeftJoin will be true in the case of an outer join LeftJoin bool @@ -79,10 +79,9 @@ var _ JoinOp = (*HashJoin)(nil) func NewHashJoin(lhs, rhs Operator, outerJoin bool) *HashJoin { hj := &HashJoin{ - LHS: lhs, - RHS: rhs, - LeftJoin: outerJoin, - columns: &hashJoinColumns{}, + binaryOperator: newBinaryOp(lhs, rhs), + LeftJoin: outerJoin, + columns: &hashJoinColumns{}, } return hj } @@ -97,14 +96,6 @@ func (hj *HashJoin) Clone(inputs []Operator) Operator { return &kopy } -func (hj *HashJoin) Inputs() []Operator { - return []Operator{hj.LHS, hj.RHS} -} - -func (hj *HashJoin) SetInputs(operators []Operator) { - hj.LHS, hj.RHS = operators[0], operators[1] -} - func (hj *HashJoin) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) Operator { return AddPredicate(ctx, hj, expr, false, newFilterSinglePredicate) } @@ -326,20 +317,9 @@ func (hj *HashJoin) addColumn(ctx *plancontext.PlanningContext, in sqlparser.Exp inOffset = op.AddColumn(ctx, false, false, aeWrap(expr)) } - // we turn the + // we have to turn the incoming offset to an outgoing offset of the columns this operator is exposing internalOffset := offsetter(inOffset) - - // ok, we have an offset from the input operator. Let's check if we already have it - // in our list of incoming columns - - for idx, offset := range hj.ColumnOffsets { - if internalOffset == offset { - return idx - } - } - hj.ColumnOffsets = append(hj.ColumnOffsets, internalOffset) - return len(hj.ColumnOffsets) - 1 } @@ -434,17 +414,7 @@ func (hj *HashJoin) addSingleSidedColumn( // we have to turn the incoming offset to an outgoing offset of the columns this operator is exposing internalOffset := offsetter(inOffset) - - // ok, we have an offset from the input operator. Let's check if we already have it - // in our list of incoming columns - for idx, offset := range hj.ColumnOffsets { - if internalOffset == offset { - return idx - } - } - hj.ColumnOffsets = append(hj.ColumnOffsets, internalOffset) - return len(hj.ColumnOffsets) - 1 } diff --git a/go/vt/vtgate/planbuilder/operators/hash_join_test.go b/go/vt/vtgate/planbuilder/operators/hash_join_test.go index 2bf1d08d2b6..7325cc015a1 100644 --- a/go/vt/vtgate/planbuilder/operators/hash_join_test.go +++ b/go/vt/vtgate/planbuilder/operators/hash_join_test.go @@ -41,10 +41,9 @@ func TestJoinPredicates(t *testing.T) { lhs := &fakeOp{id: lid} rhs := &fakeOp{id: rid} hj := &HashJoin{ - LHS: lhs, - RHS: rhs, - LeftJoin: false, - columns: &hashJoinColumns{}, + binaryOperator: newBinaryOp(lhs, rhs), + LeftJoin: false, + columns: &hashJoinColumns{}, } cmp := &sqlparser.ComparisonExpr{ @@ -99,10 +98,9 @@ func TestOffsetPlanning(t *testing.T) { for _, test := range tests { t.Run(sqlparser.String(test.expr), func(t *testing.T) { hj := &HashJoin{ - LHS: lhs, - RHS: rhs, - LeftJoin: false, - columns: &hashJoinColumns{}, + binaryOperator: newBinaryOp(lhs, rhs), + LeftJoin: false, + columns: &hashJoinColumns{}, } hj.AddColumn(ctx, true, false, aeWrap(test.expr)) hj.planOffsets(ctx) diff --git a/go/vt/vtgate/planbuilder/operators/helpers.go b/go/vt/vtgate/planbuilder/operators/helpers.go index 31d9bcfd279..36b10c96ae1 100644 --- a/go/vt/vtgate/planbuilder/operators/helpers.go +++ b/go/vt/vtgate/planbuilder/operators/helpers.go @@ -18,6 +18,7 @@ package operators import ( "fmt" + "slices" "sort" "vitess.io/vitess/go/vt/sqlparser" @@ -82,20 +83,21 @@ func TableID(op Operator) (result semantics.TableSet) { // TableUser is used to signal that this operator directly interacts with one or more tables type TableUser interface { - TablesUsed() []string + TablesUsed([]string) []string } func TablesUsed(op Operator) []string { - addString, collect := collectSortedUniqueStrings() + var in []string _ = Visit(op, func(this Operator) error { if tbl, ok := this.(TableUser); ok { - for _, u := range tbl.TablesUsed() { - addString(u) - } + in = tbl.TablesUsed(in) } return nil }) - return collect() + + slices.Sort(in) + compacted := slices.Compact(in) + return compacted } func CostOf(op Operator) (cost int) { diff --git a/go/vt/vtgate/planbuilder/operators/horizon.go b/go/vt/vtgate/planbuilder/operators/horizon.go index 7539704c2a9..292be1b37c5 100644 --- a/go/vt/vtgate/planbuilder/operators/horizon.go +++ b/go/vt/vtgate/planbuilder/operators/horizon.go @@ -18,6 +18,7 @@ package operators import ( "errors" + "fmt" "slices" "vitess.io/vitess/go/vt/sqlparser" @@ -34,7 +35,7 @@ import ( // Project/Aggregate/Sort/Limit operations, some which can be pushed down, // and some that have to be evaluated at the vtgate level. type Horizon struct { - Source Operator + unaryOperator // If this is a derived table, the two following fields will contain the tableID and name of it TableId *semantics.TableSet @@ -49,10 +50,15 @@ type Horizon struct { // Columns needed to feed other plans Columns []*sqlparser.ColName ColumnsOffset []int + + Truncate bool } func newHorizon(src Operator, query sqlparser.SelectStatement) *Horizon { - return &Horizon{Source: src, Query: query} + return &Horizon{ + unaryOperator: newUnaryOp(src), + Query: query, + } } // Clone implements the Operator interface @@ -75,16 +81,6 @@ func (h *Horizon) IsMergeable(ctx *plancontext.PlanningContext) bool { return isMergeable(ctx, h.Query, h) } -// Inputs implements the Operator interface -func (h *Horizon) Inputs() []Operator { - return []Operator{h.Source} -} - -// SetInputs implements the Operator interface -func (h *Horizon) SetInputs(ops []Operator) { - h.Source = ops[0] -} - func (h *Horizon) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) Operator { if _, isUNion := h.Source.(*Union); isUNion { // If we have a derived table on top of a UNION, we can let the UNION do the expression rewriting @@ -205,7 +201,7 @@ func (h *Horizon) getQP(ctx *plancontext.PlanningContext) *QueryProjection { } func (h *Horizon) ShortDescription() string { - return h.Alias + return fmt.Sprintf("Horizon (Alias: %s)", h.Alias) } func (h *Horizon) introducesTableID() semantics.TableSet { diff --git a/go/vt/vtgate/planbuilder/operators/horizon_expanding.go b/go/vt/vtgate/planbuilder/operators/horizon_expanding.go index fd3d992d0ca..dad5ad3a91a 100644 --- a/go/vt/vtgate/planbuilder/operators/horizon_expanding.go +++ b/go/vt/vtgate/planbuilder/operators/horizon_expanding.go @@ -44,17 +44,11 @@ func expandUnionHorizon(ctx *plancontext.PlanningContext, horizon *Horizon, unio qp := horizon.getQP(ctx) if len(qp.OrderExprs) > 0 { - op = &Ordering{ - Source: op, - Order: qp.OrderExprs, - } + op = newOrdering(op, qp.OrderExprs) } if union.Limit != nil { - op = &Limit{ - Source: op, - AST: union.Limit, - } + op = newLimit(op, union.Limit, false) } if horizon.TableId != nil { @@ -84,6 +78,12 @@ func expandSelectHorizon(ctx *plancontext.PlanningContext, horizon *Horizon, sel for _, order := range horizon.Query.GetOrderBy() { qp.addDerivedColumn(ctx, order.Expr) } + sel, isSel := horizon.Query.(*sqlparser.Select) + if isSel && sel.Having != nil { + for _, pred := range sqlparser.SplitAndExpression(nil, sel.Having.Expr) { + qp.addDerivedColumn(ctx, pred) + } + } } op := createProjectionFromSelect(ctx, horizon) @@ -94,11 +94,7 @@ func expandSelectHorizon(ctx *plancontext.PlanningContext, horizon *Horizon, sel } if qp.NeedsDistinct() { - op = &Distinct{ - Required: true, - Source: op, - QP: qp, - } + op = newDistinct(op, qp, true) extracted = append(extracted, "Distinct") } @@ -113,11 +109,7 @@ func expandSelectHorizon(ctx *plancontext.PlanningContext, horizon *Horizon, sel } if sel.Limit != nil { - op = &Limit{ - Source: op, - AST: sel.Limit, - Top: true, - } + op = newLimit(op, sel.Limit, true) extracted = append(extracted, "Limit") } @@ -144,10 +136,7 @@ func expandOrderBy(ctx *plancontext.PlanningContext, op Operator, qp *QueryProje // If the operator is not a projection, we cannot handle subqueries with aggregation if we are unable to push everything into a single route. if !ok { ctx.SemTable.NotSingleRouteErr = vterrors.VT12001("subquery with aggregation in order by") - return &Ordering{ - Source: op, - Order: qp.OrderExprs, - } + return newOrdering(op, qp.OrderExprs) } else { // Add the new subquery expression to the projection proj.addSubqueryExpr(ctx, aeWrap(newExpr), newExpr, subqs...) @@ -169,10 +158,7 @@ func expandOrderBy(ctx *plancontext.PlanningContext, op Operator, qp *QueryProje } // Return the updated operator with the new order by expressions - return &Ordering{ - Source: op, - Order: newOrder, - } + return newOrdering(op, newOrder) } // exposeOrderingColumn will expose the ordering column to the outer query @@ -208,7 +194,7 @@ func createProjectionFromSelect(ctx *plancontext.PlanningContext, horizon *Horiz } if qp.NeedsAggregation() { - return createProjectionWithAggr(ctx, qp, dt, horizon.src()) + return createProjectionWithAggr(ctx, qp, dt, horizon) } projX := createProjectionWithoutAggr(ctx, qp, horizon.src()) @@ -216,16 +202,17 @@ func createProjectionFromSelect(ctx *plancontext.PlanningContext, horizon *Horiz return projX } -func createProjectionWithAggr(ctx *plancontext.PlanningContext, qp *QueryProjection, dt *DerivedTable, src Operator) Operator { +func createProjectionWithAggr(ctx *plancontext.PlanningContext, qp *QueryProjection, dt *DerivedTable, horizon *Horizon) Operator { aggregations, complexAggr := qp.AggregationExpressions(ctx, true) + src := horizon.Source aggrOp := &Aggregator{ - Source: src, - Original: true, - QP: qp, - Grouping: qp.GetGrouping(), - WithRollup: qp.WithRollup, - Aggregations: aggregations, - DT: dt, + unaryOperator: newUnaryOp(src), + Original: true, + QP: qp, + Grouping: qp.GetGrouping(), + WithRollup: qp.WithRollup, + Aggregations: aggregations, + DT: dt, } // Go through all aggregations and check for any subquery. @@ -239,7 +226,11 @@ func createProjectionWithAggr(ctx *plancontext.PlanningContext, qp *QueryProject if complexAggr { return createProjectionForComplexAggregation(aggrOp, qp) } - return createProjectionForSimpleAggregation(ctx, aggrOp, qp) + + addAllColumnsToAggregator(ctx, aggrOp, qp) + aggrOp.Truncate = horizon.Truncate + + return aggrOp } func pullOutValueSubqueries(ctx *plancontext.PlanningContext, aggr Aggr, sqc *SubQueryBuilder, outerID semantics.TableSet) Aggr { @@ -261,7 +252,7 @@ func pullOutValueSubqueries(ctx *plancontext.PlanningContext, aggr Aggr, sqc *Su return aggr } -func createProjectionForSimpleAggregation(ctx *plancontext.PlanningContext, a *Aggregator, qp *QueryProjection) Operator { +func addAllColumnsToAggregator(ctx *plancontext.PlanningContext, a *Aggregator, qp *QueryProjection) { outer: for colIdx, expr := range qp.SelectExprs { ae, err := expr.GetAliasedExpr() @@ -292,7 +283,6 @@ outer: } panic(vterrors.VT13001(fmt.Sprintf("Could not find the %s in aggregation in the original query", sqlparser.String(ae)))) } - return a } func createProjectionForComplexAggregation(a *Aggregator, qp *QueryProjection) Operator { @@ -368,7 +358,7 @@ func newStarProjection(src Operator, qp *QueryProjection) *Projection { } return &Projection{ - Source: src, - Columns: StarProjections(cols), + unaryOperator: newUnaryOp(src), + Columns: StarProjections(cols), } } diff --git a/go/vt/vtgate/planbuilder/operators/insert.go b/go/vt/vtgate/planbuilder/operators/insert.go index 6832dc363d5..4ce37901a77 100644 --- a/go/vt/vtgate/planbuilder/operators/insert.go +++ b/go/vt/vtgate/planbuilder/operators/insert.go @@ -50,7 +50,7 @@ type Insert struct { // that will appear in the result set of the select query. VindexValueOffset [][]int - noInputs + nullaryOperator noColumns noPredicates } @@ -96,8 +96,12 @@ func (i *Insert) Clone([]Operator) Operator { } } -func (i *Insert) TablesUsed() []string { - return SingleQualifiedIdentifier(i.VTable.Keyspace, i.VTable.Name) +func (i *Insert) TablesUsed(in []string) []string { + return append(in, i.tableTarget()) +} + +func (i *Insert) tableTarget() string { + return QualifiedString(i.VTable.Keyspace, i.VTable.Name.String()) } func (i *Insert) Statement() sqlparser.Statement { @@ -363,8 +367,8 @@ func createInsertOperator(ctx *plancontext.PlanningContext, insStmt *sqlparser.I AST: insStmt, } route := &Route{ - Source: insOp, - Routing: routing, + unaryOperator: newUnaryOp(insOp), + Routing: routing, } // Table column list is nil then add all the columns @@ -394,10 +398,7 @@ func createInsertOperator(ctx *plancontext.PlanningContext, insStmt *sqlparser.I op = insertSelectPlan(ctx, insOp, route, insStmt, rows) } if insStmt.Comments != nil { - op = &LockAndComment{ - Source: op, - Comments: insStmt.Comments, - } + op = newLockAndComment(op, insStmt.Comments, sqlparser.NoLock) } return op } @@ -420,17 +421,13 @@ func insertSelectPlan( // output of the select plan will be used to insert rows into the table. insertSelect := &InsertSelection{ - Select: &LockAndComment{ - Source: selOp, - Lock: sqlparser.ShareModeLock, - }, - Insert: routeOp, + binaryOperator: newBinaryOp(newLockAndComment(selOp, nil, sqlparser.ShareModeLock), routeOp), } // When the table you are streaming data from and table you are inserting from are same. // Then due to locking of the index range on the table we might not be able to insert into the table. // Therefore, instead of streaming, this flag will ensure the records are first read and then inserted. - insertTbl := insOp.TablesUsed()[0] + insertTbl := insOp.tableTarget() selTables := TablesUsed(selOp) for _, tbl := range selTables { if insertTbl == tbl { diff --git a/go/vt/vtgate/planbuilder/operators/insert_selection.go b/go/vt/vtgate/planbuilder/operators/insert_selection.go index 70bda0a990a..5f806bbda0b 100644 --- a/go/vt/vtgate/planbuilder/operators/insert_selection.go +++ b/go/vt/vtgate/planbuilder/operators/insert_selection.go @@ -23,8 +23,7 @@ import ( // InsertSelection operator represents an INSERT into SELECT FROM query. // It holds the operators for running the selection and insertion. type InsertSelection struct { - Select Operator - Insert Operator + binaryOperator // ForceNonStreaming when true, select first then insert, this is to avoid locking rows by select for insert. ForceNonStreaming bool @@ -33,21 +32,13 @@ type InsertSelection struct { noPredicates } -func (is *InsertSelection) Clone(inputs []Operator) Operator { - return &InsertSelection{ - Select: inputs[0], - Insert: inputs[1], - ForceNonStreaming: is.ForceNonStreaming, - } -} - -func (is *InsertSelection) Inputs() []Operator { - return []Operator{is.Select, is.Insert} -} +var _ Operator = (*InsertSelection)(nil) -func (is *InsertSelection) SetInputs(inputs []Operator) { - is.Select = inputs[0] - is.Insert = inputs[1] +func (is *InsertSelection) Clone(inputs []Operator) Operator { + klone := *is + klone.LHS = inputs[0] + klone.RHS = inputs[1] + return &klone } func (is *InsertSelection) ShortDescription() string { @@ -61,4 +52,10 @@ func (is *InsertSelection) GetOrdering(*plancontext.PlanningContext) []OrderBy { return nil } -var _ Operator = (*InsertSelection)(nil) +func (is *InsertSelection) Select() Operator { + return is.LHS +} + +func (is *InsertSelection) Insert() Operator { + return is.RHS +} diff --git a/go/vt/vtgate/planbuilder/operators/join.go b/go/vt/vtgate/planbuilder/operators/join.go index 71d2e5a8048..ff4915527a7 100644 --- a/go/vt/vtgate/planbuilder/operators/join.go +++ b/go/vt/vtgate/planbuilder/operators/join.go @@ -17,14 +17,16 @@ limitations under the License. package operators import ( + "vitess.io/vitess/go/slice" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/semantics" ) // Join represents a join. If we have a predicate, this is an inner join. If no predicate exists, it is a cross join type Join struct { - LHS, RHS Operator + binaryOperator Predicate sqlparser.Expr // JoinType is permitted to store only 3 of the possible values // NormalJoinType, StraightJoinType and LeftJoinType. @@ -40,28 +42,13 @@ func (j *Join) Clone(inputs []Operator) Operator { clone := *j clone.LHS = inputs[0] clone.RHS = inputs[1] - return &Join{ - LHS: inputs[0], - RHS: inputs[1], - Predicate: j.Predicate, - JoinType: j.JoinType, - } + return &clone } func (j *Join) GetOrdering(*plancontext.PlanningContext) []OrderBy { return nil } -// Inputs implements the Operator interface -func (j *Join) Inputs() []Operator { - return []Operator{j.LHS, j.RHS} -} - -// SetInputs implements the Operator interface -func (j *Join) SetInputs(ops []Operator) { - j.LHS, j.RHS = ops[0], ops[1] -} - func (j *Join) Compact(ctx *plancontext.PlanningContext) (Operator, *ApplyResult) { if !j.JoinType.IsCommutative() { // if we can't move tables around, we can't merge these inputs @@ -87,7 +74,10 @@ func (j *Join) Compact(ctx *plancontext.PlanningContext) (Operator, *ApplyResult func createStraightJoin(ctx *plancontext.PlanningContext, join *sqlparser.JoinTableExpr, lhs, rhs Operator) Operator { // for inner joins we can treat the predicates as filters on top of the join - joinOp := &Join{LHS: lhs, RHS: rhs, JoinType: join.Join} + joinOp := &Join{ + binaryOperator: newBinaryOp(lhs, rhs), + JoinType: join.Join, + } return addJoinPredicates(ctx, join.Condition.On, joinOp) } @@ -103,7 +93,10 @@ func createLeftOuterJoin(ctx *plancontext.PlanningContext, join *sqlparser.JoinT join.Join = sqlparser.NaturalLeftJoinType } - joinOp := &Join{LHS: lhs, RHS: rhs, JoinType: join.Join} + joinOp := &Join{ + binaryOperator: newBinaryOp(lhs, rhs), + JoinType: join.Join, + } // mark the RHS as outer tables so we know which columns are nullable ctx.OuterTables = ctx.OuterTables.Merge(TableID(rhs)) @@ -141,11 +134,49 @@ func addJoinPredicates( if subq != nil { continue } + + // if we are inside a CTE, we need to check if we depend on the recursion table + if cte := ctx.ActiveCTE(); cte != nil && ctx.SemTable.DirectDeps(pred).IsOverlapping(cte.Id) { + original := pred + pred = addCTEPredicate(ctx, pred, cte) + ctx.AddJoinPredicates(original, pred) + } op = op.AddPredicate(ctx, pred) } return sqc.getRootOperator(op, nil) } +// addCTEPredicate breaks the expression into LHS and RHS +func addCTEPredicate( + ctx *plancontext.PlanningContext, + pred sqlparser.Expr, + cte *plancontext.ContextCTE, +) sqlparser.Expr { + expr := breakCTEExpressionInLhsAndRhs(ctx, pred, cte.Id) + cte.Predicates = append(cte.Predicates, expr) + return expr.RightExpr +} + +func breakCTEExpressionInLhsAndRhs(ctx *plancontext.PlanningContext, pred sqlparser.Expr, lhsID semantics.TableSet) *plancontext.RecurseExpression { + col := breakExpressionInLHSandRHS(ctx, pred, lhsID) + + lhsExprs := slice.Map(col.LHSExprs, func(bve BindVarExpr) plancontext.BindVarExpr { + col, ok := bve.Expr.(*sqlparser.ColName) + if !ok { + panic(vterrors.VT13001("expected column name")) + } + return plancontext.BindVarExpr{ + Name: bve.Name, + Expr: col, + } + }) + return &plancontext.RecurseExpression{ + Original: col.Original, + RightExpr: col.RHSExpr, + LeftExprs: lhsExprs, + } +} + func createJoin(ctx *plancontext.PlanningContext, LHS, RHS Operator) Operator { lqg, lok := LHS.(*QueryGraph) rqg, rok := RHS.(*QueryGraph) @@ -157,7 +188,9 @@ func createJoin(ctx *plancontext.PlanningContext, LHS, RHS Operator) Operator { } return op } - return &Join{LHS: LHS, RHS: RHS} + return &Join{ + binaryOperator: newBinaryOp(LHS, RHS), + } } func (j *Join) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) Operator { diff --git a/go/vt/vtgate/planbuilder/operators/join_merging.go b/go/vt/vtgate/planbuilder/operators/join_merging.go index 8bba8ba57d9..c035b7d11ed 100644 --- a/go/vt/vtgate/planbuilder/operators/join_merging.go +++ b/go/vt/vtgate/planbuilder/operators/join_merging.go @@ -18,64 +18,90 @@ package operators import ( "fmt" - "reflect" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/vindexes" ) // mergeJoinInputs checks whether two operators can be merged into a single one. // If they can be merged, a new operator with the merged routing is returned // If they cannot be merged, nil is returned. -func mergeJoinInputs(ctx *plancontext.PlanningContext, lhs, rhs Operator, joinPredicates []sqlparser.Expr, m *joinMerger) *Route { +func (jm *joinMerger) mergeJoinInputs(ctx *plancontext.PlanningContext, lhs, rhs Operator, joinPredicates []sqlparser.Expr) *Route { lhsRoute, rhsRoute, routingA, routingB, a, b, sameKeyspace := prepareInputRoutes(lhs, rhs) if lhsRoute == nil { return nil } switch { + // We clone the right hand side and try and push all the join predicates that are solved entirely by that side. + // If a dual is on the left side, and it is a left join (all right joins are changed to left joins), then we can only merge if the right side is a single sharded routing. case a == dual: - // We clone the right hand side and try and push all the join predicates that are solved entirely by that side. - // If a dual is on the left side and it is a left join (all right joins are changed to left joins), then we can only merge if the right side is a single sharded routing. rhsClone := Clone(rhs).(*Route) for _, predicate := range joinPredicates { if ctx.SemTable.DirectDeps(predicate).IsSolvedBy(TableID(rhsClone)) { rhsClone.AddPredicate(ctx, predicate) } } - if !m.joinType.IsInner() && !rhsClone.Routing.OpCode().IsSingleShard() { + if !jm.joinType.IsInner() && !rhsClone.Routing.OpCode().IsSingleShard() { return nil } - return m.merge(ctx, lhsRoute, rhsClone, rhsClone.Routing) + return jm.merge(ctx, lhsRoute, rhsClone, rhsClone.Routing) + + // If a dual is on the right side. case b == dual: - // If a dual is on the right side. - return m.merge(ctx, lhsRoute, rhsRoute, routingA) + return jm.merge(ctx, lhsRoute, rhsRoute, routingA) + + // As both are reference route. We need to merge the alternates as well. + case a == anyShard && b == anyShard && sameKeyspace: + newrouting := mergeAnyShardRoutings(ctx, routingA.(*AnyShardRouting), routingB.(*AnyShardRouting), joinPredicates, jm.joinType) + return jm.merge(ctx, lhsRoute, rhsRoute, newrouting) // an unsharded/reference route can be merged with anything going to that keyspace case a == anyShard && sameKeyspace: - return m.merge(ctx, lhsRoute, rhsRoute, routingB) + return jm.merge(ctx, lhsRoute, rhsRoute, routingB) case b == anyShard && sameKeyspace: - return m.merge(ctx, lhsRoute, rhsRoute, routingA) + return jm.merge(ctx, lhsRoute, rhsRoute, routingA) // None routing can always be merged, as long as we are aiming for the same keyspace case a == none && sameKeyspace: - return m.merge(ctx, lhsRoute, rhsRoute, routingA) + return jm.merge(ctx, lhsRoute, rhsRoute, routingA) case b == none && sameKeyspace: - return m.merge(ctx, lhsRoute, rhsRoute, routingB) + return jm.merge(ctx, lhsRoute, rhsRoute, routingB) // infoSchema routing is complex, so we handle it in a separate method case a == infoSchema && b == infoSchema: - return tryMergeInfoSchemaRoutings(ctx, routingA, routingB, m, lhsRoute, rhsRoute) + return tryMergeInfoSchemaRoutings(ctx, routingA, routingB, jm, lhsRoute, rhsRoute) // sharded routing is complex, so we handle it in a separate method case a == sharded && b == sharded: - return tryMergeJoinShardedRouting(ctx, lhsRoute, rhsRoute, m, joinPredicates) + return tryMergeShardedRouting(ctx, lhsRoute, rhsRoute, jm, joinPredicates) default: return nil } } +func mergeAnyShardRoutings(ctx *plancontext.PlanningContext, a, b *AnyShardRouting, joinPredicates []sqlparser.Expr, joinType sqlparser.JoinType) *AnyShardRouting { + alternates := make(map[*vindexes.Keyspace]*Route) + for ak, av := range a.Alternates { + for bk, bv := range b.Alternates { + // only same keyspace alternates can be merged. + if ak != bk { + continue + } + op, _ := mergeOrJoin(ctx, av, bv, joinPredicates, joinType) + if r, ok := op.(*Route); ok { + alternates[ak] = r + } + } + } + return &AnyShardRouting{ + keyspace: a.keyspace, + Alternates: alternates, + } +} + func prepareInputRoutes(lhs Operator, rhs Operator) (*Route, *Route, Routing, Routing, routingType, routingType, bool) { lhsRoute, rhsRoute := operatorsToRoutes(lhs, rhs) if lhsRoute == nil || rhsRoute == nil { @@ -85,7 +111,6 @@ func prepareInputRoutes(lhs Operator, rhs Operator) (*Route, *Route, Routing, Ro lhsRoute, rhsRoute, routingA, routingB, sameKeyspace := getRoutesOrAlternates(lhsRoute, rhsRoute) a, b := getRoutingType(routingA), getRoutingType(routingB) - return lhsRoute, rhsRoute, routingA, routingB, a, b, sameKeyspace } @@ -161,10 +186,6 @@ func getRoutesOrAlternates(lhsRoute, rhsRoute *Route) (*Route, *Route, Routing, return lhsRoute, rhsRoute, routingA, routingB, sameKeyspace } -func getTypeName(myvar interface{}) string { - return reflect.TypeOf(myvar).String() -} - func getRoutingType(r Routing) routingType { switch r.(type) { case *InfoSchemaRouting: @@ -215,8 +236,8 @@ func (jm *joinMerger) getApplyJoin(ctx *plancontext.PlanningContext, op1, op2 *R func (jm *joinMerger) merge(ctx *plancontext.PlanningContext, op1, op2 *Route, r Routing) *Route { return &Route{ - Source: jm.getApplyJoin(ctx, op1, op2), - MergedWith: []*Route{op2}, - Routing: r, + unaryOperator: newUnaryOp(jm.getApplyJoin(ctx, op1, op2)), + MergedWith: []*Route{op2}, + Routing: r, } } diff --git a/go/vt/vtgate/planbuilder/operators/joins.go b/go/vt/vtgate/planbuilder/operators/joins.go index 86cdf06fe7e..fb740fd1920 100644 --- a/go/vt/vtgate/planbuilder/operators/joins.go +++ b/go/vt/vtgate/planbuilder/operators/joins.go @@ -17,7 +17,10 @@ limitations under the License. package operators import ( + "fmt" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" "vitess.io/vitess/go/vt/vtgate/semantics" ) @@ -86,7 +89,7 @@ func AddPredicate( return join } - return nil + panic(vterrors.VT13001(fmt.Sprintf("pushed wrong predicate to the join: %s", sqlparser.String(expr)))) } // we are looking for predicates like `tbl.col = <>` or `<> = tbl.col`, diff --git a/go/vt/vtgate/planbuilder/operators/keys.go b/go/vt/vtgate/planbuilder/operators/keys.go new file mode 100644 index 00000000000..f5b592b2291 --- /dev/null +++ b/go/vt/vtgate/planbuilder/operators/keys.go @@ -0,0 +1,240 @@ +/* +Copyright 2024 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 operators + +import ( + "encoding/json" + "fmt" + "slices" + "sort" + "strings" + + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" +) + +type ( + Column struct { + Table string + Name string + } + ColumnUse struct { + Column Column + Uses sqlparser.ComparisonExprOperator + } + VExplainKeys struct { + StatementType string `json:"statementType"` + TableName []string `json:"tableName,omitempty"` + GroupingColumns []Column `json:"groupingColumns,omitempty"` + JoinColumns []ColumnUse `json:"joinColumns,omitempty"` + FilterColumns []ColumnUse `json:"filterColumns,omitempty"` + SelectColumns []Column `json:"selectColumns,omitempty"` + } +) + +func (c Column) MarshalJSON() ([]byte, error) { + if c.Table != "" { + return json.Marshal(fmt.Sprintf("%s.%s", c.Table, c.Name)) + } + return json.Marshal(c.Name) +} + +func (c *Column) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + parts := strings.Split(s, ".") + if len(parts) > 1 { + c.Table = parts[0] + c.Name = parts[1] + } else { + c.Name = s + } + return nil +} + +func (cu ColumnUse) MarshalJSON() ([]byte, error) { + return json.Marshal(fmt.Sprintf("%s %s", cu.Column, cu.Uses.JSONString())) +} + +func (cu *ColumnUse) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + spaceIdx := strings.LastIndex(s, " ") + if spaceIdx == -1 { + return fmt.Errorf("invalid ColumnUse format: %s", s) + } + + for i := spaceIdx - 1; i >= 0; i-- { + // table.column not like + // table.`tricky not` like + if s[i] == '`' || s[i] == '.' { + break + } + if s[i] == ' ' { + spaceIdx = i + break + } + if i == 0 { + return fmt.Errorf("invalid ColumnUse format: %s", s) + } + } + + colStr, opStr := s[:spaceIdx], s[spaceIdx+1:] + + err := cu.Column.UnmarshalJSON([]byte(`"` + colStr + `"`)) + if err != nil { + return fmt.Errorf("failed to unmarshal column: %w", err) + } + + cu.Uses, err = sqlparser.ComparisonExprOperatorFromJson(strings.ToLower(opStr)) + if err != nil { + return fmt.Errorf("failed to unmarshal operator: %w", err) + } + return nil +} + +func (c Column) String() string { + return fmt.Sprintf("%s.%s", c.Table, c.Name) +} + +func (cu ColumnUse) String() string { + return fmt.Sprintf("%s %s", cu.Column, cu.Uses.JSONString()) +} + +type columnUse struct { + col *sqlparser.ColName + use sqlparser.ComparisonExprOperator +} + +func GetVExplainKeys(ctx *plancontext.PlanningContext, stmt sqlparser.Statement) (result VExplainKeys) { + var groupingColumns, selectColumns []*sqlparser.ColName + var filterColumns, joinColumns []columnUse + + addPredicate := func(predicate sqlparser.Expr) { + predicates := sqlparser.SplitAndExpression(nil, predicate) + for _, expr := range predicates { + switch cmp := expr.(type) { + case *sqlparser.ComparisonExpr: + lhs, lhsOK := cmp.Left.(*sqlparser.ColName) + rhs, rhsOK := cmp.Right.(*sqlparser.ColName) + + var output = &filterColumns + if lhsOK && rhsOK && ctx.SemTable.RecursiveDeps(lhs) != ctx.SemTable.RecursiveDeps(rhs) { + // If the columns are from different tables, they are considered join columns + output = &joinColumns + } + + if lhsOK { + *output = append(*output, columnUse{lhs, cmp.Operator}) + } + + if switchedOp, ok := cmp.Operator.SwitchSides(); rhsOK && ok { + *output = append(*output, columnUse{rhs, switchedOp}) + } + case *sqlparser.BetweenExpr: + if col, ok := cmp.Left.(*sqlparser.ColName); ok { + // a BETWEEN 100 AND 200 is equivalent to a >= 100 AND a <= 200 + filterColumns = append(filterColumns, + columnUse{col, sqlparser.GreaterEqualOp}, + columnUse{col, sqlparser.LessEqualOp}) + } + } + + } + } + + _ = sqlparser.VisitSQLNode(stmt, func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.Where: + addPredicate(node.Expr) + case *sqlparser.JoinCondition: + addPredicate(node.On) + case *sqlparser.GroupBy: + for _, expr := range node.Exprs { + col, ok := expr.(*sqlparser.ColName) + if ok { + groupingColumns = append(groupingColumns, col) + } + } + case *sqlparser.AliasedExpr: + _ = sqlparser.VisitSQLNode(node, func(e sqlparser.SQLNode) (kontinue bool, err error) { + if col, ok := e.(*sqlparser.ColName); ok { + selectColumns = append(selectColumns, col) + } + return true, nil + }) + } + + return true, nil + }) + + return VExplainKeys{ + SelectColumns: getUniqueColNames(ctx, selectColumns), + GroupingColumns: getUniqueColNames(ctx, groupingColumns), + JoinColumns: getUniqueColUsages(ctx, joinColumns), + FilterColumns: getUniqueColUsages(ctx, filterColumns), + StatementType: sqlparser.ASTToStatementType(stmt).String(), + } +} + +func getUniqueColNames(ctx *plancontext.PlanningContext, inCols []*sqlparser.ColName) (columns []Column) { + for _, col := range inCols { + column := createColumn(ctx, col) + if column != nil { + columns = append(columns, *column) + } + } + sort.Slice(columns, func(i, j int) bool { + return columns[i].String() < columns[j].String() + }) + + return slices.Compact(columns) +} + +func getUniqueColUsages(ctx *plancontext.PlanningContext, inCols []columnUse) (columns []ColumnUse) { + for _, col := range inCols { + column := createColumn(ctx, col.col) + if column != nil { + columns = append(columns, ColumnUse{Column: *column, Uses: col.use}) + } + } + + sort.Slice(columns, func(i, j int) bool { + return columns[i].Column.String() < columns[j].Column.String() + }) + return slices.Compact(columns) +} + +func createColumn(ctx *plancontext.PlanningContext, col *sqlparser.ColName) *Column { + tableInfo, err := ctx.SemTable.TableInfoForExpr(col) + if err != nil { + return nil + } + table := tableInfo.GetVindexTable() + if table == nil { + return nil + } + return &Column{ + // we want the escaped versions of the names + Table: sqlparser.String(table.Name), + Name: sqlparser.String(col.Name), + } +} diff --git a/go/vt/vtgate/planbuilder/operators/keys_test.go b/go/vt/vtgate/planbuilder/operators/keys_test.go new file mode 100644 index 00000000000..5c60e62c70c --- /dev/null +++ b/go/vt/vtgate/planbuilder/operators/keys_test.go @@ -0,0 +1,67 @@ +/* +Copyright 2024 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 operators + +import ( + "encoding/json" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/sqlparser" +) + +func TestMarshalUnmarshal(t *testing.T) { + // Test that marshalling and unmarshalling a struct works as expected + original := VExplainKeys{ + StatementType: "SELECT", + TableName: []string{"users", "orders"}, + GroupingColumns: []Column{ + {Table: "orders", Name: "category"}, + {Table: "users", Name: "department"}, + }, + JoinColumns: []ColumnUse{ + {Column: Column{Table: "users", Name: "id"}, Uses: sqlparser.EqualOp}, + {Column: Column{Table: "orders", Name: "user_id"}, Uses: sqlparser.EqualOp}, + }, + FilterColumns: []ColumnUse{ + {Column: Column{Table: "users", Name: "age"}, Uses: sqlparser.GreaterThanOp}, + {Column: Column{Table: "orders", Name: "total"}, Uses: sqlparser.LessThanOp}, + {Column: Column{Table: "orders", Name: "`tricky name not`"}, Uses: sqlparser.InOp}, + }, + SelectColumns: []Column{ + {Table: "users", Name: "name"}, + {Table: "users", Name: "email"}, + {Table: "orders", Name: "amount"}, + }, + } + + jsonData, err := json.Marshal(original) + require.NoError(t, err) + + t.Logf("Marshalled JSON: %s", jsonData) + + var unmarshalled VExplainKeys + err = json.Unmarshal(jsonData, &unmarshalled) + require.NoError(t, err) + + if diff := cmp.Diff(original, unmarshalled); diff != "" { + t.Errorf("Unmarshalled struct does not match original (-want +got):\n%s", diff) + t.FailNow() + } +} diff --git a/go/vt/vtgate/planbuilder/operators/limit.go b/go/vt/vtgate/planbuilder/operators/limit.go index 1801e57c1c9..4549b85fcda 100644 --- a/go/vt/vtgate/planbuilder/operators/limit.go +++ b/go/vt/vtgate/planbuilder/operators/limit.go @@ -22,8 +22,8 @@ import ( ) type Limit struct { - Source Operator - AST *sqlparser.Limit + unaryOperator + AST *sqlparser.Limit // Top is true if the limit is a top level limit. To optimise, we push LIMIT to the RHS of joins, // but we need to still LIMIT the total result set to the top level limit. @@ -33,21 +33,19 @@ type Limit struct { Pushed bool } -func (l *Limit) Clone(inputs []Operator) Operator { +func newLimit(op Operator, ast *sqlparser.Limit, top bool) *Limit { return &Limit{ - Source: inputs[0], - AST: sqlparser.Clone(l.AST), - Top: l.Top, - Pushed: l.Pushed, + unaryOperator: newUnaryOp(op), + AST: ast, + Top: top, } } -func (l *Limit) Inputs() []Operator { - return []Operator{l.Source} -} - -func (l *Limit) SetInputs(operators []Operator) { - l.Source = operators[0] +func (l *Limit) Clone(inputs []Operator) Operator { + k := *l + k.Source = inputs[0] + k.AST = sqlparser.Clone(l.AST) + return &k } func (l *Limit) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) Operator { diff --git a/go/vt/vtgate/planbuilder/operators/mirror.go b/go/vt/vtgate/planbuilder/operators/mirror.go new file mode 100644 index 00000000000..82a431af0a2 --- /dev/null +++ b/go/vt/vtgate/planbuilder/operators/mirror.go @@ -0,0 +1,93 @@ +/* +Copyright 2024 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 operators + +import ( + "fmt" + + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" +) + +type ( + PercentBasedMirror struct { + binaryOperator + Percent float32 + } +) + +var _ Operator = (*PercentBasedMirror)(nil) + +func (m *PercentBasedMirror) Operator() Operator { + return m.LHS +} + +func (m *PercentBasedMirror) Target() Operator { + return m.RHS +} + +func NewPercentBasedMirror(percent float32, operator, target Operator) *PercentBasedMirror { + return &PercentBasedMirror{ + binaryOperator: newBinaryOp(operator, target), + Percent: percent, + } +} + +// Clone will return a copy of this operator, protected so changed to the original will not impact the clone +func (m *PercentBasedMirror) Clone(inputs []Operator) Operator { + cloneMirror := *m + cloneMirror.SetInputs(inputs) + return &cloneMirror +} + +// AddPredicate is used to push predicates. It pushed it as far down as is possible in the tree. +// If we encounter a join and the predicate depends on both sides of the join, the predicate will be split into two parts, +// where data is fetched from the LHS of the join to be used in the evaluation on the RHS +// TODO: we should remove this and replace it with rewriters +func (m *PercentBasedMirror) AddPredicate(*plancontext.PlanningContext, sqlparser.Expr) Operator { + panic(vterrors.VT13001("not supported")) +} + +func (m *PercentBasedMirror) AddColumn(*plancontext.PlanningContext, bool, bool, *sqlparser.AliasedExpr) int { + panic(vterrors.VT13001("not supported")) +} + +func (m *PercentBasedMirror) FindCol(ctx *plancontext.PlanningContext, expr sqlparser.Expr, underRoute bool) int { + return m.Operator().FindCol(ctx, expr, underRoute) +} + +func (m *PercentBasedMirror) GetColumns(ctx *plancontext.PlanningContext) []*sqlparser.AliasedExpr { + return m.Operator().GetColumns(ctx) +} + +func (m *PercentBasedMirror) GetSelectExprs(ctx *plancontext.PlanningContext) sqlparser.SelectExprs { + return m.Operator().GetSelectExprs(ctx) +} + +func (m *PercentBasedMirror) ShortDescription() string { + return fmt.Sprintf("PercentBasedMirror (%.02f%%)", m.Percent) +} + +func (m *PercentBasedMirror) GetOrdering(ctx *plancontext.PlanningContext) []OrderBy { + return m.Operator().GetOrdering(ctx) +} + +// AddWSColumn implements Operator. +func (m *PercentBasedMirror) AddWSColumn(*plancontext.PlanningContext, int, bool) int { + panic(vterrors.VT13001("not supported")) +} diff --git a/go/vt/vtgate/planbuilder/operators/offset_planning.go b/go/vt/vtgate/planbuilder/operators/offset_planning.go index 7a9cedccb89..62abff29e57 100644 --- a/go/vt/vtgate/planbuilder/operators/offset_planning.go +++ b/go/vt/vtgate/planbuilder/operators/offset_planning.go @@ -25,20 +25,19 @@ import ( "vitess.io/vitess/go/vt/vtgate/semantics" ) +type offsettable interface { + Operator + planOffsets(ctx *plancontext.PlanningContext) Operator +} + // planOffsets will walk the tree top down, adding offset information to columns in the tree for use in further optimization, func planOffsets(ctx *plancontext.PlanningContext, root Operator) Operator { - type offsettable interface { - Operator - planOffsets(ctx *plancontext.PlanningContext) Operator - } - visitor := func(in Operator, _ semantics.TableSet, _ bool) (Operator, *ApplyResult) { switch op := in.(type) { case *Horizon: panic(vterrors.VT13001(fmt.Sprintf("should not see %T here", in))) case offsettable: newOp := op.planOffsets(ctx) - if newOp == nil { newOp = op } @@ -47,7 +46,13 @@ func planOffsets(ctx *plancontext.PlanningContext, root Operator) Operator { fmt.Println("Planned offsets for:") fmt.Println(ToTree(newOp)) } - return newOp, nil + + if newOp == op { + return newOp, nil + } else { + // We got a new operator from plan offsets. We should return that something has changed. + return newOp, Rewrote("planning offsets introduced a new operator") + } } return in, NoRewrite } @@ -115,50 +120,6 @@ func findAggregatorInSource(op Operator) *Aggregator { } } -// addColumnsToInput adds columns needed by an operator to its input. -// This happens only when the filter expression can be retrieved as an offset from the underlying mysql. -func addColumnsToInput(ctx *plancontext.PlanningContext, root Operator) Operator { - - addColumnsNeededByFilter := func(in Operator, _ semantics.TableSet, _ bool) (Operator, *ApplyResult) { - addedCols := false - filter, ok := in.(*Filter) - if !ok { - return in, NoRewrite - } - - var neededAggrs []sqlparser.Expr - extractAggrs := func(cursor *sqlparser.CopyOnWriteCursor) { - node := cursor.Node() - if ctx.IsAggr(node) { - neededAggrs = append(neededAggrs, node.(sqlparser.Expr)) - } - } - - for _, expr := range filter.Predicates { - _ = sqlparser.CopyOnRewrite(expr, dontEnterSubqueries, extractAggrs, nil) - } - - if neededAggrs == nil { - return in, NoRewrite - } - - aggregator := findAggregatorInSource(filter.Source) - for _, aggr := range neededAggrs { - if aggregator.FindCol(ctx, aggr, false) == -1 { - aggregator.addColumnWithoutPushing(ctx, aeWrap(aggr), false) - addedCols = true - } - } - - if addedCols { - return in, Rewrote("added columns because filter needs it") - } - return in, NoRewrite - } - - return TopDown(root, TableID, addColumnsNeededByFilter, stopAtRoute) -} - // isolateDistinctFromUnion will pull out the distinct from a union operator func isolateDistinctFromUnion(_ *plancontext.PlanningContext, root Operator) Operator { visitor := func(in Operator, _ semantics.TableSet, isRoot bool) (Operator, *ApplyResult) { @@ -169,10 +130,7 @@ func isolateDistinctFromUnion(_ *plancontext.PlanningContext, root Operator) Ope union.distinct = false - distinct := &Distinct{ - Required: true, - Source: union, - } + distinct := newDistinct(union, nil, true) return distinct, Rewrote("pulled out DISTINCT from union") } diff --git a/go/vt/vtgate/planbuilder/operators/operator.go b/go/vt/vtgate/planbuilder/operators/operator.go index f1a38974c93..42658e4c52e 100644 --- a/go/vt/vtgate/planbuilder/operators/operator.go +++ b/go/vt/vtgate/planbuilder/operators/operator.go @@ -54,7 +54,8 @@ type ( // Inputs returns the inputs for this operator Inputs() []Operator - // SetInputs changes the inputs for this op + // SetInputs changes the inputs for this op. + // We don't need to check the size of the inputs, as the planner will ensure that the inputs are correct SetInputs([]Operator) // AddPredicate is used to push predicates. It pushed it as far down as is possible in the tree. @@ -85,8 +86,46 @@ type ( // See GroupBy#SimplifiedExpr for more details about this SimplifiedExpr sqlparser.Expr } + + unaryOperator struct { + Operator + Source Operator + } + + binaryOperator struct { + Operator + LHS, RHS Operator + } ) +func newUnaryOp(source Operator) unaryOperator { + return unaryOperator{Source: source} +} + +func newBinaryOp(l, r Operator) binaryOperator { + return binaryOperator{ + LHS: l, + RHS: r, + } +} + +func (s *unaryOperator) Inputs() []Operator { + return []Operator{s.Source} +} + +func (s *unaryOperator) SetInputs(operators []Operator) { + s.Source = operators[0] +} + +func (b *binaryOperator) Inputs() []Operator { + return []Operator{b.LHS, b.RHS} +} + +func (b *binaryOperator) SetInputs(operators []Operator) { + b.LHS = operators[0] + b.RHS = operators[1] +} + // Map takes in a mapping function and applies it to both the expression in OrderBy. func (ob OrderBy) Map(mappingFunc func(sqlparser.Expr) sqlparser.Expr) OrderBy { return OrderBy{ diff --git a/go/vt/vtgate/planbuilder/operators/ordering.go b/go/vt/vtgate/planbuilder/operators/ordering.go index 94c4f3dd846..7e40b420f9e 100644 --- a/go/vt/vtgate/planbuilder/operators/ordering.go +++ b/go/vt/vtgate/planbuilder/operators/ordering.go @@ -26,7 +26,7 @@ import ( ) type Ordering struct { - Source Operator + unaryOperator Offset []int WOffset []int @@ -35,21 +35,20 @@ type Ordering struct { } func (o *Ordering) Clone(inputs []Operator) Operator { - return &Ordering{ - Source: inputs[0], - Offset: slices.Clone(o.Offset), - WOffset: slices.Clone(o.WOffset), - Order: slices.Clone(o.Order), - ResultColumns: o.ResultColumns, - } -} + klone := *o + klone.Source = inputs[0] + klone.Offset = slices.Clone(o.Offset) + klone.WOffset = slices.Clone(o.WOffset) + klone.Order = slices.Clone(o.Order) -func (o *Ordering) Inputs() []Operator { - return []Operator{o.Source} + return &klone } -func (o *Ordering) SetInputs(operators []Operator) { - o.Source = operators[0] +func newOrdering(src Operator, order []OrderBy) Operator { + return &Ordering{ + unaryOperator: newUnaryOp(src), + Order: order, + } } func (o *Ordering) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) Operator { @@ -82,17 +81,25 @@ func (o *Ordering) GetOrdering(*plancontext.PlanningContext) []OrderBy { } func (o *Ordering) planOffsets(ctx *plancontext.PlanningContext) Operator { + var weightStrings []*OrderBy + for _, order := range o.Order { offset := o.Source.AddColumn(ctx, true, false, aeWrap(order.SimplifiedExpr)) o.Offset = append(o.Offset, offset) if !ctx.NeedsWeightString(order.SimplifiedExpr) { - o.WOffset = append(o.WOffset, -1) + weightStrings = append(weightStrings, nil) continue } + weightStrings = append(weightStrings, &order) + } - wsExpr := &sqlparser.WeightStringFuncExpr{Expr: order.SimplifiedExpr} - offset = o.Source.AddColumn(ctx, true, false, aeWrap(wsExpr)) + for i, order := range weightStrings { + if order == nil { + o.WOffset = append(o.WOffset, -1) + continue + } + offset := o.Source.AddWSColumn(ctx, o.Offset[i], false) o.WOffset = append(o.WOffset, offset) } return nil diff --git a/go/vt/vtgate/planbuilder/operators/phases.go b/go/vt/vtgate/planbuilder/operators/phases.go index 9f2178bae05..eb6c42b8724 100644 --- a/go/vt/vtgate/planbuilder/operators/phases.go +++ b/go/vt/vtgate/planbuilder/operators/phases.go @@ -36,6 +36,7 @@ const ( initialPlanning pullDistinctFromUnion delegateAggregation + recursiveCTEHorizons addAggrOrdering cleanOutPerfDistinct dmlWithInput @@ -53,6 +54,8 @@ func (p Phase) String() string { return "pull distinct from UNION" case delegateAggregation: return "split aggregation between vtgate and mysql" + case recursiveCTEHorizons: + return "expand recursive CTE horizons" case addAggrOrdering: return "optimize aggregations with ORDER BY" case cleanOutPerfDistinct: @@ -72,6 +75,8 @@ func (p Phase) shouldRun(s semantics.QuerySignature) bool { return s.Union case delegateAggregation: return s.Aggregation + case recursiveCTEHorizons: + return s.RecursiveCTE case addAggrOrdering: return s.Aggregation case cleanOutPerfDistinct: @@ -93,6 +98,8 @@ func (p Phase) act(ctx *plancontext.PlanningContext, op Operator) Operator { return enableDelegateAggregation(ctx, op) case addAggrOrdering: return addOrderingForAllAggregations(ctx, op) + case recursiveCTEHorizons: + return planRecursiveCTEHorizons(ctx, op) case cleanOutPerfDistinct: return removePerformanceDistinctAboveRoute(ctx, op) case subquerySettling: @@ -207,7 +214,7 @@ func removePerformanceDistinctAboveRoute(_ *plancontext.PlanningContext, op Oper } func enableDelegateAggregation(ctx *plancontext.PlanningContext, op Operator) Operator { - return addColumnsToInput(ctx, op) + return prepareForAggregationPushing(ctx, op) } // addOrderingForAllAggregations is run we have pushed down Aggregators as far down as possible. @@ -242,10 +249,7 @@ func addOrderingFor(aggrOp *Aggregator) { SimplifiedExpr: aggrOp.DistinctExpr, }) } - aggrOp.Source = &Ordering{ - Source: aggrOp.Source, - Order: orderBys, - } + aggrOp.Source = newOrdering(aggrOp.Source, orderBys) } func needsOrdering(ctx *plancontext.PlanningContext, in *Aggregator) bool { @@ -290,10 +294,101 @@ func addLiteralGroupingToRHS(in *ApplyJoin) (Operator, *ApplyResult) { return nil } if len(aggr.Grouping) == 0 { - gb := sqlparser.NewIntLiteral(".0") + gb := sqlparser.NewFloatLiteral(".0") aggr.Grouping = append(aggr.Grouping, NewGroupBy(gb)) } return nil }) return in, NoRewrite } + +// prepareForAggregationPushing adds columns needed by an operator to its input. +// This happens only when the filter expression can be retrieved as an offset from the underlying mysql. +func prepareForAggregationPushing(ctx *plancontext.PlanningContext, root Operator) Operator { + return TopDown(root, TableID, func(in Operator, _ semantics.TableSet, _ bool) (Operator, *ApplyResult) { + filter, ok := in.(*Filter) + if !ok { + return in, NoRewrite + } + + var neededAggrs []sqlparser.Expr + extractAggrs := func(cursor *sqlparser.CopyOnWriteCursor) { + node := cursor.Node() + if ctx.IsAggr(node) { + neededAggrs = append(neededAggrs, node.(sqlparser.Expr)) + } + } + + for _, expr := range filter.Predicates { + _ = sqlparser.CopyOnRewrite(expr, dontEnterSubqueries, extractAggrs, nil) + } + + if neededAggrs == nil { + return in, NoRewrite + } + + addedCols := false + aggregator := findAggregatorInSource(filter.Source) + for _, aggr := range neededAggrs { + if aggregator.FindCol(ctx, aggr, false) == -1 { + aggregator.addColumnWithoutPushing(ctx, aeWrap(aggr), false) + addedCols = true + } + } + + if addedCols { + return in, Rewrote("added columns because filter needs it") + } + return in, NoRewrite + }, stopAtRoute) +} + +// prepareForAggregationPushing adds columns needed by an operator to its input. +// This happens only when the filter expression can be retrieved as an offset from the underlying mysql. +func planRecursiveCTEHorizons(ctx *plancontext.PlanningContext, root Operator) Operator { + return TopDown(root, TableID, func(in Operator, _ semantics.TableSet, _ bool) (Operator, *ApplyResult) { + // These recursive CTEs have not been pushed under a route, so we will have to evaluate it one the vtgate + // That means that we need to turn anything that is coming from the recursion into arguments + rcte, ok := in.(*RecurseCTE) + if !ok { + return in, NoRewrite + } + hz := rcte.Horizon + hz.Source = rcte.Term() + newTerm, _ := expandHorizon(ctx, hz) + pr := findProjection(newTerm) + ap, err := pr.GetAliasedProjections() + if err != nil { + panic(vterrors.VT09015()) + } + + // We need to break the expressions into LHS and RHS, and store them in the CTE for later use + projections := slice.Map(ap, func(p *ProjExpr) *plancontext.RecurseExpression { + recurseExpression := breakCTEExpressionInLhsAndRhs(ctx, p.EvalExpr, rcte.LeftID) + p.EvalExpr = recurseExpression.RightExpr + return recurseExpression + }) + rcte.Projections = projections + rcte.RHS = newTerm + return rcte, Rewrote("expanded horizon on term side of recursive CTE") + }, stopAtRoute) +} + +func findProjection(op Operator) *Projection { + for { + proj, ok := op.(*Projection) + if ok { + return proj + } + inputs := op.Inputs() + if len(inputs) != 1 { + panic(vterrors.VT13001("unexpected multiple inputs")) + } + src := inputs[0] + _, isRoute := src.(*Route) + if isRoute { + panic(vterrors.VT13001("failed to find the projection")) + } + op = src + } +} diff --git a/go/vt/vtgate/planbuilder/operators/plan_query.go b/go/vt/vtgate/planbuilder/operators/plan_query.go index 4d371942c26..dc83c89c72c 100644 --- a/go/vt/vtgate/planbuilder/operators/plan_query.go +++ b/go/vt/vtgate/planbuilder/operators/plan_query.go @@ -43,11 +43,14 @@ import ( "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/semantics" ) type ( // helper type that implements Inputs() returning nil - noInputs struct{} + nullaryOperator struct { + Operator + } // helper type that implements AddColumn() returning an error noColumns struct{} @@ -60,7 +63,7 @@ type ( func PlanQuery(ctx *plancontext.PlanningContext, stmt sqlparser.Statement) (result Operator, err error) { defer PanicHandler(&err) - op := translateQueryToOp(ctx, stmt) + op := translateQueryToOpWithMirroring(ctx, stmt) if DebugOperatorTree { fmt.Println("Initial tree:") @@ -71,13 +74,35 @@ func PlanQuery(ctx *plancontext.PlanningContext, stmt sqlparser.Statement) (resu checkValid(op) op = planQuery(ctx, op) - _, isRoute := op.(*Route) - if !isRoute && ctx.SemTable.NotSingleRouteErr != nil { - // If we got here, we don't have a single shard plan - return nil, ctx.SemTable.NotSingleRouteErr + if err := checkSingleRouteError(ctx, op); err != nil { + return nil, err + } + + return op, nil +} + +// checkSingleRouteError checks if the query has a NotSingleRouteErr and more than one route, and returns an error if it does +func checkSingleRouteError(ctx *plancontext.PlanningContext, op Operator) error { + if ctx.SemTable.NotSingleRouteErr == nil { + return nil + } + routes := 0 + visitF := func(op Operator, _ semantics.TableSet, _ bool) (Operator, *ApplyResult) { + switch op.(type) { + case *Route: + routes++ + } + return op, NoRewrite + } + + // we'll walk the tree and count the number of routes + TopDown(op, TableID, visitF, stopAtRoute) + + if routes <= 1 { + return nil } - return op, err + return ctx.SemTable.NotSingleRouteErr } func PanicHandler(err *error) { @@ -94,14 +119,14 @@ func PanicHandler(err *error) { } // Inputs implements the Operator interface -func (noInputs) Inputs() []Operator { +func (nullaryOperator) Inputs() []Operator { return nil } // SetInputs implements the Operator interface -func (noInputs) SetInputs(ops []Operator) { +func (nullaryOperator) SetInputs(ops []Operator) { if len(ops) > 0 { - panic("the noInputs operator does not have inputs") + panic("the nullaryOperator operator does not have inputs") } } diff --git a/go/vt/vtgate/planbuilder/operators/projection.go b/go/vt/vtgate/planbuilder/operators/projection.go index d8ede63b612..e894ab433b4 100644 --- a/go/vt/vtgate/planbuilder/operators/projection.go +++ b/go/vt/vtgate/planbuilder/operators/projection.go @@ -32,7 +32,7 @@ import ( // Projection is used when we need to evaluate expressions on the vtgate // It uses the evalengine to accomplish its goal type Projection struct { - Source Operator + unaryOperator // Columns contain the expressions as viewed from the outside of this operator Columns ProjCols @@ -87,7 +87,7 @@ type ( ProjExpr struct { Original *sqlparser.AliasedExpr // this is the expression the user asked for. should only be used to decide on the column alias - EvalExpr sqlparser.Expr // EvalExpr is the expression that will be evaluated at runtime + EvalExpr sqlparser.Expr // EvalExpr represents the expression evaluated at runtime or used when the ProjExpr is pushed under a route ColExpr sqlparser.Expr // ColExpr is used during planning to figure out which column this ProjExpr is representing Info ExprInfo // Here we store information about evalengine, offsets or subqueries } @@ -127,8 +127,8 @@ func newProjExprWithInner(ae *sqlparser.AliasedExpr, in sqlparser.Expr) *ProjExp func newAliasedProjection(src Operator) *Projection { return &Projection{ - Source: src, - Columns: AliasedProjections{}, + unaryOperator: newUnaryOp(src), + Columns: AliasedProjections{}, } } @@ -383,8 +383,18 @@ func (p *Projection) addColumn( return p.addProjExpr(pe) } - // we need to push down this column to our input - inputOffset := p.Source.AddColumn(ctx, true, addToGroupBy, ae) + var inputOffset int + if nothingNeedsFetching(ctx, expr) { + // if we don't need to fetch anything, we could just evaluate it in the projection + // we still check if it's there - if it is, we can, we should use it + inputOffset = p.Source.FindCol(ctx, expr, false) + if inputOffset < 0 { + return p.addProjExpr(pe) + } + } else { + // we need to push down this column to our input + inputOffset = p.Source.AddColumn(ctx, true, addToGroupBy, ae) + } pe.Info = Offset(inputOffset) // since we already know the offset, let's save the information return p.addProjExpr(pe) @@ -395,20 +405,9 @@ func (po *EvalEngine) expr() {} func (po SubQueryExpression) expr() {} func (p *Projection) Clone(inputs []Operator) Operator { - return &Projection{ - Source: inputs[0], - Columns: p.Columns, // TODO don't think we need to deep clone here - DT: p.DT, - FromAggr: p.FromAggr, - } -} - -func (p *Projection) Inputs() []Operator { - return []Operator{p.Source} -} - -func (p *Projection) SetInputs(operators []Operator) { - p.Source = operators[0] + klone := *p + klone.Source = inputs[0] + return &klone } func (p *Projection) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) Operator { diff --git a/go/vt/vtgate/planbuilder/operators/projection_pushing.go b/go/vt/vtgate/planbuilder/operators/projection_pushing.go index b5c6a10bb78..1d1a5a04501 100644 --- a/go/vt/vtgate/planbuilder/operators/projection_pushing.go +++ b/go/vt/vtgate/planbuilder/operators/projection_pushing.go @@ -320,7 +320,7 @@ func splitSubqueryExpression( alias string, ) applyJoinColumn { col := join.getJoinColumnFor(ctx, pe.Original, pe.ColExpr, false) - return pushDownSplitJoinCol(col, lhs, pe, alias, rhs) + return pushDownSplitJoinCol(col, lhs, rhs, pe, alias) } func splitUnexploredExpression( @@ -334,23 +334,49 @@ func splitUnexploredExpression( original := sqlparser.Clone(pe.Original) expr := pe.ColExpr - var colName *sqlparser.ColName - if dt != nil { - if !pe.isSameInAndOut(ctx) { - panic(vterrors.VT13001("derived table columns must be the same in and out")) - } - colName = sqlparser.NewColNameWithQualifier(pe.Original.ColumnName(), sqlparser.NewTableName(dt.Alias)) - ctx.SemTable.CopySemanticInfo(expr, colName) - } - // Get a applyJoinColumn for the current expression. col := join.getJoinColumnFor(ctx, original, expr, false) - col.DTColName = colName - return pushDownSplitJoinCol(col, lhs, pe, alias, rhs) + if dt == nil { + return pushDownSplitJoinCol(col, lhs, rhs, pe, alias) + } + + if !pe.isSameInAndOut(ctx) { + panic(vterrors.VT13001("derived table columns must be the same in and out")) + } + // we are pushing a derived projection through a join. that means that after this rewrite, we are on top of the + // derived table divider, and can only see the projected columns, not the underlying expressions + colName := sqlparser.NewColNameWithQualifier(pe.Original.ColumnName(), sqlparser.NewTableName(dt.Alias)) + ctx.SemTable.CopySemanticInfo(expr, colName) + col.Original = colName + if alias == "" { + alias = pe.Original.ColumnName() + } + + // Update the left and right child columns and names based on the applyJoinColumn type. + switch { + case col.IsPureLeft(): + lhs.add(pe, alias) + col.LHSExprs[0].Expr = colName + case col.IsPureRight(): + rhs.add(pe, alias) + col.RHSExpr = colName + default: + for _, lhsExpr := range col.LHSExprs { + ae := aeWrap(lhsExpr.Expr) + columnName := ae.ColumnName() + lhs.add(newProjExpr(ae), columnName) + } + innerPE := newProjExprWithInner(pe.Original, col.RHSExpr) + innerPE.ColExpr = col.RHSExpr + col.RHSExpr = colName + innerPE.Info = pe.Info + rhs.add(innerPE, alias) + } + return col } -func pushDownSplitJoinCol(col applyJoinColumn, lhs *projector, pe *ProjExpr, alias string, rhs *projector) applyJoinColumn { +func pushDownSplitJoinCol(col applyJoinColumn, lhs, rhs *projector, pe *ProjExpr, alias string) applyJoinColumn { // Update the left and right child columns and names based on the applyJoinColumn type. switch { case col.IsPureLeft(): diff --git a/go/vt/vtgate/planbuilder/operators/query_planning.go b/go/vt/vtgate/planbuilder/operators/query_planning.go index e88fb53edb3..5fe0c7773c1 100644 --- a/go/vt/vtgate/planbuilder/operators/query_planning.go +++ b/go/vt/vtgate/planbuilder/operators/query_planning.go @@ -102,11 +102,21 @@ func runRewriters(ctx *plancontext.PlanningContext, root Operator) Operator { return tryPushDelete(in) case *Update: return tryPushUpdate(in) + case *RecurseCTE: + return tryMergeRecurse(ctx, in) + default: return in, NoRewrite } } + if pbm, ok := root.(*PercentBasedMirror); ok { + pbm.SetInputs([]Operator{ + runRewriters(ctx, pbm.Operator()), + runRewriters(ctx.UseMirror(), pbm.Target()), + }) + } + return FixedPointBottomUp(root, TableID, visitor, stopAtRoute) } @@ -150,27 +160,15 @@ func pushLockAndComment(l *LockAndComment) (Operator, *ApplyResult) { src.Lock = l.Lock.GetHighestOrderLock(src.Lock) return src, Rewrote("put lock and comment into route") case *SubQueryContainer: - src.Outer = &LockAndComment{ - Source: src.Outer, - Comments: l.Comments, - Lock: l.Lock, - } + src.Outer = newLockAndComment(src.Outer, l.Comments, l.Lock) for _, sq := range src.Inner { - sq.Subquery = &LockAndComment{ - Source: sq.Subquery, - Comments: l.Comments, - Lock: l.Lock, - } + sq.Subquery = newLockAndComment(sq.Subquery, l.Comments, l.Lock) } return src, Rewrote("push lock and comment into subquery container") default: inputs := src.Inputs() for i, op := range inputs { - inputs[i] = &LockAndComment{ - Source: op, - Comments: l.Comments, - Lock: l.Lock, - } + inputs[i] = newLockAndComment(op, l.Comments, l.Lock) } src.SetInputs(inputs) return src, Rewrote("pushed down lock and comments") @@ -426,10 +424,7 @@ func createPushedLimit(ctx *plancontext.PlanningContext, src Operator, orig *Lim pushedLimit.Rowcount = getLimitExpression(ctx, plus) pushedLimit.Offset = nil } - return &Limit{ - Source: src, - AST: pushedLimit, - } + return newLimit(src, pushedLimit, false) } // getLimitExpression is a helper function to simplify an expression using the evalengine @@ -496,11 +491,8 @@ func setUpperLimit(in *Limit) (Operator, *ApplyResult) { return SkipChildren } case *Route: - newSrc := &Limit{ - Source: op.Source, - AST: &sqlparser.Limit{Rowcount: sqlparser.NewArgument(engine.UpperLimitStr)}, - } - op.Source = newSrc + ast := &sqlparser.Limit{Rowcount: sqlparser.NewArgument(engine.UpperLimitStr)} + op.Source = newLimit(op.Source, ast, false) result = result.Merge(Rewrote("push upper limit under route")) return SkipChildren } @@ -733,7 +725,6 @@ func pushFilterUnderProjection(ctx *plancontext.PlanningContext, filter *Filter, } } return Swap(filter, projection, "push filter under projection") - } func tryPushDistinct(in *Distinct) (Operator, *ApplyResult) { @@ -753,7 +744,7 @@ func tryPushDistinct(in *Distinct) (Operator, *ApplyResult) { return in, NoRewrite } - src.Source = &Distinct{Source: src.Source} + src.Source = newDistinct(src.Source, nil, false) in.PushedPerformance = true return in, Rewrote("added distinct under route - kept original") @@ -763,14 +754,14 @@ func tryPushDistinct(in *Distinct) (Operator, *ApplyResult) { return src, Rewrote("remove double distinct") case *Union: for i := range src.Sources { - src.Sources[i] = &Distinct{Source: src.Sources[i]} + src.Sources[i] = newDistinct(src.Sources[i], nil, false) } in.PushedPerformance = true return in, Rewrote("push down distinct under union") case JoinOp: - src.SetLHS(&Distinct{Source: src.GetLHS()}) - src.SetRHS(&Distinct{Source: src.GetRHS()}) + src.SetLHS(newDistinct(src.GetLHS(), nil, false)) + src.SetRHS(newDistinct(src.GetRHS(), nil, false)) in.PushedPerformance = true if in.Required { @@ -821,10 +812,7 @@ func tryPushUnion(ctx *plancontext.PlanningContext, op *Union) (Operator, *Apply return result, Rewrote("push union under route") } - return &Distinct{ - Source: result, - Required: true, - }, Rewrote("push union under route") + return newDistinct(result, nil, true), Rewrote("push union under route") } if len(sources) == len(op.Sources) { diff --git a/go/vt/vtgate/planbuilder/operators/querygraph.go b/go/vt/vtgate/planbuilder/operators/querygraph.go index 8e8572f7dfa..98cd9ada64a 100644 --- a/go/vt/vtgate/planbuilder/operators/querygraph.go +++ b/go/vt/vtgate/planbuilder/operators/querygraph.go @@ -42,7 +42,7 @@ type ( // NoDeps contains the predicates that can be evaluated anywhere. NoDeps sqlparser.Expr - noInputs + nullaryOperator noColumns } diff --git a/go/vt/vtgate/planbuilder/operators/recurse_cte.go b/go/vt/vtgate/planbuilder/operators/recurse_cte.go new file mode 100644 index 00000000000..61474b663d6 --- /dev/null +++ b/go/vt/vtgate/planbuilder/operators/recurse_cte.go @@ -0,0 +1,211 @@ +/* +Copyright 2024 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 operators + +import ( + "fmt" + "slices" + "strings" + + "golang.org/x/exp/maps" + + "vitess.io/vitess/go/slice" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/semantics" +) + +// RecurseCTE is used to represent a recursive CTE +type RecurseCTE struct { + binaryOperator + + // Def is the CTE definition according to the semantics + Def *semantics.CTE + + // Expressions are the predicates that are needed on the recurse side of the CTE + Predicates []*plancontext.RecurseExpression + Projections []*plancontext.RecurseExpression + + // Vars is the map of variables that are sent between the two parts of the recursive CTE + // It's filled in at offset planning time + Vars map[string]int + + // MyTableID is the id of the CTE + MyTableInfo *semantics.CTETable + + // Horizon is stored here until we either expand it or push it under a route + Horizon *Horizon + + // The LeftID is the id of the left side of the CTE + LeftID, + + // The OuterID is the id for this use of the CTE + OuterID semantics.TableSet + + // Distinct is used to determine if the result set should be distinct + Distinct bool +} + +var _ Operator = (*RecurseCTE)(nil) + +func newRecurse( + ctx *plancontext.PlanningContext, + def *semantics.CTE, + seed, term Operator, + predicates []*plancontext.RecurseExpression, + horizon *Horizon, + leftID, outerID semantics.TableSet, + distinct bool, +) *RecurseCTE { + for _, pred := range predicates { + ctx.AddJoinPredicates(pred.Original, pred.RightExpr) + } + return &RecurseCTE{ + binaryOperator: newBinaryOp(seed, term), + Def: def, + Predicates: predicates, + Horizon: horizon, + LeftID: leftID, + OuterID: outerID, + Distinct: distinct, + } +} + +func (r *RecurseCTE) Clone(inputs []Operator) Operator { + klone := *r + klone.LHS = inputs[0] + klone.RHS = inputs[1] + klone.Vars = maps.Clone(r.Vars) + klone.Predicates = slices.Clone(r.Predicates) + klone.Projections = slices.Clone(r.Projections) + return &klone +} + +func (r *RecurseCTE) AddPredicate(_ *plancontext.PlanningContext, e sqlparser.Expr) Operator { + return newFilter(r, e) +} + +func (r *RecurseCTE) AddColumn(ctx *plancontext.PlanningContext, _, _ bool, expr *sqlparser.AliasedExpr) int { + r.makeSureWeHaveTableInfo(ctx) + e := semantics.RewriteDerivedTableExpression(expr.Expr, r.MyTableInfo) + offset := r.Seed().FindCol(ctx, e, false) + if offset == -1 { + panic(vterrors.VT13001("CTE column not found")) + } + return offset +} + +func (r *RecurseCTE) makeSureWeHaveTableInfo(ctx *plancontext.PlanningContext) { + if r.MyTableInfo == nil { + for _, table := range ctx.SemTable.Tables { + cte, ok := table.(*semantics.CTETable) + if !ok { + continue + } + if cte.CTE == r.Def { + r.MyTableInfo = cte + break + } + } + if r.MyTableInfo == nil { + panic(vterrors.VT13001("CTE not found")) + } + } +} + +func (r *RecurseCTE) AddWSColumn(ctx *plancontext.PlanningContext, offset int, underRoute bool) int { + seed := r.Seed().AddWSColumn(ctx, offset, underRoute) + term := r.Term().AddWSColumn(ctx, offset, underRoute) + if seed != term { + panic(vterrors.VT13001("CTE columns don't match")) + } + return seed +} + +func (r *RecurseCTE) FindCol(ctx *plancontext.PlanningContext, expr sqlparser.Expr, underRoute bool) int { + r.makeSureWeHaveTableInfo(ctx) + expr = semantics.RewriteDerivedTableExpression(expr, r.MyTableInfo) + return r.Seed().FindCol(ctx, expr, underRoute) +} + +func (r *RecurseCTE) GetColumns(ctx *plancontext.PlanningContext) []*sqlparser.AliasedExpr { + return r.Seed().GetColumns(ctx) +} + +func (r *RecurseCTE) GetSelectExprs(ctx *plancontext.PlanningContext) sqlparser.SelectExprs { + return r.Seed().GetSelectExprs(ctx) +} + +func (r *RecurseCTE) ShortDescription() string { + distinct := "" + if r.Distinct { + distinct = "distinct " + } + if len(r.Vars) > 0 { + return fmt.Sprintf("%s%v", distinct, r.Vars) + } + expressions := slice.Map(r.expressions(), func(expr *plancontext.RecurseExpression) string { + return sqlparser.String(expr.Original) + }) + return fmt.Sprintf("%s%v %v", distinct, r.Def.Name, strings.Join(expressions, ", ")) +} + +func (r *RecurseCTE) GetOrdering(*plancontext.PlanningContext) []OrderBy { + // RecurseCTE is a special case. It never guarantees any ordering. + return nil +} + +func (r *RecurseCTE) expressions() []*plancontext.RecurseExpression { + return append(r.Predicates, r.Projections...) +} + +func (r *RecurseCTE) planOffsets(ctx *plancontext.PlanningContext) Operator { + r.Vars = make(map[string]int) + columns := r.Seed().GetColumns(ctx) + for _, expr := range r.expressions() { + outer: + for _, lhsExpr := range expr.LeftExprs { + _, found := r.Vars[lhsExpr.Name] + if found { + continue + } + + for offset, column := range columns { + if lhsExpr.Expr.Name.EqualString(column.ColumnName()) { + r.Vars[lhsExpr.Name] = offset + continue outer + } + } + + panic(vterrors.VT13001("couldn't find column")) + } + } + return r +} + +func (r *RecurseCTE) introducesTableID() semantics.TableSet { + return r.OuterID +} + +func (r *RecurseCTE) Seed() Operator { + return r.LHS +} + +func (r *RecurseCTE) Term() Operator { + return r.RHS +} diff --git a/go/vt/vtgate/planbuilder/operators/rewriters.go b/go/vt/vtgate/planbuilder/operators/rewriters.go index ab9fe66e368..1864eb952e1 100644 --- a/go/vt/vtgate/planbuilder/operators/rewriters.go +++ b/go/vt/vtgate/planbuilder/operators/rewriters.go @@ -164,6 +164,16 @@ func TopDown( // Swap takes a tree like a->b->c and swaps `a` and `b`, so we end up with b->a->c func Swap(parent, child Operator, message string) (Operator, *ApplyResult) { + unaryParent, isUnary := parent.(*unaryOperator) + if isUnary { + unaryChild, isUnary := child.(*unaryOperator) + if isUnary { + // If both the parent and child are unary operators, we can just swap the sources + unaryParent.Source, unaryChild.Source = unaryChild.Source, unaryParent.Source + return parent, Rewrote(message) + } + } + c := child.Inputs() if len(c) != 1 { panic(vterrors.VT13001("Swap can only be used on single input operators")) @@ -200,34 +210,60 @@ func bottomUp( return root, NoRewrite } - oldInputs := root.Inputs() var anythingChanged *ApplyResult - newInputs := make([]Operator, len(oldInputs)) - childID := rootID - - // noLHSTableSet is used to mark which operators that do not send data from the LHS to the RHS - // It's only UNION at this moment, but this package can't depend on the actual operators, so - // we use this interface to avoid direct dependencies - type noLHSTableSet interface{ NoLHSTableSet() } - - for i, operator := range oldInputs { - // We merge the table set of all the LHS above the current root so that we can - // send it down to the current RHS. - // We don't want to send the LHS table set to the RHS if the root is a UNION. - // Some operators, like SubQuery, can have multiple child operators on the RHS - if _, isUnion := root.(noLHSTableSet); !isUnion && i > 0 { - childID = childID.Merge(resolveID(oldInputs[0])) + + switch root := root.(type) { + case nullaryOperator: + // no inputs, nothing to do + case *unaryOperator: + newSource, changed := bottomUp(root.Source, rootID, resolveID, rewriter, shouldVisit, false) + if DebugOperatorTree && changed.Changed() { + fmt.Println(ToTree(newSource)) } - in, changed := bottomUp(operator, childID, resolveID, rewriter, shouldVisit, false) + anythingChanged = anythingChanged.Merge(changed) + root.Source = newSource + case *binaryOperator: + newLHS, changed := bottomUp(root.LHS, rootID, resolveID, rewriter, shouldVisit, false) if DebugOperatorTree && changed.Changed() { - fmt.Println(ToTree(in)) + fmt.Println(ToTree(newLHS)) } anythingChanged = anythingChanged.Merge(changed) - newInputs[i] = in - } + root.LHS = newLHS + newRHS, changed := bottomUp(root.RHS, rootID, resolveID, rewriter, shouldVisit, false) + if DebugOperatorTree && changed.Changed() { + fmt.Println(ToTree(newRHS)) + } + anythingChanged = anythingChanged.Merge(changed) + root.RHS = newRHS + default: + oldInputs := root.Inputs() + newInputs := make([]Operator, len(oldInputs)) + childID := rootID + + // noLHSTableSet is used to mark which operators that do not send data from the LHS to the RHS + // It's only UNION at this moment, but this package can't depend on the actual operators, so + // we use this interface to avoid direct dependencies + type noLHSTableSet interface{ NoLHSTableSet() } + + for i, operator := range oldInputs { + // We merge the table set of all the LHS above the current root so that we can + // send it down to the current RHS. + // We don't want to send the LHS table set to the RHS if the root is a UNION. + // Some operators, like SubQuery, can have multiple child operators on the RHS + if _, isUnion := root.(noLHSTableSet); !isUnion && i > 0 { + childID = childID.Merge(resolveID(oldInputs[0])) + } + in, changed := bottomUp(operator, childID, resolveID, rewriter, shouldVisit, false) + if DebugOperatorTree && changed.Changed() { + fmt.Println(ToTree(in)) + } + anythingChanged = anythingChanged.Merge(changed) + newInputs[i] = in + } - if anythingChanged.Changed() { - root = root.Clone(newInputs) + if anythingChanged.Changed() { + root.SetInputs(newInputs) + } } newOp, treeIdentity := rewriter(root, rootID, isRoot) @@ -247,21 +283,42 @@ func breakableTopDown( var anythingChanged *ApplyResult - oldInputs := newOp.Inputs() - newInputs := make([]Operator, len(oldInputs)) - for i, oldInput := range oldInputs { - newInputs[i], identity, err = breakableTopDown(oldInput, rewriter) + switch newOp := newOp.(type) { + case nullaryOperator: + // no inputs, nothing to do + case *unaryOperator: + newSource, identity, err := breakableTopDown(newOp.Source, rewriter) + if err != nil { + return nil, NoRewrite, err + } anythingChanged = anythingChanged.Merge(identity) + newOp.Source = newSource + case *binaryOperator: + newLHS, identity, err := breakableTopDown(newOp.LHS, rewriter) if err != nil { return nil, NoRewrite, err } + anythingChanged = anythingChanged.Merge(identity) + newRHS, identity, err := breakableTopDown(newOp.RHS, rewriter) + if err != nil { + return nil, NoRewrite, err + } + anythingChanged = anythingChanged.Merge(identity) + newOp.LHS = newLHS + newOp.RHS = newRHS + default: + oldInputs := newOp.Inputs() + newInputs := make([]Operator, len(oldInputs)) + for i, oldInput := range oldInputs { + newInputs[i], identity, err = breakableTopDown(oldInput, rewriter) + if err != nil { + return nil, NoRewrite, err + } + anythingChanged = anythingChanged.Merge(identity) + } } - if anythingChanged.Changed() { - return newOp, NoRewrite, nil - } - - return newOp.Clone(newInputs), anythingChanged, nil + return newOp, anythingChanged, nil } // topDown is a helper function that recursively traverses the operator tree from the @@ -285,24 +342,39 @@ func topDown( root = newOp } - oldInputs := root.Inputs() - newInputs := make([]Operator, len(oldInputs)) - childID := rootID - - type noLHSTableSet interface{ NoLHSTableSet() } - - for i, operator := range oldInputs { - if _, isUnion := root.(noLHSTableSet); !isUnion && i > 0 { - childID = childID.Merge(resolveID(oldInputs[0])) - } - in, changed := topDown(operator, childID, resolveID, rewriter, shouldVisit, false) + switch newOp := newOp.(type) { + case nullaryOperator: + // no inputs, nothing to do + case *unaryOperator: + newSource, changed := topDown(newOp.Source, rootID, resolveID, rewriter, shouldVisit, false) anythingChanged = anythingChanged.Merge(changed) - newInputs[i] = in - } + newOp.Source = newSource + case *binaryOperator: + newLHS, changed := topDown(newOp.LHS, rootID, resolveID, rewriter, shouldVisit, false) + anythingChanged = anythingChanged.Merge(changed) + newRHS, changed := topDown(newOp.RHS, rootID, resolveID, rewriter, shouldVisit, false) + anythingChanged = anythingChanged.Merge(changed) + newOp.LHS, newOp.RHS = newLHS, newRHS + default: + oldInputs := root.Inputs() + newInputs := make([]Operator, len(oldInputs)) + childID := rootID + + type noLHSTableSet interface{ NoLHSTableSet() } + + for i, operator := range oldInputs { + if _, isUnion := root.(noLHSTableSet); !isUnion && i > 0 { + childID = childID.Merge(resolveID(oldInputs[0])) + } + in, changed := topDown(operator, childID, resolveID, rewriter, shouldVisit, false) + anythingChanged = anythingChanged.Merge(changed) + newInputs[i] = in + } - if anythingChanged != NoRewrite { - return root.Clone(newInputs), anythingChanged + if anythingChanged != NoRewrite { + root.SetInputs(newInputs) + } } - return root, NoRewrite + return root, anythingChanged } diff --git a/go/vt/vtgate/planbuilder/operators/route.go b/go/vt/vtgate/planbuilder/operators/route.go index 1c91077c2e4..e398fb05607 100644 --- a/go/vt/vtgate/planbuilder/operators/route.go +++ b/go/vt/vtgate/planbuilder/operators/route.go @@ -19,12 +19,10 @@ package operators import ( "fmt" - "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/slice" "vitess.io/vitess/go/vt/key" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/engine" "vitess.io/vitess/go/vt/vtgate/evalengine" @@ -35,7 +33,7 @@ import ( type ( Route struct { - Source Operator + unaryOperator // Routes that have been merged into this one. MergedWith []*Route @@ -121,7 +119,7 @@ func UpdateRoutingLogic(ctx *plancontext.PlanningContext, expr sqlparser.Expr, r } nr := &NoneRouting{keyspace: ks} - if isConstantFalse(ctx.VSchema.Environment(), expr, ctx.VSchema.ConnCollation()) { + if b := ctx.IsConstantBool(expr); b != nil && !*b { return nr } @@ -163,31 +161,6 @@ func UpdateRoutingLogic(ctx *plancontext.PlanningContext, expr sqlparser.Expr, r return exit() } -// isConstantFalse checks whether this predicate can be evaluated at plan-time. If it returns `false` or `null`, -// we know that the query will not return anything, and this can be used to produce better plans -func isConstantFalse(env *vtenv.Environment, expr sqlparser.Expr, collation collations.ID) bool { - eenv := evalengine.EmptyExpressionEnv(env) - eexpr, err := evalengine.Translate(expr, &evalengine.Config{ - Collation: collation, - Environment: env, - }) - if err != nil { - return false - } - eres, err := eenv.Evaluate(eexpr) - if err != nil { - return false - } - if eres.Value(collation).IsNull() { - return false - } - b, err := eres.ToBooleanStrict() - if err != nil { - return false - } - return !b -} - // Cost implements the Operator interface func (r *Route) Cost() int { return r.Routing.Cost() @@ -201,16 +174,6 @@ func (r *Route) Clone(inputs []Operator) Operator { return &cloneRoute } -// Inputs implements the Operator interface -func (r *Route) Inputs() []Operator { - return []Operator{r.Source} -} - -// SetInputs implements the Operator interface -func (r *Route) SetInputs(ops []Operator) { - r.Source = ops[0] -} - func createOption( colVindex *vindexes.ColumnVindex, vfunc func(*vindexes.ColumnVindex) vindexes.Vindex, @@ -459,10 +422,10 @@ func createRouteFromVSchemaTable( } } plan := &Route{ - Source: &Table{ + unaryOperator: newUnaryOp(&Table{ QTable: queryTable, VTable: vschemaTable, - }, + }), } // We create the appropriate Routing struct here, depending on the type of table we are dealing with. @@ -716,8 +679,8 @@ func wrapInDerivedProjection( columns = append(columns, sqlparser.NewIdentifierCI(fmt.Sprintf("c%d", i))) } derivedProj := &Projection{ - Source: op, - Columns: AliasedProjections(slice.Map(unionColumns, newProjExpr)), + unaryOperator: newUnaryOp(op), + Columns: AliasedProjections(slice.Map(unionColumns, newProjExpr)), DT: &DerivedTable{ TableID: ctx.SemTable.NewTableId(), Alias: "dt", @@ -754,14 +717,11 @@ func (r *Route) GetOrdering(ctx *plancontext.PlanningContext) []OrderBy { // TablesUsed returns tables used by MergedWith routes, which are not included // in Inputs() and thus not a part of the operator tree -func (r *Route) TablesUsed() []string { - addString, collect := collectSortedUniqueStrings() +func (r *Route) TablesUsed(in []string) []string { for _, mw := range r.MergedWith { - for _, u := range TablesUsed(mw) { - addString(u) - } + in = append(in, TablesUsed(mw)...) } - return collect() + return in } func isSpecialOrderBy(o OrderBy) bool { diff --git a/go/vt/vtgate/planbuilder/operators/route_planning.go b/go/vt/vtgate/planbuilder/operators/route_planning.go index 47405e3b935..90eb16e1562 100644 --- a/go/vt/vtgate/planbuilder/operators/route_planning.go +++ b/go/vt/vtgate/planbuilder/operators/route_planning.go @@ -189,8 +189,8 @@ func createInfSchemaRoute(ctx *plancontext.PlanningContext, table *QueryTable) O routing = UpdateRoutingLogic(ctx, pred, routing) } return &Route{ - Source: src, - Routing: routing, + unaryOperator: newUnaryOp(src), + Routing: routing, } } @@ -288,7 +288,8 @@ func requiresSwitchingSides(ctx *plancontext.PlanningContext, op Operator) (requ } func mergeOrJoin(ctx *plancontext.PlanningContext, lhs, rhs Operator, joinPredicates []sqlparser.Expr, joinType sqlparser.JoinType) (Operator, *ApplyResult) { - newPlan := mergeJoinInputs(ctx, lhs, rhs, joinPredicates, newJoinMerge(joinPredicates, joinType)) + jm := newJoinMerge(joinPredicates, joinType) + newPlan := jm.mergeJoinInputs(ctx, lhs, rhs, joinPredicates) if newPlan != nil { return newPlan, Rewrote("merge routes into single operator") } @@ -305,13 +306,18 @@ func mergeOrJoin(ctx *plancontext.PlanningContext, lhs, rhs Operator, joinPredic } join := NewApplyJoin(ctx, Clone(rhs), Clone(lhs), nil, joinType) - newOp := pushJoinPredicates(ctx, joinPredicates, join) - return newOp, Rewrote("logical join to applyJoin, switching side because LIMIT") + for _, pred := range joinPredicates { + join.AddJoinPredicate(ctx, pred) + } + return join, Rewrote("logical join to applyJoin, switching side because LIMIT") } join := NewApplyJoin(ctx, Clone(lhs), Clone(rhs), nil, joinType) - newOp := pushJoinPredicates(ctx, joinPredicates, join) - return newOp, Rewrote("logical join to applyJoin ") + for _, pred := range joinPredicates { + join.AddJoinPredicate(ctx, pred) + } + + return join, Rewrote("logical join to applyJoin ") } func operatorsToRoutes(a, b Operator) (*Route, *Route) { @@ -530,15 +536,3 @@ func hexEqual(a, b *sqlparser.Literal) bool { } return false } - -func pushJoinPredicates(ctx *plancontext.PlanningContext, exprs []sqlparser.Expr, op *ApplyJoin) Operator { - if len(exprs) == 0 { - return op - } - - for _, expr := range exprs { - AddPredicate(ctx, op, expr, true, newFilterSinglePredicate) - } - - return op -} diff --git a/go/vt/vtgate/planbuilder/operators/sharded_routing.go b/go/vt/vtgate/planbuilder/operators/sharded_routing.go index 1319b76f040..066cb47d9a9 100644 --- a/go/vt/vtgate/planbuilder/operators/sharded_routing.go +++ b/go/vt/vtgate/planbuilder/operators/sharded_routing.go @@ -23,7 +23,6 @@ import ( "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/slice" "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/engine" "vitess.io/vitess/go/vt/vtgate/evalengine" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" @@ -634,13 +633,15 @@ func (tr *ShardedRouting) extraInfo() string { ) } -func tryMergeJoinShardedRouting( +func tryMergeShardedRouting( ctx *plancontext.PlanningContext, routeA, routeB *Route, m merger, joinPredicates []sqlparser.Expr, ) *Route { - sameKeyspace := routeA.Routing.Keyspace() == routeB.Routing.Keyspace() + if routeA.Routing.Keyspace() != routeB.Routing.Keyspace() { + return nil + } tblA := routeA.Routing.(*ShardedRouting) tblB := routeB.Routing.(*ShardedRouting) @@ -669,10 +670,6 @@ func tryMergeJoinShardedRouting( return nil } - if !sameKeyspace { - panic(vterrors.VT12001("cross-shard correlated subquery")) - } - canMerge := canMergeOnFilters(ctx, routeA, routeB, joinPredicates) if !canMerge { return nil diff --git a/go/vt/vtgate/planbuilder/operators/subquery.go b/go/vt/vtgate/planbuilder/operators/subquery.go index 5ae0fb52e7f..9610a2b10c9 100644 --- a/go/vt/vtgate/planbuilder/operators/subquery.go +++ b/go/vt/vtgate/planbuilder/operators/subquery.go @@ -208,7 +208,9 @@ func (sq *SubQuery) GetMergePredicates() []sqlparser.Expr { } func (sq *SubQuery) settle(ctx *plancontext.PlanningContext, outer Operator) Operator { - if !sq.TopLevel { + // We can allow uncorrelated queries even when subquery isn't the top level construct, + // like if its underneath an Aggregator, because they will be pulled out and run separately. + if !sq.TopLevel && sq.correlated { panic(subqueryNotAtTopErr) } if sq.correlated && sq.FilterType != opcode.PulloutExists { @@ -230,11 +232,7 @@ var subqueryNotAtTopErr = vterrors.VT12001("unmergable subquery can not be insid func (sq *SubQuery) addLimit() { // for a correlated subquery, we can add a limit 1 to the subquery - sq.Subquery = &Limit{ - Source: sq.Subquery, - AST: &sqlparser.Limit{Rowcount: sqlparser.NewIntLiteral("1")}, - Top: true, - } + sq.Subquery = newLimit(sq.Subquery, &sqlparser.Limit{Rowcount: sqlparser.NewIntLiteral("1")}, true) } func (sq *SubQuery) settleFilter(ctx *plancontext.PlanningContext, outer Operator) Operator { @@ -253,6 +251,20 @@ func (sq *SubQuery) settleFilter(ctx *plancontext.PlanningContext, outer Operato } post := func(cursor *sqlparser.CopyOnWriteCursor) { node := cursor.Node() + // For IN and NOT IN type filters, we have to add a Expression that checks if we got any rows back or not + // for correctness. That expression should be ANDed with the expression that has the IN/NOT IN comparison. + if compExpr, isCompExpr := node.(*sqlparser.ComparisonExpr); sq.FilterType.NeedsListArg() && isCompExpr { + if listArg, isListArg := compExpr.Right.(sqlparser.ListArg); isListArg && listArg.String() == sq.ArgName { + if sq.FilterType == opcode.PulloutIn { + cursor.Replace(sqlparser.AndExpressions(sqlparser.NewArgument(hasValuesArg()), compExpr)) + } else { + cursor.Replace(&sqlparser.OrExpr{ + Left: sqlparser.NewNotExpr(sqlparser.NewArgument(hasValuesArg())), + Right: compExpr, + }) + } + } + } if _, ok := node.(*sqlparser.Subquery); !ok { return } @@ -277,13 +289,18 @@ func (sq *SubQuery) settleFilter(ctx *plancontext.PlanningContext, outer Operato sq.FilterType = opcode.PulloutExists // it's the same pullout as EXISTS, just with a NOT in front of the predicate predicates = append(predicates, sqlparser.NewNotExpr(sqlparser.NewArgument(hasValuesArg()))) case opcode.PulloutIn: - predicates = append(predicates, sqlparser.NewArgument(hasValuesArg()), rhsPred) + // Because we replace the comparison expression with an AND expression, it might be the top level construct there. + // In this case, it is better to send the two sides of the AND expression separately in the predicates because it can + // lead to better routing. This however might not always be true for example we can have the rhsPred to be something like + // `user.id = 2 OR (:__sq_has_values AND user.id IN ::sql1)` + if andExpr, isAndExpr := rhsPred.(*sqlparser.AndExpr); isAndExpr { + predicates = append(predicates, andExpr.Left, andExpr.Right) + } else { + predicates = append(predicates, rhsPred) + } sq.SubqueryValueName = sq.ArgName case opcode.PulloutNotIn: - predicates = append(predicates, &sqlparser.OrExpr{ - Left: sqlparser.NewNotExpr(sqlparser.NewArgument(hasValuesArg())), - Right: rhsPred, - }) + predicates = append(predicates, rhsPred) sq.SubqueryValueName = sq.ArgName case opcode.PulloutValue: predicates = append(predicates, rhsPred) diff --git a/go/vt/vtgate/planbuilder/operators/subquery_planning.go b/go/vt/vtgate/planbuilder/operators/subquery_planning.go index aef54bd8c41..a2aca74fb6e 100644 --- a/go/vt/vtgate/planbuilder/operators/subquery_planning.go +++ b/go/vt/vtgate/planbuilder/operators/subquery_planning.go @@ -633,7 +633,7 @@ func (s *subqueryRouteMerger) merge(ctx *plancontext.PlanningContext, inner, out if !s.subq.TopLevel { // if the subquery we are merging isn't a top level predicate, we can't use it for routing return &Route{ - Source: outer.Source, + unaryOperator: newUnaryOp(outer.Source), MergedWith: mergedWith(inner, outer), Routing: outer.Routing, Ordering: outer.Ordering, @@ -651,7 +651,7 @@ func (s *subqueryRouteMerger) merge(ctx *plancontext.PlanningContext, inner, out src = s.rewriteASTExpression(ctx, inner) } return &Route{ - Source: src, + unaryOperator: newUnaryOp(src), MergedWith: mergedWith(inner, outer), Routing: r, Ordering: s.outer.Ordering, @@ -758,7 +758,7 @@ func mergeSubqueryInputs(ctx *plancontext.PlanningContext, in, out Operator, joi // sharded routing is complex, so we handle it in a separate method case inner == sharded && outer == sharded: - return tryMergeJoinShardedRouting(ctx, inRoute, outRoute, m, joinPredicates) + return tryMergeShardedRouting(ctx, inRoute, outRoute, m, joinPredicates) default: return nil diff --git a/go/vt/vtgate/planbuilder/operators/table.go b/go/vt/vtgate/planbuilder/operators/table.go index 3ecd4982ece..4391380480c 100644 --- a/go/vt/vtgate/planbuilder/operators/table.go +++ b/go/vt/vtgate/planbuilder/operators/table.go @@ -33,7 +33,7 @@ type ( VTable *vindexes.Table Columns []*sqlparser.ColName - noInputs + nullaryOperator } ColNameColumns interface { GetColNames() []*sqlparser.ColName @@ -107,11 +107,11 @@ func (to *Table) AddCol(col *sqlparser.ColName) { to.Columns = append(to.Columns, col) } -func (to *Table) TablesUsed() []string { +func (to *Table) TablesUsed(in []string) []string { if sqlparser.SystemSchema(to.QTable.Table.Qualifier.String()) { - return nil + return in } - return SingleQualifiedIdentifier(to.VTable.Keyspace, to.VTable.Name) + return append(in, QualifiedString(to.VTable.Keyspace, to.VTable.Name.String())) } func addColumn(ctx *plancontext.PlanningContext, op ColNameColumns, e sqlparser.Expr) int { diff --git a/go/vt/vtgate/planbuilder/operators/union_merging.go b/go/vt/vtgate/planbuilder/operators/union_merging.go index 20c20673665..000d176b61a 100644 --- a/go/vt/vtgate/planbuilder/operators/union_merging.go +++ b/go/vt/vtgate/planbuilder/operators/union_merging.go @@ -222,9 +222,9 @@ func createMergedUnion( union := newUnion([]Operator{lhsRoute.Source, rhsRoute.Source}, []sqlparser.SelectExprs{lhsExprs, rhsExprs}, cols, distinct) selectExprs := unionSelects(lhsExprs) return &Route{ - Source: union, - MergedWith: []*Route{rhsRoute}, - Routing: routing, + unaryOperator: newUnaryOp(union), + MergedWith: []*Route{rhsRoute}, + Routing: routing, }, selectExprs } diff --git a/go/vt/vtgate/planbuilder/operators/update.go b/go/vt/vtgate/planbuilder/operators/update.go index e843155246c..dd0a86c2de2 100644 --- a/go/vt/vtgate/planbuilder/operators/update.go +++ b/go/vt/vtgate/planbuilder/operators/update.go @@ -66,9 +66,6 @@ func (u *Update) Inputs() []Operator { } func (u *Update) SetInputs(inputs []Operator) { - if len(inputs) != 1 { - panic(vterrors.VT13001("unexpected number of inputs for Update operator")) - } u.Source = inputs[0] } @@ -89,8 +86,8 @@ func (u *Update) GetOrdering(*plancontext.PlanningContext) []OrderBy { return nil } -func (u *Update) TablesUsed() []string { - return SingleQualifiedIdentifier(u.Target.VTable.Keyspace, u.Target.VTable.Name) +func (u *Update) TablesUsed(in []string) []string { + return append(in, QualifiedString(u.Target.VTable.Keyspace, u.Target.VTable.Name.String())) } func (u *Update) ShortDescription() string { @@ -113,11 +110,7 @@ func createOperatorFromUpdate(ctx *plancontext.PlanningContext, updStmt *sqlpars var targetTbl TargetTable op, targetTbl, updClone = createUpdateOperator(ctx, updStmt) - op = &LockAndComment{ - Source: op, - Comments: updStmt.Comments, - Lock: sqlparser.ShareModeLock, - } + op = newLockAndComment(op, updStmt.Comments, sqlparser.ShareModeLock) parentFks = ctx.SemTable.GetParentForeignKeysForTableSet(targetTbl.ID) childFks = ctx.SemTable.GetChildForeignKeysForTableSet(targetTbl.ID) @@ -206,10 +199,7 @@ func createUpdateWithInputOp(ctx *plancontext.PlanningContext, upd *sqlparser.Up } if upd.Comments != nil { - op = &LockAndComment{ - Source: op, - Comments: upd.Comments, - } + op = newLockAndComment(op, upd.Comments, sqlparser.NoLock) } return op } @@ -388,7 +378,6 @@ func createUpdateOperator(ctx *plancontext.PlanningContext, updStmt *sqlparser.U Ignore: updStmt.Ignore, Target: targetTbl, OwnedVindexQuery: ovq, - Source: op, }, Assignments: assignments, ChangedVindexValues: cvv, @@ -397,14 +386,13 @@ func createUpdateOperator(ctx *plancontext.PlanningContext, updStmt *sqlparser.U } if len(updStmt.OrderBy) > 0 { - addOrdering(ctx, updStmt.OrderBy, updOp) + updOp.Source = addOrdering(ctx, op, updStmt.OrderBy) + } else { + updOp.Source = op } if updStmt.Limit != nil { - updOp.Source = &Limit{ - Source: updOp.Source, - AST: updStmt.Limit, - } + updOp.Source = newLimit(updOp.Source, updStmt.Limit, false) } return sqc.getRootOperator(updOp, nil), targetTbl, updClone diff --git a/go/vt/vtgate/planbuilder/operators/vindex.go b/go/vt/vtgate/planbuilder/operators/vindex.go index fd907fdad27..30f13701df6 100644 --- a/go/vt/vtgate/planbuilder/operators/vindex.go +++ b/go/vt/vtgate/planbuilder/operators/vindex.go @@ -35,7 +35,7 @@ type ( Columns []*sqlparser.ColName Value sqlparser.Expr - noInputs + nullaryOperator } // VindexTable contains information about the vindex table we want to query @@ -164,8 +164,8 @@ func (v *Vindex) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.E // TablesUsed implements the Operator interface. // It is not keyspace-qualified. -func (v *Vindex) TablesUsed() []string { - return []string{v.Table.Table.Name.String()} +func (v *Vindex) TablesUsed(in []string) []string { + return append(in, v.Table.Table.Name.String()) } func (v *Vindex) ShortDescription() string { diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index f49994d37b2..9cf92a91ddf 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -459,11 +459,7 @@ func benchmarkWorkload(b *testing.B, name string) { testCases := readJSONTests(name + "_cases.json") b.ResetTimer() - for _, version := range plannerVersions { - b.Run(version.String(), func(b *testing.B) { - benchmarkPlanner(b, version, testCases, vschemaWrapper) - }) - } + benchmarkPlanner(b, Gen4, testCases, vschemaWrapper) } func (s *planTestSuite) TestBypassPlanningShardTargetFromFile() { @@ -591,6 +587,32 @@ func (s *planTestSuite) TestOtherPlanningFromFile() { s.testFile("other_admin_cases.json", vschema, false) } +func (s *planTestSuite) TestMirrorPlanning() { + vschema := &vschemawrapper.VSchemaWrapper{ + V: loadSchema(s.T(), "vschemas/mirror_schema.json", true), + TabletType_: topodatapb.TabletType_PRIMARY, + SysVarEnabled: true, + TestBuilder: TestBuilder, + Env: vtenv.NewTestEnv(), + } + + s.testFile("mirror_cases.json", vschema, false) +} + +func (s *planTestSuite) TestOneMirror() { + reset := operators.EnableDebugPrinting() + defer reset() + vschema := &vschemawrapper.VSchemaWrapper{ + V: loadSchema(s.T(), "vschemas/mirror_schema.json", true), + TabletType_: topodatapb.TabletType_PRIMARY, + SysVarEnabled: true, + TestBuilder: TestBuilder, + Env: vtenv.NewTestEnv(), + } + + s.testFile("onecase.json", vschema, false) +} + func loadSchema(t testing.TB, filename string, setCollation bool) *vindexes.VSchema { formal, err := vindexes.LoadFormal(locateFile(filename)) require.NoError(t, err) @@ -683,7 +705,7 @@ func (s *planTestSuite) testFile(filename string, vschema *vschemawrapper.VSchem if tcase.Skip { t.Skip(message) } else { - t.Errorf(message) + t.Error(message) } } else if tcase.Skip { t.Errorf("query is correct even though it is skipped:\n %s", tcase.Query) @@ -771,9 +793,6 @@ func BenchmarkPlanner(b *testing.B) { b.Run(filename+"-gen4", func(b *testing.B) { benchmarkPlanner(b, Gen4, testCases, vschema) }) - b.Run(filename+"-gen4left2right", func(b *testing.B) { - benchmarkPlanner(b, Gen4Left2Right, testCases, vschema) - }) } } @@ -839,6 +858,35 @@ func BenchmarkSelectVsDML(b *testing.B) { }) } +func BenchmarkBaselineVsMirrored(b *testing.B) { + baseline := loadSchema(b, "vschemas/mirror_schema.json", true) + baseline.MirrorRules = map[string]*vindexes.MirrorRule{} + baselineVschema := &vschemawrapper.VSchemaWrapper{ + V: baseline, + SysVarEnabled: true, + Version: Gen4, + Env: vtenv.NewTestEnv(), + } + + mirroredSchema := loadSchema(b, "vschemas/mirror_schema.json", true) + mirroredVschema := &vschemawrapper.VSchemaWrapper{ + V: mirroredSchema, + SysVarEnabled: true, + Version: Gen4, + Env: vtenv.NewTestEnv(), + } + + cases := readJSONTests("mirror_cases.json") + + b.Run("Baseline", func(b *testing.B) { + benchmarkPlanner(b, Gen4, cases, baselineVschema) + }) + + b.Run("Mirrored", func(b *testing.B) { + benchmarkPlanner(b, Gen4, cases, mirroredVschema) + }) +} + func benchmarkPlanner(b *testing.B, version plancontext.PlannerVersion, testCases []planTest, vschema *vschemawrapper.VSchemaWrapper) { b.ReportAllocs() for n := 0; n < b.N; n++ { diff --git a/go/vt/vtgate/planbuilder/plancontext/planning_context.go b/go/vt/vtgate/planbuilder/plancontext/planning_context.go index 58be17febab..607ca83aa31 100644 --- a/go/vt/vtgate/planbuilder/plancontext/planning_context.go +++ b/go/vt/vtgate/planbuilder/plancontext/planning_context.go @@ -66,6 +66,19 @@ type PlanningContext struct { // OuterTables contains the tables that are outer to the current query // Used to set the nullable flag on the columns OuterTables semantics.TableSet + + // This is a stack of CTEs being built. It's used when we have CTEs inside CTEs, + // to remember which is the CTE currently being assembled + CurrentCTE []*ContextCTE + + // mirror contains a mirrored clone of this planning context. + mirror *PlanningContext + + // isMirrored indicates that mirrored tables should be used. + isMirrored bool + + emptyEnv *evalengine.ExpressionEnv + constantCfg *evalengine.Config } // CreatePlanningContext initializes a new PlanningContext with the given parameters. @@ -376,3 +389,112 @@ func (ctx *PlanningContext) ContainsAggr(e sqlparser.SQLNode) (hasAggr bool) { }, e) return } + +func (ctx *PlanningContext) IsMirrored() bool { + return ctx.isMirrored +} + +type ContextCTE struct { + *semantics.CTE + Id semantics.TableSet + Predicates []*RecurseExpression +} + +type RecurseExpression struct { + Original sqlparser.Expr + RightExpr sqlparser.Expr + LeftExprs []BindVarExpr +} + +type BindVarExpr struct { + Name string + Expr *sqlparser.ColName +} + +func (ctx *PlanningContext) PushCTE(def *semantics.CTE, id semantics.TableSet) { + ctx.CurrentCTE = append(ctx.CurrentCTE, &ContextCTE{ + CTE: def, + Id: id, + }) +} + +func (ctx *PlanningContext) PopCTE() (*ContextCTE, error) { + if len(ctx.CurrentCTE) == 0 { + return nil, vterrors.VT13001("no CTE to pop") + } + activeCTE := ctx.CurrentCTE[len(ctx.CurrentCTE)-1] + ctx.CurrentCTE = ctx.CurrentCTE[:len(ctx.CurrentCTE)-1] + return activeCTE, nil +} + +func (ctx *PlanningContext) ActiveCTE() *ContextCTE { + if len(ctx.CurrentCTE) == 0 { + return nil + } + return ctx.CurrentCTE[len(ctx.CurrentCTE)-1] +} + +func (ctx *PlanningContext) UseMirror() *PlanningContext { + if ctx.isMirrored { + panic(vterrors.VT13001("cannot mirror already mirrored planning context")) + } + if ctx.mirror != nil { + return ctx.mirror + } + ctx.mirror = &PlanningContext{ + ReservedVars: ctx.ReservedVars, + SemTable: ctx.SemTable, + VSchema: ctx.VSchema, + joinPredicates: map[sqlparser.Expr][]sqlparser.Expr{}, + skipPredicates: map[sqlparser.Expr]any{}, + PlannerVersion: ctx.PlannerVersion, + ReservedArguments: map[sqlparser.Expr]string{}, + VerifyAllFKs: ctx.VerifyAllFKs, + MergedSubqueries: ctx.MergedSubqueries, + CurrentPhase: ctx.CurrentPhase, + Statement: ctx.Statement, + OuterTables: ctx.OuterTables, + CurrentCTE: ctx.CurrentCTE, + emptyEnv: ctx.emptyEnv, + isMirrored: true, + } + return ctx.mirror +} + +// IsConstantBool checks whether this predicate can be evaluated at plan-time. +// If it can, it returns the constant value. +func (ctx *PlanningContext) IsConstantBool(expr sqlparser.Expr) *bool { + if !ctx.SemTable.RecursiveDeps(expr).IsEmpty() { + // we have column dependencies, so we can be pretty sure + // we won't be able to use the evalengine to check if this is constant false + return nil + } + env := ctx.VSchema.Environment() + collation := ctx.VSchema.ConnCollation() + if ctx.constantCfg == nil { + ctx.constantCfg = &evalengine.Config{ + Collation: collation, + Environment: env, + NoCompilation: true, + } + } + eexpr, err := evalengine.Translate(expr, ctx.constantCfg) + if ctx.emptyEnv == nil { + ctx.emptyEnv = evalengine.EmptyExpressionEnv(env) + } + if err != nil { + return nil + } + eres, err := ctx.emptyEnv.Evaluate(eexpr) + if err != nil { + return nil + } + if eres.Value(collation).IsNull() { + return nil + } + b, err := eres.ToBooleanStrict() + if err != nil { + return nil + } + return &b +} diff --git a/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go b/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go index 3ab58cba724..d7315f376b6 100644 --- a/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go +++ b/go/vt/vtgate/planbuilder/plancontext/planning_context_test.go @@ -365,4 +365,9 @@ func (v *vschema) GetAggregateUDFs() []string { panic("implement me") } +// FindMirrorRule implements VSchema. +func (v *vschema) FindMirrorRule(tablename sqlparser.TableName) (*vindexes.MirrorRule, error) { + panic("unimplemented") +} + var _ VSchema = (*vschema)(nil) diff --git a/go/vt/vtgate/planbuilder/plancontext/vschema.go b/go/vt/vtgate/planbuilder/plancontext/vschema.go index 8ac4c57bfd7..6e92ad0d83b 100644 --- a/go/vt/vtgate/planbuilder/plancontext/vschema.go +++ b/go/vt/vtgate/planbuilder/plancontext/vschema.go @@ -96,6 +96,10 @@ type VSchema interface { // GetAggregateUDFs returns the list of aggregate UDFs. GetAggregateUDFs() []string + + // FindMirrorRule finds the mirror rule for the requested keyspace, table + // name, and the tablet type in the VSchema. + FindMirrorRule(tablename sqlparser.TableName) (*vindexes.MirrorRule, error) } // PlannerNameToVersion returns the numerical representation of the planner diff --git a/go/vt/vtgate/planbuilder/select.go b/go/vt/vtgate/planbuilder/select.go index 6927c5315ac..9cc1c8efe06 100644 --- a/go/vt/vtgate/planbuilder/select.go +++ b/go/vt/vtgate/planbuilder/select.go @@ -205,7 +205,7 @@ func newBuildSelectPlan( return nil, nil, err } - if ks, _ := ctx.SemTable.SingleUnshardedKeyspace(); ks != nil { + if ks, ok := ctx.SemTable.CanTakeSelectUnshardedShortcut(); ok { plan, tablesUsed, err = selectUnshardedShortcut(ctx, selStmt, ks) if err != nil { return nil, nil, err @@ -214,7 +214,6 @@ func newBuildSelectPlan( return plan, tablesUsed, err } - // From this point on, we know it is not an unsharded query and return the NotUnshardedErr if there is any if ctx.SemTable.NotUnshardedErr != nil { return nil, nil, ctx.SemTable.NotUnshardedErr } diff --git a/go/vt/vtgate/planbuilder/show.go b/go/vt/vtgate/planbuilder/show.go index 734885c9dd9..82035adaa87 100644 --- a/go/vt/vtgate/planbuilder/show.go +++ b/go/vt/vtgate/planbuilder/show.go @@ -45,12 +45,14 @@ const ( func buildShowPlan(sql string, stmt *sqlparser.Show, _ *sqlparser.ReservedVars, vschema plancontext.VSchema) (*planResult, error) { if vschema.Destination() != nil { - return buildByPassPlan(sql, vschema) + return buildByPassPlan(sql, vschema, false) } var prim engine.Primitive var err error switch show := stmt.Internal.(type) { + case *sqlparser.ShowTransactionStatus: + prim, err = buildShowTransactionStatusPlan(show) case *sqlparser.ShowBasic: prim, err = buildShowBasicPlan(show, vschema) case *sqlparser.ShowCreate: @@ -67,6 +69,14 @@ func buildShowPlan(sql string, stmt *sqlparser.Show, _ *sqlparser.ReservedVars, return newPlanResult(prim), nil } +// buildShowTransactionStatusPlan builds the transaction status plan +func buildShowTransactionStatusPlan(show *sqlparser.ShowTransactionStatus) (engine.Primitive, error) { + return &engine.TransactionStatus{ + Keyspace: show.Keyspace, + TransactionID: show.TransactionID, + }, nil +} + func buildShowOtherPlan(sql string, vschema plancontext.VSchema) (engine.Primitive, error) { ks, err := vschema.AnyKeyspace() if err != nil { diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index eca27d81213..8b268e367dd 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -615,6 +615,35 @@ ] } }, + { + "comment": "using HAVING inside a derived table still produces viable plans", + "query": "select id from (select id from user group by id having (count(user.id) = 2) limit 2 offset 0) subquery_for_limit", + "plan": { + "QueryType": "SELECT", + "Original": "select id from (select id from user group by id having (count(user.id) = 2) limit 2 offset 0) subquery_for_limit", + "Instructions": { + "OperatorType": "Limit", + "Count": "2", + "Offset": "0", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from (select id, count(`user`.id) = 2 from `user` where 1 != 1 group by id) as subquery_for_limit where 1 != 1", + "Query": "select id from (select id, count(`user`.id) = 2 from `user` group by id having count(`user`.id) = 2) as subquery_for_limit limit 2", + "Table": "`user`" + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, { "comment": "sum with distinct no unique vindex", "query": "select col1, sum(distinct col2) from user group by col1", @@ -689,13 +718,13 @@ "OperatorType": "Sort", "Variant": "Memory", "OrderBy": "1 ASC", + "ResultColumns": 2, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "count_distinct(1|3) AS k", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -2149,13 +2178,13 @@ "Instructions": { "OperatorType": "Filter", "Predicate": "count(*) <= 10", + "ResultColumns": 2, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "sum_count_star(1) AS a", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -2187,13 +2216,13 @@ "Instructions": { "OperatorType": "Filter", "Predicate": "count(*) = 1.00", + "ResultColumns": 2, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "sum_count_star(0) AS a", "GroupBy": "(1|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -2918,16 +2947,16 @@ { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "L:0,L:1,L:2", + "JoinColumnIndexes": "L:0,L:1,L:3", "JoinVars": { - "u2_val2": 3 + "u2_val2": 2 }, "TableName": "`user`_`user`_music", "Inputs": [ { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "L:0,L:1,L:2,R:0", + "JoinColumnIndexes": "L:0,L:1,R:0,L:2", "JoinVars": { "u_val2": 1 }, @@ -3097,13 +3126,13 @@ "Instructions": { "OperatorType": "Filter", "Predicate": "count(*) = 3", + "ResultColumns": 2, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "sum_count_star(1) AS count(*)", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -3135,13 +3164,13 @@ "Instructions": { "OperatorType": "Filter", "Predicate": "sum(foo) + sum(bar) = 42", + "ResultColumns": 3, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "sum(1) AS sum(foo), sum(2) AS sum(bar)", "GroupBy": "(0|3)", - "ResultColumns": 3, "Inputs": [ { "OperatorType": "Route", @@ -3173,13 +3202,13 @@ "Instructions": { "OperatorType": "Filter", "Predicate": "sum(`user`.foo) + sum(bar) = 42", + "ResultColumns": 3, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "sum(1) AS fooSum, sum(2) AS barSum", "GroupBy": "(0|3)", - "ResultColumns": 3, "Inputs": [ { "OperatorType": "Route", @@ -3218,7 +3247,6 @@ "Variant": "Ordered", "Aggregates": "sum_count_star(1) AS count(*)", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -3257,7 +3285,6 @@ "Variant": "Ordered", "Aggregates": "sum_count(1) AS count(u.`name`)", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Projection", @@ -3362,7 +3389,6 @@ "Variant": "Ordered", "Aggregates": "sum_count_star(1) AS count(*)", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Projection", @@ -3621,8 +3647,10 @@ "Aggregates": "count_star(0) AS count(*)", "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "3", + "OperatorType": "Projection", + "Expressions": [ + "1 as 1" + ], "Inputs": [ { "OperatorType": "Limit", @@ -3635,8 +3663,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select x.phone, x.id, x.city, 1 from (select phone, id, city from `user` where 1 != 1) as x where 1 != 1", - "Query": "select x.phone, x.id, x.city, 1 from (select phone, id, city from `user` where id > 12) as x limit 10", + "FieldQuery": "select 1 from (select phone, id, city from `user` where 1 != 1) as x where 1 != 1", + "Query": "select 1 from (select phone, id, city from `user` where id > 12) as x limit 10", "Table": "`user`" } ] @@ -3734,8 +3762,12 @@ "ResultColumns": 2, "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "1,2,3", + "OperatorType": "Projection", + "Expressions": [ + ":1 as val1", + "1 as 1", + ":2 as weight_string(val1)" + ], "Inputs": [ { "OperatorType": "Limit", @@ -3748,9 +3780,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select x.id, x.val1, 1, weight_string(x.val1) from (select id, val1 from `user` where 1 != 1) as x where 1 != 1", - "OrderBy": "(1|3) ASC", - "Query": "select x.id, x.val1, 1, weight_string(x.val1) from (select id, val1 from `user` where val2 < 4) as x order by x.val1 asc limit 2", + "FieldQuery": "select x.id, x.val1, weight_string(x.val1) from (select id, val1 from `user` where 1 != 1) as x where 1 != 1", + "OrderBy": "(1|2) ASC", + "Query": "select x.id, x.val1, weight_string(x.val1) from (select id, val1 from `user` where val2 < 4) as x order by x.val1 asc limit 2", "Table": "`user`" } ] @@ -3771,25 +3803,42 @@ "QueryType": "SELECT", "Original": "select * from (select id from user having count(*) = 1) s", "Instructions": { - "OperatorType": "Filter", - "Predicate": "count(*) = 1", - "ResultColumns": 1, + "OperatorType": "SimpleProjection", + "ColumnNames": [ + "0:id" + ], + "Columns": "0", "Inputs": [ { - "OperatorType": "Aggregate", - "Variant": "Scalar", - "Aggregates": "any_value(0) AS id, sum_count_star(1) AS count(*)", + "OperatorType": "Projection", + "Expressions": [ + ":0 as id", + "count(*) = 1 as count(*) = 1" + ], "Inputs": [ { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select id, count(*) from `user` where 1 != 1", - "Query": "select id, count(*) from `user`", - "Table": "`user`" + "OperatorType": "Filter", + "Predicate": "count(*) = 1", + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "any_value(0) AS id, sum_count_star(1) AS count(*), any_value(2)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id, count(*), 1 from `user` where 1 != 1", + "Query": "select id, count(*), 1 from `user`", + "Table": "`user`" + } + ] + } + ] } ] } @@ -4112,7 +4161,6 @@ "Variant": "Ordered", "Aggregates": "max(1|3) AS bazo", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -4151,7 +4199,6 @@ "Variant": "Ordered", "Aggregates": "sum_count(1) AS bazo", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -4999,13 +5046,13 @@ "Collations": [ "0" ], + "ResultColumns": 1, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "sum_count_star(0) AS count(*)", "GroupBy": "1", - "ResultColumns": 1, "Inputs": [ { "OperatorType": "Route", @@ -5681,7 +5728,6 @@ "OperatorType": "Aggregate", "Variant": "Ordered", "GroupBy": "0, (1|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "SimpleProjection", @@ -5690,7 +5736,7 @@ { "OperatorType": "Aggregate", "Variant": "Scalar", - "Aggregates": "any_value(0) AS id, sum_count_star(1) AS a, any_value(2)", + "Aggregates": "any_value(0|2) AS id, sum_count_star(1) AS a", "Inputs": [ { "OperatorType": "Route", @@ -5699,9 +5745,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select id, count(*) as a, weight_string(id) from `user` where 1 != 1", - "OrderBy": "1 ASC, (0|2) ASC", - "Query": "select id, count(*) as a, weight_string(id) from `user` order by count(*) asc, id asc", + "FieldQuery": "select dt.c0 as id, dt.c1 as a, weight_string(dt.c0), weight_string(dt.c0) from (select id, count(*) as a from `user` where 1 != 1) as dt(c0, c1) where 1 != 1", + "OrderBy": "1 ASC, (0|3) ASC", + "Query": "select dt.c0 as id, dt.c1 as a, weight_string(dt.c0), weight_string(dt.c0) from (select id, count(*) as a from `user` order by count(*) asc, id asc) as dt(c0, c1)", "Table": "`user`" } ] @@ -5846,16 +5892,15 @@ { "OperatorType": "Aggregate", "Variant": "Ordered", - "Aggregates": "group_concat(1) AS group_concat(u.bar), any_value(2) AS baz, any_value(4)", + "Aggregates": "group_concat(1) AS group_concat(u.bar), any_value(2|4) AS baz", "GroupBy": "(0|3)", - "ResultColumns": 5, "Inputs": [ { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "L:0,L:1,L:2,L:3,L:4", + "JoinColumnIndexes": "L:0,L:1,L:2,L:4,L:5", "JoinVars": { - "u_col": 5 + "u_col": 3 }, "TableName": "`user`_music", "Inputs": [ @@ -5866,9 +5911,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u.foo, u.bar, u.baz, weight_string(u.foo), weight_string(u.baz), u.col from `user` as u where 1 != 1", - "OrderBy": "(0|3) ASC", - "Query": "select u.foo, u.bar, u.baz, weight_string(u.foo), weight_string(u.baz), u.col from `user` as u order by u.foo asc", + "FieldQuery": "select u.foo, u.bar, u.baz, u.col, weight_string(u.foo), weight_string(u.baz) from `user` as u where 1 != 1", + "OrderBy": "(0|4) ASC", + "Query": "select u.foo, u.bar, u.baz, u.col, weight_string(u.foo), weight_string(u.baz) from `user` as u order by u.foo asc", "Table": "`user`" }, { @@ -6104,18 +6149,19 @@ "Variant": "Ordered", "Aggregates": "count_star(0)", "GroupBy": "1", - "ResultColumns": 1, "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "2,1", + "OperatorType": "Projection", + "Expressions": [ + "1 as 1", + "0 as .0" + ], "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", - "Aggregates": "sum_count_star(0) AS count(*), any_value(2)", + "Aggregates": "sum_count_star(0) AS count(*)", "GroupBy": "1", - "ResultColumns": 3, "Inputs": [ { "OperatorType": "Route", @@ -6124,8 +6170,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*), .0, 1 from `user` where 1 != 1 group by .0", - "Query": "select count(*), .0, 1 from `user` group by .0", + "FieldQuery": "select count(*), .0 from `user` where 1 != 1 group by .0", + "Query": "select count(*), .0 from `user` group by .0", "Table": "`user`" } ] @@ -6289,7 +6335,6 @@ "Variant": "Ordered", "Aggregates": "sum(1) AS avg(id), sum_count(2) AS count(foo), sum_count(3) AS count(id)", "GroupBy": "(0|4)", - "ResultColumns": 4, "Inputs": [ { "OperatorType": "Route", @@ -6339,7 +6384,6 @@ "Variant": "Ordered", "Aggregates": "sum(1) AS avg(id), sum_count(2) AS count(foo), sum_count(3) AS count(id)", "GroupBy": "(0|4)", - "ResultColumns": 4, "Inputs": [ { "OperatorType": "Route", @@ -6523,7 +6567,6 @@ "OperatorType": "Aggregate", "Variant": "Scalar", "Aggregates": "min(0|2) AS min_id, max(1|3) AS max_id", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -6667,7 +6710,7 @@ "Variant": "HashLeftJoin", "Collation": "binary", "ComparisonType": "INT16", - "JoinColumnIndexes": "-1,1,-2,2,-3,3", + "JoinColumnIndexes": "-1,1,-2,2,-3,3,-3,4", "Predicate": "`user`.col = ue.col", "TableName": "`user`_user_extra", "Inputs": [ @@ -6687,16 +6730,20 @@ "Variant": "Ordered", "Aggregates": "count_star(0)", "GroupBy": "1, (2|3)", - "ResultColumns": 3, "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "2,0,1,3", + "OperatorType": "Projection", + "Expressions": [ + "1 as 1", + ":0 as col", + ":1 as bar", + ":2 as weight_string(ue.bar)" + ], "Inputs": [ { "OperatorType": "Sort", "Variant": "Memory", - "OrderBy": "0 ASC, (1|3) ASC", + "OrderBy": "0 ASC, (1|2) ASC", "Inputs": [ { "OperatorType": "Limit", @@ -6709,8 +6756,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select ue.col, ue.bar, 1, weight_string(ue.bar) from (select col, bar from user_extra where 1 != 1) as ue where 1 != 1", - "Query": "select ue.col, ue.bar, 1, weight_string(ue.bar) from (select col, bar from user_extra) as ue limit 10", + "FieldQuery": "select ue.col, ue.bar, weight_string(ue.bar) from (select col, bar from user_extra where 1 != 1) as ue where 1 != 1", + "Query": "select ue.col, ue.bar, weight_string(ue.bar) from (select col, bar from user_extra) as ue limit 10", "Table": "user_extra" } ] @@ -7256,8 +7303,10 @@ "Aggregates": "count_star(0) AS count(*)", "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "2", + "OperatorType": "Projection", + "Expressions": [ + "1 as 1" + ], "Inputs": [ { "OperatorType": "Limit", @@ -7271,9 +7320,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select subquery_for_count.one, subquery_for_count.id, 1, weight_string(subquery_for_count.id) from (select 1 as one, id from `user` where 1 != 1) as subquery_for_count where 1 != 1", - "OrderBy": "(1|3) DESC", - "Query": "select subquery_for_count.one, subquery_for_count.id, 1, weight_string(subquery_for_count.id) from (select 1 as one, id from `user` where `user`.is_not_deleted = true) as subquery_for_count order by subquery_for_count.id desc limit 25", + "FieldQuery": "select subquery_for_count.one, subquery_for_count.id, weight_string(subquery_for_count.id) from (select 1 as one, id from `user` where 1 != 1) as subquery_for_count where 1 != 1", + "OrderBy": "(1|2) DESC", + "Query": "select subquery_for_count.one, subquery_for_count.id, weight_string(subquery_for_count.id) from (select 1 as one, id from `user` where `user`.is_not_deleted = true) as subquery_for_count order by subquery_for_count.id desc limit 25", "Table": "`user`" } ] diff --git a/go/vt/vtgate/planbuilder/testdata/cte_cases.json b/go/vt/vtgate/planbuilder/testdata/cte_cases.json index 1fd398012e3..016159806d7 100644 --- a/go/vt/vtgate/planbuilder/testdata/cte_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/cte_cases.json @@ -223,8 +223,10 @@ "Aggregates": "count_star(0) AS count(*)", "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "3", + "OperatorType": "Projection", + "Expressions": [ + "1 as 1" + ], "Inputs": [ { "OperatorType": "Limit", @@ -237,8 +239,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select x.phone, x.id, x.city, 1 from (select phone, id, city from `user` where 1 != 1) as x where 1 != 1", - "Query": "select x.phone, x.id, x.city, 1 from (select phone, id, city from `user` where id > 12) as x limit 10", + "FieldQuery": "select 1 from (select phone, id, city from `user` where 1 != 1) as x where 1 != 1", + "Query": "select 1 from (select phone, id, city from `user` where id > 12) as x limit 10", "Table": "`user`" } ] @@ -336,8 +338,12 @@ "ResultColumns": 2, "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "1,2,3", + "OperatorType": "Projection", + "Expressions": [ + ":1 as val1", + "1 as 1", + ":2 as weight_string(val1)" + ], "Inputs": [ { "OperatorType": "Limit", @@ -350,9 +356,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select x.id, x.val1, 1, weight_string(x.val1) from (select id, val1 from `user` where 1 != 1) as x where 1 != 1", - "OrderBy": "(1|3) ASC", - "Query": "select x.id, x.val1, 1, weight_string(x.val1) from (select id, val1 from `user` where val2 < 4) as x order by x.val1 asc limit 2", + "FieldQuery": "select x.id, x.val1, weight_string(x.val1) from (select id, val1 from `user` where 1 != 1) as x where 1 != 1", + "OrderBy": "(1|2) ASC", + "Query": "select x.id, x.val1, weight_string(x.val1) from (select id, val1 from `user` where val2 < 4) as x order by x.val1 asc limit 2", "Table": "`user`" } ] @@ -373,25 +379,42 @@ "QueryType": "SELECT", "Original": "with s as (select id from user having count(*) = 1) select * from s", "Instructions": { - "OperatorType": "Filter", - "Predicate": "count(*) = 1", - "ResultColumns": 1, + "OperatorType": "SimpleProjection", + "ColumnNames": [ + "0:id" + ], + "Columns": "0", "Inputs": [ { - "OperatorType": "Aggregate", - "Variant": "Scalar", - "Aggregates": "any_value(0) AS id, sum_count_star(1) AS count(*)", + "OperatorType": "Projection", + "Expressions": [ + ":0 as id", + "count(*) = 1 as count(*) = 1" + ], "Inputs": [ { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select id, count(*) from `user` where 1 != 1", - "Query": "select id, count(*) from `user`", - "Table": "`user`" + "OperatorType": "Filter", + "Predicate": "count(*) = 1", + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "any_value(0) AS id, sum_count_star(1) AS count(*), any_value(2)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id, count(*), 1 from `user` where 1 != 1", + "Query": "select id, count(*), 1 from `user`", + "Table": "`user`" + } + ] + } + ] } ] } @@ -479,7 +502,6 @@ "Variant": "Ordered", "Aggregates": "max(1|3) AS bazo", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -518,7 +540,6 @@ "Variant": "Ordered", "Aggregates": "sum_count(1) AS bazo", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -565,7 +586,6 @@ "OperatorType": "Aggregate", "Variant": "Ordered", "GroupBy": "0, (1|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "SimpleProjection", @@ -574,7 +594,7 @@ { "OperatorType": "Aggregate", "Variant": "Scalar", - "Aggregates": "any_value(0) AS id, sum_count_star(1) AS a, any_value(2)", + "Aggregates": "any_value(0|2) AS id, sum_count_star(1) AS a", "Inputs": [ { "OperatorType": "Route", @@ -583,9 +603,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select id, count(*) as a, weight_string(id) from `user` where 1 != 1", - "OrderBy": "1 ASC, (0|2) ASC", - "Query": "select id, count(*) as a, weight_string(id) from `user` order by count(*) asc, id asc", + "FieldQuery": "select dt.c0 as id, dt.c1 as a, weight_string(dt.c0), weight_string(dt.c0) from (select id, count(*) as a from `user` where 1 != 1) as dt(c0, c1) where 1 != 1", + "OrderBy": "1 ASC, (0|3) ASC", + "Query": "select dt.c0 as id, dt.c1 as a, weight_string(dt.c0), weight_string(dt.c0) from (select id, count(*) as a from `user` order by count(*) asc, id asc) as dt(c0, c1)", "Table": "`user`" } ] @@ -718,13 +738,15 @@ "Aggregates": "count_star(0) AS count(*)", "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "1", + "OperatorType": "Projection", + "Expressions": [ + "1 as 1" + ], "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Scalar", - "Aggregates": "sum_count_star(0) AS count(*), any_value(1)", + "Aggregates": "sum_count_star(0) AS count(*)", "Inputs": [ { "OperatorType": "Route", @@ -733,8 +755,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*), 1 from `user` where 1 != 1", - "Query": "select count(*), 1 from `user`", + "FieldQuery": "select count(*) from `user` where 1 != 1", + "Query": "select count(*) from `user`", "Table": "`user`" } ] @@ -1999,8 +2021,11 @@ "Aggregates": "any_value(0), sum(1) AS sum(num)", "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "1,0", + "OperatorType": "Projection", + "Expressions": [ + "1000 as 1000", + ":0 as num" + ], "Inputs": [ { "OperatorType": "Concatenate", @@ -2012,11 +2037,13 @@ { "OperatorType": "Aggregate", "Variant": "Scalar", - "Aggregates": "count_star(0) AS num, any_value(1)", + "Aggregates": "count_star(0) AS num", "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "1,2", + "OperatorType": "Projection", + "Expressions": [ + "1 as 1" + ], "Inputs": [ { "OperatorType": "Limit", @@ -2029,8 +2056,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select t.id, 1, 1000 from (select `user`.id from `user` where 1 != 1) as t where 1 != 1", - "Query": "select t.id, 1, 1000 from (select `user`.id from `user` where `user`.textcol1 = 'open' and `user`.intcol = 1) as t limit :__upper_limit", + "FieldQuery": "select 1 from (select `user`.id from `user` where 1 != 1) as t where 1 != 1", + "Query": "select 1 from (select `user`.id from `user` where `user`.textcol1 = 'open' and `user`.intcol = 1) as t limit :__upper_limit", "Table": "`user`" } ] @@ -2048,11 +2075,13 @@ { "OperatorType": "Aggregate", "Variant": "Scalar", - "Aggregates": "count_star(0) AS num, any_value(1)", + "Aggregates": "count_star(0) AS num", "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "1,2", + "OperatorType": "Projection", + "Expressions": [ + "1 as 1" + ], "Inputs": [ { "OperatorType": "Limit", @@ -2065,8 +2094,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select t.id, 1, 1000 from (select `user`.id from `user` where 1 != 1) as t where 1 != 1", - "Query": "select t.id, 1, 1000 from (select `user`.id from `user` where `user`.textcol1 = 'closed' and `user`.intcol = 1) as t limit :__upper_limit", + "FieldQuery": "select 1 from (select `user`.id from `user` where 1 != 1) as t where 1 != 1", + "Query": "select 1 from (select `user`.id from `user` where `user`.textcol1 = 'closed' and `user`.intcol = 1) as t limit :__upper_limit", "Table": "`user`" } ] @@ -2093,5 +2122,461 @@ "user.user" ] } + }, + { + "comment": "Recursive CTE that cannot be merged", + "query": "with recursive cte as (select name, id from user where manager_id is null union all select e.name, e.id from user e inner join cte on e.manager_id = cte.id) select name from cte", + "plan": { + "QueryType": "SELECT", + "Original": "with recursive cte as (select name, id from user where manager_id is null union all select e.name, e.id from user e inner join cte on e.manager_id = cte.id) select name from cte", + "Instructions": { + "OperatorType": "SimpleProjection", + "ColumnNames": [ + "0:name" + ], + "Columns": "0", + "Inputs": [ + { + "OperatorType": "RecurseCTE", + "JoinVars": { + "cte_id": 1 + }, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `name`, id from `user` where 1 != 1", + "Query": "select `name`, id from `user` where manager_id is null", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select e.`name`, e.id from `user` as e where 1 != 1", + "Query": "select e.`name`, e.id from `user` as e where e.manager_id = :cte_id", + "Table": "`user`, dual" + } + ] + } + ] + }, + "TablesUsed": [ + "main.dual", + "user.user" + ] + } + }, + { + "comment": "Recursive CTE that cannot be merged 2", + "query": "with recursive cte as (select name, id from user where manager_id is null union all select e.name, e.id from cte join user e on e.manager_id = cte.id) select name from cte", + "plan": { + "QueryType": "SELECT", + "Original": "with recursive cte as (select name, id from user where manager_id is null union all select e.name, e.id from cte join user e on e.manager_id = cte.id) select name from cte", + "Instructions": { + "OperatorType": "SimpleProjection", + "ColumnNames": [ + "0:name" + ], + "Columns": "0", + "Inputs": [ + { + "OperatorType": "RecurseCTE", + "JoinVars": { + "cte_id": 1 + }, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `name`, id from `user` where 1 != 1", + "Query": "select `name`, id from `user` where manager_id is null", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select e.`name`, e.id from `user` as e where 1 != 1", + "Query": "select e.`name`, e.id from `user` as e where e.manager_id = :cte_id", + "Table": "`user`, dual" + } + ] + } + ] + }, + "TablesUsed": [ + "main.dual", + "user.user" + ] + } + }, + { + "comment": "Merge into a single dual route", + "query": "WITH RECURSIVE cte AS (SELECT 1 as n UNION ALL SELECT n + 1 FROM cte WHERE n < 5) SELECT n FROM cte", + "plan": { + "QueryType": "SELECT", + "Original": "WITH RECURSIVE cte AS (SELECT 1 as n UNION ALL SELECT n + 1 FROM cte WHERE n < 5) SELECT n FROM cte", + "Instructions": { + "OperatorType": "Route", + "Variant": "Reference", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "with recursive cte as (select 1 as n from dual where 1 != 1 union all select n + 1 from cte where 1 != 1) select n from cte where 1 != 1", + "Query": "with recursive cte as (select 1 as n from dual union all select n + 1 from cte where n < 5) select n from cte", + "Table": "dual" + }, + "TablesUsed": [ + "main.dual" + ] + } + }, + { + "comment": "Recursive CTE with star projection", + "query": "WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5) SELECT * FROM cte", + "plan": { + "QueryType": "SELECT", + "Original": "WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5) SELECT * FROM cte", + "Instructions": { + "OperatorType": "Route", + "Variant": "Reference", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "with recursive cte as (select 1 from dual where 1 != 1 union all select n + 1 from cte where 1 != 1) select n from cte where 1 != 1", + "Query": "with recursive cte as (select 1 from dual union all select n + 1 from cte where n < 5) select n from cte", + "Table": "dual" + }, + "TablesUsed": [ + "main.dual" + ] + } + }, + { + "comment": "Recursive CTE calculations on the term side - merged", + "query": "WITH RECURSIVE emp_cte AS (SELECT id, 1 AS level FROM user WHERE manager_id IS NULL and id = 6 UNION ALL SELECT e.id, cte.level + 1 FROM user e JOIN emp_cte cte ON e.manager_id = cte.id and e.id = 6) SELECT * FROM emp_cte", + "plan": { + "QueryType": "SELECT", + "Original": "WITH RECURSIVE emp_cte AS (SELECT id, 1 AS level FROM user WHERE manager_id IS NULL and id = 6 UNION ALL SELECT e.id, cte.level + 1 FROM user e JOIN emp_cte cte ON e.manager_id = cte.id and e.id = 6) SELECT * FROM emp_cte", + "Instructions": { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "with recursive emp_cte as (select id, 1 as `level` from `user` where 1 != 1 union all select e.id, cte.`level` + 1 from cte as cte, `user` as e where 1 != 1) select id, `level` from emp_cte where 1 != 1", + "Query": "with recursive emp_cte as (select id, 1 as `level` from `user` where manager_id is null and id = 6 union all select e.id, cte.`level` + 1 from cte as cte, `user` as e where e.id = 6 and e.manager_id = cte.id) select id, `level` from emp_cte", + "Table": "`user`, dual", + "Values": [ + "6" + ], + "Vindex": "user_index" + }, + "TablesUsed": [ + "main.dual", + "user.user" + ] + } + }, + { + "comment": "Recursive CTE calculations on the term side - unmerged", + "query": "WITH RECURSIVE emp_cte AS (SELECT id, 1 AS level FROM user WHERE manager_id IS NULL UNION ALL SELECT e.id, cte.level + 1 FROM user e JOIN emp_cte cte ON e.manager_id = cte.id) SELECT * FROM emp_cte", + "plan": { + "QueryType": "SELECT", + "Original": "WITH RECURSIVE emp_cte AS (SELECT id, 1 AS level FROM user WHERE manager_id IS NULL UNION ALL SELECT e.id, cte.level + 1 FROM user e JOIN emp_cte cte ON e.manager_id = cte.id) SELECT * FROM emp_cte", + "Instructions": { + "OperatorType": "RecurseCTE", + "JoinVars": { + "cte_id": 0, + "cte_level": 1 + }, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id, 1 as `level` from `user` where 1 != 1", + "Query": "select id, 1 as `level` from `user` where manager_id is null", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select e.id, :cte_level + 1 as `cte.``level`` + 1` from `user` as e where 1 != 1", + "Query": "select e.id, :cte_level + 1 as `cte.``level`` + 1` from `user` as e where e.manager_id = :cte_id", + "Table": "`user`, dual" + } + ] + }, + "TablesUsed": [ + "main.dual", + "user.user" + ] + } + }, + { + "comment": "Outer join with recursive CTE", + "query": "WITH RECURSIVE literal_cte AS (SELECT 1 AS id, 100 AS value, 1 AS manager_id UNION ALL SELECT id + 1, value * 2, id FROM literal_cte WHERE id < 5) SELECT l.id, l.value, l.manager_id, e.name AS employee_name FROM literal_cte l LEFT JOIN user e ON l.id = e.id", + "plan": { + "QueryType": "SELECT", + "Original": "WITH RECURSIVE literal_cte AS (SELECT 1 AS id, 100 AS value, 1 AS manager_id UNION ALL SELECT id + 1, value * 2, id FROM literal_cte WHERE id < 5) SELECT l.id, l.value, l.manager_id, e.name AS employee_name FROM literal_cte l LEFT JOIN user e ON l.id = e.id", + "Instructions": { + "OperatorType": "Join", + "Variant": "LeftJoin", + "JoinColumnIndexes": "L:0,L:1,L:2,R:0", + "JoinVars": { + "l_id": 0 + }, + "TableName": "dual_`user`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Reference", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "with recursive literal_cte as (select 1 as id, 100 as value, 1 as manager_id from dual where 1 != 1 union all select id + 1, value * 2, id from literal_cte where 1 != 1) select l.id, l.value, l.manager_id from literal_cte as l where 1 != 1", + "Query": "with recursive literal_cte as (select 1 as id, 100 as value, 1 as manager_id from dual union all select id + 1, value * 2, id from literal_cte where id < 5) select l.id, l.value, l.manager_id from literal_cte as l", + "Table": "dual" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select e.`name` as employee_name from `user` as e where 1 != 1", + "Query": "select e.`name` as employee_name from `user` as e where e.id = :l_id", + "Table": "`user`", + "Values": [ + ":l_id" + ], + "Vindex": "user_index" + } + ] + }, + "TablesUsed": [ + "main.dual", + "user.user" + ] + } + }, + { + "comment": "Aggregation on the output of a recursive CTE", + "query": "WITH RECURSIVE emp_cte AS (SELECT id, name, manager_id FROM user WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, e.manager_id FROM user e INNER JOIN emp_cte cte ON e.manager_id = cte.id) SELECT manager_id, COUNT(*) AS employee_count FROM emp_cte GROUP BY manager_id", + "plan": { + "QueryType": "SELECT", + "Original": "WITH RECURSIVE emp_cte AS (SELECT id, name, manager_id FROM user WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, e.manager_id FROM user e INNER JOIN emp_cte cte ON e.manager_id = cte.id) SELECT manager_id, COUNT(*) AS employee_count FROM emp_cte GROUP BY manager_id", + "Instructions": { + "OperatorType": "Aggregate", + "Variant": "Ordered", + "Aggregates": "count_star(1) AS employee_count", + "GroupBy": "(0|2)", + "ResultColumns": 2, + "Inputs": [ + { + "OperatorType": "Projection", + "Expressions": [ + ":2 as manager_id", + "1 as 1", + "weight_string(:2) as weight_string(manager_id)" + ], + "Inputs": [ + { + "OperatorType": "Sort", + "Variant": "Memory", + "OrderBy": "(2|3) ASC", + "Inputs": [ + { + "OperatorType": "RecurseCTE", + "JoinVars": { + "cte_id": 0 + }, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select dt.c0 as id, dt.c1 as `name`, dt.c2 as manager_id, weight_string(dt.c2) from (select id, `name`, manager_id from `user` where 1 != 1) as dt(c0, c1, c2) where 1 != 1", + "Query": "select dt.c0 as id, dt.c1 as `name`, dt.c2 as manager_id, weight_string(dt.c2) from (select id, `name`, manager_id from `user` where manager_id is null) as dt(c0, c1, c2)", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select e.id, e.`name`, e.manager_id, weight_string(e.manager_id) from `user` as e where 1 != 1", + "Query": "select e.id, e.`name`, e.manager_id, weight_string(e.manager_id) from `user` as e where e.manager_id = :cte_id", + "Table": "`user`, dual" + } + ] + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "main.dual", + "user.user" + ] + } + }, + { + "comment": "Query that can be merged, dual on the RHS of the UNION", + "query": "with recursive cte as (select id from user where id = 72 union all select id+1 from cte where id < 100) select * from cte", + "plan": { + "QueryType": "SELECT", + "Original": "with recursive cte as (select id from user where id = 72 union all select id+1 from cte where id < 100) select * from cte", + "Instructions": { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "with recursive cte as (select id from `user` where 1 != 1 union all select id + 1 from cte where 1 != 1) select id from cte where 1 != 1", + "Query": "with recursive cte as (select id from `user` where id = 72 union all select id + 1 from cte where id < 100) select id from cte", + "Table": "`user`, dual", + "Values": [ + "72" + ], + "Vindex": "user_index" + }, + "TablesUsed": [ + "main.dual", + "user.user" + ] + } + }, + { + "comment": "Merge CTE with reference tables", + "query": "with recursive cte as (select ue.id, ue.foo from user u join user_extra ue on u.id = ue.user_id union all select sr.id, sr.foo from cte join main.source_of_ref sr on sr.foo = cte.foo join main.rerouted_ref rr on rr.bar = sr.bar) select * from cte", + "plan": { + "QueryType": "SELECT", + "Original": "with recursive cte as (select ue.id, ue.foo from user u join user_extra ue on u.id = ue.user_id union all select sr.id, sr.foo from cte join main.source_of_ref sr on sr.foo = cte.foo join main.rerouted_ref rr on rr.bar = sr.bar) select * from cte", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "with recursive cte as (select ue.id, ue.foo from `user` as u, user_extra as ue where 1 != 1 union all select sr.id, sr.foo from ref_with_source as sr, ref as rr where 1 != 1) select id, foo from cte where 1 != 1", + "Query": "with recursive cte as (select ue.id, ue.foo from `user` as u, user_extra as ue where u.id = ue.user_id union all select sr.id, sr.foo from ref_with_source as sr, ref as rr where rr.bar = sr.bar and sr.foo = cte.foo) select id, foo from cte", + "Table": "`user`, ref, ref_with_source, user_extra" + }, + "TablesUsed": [ + "user.ref", + "user.ref_with_source", + "user.user", + "user.user_extra" + ] + } + }, + { + "comment": "Merge CTE with reference tables 2", + "query": "with recursive cte as (select sr.id, sr.foo from main.source_of_ref sr join main.rerouted_ref rr on rr.bar = sr.bar union all select ue.id, ue.foo from cte join user_extra ue on cte.foo = ue.foo join user u on ue.user_id = u.id) select * from cte", + "plan": { + "QueryType": "SELECT", + "Original": "with recursive cte as (select sr.id, sr.foo from main.source_of_ref sr join main.rerouted_ref rr on rr.bar = sr.bar union all select ue.id, ue.foo from cte join user_extra ue on cte.foo = ue.foo join user u on ue.user_id = u.id) select * from cte", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "with recursive cte as (select 1 from ref_with_source as sr, ref as rr where 1 != 1 union all select ue.id, ue.foo from cte, user_extra as ue, `user` as u where 1 != 1) select id, foo from cte where 1 != 1", + "Query": "with recursive cte as (select 1 from ref_with_source as sr, ref as rr where rr.bar = sr.bar union all select ue.id, ue.foo from cte, user_extra as ue, `user` as u where ue.user_id = u.id and cte.foo = ue.foo) select id, foo from cte", + "Table": "`user`, dual, ref, ref_with_source, user_extra" + }, + "TablesUsed": [ + "main.dual", + "user.ref", + "user.ref_with_source", + "user.user", + "user.user_extra" + ] + } + }, + { + "comment": "Merged recursive CTE with DISTINCT", + "query": "WITH RECURSIVE hierarchy AS (SELECT id, name, manager_id FROM user UNION ALL SELECT id, name, manager_id FROM user UNION DISTINCT SELECT id*2, name, manager_id from hierarchy WHERE id < 10 ) SELECT * FROM hierarchy", + "plan": { + "QueryType": "SELECT", + "Original": "WITH RECURSIVE hierarchy AS (SELECT id, name, manager_id FROM user UNION ALL SELECT id, name, manager_id FROM user UNION DISTINCT SELECT id*2, name, manager_id from hierarchy WHERE id < 10 ) SELECT * FROM hierarchy", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "with recursive hierarchy as (select id, `name`, manager_id from `user` where 1 != 1 union all select id, `name`, manager_id from `user` where 1 != 1 union select id * 2, `name`, manager_id from hierarchy where 1 != 1) select id, `name`, manager_id from hierarchy where 1 != 1", + "Query": "with recursive hierarchy as (select id, `name`, manager_id from `user` union all select id, `name`, manager_id from `user` union select id * 2, `name`, manager_id from hierarchy where id < 10) select id, `name`, manager_id from hierarchy", + "Table": "`user`, dual" + }, + "TablesUsed": [ + "main.dual", + "user.user" + ] + } + }, + { + "comment": "Query that caused planner to stack overflow", + "query": "SELECT * FROM (SELECT 1 UNION ALL SELECT 2) AS dt(a) WHERE EXISTS(WITH RECURSIVE qn AS (SELECT a * 0 AS b UNION ALL SELECT b + 1 FROM qn WHERE b = 0) SELECT * FROM qn WHERE b = a)", + "plan": { + "QueryType": "SELECT", + "Original": "SELECT * FROM (SELECT 1 UNION ALL SELECT 2) AS dt(a) WHERE EXISTS(WITH RECURSIVE qn AS (SELECT a * 0 AS b UNION ALL SELECT b + 1 FROM qn WHERE b = 0) SELECT * FROM qn WHERE b = a)", + "Instructions": { + "OperatorType": "Route", + "Variant": "Reference", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select a from (select 1 from dual where 1 != 1 union all select 2 from dual where 1 != 1) as dt(a) where 1 != 1", + "Query": "select a from (select 1 from dual union all select 2 from dual) as dt(a) where exists (with recursive qn as (select a * 0 as b from dual union all select b + 1 from qn where b = 0) select 1 from qn where b = a)", + "Table": "dual" + }, + "TablesUsed": [ + "main.dual" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/dml_cases.json b/go/vt/vtgate/planbuilder/testdata/dml_cases.json index b5d0fa8951f..f796b935605 100644 --- a/go/vt/vtgate/planbuilder/testdata/dml_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/dml_cases.json @@ -2823,7 +2823,7 @@ "Query": "delete from `user` where `name` = _binary 'abc'", "Table": "user", "Values": [ - "'abc'" + "_binary'abc'" ], "Vindex": "name_user_map" }, diff --git a/go/vt/vtgate/planbuilder/testdata/filter_cases.json b/go/vt/vtgate/planbuilder/testdata/filter_cases.json index b60e8812dda..4194a369bd6 100644 --- a/go/vt/vtgate/planbuilder/testdata/filter_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/filter_cases.json @@ -789,7 +789,7 @@ "Sharded": true }, "FieldQuery": "select Id from `user` where 1 != 1", - "Query": "select Id from `user` where 1 in ('aa', 'bb')", + "Query": "select Id from `user` where 0", "Table": "`user`" }, "TablesUsed": [ @@ -797,6 +797,108 @@ ] } }, + { + "comment": "Disjunction of conjunctions with 4 or more disjunctions", + "query": "select id from user where (col = 'aa' AND name = 'bb') OR (col = 'cc' AND name = 'dd') OR (col = 'ee' AND name = 'ff') OR (col = 'gg' AND name = 'hh')", + "plan": { + "QueryType": "SELECT", + "Original": "select id from user where (col = 'aa' AND name = 'bb') OR (col = 'cc' AND name = 'dd') OR (col = 'ee' AND name = 'ff') OR (col = 'gg' AND name = 'hh')", + "Instructions": { + "OperatorType": "VindexLookup", + "Variant": "MultiEqual", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "Values": [ + "('bb', 'dd', 'ff', 'hh')" + ], + "Vindex": "name_user_map", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "IN", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `name`, keyspace_id from name_user_vdx where 1 != 1", + "Query": "select `name`, keyspace_id from name_user_vdx where `name` in ::__vals", + "Table": "name_user_vdx", + "Values": [ + "::name" + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "ByDestination", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where col = 'aa' and `name` = 'bb' or col = 'cc' and `name` = 'dd' or col = 'ee' and `name` = 'ff' or col = 'gg' and `name` = 'hh'", + "Table": "`user`" + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "Disjunction of conjunctions with 3 or less disjunctions", + "query": "select id from user where (col = 'aa' AND name = 'bb') OR (col = 'cc' AND name = 'dd') OR (col = 'ee' AND name = 'ff')", + "plan": { + "QueryType": "SELECT", + "Original": "select id from user where (col = 'aa' AND name = 'bb') OR (col = 'cc' AND name = 'dd') OR (col = 'ee' AND name = 'ff')", + "Instructions": { + "OperatorType": "VindexLookup", + "Variant": "IN", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "Values": [ + "('bb', 'dd', 'ff')" + ], + "Vindex": "name_user_map", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "IN", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `name`, keyspace_id from name_user_vdx where 1 != 1", + "Query": "select `name`, keyspace_id from name_user_vdx where `name` in ::__vals", + "Table": "name_user_vdx", + "Values": [ + "::name" + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "ByDestination", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where col in ('aa', 'cc', 'ee') and (col in ('aa', 'cc') or `name` = 'ff') and (col = 'aa' or `name` = 'dd' or col = 'ee') and (col = 'aa' or `name` = 'dd' or `name` = 'ff') and (`name` = 'bb' or col = 'cc' or col = 'ee') and (`name` = 'bb' or col = 'cc' or `name` = 'ff') and (`name` in ('bb', 'dd') or col = 'ee') and `name` in ::__vals", + "Table": "`user`" + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, { "comment": "Single table complex in clause", "query": "select id from user where name in (col, 'bb')", @@ -1251,7 +1353,7 @@ "Sharded": true }, "FieldQuery": "select `user`.col from `user` where 1 != 1", - "Query": "select `user`.col from `user` where 1 = 1", + "Query": "select `user`.col from `user`", "Table": "`user`" }, { @@ -1262,7 +1364,7 @@ "Sharded": true }, "FieldQuery": "select user_extra.id from user_extra where 1 != 1", - "Query": "select user_extra.id from user_extra where user_extra.col = :user_col /* INT16 */ and 1 = 1", + "Query": "select user_extra.id from user_extra where user_extra.col = :user_col /* INT16 */", "Table": "user_extra" } ] diff --git a/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json b/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json index 47f10cd273b..799c9bd4420 100644 --- a/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json @@ -1518,7 +1518,7 @@ "Sharded": false }, "FieldQuery": "select 1 from u_tbl8 left join u_tbl9 on u_tbl9.col9 = cast('foo' as CHAR) where 1 != 1", - "Query": "select 1 from u_tbl8 left join u_tbl9 on u_tbl9.col9 = cast('foo' as CHAR) where u_tbl9.col9 is null and cast('foo' as CHAR) is not null and not (u_tbl8.col8) <=> (cast('foo' as CHAR)) and (u_tbl8.col8) in ::fkc_vals limit 1 for share nowait", + "Query": "select 1 from u_tbl8 left join u_tbl9 on u_tbl9.col9 = cast('foo' as CHAR) where u_tbl9.col9 is null and not (u_tbl8.col8) <=> (cast('foo' as CHAR)) and (u_tbl8.col8) in ::fkc_vals limit 1 for share nowait", "Table": "u_tbl8, u_tbl9" }, { @@ -1594,7 +1594,7 @@ "Sharded": false }, "FieldQuery": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = cast('foo' as CHAR) where 1 != 1", - "Query": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = cast('foo' as CHAR) where u_tbl3.col3 is null and cast('foo' as CHAR) is not null and not (u_tbl4.col4) <=> (cast('foo' as CHAR)) and (u_tbl4.col4) in ::fkc_vals limit 1 for share", + "Query": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = cast('foo' as CHAR) where u_tbl3.col3 is null and not (u_tbl4.col4) <=> (cast('foo' as CHAR)) and (u_tbl4.col4) in ::fkc_vals limit 1 for share", "Table": "u_tbl3, u_tbl4" }, { @@ -1606,7 +1606,7 @@ "Sharded": false }, "FieldQuery": "select 1 from u_tbl4, u_tbl9 where 1 != 1", - "Query": "select 1 from u_tbl4, u_tbl9 where u_tbl4.col4 = u_tbl9.col9 and (u_tbl4.col4) in ::fkc_vals and (cast('foo' as CHAR) is null or (u_tbl9.col9) not in ((cast('foo' as CHAR)))) limit 1 for share", + "Query": "select 1 from u_tbl4, u_tbl9 where u_tbl4.col4 = u_tbl9.col9 and (u_tbl4.col4) in ::fkc_vals and (u_tbl9.col9) not in ((cast('foo' as CHAR))) limit 1 for share", "Table": "u_tbl4, u_tbl9" }, { @@ -2532,7 +2532,7 @@ "Sharded": false }, "FieldQuery": "select 1 from u_multicol_tbl2 left join u_multicol_tbl1 on u_multicol_tbl1.cola = 2 and u_multicol_tbl1.colb = u_multicol_tbl2.colc - 2 where 1 != 1", - "Query": "select 1 from u_multicol_tbl2 left join u_multicol_tbl1 on u_multicol_tbl1.cola = 2 and u_multicol_tbl1.colb = u_multicol_tbl2.colc - 2 where u_multicol_tbl1.cola is null and 2 is not null and u_multicol_tbl1.colb is null and u_multicol_tbl2.colc - 2 is not null and not (u_multicol_tbl2.cola, u_multicol_tbl2.colb) <=> (2, u_multicol_tbl2.colc - 2) and u_multicol_tbl2.id = 7 limit 1 for share", + "Query": "select 1 from u_multicol_tbl2 left join u_multicol_tbl1 on u_multicol_tbl1.cola = 2 and u_multicol_tbl1.colb = u_multicol_tbl2.colc - 2 where u_multicol_tbl1.cola is null and u_multicol_tbl1.colb is null and u_multicol_tbl2.colc - 2 is not null and not (u_multicol_tbl2.cola, u_multicol_tbl2.colb) <=> (2, u_multicol_tbl2.colc - 2) and u_multicol_tbl2.id = 7 limit 1 for share", "Table": "u_multicol_tbl1, u_multicol_tbl2" }, { @@ -4110,7 +4110,7 @@ "Sharded": false }, "FieldQuery": "select 1 from u_tbl8 left join u_tbl9 on u_tbl9.col9 = cast('foo' as CHAR) where 1 != 1", - "Query": "select 1 from u_tbl8 left join u_tbl9 on u_tbl9.col9 = cast('foo' as CHAR) where u_tbl9.col9 is null and cast('foo' as CHAR) is not null and not (u_tbl8.col8) <=> (cast('foo' as CHAR)) and (u_tbl8.col8) in ::fkc_vals limit 1 for share nowait", + "Query": "select 1 from u_tbl8 left join u_tbl9 on u_tbl9.col9 = cast('foo' as CHAR) where u_tbl9.col9 is null and not (u_tbl8.col8) <=> (cast('foo' as CHAR)) and (u_tbl8.col8) in ::fkc_vals limit 1 for share nowait", "Table": "u_tbl8, u_tbl9" }, { diff --git a/go/vt/vtgate/planbuilder/testdata/foreignkey_checks_on_cases.json b/go/vt/vtgate/planbuilder/testdata/foreignkey_checks_on_cases.json index 7b525b2dcc9..5464ccbd619 100644 --- a/go/vt/vtgate/planbuilder/testdata/foreignkey_checks_on_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/foreignkey_checks_on_cases.json @@ -1595,7 +1595,7 @@ "Sharded": false }, "FieldQuery": "select 1 from u_tbl8 left join u_tbl9 on u_tbl9.col9 = cast('foo' as CHAR) where 1 != 1", - "Query": "select 1 from u_tbl8 left join u_tbl9 on u_tbl9.col9 = cast('foo' as CHAR) where u_tbl9.col9 is null and cast('foo' as CHAR) is not null and not (u_tbl8.col8) <=> (cast('foo' as CHAR)) and (u_tbl8.col8) in ::fkc_vals limit 1 for share nowait", + "Query": "select 1 from u_tbl8 left join u_tbl9 on u_tbl9.col9 = cast('foo' as CHAR) where u_tbl9.col9 is null and not (u_tbl8.col8) <=> (cast('foo' as CHAR)) and (u_tbl8.col8) in ::fkc_vals limit 1 for share nowait", "Table": "u_tbl8, u_tbl9" }, { @@ -1671,7 +1671,7 @@ "Sharded": false }, "FieldQuery": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = cast('foo' as CHAR) where 1 != 1", - "Query": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = cast('foo' as CHAR) where u_tbl3.col3 is null and cast('foo' as CHAR) is not null and not (u_tbl4.col4) <=> (cast('foo' as CHAR)) and (u_tbl4.col4) in ::fkc_vals limit 1 for share", + "Query": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = cast('foo' as CHAR) where u_tbl3.col3 is null and not (u_tbl4.col4) <=> (cast('foo' as CHAR)) and (u_tbl4.col4) in ::fkc_vals limit 1 for share", "Table": "u_tbl3, u_tbl4" }, { @@ -1683,7 +1683,7 @@ "Sharded": false }, "FieldQuery": "select 1 from u_tbl4, u_tbl9 where 1 != 1", - "Query": "select 1 from u_tbl4, u_tbl9 where u_tbl4.col4 = u_tbl9.col9 and (u_tbl4.col4) in ::fkc_vals and (cast('foo' as CHAR) is null or (u_tbl9.col9) not in ((cast('foo' as CHAR)))) limit 1 for share", + "Query": "select 1 from u_tbl4, u_tbl9 where u_tbl4.col4 = u_tbl9.col9 and (u_tbl4.col4) in ::fkc_vals and (u_tbl9.col9) not in ((cast('foo' as CHAR))) limit 1 for share", "Table": "u_tbl4, u_tbl9" }, { diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.json b/go/vt/vtgate/planbuilder/testdata/from_cases.json index 50b56b428ec..2e0fe429c1f 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.json @@ -720,6 +720,117 @@ ] } }, + { + "comment": "Complex query that has hash left join underneath a memory sort and ordered aggregation", + "query": "select 1 from user join user_extra on user.id = user_extra.user_id join music on music.intcol = user_extra.col left join (select user_metadata.col, count(*) as count from user_metadata group by user_metadata.col) um on um.col = user_extra.col where user.id IN (103) group by user_extra.col, music.intcol", + "plan": { + "QueryType": "SELECT", + "Original": "select 1 from user join user_extra on user.id = user_extra.user_id join music on music.intcol = user_extra.col left join (select user_metadata.col, count(*) as count from user_metadata group by user_metadata.col) um on um.col = user_extra.col where user.id IN (103) group by user_extra.col, music.intcol", + "Instructions": { + "OperatorType": "Aggregate", + "Variant": "Ordered", + "Aggregates": "any_value(0) AS 1", + "GroupBy": "1, 4", + "ResultColumns": 1, + "Inputs": [ + { + "OperatorType": "Sort", + "Variant": "Memory", + "OrderBy": "1 ASC, 4 ASC", + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "HashLeftJoin", + "Collation": "binary", + "ComparisonType": "FLOAT64", + "JoinColumnIndexes": "-1,-2,1,-2,-4,-1", + "Predicate": "user_extra.col = um.col", + "TableName": "music_`user`, user_extra_user_metadata", + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,R:0,R:0,L:1", + "JoinVars": { + "music_intcol": 1 + }, + "TableName": "music_`user`, user_extra", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1, music.intcol from music where 1 != 1 group by music.intcol", + "Query": "select 1, music.intcol from music group by music.intcol", + "Table": "music" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select user_extra.col, user_extra.col from `user`, user_extra where 1 != 1 group by user_extra.col", + "Query": "select user_extra.col, user_extra.col from `user`, user_extra where `user`.id in (103) and user_extra.col = :music_intcol /* INT16 */ and `user`.id = user_extra.user_id group by user_extra.col", + "Table": "`user`, user_extra", + "Values": [ + "103" + ], + "Vindex": "user_index" + } + ] + }, + { + "OperatorType": "Aggregate", + "Variant": "Ordered", + "GroupBy": "(0|1)", + "Inputs": [ + { + "OperatorType": "SimpleProjection", + "Columns": "0,2", + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Ordered", + "Aggregates": "sum_count_star(1) AS count", + "GroupBy": "(0|2)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select user_metadata.col, count(*) as `count`, weight_string(user_metadata.col) from user_metadata where 1 != 1 group by user_metadata.col, weight_string(user_metadata.col)", + "OrderBy": "(0|2) ASC", + "Query": "select user_metadata.col, count(*) as `count`, weight_string(user_metadata.col) from user_metadata group by user_metadata.col, weight_string(user_metadata.col) order by user_metadata.col asc", + "Table": "user_metadata" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "user.music", + "user.user", + "user.user_extra", + "user.user_metadata" + ] + } + }, { "comment": "Straight-join (ignores the straight_join hint)", "query": "select m1.col from unsharded as m1 straight_join unsharded as m2", @@ -784,6 +895,59 @@ ] } }, + { + "comment": "Outer join with join predicates that only depend on the inner side", + "query": "select 1 from user left join user_extra on user.foo = 42 and user.bar = user_extra.bar", + "plan": { + "QueryType": "SELECT", + "Original": "select 1 from user left join user_extra on user.foo = 42 and user.bar = user_extra.bar", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "1 as 1" + ], + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "LeftJoin", + "JoinVars": { + "user_bar": 1, + "user_foo": 0 + }, + "TableName": "`user`_user_extra", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `user`.foo, `user`.bar from `user` where 1 != 1", + "Query": "select `user`.foo, `user`.bar from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from user_extra where 1 != 1", + "Query": "select 1 from user_extra where user_extra.bar = :user_bar and :user_foo = 42", + "Table": "user_extra" + } + ] + } + ] + }, + "TablesUsed": [ + "user.user", + "user.user_extra" + ] + } + }, { "comment": "Parenthesized, single chunk", "query": "select user.col from user join (unsharded as m1 join unsharded as m2)", @@ -4428,20 +4592,21 @@ "Aggregates": "count_star(0) AS count(*)", "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "1", + "OperatorType": "Projection", + "Expressions": [ + "1 as 1" + ], "Inputs": [ { "OperatorType": "Distinct", "Collations": [ - "(0:2)", - "1" + "(0:1)" ], "Inputs": [ { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "R:0,L:1,R:1", + "JoinColumnIndexes": "R:0,R:1", "JoinVars": { "m_id": 0 }, @@ -4454,8 +4619,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select subquery_for_count.`m.id`, 1 from (select m.id as `m.id` from music as m where 1 != 1) as subquery_for_count where 1 != 1", - "Query": "select distinct subquery_for_count.`m.id`, 1 from (select m.id as `m.id` from music as m) as subquery_for_count", + "FieldQuery": "select subquery_for_count.`m.id` from (select m.id as `m.id` from music as m where 1 != 1) as subquery_for_count where 1 != 1", + "Query": "select distinct subquery_for_count.`m.id` from (select m.id as `m.id` from music as m) as subquery_for_count", "Table": "music" }, { @@ -4566,6 +4731,55 @@ ] } }, + { + "comment": "Cross keyspace join", + "query": "select 1 from user join t1 on user.id = t1.id", + "plan": { + "QueryType": "SELECT", + "Original": "select 1 from user join t1 on user.id = t1.id", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0", + "JoinVars": { + "t1_id": 1 + }, + "TableName": "t1_`user`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "zlookup_unique", + "Sharded": true + }, + "FieldQuery": "select 1, t1.id from t1 where 1 != 1", + "Query": "select 1, t1.id from t1", + "Table": "t1" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where `user`.id = :t1_id", + "Table": "`user`", + "Values": [ + ":t1_id" + ], + "Vindex": "user_index" + } + ] + }, + "TablesUsed": [ + "user.user", + "zlookup_unique.t1" + ] + } + }, { "comment": "Select everything from a derived table having a cross-shard join", "query": "select * from (select u.foo * ue.bar from user u join user_extra ue) as dt", diff --git a/go/vt/vtgate/planbuilder/testdata/memory_sort_cases.json b/go/vt/vtgate/planbuilder/testdata/memory_sort_cases.json index f26b160ef69..060f073a366 100644 --- a/go/vt/vtgate/planbuilder/testdata/memory_sort_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/memory_sort_cases.json @@ -14,9 +14,8 @@ { "OperatorType": "Aggregate", "Variant": "Ordered", - "Aggregates": "any_value(1) AS b, sum_count_star(2) AS count(*), any_value(4)", + "Aggregates": "any_value(1|4) AS b, sum_count_star(2) AS count(*)", "GroupBy": "(0|3)", - "ResultColumns": 5, "Inputs": [ { "OperatorType": "Route", @@ -25,9 +24,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*), weight_string(a), weight_string(`user`.b) from `user` where 1 != 1 group by a, weight_string(a)", + "FieldQuery": "select dt.c0 as a, dt.c1 as b, dt.c2 as `count(*)`, dt.c3 as `weight_string(a)`, weight_string(dt.c1) from (select a, b, count(*), weight_string(a) from `user` where 1 != 1 group by a, weight_string(a)) as dt(c0, c1, c2, c3) where 1 != 1", "OrderBy": "(0|3) ASC", - "Query": "select a, b, count(*), weight_string(a), weight_string(`user`.b) from `user` group by a, weight_string(a) order by a asc", + "Query": "select dt.c0 as a, dt.c1 as b, dt.c2 as `count(*)`, dt.c3 as `weight_string(a)`, weight_string(dt.c1) from (select a, b, count(*), weight_string(a) from `user` group by a, weight_string(a) order by a asc) as dt(c0, c1, c2, c3)", "Table": "`user`" } ] @@ -49,13 +48,13 @@ "OperatorType": "Sort", "Variant": "Memory", "OrderBy": "2 ASC", + "ResultColumns": 3, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "any_value(1) AS b, sum_count_star(2) AS k", "GroupBy": "(0|3)", - "ResultColumns": 3, "Inputs": [ { "OperatorType": "Route", @@ -93,9 +92,8 @@ { "OperatorType": "Aggregate", "Variant": "Ordered", - "Aggregates": "any_value(1) AS b, sum_count_star(2) AS k, any_value(4)", + "Aggregates": "any_value(1|4) AS b, sum_count_star(2) AS k", "GroupBy": "(0|3)", - "ResultColumns": 5, "Inputs": [ { "OperatorType": "Route", @@ -104,9 +102,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*) as k, weight_string(a), weight_string(`user`.b) from `user` where 1 != 1 group by a, weight_string(a)", + "FieldQuery": "select dt.c0 as a, dt.c1 as b, dt.c2 as k, dt.c3 as `weight_string(a)`, weight_string(dt.c1) from (select a, b, count(*) as k, weight_string(a) from `user` where 1 != 1 group by a, weight_string(a)) as dt(c0, c1, c2, c3) where 1 != 1", "OrderBy": "(0|3) ASC", - "Query": "select a, b, count(*) as k, weight_string(a), weight_string(`user`.b) from `user` group by a, weight_string(a) order by a asc", + "Query": "select dt.c0 as a, dt.c1 as b, dt.c2 as k, dt.c3 as `weight_string(a)`, weight_string(dt.c1) from (select a, b, count(*) as k, weight_string(a) from `user` group by a, weight_string(a) order by a asc) as dt(c0, c1, c2, c3)", "Table": "`user`" } ] @@ -132,13 +130,13 @@ "OperatorType": "Sort", "Variant": "Memory", "OrderBy": "2 DESC", + "ResultColumns": 3, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "any_value(1) AS b, sum_count_star(2) AS k", "GroupBy": "(0|3)", - "ResultColumns": 3, "Inputs": [ { "OperatorType": "Route", @@ -180,7 +178,6 @@ "Variant": "Ordered", "Aggregates": "any_value(1) AS b, sum_count_star(2) AS k", "GroupBy": "(0|3)", - "ResultColumns": 4, "Inputs": [ { "OperatorType": "Route", @@ -360,9 +357,9 @@ { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "L:0,L:1,R:0,L:2,R:1,L:3", + "JoinColumnIndexes": "L:0,L:1,R:0,L:3,R:1,L:4", "JoinVars": { - "user_id": 4 + "user_id": 2 }, "TableName": "`user`_music", "Inputs": [ @@ -373,8 +370,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select `user`.col1 as a, `user`.col2, weight_string(`user`.col1), weight_string(`user`.col2), `user`.id from `user` where 1 != 1", - "Query": "select `user`.col1 as a, `user`.col2, weight_string(`user`.col1), weight_string(`user`.col2), `user`.id from `user` where `user`.id = 1", + "FieldQuery": "select `user`.col1 as a, `user`.col2, `user`.id, weight_string(`user`.col1), weight_string(`user`.col2) from `user` where 1 != 1", + "Query": "select `user`.col1 as a, `user`.col2, `user`.id, weight_string(`user`.col1), weight_string(`user`.col2) from `user` where `user`.id = 1", "Table": "`user`", "Values": [ "1" diff --git a/go/vt/vtgate/planbuilder/testdata/mirror_cases.json b/go/vt/vtgate/planbuilder/testdata/mirror_cases.json new file mode 100644 index 00000000000..2466b3dca12 --- /dev/null +++ b/go/vt/vtgate/planbuilder/testdata/mirror_cases.json @@ -0,0 +1,397 @@ +[ + { + "comment": "select unsharded, qualified, table mirrored to unsharded table", + "query": "select t1.id from unsharded_src1.t1 where t1.id = 1", + "plan": { + "QueryType": "SELECT", + "Original": "select t1.id from unsharded_src1.t1 where t1.id = 1", + "Instructions": { + "OperatorType": "Mirror", + "Variant": "PercentBased", + "Percent": 1, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src1", + "Sharded": false + }, + "FieldQuery": "select t1.id from t1 where 1 != 1", + "Query": "select t1.id from t1 where t1.id = 1", + "Table": "t1" + }, + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_dst1", + "Sharded": false + }, + "FieldQuery": "select t1.id from t1 where 1 != 1", + "Query": "select t1.id from t1 where t1.id = 1", + "Table": "t1" + } + ] + }, + "TablesUsed": [ + "unsharded_dst1.t1", + "unsharded_src1.t1" + ] + } + }, + { + "comment": "select unsharded, qualified, table mirrored to unsharded table with zero percentage", + "query": "select t3.id from unsharded_src1.t3 where t3.id = 1", + "plan": { + "QueryType": "SELECT", + "Original": "select t3.id from unsharded_src1.t3 where t3.id = 1", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src1", + "Sharded": false + }, + "FieldQuery": "select t3.id from t3 where 1 != 1", + "Query": "select t3.id from t3 where t3.id = 1", + "Table": "t3" + }, + "TablesUsed": [ + "unsharded_src1.t3" + ] + } + }, + { + "comment": "select unsharded, qualified, table mirrored to sharded table", + "query": "select t2.id from unsharded_src1.t2 where t2.id = 1", + "plan": { + "QueryType": "SELECT", + "Original": "select t2.id from unsharded_src1.t2 where t2.id = 1", + "Instructions": { + "OperatorType": "Mirror", + "Variant": "PercentBased", + "Percent": 2, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src1", + "Sharded": false + }, + "FieldQuery": "select t2.id from t2 where 1 != 1", + "Query": "select t2.id from t2 where t2.id = 1", + "Table": "t2" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "sharded_dst1", + "Sharded": true + }, + "FieldQuery": "select t2.id from t1 as t2 where 1 != 1", + "Query": "select t2.id from t1 as t2 where t2.id = 1", + "Table": "t1", + "Values": [ + "1" + ], + "Vindex": "xxhash" + } + ] + }, + "TablesUsed": [ + "sharded_dst1.t1", + "unsharded_src1.t2" + ] + } + }, + { + "comment": "select two unsharded, qualified, tables, one mirrored to unsharded table, other to sharded table", + "query": "select t1.id, t2.id from unsharded_src1.t1, unsharded_src1.t2 where t1.id = t2.id", + "plan": { + "QueryType": "SELECT", + "Original": "select t1.id, t2.id from unsharded_src1.t1, unsharded_src1.t2 where t1.id = t2.id", + "Instructions": { + "OperatorType": "Mirror", + "Variant": "PercentBased", + "Percent": 1, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src1", + "Sharded": false + }, + "FieldQuery": "select t1.id, t2.id from t1, t2 where 1 != 1", + "Query": "select t1.id, t2.id from t1, t2 where t1.id = t2.id", + "Table": "t1, t2" + }, + { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,R:0", + "JoinVars": { + "t1_id1": 0 + }, + "TableName": "t1_t1", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_dst1", + "Sharded": false + }, + "FieldQuery": "select t1.id from t1 where 1 != 1", + "Query": "select t1.id from t1", + "Table": "t1" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "sharded_dst1", + "Sharded": true + }, + "FieldQuery": "select t2.id from t1 as t2 where 1 != 1", + "Query": "select t2.id from t1 as t2 where t2.id = :t1_id1", + "Table": "t1", + "Values": [ + ":t1_id1" + ], + "Vindex": "xxhash" + } + ] + } + ] + }, + "TablesUsed": [ + "sharded_dst1.t1", + "unsharded_dst1.t1", + "unsharded_src1.t1", + "unsharded_src1.t2" + ] + } + }, + { + "comment": "union of selects from unsharded, qualified, tables, one mirrored to unsharded table, other to sharded table", + "query": "select t1.id from unsharded_src1.t1 union select t2.id from unsharded_src1.t2", + "plan": { + "QueryType": "SELECT", + "Original": "select t1.id from unsharded_src1.t1 union select t2.id from unsharded_src1.t2", + "Instructions": { + "OperatorType": "Mirror", + "Variant": "PercentBased", + "Percent": 1, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src1", + "Sharded": false + }, + "FieldQuery": "select t1.id from t1 where 1 != 1 union select t2.id from t2 where 1 != 1", + "Query": "select t1.id from t1 union select t2.id from t2", + "Table": "t1, t2" + }, + { + "OperatorType": "Distinct", + "Collations": [ + "(0:1)" + ], + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_dst1", + "Sharded": false + }, + "FieldQuery": "select dt.c0 as id, weight_string(dt.c0) from (select t1.id from t1 where 1 != 1) as dt(c0) where 1 != 1", + "Query": "select dt.c0 as id, weight_string(dt.c0) from (select distinct t1.id from t1) as dt(c0)", + "Table": "t1" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "sharded_dst1", + "Sharded": true + }, + "FieldQuery": "select dt.c0 as id, weight_string(dt.c0) from (select t2.id from t1 as t2 where 1 != 1) as dt(c0) where 1 != 1", + "Query": "select dt.c0 as id, weight_string(dt.c0) from (select distinct t2.id from t1 as t2) as dt(c0)", + "Table": "t1" + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "sharded_dst1.t1", + "unsharded_dst1.t1", + "unsharded_src1.t1", + "unsharded_src1.t2" + ] + } + }, + { + "comment": "inserts are not mirrored", + "query": "insert into unsharded_src1.t1 (id) values(1)", + "plan": { + "QueryType": "INSERT", + "Original": "insert into unsharded_src1.t1 (id) values(1)", + "Instructions": { + "OperatorType": "Insert", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src1", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "insert into t1(id) values (1)", + "TableName": "t1" + }, + "TablesUsed": [ + "unsharded_src1.t1" + ] + } + }, + { + "comment": "updates are not mirrored", + "query": "update unsharded_src1.t1 set data = 'a' where id = 1", + "plan": { + "QueryType": "UPDATE", + "Original": "update unsharded_src1.t1 set data = 'a' where id = 1", + "Instructions": { + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src1", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update t1 set `data` = 'a' where id = 1", + "Table": "t1" + }, + "TablesUsed": [ + "unsharded_src1.t1" + ] + } + }, + { + "comment": "deletes are not mirrored", + "query": "delete from unsharded_src1.t1 where id = 1", + "plan": { + "QueryType": "DELETE", + "Original": "delete from unsharded_src1.t1 where id = 1", + "Instructions": { + "OperatorType": "Delete", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src1", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "delete from t1 where id = 1", + "Table": "t1" + }, + "TablesUsed": [ + "unsharded_src1.t1" + ] + } + }, + { + "comment": "self-mirror is not allowed", + "query": "select t1.id from unsharded_src2.t1", + "plan": { + "QueryType": "SELECT", + "Original": "select t1.id from unsharded_src2.t1", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src2", + "Sharded": false + }, + "FieldQuery": "select t1.id from t1 where 1 != 1", + "Query": "select t1.id from t1", + "Table": "t1" + }, + "TablesUsed": [ + "unsharded_src2.t1" + ] + } + }, + { + "comment": "chained mirror is not allowed", + "query": "select t2.id from unsharded_src2.t2", + "plan": { + "QueryType": "SELECT", + "Original": "select t2.id from unsharded_src2.t2", + "Instructions": { + "OperatorType": "Mirror", + "Variant": "PercentBased", + "Percent": 4, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src2", + "Sharded": false + }, + "FieldQuery": "select t2.id from t2 where 1 != 1", + "Query": "select t2.id from t2", + "Table": "t2" + }, + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_dst2", + "Sharded": false + }, + "FieldQuery": "select t2.id from t2 where 1 != 1", + "Query": "select t2.id from t2", + "Table": "t2" + } + ] + }, + "TablesUsed": [ + "unsharded_dst2.t2", + "unsharded_src2.t2" + ] + } + }, + { + "comment": "circular mirror is not allowed", + "query": "select t1.id from unsharded_src3.t1", + "plan": { + "QueryType": "SELECT", + "Original": "select t1.id from unsharded_src3.t1", + "Instructions": { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_src3", + "Sharded": false + }, + "FieldQuery": "select t1.id from t1 where 1 != 1", + "Query": "select t1.id from t1", + "Table": "t1" + }, + "TablesUsed": [ + "unsharded_src3.t1" + ] + } + } +] diff --git a/go/vt/vtgate/planbuilder/testdata/onecase.json b/go/vt/vtgate/planbuilder/testdata/onecase.json index da7543f706a..9d653b2f6e9 100644 --- a/go/vt/vtgate/planbuilder/testdata/onecase.json +++ b/go/vt/vtgate/planbuilder/testdata/onecase.json @@ -3,7 +3,6 @@ "comment": "Add your test case here for debugging and run go test -run=One.", "query": "", "plan": { - } } ] \ No newline at end of file diff --git a/go/vt/vtgate/planbuilder/testdata/postprocess_cases.json b/go/vt/vtgate/planbuilder/testdata/postprocess_cases.json index 74e5229016a..36f1472007d 100644 --- a/go/vt/vtgate/planbuilder/testdata/postprocess_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/postprocess_cases.json @@ -1554,7 +1554,7 @@ { "OperatorType": "Aggregate", "Variant": "Scalar", - "Aggregates": "sum_count(0) AS count(id), any_value(1) AS num, any_value(2)", + "Aggregates": "sum_count(0) AS count(id), any_value(1|2) AS num", "Inputs": [ { "OperatorType": "Route", @@ -1618,13 +1618,13 @@ "OperatorType": "Sort", "Variant": "Memory", "OrderBy": "0 ASC", + "ResultColumns": 2, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "sum_count(0) AS count(id)", "GroupBy": "(1|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Route", @@ -1729,7 +1729,7 @@ { "OperatorType": "Aggregate", "Variant": "Ordered", - "Aggregates": "sum_count_star(1) AS count(*), any_value(2) AS c1, any_value(3)", + "Aggregates": "sum_count_star(1) AS count(*), any_value(2|3) AS c1", "GroupBy": "0", "Inputs": [ { @@ -1739,9 +1739,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select col, count(*), c1, weight_string(c1) from `user` where 1 != 1 group by col", + "FieldQuery": "select dt.c0 as col, dt.c1 as `count(*)`, dt.c2 as c1, weight_string(dt.c2) from (select col, count(*), c1 from `user` where 1 != 1 group by col) as dt(c0, c1, c2) where 1 != 1", "OrderBy": "0 ASC", - "Query": "select col, count(*), c1, weight_string(c1) from `user` group by col order by col asc", + "Query": "select dt.c0 as col, dt.c1 as `count(*)`, dt.c2 as c1, weight_string(dt.c2) from (select col, count(*), c1 from `user` group by col order by col asc) as dt(c0, c1, c2)", "Table": "`user`" } ] @@ -2090,7 +2090,6 @@ "Variant": "Ordered", "Aggregates": "min(1|3) AS min(a.id)", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Join", diff --git a/go/vt/vtgate/planbuilder/testdata/reference_cases.json b/go/vt/vtgate/planbuilder/testdata/reference_cases.json index a89fa103923..6aa01355934 100644 --- a/go/vt/vtgate/planbuilder/testdata/reference_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/reference_cases.json @@ -746,5 +746,30 @@ "user.user" ] } + }, + { + "comment": "two sharded and two unsharded reference table join - all should be merged into one route", + "query": "select 1 from user u join user_extra ue on u.id = ue.user_id join main.source_of_ref sr on sr.foo = ue.foo join main.rerouted_ref rr on rr.bar = sr.bar", + "plan": { + "QueryType": "SELECT", + "Original": "select 1 from user u join user_extra ue on u.id = ue.user_id join main.source_of_ref sr on sr.foo = ue.foo join main.rerouted_ref rr on rr.bar = sr.bar", + "Instructions": { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user` as u, user_extra as ue, ref_with_source as sr, ref as rr where 1 != 1", + "Query": "select 1 from `user` as u, user_extra as ue, ref_with_source as sr, ref as rr where rr.bar = sr.bar and u.id = ue.user_id and sr.foo = ue.foo", + "Table": "`user`, ref, ref_with_source, user_extra" + }, + "TablesUsed": [ + "user.ref", + "user.ref_with_source", + "user.user", + "user.user_extra" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index 6dcd95ff09d..ab69df2cc47 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -65,6 +65,35 @@ ] } }, + { + "comment": "join on sharding column with limit - should be a simple scatter query and limit on top with non resolved columns", + "query": "select * from user u join user_metadata um on u.id = um.user_id where foo=41 limit 20", + "plan": { + "QueryType": "SELECT", + "Original": "select * from user u join user_metadata um on u.id = um.user_id where foo=41 limit 20", + "Instructions": { + "OperatorType": "Limit", + "Count": "20", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from `user` as u, user_metadata as um where 1 != 1", + "Query": "select * from `user` as u, user_metadata as um where foo = 41 and u.id = um.user_id limit 20", + "Table": "`user`, user_metadata" + } + ] + }, + "TablesUsed": [ + "user.user", + "user.user_metadata" + ] + } + }, { "comment": "select with timeout directive sets QueryTimeout in the route", "query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from user", @@ -1055,7 +1084,7 @@ "Query": "select * from `user` where id = 0x04", "Table": "`user`", "Values": [ - "'\u0004'" + "_binary'\u0004'" ], "Vindex": "user_index" }, @@ -1836,7 +1865,6 @@ "Variant": "Ordered", "Aggregates": "sum(0) AS avg_col, sum_count(3) AS count(intcol)", "GroupBy": "1 COLLATE latin1_swedish_ci, (2|4) COLLATE ", - "ResultColumns": 4, "Inputs": [ { "OperatorType": "Route", @@ -1875,7 +1903,7 @@ "Sharded": false }, "FieldQuery": "select 42 from dual where 1 != 1", - "Query": "select 42 from dual where false", + "Query": "select 42 from dual where 0", "Table": "dual" }, "TablesUsed": [ @@ -1883,6 +1911,112 @@ ] } }, + { + "comment": "Complex expression in a subquery used in IN clause of an aggregate query", + "query": "select count(*) from user where user.id = 2 or user.id in (select id from unsharded_a where colb = 2)", + "plan": { + "QueryType": "SELECT", + "Original": "select count(*) from user where user.id = 2 or user.id in (select id from unsharded_a where colb = 2)", + "Instructions": { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "sum_count_star(0) AS count(*)", + "Inputs": [ + { + "OperatorType": "UncorrelatedSubquery", + "Variant": "PulloutIn", + "PulloutVars": [ + "__sq_has_values", + "__sq1" + ], + "Inputs": [ + { + "InputName": "SubQuery", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id from unsharded_a where 1 != 1", + "Query": "select id from unsharded_a where colb = 2", + "Table": "unsharded_a" + }, + { + "InputName": "Outer", + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select count(*) from `user` where 1 != 1", + "Query": "select count(*) from `user` where `user`.id = 2 or :__sq_has_values and `user`.id in ::__sq1", + "Table": "`user`" + } + ] + } + ] + }, + "TablesUsed": [ + "main.unsharded_a", + "user.user" + ] + } + }, + { + "comment": "Complex expression in a subquery used in NOT IN clause of an aggregate query", + "query": "select count(*) from user where user.id = 2 or user.id not in (select id from unsharded_a where colb = 2)", + "plan": { + "QueryType": "SELECT", + "Original": "select count(*) from user where user.id = 2 or user.id not in (select id from unsharded_a where colb = 2)", + "Instructions": { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "sum_count_star(0) AS count(*)", + "Inputs": [ + { + "OperatorType": "UncorrelatedSubquery", + "Variant": "PulloutNotIn", + "PulloutVars": [ + "__sq_has_values", + "__sq1" + ], + "Inputs": [ + { + "InputName": "SubQuery", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select id from unsharded_a where 1 != 1", + "Query": "select id from unsharded_a where colb = 2", + "Table": "unsharded_a" + }, + { + "InputName": "Outer", + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select count(*) from `user` where 1 != 1", + "Query": "select count(*) from `user` where `user`.id = 2 or (not :__sq_has_values or `user`.id not in ::__sq1)", + "Table": "`user`" + } + ] + } + ] + }, + "TablesUsed": [ + "main.unsharded_a", + "user.user" + ] + } + }, { "comment": "testing SingleRow Projection with arithmetics", "query": "select 42+2", @@ -3498,8 +3632,8 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select a -> '$[4]', a ->> '$[3]' from `user` where 1 != 1", - "Query": "select a -> '$[4]', a ->> '$[3]' from `user`", + "FieldQuery": "select json_extract(a, '$[4]'), json_unquote(json_extract(a, '$[3]')) from `user` where 1 != 1", + "Query": "select json_extract(a, '$[4]'), json_unquote(json_extract(a, '$[3]')) from `user`", "Table": "`user`" }, "TablesUsed": [ @@ -4224,7 +4358,6 @@ "Variant": "Ordered", "Aggregates": "any_value(0) AS id", "GroupBy": "(1|2)", - "ResultColumns": 1, "Inputs": [ { "OperatorType": "Route", @@ -4390,7 +4523,6 @@ "OperatorType": "Aggregate", "Variant": "Scalar", "Aggregates": "max(0|1) AS max(music.id)", - "ResultColumns": 1, "Inputs": [ { "OperatorType": "Route", @@ -4927,7 +5059,6 @@ "Variant": "Ordered", "Aggregates": "sum_count_star(1) AS b", "GroupBy": "(2|3), (0|4)", - "ResultColumns": 3, "Inputs": [ { "OperatorType": "Route", diff --git a/go/vt/vtgate/planbuilder/testdata/show_cases.json b/go/vt/vtgate/planbuilder/testdata/show_cases.json index 45ad277677c..00bd37fe8f2 100644 --- a/go/vt/vtgate/planbuilder/testdata/show_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/show_cases.json @@ -838,5 +838,40 @@ "Filter": " like 'x'" } } + }, + { + "comment": "show transaction status plan", + "query": "show transaction status for 'ks:-80:v24s7843sf78934l3'", + "plan": { + "QueryType": "SHOW", + "Original": "show transaction status for 'ks:-80:v24s7843sf78934l3'", + "Instructions": { + "OperatorType": "TransactionStatus", + "TransactionID": "ks:-80:v24s7843sf78934l3" + } + } + }, + { + "comment": "show unresolved transactions for default keyspace", + "query": "show unresolved transactions", + "plan": { + "QueryType": "SHOW", + "Original": "show unresolved transactions", + "Instructions": { + "OperatorType": "TransactionStatus" + } + } + }, + { + "comment": "show unresolved transactions for explicitly provided keyspace", + "query": "show unresolved transactions for ks", + "plan": { + "QueryType": "SHOW", + "Original": "show unresolved transactions for ks", + "Instructions": { + "OperatorType": "TransactionStatus", + "Keyspace": "ks" + } + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json index 442f4d6b8b6..6b3f84d01d6 100644 --- a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json @@ -25,7 +25,6 @@ "Variant": "Ordered", "Aggregates": "sum(2) AS sum_qty, sum(3) AS sum_base_price, sum(4) AS sum_disc_price, sum(5) AS sum_charge, sum(6) AS avg_qty, sum(7) AS avg_price, sum(8) AS avg_disc, sum_count_star(9) AS count_order, sum_count(10) AS count(l_quantity), sum_count(11) AS count(l_extendedprice), sum_count(12) AS count(l_discount)", "GroupBy": "(0|13), (1|14)", - "ResultColumns": 13, "Inputs": [ { "OperatorType": "Route", @@ -74,7 +73,6 @@ "Variant": "Ordered", "Aggregates": "sum(1) AS revenue", "GroupBy": "(0|4), (2|5), (3|6)", - "ResultColumns": 6, "Inputs": [ { "OperatorType": "Projection", @@ -279,13 +277,13 @@ "OperatorType": "Sort", "Variant": "Memory", "OrderBy": "1 DESC COLLATE utf8mb4_0900_ai_ci", + "ResultColumns": 2, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "sum(1) AS revenue", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Projection", @@ -802,7 +800,6 @@ "Variant": "Ordered", "Aggregates": "sum(1) AS sum(case when nation = 'BRAZIL' then volume else 0 end), sum(2) AS sum(volume)", "GroupBy": "(0|3)", - "ResultColumns": 3, "Inputs": [ { "OperatorType": "Projection", @@ -832,7 +829,6 @@ "Variant": "Ordered", "Aggregates": "sum(0) AS sum(case when nation = 'BRAZIL' then volume else 0 end), sum(1) AS sum(volume)", "GroupBy": "(2|3)", - "ResultColumns": 3, "Inputs": [ { "OperatorType": "Join", @@ -1112,12 +1108,11 @@ "Variant": "Ordered", "Aggregates": "sum(0) AS sum_profit", "GroupBy": "(1|3), (2|4)", - "ResultColumns": 4, "Inputs": [ { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "R:0,L:0,L:4,L:6,L:7", + "JoinColumnIndexes": "R:0,L:0,L:4,L:6,L:8", "JoinVars": { "l_discount": 2, "l_extendedprice": 1, @@ -1130,7 +1125,7 @@ { "OperatorType": "Sort", "Variant": "Memory", - "OrderBy": "(0|6) ASC, (4|7) ASC", + "OrderBy": "(0|6) ASC, (4|8) ASC", "Inputs": [ { "OperatorType": "Join", @@ -1349,13 +1344,13 @@ "OperatorType": "Sort", "Variant": "Memory", "OrderBy": "2 DESC COLLATE utf8mb4_0900_ai_ci", + "ResultColumns": 8, "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", "Aggregates": "sum(2) AS revenue", "GroupBy": "(0|8), (1|9), (3|10), (6|11), (4|12), (5|13), (7|14)", - "ResultColumns": 8, "Inputs": [ { "OperatorType": "Projection", @@ -1660,6 +1655,7 @@ "InputName": "Outer", "OperatorType": "Filter", "Predicate": "sum(ps_supplycost * ps_availqty) > :__sq1", + "ResultColumns": 2, "Inputs": [ { "OperatorType": "Sort", @@ -1671,7 +1667,6 @@ "Variant": "Ordered", "Aggregates": "sum(1) AS value", "GroupBy": "(0|2)", - "ResultColumns": 2, "Inputs": [ { "OperatorType": "Projection", @@ -1892,23 +1887,24 @@ "GroupBy": "0", "Inputs": [ { - "OperatorType": "SimpleProjection", - "Columns": "1,3", + "OperatorType": "Projection", + "Expressions": [ + ":1 as c_count", + "1 as 1" + ], "Inputs": [ { "OperatorType": "Aggregate", "Variant": "Ordered", - "Aggregates": "sum_count(1) AS count(o_orderkey), any_value(3)", + "Aggregates": "sum_count(1) AS count(o_orderkey)", "GroupBy": "(0|2)", - "ResultColumns": 4, "Inputs": [ { "OperatorType": "Projection", "Expressions": [ ":2 as c_custkey", "count(*) * count(o_orderkey) as count(o_orderkey)", - ":3 as weight_string(c_custkey)", - ":4 as 1" + ":3 as weight_string(c_custkey)" ], "Inputs": [ { @@ -1919,7 +1915,7 @@ { "OperatorType": "Join", "Variant": "LeftJoin", - "JoinColumnIndexes": "R:0,L:0,L:1,L:2,L:3", + "JoinColumnIndexes": "R:0,L:0,L:1,L:2", "JoinVars": { "c_custkey": 1 }, @@ -1932,9 +1928,9 @@ "Name": "main", "Sharded": true }, - "FieldQuery": "select count(*), c_custkey, weight_string(c_custkey), 1 from customer where 1 != 1 group by c_custkey, weight_string(c_custkey)", + "FieldQuery": "select count(*), c_custkey, weight_string(c_custkey) from customer where 1 != 1 group by c_custkey, weight_string(c_custkey)", "OrderBy": "(1|2) ASC", - "Query": "select count(*), c_custkey, weight_string(c_custkey), 1 from customer group by c_custkey, weight_string(c_custkey) order by c_custkey asc", + "Query": "select count(*), c_custkey, weight_string(c_custkey) from customer group by c_custkey, weight_string(c_custkey) order by c_custkey asc", "Table": "customer" }, { @@ -1986,41 +1982,51 @@ "Aggregates": "any_value(0), sum(1) AS sum(case when p_type like 'PROMO%' then l_extendedprice * (1 - l_discount) else 0 end), sum(2) AS sum(l_extendedprice * (1 - l_discount))", "Inputs": [ { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "L:0,R:0,L:3", - "JoinVars": { - "l_discount": 2, - "l_extendedprice": 1, - "l_partkey": 4 - }, - "TableName": "lineitem_part", + "OperatorType": "Projection", + "Expressions": [ + "100.00 as 100.00", + ":0 as case when p_type like 'PROMO%' then l_extendedprice * (1 - l_discount) else 0 end", + ":1 as l_extendedprice * (1 - l_discount)" + ], "Inputs": [ { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "main", - "Sharded": true - }, - "FieldQuery": "select 100.00, l_extendedprice, l_discount, l_extendedprice * (1 - l_discount), l_partkey from lineitem where 1 != 1", - "Query": "select 100.00, l_extendedprice, l_discount, l_extendedprice * (1 - l_discount), l_partkey from lineitem where l_shipdate >= date('1995-09-01') and l_shipdate < date('1995-09-01') + interval '1' month", - "Table": "lineitem" - }, - { - "OperatorType": "Route", - "Variant": "EqualUnique", - "Keyspace": { - "Name": "main", - "Sharded": true + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "R:0,L:2", + "JoinVars": { + "l_discount": 1, + "l_extendedprice": 0, + "l_partkey": 3 }, - "FieldQuery": "select case when p_type like 'PROMO%' then :l_extendedprice * (1 - :l_discount) else 0 end from part where 1 != 1", - "Query": "select case when p_type like 'PROMO%' then :l_extendedprice * (1 - :l_discount) else 0 end from part where p_partkey = :l_partkey", - "Table": "part", - "Values": [ - ":l_partkey" - ], - "Vindex": "hash" + "TableName": "lineitem_part", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "main", + "Sharded": true + }, + "FieldQuery": "select l_extendedprice, l_discount, l_extendedprice * (1 - l_discount), l_partkey from lineitem where 1 != 1", + "Query": "select l_extendedprice, l_discount, l_extendedprice * (1 - l_discount), l_partkey from lineitem where l_shipdate >= date('1995-09-01') and l_shipdate < date('1995-09-01') + interval '1' month", + "Table": "lineitem" + }, + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "main", + "Sharded": true + }, + "FieldQuery": "select case when p_type like 'PROMO%' then :l_extendedprice * (1 - :l_discount) else 0 end from part where 1 != 1", + "Query": "select case when p_type like 'PROMO%' then :l_extendedprice * (1 - :l_discount) else 0 end from part where p_partkey = :l_partkey", + "Table": "part", + "Values": [ + ":l_partkey" + ], + "Vindex": "hash" + } + ] } ] } @@ -2052,7 +2058,6 @@ "OperatorType": "Aggregate", "Variant": "Scalar", "Aggregates": "max(0|1) AS max(total_revenue)", - "ResultColumns": 1, "Inputs": [ { "OperatorType": "Route", @@ -2106,7 +2111,6 @@ "Variant": "Ordered", "Aggregates": "count_distinct(3|7) AS supplier_cnt", "GroupBy": "(0|4), (1|5), (2|6)", - "ResultColumns": 7, "Inputs": [ { "OperatorType": "Sort", @@ -2116,9 +2120,9 @@ { "OperatorType": "Join", "Variant": "Join", - "JoinColumnIndexes": "R:0,R:1,R:2,L:0,R:3,R:4,R:5,L:1", + "JoinColumnIndexes": "R:0,R:1,R:2,L:0,R:3,R:4,R:5,L:2", "JoinVars": { - "ps_partkey": 2, + "ps_partkey": 1, "ps_suppkey": 0 }, "TableName": "partsupp_part", @@ -2151,8 +2155,8 @@ "Name": "main", "Sharded": true }, - "FieldQuery": "select ps_suppkey, weight_string(ps_suppkey), ps_partkey from partsupp where 1 != 1", - "Query": "select ps_suppkey, weight_string(ps_suppkey), ps_partkey from partsupp where not :__sq_has_values or ps_suppkey not in ::__sq1", + "FieldQuery": "select ps_suppkey, ps_partkey, weight_string(ps_suppkey) from partsupp where 1 != 1", + "Query": "select ps_suppkey, ps_partkey, weight_string(ps_suppkey) from partsupp where not :__sq_has_values or ps_suppkey not in ::__sq1", "Table": "partsupp" } ] @@ -2444,7 +2448,6 @@ "Variant": "Ordered", "Aggregates": "sum_count_star(1) AS numwait", "GroupBy": "(0|2)", - "ResultColumns": 3, "Inputs": [ { "OperatorType": "Projection", diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index e1618d91efb..9241cec595c 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -294,6 +294,11 @@ "query": "select 1 from music union (select id from user union all select name from unsharded)", "plan": "VT12001: unsupported: nesting of UNIONs on the right-hand side" }, + { + "comment": "Cross keyspace query with subquery", + "query": "select 1 from user where id = (select id from t1 where user.foo = t1.bar)", + "plan": "VT12001: unsupported: correlated subquery is only supported for EXISTS" + }, { "comment": "multi-shard union", "query": "select 1 from music union (select id from user union select name from unsharded)", @@ -324,11 +329,6 @@ "query": "with user as (select aa from user where user.id=1) select ref.col from ref join user", "plan": "VT12001: unsupported: do not support CTE that use the CTE alias inside the CTE query" }, - { - "comment": "Recursive WITH", - "query": "WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5) SELECT * FROM cte", - "plan": "VT12001: unsupported: recursive common table expression" - }, { "comment": "Alias cannot clash with base tables", "query": "WITH user AS (SELECT col FROM user) SELECT * FROM user", diff --git a/go/vt/vtgate/planbuilder/testdata/vexplain_cases.json b/go/vt/vtgate/planbuilder/testdata/vexplain_cases.json index 630e59f3526..cafdc2851af 100644 --- a/go/vt/vtgate/planbuilder/testdata/vexplain_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/vexplain_cases.json @@ -69,5 +69,20 @@ "user.user" ] } + }, + { + "comment": "vexplain keys", + "query": "vexplain keys select * from user", + "plan": { + "QueryType": "EXPLAIN", + "Original": "vexplain keys select * from user", + "Instructions": { + "OperatorType": "Rows", + "Fields": { + "ColumnUsage": "VARCHAR" + }, + "RowCount": 1 + } + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/vschemas/mirror_schema.json b/go/vt/vtgate/planbuilder/testdata/vschemas/mirror_schema.json new file mode 100644 index 00000000000..4feaa09c126 --- /dev/null +++ b/go/vt/vtgate/planbuilder/testdata/vschemas/mirror_schema.json @@ -0,0 +1,103 @@ +{ + "mirror_rules": { + "rules": [ + { + "from_table": "unsharded_src1.t1", + "to_table": "unsharded_dst1.t1", + "percent": 1 + }, + { + "from_table": "unsharded_src1.t2", + "to_table": "sharded_dst1.t1", + "percent": 2 + }, + { + "from_table": "unsharded_src2.t1", + "to_table": "unsharded_src2.t1", + "percent": 3 + }, + { + "from_table": "unsharded_src2.t2", + "to_table": "unsharded_dst2.t2", + "percent": 4 + }, + { + "from_table": "unsharded_dst2.t2", + "to_table": "unsharded_dst3.t2", + "percent": 5 + }, + { + "from_table": "unsharded_src3.t1", + "to_table": "unsharded_dst4.t1", + "percent": 6 + }, + { + "from_table": "unsharded_dst4.t2", + "to_table": "unsharded_src3.t2", + "percent": 7 + }, + { + "from_table": "sharded_src1.t1", + "to_table": "sharded_dst1.t1", + "percent": 8 + }, + { + "from_table": "unsharded_src1.t3", + "to_table": "unsharded_dst1.t2", + "percent": 0 + } + ] + }, + "keyspaces": { + "main": { + "sharded": false, + "tables": {} + }, + "unsharded_src1": { + "sharded": false, + "tables": {} + }, + "unsharded_src2": { + "sharded": false, + "tables": {} + }, + "unsharded_src3": { + "sharded": false, + "tables": {} + }, + "unsharded_dst1": { + "sharded": false, + "tables": {} + }, + "unsharded_dst2": { + "sharded": false, + "tables": {} + }, + "unsharded_dst3": { + "sharded": false, + "tables": {} + }, + "unsharded_dst4": { + "sharded": false, + "tables": {} + }, + "sharded_dst1": { + "sharded": true, + "vindexes": { + "xxhash": { + "type": "xxhash" + } + }, + "tables": { + "t1": { + "columnVindexes": [ + { + "column": "id", + "name": "xxhash" + } + ] + } + } + } + } +} diff --git a/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json b/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json index a8fe91e5d49..4fe275f2398 100644 --- a/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json +++ b/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json @@ -282,6 +282,12 @@ "column": "id", "name": "music_user_map" } + ], + "columns": [ + { + "name": "intcol", + "type": "INT16" + } ] }, "authoritative": { diff --git a/go/vt/vtgate/planbuilder/vexplain.go b/go/vt/vtgate/planbuilder/vexplain.go index 21a35f02967..f66af7bfc33 100644 --- a/go/vt/vtgate/planbuilder/vexplain.go +++ b/go/vt/vtgate/planbuilder/vexplain.go @@ -32,12 +32,22 @@ import ( "vitess.io/vitess/go/vt/vtgate/vindexes" ) -func buildVExplainPlan(ctx context.Context, vexplainStmt *sqlparser.VExplainStmt, reservedVars *sqlparser.ReservedVars, vschema plancontext.VSchema, enableOnlineDDL, enableDirectDDL bool) (*planResult, error) { +func buildVExplainPlan( + ctx context.Context, + vexplainStmt *sqlparser.VExplainStmt, + reservedVars *sqlparser.ReservedVars, + vschema plancontext.VSchema, + enableOnlineDDL, enableDirectDDL bool, +) (*planResult, error) { switch vexplainStmt.Type { case sqlparser.QueriesVExplainType, sqlparser.AllVExplainType: return buildVExplainLoggingPlan(ctx, vexplainStmt, reservedVars, vschema, enableOnlineDDL, enableDirectDDL) case sqlparser.PlanVExplainType: return buildVExplainVtgatePlan(ctx, vexplainStmt.Statement, reservedVars, vschema, enableOnlineDDL, enableDirectDDL) + case sqlparser.TraceVExplainType: + return buildVExplainTracePlan(ctx, vexplainStmt.Statement, reservedVars, vschema, enableOnlineDDL, enableDirectDDL) + case sqlparser.KeysVExplainType: + return buildVExplainKeysPlan(vexplainStmt.Statement, vschema) } return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "[BUG] unexpected vtexplain type: %s", vexplainStmt.Type.ToString()) } @@ -87,22 +97,33 @@ func buildVExplainVtgatePlan(ctx context.Context, explainStatement sqlparser.Sta if err != nil { return nil, err } - description := engine.PrimitiveToPlanDescription(innerInstruction.primitive) - output, err := json.MarshalIndent(description, "", "\t") + + return getJsonResultPlan( + engine.PrimitiveToPlanDescription(innerInstruction.primitive, nil), + "JSON", + ) +} + +// getJsonResultPlan marshals the given struct into a JSON string and returns it as a planResult. +func getJsonResultPlan(v any, colName string) (*planResult, error) { + output, err := json.MarshalIndent(v, "", "\t") if err != nil { return nil, err } - fields := []*querypb.Field{ - {Name: "JSON", Type: querypb.Type_VARCHAR}, - } - rows := []sqltypes.Row{ - { - sqltypes.NewVarChar(string(output)), - }, - } + fields := []*querypb.Field{{Name: colName, Type: querypb.Type_VARCHAR}} + rows := []sqltypes.Row{{sqltypes.NewVarChar(string(output))}} return newPlanResult(engine.NewRowsPrimitive(rows, fields)), nil } +func buildVExplainKeysPlan(statement sqlparser.Statement, vschema plancontext.VSchema) (*planResult, error) { + ctx, err := plancontext.CreatePlanningContext(statement, sqlparser.NewReservedVars("", sqlparser.BindVars{}), vschema, querypb.ExecuteOptions_Gen4) + if err != nil { + return nil, err + } + result := operators.GetVExplainKeys(ctx, statement) + return getJsonResultPlan(result, "ColumnUsage") +} + func buildVExplainLoggingPlan(ctx context.Context, explain *sqlparser.VExplainStmt, reservedVars *sqlparser.ReservedVars, vschema plancontext.VSchema, enableOnlineDDL, enableDirectDDL bool) (*planResult, error) { input, err := createInstructionFor(ctx, sqlparser.String(explain.Statement), explain.Statement, reservedVars, vschema, enableOnlineDDL, enableDirectDDL) if err != nil { @@ -166,3 +187,17 @@ func explainPlan(explain *sqlparser.ExplainStmt, reservedVars *sqlparser.Reserve SingleShardOnly: true, }, tables...), nil } + +func buildVExplainTracePlan(ctx context.Context, explainStatement sqlparser.Statement, reservedVars *sqlparser.ReservedVars, vschema plancontext.VSchema, enableOnlineDDL, enableDirectDDL bool) (*planResult, error) { + innerInstruction, err := createInstructionFor(ctx, sqlparser.String(explainStatement), explainStatement, reservedVars, vschema, enableOnlineDDL, enableDirectDDL) + if err != nil { + return nil, err + } + + // We'll set the trace engine as the root primitive + innerInstruction.primitive = &engine.VExplain{ + Input: innerInstruction.primitive, + Type: sqlparser.TraceVExplainType, + } + return innerInstruction, nil +} diff --git a/go/vt/vtgate/plugin_mysql_server.go b/go/vt/vtgate/plugin_mysql_server.go index 4004ae24566..dec7794c9bd 100644 --- a/go/vt/vtgate/plugin_mysql_server.go +++ b/go/vt/vtgate/plugin_mysql_server.go @@ -399,7 +399,7 @@ func (vh *vtgateHandler) KillConnection(ctx context.Context, connectionID uint32 c, exists := vh.connections[connectionID] if !exists { - return sqlerror.NewSQLError(sqlerror.ERNoSuchThread, sqlerror.SSUnknownSQLState, "Unknown thread id: %d", connectionID) + return sqlerror.NewSQLErrorf(sqlerror.ERNoSuchThread, sqlerror.SSUnknownSQLState, "Unknown thread id: %d", connectionID) } // First, we mark the connection for close, so that even when the context is cancelled, while returning the response back to client, @@ -417,7 +417,7 @@ func (vh *vtgateHandler) KillQuery(connectionID uint32) error { defer vh.mu.Unlock() c, exists := vh.connections[connectionID] if !exists { - return sqlerror.NewSQLError(sqlerror.ERNoSuchThread, sqlerror.SSUnknownSQLState, "Unknown thread id: %d", connectionID) + return sqlerror.NewSQLErrorf(sqlerror.ERNoSuchThread, sqlerror.SSUnknownSQLState, "Unknown thread id: %d", connectionID) } c.CancelCtx() return nil diff --git a/go/vt/vtgate/production.go b/go/vt/vtgate/production.go new file mode 100644 index 00000000000..d3b0ff4fe7e --- /dev/null +++ b/go/vt/vtgate/production.go @@ -0,0 +1,38 @@ +//go:build !debug2PC + +/* +Copyright 2024 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 vtgate + +import ( + "context" + + querypb "vitess.io/vitess/go/vt/proto/query" +) + +// This file defines debug constants that are always false. +// This file is used for building production code. +// We use go build directives to include a file that defines the constant to true +// when certain tags are provided while building binaries. +// This allows to have debugging code written in normal code flow without affecting +// production performance. + +const DebugTwoPc = false + +func checkTestFailure(_ context.Context, _ string, _ *querypb.Target) error { + return nil +} diff --git a/go/vt/vtgate/safe_session.go b/go/vt/vtgate/safe_session.go index 45fff46f629..1d57c63ef35 100644 --- a/go/vt/vtgate/safe_session.go +++ b/go/vt/vtgate/safe_session.go @@ -23,6 +23,8 @@ import ( "sync" "time" + "vitess.io/vitess/go/sqltypes" + "google.golang.org/protobuf/proto" "vitess.io/vitess/go/mysql/datetime" @@ -563,13 +565,21 @@ func (session *SafeSession) HasSystemVariables() (found bool) { func (session *SafeSession) TimeZone() *time.Location { session.mu.Lock() - tz, ok := session.SystemVariables["time_zone"] + zoneSQL, ok := session.SystemVariables["time_zone"] session.mu.Unlock() if !ok { return nil } + + tz, err := sqltypes.DecodeStringSQL(zoneSQL) + if err != nil { + return nil + } + loc, _ := datetime.ParseTimeZone(tz) + // it's safe to ignore the error - if we get an error, loc will be nil, + // and this is exactly the behaviour we want anyway return loc } diff --git a/go/vt/vtgate/safe_session_test.go b/go/vt/vtgate/safe_session_test.go index 21bb2d6697a..ce681fe7fd3 100644 --- a/go/vt/vtgate/safe_session_test.go +++ b/go/vt/vtgate/safe_session_test.go @@ -73,11 +73,11 @@ func TestTimeZone(t *testing.T) { want string }{ { - tz: "Europe/Amsterdam", + tz: "'Europe/Amsterdam'", want: "Europe/Amsterdam", }, { - tz: "+02:00", + tz: "'+02:00'", want: "UTC+02:00", }, { diff --git a/go/vt/vtgate/sandbox_test.go b/go/vt/vtgate/sandbox_test.go index 70b96a63126..fa5ffbbffd8 100644 --- a/go/vt/vtgate/sandbox_test.go +++ b/go/vt/vtgate/sandbox_test.go @@ -48,6 +48,7 @@ const ( func init() { ksToSandbox = make(map[string]*sandbox) + sandboxMirrorRules = `{"rules":[]}` createSandbox(KsTestSharded) createSandbox(KsTestUnsharded) createSandbox(KsTestBadVSchema) @@ -57,6 +58,7 @@ func init() { var sandboxMu sync.Mutex var ksToSandbox map[string]*sandbox +var sandboxMirrorRules string func createSandbox(keyspace string) *sandbox { sandboxMu.Lock() @@ -86,9 +88,20 @@ func getSandboxSrvVSchema() *vschemapb.SrvVSchema { } result.Keyspaces[keyspace] = &vs } + var mrs vschemapb.MirrorRules + if err := json2.Unmarshal([]byte(sandboxMirrorRules), &mrs); err != nil { + panic(err) + } + result.MirrorRules = &mrs return result } +func setSandboxMirrorRules(mirrorRules string) { + sandboxMu.Lock() + defer sandboxMu.Unlock() + sandboxMirrorRules = mirrorRules +} + type sandbox struct { // Use sandmu to access the variables below sandmu sync.Mutex diff --git a/go/vt/vtgate/scatter_conn.go b/go/vt/vtgate/scatter_conn.go index 8b571f7b67d..f7db598127e 100644 --- a/go/vt/vtgate/scatter_conn.go +++ b/go/vt/vtgate/scatter_conn.go @@ -72,6 +72,15 @@ type shardActionFunc func(rs *srvtopo.ResolvedShard, i int) error // the results and errors for the caller. type shardActionTransactionFunc func(rs *srvtopo.ResolvedShard, i int, shardActionInfo *shardActionInfo) (*shardActionInfo, error) +type ( + resultsObserver interface { + observe(*sqltypes.Result) + } + nullResultsObserver struct{} +) + +func (nullResultsObserver) observe(*sqltypes.Result) {} + // NewScatterConn creates a new ScatterConn. func NewScatterConn(statsName string, txConn *TxConn, gw *TabletGateway) *ScatterConn { // this only works with TabletGateway @@ -146,6 +155,7 @@ func (stc *ScatterConn) ExecuteMultiShard( session *SafeSession, autocommit bool, ignoreMaxMemoryRows bool, + resultsObserver resultsObserver, ) (qr *sqltypes.Result, errs []error) { if len(rss) != len(queries) { @@ -260,6 +270,10 @@ func (stc *ScatterConn) ExecuteMultiShard( mu.Lock() defer mu.Unlock() + if innerqr != nil { + resultsObserver.observe(innerqr) + } + // Don't append more rows if row count is exceeded. if ignoreMaxMemoryRows || len(qr.Rows) <= maxMemoryRows { qr.AppendResult(innerqr) @@ -354,11 +368,18 @@ func (stc *ScatterConn) StreamExecuteMulti( session *SafeSession, autocommit bool, callback func(reply *sqltypes.Result) error, + resultsObserver resultsObserver, ) []error { if session.InLockSession() && session.TriggerLockHeartBeat() { go stc.runLockQuery(ctx, session) } + observedCallback := func(reply *sqltypes.Result) error { + if reply != nil { + resultsObserver.observe(reply) + } + return callback(reply) + } allErrors := stc.multiGoTransaction( ctx, "StreamExecute", @@ -407,20 +428,20 @@ func (stc *ScatterConn) StreamExecuteMulti( switch info.actionNeeded { case nothing: - err = qs.StreamExecute(ctx, rs.Target, query, bindVars[i], transactionID, reservedID, opts, callback) + err = qs.StreamExecute(ctx, rs.Target, query, bindVars[i], transactionID, reservedID, opts, observedCallback) if err != nil { retryRequest(func() { // we seem to have lost our connection. it was a reserved connection, let's try to recreate it info.actionNeeded = reserve var state queryservice.ReservedState - state, err = qs.ReserveStreamExecute(ctx, rs.Target, session.SetPreQueries(), query, bindVars[i], 0 /*transactionId*/, opts, callback) + state, err = qs.ReserveStreamExecute(ctx, rs.Target, session.SetPreQueries(), query, bindVars[i], 0 /*transactionId*/, opts, observedCallback) reservedID = state.ReservedID alias = state.TabletAlias }) } case begin: var state queryservice.TransactionState - state, err = qs.BeginStreamExecute(ctx, rs.Target, session.SavePoints(), query, bindVars[i], reservedID, opts, callback) + state, err = qs.BeginStreamExecute(ctx, rs.Target, session.SavePoints(), query, bindVars[i], reservedID, opts, observedCallback) transactionID = state.TransactionID alias = state.TabletAlias if err != nil { @@ -428,7 +449,7 @@ func (stc *ScatterConn) StreamExecuteMulti( // we seem to have lost our connection. it was a reserved connection, let's try to recreate it info.actionNeeded = reserveBegin var state queryservice.ReservedTransactionState - state, err = qs.ReserveBeginStreamExecute(ctx, rs.Target, session.SetPreQueries(), session.SavePoints(), query, bindVars[i], opts, callback) + state, err = qs.ReserveBeginStreamExecute(ctx, rs.Target, session.SetPreQueries(), session.SavePoints(), query, bindVars[i], opts, observedCallback) transactionID = state.TransactionID reservedID = state.ReservedID alias = state.TabletAlias @@ -436,12 +457,12 @@ func (stc *ScatterConn) StreamExecuteMulti( } case reserve: var state queryservice.ReservedState - state, err = qs.ReserveStreamExecute(ctx, rs.Target, session.SetPreQueries(), query, bindVars[i], transactionID, opts, callback) + state, err = qs.ReserveStreamExecute(ctx, rs.Target, session.SetPreQueries(), query, bindVars[i], transactionID, opts, observedCallback) reservedID = state.ReservedID alias = state.TabletAlias case reserveBegin: var state queryservice.ReservedTransactionState - state, err = qs.ReserveBeginStreamExecute(ctx, rs.Target, session.SetPreQueries(), session.SavePoints(), query, bindVars[i], opts, callback) + state, err = qs.ReserveBeginStreamExecute(ctx, rs.Target, session.SetPreQueries(), session.SavePoints(), query, bindVars[i], opts, observedCallback) transactionID = state.TransactionID reservedID = state.ReservedID alias = state.TabletAlias diff --git a/go/vt/vtgate/scatter_conn_test.go b/go/vt/vtgate/scatter_conn_test.go index 0e863805d9c..c5d4f350433 100644 --- a/go/vt/vtgate/scatter_conn_test.go +++ b/go/vt/vtgate/scatter_conn_test.go @@ -100,7 +100,7 @@ func TestExecuteFailOnAutocommit(t *testing.T) { }, Autocommit: false, } - _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, NewSafeSession(session), true /*autocommit*/, false) + _, errs := sc.ExecuteMultiShard(ctx, nil, rss, queries, NewSafeSession(session), true /*autocommit*/, false, nullResultsObserver{}) err := vterrors.Aggregate(errs) require.Error(t, err) require.Contains(t, err.Error(), "in autocommit mode, transactionID should be zero but was: 123") @@ -183,7 +183,7 @@ func TestExecutePanic(t *testing.T) { require.Contains(t, logMessage, "(*ScatterConn).multiGoTransaction") }() - _, _ = sc.ExecuteMultiShard(ctx, nil, rss, queries, NewSafeSession(session), true /*autocommit*/, false) + _, _ = sc.ExecuteMultiShard(ctx, nil, rss, queries, NewSafeSession(session), true /*autocommit*/, false, nullResultsObserver{}) } diff --git a/go/vt/vtgate/semantics/FakeSI.go b/go/vt/vtgate/semantics/FakeSI.go index 1ca6718f1a8..cb1b9cec094 100644 --- a/go/vt/vtgate/semantics/FakeSI.go +++ b/go/vt/vtgate/semantics/FakeSI.go @@ -85,3 +85,8 @@ func (s *FakeSI) KeyspaceError(keyspace string) error { func (s *FakeSI) GetAggregateUDFs() []string { return s.UDFs } + +// FindMirrorRule implements SchemaInformation. +func (s *FakeSI) FindMirrorRule(tablename sqlparser.TableName) (*vindexes.MirrorRule, error) { + return nil, nil +} diff --git a/go/vt/vtgate/semantics/analyzer.go b/go/vt/vtgate/semantics/analyzer.go index 8bb7cc393fc..0a9d2480d9b 100644 --- a/go/vt/vtgate/semantics/analyzer.go +++ b/go/vt/vtgate/semantics/analyzer.go @@ -357,7 +357,7 @@ func (a *analyzer) collationEnv() *collations.Environment { } func (a *analyzer) analyze(statement sqlparser.Statement) error { - _ = sqlparser.Rewrite(statement, nil, a.earlyUp) + _ = sqlparser.Rewrite(statement, a.earlyTables.down, a.earlyTables.up) if a.err != nil { return a.err } @@ -387,7 +387,14 @@ func (a *analyzer) reAnalyze(statement sqlparser.SQLNode) error { // canShortCut checks if we are dealing with a single unsharded keyspace and no tables that have managed foreign keys // if so, we can stop the analyzer early func (a *analyzer) canShortCut(statement sqlparser.Statement) (canShortCut bool) { - ks, _ := singleUnshardedKeyspace(a.earlyTables.Tables) + var ks *vindexes.Keyspace + switch statement.(type) { + case sqlparser.SelectStatement: + ks, canShortCut = canTakeSelectUnshardedShortcut(a.earlyTables.Tables) + default: + ks, canShortCut = canTakeUnshardedShortcut(a.earlyTables.Tables) + } + a.singleUnshardedKeyspace = ks != nil if !a.singleUnshardedKeyspace { return false @@ -424,13 +431,6 @@ func (a *analyzer) canShortCut(statement sqlparser.Statement) (canShortCut bool) return true } -// earlyUp collects tables in the query, so we can check -// if this a single unsharded query we are dealing with -func (a *analyzer) earlyUp(cursor *sqlparser.Cursor) bool { - a.earlyTables.up(cursor) - return true -} - func (a *analyzer) shouldContinue() bool { return a.err == nil } @@ -455,6 +455,10 @@ func (a *analyzer) noteQuerySignature(node sqlparser.SQLNode) { if node.GroupBy != nil { a.sig.Aggregation = true } + case *sqlparser.With: + if node.Recursive { + a.sig.RecursiveCTE = true + } case sqlparser.AggrFunc: a.sig.Aggregation = true case *sqlparser.Delete, *sqlparser.Update, *sqlparser.Insert: diff --git a/go/vt/vtgate/semantics/analyzer_test.go b/go/vt/vtgate/semantics/analyzer_test.go index 0fbf0911f3a..0c42456b0ab 100644 --- a/go/vt/vtgate/semantics/analyzer_test.go +++ b/go/vt/vtgate/semantics/analyzer_test.go @@ -195,6 +195,59 @@ func TestBindingMultiTablePositive(t *testing.T) { } } +func TestBindingRecursiveCTEs(t *testing.T) { + type testCase struct { + query string + rdeps TableSet + ddeps TableSet + } + queries := []testCase{{ + query: "with recursive x as (select id from user union select x.id + 1 from x where x.id < 15) select t.id from x join x t;", + rdeps: TS3, + ddeps: TS3, + }, { + query: "WITH RECURSIVE user_cte AS (SELECT id, name FROM user WHERE id = 42 UNION ALL SELECT u.id, u.name FROM user u JOIN user_cte cte ON u.id = cte.id + 1 WHERE u.id = 42) SELECT id FROM user_cte", + rdeps: TS3, + ddeps: TS3, + }} + for _, query := range queries { + t.Run(query.query, func(t *testing.T) { + stmt, semTable := parseAndAnalyzeStrict(t, query.query, "user") + sel := stmt.(*sqlparser.Select) + assert.Equal(t, query.rdeps, semTable.RecursiveDeps(extract(sel, 0)), "recursive") + assert.Equal(t, query.ddeps, semTable.DirectDeps(extract(sel, 0)), "direct") + }) + } +} + +func TestRecursiveCTEChecking(t *testing.T) { + type testCase struct { + name, query, err string + } + queries := []testCase{{ + name: "recursive CTE using aggregation", + query: "with recursive x as (select id from user union select count(*) from x) select t.id from x join x t", + err: "VT09027: Recursive Common Table Expression 'x' can contain neither aggregation nor window functions in recursive query block", + }, { + name: "recursive CTE using grouping", + query: "with recursive x as (select id from user union select id+1 from x where id < 10 group by 1) select t.id from x join x t", + err: "VT09027: Recursive Common Table Expression 'x' can contain neither aggregation nor window functions in recursive query block", + }, { + name: "use the same recursive cte twice in definition", + query: "with recursive x as (select 1 union select id+1 from x where id < 10 union select id+2 from x where id < 20) select t.id from x", + err: "VT09029: In recursive query block of Recursive Common Table Expression x, the recursive table must be referenced only once, and not in any subquery", + }} + for _, tc := range queries { + t.Run(tc.query, func(t *testing.T) { + parse, err := sqlparser.NewTestParser().Parse(tc.query) + require.NoError(t, err) + + _, err = AnalyzeStrict(parse, "user", fakeSchemaInfo()) + require.EqualError(t, err, tc.err) + }) + } +} + func TestBindingMultiAliasedTablePositive(t *testing.T) { type testCase struct { query string @@ -887,9 +940,6 @@ func TestInvalidQueries(t *testing.T) { }, { sql: "select 1 from t1 where (id, id) in (select 1, 2, 3)", serr: "Operand should contain 2 column(s)", - }, { - sql: "WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5) SELECT * FROM cte", - serr: "VT12001: unsupported: recursive common table expression", }, { sql: "with x as (select 1), x as (select 1) select * from x", serr: "VT03013: not unique table/alias: 'x'", @@ -956,7 +1006,7 @@ func TestScopingWithWITH(t *testing.T) { }, { query: "with c as (select x as foo from user), t as (select foo as id from c) select id from t", recursive: TS0, - direct: TS3, + direct: TS2, }, { query: "with t as (select foo as id from user) select t.id from t", recursive: TS0, diff --git a/go/vt/vtgate/semantics/check_invalid.go b/go/vt/vtgate/semantics/check_invalid.go index a739e857c00..6509f5f5ee8 100644 --- a/go/vt/vtgate/semantics/check_invalid.go +++ b/go/vt/vtgate/semantics/check_invalid.go @@ -48,10 +48,6 @@ func (a *analyzer) checkForInvalidConstructs(cursor *sqlparser.Cursor) error { } case *sqlparser.Subquery: return a.checkSubqueryColumns(cursor.Parent(), node) - case *sqlparser.With: - if node.Recursive { - return vterrors.VT12001("recursive common table expression") - } case *sqlparser.Insert: if !a.singleUnshardedKeyspace && node.Action == sqlparser.ReplaceAct { return ShardedError{Inner: &UnsupportedConstruct{errString: "REPLACE INTO with sharded keyspace"}} diff --git a/go/vt/vtgate/semantics/cte_table.go b/go/vt/vtgate/semantics/cte_table.go new file mode 100644 index 00000000000..498fc5076c1 --- /dev/null +++ b/go/vt/vtgate/semantics/cte_table.go @@ -0,0 +1,182 @@ +/* +Copyright 2024 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 semantics + +import ( + "strings" + + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/evalengine" + "vitess.io/vitess/go/vt/vtgate/vindexes" +) + +// CTETable contains the information about the CTE table. +// This is a special TableInfo that is used to represent the recursive table inside a CTE. For the query: +// WITH RECURSIVE cte AS (SELECT 1 UNION ALL SELECT * FROM cte as C1) SELECT * FROM cte as C2 +// The CTE table C1 is represented by a CTETable. +type CTETable struct { + TableName string + ASTNode *sqlparser.AliasedTableExpr + *CTE +} + +var _ TableInfo = (*CTETable)(nil) + +func newCTETable(node *sqlparser.AliasedTableExpr, t sqlparser.TableName, cteDef *CTE) *CTETable { + var name string + if node.As.IsEmpty() { + name = t.Name.String() + } else { + name = node.As.String() + } + + authoritative := true + for _, expr := range cteDef.Query.GetColumns() { + _, isStar := expr.(*sqlparser.StarExpr) + if isStar { + authoritative = false + break + } + } + cteDef.isAuthoritative = authoritative + + return &CTETable{ + TableName: name, + ASTNode: node, + CTE: cteDef, + } +} + +func (cte *CTETable) Name() (sqlparser.TableName, error) { + return sqlparser.NewTableName(cte.TableName), nil +} + +func (cte *CTETable) GetVindexTable() *vindexes.Table { + return nil +} + +func (cte *CTETable) IsInfSchema() bool { + return false +} + +func (cte *CTETable) matches(name sqlparser.TableName) bool { + return cte.TableName == name.Name.String() && name.Qualifier.IsEmpty() +} + +func (cte *CTETable) authoritative() bool { + return cte.isAuthoritative +} + +func (cte *CTETable) GetAliasedTableExpr() *sqlparser.AliasedTableExpr { + return cte.ASTNode +} + +func (cte *CTETable) canShortCut() shortCut { + return canShortCut +} + +func (cte *CTETable) getColumns(bool) []ColumnInfo { + selExprs := cte.Query.GetColumns() + cols := make([]ColumnInfo, 0, len(selExprs)) + for i, selExpr := range selExprs { + ae, isAe := selExpr.(*sqlparser.AliasedExpr) + if !isAe { + panic(vterrors.VT12001("should not be called")) + } + if len(cte.Columns) == 0 { + cols = append(cols, ColumnInfo{Name: ae.ColumnName()}) + continue + } + + // We have column aliases defined on the CTE + cols = append(cols, ColumnInfo{Name: cte.Columns[i].String()}) + } + return cols +} + +func (cte *CTETable) dependencies(colName string, org originable) (dependencies, error) { + directDeps := org.tableSetFor(cte.ASTNode) + columns := cte.getColumns(false) + for _, columnInfo := range columns { + if strings.EqualFold(columnInfo.Name, colName) { + return createCertain(directDeps, directDeps, evalengine.NewUnknownType()), nil + } + } + + if cte.authoritative() { + return ¬hing{}, nil + } + + return createUncertain(directDeps, directDeps), nil +} + +func (cte *CTETable) getExprFor(s string) (sqlparser.Expr, error) { + for _, se := range cte.Query.GetColumns() { + ae, ok := se.(*sqlparser.AliasedExpr) + if !ok { + return nil, vterrors.VT09015() + } + if ae.ColumnName() == s { + return ae.Expr, nil + } + } + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Unknown column '%s' in 'field list'", s) +} + +func (cte *CTETable) getTableSet(org originable) TableSet { + return org.tableSetFor(cte.ASTNode) +} + +// GetMirrorRule implements TableInfo. +func (cte *CTETable) GetMirrorRule() *vindexes.MirrorRule { + return nil +} + +type CTE struct { + Name string + Query sqlparser.SelectStatement + isAuthoritative bool + recursiveDeps *TableSet + Columns sqlparser.Columns + IDForRecurse *TableSet + + // Was this CTE marked for being recursive? + Recursive bool + + // The CTE had the seed and term parts merged + Merged bool +} + +func (cte *CTE) recursive(org originable) (id TableSet) { + if cte.recursiveDeps != nil { + return *cte.recursiveDeps + } + + // We need to find the recursive dependencies of the CTE + // We'll do this by walking the inner query and finding all the tables + _ = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + ate, ok := node.(*sqlparser.AliasedTableExpr) + if !ok { + return true, nil + } + id = id.Merge(org.tableSetFor(ate)) + return true, nil + }, cte.Query) + return +} diff --git a/go/vt/vtgate/semantics/dependencies.go b/go/vt/vtgate/semantics/dependencies.go index 70167ff02fc..42b7a918384 100644 --- a/go/vt/vtgate/semantics/dependencies.go +++ b/go/vt/vtgate/semantics/dependencies.go @@ -17,6 +17,8 @@ limitations under the License. package semantics import ( + "fmt" + querypb "vitess.io/vitess/go/vt/proto/query" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/evalengine" @@ -29,6 +31,7 @@ type ( empty() bool get(col *sqlparser.ColName) (dependency, error) merge(other dependencies, allowMulti bool) dependencies + debugString() string } dependency struct { certain bool @@ -100,6 +103,10 @@ func (u *uncertain) merge(d dependencies, _ bool) dependencies { } } +func (u *uncertain) debugString() string { + return fmt.Sprintf("uncertain: %v %v %s", u.direct, u.recursive, u.typ.Type().String()) +} + func (c *certain) empty() bool { return false } @@ -117,26 +124,34 @@ func (c *certain) merge(d dependencies, allowMulti bool) dependencies { if d.recursive == c.recursive { return c } - c.direct = c.direct.Merge(d.direct) - c.recursive = c.recursive.Merge(d.recursive) + + res := createCertain(c.direct.Merge(d.direct), c.recursive.Merge(d.recursive), c.typ) if !allowMulti { - c.err = true + res.err = true } - return c + return res } return c } -func (n *nothing) empty() bool { +func (c *certain) debugString() string { + return fmt.Sprintf("certain: %v %v %s", c.direct, c.recursive, c.typ.Type().String()) +} + +func (*nothing) empty() bool { return true } -func (n *nothing) get(*sqlparser.ColName) (dependency, error) { +func (*nothing) get(*sqlparser.ColName) (dependency, error) { return dependency{certain: true}, nil } -func (n *nothing) merge(d dependencies, _ bool) dependencies { +func (*nothing) merge(d dependencies, _ bool) dependencies { return d } + +func (*nothing) debugString() string { + return "nothing" +} diff --git a/go/vt/vtgate/semantics/derived_table.go b/go/vt/vtgate/semantics/derived_table.go index aabbe9f0b22..fc7e1cb391c 100644 --- a/go/vt/vtgate/semantics/derived_table.go +++ b/go/vt/vtgate/semantics/derived_table.go @@ -146,7 +146,7 @@ func (dt *DerivedTable) GetAliasedTableExpr() *sqlparser.AliasedTableExpr { } func (dt *DerivedTable) canShortCut() shortCut { - panic(vterrors.VT12001("should not be called")) + return canShortCut } // GetVindexTable implements the TableInfo interface @@ -195,3 +195,8 @@ func (dt *DerivedTable) checkForDuplicates() error { } return nil } + +// GetMirrorRule implements TableInfo. +func (dt *DerivedTable) GetMirrorRule() *vindexes.MirrorRule { + return nil +} diff --git a/go/vt/vtgate/semantics/early_rewriter.go b/go/vt/vtgate/semantics/early_rewriter.go index 611c91e512c..3e53ed0816a 100644 --- a/go/vt/vtgate/semantics/early_rewriter.go +++ b/go/vt/vtgate/semantics/early_rewriter.go @@ -24,7 +24,6 @@ import ( "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vtgate/evalengine" ) type earlyRewriter struct { @@ -48,16 +47,14 @@ func (r *earlyRewriter) down(cursor *sqlparser.Cursor) error { switch node := cursor.Node().(type) { case sqlparser.SelectExprs: return r.handleSelectExprs(cursor, node) - case *sqlparser.OrExpr: - rewriteOrExpr(r.env, cursor, node) - case *sqlparser.AndExpr: - rewriteAndExpr(r.env, cursor, node) case *sqlparser.NotExpr: rewriteNotExpr(cursor, node) case *sqlparser.ComparisonExpr: return handleComparisonExpr(cursor, node) case *sqlparser.With: - return r.handleWith(node) + if !node.Recursive { + return r.handleWith(node) + } case *sqlparser.AliasedTableExpr: return r.handleAliasedTable(node) case *sqlparser.Delete: @@ -144,7 +141,7 @@ func (r *earlyRewriter) handleAliasedTable(node *sqlparser.AliasedTableExpr) err node.As = tbl.Name } node.Expr = &sqlparser.DerivedTable{ - Select: cte.Subquery.Select, + Select: cte.Subquery, } if len(cte.Columns) > 0 { node.Columns = cte.Columns @@ -852,57 +849,6 @@ func (r *earlyRewriter) rewriteGroupByExpr(node *sqlparser.Literal) (sqlparser.E return realCloneOfColNames(aliasedExpr.Expr, false), nil } -// rewriteOrExpr rewrites OR expressions when the right side is FALSE. -func rewriteOrExpr(env *vtenv.Environment, cursor *sqlparser.Cursor, node *sqlparser.OrExpr) { - newNode := rewriteOrFalse(env, *node) - if newNode != nil { - cursor.ReplaceAndRevisit(newNode) - } -} - -// rewriteAndExpr rewrites AND expressions when either side is TRUE. -func rewriteAndExpr(env *vtenv.Environment, cursor *sqlparser.Cursor, node *sqlparser.AndExpr) { - newNode := rewriteAndTrue(env, *node) - if newNode != nil { - cursor.ReplaceAndRevisit(newNode) - } -} - -func rewriteAndTrue(env *vtenv.Environment, andExpr sqlparser.AndExpr) sqlparser.Expr { - // we are looking for the pattern `WHERE c = 1 AND 1 = 1` - isTrue := func(subExpr sqlparser.Expr) bool { - coll := env.CollationEnv().DefaultConnectionCharset() - evalEnginePred, err := evalengine.Translate(subExpr, &evalengine.Config{ - Environment: env, - Collation: coll, - }) - if err != nil { - return false - } - - env := evalengine.EmptyExpressionEnv(env) - res, err := env.Evaluate(evalEnginePred) - if err != nil { - return false - } - - boolValue, err := res.Value(coll).ToBool() - if err != nil { - return false - } - - return boolValue - } - - if isTrue(andExpr.Left) { - return andExpr.Right - } else if isTrue(andExpr.Right) { - return andExpr.Left - } - - return nil -} - // handleComparisonExpr processes Comparison expressions, specifically for tuples with equal length and EqualOp operator. func handleComparisonExpr(cursor *sqlparser.Cursor, node *sqlparser.ComparisonExpr) error { lft, lftOK := node.Left.(sqlparser.ValTuple) @@ -968,41 +914,6 @@ func realCloneOfColNames(expr sqlparser.Expr, union bool) sqlparser.Expr { }, nil).(sqlparser.Expr) } -func rewriteOrFalse(env *vtenv.Environment, orExpr sqlparser.OrExpr) sqlparser.Expr { - // we are looking for the pattern `WHERE c = 1 OR 1 = 0` - isFalse := func(subExpr sqlparser.Expr) bool { - coll := env.CollationEnv().DefaultConnectionCharset() - evalEnginePred, err := evalengine.Translate(subExpr, &evalengine.Config{ - Environment: env, - Collation: coll, - }) - if err != nil { - return false - } - - env := evalengine.EmptyExpressionEnv(env) - res, err := env.Evaluate(evalEnginePred) - if err != nil { - return false - } - - boolValue, err := res.Value(coll).ToBool() - if err != nil { - return false - } - - return !boolValue - } - - if isFalse(orExpr.Left) { - return orExpr.Right - } else if isFalse(orExpr.Right) { - return orExpr.Left - } - - return nil -} - // rewriteJoinUsing rewrites SQL JOINs that use the USING clause to their equivalent // JOINs with the ON condition. This function finds all the tables that have the // specified columns in the USING clause, constructs an equality predicate for diff --git a/go/vt/vtgate/semantics/early_rewriter_test.go b/go/vt/vtgate/semantics/early_rewriter_test.go index 16b3756189f..1ec7786a46c 100644 --- a/go/vt/vtgate/semantics/early_rewriter_test.go +++ b/go/vt/vtgate/semantics/early_rewriter_test.go @@ -184,6 +184,9 @@ func TestExpandStar(t *testing.T) { // if we are only star-expanding authoritative tables, we don't need to stop the expansion sql: "SELECT * FROM (SELECT t2.*, 12 AS foo FROM t3, t2) as results", expSQL: "select c1, c2, foo from (select t2.c1, t2.c2, 12 as foo from t3, t2) as results", + }, { + sql: "with recursive hierarchy as (select t1.a, t1.b from t1 where t1.a is null union select t1.a, t1.b from t1 join hierarchy on t1.a = hierarchy.b) select * from hierarchy", + expSQL: "with recursive hierarchy as (select t1.a, t1.b from t1 where t1.a is null union select t1.a, t1.b from t1 join hierarchy on t1.a = hierarchy.b) select a, b from hierarchy", }} for _, tcase := range tcases { t.Run(tcase.sql, func(t *testing.T) { @@ -837,6 +840,9 @@ func TestRewriteNot(t *testing.T) { }, { sql: "select a from t1 where not a > 12", expected: "select a from t1 where a <= 12", + }, { + sql: "select (not (1 like ('a' is null)))", + expected: "select 1 not like ('a' is null) from dual", }} for _, tcase := range tcases { t.Run(tcase.sql, func(t *testing.T) { @@ -902,53 +908,6 @@ func TestOrderByDerivedTable(t *testing.T) { } } -// TestConstantFolding tests that the rewriter is able to do various constant foldings properly. -func TestConstantFolding(t *testing.T) { - ks := &vindexes.Keyspace{ - Name: "main", - Sharded: true, - } - schemaInfo := &FakeSI{ - Tables: map[string]*vindexes.Table{ - "t1": { - Keyspace: ks, - Name: sqlparser.NewIdentifierCS("t1"), - Columns: []vindexes.Column{{ - Name: sqlparser.NewIdentifierCI("a"), - Type: sqltypes.VarChar, - }, { - Name: sqlparser.NewIdentifierCI("b"), - Type: sqltypes.VarChar, - }, { - Name: sqlparser.NewIdentifierCI("c"), - Type: sqltypes.VarChar, - }}, - ColumnListAuthoritative: true, - }, - }, - } - cDB := "db" - tcases := []struct { - sql string - expSQL string - }{{ - sql: "select 1 from t1 where (a, b) in ::fkc_vals and (2 is null or (1 is null or a in (1)))", - expSQL: "select 1 from t1 where (a, b) in ::fkc_vals and a in (1)", - }, { - sql: "select 1 from t1 where (false or (false or a in (1)))", - expSQL: "select 1 from t1 where a in (1)", - }} - for _, tcase := range tcases { - t.Run(tcase.sql, func(t *testing.T) { - ast, err := sqlparser.NewTestParser().Parse(tcase.sql) - require.NoError(t, err) - _, err = Analyze(ast, cDB, schemaInfo) - require.NoError(t, err) - require.Equal(t, tcase.expSQL, sqlparser.String(ast)) - }) - } -} - // TestCTEToDerivedTableRewrite checks that CTEs are correctly rewritten to derived tables func TestCTEToDerivedTableRewrite(t *testing.T) { cDB := "db" diff --git a/go/vt/vtgate/semantics/foreign_keys_test.go b/go/vt/vtgate/semantics/foreign_keys_test.go index e1c26ecf569..a46c67c9710 100644 --- a/go/vt/vtgate/semantics/foreign_keys_test.go +++ b/go/vt/vtgate/semantics/foreign_keys_test.go @@ -141,13 +141,10 @@ func TestGetAllManagedForeignKeys(t *testing.T) { { name: "Collect all foreign key constraints", fkManager: &fkManager{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t0"], - tbl["t1"], - &DerivedTable{}, - }, - }, + tables: makeTableCollector(nil, + tbl["t0"], + tbl["t1"], + &DerivedTable{}), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -171,12 +168,10 @@ func TestGetAllManagedForeignKeys(t *testing.T) { { name: "keyspace not found in schema information", fkManager: &fkManager{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t2"], - tbl["t3"], - }, - }, + tables: makeTableCollector(nil, + tbl["t2"], + tbl["t3"], + ), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -188,12 +183,9 @@ func TestGetAllManagedForeignKeys(t *testing.T) { { name: "Cyclic fk constraints error", fkManager: &fkManager{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t0"], tbl["t1"], - &DerivedTable{}, - }, - }, + tables: makeTableCollector(nil, + tbl["t0"], tbl["t1"], + &DerivedTable{}), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -236,17 +228,11 @@ func TestFilterForeignKeysUsingUpdateExpressions(t *testing.T) { }, }, getError: func() error { return fmt.Errorf("ambiguous test error") }, - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t4"], - tbl["t5"], - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - }, - }, - }, + tables: makeTableCollector(&FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + }}, tbl["t4"], + tbl["t5"]), } updateExprs := sqlparser.UpdateExprs{ &sqlparser.UpdateExpr{Name: cola, Expr: sqlparser.NewIntLiteral("1")}, @@ -350,12 +336,10 @@ func TestGetInvolvedForeignKeys(t *testing.T) { name: "Delete Query", stmt: &sqlparser.Delete{}, fkManager: &fkManager{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t0"], - tbl["t1"], - }, - }, + tables: makeTableCollector(nil, + tbl["t0"], + tbl["t1"], + ), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -389,12 +373,10 @@ func TestGetInvolvedForeignKeys(t *testing.T) { cold: SingleTableSet(1), }, }, - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t4"], - tbl["t5"], - }, - }, + tables: makeTableCollector(nil, + tbl["t4"], + tbl["t5"], + ), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -433,12 +415,10 @@ func TestGetInvolvedForeignKeys(t *testing.T) { Action: sqlparser.ReplaceAct, }, fkManager: &fkManager{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t0"], - tbl["t1"], - }, - }, + tables: makeTableCollector(nil, + tbl["t0"], + tbl["t1"], + ), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -465,12 +445,9 @@ func TestGetInvolvedForeignKeys(t *testing.T) { Action: sqlparser.InsertAct, }, fkManager: &fkManager{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t0"], - tbl["t1"], - }, - }, + tables: makeTableCollector(nil, + tbl["t0"], + tbl["t1"]), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -502,12 +479,9 @@ func TestGetInvolvedForeignKeys(t *testing.T) { colb: SingleTableSet(0), }, }, - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t6"], - tbl["t1"], - }, - }, + tables: makeTableCollector(nil, + tbl["t6"], + tbl["t1"]), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -536,12 +510,9 @@ func TestGetInvolvedForeignKeys(t *testing.T) { name: "Insert error", stmt: &sqlparser.Insert{}, fkManager: &fkManager{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t2"], - tbl["t3"], - }, - }, + tables: makeTableCollector(nil, + tbl["t2"], + tbl["t3"]), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -554,12 +525,9 @@ func TestGetInvolvedForeignKeys(t *testing.T) { name: "Update error", stmt: &sqlparser.Update{}, fkManager: &fkManager{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t2"], - tbl["t3"], - }, - }, + tables: makeTableCollector(nil, + tbl["t2"], + tbl["t3"]), si: &FakeSI{ KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ "ks": vschemapb.Keyspace_managed, @@ -600,3 +568,12 @@ func pkInfo(parentTable *vindexes.Table, pCols []string, cCols []string) vindexe ChildColumns: sqlparser.MakeColumns(cCols...), } } + +func makeTableCollector(si SchemaInformation, tables ...TableInfo) *tableCollector { + return &tableCollector{ + earlyTableCollector: earlyTableCollector{ + Tables: tables, + si: si, + }, + } +} diff --git a/go/vt/vtgate/semantics/info_schema.go b/go/vt/vtgate/semantics/info_schema.go index 11e577f3fa7..127f4a00960 100644 --- a/go/vt/vtgate/semantics/info_schema.go +++ b/go/vt/vtgate/semantics/info_schema.go @@ -1603,11 +1603,15 @@ type infoSchemaWithColumns struct { infoSchemaData map[string][]vindexes.Column } +var _ SchemaInformation = (*infoSchemaWithColumns)(nil) + // MySQLVersion implements SchemaInformation. // We cache this information, since these are maps that are not changed -var infoSchema57 = getInfoSchema57() -var infoSchema80 = getInfoSchema80() +var ( + infoSchema57 = getInfoSchema57() + infoSchema80 = getInfoSchema80() +) // newSchemaInfo returns a SchemaInformation that has the column information for all info_schema tables func newSchemaInfo(inner SchemaInformation) SchemaInformation { @@ -1665,3 +1669,8 @@ func (i *infoSchemaWithColumns) KeyspaceError(keyspace string) error { func (i *infoSchemaWithColumns) GetAggregateUDFs() []string { return i.inner.GetAggregateUDFs() } + +// FindMirrorRule implements SchemaInformation. +func (i *infoSchemaWithColumns) FindMirrorRule(tablename sqlparser.TableName) (*vindexes.MirrorRule, error) { + return i.inner.FindMirrorRule(tablename) +} diff --git a/go/vt/vtgate/semantics/real_table.go b/go/vt/vtgate/semantics/real_table.go index 4f1639d0897..64f3ac5f3f0 100644 --- a/go/vt/vtgate/semantics/real_table.go +++ b/go/vt/vtgate/semantics/real_table.go @@ -20,9 +20,11 @@ import ( "strings" "vitess.io/vitess/go/mysql/collations" + "vitess.io/vitess/go/slice" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/evalengine" "vitess.io/vitess/go/vt/vtgate/vindexes" ) @@ -31,26 +33,41 @@ type RealTable struct { dbName, tableName string ASTNode *sqlparser.AliasedTableExpr Table *vindexes.Table + CTE *CTE VindexHint *sqlparser.IndexHint + MirrorRule *vindexes.MirrorRule isInfSchema bool collationEnv *collations.Environment + cache map[string]dependencies } var _ TableInfo = (*RealTable)(nil) // dependencies implements the TableInfo interface -func (r *RealTable) dependencies(colName string, org originable) (dependencies, error) { - ts := org.tableSetFor(r.ASTNode) - for _, info := range r.getColumns(false /* ignoreInvisbleCol */) { - if strings.EqualFold(info.Name, colName) { - return createCertain(ts, ts, info.Type), nil +func (r *RealTable) dependencies(colName string, org originable) (deps dependencies, err error) { + var myID *TableSet + if r.cache == nil { + r.cache = make(map[string]dependencies) + ts := org.tableSetFor(r.ASTNode) + myID = &ts + for _, info := range r.getColumns(false /* ignoreInvisbleCol */) { + r.cache[strings.ToLower(info.Name)] = createCertain(ts, ts, info.Type) } } + if deps, ok := r.cache[strings.ToLower(colName)]; ok { + return deps, nil + } + if r.authoritative() { return ¬hing{}, nil } - return createUncertain(ts, ts), nil + + if myID == nil { + ts := org.tableSetFor(r.ASTNode) + myID = &ts + } + return createUncertain(*myID, *myID), nil } // GetTables implements the TableInfo interface @@ -70,9 +87,17 @@ func (r *RealTable) IsInfSchema() bool { // GetColumns implements the TableInfo interface func (r *RealTable) getColumns(ignoreInvisbleCol bool) []ColumnInfo { - if r.Table == nil { + switch { + case r.CTE != nil: + return r.getCTEColumns() + case r.Table == nil: return nil + default: + return r.getVindexTableColumns(ignoreInvisbleCol) } +} + +func (r *RealTable) getVindexTableColumns(ignoreInvisbleCol bool) []ColumnInfo { nameMap := map[string]any{} cols := make([]ColumnInfo, 0, len(r.Table.Columns)) for _, col := range r.Table.Columns { @@ -105,6 +130,57 @@ func (r *RealTable) getColumns(ignoreInvisbleCol bool) []ColumnInfo { return cols } +func (r *RealTable) getCTEColumns() []ColumnInfo { + selectExprs := r.CTE.Query.GetColumns() + ci := extractColumnsFromCTE(r.CTE.Columns, selectExprs) + if ci != nil { + return ci + } + return extractSelectExprsFromCTE(selectExprs) +} + +// Authoritative implements the TableInfo interface +func (r *RealTable) authoritative() bool { + switch { + case r.Table != nil: + return r.Table.ColumnListAuthoritative + case r.CTE != nil: + return r.CTE.isAuthoritative + default: + return false + } +} + +func extractSelectExprsFromCTE(selectExprs sqlparser.SelectExprs) []ColumnInfo { + var ci []ColumnInfo + for _, expr := range selectExprs { + ae, ok := expr.(*sqlparser.AliasedExpr) + if !ok { + return nil + } + ci = append(ci, ColumnInfo{ + Name: ae.ColumnName(), + Type: evalengine.NewUnknownType(), // TODO: set the proper type + }) + } + return ci +} + +func extractColumnsFromCTE(columns sqlparser.Columns, selectExprs sqlparser.SelectExprs) []ColumnInfo { + if len(columns) == 0 { + return nil + } + if len(selectExprs) != len(columns) { + panic("mismatch of columns") + } + return slice.Map(columns, func(from sqlparser.IdentifierCI) ColumnInfo { + return ColumnInfo{ + Name: from.String(), + Type: evalengine.NewUnknownType(), + } + }) +} + // GetExpr implements the TableInfo interface func (r *RealTable) GetAliasedTableExpr() *sqlparser.AliasedTableExpr { return r.ASTNode @@ -145,12 +221,12 @@ func (r *RealTable) Name() (sqlparser.TableName, error) { return r.ASTNode.TableName() } -// Authoritative implements the TableInfo interface -func (r *RealTable) authoritative() bool { - return r.Table != nil && r.Table.ColumnListAuthoritative -} - // Matches implements the TableInfo interface func (r *RealTable) matches(name sqlparser.TableName) bool { return (name.Qualifier.IsEmpty() || name.Qualifier.String() == r.dbName) && r.tableName == name.Name.String() } + +// GetMirrorRule implements TableInfo. +func (r *RealTable) GetMirrorRule() *vindexes.MirrorRule { + return r.MirrorRule +} diff --git a/go/vt/vtgate/semantics/scoper.go b/go/vt/vtgate/semantics/scoper.go index ae3e5b7e88d..9d596d9ecd1 100644 --- a/go/vt/vtgate/semantics/scoper.go +++ b/go/vt/vtgate/semantics/scoper.go @@ -35,9 +35,10 @@ type ( binder *binder // These scopes are only used for rewriting ORDER BY 1 and GROUP BY 1 - specialExprScopes map[*sqlparser.Literal]*scope - statementIDs map[sqlparser.Statement]TableSet - si SchemaInformation + specialExprScopes map[*sqlparser.Literal]*scope + statementIDs map[sqlparser.Statement]TableSet + commonTableExprScopes []*sqlparser.CommonTableExpr + si SchemaInformation } scope struct { @@ -105,6 +106,8 @@ func (s *scoper) down(cursor *sqlparser.Cursor) error { s.currentScope().inHaving = true return nil } + case *sqlparser.CommonTableExpr: + s.commonTableExprScopes = append(s.commonTableExprScopes, node) } return nil } @@ -240,6 +243,9 @@ func (s *scoper) up(cursor *sqlparser.Cursor) error { case sqlparser.AggrFunc: s.currentScope().inHavingAggr = false case sqlparser.TableExpr: + // inside joins and derived tables, we can only see the tables in the table/join. + // we also want the tables available in the outer query, for SELECT expressions and the WHERE clause, + // so we copy the tables from the current scope to the parent scope if isParentSelect(cursor) { curScope := s.currentScope() s.popScope() @@ -258,6 +264,8 @@ func (s *scoper) up(cursor *sqlparser.Cursor) error { s.binder.usingJoinInfo[ts] = m } } + case *sqlparser.CommonTableExpr: + s.commonTableExprScopes = s.commonTableExprScopes[:len(s.commonTableExprScopes)-1] } return nil } @@ -367,7 +375,7 @@ func checkForInvalidAliasUse(cte *sqlparser.CommonTableExpr, name string) (err e } return err == nil } - _ = sqlparser.CopyOnRewrite(cte.Subquery.Select, down, nil, nil) + _ = sqlparser.CopyOnRewrite(cte.Subquery, down, nil, nil) return err } diff --git a/go/vt/vtgate/semantics/semantic_state.go b/go/vt/vtgate/semantics/semantic_table.go similarity index 94% rename from go/vt/vtgate/semantics/semantic_state.go rename to go/vt/vtgate/semantics/semantic_table.go index ac2fd9c1604..f9856a901a6 100644 --- a/go/vt/vtgate/semantics/semantic_state.go +++ b/go/vt/vtgate/semantics/semantic_table.go @@ -63,6 +63,9 @@ type ( dependencies(colName string, org originable) (dependencies, error) getExprFor(s string) (sqlparser.Expr, error) getTableSet(org originable) TableSet + + // GetMirrorRule returns the vschema mirror rule for this TableInfo + GetMirrorRule() *vindexes.MirrorRule } // ColumnInfo contains information about columns @@ -77,12 +80,19 @@ type ( // QuerySignature is used to identify shortcuts in the planning process QuerySignature struct { - Aggregation bool - DML bool - Distinct bool - HashJoin bool - SubQueries bool - Union bool + Aggregation bool + DML bool + Distinct bool + HashJoin bool + SubQueries bool + Union bool + RecursiveCTE bool + } + + // MirrorInfo stores information used to produce mirror + // operators. + MirrorInfo struct { + Percent float32 } // SemTable contains semantic analysis information about the query. @@ -162,6 +172,7 @@ type ( GetForeignKeyChecksState() *bool KeyspaceError(keyspace string) error GetAggregateUDFs() []string + FindMirrorRule(tablename sqlparser.TableName) (*vindexes.MirrorRule, error) } shortCut = int @@ -173,10 +184,8 @@ const ( dependsOnKeyspace ) -var ( - // ErrNotSingleTable refers to an error happening when something should be used only for single tables - ErrNotSingleTable = vterrors.Errorf(vtrpcpb.Code_INTERNAL, "[BUG] should only be used for single tables") -) +// ErrNotSingleTable refers to an error happening when something should be used only for single tables +var ErrNotSingleTable = vterrors.VT13001("should only be used for single tables") // CopyDependencies copies the dependencies from one expression into the other func (st *SemTable) CopyDependencies(from, to sqlparser.Expr) { @@ -733,7 +742,6 @@ func RewriteDerivedTableExpression(expr sqlparser.Expr, vt TableInfo) sqlparser. col := *node col.Qualifier = sqlparser.TableName{} cursor.Replace(&col) - }, nil).(sqlparser.Expr) } @@ -773,10 +781,6 @@ func singleUnshardedKeyspace(tableInfos []TableInfo) (ks *vindexes.Keyspace, tab } for _, table := range tableInfos { - if _, isDT := table.(*DerivedTable); isDT { - continue - } - sc := table.canShortCut() var vtbl *vindexes.Table @@ -800,6 +804,7 @@ func singleUnshardedKeyspace(tableInfos []TableInfo) (ks *vindexes.Keyspace, tab tables = append(tables, vtbl) } + return ks, tables } @@ -983,3 +988,45 @@ func (st *SemTable) NewTableId() TableSet { st.Tables = append(st.Tables, nil) return tableID } + +func (st *SemTable) CanTakeSelectUnshardedShortcut() (*vindexes.Keyspace, bool) { + return canTakeSelectUnshardedShortcut(st.Tables) +} + +func (st *SemTable) CanTakeUnshardedShortcut() (*vindexes.Keyspace, bool) { + return canTakeUnshardedShortcut(st.Tables) +} + +func canTakeUnshardedShortcut(tableInfos []TableInfo) (*vindexes.Keyspace, bool) { + uks, _ := singleUnshardedKeyspace(tableInfos) + return uks, uks != nil +} + +func canTakeSelectUnshardedShortcut(tableInfos []TableInfo) (*vindexes.Keyspace, bool) { + if mi := mirrorInfo(tableInfos); mi.Percent > 0 { + return nil, false + } + return canTakeUnshardedShortcut(tableInfos) +} + +func (st *SemTable) GetMirrorInfo() MirrorInfo { + return mirrorInfo(st.Tables) +} + +// mirrorInfo looks through all tables with mirror rules defined, and returns a +// MirrorInfo containing the lowest mirror percentage found across all rules. +// +// The idea here is that if you have two tables with mirror rules both involved +// in a query, and one of those rules is 1% while the other is 100%, to mirror +// the query with 1% chance. +func mirrorInfo(tableInfos []TableInfo) MirrorInfo { + mi := MirrorInfo{} + for _, t := range tableInfos { + if mr := t.GetMirrorRule(); mr != nil { + if mi.Percent == 0 || mr.Percent < mi.Percent { + mi.Percent = mr.Percent + } + } + } + return mi +} diff --git a/go/vt/vtgate/semantics/semantic_state_test.go b/go/vt/vtgate/semantics/semantic_table_test.go similarity index 99% rename from go/vt/vtgate/semantics/semantic_state_test.go rename to go/vt/vtgate/semantics/semantic_table_test.go index 84f8cec6cf9..1f324215326 100644 --- a/go/vt/vtgate/semantics/semantic_state_test.go +++ b/go/vt/vtgate/semantics/semantic_table_test.go @@ -464,7 +464,7 @@ func TestRemoveParentForeignKey(t *testing.T) { }, }, }, - expectedErr: "[BUG] should only be used for single tables", + expectedErr: "VT13001: [BUG] should only be used for single tables", }, } for _, tt := range tests { @@ -716,7 +716,7 @@ func TestRemoveNonRequiredForeignKeys(t *testing.T) { SingleTableSet(0).Merge(SingleTableSet(1)): {}, }, }, - expectedErr: "[BUG] should only be used for single tables", + expectedErr: "VT13001: [BUG] should only be used for single tables", }, { name: "Error - Reading table info for child foreign keys", @@ -734,7 +734,7 @@ func TestRemoveNonRequiredForeignKeys(t *testing.T) { }, parentForeignKeysInvolved: map[TableSet][]vindexes.ParentFKInfo{}, }, - expectedErr: "[BUG] should only be used for single tables", + expectedErr: "VT13001: [BUG] should only be used for single tables", }, } for _, tt := range tests { diff --git a/go/vt/vtgate/semantics/table_collector.go b/go/vt/vtgate/semantics/table_collector.go index 948edb37d47..191d9c3b38e 100644 --- a/go/vt/vtgate/semantics/table_collector.go +++ b/go/vt/vtgate/semantics/table_collector.go @@ -28,45 +28,59 @@ import ( "vitess.io/vitess/go/vt/vtgate/vindexes" ) -// tableCollector is responsible for gathering information about the tables listed in the FROM clause, -// and adding them to the current scope, plus keeping the global list of tables used in the query -type tableCollector struct { - Tables []TableInfo - scoper *scoper - si SchemaInformation - currentDb string - org originable - unionInfo map[*sqlparser.Union]unionInfo - done map[*sqlparser.AliasedTableExpr]TableInfo -} +type ( + // tableCollector is responsible for gathering information about the tables listed in the FROM clause, + // and adding them to the current scope, plus keeping the global list of tables used in the query + tableCollector struct { + earlyTableCollector + scoper *scoper + org originable + unionInfo map[*sqlparser.Union]unionInfo + } -type earlyTableCollector struct { - si SchemaInformation - currentDb string - Tables []TableInfo - done map[*sqlparser.AliasedTableExpr]TableInfo - withTables map[sqlparser.IdentifierCS]any -} + earlyTableCollector struct { + si SchemaInformation + currentDb string + Tables []TableInfo + done map[*sqlparser.AliasedTableExpr]TableInfo + + // cte is a map of CTE definitions that are used in the query + cte map[string]*CTE + } +) func newEarlyTableCollector(si SchemaInformation, currentDb string) *earlyTableCollector { return &earlyTableCollector{ - si: si, - currentDb: currentDb, - done: map[*sqlparser.AliasedTableExpr]TableInfo{}, - withTables: map[sqlparser.IdentifierCS]any{}, + si: si, + currentDb: currentDb, + done: map[*sqlparser.AliasedTableExpr]TableInfo{}, + cte: map[string]*CTE{}, } } -func (etc *earlyTableCollector) up(cursor *sqlparser.Cursor) { - switch node := cursor.Node().(type) { - case *sqlparser.AliasedTableExpr: - etc.visitAliasedTableExpr(node) - case *sqlparser.With: - for _, cte := range node.CTEs { - etc.withTables[cte.ID] = nil +func (etc *earlyTableCollector) down(cursor *sqlparser.Cursor) bool { + with, ok := cursor.Node().(*sqlparser.With) + if !ok { + return true + } + for _, cte := range with.CTEs { + etc.cte[cte.ID.String()] = &CTE{ + Name: cte.ID.String(), + Query: cte.Subquery, + Columns: cte.Columns, + Recursive: with.Recursive, } } + return true +} +func (etc *earlyTableCollector) up(cursor *sqlparser.Cursor) bool { + ate, ok := cursor.Node().(*sqlparser.AliasedTableExpr) + if !ok { + return true + } + etc.visitAliasedTableExpr(ate) + return true } func (etc *earlyTableCollector) visitAliasedTableExpr(aet *sqlparser.AliasedTableExpr) { @@ -79,25 +93,22 @@ func (etc *earlyTableCollector) visitAliasedTableExpr(aet *sqlparser.AliasedTabl func (etc *earlyTableCollector) newTableCollector(scoper *scoper, org originable) *tableCollector { return &tableCollector{ - Tables: etc.Tables, - scoper: scoper, - si: etc.si, - currentDb: etc.currentDb, - unionInfo: map[*sqlparser.Union]unionInfo{}, - done: etc.done, - org: org, + earlyTableCollector: *etc, + scoper: scoper, + unionInfo: map[*sqlparser.Union]unionInfo{}, + org: org, } } func (etc *earlyTableCollector) handleTableName(tbl sqlparser.TableName, aet *sqlparser.AliasedTableExpr) { if tbl.Qualifier.IsEmpty() { - _, isCTE := etc.withTables[tbl.Name] + _, isCTE := etc.cte[tbl.Name.String()] if isCTE { // no need to handle these tables here, we wait for the late phase instead return } } - tableInfo, err := getTableInfo(aet, tbl, etc.si, etc.currentDb) + tableInfo, err := etc.getTableInfo(aet, tbl, nil) if err != nil { // this could just be a CTE that we haven't processed, so we'll give it the benefit of the doubt for now return @@ -304,7 +315,7 @@ func (tc *tableCollector) handleTableName(node *sqlparser.AliasedTableExpr, t sq tableInfo, found = tc.done[node] if !found { - tableInfo, err = getTableInfo(node, t, tc.si, tc.currentDb) + tableInfo, err = tc.earlyTableCollector.getTableInfo(node, t, tc.scoper) if err != nil { return err } @@ -315,12 +326,32 @@ func (tc *tableCollector) handleTableName(node *sqlparser.AliasedTableExpr, t sq return scope.addTable(tableInfo) } -func getTableInfo(node *sqlparser.AliasedTableExpr, t sqlparser.TableName, si SchemaInformation, currentDb string) (TableInfo, error) { +func (etc *earlyTableCollector) getCTE(t sqlparser.TableName) *CTE { + if t.Qualifier.NotEmpty() { + return nil + } + + return etc.cte[t.Name.String()] +} + +func (etc *earlyTableCollector) getTableInfo(node *sqlparser.AliasedTableExpr, t sqlparser.TableName, sc *scoper) (TableInfo, error) { var tbl *vindexes.Table var vindex vindexes.Vindex + if cteDef := etc.getCTE(t); cteDef != nil { + cte, err := etc.buildRecursiveCTE(node, t, sc, cteDef) + if err != nil { + return nil, err + } + if cte != nil { + // if we didn't get a table, it means we can't build a recursive CTE, + // so we need to look for a regular table instead + return cte, nil + } + } + isInfSchema := sqlparser.SystemSchema(t.Qualifier.String()) var err error - tbl, vindex, _, _, _, err = si.FindTableOrVindex(t) + tbl, vindex, _, _, _, err = etc.si.FindTableOrVindex(t) if err != nil && !isInfSchema { // if we are dealing with a system table, it might not be available in the vschema, but that is OK return nil, err @@ -329,13 +360,64 @@ func getTableInfo(node *sqlparser.AliasedTableExpr, t sqlparser.TableName, si Sc tbl = newVindexTable(t.Name) } - tableInfo, err := createTable(t, node, tbl, isInfSchema, vindex, si, currentDb) + tableInfo, err := etc.createTable(t, node, tbl, isInfSchema, vindex) if err != nil { return nil, err } return tableInfo, nil } +func (etc *earlyTableCollector) buildRecursiveCTE(node *sqlparser.AliasedTableExpr, t sqlparser.TableName, sc *scoper, cteDef *CTE) (TableInfo, error) { + // If sc is nil, then we are in the early table collector. + // In early table collector, we don't go over the CTE definitions, so we must be seeing a usage of the CTE. + if sc != nil && len(sc.commonTableExprScopes) > 0 { + cte := sc.commonTableExprScopes[len(sc.commonTableExprScopes)-1] + if cte.ID.String() == t.Name.String() { + + if err := checkValidRecursiveCTE(cteDef); err != nil { + return nil, err + } + + cteTable := newCTETable(node, t, cteDef) + cteTableSet := SingleTableSet(len(etc.Tables)) + cteDef.IDForRecurse = &cteTableSet + if !cteDef.Recursive { + return nil, nil + } + return cteTable, nil + } + } + return &RealTable{ + tableName: node.TableNameString(), + ASTNode: node, + CTE: cteDef, + collationEnv: etc.si.Environment().CollationEnv(), + }, nil +} + +func checkValidRecursiveCTE(cteDef *CTE) error { + if cteDef.IDForRecurse != nil { + return vterrors.VT09029(cteDef.Name) + } + + union, isUnion := cteDef.Query.(*sqlparser.Union) + if !isUnion { + return vterrors.VT09026(cteDef.Name) + } + + firstSelect := sqlparser.GetFirstSelect(union.Right) + if firstSelect.GroupBy != nil { + return vterrors.VT09027(cteDef.Name) + } + + for _, expr := range firstSelect.GetColumns() { + if sqlparser.ContainsAggregation(expr) { + return vterrors.VT09027(cteDef.Name) + } + } + return nil +} + func (tc *tableCollector) handleDerivedTable(node *sqlparser.AliasedTableExpr, t *sqlparser.DerivedTable) error { switch sel := t.Select.(type) { case *sqlparser.Select: @@ -437,14 +519,12 @@ func (tc *tableCollector) tableInfoFor(id TableSet) (TableInfo, error) { return tc.Tables[offset], nil } -func createTable( +func (etc *earlyTableCollector) createTable( t sqlparser.TableName, alias *sqlparser.AliasedTableExpr, tbl *vindexes.Table, isInfSchema bool, vindex vindexes.Vindex, - si SchemaInformation, - currentDb string, ) (TableInfo, error) { hint := getVindexHint(alias.Hints) @@ -452,19 +532,28 @@ func createTable( return nil, err } + mr, err := etc.si.FindMirrorRule(t) + if err != nil { + // Mirroring is best effort. If we get an error while mirroring, keep going + // as if mirroring was disabled. We don't want to interrupt production work + // because of an issue with mirroring. + mr = nil + } + table := &RealTable{ tableName: alias.As.String(), ASTNode: alias, Table: tbl, VindexHint: hint, + MirrorRule: mr, isInfSchema: isInfSchema, - collationEnv: si.Environment().CollationEnv(), + collationEnv: etc.si.Environment().CollationEnv(), } if alias.As.IsEmpty() { dbName := t.Qualifier.String() if dbName == "" { - dbName = currentDb + dbName = etc.currentDb } table.dbName = dbName diff --git a/go/vt/vtgate/semantics/vindex_table.go b/go/vt/vtgate/semantics/vindex_table.go index b598c93f36a..c8ef271af5d 100644 --- a/go/vt/vtgate/semantics/vindex_table.go +++ b/go/vt/vtgate/semantics/vindex_table.go @@ -84,3 +84,8 @@ func (v *VindexTable) getColumns(ignoreInvisbleCol bool) []ColumnInfo { func (v *VindexTable) IsInfSchema() bool { return v.Table.IsInfSchema() } + +// GetMirrorRule implements TableInfo. +func (v *VindexTable) GetMirrorRule() *vindexes.MirrorRule { + return nil +} diff --git a/go/vt/vtgate/semantics/vtable.go b/go/vt/vtgate/semantics/vtable.go index 14519a7e938..6cd7e34aecc 100644 --- a/go/vt/vtgate/semantics/vtable.go +++ b/go/vt/vtgate/semantics/vtable.go @@ -175,3 +175,8 @@ func selectExprsToInfos( } return } + +// GetMirrorRule implements TableInfo. +func (v *vTableInfo) GetMirrorRule() *vindexes.MirrorRule { + return nil +} diff --git a/go/vt/vtgate/tabletgateway.go b/go/vt/vtgate/tabletgateway.go index 63ae836d715..7ed10d3813b 100644 --- a/go/vt/vtgate/tabletgateway.go +++ b/go/vt/vtgate/tabletgateway.go @@ -20,7 +20,9 @@ import ( "context" "fmt" "math/rand/v2" + "net/http" "runtime/debug" + "slices" "sort" "sync" "sync/atomic" @@ -37,6 +39,7 @@ import ( "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/balancer" "vitess.io/vitess/go/vt/vtgate/buffer" "vitess.io/vitess/go/vt/vttablet/queryservice" @@ -54,6 +57,11 @@ var ( // retryCount is the number of times a query will be retried on error retryCount = 2 + // configuration flags for the tablet balancer + balancerEnabled bool + balancerVtgateCells []string + balancerKeyspaces []string + logCollations = logutil.NewThrottledLogger("CollationInconsistent", 1*time.Minute) ) @@ -62,6 +70,9 @@ func init() { fs.StringVar(&CellsToWatch, "cells_to_watch", "", "comma-separated list of cells for watching tablets") fs.DurationVar(&initialTabletTimeout, "gateway_initial_tablet_timeout", 30*time.Second, "At startup, the tabletGateway will wait up to this duration to get at least one tablet per keyspace/shard/tablet type") fs.IntVar(&retryCount, "retry-count", 2, "retry count") + fs.BoolVar(&balancerEnabled, "enable-balancer", false, "Enable the tablet balancer to evenly spread query load for a given tablet type") + fs.StringSliceVar(&balancerVtgateCells, "balancer-vtgate-cells", []string{}, "When in balanced mode, a comma-separated list of cells that contain vtgates (required)") + fs.StringSliceVar(&balancerKeyspaces, "balancer-keyspaces", []string{}, "When in balanced mode, a comma-separated list of keyspaces for which to use the balancer (optional)") }) } @@ -84,10 +95,17 @@ type TabletGateway struct { // buffer, if enabled, buffers requests during a detected PRIMARY failover. buffer *buffer.Buffer + + // balancer used for routing to tablets + balancer balancer.TabletBalancer } func createHealthCheck(ctx context.Context, retryDelay, timeout time.Duration, ts *topo.Server, cell, cellsToWatch string) discovery.HealthCheck { - return discovery.NewHealthCheck(ctx, retryDelay, timeout, ts, cell, cellsToWatch) + filters, err := discovery.NewVTGateHealthCheckFilters() + if err != nil { + log.Exit(err) + } + return discovery.NewHealthCheck(ctx, retryDelay, timeout, ts, cell, cellsToWatch, filters) } // NewTabletGateway creates and returns a new TabletGateway @@ -112,6 +130,9 @@ func NewTabletGateway(ctx context.Context, hc discovery.HealthCheck, serv srvtop statusAggregators: make(map[string]*TabletStatusAggregator), } gw.setupBuffering(ctx) + if balancerEnabled { + gw.setupBalancer(ctx) + } gw.QueryService = queryservice.Wrap(nil, gw.withRetry) return gw } @@ -145,6 +166,13 @@ func (gw *TabletGateway) setupBuffering(ctx context.Context) { }(bufferCtx, ksChan, gw.buffer) } +func (gw *TabletGateway) setupBalancer(ctx context.Context) { + if len(balancerVtgateCells) == 0 { + log.Exitf("balancer-vtgate-cells is required for balanced mode") + } + gw.balancer = balancer.NewTabletBalancer(gw.localCell, balancerVtgateCells) +} + // QueryServiceByAlias satisfies the Gateway interface func (gw *TabletGateway) QueryServiceByAlias(ctx context.Context, alias *topodatapb.TabletAlias, target *querypb.Target) (queryservice.QueryService, error) { qs, err := gw.hc.TabletConnection(ctx, alias, target) @@ -191,11 +219,24 @@ func (gw *TabletGateway) WaitForTablets(ctx context.Context, tabletTypesToWait [ } // Finds the targets to look for. - targets, err := srvtopo.FindAllTargets(ctx, gw.srvTopoServer, gw.localCell, discovery.KeyspacesToWatch, tabletTypesToWait) + targets, keyspaces, err := srvtopo.FindAllTargetsAndKeyspaces(ctx, gw.srvTopoServer, gw.localCell, discovery.KeyspacesToWatch, tabletTypesToWait) + if err != nil { + return err + } + err = gw.hc.WaitForAllServingTablets(ctx, targets) if err != nil { return err } - return gw.hc.WaitForAllServingTablets(ctx, targets) + // After having waited for all serving tablets. We should also wait for the keyspace event watcher to have seen + // the updates and marked all the keyspaces as consistent (if we want to wait for primary tablets). + // Otherwise, we could be in a situation where even though the healthchecks have arrived, the keyspace event watcher hasn't finished processing them. + // So, if a primary tablet goes non-serving (because of a PRS or some other reason), we won't be able to start buffering. + // Waiting for the keyspaces to become consistent ensures that all the primary tablets for all the shards should be serving as seen by the keyspace event watcher + // and any disruption from now on, will make sure we start buffering properly. + if topoproto.IsTypeInList(topodatapb.TabletType_PRIMARY, tabletTypesToWait) && gw.kev != nil { + return gw.kev.WaitForConsistentKeyspaces(ctx, keyspaces) + } + return nil } // Close shuts down underlying connections. @@ -220,6 +261,15 @@ func (gw *TabletGateway) CacheStatus() TabletCacheStatusList { return res } +func (gw *TabletGateway) DebugBalancerHandler(w http.ResponseWriter, r *http.Request) { + if balancerEnabled { + gw.balancer.DebugHandler(w, r) + } else { + w.Header().Set("Content-Type", "text/plain") + w.Write([]byte("not enabled")) + } +} + // withRetry gets available connections and executes the action. If there are retryable errors, // it retries retryCount times before failing. It does not retry if the connection is in // the middle of a transaction. While returning the error check if it maybe a result of @@ -282,18 +332,21 @@ func (gw *TabletGateway) withRetry(ctx context.Context, target *querypb.Target, if len(tablets) == 0 { // if we have a keyspace event watcher, check if the reason why our primary is not available is that it's currently being resharded // or if a reparent operation is in progress. - if kev := gw.kev; kev != nil { + // We only check for whether reshard is ongoing or primary is serving or not, only if the target is primary. We don't want to buffer + // replica queries, so it doesn't make any sense to check for resharding or reparenting in that case. + if kev := gw.kev; kev != nil && target.TabletType == topodatapb.TabletType_PRIMARY { if kev.TargetIsBeingResharded(ctx, target) { log.V(2).Infof("current keyspace is being resharded, retrying: %s: %s", target.Keyspace, debug.Stack()) err = vterrors.Errorf(vtrpcpb.Code_CLUSTER_EVENT, buffer.ClusterEventReshardingInProgress) continue } - primary, notServing := kev.PrimaryIsNotServing(ctx, target) - if notServing { + primary, shouldBuffer := kev.ShouldStartBufferingForTarget(ctx, target) + if shouldBuffer { err = vterrors.Errorf(vtrpcpb.Code_CLUSTER_EVENT, buffer.ClusterEventReparentInProgress) continue } - // if primary is serving, but we initially found no tablet, we're in an inconsistent state + // if the keyspace event manager doesn't think we should buffer queries, and also sees a primary tablet, + // but we initially found no tablet, we're in an inconsistent state // we then retry the entire loop if primary != nil { err = vterrors.Errorf(vtrpcpb.Code_UNAVAILABLE, "inconsistent state detected, primary is serving but initially found no available tablet") @@ -306,16 +359,35 @@ func (gw *TabletGateway) withRetry(ctx context.Context, target *querypb.Target, break } - gw.shuffleTablets(gw.localCell, tablets) - var th *discovery.TabletHealth - // skip tablets we tried before - for _, t := range tablets { - if _, ok := invalidTablets[topoproto.TabletAliasString(t.Tablet.Alias)]; !ok { - th = t - break + + useBalancer := balancerEnabled + if balancerEnabled && len(balancerKeyspaces) > 0 { + useBalancer = slices.Contains(balancerKeyspaces, target.Keyspace) + } + if useBalancer { + // filter out the tablets that we've tried before (if any), then pick the best one + if len(invalidTablets) > 0 { + tablets = slices.DeleteFunc(tablets, func(t *discovery.TabletHealth) bool { + _, isInvalid := invalidTablets[topoproto.TabletAliasString(t.Tablet.Alias)] + return isInvalid + }) + } + + th = gw.balancer.Pick(target, tablets) + + } else { + gw.shuffleTablets(gw.localCell, tablets) + + // skip tablets we tried before + for _, t := range tablets { + if _, ok := invalidTablets[topoproto.TabletAliasString(t.Tablet.Alias)]; !ok { + th = t + break + } } } + if th == nil { // do not override error from last attempt. if err == nil { diff --git a/go/vt/vtgate/tabletgateway_flaky_test.go b/go/vt/vtgate/tabletgateway_flaky_test.go index 21107c8d30e..e74f613b682 100644 --- a/go/vt/vtgate/tabletgateway_flaky_test.go +++ b/go/vt/vtgate/tabletgateway_flaky_test.go @@ -67,7 +67,7 @@ func TestGatewayBufferingWhenPrimarySwitchesServingState(t *testing.T) { waitForBuffering := func(enabled bool) { timer := time.NewTimer(bufferingWaitTimeout) defer timer.Stop() - for _, buffering := tg.kev.PrimaryIsNotServing(ctx, target); buffering != enabled; _, buffering = tg.kev.PrimaryIsNotServing(ctx, target) { + for _, buffering := tg.kev.ShouldStartBufferingForTarget(ctx, target); buffering != enabled; _, buffering = tg.kev.ShouldStartBufferingForTarget(ctx, target) { select { case <-timer.C: require.Fail(t, "timed out waiting for buffering of enabled: %t", enabled) @@ -213,8 +213,8 @@ func TestGatewayBufferingWhileReparenting(t *testing.T) { hc.Broadcast(primaryTablet) require.Len(t, tg.hc.GetHealthyTabletStats(target), 0, "GetHealthyTabletStats has tablets even though it shouldn't") - _, isNotServing := tg.kev.PrimaryIsNotServing(ctx, target) - require.True(t, isNotServing) + _, shouldStartBuffering := tg.kev.ShouldStartBufferingForTarget(ctx, target) + require.True(t, shouldStartBuffering) // add a result to the sandbox connection of the new primary sbcReplica.SetResults([]*sqltypes.Result{sqlResult1}) @@ -244,8 +244,8 @@ outer: case <-timeout: require.Fail(t, "timed out - could not verify the new primary") case <-time.After(10 * time.Millisecond): - newPrimary, notServing := tg.kev.PrimaryIsNotServing(ctx, target) - if newPrimary != nil && newPrimary.Uid == 1 && !notServing { + newPrimary, shouldBuffer := tg.kev.ShouldStartBufferingForTarget(ctx, target) + if newPrimary != nil && newPrimary.Uid == 1 && !shouldBuffer { break outer } } diff --git a/go/vt/vtgate/tabletgateway_test.go b/go/vt/vtgate/tabletgateway_test.go index 32d18dcc9ab..2aafb78af99 100644 --- a/go/vt/vtgate/tabletgateway_test.go +++ b/go/vt/vtgate/tabletgateway_test.go @@ -26,6 +26,7 @@ import ( "github.com/stretchr/testify/require" "vitess.io/vitess/go/test/utils" + "vitess.io/vitess/go/vt/vttablet/queryservice" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/discovery" @@ -34,6 +35,7 @@ import ( vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/sandboxconn" ) func TestTabletGatewayExecute(t *testing.T) { @@ -41,7 +43,10 @@ func TestTabletGatewayExecute(t *testing.T) { testTabletGatewayGeneric(t, ctx, func(ctx context.Context, tg *TabletGateway, target *querypb.Target) error { _, err := tg.Execute(ctx, target, "query", nil, 0, 0, nil) return err - }) + }, + func(t *testing.T, sc *sandboxconn.SandboxConn, want int64) { + assert.Equal(t, want, sc.ExecCount.Load()) + }) testTabletGatewayTransact(t, ctx, func(ctx context.Context, tg *TabletGateway, target *querypb.Target) error { _, err := tg.Execute(ctx, target, "query", nil, 1, 0, nil) return err @@ -55,7 +60,10 @@ func TestTabletGatewayExecuteStream(t *testing.T) { return nil }) return err - }) + }, + func(t *testing.T, sc *sandboxconn.SandboxConn, want int64) { + assert.Equal(t, want, sc.ExecCount.Load()) + }) } func TestTabletGatewayBegin(t *testing.T) { @@ -63,7 +71,10 @@ func TestTabletGatewayBegin(t *testing.T) { testTabletGatewayGeneric(t, ctx, func(ctx context.Context, tg *TabletGateway, target *querypb.Target) error { _, err := tg.Begin(ctx, target, nil) return err - }) + }, + func(t *testing.T, sc *sandboxconn.SandboxConn, want int64) { + assert.Equal(t, want, sc.BeginCount.Load()) + }) } func TestTabletGatewayCommit(t *testing.T) { @@ -87,7 +98,11 @@ func TestTabletGatewayBeginExecute(t *testing.T) { testTabletGatewayGeneric(t, ctx, func(ctx context.Context, tg *TabletGateway, target *querypb.Target) error { _, _, err := tg.BeginExecute(ctx, target, nil, "query", nil, 0, nil) return err - }) + }, + func(t *testing.T, sc *sandboxconn.SandboxConn, want int64) { + t.Helper() + assert.Equal(t, want, sc.BeginCount.Load()) + }) } func TestTabletGatewayShuffleTablets(t *testing.T) { @@ -177,7 +192,20 @@ func TestTabletGatewayReplicaTransactionError(t *testing.T) { verifyContainsError(t, err, "query service can only be used for non-transactional queries on replicas", vtrpcpb.Code_INTERNAL) } -func testTabletGatewayGeneric(t *testing.T, ctx context.Context, f func(ctx context.Context, tg *TabletGateway, target *querypb.Target) error) { +func testTabletGatewayGeneric(t *testing.T, ctx context.Context, f func(ctx context.Context, tg *TabletGateway, target *querypb.Target) error, verifyExpectedCount func(t *testing.T, sc *sandboxconn.SandboxConn, want int64)) { + t.Helper() + testTabletGatewayGenericHelper(t, ctx, f, verifyExpectedCount) + + // test again with the balancer enabled assuming vtgates in both cells where there + // are tablets, so that it will still route to the local cell always, but this way + // it will test both implementations of skipping invalid tablets for retry + balancerEnabled = true + balancerVtgateCells = []string{"cell", "cell2"} + testTabletGatewayGenericHelper(t, ctx, f, verifyExpectedCount) + balancerEnabled = false +} + +func testTabletGatewayGenericHelper(t *testing.T, ctx context.Context, f func(ctx context.Context, tg *TabletGateway, target *querypb.Target) error, verifyExpectedCount func(t *testing.T, sc *sandboxconn.SandboxConn, want int64)) { t.Helper() keyspace := "ks" shard := "0" @@ -193,7 +221,6 @@ func testTabletGatewayGeneric(t *testing.T, ctx context.Context, f func(ctx cont ts := &fakeTopoServer{} tg := NewTabletGateway(ctx, hc, ts, "cell") defer tg.Close(ctx) - // no tablet want := []string{"target: ks.0.replica", `no healthy tablet available for 'keyspace:"ks" shard:"0" tablet_type:REPLICA`} err := f(ctx, tg, target) @@ -217,31 +244,50 @@ func testTabletGatewayGeneric(t *testing.T, ctx context.Context, f func(ctx cont sc2 := hc.AddTestTablet("cell", host, port+1, keyspace, shard, tabletType, true, 10, nil) sc1.MustFailCodes[vtrpcpb.Code_FAILED_PRECONDITION] = 1 sc2.MustFailCodes[vtrpcpb.Code_FAILED_PRECONDITION] = 1 - err = f(ctx, tg, target) verifyContainsError(t, err, "target: ks.0.replica", vtrpcpb.Code_FAILED_PRECONDITION) + verifyExpectedCount(t, sc1, 1) + verifyExpectedCount(t, sc2, 1) // fatal error hc.Reset() sc1 = hc.AddTestTablet("cell", host, port, keyspace, shard, tabletType, true, 10, nil) - sc2 = hc.AddTestTablet("cell", host, port+1, keyspace, shard, tabletType, true, 10, nil) + sc2 = hc.AddTestTablet("cell2", host, port+1, keyspace, shard, tabletType, true, 10, nil) sc1.MustFailCodes[vtrpcpb.Code_FAILED_PRECONDITION] = 1 sc2.MustFailCodes[vtrpcpb.Code_FAILED_PRECONDITION] = 1 err = f(ctx, tg, target) verifyContainsError(t, err, "target: ks.0.replica", vtrpcpb.Code_FAILED_PRECONDITION) + verifyExpectedCount(t, sc1, 1) + verifyExpectedCount(t, sc2, 1) // server error - no retry hc.Reset() sc1 = hc.AddTestTablet("cell", host, port, keyspace, shard, tabletType, true, 10, nil) + sc2 = hc.AddTestTablet("cell2", host, port+1, keyspace, shard, tabletType, true, 10, nil) sc1.MustFailCodes[vtrpcpb.Code_INVALID_ARGUMENT] = 1 err = f(ctx, tg, target) assert.Equal(t, vtrpcpb.Code_INVALID_ARGUMENT, vterrors.Code(err)) + verifyExpectedCount(t, sc1, 1) + verifyExpectedCount(t, sc2, 0) // no failure hc.Reset() - hc.AddTestTablet("cell", host, port, keyspace, shard, tabletType, true, 10, nil) + sc1 = hc.AddTestTablet("cell", host, port, keyspace, shard, tabletType, true, 10, nil) + sc2 = hc.AddTestTablet("cell2", host, port, keyspace, shard, tabletType, true, 10, nil) + err = f(ctx, tg, target) + assert.NoError(t, err) + verifyExpectedCount(t, sc1, 0) + verifyExpectedCount(t, sc2, 1) + + // retry successful to other cell + hc.Reset() + sc1 = hc.AddTestTablet("cell", host, port, keyspace, shard, tabletType, true, 10, nil) + sc2 = hc.AddTestTablet("cell2", host, port+1, keyspace, shard, tabletType, true, 10, nil) + sc1.MustFailCodes[vtrpcpb.Code_FAILED_PRECONDITION] = 1 err = f(ctx, tg, target) assert.NoError(t, err) + verifyExpectedCount(t, sc1, 1) + verifyExpectedCount(t, sc2, 1) } func testTabletGatewayTransact(t *testing.T, ctx context.Context, f func(ctx context.Context, tg *TabletGateway, target *querypb.Target) error) { @@ -298,3 +344,58 @@ func verifyShardErrors(t *testing.T, err error, wantErrors []string, wantCode vt } require.Equal(t, vterrors.Code(err), wantCode, "wanted error code: %s, got: %v", wantCode, vterrors.Code(err)) } + +// TestWithRetry tests the functionality of withRetry function in different circumstances. +func TestWithRetry(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + tg := NewTabletGateway(ctx, discovery.NewFakeHealthCheck(nil), &fakeTopoServer{}, "cell") + tg.kev = discovery.NewKeyspaceEventWatcher(ctx, tg.srvTopoServer, tg.hc, tg.localCell) + defer func() { + cancel() + tg.Close(ctx) + }() + + testcases := []struct { + name string + target *querypb.Target + inTransaction bool + inner func(ctx context.Context, target *querypb.Target, conn queryservice.QueryService) (bool, error) + expectedErr string + }{ + { + name: "Transaction on a replica", + target: &querypb.Target{ + Keyspace: "ks", + Shard: "0", + TabletType: topodatapb.TabletType_REPLICA, + }, + inTransaction: true, + inner: func(ctx context.Context, target *querypb.Target, conn queryservice.QueryService) (bool, error) { + return false, nil + }, + expectedErr: "tabletGateway's query service can only be used for non-transactional queries on replicas", + }, { + name: "No replica tablets available", + target: &querypb.Target{ + Keyspace: "ks", + Shard: "0", + TabletType: topodatapb.TabletType_REPLICA, + }, + inTransaction: false, + inner: func(ctx context.Context, target *querypb.Target, conn queryservice.QueryService) (bool, error) { + return false, nil + }, + expectedErr: `target: ks.0.replica: no healthy tablet available for 'keyspace:"ks" shard:"0" tablet_type:REPLICA'`, + }, + } + for _, tt := range testcases { + t.Run(tt.name, func(t *testing.T) { + err := tg.withRetry(ctx, tt.target, nil, "", tt.inTransaction, tt.inner) + if tt.expectedErr == "" { + require.NoError(t, err) + } else { + require.ErrorContains(t, err, tt.expectedErr) + } + }) + } +} diff --git a/go/vt/vtgate/testdata/executor_vexplain.json b/go/vt/vtgate/testdata/executor_vexplain.json new file mode 100644 index 00000000000..5b70354f158 --- /dev/null +++ b/go/vt/vtgate/testdata/executor_vexplain.json @@ -0,0 +1,132 @@ +[ + { + "query": "select count(*), col2 from music group by col2", + "expected": { + "statementType": "SELECT", + "groupingColumns": [ + "music.col2" + ], + "selectColumns": [ + "music.col2" + ] + } + }, + { + "query": "select * from user u join user_extra ue on u.id = ue.user_id where u.col1 \u003e 100 and ue.noLimit = 'foo'", + "expected": { + "statementType": "SELECT", + "joinColumns": [ + "`user`.id =", + "user_extra.user_id =" + ], + "filterColumns": [ + "`user`.col1 gt", + "user_extra.noLimit =" + ] + } + }, + { + "query": "select * from user_extra ue, user u where ue.noLimit = 'foo' and u.col1 \u003e 100 and ue.user_id = u.id", + "expected": { + "statementType": "SELECT", + "joinColumns": [ + "`user`.id =", + "user_extra.user_id =" + ], + "filterColumns": [ + "`user`.col1 gt", + "user_extra.noLimit =" + ] + } + }, + { + "query": "select u.foo, ue.bar, count(*) from user u join user_extra ue on u.id = ue.user_id where u.name = 'John Doe' group by 1, 2", + "expected": { + "statementType": "SELECT", + "groupingColumns": [ + "`user`.foo", + "user_extra.bar" + ], + "joinColumns": [ + "`user`.id =", + "user_extra.user_id =" + ], + "filterColumns": [ + "`user`.`name` =" + ], + "selectColumns": [ + "`user`.foo", + "user_extra.bar" + ] + } + }, + { + "query": "select * from (select * from user) as derived where derived.amount \u003e 1000", + "expected": { + "statementType": "SELECT" + } + }, + { + "query": "select name, sum(amount) from user group by name", + "expected": { + "statementType": "SELECT", + "groupingColumns": [ + "`user`.`name`" + ], + "selectColumns": [ + "`user`.`name`", + "`user`.amount" + ] + } + }, + { + "query": "select name from user where age \u003e 30", + "expected": { + "statementType": "SELECT", + "filterColumns": [ + "`user`.age gt" + ], + "selectColumns": [ + "`user`.`name`" + ] + } + }, + { + "query": "select * from user where name = 'apa' union select * from user_extra where name = 'monkey'", + "expected": { + "statementType": "SELECT", + "filterColumns": [ + "`user`.`name` =", + "user_extra.`name` =" + ] + } + }, + { + "query": "update user set name = 'Jane Doe' where id = 1", + "expected": { + "statementType": "UPDATE", + "filterColumns": [ + "`user`.id =" + ] + } + }, + { + "query": "delete from user where order_date \u003c '2023-01-01'", + "expected": { + "statementType": "DELETE", + "filterColumns": [ + "`user`.order_date lt" + ] + } + }, + { + "query": "select * from user where name between 'A' and 'C'", + "expected": { + "statementType": "SELECT", + "filterColumns": [ + "`user`.`name` ge", + "`user`.`name` le" + ] + } + } +] \ No newline at end of file diff --git a/go/vt/vtgate/tx_conn.go b/go/vt/vtgate/tx_conn.go index 2eccdc54992..968b41d38d3 100644 --- a/go/vt/vtgate/tx_conn.go +++ b/go/vt/vtgate/tx_conn.go @@ -21,19 +21,19 @@ import ( "fmt" "strings" "sync" + "time" "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/dtids" "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet/queryservice" - querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/queryservice" ) // nonAtomicCommitWarnMaxShards limits the number of shard names reported in @@ -60,6 +60,16 @@ var txAccessModeToEOTxAccessMode = map[sqlparser.TxAccessMode]querypb.ExecuteOpt sqlparser.ReadOnly: querypb.ExecuteOptions_READ_ONLY, } +type commitPhase int + +const ( + Commit2pcCreateTransaction commitPhase = iota + Commit2pcPrepare + Commit2pcStartCommit + Commit2pcPrepareCommit + Commit2pcConclude +) + // Begin begins a new transaction. If one is already in progress, it commits it // and starts a new one. func (txc *TxConn) Begin(ctx context.Context, session *SafeSession, txAccessModes []sqlparser.TxAccessMode) error { @@ -98,12 +108,26 @@ func (txc *TxConn) Commit(ctx context.Context, session *SafeSession) error { twopc = txc.mode == vtgatepb.TransactionMode_TWOPC } + defer recordCommitTime(session, twopc, time.Now()) if twopc { return txc.commit2PC(ctx, session) } return txc.commitNormal(ctx, session) } +func recordCommitTime(session *SafeSession, twopc bool, startTime time.Time) { + switch { + case len(session.ShardSessions) == 0: + // No-op + case len(session.ShardSessions) == 1: + commitMode.Record("Single", startTime) + case twopc: + commitMode.Record("TwoPC", startTime) + default: + commitMode.Record("Multi", startTime) + } +} + func (txc *TxConn) queryService(ctx context.Context, alias *topodatapb.TabletAlias) (queryservice.QueryService, error) { if alias == nil { return txc.tabletGateway, nil @@ -177,56 +201,138 @@ func (txc *TxConn) commitNormal(ctx context.Context, session *SafeSession) error } // commit2PC will not used the pinned tablets - to make sure we use the current source, we need to use the gateway's queryservice -func (txc *TxConn) commit2PC(ctx context.Context, session *SafeSession) error { - if len(session.PreSessions) != 0 || len(session.PostSessions) != 0 { - _ = txc.Rollback(ctx, session) - return vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "pre or post actions not allowed for 2PC commits") - } - +func (txc *TxConn) commit2PC(ctx context.Context, session *SafeSession) (err error) { // If the number of participants is one or less, then it's a normal commit. if len(session.ShardSessions) <= 1 { return txc.commitNormal(ctx, session) } - participants := make([]*querypb.Target, 0, len(session.ShardSessions)-1) - for _, s := range session.ShardSessions[1:] { - participants = append(participants, s.Target) + if err := txc.checkValidCondition(session); err != nil { + _ = txc.Rollback(ctx, session) + return err } + mmShard := session.ShardSessions[0] + rmShards := session.ShardSessions[1:] dtid := dtids.New(mmShard) - err := txc.tabletGateway.CreateTransaction(ctx, mmShard.Target, dtid, participants) - if err != nil { - // Normal rollback is safe because nothing was prepared yet. - _ = txc.Rollback(ctx, session) + participants := make([]*querypb.Target, len(rmShards)) + for i, s := range rmShards { + participants[i] = s.Target + } + + var txPhase commitPhase + defer func() { + if err == nil { + return + } + txc.errActionAndLogWarn(ctx, session, txPhase, dtid, mmShard, rmShards) + }() + + txPhase = Commit2pcCreateTransaction + if err = txc.tabletGateway.CreateTransaction(ctx, mmShard.Target, dtid, participants); err != nil { return err } - err = txc.runSessions(ctx, session.ShardSessions[1:], session.logging, func(ctx context.Context, s *vtgatepb.Session_ShardSession, logging *executeLogger) error { - return txc.tabletGateway.Prepare(ctx, s.Target, s.TransactionId, dtid) - }) - if err != nil { - // TODO(sougou): Perform a more fine-grained cleanup - // including unprepared transactions. - if resumeErr := txc.Resolve(ctx, dtid); resumeErr != nil { - log.Warningf("Rollback failed after Prepare failure: %v", resumeErr) + if DebugTwoPc { // Test code to simulate a failure after RM prepare + if terr := checkTestFailure(ctx, "TRCreated_FailNow", nil); terr != nil { + return terr } - // Return the original error even if the previous operation fails. + } + + txPhase = Commit2pcPrepare + prepareAction := func(ctx context.Context, s *vtgatepb.Session_ShardSession, logging *executeLogger) error { + if DebugTwoPc { // Test code to simulate a failure during RM prepare + if terr := checkTestFailure(ctx, "RMPrepare_-40_FailNow", s.Target); terr != nil { + return terr + } + } + return txc.tabletGateway.Prepare(ctx, s.Target, s.TransactionId, dtid) + } + if err = txc.runSessions(ctx, rmShards, session.logging, prepareAction); err != nil { return err } + if DebugTwoPc { // Test code to simulate a failure after RM prepare + if terr := checkTestFailure(ctx, "RMPrepared_FailNow", nil); terr != nil { + return terr + } + } + + txPhase = Commit2pcStartCommit err = txc.tabletGateway.StartCommit(ctx, mmShard.Target, mmShard.TransactionId, dtid) if err != nil { return err } - err = txc.runSessions(ctx, session.ShardSessions[1:], session.logging, func(ctx context.Context, s *vtgatepb.Session_ShardSession, logging *executeLogger) error { + if DebugTwoPc { // Test code to simulate a failure after MM commit + if terr := checkTestFailure(ctx, "MMCommitted_FailNow", nil); terr != nil { + return terr + } + } + + txPhase = Commit2pcPrepareCommit + prepareCommitAction := func(ctx context.Context, s *vtgatepb.Session_ShardSession, logging *executeLogger) error { + if DebugTwoPc { // Test code to simulate a failure during RM prepare + if terr := checkTestFailure(ctx, "RMCommit_-40_FailNow", s.Target); terr != nil { + return terr + } + } return txc.tabletGateway.CommitPrepared(ctx, s.Target, dtid) - }) - if err != nil { + } + if err = txc.runSessions(ctx, rmShards, session.logging, prepareCommitAction); err != nil { return err } - return txc.tabletGateway.ConcludeTransaction(ctx, mmShard.Target, dtid) + // At this point, application can continue forward. + // The transaction is already committed. + // This step is to clean up the transaction metadata. + txPhase = Commit2pcConclude + _ = txc.tabletGateway.ConcludeTransaction(ctx, mmShard.Target, dtid) + return nil +} + +func (txc *TxConn) checkValidCondition(session *SafeSession) error { + if len(session.PreSessions) != 0 || len(session.PostSessions) != 0 { + return vterrors.VT12001("atomic distributed transaction commit with consistent lookup vindex") + } + return nil +} + +func (txc *TxConn) errActionAndLogWarn(ctx context.Context, session *SafeSession, txPhase commitPhase, dtid string, mmShard *vtgatepb.Session_ShardSession, rmShards []*vtgatepb.Session_ShardSession) { + switch txPhase { + case Commit2pcCreateTransaction: + // Normal rollback is safe because nothing was prepared yet. + if rollbackErr := txc.Rollback(ctx, session); rollbackErr != nil { + log.Warningf("Rollback failed after Create Transaction failure: %v", rollbackErr) + } + case Commit2pcPrepare: + // Rollback the prepared and unprepared transactions. + if resumeErr := txc.rollbackTx(ctx, dtid, mmShard, rmShards, session.logging); resumeErr != nil { + log.Warningf("Rollback failed after Prepare failure: %v", resumeErr) + } + case Commit2pcStartCommit, Commit2pcPrepareCommit: + commitUnresolved.Add(1) + } + session.RecordWarning(&querypb.QueryWarning{ + Code: uint32(sqlerror.ERInAtomicRecovery), + Message: createWarningMessage(dtid, txPhase)}) +} + +func createWarningMessage(dtid string, txPhase commitPhase) string { + warningMsg := fmt.Sprintf("%s distributed transaction ID failed during", dtid) + switch txPhase { + case Commit2pcCreateTransaction: + warningMsg += " transaction record creation; rollback attempted; conclude on recovery" + case Commit2pcPrepare: + warningMsg += " transaction prepare phase; prepare transaction rollback attempted; conclude on recovery" + case Commit2pcStartCommit: + warningMsg += " metadata manager commit; transaction will be committed/rollbacked based on the state on recovery" + case Commit2pcPrepareCommit: + warningMsg += " resource manager commit; transaction will be committed on recovery" + case Commit2pcConclude: + warningMsg += " transaction conclusion" + } + return warningMsg } // Rollback rolls back the current transaction. There are no retries on this operation. @@ -343,48 +449,85 @@ func (txc *TxConn) ReleaseAll(ctx context.Context, session *SafeSession) error { }) } -// Resolve resolves the specified 2PC transaction. -func (txc *TxConn) Resolve(ctx context.Context, dtid string) error { - mmShard, err := dtids.ShardSession(dtid) +// ResolveTransactions fetches all unresolved transactions and resolves them. +func (txc *TxConn) ResolveTransactions(ctx context.Context, target *querypb.Target) error { + transactions, err := txc.tabletGateway.UnresolvedTransactions(ctx, target, 0 /* abandonAgeSeconds */) if err != nil { return err } - transaction, err := txc.tabletGateway.ReadTransaction(ctx, mmShard.Target, dtid) - if err != nil { - return err + failedResolution := 0 + for _, txRecord := range transactions { + log.Infof("Resolving transaction ID: %s", txRecord.Dtid) + err = txc.resolveTx(ctx, target, txRecord) + if err != nil { + failedResolution++ + log.Errorf("Failed to resolve transaction ID: %s with error: %v", txRecord.Dtid, err) + } } - if transaction == nil || transaction.Dtid == "" { - // It was already resolved. + if failedResolution == 0 { return nil } + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "failed to resolve %d out of %d transactions", failedResolution, len(transactions)) +} + +// resolveTx resolves the specified distributed transaction. +func (txc *TxConn) resolveTx(ctx context.Context, target *querypb.Target, transaction *querypb.TransactionMetadata) error { + mmShard, err := dtids.ShardSession(transaction.Dtid) + if err != nil { + return err + } + switch transaction.State { case querypb.TransactionState_PREPARE: // If state is PREPARE, make a decision to rollback and // fallthrough to the rollback workflow. - qs, err := txc.queryService(ctx, mmShard.TabletAlias) - if err != nil { - return err - } - if err := qs.SetRollback(ctx, mmShard.Target, transaction.Dtid, mmShard.TransactionId); err != nil { + if err = txc.tabletGateway.SetRollback(ctx, target, transaction.Dtid, mmShard.TransactionId); err != nil { return err } fallthrough case querypb.TransactionState_ROLLBACK: - if err := txc.resumeRollback(ctx, mmShard.Target, transaction); err != nil { + if err = txc.resumeRollback(ctx, target, transaction); err != nil { return err } case querypb.TransactionState_COMMIT: - if err := txc.resumeCommit(ctx, mmShard.Target, transaction); err != nil { + if err = txc.resumeCommit(ctx, target, transaction); err != nil { return err } default: // Should never happen. - return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "invalid state: %v", transaction.State) + return vterrors.VT13001(fmt.Sprintf("invalid state: %v", transaction.State)) } return nil } +// rollbackTx rollbacks the specified distributed transaction. +// Rollbacks happens on the metadata manager and all participants irrespective of the failure. +func (txc *TxConn) rollbackTx(ctx context.Context, dtid string, mmShard *vtgatepb.Session_ShardSession, participants []*vtgatepb.Session_ShardSession, logging *executeLogger) error { + var errs []error + if mmErr := txc.rollbackMM(ctx, dtid, mmShard); mmErr != nil { + errs = append(errs, mmErr) + } + if rmErr := txc.runSessions(ctx, participants, logging, func(ctx context.Context, session *vtgatepb.Session_ShardSession, logger *executeLogger) error { + return txc.tabletGateway.RollbackPrepared(ctx, session.Target, dtid, session.TransactionId) + }); rmErr != nil { + errs = append(errs, rmErr) + } + if err := vterrors.Aggregate(errs); err != nil { + return err + } + return txc.tabletGateway.ConcludeTransaction(ctx, mmShard.Target, dtid) + +} + +func (txc *TxConn) rollbackMM(ctx context.Context, dtid string, mmShard *vtgatepb.Session_ShardSession) error { + qs, err := txc.queryService(ctx, mmShard.TabletAlias) + if err != nil { + return err + } + return qs.SetRollback(ctx, mmShard.Target, dtid, mmShard.TransactionId) +} + func (txc *TxConn) resumeRollback(ctx context.Context, target *querypb.Target, transaction *querypb.TransactionMetadata) error { err := txc.runTargets(transaction.Participants, func(t *querypb.Target) error { return txc.tabletGateway.RollbackPrepared(ctx, t, transaction.Dtid, 0) @@ -447,3 +590,27 @@ func (txc *TxConn) runTargets(targets []*querypb.Target, action func(*querypb.Ta wg.Wait() return allErrors.AggrError(vterrors.Aggregate) } + +func (txc *TxConn) ReadTransaction(ctx context.Context, transactionID string) (*querypb.TransactionMetadata, error) { + mmShard, err := dtids.ShardSession(transactionID) + if err != nil { + return nil, err + } + return txc.tabletGateway.ReadTransaction(ctx, mmShard.Target, transactionID) +} + +func (txc *TxConn) UnresolvedTransactions(ctx context.Context, targets []*querypb.Target) ([]*querypb.TransactionMetadata, error) { + var tmList []*querypb.TransactionMetadata + var mu sync.Mutex + err := txc.runTargets(targets, func(target *querypb.Target) error { + res, err := txc.tabletGateway.UnresolvedTransactions(ctx, target, 0 /* abandonAgeSeconds */) + if err != nil { + return err + } + mu.Lock() + defer mu.Unlock() + tmList = append(tmList, res...) + return nil + }) + return tmList, err +} diff --git a/go/vt/vtgate/tx_conn_test.go b/go/vt/vtgate/tx_conn_test.go index 4d77ea16c92..dd1415bce87 100644 --- a/go/vt/vtgate/tx_conn_test.go +++ b/go/vt/vtgate/tx_conn_test.go @@ -20,25 +20,24 @@ import ( "context" "fmt" "strconv" + "strings" "testing" "github.com/stretchr/testify/assert" - - "vitess.io/vitess/go/test/utils" - "github.com/stretchr/testify/require" + "vitess.io/vitess/go/event/syslogger" "vitess.io/vitess/go/mysql/sqlerror" + "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/key" - "vitess.io/vitess/go/vt/srvtopo" - "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet/sandboxconn" - querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtgatepb "vitess.io/vitess/go/vt/proto/vtgate" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/srvtopo" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/sandboxconn" ) var queries = []*querypb.BoundQuery{{Sql: "query1"}} @@ -57,7 +56,7 @@ func TestTxConnBegin(t *testing.T) { require.NoError(t, err) wantSession := vtgatepb.Session{InTransaction: true} utils.MustMatch(t, &wantSession, session, "Session") - _, errors := sc.ExecuteMultiShard(ctx, nil, rss0, queries, safeSession, false, false) + _, errors := sc.ExecuteMultiShard(ctx, nil, rss0, queries, safeSession, false, false, nullResultsObserver{}) require.Empty(t, errors) // Begin again should cause a commit and a new begin. @@ -77,7 +76,7 @@ func TestTxConnCommitFailure(t *testing.T) { // Sequence the executes to ensure commit order session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rssm[0], queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rssm[0], queries, session, false, false, nullResultsObserver{}) wantSession := vtgatepb.Session{ InTransaction: true, ShardSessions: []*vtgatepb.Session_ShardSession{{ @@ -92,7 +91,7 @@ func TestTxConnCommitFailure(t *testing.T) { } utils.MustMatch(t, &wantSession, session.Session, "Session") - sc.ExecuteMultiShard(ctx, nil, rssm[1], queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rssm[1], queries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, ShardSessions: []*vtgatepb.Session_ShardSession{{ @@ -115,7 +114,7 @@ func TestTxConnCommitFailure(t *testing.T) { } utils.MustMatch(t, &wantSession, session.Session, "Session") - sc.ExecuteMultiShard(ctx, nil, rssa, threeQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rssa, threeQueries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, ShardSessions: []*vtgatepb.Session_ShardSession{{ @@ -184,7 +183,7 @@ func TestTxConnCommitFailureAfterNonAtomicCommitMaxShards(t *testing.T) { } for i := 0; i < 18; i++ { - sc.ExecuteMultiShard(ctx, nil, rssm[i], queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rssm[i], queries, session, false, false, nullResultsObserver{}) wantSession.ShardSessions = append(wantSession.ShardSessions, &vtgatepb.Session_ShardSession{ Target: &querypb.Target{ Keyspace: "TestTxConn", @@ -238,7 +237,7 @@ func TestTxConnCommitFailureBeforeNonAtomicCommitMaxShards(t *testing.T) { } for i := 0; i < 17; i++ { - sc.ExecuteMultiShard(ctx, nil, rssm[i], queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rssm[i], queries, session, false, false, nullResultsObserver{}) wantSession.ShardSessions = append(wantSession.ShardSessions, &vtgatepb.Session_ShardSession{ Target: &querypb.Target{ Keyspace: "TestTxConn", @@ -284,7 +283,7 @@ func TestTxConnCommitSuccess(t *testing.T) { // Sequence the executes to ensure commit order session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) wantSession := vtgatepb.Session{ InTransaction: true, ShardSessions: []*vtgatepb.Session_ShardSession{{ @@ -298,7 +297,7 @@ func TestTxConnCommitSuccess(t *testing.T) { }}, } utils.MustMatch(t, &wantSession, session.Session, "Session") - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, ShardSessions: []*vtgatepb.Session_ShardSession{{ @@ -337,7 +336,7 @@ func TestTxConnReservedCommitSuccess(t *testing.T) { // Sequence the executes to ensure commit order session := NewSafeSession(&vtgatepb.Session{InTransaction: true, InReservedConn: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) wantSession := vtgatepb.Session{ InTransaction: true, InReservedConn: true, @@ -353,7 +352,7 @@ func TestTxConnReservedCommitSuccess(t *testing.T) { }}, } utils.MustMatch(t, &wantSession, session.Session, "Session") - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, InReservedConn: true, @@ -424,9 +423,9 @@ func TestTxConnReservedOn2ShardTxOn1ShardAndCommit(t *testing.T) { session := NewSafeSession(&vtgatepb.Session{InReservedConn: true}) // this will create reserved connections against all tablets - _, errs := sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + _, errs := sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) require.Empty(t, errs) - _, errs = sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + _, errs = sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) require.Empty(t, errs) wantSession := vtgatepb.Session{ @@ -454,7 +453,7 @@ func TestTxConnReservedOn2ShardTxOn1ShardAndCommit(t *testing.T) { session.Session.InTransaction = true // start a transaction against rss0 - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, InReservedConn: true, @@ -519,9 +518,9 @@ func TestTxConnReservedOn2ShardTxOn1ShardAndRollback(t *testing.T) { session := NewSafeSession(&vtgatepb.Session{InReservedConn: true}) // this will create reserved connections against all tablets - _, errs := sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + _, errs := sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) require.Empty(t, errs) - _, errs = sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + _, errs = sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) require.Empty(t, errs) wantSession := vtgatepb.Session{ @@ -549,7 +548,7 @@ func TestTxConnReservedOn2ShardTxOn1ShardAndRollback(t *testing.T) { session.Session.InTransaction = true // start a transaction against rss0 - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, InReservedConn: true, @@ -613,13 +612,13 @@ func TestTxConnCommitOrderFailure1(t *testing.T) { // Sequence the executes to ensure commit order session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) session.SetCommitOrder(vtgatepb.CommitOrder_PRE) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) session.SetCommitOrder(vtgatepb.CommitOrder_POST) - sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) sbc0.MustFailCodes[vtrpcpb.Code_INVALID_ARGUMENT] = 1 err := sc.txConn.Commit(ctx, session) @@ -648,13 +647,13 @@ func TestTxConnCommitOrderFailure2(t *testing.T) { // Sequence the executes to ensure commit order session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(context.Background(), nil, rss1, queries, session, false, false) + sc.ExecuteMultiShard(context.Background(), nil, rss1, queries, session, false, false, nullResultsObserver{}) session.SetCommitOrder(vtgatepb.CommitOrder_PRE) - sc.ExecuteMultiShard(context.Background(), nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(context.Background(), nil, rss0, queries, session, false, false, nullResultsObserver{}) session.SetCommitOrder(vtgatepb.CommitOrder_POST) - sc.ExecuteMultiShard(context.Background(), nil, rss1, queries, session, false, false) + sc.ExecuteMultiShard(context.Background(), nil, rss1, queries, session, false, false, nullResultsObserver{}) sbc1.MustFailCodes[vtrpcpb.Code_INVALID_ARGUMENT] = 1 err := sc.txConn.Commit(ctx, session) @@ -682,13 +681,13 @@ func TestTxConnCommitOrderFailure3(t *testing.T) { // Sequence the executes to ensure commit order session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) session.SetCommitOrder(vtgatepb.CommitOrder_PRE) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) session.SetCommitOrder(vtgatepb.CommitOrder_POST) - sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) sbc1.MustFailCodes[vtrpcpb.Code_INVALID_ARGUMENT] = 1 require.NoError(t, @@ -724,7 +723,7 @@ func TestTxConnCommitOrderSuccess(t *testing.T) { // Sequence the executes to ensure commit order session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) wantSession := vtgatepb.Session{ InTransaction: true, ShardSessions: []*vtgatepb.Session_ShardSession{{ @@ -740,7 +739,7 @@ func TestTxConnCommitOrderSuccess(t *testing.T) { utils.MustMatch(t, &wantSession, session.Session, "Session") session.SetCommitOrder(vtgatepb.CommitOrder_PRE) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, PreSessions: []*vtgatepb.Session_ShardSession{{ @@ -765,7 +764,7 @@ func TestTxConnCommitOrderSuccess(t *testing.T) { utils.MustMatch(t, &wantSession, session.Session, "Session") session.SetCommitOrder(vtgatepb.CommitOrder_POST) - sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, PreSessions: []*vtgatepb.Session_ShardSession{{ @@ -799,7 +798,7 @@ func TestTxConnCommitOrderSuccess(t *testing.T) { utils.MustMatch(t, &wantSession, session.Session, "Session") // Ensure nothing changes if we reuse a transaction. - sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) utils.MustMatch(t, &wantSession, session.Session, "Session") require.NoError(t, @@ -822,7 +821,7 @@ func TestTxConnReservedCommitOrderSuccess(t *testing.T) { // Sequence the executes to ensure commit order session := NewSafeSession(&vtgatepb.Session{InTransaction: true, InReservedConn: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) wantSession := vtgatepb.Session{ InTransaction: true, InReservedConn: true, @@ -840,7 +839,7 @@ func TestTxConnReservedCommitOrderSuccess(t *testing.T) { utils.MustMatch(t, &wantSession, session.Session, "Session") session.SetCommitOrder(vtgatepb.CommitOrder_PRE) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, InReservedConn: true, @@ -868,7 +867,7 @@ func TestTxConnReservedCommitOrderSuccess(t *testing.T) { utils.MustMatch(t, &wantSession, session.Session, "Session") session.SetCommitOrder(vtgatepb.CommitOrder_POST) - sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) wantSession = vtgatepb.Session{ InTransaction: true, InReservedConn: true, @@ -906,7 +905,7 @@ func TestTxConnReservedCommitOrderSuccess(t *testing.T) { utils.MustMatch(t, &wantSession, session.Session, "Session") // Ensure nothing changes if we reuse a transaction. - sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) utils.MustMatch(t, &wantSession, session.Session, "Session") require.NoError(t, @@ -959,8 +958,8 @@ func TestTxConnCommit2PC(t *testing.T) { sc, sbc0, sbc1, rss0, _, rss01 := newTestTxConnEnv(t, ctx, "TestTxConnCommit2PC") session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) session.TransactionMode = vtgatepb.TransactionMode_TWOPC require.NoError(t, sc.txConn.Commit(ctx, session)) @@ -976,7 +975,7 @@ func TestTxConnCommit2PCOneParticipant(t *testing.T) { sc, sbc0, _, rss0, _, _ := newTestTxConnEnv(t, ctx, "TestTxConnCommit2PCOneParticipant") session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) session.TransactionMode = vtgatepb.TransactionMode_TWOPC require.NoError(t, sc.txConn.Commit(ctx, session)) @@ -989,8 +988,8 @@ func TestTxConnCommit2PCCreateTransactionFail(t *testing.T) { sc, sbc0, sbc1, rss0, rss1, _ := newTestTxConnEnv(t, ctx, "TestTxConnCommit2PCCreateTransactionFail") session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) - sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) + sc.ExecuteMultiShard(ctx, nil, rss1, queries, session, false, false, nullResultsObserver{}) sbc0.MustFailCreateTransaction = 1 session.TransactionMode = vtgatepb.TransactionMode_TWOPC @@ -1013,8 +1012,8 @@ func TestTxConnCommit2PCPrepareFail(t *testing.T) { sc, sbc0, sbc1, rss0, _, rss01 := newTestTxConnEnv(t, ctx, "TestTxConnCommit2PCPrepareFail") session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) sbc1.MustFailPrepare = 1 session.TransactionMode = vtgatepb.TransactionMode_TWOPC @@ -1024,9 +1023,15 @@ func TestTxConnCommit2PCPrepareFail(t *testing.T) { assert.Contains(t, err.Error(), want, "Commit") assert.EqualValues(t, 1, sbc0.CreateTransactionCount.Load(), "sbc0.CreateTransactionCount") assert.EqualValues(t, 1, sbc1.PrepareCount.Load(), "sbc1.PrepareCount") + // Prepared failed on RM, so no commit on MM or RMs. assert.EqualValues(t, 0, sbc0.StartCommitCount.Load(), "sbc0.StartCommitCount") assert.EqualValues(t, 0, sbc1.CommitPreparedCount.Load(), "sbc1.CommitPreparedCount") - assert.EqualValues(t, 0, sbc0.ConcludeTransactionCount.Load(), "sbc0.ConcludeTransactionCount") + // rollback original transaction on MM + assert.EqualValues(t, 1, sbc0.SetRollbackCount.Load(), "sbc0.SetRollbackCount") + // rollback prepare transaction on RM + assert.EqualValues(t, 1, sbc1.RollbackPreparedCount.Load(), "sbc1.RollbackPreparedCount") + // conclude the transaction. + assert.EqualValues(t, 1, sbc0.ConcludeTransactionCount.Load(), "sbc0.ConcludeTransactionCount") } func TestTxConnCommit2PCStartCommitFail(t *testing.T) { @@ -1035,8 +1040,8 @@ func TestTxConnCommit2PCStartCommitFail(t *testing.T) { sc, sbc0, sbc1, rss0, _, rss01 := newTestTxConnEnv(t, ctx, "TestTxConnCommit2PCStartCommitFail") session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) sbc0.MustFailStartCommit = 1 session.TransactionMode = vtgatepb.TransactionMode_TWOPC @@ -1057,8 +1062,8 @@ func TestTxConnCommit2PCCommitPreparedFail(t *testing.T) { sc, sbc0, sbc1, rss0, _, rss01 := newTestTxConnEnv(t, ctx, "TestTxConnCommit2PCCommitPreparedFail") session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) sbc1.MustFailCommitPrepared = 1 session.TransactionMode = vtgatepb.TransactionMode_TWOPC @@ -1079,15 +1084,13 @@ func TestTxConnCommit2PCConcludeTransactionFail(t *testing.T) { sc, sbc0, sbc1, rss0, _, rss01 := newTestTxConnEnv(t, ctx, "TestTxConnCommit2PCConcludeTransactionFail") session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) sbc0.MustFailConcludeTransaction = 1 session.TransactionMode = vtgatepb.TransactionMode_TWOPC err := sc.txConn.Commit(ctx, session) - want := "error: err" - require.Error(t, err) - assert.Contains(t, err.Error(), want, "Commit") + require.NoError(t, err) // ConcludeTransaction is best-effort as it does not impact the outcome. assert.EqualValues(t, 1, sbc0.CreateTransactionCount.Load(), "sbc0.CreateTransactionCount") assert.EqualValues(t, 1, sbc1.PrepareCount.Load(), "sbc1.PrepareCount") assert.EqualValues(t, 1, sbc0.StartCommitCount.Load(), "sbc0.StartCommitCount") @@ -1101,8 +1104,8 @@ func TestTxConnRollback(t *testing.T) { sc, sbc0, sbc1, rss0, _, rss01 := newTestTxConnEnv(t, ctx, "TxConnRollback") session := NewSafeSession(&vtgatepb.Session{InTransaction: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) require.NoError(t, sc.txConn.Rollback(ctx, session)) wantSession := vtgatepb.Session{} @@ -1117,8 +1120,8 @@ func TestTxConnReservedRollback(t *testing.T) { sc, sbc0, sbc1, rss0, _, rss01 := newTestTxConnEnv(t, ctx, "TxConnReservedRollback") session := NewSafeSession(&vtgatepb.Session{InTransaction: true, InReservedConn: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) require.NoError(t, sc.txConn.Rollback(ctx, session)) wantSession := vtgatepb.Session{ @@ -1154,8 +1157,8 @@ func TestTxConnReservedRollbackFailure(t *testing.T) { sc, sbc0, sbc1, rss0, rss1, rss01 := newTestTxConnEnv(t, ctx, "TxConnReservedRollback") session := NewSafeSession(&vtgatepb.Session{InTransaction: true, InReservedConn: true}) - sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false) - sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false) + sc.ExecuteMultiShard(ctx, nil, rss0, queries, session, false, false, nullResultsObserver{}) + sc.ExecuteMultiShard(ctx, nil, rss01, twoQueries, session, false, false, nullResultsObserver{}) sbc1.MustFailCodes[vtrpcpb.Code_INVALID_ARGUMENT] = 1 assert.Error(t, @@ -1179,14 +1182,21 @@ func TestTxConnReservedRollbackFailure(t *testing.T) { assert.EqualValues(t, 1, sbc1.ReleaseCount.Load(), "sbc1.ReleaseCount") } +func getMMTarget() *querypb.Target { + return &querypb.Target{ + Keyspace: "TestTxConn", + Shard: "0", + TabletType: topodatapb.TabletType_PRIMARY, + } +} + func TestTxConnResolveOnPrepare(t *testing.T) { ctx := utils.LeakCheckContext(t) sc, sbc0, sbc1, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - dtid := "TestTxConn:0:1234" - sbc0.ReadTransactionResults = []*querypb.TransactionMetadata{{ - Dtid: dtid, + sbc0.UnresolvedTransactionsResult = []*querypb.TransactionMetadata{{ + Dtid: "TestTxConn:0:1234", State: querypb.TransactionState_PREPARE, Participants: []*querypb.Target{{ Keyspace: "TestTxConn", @@ -1194,8 +1204,9 @@ func TestTxConnResolveOnPrepare(t *testing.T) { TabletType: topodatapb.TabletType_PRIMARY, }}, }} - err := sc.txConn.Resolve(ctx, dtid) + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) require.NoError(t, err) + assert.EqualValues(t, 1, sbc0.UnresolvedTransactionsCount.Load(), "sbc0.UnresolvedTransactionsCount") assert.EqualValues(t, 1, sbc0.SetRollbackCount.Load(), "sbc0.SetRollbackCount") assert.EqualValues(t, 1, sbc1.RollbackPreparedCount.Load(), "sbc1.RollbackPreparedCount") assert.EqualValues(t, 0, sbc1.CommitPreparedCount.Load(), "sbc1.CommitPreparedCount") @@ -1207,9 +1218,8 @@ func TestTxConnResolveOnRollback(t *testing.T) { sc, sbc0, sbc1, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - dtid := "TestTxConn:0:1234" - sbc0.ReadTransactionResults = []*querypb.TransactionMetadata{{ - Dtid: dtid, + sbc0.UnresolvedTransactionsResult = []*querypb.TransactionMetadata{{ + Dtid: "TestTxConn:0:1234", State: querypb.TransactionState_ROLLBACK, Participants: []*querypb.Target{{ Keyspace: "TestTxConn", @@ -1217,8 +1227,9 @@ func TestTxConnResolveOnRollback(t *testing.T) { TabletType: topodatapb.TabletType_PRIMARY, }}, }} - require.NoError(t, - sc.txConn.Resolve(ctx, dtid)) + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) + require.NoError(t, err) + assert.EqualValues(t, 1, sbc0.UnresolvedTransactionsCount.Load(), "sbc0.UnresolvedTransactionsCount") assert.EqualValues(t, 0, sbc0.SetRollbackCount.Load(), "sbc0.SetRollbackCount") assert.EqualValues(t, 1, sbc1.RollbackPreparedCount.Load(), "sbc1.RollbackPreparedCount") assert.EqualValues(t, 0, sbc1.CommitPreparedCount.Load(), "sbc1.CommitPreparedCount") @@ -1230,9 +1241,8 @@ func TestTxConnResolveOnCommit(t *testing.T) { sc, sbc0, sbc1, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - dtid := "TestTxConn:0:1234" - sbc0.ReadTransactionResults = []*querypb.TransactionMetadata{{ - Dtid: dtid, + sbc0.UnresolvedTransactionsResult = []*querypb.TransactionMetadata{{ + Dtid: "TestTxConn:0:1234", State: querypb.TransactionState_COMMIT, Participants: []*querypb.Target{{ Keyspace: "TestTxConn", @@ -1240,35 +1250,45 @@ func TestTxConnResolveOnCommit(t *testing.T) { TabletType: topodatapb.TabletType_PRIMARY, }}, }} - require.NoError(t, - sc.txConn.Resolve(ctx, dtid)) + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) + require.NoError(t, err) + assert.EqualValues(t, 1, sbc0.UnresolvedTransactionsCount.Load(), "sbc0.UnresolvedTransactionsCount") assert.EqualValues(t, 0, sbc0.SetRollbackCount.Load(), "sbc0.SetRollbackCount") assert.EqualValues(t, 0, sbc1.RollbackPreparedCount.Load(), "sbc1.RollbackPreparedCount") assert.EqualValues(t, 1, sbc1.CommitPreparedCount.Load(), "sbc1.CommitPreparedCount") assert.EqualValues(t, 1, sbc0.ConcludeTransactionCount.Load(), "sbc0.ConcludeTransactionCount") } -func TestTxConnResolveInvalidDTID(t *testing.T) { +func TestTxConnUnresolvedTransactionsFail(t *testing.T) { ctx := utils.LeakCheckContext(t) - sc, _, _, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") + sc, sbc0, _, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - err := sc.txConn.Resolve(ctx, "abcd") - want := "invalid parts in dtid: abcd" - require.EqualError(t, err, want, "Resolve") + sbc0.MustFailCodes[vtrpcpb.Code_INVALID_ARGUMENT] = 1 + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) + require.ErrorContains(t, err, "target: TestTxConn.0.primary: INVALID_ARGUMENT error") } -func TestTxConnResolveReadTransactionFail(t *testing.T) { +func TestTxConnResolveInvalidDTID(t *testing.T) { ctx := utils.LeakCheckContext(t) sc, sbc0, _, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - dtid := "TestTxConn:0:1234" - sbc0.MustFailCodes[vtrpcpb.Code_INVALID_ARGUMENT] = 1 - err := sc.txConn.Resolve(ctx, dtid) - want := "INVALID_ARGUMENT error" - require.Error(t, err) - assert.Contains(t, err.Error(), want, "Resolve") + tl := syslogger.NewTestLogger() + defer tl.Close() + + sbc0.UnresolvedTransactionsResult = []*querypb.TransactionMetadata{{ + Dtid: "abcd", + State: querypb.TransactionState_COMMIT, + Participants: []*querypb.Target{{ + Keyspace: "TestTxConn", + Shard: "1", + TabletType: topodatapb.TabletType_PRIMARY, + }}, + }} + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) + require.ErrorContains(t, err, "failed to resolve 1 out of 1 transactions") + require.Contains(t, strings.Join(tl.GetAllLogs(), "|"), "invalid parts in dtid: abcd") } func TestTxConnResolveInternalError(t *testing.T) { @@ -1276,9 +1296,11 @@ func TestTxConnResolveInternalError(t *testing.T) { sc, sbc0, _, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - dtid := "TestTxConn:0:1234" - sbc0.ReadTransactionResults = []*querypb.TransactionMetadata{{ - Dtid: dtid, + tl := syslogger.NewTestLogger() + defer tl.Close() + + sbc0.UnresolvedTransactionsResult = []*querypb.TransactionMetadata{{ + Dtid: "TestTxConn:0:1234", State: querypb.TransactionState_UNKNOWN, Participants: []*querypb.Target{{ Keyspace: "TestTxConn", @@ -1286,10 +1308,9 @@ func TestTxConnResolveInternalError(t *testing.T) { TabletType: topodatapb.TabletType_PRIMARY, }}, }} - err := sc.txConn.Resolve(ctx, dtid) - want := "invalid state: UNKNOWN" - require.Error(t, err) - assert.Contains(t, err.Error(), want, "Resolve") + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) + require.ErrorContains(t, err, "failed to resolve 1 out of 1 transactions") + require.Contains(t, strings.Join(tl.GetAllLogs(), "|"), "invalid state: UNKNOWN") } func TestTxConnResolveSetRollbackFail(t *testing.T) { @@ -1297,9 +1318,11 @@ func TestTxConnResolveSetRollbackFail(t *testing.T) { sc, sbc0, sbc1, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - dtid := "TestTxConn:0:1234" - sbc0.ReadTransactionResults = []*querypb.TransactionMetadata{{ - Dtid: dtid, + tl := syslogger.NewTestLogger() + defer tl.Close() + + sbc0.UnresolvedTransactionsResult = []*querypb.TransactionMetadata{{ + Dtid: "TestTxConn:0:1234", State: querypb.TransactionState_PREPARE, Participants: []*querypb.Target{{ Keyspace: "TestTxConn", @@ -1308,10 +1331,11 @@ func TestTxConnResolveSetRollbackFail(t *testing.T) { }}, }} sbc0.MustFailSetRollback = 1 - err := sc.txConn.Resolve(ctx, dtid) - want := "error: err" - require.Error(t, err) - assert.Contains(t, err.Error(), want, "Resolve") + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) + require.ErrorContains(t, err, "failed to resolve 1 out of 1 transactions") + require.Contains(t, strings.Join(tl.GetAllLogs(), "|"), "error: err") + assert.EqualValues(t, 1, sbc0.UnresolvedTransactionsCount.Load(), "sbc0.UnresolvedTransactionsCount") + assert.EqualValues(t, 1, sbc0.UnresolvedTransactionsCount.Load(), "sbc0.UnresolvedTransactionsCount") assert.EqualValues(t, 1, sbc0.SetRollbackCount.Load(), "sbc0.SetRollbackCount") assert.EqualValues(t, 0, sbc1.RollbackPreparedCount.Load(), "sbc1.RollbackPreparedCount") assert.EqualValues(t, 0, sbc1.CommitPreparedCount.Load(), "sbc1.CommitPreparedCount") @@ -1323,9 +1347,11 @@ func TestTxConnResolveRollbackPreparedFail(t *testing.T) { sc, sbc0, sbc1, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - dtid := "TestTxConn:0:1234" - sbc0.ReadTransactionResults = []*querypb.TransactionMetadata{{ - Dtid: dtid, + tl := syslogger.NewTestLogger() + defer tl.Close() + + sbc0.UnresolvedTransactionsResult = []*querypb.TransactionMetadata{{ + Dtid: "TestTxConn:0:1234", State: querypb.TransactionState_ROLLBACK, Participants: []*querypb.Target{{ Keyspace: "TestTxConn", @@ -1334,10 +1360,10 @@ func TestTxConnResolveRollbackPreparedFail(t *testing.T) { }}, }} sbc1.MustFailRollbackPrepared = 1 - err := sc.txConn.Resolve(ctx, dtid) - want := "error: err" - require.Error(t, err) - assert.Contains(t, err.Error(), want, "Resolve") + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) + require.ErrorContains(t, err, "failed to resolve 1 out of 1 transactions") + require.Contains(t, strings.Join(tl.GetAllLogs(), "|"), "error: err") + assert.EqualValues(t, 1, sbc0.UnresolvedTransactionsCount.Load(), "sbc0.UnresolvedTransactionsCount") assert.EqualValues(t, 0, sbc0.SetRollbackCount.Load(), "sbc0.SetRollbackCount") assert.EqualValues(t, 1, sbc1.RollbackPreparedCount.Load(), "sbc1.RollbackPreparedCount") assert.EqualValues(t, 0, sbc1.CommitPreparedCount.Load(), "sbc1.CommitPreparedCount") @@ -1349,9 +1375,11 @@ func TestTxConnResolveCommitPreparedFail(t *testing.T) { sc, sbc0, sbc1, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - dtid := "TestTxConn:0:1234" - sbc0.ReadTransactionResults = []*querypb.TransactionMetadata{{ - Dtid: dtid, + tl := syslogger.NewTestLogger() + defer tl.Close() + + sbc0.UnresolvedTransactionsResult = []*querypb.TransactionMetadata{{ + Dtid: "TestTxConn:0:1234", State: querypb.TransactionState_COMMIT, Participants: []*querypb.Target{{ Keyspace: "TestTxConn", @@ -1360,11 +1388,10 @@ func TestTxConnResolveCommitPreparedFail(t *testing.T) { }}, }} sbc1.MustFailCommitPrepared = 1 - err := sc.txConn.Resolve(ctx, dtid) - want := "error: err" - require.Error(t, err) - assert.Contains(t, err.Error(), want, "Resolve") - assert.EqualValues(t, 0, sbc0.SetRollbackCount.Load(), "sbc0.SetRollbackCount") + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) + require.ErrorContains(t, err, "failed to resolve 1 out of 1 transactions") + require.Contains(t, strings.Join(tl.GetAllLogs(), "|"), "error: err") + assert.EqualValues(t, 1, sbc0.UnresolvedTransactionsCount.Load(), "sbc0.UnresolvedTransactionsCount") assert.EqualValues(t, 0, sbc1.RollbackPreparedCount.Load(), "sbc1.RollbackPreparedCount") assert.EqualValues(t, 1, sbc1.CommitPreparedCount.Load(), "sbc1.CommitPreparedCount") assert.EqualValues(t, 0, sbc0.ConcludeTransactionCount.Load(), "sbc0.ConcludeTransactionCount") @@ -1375,9 +1402,11 @@ func TestTxConnResolveConcludeTransactionFail(t *testing.T) { sc, sbc0, sbc1, _, _, _ := newTestTxConnEnv(t, ctx, "TestTxConn") - dtid := "TestTxConn:0:1234" - sbc0.ReadTransactionResults = []*querypb.TransactionMetadata{{ - Dtid: dtid, + tl := syslogger.NewTestLogger() + defer tl.Close() + + sbc0.UnresolvedTransactionsResult = []*querypb.TransactionMetadata{{ + Dtid: "TestTxConn:0:1234", State: querypb.TransactionState_COMMIT, Participants: []*querypb.Target{{ Keyspace: "TestTxConn", @@ -1386,10 +1415,10 @@ func TestTxConnResolveConcludeTransactionFail(t *testing.T) { }}, }} sbc0.MustFailConcludeTransaction = 1 - err := sc.txConn.Resolve(ctx, dtid) - want := "error: err" - require.Error(t, err) - assert.Contains(t, err.Error(), want, "Resolve") + err := sc.txConn.ResolveTransactions(ctx, getMMTarget()) + require.ErrorContains(t, err, "failed to resolve 1 out of 1 transactions") + require.Contains(t, strings.Join(tl.GetAllLogs(), "|"), "error: err") + assert.EqualValues(t, 1, sbc0.UnresolvedTransactionsCount.Load(), "sbc0.UnresolvedTransactionsCount") assert.EqualValues(t, 0, sbc0.SetRollbackCount.Load(), "sbc0.SetRollbackCount") assert.EqualValues(t, 0, sbc1.RollbackPreparedCount.Load(), "sbc1.RollbackPreparedCount") assert.EqualValues(t, 1, sbc1.CommitPreparedCount.Load(), "sbc1.CommitPreparedCount") diff --git a/go/vt/vtgate/txresolver/tx_resolver.go b/go/vt/vtgate/txresolver/tx_resolver.go new file mode 100644 index 00000000000..3c96c7bc836 --- /dev/null +++ b/go/vt/vtgate/txresolver/tx_resolver.go @@ -0,0 +1,104 @@ +/* +Copyright 2024 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 txresolver + +import ( + "context" + "sync" + + "vitess.io/vitess/go/vt/discovery" + "vitess.io/vitess/go/vt/log" + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" +) + +type TxResolver struct { + ch chan *discovery.TabletHealth + cancel context.CancelFunc + + txConn TxConnection + + mu sync.Mutex + resolve map[string]bool +} + +type TxConnection interface { + ResolveTransactions(ctx context.Context, target *querypb.Target) error +} + +func NewTxResolver(ch chan *discovery.TabletHealth, txConn TxConnection) *TxResolver { + return &TxResolver{ + ch: ch, + txConn: txConn, + resolve: make(map[string]bool), + } +} + +func (tr *TxResolver) Start() { + ctx, cancel := context.WithCancel(context.Background()) + tr.cancel = cancel + + go func() { + for { + select { + case <-ctx.Done(): + return + case th := <-tr.ch: + if th.Stats != nil && th.Target.TabletType == topodatapb.TabletType_PRIMARY && th.Stats.TxUnresolved { + go tr.resolveTransactions(ctx, th.Target) + } + } + } + }() +} + +func (tr *TxResolver) Stop() { + if tr.cancel != nil { + log.Info("Stopping transaction resolver") + tr.cancel() + } +} + +func (tr *TxResolver) resolveTransactions(ctx context.Context, target *querypb.Target) { + dest := target.Keyspace + ":" + target.Shard + if !tr.tryLockTarget(dest) { + return + } + log.Infof("resolving transactions for shard: %s", dest) + + defer func() { + tr.mu.Lock() + delete(tr.resolve, dest) + tr.mu.Unlock() + }() + err := tr.txConn.ResolveTransactions(ctx, target) + if err != nil { + log.Errorf("failed to resolve transactions for shard: %s, %v", dest, err) + return + } + log.Infof("successfully resolved all the transactions for shard: %s", dest) +} + +func (tr *TxResolver) tryLockTarget(dest string) bool { + tr.mu.Lock() + defer tr.mu.Unlock() + if tr.resolve[dest] { + return false + } + tr.resolve[dest] = true + return true +} diff --git a/go/vt/vtgate/vcursor_impl.go b/go/vt/vtgate/vcursor_impl.go index 4f40305d3c6..e9b1d3d7712 100644 --- a/go/vt/vtgate/vcursor_impl.go +++ b/go/vt/vtgate/vcursor_impl.go @@ -58,73 +58,87 @@ import ( "vitess.io/vitess/go/vt/vtgate/vtgateservice" ) -var _ engine.VCursor = (*vcursorImpl)(nil) -var _ plancontext.VSchema = (*vcursorImpl)(nil) -var _ iExecute = (*Executor)(nil) -var _ vindexes.VCursor = (*vcursorImpl)(nil) - -// vcursor_impl needs these facilities to be able to be able to execute queries for vindexes -type iExecute interface { - Execute(ctx context.Context, mysqlCtx vtgateservice.MySQLConnection, method string, session *SafeSession, s string, vars map[string]*querypb.BindVariable) (*sqltypes.Result, error) - ExecuteMultiShard(ctx context.Context, primitive engine.Primitive, rss []*srvtopo.ResolvedShard, queries []*querypb.BoundQuery, session *SafeSession, autocommit bool, ignoreMaxMemoryRows bool) (qr *sqltypes.Result, errs []error) - StreamExecuteMulti(ctx context.Context, primitive engine.Primitive, query string, rss []*srvtopo.ResolvedShard, vars []map[string]*querypb.BindVariable, session *SafeSession, autocommit bool, callback func(reply *sqltypes.Result) error) []error - ExecuteLock(ctx context.Context, rs *srvtopo.ResolvedShard, query *querypb.BoundQuery, session *SafeSession, lockFuncType sqlparser.LockingFuncType) (*sqltypes.Result, error) - Commit(ctx context.Context, safeSession *SafeSession) error - ExecuteMessageStream(ctx context.Context, rss []*srvtopo.ResolvedShard, name string, callback func(*sqltypes.Result) error) error - ExecuteVStream(ctx context.Context, rss []*srvtopo.ResolvedShard, filter *binlogdatapb.Filter, gtid string, callback func(evs []*binlogdatapb.VEvent) error) error - ReleaseLock(ctx context.Context, session *SafeSession) error - - showVitessReplicationStatus(ctx context.Context, filter *sqlparser.ShowFilter) (*sqltypes.Result, error) - showShards(ctx context.Context, filter *sqlparser.ShowFilter, destTabletType topodatapb.TabletType) (*sqltypes.Result, error) - showTablets(filter *sqlparser.ShowFilter) (*sqltypes.Result, error) - showVitessMetadata(ctx context.Context, filter *sqlparser.ShowFilter) (*sqltypes.Result, error) - setVitessMetadata(ctx context.Context, name, value string) error - - // TODO: remove when resolver is gone - ParseDestinationTarget(targetString string) (string, topodatapb.TabletType, key.Destination, error) - VSchema() *vindexes.VSchema - planPrepareStmt(ctx context.Context, vcursor *vcursorImpl, query string) (*engine.Plan, sqlparser.Statement, error) - - environment() *vtenv.Environment -} - -// VSchemaOperator is an interface to Vschema Operations -type VSchemaOperator interface { - GetCurrentSrvVschema() *vschemapb.SrvVSchema - UpdateVSchema(ctx context.Context, ksName string, vschema *vschemapb.SrvVSchema) error -} - -// vcursorImpl implements the VCursor functionality used by dependent -// packages to call back into VTGate. -type vcursorImpl struct { - safeSession *SafeSession - keyspace string - tabletType topodatapb.TabletType - destination key.Destination - marginComments sqlparser.MarginComments - executor iExecute - resolver *srvtopo.Resolver - topoServer *topo.Server - logStats *logstats.LogStats - collation collations.ID - - // fkChecksState stores the state of foreign key checks variable. - // This state is meant to be the final fk checks state after consulting the - // session state, and the given query's comments for `SET_VAR` optimizer hints. - // A nil value represents that no foreign_key_checks value was provided. - fkChecksState *bool - ignoreMaxMemoryRows bool - vschema *vindexes.VSchema - vm VSchemaOperator - semTable *semantics.SemTable - warnShardedOnly bool // when using sharded only features, a warning will be warnings field - - warnings []*querypb.QueryWarning // any warnings that are accumulated during the planning phase are stored here - pv plancontext.PlannerVersion - - warmingReadsPercent int - warmingReadsChannel chan bool -} +var ( + _ engine.VCursor = (*vcursorImpl)(nil) + _ plancontext.VSchema = (*vcursorImpl)(nil) + _ iExecute = (*Executor)(nil) + _ vindexes.VCursor = (*vcursorImpl)(nil) +) + +type ( + // vcursor_impl needs these facilities to be able to be able to execute queries for vindexes + iExecute interface { + Execute(ctx context.Context, mysqlCtx vtgateservice.MySQLConnection, method string, session *SafeSession, s string, vars map[string]*querypb.BindVariable) (*sqltypes.Result, error) + ExecuteMultiShard(ctx context.Context, primitive engine.Primitive, rss []*srvtopo.ResolvedShard, queries []*querypb.BoundQuery, session *SafeSession, autocommit bool, ignoreMaxMemoryRows bool, resultsObserver resultsObserver) (qr *sqltypes.Result, errs []error) + StreamExecuteMulti(ctx context.Context, primitive engine.Primitive, query string, rss []*srvtopo.ResolvedShard, vars []map[string]*querypb.BindVariable, session *SafeSession, autocommit bool, callback func(reply *sqltypes.Result) error, observer resultsObserver) []error + ExecuteLock(ctx context.Context, rs *srvtopo.ResolvedShard, query *querypb.BoundQuery, session *SafeSession, lockFuncType sqlparser.LockingFuncType) (*sqltypes.Result, error) + Commit(ctx context.Context, safeSession *SafeSession) error + ExecuteMessageStream(ctx context.Context, rss []*srvtopo.ResolvedShard, name string, callback func(*sqltypes.Result) error) error + ExecuteVStream(ctx context.Context, rss []*srvtopo.ResolvedShard, filter *binlogdatapb.Filter, gtid string, callback func(evs []*binlogdatapb.VEvent) error) error + ReleaseLock(ctx context.Context, session *SafeSession) error + + showVitessReplicationStatus(ctx context.Context, filter *sqlparser.ShowFilter) (*sqltypes.Result, error) + showShards(ctx context.Context, filter *sqlparser.ShowFilter, destTabletType topodatapb.TabletType) (*sqltypes.Result, error) + showTablets(filter *sqlparser.ShowFilter) (*sqltypes.Result, error) + showVitessMetadata(ctx context.Context, filter *sqlparser.ShowFilter) (*sqltypes.Result, error) + setVitessMetadata(ctx context.Context, name, value string) error + + // TODO: remove when resolver is gone + ParseDestinationTarget(targetString string) (string, topodatapb.TabletType, key.Destination, error) + VSchema() *vindexes.VSchema + planPrepareStmt(ctx context.Context, vcursor *vcursorImpl, query string) (*engine.Plan, sqlparser.Statement, error) + + environment() *vtenv.Environment + ReadTransaction(ctx context.Context, transactionID string) (*querypb.TransactionMetadata, error) + UnresolvedTransactions(ctx context.Context, targets []*querypb.Target) ([]*querypb.TransactionMetadata, error) + } + + // VSchemaOperator is an interface to Vschema Operations + VSchemaOperator interface { + GetCurrentSrvVschema() *vschemapb.SrvVSchema + UpdateVSchema(ctx context.Context, ksName string, vschema *vschemapb.SrvVSchema) error + } + + // vcursorImpl implements the VCursor functionality used by dependent + // packages to call back into VTGate. + vcursorImpl struct { + safeSession *SafeSession + keyspace string + tabletType topodatapb.TabletType + destination key.Destination + marginComments sqlparser.MarginComments + executor iExecute + resolver *srvtopo.Resolver + topoServer *topo.Server + logStats *logstats.LogStats + collation collations.ID + + // fkChecksState stores the state of foreign key checks variable. + // This state is meant to be the final fk checks state after consulting the + // session state, and the given query's comments for `SET_VAR` optimizer hints. + // A nil value represents that no foreign_key_checks value was provided. + fkChecksState *bool + ignoreMaxMemoryRows bool + vschema *vindexes.VSchema + vm VSchemaOperator + semTable *semantics.SemTable + warnShardedOnly bool // when using sharded only features, a warning will be warnings field + queryTimeout time.Duration + + warnings []*querypb.QueryWarning // any warnings that are accumulated during the planning phase are stored here + pv plancontext.PlannerVersion + + warmingReadsPercent int + warmingReadsChannel chan bool + + resultsObserver resultsObserver + + // this is a map of the number of rows that every primitive has returned + // if this field is nil, it means that we are not logging operator traffic + interOpStats map[engine.Primitive]engine.RowsReceived + shardsStats map[engine.Primitive]engine.ShardsQueried + } +) // newVcursorImpl creates a vcursorImpl. Before creating this object, you have to separate out any marginComments that came with // the query and supply it here. Trailing comments are typically sent by the application for various reasons, @@ -191,6 +205,7 @@ func newVCursorImpl( pv: pv, warmingReadsPercent: warmingReadsPct, warmingReadsChannel: warmingReadsChan, + resultsObserver: nullResultsObserver{}, }, nil } @@ -250,6 +265,38 @@ func (vc *vcursorImpl) IsShardRoutingEnabled() bool { return enableShardRouting } +func (vc *vcursorImpl) ReadTransaction(ctx context.Context, transactionID string) (*querypb.TransactionMetadata, error) { + return vc.executor.ReadTransaction(ctx, transactionID) +} + +// UnresolvedTransactions gets the unresolved transactions for the given keyspace. If the keyspace is not given, +// then we use the default keyspace. +func (vc *vcursorImpl) UnresolvedTransactions(ctx context.Context, keyspace string) ([]*querypb.TransactionMetadata, error) { + if keyspace == "" { + keyspace = vc.GetKeyspace() + } + rss, _, err := vc.ResolveDestinations(ctx, keyspace, nil, []key.Destination{key.DestinationAllShards{}}) + if err != nil { + return nil, err + } + var targets []*querypb.Target + for _, rs := range rss { + targets = append(targets, rs.Target) + } + return vc.executor.UnresolvedTransactions(ctx, targets) +} + +func (vc *vcursorImpl) StartPrimitiveTrace() func() engine.Stats { + vc.interOpStats = make(map[engine.Primitive]engine.RowsReceived) + vc.shardsStats = make(map[engine.Primitive]engine.ShardsQueried) + return func() engine.Stats { + return engine.Stats{ + InterOpStats: vc.interOpStats, + ShardsStats: vc.shardsStats, + } + } +} + // FindTable finds the specified table. If the keyspace what specified in the input, it gets used as qualifier. // Otherwise, the keyspace from the request is used, if one was provided. func (vc *vcursorImpl) FindTable(name sqlparser.TableName) (*vindexes.Table, string, topodatapb.TabletType, key.Destination, error) { @@ -483,11 +530,30 @@ func (vc *vcursorImpl) ExecutePrimitive(ctx context.Context, primitive engine.Pr if err != nil && vterrors.RootCause(err) == buffer.ShardMissingError { continue } + vc.logOpTraffic(primitive, res) return res, err } return nil, vterrors.New(vtrpcpb.Code_UNAVAILABLE, "upstream shards are not available") } +func (vc *vcursorImpl) logOpTraffic(primitive engine.Primitive, res *sqltypes.Result) { + if vc.interOpStats != nil { + rows := vc.interOpStats[primitive] + if res == nil { + rows = append(rows, 0) + } else { + rows = append(rows, len(res.Rows)) + } + vc.interOpStats[primitive] = rows + } +} + +func (vc *vcursorImpl) logShardsQueried(primitive engine.Primitive, shardsNb int) { + if vc.shardsStats != nil { + vc.shardsStats[primitive] += engine.ShardsQueried(shardsNb) + } +} + func (vc *vcursorImpl) ExecutePrimitiveStandalone(ctx context.Context, primitive engine.Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { // clone the vcursorImpl with a new session. newVC := vc.cloneWithAutocommitSession() @@ -496,12 +562,26 @@ func (vc *vcursorImpl) ExecutePrimitiveStandalone(ctx context.Context, primitive if err != nil && vterrors.RootCause(err) == buffer.ShardMissingError { continue } + vc.logOpTraffic(primitive, res) return res, err } return nil, vterrors.New(vtrpcpb.Code_UNAVAILABLE, "upstream shards are not available") } +func (vc *vcursorImpl) wrapCallback(callback func(*sqltypes.Result) error, primitive engine.Primitive) func(*sqltypes.Result) error { + if vc.interOpStats == nil { + return callback + } + + return func(result *sqltypes.Result) error { + vc.logOpTraffic(primitive, result) + return callback(result) + } +} + func (vc *vcursorImpl) StreamExecutePrimitive(ctx context.Context, primitive engine.Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { + callback = vc.wrapCallback(callback, primitive) + for try := 0; try < MaxBufferingRetries; try++ { err := primitive.TryStreamExecute(ctx, vc, bindVars, wantfields, callback) if err != nil && vterrors.RootCause(err) == buffer.ShardMissingError { @@ -513,6 +593,8 @@ func (vc *vcursorImpl) StreamExecutePrimitive(ctx context.Context, primitive eng } func (vc *vcursorImpl) StreamExecutePrimitiveStandalone(ctx context.Context, primitive engine.Primitive, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(result *sqltypes.Result) error) error { + callback = vc.wrapCallback(callback, primitive) + // clone the vcursorImpl with a new session. newVC := vc.cloneWithAutocommitSession() for try := 0; try < MaxBufferingRetries; try++ { @@ -577,14 +659,16 @@ func (vc *vcursorImpl) ExecuteMultiShard(ctx context.Context, primitive engine.P return nil, []error{err} } - qr, errs := vc.executor.ExecuteMultiShard(ctx, primitive, rss, commentedShardQueries(queries, vc.marginComments), vc.safeSession, canAutocommit, vc.ignoreMaxMemoryRows) + qr, errs := vc.executor.ExecuteMultiShard(ctx, primitive, rss, commentedShardQueries(queries, vc.marginComments), vc.safeSession, canAutocommit, vc.ignoreMaxMemoryRows, vc.resultsObserver) vc.setRollbackOnPartialExecIfRequired(len(errs) != len(rss), rollbackOnError) - + vc.logShardsQueried(primitive, len(rss)) return qr, errs } // StreamExecuteMulti is the streaming version of ExecuteMultiShard. func (vc *vcursorImpl) StreamExecuteMulti(ctx context.Context, primitive engine.Primitive, query string, rss []*srvtopo.ResolvedShard, bindVars []map[string]*querypb.BindVariable, rollbackOnError bool, autocommit bool, callback func(reply *sqltypes.Result) error) []error { + callback = vc.wrapCallback(callback, primitive) + noOfShards := len(rss) atomic.AddUint64(&vc.logStats.ShardQueries, uint64(noOfShards)) err := vc.markSavepoint(ctx, rollbackOnError && (noOfShards > 1), map[string]*querypb.BindVariable{}) @@ -592,7 +676,7 @@ func (vc *vcursorImpl) StreamExecuteMulti(ctx context.Context, primitive engine. return []error{err} } - errs := vc.executor.StreamExecuteMulti(ctx, primitive, vc.marginComments.Leading+query+vc.marginComments.Trailing, rss, bindVars, vc.safeSession, autocommit, callback) + errs := vc.executor.StreamExecuteMulti(ctx, primitive, vc.marginComments.Leading+query+vc.marginComments.Trailing, rss, bindVars, vc.safeSession, autocommit, callback, vc.resultsObserver) vc.setRollbackOnPartialExecIfRequired(len(errs) != len(rss), rollbackOnError) return errs @@ -615,7 +699,8 @@ func (vc *vcursorImpl) ExecuteStandalone(ctx context.Context, primitive engine.P } // The autocommit flag is always set to false because we currently don't // execute DMLs through ExecuteStandalone. - qr, errs := vc.executor.ExecuteMultiShard(ctx, primitive, rss, bqs, NewAutocommitSession(vc.safeSession.Session), false /* autocommit */, vc.ignoreMaxMemoryRows) + qr, errs := vc.executor.ExecuteMultiShard(ctx, primitive, rss, bqs, NewAutocommitSession(vc.safeSession.Session), false /* autocommit */, vc.ignoreMaxMemoryRows, vc.resultsObserver) + vc.logShardsQueried(primitive, len(rss)) return qr, vterrors.Aggregate(errs) } @@ -814,7 +899,7 @@ func commentedShardQueries(shardQueries []*querypb.BoundQuery, marginComments sq // TargetDestination implements the ContextVSchema interface func (vc *vcursorImpl) TargetDestination(qualifier string) (key.Destination, *vindexes.Keyspace, topodatapb.TabletType, error) { - keyspaceName := vc.keyspace + keyspaceName := vc.getActualKeyspace() if vc.destination == nil && qualifier != "" { keyspaceName = qualifier } @@ -844,22 +929,6 @@ func (vc *vcursorImpl) SetQueryTimeout(maxExecutionTime int64) { vc.safeSession.QueryTimeout = maxExecutionTime } -// GetQueryTimeout implements the SessionActions interface -// The priority of adding query timeouts - -// 1. Query timeout comment directive. -// 2. If the comment directive is unspecified, then we use the session setting. -// 3. If the comment directive and session settings is unspecified, then we use the global default specified by a flag. -func (vc *vcursorImpl) GetQueryTimeout(queryTimeoutFromComments int) int { - if queryTimeoutFromComments != 0 { - return queryTimeoutFromComments - } - sessionQueryTimeout := int(vc.safeSession.GetQueryTimeout()) - if sessionQueryTimeout != 0 { - return sessionQueryTimeout - } - return queryTimeout -} - // SetClientFoundRows implements the SessionActions interface func (vc *vcursorImpl) SetClientFoundRows(_ context.Context, clientFoundRows bool) error { vc.safeSession.GetOrCreateOptions().ClientFoundRows = clientFoundRows @@ -899,7 +968,41 @@ func (vc *vcursorImpl) SetPriority(priority string) { } else if vc.safeSession.Options != nil && vc.safeSession.Options.Priority != "" { vc.safeSession.Options.Priority = "" } +} + +func (vc *vcursorImpl) SetExecQueryTimeout(timeout *int) { + // Determine the effective timeout: use passed timeout if non-nil, otherwise use session's query timeout if available + var execTimeout *int + if timeout != nil { + execTimeout = timeout + } else if sessionTimeout := vc.getQueryTimeout(); sessionTimeout > 0 { + execTimeout = &sessionTimeout + } + + // If no effective timeout and no session options, return early + if execTimeout == nil { + if vc.safeSession.GetOptions() == nil { + return + } + vc.safeSession.GetOrCreateOptions().Timeout = nil + return + } + + vc.queryTimeout = time.Duration(*execTimeout) * time.Millisecond + // Set the authoritative timeout using the determined execTimeout + vc.safeSession.GetOrCreateOptions().Timeout = &querypb.ExecuteOptions_AuthoritativeTimeout{ + AuthoritativeTimeout: int64(*execTimeout), + } +} +// getQueryTimeout returns timeout based on the priority +// session setting > global default specified by a flag. +func (vc *vcursorImpl) getQueryTimeout() int { + sessionQueryTimeout := int(vc.safeSession.GetQueryTimeout()) + if sessionQueryTimeout != 0 { + return sessionQueryTimeout + } + return queryTimeout } // SetConsolidator implements the SessionActions interface @@ -1079,6 +1182,23 @@ func (vc *vcursorImpl) GetAggregateUDFs() []string { return vc.vschema.GetAggregateUDFs() } +// FindMirrorRule finds the mirror rule for the requested table name and +// VSchema tablet type. +func (vc *vcursorImpl) FindMirrorRule(name sqlparser.TableName) (*vindexes.MirrorRule, error) { + destKeyspace, destTabletType, _, err := vc.executor.ParseDestinationTarget(name.Qualifier.String()) + if err != nil { + return nil, err + } + if destKeyspace == "" { + destKeyspace = vc.keyspace + } + mirrorRule, err := vc.vschema.FindMirrorRule(destKeyspace, name.Name.String(), destTabletType) + if err != nil { + return nil, err + } + return mirrorRule, err +} + // ParseDestinationTarget parses destination target string and sets default keyspace if possible. func parseDestinationTarget(targetString string, vschema *vindexes.VSchema) (string, topodatapb.TabletType, key.Destination, error) { destKeyspace, destTabletType, dest, err := topoprotopb.ParseDestination(targetString, defaultTabletType) @@ -1139,7 +1259,6 @@ func (vc *vcursorImpl) ExecuteVSchema(ctx context.Context, keyspace string, vsch allowed := vschemaacl.Authorized(user) if !allowed { return vterrors.NewErrorf(vtrpcpb.Code_PERMISSION_DENIED, vterrors.AccessDeniedError, "User '%s' is not authorized to perform vschema operations", user.GetUsername()) - } // Resolve the keyspace either from the table qualifier or the target keyspace @@ -1156,7 +1275,6 @@ func (vc *vcursorImpl) ExecuteVSchema(ctx context.Context, keyspace string, vsch ks := srvVschema.Keyspaces[ksName] ks, err := topotools.ApplyVSchemaDDL(ksName, ks, vschemaDDL) - if err != nil { return err } @@ -1164,7 +1282,6 @@ func (vc *vcursorImpl) ExecuteVSchema(ctx context.Context, keyspace string, vsch srvVschema.Keyspaces[ksName] = ks return vc.vm.UpdateVSchema(ctx, ksName, srvVschema) - } func (vc *vcursorImpl) MessageStream(ctx context.Context, rss []*srvtopo.ResolvedShard, tableName string, callback func(*sqltypes.Result) error) error { @@ -1287,6 +1404,7 @@ func (vc *vcursorImpl) cloneWithAutocommitSession() *vcursorImpl { topoServer: vc.topoServer, warnShardedOnly: vc.warnShardedOnly, pv: vc.pv, + resultsObserver: vc.resultsObserver, } } @@ -1297,6 +1415,7 @@ func (vc *vcursorImpl) VExplainLogging() { func (vc *vcursorImpl) GetVExplainLogs() []engine.ExecuteEntry { return vc.safeSession.logging.GetLogs() } + func (vc *vcursorImpl) FindRoutedShard(keyspace, shard string) (keyspaceName string, err error) { return vc.vschema.FindRoutedShard(keyspace, shard) } @@ -1358,6 +1477,7 @@ func (vc *vcursorImpl) CloneForReplicaWarming(ctx context.Context) engine.VCurso warnShardedOnly: vc.warnShardedOnly, warnings: vc.warnings, pv: vc.pv, + resultsObserver: nullResultsObserver{}, } v.marginComments.Trailing += "/* warming read */" @@ -1365,6 +1485,38 @@ func (vc *vcursorImpl) CloneForReplicaWarming(ctx context.Context) engine.VCurso return v } +func (vc *vcursorImpl) CloneForMirroring(ctx context.Context) engine.VCursor { + callerId := callerid.EffectiveCallerIDFromContext(ctx) + immediateCallerId := callerid.ImmediateCallerIDFromContext(ctx) + + clonedCtx := callerid.NewContext(ctx, callerId, immediateCallerId) + + v := &vcursorImpl{ + safeSession: NewAutocommitSession(vc.safeSession.Session), + keyspace: vc.keyspace, + tabletType: vc.tabletType, + destination: vc.destination, + marginComments: vc.marginComments, + executor: vc.executor, + resolver: vc.resolver, + topoServer: vc.topoServer, + logStats: &logstats.LogStats{Ctx: clonedCtx}, + collation: vc.collation, + ignoreMaxMemoryRows: vc.ignoreMaxMemoryRows, + vschema: vc.vschema, + vm: vc.vm, + semTable: vc.semTable, + warnShardedOnly: vc.warnShardedOnly, + warnings: vc.warnings, + pv: vc.pv, + resultsObserver: nullResultsObserver{}, + } + + v.marginComments.Trailing += "/* mirror query */" + + return v +} + // UpdateForeignKeyChecksState updates the foreign key checks state of the vcursor. func (vc *vcursorImpl) UpdateForeignKeyChecksState(fkStateFromQuery *bool) { // Initialize the state to unspecified. @@ -1383,3 +1535,10 @@ func (vc *vcursorImpl) UpdateForeignKeyChecksState(fkStateFromQuery *bool) { func (vc *vcursorImpl) GetForeignKeyChecksState() *bool { return vc.fkChecksState } + +// RecordMirrorStats is used to record stats about a mirror query. +func (vc *vcursorImpl) RecordMirrorStats(sourceExecTime, targetExecTime time.Duration, targetErr error) { + vc.logStats.MirrorSourceExecuteTime = sourceExecTime + vc.logStats.MirrorTargetExecuteTime = targetExecTime + vc.logStats.MirrorTargetError = targetErr +} diff --git a/go/vt/vtgate/vcursor_impl_test.go b/go/vt/vtgate/vcursor_impl_test.go index b8e4a0d3a0a..95d9a18078d 100644 --- a/go/vt/vtgate/vcursor_impl_test.go +++ b/go/vt/vtgate/vcursor_impl_test.go @@ -3,10 +3,12 @@ package vtgate import ( "context" "encoding/hex" + "errors" "fmt" "strconv" "strings" "testing" + "time" "github.com/stretchr/testify/require" @@ -14,6 +16,7 @@ import ( "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/srvtopo" "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/vtgate/logstats" "vitess.io/vitess/go/vt/vtgate/vindexes" querypb "vitess.io/vitess/go/vt/proto/query" @@ -36,8 +39,7 @@ func (f fakeVSchemaOperator) UpdateVSchema(ctx context.Context, ksName string, v panic("implement me") } -type fakeTopoServer struct { -} +type fakeTopoServer struct{} // GetTopoServer returns the full topo.Server instance. func (f *fakeTopoServer) GetTopoServer() (*topo.Server, error) { @@ -77,7 +79,6 @@ func (f *fakeTopoServer) WatchSrvKeyspace(ctx context.Context, cell, keyspace st // the provided cell. It will call the callback when // a new value or an error occurs. func (f *fakeTopoServer) WatchSrvVSchema(ctx context.Context, cell string, callback func(*vschemapb.SrvVSchema, error) bool) { - } func TestDestinationKeyspace(t *testing.T) { @@ -105,12 +106,14 @@ func TestDestinationKeyspace(t *testing.T) { Keyspaces: map[string]*vindexes.KeyspaceSchema{ ks1.Name: ks1Schema, ks2.Name: ks2Schema, - }} + }, + } vschemaWith1KS := &vindexes.VSchema{ Keyspaces: map[string]*vindexes.KeyspaceSchema{ ks1.Name: ks1Schema, - }} + }, + } type testCase struct { vschema *vindexes.VSchema @@ -202,20 +205,24 @@ func TestDestinationKeyspace(t *testing.T) { } } -var ks1 = &vindexes.Keyspace{Name: "ks1"} -var ks1Schema = &vindexes.KeyspaceSchema{Keyspace: ks1} -var ks2 = &vindexes.Keyspace{Name: "ks2"} -var ks2Schema = &vindexes.KeyspaceSchema{Keyspace: ks2} -var vschemaWith1KS = &vindexes.VSchema{ - Keyspaces: map[string]*vindexes.KeyspaceSchema{ - ks1.Name: ks1Schema, - }, -} +var ( + ks1 = &vindexes.Keyspace{Name: "ks1"} + ks1Schema = &vindexes.KeyspaceSchema{Keyspace: ks1} + ks2 = &vindexes.Keyspace{Name: "ks2"} + ks2Schema = &vindexes.KeyspaceSchema{Keyspace: ks2} + vschemaWith1KS = &vindexes.VSchema{ + Keyspaces: map[string]*vindexes.KeyspaceSchema{ + ks1.Name: ks1Schema, + }, + } +) + var vschemaWith2KS = &vindexes.VSchema{ Keyspaces: map[string]*vindexes.KeyspaceSchema{ ks1.Name: ks1Schema, ks2.Name: ks2Schema, - }} + }, +} func TestSetTarget(t *testing.T) { type testCase struct { @@ -317,7 +324,8 @@ func TestFirstSortedKeyspace(t *testing.T) { ks1Schema.Keyspace.Name: ks1Schema, ks2Schema.Keyspace.Name: ks2Schema, ks3Schema.Keyspace.Name: ks3Schema, - }} + }, + } r, _, _, _, _ := createExecutorEnv(t) vc, err := newVCursorImpl(NewSafeSession(nil), sqlparser.MarginComments{}, r, nil, &fakeVSchemaOperator{vschema: vschemaWith2KS}, vschemaWith2KS, srvtopo.NewResolver(&fakeTopoServer{}, nil, ""), nil, false, querypb.ExecuteOptions_Gen4) @@ -326,3 +334,66 @@ func TestFirstSortedKeyspace(t *testing.T) { require.NoError(t, err) require.Equal(t, ks3Schema.Keyspace, ks) } + +// TestSetExecQueryTimeout tests the SetExecQueryTimeout method. +// Validates the timeout value is set based on override rule. +func TestSetExecQueryTimeout(t *testing.T) { + executor, _, _, _, _ := createExecutorEnv(t) + safeSession := NewSafeSession(nil) + vc, err := newVCursorImpl(safeSession, sqlparser.MarginComments{}, executor, nil, nil, &vindexes.VSchema{}, nil, nil, false, querypb.ExecuteOptions_Gen4) + require.NoError(t, err) + + // flag timeout + queryTimeout = 20 + vc.SetExecQueryTimeout(nil) + require.Equal(t, 20*time.Millisecond, vc.queryTimeout) + require.NotNil(t, safeSession.Options.Timeout) + require.EqualValues(t, 20, safeSession.Options.GetAuthoritativeTimeout()) + + // session timeout + safeSession.SetQueryTimeout(40) + vc.SetExecQueryTimeout(nil) + require.Equal(t, 40*time.Millisecond, vc.queryTimeout) + require.NotNil(t, safeSession.Options.Timeout) + require.EqualValues(t, 40, safeSession.Options.GetAuthoritativeTimeout()) + + // query hint timeout + timeoutQueryHint := 60 + vc.SetExecQueryTimeout(&timeoutQueryHint) + require.Equal(t, 60*time.Millisecond, vc.queryTimeout) + require.NotNil(t, safeSession.Options.Timeout) + require.EqualValues(t, 60, safeSession.Options.GetAuthoritativeTimeout()) + + // query hint timeout - infinite + timeoutQueryHint = 0 + vc.SetExecQueryTimeout(&timeoutQueryHint) + require.Equal(t, 0*time.Millisecond, vc.queryTimeout) + require.NotNil(t, safeSession.Options.Timeout) + require.EqualValues(t, 0, safeSession.Options.GetAuthoritativeTimeout()) + + // reset + queryTimeout = 0 + safeSession.SetQueryTimeout(0) + vc.SetExecQueryTimeout(nil) + require.Equal(t, 0*time.Millisecond, vc.queryTimeout) + // this should be reset. + require.Nil(t, safeSession.Options.Timeout) +} + +func TestRecordMirrorStats(t *testing.T) { + executor, _, _, _, _ := createExecutorEnv(t) + safeSession := NewSafeSession(nil) + logStats := logstats.NewLogStats(context.Background(), t.Name(), "select 1", "", nil) + vc, err := newVCursorImpl(safeSession, sqlparser.MarginComments{}, executor, logStats, nil, &vindexes.VSchema{}, nil, nil, false, querypb.ExecuteOptions_Gen4) + require.NoError(t, err) + + require.Zero(t, logStats.MirrorSourceExecuteTime) + require.Zero(t, logStats.MirrorTargetExecuteTime) + require.Nil(t, logStats.MirrorTargetError) + + vc.RecordMirrorStats(10*time.Millisecond, 20*time.Millisecond, errors.New("test error")) + + require.Equal(t, 10*time.Millisecond, logStats.MirrorSourceExecuteTime) + require.Equal(t, 20*time.Millisecond, logStats.MirrorTargetExecuteTime) + require.ErrorContains(t, logStats.MirrorTargetError, "test error") +} diff --git a/go/vt/vtgate/vindexes/fuzz.go b/go/vt/vtgate/vindexes/fuzz.go index f1def0c3e1e..5a54aeb2bd8 100644 --- a/go/vt/vtgate/vindexes/fuzz.go +++ b/go/vt/vtgate/vindexes/fuzz.go @@ -67,6 +67,7 @@ var querypbTypes = []querypb.Type{querypb.Type_NULL_TYPE, querypb.Type_SET, querypb.Type_GEOMETRY, querypb.Type_JSON, + querypb.Type_VECTOR, querypb.Type_EXPRESSION} // All valid vindexes diff --git a/go/vt/vtgate/vindexes/region_experimental.go b/go/vt/vtgate/vindexes/region_experimental.go index c116e9bd84d..c6b867647aa 100644 --- a/go/vt/vtgate/vindexes/region_experimental.go +++ b/go/vt/vtgate/vindexes/region_experimental.go @@ -20,7 +20,6 @@ import ( "bytes" "context" "encoding/binary" - "fmt" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/key" @@ -61,7 +60,7 @@ type RegionExperimental struct { func newRegionExperimental(name string, m map[string]string) (Vindex, error) { rbs, ok := m[regionExperimentalParamRegionBytes] if !ok { - return nil, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, fmt.Sprintf("region_experimental missing %s param", regionExperimentalParamRegionBytes)) + return nil, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "region_experimental missing %s param", regionExperimentalParamRegionBytes) } var rb int switch rbs { diff --git a/go/vt/vtgate/vindexes/vschema.go b/go/vt/vtgate/vindexes/vschema.go index eba3ac49969..3852bbfcde3 100644 --- a/go/vt/vtgate/vindexes/vschema.go +++ b/go/vt/vtgate/vindexes/vschema.go @@ -63,6 +63,7 @@ const ( // VSchema represents the denormalized version of SrvVSchema, // used for building routing plans. type VSchema struct { + MirrorRules map[string]*MirrorRule `json:"mirror_rules"` RoutingRules map[string]*RoutingRule `json:"routing_rules"` // globalTables contains the name of all tables in all keyspaces. If the @@ -79,13 +80,34 @@ type VSchema struct { created time.Time } +// MirrorRule represents one mirror rule. +type MirrorRule struct { + Error error + Percent float32 `json:"percent,omitempty"` + Table *Table `json:"table,omitempty"` +} + +// MarshalJSON returns a JSON representation of MirrorRule. +func (mr *MirrorRule) MarshalJSON() ([]byte, error) { + if mr.Error != nil { + return json.Marshal(mr.Error.Error()) + } + return json.Marshal(struct { + Percent float32 + Table *Table + }{ + Percent: mr.Percent, + Table: mr.Table, + }) +} + // RoutingRule represents one routing rule. type RoutingRule struct { Tables []*Table Error error } -// MarshalJSON returns a JSON representation of Column. +// MarshalJSON returns a JSON representation of RoutingRule. func (rr *RoutingRule) MarshalJSON() ([]byte, error) { if rr.Error != nil { return json.Marshal(rr.Error.Error()) @@ -324,6 +346,7 @@ func (source *Source) String() string { // BuildVSchema builds a VSchema from a SrvVSchema. func BuildVSchema(source *vschemapb.SrvVSchema, parser *sqlparser.Parser) (vschema *VSchema) { vschema = &VSchema{ + MirrorRules: make(map[string]*MirrorRule), RoutingRules: make(map[string]*RoutingRule), globalTables: make(map[string]*Table), uniqueVindexes: make(map[string]Vindex), @@ -338,6 +361,7 @@ func BuildVSchema(source *vschemapb.SrvVSchema, parser *sqlparser.Parser) (vsche buildRoutingRule(source, vschema, parser) buildShardRoutingRule(source, vschema) buildKeyspaceRoutingRule(source, vschema) + buildMirrorRule(source, vschema, parser) // Resolve auto-increments after routing rules are built since sequence tables also obey routing rules. resolveAutoIncrement(source, vschema, parser) return vschema @@ -895,7 +919,7 @@ func escapeQualifiedTable(qualifiedTableName string) (string, error) { } func extractTableParts(tableName string, allowUnqualified bool) (string, string, error) { - errMsgFormat := "invalid table name: %s, it must be of the " + errMsgFormat := "invalid table name: '%s', it must be of the " if allowUnqualified { errMsgFormat = errMsgFormat + "unqualified form or the " } @@ -914,7 +938,6 @@ func extractTableParts(tableName string, allowUnqualified bool) (string, string, } // Using fmt.Errorf instead of vterrors here because this error is always wrapped in vterrors. return "", "", fmt.Errorf(errMsgFormat, tableName) - } func parseTable(tableName string) (sqlparser.TableName, error) { @@ -963,7 +986,7 @@ outer: toTable, err = escapeQualifiedTable(toTable) if err != nil { vschema.RoutingRules[rule.FromTable] = &RoutingRule{ - Error: vterrors.Errorf( + Error: vterrors.New( vtrpcpb.Code_INVALID_ARGUMENT, err.Error(), ), @@ -972,7 +995,6 @@ outer: } toKeyspace, toTableName, err := parser.ParseTable(toTable) - if err != nil { vschema.RoutingRules[rule.FromTable] = &RoutingRule{ Error: err, @@ -1025,6 +1047,216 @@ func buildKeyspaceRoutingRule(source *vschemapb.SrvVSchema, vschema *VSchema) { vschema.KeyspaceRoutingRules = rulesMap } +func buildMirrorRule(source *vschemapb.SrvVSchema, vschema *VSchema, parser *sqlparser.Parser) { + if source.MirrorRules == nil { + return + } + + // Used to validate no mirror chains exist. + fromTableKeyspaces := make(map[string]string) + toKeyspaces := make(map[string]struct{}) + + for _, rule := range source.MirrorRules.Rules { + toTable := rule.ToTable + + // + // Forbid duplicate FromTables expressions. + // + + if _, ok := vschema.MirrorRules[rule.FromTable]; ok { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_ALREADY_EXISTS, + "from table: duplicate rule for entry '%s'", + rule.FromTable, + ), + } + continue + } + + // + // Parse and validate FromTable. + // + + // Separate tablet-type from rest of FromTable. + fromTableParts := strings.Split(rule.FromTable, "@") + if len(fromTableParts) == 0 { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "from table: invalid table name: '%s'", + rule.FromTable, + ), + } + } + + // Escape and parse the FromTable, without table-type specifier. + fromTable, err := escapeQualifiedTable(fromTableParts[0]) + if err != nil { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "from table: %s", + err.Error(), + ), + } + continue + } + fromKeyspace, fromTableName, err := parser.ParseTable(fromTable) + if err != nil { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "from table: invalid table name: '%s'", + err.Error(), + ), + } + continue + } + + // Find the from table. + _, err = vschema.FindTable(fromKeyspace, fromTableName) + if err != nil { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "from table: %s", + err.Error(), + ), + } + continue + } + + // Validate the table-type, if specified. + if len(fromTableParts) > 1 { + fromTabletTypeSuffix := "@" + strings.Join(fromTableParts[1:], "") + var ok bool + for _, tabletTypeSuffix := range TabletTypeSuffix { + if tabletTypeSuffix == fromTabletTypeSuffix { + ok = true + break + } + } + if !ok { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "from table: invalid tablet type: '%s'", + rule.FromTable, + ), + } + continue + } + } + + // + // Parse and validate ToTable. + // + + // Forbid tablet-type specifier. + toTableParts := strings.Split(toTable, "@") + if len(toTableParts) != 1 || toTableParts[0] == "@" { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "to table: tablet type may not be specified: '%s'", + rule.ToTable, + ), + } + continue + } + + // Escape and parse the table. + toTable, err = escapeQualifiedTable(toTable) + if err != nil { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "to table: %s", + err.Error(), + ), + } + continue + } + toKeyspace, toTableName, err := parser.ParseTable(toTable) + if err != nil { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "to table: invalid table name: '%s'", + rule.ToTable, + ), + } + continue + } + + // Forbid self-mirroring. + if fromKeyspace == toKeyspace { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "to table: cannot reside in same keyspace as from table", + ), + } + continue + } + + // + // Find table in VSchema. + // + + t, err := vschema.FindTable(toKeyspace, toTableName) + if err != nil { + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Error: vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "to table: %s", + err.Error(), + ), + } + continue + } + + // + // Return non-error mirror rule. + // + + vschema.MirrorRules[rule.FromTable] = &MirrorRule{ + Table: t, + Percent: rule.Percent, + } + + // + // Save some info for validating no mirror chains exist + // + + fromTableKeyspaces[rule.FromTable] = fromKeyspace + toKeyspaces[toKeyspace] = struct{}{} + } + + // Forbid mirror chains. Keyspaces which are the target of a mirror rule + // may not be the source of another. + for fromTable, rule := range vschema.MirrorRules { + if rule.Error != nil { + continue + } + fromKeyspace, ok := fromTableKeyspaces[fromTable] + if !ok { + rule.Error = vterrors.Errorf( + vtrpcpb.Code_INTERNAL, + "[BUG] from table: failed to determine keyspace", + ) + continue + } + if _, ok := toKeyspaces[fromKeyspace]; ok { + rule.Error = vterrors.Errorf( + vtrpcpb.Code_INVALID_ARGUMENT, + "mirror chaining is not allowed", + ) + } + } +} + // FindTable returns a pointer to the Table. If a keyspace is specified, only tables // from that keyspace are searched. If the specified keyspace is unsharded // and no tables matched, it's considered valid: FindTable will construct a table @@ -1325,6 +1557,28 @@ func (vschema *VSchema) GetAggregateUDFs() (udfs []string) { return } +// FindMirrorRule finds a mirror rule from the keyspace, table name and +// tablet type. +func (vschema *VSchema) FindMirrorRule(keyspace, tablename string, tabletType topodatapb.TabletType) (*MirrorRule, error) { + qualified := tablename + if keyspace != "" { + qualified = keyspace + "." + tablename + } + fqtn := qualified + TabletTypeSuffix[tabletType] + // First look for a fully qualified table name: keyspace.table@tablet_type. + // Then look for one without tablet type: keyspace.table. + for _, name := range []string{fqtn, qualified} { + mr, ok := vschema.MirrorRules[name] + if ok { + if mr.Error != nil { + return nil, mr.Error + } + return mr, nil + } + } + return nil, nil +} + // ByCost provides the interface needed for ColumnVindexes to // be sorted by cost order. type ByCost []*ColumnVindex @@ -1392,7 +1646,7 @@ func ChooseVindexForType(typ querypb.Type) (string, error) { // FindBestColVindex finds the best ColumnVindex for VReplication. func FindBestColVindex(table *Table) (*ColumnVindex, error) { - if table.ColumnVindexes == nil || len(table.ColumnVindexes) == 0 { + if len(table.ColumnVindexes) == 0 { return nil, vterrors.Errorf( vtrpcpb.Code_INVALID_ARGUMENT, "table %s has no vindex", diff --git a/go/vt/vtgate/vindexes/vschema_test.go b/go/vt/vtgate/vindexes/vschema_test.go index 7761b6ae8ab..25f8e135698 100644 --- a/go/vt/vtgate/vindexes/vschema_test.go +++ b/go/vt/vtgate/vindexes/vschema_test.go @@ -838,6 +838,7 @@ func TestVSchemaRoutingRules(t *testing.T) { Keyspace: ks2, } want := &VSchema{ + MirrorRules: map[string]*MirrorRule{}, RoutingRules: map[string]*RoutingRule{ "rt1": { Error: errors.New("table rt1 has more than one target: [ks1.t1 ks2.t2]"), @@ -852,10 +853,10 @@ func TestVSchemaRoutingRules(t *testing.T) { Error: errors.New("duplicate rule for entry dup"), }, "badname": { - Error: errors.New("invalid table name: t1.t2.t3, it must be of the qualified form . (dots are not allowed in either name)"), + Error: errors.New("invalid table name: 't1.t2.t3', it must be of the qualified form . (dots are not allowed in either name)"), }, "unqualified": { - Error: errors.New("invalid table name: t1, it must be of the qualified form . (dots are not allowed in either name)"), + Error: errors.New("invalid table name: 't1', it must be of the qualified form . (dots are not allowed in either name)"), }, "badkeyspace": { Error: errors.New("VT05003: unknown database 'ks3' in vschema"), @@ -897,6 +898,282 @@ func TestVSchemaRoutingRules(t *testing.T) { assert.Equal(t, string(wantb), string(gotb), string(gotb)) } +func TestVSchemaMirrorRules(t *testing.T) { + input := vschemapb.SrvVSchema{ + MirrorRules: &vschemapb.MirrorRules{ + Rules: []*vschemapb.MirrorRule{ + // Empty FromTable not allowed. + { + FromTable: "", + ToTable: "ks2.ks2t1", + }, + // Invalid FromTable, needs to be .
[@]. + { + FromTable: "ks1", + ToTable: "ks2.ks2t1", + }, + // Invalid ToTable, needs to be .
. + { + FromTable: "ks1.ks1t1", + ToTable: "ks2", + }, + // Invalid ToTable, needs to be .
. + { + FromTable: "ks1.ks1t2", + ToTable: "ks2.ks2t2.c", + }, + // OK, unsharded => unsharded. + { + FromTable: "ks1.ks1t3", + ToTable: "ks2.ks2t3", + Percent: 50, + }, + // Invalid ToTable, needs to be .
. + { + FromTable: "ks1.ks1t4", + ToTable: "ks2.ks2t4@replica", + }, + // OK, unsharded@tablet-type => unsharded. + { + FromTable: "ks1.ks1t5@replica", + ToTable: "ks2.ks2t5", + }, + // Invalid FromTable tablet type.. + { + FromTable: "ks1.ks1t6@stone", + ToTable: "ks2.ks2t6", + }, + // OK, sharded => sharded. + { + FromTable: "ks3.ks3t1", + ToTable: "ks4.ks4t1", + Percent: 50, + }, + // OK, unsharded => sharded. + { + FromTable: "ks1.ks1t7", + ToTable: "ks4.ks4t1", + Percent: 50, + }, + // Destination sharded table must be defined in VSchema. + { + FromTable: "ks1.ks1t8", + ToTable: "ks4.ks4t2", + Percent: 50, + }, + // Source sharded table must be defined in VSchema. + { + FromTable: "ks3.ks3t2", + ToTable: "ks4.ks4t1", + Percent: 50, + }, + // Keyspaces that are the target of a rule may not be the + // source of another. + { + FromTable: "ks2.ks2t9", + ToTable: "ks4.ks4t1", + Percent: 50, + }, + }, + }, + RoutingRules: &vschemapb.RoutingRules{}, + Keyspaces: map[string]*vschemapb.Keyspace{ + "ks1": { + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Tables: map[string]*vschemapb.Table{}, + }, + "ks2": { + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Tables: map[string]*vschemapb.Table{}, + }, + "ks3": { + Sharded: true, + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Vindexes: map[string]*vschemapb.Vindex{ + "stfu1": { + Type: "stfu", + }, + }, + Tables: map[string]*vschemapb.Table{ + "ks3t1": { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Column: "id", + Name: "stfu1", + }, + }, + }, + }, + }, + "ks4": { + Sharded: true, + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Vindexes: map[string]*vschemapb.Vindex{ + "stfu1": { + Type: "stfu", + }, + }, + Tables: map[string]*vschemapb.Table{ + "ks4t1": { + ColumnVindexes: []*vschemapb.ColumnVindex{ + { + Column: "id", + Name: "stfu1", + }, + }, + }, + }, + }, + }, + } + got := BuildVSchema(&input, sqlparser.NewTestParser()) + + ks1 := &Keyspace{ + Name: "ks1", + Sharded: false, + } + ks2 := &Keyspace{ + Name: "ks2", + Sharded: false, + } + ks3 := &Keyspace{ + Name: "ks3", + Sharded: true, + } + ks4 := &Keyspace{ + Name: "ks4", + Sharded: true, + } + + vindex1 := &stFU{ + name: "stfu1", + } + + ks3t1 := &Table{ + Name: sqlparser.NewIdentifierCS("ks3t1"), + Keyspace: ks3, + ColumnVindexes: []*ColumnVindex{{ + Columns: []sqlparser.IdentifierCI{sqlparser.NewIdentifierCI("id")}, + Type: "stfu", + Name: "stfu1", + Vindex: vindex1, + isUnique: vindex1.IsUnique(), + cost: vindex1.Cost(), + }}, + } + ks3t1.Ordered = []*ColumnVindex{ + ks3t1.ColumnVindexes[0], + } + + ks4t1 := &Table{ + Name: sqlparser.NewIdentifierCS("ks4t1"), + Keyspace: ks4, + ColumnVindexes: []*ColumnVindex{{ + Columns: []sqlparser.IdentifierCI{sqlparser.NewIdentifierCI("id")}, + Type: "stfu", + Name: "stfu1", + Vindex: vindex1, + isUnique: vindex1.IsUnique(), + cost: vindex1.Cost(), + }}, + } + ks4t1.Ordered = []*ColumnVindex{ + ks4t1.ColumnVindexes[0], + } + + want := &VSchema{ + MirrorRules: map[string]*MirrorRule{ + "": { + Error: errors.New("from table: invalid table name: '', it must be of the qualified form . (dots are not allowed in either name)"), + }, + "ks1": { + Error: errors.New("from table: invalid table name: 'ks1', it must be of the qualified form . (dots are not allowed in either name)"), + }, + "ks1.ks1t1": { + Error: errors.New("to table: invalid table name: 'ks2', it must be of the qualified form . (dots are not allowed in either name)"), + }, + "ks1.ks1t2": { + Error: errors.New("to table: invalid table name: 'ks2.ks2t2.c', it must be of the qualified form . (dots are not allowed in either name)"), + }, + "ks1.ks1t3": { + Table: &Table{ + Name: sqlparser.NewIdentifierCS("ks2t3"), + }, + Percent: 50, + }, + "ks1.ks1t4": { + Error: errors.New("to table: tablet type may not be specified: 'ks2.ks2t4@replica'"), + }, + "ks1.ks1t5@replica": { + Table: &Table{ + Name: sqlparser.NewIdentifierCS("ks2t5"), + }, + }, + "ks1.ks1t6@stone": { + Error: errors.New("from table: invalid tablet type: 'ks1.ks1t6@stone'"), + }, + "ks3.ks3t1": { + Table: ks4t1, + Percent: 50, + }, + "ks1.ks1t7": { + Table: ks4t1, + Percent: 50, + }, + "ks1.ks1t8": { + Error: errors.New("to table: table ks4t2 not found"), + }, + "ks3.ks3t2": { + Error: errors.New("from table: table ks3t2 not found"), + }, + "ks2.ks2t9": { + Error: errors.New("mirror chaining is not allowed"), + }, + }, + RoutingRules: map[string]*RoutingRule{}, + Keyspaces: map[string]*KeyspaceSchema{ + "ks1": { + Keyspace: ks1, + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Tables: map[string]*Table{}, + Vindexes: map[string]Vindex{}, + }, + "ks2": { + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Keyspace: ks2, + Tables: map[string]*Table{}, + Vindexes: map[string]Vindex{}, + }, + "ks3": { + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Keyspace: ks3, + Tables: map[string]*Table{ + "ks3t1": ks3t1, + }, + Vindexes: map[string]Vindex{ + "stfu1": vindex1, + }, + }, + "ks4": { + ForeignKeyMode: vschemapb.Keyspace_unmanaged, + Keyspace: ks4, + Tables: map[string]*Table{ + "ks4t1": ks4t1, + }, + Vindexes: map[string]Vindex{ + "stfu1": vindex1, + }, + }, + }, + } + + gotb, err := json.MarshalIndent(got, "", " ") + assert.NoError(t, err) + wantb, err := json.MarshalIndent(want, "", " ") + assert.NoError(t, err) + assert.Equal(t, string(wantb), string(gotb), string(gotb)) +} + func TestChooseVindexForType(t *testing.T) { testcases := []struct { in querypb.Type @@ -1247,6 +1524,7 @@ func TestShardedVSchemaMultiColumnVindex(t *testing.T) { t1.ColumnVindexes[0], } want := &VSchema{ + MirrorRules: map[string]*MirrorRule{}, RoutingRules: map[string]*RoutingRule{}, globalTables: map[string]*Table{ "t1": t1, @@ -1323,6 +1601,7 @@ func TestShardedVSchemaNotOwned(t *testing.T) { t1.ColumnVindexes[1], t1.ColumnVindexes[0]} want := &VSchema{ + MirrorRules: map[string]*MirrorRule{}, RoutingRules: map[string]*RoutingRule{}, globalTables: map[string]*Table{ "t1": t1, @@ -1430,6 +1709,7 @@ func TestBuildVSchemaDupSeq(t *testing.T) { Keyspace: ksb, Type: "sequence"} want := &VSchema{ + MirrorRules: map[string]*MirrorRule{}, RoutingRules: map[string]*RoutingRule{}, globalTables: map[string]*Table{ "t1": nil, @@ -1491,6 +1771,7 @@ func TestBuildVSchemaDupTable(t *testing.T) { Keyspace: ksb, } want := &VSchema{ + MirrorRules: map[string]*MirrorRule{}, RoutingRules: map[string]*RoutingRule{}, globalTables: map[string]*Table{ "t1": nil, @@ -1620,6 +1901,7 @@ func TestBuildVSchemaDupVindex(t *testing.T) { t2.ColumnVindexes[0], } want := &VSchema{ + MirrorRules: map[string]*MirrorRule{}, RoutingRules: map[string]*RoutingRule{}, globalTables: map[string]*Table{ "t1": nil, @@ -2206,6 +2488,7 @@ func TestSequence(t *testing.T) { t2.ColumnVindexes[0], } want := &VSchema{ + MirrorRules: map[string]*MirrorRule{}, RoutingRules: map[string]*RoutingRule{}, globalTables: map[string]*Table{ "seq": seq, diff --git a/go/vt/vtgate/vschema_manager_test.go b/go/vt/vtgate/vschema_manager_test.go index 8dfb889df0d..8db0c2df05b 100644 --- a/go/vt/vtgate/vschema_manager_test.go +++ b/go/vt/vtgate/vschema_manager_test.go @@ -234,6 +234,7 @@ func TestVSchemaUpdate(t *testing.T) { }, }, expected: &vindexes.VSchema{ + MirrorRules: map[string]*vindexes.MirrorRule{}, RoutingRules: map[string]*vindexes.RoutingRule{}, Keyspaces: map[string]*vindexes.KeyspaceSchema{ "ks": { @@ -499,6 +500,7 @@ func TestVSchemaUDFsUpdate(t *testing.T) { }, nil) utils.MustMatchFn(".globalTables", ".uniqueVindexes")(t, &vindexes.VSchema{ + MirrorRules: map[string]*vindexes.MirrorRule{}, RoutingRules: map[string]*vindexes.RoutingRule{}, Keyspaces: map[string]*vindexes.KeyspaceSchema{ "ks": { @@ -821,6 +823,7 @@ func TestVSchemaUpdateWithFKReferenceToInternalTables(t *testing.T) { }, nil) utils.MustMatchFn(".globalTables", ".uniqueVindexes")(t, &vindexes.VSchema{ + MirrorRules: map[string]*vindexes.MirrorRule{}, RoutingRules: map[string]*vindexes.RoutingRule{}, Keyspaces: map[string]*vindexes.KeyspaceSchema{ "ks": { @@ -870,6 +873,7 @@ func makeTestVSchema(ks string, sharded bool, tbls map[string]*vindexes.Table) * func makeTestEmptyVSchema() *vindexes.VSchema { return &vindexes.VSchema{ + MirrorRules: map[string]*vindexes.MirrorRule{}, RoutingRules: map[string]*vindexes.RoutingRule{}, Keyspaces: map[string]*vindexes.KeyspaceSchema{}, } diff --git a/go/vt/vtgate/vstream_manager.go b/go/vt/vtgate/vstream_manager.go index e0d195853cf..beb556f21f5 100644 --- a/go/vt/vtgate/vstream_manager.go +++ b/go/vt/vtgate/vstream_manager.go @@ -61,6 +61,10 @@ const maxSkewTimeoutSeconds = 10 * 60 // for a vstream const tabletPickerContextTimeout = 90 * time.Second +// stopOnReshardDelay is how long we wait, at a minimum, after sending a reshard journal event before +// ending the stream from the tablet. +const stopOnReshardDelay = 500 * time.Millisecond + // vstream contains the metadata for one VStream request. type vstream struct { // mu protects parts of vgtid, the semantics of a send, and journaler. @@ -99,6 +103,10 @@ type vstream struct { // default behavior is to automatically migrate the resharded streams from the old to the new shards stopOnReshard bool + // This flag is set by the client, default is false. + // If true then the reshard journal events are sent in the stream irrespective of the stopOnReshard flag. + includeReshardJournalEvents bool + // mutex used to synchronize access to skew detection parameters skewMu sync.Mutex // channel is created whenever there is a skew detected. closing it implies the current skew has been fixed @@ -122,6 +130,8 @@ type vstream struct { ts *topo.Server tabletPickerOptions discovery.TabletPickerOptions + + flags *vtgatepb.VStreamFlags } type journalEvent struct { @@ -163,26 +173,28 @@ func (vsm *vstreamManager) VStream(ctx context.Context, tabletType topodatapb.Ta return fmt.Errorf("unable to get topo server") } vs := &vstream{ - vgtid: vgtid, - tabletType: tabletType, - optCells: flags.Cells, - filter: filter, - send: send, - resolver: vsm.resolver, - journaler: make(map[int64]*journalEvent), - minimizeSkew: flags.GetMinimizeSkew(), - stopOnReshard: flags.GetStopOnReshard(), - skewTimeoutSeconds: maxSkewTimeoutSeconds, - timestamps: make(map[string]int64), - vsm: vsm, - eventCh: make(chan []*binlogdatapb.VEvent), - heartbeatInterval: flags.GetHeartbeatInterval(), - ts: ts, - copyCompletedShard: make(map[string]struct{}), + vgtid: vgtid, + tabletType: tabletType, + optCells: flags.Cells, + filter: filter, + send: send, + resolver: vsm.resolver, + journaler: make(map[int64]*journalEvent), + minimizeSkew: flags.GetMinimizeSkew(), + stopOnReshard: flags.GetStopOnReshard(), + includeReshardJournalEvents: flags.GetIncludeReshardJournalEvents(), + skewTimeoutSeconds: maxSkewTimeoutSeconds, + timestamps: make(map[string]int64), + vsm: vsm, + eventCh: make(chan []*binlogdatapb.VEvent), + heartbeatInterval: flags.GetHeartbeatInterval(), + ts: ts, + copyCompletedShard: make(map[string]struct{}), tabletPickerOptions: discovery.TabletPickerOptions{ CellPreference: flags.GetCellPreference(), TabletOrder: flags.GetTabletOrder(), }, + flags: flags, } return vs.stream(ctx) } @@ -269,7 +281,7 @@ func (vsm *vstreamManager) resolveParams(ctx context.Context, tabletType topodat } } - //TODO add tablepk validations + // TODO add tablepk validations return newvgtid, filter, flags, nil } @@ -575,15 +587,24 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha }) }() - log.Infof("Starting to vstream from %s", tablet.Alias.String()) + var options *binlogdatapb.VStreamOptions + const SidecarDBHeartbeatTableName = "heartbeat" + if vs.flags.GetStreamKeyspaceHeartbeats() { + options = &binlogdatapb.VStreamOptions{ + InternalTables: []string{SidecarDBHeartbeatTableName}, + } + } + // Safe to access sgtid.Gtid here (because it can't change until streaming begins). req := &binlogdatapb.VStreamRequest{ Target: target, Position: sgtid.Gtid, Filter: vs.filter, TableLastPKs: sgtid.TablePKs, + Options: options, } var vstreamCreatedOnce sync.Once + log.Infof("Starting to vstream from %s, with req %+v", topoproto.TabletAliasString(tablet.Alias), req) err = tabletConn.VStream(ctx, req, func(events []*binlogdatapb.VEvent) error { // We received a valid event. Reset error count. errCount = 0 @@ -608,7 +629,7 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha } sendevents := make([]*binlogdatapb.VEvent, 0, len(events)) - for _, event := range events { + for i, event := range events { switch event.Type { case binlogdatapb.VEventType_FIELD: // Update table names and send. @@ -658,12 +679,23 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha if err := vs.alignStreams(ctx, event, sgtid.Keyspace, sgtid.Shard); err != nil { return err } - case binlogdatapb.VEventType_JOURNAL: journal := event.Journal - // Journal events are not sent to clients by default, but only when StopOnReshard is set - if vs.stopOnReshard && journal.MigrationType == binlogdatapb.MigrationType_SHARDS { + // Journal events are not sent to clients by default, but only when + // IncludeReshardJournalEvents or StopOnReshard is set. + if (vs.includeReshardJournalEvents || vs.stopOnReshard) && + journal.MigrationType == binlogdatapb.MigrationType_SHARDS { sendevents = append(sendevents, event) + // Read any subsequent events until we get the VGTID->COMMIT events that + // always follow the JOURNAL event which is generated as a result of + // an autocommit insert into the _vt.resharding_journal table on the + // tablet. + for j := i + 1; j < len(events); j++ { + sendevents = append(sendevents, events[j]) + if events[j].Type == binlogdatapb.VEventType_COMMIT { + break + } + } eventss = append(eventss, sendevents) if err := vs.sendAll(ctx, sgtid, eventss); err != nil { return err @@ -676,12 +708,28 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha return err } if je != nil { - // Wait till all other participants converge and return EOF. + var endTimer *time.Timer + if vs.stopOnReshard { + // We're going to be ending the tablet stream, along with the VStream, so + // we ensure a reasonable minimum amount of time is alloted for clients + // to Recv the journal event before the VStream's context is cancelled + // (which would cause the grpc SendMsg or RecvMsg to fail). If the client + // doesn't Recv the journal event before the VStream ends then they'll + // have to resume from the last ShardGtid they received before the + // journal event. + endTimer = time.NewTimer(stopOnReshardDelay) + defer endTimer.Stop() + } + // Wait until all other participants converge and then return EOF after + // any minimum delay has passed. journalDone = je.done select { case <-ctx.Done(): return ctx.Err() case <-journalDone: + if endTimer != nil { + <-endTimer.C + } return io.EOF } } @@ -690,7 +738,6 @@ func (vs *vstream) streamFromTablet(ctx context.Context, sgtid *binlogdatapb.Sha } lag := event.CurrentTime/1e9 - event.Timestamp vs.vsm.vstreamsLag.Set(labels, lag) - } if len(sendevents) != 0 { eventss = append(eventss, sendevents) @@ -954,6 +1001,9 @@ func (vs *vstream) keyspaceHasBeenResharded(ctx context.Context, keyspace string return false, err } + vs.mu.Lock() + defer vs.mu.Unlock() + // First check the typical case, where the VGTID shards match the serving shards. // In that case it's NOT possible that an applicable reshard has happened because // the VGTID contains shards that are all serving. diff --git a/go/vt/vtgate/vstream_manager_test.go b/go/vt/vtgate/vstream_manager_test.go index e51bd2785dd..4e10e60c758 100644 --- a/go/vt/vtgate/vstream_manager_test.go +++ b/go/vt/vtgate/vstream_manager_test.go @@ -458,7 +458,7 @@ func TestVStreamRetriableErrors(t *testing.T) { // Always have the local cell tablet error so it's ignored on retry and we pick the other one // if the error requires ignoring the tablet on retry. - sbc0.AddVStreamEvents(nil, vterrors.Errorf(tcase.code, tcase.msg)) + sbc0.AddVStreamEvents(nil, vterrors.New(tcase.code, tcase.msg)) if tcase.ignoreTablet { sbc1.AddVStreamEvents(commit, nil) diff --git a/go/vt/vtgate/vtgate.go b/go/vt/vtgate/vtgate.go index 9ea5da7a7e3..e9e7cd65011 100644 --- a/go/vt/vtgate/vtgate.go +++ b/go/vt/vtgate/vtgate.go @@ -30,8 +30,6 @@ import ( "github.com/spf13/pflag" - "vitess.io/vitess/go/vt/vtenv" - "vitess.io/vitess/go/acl" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/stats" @@ -51,9 +49,11 @@ import ( "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/srvtopo" "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" vtschema "vitess.io/vitess/go/vt/vtgate/schema" + "vitess.io/vitess/go/vt/vtgate/txresolver" "vitess.io/vitess/go/vt/vtgate/vtgateservice" ) @@ -284,6 +284,8 @@ func Init( tc := NewTxConn(gw, getTxMode()) // ScatterConn depends on TxConn to perform forced rollbacks. sc := NewScatterConn("VttabletCall", tc, gw) + // TxResolver depends on TxConn to complete distributed transaction. + tr := txresolver.NewTxResolver(gw.hc.Subscribe(), tc) srvResolver := srvtopo.NewResolver(serv, gw, cell) resolver := NewResolver(srvResolver, serv, cell, sc) vsm := newVStreamManager(srvResolver, serv, cell) @@ -360,6 +362,7 @@ func Init( if st != nil && enableSchemaChangeSignal { st.Start() } + tr.Start() srv := initMySQLProtocol(vtgateInst) if srv != nil { servenv.OnTermSync(srv.shutdownMysqlProtocolAndDrain) @@ -370,9 +373,11 @@ func Init( if st != nil && enableSchemaChangeSignal { st.Stop() } + tr.Stop() }) vtgateInst.registerDebugHealthHandler() vtgateInst.registerDebugEnvHandler() + vtgateInst.registerDebugBalancerHandler() initAPI(gw.hc) return vtgateInst @@ -437,6 +442,12 @@ func (vtg *VTGate) registerDebugHealthHandler() { }) } +func (vtg *VTGate) registerDebugBalancerHandler() { + http.HandleFunc("/debug/balancer", func(w http.ResponseWriter, r *http.Request) { + vtg.Gateway().DebugBalancerHandler(w, r) + }) +} + // IsHealthy returns nil if server is healthy. // Otherwise, it returns an error indicating the reason. func (vtg *VTGate) IsHealthy() error { @@ -552,11 +563,6 @@ func (vtg *VTGate) CloseSession(ctx context.Context, session *vtgatepb.Session) return vtg.executor.CloseSession(ctx, NewSafeSession(session)) } -// ResolveTransaction resolves the specified 2PC transaction. -func (vtg *VTGate) ResolveTransaction(ctx context.Context, dtid string) error { - return formatError(vtg.txConn.Resolve(ctx, dtid)) -} - // Prepare supports non-streaming prepare statement query with multi shards func (vtg *VTGate) Prepare(ctx context.Context, session *vtgatepb.Session, sql string, bindVariables map[string]*querypb.BindVariable) (newSession *vtgatepb.Session, fld []*querypb.Field, err error) { // In this context, we don't care if we can't fully parse destination diff --git a/go/vt/vtgate/vtgateconn/vtgateconn.go b/go/vt/vtgate/vtgateconn/vtgateconn.go index ae0da3fdf43..38899550c1d 100644 --- a/go/vt/vtgate/vtgateconn/vtgateconn.go +++ b/go/vt/vtgate/vtgateconn/vtgateconn.go @@ -87,11 +87,6 @@ func (conn *VTGateConn) SessionFromPb(sn *vtgatepb.Session) *VTGateSession { } } -// ResolveTransaction resolves the 2pc transaction. -func (conn *VTGateConn) ResolveTransaction(ctx context.Context, dtid string) error { - return conn.impl.ResolveTransaction(ctx, dtid) -} - // Close must be called for releasing resources. func (conn *VTGateConn) Close() { conn.impl.Close() @@ -178,9 +173,6 @@ type Impl interface { // CloseSession closes the session provided by rolling back any active transaction. CloseSession(ctx context.Context, session *vtgatepb.Session) error - // ResolveTransaction resolves the specified 2pc transaction. - ResolveTransaction(ctx context.Context, dtid string) error - // VStream streams binlogevents VStream(ctx context.Context, tabletType topodatapb.TabletType, vgtid *binlogdatapb.VGtid, filter *binlogdatapb.Filter, flags *vtgatepb.VStreamFlags) (VStreamReader, error) diff --git a/go/vt/vtgate/vtgateservice/interface.go b/go/vt/vtgate/vtgateservice/interface.go index bbfb2b2657e..c829f553d26 100644 --- a/go/vt/vtgate/vtgateservice/interface.go +++ b/go/vt/vtgate/vtgateservice/interface.go @@ -42,9 +42,6 @@ type VTGateService interface { // but does not affect the query statistics. CloseSession(ctx context.Context, session *vtgatepb.Session) error - // 2PC support - ResolveTransaction(ctx context.Context, dtid string) error - // Update Stream methods VStream(ctx context.Context, tabletType topodatapb.TabletType, vgtid *binlogdatapb.VGtid, filter *binlogdatapb.Filter, flags *vtgatepb.VStreamFlags, send func([]*binlogdatapb.VEvent) error) error diff --git a/go/vt/vtorc/inst/analysis_dao.go b/go/vt/vtorc/inst/analysis_dao.go index 0268a8b183a..99df358e330 100644 --- a/go/vt/vtorc/inst/analysis_dao.go +++ b/go/vt/vtorc/inst/analysis_dao.go @@ -294,6 +294,11 @@ func GetReplicationAnalysis(keyspace string, shard string, hints *ReplicationAna return nil } + // We don't want to run any fixes on any non-replica type tablet. + if tablet.Type != topodatapb.TabletType_PRIMARY && !topo.IsReplicaType(tablet.Type) { + return nil + } + primaryTablet := &topodatapb.Tablet{} if str := m.GetString("primary_tablet_info"); str != "" { if err := opts.Unmarshal([]byte(str), primaryTablet); err != nil { diff --git a/go/vt/vtorc/inst/analysis_dao_test.go b/go/vt/vtorc/inst/analysis_dao_test.go index a83e975c747..c061d54ebb3 100644 --- a/go/vt/vtorc/inst/analysis_dao_test.go +++ b/go/vt/vtorc/inst/analysis_dao_test.go @@ -424,6 +424,47 @@ func TestGetReplicationAnalysisDecision(t *testing.T) { keyspaceWanted: "ks", shardWanted: "0", codeWanted: ReplicationStopped, + }, { + name: "No recoveries on drained tablets", + info: []*test.InfoForRecoveryAnalysis{{ + TabletInfo: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, + Hostname: "localhost", + Keyspace: "ks", + Shard: "0", + Type: topodatapb.TabletType_PRIMARY, + MysqlHostname: "localhost", + MysqlPort: 6708, + }, + DurabilityPolicy: "none", + LastCheckValid: 1, + CountReplicas: 4, + CountValidReplicas: 4, + CountValidReplicatingReplicas: 3, + CountValidOracleGTIDReplicas: 4, + CountLoggingReplicas: 2, + IsPrimary: 1, + }, { + TabletInfo: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 100}, + Hostname: "localhost", + Keyspace: "ks", + Shard: "0", + Type: topodatapb.TabletType_DRAINED, + MysqlHostname: "localhost", + MysqlPort: 6709, + }, + DurabilityPolicy: "none", + PrimaryTabletInfo: &topodatapb.Tablet{ + Alias: &topodatapb.TabletAlias{Cell: "zon1", Uid: 101}, + }, + LastCheckValid: 1, + ReadOnly: 1, + ReplicationStopped: 1, + }}, + keyspaceWanted: "ks", + shardWanted: "0", + codeWanted: NoProblem, }, { name: "ReplicaMisconfigured", info: []*test.InfoForRecoveryAnalysis{{ diff --git a/go/vt/vtorc/inst/instance_dao.go b/go/vt/vtorc/inst/instance_dao.go index 0615cbc0cde..ec0288cc423 100644 --- a/go/vt/vtorc/inst/instance_dao.go +++ b/go/vt/vtorc/inst/instance_dao.go @@ -61,6 +61,7 @@ var forgetAliases *cache.Cache var ( readTopologyInstanceCounter = stats.NewCounter("InstanceReadTopology", "Number of times an instance was read from the topology") readInstanceCounter = stats.NewCounter("InstanceRead", "Number of times an instance was read") + currentErrantGTIDCount = stats.NewGaugesWithSingleLabel("CurrentErrantGTIDCount", "Number of errant GTIDs a vttablet currently has", "TabletAlias") backendWrites = collection.CreateOrReturnCollection("BACKEND_WRITES") writeBufferLatency = stopwatch.NewNamedStopwatch() ) @@ -141,8 +142,8 @@ func logReadTopologyInstanceError(tabletAlias string, hint string, err error) er strings.Replace(hint, "%", "%%", -1), // escape % err) } - log.Errorf(msg) - return fmt.Errorf(msg) + log.Error(msg) + return errors.New(msg) } // RegisterStats registers stats from the inst package @@ -378,6 +379,11 @@ Cleanup: redactedPrimaryExecutedGtidSet.RemoveUUID(instance.SourceUUID) instance.GtidErrant, err = replication.Subtract(redactedExecutedGtidSet.String(), redactedPrimaryExecutedGtidSet.String()) + if err == nil { + var gtidCount int64 + gtidCount, err = replication.GTIDCount(instance.GtidErrant) + currentErrantGTIDCount.Set(tabletAlias, gtidCount) + } } } } @@ -933,7 +939,7 @@ func mkInsertOdkuForInstances(instances []*Instance, instanceWasActuallyFound bo if err != nil { errMsg := fmt.Sprintf("Failed to build query: %v", err) log.Errorf(errMsg) - return sql, args, fmt.Errorf(errMsg) + return sql, args, errors.New(errMsg) } return sql, args, nil @@ -1031,11 +1037,14 @@ func ForgetInstance(tabletAlias string) error { if tabletAlias == "" { errMsg := "ForgetInstance(): empty tabletAlias" log.Errorf(errMsg) - return fmt.Errorf(errMsg) + return errors.New(errMsg) } forgetAliases.Set(tabletAlias, true, cache.DefaultExpiration) log.Infof("Forgetting: %v", tabletAlias) + // Remove this tablet from errant GTID count metric. + currentErrantGTIDCount.Reset(tabletAlias) + // Delete from the 'vitess_tablet' table. _, err := db.ExecVTOrc(` delete @@ -1069,8 +1078,8 @@ func ForgetInstance(tabletAlias string) error { } if rows == 0 { errMsg := fmt.Sprintf("ForgetInstance(): tablet %+v not found", tabletAlias) - log.Errorf(errMsg) - return fmt.Errorf(errMsg) + log.Error(errMsg) + return errors.New(errMsg) } _ = AuditOperation("forget", tabletAlias, "") return nil diff --git a/go/vt/vtorc/logic/disable_recovery.go b/go/vt/vtorc/logic/disable_recovery.go index 4a3766055d2..74aa291e17a 100644 --- a/go/vt/vtorc/logic/disable_recovery.go +++ b/go/vt/vtorc/logic/disable_recovery.go @@ -30,6 +30,7 @@ package logic // go to the database each time. import ( + "errors" "fmt" "vitess.io/vitess/go/vt/external/golib/sqlutils" @@ -55,7 +56,7 @@ func IsRecoveryDisabled() (disabled bool, err error) { if err != nil { errMsg := fmt.Sprintf("recovery.IsRecoveryDisabled(): %v", err) log.Errorf(errMsg) - err = fmt.Errorf(errMsg) + err = errors.New(errMsg) } return disabled, err } diff --git a/go/vt/vtorc/logic/tablet_discovery.go b/go/vt/vtorc/logic/tablet_discovery.go index 593b846a72e..25820bc5184 100644 --- a/go/vt/vtorc/logic/tablet_discovery.go +++ b/go/vt/vtorc/logic/tablet_discovery.go @@ -204,9 +204,6 @@ func refreshTablets(tablets map[string]*topo.TabletInfo, query string, args []an var wg sync.WaitGroup for _, tabletInfo := range tablets { tablet := tabletInfo.Tablet - if tablet.Type != topodatapb.TabletType_PRIMARY && !topo.IsReplicaType(tablet.Type) { - continue - } tabletAliasString := topoproto.TabletAliasString(tablet.Alias) latestInstances[tabletAliasString] = true old, err := inst.ReadTablet(tabletAliasString) diff --git a/go/vt/vtorc/logic/tablet_discovery_test.go b/go/vt/vtorc/logic/tablet_discovery_test.go index 7acb29dcc5b..bc9eeba1fb7 100644 --- a/go/vt/vtorc/logic/tablet_discovery_test.go +++ b/go/vt/vtorc/logic/tablet_discovery_test.go @@ -200,6 +200,8 @@ func TestRefreshTabletsInKeyspaceShard(t *testing.T) { return nil }) tab100.MysqlPort = 100 + // We refresh once more to ensure we don't affect the next tests since we've made a change again. + refreshTabletsInKeyspaceShard(ctx, keyspace, shard, func(tabletAlias string) {}, false, nil) }() // Let's assume tab100 restarted on a different pod. This would change its tablet hostname and port _, err = ts.UpdateTabletFields(context.Background(), tab100.Alias, func(tablet *topodatapb.Tablet) error { @@ -212,6 +214,26 @@ func TestRefreshTabletsInKeyspaceShard(t *testing.T) { // Also the old tablet should be forgotten verifyRefreshTabletsInKeyspaceShard(t, false, 1, tablets, nil) }) + + t.Run("Replica becomes a drained tablet", func(t *testing.T) { + defer func() { + _, err = ts.UpdateTabletFields(context.Background(), tab101.Alias, func(tablet *topodatapb.Tablet) error { + tablet.Type = topodatapb.TabletType_REPLICA + return nil + }) + tab101.Type = topodatapb.TabletType_REPLICA + // We refresh once more to ensure we don't affect the next tests since we've made a change again. + refreshTabletsInKeyspaceShard(ctx, keyspace, shard, func(tabletAlias string) {}, false, nil) + }() + // A replica tablet can be converted to drained type if it has an errant GTID. + _, err = ts.UpdateTabletFields(context.Background(), tab101.Alias, func(tablet *topodatapb.Tablet) error { + tablet.Type = topodatapb.TabletType_DRAINED + return nil + }) + tab101.Type = topodatapb.TabletType_DRAINED + // We expect 1 tablet to be refreshed since its type has been changed. + verifyRefreshTabletsInKeyspaceShard(t, false, 1, tablets, nil) + }) } func TestShardPrimary(t *testing.T) { diff --git a/go/vt/vtorc/logic/topology_recovery_dao.go b/go/vt/vtorc/logic/topology_recovery_dao.go index e8af34bdad4..1920da4dcd8 100644 --- a/go/vt/vtorc/logic/topology_recovery_dao.go +++ b/go/vt/vtorc/logic/topology_recovery_dao.go @@ -17,6 +17,7 @@ package logic import ( + "errors" "fmt" "strings" @@ -121,7 +122,7 @@ func AttemptRecoveryRegistration(analysisEntry *inst.ReplicationAnalysis) (*Topo if len(recoveries) > 0 { errMsg := fmt.Sprintf("AttemptRecoveryRegistration: Active recovery (id:%v) in the cluster %s:%s for %s", recoveries[0].ID, analysisEntry.ClusterDetails.Keyspace, analysisEntry.ClusterDetails.Shard, recoveries[0].AnalysisEntry.Analysis) log.Errorf(errMsg) - return nil, fmt.Errorf(errMsg) + return nil, errors.New(errMsg) } topologyRecovery := NewTopologyRecovery(*analysisEntry) diff --git a/go/vt/vttablet/common/config.go b/go/vt/vttablet/common/config.go new file mode 100644 index 00000000000..72047ce4580 --- /dev/null +++ b/go/vt/vttablet/common/config.go @@ -0,0 +1,281 @@ +/* +Copyright 2024 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 vttablet + +import ( + "encoding/json" + "fmt" + "maps" + "strconv" + "strings" + "sync" + "time" +) + +/* + This file contains the model for all the configuration parameters for VReplication workflows. It also provides methods to + initialize the default configuration and to override the default configuration with user-provided values. The overrides + are stored in the `config` sub-document of the `options` attribute in `_vt.vreplication` and merged with the defaults + when the workflow is initialized. +*/ + +// VReplicationConfig has the all the configuration parameters for VReplication workflows, both applicable on the +// target (vreplication)and the source (vstreamer) side. +type VReplicationConfig struct { + // Config parameters applicable to the target side (vreplication) + ExperimentalFlags int64 + NetReadTimeout int + NetWriteTimeout int + CopyPhaseDuration time.Duration + RetryDelay time.Duration + MaxTimeToRetryError time.Duration + RelayLogMaxSize int + RelayLogMaxItems int + ReplicaLagTolerance time.Duration + HeartbeatUpdateInterval int + StoreCompressedGTID bool + ParallelInsertWorkers int + TabletTypesStr string + + // Config parameters applicable to the source side (vstreamer) + // The coresponding Override fields are used to determine if the user has provided a value for the parameter so + // that they can be sent in the VStreamer API calls to the source. + VStreamPacketSize int + VStreamPacketSizeOverride bool + VStreamDynamicPacketSize bool + VStreamDynamicPacketSizeOverride bool + VStreamBinlogRotationThreshold int64 + VStreamBinlogRotationThresholdOverride bool + + // Overrides is a map of user-provided configuration values that override the default configuration. + Overrides map[string]string +} + +var configMutex sync.Mutex + +// DefaultVReplicationConfig has the default values for VReplicationConfig initialized from the vttablet flags +// when the workflow is initialized. +var DefaultVReplicationConfig *VReplicationConfig + +// GetVReplicationConfigDefaults returns the default VReplicationConfig. If `useCached` is true, it returns the previously +// loaded configuration. Otherwise it reloads the configuration from the vttablet flags. useCached is set to false +// when the vttablet flags are updated in unit tests. +func GetVReplicationConfigDefaults(useCached bool) *VReplicationConfig { + configMutex.Lock() + defer configMutex.Unlock() + if useCached && DefaultVReplicationConfig != nil { + return DefaultVReplicationConfig + } + DefaultVReplicationConfig = &VReplicationConfig{ + ExperimentalFlags: vreplicationExperimentalFlags, + NetReadTimeout: vreplicationNetReadTimeout, + NetWriteTimeout: vreplicationNetWriteTimeout, + CopyPhaseDuration: vreplicationCopyPhaseDuration, + RetryDelay: vreplicationRetryDelay, + MaxTimeToRetryError: vreplicationMaxTimeToRetryError, + RelayLogMaxSize: vreplicationRelayLogMaxSize, + RelayLogMaxItems: vreplicationRelayLogMaxItems, + ReplicaLagTolerance: vreplicationReplicaLagTolerance, + HeartbeatUpdateInterval: vreplicationHeartbeatUpdateInterval, + StoreCompressedGTID: vreplicationStoreCompressedGTID, + ParallelInsertWorkers: vreplicationParallelInsertWorkers, + TabletTypesStr: vreplicationTabletTypesStr, + + VStreamPacketSizeOverride: false, + VStreamPacketSize: VStreamerDefaultPacketSize, + VStreamDynamicPacketSizeOverride: false, + VStreamDynamicPacketSize: VStreamerUseDynamicPacketSize, + VStreamBinlogRotationThresholdOverride: false, + VStreamBinlogRotationThreshold: VStreamerBinlogRotationThreshold, + + Overrides: make(map[string]string), + } + return DefaultVReplicationConfig +} + +// InitVReplicationConfigDefaults initializes the default VReplicationConfig in an idempotent way. +func InitVReplicationConfigDefaults() *VReplicationConfig { + return GetVReplicationConfigDefaults(true) +} + +// GetDefaultVReplicationConfig returns a copy of the default VReplicationConfig. +func GetDefaultVReplicationConfig() *VReplicationConfig { + c := &VReplicationConfig{} + defaultConfig := GetVReplicationConfigDefaults(true) + *c = *defaultConfig + return c +} + +// NewVReplicationConfig creates a new VReplicationConfig by merging the default configuration with the user-provided +// overrides. It returns an error if the user-provided values are invalid. +func NewVReplicationConfig(overrides map[string]string) (*VReplicationConfig, error) { + c := GetDefaultVReplicationConfig() + c.Overrides = maps.Clone(overrides) + var errors []string + getError := func(k, v string) string { + return fmt.Sprintf("invalid value for %s: %s", k, v) + } + for k, v := range overrides { + if v == "" { + continue + } + switch k { + case "vreplication_experimental_flags": + value, err := strconv.ParseInt(v, 10, 64) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.ExperimentalFlags = value + } + case "vreplication_net_read_timeout": + value, err := strconv.ParseInt(v, 10, 64) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.NetReadTimeout = int(value) + } + case "vreplication_net_write_timeout": + value, err := strconv.ParseInt(v, 10, 64) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.NetWriteTimeout = int(value) + } + case "vreplication_copy_phase_duration": + value, err := time.ParseDuration(v) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.CopyPhaseDuration = value + } + case "vreplication_retry_delay": + value, err := time.ParseDuration(v) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.RetryDelay = value + } + case "vreplication_max_time_to_retry_on_error": + value, err := time.ParseDuration(v) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.MaxTimeToRetryError = value + } + case "relay_log_max_size": + value, err := strconv.ParseInt(v, 10, 64) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.RelayLogMaxSize = int(value) + } + case "relay_log_max_items": + value, err := strconv.ParseInt(v, 10, 64) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.RelayLogMaxItems = int(value) + } + case "vreplication_replica_lag_tolerance": + value, err := time.ParseDuration(v) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.ReplicaLagTolerance = value + } + case "vreplication_heartbeat_update_interval": + value, err := strconv.ParseInt(v, 10, 64) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.HeartbeatUpdateInterval = int(value) + } + case "vreplication_store_compressed_gtid": + value, err := strconv.ParseBool(v) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.StoreCompressedGTID = value + } + case "vreplication-parallel-insert-workers": + value, err := strconv.ParseInt(v, 10, 64) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.ParallelInsertWorkers = int(value) + } + case "vstream_packet_size": + value, err := strconv.ParseInt(v, 10, 64) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.VStreamPacketSizeOverride = true + c.VStreamPacketSize = int(value) + } + case "vstream_dynamic_packet_size": + value, err := strconv.ParseBool(v) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.VStreamDynamicPacketSizeOverride = true + c.VStreamDynamicPacketSize = value + } + case "vstream_binlog_rotation_threshold": + value, err := strconv.ParseInt(v, 10, 64) + if err != nil { + errors = append(errors, getError(k, v)) + } else { + c.VStreamBinlogRotationThresholdOverride = true + c.VStreamBinlogRotationThreshold = value + } + default: + errors = append(errors, fmt.Sprintf("unknown vreplication config flag: %s", k)) + } + } + if len(errors) > 0 { + return c, fmt.Errorf("%s", strings.Join(errors, ", ")) + } + return c, nil +} + +// Map returns a map of the VReplicationConfig: the keys are the flag names and the values are string representations. +// Used in tests to compare the expected and actual configuration values and in validations to check if the user-provided +// keys are one of those that are supported. +func (c VReplicationConfig) Map() map[string]string { + return map[string]string{ + "vreplication_experimental_flags": strconv.FormatInt(c.ExperimentalFlags, 10), + "vreplication_net_read_timeout": strconv.Itoa(c.NetReadTimeout), + "vreplication_net_write_timeout": strconv.Itoa(c.NetWriteTimeout), + "vreplication_copy_phase_duration": c.CopyPhaseDuration.String(), + "vreplication_retry_delay": c.RetryDelay.String(), + "vreplication_max_time_to_retry_on_error": c.MaxTimeToRetryError.String(), + "relay_log_max_size": strconv.Itoa(c.RelayLogMaxSize), + "relay_log_max_items": strconv.Itoa(c.RelayLogMaxItems), + "vreplication_replica_lag_tolerance": c.ReplicaLagTolerance.String(), + "vreplication_heartbeat_update_interval": strconv.Itoa(c.HeartbeatUpdateInterval), + "vreplication_store_compressed_gtid": strconv.FormatBool(c.StoreCompressedGTID), + "vreplication-parallel-insert-workers": strconv.Itoa(c.ParallelInsertWorkers), + "vstream_packet_size": strconv.Itoa(c.VStreamPacketSize), + "vstream_dynamic_packet_size": strconv.FormatBool(c.VStreamDynamicPacketSize), + "vstream_binlog_rotation_threshold": strconv.FormatInt(c.VStreamBinlogRotationThreshold, 10), + } +} + +func (c VReplicationConfig) String() string { + s, _ := json.Marshal(c.Map()) + return string(s) +} diff --git a/go/vt/vttablet/common/config_test.go b/go/vt/vttablet/common/config_test.go new file mode 100644 index 00000000000..c73259036f2 --- /dev/null +++ b/go/vt/vttablet/common/config_test.go @@ -0,0 +1,159 @@ +/* +Copyright 2024 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 vttablet + +import ( + "strconv" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestNewVReplicationConfig(t *testing.T) { + InitVReplicationConfigDefaults() + tests := []struct { + name string + config map[string]string + wantErr int + want *VReplicationConfig + }{ + { + name: "Valid values", + config: map[string]string{ + "vreplication_experimental_flags": "3", + "vreplication_net_read_timeout": "100", + "vreplication_net_write_timeout": "200", + "vreplication_copy_phase_duration": "2h", + "vreplication_retry_delay": "10s", + "vreplication_max_time_to_retry_on_error": "1h", + "relay_log_max_size": "500000", + "relay_log_max_items": "10000", + "vreplication_replica_lag_tolerance": "2m", + "vreplication_heartbeat_update_interval": "2", + "vreplication_store_compressed_gtid": "true", + "vreplication-parallel-insert-workers": "4", + "vstream_packet_size": "1024", + "vstream_dynamic_packet_size": "false", + "vstream_binlog_rotation_threshold": "2048", + }, + wantErr: 0, + want: &VReplicationConfig{ + ExperimentalFlags: 3, + NetReadTimeout: 100, + NetWriteTimeout: 200, + CopyPhaseDuration: 2 * time.Hour, + RetryDelay: 10 * time.Second, + MaxTimeToRetryError: 1 * time.Hour, + RelayLogMaxSize: 500000, + RelayLogMaxItems: 10000, + ReplicaLagTolerance: 2 * time.Minute, + HeartbeatUpdateInterval: 2, + StoreCompressedGTID: true, + ParallelInsertWorkers: 4, + VStreamPacketSize: 1024, + VStreamDynamicPacketSize: false, + VStreamBinlogRotationThreshold: 2048, + TabletTypesStr: DefaultVReplicationConfig.TabletTypesStr, + VStreamPacketSizeOverride: true, + VStreamDynamicPacketSizeOverride: true, + VStreamBinlogRotationThresholdOverride: true, + }, + }, + { + name: "Invalid values", + config: map[string]string{ + "vreplication_experimental_flags": "invalid", + "vreplication_net_read_timeout": "100.0", + "vreplication_net_write_timeout": "invalid", + "vreplication_copy_phase_duration": "invalid", + "vreplication_retry_delay": "invalid", + "vreplication_max_time_to_retry_on_error": "invalid", + "relay_log_max_size": "invalid", + "relay_log_max_items": "invalid", + "vreplication_replica_lag_tolerance": "invalid", + "vreplication_heartbeat_update_interval": "invalid", + "vreplication_store_compressed_gtid": "nottrue", + "vreplication-parallel-insert-workers": "invalid", + "vstream_packet_size": "invalid", + "vstream_dynamic_packet_size": "waar", + "vstream_binlog_rotation_threshold": "invalid", + }, + wantErr: 15, + }, + { + name: "Partial values", + config: map[string]string{ + "vreplication_experimental_flags": "5", + "vreplication_net_read_timeout": "150", + "vstream_dynamic_packet_size": strconv.FormatBool(!DefaultVReplicationConfig.VStreamDynamicPacketSize), + "vreplication_store_compressed_gtid": strconv.FormatBool(!DefaultVReplicationConfig.StoreCompressedGTID), + }, + wantErr: 0, + want: &VReplicationConfig{ + ExperimentalFlags: 5, + NetReadTimeout: 150, + NetWriteTimeout: DefaultVReplicationConfig.NetWriteTimeout, + CopyPhaseDuration: DefaultVReplicationConfig.CopyPhaseDuration, + RetryDelay: DefaultVReplicationConfig.RetryDelay, + MaxTimeToRetryError: DefaultVReplicationConfig.MaxTimeToRetryError, + RelayLogMaxSize: DefaultVReplicationConfig.RelayLogMaxSize, + RelayLogMaxItems: DefaultVReplicationConfig.RelayLogMaxItems, + ReplicaLagTolerance: DefaultVReplicationConfig.ReplicaLagTolerance, + HeartbeatUpdateInterval: DefaultVReplicationConfig.HeartbeatUpdateInterval, + StoreCompressedGTID: !DefaultVReplicationConfig.StoreCompressedGTID, + ParallelInsertWorkers: DefaultVReplicationConfig.ParallelInsertWorkers, + VStreamPacketSize: DefaultVReplicationConfig.VStreamPacketSize, + VStreamDynamicPacketSize: !DefaultVReplicationConfig.VStreamDynamicPacketSize, + VStreamBinlogRotationThreshold: DefaultVReplicationConfig.VStreamBinlogRotationThreshold, + VStreamDynamicPacketSizeOverride: true, + TabletTypesStr: DefaultVReplicationConfig.TabletTypesStr, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + InitVReplicationConfigDefaults() + got, err := NewVReplicationConfig(tt.config) + if tt.wantErr == 0 { + require.EqualValuesf(t, tt.config, got.Overrides, + "NewVReplicationConfig() overrides got = %v, want %v", got.Overrides, tt.config) + + } + if tt.wantErr > 0 && err == nil || tt.wantErr == 0 && err != nil { + t.Errorf("NewVReplicationConfig() got num errors = %v, want %v", err, tt.wantErr) + } + if tt.wantErr > 0 && err != nil { + errors := strings.Split(err.Error(), ", ") + if len(errors) != tt.wantErr { + t.Errorf("NewVReplicationConfig() got num errors = %v, want %v", len(errors), tt.wantErr) + } + } + if tt.want == nil { + require.EqualValuesf(t, DefaultVReplicationConfig.Map(), got.Map(), + "NewVReplicationConfig() Map got = %v, want %v", got.Map(), DefaultVReplicationConfig.Map()) + } else { + tt.want.Overrides = tt.config + require.EqualValues(t, tt.want.Map(), got.Map(), + "NewVReplicationConfig() Map got = %v, want %v", got.Map(), tt.want.Map()) + } + + }) + } +} diff --git a/go/vt/vttablet/common/flags.go b/go/vt/vttablet/common/flags.go new file mode 100644 index 00000000000..f9775b8af3e --- /dev/null +++ b/go/vt/vttablet/common/flags.go @@ -0,0 +1,97 @@ +/* +Copyright 2024 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 vttablet + +import ( + "time" + + "github.com/spf13/pflag" + + "vitess.io/vitess/go/vt/servenv" +) + +const ( + // VReplicationExperimentalFlags is a bitmask of experimental features in vreplication. + VReplicationExperimentalFlagOptimizeInserts = int64(1) + VReplicationExperimentalFlagAllowNoBlobBinlogRowImage = int64(2) + VReplicationExperimentalFlagVPlayerBatching = int64(4) +) + +var ( + // Default flags: currently VReplicationExperimentalFlagVPlayerBatching is not enabled by default. + vreplicationExperimentalFlags = VReplicationExperimentalFlagOptimizeInserts | VReplicationExperimentalFlagAllowNoBlobBinlogRowImage + vreplicationNetReadTimeout = 300 + vreplicationNetWriteTimeout = 600 + vreplicationCopyPhaseDuration = 1 * time.Hour + vreplicationRetryDelay = 5 * time.Second + vreplicationMaxTimeToRetryError = 0 * time.Second // Default behavior is to keep retrying, for backward compatibility + + vreplicationTabletTypesStr = "in_order:REPLICA,PRIMARY" // Default value + + vreplicationRelayLogMaxSize = 250000 + vreplicationRelayLogMaxItems = 5000 + + vreplicationReplicaLagTolerance = 1 * time.Minute + + vreplicationHeartbeatUpdateInterval = 1 + + vreplicationStoreCompressedGTID = false + vreplicationParallelInsertWorkers = 1 + + // VStreamerBinlogRotationThreshold is the threshold, above which we rotate binlogs, before taking a GTID snapshot + VStreamerBinlogRotationThreshold = int64(64 * 1024 * 1024) // 64MiB + VStreamerDefaultPacketSize = 250000 + VStreamerUseDynamicPacketSize = true +) + +func GetVReplicationNetReadTimeout() int { + return vreplicationNetReadTimeout +} +func GetVReplicationNetWriteTimeout() int { + return vreplicationNetWriteTimeout +} + +func init() { + servenv.OnParseFor("vttablet", registerFlags) + servenv.OnParseFor("vtcombo", registerFlags) +} + +func registerFlags(fs *pflag.FlagSet) { + fs.Int64Var(&vreplicationExperimentalFlags, "vreplication_experimental_flags", vreplicationExperimentalFlags, + "(Bitmask) of experimental features in vreplication to enable") + fs.IntVar(&vreplicationNetReadTimeout, "vreplication_net_read_timeout", vreplicationNetReadTimeout, "Session value of net_read_timeout for vreplication, in seconds") + fs.IntVar(&vreplicationNetWriteTimeout, "vreplication_net_write_timeout", vreplicationNetWriteTimeout, "Session value of net_write_timeout for vreplication, in seconds") + fs.DurationVar(&vreplicationCopyPhaseDuration, "vreplication_copy_phase_duration", vreplicationCopyPhaseDuration, "Duration for each copy phase loop (before running the next catchup: default 1h)") + fs.DurationVar(&vreplicationRetryDelay, "vreplication_retry_delay", vreplicationRetryDelay, "delay before retrying a failed workflow event in the replication phase") + fs.DurationVar(&vreplicationMaxTimeToRetryError, "vreplication_max_time_to_retry_on_error", vreplicationMaxTimeToRetryError, "stop automatically retrying when we've had consecutive failures with the same error for this long after the first occurrence") + + fs.IntVar(&vreplicationRelayLogMaxSize, "relay_log_max_size", vreplicationRelayLogMaxSize, "Maximum buffer size (in bytes) for vreplication target buffering. If single rows are larger than this, a single row is buffered at a time.") + fs.IntVar(&vreplicationRelayLogMaxItems, "relay_log_max_items", vreplicationRelayLogMaxItems, "Maximum number of rows for vreplication target buffering.") + + fs.DurationVar(&vreplicationReplicaLagTolerance, "vreplication_replica_lag_tolerance", vreplicationReplicaLagTolerance, "Replica lag threshold duration: once lag is below this we switch from copy phase to the replication (streaming) phase") + + // vreplicationHeartbeatUpdateInterval determines how often the time_updated column is updated if there are no + // real events on the source and the source vstream is only sending heartbeats for this long. Keep this low if you + // expect high QPS and are monitoring this column to alert about potential outages. Keep this high if + // * you have too many streams the extra write qps or cpu load due to these updates are unacceptable + // * you have too many streams and/or a large source field (lot of participating tables) which generates + // unacceptable increase in your binlog size + fs.IntVar(&vreplicationHeartbeatUpdateInterval, "vreplication_heartbeat_update_interval", vreplicationHeartbeatUpdateInterval, "Frequency (in seconds, default 1, max 60) at which the time_updated column of a vreplication stream when idling") + fs.BoolVar(&vreplicationStoreCompressedGTID, "vreplication_store_compressed_gtid", vreplicationStoreCompressedGTID, "Store compressed gtids in the pos column of the sidecar database's vreplication table") + + fs.IntVar(&vreplicationParallelInsertWorkers, "vreplication-parallel-insert-workers", vreplicationParallelInsertWorkers, "Number of parallel insertion workers to use during copy phase. Set <= 1 to disable parallelism, or > 1 to enable concurrent insertion during copy phase.") +} diff --git a/go/vt/vttablet/endtoend/connecttcp/main_test.go b/go/vt/vttablet/endtoend/connecttcp/main_test.go new file mode 100644 index 00000000000..9d52b1287a1 --- /dev/null +++ b/go/vt/vttablet/endtoend/connecttcp/main_test.go @@ -0,0 +1,119 @@ +/* +Copyright 2024 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 connecttcp + +import ( + "context" + "flag" + "fmt" + "os" + "testing" + + "vitess.io/vitess/go/mysql" + vttestpb "vitess.io/vitess/go/vt/proto/vttest" + "vitess.io/vitess/go/vt/vttablet/endtoend/framework" + "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" + "vitess.io/vitess/go/vt/vttest" +) + +var ( + connParams mysql.ConnParams + connAppDebugParams mysql.ConnParams +) + +func TestMain(m *testing.M) { + flag.Parse() // Do not remove this comment, import into google3 depends on it + tabletenv.Init() + + exitCode := func() int { + // Launch MySQL. + // We need a Keyspace in the topology, so the DbName is set. + // We need a Shard too, so the database 'vttest' is created. + cfg := vttest.Config{ + Topology: &vttestpb.VTTestTopology{ + Keyspaces: []*vttestpb.Keyspace{ + { + Name: "vttest", + Shards: []*vttestpb.Shard{ + { + Name: "0", + DbNameOverride: "vttest", + }, + }, + }, + }, + }, + OnlyMySQL: true, + Charset: "utf8mb4_general_ci", + } + if err := cfg.InitSchemas("vttest", testSchema, nil); err != nil { + fmt.Fprintf(os.Stderr, "InitSchemas failed: %v\n", err) + return 1 + } + defer os.RemoveAll(cfg.SchemaDir) + cluster := vttest.LocalCluster{ + Config: cfg, + } + if err := cluster.Setup(); err != nil { + fmt.Fprintf(os.Stderr, "could not launch mysql: %v\n", err) + return 1 + } + defer cluster.TearDown() + + if err := allowConnectOnTCP(cluster); err != nil { + fmt.Fprintf(os.Stderr, "failed to allow tcp priviliges: %v", err) + return 1 + } + + connParams = cluster.MySQLTCPConnParams() + connAppDebugParams = cluster.MySQLAppDebugConnParams() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + config := tabletenv.NewDefaultConfig() + config.TwoPCEnable = true + config.TwoPCAbandonAge = 1 + + if err := framework.StartCustomServer(ctx, connParams, connAppDebugParams, cluster.DbName(), config); err != nil { + fmt.Fprintf(os.Stderr, "%v", err) + return 1 + } + defer framework.StopServer() + + return m.Run() + }() + os.Exit(exitCode) +} + +func allowConnectOnTCP(cluster vttest.LocalCluster) error { + connParams = cluster.MySQLConnParams() + conn, err := mysql.Connect(context.Background(), &connParams) + if err != nil { + return err + } + if _, err = conn.ExecuteFetch("UPDATE mysql.user SET Host = '%' WHERE User = 'vt_dba';", 0, false); err != nil { + return err + } + if _, err = conn.ExecuteFetch("FLUSH PRIVILEGES;", 0, false); err != nil { + return err + } + conn.Close() + return nil +} + +var testSchema = `create table vitess_test(intval int primary key);` diff --git a/go/vt/vttablet/endtoend/connecttcp/prepare_test.go b/go/vt/vttablet/endtoend/connecttcp/prepare_test.go new file mode 100644 index 00000000000..524b4a3dcc8 --- /dev/null +++ b/go/vt/vttablet/endtoend/connecttcp/prepare_test.go @@ -0,0 +1,41 @@ +/* +Copyright 2024 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 connecttcp + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/vttablet/endtoend/framework" +) + +// TestPrepareOnTCP tests that a prepare statement is not allowed on a network connection. +func TestPrepareOnTCP(t *testing.T) { + client := framework.NewClient() + + query := "insert into vitess_test (intval) values(4)" + + err := client.Begin(false) + require.NoError(t, err) + + _, err = client.Execute(query, nil) + require.NoError(t, err) + + err = client.Prepare("aa") + require.ErrorContains(t, err, "VT10002: atomic distributed transaction not allowed: cannot prepare the transaction on a network connection") +} diff --git a/go/vt/vttablet/endtoend/framework/client.go b/go/vt/vttablet/endtoend/framework/client.go index 1cbff71dc25..04342d57aa4 100644 --- a/go/vt/vttablet/endtoend/framework/client.go +++ b/go/vt/vttablet/endtoend/framework/client.go @@ -180,15 +180,13 @@ func (client *QueryClient) ReadTransaction(dtid string) (*querypb.TransactionMet // UnresolvedTransactions invokes the UnresolvedTransactions API of TabletServer. func (client *QueryClient) UnresolvedTransactions() ([]*querypb.TransactionMetadata, error) { - return client.server.UnresolvedTransactions(client.ctx, client.target) + return client.server.UnresolvedTransactions(client.ctx, client.target, 0 /* abandonAgeSeconds */) } // SetServingType is for testing transitions. // It currently supports only primary->replica and back. func (client *QueryClient) SetServingType(tabletType topodatapb.TabletType) error { err := client.server.SetServingType(tabletType, time.Time{}, true /* serving */, "" /* reason */) - // Wait for TwoPC transition, if necessary - client.server.TwoPCEngineWait() return err } diff --git a/go/vt/vttablet/endtoend/main_test.go b/go/vt/vttablet/endtoend/main_test.go index 1284f790b93..eedd893f3eb 100644 --- a/go/vt/vttablet/endtoend/main_test.go +++ b/go/vt/vttablet/endtoend/main_test.go @@ -343,7 +343,7 @@ var tableACLConfig = `{ }, { "name": "vitess_twopc", - "table_names_or_prefixes": ["dt_state"], + "table_names_or_prefixes": ["dt_state", "redo_state"], "readers": ["dev"], "writers": ["dev"], "admins": ["dev"] diff --git a/go/vt/vttablet/endtoend/queries_test.go b/go/vt/vttablet/endtoend/queries_test.go index 5a57f681a10..f67d3219010 100644 --- a/go/vt/vttablet/endtoend/queries_test.go +++ b/go/vt/vttablet/endtoend/queries_test.go @@ -121,6 +121,20 @@ var TestQueryCases = []framework.Testable{ }, RowsReturned: 1, }, + &framework.TestCase{ + Name: "explain with bindvars", + Query: "explain select :__vtudvp as `@p` from dual", + BindVars: map[string]*querypb.BindVariable{ + "__vtudvp": sqltypes.Int64BindVariable(1), + }, + Result: [][]string{ + {"1", "SIMPLE", "", "", "", "", "", "", "", "", "", "No tables used"}, + }, + Rewritten: []string{ + "explain select 1 as `@p` from dual", + }, + RowsReturned: 1, + }, &framework.TestCase{ Name: "limit", Query: "select /* limit */ eid, id from vitess_a limit :a", diff --git a/go/vt/vttablet/endtoend/savepoint_test.go b/go/vt/vttablet/endtoend/savepoint_test.go index 74572f2376f..90cf8fbd547 100644 --- a/go/vt/vttablet/endtoend/savepoint_test.go +++ b/go/vt/vttablet/endtoend/savepoint_test.go @@ -103,7 +103,7 @@ func TestSavepointInTransactionWithRelease(t *testing.T) { diff int }{{ tag: "Queries/Histograms/Savepoint/Count", - diff: 1, + diff: 2, // savepoint a (post-begin) and savepoint b }, { tag: "Queries/Histograms/Release/Count", diff: 1, diff --git a/go/vt/vttablet/endtoend/settings_test.go b/go/vt/vttablet/endtoend/settings_test.go index a459ad15844..0ccaf958737 100644 --- a/go/vt/vttablet/endtoend/settings_test.go +++ b/go/vt/vttablet/endtoend/settings_test.go @@ -138,16 +138,9 @@ func TestDDLNoConnectionReservationOnSettings(t *testing.T) { query := "create table temp(c_date datetime default '0000-00-00')" setting := "set sql_mode='TRADITIONAL'" - for _, withTx := range []bool{false, true} { - if withTx { - err := client.Begin(false) - require.NoError(t, err) - } - _, err := client.ReserveExecute(query, []string{setting}, nil) - require.Error(t, err, "create table should have failed with TRADITIONAL mode") - require.Contains(t, err.Error(), "Invalid default value") - assert.Zero(t, client.ReservedID()) - } + _, err := client.ReserveExecute(query, []string{setting}, nil) + assert.ErrorContains(t, err, "Invalid default value for 'c_date'", "create table should have failed with TRADITIONAL mode") + assert.Zero(t, client.ReservedID()) } func TestDMLNoConnectionReservationOnSettings(t *testing.T) { @@ -156,7 +149,10 @@ func TestDMLNoConnectionReservationOnSettings(t *testing.T) { _, err := client.Execute("create table temp(c_date datetime)", nil) require.NoError(t, err) - defer client.Execute("drop table temp", nil) + defer func() { + client.Rollback() + client.Execute("drop table temp", nil) + }() _, err = client.Execute("insert into temp values ('2022-08-25')", nil) require.NoError(t, err) @@ -211,9 +207,8 @@ func TestDDLNoConnectionReservationOnSettingsWithTx(t *testing.T) { query := "create table temp(c_date datetime default '0000-00-00')" setting := "set sql_mode='TRADITIONAL'" - _, err := client.ReserveBeginExecute(query, []string{setting}, nil, nil) - require.Error(t, err, "create table should have failed with TRADITIONAL mode") - require.Contains(t, err.Error(), "Invalid default value") + _, err := client.ReserveExecute(query, []string{setting}, nil) + require.ErrorContains(t, err, "Invalid default value for 'c_date'", "create table should have failed with TRADITIONAL mode") assert.Zero(t, client.ReservedID()) } @@ -297,12 +292,6 @@ func TestTempTableOnReserveExecute(t *testing.T) { require.NoError(t, client.Release()) - _, err = client.ReserveBeginExecute(tempTblQuery, nil, nil, nil) - require.NoError(t, err) - assert.NotZero(t, client.ReservedID()) - require.NoError(t, - client.Release()) - // drop the table _, err = client.Execute("drop table if exists temp", nil) require.NoError(t, err) @@ -318,13 +307,6 @@ func TestTempTableOnReserveExecute(t *testing.T) { assert.NotZero(t, client.ReservedID(), "as this goes through fallback path of reserving a connection due to temporary tables") require.NoError(t, client.Release()) - - _, err = client.ReserveBeginExecute(tempTblQuery, []string{setting}, nil, nil) - require.Error(t, err, "create table should have failed with TRADITIONAL mode") - require.Contains(t, err.Error(), "Invalid default value") - assert.NotZero(t, client.ReservedID(), "as this goes through fallback path of reserving a connection due to temporary tables") - require.NoError(t, - client.Release()) } func TestInfiniteSessions(t *testing.T) { diff --git a/go/vt/vttablet/endtoend/transaction_test.go b/go/vt/vttablet/endtoend/transaction_test.go index 94453dd70e7..58a1cacbe10 100644 --- a/go/vt/vttablet/endtoend/transaction_test.go +++ b/go/vt/vttablet/endtoend/transaction_test.go @@ -256,7 +256,7 @@ func TestPrepareRollback(t *testing.T) { err = client.Prepare("aa") if err != nil { client.RollbackPrepared("aa", 0) - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } err = client.RollbackPrepared("aa", 0) require.NoError(t, err) @@ -773,7 +773,7 @@ func TestUnresolvedTransactions(t *testing.T) { client := framework.NewClient() participants := []*querypb.Target{ - {Keyspace: "ks1", Shard: "80-c0"}, + {Keyspace: "ks1", Shard: "80-c0", TabletType: topodatapb.TabletType_PRIMARY}, } err := client.CreateTransaction("dtid01", participants) require.NoError(t, err) @@ -794,7 +794,14 @@ func TestUnresolvedTransactions(t *testing.T) { State: querypb.TransactionState_PREPARE, Participants: participants, }} - utils.MustMatch(t, want, transactions) + + require.Len(t, want, len(transactions)) + for i, transaction := range transactions { + // Skipping check for TimeCreated + assert.Equal(t, want[i].Dtid, transaction.Dtid) + assert.Equal(t, want[i].State, transaction.State) + assert.Equal(t, want[i].Participants, transaction.Participants) + } } // TestUnresolvedTransactions tests the UnresolvedTransactions API. @@ -802,16 +809,16 @@ func TestUnresolvedTransactionsOrdering(t *testing.T) { client := framework.NewClient() participants1 := []*querypb.Target{ - {Keyspace: "ks1", Shard: "c0-"}, - {Keyspace: "ks1", Shard: "80-c0"}, + {Keyspace: "ks1", Shard: "c0-", TabletType: topodatapb.TabletType_PRIMARY}, + {Keyspace: "ks1", Shard: "80-c0", TabletType: topodatapb.TabletType_PRIMARY}, } participants2 := []*querypb.Target{ - {Keyspace: "ks1", Shard: "-40"}, - {Keyspace: "ks1", Shard: "80-c0"}, + {Keyspace: "ks1", Shard: "-40", TabletType: topodatapb.TabletType_PRIMARY}, + {Keyspace: "ks1", Shard: "80-c0", TabletType: topodatapb.TabletType_PRIMARY}, } participants3 := []*querypb.Target{ - {Keyspace: "ks1", Shard: "c0-"}, - {Keyspace: "ks1", Shard: "-40"}, + {Keyspace: "ks1", Shard: "c0-", TabletType: topodatapb.TabletType_PRIMARY}, + {Keyspace: "ks1", Shard: "-40", TabletType: topodatapb.TabletType_PRIMARY}, } // prepare state err := client.CreateTransaction("dtid01", participants1) @@ -857,5 +864,12 @@ func TestUnresolvedTransactionsOrdering(t *testing.T) { State: querypb.TransactionState_PREPARE, Participants: participants1, }} - utils.MustMatch(t, want, transactions) + + require.Len(t, want, len(transactions)) + for i, transaction := range transactions { + // Skipping check for TimeCreated + assert.Equal(t, want[i].Dtid, transaction.Dtid) + assert.Equal(t, want[i].State, transaction.State) + assert.Equal(t, want[i].Participants, transaction.Participants) + } } diff --git a/go/vt/vttablet/endtoend/twopc/main_test.go b/go/vt/vttablet/endtoend/twopc/main_test.go new file mode 100644 index 00000000000..090751503d4 --- /dev/null +++ b/go/vt/vttablet/endtoend/twopc/main_test.go @@ -0,0 +1,100 @@ +/* +Copyright 2024 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 endtoend + +import ( + "context" + "flag" + "fmt" + "os" + "testing" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/vt/vttablet/endtoend/framework" + "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" + "vitess.io/vitess/go/vt/vttest" + + vttestpb "vitess.io/vitess/go/vt/proto/vttest" +) + +var ( + connParams mysql.ConnParams + connAppDebugParams mysql.ConnParams + cluster vttest.LocalCluster +) + +func TestMain(m *testing.M) { + flag.Parse() // Do not remove this comment, import into google3 depends on it + tabletenv.Init() + + exitCode := func() int { + // Launch MySQL. + // We need a Keyspace in the topology, so the DbName is set. + // We need a Shard too, so the database 'vttest' is created. + cfg := vttest.Config{ + Topology: &vttestpb.VTTestTopology{ + Keyspaces: []*vttestpb.Keyspace{ + { + Name: "vttest", + Shards: []*vttestpb.Shard{ + { + Name: "0", + DbNameOverride: "vttest", + }, + }, + }, + }, + }, + OnlyMySQL: true, + Charset: "utf8mb4_general_ci", + } + if err := cfg.InitSchemas("vttest", testSchema, nil); err != nil { + fmt.Fprintf(os.Stderr, "InitSchemas failed: %v\n", err) + return 1 + } + defer os.RemoveAll(cfg.SchemaDir) + cluster = vttest.LocalCluster{ + Config: cfg, + } + if err := cluster.Setup(); err != nil { + fmt.Fprintf(os.Stderr, "could not launch mysql: %v\n", err) + return 1 + } + + defer cluster.TearDown() + + connParams = cluster.MySQLConnParams() + connAppDebugParams = cluster.MySQLAppDebugConnParams() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + config := tabletenv.NewDefaultConfig() + config.TwoPCEnable = true + config.TwoPCAbandonAge = 1 + err := framework.StartCustomServer(ctx, connParams, connAppDebugParams, cluster.DbName(), config) + if err != nil { + fmt.Fprintf(os.Stderr, "%v", err) + return 1 + } + defer framework.StopServer() + + return m.Run() + }() + os.Exit(exitCode) +} + +var testSchema = `create table vitess_test(intval int default 0 primary key);` diff --git a/go/vt/vttablet/endtoend/twopc/prepare_test.go b/go/vt/vttablet/endtoend/twopc/prepare_test.go new file mode 100644 index 00000000000..047b02bce82 --- /dev/null +++ b/go/vt/vttablet/endtoend/twopc/prepare_test.go @@ -0,0 +1,109 @@ +/* +Copyright 2024 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 endtoend + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/vttablet/endtoend/framework" +) + +// TestCommitPreparedFailNonRetryable tests the case where the commit_prepared fails trying to acquire update lock. +// The transaction updates to failed state. +func TestCommitPreparedFailNonRetryable(t *testing.T) { + dbaConnector := framework.Server.Config().DB.DbaWithDB() + conn, err := dbaConnector.Connect(context.Background()) + require.NoError(t, err) + defer conn.Close() + + _, err = conn.ExecuteFetch("set global innodb_lock_wait_timeout = 1", 1, false) + require.NoError(t, err) + defer conn.ExecuteFetch("set global innodb_lock_wait_timeout = default", 1, false) + + client := framework.NewClient() + defer client.RollbackPrepared("bb", client.TransactionID()) + + _, err = client.BeginExecute(`insert into vitess_test (intval) values(50)`, nil, nil) + require.NoError(t, err) + err = client.Prepare("bb") + require.NoError(t, err) + + client2 := framework.NewClient() + _, err = client2.BeginExecute(`select * from _vt.redo_state where dtid = 'bb' for update`, nil, nil) + require.NoError(t, err) + + ch := make(chan any) + go func() { + err := client.CommitPrepared("bb") + ch <- nil + require.ErrorContains(t, err, "commit_prepared") + }() + time.Sleep(1500 * time.Millisecond) + + client2.Release() + <-ch + + qr, err := client2.Execute("select dtid, state, message from _vt.redo_state where dtid = 'bb'", nil) + require.NoError(t, err) + require.Equal(t, `[[VARBINARY("bb") INT64(0) TEXT("Lock wait timeout exceeded; try restarting transaction (errno 1205) (sqlstate HY000) during query: delete from _vt.redo_state where dtid = _binary'bb'")]]`, fmt.Sprintf("%v", qr.Rows)) +} + +// TestCommitPreparedFailRetryable tests the case where the commit_prepared fails when the query is killed. +// The transaction remains in the prepare state. +func TestCommitPreparedFailRetryable(t *testing.T) { + client := framework.NewClient() + defer client.RollbackPrepared("aa", client.TransactionID()) + + _, err := client.BeginExecute(`insert into vitess_test (intval) values(40)`, nil, nil) + require.NoError(t, err) + connRes, err := client.Execute(`select connection_id()`, nil) + require.NoError(t, err) + err = client.Prepare("aa") + require.NoError(t, err) + + client2 := framework.NewClient() + _, err = client2.BeginExecute(`select * from _vt.redo_state where dtid = _binary'aa' for update`, nil, nil) + require.NoError(t, err) + + ch := make(chan any) + go func() { + err := client.CommitPrepared("aa") + ch <- nil + require.ErrorContains(t, err, "commit_prepared") + }() + time.Sleep(100 * time.Millisecond) + + dbaConnector := framework.Server.Config().DB.DbaWithDB() + conn, err := dbaConnector.Connect(context.Background()) + require.NoError(t, err) + defer conn.Close() + + _, err = conn.ExecuteFetch(fmt.Sprintf("kill query %s", connRes.Rows[0][0].ToString()), 1, false) + require.NoError(t, err) + + client2.Release() + <-ch + + qr, err := client2.Execute("select dtid, state, message from _vt.redo_state where dtid = _binary'aa'", nil) + require.NoError(t, err) + require.Equal(t, `[[VARBINARY("aa") INT64(1) TEXT("Query execution was interrupted (errno 1317) (sqlstate 70100) during query: delete from _vt.redo_state where dtid = _binary'aa'")]]`, fmt.Sprintf("%v", qr.Rows)) +} diff --git a/go/vt/vttablet/faketmclient/fake_client.go b/go/vt/vttablet/faketmclient/fake_client.go index 3aeeff71e85..16d8585efe3 100644 --- a/go/vt/vttablet/faketmclient/fake_client.go +++ b/go/vt/vttablet/faketmclient/fake_client.go @@ -66,6 +66,10 @@ func (client *FakeTabletManagerClient) CreateVReplicationWorkflow(ctx context.Co return nil, nil } +func (client *FakeTabletManagerClient) DeleteTableData(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.DeleteTableDataRequest) (*tabletmanagerdatapb.DeleteTableDataResponse, error) { + return nil, nil +} + func (client *FakeTabletManagerClient) DeleteVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (*tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, error) { return nil, nil } @@ -94,6 +98,10 @@ func (client *FakeTabletManagerClient) UpdateVReplicationWorkflows(ctx context.C return nil, nil } +func (client *FakeTabletManagerClient) ValidateVReplicationPermissions(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.ValidateVReplicationPermissionsRequest) (*tabletmanagerdatapb.ValidateVReplicationPermissionsResponse, error) { + return nil, nil +} + func (client *FakeTabletManagerClient) VDiff(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.VDiffRequest) (*tabletmanagerdatapb.VDiffResponse, error) { return nil, nil } @@ -157,6 +165,11 @@ func (client *FakeTabletManagerClient) SetReadWrite(ctx context.Context, tablet return nil } +// ChangeTags is part of the tmclient.TabletManagerClient interface. +func (client *FakeTabletManagerClient) ChangeTags(ctx context.Context, tablet *topodatapb.Tablet, tabletTags map[string]string, replace bool) (*tabletmanagerdatapb.ChangeTagsResponse, error) { + return &tabletmanagerdatapb.ChangeTagsResponse{}, nil +} + // ChangeType is part of the tmclient.TabletManagerClient interface. func (client *FakeTabletManagerClient) ChangeType(ctx context.Context, tablet *topodatapb.Tablet, dbType topodatapb.TabletType, semiSync bool) error { return nil @@ -212,6 +225,26 @@ func (client *FakeTabletManagerClient) ExecuteFetchAsApp(ctx context.Context, ta return &querypb.QueryResult{}, nil } +// GetUnresolvedTransactions is part of the tmclient.TabletManagerClient interface. +func (client *FakeTabletManagerClient) GetUnresolvedTransactions(ctx context.Context, tablet *topodatapb.Tablet) ([]*querypb.TransactionMetadata, error) { + return nil, nil +} + +// ConcludeTransaction is part of the tmclient.TabletManagerClient interface. +func (client *FakeTabletManagerClient) ConcludeTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string, mm bool) error { + return nil +} + +// ConcludeTransaction is part of the tmclient.TabletManagerClient interface. +func (client *FakeTabletManagerClient) MysqlHostMetrics(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.MysqlHostMetricsRequest) (*tabletmanagerdatapb.MysqlHostMetricsResponse, error) { + return nil, nil +} + +// ReadTransaction is part of the tmclient.TabletManagerClient interface. +func (client *FakeTabletManagerClient) ReadTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string) (*querypb.TransactionMetadata, error) { + return nil, nil +} + // // Replication related methods // @@ -320,6 +353,11 @@ func (client *FakeTabletManagerClient) PopulateReparentJournal(ctx context.Conte return nil } +// ReadReparentJournalInfo is part of the tmclient.TabletManagerClient interface. +func (client *FakeTabletManagerClient) ReadReparentJournalInfo(ctx context.Context, tablet *topodatapb.Tablet) (int, error) { + return 10, nil +} + // DemotePrimary is part of the tmclient.TabletManagerClient interface. func (client *FakeTabletManagerClient) DemotePrimary(ctx context.Context, tablet *topodatapb.Tablet) (*replicationdatapb.PrimaryStatus, error) { return nil, nil diff --git a/go/vt/vttablet/flags.go b/go/vt/vttablet/flags.go deleted file mode 100644 index 994080b95a5..00000000000 --- a/go/vt/vttablet/flags.go +++ /dev/null @@ -1,54 +0,0 @@ -/* -Copyright 2023 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 vttablet - -import ( - "time" - - "github.com/spf13/pflag" - - "vitess.io/vitess/go/vt/servenv" -) - -const ( - // VReplicationExperimentalFlags is a bitmask of experimental features in vreplication. - VReplicationExperimentalFlagOptimizeInserts = int64(1) - VReplicationExperimentalFlagAllowNoBlobBinlogRowImage = int64(2) - VReplicationExperimentalFlagVPlayerBatching = int64(4) -) - -var ( - // Default flags. - VReplicationExperimentalFlags = VReplicationExperimentalFlagOptimizeInserts | VReplicationExperimentalFlagAllowNoBlobBinlogRowImage - VReplicationNetReadTimeout = 300 - VReplicationNetWriteTimeout = 600 - CopyPhaseDuration = 1 * time.Hour -) - -func init() { - servenv.OnParseFor("vttablet", registerFlags) - servenv.OnParseFor("vtcombo", registerFlags) - -} - -func registerFlags(fs *pflag.FlagSet) { - fs.Int64Var(&VReplicationExperimentalFlags, "vreplication_experimental_flags", VReplicationExperimentalFlags, - "(Bitmask) of experimental features in vreplication to enable") - fs.IntVar(&VReplicationNetReadTimeout, "vreplication_net_read_timeout", VReplicationNetReadTimeout, "Session value of net_read_timeout for vreplication, in seconds") - fs.IntVar(&VReplicationNetWriteTimeout, "vreplication_net_write_timeout", VReplicationNetWriteTimeout, "Session value of net_write_timeout for vreplication, in seconds") - fs.DurationVar(&CopyPhaseDuration, "vreplication_copy_phase_duration", CopyPhaseDuration, "Duration for each copy phase loop (before running the next catchup: default 1h)") -} diff --git a/go/vt/vttablet/grpcqueryservice/server.go b/go/vt/vttablet/grpcqueryservice/server.go index c26d291aa50..a1a1283b4ad 100644 --- a/go/vt/vttablet/grpcqueryservice/server.go +++ b/go/vt/vttablet/grpcqueryservice/server.go @@ -240,7 +240,7 @@ func (q *query) UnresolvedTransactions(ctx context.Context, request *querypb.Unr request.EffectiveCallerId, request.ImmediateCallerId, ) - transactions, err := q.server.UnresolvedTransactions(ctx, request.Target) + transactions, err := q.server.UnresolvedTransactions(ctx, request.Target, request.AbandonAge) if err != nil { return nil, vterrors.ToGRPC(err) } diff --git a/go/vt/vttablet/grpctabletconn/conn.go b/go/vt/vttablet/grpctabletconn/conn.go index a76505383b7..16f93a44372 100644 --- a/go/vt/vttablet/grpctabletconn/conn.go +++ b/go/vt/vttablet/grpctabletconn/conn.go @@ -439,7 +439,7 @@ func (conn *gRPCQueryClient) ReadTransaction(ctx context.Context, target *queryp } // UnresolvedTransactions returns all unresolved distributed transactions. -func (conn *gRPCQueryClient) UnresolvedTransactions(ctx context.Context, target *querypb.Target) ([]*querypb.TransactionMetadata, error) { +func (conn *gRPCQueryClient) UnresolvedTransactions(ctx context.Context, target *querypb.Target, abandonAgeSeconds int64) ([]*querypb.TransactionMetadata, error) { conn.mu.RLock() defer conn.mu.RUnlock() if conn.cc == nil { @@ -450,6 +450,7 @@ func (conn *gRPCQueryClient) UnresolvedTransactions(ctx context.Context, target Target: target, EffectiveCallerId: callerid.EffectiveCallerIDFromContext(ctx), ImmediateCallerId: callerid.ImmediateCallerIDFromContext(ctx), + AbandonAge: abandonAgeSeconds, } response, err := conn.c.UnresolvedTransactions(ctx, req) if err != nil { @@ -691,6 +692,7 @@ func (conn *gRPCQueryClient) VStream(ctx context.Context, request *binlogdatapb. Position: request.Position, Filter: request.Filter, TableLastPKs: request.TableLastPKs, + Options: request.Options, } stream, err := conn.c.VStream(ctx, req) if err != nil { diff --git a/go/vt/vttablet/grpctmclient/client.go b/go/vt/vttablet/grpctmclient/client.go index c3ff1b02767..469daba8375 100644 --- a/go/vt/vttablet/grpctmclient/client.go +++ b/go/vt/vttablet/grpctmclient/client.go @@ -384,6 +384,19 @@ func (client *Client) SetReadWrite(ctx context.Context, tablet *topodatapb.Table return err } +// ChangeTags is part of the tmclient.TabletManagerClient interface. +func (client *Client) ChangeTags(ctx context.Context, tablet *topodatapb.Tablet, tabletTags map[string]string, replace bool) (*tabletmanagerdatapb.ChangeTagsResponse, error) { + c, closer, err := client.dialer.dial(ctx, tablet) + if err != nil { + return nil, err + } + defer closer.Close() + return c.ChangeTags(ctx, &tabletmanagerdatapb.ChangeTagsRequest{ + Tags: tabletTags, + Replace: replace, + }) +} + // ChangeType is part of the tmclient.TabletManagerClient interface. func (client *Client) ChangeType(ctx context.Context, tablet *topodatapb.Tablet, dbType topodatapb.TabletType, semiSync bool) error { c, closer, err := client.dialer.dial(ctx, tablet) @@ -658,6 +671,67 @@ func (client *Client) ExecuteFetchAsApp(ctx context.Context, tablet *topodatapb. return response.Result, nil } +// GetUnresolvedTransactions is part of the tmclient.TabletManagerClient interface. +func (client *Client) GetUnresolvedTransactions(ctx context.Context, tablet *topodatapb.Tablet) ([]*querypb.TransactionMetadata, error) { + c, closer, err := client.dialer.dial(ctx, tablet) + if err != nil { + return nil, err + } + defer closer.Close() + + response, err := c.GetUnresolvedTransactions(ctx, &tabletmanagerdatapb.GetUnresolvedTransactionsRequest{}) + if err != nil { + return nil, err + } + return response.Transactions, nil +} + +// ConcludeTransaction is part of the tmclient.TabletManagerClient interface. +func (client *Client) ConcludeTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string, mm bool) error { + c, closer, err := client.dialer.dial(ctx, tablet) + if err != nil { + return err + } + defer closer.Close() + + _, err = c.ConcludeTransaction(ctx, &tabletmanagerdatapb.ConcludeTransactionRequest{ + Dtid: dtid, + Mm: mm, + }) + return err +} + +func (client *Client) MysqlHostMetrics(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.MysqlHostMetricsRequest) (*tabletmanagerdatapb.MysqlHostMetricsResponse, error) { + c, closer, err := client.dialer.dial(ctx, tablet) + if err != nil { + return nil, err + } + defer closer.Close() + + resp, err := c.MysqlHostMetrics(ctx, req) + if err != nil { + return nil, err + } + return resp, nil +} + +// ReadTransaction is part of the tmclient.TabletManagerClient interface. +func (client *Client) ReadTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string) (*querypb.TransactionMetadata, error) { + c, closer, err := client.dialer.dial(ctx, tablet) + if err != nil { + return nil, err + } + defer closer.Close() + + resp, err := c.ReadTransaction(ctx, &tabletmanagerdatapb.ReadTransactionRequest{ + Dtid: dtid, + }) + if err != nil { + return nil, err + } + return resp.Transaction, nil +} + // // Replication related methods // @@ -836,6 +910,19 @@ func (client *Client) CreateVReplicationWorkflow(ctx context.Context, tablet *to return response, nil } +func (client *Client) DeleteTableData(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.DeleteTableDataRequest) (*tabletmanagerdatapb.DeleteTableDataResponse, error) { + c, closer, err := client.dialer.dial(ctx, tablet) + if err != nil { + return nil, err + } + defer closer.Close() + response, err := c.DeleteTableData(ctx, request) + if err != nil { + return nil, err + } + return response, nil +} + func (client *Client) DeleteVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (*tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, error) { c, closer, err := client.dialer.dial(ctx, tablet) if err != nil { @@ -888,6 +975,19 @@ func (client *Client) ReadVReplicationWorkflow(ctx context.Context, tablet *topo return response, nil } +func (client *Client) ValidateVReplicationPermissions(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.ValidateVReplicationPermissionsRequest) (*tabletmanagerdatapb.ValidateVReplicationPermissionsResponse, error) { + c, closer, err := client.dialer.dial(ctx, tablet) + if err != nil { + return nil, err + } + defer closer.Close() + response, err := c.ValidateVReplicationPermissions(ctx, request) + if err != nil { + return nil, err + } + return response, nil +} + // VReplicationExec is part of the tmclient.TabletManagerClient interface. func (client *Client) VReplicationExec(ctx context.Context, tablet *topodatapb.Tablet, query string) (*querypb.QueryResult, error) { c, closer, err := client.dialer.dial(ctx, tablet) @@ -1004,6 +1104,20 @@ func (client *Client) PopulateReparentJournal(ctx context.Context, tablet *topod return err } +// ReadReparentJournalInfo is part of the tmclient.TabletManagerClient interface. +func (client *Client) ReadReparentJournalInfo(ctx context.Context, tablet *topodatapb.Tablet) (int, error) { + c, closer, err := client.dialer.dial(ctx, tablet) + if err != nil { + return 0, err + } + defer closer.Close() + resp, err := c.ReadReparentJournalInfo(ctx, &tabletmanagerdatapb.ReadReparentJournalInfoRequest{}) + if err != nil { + return 0, err + } + return int(resp.Length), nil +} + // InitReplica is part of the tmclient.TabletManagerClient interface. func (client *Client) InitReplica(ctx context.Context, tablet *topodatapb.Tablet, parent *topodatapb.TabletAlias, replicationPosition string, timeCreatedNS int64, semiSync bool) error { c, closer, err := client.dialer.dial(ctx, tablet) @@ -1114,7 +1228,7 @@ func (client *Client) StopReplicationAndGetStatus(ctx context.Context, tablet *t if err != nil { return nil, err } - return &replicationdatapb.StopReplicationStatus{ //nolint + return &replicationdatapb.StopReplicationStatus{ // nolint Before: response.Status.Before, After: response.Status.After, }, nil diff --git a/go/vt/vttablet/grpctmserver/server.go b/go/vt/vttablet/grpctmserver/server.go index 42cfd441eeb..20db9e6223b 100644 --- a/go/vt/vttablet/grpctmserver/server.go +++ b/go/vt/vttablet/grpctmserver/server.go @@ -127,6 +127,15 @@ func (s *server) SetReadWrite(ctx context.Context, request *tabletmanagerdatapb. return response, s.tm.SetReadOnly(ctx, false) } +func (s *server) ChangeTags(ctx context.Context, request *tabletmanagerdatapb.ChangeTagsRequest) (response *tabletmanagerdatapb.ChangeTagsResponse, err error) { + defer s.tm.HandleRPCPanic(ctx, "ChangeTags", request, response, false /*verbose*/, &err) + ctx = callinfo.GRPCCallInfo(ctx) + afterTags, err := s.tm.ChangeTags(ctx, request.Tags, request.Replace) + return &tabletmanagerdatapb.ChangeTagsResponse{ + Tags: afterTags, + }, err +} + func (s *server) ChangeType(ctx context.Context, request *tabletmanagerdatapb.ChangeTypeRequest) (response *tabletmanagerdatapb.ChangeTypeResponse, err error) { defer s.tm.HandleRPCPanic(ctx, "ChangeType", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) @@ -275,6 +284,57 @@ func (s *server) ExecuteFetchAsApp(ctx context.Context, request *tabletmanagerda return response, nil } +// +// Distributed Transaction related methods +// + +func (s *server) GetUnresolvedTransactions(ctx context.Context, request *tabletmanagerdatapb.GetUnresolvedTransactionsRequest) (response *tabletmanagerdatapb.GetUnresolvedTransactionsResponse, err error) { + defer s.tm.HandleRPCPanic(ctx, "GetUnresolvedTransactions", request, response, false /*verbose*/, &err) + ctx = callinfo.GRPCCallInfo(ctx) + + transactions, err := s.tm.GetUnresolvedTransactions(ctx, request.AbandonAge) + if err != nil { + return nil, vterrors.ToGRPC(err) + } + + return &tabletmanagerdatapb.GetUnresolvedTransactionsResponse{Transactions: transactions}, nil +} + +func (s *server) ReadTransaction(ctx context.Context, request *tabletmanagerdatapb.ReadTransactionRequest) (response *tabletmanagerdatapb.ReadTransactionResponse, err error) { + defer s.tm.HandleRPCPanic(ctx, "ReadTransaction", request, response, false /*verbose*/, &err) + ctx = callinfo.GRPCCallInfo(ctx) + + transaction, err := s.tm.ReadTransaction(ctx, request) + if err != nil { + return nil, vterrors.ToGRPC(err) + } + + return &tabletmanagerdatapb.ReadTransactionResponse{Transaction: transaction}, nil +} + +func (s *server) ConcludeTransaction(ctx context.Context, request *tabletmanagerdatapb.ConcludeTransactionRequest) (response *tabletmanagerdatapb.ConcludeTransactionResponse, err error) { + defer s.tm.HandleRPCPanic(ctx, "ConcludeTransaction", request, response, false /*verbose*/, &err) + ctx = callinfo.GRPCCallInfo(ctx) + + err = s.tm.ConcludeTransaction(ctx, request) + if err != nil { + return nil, vterrors.ToGRPC(err) + } + + return &tabletmanagerdatapb.ConcludeTransactionResponse{}, nil +} + +func (s *server) MysqlHostMetrics(ctx context.Context, request *tabletmanagerdatapb.MysqlHostMetricsRequest) (response *tabletmanagerdatapb.MysqlHostMetricsResponse, err error) { + defer s.tm.HandleRPCPanic(ctx, "MysqlHostMetrics", request, response, false /*verbose*/, &err) + ctx = callinfo.GRPCCallInfo(ctx) + + resp, err := s.tm.MysqlHostMetrics(ctx, request) + if err != nil { + return nil, vterrors.ToGRPC(err) + } + return resp, nil +} + // // Replication related methods // @@ -384,6 +444,13 @@ func (s *server) CreateVReplicationWorkflow(ctx context.Context, request *tablet return s.tm.CreateVReplicationWorkflow(ctx, request) } +func (s *server) DeleteTableData(ctx context.Context, request *tabletmanagerdatapb.DeleteTableDataRequest) (response *tabletmanagerdatapb.DeleteTableDataResponse, err error) { + defer s.tm.HandleRPCPanic(ctx, "DeleteTableData", request, response, true /*verbose*/, &err) + ctx = callinfo.GRPCCallInfo(ctx) + response = &tabletmanagerdatapb.DeleteTableDataResponse{} + return s.tm.DeleteTableData(ctx, request) +} + func (s *server) DeleteVReplicationWorkflow(ctx context.Context, request *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (response *tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, err error) { defer s.tm.HandleRPCPanic(ctx, "DeleteVReplicationWorkflow", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) @@ -412,6 +479,14 @@ func (s *server) ReadVReplicationWorkflow(ctx context.Context, request *tabletma return s.tm.ReadVReplicationWorkflow(ctx, request) } +func (s *server) ValidateVReplicationPermissions(ctx context.Context, request *tabletmanagerdatapb.ValidateVReplicationPermissionsRequest) (response *tabletmanagerdatapb.ValidateVReplicationPermissionsResponse, err error) { + defer s.tm.HandleRPCPanic(ctx, "ValidateVReplicationPermissions", request, response, true /*verbose*/, &err) + ctx = callinfo.GRPCCallInfo(ctx) + response = &tabletmanagerdatapb.ValidateVReplicationPermissionsResponse{} + response, err = s.tm.ValidateVReplicationPermissions(ctx, request) + return response, err +} + func (s *server) VReplicationExec(ctx context.Context, request *tabletmanagerdatapb.VReplicationExecRequest) (response *tabletmanagerdatapb.VReplicationExecResponse, err error) { defer s.tm.HandleRPCPanic(ctx, "VReplicationExec", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) @@ -477,6 +552,17 @@ func (s *server) PopulateReparentJournal(ctx context.Context, request *tabletman return response, s.tm.PopulateReparentJournal(ctx, request.TimeCreatedNs, request.ActionName, request.PrimaryAlias, request.ReplicationPosition) } +func (s *server) ReadReparentJournalInfo(ctx context.Context, request *tabletmanagerdatapb.ReadReparentJournalInfoRequest) (response *tabletmanagerdatapb.ReadReparentJournalInfoResponse, err error) { + defer s.tm.HandleRPCPanic(ctx, "ReadReparentJournalInfo", request, response, true /*verbose*/, &err) + ctx = callinfo.GRPCCallInfo(ctx) + response = &tabletmanagerdatapb.ReadReparentJournalInfoResponse{} + length, err := s.tm.ReadReparentJournalInfo(ctx) + if err == nil { + response.Length = int32(length) + } + return response, err +} + func (s *server) InitReplica(ctx context.Context, request *tabletmanagerdatapb.InitReplicaRequest) (response *tabletmanagerdatapb.InitReplicaResponse, err error) { defer s.tm.HandleRPCPanic(ctx, "InitReplica", request, response, true /*verbose*/, &err) ctx = callinfo.GRPCCallInfo(ctx) diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index 1d2137b7426..e140abfdc6e 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -60,6 +60,7 @@ import ( "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle" @@ -97,7 +98,6 @@ var ( maxConcurrentOnlineDDLs = 256 migrationNextCheckIntervals = []time.Duration{1 * time.Second, 5 * time.Second, 10 * time.Second, 20 * time.Second} - maxConstraintNameLength = 64 cutoverIntervals = []time.Duration{0, 1 * time.Minute, 5 * time.Minute, 10 * time.Minute, 30 * time.Minute} ) @@ -137,31 +137,6 @@ var ( onlineDDLGrant = fmt.Sprintf("'%s'@'%s'", onlineDDLUser, "%") ) -type ConstraintType int - -const ( - UnknownConstraintType ConstraintType = iota - CheckConstraintType - ForeignKeyConstraintType -) - -var ( - constraintIndicatorMap = map[int]string{ - int(CheckConstraintType): "chk", - int(ForeignKeyConstraintType): "fk", - } -) - -func GetConstraintType(constraintInfo sqlparser.ConstraintInfo) ConstraintType { - if _, ok := constraintInfo.(*sqlparser.CheckConstraintDefinition); ok { - return CheckConstraintType - } - if _, ok := constraintInfo.(*sqlparser.ForeignKeyDefinition); ok { - return ForeignKeyConstraintType - } - return UnknownConstraintType -} - type mysqlVariables struct { host string port int @@ -178,6 +153,7 @@ type Executor struct { ts *topo.Server lagThrottler *throttle.Throttler toggleBufferTableFunc func(cancelCtx context.Context, tableName string, timeout time.Duration, bufferQueries bool) + isPreparedPoolEmpty func(tableName string) bool requestGCChecksFunc func() tabletAlias *topodatapb.TabletAlias @@ -238,6 +214,7 @@ func NewExecutor(env tabletenv.Env, tabletAlias *topodatapb.TabletAlias, ts *top tabletTypeFunc func() topodatapb.TabletType, toggleBufferTableFunc func(cancelCtx context.Context, tableName string, timeout time.Duration, bufferQueries bool), requestGCChecksFunc func(), + isPreparedPoolEmpty func(tableName string) bool, ) *Executor { // sanitize flags if maxConcurrentOnlineDDLs < 1 { @@ -255,6 +232,7 @@ func NewExecutor(env tabletenv.Env, tabletAlias *topodatapb.TabletAlias, ts *top ts: ts, lagThrottler: lagThrottler, toggleBufferTableFunc: toggleBufferTableFunc, + isPreparedPoolEmpty: isPreparedPoolEmpty, requestGCChecksFunc: requestGCChecksFunc, ticks: timer.NewTimer(migrationCheckInterval), // Gracefully return an error if any caller tries to execute @@ -616,7 +594,7 @@ func (e *Executor) getCreateTableStatement(ctx context.Context, tableName string } createTable, ok := stmt.(*sqlparser.CreateTable) if !ok { - return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "expected CREATE TABLE. Got %v", sqlparser.CanonicalString(stmt)) + return nil, schemadiff.ErrExpectedCreateTable } return createTable, nil } @@ -807,7 +785,7 @@ func (e *Executor) killTableLockHoldersAndAccessors(ctx context.Context, tableNa } rs, err := conn.Conn.ExecuteFetch(query, -1, true) if err != nil { - return err + return vterrors.Wrapf(err, "finding queries potentially operating on table") } log.Infof("killTableLockHoldersAndAccessors: found %v potential queries", len(rs.Rows)) @@ -863,14 +841,17 @@ func (e *Executor) killTableLockHoldersAndAccessors(ctx context.Context, tableNa } rs, err := conn.Conn.ExecuteFetch(query, -1, true) if err != nil { - return err + return vterrors.Wrapf(err, "finding transactions locking table") } log.Infof("killTableLockHoldersAndAccessors: found %v locking transactions", len(rs.Rows)) for _, row := range rs.Named().Rows { threadId := row.AsInt64("trx_mysql_thread_id", 0) log.Infof("killTableLockHoldersAndAccessors: killing connection %v with transaction on table", threadId) killConnection := fmt.Sprintf("KILL %d", threadId) - _, _ = conn.Conn.ExecuteFetch(killConnection, 1, false) + _, err = conn.Conn.ExecuteFetch(killConnection, 1, false) + if err != nil { + log.Errorf("Unable to kill the connection %d: %v", threadId, err) + } } } } @@ -880,7 +861,7 @@ func (e *Executor) killTableLockHoldersAndAccessors(ctx context.Context, tableNa // cutOverVReplMigration stops vreplication, then removes the _vt.vreplication entry for the given migration func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, shouldForceCutOver bool) error { if err := e.incrementCutoverAttempts(ctx, s.workflow); err != nil { - return err + return vterrors.Wrapf(err, "cutover: failed incrementing cutover attempts") } tmClient := e.tabletManagerClient() @@ -889,19 +870,19 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh // sanity checks: vreplTable, err := getVreplTable(s) if err != nil { - return err + return vterrors.Wrapf(err, "cutover: failed getting vreplication table") } // get topology client & entities: tablet, err := e.ts.GetTablet(ctx, e.tabletAlias) if err != nil { - return err + return vterrors.Wrapf(err, "cutover: failed reading vreplication table") } // information about source tablet onlineDDL, _, err := e.readMigration(ctx, s.workflow) if err != nil { - return err + return vterrors.Wrapf(err, "cutover: failed reading migration") } isVreplicationTestSuite := onlineDDL.StrategySetting().IsVreplicationTestSuite() e.updateMigrationStage(ctx, onlineDDL.UUID, "starting cut-over") @@ -910,12 +891,15 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh migrationCutOverThreshold := getMigrationCutOverThreshold(onlineDDL) - waitForPos := func(s *VReplStream, pos replication.Position) error { - ctx, cancel := context.WithTimeout(ctx, migrationCutOverThreshold) + waitForPos := func(s *VReplStream, pos replication.Position, timeout time.Duration) error { + ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() // Wait for target to reach the up-to-date pos if err := tmClient.VReplicationWaitForPos(ctx, tablet.Tablet, s.id, replication.EncodePosition(pos)); err != nil { - return err + if s, _ := e.readVReplStream(ctx, s.workflow, true); s != nil { + err = vterrors.Wrapf(err, "read vrepl position %v", s.pos) + } + return vterrors.Wrapf(err, "failed waiting for position %v", replication.EncodePosition(pos)) } // Target is now in sync with source! return nil @@ -929,14 +913,14 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh // in that place as possible. sentryTableName, err = schema.GenerateGCTableName(schema.HoldTableGCState, newGCTableRetainTime()) if err != nil { - return nil + return vterrors.Wrapf(err, "failed creating sentry table name") } // We create the sentry table before toggling writes, because this involves a WaitForPos, which takes some time. We // don't want to overload the buffering time with this excessive wait. if err := e.updateArtifacts(ctx, onlineDDL.UUID, sentryTableName); err != nil { - return err + return vterrors.Wrapf(err, "failed updating artifacts with sentry table name") } dropSentryTableQuery := sqlparser.BuildParsedQuery(sqlDropTableIfExists, sentryTableName) @@ -960,33 +944,50 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh }() parsed := sqlparser.BuildParsedQuery(sqlCreateSentryTable, sentryTableName) if _, err := e.execQuery(ctx, parsed.Query); err != nil { - return err + return vterrors.Wrapf(err, "failed creating sentry table") } e.updateMigrationStage(ctx, onlineDDL.UUID, "sentry table created: %s", sentryTableName) postSentryPos, err := e.primaryPosition(ctx) if err != nil { - return err + return vterrors.Wrapf(err, "failed getting primary pos after sentry creation") } e.updateMigrationStage(ctx, onlineDDL.UUID, "waiting for post-sentry pos: %v", replication.EncodePosition(postSentryPos)) - if err := waitForPos(s, postSentryPos); err != nil { - return err + // We have not yet locked anything, stopped anything, or done anything that otherwise + // impacts query serving so we wait for a multiple of the cutover threshold here, with + // that variable primarily serving to limit the max time we later spend waiting for + // a position again AFTER we've taken the locks and table access is blocked. + if err := waitForPos(s, postSentryPos, migrationCutOverThreshold*3); err != nil { + return vterrors.Wrapf(err, "failed waiting for pos after sentry creation") } e.updateMigrationStage(ctx, onlineDDL.UUID, "post-sentry pos reached") } lockConn, err := e.pool.Get(ctx, nil) if err != nil { - return err + return vterrors.Wrapf(err, "failed getting locking connection") + } + // Set large enough `@@lock_wait_timeout` so that it does not interfere with the cut-over operation. + // The code will ensure everything that needs to be terminated by `migrationCutOverThreshold` will be terminated. + lockConnRestoreLockWaitTimeout, err := e.initConnectionLockWaitTimeout(ctx, lockConn.Conn, 5*migrationCutOverThreshold) + if err != nil { + return vterrors.Wrapf(err, "failed setting lock_wait_timeout on locking connection") } defer lockConn.Recycle() + defer lockConnRestoreLockWaitTimeout() defer lockConn.Conn.Exec(ctx, sqlUnlockTables, 1, false) renameCompleteChan := make(chan error) renameWasSuccessful := false renameConn, err := e.pool.Get(ctx, nil) if err != nil { - return err + return vterrors.Wrapf(err, "failed getting rename connection") + } + // Set large enough `@@lock_wait_timeout` so that it does not interfere with the cut-over operation. + // The code will ensure everything that needs to be terminated by `migrationCutOverThreshold` will be terminated. + renameConnRestoreLockWaitTimeout, err := e.initConnectionLockWaitTimeout(ctx, renameConn.Conn, 5*migrationCutOverThreshold*4) + if err != nil { + return vterrors.Wrapf(err, "failed setting lock_wait_timeout on rename connection") } defer renameConn.Recycle() defer func() { @@ -997,10 +998,12 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh } } }() + defer renameConnRestoreLockWaitTimeout() + // See if backend MySQL server supports 'rename_table_preserve_foreign_key' variable preserveFKSupported, err := e.isPreserveForeignKeySupported(ctx) if err != nil { - return err + return vterrors.Wrapf(err, "failed checking for 'rename_table_preserve_foreign_key' support") } if preserveFKSupported { // This code is only applicable when MySQL supports the 'rename_table_preserve_foreign_key' variable. This variable @@ -1023,7 +1026,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh for { renameProcessFound, err := e.doesConnectionInfoMatch(renameWaitCtx, renameConn.Conn.ID(), "rename") if err != nil { - return err + return vterrors.Wrapf(err, "searching for rename process") } if renameProcessFound { return nil @@ -1057,7 +1060,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh bufferingContextCancel() // force re-read of tables if err := tmClient.RefreshState(grpcCtx, tablet.Tablet); err != nil { - return err + return vterrors.Wrapf(err, "refreshing table state") } } log.Infof("toggled buffering: %t in migration %v", bufferQueries, onlineDDL.UUID) @@ -1077,7 +1080,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh err = toggleBuffering(true) defer reenableWritesOnce() if err != nil { - return err + return vterrors.Wrapf(err, "failed enabling buffering") } // Give a fraction of a second for a scenario where a query is in // query executor, it passed the ACLs and is _about to_ execute. This will be nicer to those queries: @@ -1087,8 +1090,13 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh time.Sleep(100 * time.Millisecond) if shouldForceCutOver { + // We should only proceed with forceful cut over if there is no pending atomic transaction for the table. + // This will help in keeping the atomicity guarantee of a prepared transaction. + if err := e.checkOnPreparedPool(ctx, onlineDDL.Table, 100*time.Millisecond); err != nil { + return vterrors.Wrapf(err, "checking prepared pool for table") + } if err := e.killTableLockHoldersAndAccessors(ctx, onlineDDL.Table); err != nil { - return err + return vterrors.Wrapf(err, "failed killing table lock holders and accessors") } } @@ -1111,7 +1119,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh defer cancel() lockTableQuery := sqlparser.BuildParsedQuery(sqlLockTwoTablesWrite, sentryTableName, onlineDDL.Table) if _, err := lockConn.Conn.Exec(lockCtx, lockTableQuery.Query, 1, false); err != nil { - return err + return vterrors.Wrapf(err, "failed locking tables") } e.updateMigrationStage(ctx, onlineDDL.UUID, "renaming tables") @@ -1123,7 +1131,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh // the rename should block, because of the LOCK. Wait for it to show up. e.updateMigrationStage(ctx, onlineDDL.UUID, "waiting for RENAME to block") if err := waitForRenameProcess(); err != nil { - return err + return vterrors.Wrapf(err, "failed waiting for rename process") } e.updateMigrationStage(ctx, onlineDDL.UUID, "RENAME found") } @@ -1131,7 +1139,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh e.updateMigrationStage(ctx, onlineDDL.UUID, "reading post-lock pos") postWritesPos, err := e.primaryPosition(ctx) if err != nil { - return err + return vterrors.Wrapf(err, "failed reading pos after locking") } // Right now: new queries are buffered, any existing query will have executed, and worst case scenario is @@ -1143,19 +1151,19 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh // Writes are now disabled on table. Read up-to-date vreplication info, specifically to get latest (and fixed) pos: s, err = e.readVReplStream(ctx, s.workflow, false) if err != nil { - return err + return vterrors.Wrapf(err, "failed reading vreplication table after locking") } e.updateMigrationStage(ctx, onlineDDL.UUID, "waiting for post-lock pos: %v", replication.EncodePosition(postWritesPos)) - if err := waitForPos(s, postWritesPos); err != nil { + if err := waitForPos(s, postWritesPos, migrationCutOverThreshold); err != nil { e.updateMigrationStage(ctx, onlineDDL.UUID, "timeout while waiting for post-lock pos: %v", err) - return err + return vterrors.Wrapf(err, "failed waiting for pos after locking") } go log.Infof("cutOverVReplMigration %v: done waiting for position %v", s.workflow, replication.EncodePosition(postWritesPos)) // Stop vreplication e.updateMigrationStage(ctx, onlineDDL.UUID, "stopping vreplication") if _, err := e.vreplicationExec(ctx, tablet.Tablet, binlogplayer.StopVReplication(s.id, "stopped for online DDL cutover")); err != nil { - return err + return vterrors.Wrapf(err, "failed stopping vreplication") } go log.Infof("cutOverVReplMigration %v: stopped vreplication", s.workflow) @@ -1172,7 +1180,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh } else { e.updateMigrationStage(ctx, onlineDDL.UUID, "validating rename is still in place") if err := waitForRenameProcess(); err != nil { - return err + return vterrors.Wrapf(err, "failed waiting for rename process before dropping sentry table") } // Normal (non-testing) alter table @@ -1183,7 +1191,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh lockCtx, cancel := context.WithTimeout(ctx, migrationCutOverThreshold) defer cancel() if _, err := lockConn.Conn.Exec(lockCtx, dropTableQuery.Query, 1, false); err != nil { - return err + return vterrors.Wrapf(err, "failed dropping sentry table") } } { @@ -1191,7 +1199,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh defer cancel() e.updateMigrationStage(ctx, onlineDDL.UUID, "unlocking tables") if _, err := lockConn.Conn.Exec(lockCtx, sqlUnlockTables, 1, false); err != nil { - return err + return vterrors.Wrapf(err, "failed unlocking tables") } } { @@ -1199,7 +1207,7 @@ func (e *Executor) cutOverVReplMigration(ctx context.Context, s *VReplStream, sh defer cancel() e.updateMigrationStage(lockCtx, onlineDDL.UUID, "waiting for RENAME to complete") if err := <-renameCompleteChan; err != nil { - return err + return vterrors.Wrapf(err, "failed waiting for rename to complete") } renameWasSuccessful = true } @@ -1260,183 +1268,22 @@ func (e *Executor) initMigrationSQLMode(ctx context.Context, onlineDDL *schema.O return deferFunc, nil } -// newConstraintName generates a new, unique name for a constraint. Our problem is that a MySQL -// constraint's name is unique in the schema (!). And so as we duplicate the original table, we must -// create completely new names for all constraints. -// Moreover, we really want this name to be consistent across all shards. We therefore use a deterministic -// UUIDv5 (SHA) function over the migration UUID, table name, and constraint's _contents_. -// We _also_ include the original constraint name as prefix, as room allows -// for example, if the original constraint name is "check_1", -// we might generate "check_1_cps1okb4uafunfqusi2lp22u3". -// If we then again migrate a table whose constraint name is "check_1_cps1okb4uafunfqusi2lp22u3 " we -// get for example "check_1_19l09s37kbhj4axnzmi10e18k" (hash changes, and we still try to preserve original name) -// -// Furthermore, per bug report https://bugs.mysql.com/bug.php?id=107772, if the user doesn't provide a name for -// their CHECK constraint, then MySQL picks a name in this format _chk_. -// Example: sometable_chk_1 -// Next, when MySQL is asked to RENAME TABLE and sees a constraint with this format, it attempts to rename -// the constraint with the new table's name. This is problematic for Vitess, because we often rename tables to -// very long names, such as _vt_HOLD_394f9e6dfc3d11eca0390a43f95f28a3_20220706091048. -// As we rename the constraint to e.g. `sometable_chk_1_cps1okb4uafunfqusi2lp22u3`, this makes MySQL want to -// call the new constraint something like _vt_HOLD_394f9e6dfc3d11eca0390a43f95f28a3_20220706091048_chk_1_cps1okb4uafunfqusi2lp22u3, -// which exceeds the 64 character limit for table names. Long story short, we also trim down if the constraint seems -// to be auto-generated. -func (e *Executor) newConstraintName(onlineDDL *schema.OnlineDDL, constraintType ConstraintType, hashExists map[string]bool, seed string, oldName string) string { - constraintIndicator := constraintIndicatorMap[int(constraintType)] - oldName = schemadiff.ExtractConstraintOriginalName(onlineDDL.Table, oldName) - hash := textutil.UUIDv5Base36(onlineDDL.UUID, onlineDDL.Table, seed) - for i := 1; hashExists[hash]; i++ { - hash = textutil.UUIDv5Base36(onlineDDL.UUID, onlineDDL.Table, seed, fmt.Sprintf("%d", i)) - } - hashExists[hash] = true - suffix := "_" + hash - maxAllowedNameLength := maxConstraintNameLength - len(suffix) - newName := oldName - if newName == "" { - newName = constraintIndicator // start with something that looks consistent with MySQL's naming - } - if len(newName) > maxAllowedNameLength { - newName = newName[0:maxAllowedNameLength] - } - newName = newName + suffix - return newName -} - -// validateAndEditCreateTableStatement inspects the CreateTable AST and does the following: -// - extra validation (no FKs for now...) -// - generate new and unique names for all constraints (CHECK and FK; yes, why not handle FK names; even as we don't support FKs today, we may in the future) -func (e *Executor) validateAndEditCreateTableStatement(onlineDDL *schema.OnlineDDL, createTable *sqlparser.CreateTable) (constraintMap map[string]string, err error) { - constraintMap = map[string]string{} - hashExists := map[string]bool{} - - validateWalk := func(node sqlparser.SQLNode) (kontinue bool, err error) { - switch node := node.(type) { - case *sqlparser.ForeignKeyDefinition: - if !onlineDDL.StrategySetting().IsAllowForeignKeysFlag() { - return false, schema.ErrForeignKeyFound - } - case *sqlparser.ConstraintDefinition: - oldName := node.Name.String() - newName := e.newConstraintName(onlineDDL, GetConstraintType(node.Details), hashExists, sqlparser.CanonicalString(node.Details), oldName) - node.Name = sqlparser.NewIdentifierCI(newName) - constraintMap[oldName] = newName - } - return true, nil - } - if err := sqlparser.Walk(validateWalk, createTable); err != nil { - return constraintMap, err - } - return constraintMap, nil -} - -// validateAndEditAlterTableStatement inspects the AlterTable statement and: -// - modifies any CONSTRAINT name according to given name mapping -// - explode ADD FULLTEXT KEY into multiple statements -func (e *Executor) validateAndEditAlterTableStatement(capableOf capabilities.CapableOf, onlineDDL *schema.OnlineDDL, alterTable *sqlparser.AlterTable, constraintMap map[string]string) (alters []*sqlparser.AlterTable, err error) { - capableOfInstantDDLXtrabackup, err := capableOf(capabilities.InstantDDLXtrabackupCapability) - if err != nil { - return nil, err - } +// initConnectionLockWaitTimeout sets the given lock_wait_timeout for the given connection, with a deferred value restoration function +func (e *Executor) initConnectionLockWaitTimeout(ctx context.Context, conn *connpool.Conn, lockWaitTimeout time.Duration) (deferFunc func(), err error) { + deferFunc = func() {} - hashExists := map[string]bool{} - validateWalk := func(node sqlparser.SQLNode) (kontinue bool, err error) { - switch node := node.(type) { - case *sqlparser.DropKey: - if node.Type == sqlparser.CheckKeyType || node.Type == sqlparser.ForeignKeyType { - // drop a check or a foreign key constraint - mappedName, ok := constraintMap[node.Name.String()] - if !ok { - return false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Found DROP CONSTRAINT: %v, but could not find constraint name in map", sqlparser.CanonicalString(node)) - } - node.Name = sqlparser.NewIdentifierCI(mappedName) - } - case *sqlparser.AddConstraintDefinition: - oldName := node.ConstraintDefinition.Name.String() - newName := e.newConstraintName(onlineDDL, GetConstraintType(node.ConstraintDefinition.Details), hashExists, sqlparser.CanonicalString(node.ConstraintDefinition.Details), oldName) - node.ConstraintDefinition.Name = sqlparser.NewIdentifierCI(newName) - constraintMap[oldName] = newName - } - return true, nil - } - if err := sqlparser.Walk(validateWalk, alterTable); err != nil { - return alters, err - } - alters = append(alters, alterTable) - // Handle ADD FULLTEXT KEY statements - countAddFullTextStatements := 0 - redactedOptions := make([]sqlparser.AlterOption, 0, len(alterTable.AlterOptions)) - for i := range alterTable.AlterOptions { - opt := alterTable.AlterOptions[i] - switch opt := opt.(type) { - case sqlparser.AlgorithmValue: - if !capableOfInstantDDLXtrabackup { - // we do not pass ALGORITHM. We choose our own ALGORITHM. - continue - } - case *sqlparser.AddIndexDefinition: - if opt.IndexDefinition.Info.Type == sqlparser.IndexTypeFullText { - countAddFullTextStatements++ - if countAddFullTextStatements > 1 { - // We've already got one ADD FULLTEXT KEY. We can't have another - // in the same statement - extraAlterTable := &sqlparser.AlterTable{ - Table: alterTable.Table, - AlterOptions: []sqlparser.AlterOption{opt}, - } - if !capableOfInstantDDLXtrabackup { - extraAlterTable.AlterOptions = append(extraAlterTable.AlterOptions, copyAlgorithm) - } - alters = append(alters, extraAlterTable) - continue - } - } - } - redactedOptions = append(redactedOptions, opt) - } - alterTable.AlterOptions = redactedOptions - if !capableOfInstantDDLXtrabackup { - alterTable.AlterOptions = append(alterTable.AlterOptions, copyAlgorithm) + if _, err := conn.Exec(ctx, `set @lock_wait_timeout=@@session.lock_wait_timeout`, 0, false); err != nil { + return deferFunc, vterrors.Errorf(vtrpcpb.Code_UNKNOWN, "could not read lock_wait_timeout: %v", err) } - return alters, nil -} - -// duplicateCreateTable parses the given `CREATE TABLE` statement, and returns: -// - The format CreateTable AST -// - A new CreateTable AST, with the table renamed as `newTableName`, and with constraints renamed deterministically -// - Map of renamed constraints -func (e *Executor) duplicateCreateTable(ctx context.Context, onlineDDL *schema.OnlineDDL, originalCreateTable *sqlparser.CreateTable, newTableName string) ( - newCreateTable *sqlparser.CreateTable, - constraintMap map[string]string, - err error, -) { - newCreateTable = sqlparser.Clone(originalCreateTable) - newCreateTable.SetTable(newCreateTable.GetTable().Qualifier.CompliantName(), newTableName) - - // If this table has a self-referencing foreign key constraint, ensure the referenced table gets renamed: - renameSelfFK := func(node sqlparser.SQLNode) (kontinue bool, err error) { - switch node := node.(type) { - case *sqlparser.ConstraintDefinition: - fk, ok := node.Details.(*sqlparser.ForeignKeyDefinition) - if !ok { - return true, nil - } - if referencedTableName := fk.ReferenceDefinition.ReferencedTable.Name.String(); referencedTableName == originalCreateTable.Table.Name.String() { - // This is a self-referencing foreign key - // We need to rename the referenced table as well - fk.ReferenceDefinition.ReferencedTable.Name = sqlparser.NewIdentifierCS(newTableName) - } - } - return true, nil + timeoutSeconds := int64(lockWaitTimeout.Seconds()) + setQuery := fmt.Sprintf("set @@session.lock_wait_timeout=%d", timeoutSeconds) + if _, err := conn.Exec(ctx, setQuery, 0, false); err != nil { + return deferFunc, err } - _ = sqlparser.Walk(renameSelfFK, newCreateTable) - - // manipulate CreateTable statement: take care of constraints names which have to be - // unique across the schema - constraintMap, err = e.validateAndEditCreateTableStatement(onlineDDL, newCreateTable) - if err != nil { - return nil, nil, err + deferFunc = func() { + conn.Exec(ctx, "set @@session.lock_wait_timeout=@lock_wait_timeout", 0, false) } - return newCreateTable, constraintMap, nil + return deferFunc, nil } // createDuplicateTableLike creates the table named by `newTableName` in the likeness of onlineDDL.Table @@ -1451,7 +1298,7 @@ func (e *Executor) createDuplicateTableLike(ctx context.Context, newTableName st if err != nil { return nil, nil, err } - vreplCreateTable, constraintMap, err := e.duplicateCreateTable(ctx, onlineDDL, originalCreateTable, newTableName) + vreplCreateTable, constraintMap, err := schemadiff.DuplicateCreateTable(originalCreateTable, onlineDDL.UUID, newTableName, onlineDDL.StrategySetting().IsAllowForeignKeysFlag()) if err != nil { return nil, nil, err } @@ -1502,7 +1349,7 @@ func (e *Executor) initVreplicationOriginalMigration(ctx context.Context, online // Also, change any constraint names: capableOf := mysql.ServerVersionCapableOf(conn.ServerVersion) - alters, err := e.validateAndEditAlterTableStatement(capableOf, onlineDDL, alterTable, constraintMap) + alters, err := schemadiff.ValidateAndEditAlterTableStatement(onlineDDL.Table, onlineDDL.UUID, capableOf, alterTable, constraintMap) if err != nil { return v, err } @@ -1518,7 +1365,10 @@ func (e *Executor) initVreplicationOriginalMigration(ctx context.Context, online return v, err } - v = NewVRepl(e.env.Environment(), onlineDDL.UUID, e.keyspace, e.shard, e.dbName, onlineDDL.Table, vreplTableName, originalCreateTable, vreplCreateTable, alterTable, onlineDDL.StrategySetting().IsAnalyzeTableFlag()) + v, err = NewVRepl(e.env.Environment(), onlineDDL.UUID, e.keyspace, e.shard, e.dbName, originalCreateTable, vreplCreateTable, alterTable, onlineDDL.StrategySetting().IsAnalyzeTableFlag()) + if err != nil { + return v, err + } return v, nil } @@ -1526,7 +1376,7 @@ func (e *Executor) initVreplicationOriginalMigration(ctx context.Context, online // This function is called after both source and target tables have been analyzed, so there's more information // about the two, and about the transition between the two. func (e *Executor) postInitVreplicationOriginalMigration(ctx context.Context, onlineDDL *schema.OnlineDDL, v *VRepl, conn *dbconnpool.DBConnection) (err error) { - if v.sourceAutoIncrement > 0 && !v.parser.IsAutoIncrementDefined() { + if v.analysis.SourceAutoIncrement > 0 && !v.alterTableAnalysis.IsAutoIncrementChangeRequested { restoreSQLModeFunc, err := e.initMigrationSQLMode(ctx, onlineDDL, conn) defer restoreSQLModeFunc() if err != nil { @@ -1534,9 +1384,9 @@ func (e *Executor) postInitVreplicationOriginalMigration(ctx context.Context, on } // Apply ALTER TABLE AUTO_INCREMENT=? - parsed := sqlparser.BuildParsedQuery(sqlAlterTableAutoIncrement, v.targetTable, ":auto_increment") + parsed := sqlparser.BuildParsedQuery(sqlAlterTableAutoIncrement, v.targetTableName(), ":auto_increment") bindVars := map[string]*querypb.BindVariable{ - "auto_increment": sqltypes.Uint64BindVariable(v.sourceAutoIncrement), + "auto_increment": sqltypes.Uint64BindVariable(v.analysis.SourceAutoIncrement), } bound, err := parsed.GenerateQuery(bindVars, nil) if err != nil { @@ -1572,7 +1422,18 @@ func (e *Executor) initVreplicationRevertMigration(ctx context.Context, onlineDD if err := e.updateArtifacts(ctx, onlineDDL.UUID, vreplTableName); err != nil { return v, err } - v = NewVRepl(e.env.Environment(), onlineDDL.UUID, e.keyspace, e.shard, e.dbName, onlineDDL.Table, vreplTableName, nil, nil, nil, false) + originalCreateTable, err := e.getCreateTableStatement(ctx, onlineDDL.Table) + if err != nil { + return v, err + } + vreplCreateTable, err := e.getCreateTableStatement(ctx, vreplTableName) + if err != nil { + return v, err + } + v, err = NewVRepl(e.env.Environment(), onlineDDL.UUID, e.keyspace, e.shard, e.dbName, originalCreateTable, vreplCreateTable, nil, false) + if err != nil { + return v, err + } v.pos = revertStream.pos return v, nil } @@ -1614,19 +1475,15 @@ func (e *Executor) ExecuteWithVReplication(ctx context.Context, onlineDDL *schem if err := e.updateMigrationTableRows(ctx, onlineDDL.UUID, v.tableRows); err != nil { return err } - removedUniqueKeyNames := []string{} - for _, uniqueKey := range v.removedUniqueKeys { - removedUniqueKeyNames = append(removedUniqueKeyNames, uniqueKey.Name) - } if err := e.updateSchemaAnalysis(ctx, onlineDDL.UUID, - len(v.addedUniqueKeys), - len(v.removedUniqueKeys), - strings.Join(sqlescape.EscapeIDs(removedUniqueKeyNames), ","), - strings.Join(sqlescape.EscapeIDs(v.removedForeignKeyNames), ","), - strings.Join(sqlescape.EscapeIDs(v.droppedNoDefaultColumnNames), ","), - strings.Join(sqlescape.EscapeIDs(v.expandedColumnNames), ","), - v.revertibleNotes, + v.analysis.AddedUniqueKeys.Len(), + v.analysis.RemovedUniqueKeys.Len(), + strings.Join(sqlescape.EscapeIDs(v.analysis.RemovedUniqueKeys.Names()), ","), + strings.Join(sqlescape.EscapeIDs(v.analysis.RemovedForeignKeyNames), ","), + strings.Join(sqlescape.EscapeIDs(v.analysis.DroppedNoDefaultColumns.Names()), ","), + strings.Join(sqlescape.EscapeIDs(v.analysis.ExpandedColumns.Names()), ","), + v.analysis.RevertibleNotes, ); err != nil { return err } @@ -1654,7 +1511,7 @@ func (e *Executor) ExecuteWithVReplication(ctx context.Context, onlineDDL *schem } // create vreplication entry - insertVReplicationQuery, err := v.generateInsertStatement(ctx) + insertVReplicationQuery, err := v.generateInsertStatement() if err != nil { return err } @@ -1671,7 +1528,7 @@ func (e *Executor) ExecuteWithVReplication(ctx context.Context, onlineDDL *schem } } // start stream! - startVReplicationQuery, err := v.generateStartStatement(ctx) + startVReplicationQuery, err := v.generateStartStatement() if err != nil { return err } @@ -2960,14 +2817,14 @@ func (e *Executor) analyzeDropDDLActionMigration(ctx context.Context, onlineDDL // Analyze foreign keys: for _, constraint := range createTable.TableSpec.Constraints { - if GetConstraintType(constraint.Details) == ForeignKeyConstraintType { + if schemadiff.GetConstraintType(constraint.Details) == schemadiff.ForeignKeyConstraintType { removedForeignKeyNames = append(removedForeignKeyNames, constraint.Name.String()) } } // Write analysis: } if err := e.updateSchemaAnalysis(ctx, onlineDDL.UUID, - 0, 0, "", strings.Join(sqlescape.EscapeIDs(removedForeignKeyNames), ","), "", "", "", + 0, 0, "", strings.Join(sqlescape.EscapeIDs(removedForeignKeyNames), ","), "", "", nil, ); err != nil { return err } @@ -3062,7 +2919,7 @@ func (e *Executor) executeCreateDDLActionMigration(ctx context.Context, onlineDD newCreateTable := sqlparser.Clone(originalCreateTable) // Rewrite this CREATE TABLE statement such that CONSTRAINT names are edited, // specifically removing any prefix. - if _, err := e.validateAndEditCreateTableStatement(onlineDDL, newCreateTable); err != nil { + if _, err := schemadiff.ValidateAndEditCreateTableStatement(onlineDDL.Table, onlineDDL.UUID, newCreateTable, onlineDDL.StrategySetting().IsAllowForeignKeysFlag()); err != nil { return failMigration(err) } ddlStmt = newCreateTable @@ -3189,20 +3046,6 @@ func (e *Executor) executeAlterViewOnline(ctx context.Context, onlineDDL *schema return nil } -// addInstantAlgorithm adds or modifies the AlterTable's ALGORITHM to INSTANT -func (e *Executor) addInstantAlgorithm(alterTable *sqlparser.AlterTable) { - instantOpt := sqlparser.AlgorithmValue("INSTANT") - for i, opt := range alterTable.AlterOptions { - if _, ok := opt.(sqlparser.AlgorithmValue); ok { - // replace an existing algorithm - alterTable.AlterOptions[i] = instantOpt - return - } - } - // append an algorithm - alterTable.AlterOptions = append(alterTable.AlterOptions, instantOpt) -} - // executeSpecialAlterDDLActionMigrationIfApplicable sees if the given migration can be executed via special execution path, that isn't a full blown online schema change process. func (e *Executor) executeSpecialAlterDDLActionMigrationIfApplicable(ctx context.Context, onlineDDL *schema.OnlineDDL) (specialMigrationExecuted bool, err error) { // Before we jump on to strategies... Some ALTERs can be optimized without having to run through @@ -3224,7 +3067,7 @@ func (e *Executor) executeSpecialAlterDDLActionMigrationIfApplicable(ctx context switch specialPlan.operation { case instantDDLSpecialOperation: - e.addInstantAlgorithm(specialPlan.alterTable) + schemadiff.AddInstantAlgorithm(specialPlan.alterTable) onlineDDL.SQL = sqlparser.CanonicalString(specialPlan.alterTable) if _, err := e.executeDirectly(ctx, onlineDDL); err != nil { return false, err @@ -3640,6 +3483,7 @@ func (e *Executor) readVReplStream(ctx context.Context, uuid string, okIfMissing timeHeartbeat: row.AsInt64("time_heartbeat", 0), timeThrottled: row.AsInt64("time_throttled", 0), componentThrottled: row.AsString("component_throttled", ""), + reasonThrottled: row.AsString("reason_throttled", ""), transactionTimestamp: row.AsInt64("transaction_timestamp", 0), state: binlogdatapb.VReplicationWorkflowState(binlogdatapb.VReplicationWorkflowState_value[row.AsString("state", "")]), message: row.AsString("message", ""), @@ -3649,6 +3493,28 @@ func (e *Executor) readVReplStream(ctx context.Context, uuid string, okIfMissing if err := prototext.Unmarshal([]byte(s.source), s.bls); err != nil { return nil, err } + { + // It's possible that an earlier error was overshadowed by a new non-error `message` values. + // Let's read _vt.vreplication_log to see whether there's any terminal errors in vreplication's history. + query, err := sqlparser.ParseAndBind(sqlReadVReplLogErrors, + sqltypes.Int32BindVariable(s.id), + sqltypes.StringBindVariable(vreplication.TerminalErrorIndicator), + ) + if err != nil { + return nil, err + } + r, err := e.execQuery(ctx, query) + if err != nil { + return nil, err + } + // The query has LIMIT 1, ie returns at most one row + if row := r.Named().Row(); row != nil { + s.state = binlogdatapb.VReplicationWorkflowState_Error + if message := row.AsString("message", ""); message != "" { + s.message = "vreplication: " + message + } + } + } return s, nil } @@ -3801,7 +3667,7 @@ func (e *Executor) reviewRunningMigrations(ctx context.Context) (countRunnning i uuid := row["migration_uuid"].ToString() cutoverAttempts := row.AsInt64("cutover_attempts", 0) sinceLastCutoverAttempt := time.Second * time.Duration(row.AsInt64("seconds_since_last_cutover_attempt", 0)) - sinceReadyToComplete := time.Second * time.Duration(row.AsInt64("seconds_since_ready_to_complete", 0)) + sinceReadyToComplete := time.Microsecond * time.Duration(row.AsInt64("microseconds_since_ready_to_complete", 0)) onlineDDL, migrationRow, err := e.readMigration(ctx, uuid) if err != nil { return countRunnning, cancellable, err @@ -3872,7 +3738,7 @@ func (e *Executor) reviewRunningMigrations(ctx context.Context) (countRunnning i _ = e.updateMigrationETASecondsByProgress(ctx, uuid) if s.timeThrottled != 0 { // Avoid creating a 0000-00-00 00:00:00 timestamp - _ = e.updateMigrationLastThrottled(ctx, uuid, time.Unix(s.timeThrottled, 0), s.componentThrottled) + _ = e.updateMigrationLastThrottled(ctx, uuid, time.Unix(s.timeThrottled, 0), s.componentThrottled, s.reasonThrottled) } if onlineDDL.StrategySetting().IsInOrderCompletion() { // We will fail an in-order migration if there's _prior_ migrations within the same migration-context @@ -3925,8 +3791,10 @@ func (e *Executor) reviewRunningMigrations(ctx context.Context) (countRunnning i if err := e.cutOverVReplMigration(ctx, s, shouldForceCutOver); err != nil { _ = e.updateMigrationMessage(ctx, uuid, err.Error()) log.Errorf("cutOverVReplMigration failed: err=%v", err) - if merr, ok := err.(*sqlerror.SQLError); ok { - switch merr.Num { + + if sqlErr, isSQLErr := sqlerror.NewSQLErrorFromError(err).(*sqlerror.SQLError); isSQLErr && sqlErr != nil { + // let's see if this error is actually acceptable + switch sqlErr.Num { case sqlerror.ERTooLongIdent: go e.CancelMigration(ctx, uuid, err.Error(), false) } @@ -4491,7 +4359,8 @@ func (e *Executor) updateSchemaAnalysis(ctx context.Context, uuid string, addedUniqueKeys, removedUniqueKeys int, removedUniqueKeyNames string, removedForeignKeyNames string, droppedNoDefaultColumnNames string, expandedColumnNames string, - revertibleNotes string) error { + revertibleNotes []string) error { + notes := strings.Join(revertibleNotes, "\n") query, err := sqlparser.ParseAndBind(sqlUpdateSchemaAnalysis, sqltypes.Int64BindVariable(int64(addedUniqueKeys)), sqltypes.Int64BindVariable(int64(removedUniqueKeys)), @@ -4499,7 +4368,7 @@ func (e *Executor) updateSchemaAnalysis(ctx context.Context, uuid string, sqltypes.StringBindVariable(removedForeignKeyNames), sqltypes.StringBindVariable(droppedNoDefaultColumnNames), sqltypes.StringBindVariable(expandedColumnNames), - sqltypes.StringBindVariable(revertibleNotes), + sqltypes.StringBindVariable(notes), sqltypes.StringBindVariable(uuid), ) if err != nil { @@ -4575,10 +4444,17 @@ func (e *Executor) updateMigrationETASecondsByProgress(ctx context.Context, uuid return err } -func (e *Executor) updateMigrationLastThrottled(ctx context.Context, uuid string, lastThrottledTime time.Time, throttledCompnent string) error { +func (e *Executor) updateMigrationLastThrottled( + ctx context.Context, + uuid string, + lastThrottledTime time.Time, + throttledCompnent string, + reasonThrottled string, +) error { query, err := sqlparser.ParseAndBind(sqlUpdateLastThrottled, sqltypes.StringBindVariable(lastThrottledTime.Format(sqltypes.TimestampFormat)), sqltypes.StringBindVariable(throttledCompnent), + sqltypes.StringBindVariable(reasonThrottled), sqltypes.StringBindVariable(uuid), ) if err != nil { @@ -4760,6 +4636,26 @@ func (e *Executor) CleanupMigration(ctx context.Context, uuid string) (result *s return rs, nil } +// CleanupMigration sets migration is ready for artifact cleanup. Artifacts are not immediately deleted: +// all we do is set retain_artifacts_seconds to a very small number (it's actually a negative) so that the +// next iteration of gcArtifacts() picks up the migration's artifacts and schedules them for deletion +func (e *Executor) CleanupAllMigrations(ctx context.Context) (result *sqltypes.Result, err error) { + if atomic.LoadInt64(&e.isOpen) == 0 { + return nil, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, schema.ErrOnlineDDLDisabled.Error()) + } + log.Infof("CleanupMigration: request to cleanup all terminal migrations") + e.migrationMutex.Lock() + defer e.migrationMutex.Unlock() + + rs, err := e.execQuery(ctx, sqlUpdateReadyForCleanupAll) + if err != nil { + return nil, err + } + log.Infof("CleanupMigration: %v migrations marked as ready to clean up", rs.RowsAffected) + defer e.triggerNextCheckInterval() + return rs, nil +} + // ForceCutOverMigration markes the given migration for forced cut-over. This has two implications: // - No backoff for the given migration's cut-over (cut-over will be attempted at the next scheduler cycle, // irrespective of how many cut-over attempts have been made and when these attempts have been made). @@ -5272,3 +5168,21 @@ func (e *Executor) OnSchemaMigrationStatus(ctx context.Context, return e.onSchemaMigrationStatus(ctx, uuidParam, status, dryRun, progressPct, etaSeconds, rowsCopied, hint) } + +// checkOnPreparedPool checks if there are any cross-shard prepared transactions on the given table +func (e *Executor) checkOnPreparedPool(ctx context.Context, table string, waitTime time.Duration) error { + if e.isPreparedPoolEmpty(table) { + return nil + } + + select { + case <-ctx.Done(): + // Return context error if context is done + return ctx.Err() + case <-time.After(waitTime): + if e.isPreparedPoolEmpty(table) { + return nil + } + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "cannot force cut-over on non-empty prepared pool for table: %s", table) + } +} diff --git a/go/vt/vttablet/onlineddl/executor_test.go b/go/vt/vttablet/onlineddl/executor_test.go index 1dc5447bbb9..2533f3a4b48 100644 --- a/go/vt/vttablet/onlineddl/executor_test.go +++ b/go/vt/vttablet/onlineddl/executor_test.go @@ -21,393 +21,12 @@ Functionality of this Executor is tested in go/test/endtoend/onlineddl/... package onlineddl import ( - "context" "testing" "time" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "vitess.io/vitess/go/mysql" - "vitess.io/vitess/go/vt/vtenv" - "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" - - "vitess.io/vitess/go/vt/schema" - "vitess.io/vitess/go/vt/sqlparser" -) - -var ( - testMySQLVersion = "8.0.34" ) -func TestGetConstraintType(t *testing.T) { - { - typ := GetConstraintType(&sqlparser.CheckConstraintDefinition{}) - assert.Equal(t, CheckConstraintType, typ) - } - { - typ := GetConstraintType(&sqlparser.ForeignKeyDefinition{}) - assert.Equal(t, ForeignKeyConstraintType, typ) - } -} - -func TestValidateAndEditCreateTableStatement(t *testing.T) { - e := Executor{ - env: tabletenv.NewEnv(vtenv.NewTestEnv(), nil, "ValidateAndEditCreateTableStatementTest"), - } - tt := []struct { - name string - query string - strategyOptions string - expectError string - countConstraints int - expectConstraintMap map[string]string - }{ - { - name: "table with FK, not allowed", - query: ` - create table onlineddl_test ( - id int auto_increment, - i int not null, - parent_id int not null, - primary key(id), - constraint test_ibfk foreign key (parent_id) references onlineddl_test_parent (id) on delete no action - ) - `, - expectError: schema.ErrForeignKeyFound.Error(), - }, - { - name: "table with FK, allowed", - query: ` - create table onlineddl_test ( - id int auto_increment, - i int not null, - parent_id int not null, - primary key(id), - constraint test_ibfk foreign key (parent_id) references onlineddl_test_parent (id) on delete no action - ) - `, - strategyOptions: "--unsafe-allow-foreign-keys", - countConstraints: 1, - expectConstraintMap: map[string]string{"test_ibfk": "test_ibfk_2wtivm6zk4lthpz14g9uoyaqk"}, - }, - { - name: "table with default FK name, strip table name", - query: ` - create table onlineddl_test ( - id int auto_increment, - i int not null, - parent_id int not null, - primary key(id), - constraint onlineddl_test_ibfk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action - ) - `, - strategyOptions: "--unsafe-allow-foreign-keys", - countConstraints: 1, - // we want 'onlineddl_test_' to be stripped out: - expectConstraintMap: map[string]string{"onlineddl_test_ibfk_1": "ibfk_1_2wtivm6zk4lthpz14g9uoyaqk"}, - }, - { - name: "table with anonymous FK, allowed", - query: ` - create table onlineddl_test ( - id int auto_increment, - i int not null, - parent_id int not null, - primary key(id), - foreign key (parent_id) references onlineddl_test_parent (id) on delete no action - ) - `, - strategyOptions: "--unsafe-allow-foreign-keys", - countConstraints: 1, - expectConstraintMap: map[string]string{"": "fk_2wtivm6zk4lthpz14g9uoyaqk"}, - }, - { - name: "table with CHECK constraints", - query: ` - create table onlineddl_test ( - id int auto_increment, - i int not null, - primary key(id), - constraint check_1 CHECK ((i >= 0)), - constraint check_2 CHECK ((i <> 5)), - constraint check_3 CHECK ((i >= 0)), - constraint chk_1111033c1d2d5908bf1f956ba900b192_check_4 CHECK ((i >= 0)) - ) - `, - countConstraints: 4, - expectConstraintMap: map[string]string{ - "check_1": "check_1_7dbssrkwdaxhdunwi5zj53q83", - "check_2": "check_2_ehg3rtk6ejvbxpucimeess30o", - "check_3": "check_3_0se0t8x98mf8v7lqmj2la8j9u", - "chk_1111033c1d2d5908bf1f956ba900b192_check_4": "chk_1111033c1d2d5908bf1f956ba900b192_c_0c2c3bxi9jp4evqrct44wg3xh", - }, - }, - { - name: "table with both FOREIGN and CHECK constraints", - query: ` - create table onlineddl_test ( - id int auto_increment, - i int not null, - primary key(id), - constraint check_1 CHECK ((i >= 0)), - constraint test_ibfk foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, - constraint chk_1111033c1d2d5908bf1f956ba900b192_check_4 CHECK ((i >= 0)) - ) - `, - strategyOptions: "--unsafe-allow-foreign-keys", - countConstraints: 3, - expectConstraintMap: map[string]string{ - "check_1": "check_1_7dbssrkwdaxhdunwi5zj53q83", - "chk_1111033c1d2d5908bf1f956ba900b192_check_4": "chk_1111033c1d2d5908bf1f956ba900b192_c_0se0t8x98mf8v7lqmj2la8j9u", - "test_ibfk": "test_ibfk_2wtivm6zk4lthpz14g9uoyaqk", - }, - }, - } - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - stmt, err := e.env.Environment().Parser().ParseStrictDDL(tc.query) - require.NoError(t, err) - createTable, ok := stmt.(*sqlparser.CreateTable) - require.True(t, ok) - - onlineDDL := &schema.OnlineDDL{UUID: "a5a563da_dc1a_11ec_a416_0a43f95f28a3", Table: "onlineddl_test", Options: tc.strategyOptions} - constraintMap, err := e.validateAndEditCreateTableStatement(onlineDDL, createTable) - if tc.expectError != "" { - assert.ErrorContains(t, err, tc.expectError) - return - } - assert.NoError(t, err) - assert.Equal(t, tc.expectConstraintMap, constraintMap) - - uniqueConstraintNames := map[string]bool{} - err = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { - switch node := node.(type) { - case *sqlparser.ConstraintDefinition: - uniqueConstraintNames[node.Name.String()] = true - } - return true, nil - }, createTable) - assert.NoError(t, err) - assert.Equal(t, tc.countConstraints, len(uniqueConstraintNames)) - assert.Equalf(t, tc.countConstraints, len(constraintMap), "got contraints: %v", constraintMap) - }) - } -} - -func TestValidateAndEditAlterTableStatement(t *testing.T) { - e := Executor{ - env: tabletenv.NewEnv(vtenv.NewTestEnv(), nil, "TestValidateAndEditAlterTableStatementTest"), - } - tt := []struct { - alter string - mySQLVersion string - m map[string]string - expect []string - }{ - { - alter: "alter table t add column i int", - mySQLVersion: "8.0.29", - expect: []string{"alter table t add column i int, algorithm = copy"}, - }, - { - alter: "alter table t add column i int", - mySQLVersion: "8.0.32", - expect: []string{"alter table t add column i int"}, - }, - { - alter: "alter table t add column i int, add fulltext key name1_ft (name1)", - expect: []string{"alter table t add column i int, add fulltext key name1_ft (name1)"}, - }, - { - alter: "alter table t add column i int, add fulltext key name1_ft (name1), add fulltext key name2_ft (name2)", - expect: []string{"alter table t add column i int, add fulltext key name1_ft (name1)", "alter table t add fulltext key name2_ft (name2)"}, - }, - { - alter: "alter table t add fulltext key name0_ft (name0), add column i int, add fulltext key name1_ft (name1), add fulltext key name2_ft (name2)", - expect: []string{"alter table t add fulltext key name0_ft (name0), add column i int", "alter table t add fulltext key name1_ft (name1)", "alter table t add fulltext key name2_ft (name2)"}, - }, - { - alter: "alter table t add constraint check (id != 1)", - expect: []string{"alter table t add constraint chk_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, - }, - { - alter: "alter table t add constraint t_chk_1 check (id != 1)", - expect: []string{"alter table t add constraint chk_1_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, - }, - { - alter: "alter table t add constraint some_check check (id != 1)", - expect: []string{"alter table t add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, - }, - { - alter: "alter table t add constraint some_check check (id != 1), add constraint another_check check (id != 2)", - expect: []string{"alter table t add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1), add constraint another_check_4fa197273p3w96267pzm3gfi3 check (id != 2)"}, - }, - { - alter: "alter table t add foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", - expect: []string{"alter table t add constraint fk_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, - }, - { - alter: "alter table t add constraint myfk foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", - expect: []string{"alter table t add constraint myfk_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, - }, - { - // strip out table name - alter: "alter table t add constraint t_ibfk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", - expect: []string{"alter table t add constraint ibfk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, - }, - { - // stript out table name - alter: "alter table t add constraint t_ibfk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action", - expect: []string{"alter table t add constraint ibfk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action"}, - }, - { - alter: "alter table t add constraint t_ibfk_1 foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, add constraint some_check check (id != 1)", - expect: []string{"alter table t add constraint ibfk_1_6fmhzdlya89128u5j3xapq34i foreign key (parent_id) references onlineddl_test_parent (id) on delete no action, add constraint some_check_aulpn7bjeortljhguy86phdn9 check (id != 1)"}, - }, - { - alter: "alter table t drop foreign key t_ibfk_1", - m: map[string]string{ - "t_ibfk_1": "ibfk_1_aaaaaaaaaaaaaa", - }, - expect: []string{"alter table t drop foreign key ibfk_1_aaaaaaaaaaaaaa"}, - }, - } - - for _, tc := range tt { - t.Run(tc.alter, func(t *testing.T) { - stmt, err := e.env.Environment().Parser().ParseStrictDDL(tc.alter) - require.NoError(t, err) - alterTable, ok := stmt.(*sqlparser.AlterTable) - require.True(t, ok) - - m := map[string]string{} - for k, v := range tc.m { - m[k] = v - } - if tc.mySQLVersion == "" { - tc.mySQLVersion = testMySQLVersion - } - capableOf := mysql.ServerVersionCapableOf(tc.mySQLVersion) - onlineDDL := &schema.OnlineDDL{UUID: "a5a563da_dc1a_11ec_a416_0a43f95f28a3", Table: "t", Options: "--unsafe-allow-foreign-keys"} - alters, err := e.validateAndEditAlterTableStatement(capableOf, onlineDDL, alterTable, m) - assert.NoError(t, err) - var altersStrings []string - for _, alter := range alters { - altersStrings = append(altersStrings, sqlparser.String(alter)) - } - assert.Equal(t, tc.expect, altersStrings) - }) - } -} - -func TestAddInstantAlgorithm(t *testing.T) { - e := Executor{ - env: tabletenv.NewEnv(vtenv.NewTestEnv(), nil, "AddInstantAlgorithmTest"), - } - tt := []struct { - alter string - expect string - }{ - { - alter: "alter table t add column i2 int not null", - expect: "ALTER TABLE `t` ADD COLUMN `i2` int NOT NULL, ALGORITHM = INSTANT", - }, - { - alter: "alter table t add column i2 int not null, lock=none", - expect: "ALTER TABLE `t` ADD COLUMN `i2` int NOT NULL, LOCK NONE, ALGORITHM = INSTANT", - }, - { - alter: "alter table t add column i2 int not null, algorithm=inplace", - expect: "ALTER TABLE `t` ADD COLUMN `i2` int NOT NULL, ALGORITHM = INSTANT", - }, - { - alter: "alter table t add column i2 int not null, algorithm=inplace, lock=none", - expect: "ALTER TABLE `t` ADD COLUMN `i2` int NOT NULL, ALGORITHM = INSTANT, LOCK NONE", - }, - } - for _, tc := range tt { - t.Run(tc.alter, func(t *testing.T) { - stmt, err := e.env.Environment().Parser().ParseStrictDDL(tc.alter) - require.NoError(t, err) - alterTable, ok := stmt.(*sqlparser.AlterTable) - require.True(t, ok) - - e.addInstantAlgorithm(alterTable) - alterInstant := sqlparser.CanonicalString(alterTable) - - assert.Equal(t, tc.expect, alterInstant) - - stmt, err = e.env.Environment().Parser().ParseStrictDDL(alterInstant) - require.NoError(t, err) - _, ok = stmt.(*sqlparser.AlterTable) - require.True(t, ok) - }) - } -} - -func TestDuplicateCreateTable(t *testing.T) { - e := Executor{ - env: tabletenv.NewEnv(vtenv.NewTestEnv(), nil, "DuplicateCreateTableTest"), - } - ctx := context.Background() - onlineDDL := &schema.OnlineDDL{UUID: "a5a563da_dc1a_11ec_a416_0a43f95f28a3", Table: "something", Strategy: "vitess", Options: "--unsafe-allow-foreign-keys"} - - tcases := []struct { - sql string - newName string - expectSQL string - expectMapSize int - }{ - { - sql: "create table t (id int primary key)", - newName: "mytable", - expectSQL: "create table mytable (\n\tid int primary key\n)", - }, - { - sql: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", - newName: "mytable", - expectSQL: "create table mytable (\n\tid int primary key,\n\ti int,\n\tconstraint f_bjj16562shq086ozik3zf6kjg foreign key (i) references parent (id) on delete cascade\n)", - expectMapSize: 1, - }, - { - sql: "create table self (id int primary key, i int, constraint f foreign key (i) references self (id))", - newName: "mytable", - expectSQL: "create table mytable (\n\tid int primary key,\n\ti int,\n\tconstraint f_8aymb58nzb78l5jhq600veg6y foreign key (i) references mytable (id)\n)", - expectMapSize: 1, - }, - { - sql: "create table self (id int primary key, i1 int, i2 int, constraint f1 foreign key (i1) references self (id), constraint f1 foreign key (i2) references parent (id))", - newName: "mytable", - expectSQL: `create table mytable ( - id int primary key, - i1 int, - i2 int, - constraint f1_1rlsg9yls1t91i35zq5gyeoq7 foreign key (i1) references mytable (id), - constraint f1_59t4lvb1ncti6fxy27drad4jp foreign key (i2) references parent (id) -)`, - expectMapSize: 1, - }, - } - for _, tcase := range tcases { - t.Run(tcase.sql, func(t *testing.T) { - stmt, err := e.env.Environment().Parser().ParseStrictDDL(tcase.sql) - require.NoError(t, err) - originalCreateTable, ok := stmt.(*sqlparser.CreateTable) - require.True(t, ok) - require.NotNil(t, originalCreateTable) - newCreateTable, constraintMap, err := e.duplicateCreateTable(ctx, onlineDDL, originalCreateTable, tcase.newName) - assert.NoError(t, err) - assert.NotNil(t, newCreateTable) - assert.NotNil(t, constraintMap) - - newSQL := sqlparser.String(newCreateTable) - assert.Equal(t, tcase.expectSQL, newSQL) - assert.Equal(t, tcase.expectMapSize, len(constraintMap)) - }) - } -} - func TestShouldCutOverAccordingToBackoff(t *testing.T) { tcases := []struct { name string @@ -481,6 +100,38 @@ func TestShouldCutOverAccordingToBackoff(t *testing.T) { expectShouldCutOver: false, expectShouldForceCutOver: false, }, + { + name: "zero since ready", + cutoverAttempts: 3, + forceCutOverAfter: time.Second, + sinceReadyToComplete: 0, + expectShouldCutOver: false, + expectShouldForceCutOver: false, + }, + { + name: "zero since read, zero cut-over-after", + cutoverAttempts: 3, + forceCutOverAfter: 0, + sinceReadyToComplete: 0, + expectShouldCutOver: false, + expectShouldForceCutOver: false, + }, + { + name: "microsecond", + cutoverAttempts: 3, + forceCutOverAfter: time.Microsecond, + sinceReadyToComplete: time.Millisecond, + expectShouldCutOver: true, + expectShouldForceCutOver: true, + }, + { + name: "microsecond, not ready", + cutoverAttempts: 3, + forceCutOverAfter: time.Millisecond, + sinceReadyToComplete: time.Microsecond, + expectShouldCutOver: false, + expectShouldForceCutOver: false, + }, { name: "cutover-after overrides backoff", cutoverAttempts: 3, diff --git a/go/vt/vttablet/onlineddl/schema.go b/go/vt/vttablet/onlineddl/schema.go index 30f132bd0e3..a30ab6b3ed9 100644 --- a/go/vt/vttablet/onlineddl/schema.go +++ b/go/vt/vttablet/onlineddl/schema.go @@ -169,6 +169,13 @@ const ( WHERE migration_uuid=%a ` + sqlUpdateReadyForCleanupAll = `UPDATE _vt.schema_migrations + SET retain_artifacts_seconds=-1 + WHERE + migration_status IN ('complete', 'cancelled', 'failed') + AND cleanup_timestamp IS NULL + AND retain_artifacts_seconds > 0 + ` sqlUpdateForceCutOver = `UPDATE _vt.schema_migrations SET force_cutover=1 WHERE @@ -202,7 +209,9 @@ const ( migration_uuid=%a ` sqlUpdateMessage = `UPDATE _vt.schema_migrations - SET message=%a + SET + message=%a, + message_timestamp=NOW(6) WHERE migration_uuid=%a ` @@ -242,7 +251,7 @@ const ( migration_uuid=%a ` sqlUpdateLastThrottled = `UPDATE _vt.schema_migrations - SET last_throttled_timestamp=%a, component_throttled=%a + SET last_throttled_timestamp=%a, component_throttled=%a, reason_throttled=%a WHERE migration_uuid=%a ` @@ -297,7 +306,7 @@ const ( postpone_completion, force_cutover, cutover_attempts, - ifnull(timestampdiff(second, ready_to_complete_timestamp, now()), 0) as seconds_since_ready_to_complete, + ifnull(timestampdiff(microsecond, ready_to_complete_timestamp, now(6)), 0) as microseconds_since_ready_to_complete, ifnull(timestampdiff(second, last_cutover_attempt_timestamp, now()), 0) as seconds_since_last_cutover_attempt, timestampdiff(second, started_timestamp, now()) as elapsed_seconds FROM _vt.schema_migrations @@ -428,6 +437,7 @@ const ( last_throttled_timestamp, cancelled_timestamp, component_throttled, + reason_throttled, postpone_launch, postpone_completion, is_immediate_operation, @@ -453,16 +463,6 @@ const ( AND ACTION_TIMING='AFTER' AND LEFT(TRIGGER_NAME, 7)='pt_osc_' ` - sqlSelectColumnTypes = ` - select - *, - COLUMN_DEFAULT IS NULL AS is_default_null - from - information_schema.columns - where - table_schema=%a - and table_name=%a - ` selSelectCountFKParentConstraints = ` SELECT COUNT(*) as num_fk_constraints @@ -479,75 +479,10 @@ const ( TABLE_SCHEMA=%a AND TABLE_NAME=%a AND REFERENCED_TABLE_NAME IS NOT NULL ` - sqlSelectUniqueKeys = ` - SELECT - COLUMNS.TABLE_SCHEMA as table_schema, - COLUMNS.TABLE_NAME as table_name, - COLUMNS.COLUMN_NAME as column_name, - UNIQUES.INDEX_NAME as index_name, - UNIQUES.COLUMN_NAMES as column_names, - UNIQUES.COUNT_COLUMN_IN_INDEX as count_column_in_index, - COLUMNS.DATA_TYPE as data_type, - COLUMNS.CHARACTER_SET_NAME as character_set_name, - LOCATE('auto_increment', EXTRA) > 0 as is_auto_increment, - (DATA_TYPE='float' OR DATA_TYPE='double') AS is_float, - has_subpart, - has_nullable - FROM INFORMATION_SCHEMA.COLUMNS INNER JOIN ( - SELECT - TABLE_SCHEMA, - TABLE_NAME, - INDEX_NAME, - COUNT(*) AS COUNT_COLUMN_IN_INDEX, - GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX ASC) AS COLUMN_NAMES, - SUBSTRING_INDEX(GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX ASC), ',', 1) AS FIRST_COLUMN_NAME, - SUM(SUB_PART IS NOT NULL) > 0 AS has_subpart, - SUM(NULLABLE='YES') > 0 AS has_nullable - FROM INFORMATION_SCHEMA.STATISTICS - WHERE - NON_UNIQUE=0 - AND TABLE_SCHEMA=%a - AND TABLE_NAME=%a - GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME - ) AS UNIQUES - ON ( - COLUMNS.COLUMN_NAME = UNIQUES.FIRST_COLUMN_NAME - ) - WHERE - COLUMNS.TABLE_SCHEMA=%a - AND COLUMNS.TABLE_NAME=%a - ORDER BY - COLUMNS.TABLE_SCHEMA, COLUMNS.TABLE_NAME, - CASE UNIQUES.INDEX_NAME - WHEN 'PRIMARY' THEN 0 - ELSE 1 - END, - CASE has_nullable - WHEN 0 THEN 0 - ELSE 1 - END, - CASE has_subpart - WHEN 0 THEN 0 - ELSE 1 - END, - CASE IFNULL(CHARACTER_SET_NAME, '') - WHEN '' THEN 0 - ELSE 1 - END, - CASE DATA_TYPE - WHEN 'tinyint' THEN 0 - WHEN 'smallint' THEN 1 - WHEN 'int' THEN 2 - WHEN 'bigint' THEN 3 - ELSE 100 - END, - COUNT_COLUMN_IN_INDEX - ` sqlDropTrigger = "DROP TRIGGER IF EXISTS `%a`.`%a`" sqlShowTablesLike = "SHOW TABLES LIKE '%a'" sqlDropTable = "DROP TABLE `%a`" sqlDropTableIfExists = "DROP TABLE IF EXISTS `%a`" - sqlShowColumnsFrom = "SHOW COLUMNS FROM `%a`" sqlShowTableStatus = "SHOW TABLE STATUS LIKE '%a'" sqlAnalyzeTable = "ANALYZE NO_WRITE_TO_BINLOG TABLE `%a`" sqlShowCreateTable = "SHOW CREATE TABLE `%a`" @@ -555,23 +490,14 @@ const ( sqlShowVariablesLikeFastAnalyzeTable = "show global variables like 'fast_analyze_table'" sqlEnableFastAnalyzeTable = "set @@fast_analyze_table = 1" sqlDisableFastAnalyzeTable = "set @@fast_analyze_table = 0" - sqlGetAutoIncrement = ` - SELECT - AUTO_INCREMENT - FROM INFORMATION_SCHEMA.TABLES - WHERE - TABLES.TABLE_SCHEMA=%a - AND TABLES.TABLE_NAME=%a - AND AUTO_INCREMENT IS NOT NULL - ` - sqlAlterTableAutoIncrement = "ALTER TABLE `%s` AUTO_INCREMENT=%a" - sqlAlterTableExchangePartition = "ALTER TABLE `%a` EXCHANGE PARTITION `%a` WITH TABLE `%a`" - sqlAlterTableRemovePartitioning = "ALTER TABLE `%a` REMOVE PARTITIONING" - sqlAlterTableDropPartition = "ALTER TABLE `%a` DROP PARTITION `%a`" - sqlStartVReplStream = "UPDATE _vt.vreplication set state='Running' where db_name=%a and workflow=%a" - sqlStopVReplStream = "UPDATE _vt.vreplication set state='Stopped' where db_name=%a and workflow=%a" - sqlDeleteVReplStream = "DELETE FROM _vt.vreplication where db_name=%a and workflow=%a" - sqlReadVReplStream = `SELECT + sqlAlterTableAutoIncrement = "ALTER TABLE `%s` AUTO_INCREMENT=%a" + sqlAlterTableExchangePartition = "ALTER TABLE `%a` EXCHANGE PARTITION `%a` WITH TABLE `%a`" + sqlAlterTableRemovePartitioning = "ALTER TABLE `%a` REMOVE PARTITIONING" + sqlAlterTableDropPartition = "ALTER TABLE `%a` DROP PARTITION `%a`" + sqlStartVReplStream = "UPDATE _vt.vreplication set state='Running' where db_name=%a and workflow=%a" + sqlStopVReplStream = "UPDATE _vt.vreplication set state='Stopped' where db_name=%a and workflow=%a" + sqlDeleteVReplStream = "DELETE FROM _vt.vreplication where db_name=%a and workflow=%a" + sqlReadVReplStream = `SELECT id, workflow, source, @@ -581,6 +507,7 @@ const ( time_heartbeat, time_throttled, component_throttled, + reason_throttled, state, message, rows_copied @@ -588,6 +515,20 @@ const ( WHERE workflow=%a ` + sqlReadVReplLogErrors = `SELECT + state, + message + FROM _vt.vreplication_log + WHERE + vrepl_id=%a + AND ( + state='Error' + OR locate (concat(%a, ':'), message) = 1 + ) + ORDER BY + id DESC + LIMIT 1 + ` sqlReadCountCopyState = `SELECT count(*) as cnt FROM diff --git a/go/vt/vttablet/onlineddl/vrepl.go b/go/vt/vttablet/onlineddl/vrepl.go index cde2f276563..26eb614e95a 100644 --- a/go/vt/vttablet/onlineddl/vrepl.go +++ b/go/vt/vttablet/onlineddl/vrepl.go @@ -38,11 +38,10 @@ import ( "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/dbconnpool" "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/schema" + "vitess.io/vitess/go/vt/schemadiff" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet/onlineddl/vrepl" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -59,6 +58,7 @@ type VReplStream struct { timeHeartbeat int64 timeThrottled int64 componentThrottled string + reasonThrottled string transactionTimestamp int64 state binlogdatapb.VReplicationWorkflowState message string @@ -98,43 +98,23 @@ func (v *VReplStream) hasError() (isTerminal bool, vreplError error) { // VRepl is an online DDL helper for VReplication based migrations (ddl_strategy="online") type VRepl struct { - workflow string - keyspace string - shard string - dbName string - sourceTable string - targetTable string - pos string - alterQuery *sqlparser.AlterTable - tableRows int64 - - originalCreateTable *sqlparser.CreateTable - vreplCreateTable *sqlparser.CreateTable + workflow string + keyspace string + shard string + dbName string + pos string + tableRows int64 - analyzeTable bool - - sourceSharedColumns *vrepl.ColumnList - targetSharedColumns *vrepl.ColumnList - droppedSourceNonGeneratedColumns *vrepl.ColumnList - droppedNoDefaultColumnNames []string - expandedColumnNames []string - sharedColumnsMap map[string]string - sourceAutoIncrement uint64 + sourceCreateTableEntity *schemadiff.CreateTableEntity + targetCreateTableEntity *schemadiff.CreateTableEntity + analysis *schemadiff.MigrationTablesAnalysis - chosenSourceUniqueKey *vrepl.UniqueKey - chosenTargetUniqueKey *vrepl.UniqueKey - - addedUniqueKeys []*vrepl.UniqueKey - removedUniqueKeys []*vrepl.UniqueKey - removedForeignKeyNames []string + analyzeTable bool - revertibleNotes string - filterQuery string - enumToTextMap map[string]string - intToEnumMap map[string]bool - bls *binlogdatapb.BinlogSource + filterQuery string + bls *binlogdatapb.BinlogSource - parser *vrepl.AlterTableParser + alterTableAnalysis *schemadiff.AlterTableAnalysis convertCharset map[string](*binlogdatapb.CharsetConversion) @@ -148,110 +128,40 @@ func NewVRepl( keyspace string, shard string, dbName string, - sourceTable string, - targetTable string, - originalCreateTable *sqlparser.CreateTable, - vreplCreateTable *sqlparser.CreateTable, + sourceCreateTable *sqlparser.CreateTable, + targetCreateTable *sqlparser.CreateTable, alterQuery *sqlparser.AlterTable, analyzeTable bool, -) *VRepl { - return &VRepl{ - env: env, - workflow: workflow, - keyspace: keyspace, - shard: shard, - dbName: dbName, - sourceTable: sourceTable, - targetTable: targetTable, - originalCreateTable: originalCreateTable, - vreplCreateTable: vreplCreateTable, - alterQuery: alterQuery, - analyzeTable: analyzeTable, - parser: vrepl.NewAlterTableParser(), - enumToTextMap: map[string]string{}, - intToEnumMap: map[string]bool{}, - convertCharset: map[string](*binlogdatapb.CharsetConversion){}, - } -} - -// readAutoIncrement reads the AUTO_INCREMENT value, if any, for a give ntable -func (v *VRepl) readAutoIncrement(ctx context.Context, conn *dbconnpool.DBConnection, tableName string) (autoIncrement uint64, err error) { - query, err := sqlparser.ParseAndBind(sqlGetAutoIncrement, - sqltypes.StringBindVariable(v.dbName), - sqltypes.StringBindVariable(tableName), - ) +) (*VRepl, error) { + v := &VRepl{ + env: env, + workflow: workflow, + keyspace: keyspace, + shard: shard, + dbName: dbName, + alterTableAnalysis: schemadiff.OnlineDDLAlterTableAnalysis(alterQuery), + analyzeTable: analyzeTable, + convertCharset: map[string](*binlogdatapb.CharsetConversion){}, + } + senv := schemadiff.NewEnv(v.env, v.env.CollationEnv().DefaultConnectionCharset()) + var err error + v.sourceCreateTableEntity, err = schemadiff.NewCreateTableEntity(senv, sourceCreateTable) if err != nil { - return 0, err + return nil, err } - - rs, err := conn.ExecuteFetch(query, -1, true) + v.targetCreateTableEntity, err = schemadiff.NewCreateTableEntity(senv, targetCreateTable) if err != nil { - return 0, err - } - for _, row := range rs.Named().Rows { - autoIncrement = row.AsUint64("AUTO_INCREMENT", 0) + return nil, err } - - return autoIncrement, nil + return v, nil } -// readTableColumns reads column list from given table -func (v *VRepl) readTableColumns(ctx context.Context, conn *dbconnpool.DBConnection, tableName string) (columns *vrepl.ColumnList, virtualColumns *vrepl.ColumnList, pkColumns *vrepl.ColumnList, err error) { - parsed := sqlparser.BuildParsedQuery(sqlShowColumnsFrom, tableName) - rs, err := conn.ExecuteFetch(parsed.Query, -1, true) - if err != nil { - return nil, nil, nil, err - } - columnNames := []string{} - virtualColumnNames := []string{} - pkColumnNames := []string{} - for _, row := range rs.Named().Rows { - columnName := row.AsString("Field", "") - columnNames = append(columnNames, columnName) - - extra := row.AsString("Extra", "") - if strings.Contains(extra, "STORED GENERATED") || strings.Contains(extra, "VIRTUAL GENERATED") { - virtualColumnNames = append(virtualColumnNames, columnName) - } - - key := row.AsString("Key", "") - if key == "PRI" { - pkColumnNames = append(pkColumnNames, columnName) - } - } - if len(columnNames) == 0 { - return nil, nil, nil, fmt.Errorf("Found 0 columns on `%s`", tableName) - } - return vrepl.NewColumnList(columnNames), vrepl.NewColumnList(virtualColumnNames), vrepl.NewColumnList(pkColumnNames), nil +func (v *VRepl) sourceTableName() string { + return v.sourceCreateTableEntity.Name() } -// readTableUniqueKeys reads all unique keys from a given table, by order of usefulness/performance: PRIMARY first, integers are better, non-null are better -func (v *VRepl) readTableUniqueKeys(ctx context.Context, conn *dbconnpool.DBConnection, tableName string) (uniqueKeys []*vrepl.UniqueKey, err error) { - query, err := sqlparser.ParseAndBind(sqlSelectUniqueKeys, - sqltypes.StringBindVariable(v.dbName), - sqltypes.StringBindVariable(tableName), - sqltypes.StringBindVariable(v.dbName), - sqltypes.StringBindVariable(tableName), - ) - if err != nil { - return nil, err - } - rs, err := conn.ExecuteFetch(query, -1, true) - if err != nil { - return nil, err - } - for _, row := range rs.Named().Rows { - uniqueKey := &vrepl.UniqueKey{ - Name: row.AsString("index_name", ""), - Columns: *vrepl.ParseColumnList(row.AsString("column_names", "")), - HasNullable: row.AsBool("has_nullable", false), - HasSubpart: row.AsBool("has_subpart", false), - HasFloat: row.AsBool("is_float", false), - IsAutoIncrement: row.AsBool("is_auto_increment", false), - } - uniqueKeys = append(uniqueKeys, uniqueKey) - } - return uniqueKeys, nil +func (v *VRepl) targetTableName() string { + return v.targetCreateTableEntity.Name() } // isFastAnalyzeTableSupported checks if the underlying MySQL server supports 'fast_analyze_table', @@ -306,255 +216,64 @@ func (v *VRepl) readTableStatus(ctx context.Context, conn *dbconnpool.DBConnecti return tableRows, err } -// applyColumnTypes -func (v *VRepl) applyColumnTypes(ctx context.Context, conn *dbconnpool.DBConnection, tableName string, columnsLists ...*vrepl.ColumnList) error { - query, err := sqlparser.ParseAndBind(sqlSelectColumnTypes, - sqltypes.StringBindVariable(v.dbName), - sqltypes.StringBindVariable(tableName), - ) - if err != nil { - return err - } - rs, err := conn.ExecuteFetch(query, -1, true) - if err != nil { - return err - } - for _, row := range rs.Named().Rows { - columnName := row["COLUMN_NAME"].ToString() - columnType := row["COLUMN_TYPE"].ToString() - columnOctetLength := row.AsUint64("CHARACTER_OCTET_LENGTH", 0) - - for _, columnsList := range columnsLists { - column := columnsList.GetColumn(columnName) - if column == nil { - continue - } - - column.DataType = row.AsString("DATA_TYPE", "") // a more canonical form of column_type - column.IsNullable = (row.AsString("IS_NULLABLE", "") == "YES") - column.IsDefaultNull = row.AsBool("is_default_null", false) - - column.CharacterMaximumLength = row.AsInt64("CHARACTER_MAXIMUM_LENGTH", 0) - column.NumericPrecision = row.AsInt64("NUMERIC_PRECISION", 0) - column.NumericScale = row.AsInt64("NUMERIC_SCALE", 0) - column.DateTimePrecision = row.AsInt64("DATETIME_PRECISION", -1) - - column.Type = vrepl.UnknownColumnType - if strings.Contains(columnType, "unsigned") { - column.IsUnsigned = true - } - if strings.Contains(columnType, "mediumint") { - column.SetTypeIfUnknown(vrepl.MediumIntColumnType) - } - if strings.Contains(columnType, "timestamp") { - column.SetTypeIfUnknown(vrepl.TimestampColumnType) - } - if strings.Contains(columnType, "datetime") { - column.SetTypeIfUnknown(vrepl.DateTimeColumnType) - } - if strings.Contains(columnType, "json") { - column.SetTypeIfUnknown(vrepl.JSONColumnType) - } - if strings.Contains(columnType, "float") { - column.SetTypeIfUnknown(vrepl.FloatColumnType) - } - if strings.Contains(columnType, "double") { - column.SetTypeIfUnknown(vrepl.DoubleColumnType) - } - if strings.HasPrefix(columnType, "enum") { - column.SetTypeIfUnknown(vrepl.EnumColumnType) - column.EnumValues = schema.ParseEnumValues(columnType) - } - if strings.HasPrefix(columnType, "set(") { - column.SetTypeIfUnknown(vrepl.SetColumnType) - column.EnumValues = schema.ParseSetValues(columnType) - } - if strings.HasPrefix(columnType, "binary") { - column.SetTypeIfUnknown(vrepl.BinaryColumnType) - column.BinaryOctetLength = columnOctetLength - } - if charset := row.AsString("CHARACTER_SET_NAME", ""); charset != "" { - column.Charset = charset - } - if collation := row.AsString("COLLATION_NAME", ""); collation != "" { - column.SetTypeIfUnknown(vrepl.StringColumnType) - column.Collation = collation +// formalizeColumns +func formalizeColumns(columnsLists ...*schemadiff.ColumnDefinitionEntityList) error { + for _, colList := range columnsLists { + for _, col := range colList.Entities { + col.SetExplicitDefaultAndNull() + if err := col.SetExplicitCharsetCollate(); err != nil { + return err } } } return nil } -func (v *VRepl) analyzeAlter(ctx context.Context) error { - if v.alterQuery == nil { - // Happens for REVERT - return nil - } - v.parser.AnalyzeAlter(v.alterQuery) - if v.parser.IsRenameTable() { - return fmt.Errorf("Renaming the table is not supported in ALTER TABLE: %s", sqlparser.CanonicalString(v.alterQuery)) +func (v *VRepl) analyzeAlter() error { + if v.alterTableAnalysis.IsRenameTable { + return fmt.Errorf("renaming the table is not supported in ALTER TABLE") } return nil } -func (v *VRepl) analyzeTables(ctx context.Context, conn *dbconnpool.DBConnection) (err error) { - if v.analyzeTable { - if err := v.executeAnalyzeTable(ctx, conn, v.sourceTable); err != nil { - return err - } - } - v.tableRows, err = v.readTableStatus(ctx, conn, v.sourceTable) - if err != nil { - return err - } - // columns: - sourceColumns, sourceVirtualColumns, sourcePKColumns, err := v.readTableColumns(ctx, conn, v.sourceTable) - if err != nil { - return err - } - targetColumns, targetVirtualColumns, targetPKColumns, err := v.readTableColumns(ctx, conn, v.targetTable) - if err != nil { - return err - } - v.sourceSharedColumns, v.targetSharedColumns, v.droppedSourceNonGeneratedColumns, v.sharedColumnsMap = vrepl.GetSharedColumns(sourceColumns, targetColumns, sourceVirtualColumns, targetVirtualColumns, v.parser) - - // unique keys - sourceUniqueKeys, err := v.readTableUniqueKeys(ctx, conn, v.sourceTable) - if err != nil { - return err - } - if len(sourceUniqueKeys) == 0 { - return fmt.Errorf("Found no possible unique key on `%s`", v.sourceTable) - } - targetUniqueKeys, err := v.readTableUniqueKeys(ctx, conn, v.targetTable) +func (v *VRepl) analyzeTables() (err error) { + analysis, err := schemadiff.OnlineDDLMigrationTablesAnalysis(v.sourceCreateTableEntity, v.targetCreateTableEntity, v.alterTableAnalysis) if err != nil { return err } - if len(targetUniqueKeys) == 0 { - return fmt.Errorf("Found no possible unique key on `%s`", v.targetTable) - } - v.chosenSourceUniqueKey, v.chosenTargetUniqueKey = vrepl.GetSharedUniqueKeys(sourceUniqueKeys, targetUniqueKeys, v.parser.ColumnRenameMap()) - if v.chosenSourceUniqueKey == nil { - // VReplication supports completely different unique keys on source and target, covering - // some/completely different columns. The condition is that the key on source - // must use columns which all exist on target table. - v.chosenSourceUniqueKey = vrepl.GetUniqueKeyCoveredByColumns(sourceUniqueKeys, v.sourceSharedColumns) - if v.chosenSourceUniqueKey == nil { - // Still no luck. - return fmt.Errorf("Found no possible unique key on `%s` whose columns are in target table `%s`", v.sourceTable, v.targetTable) - } - } - if v.chosenTargetUniqueKey == nil { - // VReplication supports completely different unique keys on source and target, covering - // some/completely different columns. The condition is that the key on target - // must use columns which all exist on source table. - v.chosenTargetUniqueKey = vrepl.GetUniqueKeyCoveredByColumns(targetUniqueKeys, v.targetSharedColumns) - if v.chosenTargetUniqueKey == nil { - // Still no luck. - return fmt.Errorf("Found no possible unique key on `%s` whose columns are in source table `%s`", v.targetTable, v.sourceTable) - } - } - if v.chosenSourceUniqueKey == nil || v.chosenTargetUniqueKey == nil { - return fmt.Errorf("Found no shared, not nullable, unique keys between `%s` and `%s`", v.sourceTable, v.targetTable) - } - v.addedUniqueKeys = vrepl.AddedUniqueKeys(sourceUniqueKeys, targetUniqueKeys, v.parser.ColumnRenameMap()) - v.removedUniqueKeys = vrepl.RemovedUniqueKeys(sourceUniqueKeys, targetUniqueKeys, v.parser.ColumnRenameMap()) - v.removedForeignKeyNames, err = vrepl.RemovedForeignKeyNames(v.env, v.originalCreateTable, v.vreplCreateTable) - if err != nil { - return err - } - - // chosen source & target unique keys have exact columns in same order - sharedPKColumns := &v.chosenSourceUniqueKey.Columns + v.analysis = analysis - if err := v.applyColumnTypes(ctx, conn, v.sourceTable, sourceColumns, sourceVirtualColumns, sourcePKColumns, v.sourceSharedColumns, sharedPKColumns, v.droppedSourceNonGeneratedColumns); err != nil { - return err - } - if err := v.applyColumnTypes(ctx, conn, v.targetTable, targetColumns, targetVirtualColumns, targetPKColumns, v.targetSharedColumns); err != nil { - return err - } - - for _, sourcePKColumn := range sharedPKColumns.Columns() { - mappedColumn := v.targetSharedColumns.GetColumn(sourcePKColumn.Name) - if sourcePKColumn.Type == vrepl.EnumColumnType && mappedColumn.Type == vrepl.EnumColumnType { - // An ENUM as part of PRIMARY KEY. We must convert it to text because OMG that's complicated. - // There's a scenario where a query may modify the enum value (and it's bad practice, seeing - // that it's part of the PK, but it's still valid), and in that case we must have the string value - // to be able to DELETE the old row - v.targetSharedColumns.SetEnumToTextConversion(mappedColumn.Name, sourcePKColumn.EnumValues) - v.enumToTextMap[sourcePKColumn.Name] = sourcePKColumn.EnumValues - } - } - - for i := range v.sourceSharedColumns.Columns() { - sourceColumn := v.sourceSharedColumns.Columns()[i] - mappedColumn := v.targetSharedColumns.Columns()[i] - if sourceColumn.Type == vrepl.EnumColumnType { - switch { - // Either this is an ENUM column that stays an ENUM, or it is converted to a textual type. - // We take note of the enum values, and make it available in vreplication's Filter.Rule.ConvertEnumToText. - // This, in turn, will be used by vplayer (in TablePlan) like so: - // - In the binary log, enum values are integers. - // - Upon seeing this map, PlanBuilder will convert said int to the enum's logical string value. - // - And will apply the value as a string (`StringBindVariable`) in the query. - // What this allows is for enum values to have different ordering in the before/after table schema, - // so that for example you could modify an enum column: - // - from `('red', 'green', 'blue')` to `('red', 'blue')` - // - from `('red', 'green', 'blue')` to `('blue', 'red', 'green')` - case mappedColumn.Type == vrepl.EnumColumnType: - v.enumToTextMap[sourceColumn.Name] = sourceColumn.EnumValues - case mappedColumn.Charset != "": - v.enumToTextMap[sourceColumn.Name] = sourceColumn.EnumValues - v.targetSharedColumns.SetEnumToTextConversion(mappedColumn.Name, sourceColumn.EnumValues) - } - } + return nil +} - if sourceColumn.IsIntegralType() && mappedColumn.Type == vrepl.EnumColumnType { - v.intToEnumMap[sourceColumn.Name] = true +// analyzeTableStatus reads information from SHOW TABLE STATUS +func (v *VRepl) analyzeTableStatus(ctx context.Context, conn *dbconnpool.DBConnection) (err error) { + if v.analyzeTable { + if err := v.executeAnalyzeTable(ctx, conn, v.sourceTableName()); err != nil { + return err } } - - v.droppedNoDefaultColumnNames = vrepl.GetNoDefaultColumnNames(v.droppedSourceNonGeneratedColumns) - var expandedDescriptions map[string]string - v.expandedColumnNames, expandedDescriptions = vrepl.GetExpandedColumnNames(v.sourceSharedColumns, v.targetSharedColumns) - - v.sourceAutoIncrement, err = v.readAutoIncrement(ctx, conn, v.sourceTable) - - notes := []string{} - for _, uk := range v.removedUniqueKeys { - notes = append(notes, fmt.Sprintf("unique constraint removed: %s", uk.Name)) - } - for _, name := range v.droppedNoDefaultColumnNames { - notes = append(notes, fmt.Sprintf("column %s dropped, and had no default value", name)) - } - for _, name := range v.expandedColumnNames { - notes = append(notes, fmt.Sprintf("column %s: %s", name, expandedDescriptions[name])) - } - for _, name := range v.removedForeignKeyNames { - notes = append(notes, fmt.Sprintf("foreign key %s dropped", name)) - } - v.revertibleNotes = strings.Join(notes, "\n") + v.tableRows, err = v.readTableStatus(ctx, conn, v.sourceTableName()) if err != nil { return err } - return nil } // generateFilterQuery creates a SELECT query used by vreplication as a filter. It SELECTs all // non-generated columns between source & target tables, and takes care of column renames. -func (v *VRepl) generateFilterQuery(ctx context.Context) error { - if v.sourceSharedColumns.Len() == 0 { - return fmt.Errorf("Empty column list") +func (v *VRepl) generateFilterQuery() error { + if v.analysis.SourceSharedColumns.Len() == 0 { + return fmt.Errorf("empty column list") } var sb strings.Builder sb.WriteString("select ") - for i, sourceCol := range v.sourceSharedColumns.Columns() { - name := sourceCol.Name - targetName := v.sharedColumnsMap[name] + for i, sourceCol := range v.analysis.SourceSharedColumns.Entities { + name := sourceCol.Name() + targetName := v.analysis.SharedColumnsMap[name] - targetCol := v.targetSharedColumns.GetColumn(targetName) + targetCol := v.analysis.TargetSharedColumns.GetColumn(targetName) if targetCol == nil { return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "Cannot find target column %s", targetName) } @@ -563,37 +282,41 @@ func (v *VRepl) generateFilterQuery(ctx context.Context) error { sb.WriteString(", ") } switch { - case sourceCol.EnumToTextConversion: + case sourceCol.HasEnumValues(): + // Source is `enum` or `set`. We always take the textual represenation rather than the numeric one. sb.WriteString(fmt.Sprintf("CONCAT(%s)", escapeName(name))) - case v.intToEnumMap[name]: + case v.analysis.IntToEnumMap[name]: sb.WriteString(fmt.Sprintf("CONCAT(%s)", escapeName(name))) - case sourceCol.Type == vrepl.JSONColumnType: + case sourceCol.Type() == "json": sb.WriteString(fmt.Sprintf("convert(%s using utf8mb4)", escapeName(name))) - case sourceCol.Type == vrepl.StringColumnType: + case targetCol.Type() == "json": // we already know the source col is not JSON, per the above `case` condition + // Convert any type to JSON: encode the type as utf8mb4 text + sb.WriteString(fmt.Sprintf("convert(%s using utf8mb4)", escapeName(name))) + case sourceCol.IsTextual(): // Check source and target charset/encoding. If needed, create // a binlogdatapb.CharsetConversion entry (later written to vreplication) - fromCollation := v.env.CollationEnv().DefaultCollationForCharset(sourceCol.Charset) + fromCollation := v.env.CollationEnv().DefaultCollationForCharset(sourceCol.Charset()) if fromCollation == collations.Unknown { - return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Character set %s not supported for column %s", sourceCol.Charset, sourceCol.Name) + return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Character set %s not supported for column %s", sourceCol.Charset(), sourceCol.Name()) } - toCollation := v.env.CollationEnv().DefaultCollationForCharset(targetCol.Charset) + toCollation := v.env.CollationEnv().DefaultCollationForCharset(targetCol.Charset()) // Let's see if target col is at all textual - if targetCol.Type == vrepl.StringColumnType && toCollation == collations.Unknown { - return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Character set %s not supported for column %s", targetCol.Charset, targetCol.Name) + if targetCol.IsTextual() && toCollation == collations.Unknown { + return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Character set %s not supported for column %s", targetCol.Charset(), targetCol.Name()) } - - if trivialCharset(fromCollation) && trivialCharset(toCollation) && targetCol.Type != vrepl.JSONColumnType { + if trivialCharset(fromCollation) && trivialCharset(toCollation) { + sb.WriteString(escapeName(name)) + } else if fromCollation == toCollation { + // No need for charset conversions as both have the same collation. sb.WriteString(escapeName(name)) } else { + // Charset conversion required: v.convertCharset[targetName] = &binlogdatapb.CharsetConversion{ - FromCharset: sourceCol.Charset, - ToCharset: targetCol.Charset, + FromCharset: sourceCol.Charset(), + ToCharset: targetCol.Charset(), } - sb.WriteString(fmt.Sprintf("convert(%s using utf8mb4)", escapeName(name))) + sb.WriteString(escapeName(name)) } - case targetCol.Type == vrepl.JSONColumnType && sourceCol.Type != vrepl.JSONColumnType: - // Convert any type to JSON: encode the type as utf8mb4 text - sb.WriteString(fmt.Sprintf("convert(%s using utf8mb4)", escapeName(name))) default: sb.WriteString(escapeName(name)) } @@ -601,7 +324,7 @@ func (v *VRepl) generateFilterQuery(ctx context.Context) error { sb.WriteString(escapeName(targetName)) } sb.WriteString(" from ") - sb.WriteString(escapeName(v.sourceTable)) + sb.WriteString(escapeName(v.sourceTableName())) v.filterQuery = sb.String() return nil @@ -623,25 +346,22 @@ func (v *VRepl) analyzeBinlogSource(ctx context.Context) { StopAfterCopy: false, } - encodeColumns := func(columns *vrepl.ColumnList) string { - return textutil.EscapeJoin(columns.Names(), ",") + encodeColumns := func(names []string) string { + return textutil.EscapeJoin(names, ",") } rule := &binlogdatapb.Rule{ - Match: v.targetTable, + Match: v.targetTableName(), Filter: v.filterQuery, - SourceUniqueKeyColumns: encodeColumns(&v.chosenSourceUniqueKey.Columns), - TargetUniqueKeyColumns: encodeColumns(&v.chosenTargetUniqueKey.Columns), - SourceUniqueKeyTargetColumns: encodeColumns(v.chosenSourceUniqueKey.Columns.MappedNamesColumnList(v.sharedColumnsMap)), - ForceUniqueKey: url.QueryEscape(v.chosenSourceUniqueKey.Name), + SourceUniqueKeyColumns: encodeColumns(v.analysis.ChosenSourceUniqueKey.ColumnList.Names()), + TargetUniqueKeyColumns: encodeColumns(v.analysis.ChosenTargetUniqueKey.ColumnList.Names()), + SourceUniqueKeyTargetColumns: encodeColumns(schemadiff.MappedColumnNames(v.analysis.ChosenSourceUniqueKey.ColumnList, v.analysis.SharedColumnsMap)), + ForceUniqueKey: url.QueryEscape(v.analysis.ChosenSourceUniqueKey.Name()), } if len(v.convertCharset) > 0 { rule.ConvertCharset = v.convertCharset } - if len(v.enumToTextMap) > 0 { - rule.ConvertEnumToText = v.enumToTextMap - } - if len(v.intToEnumMap) > 0 { - rule.ConvertIntToEnum = v.intToEnumMap + if len(v.analysis.IntToEnumMap) > 0 { + rule.ConvertIntToEnum = v.analysis.IntToEnumMap } bls.Filter.Rules = append(bls.Filter.Rules, rule) @@ -649,13 +369,16 @@ func (v *VRepl) analyzeBinlogSource(ctx context.Context) { } func (v *VRepl) analyze(ctx context.Context, conn *dbconnpool.DBConnection) error { - if err := v.analyzeAlter(ctx); err != nil { + if err := v.analyzeAlter(); err != nil { + return err + } + if err := v.analyzeTables(); err != nil { return err } - if err := v.analyzeTables(ctx, conn); err != nil { + if err := v.generateFilterQuery(); err != nil { return err } - if err := v.generateFilterQuery(ctx); err != nil { + if err := v.analyzeTableStatus(ctx, conn); err != nil { return err } v.analyzeBinlogSource(ctx) @@ -663,16 +386,16 @@ func (v *VRepl) analyze(ctx context.Context, conn *dbconnpool.DBConnection) erro } // generateInsertStatement generates the INSERT INTO _vt.replication statement that creates the vreplication workflow -func (v *VRepl) generateInsertStatement(ctx context.Context) (string, error) { +func (v *VRepl) generateInsertStatement() (string, error) { ig := vreplication.NewInsertGenerator(binlogdatapb.VReplicationWorkflowState_Stopped, v.dbName) ig.AddRow(v.workflow, v.bls, v.pos, "", "in_order:REPLICA,PRIMARY", - binlogdatapb.VReplicationWorkflowType_OnlineDDL, binlogdatapb.VReplicationWorkflowSubType_None, false) + binlogdatapb.VReplicationWorkflowType_OnlineDDL, binlogdatapb.VReplicationWorkflowSubType_None, false, "") return ig.String(), nil } // generateStartStatement Generates the statement to start VReplication running on the workflow -func (v *VRepl) generateStartStatement(ctx context.Context) (string, error) { +func (v *VRepl) generateStartStatement() (string, error) { return sqlparser.ParseAndBind(sqlStartVReplStream, sqltypes.StringBindVariable(v.dbName), sqltypes.StringBindVariable(v.workflow), diff --git a/go/vt/vttablet/onlineddl/vrepl/columns.go b/go/vt/vttablet/onlineddl/vrepl/columns.go deleted file mode 100644 index f2bb8f6d3f2..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/columns.go +++ /dev/null @@ -1,208 +0,0 @@ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "fmt" - "strings" - - "vitess.io/vitess/go/vt/schema" -) - -// expandedDataTypes maps some known and difficult-to-compute by INFORMATION_SCHEMA data types which expand other data types. -// For example, in "date:datetime", datetime expands date because it has more precision. In "timestamp:date" date expands timestamp -// because it can contain years not covered by timestamp. -var expandedDataTypes = map[string]bool{ - "time:datetime": true, - "date:datetime": true, - "timestamp:datetime": true, - "time:timestamp": true, - "date:timestamp": true, - "timestamp:date": true, -} - -// GetSharedColumns returns the intersection of two lists of columns in same order as the first list -func GetSharedColumns( - sourceColumns, targetColumns *ColumnList, - sourceVirtualColumns, targetVirtualColumns *ColumnList, - parser *AlterTableParser, -) ( - sourceSharedColumns *ColumnList, - targetSharedColumns *ColumnList, - droppedSourceNonGeneratedColumns *ColumnList, - sharedColumnsMap map[string]string, -) { - sharedColumnNames := []string{} - droppedSourceNonGeneratedColumnsNames := []string{} - for _, sourceColumn := range sourceColumns.Names() { - isSharedColumn := false - isVirtualColumnOnSource := false - for _, targetColumn := range targetColumns.Names() { - if strings.EqualFold(sourceColumn, targetColumn) { - // both tables have this column. Good start. - isSharedColumn = true - break - } - if strings.EqualFold(parser.columnRenameMap[sourceColumn], targetColumn) { - // column in source is renamed in target - isSharedColumn = true - break - } - } - for droppedColumn := range parser.DroppedColumnsMap() { - if strings.EqualFold(sourceColumn, droppedColumn) { - isSharedColumn = false - break - } - } - for _, virtualColumn := range sourceVirtualColumns.Names() { - // virtual/generated columns on source are silently skipped - if strings.EqualFold(sourceColumn, virtualColumn) { - isSharedColumn = false - isVirtualColumnOnSource = true - } - } - for _, virtualColumn := range targetVirtualColumns.Names() { - // virtual/generated columns on target are silently skipped - if strings.EqualFold(sourceColumn, virtualColumn) { - isSharedColumn = false - } - } - if isSharedColumn { - sharedColumnNames = append(sharedColumnNames, sourceColumn) - } else if !isVirtualColumnOnSource { - droppedSourceNonGeneratedColumnsNames = append(droppedSourceNonGeneratedColumnsNames, sourceColumn) - } - } - sharedColumnsMap = map[string]string{} - for _, columnName := range sharedColumnNames { - if mapped, ok := parser.columnRenameMap[columnName]; ok { - sharedColumnsMap[columnName] = mapped - } else { - sharedColumnsMap[columnName] = columnName - } - } - mappedSharedColumnNames := []string{} - for _, columnName := range sharedColumnNames { - mappedSharedColumnNames = append(mappedSharedColumnNames, sharedColumnsMap[columnName]) - } - return NewColumnList(sharedColumnNames), NewColumnList(mappedSharedColumnNames), NewColumnList(droppedSourceNonGeneratedColumnsNames), sharedColumnsMap -} - -// isExpandedColumn sees if target column has any value set/range that is impossible in source column. See GetExpandedColumns comment for examples -func isExpandedColumn(sourceColumn *Column, targetColumn *Column) (bool, string) { - if targetColumn.IsNullable && !sourceColumn.IsNullable { - return true, "target is NULL-able, source is not" - } - if targetColumn.CharacterMaximumLength > sourceColumn.CharacterMaximumLength { - return true, "increased CHARACTER_MAXIMUM_LENGTH" - } - if targetColumn.NumericPrecision > sourceColumn.NumericPrecision { - return true, "increased NUMERIC_PRECISION" - } - if targetColumn.NumericScale > sourceColumn.NumericScale { - return true, "increased NUMERIC_SCALE" - } - if targetColumn.DateTimePrecision > sourceColumn.DateTimePrecision { - return true, "increased DATETIME_PRECISION" - } - if sourceColumn.IsNumeric() && targetColumn.IsNumeric() { - if sourceColumn.IsUnsigned && !targetColumn.IsUnsigned { - return true, "source is unsigned, target is signed" - } - if sourceColumn.NumericPrecision <= targetColumn.NumericPrecision && !sourceColumn.IsUnsigned && targetColumn.IsUnsigned { - // e.g. INT SIGNED => INT UNSIGNED, INT SIGNED => BIGINT UNSIGNED - return true, "target unsigned value exceeds source unsigned value" - } - if targetColumn.IsFloatingPoint() && !sourceColumn.IsFloatingPoint() { - return true, "target is floating point, source is not" - } - } - if expandedDataTypes[fmt.Sprintf("%s:%s", sourceColumn.DataType, targetColumn.DataType)] { - return true, "target is expanded data type of source" - } - if sourceColumn.Charset != targetColumn.Charset { - if targetColumn.Charset == "utf8mb4" { - return true, "expand character set to utf8mb4" - } - if strings.HasPrefix(targetColumn.Charset, "utf8") && !strings.HasPrefix(sourceColumn.Charset, "utf8") { - // not utf to utf - return true, "expand character set to utf8" - } - } - for _, colType := range []ColumnType{EnumColumnType, SetColumnType} { - // enums and sets have very similar properties, and are practically identical in our analysis - if sourceColumn.Type == colType { - // this is an enum or a set - if targetColumn.Type != colType { - return true, "conversion from enum/set to non-enum/set adds potential values" - } - // target is an enum or a set. See if all values on target exist in source - sourceEnumTokensMap := schema.ParseEnumOrSetTokensMap(sourceColumn.EnumValues) - targetEnumTokensMap := schema.ParseEnumOrSetTokensMap(targetColumn.EnumValues) - for k, v := range targetEnumTokensMap { - if sourceEnumTokensMap[k] != v { - return true, "target enum/set expands source enum/set" - } - } - } - } - return false, "" -} - -// GetExpandedColumnNames is given source and target shared columns, and returns the list of columns whose data type is expanded. -// An expanded data type is one where the target can have a value which the source does not. Examples: -// - any NOT NULL to NULLable (a NULL in the target cannot appear on source) -// - INT -> BIGINT (obvious) -// - BIGINT UNSIGNED -> INT SIGNED (negative values) -// - TIMESTAMP -> TIMESTAMP(3) -// etc. -func GetExpandedColumnNames( - sourceSharedColumns *ColumnList, - targetSharedColumns *ColumnList, -) ( - expandedColumnNames []string, - expandedDescriptions map[string]string, -) { - expandedDescriptions = map[string]string{} - for i := range sourceSharedColumns.Columns() { - // source and target columns assumed to be mapped 1:1, same length - sourceColumn := sourceSharedColumns.Columns()[i] - targetColumn := targetSharedColumns.Columns()[i] - - if isExpanded, description := isExpandedColumn(&sourceColumn, &targetColumn); isExpanded { - expandedColumnNames = append(expandedColumnNames, sourceColumn.Name) - expandedDescriptions[sourceColumn.Name] = description - } - } - return expandedColumnNames, expandedDescriptions -} - -// GetNoDefaultColumnNames returns names of columns which have no default value, out of given list of columns -func GetNoDefaultColumnNames(columns *ColumnList) (names []string) { - names = []string{} - for _, col := range columns.Columns() { - if !col.HasDefault() { - names = append(names, col.Name) - } - } - return names -} diff --git a/go/vt/vttablet/onlineddl/vrepl/columns_test.go b/go/vt/vttablet/onlineddl/vrepl/columns_test.go deleted file mode 100644 index 32efd104cc1..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/columns_test.go +++ /dev/null @@ -1,380 +0,0 @@ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -var ( - columnsA = &ColumnList{ - columns: []Column{ - { - Name: "id", - }, - { - Name: "cint", - }, - { - Name: "cgen1", - }, - { - Name: "cgen2", - }, - { - Name: "cchar", - }, - { - Name: "cremoved", - }, - { - Name: "cnullable", - IsNullable: true, - }, - { - Name: "cnodefault", - IsNullable: false, - IsDefaultNull: true, - }, - }, - Ordinals: ColumnsMap{}, - } - columnsB = &ColumnList{ - columns: []Column{ - { - Name: "id", - }, - { - Name: "cint", - }, - { - Name: "cgen1", - }, - { - Name: "cchar_alternate", - }, - { - Name: "cnullable", - IsNullable: true, - }, - { - Name: "cnodefault", - IsNullable: false, - IsDefaultNull: true, - }, - }, - Ordinals: ColumnsMap{}, - } - columnsVirtual = ParseColumnList("cgen1,cgen2") -) - -func TestGetSharedColumns(t *testing.T) { - tt := []struct { - name string - sourceCols *ColumnList - targetCols *ColumnList - renameMap map[string]string - expectSourceSharedColNames []string - expectTargetSharedColNames []string - expectDroppedSourceNonGeneratedColNames []string - }{ - { - name: "rename map empty", - sourceCols: columnsA, - targetCols: columnsB, - renameMap: map[string]string{}, - expectSourceSharedColNames: []string{"id", "cint", "cnullable", "cnodefault"}, - expectTargetSharedColNames: []string{"id", "cint", "cnullable", "cnodefault"}, - expectDroppedSourceNonGeneratedColNames: []string{"cchar", "cremoved"}, - }, - { - name: "renamed column", - sourceCols: columnsA, - targetCols: columnsB, - renameMap: map[string]string{"cchar": "cchar_alternate"}, - expectSourceSharedColNames: []string{"id", "cint", "cchar", "cnullable", "cnodefault"}, - expectTargetSharedColNames: []string{"id", "cint", "cchar_alternate", "cnullable", "cnodefault"}, - expectDroppedSourceNonGeneratedColNames: []string{"cremoved"}, - }, - } - - parser := NewAlterTableParser() - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - parser.columnRenameMap = tc.renameMap - sourceSharedCols, targetSharedCols, droppedNonGeneratedCols, _ := GetSharedColumns( - tc.sourceCols, tc.targetCols, - columnsVirtual, columnsVirtual, - parser, - ) - assert.Equal(t, tc.expectSourceSharedColNames, sourceSharedCols.Names()) - assert.Equal(t, tc.expectTargetSharedColNames, targetSharedCols.Names()) - assert.Equal(t, tc.expectDroppedSourceNonGeneratedColNames, droppedNonGeneratedCols.Names()) - }) - } -} - -func TestGetExpandedColumnNames(t *testing.T) { - var ( - columnsA = &ColumnList{ - columns: []Column{ - { - Name: "c1", - IsNullable: true, - }, - { - Name: "c2", - IsNullable: true, - }, - { - Name: "c3", - IsNullable: false, - }, - }, - Ordinals: ColumnsMap{}, - } - columnsB = &ColumnList{ - columns: []Column{ - { - Name: "c1", - IsNullable: true, - }, - { - Name: "c2", - IsNullable: false, - }, - { - Name: "c3", - IsNullable: true, - }, - }, - Ordinals: ColumnsMap{}, - } - ) - tcases := []struct { - name string - sourceCol Column - targetCol Column - expanded bool - }{ - { - "both nullable", - Column{ - IsNullable: true, - }, - Column{ - IsNullable: true, - }, - false, - }, - { - "nullable to non nullable", - Column{ - IsNullable: true, - }, - Column{ - IsNullable: false, - }, - false, - }, - { - "non nullable to nullable", - Column{ - IsNullable: false, - }, - Column{ - IsNullable: true, - }, - true, - }, - { - "signed to unsigned", - Column{ - Type: IntegerColumnType, - NumericPrecision: 4, - IsUnsigned: false, - }, - Column{ - Type: IntegerColumnType, - NumericPrecision: 4, - IsUnsigned: true, - }, - true, - }, - { - "unsigned to signed", - Column{ - Type: IntegerColumnType, - NumericPrecision: 4, - IsUnsigned: true, - }, - Column{ - Type: IntegerColumnType, - NumericPrecision: 4, - IsUnsigned: false, - }, - true, - }, - { - "signed to smaller unsigned", - Column{ - Type: IntegerColumnType, - NumericPrecision: 8, - IsUnsigned: false, - }, - Column{ - Type: IntegerColumnType, - NumericPrecision: 4, - IsUnsigned: true, - }, - false, - }, - { - "same char length", - Column{ - CharacterMaximumLength: 20, - }, - Column{ - CharacterMaximumLength: 20, - }, - false, - }, - { - "reduced char length", - Column{ - CharacterMaximumLength: 20, - }, - Column{ - CharacterMaximumLength: 19, - }, - false, - }, - { - "increased char length", - Column{ - CharacterMaximumLength: 20, - }, - Column{ - CharacterMaximumLength: 21, - }, - true, - }, - { - "expand temporal", - Column{ - DataType: "time", - }, - Column{ - DataType: "timestamp", - }, - true, - }, - { - "expand temporal", - Column{ - DataType: "date", - }, - Column{ - DataType: "timestamp", - }, - true, - }, - { - "expand temporal", - Column{ - DataType: "date", - }, - Column{ - DataType: "datetime", - }, - true, - }, - { - "non expand temporal", - Column{ - DataType: "datetime", - }, - Column{ - DataType: "timestamp", - }, - false, - }, - { - "expand temporal", - Column{ - DataType: "timestamp", - }, - Column{ - DataType: "datetime", - }, - true, - }, - { - "expand enum", - Column{ - Type: EnumColumnType, - EnumValues: "'a','b'", - }, - Column{ - Type: EnumColumnType, - EnumValues: "'a','x'", - }, - true, - }, - { - "expand enum", - Column{ - Type: EnumColumnType, - EnumValues: "'a','b'", - }, - Column{ - Type: EnumColumnType, - EnumValues: "'a','b','c'", - }, - true, - }, - { - "reduce enum", - Column{ - Type: EnumColumnType, - EnumValues: "'a','b','c'", - }, - Column{ - Type: EnumColumnType, - EnumValues: "'a','b'", - }, - false, - }, - } - - expectedExpandedColumnNames := []string{"c3"} - expandedColumnNames, _ := GetExpandedColumnNames(columnsA, columnsB) - assert.Equal(t, expectedExpandedColumnNames, expandedColumnNames) - - for _, tcase := range tcases { - t.Run(tcase.name, func(t *testing.T) { - expanded, _ := isExpandedColumn(&tcase.sourceCol, &tcase.targetCol) - assert.Equal(t, tcase.expanded, expanded) - }) - } -} diff --git a/go/vt/vttablet/onlineddl/vrepl/foreign_key.go b/go/vt/vttablet/onlineddl/vrepl/foreign_key.go deleted file mode 100644 index 006beb7345c..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/foreign_key.go +++ /dev/null @@ -1,58 +0,0 @@ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "vitess.io/vitess/go/vt/schemadiff" - "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/vtenv" -) - -// RemovedForeignKeyNames returns the names of removed foreign keys, ignoring mere name changes -func RemovedForeignKeyNames( - venv *vtenv.Environment, - originalCreateTable *sqlparser.CreateTable, - vreplCreateTable *sqlparser.CreateTable, -) (names []string, err error) { - if originalCreateTable == nil || vreplCreateTable == nil { - return nil, nil - } - env := schemadiff.NewEnv(venv, venv.CollationEnv().DefaultConnectionCharset()) - diffHints := schemadiff.DiffHints{ - ConstraintNamesStrategy: schemadiff.ConstraintNamesIgnoreAll, - } - diff, err := schemadiff.DiffTables(env, originalCreateTable, vreplCreateTable, &diffHints) - if err != nil { - return nil, err - } - - validateWalk := func(node sqlparser.SQLNode) (kontinue bool, err error) { - switch node := node.(type) { - case *sqlparser.DropKey: - if node.Type == sqlparser.ForeignKeyType { - names = append(names, node.Name.String()) - } - } - return true, nil - } - _ = sqlparser.Walk(validateWalk, diff.Statement()) // We never return an error - return names, nil -} diff --git a/go/vt/vttablet/onlineddl/vrepl/foreign_key_test.go b/go/vt/vttablet/onlineddl/vrepl/foreign_key_test.go deleted file mode 100644 index 66775092dcb..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/foreign_key_test.go +++ /dev/null @@ -1,91 +0,0 @@ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/vtenv" -) - -func TestRemovedForeignKeyNames(t *testing.T) { - - tcases := []struct { - before string - after string - names []string - }{ - { - before: "create table t (id int primary key)", - after: "create table t (id2 int primary key, i int)", - }, - { - before: "create table t (id int primary key)", - after: "create table t2 (id2 int primary key, i int)", - }, - { - before: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", - after: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", - }, - { - before: "create table t (id int primary key, i int, constraint f1 foreign key (i) references parent (id) on delete cascade)", - after: "create table t (id int primary key, i int, constraint f2 foreign key (i) references parent (id) on delete cascade)", - }, - { - before: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", - after: "create table t (id int primary key, i int)", - names: []string{"f"}, - }, - { - before: "create table t (id int primary key, i int, i2 int, constraint f1 foreign key (i) references parent (id) on delete cascade, constraint fi2 foreign key (i2) references parent (id) on delete cascade)", - after: "create table t (id int primary key, i int, i2 int, constraint f2 foreign key (i) references parent (id) on delete cascade)", - names: []string{"fi2"}, - }, - { - before: "create table t1 (id int primary key, i int, constraint `check1` CHECK ((`i` < 5)))", - after: "create table t2 (id int primary key, i int)", - }, - } - for _, tcase := range tcases { - t.Run(tcase.before, func(t *testing.T) { - env := vtenv.NewTestEnv() - beforeStmt, err := env.Parser().ParseStrictDDL(tcase.before) - require.NoError(t, err) - beforeCreateTable, ok := beforeStmt.(*sqlparser.CreateTable) - require.True(t, ok) - require.NotNil(t, beforeCreateTable) - - afterStmt, err := env.Parser().ParseStrictDDL(tcase.after) - require.NoError(t, err) - afterCreateTable, ok := afterStmt.(*sqlparser.CreateTable) - require.True(t, ok) - require.NotNil(t, afterCreateTable) - - names, err := RemovedForeignKeyNames(env, beforeCreateTable, afterCreateTable) - assert.NoError(t, err) - assert.Equal(t, tcase.names, names) - }) - } -} diff --git a/go/vt/vttablet/onlineddl/vrepl/parser.go b/go/vt/vttablet/onlineddl/vrepl/parser.go deleted file mode 100644 index f76f8735016..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/parser.go +++ /dev/null @@ -1,112 +0,0 @@ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "strings" - - "vitess.io/vitess/go/vt/sqlparser" -) - -// AlterTableParser is a parser tool for ALTER TABLE statements -// This is imported from gh-ost. In the future, we should replace that with Vitess parsing. -type AlterTableParser struct { - columnRenameMap map[string]string - droppedColumns map[string]bool - isRenameTable bool - isAutoIncrementDefined bool -} - -// NewAlterTableParser creates a new parser -func NewAlterTableParser() *AlterTableParser { - return &AlterTableParser{ - columnRenameMap: make(map[string]string), - droppedColumns: make(map[string]bool), - } -} - -// NewParserFromAlterStatement creates a new parser with a ALTER TABLE statement -func NewParserFromAlterStatement(alterTable *sqlparser.AlterTable) *AlterTableParser { - parser := NewAlterTableParser() - parser.AnalyzeAlter(alterTable) - return parser -} - -// AnalyzeAlter looks for specific changes in the AlterTable statement, that are relevant -// to OnlineDDL/VReplication -func (p *AlterTableParser) AnalyzeAlter(alterTable *sqlparser.AlterTable) { - for _, opt := range alterTable.AlterOptions { - switch opt := opt.(type) { - case *sqlparser.RenameTableName: - p.isRenameTable = true - case *sqlparser.DropColumn: - p.droppedColumns[opt.Name.Name.String()] = true - case *sqlparser.ChangeColumn: - if opt.OldColumn != nil && opt.NewColDefinition != nil { - oldName := opt.OldColumn.Name.String() - newName := opt.NewColDefinition.Name.String() - p.columnRenameMap[oldName] = newName - } - case sqlparser.TableOptions: - for _, tableOption := range opt { - if strings.ToUpper(tableOption.Name) == "AUTO_INCREMENT" { - p.isAutoIncrementDefined = true - } - } - } - } -} - -// GetNonTrivialRenames gets a list of renamed column -func (p *AlterTableParser) GetNonTrivialRenames() map[string]string { - result := make(map[string]string) - for column, renamed := range p.columnRenameMap { - if column != renamed { - result[column] = renamed - } - } - return result -} - -// HasNonTrivialRenames is true when columns have been renamed -func (p *AlterTableParser) HasNonTrivialRenames() bool { - return len(p.GetNonTrivialRenames()) > 0 -} - -// DroppedColumnsMap returns list of dropped columns -func (p *AlterTableParser) DroppedColumnsMap() map[string]bool { - return p.droppedColumns -} - -// IsRenameTable returns true when the ALTER TABLE statement includes renaming the table -func (p *AlterTableParser) IsRenameTable() bool { - return p.isRenameTable -} - -// IsAutoIncrementDefined returns true when alter options include an explicit AUTO_INCREMENT value -func (p *AlterTableParser) IsAutoIncrementDefined() bool { - return p.isAutoIncrementDefined -} - -// ColumnRenameMap returns the renamed column mapping -func (p *AlterTableParser) ColumnRenameMap() map[string]string { - return p.columnRenameMap -} diff --git a/go/vt/vttablet/onlineddl/vrepl/parser_test.go b/go/vt/vttablet/onlineddl/vrepl/parser_test.go deleted file mode 100644 index 93e2ef25a15..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/parser_test.go +++ /dev/null @@ -1,190 +0,0 @@ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "vitess.io/vitess/go/vt/sqlparser" -) - -func alterTableStatement(t *testing.T, sql string) *sqlparser.AlterTable { - stmt, err := sqlparser.NewTestParser().ParseStrictDDL(sql) - require.NoError(t, err) - alter, ok := stmt.(*sqlparser.AlterTable) - require.True(t, ok) - return alter -} - -func TestParseAlterStatement(t *testing.T) { - statement := "alter table t add column t int, engine=innodb" - alterStatement := alterTableStatement(t, statement) - parser := NewAlterTableParser() - parser.AnalyzeAlter(alterStatement) - assert.False(t, parser.HasNonTrivialRenames()) - assert.False(t, parser.IsAutoIncrementDefined()) -} - -func TestParseAlterStatementTrivialRename(t *testing.T) { - statement := "alter table t add column t int, change ts ts timestamp, engine=innodb" - alterStatement := alterTableStatement(t, statement) - parser := NewAlterTableParser() - parser.AnalyzeAlter(alterStatement) - assert.False(t, parser.HasNonTrivialRenames()) - assert.False(t, parser.IsAutoIncrementDefined()) - assert.Equal(t, len(parser.columnRenameMap), 1) - assert.Equal(t, parser.columnRenameMap["ts"], "ts") -} - -func TestParseAlterStatementWithAutoIncrement(t *testing.T) { - - statements := []string{ - "auto_increment=7", - "auto_increment = 7", - "AUTO_INCREMENT = 71", - "AUTO_INCREMENT 23", - "AUTO_INCREMENT 23", - "add column t int, change ts ts timestamp, auto_increment=7 engine=innodb", - "add column t int, change ts ts timestamp, auto_increment =7 engine=innodb", - "add column t int, change ts ts timestamp, AUTO_INCREMENT = 7 engine=innodb", - "add column t int, change ts ts timestamp, engine=innodb auto_increment=73425", - "add column t int, change ts ts timestamp, engine=innodb, auto_increment=73425", - "add column t int, change ts ts timestamp, engine=innodb, auto_increment 73425", - "add column t int, change ts ts timestamp, engine innodb, auto_increment 73425", - "add column t int, change ts ts timestamp, engine innodb auto_increment 73425", - } - for _, statement := range statements { - parser := NewAlterTableParser() - statement := "alter table t " + statement - alterStatement := alterTableStatement(t, statement) - parser.AnalyzeAlter(alterStatement) - assert.True(t, parser.IsAutoIncrementDefined()) - } -} - -func TestParseAlterStatementTrivialRenames(t *testing.T) { - statement := "alter table t add column t int, change ts ts timestamp, CHANGE f `f` float, engine=innodb" - alterStatement := alterTableStatement(t, statement) - parser := NewAlterTableParser() - parser.AnalyzeAlter(alterStatement) - assert.False(t, parser.HasNonTrivialRenames()) - assert.False(t, parser.IsAutoIncrementDefined()) - assert.Equal(t, len(parser.columnRenameMap), 2) - assert.Equal(t, parser.columnRenameMap["ts"], "ts") - assert.Equal(t, parser.columnRenameMap["f"], "f") -} - -func TestParseAlterStatementNonTrivial(t *testing.T) { - statements := []string{ - `add column b bigint, change f fl float, change i count int, engine=innodb`, - "add column b bigint, change column `f` fl float, change `i` `count` int, engine=innodb", - "add column b bigint, change column `f` fl float, change `i` `count` int, change ts ts timestamp, engine=innodb", - `change - f fl float, - CHANGE COLUMN i - count int, engine=innodb`, - } - - for _, statement := range statements { - statement := "alter table t " + statement - alterStatement := alterTableStatement(t, statement) - parser := NewAlterTableParser() - parser.AnalyzeAlter(alterStatement) - assert.False(t, parser.IsAutoIncrementDefined()) - renames := parser.GetNonTrivialRenames() - assert.Equal(t, len(renames), 2) - assert.Equal(t, renames["i"], "count") - assert.Equal(t, renames["f"], "fl") - } -} - -func TestParseAlterStatementDroppedColumns(t *testing.T) { - - { - parser := NewAlterTableParser() - statement := "alter table t drop column b" - alterStatement := alterTableStatement(t, statement) - parser.AnalyzeAlter(alterStatement) - assert.Equal(t, len(parser.droppedColumns), 1) - assert.True(t, parser.droppedColumns["b"]) - } - { - parser := NewAlterTableParser() - statement := "alter table t drop column b, drop key c_idx, drop column `d`" - alterStatement := alterTableStatement(t, statement) - parser.AnalyzeAlter(alterStatement) - assert.Equal(t, len(parser.droppedColumns), 2) - assert.True(t, parser.droppedColumns["b"]) - assert.True(t, parser.droppedColumns["d"]) - } - { - parser := NewAlterTableParser() - statement := "alter table t drop column b, drop key c_idx, drop column `d`, drop `e`, drop primary key, drop foreign key fk_1" - alterStatement := alterTableStatement(t, statement) - parser.AnalyzeAlter(alterStatement) - assert.Equal(t, len(parser.droppedColumns), 3) - assert.True(t, parser.droppedColumns["b"]) - assert.True(t, parser.droppedColumns["d"]) - assert.True(t, parser.droppedColumns["e"]) - } -} - -func TestParseAlterStatementRenameTable(t *testing.T) { - tt := []struct { - alter string - isRename bool - }{ - { - alter: "alter table t drop column b", - }, - { - alter: "alter table t rename as something_else", - isRename: true, - }, - { - alter: "alter table t rename to something_else", - isRename: true, - }, - { - alter: "alter table t drop column b, rename as something_else", - isRename: true, - }, - { - alter: "alter table t engine=innodb, rename as something_else", - isRename: true, - }, - { - alter: "alter table t rename as something_else, engine=innodb", - isRename: true, - }, - } - for _, tc := range tt { - t.Run(tc.alter, func(t *testing.T) { - parser := NewAlterTableParser() - alterStatement := alterTableStatement(t, tc.alter) - parser.AnalyzeAlter(alterStatement) - assert.Equal(t, tc.isRename, parser.isRenameTable) - }) - } -} diff --git a/go/vt/vttablet/onlineddl/vrepl/types.go b/go/vt/vttablet/onlineddl/vrepl/types.go deleted file mode 100644 index 0ca834ffdf0..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/types.go +++ /dev/null @@ -1,293 +0,0 @@ -/* - Original copyright by GitHub as follows. Additions by the Vitess authors as follows. -*/ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "fmt" - "reflect" - "strings" - - "vitess.io/vitess/go/vt/schemadiff" -) - -// ColumnType indicated some MySQL data types -type ColumnType int - -const ( - UnknownColumnType ColumnType = iota - TimestampColumnType - DateTimeColumnType - EnumColumnType - SetColumnType - MediumIntColumnType - JSONColumnType - FloatColumnType - DoubleColumnType - BinaryColumnType - StringColumnType - IntegerColumnType -) - -// Column represents a table column -type Column struct { - Name string - IsUnsigned bool - Charset string - Collation string - Type ColumnType - EnumValues string - EnumToTextConversion bool - DataType string // from COLUMN_TYPE column - - IsNullable bool - IsDefaultNull bool - - CharacterMaximumLength int64 - NumericPrecision int64 - NumericScale int64 - DateTimePrecision int64 - - // add Octet length for binary type, fix bytes with suffix "00" get clipped in mysql binlog. - // https://github.com/github/gh-ost/issues/909 - BinaryOctetLength uint64 -} - -// SetTypeIfUnknown will set a new column type only if the current type is unknown, otherwise silently skip -func (c *Column) SetTypeIfUnknown(t ColumnType) { - if c.Type == UnknownColumnType { - c.Type = t - } -} - -// HasDefault returns true if the column at all has a default value (possibly NULL) -func (c *Column) HasDefault() bool { - if c.IsDefaultNull && !c.IsNullable { - // based on INFORMATION_SCHEMA.COLUMNS, this is the indicator for a 'NOT NULL' column with no default value. - return false - } - return true -} - -// IsNumeric returns true if the column is of a numeric type -func (c *Column) IsNumeric() bool { - return c.NumericPrecision > 0 -} - -// IsIntegralType returns true if the column is some form of an integer -func (c *Column) IsIntegralType() bool { - return schemadiff.IsIntegralType(c.DataType) -} - -// IsFloatingPoint returns true if the column is of a floating point numeric type -func (c *Column) IsFloatingPoint() bool { - return c.Type == FloatColumnType || c.Type == DoubleColumnType -} - -// IsFloatingPoint returns true if the column is of a temporal type -func (c *Column) IsTemporal() bool { - return c.DateTimePrecision >= 0 -} - -// NewColumns creates a new column array from non empty names -func NewColumns(names []string) []Column { - result := []Column{} - for _, name := range names { - if name == "" { - continue - } - result = append(result, Column{Name: name}) - } - return result -} - -// ParseColumns creates a new column array fby parsing comma delimited names list -func ParseColumns(names string) []Column { - namesArray := strings.Split(names, ",") - return NewColumns(namesArray) -} - -// ColumnsMap maps a column name onto its ordinal position -type ColumnsMap map[string]int - -// NewEmptyColumnsMap creates an empty map -func NewEmptyColumnsMap() ColumnsMap { - columnsMap := make(map[string]int) - return ColumnsMap(columnsMap) -} - -// NewColumnsMap creates a column map based on ordered list of columns -func NewColumnsMap(orderedColumns []Column) ColumnsMap { - columnsMap := NewEmptyColumnsMap() - for i, column := range orderedColumns { - columnsMap[column.Name] = i - } - return columnsMap -} - -// ColumnList makes for a named list of columns -type ColumnList struct { - columns []Column - Ordinals ColumnsMap -} - -// NewColumnList creates an object given ordered list of column names -func NewColumnList(names []string) *ColumnList { - result := &ColumnList{ - columns: NewColumns(names), - } - result.Ordinals = NewColumnsMap(result.columns) - return result -} - -// ParseColumnList parses a comma delimited list of column names -func ParseColumnList(names string) *ColumnList { - result := &ColumnList{ - columns: ParseColumns(names), - } - result.Ordinals = NewColumnsMap(result.columns) - return result -} - -// Columns returns the list of columns -func (l *ColumnList) Columns() []Column { - return l.columns -} - -// Names returns list of column names -func (l *ColumnList) Names() []string { - names := make([]string, len(l.columns)) - for i := range l.columns { - names[i] = l.columns[i].Name - } - return names -} - -// GetColumn gets a column by name -func (l *ColumnList) GetColumn(columnName string) *Column { - if ordinal, ok := l.Ordinals[columnName]; ok { - return &l.columns[ordinal] - } - return nil -} - -// ColumnExists returns true if this column list has a column by a given name -func (l *ColumnList) ColumnExists(columnName string) bool { - _, ok := l.Ordinals[columnName] - return ok -} - -// String returns a comma separated list of column names -func (l *ColumnList) String() string { - return strings.Join(l.Names(), ",") -} - -// Equals checks for complete (deep) identities of columns, in order. -func (l *ColumnList) Equals(other *ColumnList) bool { - return reflect.DeepEqual(l.Columns, other.Columns) -} - -// EqualsByNames checks if the names in this list equals the names of another list, in order. Type is ignored. -func (l *ColumnList) EqualsByNames(other *ColumnList) bool { - return reflect.DeepEqual(l.Names(), other.Names()) -} - -// IsSubsetOf returns 'true' when column names of this list are a subset of -// another list, in arbitrary order (order agnostic) -func (l *ColumnList) IsSubsetOf(other *ColumnList) bool { - for _, column := range l.columns { - if _, exists := other.Ordinals[column.Name]; !exists { - return false - } - } - return true -} - -// Difference returns a (new copy) subset of this column list, consisting of all -// column NOT in given list. -// The result is never nil, even if the difference is empty -func (l *ColumnList) Difference(other *ColumnList) (diff *ColumnList) { - names := []string{} - for _, column := range l.columns { - if !other.ColumnExists(column.Name) { - names = append(names, column.Name) - } - } - return NewColumnList(names) -} - -// Len returns the length of this list -func (l *ColumnList) Len() int { - return len(l.columns) -} - -// MappedNamesColumnList returns a column list based on this list, with names possibly mapped by given map -func (l *ColumnList) MappedNamesColumnList(columnNamesMap map[string]string) *ColumnList { - names := l.Names() - for i := range names { - if mappedName, ok := columnNamesMap[names[i]]; ok { - names[i] = mappedName - } - } - return NewColumnList(names) -} - -// SetEnumToTextConversion tells this column list that an enum is converted to text -func (l *ColumnList) SetEnumToTextConversion(columnName string, enumValues string) { - l.GetColumn(columnName).EnumToTextConversion = true - l.GetColumn(columnName).EnumValues = enumValues -} - -// IsEnumToTextConversion tells whether an enum was converted to text -func (l *ColumnList) IsEnumToTextConversion(columnName string) bool { - return l.GetColumn(columnName).EnumToTextConversion -} - -// UniqueKey is the combination of a key's name and columns -type UniqueKey struct { - Name string - Columns ColumnList - HasNullable bool - HasSubpart bool - HasFloat bool - IsAutoIncrement bool -} - -// IsPrimary checks if this unique key is primary -func (k *UniqueKey) IsPrimary() bool { - return k.Name == "PRIMARY" -} - -// Len returns the length of this list -func (k *UniqueKey) Len() int { - return k.Columns.Len() -} - -// String returns a visual representation of this key -func (k *UniqueKey) String() string { - description := k.Name - if k.IsAutoIncrement { - description = fmt.Sprintf("%s (auto_increment)", description) - } - return fmt.Sprintf("%s: %s; has nullable: %+v", description, k.Columns.Names(), k.HasNullable) -} diff --git a/go/vt/vttablet/onlineddl/vrepl/types_test.go b/go/vt/vttablet/onlineddl/vrepl/types_test.go deleted file mode 100644 index d146d286d3a..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/types_test.go +++ /dev/null @@ -1,214 +0,0 @@ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestParseColumnList(t *testing.T) { - names := "id,category,max_len" - - columnList := ParseColumnList(names) - assert.Equal(t, columnList.Len(), 3) - assert.Equal(t, columnList.Names(), []string{"id", "category", "max_len"}) - assert.Equal(t, columnList.Ordinals["id"], 0) - assert.Equal(t, columnList.Ordinals["category"], 1) - assert.Equal(t, columnList.Ordinals["max_len"], 2) -} - -func TestGetColumn(t *testing.T) { - names := "id,category,max_len" - columnList := ParseColumnList(names) - { - column := columnList.GetColumn("category") - assert.NotNil(t, column) - assert.Equal(t, column.Name, "category") - } - { - column := columnList.GetColumn("no_such_column") - assert.True(t, column == nil) - } -} - -func TestIsSubsetOf(t *testing.T) { - tt := []struct { - columns1 *ColumnList - columns2 *ColumnList - expectSubset bool - }{ - { - columns1: ParseColumnList(""), - columns2: ParseColumnList("a,b,c"), - expectSubset: true, - }, - { - columns1: ParseColumnList("a,b,c"), - columns2: ParseColumnList("a,b,c"), - expectSubset: true, - }, - { - columns1: ParseColumnList("a,c"), - columns2: ParseColumnList("a,b,c"), - expectSubset: true, - }, - { - columns1: ParseColumnList("b,c"), - columns2: ParseColumnList("a,b,c"), - expectSubset: true, - }, - { - columns1: ParseColumnList("b"), - columns2: ParseColumnList("a,b,c"), - expectSubset: true, - }, - { - columns1: ParseColumnList(""), - columns2: ParseColumnList("a,b,c"), - expectSubset: true, - }, - { - columns1: ParseColumnList("a,d"), - columns2: ParseColumnList("a,b,c"), - expectSubset: false, - }, - { - columns1: ParseColumnList("a,b,c"), - columns2: ParseColumnList("a,b"), - expectSubset: false, - }, - { - columns1: ParseColumnList("a,b,c"), - columns2: ParseColumnList(""), - expectSubset: false, - }, - } - for _, tc := range tt { - name := fmt.Sprintf("%v:%v", tc.columns1.Names(), tc.columns2.Names()) - t.Run(name, func(t *testing.T) { - isSubset := tc.columns1.IsSubsetOf(tc.columns2) - assert.Equal(t, tc.expectSubset, isSubset) - }, - ) - } -} - -func TestDifference(t *testing.T) { - tt := []struct { - columns1 *ColumnList - columns2 *ColumnList - expect *ColumnList - }{ - { - columns1: ParseColumnList(""), - columns2: ParseColumnList("a,b,c"), - expect: ParseColumnList(""), - }, - { - columns1: ParseColumnList("a,b,c"), - columns2: ParseColumnList("a,b,c"), - expect: ParseColumnList(""), - }, - { - columns1: ParseColumnList("a,c"), - columns2: ParseColumnList("a,b,c"), - expect: ParseColumnList(""), - }, - { - columns1: ParseColumnList("b,c"), - columns2: ParseColumnList("a,b,c"), - expect: ParseColumnList(""), - }, - { - columns1: ParseColumnList("b"), - columns2: ParseColumnList("a,b,c"), - expect: ParseColumnList(""), - }, - { - columns1: ParseColumnList(""), - columns2: ParseColumnList("a,b,c"), - expect: ParseColumnList(""), - }, - { - columns1: ParseColumnList("a,d"), - columns2: ParseColumnList("a,b,c"), - expect: ParseColumnList("d"), - }, - { - columns1: ParseColumnList("a,b,c"), - columns2: ParseColumnList("a,b"), - expect: ParseColumnList("c"), - }, - { - columns1: ParseColumnList("a,b,c"), - columns2: ParseColumnList(""), - expect: ParseColumnList("a,b,c"), - }, - { - columns1: ParseColumnList("a,b,c"), - columns2: ParseColumnList("b,d,e"), - expect: ParseColumnList("a,c"), - }, - } - for _, tc := range tt { - name := fmt.Sprintf("%v:%v", tc.columns1.Names(), tc.columns2.Names()) - t.Run(name, func(t *testing.T) { - diff := tc.columns1.Difference(tc.columns2) - assert.Equal(t, tc.expect, diff) - }, - ) - } -} - -func TestMappedNamesColumnList(t *testing.T) { - tt := []struct { - columns *ColumnList - namesMap map[string]string - expected *ColumnList - }{ - { - columns: ParseColumnList("a,b,c"), - namesMap: map[string]string{}, - expected: ParseColumnList("a,b,c"), - }, - { - columns: ParseColumnList("a,b,c"), - namesMap: map[string]string{"x": "y"}, - expected: ParseColumnList("a,b,c"), - }, - { - columns: ParseColumnList("a,b,c"), - namesMap: map[string]string{"a": "x", "c": "y"}, - expected: ParseColumnList("x,b,y"), - }, - } - for _, tc := range tt { - name := fmt.Sprintf("%v:%v", tc.columns.Names(), tc.namesMap) - t.Run(name, func(t *testing.T) { - mappedNames := tc.columns.MappedNamesColumnList(tc.namesMap) - assert.Equal(t, tc.expected, mappedNames) - }, - ) - } -} diff --git a/go/vt/vttablet/onlineddl/vrepl/unique_key.go b/go/vt/vttablet/onlineddl/vrepl/unique_key.go deleted file mode 100644 index cc649b4ea37..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/unique_key.go +++ /dev/null @@ -1,184 +0,0 @@ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "strings" -) - -// UniqueKeyValidForIteration returns 'false' if we should not use this unique key as the main -// iteration key in vreplication. -func UniqueKeyValidForIteration(uniqueKey *UniqueKey) bool { - if uniqueKey.HasNullable { - // NULLable columns in a unique key means the set of values is not really unique (two identical rows with NULLs are allowed). - // Thus, we cannot use this unique key for iteration. - return false - } - if uniqueKey.HasSubpart { - // vreplication does not fully support indexes on column prefixes such as: - // UNIQUE KEY `name_idx` (`name`(15)) - // "HasSubpart" means some column covered by the index has a key length spec. - return false - } - if uniqueKey.HasFloat { - // float & double data types are imprecise and we cannot use them while iterating unique keys - return false - } - return true // good to go! -} - -// GetSharedUniqueKeys returns the unique keys shared between the source & target tables -func GetSharedUniqueKeys(sourceUniqueKeys, targetUniqueKeys [](*UniqueKey), columnRenameMap map[string]string) (chosenSourceUniqueKey, chosenTargetUniqueKey *UniqueKey) { - type ukPair struct{ source, target *UniqueKey } - var sharedUKPairs []*ukPair - - for _, sourceUniqueKey := range sourceUniqueKeys { - if !UniqueKeyValidForIteration(sourceUniqueKey) { - continue - } - for _, targetUniqueKey := range targetUniqueKeys { - if !UniqueKeyValidForIteration(targetUniqueKey) { - continue - } - uniqueKeyMatches := func() bool { - // Compare two unique keys - if sourceUniqueKey.Columns.Len() != targetUniqueKey.Columns.Len() { - return false - } - // Expect same columns, same order, potentially column name mapping - sourceUniqueKeyNames := sourceUniqueKey.Columns.Names() - targetUniqueKeyNames := targetUniqueKey.Columns.Names() - for i := range sourceUniqueKeyNames { - sourceColumnName := sourceUniqueKeyNames[i] - targetColumnName := targetUniqueKeyNames[i] - mappedSourceColumnName := sourceColumnName - if mapped, ok := columnRenameMap[sourceColumnName]; ok { - mappedSourceColumnName = mapped - } - if !strings.EqualFold(mappedSourceColumnName, targetColumnName) { - return false - } - } - return true - } - if uniqueKeyMatches() { - sharedUKPairs = append(sharedUKPairs, &ukPair{source: sourceUniqueKey, target: targetUniqueKey}) - } - } - } - // Now that we know what the shared unique keys are, let's find the "best" shared one. - // Source and target unique keys can have different name, even though they cover the exact same - // columns and in same order. - for _, pair := range sharedUKPairs { - if pair.source.HasNullable { - continue - } - if pair.target.HasNullable { - continue - } - return pair.source, pair.target - } - return nil, nil -} - -// SourceUniqueKeyAsOrMoreConstrainedThanTarget returns 'true' when sourceUniqueKey is at least as constrained as targetUniqueKey. -// "More constrained" means the uniqueness constraint is "stronger". Thus, if sourceUniqueKey is as-or-more constrained than targetUniqueKey, then -// rows valid under sourceUniqueKey must also be valid in targetUniqueKey. The opposite is not necessarily so: rows that are valid in targetUniqueKey -// may cause a unique key violation under sourceUniqueKey -func SourceUniqueKeyAsOrMoreConstrainedThanTarget(sourceUniqueKey, targetUniqueKey *UniqueKey, columnRenameMap map[string]string) bool { - // Compare two unique keys - if sourceUniqueKey.Columns.Len() > targetUniqueKey.Columns.Len() { - // source can't be more constrained if it covers *more* columns - return false - } - // we know that len(sourceUniqueKeyNames) <= len(targetUniqueKeyNames) - sourceUniqueKeyNames := sourceUniqueKey.Columns.Names() - targetUniqueKeyNames := targetUniqueKey.Columns.Names() - // source is more constrained than target if every column in source is also in target, order is immaterial - for i := range sourceUniqueKeyNames { - sourceColumnName := sourceUniqueKeyNames[i] - mappedSourceColumnName := sourceColumnName - if mapped, ok := columnRenameMap[sourceColumnName]; ok { - mappedSourceColumnName = mapped - } - columnFoundInTarget := func() bool { - for _, targetColumnName := range targetUniqueKeyNames { - if strings.EqualFold(mappedSourceColumnName, targetColumnName) { - return true - } - } - return false - } - if !columnFoundInTarget() { - return false - } - } - return true -} - -// AddedUniqueKeys returns the unique key constraints added in target. This does not necessarily mean that the unique key itself is new, -// rather that there's a new, stricter constraint on a set of columns, that didn't exist before. Example: -// -// before: unique key `my_key`(c1, c2, c3); after: unique key `my_key`(c1, c2) -// The constraint on (c1, c2) is new; and `my_key` in target table ("after") is considered a new key -// -// Order of columns is immaterial to uniqueness of column combination. -func AddedUniqueKeys(sourceUniqueKeys, targetUniqueKeys [](*UniqueKey), columnRenameMap map[string]string) (addedUKs [](*UniqueKey)) { - addedUKs = [](*UniqueKey){} - for _, targetUniqueKey := range targetUniqueKeys { - foundAsOrMoreConstrainingSourceKey := func() bool { - for _, sourceUniqueKey := range sourceUniqueKeys { - if SourceUniqueKeyAsOrMoreConstrainedThanTarget(sourceUniqueKey, targetUniqueKey, columnRenameMap) { - // target key does not add a new constraint - return true - } - } - return false - } - if !foundAsOrMoreConstrainingSourceKey() { - addedUKs = append(addedUKs, targetUniqueKey) - } - } - return addedUKs -} - -// RemovedUniqueKeys returns the list of unique key constraints _removed_ going from source to target. -func RemovedUniqueKeys(sourceUniqueKeys, targetUniqueKeys [](*UniqueKey), columnRenameMap map[string]string) (removedUKs [](*UniqueKey)) { - reverseColumnRenameMap := map[string]string{} - for k, v := range columnRenameMap { - reverseColumnRenameMap[v] = k - } - return AddedUniqueKeys(targetUniqueKeys, sourceUniqueKeys, reverseColumnRenameMap) -} - -// GetUniqueKeyCoveredByColumns returns the first unique key from given list, whose columns all appear -// in given column list. -func GetUniqueKeyCoveredByColumns(uniqueKeys [](*UniqueKey), columns *ColumnList) (chosenUniqueKey *UniqueKey) { - for _, uniqueKey := range uniqueKeys { - if !UniqueKeyValidForIteration(uniqueKey) { - continue - } - if uniqueKey.Columns.IsSubsetOf(columns) { - return uniqueKey - } - } - return nil -} diff --git a/go/vt/vttablet/onlineddl/vrepl/unique_key_test.go b/go/vt/vttablet/onlineddl/vrepl/unique_key_test.go deleted file mode 100644 index 3364c55a308..00000000000 --- a/go/vt/vttablet/onlineddl/vrepl/unique_key_test.go +++ /dev/null @@ -1,666 +0,0 @@ -/* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE -*/ -/* -Copyright 2021 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 vrepl - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -var ( - columns1 = ParseColumnList("c1") - columns12 = ParseColumnList("c1,c2") - columns123 = ParseColumnList("c1,c2,c3") - columns2 = ParseColumnList("c2") - columns21 = ParseColumnList("c2,c1") - columns12A = ParseColumnList("c1,c2,ca") -) - -func TestGetSharedUniqueKeys(t *testing.T) { - tt := []struct { - name string - sourceUKs, targetUKs [](*UniqueKey) - renameMap map[string]string - expectSourceUK, expectTargetUK *UniqueKey - }{ - { - name: "empty", - sourceUKs: []*UniqueKey{}, - targetUKs: []*UniqueKey{}, - renameMap: map[string]string{}, - expectSourceUK: nil, - expectTargetUK: nil, - }, - { - name: "half empty", - sourceUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{}, - renameMap: map[string]string{}, - expectSourceUK: nil, - expectTargetUK: nil, - }, - { - name: "single identical", - sourceUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectSourceUK: &UniqueKey{Name: "PRIMARY", Columns: *columns1}, - expectTargetUK: &UniqueKey{Name: "PRIMARY", Columns: *columns1}, - }, - { - name: "single identical non pk", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectSourceUK: &UniqueKey{Name: "uidx", Columns: *columns1}, - expectTargetUK: &UniqueKey{Name: "uidx", Columns: *columns1}, - }, - { - name: "single identical, source is nullable", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1, HasNullable: true}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectSourceUK: nil, - expectTargetUK: nil, - }, - { - name: "single identical, target is nullable", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1, HasNullable: true}, - }, - renameMap: map[string]string{}, - expectSourceUK: nil, - expectTargetUK: nil, - }, - { - name: "single no shared", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns12}, - }, - renameMap: map[string]string{}, - expectSourceUK: nil, - expectTargetUK: nil, - }, - { - name: "single no shared different order", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns12}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns21}, - }, - renameMap: map[string]string{}, - expectSourceUK: nil, - expectTargetUK: nil, - }, - { - name: "single identical, source has FLOAT", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1, HasFloat: true}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectSourceUK: nil, - expectTargetUK: nil, - }, - { - name: "exact match", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - renameMap: map[string]string{}, - expectSourceUK: &UniqueKey{Name: "uidx123", Columns: *columns123}, - expectTargetUK: &UniqueKey{Name: "uidx123", Columns: *columns123}, - }, - { - name: "exact match from multiple options", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - {Name: "uidx123", Columns: *columns123}, - {Name: "uidx12", Columns: *columns12}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - renameMap: map[string]string{}, - expectSourceUK: &UniqueKey{Name: "uidx123", Columns: *columns123}, - expectTargetUK: &UniqueKey{Name: "uidx123", Columns: *columns123}, - }, - { - name: "exact match from multiple options reorder", - sourceUKs: []*UniqueKey{ - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx", Columns: *columns1}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns21}, - {Name: "uidx123", Columns: *columns123}, - {Name: "uidx12", Columns: *columns12}, - }, - renameMap: map[string]string{}, - expectSourceUK: &UniqueKey{Name: "uidx12", Columns: *columns12}, - expectTargetUK: &UniqueKey{Name: "uidx12", Columns: *columns12}, - }, - { - name: "match different names", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx123", Columns: *columns123}, - {Name: "uidxother", Columns: *columns12}, - }, - renameMap: map[string]string{}, - expectSourceUK: &UniqueKey{Name: "uidx12", Columns: *columns12}, - expectTargetUK: &UniqueKey{Name: "uidxother", Columns: *columns12}, - }, - { - name: "match different names, nullable", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx123other", Columns: *columns123}, - {Name: "uidx12", Columns: *columns12, HasNullable: true}, - }, - renameMap: map[string]string{}, - expectSourceUK: &UniqueKey{Name: "uidx123", Columns: *columns123}, - expectTargetUK: &UniqueKey{Name: "uidx123other", Columns: *columns123}, - }, - { - name: "match different column names", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx12A", Columns: *columns12A}, - }, - renameMap: map[string]string{"c3": "ca"}, - expectSourceUK: &UniqueKey{Name: "uidx123", Columns: *columns123}, - expectTargetUK: &UniqueKey{Name: "uidx12A", Columns: *columns12A}, - }, - { - // enforce mapping from c3 to ca; will not match c3<->c3 - name: "no match identical column names", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx123", Columns: *columns123}, - }, - renameMap: map[string]string{"c3": "ca"}, - expectSourceUK: nil, - expectTargetUK: nil, - }, - { - name: "no match different column names", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx12A", Columns: *columns12A}, - }, - renameMap: map[string]string{"c3": "cx"}, - expectSourceUK: nil, - expectTargetUK: nil, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - sourceUK, targetUK := GetSharedUniqueKeys(tc.sourceUKs, tc.targetUKs, tc.renameMap) - assert.Equal(t, tc.expectSourceUK, sourceUK) - assert.Equal(t, tc.expectTargetUK, targetUK) - }) - } -} - -func TestAddedUniqueKeys(t *testing.T) { - emptyUniqueKeys := []*UniqueKey{} - tt := []struct { - name string - sourceUKs, targetUKs [](*UniqueKey) - renameMap map[string]string - expectAddedUKs [](*UniqueKey) - expectRemovedUKs [](*UniqueKey) - }{ - { - name: "empty", - sourceUKs: emptyUniqueKeys, - targetUKs: emptyUniqueKeys, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: emptyUniqueKeys, - }, - { - name: "UK removed", - sourceUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1}, - }, - targetUKs: emptyUniqueKeys, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1}, - }, - }, - { - name: "NULLable UK removed", - sourceUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1, HasNullable: true}, - }, - targetUKs: emptyUniqueKeys, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1, HasNullable: true}, - }, - }, - { - name: "UK added", - sourceUKs: emptyUniqueKeys, - targetUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectAddedUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1}, - }, - expectRemovedUKs: emptyUniqueKeys, - }, - { - name: "single identical", - sourceUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "PRIMARY", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: emptyUniqueKeys, - }, - { - name: "single identical non pk", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: emptyUniqueKeys, - }, - { - name: "single identical, source is nullable", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1, HasNullable: true}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: emptyUniqueKeys, - }, - { - name: "single identical, target is nullable", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1, HasNullable: true}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: emptyUniqueKeys, - }, - { - name: "expand columns: not considered added", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns12}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - }, - { - name: "expand columns, different order: not considered added", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns21}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - }, - { - name: "reduced columns: considered added", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns12}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectAddedUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - expectRemovedUKs: emptyUniqueKeys, - }, - { - name: "reduced columns, multiple: considered added", - sourceUKs: []*UniqueKey{ - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - {Name: "uidx2", Columns: *columns2}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - renameMap: map[string]string{}, - expectAddedUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx2", Columns: *columns2}, - }, - }, - { - name: "different order: not considered added", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns12}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns21}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: emptyUniqueKeys, - }, - { - name: "no match, different columns", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx2", Columns: *columns2}, - }, - renameMap: map[string]string{}, - expectAddedUKs: []*UniqueKey{ - {Name: "uidx2", Columns: *columns2}, - }, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - }, - }, - { - name: "one match, one expand", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - }, - { - name: "exact match from multiple options", - sourceUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - {Name: "uidx123", Columns: *columns123}, - {Name: "uidx12", Columns: *columns12}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - }, - { - name: "exact match from multiple options reorder", - sourceUKs: []*UniqueKey{ - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx", Columns: *columns1}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns21}, - {Name: "uidx123", Columns: *columns123}, - {Name: "uidx12", Columns: *columns12}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx", Columns: *columns1}, - }, - }, - { - name: "match different names", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx123", Columns: *columns123}, - {Name: "uidxother", Columns: *columns12}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - }, - }, - { - name: "match different names, nullable", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx123other", Columns: *columns123}, - {Name: "uidx12", Columns: *columns12, HasNullable: true}, - }, - renameMap: map[string]string{}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - }, - }, - { - name: "match different column names, expand", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx12A", Columns: *columns12A}, - }, - renameMap: map[string]string{"c3": "ca"}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - }, - }, - { - name: "match different column names, no expand", - sourceUKs: []*UniqueKey{ - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx12A", Columns: *columns12A}, - }, - renameMap: map[string]string{"c3": "ca"}, - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: emptyUniqueKeys, - }, - { - // enforce mapping from c3 to ca; will not match c3<->c3 - name: "no match identical column names, expand", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx123", Columns: *columns123}, - }, - renameMap: map[string]string{"c3": "ca"}, - // 123 expands 12, so even though 3 is mapped to A, 123 is still not more constrained. - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - }, - }, - { - // enforce mapping from c3 to ca; will not match c3<->c3 - name: "no match identical column names, no expand", - sourceUKs: []*UniqueKey{ - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx123", Columns: *columns123}, - }, - renameMap: map[string]string{"c3": "ca"}, - expectAddedUKs: []*UniqueKey{ - {Name: "uidx123", Columns: *columns123}, - }, - expectRemovedUKs: emptyUniqueKeys, - }, - { - name: "no match for different column names, expand", - sourceUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - {Name: "uidx12", Columns: *columns12}, - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx21", Columns: *columns21}, - {Name: "uidx12A", Columns: *columns12A}, - }, - renameMap: map[string]string{"c3": "cx"}, - // 123 expands 12, so even though 3 is mapped to x, 123 is still not more constrained. - expectAddedUKs: emptyUniqueKeys, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx1", Columns: *columns1}, - }, - }, - { - name: "no match for different column names, no expand", - sourceUKs: []*UniqueKey{ - {Name: "uidx123", Columns: *columns123}, - }, - targetUKs: []*UniqueKey{ - {Name: "uidx12A", Columns: *columns12A}, - }, - renameMap: map[string]string{"c3": "cx"}, - expectAddedUKs: []*UniqueKey{ - {Name: "uidx12A", Columns: *columns12A}, - }, - expectRemovedUKs: []*UniqueKey{ - {Name: "uidx123", Columns: *columns123}, - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - addedUKs := AddedUniqueKeys(tc.sourceUKs, tc.targetUKs, tc.renameMap) - assert.Equal(t, tc.expectAddedUKs, addedUKs) - removedUKs := RemovedUniqueKeys(tc.sourceUKs, tc.targetUKs, tc.renameMap) - assert.Equal(t, tc.expectRemovedUKs, removedUKs) - }) - } -} diff --git a/go/vt/vttablet/onlineddl/vrepl_test.go b/go/vt/vttablet/onlineddl/vrepl_test.go index ddb723ed7b7..b9875c3f6d2 100644 --- a/go/vt/vttablet/onlineddl/vrepl_test.go +++ b/go/vt/vttablet/onlineddl/vrepl_test.go @@ -1,6 +1,238 @@ /* - Copyright 2016 GitHub Inc. - See https://github.com/github/gh-ost/blob/master/LICENSE +Copyright 2024 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 onlineddl + +import ( + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/schemadiff" + "vitess.io/vitess/go/vt/vtenv" +) + +func TestRevertible(t *testing.T) { + + type revertibleTestCase struct { + name string + fromSchema string + toSchema string + // expectProblems bool + removedForeignKeyNames string + removedUniqueKeyNames string + droppedNoDefaultColumnNames string + expandedColumnNames string + } + + var testCases = []revertibleTestCase{ + { + name: "identical schemas", + fromSchema: `id int primary key, i1 int not null default 0`, + toSchema: `id int primary key, i2 int not null default 0`, + }, + { + name: "different schemas, nothing to note", + fromSchema: `id int primary key, i1 int not null default 0, unique key i1_uidx(i1)`, + toSchema: `id int primary key, i1 int not null default 0, i2 int not null default 0, unique key i1_uidx(i1)`, + }, + { + name: "removed non-nullable unique key", + fromSchema: `id int primary key, i1 int not null default 0, unique key i1_uidx(i1)`, + toSchema: `id int primary key, i2 int not null default 0`, + removedUniqueKeyNames: `i1_uidx`, + }, + { + name: "removed nullable unique key", + fromSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1)`, + toSchema: `id int primary key, i2 int default null`, + removedUniqueKeyNames: `i1_uidx`, + }, + { + name: "expanding unique key removes unique constraint", + fromSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1)`, + toSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1, id)`, + removedUniqueKeyNames: `i1_uidx`, + }, + { + name: "expanding unique key prefix removes unique constraint", + fromSchema: `id int primary key, v varchar(100) default null, unique key v_uidx(v(20))`, + toSchema: `id int primary key, v varchar(100) default null, unique key v_uidx(v(21))`, + removedUniqueKeyNames: `v_uidx`, + }, + { + name: "reducing unique key does not remove unique constraint", + fromSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1, id)`, + toSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1)`, + removedUniqueKeyNames: ``, + }, + { + name: "reducing unique key does not remove unique constraint", + fromSchema: `id int primary key, v varchar(100) default null, unique key v_uidx(v(21))`, + toSchema: `id int primary key, v varchar(100) default null, unique key v_uidx(v(20))`, + }, + { + name: "removed foreign key", + fromSchema: "id int primary key, i int, constraint some_fk_1 foreign key (i) references parent (id) on delete cascade", + toSchema: "id int primary key, i int", + removedForeignKeyNames: "some_fk_1", + }, + + { + name: "renamed foreign key", + fromSchema: "id int primary key, i int, constraint f1 foreign key (i) references parent (id) on delete cascade", + toSchema: "id int primary key, i int, constraint f2 foreign key (i) references parent (id) on delete cascade", + }, + { + name: "remove column without default", + fromSchema: `id int primary key, i1 int not null, i2 int not null default 0, i3 int default null`, + toSchema: `id int primary key, i4 int not null default 0`, + droppedNoDefaultColumnNames: `i1`, + }, + { + name: "expanded: nullable", + fromSchema: `id int primary key, i1 int not null, i2 int default null`, + toSchema: `id int primary key, i1 int default null, i2 int not null`, + expandedColumnNames: `i1`, + }, + { + name: "expanded: longer text", + fromSchema: `id int primary key, i1 int default null, v1 varchar(40) not null, v2 varchar(5), v3 varchar(3)`, + toSchema: `id int primary key, i1 int not null, v1 varchar(100) not null, v2 char(3), v3 char(5)`, + expandedColumnNames: `v1,v3`, + }, + { + name: "expanded: int numeric precision and scale", + fromSchema: `id int primary key, i1 int, i2 tinyint, i3 mediumint, i4 bigint`, + toSchema: `id int primary key, i1 int, i2 mediumint, i3 int, i4 tinyint`, + expandedColumnNames: `i2,i3`, + }, + { + name: "expanded: floating point", + fromSchema: `id int primary key, i1 int, n2 bigint, n3 bigint, n4 float, n5 double`, + toSchema: `id int primary key, i1 int, n2 float, n3 double, n4 double, n5 float`, + expandedColumnNames: `n2,n3,n4`, + }, + { + name: "expanded: decimal numeric precision and scale", + fromSchema: `id int primary key, i1 int, d1 decimal(10,2), d2 decimal (10,2), d3 decimal (10,2)`, + toSchema: `id int primary key, i1 int, d1 decimal(11,2), d2 decimal (9,1), d3 decimal (10,3)`, + expandedColumnNames: `d1,d3`, + }, + { + name: "expanded: signed, unsigned", + fromSchema: `id int primary key, i1 bigint signed, i2 int unsigned, i3 bigint unsigned`, + toSchema: `id int primary key, i1 int signed, i2 int signed, i3 int signed`, + expandedColumnNames: `i2,i3`, + }, + { + name: "expanded: signed, unsigned: range", + fromSchema: `id int primary key, i1 int signed, i2 bigint signed, i3 int signed`, + toSchema: `id int primary key, i1 int unsigned, i2 int unsigned, i3 bigint unsigned`, + expandedColumnNames: `i1,i3`, + }, + { + name: "expanded: datetime precision", + fromSchema: `id int primary key, dt1 datetime, ts1 timestamp, ti1 time, dt2 datetime(3), dt3 datetime(6), ts2 timestamp(3)`, + toSchema: `id int primary key, dt1 datetime(3), ts1 timestamp(6), ti1 time(3), dt2 datetime(6), dt3 datetime(3), ts2 timestamp`, + expandedColumnNames: `dt1,ts1,ti1,dt2`, + }, + { + name: "expanded: strange data type changes", + fromSchema: `id int primary key, dt1 datetime, ts1 timestamp, i1 int, d1 date, e1 enum('a', 'b')`, + toSchema: `id int primary key, dt1 char(32), ts1 varchar(32), i1 tinytext, d1 char(2), e1 varchar(2)`, + expandedColumnNames: `dt1,ts1,i1,d1,e1`, + }, + { + name: "expanded: temporal types", + fromSchema: `id int primary key, t1 time, t2 timestamp, t3 date, t4 datetime, t5 time, t6 date`, + toSchema: `id int primary key, t1 datetime, t2 datetime, t3 timestamp, t4 timestamp, t5 timestamp, t6 datetime`, + expandedColumnNames: `t1,t2,t3,t5,t6`, + }, + { + name: "expanded: character sets", + fromSchema: `id int primary key, c1 char(3) charset utf8, c2 char(3) charset utf8mb4, c3 char(3) charset ascii, c4 char(3) charset utf8mb4, c5 char(3) charset utf8, c6 char(3) charset latin1`, + toSchema: `id int primary key, c1 char(3) charset utf8mb4, c2 char(3) charset utf8, c3 char(3) charset utf8, c4 char(3) charset ascii, c5 char(3) charset utf8, c6 char(3) charset utf8mb4`, + expandedColumnNames: `c1,c3,c6`, + }, + { + name: "expanded: enum", + fromSchema: `id int primary key, e1 enum('a', 'b'), e2 enum('a', 'b'), e3 enum('a', 'b'), e4 enum('a', 'b'), e5 enum('a', 'b'), e6 enum('a', 'b'), e7 enum('a', 'b'), e8 enum('a', 'b')`, + toSchema: `id int primary key, e1 enum('a', 'b'), e2 enum('a'), e3 enum('a', 'b', 'c'), e4 enum('a', 'x'), e5 enum('a', 'x', 'b'), e6 enum('b'), e7 varchar(1), e8 tinyint`, + expandedColumnNames: `e3,e4,e5,e6,e7,e8`, + }, + { + name: "expanded: set", + fromSchema: `id int primary key, e1 set('a', 'b'), e2 set('a', 'b'), e3 set('a', 'b'), e4 set('a', 'b'), e5 set('a', 'b'), e6 set('a', 'b'), e7 set('a', 'b'), e8 set('a', 'b')`, + toSchema: `id int primary key, e1 set('a', 'b'), e2 set('a'), e3 set('a', 'b', 'c'), e4 set('a', 'x'), e5 set('a', 'x', 'b'), e6 set('b'), e7 varchar(1), e8 tinyint`, + expandedColumnNames: `e3,e4,e5,e6,e7,e8`, + }, + } + + var ( + createTableWrapper = `CREATE TABLE t (%s)` + ) + + senv := schemadiff.NewTestEnv() + venv := vtenv.NewTestEnv() + diffHints := &schemadiff.DiffHints{} + for _, tcase := range testCases { + t.Run(tcase.name, func(t *testing.T) { + tcase.fromSchema = fmt.Sprintf(createTableWrapper, tcase.fromSchema) + sourceTableEntity, err := schemadiff.NewCreateTableEntityFromSQL(senv, tcase.fromSchema) + require.NoError(t, err) + + tcase.toSchema = fmt.Sprintf(createTableWrapper, tcase.toSchema) + targetTableEntity, err := schemadiff.NewCreateTableEntityFromSQL(senv, tcase.toSchema) + require.NoError(t, err) + + diff, err := sourceTableEntity.TableDiff(targetTableEntity, diffHints) + require.NoError(t, err) + + v, err := NewVRepl( + venv, + "7cee19dd_354b_11eb_82cd_f875a4d24e90", + "ks", + "0", + "mydb", + sourceTableEntity.CreateTable, + targetTableEntity.CreateTable, + diff.AlterTable(), + false, + ) + require.NoError(t, err) + + err = v.analyzeAlter() + require.NoError(t, err) + err = v.analyzeTables() + require.NoError(t, err) + + toStringSlice := func(s string) []string { + if s == "" { + return []string{} + } + return strings.Split(s, ",") + } + assert.Equal(t, toStringSlice(tcase.removedForeignKeyNames), v.analysis.RemovedForeignKeyNames) + assert.Equal(t, toStringSlice(tcase.removedUniqueKeyNames), v.analysis.RemovedUniqueKeys.Names()) + assert.Equal(t, toStringSlice(tcase.droppedNoDefaultColumnNames), v.analysis.DroppedNoDefaultColumns.Names()) + assert.Equal(t, toStringSlice(tcase.expandedColumnNames), v.analysis.ExpandedColumns.Names()) + }) + } +} diff --git a/go/vt/vttablet/queryservice/queryservice.go b/go/vt/vttablet/queryservice/queryservice.go index 10cf48fd8b1..1e48c9b7b1d 100644 --- a/go/vt/vttablet/queryservice/queryservice.go +++ b/go/vt/vttablet/queryservice/queryservice.go @@ -77,7 +77,7 @@ type QueryService interface { ReadTransaction(ctx context.Context, target *querypb.Target, dtid string) (metadata *querypb.TransactionMetadata, err error) // UnresolvedTransactions returns the list of unresolved distributed transactions. - UnresolvedTransactions(ctx context.Context, target *querypb.Target) ([]*querypb.TransactionMetadata, error) + UnresolvedTransactions(ctx context.Context, target *querypb.Target, abandonAgeSeconds int64) ([]*querypb.TransactionMetadata, error) // Execute for query execution Execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, error) diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index d24bd051c4a..2bc8346dac2 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -176,10 +176,10 @@ func (ws *wrappedService) ReadTransaction(ctx context.Context, target *querypb.T return metadata, err } -func (ws *wrappedService) UnresolvedTransactions(ctx context.Context, target *querypb.Target) (transactions []*querypb.TransactionMetadata, err error) { +func (ws *wrappedService) UnresolvedTransactions(ctx context.Context, target *querypb.Target, abandonAgeSeconds int64) (transactions []*querypb.TransactionMetadata, err error) { err = ws.wrapper(ctx, target, ws.impl, "UnresolvedTransactions", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { var innerErr error - transactions, innerErr = conn.UnresolvedTransactions(ctx, target) + transactions, innerErr = conn.UnresolvedTransactions(ctx, target, abandonAgeSeconds) return canRetry(ctx, innerErr), innerErr }) return transactions, err diff --git a/go/vt/vttablet/sandboxconn/sandboxconn.go b/go/vt/vttablet/sandboxconn/sandboxconn.go index e7bc3221058..6fbf0032b2a 100644 --- a/go/vt/vttablet/sandboxconn/sandboxconn.go +++ b/go/vt/vttablet/sandboxconn/sandboxconn.go @@ -26,17 +26,15 @@ import ( "time" "vitess.io/vitess/go/mysql/collations" - "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/sqltypes" - "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet/queryservice" - + "vitess.io/vitess/go/vt/log" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/queryservice" ) // SandboxConn satisfies the QueryService interface @@ -65,22 +63,23 @@ type SandboxConn struct { // These Count vars report how often the corresponding // functions were called. - ExecCount atomic.Int64 - BeginCount atomic.Int64 - CommitCount atomic.Int64 - RollbackCount atomic.Int64 - AsTransactionCount atomic.Int64 - PrepareCount atomic.Int64 - CommitPreparedCount atomic.Int64 - RollbackPreparedCount atomic.Int64 - CreateTransactionCount atomic.Int64 - StartCommitCount atomic.Int64 - SetRollbackCount atomic.Int64 - ConcludeTransactionCount atomic.Int64 - ReadTransactionCount atomic.Int64 - ReserveCount atomic.Int64 - ReleaseCount atomic.Int64 - GetSchemaCount atomic.Int64 + ExecCount atomic.Int64 + BeginCount atomic.Int64 + CommitCount atomic.Int64 + RollbackCount atomic.Int64 + AsTransactionCount atomic.Int64 + PrepareCount atomic.Int64 + CommitPreparedCount atomic.Int64 + RollbackPreparedCount atomic.Int64 + CreateTransactionCount atomic.Int64 + StartCommitCount atomic.Int64 + SetRollbackCount atomic.Int64 + ConcludeTransactionCount atomic.Int64 + ReadTransactionCount atomic.Int64 + UnresolvedTransactionsCount atomic.Int64 + ReserveCount atomic.Int64 + ReleaseCount atomic.Int64 + GetSchemaCount atomic.Int64 queriesRequireLocking bool queriesMu sync.Mutex @@ -102,6 +101,9 @@ type SandboxConn struct { // ReadTransactionResults is used for returning results for ReadTransaction. ReadTransactionResults []*querypb.TransactionMetadata + // UnresolvedTransactionsResult is used for returning results for UnresolvedTransactions. + UnresolvedTransactionsResult []*querypb.TransactionMetadata + MessageIDs []*querypb.Value // vstream expectations. @@ -170,6 +172,28 @@ func (sbc *SandboxConn) GetQueries() []*querypb.BoundQuery { return sbc.Queries } +// GetFinalQueries gets the final queries as strings from sandboxconn. +func (sbc *SandboxConn) GetFinalQueries() ([]string, error) { + if sbc.queriesRequireLocking { + sbc.queriesMu.Lock() + defer sbc.queriesMu.Unlock() + } + var queries []string + for _, q := range sbc.Queries { + stmt, err := sbc.parser.Parse(q.Sql) + if err != nil { + return nil, err + } + pq := sqlparser.NewParsedQuery(stmt) + query, err := pq.GenerateQuery(q.BindVariables, nil) + if err != nil { + return nil, err + } + queries = append(queries, query) + } + return queries, nil +} + // ClearQueries clears the Queries in sandboxconn. func (sbc *SandboxConn) ClearQueries() { if sbc.queriesRequireLocking { @@ -428,9 +452,12 @@ func (sbc *SandboxConn) ReadTransaction(ctx context.Context, target *querypb.Tar } // UnresolvedTransactions is part of the QueryService interface. -func (sbc *SandboxConn) UnresolvedTransactions(context.Context, *querypb.Target) ([]*querypb.TransactionMetadata, error) { - // TODO implement me - panic("implement me") +func (sbc *SandboxConn) UnresolvedTransactions(context.Context, *querypb.Target, int64) ([]*querypb.TransactionMetadata, error) { + sbc.UnresolvedTransactionsCount.Add(1) + if err := sbc.getError(); err != nil { + return nil, err + } + return sbc.UnresolvedTransactionsResult, nil } // BeginExecute is part of the QueryService interface. diff --git a/go/vt/vttablet/tabletconntest/fakequeryservice.go b/go/vt/vttablet/tabletconntest/fakequeryservice.go index 54deee1aed7..ac08e095f4d 100644 --- a/go/vt/vttablet/tabletconntest/fakequeryservice.go +++ b/go/vt/vttablet/tabletconntest/fakequeryservice.go @@ -360,7 +360,7 @@ func (f *FakeQueryService) ReadTransaction(ctx context.Context, target *querypb. } // UnresolvedTransactions is part of the queryservice.QueryService interface -func (f *FakeQueryService) UnresolvedTransactions(ctx context.Context, target *querypb.Target) ([]*querypb.TransactionMetadata, error) { +func (f *FakeQueryService) UnresolvedTransactions(ctx context.Context, target *querypb.Target, abandonAgeSeconds int64) ([]*querypb.TransactionMetadata, error) { if f.HasError { return nil, f.TabletError } diff --git a/go/vt/vttablet/tabletconntest/tabletconntest.go b/go/vt/vttablet/tabletconntest/tabletconntest.go index 0f443d8d58d..0674de3f663 100644 --- a/go/vt/vttablet/tabletconntest/tabletconntest.go +++ b/go/vt/vttablet/tabletconntest/tabletconntest.go @@ -403,7 +403,7 @@ func testUnresolvedTransactions(t *testing.T, conn queryservice.QueryService, f t.Log("testUnresolvedTransactions") ctx := context.Background() ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) - transactions, err := conn.UnresolvedTransactions(ctx, TestTarget) + transactions, err := conn.UnresolvedTransactions(ctx, TestTarget, 0 /* abandonAgeSeconds */) require.NoError(t, err) require.True(t, proto.Equal(transactions[0], Metadata)) } @@ -412,7 +412,7 @@ func testUnresolvedTransactionsError(t *testing.T, conn queryservice.QueryServic t.Log("testUnresolvedTransactionsError") f.HasError = true testErrorHelper(t, f, "UnresolvedTransactions", func(ctx context.Context) error { - _, err := conn.UnresolvedTransactions(ctx, TestTarget) + _, err := conn.UnresolvedTransactions(ctx, TestTarget, 0 /* abandonAgeSeconds */) return err }) f.HasError = false @@ -421,7 +421,7 @@ func testUnresolvedTransactionsError(t *testing.T, conn queryservice.QueryServic func testUnresolvedTransactionsPanics(t *testing.T, conn queryservice.QueryService, f *FakeQueryService) { t.Log("testUnresolvedTransactionsPanics") testPanicHelper(t, f, "UnresolvedTransactions", func(ctx context.Context) error { - _, err := conn.UnresolvedTransactions(ctx, TestTarget) + _, err := conn.UnresolvedTransactions(ctx, TestTarget, 0 /* abandonAgeSeconds */) return err }) } diff --git a/go/vt/vttablet/tabletmanager/framework_test.go b/go/vt/vttablet/tabletmanager/framework_test.go index 27a3a562cd3..628b79d55f2 100644 --- a/go/vt/vttablet/tabletmanager/framework_test.go +++ b/go/vt/vttablet/tabletmanager/framework_test.go @@ -37,6 +37,8 @@ import ( "vitess.io/vitess/go/vt/mysqlctl/tmutils" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" + "vitess.io/vitess/go/vt/vtenv" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/queryservice" "vitess.io/vitess/go/vt/vttablet/tabletconn" "vitess.io/vitess/go/vt/vttablet/tabletconntest" @@ -46,12 +48,14 @@ import ( binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" + replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) const ( gtidFlavor = "MySQL56" + serverUUID = "16b1039f-22b6-11ed-b765-0a43f95f28a3" gtidPosition = "16b1039f-22b6-11ed-b765-0a43f95f28a3:1-220" ) @@ -77,6 +81,7 @@ type testEnv struct { ctx context.Context ts *topo.Server cells []string + db *fakesqldb.DB mysqld *mysqlctl.FakeMysqlDaemon tmc *fakeTMClient dbName string @@ -84,6 +89,7 @@ type testEnv struct { } func newTestEnv(t *testing.T, ctx context.Context, sourceKeyspace string, sourceShards []string) *testEnv { + vttablet.InitVReplicationConfigDefaults() tenv := &testEnv{ ctx: context.Background(), tmc: newFakeTMClient(), @@ -112,9 +118,13 @@ func newTestEnv(t *testing.T, ctx context.Context, sourceKeyspace string, source }) tmclienttest.SetProtocol(fmt.Sprintf("go.vt.vttablet.tabletmanager.framework_test_%s", t.Name()), tenv.protoName) - tenv.mysqld = mysqlctl.NewFakeMysqlDaemon(fakesqldb.New(t)) - var err error - tenv.mysqld.CurrentPrimaryPosition, err = replication.ParsePosition(gtidFlavor, gtidPosition) + tenv.db = fakesqldb.New(t) + tenv.mysqld = mysqlctl.NewFakeMysqlDaemon(tenv.db) + curPosition, err := replication.ParsePosition(gtidFlavor, gtidPosition) + require.NoError(t, err) + tenv.mysqld.SetPrimaryPositionLocked(curPosition) + + err = tenv.ts.RebuildSrvVSchema(ctx, nil) require.NoError(t, err) return tenv @@ -127,7 +137,7 @@ func (tenv *testEnv) close() { tenv.mysqld.Close() } -//-------------------------------------- +// -------------------------------------- // Tablets func (tenv *testEnv) addTablet(t *testing.T, id int, keyspace, shard string) *fakeTabletConn { @@ -179,8 +189,11 @@ func (tenv *testEnv) addTablet(t *testing.T, id int, keyspace, shard string) *fa DBConfigs: &dbconfigs.DBConfigs{ DBName: tenv.dbName, }, + Env: vtenv.NewTestEnv(), + _waitForGrantsComplete: make(chan struct{}), + MysqlDaemon: tenv.mysqld, } - + close(tenv.tmc.tablets[id].tm._waitForGrantsComplete) // So that we don't wait for the grants return tenv.tmc.tablets[id] } @@ -369,7 +382,7 @@ func (ftc *fakeTabletConn) StreamHealth(ctx context.Context, callback func(*quer }) } -//---------------------------------------------- +// ---------------------------------------------- // fakeTMClient type fakeTMClient struct { @@ -417,8 +430,6 @@ func (tmc *fakeTMClient) ApplySchema(ctx context.Context, tablet *topodatapb.Tab } func (tmc *fakeTMClient) schemaRequested(uid int) { - tmc.mu.Lock() - defer tmc.mu.Unlock() key := strconv.Itoa(int(uid)) n, ok := tmc.getSchemaCounts[key] if !ok { @@ -436,6 +447,8 @@ func (tmc *fakeTMClient) getSchemaRequestCount(uid int) int { } func (tmc *fakeTMClient) GetSchema(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.GetSchemaRequest) (*tabletmanagerdatapb.SchemaDefinition, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() tmc.schemaRequested(int(tablet.Alias.Uid)) // Return the schema for the tablet if it exists. if schema, ok := tmc.tabletSchemas[int(tablet.Alias.Uid)]; ok { @@ -463,6 +476,8 @@ func (tmc *fakeTMClient) ExecuteFetchAsDba(ctx context.Context, tablet *topodata // and their results. You can specify exact strings or strings prefixed with // a '/', in which case they will be treated as a valid regexp. func (tmc *fakeTMClient) setVReplicationExecResults(tablet *topodatapb.Tablet, query string, result *sqltypes.Result) { + tmc.mu.Lock() + defer tmc.mu.Unlock() queries, ok := tmc.vreQueries[int(tablet.Alias.Uid)] if !ok { queries = make(map[string]*querypb.QueryResult) @@ -472,13 +487,15 @@ func (tmc *fakeTMClient) setVReplicationExecResults(tablet *topodatapb.Tablet, q } func (tmc *fakeTMClient) VReplicationExec(ctx context.Context, tablet *topodatapb.Tablet, query string) (*querypb.QueryResult, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() if result, ok := tmc.vreQueries[int(tablet.Alias.Uid)][query]; ok { return result, nil } for qry, res := range tmc.vreQueries[int(tablet.Alias.Uid)] { if strings.HasPrefix(qry, "/") { - re := regexp.MustCompile(qry) - if re.MatchString(qry) { + re := regexp.MustCompile(qry[1:]) + if re.MatchString(query) { return res, nil } } @@ -490,14 +507,23 @@ func (tmc *fakeTMClient) PrimaryPosition(ctx context.Context, tablet *topodatapb return fmt.Sprintf("%s/%s", gtidFlavor, gtidPosition), nil } +func (tmc *fakeTMClient) PrimaryStatus(ctx context.Context, tablet *topodatapb.Tablet) (*replicationdatapb.PrimaryStatus, error) { + pos, _ := tmc.PrimaryPosition(ctx, tablet) + return &replicationdatapb.PrimaryStatus{ + Position: pos, + FilePosition: pos, + ServerUuid: serverUUID, + }, nil +} + func (tmc *fakeTMClient) VReplicationWaitForPos(ctx context.Context, tablet *topodatapb.Tablet, id int32, pos string) error { return nil } func (tmc *fakeTMClient) ExecuteFetchAsAllPrivs(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.ExecuteFetchAsAllPrivsRequest) (*querypb.QueryResult, error) { - return &querypb.QueryResult{ - RowsAffected: 1, - }, nil + tmc.mu.Lock() + defer tmc.mu.Unlock() + return tmc.tablets[int(tablet.Alias.Uid)].tm.ExecuteFetchAsAllPrivs(ctx, req) } func (tmc *fakeTMClient) VDiff(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.VDiffRequest) (*tabletmanagerdatapb.VDiffResponse, error) { @@ -511,9 +537,17 @@ func (tmc *fakeTMClient) VDiff(ctx context.Context, tablet *topodatapb.Tablet, r } func (tmc *fakeTMClient) CreateVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.CreateVReplicationWorkflowRequest) (*tabletmanagerdatapb.CreateVReplicationWorkflowResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() return tmc.tablets[int(tablet.Alias.Uid)].tm.CreateVReplicationWorkflow(ctx, req) } +func (tmc *fakeTMClient) DeleteTableData(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.DeleteTableDataRequest) (*tabletmanagerdatapb.DeleteTableDataResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() + return tmc.tablets[int(tablet.Alias.Uid)].tm.DeleteTableData(ctx, req) +} + func (tmc *fakeTMClient) DeleteVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (response *tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, err error) { tmc.mu.Lock() defer tmc.mu.Unlock() @@ -526,17 +560,25 @@ func (tmc *fakeTMClient) DeleteVReplicationWorkflow(ctx context.Context, tablet } func (tmc *fakeTMClient) HasVReplicationWorkflows(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.HasVReplicationWorkflowsRequest) (*tabletmanagerdatapb.HasVReplicationWorkflowsResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() return tmc.tablets[int(tablet.Alias.Uid)].tm.HasVReplicationWorkflows(ctx, req) } func (tmc *fakeTMClient) ReadVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.ReadVReplicationWorkflowRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() return tmc.tablets[int(tablet.Alias.Uid)].tm.ReadVReplicationWorkflow(ctx, req) } func (tmc *fakeTMClient) ReadVReplicationWorkflows(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.ReadVReplicationWorkflowsRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowsResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() return tmc.tablets[int(tablet.Alias.Uid)].tm.ReadVReplicationWorkflows(ctx, req) } func (tmc *fakeTMClient) UpdateVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.UpdateVReplicationWorkflowRequest) (*tabletmanagerdatapb.UpdateVReplicationWorkflowResponse, error) { + tmc.mu.Lock() + defer tmc.mu.Unlock() return tmc.tablets[int(tablet.Alias.Uid)].tm.UpdateVReplicationWorkflow(ctx, req) } diff --git a/go/vt/vttablet/tabletmanager/restore.go b/go/vt/vttablet/tabletmanager/restore.go index 236d048340b..35587124108 100644 --- a/go/vt/vttablet/tabletmanager/restore.go +++ b/go/vt/vttablet/tabletmanager/restore.go @@ -36,28 +36,26 @@ import ( "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/mysqlctl/backupstats" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/proto/vttime" "vitess.io/vitess/go/vt/servenv" - "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" - "vitess.io/vitess/go/vt/vttablet/tmclient" - - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" - tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) // This file handles the initial backup restore upon startup. // It is only enabled if restore_from_backup is set. var ( - restoreFromBackup bool - restoreFromBackupTsStr string - restoreConcurrency = 4 - waitForBackupInterval time.Duration + restoreFromBackup bool + restoreFromBackupAllowedEngines []string + restoreFromBackupTsStr string + restoreConcurrency = 4 + waitForBackupInterval time.Duration statsRestoreBackupTime *stats.String statsRestoreBackupPosition *stats.String @@ -65,6 +63,7 @@ var ( func registerRestoreFlags(fs *pflag.FlagSet) { fs.BoolVar(&restoreFromBackup, "restore_from_backup", restoreFromBackup, "(init restore parameter) will check BackupStorage for a recent backup at startup and start there") + fs.StringSliceVar(&restoreFromBackupAllowedEngines, "restore-from-backup-allowed-engines", restoreFromBackupAllowedEngines, "(init restore parameter) if set, only backups taken with the specified engines are eligible to be restored") fs.StringVar(&restoreFromBackupTsStr, "restore_from_backup_ts", restoreFromBackupTsStr, "(init restore parameter) if set, restore the latest backup taken at or before this timestamp. Example: '2021-04-29.133050'") fs.IntVar(&restoreConcurrency, "restore_concurrency", restoreConcurrency, "(init restore parameter) how many concurrent files to restore at once") fs.DurationVar(&waitForBackupInterval, "wait_for_backup_interval", waitForBackupInterval, "(init restore parameter) if this is greater than 0, instead of starting up empty when no backups are found, keep checking at this interval for a backup to appear") @@ -132,6 +131,7 @@ func (tm *TabletManager) RestoreData( backupTime time.Time, restoreToTimetamp time.Time, restoreToPos string, + allowedBackupEngines []string, mysqlShutdownTimeout time.Duration) error { if err := tm.lock(ctx); err != nil { return err @@ -177,9 +177,10 @@ func (tm *TabletManager) RestoreData( startTime = time.Now() req := &tabletmanagerdatapb.RestoreFromBackupRequest{ - BackupTime: protoutil.TimeToProto(backupTime), - RestoreToPos: restoreToPos, - RestoreToTimestamp: protoutil.TimeToProto(restoreToTimetamp), + BackupTime: protoutil.TimeToProto(backupTime), + RestoreToPos: restoreToPos, + RestoreToTimestamp: protoutil.TimeToProto(restoreToTimetamp), + AllowedBackupEngines: allowedBackupEngines, } err = tm.restoreDataLocked(ctx, logger, waitForBackupInterval, deleteBeforeRestore, req, mysqlShutdownTimeout) if err != nil { @@ -231,6 +232,7 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L DryRun: request.DryRun, Stats: backupstats.RestoreStats(), MysqlShutdownTimeout: mysqlShutdownTimeout, + AllowedBackupEngines: request.AllowedBackupEngines, } restoreToTimestamp := protoutil.TimeFromProto(request.RestoreToTimestamp).UTC() if request.RestoreToPos != "" && !restoreToTimestamp.IsZero() { @@ -321,7 +323,7 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L } else if keyspaceInfo.KeyspaceType == topodatapb.KeyspaceType_NORMAL { // Reconnect to primary only for "NORMAL" keyspaces params.Logger.Infof("Restore: starting replication at position %v", pos) - if err := tm.startReplication(context.Background(), pos, originalType); err != nil { + if err := tm.startReplication(ctx, pos, originalType); err != nil { return err } } @@ -572,47 +574,30 @@ func (tm *TabletManager) disableReplication(ctx context.Context) error { } func (tm *TabletManager) startReplication(ctx context.Context, pos replication.Position, tabletType topodatapb.TabletType) error { - if err := tm.MysqlDaemon.StopReplication(ctx, nil); err != nil { + // The first three steps of stopping replication, and setting the replication position, + // we want to do even if the context expires, so we use a background context for these tasks. + if err := tm.MysqlDaemon.StopReplication(context.Background(), nil); err != nil { return vterrors.Wrap(err, "failed to stop replication") } - if err := tm.MysqlDaemon.ResetReplicationParameters(ctx); err != nil { + if err := tm.MysqlDaemon.ResetReplicationParameters(context.Background()); err != nil { return vterrors.Wrap(err, "failed to reset replication") } // Set the position at which to resume from the primary. - if err := tm.MysqlDaemon.SetReplicationPosition(ctx, pos); err != nil { + if err := tm.MysqlDaemon.SetReplicationPosition(context.Background(), pos); err != nil { return vterrors.Wrap(err, "failed to set replication position") } - primary, err := tm.initializeReplication(ctx, tabletType) + primaryPosStr, err := tm.initializeReplication(ctx, tabletType) // If we ran into an error while initializing replication, then there is no point in waiting for catch-up. // Also, if there is no primary tablet in the shard, we don't need to proceed further. - if err != nil || primary == nil { + if err != nil || primaryPosStr == "" { return err } - // wait for reliable replication_lag_seconds - // we have pos where we want to resume from - // if PrimaryPosition is the same, that means no writes - // have happened to primary, so we are up-to-date - // otherwise, wait for replica's Position to change from - // the initial pos before proceeding - tmc := tmclient.NewTabletManagerClient() - defer tmc.Close() - remoteCtx, remoteCancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) - defer remoteCancel() - posStr, err := tmc.PrimaryPosition(remoteCtx, primary.Tablet) - if err != nil { - // It is possible that though PrimaryAlias is set, the primary tablet is unreachable - // Log a warning and let tablet restore in that case - // If we had instead considered this fatal, all tablets would crash-loop - // until a primary appears, which would make it impossible to elect a primary. - log.Warningf("Can't get primary replication position after restore: %v", err) - return nil - } - primaryPos, err := replication.DecodePosition(posStr) + primaryPos, err := replication.DecodePosition(primaryPosStr) if err != nil { - return vterrors.Wrapf(err, "can't decode primary replication position: %q", posStr) + return vterrors.Wrapf(err, "can't decode primary replication position: %q", primaryPos) } if !pos.Equal(primaryPos) { diff --git a/go/vt/vttablet/tabletmanager/rpc_actions.go b/go/vt/vttablet/tabletmanager/rpc_actions.go index 45dd51670ba..2ebef6540ed 100644 --- a/go/vt/vttablet/tabletmanager/rpc_actions.go +++ b/go/vt/vttablet/tabletmanager/rpc_actions.go @@ -78,10 +78,47 @@ func (tm *TabletManager) SetReadOnly(ctx context.Context, rdonly bool) error { return err } defer tm.unlock() + superRo, err := tm.MysqlDaemon.IsSuperReadOnly(ctx) + if err != nil { + return err + } + if !rdonly && superRo { + // If super read only is set, then we need to prepare the transactions before setting read_only OFF. + // We need to redo the prepared transactions in read only mode using the dba user to ensure we don't lose them. + // setting read_only OFF will also set super_read_only OFF if it was set. + // If super read only is already off, then we probably called this function from PRS or some other place + // because it is idempotent. We only need to redo prepared transactions the first time we transition from super read only + // to read write. + return tm.redoPreparedTransactionsAndSetReadWrite(ctx) + } return tm.MysqlDaemon.SetReadOnly(ctx, rdonly) } +// ChangeTags changes the tablet tags +func (tm *TabletManager) ChangeTags(ctx context.Context, tabletTags map[string]string, replace bool) (map[string]string, error) { + if err := tm.lock(ctx); err != nil { + return nil, err + } + defer tm.unlock() + + tags := tm.tmState.Tablet().Tags + if replace || len(tags) == 0 { + tags = tabletTags + } else { + for key, val := range tabletTags { + if val == "" { + delete(tags, key) + continue + } + tags[key] = val + } + } + + tm.tmState.ChangeTabletTags(ctx, tags) + return tags, nil +} + // ChangeType changes the tablet type func (tm *TabletManager) ChangeType(ctx context.Context, tabletType topodatapb.TabletType, semiSync bool) error { if err := tm.lock(ctx); err != nil { @@ -97,7 +134,7 @@ func (tm *TabletManager) ChangeType(ctx context.Context, tabletType topodatapb.T return tm.changeTypeLocked(ctx, tabletType, DBActionNone, semiSyncAction) } -// ChangeType changes the tablet type +// changeTypeLocked changes the tablet type under a lock func (tm *TabletManager) changeTypeLocked(ctx context.Context, tabletType topodatapb.TabletType, action DBAction, semiSync SemiSyncAction) error { // We don't want to allow multiple callers to claim a tablet as drained. if tabletType == topodatapb.TabletType_DRAINED && tm.Tablet().Type == topodatapb.TabletType_DRAINED { diff --git a/go/vt/vttablet/tabletmanager/rpc_agent.go b/go/vt/vttablet/tabletmanager/rpc_agent.go index 6dd21a21915..c6242689358 100644 --- a/go/vt/vttablet/tabletmanager/rpc_agent.go +++ b/go/vt/vttablet/tabletmanager/rpc_agent.go @@ -51,6 +51,8 @@ type RPCTM interface { SetReadOnly(ctx context.Context, rdonly bool) error + ChangeTags(ctx context.Context, tabletTags map[string]string, replace bool) (map[string]string, error) + ChangeType(ctx context.Context, tabletType topodatapb.TabletType, semiSync bool) error Sleep(ctx context.Context, duration time.Duration) @@ -83,6 +85,14 @@ type RPCTM interface { ExecuteFetchAsApp(ctx context.Context, req *tabletmanagerdatapb.ExecuteFetchAsAppRequest) (*querypb.QueryResult, error) + GetUnresolvedTransactions(ctx context.Context, abandonAgeSeconds int64) ([]*querypb.TransactionMetadata, error) + + ReadTransaction(ctx context.Context, req *tabletmanagerdatapb.ReadTransactionRequest) (*querypb.TransactionMetadata, error) + + ConcludeTransaction(ctx context.Context, req *tabletmanagerdatapb.ConcludeTransactionRequest) error + + MysqlHostMetrics(ctx context.Context, req *tabletmanagerdatapb.MysqlHostMetricsRequest) (*tabletmanagerdatapb.MysqlHostMetricsResponse, error) + // Replication related methods PrimaryStatus(ctx context.Context) (*replicationdatapb.PrimaryStatus, error) @@ -106,10 +116,12 @@ type RPCTM interface { // VReplication API CreateVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.CreateVReplicationWorkflowRequest) (*tabletmanagerdatapb.CreateVReplicationWorkflowResponse, error) + DeleteTableData(ctx context.Context, req *tabletmanagerdatapb.DeleteTableDataRequest) (*tabletmanagerdatapb.DeleteTableDataResponse, error) DeleteVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (*tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, error) HasVReplicationWorkflows(ctx context.Context, req *tabletmanagerdatapb.HasVReplicationWorkflowsRequest) (*tabletmanagerdatapb.HasVReplicationWorkflowsResponse, error) ReadVReplicationWorkflows(ctx context.Context, req *tabletmanagerdatapb.ReadVReplicationWorkflowsRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowsResponse, error) ReadVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.ReadVReplicationWorkflowRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowResponse, error) + ValidateVReplicationPermissions(ctx context.Context, req *tabletmanagerdatapb.ValidateVReplicationPermissionsRequest) (*tabletmanagerdatapb.ValidateVReplicationPermissionsResponse, error) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error) VReplicationWaitForPos(ctx context.Context, id int32, pos string) error UpdateVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.UpdateVReplicationWorkflowRequest) (*tabletmanagerdatapb.UpdateVReplicationWorkflowResponse, error) @@ -126,6 +138,8 @@ type RPCTM interface { PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, tabletAlias *topodatapb.TabletAlias, pos string) error + ReadReparentJournalInfo(ctx context.Context) (int, error) + InitReplica(ctx context.Context, parent *topodatapb.TabletAlias, replicationPosition string, timeCreatedNS int64, semiSync bool) error DemotePrimary(ctx context.Context) (*replicationdatapb.PrimaryStatus, error) diff --git a/go/vt/vttablet/tabletmanager/rpc_backup.go b/go/vt/vttablet/tabletmanager/rpc_backup.go index 906e34ca9d7..a66264d98af 100644 --- a/go/vt/vttablet/tabletmanager/rpc_backup.go +++ b/go/vt/vttablet/tabletmanager/rpc_backup.go @@ -53,7 +53,13 @@ func (tm *TabletManager) Backup(ctx context.Context, logger logutil.Logger, req if !req.AllowPrimary && currentTablet.Type == topodatapb.TabletType_PRIMARY { return fmt.Errorf("type PRIMARY cannot take backup. if you really need to do this, rerun the backup command with --allow_primary") } - engine, err := mysqlctl.GetBackupEngine() + + backupEngine := "" + if req.BackupEngine != nil { + backupEngine = *req.BackupEngine + } + + engine, err := mysqlctl.GetBackupEngine(backupEngine) if err != nil { return vterrors.Wrap(err, "failed to find backup engine") } @@ -163,6 +169,7 @@ func (tm *TabletManager) Backup(ctx context.Context, logger logutil.Logger, req Stats: backupstats.BackupStats(), UpgradeSafe: req.UpgradeSafe, MysqlShutdownTimeout: mysqlShutdownTimeout, + BackupEngine: backupEngine, } returnErr := mysqlctl.Backup(ctx, backupParams) diff --git a/go/vt/vttablet/tabletmanager/rpc_query.go b/go/vt/vttablet/tabletmanager/rpc_query.go index 303bcd4614d..b0da7d9d71f 100644 --- a/go/vt/vttablet/tabletmanager/rpc_query.go +++ b/go/vt/vttablet/tabletmanager/rpc_query.go @@ -275,6 +275,18 @@ func (tm *TabletManager) ExecuteFetchAsApp(ctx context.Context, req *tabletmanag return sqltypes.ResultToProto3(result), err } +// MysqlHostMetrics gets system metrics from mysqlctl[d] +func (tm *TabletManager) MysqlHostMetrics(ctx context.Context, req *tabletmanagerdatapb.MysqlHostMetricsRequest) (*tabletmanagerdatapb.MysqlHostMetricsResponse, error) { + mysqlResp, err := tm.MysqlDaemon.HostMetrics(ctx, tm.Cnf) + if err != nil { + return nil, err + } + resp := &tabletmanagerdatapb.MysqlHostMetricsResponse{ + HostMetrics: mysqlResp, + } + return resp, nil +} + // ExecuteQuery submits a new online DDL request func (tm *TabletManager) ExecuteQuery(ctx context.Context, req *tabletmanagerdatapb.ExecuteQueryRequest) (*querypb.QueryResult, error) { if err := tm.waitForGrantsToHaveApplied(ctx); err != nil { diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index 3e745222092..90e4d835a79 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -22,16 +22,16 @@ import ( "strings" "time" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/protoutil" - - "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/tabletserver" replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -348,6 +348,15 @@ func (tm *TabletManager) InitPrimary(ctx context.Context, semiSync bool) (string } defer tm.unlock() + semiSyncAction, err := tm.convertBoolToSemiSyncAction(ctx, semiSync) + if err != nil { + return "", err + } + + // If semi-sync is enabled, we need to set two pc to be allowed. + // Otherwise, we block all Prepared calls because atomic transactions require semi-sync for correctness.. + tm.QueryServiceControl.SetTwoPCAllowed(tabletserver.TwoPCAllowed_SemiSync, semiSyncAction == SemiSyncActionSet) + // Setting super_read_only `OFF` so that we can run the DDL commands if _, err := tm.MysqlDaemon.SetSuperReadOnly(ctx, false); err != nil { if sqlErr, ok := err.(*sqlerror.SQLError); ok && sqlErr.Number() == sqlerror.ERUnknownSystemVariable { @@ -369,11 +378,6 @@ func (tm *TabletManager) InitPrimary(ctx context.Context, semiSync bool) (string return "", err } - semiSyncAction, err := tm.convertBoolToSemiSyncAction(ctx, semiSync) - if err != nil { - return "", err - } - // Set the server read-write, from now on we can accept real // client writes. Note that if semi-sync replication is enabled, // we'll still need some replicas to be able to commit transactions. @@ -407,6 +411,24 @@ func (tm *TabletManager) PopulateReparentJournal(ctx context.Context, timeCreate return tm.MysqlDaemon.ExecuteSuperQueryList(ctx, cmds) } +// ReadReparentJournalInfo reads the information from reparent journal. +func (tm *TabletManager) ReadReparentJournalInfo(ctx context.Context) (int, error) { + log.Infof("ReadReparentJournalInfo") + if err := tm.waitForGrantsToHaveApplied(ctx); err != nil { + return 0, err + } + + query := mysqlctl.ReadReparentJournalInfoQuery() + res, err := tm.MysqlDaemon.FetchSuperQuery(ctx, query) + if err != nil { + return 0, err + } + if len(res.Rows) != 1 { + return 0, vterrors.Errorf(vtrpc.Code_INTERNAL, "unexpected rows when reading reparent journal, got %v", len(res.Rows)) + } + return res.Rows[0][0].ToInt() +} + // InitReplica sets replication primary and position, and waits for the // reparent_journal table entry up to context timeout func (tm *TabletManager) InitReplica(ctx context.Context, parent *topodatapb.TabletAlias, position string, timeCreatedNS int64, semiSync bool) error { @@ -544,9 +566,10 @@ func (tm *TabletManager) demotePrimary(ctx context.Context, revertPartialFailure defer func() { if finalErr != nil && revertPartialFailure && !wasReadOnly { + // We need to redo the prepared transactions in read only mode using the dba user to ensure we don't lose them. // setting read_only OFF will also set super_read_only OFF if it was set - if err := tm.MysqlDaemon.SetReadOnly(ctx, false); err != nil { - log.Warningf("SetReadOnly(false) failed during revert: %v", err) + if err = tm.redoPreparedTransactionsAndSetReadWrite(ctx); err != nil { + log.Warningf("RedoPreparedTransactionsAndSetReadWrite failed during revert: %v", err) } } }() @@ -594,13 +617,17 @@ func (tm *TabletManager) UndoDemotePrimary(ctx context.Context, semiSync bool) e return err } + // If semi-sync is enabled, we need to set two pc to be allowed. + // Otherwise, we block all Prepared calls because atomic transactions require semi-sync for correctness.. + tm.QueryServiceControl.SetTwoPCAllowed(tabletserver.TwoPCAllowed_SemiSync, semiSyncAction == SemiSyncActionSet) + // If using semi-sync, we need to enable source-side. if err := tm.fixSemiSync(ctx, topodatapb.TabletType_PRIMARY, semiSyncAction); err != nil { return err } - // Now, set the server read-only false. - if err := tm.MysqlDaemon.SetReadOnly(ctx, false); err != nil { + // We need to redo the prepared transactions in read only mode using the dba user to ensure we don't lose them. + if err = tm.redoPreparedTransactionsAndSetReadWrite(ctx); err != nil { return err } @@ -699,6 +726,7 @@ func (tm *TabletManager) setReplicationSourceLocked(ctx context.Context, parentA wasReplicating := false shouldbeReplicating := false status, err := tm.MysqlDaemon.ReplicationStatus(ctx) + replicaPosition := status.RelayLogPosition if err == mysql.ErrNotReplica { // This is a special error that means we actually succeeded in reading // the status, but the status is empty because replication is not @@ -708,6 +736,12 @@ func (tm *TabletManager) setReplicationSourceLocked(ctx context.Context, parentA // Since we continue in the case of this error, make sure 'status' is // in a known, empty state. status = replication.ReplicationStatus{} + // The replica position we use for the errant GTID detection should be the executed + // GTID set since this tablet is not running replication at all. + replicaPosition, err = tm.MysqlDaemon.PrimaryPosition(ctx) + if err != nil { + return err + } } else if err != nil { // Abort on any other non-nil error. return err @@ -739,12 +773,39 @@ func (tm *TabletManager) setReplicationSourceLocked(ctx context.Context, parentA if err != nil { return err } + host := parent.Tablet.MysqlHostname port := parent.Tablet.MysqlPort // If host is empty, then we shouldn't even attempt the reparent. That tablet has already shutdown. if host == "" { return vterrors.New(vtrpc.Code_FAILED_PRECONDITION, "Shard primary has empty mysql hostname") } + // Errant GTID detection. + { + // Find the executed GTID set of the tablet that we are reparenting to. + // We will then compare our own position against it to verify that we don't + // have an errant GTID. If we find any GTID that we have, but the primary doesn't, + // we will not enter the replication graph and instead fail replication. + primaryStatus, err := tm.tmc.PrimaryStatus(ctx, parent.Tablet) + if err != nil { + return err + } + primaryPosition, err := replication.DecodePosition(primaryStatus.Position) + if err != nil { + return err + } + primarySid, err := replication.ParseSID(primaryStatus.ServerUuid) + if err != nil { + return err + } + errantGtid, err := replication.ErrantGTIDsOnReplica(replicaPosition, primaryPosition, primarySid) + if err != nil { + return err + } + if errantGtid != "" { + return vterrors.New(vtrpc.Code_FAILED_PRECONDITION, fmt.Sprintf("Errant GTID detected - %s; Primary GTID - %s, Replica GTID - %s", errantGtid, primaryPosition, replicaPosition.String())) + } + } if status.SourceHost != host || status.SourcePort != port || heartbeatInterval != 0 { // This handles both changing the address and starting replication. if err := tm.MysqlDaemon.SetReplicationSource(ctx, host, port, heartbeatInterval, wasReplicating, shouldbeReplicating); err != nil { @@ -910,12 +971,16 @@ func (tm *TabletManager) PromoteReplica(ctx context.Context, semiSync bool) (str } defer tm.unlock() - pos, err := tm.MysqlDaemon.Promote(ctx, tm.hookExtraEnv()) + semiSyncAction, err := tm.convertBoolToSemiSyncAction(ctx, semiSync) if err != nil { return "", err } - semiSyncAction, err := tm.convertBoolToSemiSyncAction(ctx, semiSync) + // If semi-sync is enabled, we need to set two pc to be allowed. + // Otherwise, we block all Prepared calls because atomic transactions require semi-sync for correctness.. + tm.QueryServiceControl.SetTwoPCAllowed(tabletserver.TwoPCAllowed_SemiSync, semiSyncAction == SemiSyncActionSet) + + pos, err := tm.MysqlDaemon.Promote(ctx, tm.hookExtraEnv()) if err != nil { return "", err } diff --git a/go/vt/vttablet/tabletmanager/rpc_throttler.go b/go/vt/vttablet/tabletmanager/rpc_throttler.go index 8ec3bb592da..1617a5b275b 100644 --- a/go/vt/vttablet/tabletmanager/rpc_throttler.go +++ b/go/vt/vttablet/tabletmanager/rpc_throttler.go @@ -21,14 +21,15 @@ import ( "vitess.io/vitess/go/protoutil" "vitess.io/vitess/go/stats" - tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" + + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) var ( @@ -53,31 +54,36 @@ func (tm *TabletManager) CheckThrottler(ctx context.Context, req *tabletmanagerd return nil, vterrors.Errorf(vtrpc.Code_INTERNAL, "nil checkResult") } resp := &tabletmanagerdatapb.CheckThrottlerResponse{ + ResponseCode: throttle.ResponseCodeFromStatus(checkResult.ResponseCode, checkResult.StatusCode), StatusCode: int32(checkResult.StatusCode), Value: checkResult.Value, Threshold: checkResult.Threshold, Message: checkResult.Message, RecentlyChecked: checkResult.RecentlyChecked, + AppName: checkResult.AppName, + Summary: checkResult.Summary(), Metrics: make(map[string]*tabletmanagerdatapb.CheckThrottlerResponse_Metric), } for name, metric := range checkResult.Metrics { resp.Metrics[name] = &tabletmanagerdatapb.CheckThrottlerResponse_Metric{ - Name: name, - Scope: metric.Scope, - StatusCode: int32(metric.StatusCode), - Value: metric.Value, - Threshold: metric.Threshold, - Message: metric.Message, + Name: name, + Scope: metric.Scope, + StatusCode: int32(metric.StatusCode), + ResponseCode: throttle.ResponseCodeFromStatus(metric.ResponseCode, metric.StatusCode), + Value: metric.Value, + Threshold: metric.Threshold, + Message: metric.Message, } } if len(checkResult.Metrics) == 0 { // For backwards compatibility, when the checked tablet is of lower version, it does not return a // matrics map, but only the one metric. resp.Metrics[base.DefaultMetricName.String()] = &tabletmanagerdatapb.CheckThrottlerResponse_Metric{ - StatusCode: int32(checkResult.StatusCode), - Value: checkResult.Value, - Threshold: checkResult.Threshold, - Message: checkResult.Message, + StatusCode: int32(checkResult.StatusCode), + ResponseCode: throttle.ResponseCodeFromStatus(checkResult.ResponseCode, checkResult.StatusCode), + Value: checkResult.Value, + Threshold: checkResult.Threshold, + Message: checkResult.Message, } } if checkResult.Error != nil { @@ -138,8 +144,9 @@ func (tm *TabletManager) GetThrottlerStatus(ctx context.Context, req *tabletmana } for _, recentApp := range status.RecentApps { resp.RecentApps[recentApp.AppName] = &tabletmanagerdatapb.GetThrottlerStatusResponse_RecentApp{ - CheckedAt: protoutil.TimeToProto(recentApp.CheckedAt), - StatusCode: int32(recentApp.StatusCode), + CheckedAt: protoutil.TimeToProto(recentApp.CheckedAt), + StatusCode: int32(recentApp.StatusCode), + ResponseCode: recentApp.ResponseCode, } } return resp, nil diff --git a/go/vt/vttablet/tabletmanager/rpc_transaction.go b/go/vt/vttablet/tabletmanager/rpc_transaction.go new file mode 100644 index 00000000000..f6ec092e357 --- /dev/null +++ b/go/vt/vttablet/tabletmanager/rpc_transaction.go @@ -0,0 +1,60 @@ +/* +Copyright 2024 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 tabletmanager + +import ( + "context" + + querypb "vitess.io/vitess/go/vt/proto/query" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" +) + +// GetUnresolvedTransactions returns the unresolved distributed transactions list for the Metadata manager. +func (tm *TabletManager) GetUnresolvedTransactions(ctx context.Context, abandonAgeSeconds int64) ([]*querypb.TransactionMetadata, error) { + if err := tm.waitForGrantsToHaveApplied(ctx); err != nil { + return nil, err + } + + tablet := tm.Tablet() + target := &querypb.Target{Keyspace: tablet.Keyspace, Shard: tablet.Shard, TabletType: tablet.Type} + return tm.QueryServiceControl.UnresolvedTransactions(ctx, target, abandonAgeSeconds) +} + +// ReadTransaction returns the transaction metadata for the given distributed transaction ID. +func (tm *TabletManager) ReadTransaction(ctx context.Context, req *tabletmanagerdatapb.ReadTransactionRequest) (*querypb.TransactionMetadata, error) { + if err := tm.waitForGrantsToHaveApplied(ctx); err != nil { + return nil, err + } + + tablet := tm.Tablet() + target := &querypb.Target{Keyspace: tablet.Keyspace, Shard: tablet.Shard, TabletType: tablet.Type} + return tm.QueryServiceControl.ReadTransaction(ctx, target, req.Dtid) +} + +// ConcludeTransaction concludes the given distributed transaction. +func (tm *TabletManager) ConcludeTransaction(ctx context.Context, req *tabletmanagerdatapb.ConcludeTransactionRequest) error { + if err := tm.waitForGrantsToHaveApplied(ctx); err != nil { + return err + } + + tablet := tm.Tablet() + target := &querypb.Target{Keyspace: tablet.Keyspace, Shard: tablet.Shard, TabletType: tablet.Type} + if req.Mm { + return tm.QueryServiceControl.ConcludeTransaction(ctx, target, req.Dtid) + } + return tm.QueryServiceControl.RollbackPrepared(ctx, target, req.Dtid, 0) +} diff --git a/go/vt/vttablet/tabletmanager/rpc_transaction_test.go b/go/vt/vttablet/tabletmanager/rpc_transaction_test.go new file mode 100644 index 00000000000..567a6561ec5 --- /dev/null +++ b/go/vt/vttablet/tabletmanager/rpc_transaction_test.go @@ -0,0 +1,94 @@ +/* +Copyright 2024 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 tabletmanager + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + "vitess.io/vitess/go/vt/vtenv" + "vitess.io/vitess/go/vt/vttablet/tabletservermock" +) + +func TestTabletManager_UnresolvedTransactions(t *testing.T) { + ctx := context.Background() + + qsc := tabletservermock.NewController() + tm := &TabletManager{ + QueryServiceControl: qsc, + Env: vtenv.NewTestEnv(), + _waitForGrantsComplete: make(chan struct{}), + BatchCtx: ctx, + } + close(tm._waitForGrantsComplete) + tm.tmState = newTMState(tm, newTestTablet(t, 100, "ks", "-80", nil)) + + _, err := tm.GetUnresolvedTransactions(ctx, 0) + require.NoError(t, err) + require.True(t, qsc.MethodCalled["UnresolvedTransactions"]) +} + +func TestTabletManager_ReadTransaction(t *testing.T) { + ctx := context.Background() + + qsc := tabletservermock.NewController() + tm := &TabletManager{ + QueryServiceControl: qsc, + Env: vtenv.NewTestEnv(), + _waitForGrantsComplete: make(chan struct{}), + BatchCtx: ctx, + } + close(tm._waitForGrantsComplete) + tm.tmState = newTMState(tm, newTestTablet(t, 100, "ks", "-80", nil)) + + _, err := tm.ReadTransaction(ctx, &tabletmanagerdatapb.ReadTransactionRequest{ + Dtid: "dtid01", + }) + require.NoError(t, err) + require.True(t, qsc.MethodCalled["ReadTransaction"]) +} + +func TestTabletManager_ConcludeTransaction(t *testing.T) { + ctx := context.Background() + + qsc := tabletservermock.NewController() + tm := &TabletManager{ + QueryServiceControl: qsc, + Env: vtenv.NewTestEnv(), + _waitForGrantsComplete: make(chan struct{}), + BatchCtx: ctx, + } + close(tm._waitForGrantsComplete) + tm.tmState = newTMState(tm, newTestTablet(t, 100, "ks", "-80", nil)) + + err := tm.ConcludeTransaction(ctx, &tabletmanagerdatapb.ConcludeTransactionRequest{ + Dtid: "dtid01", + Mm: false, + }) + require.NoError(t, err) + require.True(t, qsc.MethodCalled["RollbackPrepared"]) + + err = tm.ConcludeTransaction(ctx, &tabletmanagerdatapb.ConcludeTransactionRequest{ + Dtid: "dtid01", + Mm: true, + }) + require.NoError(t, err) + require.True(t, qsc.MethodCalled["ConcludeTransaction"]) +} diff --git a/go/vt/vttablet/tabletmanager/rpc_vreplication.go b/go/vt/vttablet/tabletmanager/rpc_vreplication.go index c8c334d896e..8ddf1391ac4 100644 --- a/go/vt/vttablet/tabletmanager/rpc_vreplication.go +++ b/go/vt/vttablet/tabletmanager/rpc_vreplication.go @@ -19,21 +19,27 @@ package tabletmanager import ( "context" "fmt" + "sort" "strings" + "time" "golang.org/x/exp/maps" "google.golang.org/protobuf/encoding/prototext" + "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/movetables" "vitess.io/vitess/go/constants/sidecar" "vitess.io/vitess/go/protoutil" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/discovery" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/proto/vttime" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtctl/workflow" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" @@ -55,12 +61,32 @@ const ( // Retrieve the current configuration values for a workflow's vreplication stream(s). sqlSelectVReplicationWorkflowConfig = "select id, source, cell, tablet_types, state, message from %s.vreplication where workflow = %a" // Update the configuration values for a workflow's vreplication stream. - sqlUpdateVReplicationWorkflowStreamConfig = "update %s.vreplication set state = %a, source = %a, cell = %a, tablet_types = %a where id = %a" + sqlUpdateVReplicationWorkflowStreamConfig = "update %s.vreplication set state = %a, source = %a, cell = %a, tablet_types = %a %s where id = %a" // Update field values for multiple workflows. The final format specifier is // used to optionally add any additional predicates to the query. sqlUpdateVReplicationWorkflows = "update /*vt+ ALLOW_UNSAFE_VREPLICATION_WRITE */ %s.vreplication set%s where db_name = '%s'%s" // Check if workflow is still copying. sqlGetVReplicationCopyStatus = "select distinct vrepl_id from %s.copy_state where vrepl_id = %d" + // Validate the minimum set of permissions needed to manage vreplication metadata. + // This is a simple check for a matching user rather than any specific user@host + // combination. + sqlValidateVReplicationPermissions = ` +select count(*)>0 as good from mysql.user as u + left join mysql.db as d on (u.user = d.user) + left join mysql.tables_priv as t on (u.user = t.user) +where u.user = %a + and ( + (u.select_priv = 'y' and u.insert_priv = 'y' and u.update_priv = 'y' and u.delete_priv = 'y') /* user has global privs */ + or (d.db = %a and d.select_priv = 'y' and d.insert_priv = 'y' and d.update_priv = 'y' and d.delete_priv = 'y') /* user has db privs */ + or (t.db = %a and t.table_name = 'vreplication' /* user has table privs */ + and find_in_set('select', t.table_priv) + and find_in_set('insert', t.table_priv) + and find_in_set('update', t.table_priv) + and find_in_set('delete', t.table_priv) + ) + ) +limit 1 +` ) var ( @@ -118,6 +144,99 @@ func (tm *TabletManager) CreateVReplicationWorkflow(ctx context.Context, req *ta return &tabletmanagerdatapb.CreateVReplicationWorkflowResponse{Result: sqltypes.ResultToProto3(res)}, nil } +// DeleteTableData will delete data from the given tables (keys in the +// req.Tabletfilters map) using the given filter or WHERE clauses (values +// in the map). It will perform this work in batches of req.BatchSize +// until all matching rows have been deleted in all tables, or the context +// expires. +func (tm *TabletManager) DeleteTableData(ctx context.Context, req *tabletmanagerdatapb.DeleteTableDataRequest) (*tabletmanagerdatapb.DeleteTableDataResponse, error) { + if req == nil { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid nil request") + } + + if len(req.TableFilters) == 0 { // Nothing to do + return &tabletmanagerdatapb.DeleteTableDataResponse{}, nil + } + + // So that we do them in a predictable and uniform order. + tables := maps.Keys(req.TableFilters) + sort.Strings(tables) + + batchSize := req.BatchSize + if batchSize < 1 { + batchSize = movetables.DefaultDeleteBatchSize + } + limit := &sqlparser.Limit{Rowcount: sqlparser.NewIntLiteral(fmt.Sprintf("%d", batchSize))} + // We will log some progress info every 100 delete batches. + progressRows := uint64(batchSize * 100) + + throttledLogger := logutil.NewThrottledLogger("DeleteTableData", 1*time.Minute) + checkIfCanceled := func() error { + select { + case <-ctx.Done(): + return vterrors.Wrap(ctx.Err(), "context expired while deleting data") + default: + return nil + } + } + + for _, table := range tables { + stmt, err := tm.Env.Parser().Parse(fmt.Sprintf("delete from %s %s", table, req.TableFilters[table])) + if err != nil { + return nil, vterrors.Wrapf(err, "unable to build delete query for table %s", table) + } + del, ok := stmt.(*sqlparser.Delete) + if !ok { + return nil, vterrors.Wrapf(err, "unable to build delete query for table %s", table) + } + del.Limit = limit + query := sqlparser.String(del) + rowsDeleted := uint64(0) + // Delete all of the matching rows from the table, in batches, until we've + // deleted them all. + log.Infof("Starting deletion of data from table %s using query %q", table, query) + for { + // Back off if we're causing too much load on the database with these + // batch deletes. + if _, ok := tm.VREngine.ThrottlerClient().ThrottleCheckOKOrWaitAppName(ctx, throttlerapp.VReplicationName); !ok { + throttledLogger.Infof("throttling bulk data delete for table %s using query %q", + table, query) + if err := checkIfCanceled(); err != nil { + return nil, err + } + continue + } + res, err := tm.ExecuteFetchAsAllPrivs(ctx, + &tabletmanagerdatapb.ExecuteFetchAsAllPrivsRequest{ + Query: []byte(query), + DbName: tm.DBConfigs.DBName, + }) + if err != nil { + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "error deleting data using query %q: %v", + query, err) + } + rowsDeleted += res.RowsAffected + // Log some progress info periodically to give the operator some idea of + // how much work we've done, how much is left, and how long it may take + // (considering throttling, system performance, etc). + if rowsDeleted%progressRows == 0 { + log.Infof("Successfully deleted %d rows of data from table %s so far, using query %q", + rowsDeleted, table, query) + } + if res.RowsAffected == 0 { // We're done with this table + break + } + if err := checkIfCanceled(); err != nil { + return nil, err + } + } + log.Infof("Completed deletion of data (%d rows) from table %s using query %q", + rowsDeleted, table, query) + } + + return &tabletmanagerdatapb.DeleteTableDataResponse{}, nil +} + func (tm *TabletManager) DeleteVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (*tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, error) { if req == nil || req.Workflow == "" { return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid request, no workflow provided") @@ -438,13 +557,11 @@ func (tm *TabletManager) UpdateVReplicationWorkflow(ctx context.Context, req *ta source := row.AsBytes("source", []byte{}) state := row.AsString("state", "") message := row.AsString("message", "") - if req.State == binlogdatapb.VReplicationWorkflowState_Running && strings.ToUpper(message) == workflow.Frozen { + if req.State != nil && *req.State == binlogdatapb.VReplicationWorkflowState_Running && + strings.ToUpper(message) == workflow.Frozen { return &tabletmanagerdatapb.UpdateVReplicationWorkflowResponse{Result: nil}, vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "cannot start a workflow when it is frozen") } - // For the string based values, we use NULL to differentiate - // from an empty string. The NULL value indicates that we - // should keep the existing value. if !textutil.ValueIsSimulatedNull(req.Cells) { cells = req.Cells } @@ -452,24 +569,27 @@ func (tm *TabletManager) UpdateVReplicationWorkflow(ctx context.Context, req *ta tabletTypes = req.TabletTypes } tabletTypesStr := topoproto.MakeStringTypeCSV(tabletTypes) - if (inorder && req.TabletSelectionPreference == tabletmanagerdatapb.TabletSelectionPreference_UNKNOWN) || - (req.TabletSelectionPreference == tabletmanagerdatapb.TabletSelectionPreference_INORDER) { + if req.TabletSelectionPreference != nil && + ((inorder && *req.TabletSelectionPreference == tabletmanagerdatapb.TabletSelectionPreference_UNKNOWN) || + (*req.TabletSelectionPreference == tabletmanagerdatapb.TabletSelectionPreference_INORDER)) { tabletTypesStr = discovery.InOrderHint + tabletTypesStr } if err = prototext.Unmarshal(source, bls); err != nil { return nil, err } - // If we don't want to update the existing value then pass - // the simulated NULL value of -1. - if !textutil.ValueIsSimulatedNull(req.OnDdl) { - bls.OnDdl = req.OnDdl + // We also need to check for a SimulatedNull here to support older clients and + // smooth upgrades. All non-slice simulated NULL checks can be removed in v22+. + if req.OnDdl != nil && *req.OnDdl != binlogdatapb.OnDDLAction(textutil.SimulatedNullInt) { + bls.OnDdl = *req.OnDdl } source, err = prototext.Marshal(bls) if err != nil { return nil, err } - if !textutil.ValueIsSimulatedNull(req.State) { - state = binlogdatapb.VReplicationWorkflowState_name[int32(req.State)] + // We also need to check for a SimulatedNull here to support older clients and + // smooth upgrades. All non-slice simulated NULL checks can be removed in v22+. + if req.State != nil && *req.State != binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt) { + state = binlogdatapb.VReplicationWorkflowState_name[int32(*req.State)] } if state == binlogdatapb.VReplicationWorkflowState_Running.String() { // `Workflow Start` sets the new state to Running. However, if stream is still copying tables, we should set @@ -482,6 +602,8 @@ func (tm *TabletManager) UpdateVReplicationWorkflow(ctx context.Context, req *ta state = binlogdatapb.VReplicationWorkflowState_Copying.String() } } + options := getOptionSetString(req.ConfigOverrides) + bindVars = map[string]*querypb.BindVariable{ "st": sqltypes.StringBindVariable(state), "sc": sqltypes.StringBindVariable(string(source)), @@ -489,7 +611,7 @@ func (tm *TabletManager) UpdateVReplicationWorkflow(ctx context.Context, req *ta "tt": sqltypes.StringBindVariable(tabletTypesStr), "id": sqltypes.Int64BindVariable(id), } - parsed = sqlparser.BuildParsedQuery(sqlUpdateVReplicationWorkflowStreamConfig, sidecar.GetIdentifier(), ":st", ":sc", ":cl", ":tt", ":id") + parsed = sqlparser.BuildParsedQuery(sqlUpdateVReplicationWorkflowStreamConfig, sidecar.GetIdentifier(), ":st", ":sc", ":cl", ":tt", options, ":id") stmt, err = parsed.GenerateQuery(bindVars, nil) if err != nil { return nil, err @@ -508,6 +630,51 @@ func (tm *TabletManager) UpdateVReplicationWorkflow(ctx context.Context, req *ta }, nil } +// getOptionSetString takes the option keys passed in and creates a sql clause to update the existing options +// field in the vreplication table. The clause is built using the json_set() for new and updated options +// and json_remove() for deleted options, denoted by an empty value. +func getOptionSetString(config map[string]string) string { + if len(config) == 0 { + return "" + } + + var ( + options string + deletedKeys []string + keys []string + ) + for k, v := range config { + if strings.TrimSpace(v) == "" { + deletedKeys = append(deletedKeys, k) + } else { + keys = append(keys, k) + } + } + sort.Strings(keys) + sort.Strings(deletedKeys) + clause := "options" + if len(deletedKeys) > 0 { + // We need to quote the key in the json functions because flag names can contain hyphens. + clause = fmt.Sprintf("json_remove(options, '$.config.\"%s\"'", deletedKeys[0]) + for _, k := range deletedKeys[1:] { + clause += fmt.Sprintf(", '$.config.\"%s\"'", k) + } + clause += ")" + } + if len(keys) > 0 { + clause = fmt.Sprintf("json_set(%s, '$.config', json_object(), ", clause) + for i, k := range keys { + if i > 0 { + clause += ", " + } + clause += fmt.Sprintf("'$.config.\"%s\"', '%s'", k, strings.TrimSpace(config[k])) + } + clause += ")" + } + options = fmt.Sprintf(", options = %s", clause) + return options +} + // UpdateVReplicationWorkflows operates in much the same way that // UpdateVReplicationWorkflow does, but it allows you to update the // metadata/flow control fields -- state, message, and stop_pos -- for @@ -531,6 +698,42 @@ func (tm *TabletManager) UpdateVReplicationWorkflows(ctx context.Context, req *t }, nil } +// ValidateVReplicationPermissions validates that the --db_filtered_user has +// the minimum permissions required on the sidecardb vreplication table +// needed in order to manage vreplication metadata. +func (tm *TabletManager) ValidateVReplicationPermissions(ctx context.Context, req *tabletmanagerdatapb.ValidateVReplicationPermissionsRequest) (*tabletmanagerdatapb.ValidateVReplicationPermissionsResponse, error) { + query, err := sqlparser.ParseAndBind(sqlValidateVReplicationPermissions, + sqltypes.StringBindVariable(tm.DBConfigs.Filtered.User), + sqltypes.StringBindVariable(sidecar.GetName()), + sqltypes.StringBindVariable(sidecar.GetName()), + ) + if err != nil { + return nil, err + } + conn, err := tm.MysqlDaemon.GetAllPrivsConnection(ctx) + if err != nil { + return nil, err + } + defer conn.Close() + qr, err := conn.ExecuteFetch(query, 1, false) + if err != nil { + return nil, err + } + if len(qr.Rows) != 1 { // Should never happen + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "unexpected response to query %s: expected 1 row with 1 column, got: %+v", + query, qr) + } + val, err := qr.Rows[0][0].ToBool() + if err != nil { // Should never happen + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "unexpected result for query %s: expected boolean-like value, got: %q", + query, qr.Rows[0][0].ToString()) + } + return &tabletmanagerdatapb.ValidateVReplicationPermissionsResponse{ + User: tm.DBConfigs.Filtered.User, + Ok: val, + }, nil +} + // VReplicationExec executes a vreplication command. func (tm *TabletManager) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error) { // Replace any provided sidecar database qualifiers with the correct one. @@ -623,14 +826,16 @@ func (tm *TabletManager) buildUpdateVReplicationWorkflowsQuery(req *tabletmanage if req.GetAllWorkflows() && (len(req.GetIncludeWorkflows()) > 0 || len(req.GetExcludeWorkflows()) > 0) { return "", errAllWithIncludeExcludeWorkflows } - if textutil.ValueIsSimulatedNull(req.GetState()) && textutil.ValueIsSimulatedNull(req.GetMessage()) && textutil.ValueIsSimulatedNull(req.GetStopPosition()) { + if req.State == nil && req.Message == nil && req.StopPosition == nil { return "", errNoFieldsToUpdate } sets := strings.Builder{} predicates := strings.Builder{} // First add the SET clauses. - if !textutil.ValueIsSimulatedNull(req.GetState()) { + // We also need to check for a SimulatedNull here to support older clients and + // smooth upgrades. All non-slice simulated NULL checks can be removed in v22+. + if req.State != nil && *req.State != binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt) { state, ok := binlogdatapb.VReplicationWorkflowState_name[int32(req.GetState())] if !ok { return "", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid state value: %v", req.GetState()) @@ -638,14 +843,18 @@ func (tm *TabletManager) buildUpdateVReplicationWorkflowsQuery(req *tabletmanage sets.WriteString(" state = ") sets.WriteString(sqltypes.EncodeStringSQL(state)) } - if !textutil.ValueIsSimulatedNull(req.GetMessage()) { + // We also need to check for a SimulatedNull here to support older clients and + // smooth upgrades. All non-slice simulated NULL checks can be removed in v22+. + if req.Message != nil && *req.Message != sqltypes.Null.String() { if sets.Len() > 0 { sets.WriteByte(',') } sets.WriteString(" message = ") sets.WriteString(sqltypes.EncodeStringSQL(req.GetMessage())) } - if !textutil.ValueIsSimulatedNull(req.GetStopPosition()) { + // We also need to check for a SimulatedNull here to support older clients and + // smooth upgrades. All non-slice simulated NULL checks can be removed in v22+. + if req.StopPosition != nil && *req.StopPosition != sqltypes.Null.String() { if sets.Len() > 0 { sets.WriteByte(',') } diff --git a/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go b/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go index 7ab959c1e17..0a5bd9f26fd 100644 --- a/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go +++ b/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go @@ -30,11 +30,13 @@ import ( "github.com/stretchr/testify/require" "vitess.io/vitess/go/constants/sidecar" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/sqlescape" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/dbconfigs" + "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" @@ -42,7 +44,7 @@ import ( "vitess.io/vitess/go/vt/vtctl/workflow" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vtgate/vindexes" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" @@ -79,6 +81,7 @@ const ( readWorkflow = "select id, source, pos, stop_pos, max_tps, max_replication_lag, cell, tablet_types, time_updated, transaction_timestamp, state, message, db_name, rows_copied, tags, time_heartbeat, workflow_type, time_throttled, component_throttled, workflow_sub_type, defer_secondary_keys, options from _vt.vreplication where workflow = '%s' and db_name = '%s'" readWorkflowConfig = "select id, source, cell, tablet_types, state, message from _vt.vreplication where workflow = '%s'" updateWorkflow = "update _vt.vreplication set state = '%s', source = '%s', cell = '%s', tablet_types = '%s' where id in (%d)" + getNonEmptyTableQuery = "select 1 from `%s` limit 1" ) var ( @@ -94,8 +97,13 @@ var ( }, } position = fmt.Sprintf("%s/%s", gtidFlavor, gtidPosition) - setNetReadTimeout = fmt.Sprintf("set @@session.net_read_timeout = %v", vttablet.VReplicationNetReadTimeout) - setNetWriteTimeout = fmt.Sprintf("set @@session.net_write_timeout = %v", vttablet.VReplicationNetWriteTimeout) + setNetReadTimeout = fmt.Sprintf("set @@session.net_read_timeout = %v", vttablet.GetVReplicationNetReadTimeout()) + setNetWriteTimeout = fmt.Sprintf("set @@session.net_write_timeout = %v", vttablet.GetVReplicationNetWriteTimeout()) + inOrder = tabletmanagerdatapb.TabletSelectionPreference_INORDER + running = binlogdatapb.VReplicationWorkflowState_Running + stopped = binlogdatapb.VReplicationWorkflowState_Stopped + exec = binlogdatapb.OnDDLAction_EXEC + execIgnore = binlogdatapb.OnDDLAction_EXEC_IGNORE ) // TestCreateVReplicationWorkflow tests the query generated @@ -278,9 +286,11 @@ func TestCreateVReplicationWorkflow(t *testing.T) { // This is our expected query, which will also short circuit // the test with an error as at this point we've tested what // we wanted to test. - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + targetTablet.vrdbClient.AddInvariant(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + for _, table := range tt.schema.TableDefinitions { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.Name), &sqltypes.Result{}) + } targetTablet.vrdbClient.ExpectRequest(tt.query, &sqltypes.Result{}, errShortCircuit) _, err := ws.MoveTablesCreate(ctx, tt.req) tenv.tmc.tablets[targetTabletUID].vrdbClient.Wait() @@ -289,12 +299,13 @@ func TestCreateVReplicationWorkflow(t *testing.T) { } } -// TestMoveTables tests the query sequence originating from a +// TestMoveTablesUnsharded tests the query sequence originating from a // VtctldServer MoveTablesCreate request to ensure that the // VReplication stream(s) are created correctly and expected // results returned. Followed by ensuring that SwitchTraffic // and ReverseTraffic also work as expected. -func TestMoveTables(t *testing.T) { +func TestMoveTablesUnsharded(t *testing.T) { + t.Skip("Skipping test temporarily as it is flaky on CI, pending investigation") ctx, cancel := context.WithCancel(context.Background()) defer cancel() sourceKs := "sourceks" @@ -318,10 +329,8 @@ func TestMoveTables(t *testing.T) { sourceTablet := tenv.addTablet(t, sourceTabletUID, sourceKs, sourceShard) defer tenv.deleteTablet(sourceTablet.tablet) - targetShards["-80"] = tenv.addTablet(t, 300, targetKs, "-80") - defer tenv.deleteTablet(targetShards["-80"].tablet) - targetShards["80-"] = tenv.addTablet(t, 310, targetKs, "80-") - defer tenv.deleteTablet(targetShards["80-"].tablet) + targetShards["0"] = tenv.addTablet(t, 300, targetKs, "0") + defer tenv.deleteTablet(targetShards["0"].tablet) globalTablet := tenv.addTablet(t, 500, globalKs, globalShard) defer tenv.deleteTablet(globalTablet.tablet) @@ -387,39 +396,39 @@ func TestMoveTables(t *testing.T) { tenv.tmc.SetSchema(defaultSchema) tenv.tmc.setVReplicationExecResults(sourceTablet.tablet, checkForJournal, &sqltypes.Result{}) - for _, ftc := range targetShards { + log.Infof("Testing target shard %s", ftc.tablet.Alias) addInvariants(ftc.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) getCopyStateQuery := fmt.Sprintf(sqlGetVReplicationCopyStatus, sidecar.GetIdentifier(), vreplID) ftc.vrdbClient.AddInvariant(getCopyStateQuery, &sqltypes.Result{}) tenv.tmc.setVReplicationExecResults(ftc.tablet, getCopyState, &sqltypes.Result{}) ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) - insert := fmt.Sprintf(`%s values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1 where in_keyrange(id, \'%s.hash\', \'%s\')"}}', '', 0, 0, '%s', 'primary,replica,rdonly', now(), 0, 'Stopped', '%s', %d, 0, 0, '{}')`, - insertVReplicationPrefix, wf, sourceKs, sourceShard, targetKs, ftc.tablet.Shard, tenv.cells[0], tenv.dbName, vreplID) + insert := fmt.Sprintf(`%s values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1"}}', '', 0, 0, '%s', 'primary,replica,rdonly', now(), 0, 'Stopped', '%s', %d, 0, 0, '{}')`, + insertVReplicationPrefix, wf, sourceKs, sourceShard, tenv.cells[0], tenv.dbName, vreplID) ftc.vrdbClient.ExpectRequest(insert, &sqltypes.Result{InsertID: 1}, nil) ftc.vrdbClient.ExpectRequest(getAutoIncrementStep, &sqltypes.Result{}, nil) ftc.vrdbClient.ExpectRequest(fmt.Sprintf(getVReplicationRecord, vreplID), sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source", - "int64|varchar", + "id|source|options", + "int64|varchar|varchar", ), - fmt.Sprintf("%d|%s", vreplID, bls), + fmt.Sprintf("%d|%s|{}", vreplID, bls), ), nil) - ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + ftc.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", - "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", ), - fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Stopped||%s|1||0|0|0||0|1", vreplID, bls, position, targetKs), - ), nil) - ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Stopped||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) + ftc.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", - "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", ), - fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Stopped||%s|1||0|0|0||0|1", vreplID, bls, position, targetKs), - ), nil) + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Stopped||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflowConfig, wf), sqltypes.MakeTestResult( sqltypes.MakeTestFields( "id|source|cell|tablet_types|state|message", @@ -432,31 +441,280 @@ func TestMoveTables(t *testing.T) { ftc.vrdbClient.ExpectRequest(fmt.Sprintf(getVReplicationRecord, vreplID), sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source", - "int64|varchar", + "id|source|options", + "int64|varchar|varchar", ), - fmt.Sprintf("%d|%s", vreplID, bls), + fmt.Sprintf("%d|%s|{}", vreplID, bls), ), nil) - ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflowsLimited, tenv.dbName, wf), sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", - "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + "workflow|id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "workflow|int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", ), - fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", vreplID, bls, position, targetKs), + fmt.Sprintf("%s|%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", wf, vreplID, bls, position, targetKs), ), nil) - ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflowsLimited, tenv.dbName, wf), sqltypes.MakeTestResult( + tenv.tmc.setVReplicationExecResults(ftc.tablet, fmt.Sprintf(getLatestCopyState, vreplID, vreplID), &sqltypes.Result{}) + } + + // We use the tablet's UID in the mocked results for the max value used on each target shard. + nextSeqVal := int(float64(targetShards["0"].tablet.Alias.Uid)) + 1 + tenv.tmc.setVReplicationExecResults(globalTablet.tablet, + sqlparser.BuildParsedQuery(initSequenceTable, sqlescape.EscapeID(fmt.Sprintf("vt_%s", globalKs)), sqlescape.EscapeID("t1_seq"), nextSeqVal, nextSeqVal, nextSeqVal).Query, + &sqltypes.Result{RowsAffected: 0}, + ) + + _, err = ws.MoveTablesCreate(ctx, &vtctldatapb.MoveTablesCreateRequest{ + SourceKeyspace: sourceKs, + TargetKeyspace: targetKs, + Workflow: wf, + TabletTypes: tabletTypes, + Cells: tenv.cells, + AllTables: true, + AutoStart: true, + }) + require.NoError(t, err) + + for _, ftc := range targetShards { + ftc.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "workflow|id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", - "workflow|int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", ), - fmt.Sprintf("%s|%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", wf, vreplID, bls, position, targetKs), - ), nil) - ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) + ftc.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflowsLimited, tenv.dbName, wf), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "workflow|id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "workflow|int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%s|%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", wf, vreplID, bls, position, targetKs), + )) + ftc.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) + ftc.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) + } + + _, err = ws.WorkflowSwitchTraffic(ctx, &vtctldatapb.WorkflowSwitchTrafficRequest{ + Keyspace: targetKs, + Workflow: wf, + Cells: tenv.cells, + MaxReplicationLagAllowed: &vttimepb.Duration{Seconds: 922337203}, + EnableReverseReplication: true, + InitializeTargetSequences: true, + Direction: int32(workflow.DirectionForward), + }) + require.NoError(t, err) + for _, ftc := range targetShards { + ftc.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( sqltypes.MakeTestFields( "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", ), fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", vreplID, bls, position, targetKs), + )) + } + addInvariants(sourceTablet.vrdbClient, vreplID, sourceTabletUID, position, workflow.ReverseWorkflowName(wf), tenv.cells[0]) + sourceTablet.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflow, workflow.ReverseWorkflowName(wf), tenv.dbName), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", vreplID, bls, position, sourceKs), + )) + sourceTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflowsLimited, tenv.dbName, workflow.ReverseWorkflowName(wf)), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "workflow|id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", + "workflow|int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + ), + fmt.Sprintf("%s|%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", workflow.ReverseWorkflowName(wf), vreplID, bls, position, sourceKs), + ), nil) + sourceTablet.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", vreplID, bls, position, sourceKs), + )) + + _, err = ws.WorkflowSwitchTraffic(ctx, &vtctldatapb.WorkflowSwitchTrafficRequest{ + Keyspace: targetKs, + Workflow: wf, + Cells: tenv.cells, + MaxReplicationLagAllowed: &vttimepb.Duration{Seconds: 922337203}, + EnableReverseReplication: true, + Direction: int32(workflow.DirectionBackward), + }) + require.NoError(t, err) +} + +// TestMoveTablesSharded tests the query sequence originating from a +// VtctldServer MoveTablesCreate request to ensure that the +// VReplication stream(s) are created correctly and expected +// results returned. Followed by ensuring that SwitchTraffic +// and ReverseTraffic also work as expected. +func TestMoveTablesSharded(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + sourceKs := "sourceks" + sourceTabletUID := 200 + targetKs := "targetks" + targetShards := make(map[string]*fakeTabletConn) + sourceShard := "0" + globalKs := "global" + globalShard := "0" + wf := "testwf" + vreplID := 1 + tabletTypes := []topodatapb.TabletType{ + topodatapb.TabletType_PRIMARY, + topodatapb.TabletType_REPLICA, + topodatapb.TabletType_RDONLY, + } + + tenv := newTestEnv(t, ctx, sourceKs, []string{sourceShard}) + defer tenv.close() + + sourceTablet := tenv.addTablet(t, sourceTabletUID, sourceKs, sourceShard) + defer tenv.deleteTablet(sourceTablet.tablet) + + targetShards["-80"] = tenv.addTablet(t, 300, targetKs, "-80") + defer tenv.deleteTablet(targetShards["-80"].tablet) + targetShards["80-"] = tenv.addTablet(t, 310, targetKs, "80-") + defer tenv.deleteTablet(targetShards["80-"].tablet) + + globalTablet := tenv.addTablet(t, 500, globalKs, globalShard) + defer tenv.deleteTablet(globalTablet.tablet) + + err := tenv.ts.SaveVSchema(ctx, globalKs, &vschemapb.Keyspace{ + Sharded: false, + Tables: map[string]*vschemapb.Table{ + "t1_seq": { + Type: vindexes.TypeSequence, + }, + }, + }) + require.NoError(t, err) + err = tenv.ts.SaveVSchema(ctx, targetKs, &vschemapb.Keyspace{ + Sharded: true, + Vindexes: map[string]*vschemapb.Vindex{ + "hash": { + Type: "hash", + }, + }, + Tables: map[string]*vschemapb.Table{ + "t1": { + ColumnVindexes: []*vschemapb.ColumnVindex{{ + Column: "id", + Name: "hash", + }}, + AutoIncrement: &vschemapb.AutoIncrement{ + Column: "id", + Sequence: "t1_seq", + }, + }, + }, + }) + require.NoError(t, err) + + ws := workflow.NewServer(vtenv.NewTestEnv(), tenv.ts, tenv.tmc) + + idQuery, err := sqlparser.ParseAndBind("select id from _vt.vreplication where id = %a", + sqltypes.Int64BindVariable(int64(vreplID))) + require.NoError(t, err) + idRes := sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id", + "int64", + ), + fmt.Sprintf("%d", vreplID), + ) + + tenv.mysqld.Schema = defaultSchema + tenv.mysqld.Schema.DatabaseSchema = tenv.dbName + tenv.mysqld.FetchSuperQueryMap = make(map[string]*sqltypes.Result) + tenv.mysqld.FetchSuperQueryMap[`select character_set_name, collation_name, column_name, data_type, column_type, extra from information_schema.columns where .*`] = sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "character_set_name|collation_name|column_name|data_type|column_type|extra", + "varchar|varchar|varchar|varchar|varchar|varchar", + ), + "NULL|NULL|id|bigint|bigint|", + "NULL|NULL|c2|bigint|bigint|", + ) + + bls := fmt.Sprintf("keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"t1\" filter:\"select * from t1\"}}", sourceKs, sourceShard) + + tenv.tmc.SetSchema(defaultSchema) + + tenv.tmc.setVReplicationExecResults(sourceTablet.tablet, checkForJournal, &sqltypes.Result{}) + for _, ftc := range targetShards { + log.Infof("Testing target shard %s", ftc.tablet.Alias) + addInvariants(ftc.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) + getCopyStateQuery := fmt.Sprintf(sqlGetVReplicationCopyStatus, sidecar.GetIdentifier(), vreplID) + ftc.vrdbClient.AddInvariant(getCopyStateQuery, &sqltypes.Result{}) + tenv.tmc.setVReplicationExecResults(ftc.tablet, getCopyState, &sqltypes.Result{}) + ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range defaultSchema.TableDefinitions { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.Name), &sqltypes.Result{}) + } + insert := fmt.Sprintf(`%s values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1 where in_keyrange(id, \'%s.hash\', \'%s\')"}}', '', 0, 0, '%s', 'primary,replica,rdonly', now(), 0, 'Stopped', '%s', %d, 0, 0, '{}')`, + insertVReplicationPrefix, wf, sourceKs, sourceShard, targetKs, ftc.tablet.Shard, tenv.cells[0], tenv.dbName, vreplID) + ftc.vrdbClient.ExpectRequest(insert, &sqltypes.Result{InsertID: 1}, nil) + ftc.vrdbClient.ExpectRequest(getAutoIncrementStep, &sqltypes.Result{}, nil) + ftc.vrdbClient.ExpectRequest(fmt.Sprintf(getVReplicationRecord, vreplID), + sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|options", + "int64|varchar|varchar", + ), + fmt.Sprintf("%d|%s|{}", vreplID, bls), + ), nil) + ftc.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Stopped||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) + ftc.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Stopped||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) + ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflowConfig, wf), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|cell|tablet_types|state|message", + "int64|blob|varchar|varchar|varchar|varchar", + ), + fmt.Sprintf("%d|%s|||Stopped|", vreplID, bls), + ), nil) + ftc.vrdbClient.ExpectRequest(idQuery, idRes, nil) + ftc.vrdbClient.ExpectRequest(fmt.Sprintf(updateWorkflow, binlogdatapb.VReplicationWorkflowState_Running.String(), bls, "", "", vreplID), &sqltypes.Result{}, nil) + ftc.vrdbClient.ExpectRequest(fmt.Sprintf(getVReplicationRecord, vreplID), + sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|options", + "int64|varchar|varchar", + ), + fmt.Sprintf("%d|%s|{}", vreplID, bls), + ), nil) + ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflowsLimited, tenv.dbName, wf), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "workflow|id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "workflow|int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%s|%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", wf, vreplID, bls, position, targetKs), ), nil) tenv.tmc.setVReplicationExecResults(ftc.tablet, fmt.Sprintf(getLatestCopyState, vreplID, vreplID), &sqltypes.Result{}) } @@ -478,22 +736,35 @@ func TestMoveTables(t *testing.T) { AutoStart: true, }) require.NoError(t, err) - for _, ftc := range targetShards { - ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflowsLimited, tenv.dbName, wf), sqltypes.MakeTestResult( + ftc.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "workflow|id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", - "workflow|int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", ), - fmt.Sprintf("%s|%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", wf, vreplID, bls, position, targetKs), - ), nil) - ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) + ftc.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflowsLimited, tenv.dbName, wf), sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", - "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + "workflow|id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "workflow|int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", ), - fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", vreplID, bls, position, targetKs), - ), nil) + fmt.Sprintf("%s|%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", wf, vreplID, bls, position, targetKs), + )) + ftc.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) + ftc.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) } _, err = ws.WorkflowSwitchTraffic(ctx, &vtctldatapb.WorkflowSwitchTrafficRequest{ @@ -506,7 +777,6 @@ func TestMoveTables(t *testing.T) { Direction: int32(workflow.DirectionForward), }) require.NoError(t, err) - for _, ftc := range targetShards { ftc.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( sqltypes.MakeTestFields( @@ -524,13 +794,13 @@ func TestMoveTables(t *testing.T) { ), fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", vreplID, bls, position, sourceKs), ), nil) - sourceTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflowsLimited, tenv.dbName, workflow.ReverseWorkflowName(wf)), sqltypes.MakeTestResult( + sourceTablet.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflowsLimited, tenv.dbName, workflow.ReverseWorkflowName(wf)), sqltypes.MakeTestResult( sqltypes.MakeTestFields( "workflow|id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", "workflow|int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", ), fmt.Sprintf("%s|%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1", workflow.ReverseWorkflowName(wf), vreplID, bls, position, sourceKs), - ), nil) + )) sourceTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, wf, tenv.dbName), &sqltypes.Result{}, nil) _, err = ws.WorkflowSwitchTraffic(ctx, &vtctldatapb.WorkflowSwitchTrafficRequest{ @@ -544,6 +814,51 @@ func TestMoveTables(t *testing.T) { require.NoError(t, err) } +func TestGetOptionSetString(t *testing.T) { + tests := []struct { + name string + config map[string]string + want string + }{ + { + name: "nil config", + config: nil, + want: "", + }, + { + name: "empty params", + config: map[string]string{}, + want: "", + }, + { + name: "valid params", + config: map[string]string{ + "password": "secret", + "user": "admin", + }, + want: ", options = json_set(options, '$.config', json_object(), '$.config.\"password\"', 'secret', '$.config.\"user\"', 'admin')", + }, + { + name: "valid params, deleting two", + config: map[string]string{ + "password": "secret", + "user": "admin", + "port": "", + "host": "", + }, + want: ", options = json_set(json_remove(options, '$.config.\"host\"', '$.config.\"port\"'), '$.config', json_object(), '$.config.\"password\"', 'secret', '$.config.\"user\"', 'admin')", + }, + // Additional tests for handling escaping errors or complex scenarios can be added here + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getOptionSetString(tt.config) + require.Equal(t, tt.want, got) + }) + } +} + func TestUpdateVReplicationWorkflow(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -605,7 +920,6 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { name: "update cells", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, - State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), Cells: []string{"zone2"}, // TabletTypes is an empty value, so the current value should be cleared }, @@ -616,9 +930,8 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { name: "update cells, NULL tablet_types", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, - State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), Cells: []string{"zone3"}, - TabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, // So keep the current value of replica + TabletTypes: textutil.SimulatedNullTabletTypeSlice, // So keep the current value of replica }, query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, keyspace, shard, "zone3", tabletTypes[0], vreplID), @@ -627,8 +940,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { name: "update tablet_types", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, - State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), - TabletSelectionPreference: tabletmanagerdatapb.TabletSelectionPreference_INORDER, + TabletSelectionPreference: &inOrder, TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY, topodatapb.TabletType_REPLICA}, }, query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '', tablet_types = '%s' where id in (%d)`, @@ -638,7 +950,6 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { name: "update tablet_types, NULL cells", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, - State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), Cells: textutil.SimulatedNullStringSlice, // So keep the current value of zone1 TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY}, }, @@ -649,8 +960,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { name: "update on_ddl", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, - State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), - OnDdl: binlogdatapb.OnDDLAction_EXEC, + OnDdl: &exec, }, query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}} on_ddl:%s', cell = '', tablet_types = '' where id in (%d)`, keyspace, shard, binlogdatapb.OnDDLAction_EXEC.String(), vreplID), @@ -659,10 +969,9 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { name: "update cell,tablet_types,on_ddl", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, - State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), Cells: []string{"zone1", "zone2", "zone3"}, TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY, topodatapb.TabletType_REPLICA, topodatapb.TabletType_PRIMARY}, - OnDdl: binlogdatapb.OnDDLAction_EXEC_IGNORE, + OnDdl: &execIgnore, }, query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}} on_ddl:%s', cell = '%s', tablet_types = '%s' where id in (%d)`, keyspace, shard, binlogdatapb.OnDDLAction_EXEC_IGNORE.String(), "zone1,zone2,zone3", "rdonly,replica,primary", vreplID), @@ -671,10 +980,9 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { name: "update state", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, - State: binlogdatapb.VReplicationWorkflowState_Stopped, + State: &stopped, Cells: textutil.SimulatedNullStringSlice, - TabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, - OnDdl: binlogdatapb.OnDDLAction(textutil.SimulatedNullInt), + TabletTypes: textutil.SimulatedNullTabletTypeSlice, }, query: fmt.Sprintf(`update _vt.vreplication set state = '%s', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, binlogdatapb.VReplicationWorkflowState_Stopped.String(), keyspace, shard, cells[0], tabletTypes[0], vreplID), @@ -683,15 +991,27 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { name: "update to running while copying", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, - State: binlogdatapb.VReplicationWorkflowState_Running, + State: &running, Cells: textutil.SimulatedNullStringSlice, - TabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, - OnDdl: binlogdatapb.OnDDLAction(textutil.SimulatedNullInt), + TabletTypes: textutil.SimulatedNullTabletTypeSlice, }, isCopying: true, query: fmt.Sprintf(`update _vt.vreplication set state = 'Copying', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, keyspace, shard, cells[0], tabletTypes[0], vreplID), }, + { + name: "update cells and options", + request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: workflow, + Cells: []string{"zone2"}, + ConfigOverrides: map[string]string{ + "user": "admin", + "password": "secret", + }, + }, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:"%s" shard:"%s" filter:{rules:{match:"corder" filter:"select * from corder"} rules:{match:"customer" filter:"select * from customer"}}', cell = '%s', tablet_types = '', options = json_set(options, '$.config', json_object(), '$.config."password"', 'secret', '$.config."user"', 'admin') where id in (%d)`, + keyspace, shard, "zone2", vreplID), + }, } for _, tt := range tests { @@ -700,7 +1020,9 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { // which doesn't play well with subtests. defer func() { if err := recover(); err != nil { - t.Errorf("Recovered from panic: %v", err) + log.Infof("Got panic in test: %v", err) + log.Flush() + t.Errorf("Recovered from panic: %v, stack: %s", err, debug.Stack()) } }() @@ -710,8 +1032,7 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { // These are the same for each RPC call. tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(selectQuery, selectRes, nil) - if tt.request.State == binlogdatapb.VReplicationWorkflowState_Running || - tt.request.State == binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt) { + if tt.request.State == nil || *tt.request.State == binlogdatapb.VReplicationWorkflowState_Running { tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) if tt.isCopying { tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(getCopyStateQuery, copying, nil) @@ -756,9 +1077,7 @@ func TestUpdateVReplicationWorkflows(t *testing.T) { name: "update only state=running for all workflows", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ AllWorkflows: true, - State: binlogdatapb.VReplicationWorkflowState_Running, - Message: textutil.SimulatedNullString, - StopPosition: textutil.SimulatedNullString, + State: &running, }, query: fmt.Sprintf(`update /*vt+ ALLOW_UNSAFE_VREPLICATION_WRITE */ _vt.vreplication set state = 'Running' where id in (%s)`, strings.Join(vreplIDs, ", ")), }, @@ -766,9 +1085,7 @@ func TestUpdateVReplicationWorkflows(t *testing.T) { name: "update only state=running for all but reverse workflows", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ ExcludeWorkflows: []string{workflow.ReverseWorkflowName("testwf")}, - State: binlogdatapb.VReplicationWorkflowState_Running, - Message: textutil.SimulatedNullString, - StopPosition: textutil.SimulatedNullString, + State: &running, }, query: fmt.Sprintf(`update /*vt+ ALLOW_UNSAFE_VREPLICATION_WRITE */ _vt.vreplication set state = 'Running' where id in (%s)`, strings.Join(vreplIDs, ", ")), }, @@ -776,9 +1093,9 @@ func TestUpdateVReplicationWorkflows(t *testing.T) { name: "update all vals for all workflows", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ AllWorkflows: true, - State: binlogdatapb.VReplicationWorkflowState_Running, - Message: "hi", - StopPosition: position, + State: &running, + Message: ptr.Of("hi"), + StopPosition: &position, }, query: fmt.Sprintf(`update /*vt+ ALLOW_UNSAFE_VREPLICATION_WRITE */ _vt.vreplication set state = 'Running', message = 'hi', stop_pos = '%s' where id in (%s)`, position, strings.Join(vreplIDs, ", ")), }, @@ -786,9 +1103,7 @@ func TestUpdateVReplicationWorkflows(t *testing.T) { name: "update state=stopped, messege=for vdiff for two workflows", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ IncludeWorkflows: []string{"testwf", "testwf2"}, - State: binlogdatapb.VReplicationWorkflowState_Running, - Message: textutil.SimulatedNullString, - StopPosition: textutil.SimulatedNullString, + State: &running, }, query: fmt.Sprintf(`update /*vt+ ALLOW_UNSAFE_VREPLICATION_WRITE */ _vt.vreplication set state = 'Running' where id in (%s)`, strings.Join(vreplIDs, ", ")), }, @@ -1020,9 +1335,12 @@ func TestSourceShardSelection(t *testing.T) { } for uid, streams := range tt.streams { - tt := targetTablets[uid] - tt.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) - tt.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + targetTablet := targetTablets[uid] + targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range tt.schema.TableDefinitions { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.Name), &sqltypes.Result{}) + } for i, sourceShard := range streams { var err error if i == len(streams)-1 { @@ -1031,25 +1349,26 @@ func TestSourceShardSelection(t *testing.T) { // everything we wanted to in the test. err = errShortCircuit } - tt.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) - tt.vrdbClient.ExpectRequest( + targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + targetTablet.vrdbClient.ExpectRequest( fmt.Sprintf(`%s values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1 where in_keyrange(id, \'%s.hash\', \'%s\')"}}', '', 0, 0, '%s', '', now(), 0, 'Stopped', '%s', 1, 0, 0, '{}')`, - insertVReplicationPrefix, wf, sourceKs, sourceShard, targetKs, tt.tablet.Shard, tenv.cells[0], tenv.dbName), + insertVReplicationPrefix, wf, sourceKs, sourceShard, targetKs, targetTablet.tablet.Shard, tenv.cells[0], tenv.dbName), &sqltypes.Result{InsertID: uint64(i + 1)}, err, ) if errors.Is(err, errShortCircuit) { break } - tt.vrdbClient.ExpectRequest(getAutoIncrementStep, &sqltypes.Result{}, nil) - tt.vrdbClient.ExpectRequest( + targetTablet.vrdbClient.ExpectRequest(getAutoIncrementStep, &sqltypes.Result{}, nil) + targetTablet.vrdbClient.ExpectRequest( fmt.Sprintf("select * from _vt.vreplication where id = %d", uint64(i+1)), sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source|state", - "int64|varchar|varchar", + "id|source|state|options", + "int64|varchar|varchar|varchar", ), - fmt.Sprintf("%d|%s|Stopped", uint64(i+1), fmt.Sprintf(`keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1 where in_keyrange(id, '%s.hash', '%s')"}}`, sourceKs, sourceShard, targetKs, tt.tablet.Shard)), + fmt.Sprintf("%d|%s|Stopped|{}", uint64(i+1), fmt.Sprintf(`keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1 where in_keyrange(id, '%s.hash', '%s')"}}`, + sourceKs, sourceShard, targetKs, targetTablet.tablet.Shard)), ), nil, ) @@ -1112,8 +1431,10 @@ func TestFailedMoveTablesCreateCleanup(t *testing.T) { require.NoError(t, err, "failed to save routing rules") addInvariants(targetTablet.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) - tenv.tmc.tablets[targetTabletUID].vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range defaultSchema.TableDefinitions { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.Name), &sqltypes.Result{}) + } targetTablet.vrdbClient.ExpectRequest( fmt.Sprintf("%s %s", insertVReplicationPrefix, @@ -1130,22 +1451,28 @@ func TestFailedMoveTablesCreateCleanup(t *testing.T) { targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(getVReplicationRecord, vreplID), sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source", - "int64|varchar", + "id|source|options", + "int64|varchar|varchar", ), - fmt.Sprintf("%d|%s", vreplID, bls), + fmt.Sprintf("%d|%s|{}", vreplID, bls), ), nil, ) + targetTablet.vrdbClient.AddInvariant(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Stopped||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readWorkflow, wf, tenv.dbName), sqltypes.MakeTestResult( + targetTablet.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys", - "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64", + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", ), - fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Stopped||%s|1||0|0|0||0|1", vreplID, bls, position, targetKs), - ), nil) - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(insertStreamsCreatedLog, bls), &sqltypes.Result{}, nil) + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Stopped||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) tenv.tmc.setVReplicationExecResults(targetTablet.tablet, fmt.Sprintf("select convert_tz('2006-01-02 15:04:05', '%s', 'UTC')", invalidTimeZone), @@ -1172,7 +1499,6 @@ func TestFailedMoveTablesCreateCleanup(t *testing.T) { // Save the current target vschema. vs, err := tenv.ts.GetVSchema(ctx, targetKs) require.NoError(t, err, "failed to get target vschema") - _, err = ws.MoveTablesCreate(ctx, &vtctldatapb.MoveTablesCreateRequest{ Workflow: wf, SourceKeyspace: sourceKs, @@ -1394,8 +1720,11 @@ func TestReadVReplicationWorkflows(t *testing.T) { require.NotNil(t, tt.req, "No request provided") if !tt.wantErr { // Errors we're testing for occur before executing any queries. - tablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + tablet.vrdbClient.AddInvariant(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}) tablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, tt.wantPreds), &sqltypes.Result{}, nil) + for _, table := range defaultSchema.TableDefinitions { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.Name), &sqltypes.Result{}) + } } _, err := tenv.tmc.ReadVReplicationWorkflows(ctx, tablet.tablet, tt.req) @@ -1451,6 +1780,7 @@ func addInvariants(dbClient *binlogplayer.MockDBClient, vreplID, sourceTabletUID "0", )) dbClient.AddInvariant(fmt.Sprintf(updatePickedSourceTablet, cell, sourceTabletUID, vreplID), &sqltypes.Result{}) + } func addMaterializeSettingsTablesToSchema(ms *vtctldatapb.MaterializeSettings, tenv *testEnv, venv *vtenv.Environment) { @@ -1560,22 +1890,22 @@ func TestExternalizeLookupVindex(t *testing.T) { trxTS := fmt.Sprintf("%d", time.Now().Unix()) fields := sqltypes.MakeTestFields( - "id|state|message|source|workflow_type|workflow_sub_type|max_tps|max_replication_lag|time_updated|time_heartbeat|time_throttled|transaction_timestamp|rows_copied", - "int64|varbinary|varbinary|blob|int64|int64|int64|int64|int64|int64|int64|int64|int64", + "id|state|message|source|workflow_type|workflow_sub_type|max_tps|max_replication_lag|time_updated|time_heartbeat|time_throttled|transaction_timestamp|rows_copied|options", + "int64|varbinary|varbinary|blob|int64|int64|int64|int64|int64|int64|int64|int64|int64|varchar", ) wftype := fmt.Sprintf("%d", binlogdatapb.VReplicationWorkflowType_CreateLookupIndex) ownedSourceStopAfterCopy := fmt.Sprintf(`keyspace:"%s",shard:"0",filter:{rules:{match:"owned_lookup" filter:"select * from t1 where in_keyrange(col1, '%s.xxhash', '-80')"}} stop_after_copy:true`, ms.SourceKeyspace, ms.SourceKeyspace) ownedSourceKeepRunningAfterCopy := fmt.Sprintf(`keyspace:"%s",shard:"0",filter:{rules:{match:"owned_lookup" filter:"select * from t1 where in_keyrange(col1, '%s.xxhash', '-80')"}}`, ms.SourceKeyspace, ms.SourceKeyspace) - ownedRunning := sqltypes.MakeTestResult(fields, "1|Running|msg|"+ownedSourceKeepRunningAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5") - ownedStopped := sqltypes.MakeTestResult(fields, "1|Stopped|Stopped after copy|"+ownedSourceStopAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5") + ownedRunning := sqltypes.MakeTestResult(fields, "1|Running|msg|"+ownedSourceKeepRunningAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5|{}") + ownedStopped := sqltypes.MakeTestResult(fields, "1|Stopped|Stopped after copy|"+ownedSourceStopAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5|{}") unownedSourceStopAfterCopy := fmt.Sprintf(`keyspace:"%s",shard:"0",filter:{rules:{match:"unowned_lookup" filter:"select * from t1 where in_keyrange(col1, '%s.xxhash', '-80')"}} stop_after_copy:true`, ms.SourceKeyspace, ms.SourceKeyspace) unownedSourceKeepRunningAfterCopy := fmt.Sprintf(`keyspace:"%s",shard:"0",filter:{rules:{match:"unowned_lookup" filter:"select * from t1 where in_keyrange(col1, '%s.xxhash', '-80')"}}`, ms.SourceKeyspace, ms.SourceKeyspace) - unownedRunning := sqltypes.MakeTestResult(fields, "2|Running|msg|"+unownedSourceKeepRunningAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5") - unownedStopped := sqltypes.MakeTestResult(fields, "2|Stopped|Stopped after copy|"+unownedSourceStopAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5") + unownedRunning := sqltypes.MakeTestResult(fields, "2|Running|msg|"+unownedSourceKeepRunningAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5|{}") + unownedStopped := sqltypes.MakeTestResult(fields, "2|Stopped|Stopped after copy|"+unownedSourceStopAfterCopy+"|"+wftype+"|0|0|0|0|0|0|"+trxTS+"|5|{}") testcases := []struct { request *vtctldatapb.LookupVindexExternalizeRequest @@ -1785,9 +2115,11 @@ func TestMaterializerOneToOne(t *testing.T) { addMaterializeSettingsTablesToSchema(ms, tenv, vtenv) - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + targetTablet.vrdbClient.AddInvariant(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } // This is our expected query, which will also short circuit // the test with an error as at this point we've tested what @@ -1849,6 +2181,9 @@ func TestMaterializerManyToOne(t *testing.T) { addMaterializeSettingsTablesToSchema(ms, tenv, vtenv) targetTablet.vrdbClient.AddInvariant("update _vt.vreplication set message='no schema defined' where id=1", &sqltypes.Result{}) // If the first workflow controller progresses ... targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } // This is our expected query, which will also short circuit // the test with an error as at this point we've tested what @@ -1861,6 +2196,13 @@ func TestMaterializerManyToOne(t *testing.T) { fmt.Sprintf(` values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1"} rules:{match:"t2" filter:"select * from t3"}}', '', 0, 0, '%s', 'primary,rdonly', now(), 0, 'Stopped', '%s', 0, 0, 0, '{}')`, wf, sourceKs, sourceShard, tenv.cells[0], tenv.dbName) if vreplID == 1 { + targetTablet.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) targetTablet.vrdbClient.ExpectRequest(insert, &sqltypes.Result{InsertID: uint64(vreplID)}, nil) targetTablet.vrdbClient.ExpectRequest(getAutoIncrementStep, &sqltypes.Result{}, nil) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(getVReplicationRecord, vreplID), @@ -1950,12 +2292,22 @@ func TestMaterializerOneToMany(t *testing.T) { addInvariants(targetTablet.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) targetTablet.vrdbClient.AddInvariant("update _vt.vreplication set message='no schema defined' where id=1", &sqltypes.Result{}) // If the first workflow controller progresses ... targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } bls := fmt.Sprintf("keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"t1\" filter:\"select * from t1 where in_keyrange(c1, '%s.xxhash', '%s')\"}}", sourceKs, sourceShard, targetKs, targetShard) insert := insertVReplicationPrefix + fmt.Sprintf(` values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1 where in_keyrange(c1, \'%s.xxhash\', \'%s\')"}}', '', 0, 0, '%s', 'primary,rdonly', now(), 0, 'Stopped', '%s', 0, 0, 0, '{}')`, wf, sourceKs, sourceShard, targetKs, targetShard, tenv.cells[0], tenv.dbName) + targetTablet.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) if targetShard == "-80" { targetTablet.vrdbClient.ExpectRequest(insert, &sqltypes.Result{InsertID: uint64(vreplID)}, nil) targetTablet.vrdbClient.ExpectRequest(getAutoIncrementStep, &sqltypes.Result{}, nil) @@ -2048,14 +2400,25 @@ func TestMaterializerManyToMany(t *testing.T) { targetTablet := targetShards[targetShard] targetTablet.vrdbClient.AddInvariant("update _vt.vreplication set message='no schema defined' where id=1", &sqltypes.Result{}) // If the first workflow controller progresses ... targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } for i, sourceShard := range []string{"-40", "40-"} { // One insert per [binlog]source/stream addInvariants(targetTablet.vrdbClient, vreplID, sourceTabletUID+(i*10), position, wf, tenv.cells[0]) bls := fmt.Sprintf("keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"t1\" filter:\"select * from t1 where in_keyrange(c1, '%s.xxhash', '%s')\"}}", sourceKs, sourceShard, targetKs, targetShard) + insert := insertVReplicationPrefix + fmt.Sprintf(` values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1 where in_keyrange(c1, \'%s.xxhash\', \'%s\')"}}', '', 0, 0, '%s', 'primary,rdonly', now(), 0, 'Stopped', '%s', 0, 0, 0, '{}')`, wf, sourceKs, sourceShard, targetKs, targetShard, tenv.cells[0], tenv.dbName) + targetTablet.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) if targetShard == "80-" && sourceShard == "40-" { // Last insert targetTablet.vrdbClient.ExpectRequest(insert, &sqltypes.Result{InsertID: uint64(vreplID)}, errShortCircuit) } else { // Can't short circuit as we will do more inserts @@ -2151,12 +2514,22 @@ func TestMaterializerMulticolumnVindex(t *testing.T) { addInvariants(targetTablet.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) targetTablet.vrdbClient.AddInvariant("update _vt.vreplication set message='no schema defined' where id=1", &sqltypes.Result{}) // If the first workflow controller progresses ... targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } bls := fmt.Sprintf("keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"t1\" filter:\"select * from t1 where in_keyrange(c1, c2, '%s.region', '%s')\"}}", sourceKs, sourceShard, targetKs, targetShard) insert := insertVReplicationPrefix + fmt.Sprintf(` values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select * from t1 where in_keyrange(c1, c2, \'%s.region\', \'%s\')"}}', '', 0, 0, '%s', 'primary,rdonly', now(), 0, 'Stopped', '%s', 0, 0, 0, '{}')`, wf, sourceKs, sourceShard, targetKs, targetShard, tenv.cells[0], tenv.dbName) + targetTablet.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) if targetShard == "-80" { targetTablet.vrdbClient.ExpectRequest(insert, &sqltypes.Result{InsertID: uint64(vreplID)}, nil) targetTablet.vrdbClient.ExpectRequest(getAutoIncrementStep, &sqltypes.Result{}, nil) @@ -2230,9 +2603,11 @@ func TestMaterializerDeploySchema(t *testing.T) { } } tenv.tmc.tabletSchemas[targetTabletUID] = schema - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + targetTablet.vrdbClient.AddInvariant(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } tenv.tmc.setVReplicationExecResults(targetTablet.tablet, `t2ddl`, &sqltypes.Result{}) // Execute the fake CreateDdl // This is our expected query, which will also short circuit @@ -2301,9 +2676,11 @@ func TestMaterializerCopySchema(t *testing.T) { } } tenv.tmc.tabletSchemas[targetTabletUID] = schema - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + targetTablet.vrdbClient.AddInvariant(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } // This is our expected query, which will also short circuit // the test with an error as at this point we've tested what @@ -2391,12 +2768,22 @@ func TestMaterializerExplicitColumns(t *testing.T) { addInvariants(targetTablet.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) targetTablet.vrdbClient.AddInvariant("update _vt.vreplication set message='no schema defined' where id=1", &sqltypes.Result{}) // If the first workflow controller progresses ... targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } bls := fmt.Sprintf("keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"t1\" filter:\"select c1, c1 + c2, c2 from t1 where in_keyrange(c1, c2, '%s.region', '%s')\"}}", sourceKs, sourceShard, targetKs, targetShard) insert := insertVReplicationPrefix + fmt.Sprintf(` values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select c1, c1 + c2, c2 from t1 where in_keyrange(c1, c2, \'%s.region\', \'%s\')"}}', '', 0, 0, '%s', 'primary,rdonly', now(), 0, 'Stopped', '%s', 0, 0, 0, '{}')`, wf, sourceKs, sourceShard, targetKs, targetShard, tenv.cells[0], tenv.dbName) + targetTablet.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) if targetShard == "-80" { targetTablet.vrdbClient.ExpectRequest(insert, &sqltypes.Result{InsertID: uint64(vreplID)}, nil) targetTablet.vrdbClient.ExpectRequest(getAutoIncrementStep, &sqltypes.Result{}, nil) @@ -2491,12 +2878,22 @@ func TestMaterializerRenamedColumns(t *testing.T) { addInvariants(targetTablet.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) targetTablet.vrdbClient.AddInvariant("update _vt.vreplication set message='no schema defined' where id=1", &sqltypes.Result{}) // If the first workflow controller progresses ... targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } bls := fmt.Sprintf("keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"t1\" filter:\"select c3 as c1, c1 + c2, c4 as c2 from t1 where in_keyrange(c3, c4, '%s.region', '%s')\"}}", sourceKs, sourceShard, targetKs, targetShard) insert := insertVReplicationPrefix + fmt.Sprintf(` values ('%s', 'keyspace:"%s" shard:"%s" filter:{rules:{match:"t1" filter:"select c3 as c1, c1 + c2, c4 as c2 from t1 where in_keyrange(c3, c4, \'%s.region\', \'%s\')"}}', '', 0, 0, '%s', 'primary,rdonly', now(), 0, 'Stopped', '%s', 0, 0, 0, '{}')`, wf, sourceKs, sourceShard, targetKs, targetShard, tenv.cells[0], tenv.dbName) + targetTablet.vrdbClient.AddInvariant(binlogplayer.TestGetWorkflowQueryId1, sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|defer_secondary_keys|options", + "int64|varchar|blob|varchar|int64|int64|varchar|varchar|int64|int64|varchar|varchar|varchar|int64|varchar|int64|int64|int64|varchar|int64|int64|varchar", + ), + fmt.Sprintf("%d|%s|%s|NULL|0|0|||1686577659|0|Running||%s|1||0|0|0||0|1|{}", vreplID, bls, position, targetKs), + )) if targetShard == "-80" { targetTablet.vrdbClient.ExpectRequest(insert, &sqltypes.Result{InsertID: uint64(vreplID)}, nil) targetTablet.vrdbClient.ExpectRequest(getAutoIncrementStep, &sqltypes.Result{}, nil) @@ -2562,9 +2959,11 @@ func TestMaterializerStopAfterCopy(t *testing.T) { addMaterializeSettingsTablesToSchema(ms, tenv, vtenv) - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + targetTablet.vrdbClient.AddInvariant(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) - targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } // This is our expected query, which will also short circuit // the test with an error as at this point we've tested what @@ -2623,6 +3022,9 @@ func TestMaterializerNoTargetVSchema(t *testing.T) { targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } err = ws.Materialize(ctx, ms) targetTablet.vrdbClient.Wait() @@ -2668,6 +3070,9 @@ func TestMaterializerNoDDL(t *testing.T) { tenv.tmc.tabletSchemas[targetTabletUID] = &tabletmanagerdatapb.SchemaDefinition{} targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } err := ws.Materialize(ctx, ms) require.EqualError(t, err, "target table t1 does not exist and there is no create ddl defined") @@ -2765,6 +3170,9 @@ func TestMaterializerTableMismatchNonCopy(t *testing.T) { tenv.tmc.tabletSchemas[targetTabletUID] = &tabletmanagerdatapb.SchemaDefinition{} targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } err := ws.Materialize(ctx, ms) require.EqualError(t, err, "target table t1 does not exist and there is no create ddl defined") @@ -2811,6 +3219,9 @@ func TestMaterializerTableMismatchCopy(t *testing.T) { tenv.tmc.tabletSchemas[targetTabletUID] = &tabletmanagerdatapb.SchemaDefinition{} targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } err := ws.Materialize(ctx, ms) require.EqualError(t, err, "source and target table names must match for copying schema: t2 vs t1") @@ -2853,6 +3264,9 @@ func TestMaterializerNoSourceTable(t *testing.T) { tenv.tmc.tabletSchemas[targetTabletUID] = &tabletmanagerdatapb.SchemaDefinition{} targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } err := ws.Materialize(ctx, ms) require.EqualError(t, err, "source table t1 does not exist") @@ -2901,6 +3315,9 @@ func TestMaterializerSyntaxError(t *testing.T) { tenv.tmc.setVReplicationExecResults(targetTablet.tablet, ms.TableSettings[0].CreateDdl, &sqltypes.Result{}) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } err := ws.Materialize(ctx, ms) require.EqualError(t, err, "syntax error at position 4 near 'bad'") @@ -2949,6 +3366,9 @@ func TestMaterializerNotASelect(t *testing.T) { tenv.tmc.setVReplicationExecResults(targetTablet.tablet, ms.TableSettings[0].CreateDdl, &sqltypes.Result{}) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.GetIdentifier()), &sqltypes.Result{}, nil) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } err := ws.Materialize(ctx, ms) require.EqualError(t, err, "unrecognized statement: update t1 set val=1") @@ -3027,6 +3447,9 @@ func TestMaterializerNoGoodVindex(t *testing.T) { targetTablet := targetShards[targetShard] addInvariants(targetTablet.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } errs = append(errs, errNoVindex) } @@ -3102,6 +3525,9 @@ func TestMaterializerComplexVindexExpression(t *testing.T) { targetTablet := targetShards[targetShard] addInvariants(targetTablet.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } errs = append(errs, errNoVindex) } @@ -3177,6 +3603,9 @@ func TestMaterializerNoVindexInExpression(t *testing.T) { targetTablet := targetShards[targetShard] addInvariants(targetTablet.vrdbClient, vreplID, sourceTabletUID, position, wf, tenv.cells[0]) targetTablet.vrdbClient.ExpectRequest(fmt.Sprintf(readAllWorkflows, tenv.dbName, ""), &sqltypes.Result{}, nil) + for _, table := range ms.TableSettings { + tenv.db.AddQuery(fmt.Sprintf(getNonEmptyTableQuery, table.TargetTable), &sqltypes.Result{}) + } errs = append(errs, errNoVindex) } @@ -3235,6 +3664,12 @@ func TestBuildUpdateVReplicationWorkflowsQuery(t *testing.T) { DBName: "vt_testks", }, } + forVdiff := "for vdiff" + forPos := "for until position" + forTest := "test message" + stopPos1 := "MySQL56/17b1039f-21b6-13ed-b365-1a43f95f28a3:1-20" + stopPos2 := "MySQL56/17b1039f-21b6-13ed-b365-1a43f95f28a3:1-9999" + tests := []struct { name string req *tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest @@ -3242,18 +3677,14 @@ func TestBuildUpdateVReplicationWorkflowsQuery(t *testing.T) { wantErr string }{ { - name: "nothing to update", - req: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ - State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), - Message: textutil.SimulatedNullString, - StopPosition: textutil.SimulatedNullString, - }, + name: "nothing to update", + req: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{}, wantErr: errNoFieldsToUpdate.Error(), }, { name: "mutually exclusive options", req: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ - State: binlogdatapb.VReplicationWorkflowState_Running, + State: &running, AllWorkflows: true, ExcludeWorkflows: []string{"wf1"}, }, @@ -3262,9 +3693,9 @@ func TestBuildUpdateVReplicationWorkflowsQuery(t *testing.T) { { name: "all values and options", req: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ - State: binlogdatapb.VReplicationWorkflowState_Running, - Message: "test message", - StopPosition: "MySQL56/17b1039f-21b6-13ed-b365-1a43f95f28a3:1-20", + State: &running, + Message: &forTest, + StopPosition: &stopPos1, IncludeWorkflows: []string{"wf2", "wf3"}, ExcludeWorkflows: []string{"1wf"}, }, @@ -3273,9 +3704,7 @@ func TestBuildUpdateVReplicationWorkflowsQuery(t *testing.T) { { name: "state for all", req: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ - State: binlogdatapb.VReplicationWorkflowState_Running, - Message: textutil.SimulatedNullString, - StopPosition: textutil.SimulatedNullString, + State: &running, AllWorkflows: true, }, want: "update /*vt+ ALLOW_UNSAFE_VREPLICATION_WRITE */ _vt.vreplication set state = 'Running' where db_name = 'vt_testks'", @@ -3283,9 +3712,8 @@ func TestBuildUpdateVReplicationWorkflowsQuery(t *testing.T) { { name: "stop all for vdiff", req: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ - State: binlogdatapb.VReplicationWorkflowState_Stopped, - Message: "for vdiff", - StopPosition: textutil.SimulatedNullString, + State: &stopped, + Message: &forVdiff, AllWorkflows: true, }, want: "update /*vt+ ALLOW_UNSAFE_VREPLICATION_WRITE */ _vt.vreplication set state = 'Stopped', message = 'for vdiff' where db_name = 'vt_testks'", @@ -3293,9 +3721,9 @@ func TestBuildUpdateVReplicationWorkflowsQuery(t *testing.T) { { name: "start one until position", req: &tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest{ - State: binlogdatapb.VReplicationWorkflowState_Running, - Message: "for until position", - StopPosition: "MySQL56/17b1039f-21b6-13ed-b365-1a43f95f28a3:1-9999", + State: &running, + Message: &forPos, + StopPosition: &stopPos2, IncludeWorkflows: []string{"wf1"}, }, want: "update /*vt+ ALLOW_UNSAFE_VREPLICATION_WRITE */ _vt.vreplication set state = 'Running', message = 'for until position', stop_pos = 'MySQL56/17b1039f-21b6-13ed-b365-1a43f95f28a3:1-9999' where db_name = 'vt_testks' and workflow in ('wf1')", @@ -3313,3 +3741,81 @@ func TestBuildUpdateVReplicationWorkflowsQuery(t *testing.T) { }) } } + +func TestDeleteTableData(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + sourceKs := "sourceks" + sourceShard := "0" + sourceTabletUID := 200 + tenv := newTestEnv(t, ctx, sourceKs, []string{shard}) + defer tenv.close() + + tablet := tenv.addTablet(t, sourceTabletUID, sourceKs, sourceShard) + defer tenv.deleteTablet(tablet.tablet) + + testCases := []struct { + name string + req *tabletmanagerdatapb.DeleteTableDataRequest + workflowType *binlogdatapb.VReplicationWorkflowType + expectedQueries []string + wantErr string + }{ + { + name: "no request", + req: nil, + wantErr: "invalid nil request", + }, + { + name: "one table", + req: &tabletmanagerdatapb.DeleteTableDataRequest{ + TableFilters: map[string]string{ + "t1": "where tenant_id = 1", + }, + BatchSize: 100, + }, + expectedQueries: []string{ + "delete from t1 where tenant_id = 1 limit 100", + }, + }, + { + name: "one table without batch size", + req: &tabletmanagerdatapb.DeleteTableDataRequest{ + TableFilters: map[string]string{ + "t1": "where tenant_id = 1", + }, + }, + expectedQueries: []string{ + "delete from t1 where tenant_id = 1 limit 1000", // Default batch size of 1,000 + }, + }, + { + name: "multiple tables", + req: &tabletmanagerdatapb.DeleteTableDataRequest{ + TableFilters: map[string]string{ + "t1": "where tenant_id = 1", + "t2": "where foo = 2", + }, + BatchSize: 500, + }, + expectedQueries: []string{ + "delete from t1 where tenant_id = 1 limit 500", + "delete from t2 where foo = 2 limit 500", + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tenv.db.AddQuery(fmt.Sprintf("use `%s`", tenv.dbName), &sqltypes.Result{}) + for _, query := range tc.expectedQueries { + tenv.db.AddQuery(query, &sqltypes.Result{}) + } + _, err := tenv.tmc.DeleteTableData(ctx, tablet.tablet, tc.req) + if tc.wantErr != "" { + require.EqualError(t, err, tc.wantErr) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/go/vt/vttablet/tabletmanager/shard_sync_test.go b/go/vt/vttablet/tabletmanager/shard_sync_test.go index 24078efa977..8f7739e5341 100644 --- a/go/vt/vttablet/tabletmanager/shard_sync_test.go +++ b/go/vt/vttablet/tabletmanager/shard_sync_test.go @@ -18,6 +18,7 @@ package tabletmanager import ( "context" + "errors" "fmt" "reflect" "testing" @@ -44,11 +45,11 @@ const ( ) func TestShardSync(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() ts := memorytopo.NewServer(ctx, "cell1") statsTabletTypeCount.ResetAll() - tm := newTestTM(t, ts, 100, keyspace, shard) + tm := newTestTM(t, ts, 100, keyspace, shard, nil) defer tm.Stop() // update the primary info in the shard record and set it to nil @@ -67,48 +68,77 @@ func TestShardSync(t *testing.T) { // wait for syncing to work correctly // this should also have updated the shard record since it is a more recent operation // We check here that the shard record and the tablet record are in sync - checkShardRecordWithTimeout(ctx, t, ts, ti.Alias, ti.PrimaryTermStartTime, 1*time.Second) + err = checkShardRecord(ctx, t, ts, ti.Alias, ti.PrimaryTermStartTime) + require.NoError(t, err) + + // Shard sync loop runs asynchronously and starts a watch on the shard. + // We wait for the shard watch to start, otherwise the test is flaky + // because the update of the record can happen before the watch is started. + waitForShardWatchToStart(ctx, t, tm, originalTime, ti) // even if try to update the shard record with the old timestamp, it should be reverted again updatePrimaryInfoInShardRecord(ctx, t, tm, nil, originalTime) // this should have also updated the shard record because of the timestamp. - checkShardRecordWithTimeout(ctx, t, ts, ti.Alias, ti.PrimaryTermStartTime, 1*time.Second) + err = checkShardRecord(ctx, t, ts, ti.Alias, ti.PrimaryTermStartTime) + require.NoError(t, err) // updating the shard record with the latest time should trigger an update in the tablet newTime := time.Now() updatePrimaryInfoInShardRecord(ctx, t, tm, nil, newTime) // this should not have updated. - checkShardRecordWithTimeout(ctx, t, ts, nil, protoutil.TimeToProto(newTime), 1*time.Second) + err = checkShardRecord(ctx, t, ts, nil, protoutil.TimeToProto(newTime)) + require.NoError(t, err) // verify that the tablet record has been updated - checkTabletRecordWithTimeout(ctx, t, ts, tm.tabletAlias, topodata.TabletType_REPLICA, nil, 1*time.Second) + checkTabletRecordWithTimeout(ctx, t, ts, tm.tabletAlias, topodata.TabletType_REPLICA, nil) +} + +// waitForShardWatchToStart waits for shard watch to have started. +func waitForShardWatchToStart(ctx context.Context, t *testing.T, tm *TabletManager, originalTime time.Time, ti *topo.TabletInfo) { + // We wait for shard watch to start by + // updating the record and waiting to see + // the shard record is updated back by the tablet manager. + idx := 1 + for { + select { + case <-ctx.Done(): + require.FailNow(t, "timed out: waiting for shard watch to start") + default: + updatePrimaryInfoInShardRecord(ctx, t, tm, nil, originalTime.Add(-1*time.Duration(idx)*time.Second)) + idx = idx + 1 + checkCtx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + err := checkShardRecord(checkCtx, t, tm.TopoServer, ti.Alias, ti.PrimaryTermStartTime) + cancel() + if err == nil { + return + } + } + } } -func checkShardRecordWithTimeout(ctx context.Context, t *testing.T, ts *topo.Server, tabletAlias *topodata.TabletAlias, expectedStartTime *vttime.Time, timeToWait time.Duration) { - timeOut := time.After(timeToWait) +func checkShardRecord(ctx context.Context, t *testing.T, ts *topo.Server, tabletAlias *topodata.TabletAlias, expectedStartTime *vttime.Time) error { for { select { - case <-timeOut: - t.Fatalf("timed out: waiting for shard record to update") + case <-ctx.Done(): + return errors.New("timed out: waiting for shard record to update") default: si, err := ts.GetShard(ctx, keyspace, shard) require.NoError(t, err) if reflect.DeepEqual(tabletAlias, si.PrimaryAlias) && reflect.DeepEqual(expectedStartTime, si.PrimaryTermStartTime) { - return + return nil } time.Sleep(100 * time.Millisecond) } } } -func checkTabletRecordWithTimeout(ctx context.Context, t *testing.T, ts *topo.Server, tabletAlias *topodata.TabletAlias, tabletType topodata.TabletType, expectedStartTime *vttime.Time, timeToWait time.Duration) { - timeOut := time.After(timeToWait) +func checkTabletRecordWithTimeout(ctx context.Context, t *testing.T, ts *topo.Server, tabletAlias *topodata.TabletAlias, tabletType topodata.TabletType, expectedStartTime *vttime.Time) { for { select { - case <-timeOut: - t.Fatalf("timed out: waiting for tablet record to update") + case <-ctx.Done(): + require.FailNow(t, "timed out: waiting for tablet record to update") default: ti, err := ts.GetTablet(ctx, tabletAlias) require.NoError(t, err) diff --git a/go/vt/vttablet/tabletmanager/tm_init.go b/go/vt/vttablet/tabletmanager/tm_init.go index 6046ed99727..84150c82be8 100644 --- a/go/vt/vttablet/tabletmanager/tm_init.go +++ b/go/vt/vttablet/tabletmanager/tm_init.go @@ -50,6 +50,8 @@ import ( "vitess.io/vitess/go/constants/sidecar" "vitess.io/vitess/go/flagutil" "vitess.io/vitess/go/mysql/collations" + "vitess.io/vitess/go/mysql/replication" + "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/netutil" "vitess.io/vitess/go/protoutil" "vitess.io/vitess/go/sets" @@ -63,6 +65,7 @@ import ( "vitess.io/vitess/go/vt/mysqlctl" querypb "vitess.io/vitess/go/vt/proto/query" topodatapb "vitess.io/vitess/go/vt/proto/topodata" + "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" @@ -74,6 +77,7 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" "vitess.io/vitess/go/vt/vttablet/tabletserver" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" + "vitess.io/vitess/go/vt/vttablet/tmclient" ) const ( @@ -122,6 +126,9 @@ var ( // statsIsInSrvKeyspace is set to 1 (true), 0 (false) whether the tablet is in the serving keyspace statsIsInSrvKeyspace *stats.Gauge + // statsTabletTags is set to 1 (true) if a tablet tag exists. + statsTabletTags *stats.GaugesWithMultiLabels + statsKeyspace = stats.NewString("TabletKeyspace") statsShard = stats.NewString("TabletShard") statsKeyRangeStart = stats.NewString("TabletKeyRangeStart") @@ -141,6 +148,7 @@ func init() { statsTabletTypeCount = stats.NewCountersWithSingleLabel("TabletTypeCount", "Number of times the tablet changed to the labeled type", "type") statsBackupIsRunning = stats.NewGaugesWithMultiLabels("BackupIsRunning", "Whether a backup is running", []string{"mode"}) statsIsInSrvKeyspace = stats.NewGauge("IsInSrvKeyspace", "Whether the vttablet is in the serving keyspace (1 = true / 0 = false)") + statsTabletTags = stats.NewGaugesWithMultiLabels("TabletTags", "Tablet tags key/values", []string{"key", "value"}) } // TabletManager is the main class for the tablet manager. @@ -157,6 +165,9 @@ type TabletManager struct { VDiffEngine *vdiff.Engine Env *vtenv.Environment + // tmc is used to run an RPC against other vttablets. + tmc tmclient.TabletManagerClient + // tmState manages the TabletManager state. tmState *tmState @@ -343,6 +354,13 @@ func mergeTags(a, b map[string]string) map[string]string { return result } +func setTabletTagsStats(tablet *topodatapb.Tablet) { + statsTabletTags.ResetAll() + for key, val := range tablet.Tags { + statsTabletTags.Set([]string{key, val}, 1) + } +} + // Start starts the TabletManager. func (tm *TabletManager) Start(tablet *topodatapb.Tablet, config *tabletenv.TabletConfig) error { defer func() { @@ -351,6 +369,7 @@ func (tm *TabletManager) Start(tablet *topodatapb.Tablet, config *tabletenv.Tabl log.Infof("TabletManager Start") tm.DBConfigs.DBName = topoproto.TabletDbName(tablet) tm.tabletAlias = tablet.Alias + tm.tmc = tmclient.NewTabletManagerClient() tm.tmState = newTMState(tm, tablet) tm.actionSema = semaphore.NewWeighted(1) tm._waitForGrantsComplete = make(chan struct{}) @@ -544,13 +563,17 @@ func (tm *TabletManager) createKeyspaceShard(ctx context.Context) (*topo.ShardIn return nil, err } - tm.tmState.RefreshFromTopoInfo(ctx, shardInfo, nil) + if err := tm.tmState.RefreshFromTopoInfo(ctx, shardInfo, nil); err != nil { + return nil, err + } // Rebuild keyspace if this the first tablet in this keyspace/cell srvKeyspace, err := tm.TopoServer.GetSrvKeyspace(ctx, tm.tabletAlias.Cell, tablet.Keyspace) switch { case err == nil: - tm.tmState.RefreshFromTopoInfo(ctx, nil, srvKeyspace) + if err := tm.tmState.RefreshFromTopoInfo(ctx, nil, srvKeyspace); err != nil { + return nil, err + } case topo.IsErrType(err, topo.NoNode): var rebuildKsCtx context.Context rebuildKsCtx, tm._rebuildKeyspaceCancel = context.WithCancel(tm.BatchCtx) @@ -602,7 +625,10 @@ func (tm *TabletManager) rebuildKeyspace(ctx context.Context, done chan<- struct defer func() { log.Infof("Keyspace rebuilt: %v", keyspace) if ctx.Err() == nil { - tm.tmState.RefreshFromTopoInfo(tm.BatchCtx, nil, srvKeyspace) + err := tm.tmState.RefreshFromTopoInfo(tm.BatchCtx, nil, srvKeyspace) + if err != nil { + log.Errorf("Error refreshing topo information - %v", err) + } } close(done) }() @@ -751,6 +777,24 @@ func (tm *TabletManager) findMysqlPort(retryInterval time.Duration) { } } +// redoPreparedTransactionsAndSetReadWrite redoes prepared transactions in read-only mode. +// We turn off super read only mode, and then redo the transactions. Finally, we turn off read-only mode to allow for further traffic. +func (tm *TabletManager) redoPreparedTransactionsAndSetReadWrite(ctx context.Context) error { + _, err := tm.MysqlDaemon.SetSuperReadOnly(ctx, false) + if err != nil { + // Ignore the error if the sever doesn't support super read only variable. + // We should just redo the preapred transactions before we set it to read-write. + if sqlErr, ok := err.(*sqlerror.SQLError); ok && sqlErr.Number() == sqlerror.ERUnknownSystemVariable { + log.Warningf("server does not know about super_read_only, continuing anyway...") + } else { + return err + } + } + tm.QueryServiceControl.RedoPreparedTransactions() + err = tm.MysqlDaemon.SetReadOnly(ctx, false) + return err +} + func (tm *TabletManager) initTablet(ctx context.Context) error { tablet := tm.Tablet() err := tm.TopoServer.CreateTablet(ctx, tablet) @@ -822,9 +866,10 @@ func (tm *TabletManager) handleRestore(ctx context.Context, config *tabletenv.Ta log.Exitf(fmt.Sprintf("RestoreFromBackup failed: unable to parse the --restore-to-timestamp value provided of '%s'. Error: %v", restoreToTimestampStr, err)) } } + // restoreFromBackup will just be a regular action // (same as if it was triggered remotely) - if err := tm.RestoreData(ctx, logutil.NewConsoleLogger(), waitForBackupInterval, false /* deleteBeforeRestore */, backupTime, restoreToTimestamp, restoreToPos, mysqlShutdownTimeout); err != nil { + if err := tm.RestoreData(ctx, logutil.NewConsoleLogger(), waitForBackupInterval, false /* deleteBeforeRestore */, backupTime, restoreToTimestamp, restoreToPos, restoreFromBackupAllowedEngines, mysqlShutdownTimeout); err != nil { log.Exitf("RestoreFromBackup failed: %v", err) } @@ -870,6 +915,7 @@ func (tm *TabletManager) exportStats() { statsKeyRangeEnd.Set(hex.EncodeToString(tablet.KeyRange.End)) } statsAlias.Set(topoproto.TabletAliasString(tablet.Alias)) + setTabletTagsStats(tablet) } // withRetry will exponentially back off and retry a function upon @@ -924,50 +970,50 @@ func (tm *TabletManager) hookExtraEnv() map[string]string { // initializeReplication is used to initialize the replication when the tablet starts. // It returns the current primary tablet for use externally -func (tm *TabletManager) initializeReplication(ctx context.Context, tabletType topodatapb.TabletType) (primary *topo.TabletInfo, err error) { +func (tm *TabletManager) initializeReplication(ctx context.Context, tabletType topodatapb.TabletType) (string, error) { // If active reparents are disabled, we do not touch replication. // There is nothing to do if mysqlctl.DisableActiveReparents { - return nil, nil + return "", nil } // If the desired tablet type is primary, then we shouldn't be setting our replication source. // So there is nothing to do. if tabletType == topodatapb.TabletType_PRIMARY { - return nil, nil + return "", nil } // Read the shard to find the current primary, and its location. tablet := tm.Tablet() si, err := tm.TopoServer.GetShard(ctx, tablet.Keyspace, tablet.Shard) if err != nil { - return nil, vterrors.Wrap(err, "cannot read shard") + return "", vterrors.Wrap(err, "cannot read shard") } if si.PrimaryAlias == nil { // There's no primary. This is fine, since there might be no primary currently log.Warningf("cannot start replication during initialization: shard %v/%v has no primary.", tablet.Keyspace, tablet.Shard) - return nil, nil + return "", nil } if topoproto.TabletAliasEqual(si.PrimaryAlias, tablet.Alias) { // We used to be the primary before we got restarted, // and no other primary has been elected in the meantime. // There isn't anything to do here either. log.Warningf("cannot start replication during initialization: primary in shard record still points to this tablet.") - return nil, nil + return "", nil } currentPrimary, err := tm.TopoServer.GetTablet(ctx, si.PrimaryAlias) if err != nil { - return nil, vterrors.Wrapf(err, "cannot read primary tablet %v", si.PrimaryAlias) + return "", vterrors.Wrapf(err, "cannot read primary tablet %v", si.PrimaryAlias) } durabilityName, err := tm.TopoServer.GetKeyspaceDurability(ctx, tablet.Keyspace) if err != nil { - return nil, vterrors.Wrapf(err, "cannot read keyspace durability policy %v", tablet.Keyspace) + return "", vterrors.Wrapf(err, "cannot read keyspace durability policy %v", tablet.Keyspace) } log.Infof("Getting a new durability policy for %v", durabilityName) durability, err := reparentutil.GetDurabilityPolicy(durabilityName) if err != nil { - return nil, vterrors.Wrapf(err, "cannot get durability policy %v", durabilityName) + return "", vterrors.Wrapf(err, "cannot get durability policy %v", durabilityName) } // If using semi-sync, we need to enable it before connecting to primary. // We should set the correct type, since it is used in replica semi-sync @@ -976,21 +1022,52 @@ func (tm *TabletManager) initializeReplication(ctx context.Context, tabletType t semiSyncAction, err := tm.convertBoolToSemiSyncAction(ctx, reparentutil.IsReplicaSemiSync(durability, currentPrimary.Tablet, tablet)) if err != nil { - return nil, err + return "", err } if err := tm.fixSemiSync(ctx, tabletType, semiSyncAction); err != nil { - return nil, err + return "", err } // Set primary and start replication. if currentPrimary.Tablet.MysqlHostname == "" { log.Warningf("primary tablet in the shard record does not have mysql hostname specified, possibly because that tablet has been shut down.") - return nil, nil + return "", nil + } + + // Find our own executed GTID set and, + // the executed GTID set of the tablet that we are reparenting to. + // We will then compare our own position against it to verify that we don't + // have an errant GTID. If we find any GTID that we have, but the primary doesn't, + // we will not enter the replication graph and instead fail replication. + replicaPos, err := tm.MysqlDaemon.PrimaryPosition(ctx) + if err != nil { + return "", err + } + + primaryStatus, err := tm.tmc.PrimaryStatus(ctx, currentPrimary.Tablet) + if err != nil { + return "", err } + primaryPosition, err := replication.DecodePosition(primaryStatus.Position) + if err != nil { + return "", err + } + primarySid, err := replication.ParseSID(primaryStatus.ServerUuid) + if err != nil { + return "", err + } + errantGtid, err := replication.ErrantGTIDsOnReplica(replicaPos, primaryPosition, primarySid) + if err != nil { + return "", err + } + if errantGtid != "" { + return "", vterrors.New(vtrpc.Code_FAILED_PRECONDITION, fmt.Sprintf("Errant GTID detected - %s; Primary GTID - %s, Replica GTID - %s", errantGtid, primaryPosition, replicaPos.String())) + } + if err := tm.MysqlDaemon.SetReplicationSource(ctx, currentPrimary.Tablet.MysqlHostname, currentPrimary.Tablet.MysqlPort, 0, true, true); err != nil { - return nil, vterrors.Wrap(err, "MysqlDaemon.SetReplicationSource failed") + return "", vterrors.Wrap(err, "MysqlDaemon.SetReplicationSource failed") } - return currentPrimary, nil + return primaryStatus.Position, nil } diff --git a/go/vt/vttablet/tabletmanager/tm_init_test.go b/go/vt/vttablet/tabletmanager/tm_init_test.go index d0c0075eda3..b8c9c54dcc2 100644 --- a/go/vt/vttablet/tabletmanager/tm_init_test.go +++ b/go/vt/vttablet/tabletmanager/tm_init_test.go @@ -173,7 +173,7 @@ func TestStartCreateKeyspaceShard(t *testing.T) { statsTabletTypeCount.ResetAll() cell := "cell1" ts := memorytopo.NewServer(ctx, cell) - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) defer tm.Stop() assert.Equal(t, "replica", statsTabletType.Get()) @@ -193,7 +193,7 @@ func TestStartCreateKeyspaceShard(t *testing.T) { // keyspace-shard already created. _, err = ts.GetOrCreateShard(ctx, "ks1", "0") require.NoError(t, err) - tm = newTestTM(t, ts, 2, "ks1", "0") + tm = newTestTM(t, ts, 2, "ks1", "0", nil) defer tm.Stop() _, err = ts.GetShard(ctx, "ks1", "0") require.NoError(t, err) @@ -207,7 +207,7 @@ func TestStartCreateKeyspaceShard(t *testing.T) { require.NoError(t, err) err = topotools.RebuildKeyspace(ctx, logutil.NewConsoleLogger(), ts, "ks2", []string{cell}, false) require.NoError(t, err) - tm = newTestTM(t, ts, 3, "ks2", "0") + tm = newTestTM(t, ts, 3, "ks2", "0", nil) defer tm.Stop() _, err = ts.GetShard(ctx, "ks2", "0") require.NoError(t, err) @@ -224,7 +224,7 @@ func TestStartCreateKeyspaceShard(t *testing.T) { require.NoError(t, err) err = ts.RebuildSrvVSchema(ctx, []string{cell}) require.NoError(t, err) - tm = newTestTM(t, ts, 4, "ks3", "0") + tm = newTestTM(t, ts, 4, "ks3", "0", nil) defer tm.Stop() _, err = ts.GetShard(ctx, "ks3", "0") require.NoError(t, err) @@ -235,7 +235,7 @@ func TestStartCreateKeyspaceShard(t *testing.T) { assert.Equal(t, wantVSchema, srvVSchema.Keyspaces["ks3"]) // Multi-shard - tm1 := newTestTM(t, ts, 5, "ks4", "-80") + tm1 := newTestTM(t, ts, 5, "ks4", "-80", nil) defer tm1.Stop() // Wait a bit and make sure that srvKeyspace is still not created. @@ -243,7 +243,7 @@ func TestStartCreateKeyspaceShard(t *testing.T) { _, err = ts.GetSrvKeyspace(context.Background(), cell, "ks4") require.True(t, topo.IsErrType(err, topo.NoNode), err) - tm2 := newTestTM(t, ts, 6, "ks4", "80-") + tm2 := newTestTM(t, ts, 6, "ks4", "80-", nil) defer tm2.Stop() // Now that we've started the tablet for the other shard, srvKeyspace will succeed. ensureSrvKeyspace(t, ctx, ts, cell, "ks4") @@ -264,7 +264,7 @@ func TestCheckPrimaryShip(t *testing.T) { // 1. Initialize the tablet as REPLICA. // This will create the respective topology records. - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) tablet := tm.Tablet() ensureSrvKeyspace(t, ctx, ts, cell, "ks") ti, err := ts.GetTablet(ctx, alias) @@ -398,7 +398,7 @@ func TestStartCheckMysql(t *testing.T) { defer cancel() cell := "cell1" ts := memorytopo.NewServer(ctx, cell) - tablet := newTestTablet(t, 1, "ks", "0") + tablet := newTestTablet(t, 1, "ks", "0", nil) cp := mysql.ConnParams{ Host: "foo", Port: 1, @@ -429,7 +429,7 @@ func TestStartFindMysqlPort(t *testing.T) { defer cancel() cell := "cell1" ts := memorytopo.NewServer(ctx, cell) - tablet := newTestTablet(t, 1, "ks", "0") + tablet := newTestTablet(t, 1, "ks", "0", nil) fmd := newTestMysqlDaemon(t, -1) tm := &TabletManager{ BatchCtx: context.Background(), @@ -472,7 +472,7 @@ func TestStartFixesReplicationData(t *testing.T) { defer cancel() cell := "cell1" ts := memorytopo.NewServer(ctx, cell, "cell2") - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) defer tm.Stop() tabletAlias := tm.tabletAlias @@ -505,14 +505,14 @@ func TestStartDoesNotUpdateReplicationDataForTabletInWrongShard(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1", "cell2") - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) tm.Stop() tabletAliases, err := ts.FindAllTabletAliasesInShard(ctx, "ks", "0") require.NoError(t, err) assert.Equal(t, uint32(1), tabletAliases[0].Uid) - tablet := newTestTablet(t, 1, "ks", "-d0") + tablet := newTestTablet(t, 1, "ks", "-d0", nil) require.NoError(t, err) err = tm.Start(tablet, nil) assert.Contains(t, err.Error(), "existing tablet keyspace and shard ks/0 differ") @@ -537,7 +537,7 @@ func TestCheckTabletTypeResets(t *testing.T) { // 1. Initialize the tablet as REPLICA. // This will create the respective topology records. - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) tablet := tm.Tablet() ensureSrvKeyspace(t, ctx, ts, cell, "ks") ti, err := ts.GetTablet(ctx, alias) @@ -648,6 +648,27 @@ func TestGetBuildTags(t *testing.T) { } } +func TestStartExportStats(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ts := memorytopo.NewServer(ctx, "cell1") + _ = newTestTM(t, ts, 1, "ks", "0", map[string]string{ + "test": t.Name(), + }) + + assert.Equal(t, "ks", statsKeyspace.Get()) + assert.Equal(t, "0", statsShard.Get()) + assert.Equal(t, "replica", statsTabletType.Get()) + assert.Equal(t, map[string]int64{ + "replica": 1, + }, statsTabletTypeCount.Counts()) + assert.Equal(t, "cell1-0000000001", statsAlias.Get()) + assert.Equal(t, map[string]int64{ + "test." + t.Name(): 1, + }, statsTabletTags.Counts()) +} + func newTestMysqlDaemon(t *testing.T, port int32) *mysqlctl.FakeMysqlDaemon { t.Helper() @@ -662,10 +683,14 @@ func newTestMysqlDaemon(t *testing.T, port int32) *mysqlctl.FakeMysqlDaemon { return mysqld } -func newTestTM(t *testing.T, ts *topo.Server, uid int, keyspace, shard string) *TabletManager { +func newTestTM(t *testing.T, ts *topo.Server, uid int, keyspace, shard string, tags map[string]string) *TabletManager { + // reset stats + statsTabletTags.ResetAll() + statsTabletTypeCount.ResetAll() + t.Helper() ctx := context.Background() - tablet := newTestTablet(t, uid, keyspace, shard) + tablet := newTestTablet(t, uid, keyspace, shard, tags) tm := &TabletManager{ BatchCtx: ctx, TopoServer: ts, @@ -701,7 +726,7 @@ func newTestTM(t *testing.T, ts *topo.Server, uid int, keyspace, shard string) * } } -func newTestTablet(t *testing.T, uid int, keyspace, shard string) *topodatapb.Tablet { +func newTestTablet(t *testing.T, uid int, keyspace, shard string, tags map[string]string) *topodatapb.Tablet { shard, keyRange, err := topo.ValidateShardName(shard) require.NoError(t, err) return &topodatapb.Tablet{ @@ -718,6 +743,7 @@ func newTestTablet(t *testing.T, uid int, keyspace, shard string) *topodatapb.Ta Shard: shard, KeyRange: keyRange, Type: topodatapb.TabletType_REPLICA, + Tags: tags, } } diff --git a/go/vt/vttablet/tabletmanager/tm_state.go b/go/vt/vttablet/tabletmanager/tm_state.go index 312c675fce7..026f2b62552 100644 --- a/go/vt/vttablet/tabletmanager/tm_state.go +++ b/go/vt/vttablet/tabletmanager/tm_state.go @@ -37,6 +37,7 @@ import ( "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/topotools" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/tabletserver" "vitess.io/vitess/go/vt/vttablet/tabletserver/rules" topodatapb "vitess.io/vitess/go/vt/proto/topodata" @@ -135,11 +136,10 @@ func (ts *tmState) RefreshFromTopo(ctx context.Context) error { if err != nil { return err } - ts.RefreshFromTopoInfo(ctx, shardInfo, srvKeyspace) - return nil + return ts.RefreshFromTopoInfo(ctx, shardInfo, srvKeyspace) } -func (ts *tmState) RefreshFromTopoInfo(ctx context.Context, shardInfo *topo.ShardInfo, srvKeyspace *topodatapb.SrvKeyspace) { +func (ts *tmState) RefreshFromTopoInfo(ctx context.Context, shardInfo *topo.ShardInfo, srvKeyspace *topodatapb.SrvKeyspace) error { ts.mu.Lock() defer ts.mu.Unlock() @@ -157,6 +157,7 @@ func (ts *tmState) RefreshFromTopoInfo(ctx context.Context, shardInfo *topo.Shar if srvKeyspace != nil { ts.isShardServing = make(map[topodatapb.TabletType]bool) ts.tabletControls = make(map[topodatapb.TabletType]bool) + ts.tm.QueryServiceControl.SetTwoPCAllowed(tabletserver.TwoPCAllowed_TabletControls, true) for _, partition := range srvKeyspace.GetPartitions() { @@ -169,7 +170,10 @@ func (ts *tmState) RefreshFromTopoInfo(ctx context.Context, shardInfo *topo.Shar for _, tabletControl := range partition.GetShardTabletControls() { if key.KeyRangeEqual(tabletControl.GetKeyRange(), ts.KeyRange()) { if tabletControl.QueryServiceDisabled { - ts.tabletControls[partition.GetServedType()] = true + err := ts.prepareForDisableQueryService(ctx, partition.GetServedType()) + if err != nil { + return err + } } break } @@ -177,7 +181,20 @@ func (ts *tmState) RefreshFromTopoInfo(ctx context.Context, shardInfo *topo.Shar } } - _ = ts.updateLocked(ctx) + return ts.updateLocked(ctx) +} + +// prepareForDisableQueryService prepares the tablet for disabling query service. +func (ts *tmState) prepareForDisableQueryService(ctx context.Context, servType topodatapb.TabletType) error { + if servType == topodatapb.TabletType_PRIMARY { + ts.tm.QueryServiceControl.SetTwoPCAllowed(tabletserver.TwoPCAllowed_TabletControls, false) + err := ts.tm.QueryServiceControl.WaitForPreparedTwoPCTransactions(ctx) + if err != nil { + return err + } + } + ts.tabletControls[servType] = true + return nil } func (ts *tmState) ChangeTabletType(ctx context.Context, tabletType topodatapb.TabletType, action DBAction) error { @@ -214,9 +231,10 @@ func (ts *tmState) ChangeTabletType(ctx context.Context, tabletType topodatapb.T } if action == DBActionSetReadWrite { + // We need to redo the prepared transactions in read only mode using the dba user to ensure we don't lose them. // We call SetReadOnly only after the topo has been updated to avoid // situations where two tablets are primary at the DB level but not at the vitess level - if err := ts.tm.MysqlDaemon.SetReadOnly(ctx, false); err != nil { + if err = ts.tm.redoPreparedTransactionsAndSetReadWrite(ctx); err != nil { return err } } @@ -239,6 +257,17 @@ func (ts *tmState) ChangeTabletType(ctx context.Context, tabletType topodatapb.T return err } +func (ts *tmState) ChangeTabletTags(ctx context.Context, tabletTags map[string]string) { + ts.mu.Lock() + defer ts.mu.Unlock() + log.Infof("Changing Tablet Tags: %v for %s", tabletTags, ts.tablet.Alias.String()) + + ts.tablet.Tags = tabletTags + ts.publishStateLocked(ctx) + ts.publishForDisplay() + setTabletTagsStats(ts.tablet) +} + func (ts *tmState) SetMysqlPort(mport int32) { ts.mu.Lock() defer ts.mu.Unlock() @@ -281,7 +310,7 @@ func (ts *tmState) updateLocked(ctx context.Context) error { errStr := fmt.Sprintf("SetServingType(serving=false) failed: %v", err) log.Errorf(errStr) // No need to short circuit. Apply all steps and return error in the end. - returnErr = vterrors.Wrapf(err, errStr) + returnErr = vterrors.Wrap(err, errStr) } } @@ -289,7 +318,7 @@ func (ts *tmState) updateLocked(ctx context.Context) error { errStr := fmt.Sprintf("Cannot update denied tables rule: %v", err) log.Errorf(errStr) // No need to short circuit. Apply all steps and return error in the end. - returnErr = vterrors.Wrapf(err, errStr) + returnErr = vterrors.Wrap(err, errStr) } if ts.tm.UpdateStream != nil { @@ -329,7 +358,7 @@ func (ts *tmState) updateLocked(ctx context.Context) error { if err := ts.tm.QueryServiceControl.SetServingType(ts.tablet.Type, ptsTime, true, ""); err != nil { errStr := fmt.Sprintf("Cannot start query service: %v", err) log.Errorf(errStr) - returnErr = vterrors.Wrapf(err, errStr) + returnErr = vterrors.Wrap(err, errStr) } } diff --git a/go/vt/vttablet/tabletmanager/tm_state_test.go b/go/vt/vttablet/tabletmanager/tm_state_test.go index 8bd98edefff..7a507248e18 100644 --- a/go/vt/vttablet/tabletmanager/tm_state_test.go +++ b/go/vt/vttablet/tabletmanager/tm_state_test.go @@ -46,7 +46,7 @@ func TestStateOpenClose(t *testing.T) { defer cancel() ts := memorytopo.NewServer(ctx, "cell1") - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) // Re-Open should be a no-op tm.tmState.mu.Lock() @@ -69,7 +69,7 @@ func TestStateRefreshFromTopo(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1") - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) defer tm.Stop() err := tm.RefreshState(ctx) @@ -80,7 +80,7 @@ func TestStateResharding(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1") - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) defer tm.Stop() tm.tmState.mu.Lock() @@ -108,7 +108,7 @@ func TestStateDenyList(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1") - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) defer tm.Stop() fmd := tm.MysqlDaemon.(*mysqlctl.FakeMysqlDaemon) @@ -140,7 +140,7 @@ func TestStateTabletControls(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1") - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) defer tm.Stop() ks := &topodatapb.SrvKeyspace{ @@ -169,7 +169,7 @@ func TestStateIsShardServingisInSrvKeyspace(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1") - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) defer tm.Stop() tm.tmState.mu.Lock() @@ -341,7 +341,7 @@ func TestStateNonServing(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1") - tm := newTestTM(t, ts, 1, "ks", "0") + tm := newTestTM(t, ts, 1, "ks", "0", nil) defer tm.Stop() tm.tmState.mu.Lock() @@ -359,7 +359,7 @@ func TestStateChangeTabletType(t *testing.T) { defer cancel() ts := memorytopo.NewServer(ctx, "cell1") statsTabletTypeCount.ResetAll() - tm := newTestTM(t, ts, 2, "ks", "0") + tm := newTestTM(t, ts, 2, "ks", "0", nil) defer tm.Stop() assert.Equal(t, 1, len(statsTabletTypeCount.Counts())) @@ -402,7 +402,7 @@ func TestStateChangeTabletTypeWithFailure(t *testing.T) { ts := memorytopo.NewServer(ctx, "cell1") statsTabletTypeCount.ResetAll() // create TM with replica and put a hook to return error during SetServingType - tm := newTestTM(t, ts, 2, "ks", "0") + tm := newTestTM(t, ts, 2, "ks", "0", nil) qsc := tm.QueryServiceControl.(*tabletservermock.Controller) qsc.SetServingTypeError = vterrors.Errorf(vtrpcpb.Code_RESOURCE_EXHAUSTED, "mocking resource exhaustion error ") defer tm.Stop() @@ -485,7 +485,7 @@ func TestChangeTypeErrorWhileWritingToTopo(t *testing.T) { fakeConn := factory.AddCell("cell1") ts := faketopo.NewFakeTopoServer(context.TODO(), factory) statsTabletTypeCount.ResetAll() - tm := newTestTM(t, ts, 2, "ks", "0") + tm := newTestTM(t, ts, 2, "ks", "0", nil) defer tm.Stop() // ChangeTabletType calls topotools.ChangeType which in-turn issues @@ -533,7 +533,7 @@ func TestPublishStateNew(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1") - tm := newTestTM(t, ts, 42, "ks", "0") + tm := newTestTM(t, ts, 42, "ks", "0", nil) ttablet, err := tm.TopoServer.GetTablet(ctx, tm.tabletAlias) require.NoError(t, err) utils.MustMatch(t, tm.Tablet(), ttablet.Tablet) @@ -580,7 +580,7 @@ func TestPublishDeleted(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ts := memorytopo.NewServer(ctx, "cell1") - tm := newTestTM(t, ts, 2, "ks", "0") + tm := newTestTM(t, ts, 2, "ks", "0", nil) defer tm.Stop() alias := &topodatapb.TabletAlias{ diff --git a/go/vt/vttablet/tabletmanager/vdiff/action.go b/go/vt/vttablet/tabletmanager/vdiff/action.go index 0b9dd6f45ed..9cfb145c1e0 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/action.go +++ b/go/vt/vttablet/tabletmanager/vdiff/action.go @@ -37,7 +37,7 @@ import ( vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) -type VDiffAction string //nolint +type VDiffAction string // nolint const ( CreateAction VDiffAction = "create" @@ -97,15 +97,15 @@ func (vde *Engine) PerformVDiffAction(ctx context.Context, req *tabletmanagerdat return nil, err } case ShowAction: - if err := vde.handleShowAction(ctx, dbClient, action, req, resp); err != nil { + if err := vde.handleShowAction(ctx, dbClient, req, resp); err != nil { return nil, err } case StopAction: - if err := vde.handleStopAction(ctx, dbClient, action, req, resp); err != nil { + if err := vde.handleStopAction(ctx, dbClient, req, resp); err != nil { return nil, err } case DeleteAction: - if err := vde.handleDeleteAction(ctx, dbClient, action, req, resp); err != nil { + if err := vde.handleDeleteAction(ctx, dbClient, req, resp); err != nil { return nil, err } default: @@ -174,7 +174,7 @@ func (vde *Engine) getDefaultCell() (string, error) { func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlogplayer.DBClient, action VDiffAction, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { var qr *sqltypes.Result - options := req.Options + options := req.GetOptions() query, err := sqlparser.ParseAndBind(sqlGetVDiffID, sqltypes.StringBindVariable(req.VdiffUuid)) if err != nil { @@ -184,20 +184,12 @@ func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlog return err } recordFound := len(qr.Rows) == 1 - if recordFound && action == CreateAction { - return fmt.Errorf("vdiff with UUID %s already exists on tablet %v", - req.VdiffUuid, vde.thisTablet.Alias) - } else if action == ResumeAction { - if !recordFound { - return fmt.Errorf("vdiff with UUID %s not found on tablet %v", - req.VdiffUuid, vde.thisTablet.Alias) - } - if resp.Id, err = qr.Named().Row().ToInt64("id"); err != nil { - return fmt.Errorf("vdiff found with invalid id on tablet %v: %w", - vde.thisTablet.Alias, err) - } - } + if action == CreateAction { + if recordFound { + return fmt.Errorf("vdiff with UUID %s already exists on tablet %s", + req.VdiffUuid, topoproto.TabletAliasString(vde.thisTablet.Alias)) + } // Use the options specified via the vdiff create client // command, which we'll then store in the vdiff record. if options, err = vde.fixupOptions(options); err != nil { @@ -207,10 +199,14 @@ func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlog if err != nil { return err } + state := PendingState + if options.CoreOptions != nil && options.CoreOptions.AutoStart != nil && !options.CoreOptions.GetAutoStart() { + state = StoppedState + } query, err := sqlparser.ParseAndBind(sqlNewVDiff, sqltypes.StringBindVariable(req.Keyspace), sqltypes.StringBindVariable(req.Workflow), - sqltypes.StringBindVariable("pending"), + sqltypes.StringBindVariable(string(state)), sqltypes.StringBindVariable(string(optionsJSON)), sqltypes.StringBindVariable(vde.thisTablet.Shard), sqltypes.StringBindVariable(topoproto.TabletDbName(vde.thisTablet)), @@ -223,24 +219,44 @@ func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlog return err } if qr.InsertID == 0 { - return fmt.Errorf("unable to create vdiff for UUID %s on tablet %v (%w)", - req.VdiffUuid, vde.thisTablet.Alias, err) + return fmt.Errorf("unable to create vdiff for UUID %s on tablet %s (%w)", + req.VdiffUuid, topoproto.TabletAliasString(vde.thisTablet.Alias), err) } resp.Id = int64(qr.InsertID) } else { - query, err := sqlparser.ParseAndBind(sqlResumeVDiff, - sqltypes.StringBindVariable(req.VdiffUuid), - ) - if err != nil { - return err + if !recordFound { + return fmt.Errorf("vdiff with UUID %s not found on tablet %s", + req.VdiffUuid, topoproto.TabletAliasString(vde.thisTablet.Alias)) } - if qr, err = dbClient.ExecuteFetch(query, 1); err != nil { + if resp.Id, err = qr.Named().Row().ToInt64("id"); err != nil { + return fmt.Errorf("vdiff found with invalid id on tablet %s: %w", + topoproto.TabletAliasString(vde.thisTablet.Alias), err) + } + execResume := func(query string) (rowsAffected uint64, err error) { + query, err = sqlparser.ParseAndBind(query, + sqltypes.StringBindVariable(req.VdiffUuid), + ) + if err != nil { + return 0, err + } + if qr, err = dbClient.ExecuteFetch(query, 1); err != nil { + return 0, err + } + return qr.RowsAffected, nil + } + rowsAffected, err := execResume(sqlResumeVDiff) + if err != nil { return err } - if qr.RowsAffected == 0 { - msg := fmt.Sprintf("no completed or stopped vdiff found for UUID %s on tablet %v", - req.VdiffUuid, vde.thisTablet.Alias) - return fmt.Errorf(msg) + if rowsAffected == 0 { // See if it's a vdiff that was never started + rowsAffected, err := execResume(sqlStartVDiff) + if err != nil { + return err + } + if rowsAffected == 0 { + return fmt.Errorf("no completed or stopped vdiff found for UUID %s on tablet %s", + req.VdiffUuid, topoproto.TabletAliasString(vde.thisTablet.Alias)) + } } } @@ -252,7 +268,7 @@ func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlog vdiffRecord := qr.Named().Row() if vdiffRecord == nil { return fmt.Errorf("unable to %s vdiff for UUID %s as it was not found on tablet %v (%w)", - action, req.VdiffUuid, vde.thisTablet.Alias, err) + action, req.VdiffUuid, topoproto.TabletAliasString(vde.thisTablet.Alias), err) } if action == ResumeAction { // Use the existing options from the vdiff record. @@ -272,7 +288,7 @@ func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlog return nil } -func (vde *Engine) handleShowAction(ctx context.Context, dbClient binlogplayer.DBClient, action VDiffAction, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { +func (vde *Engine) handleShowAction(ctx context.Context, dbClient binlogplayer.DBClient, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { var qr *sqltypes.Result vdiffUUID := "" @@ -312,8 +328,8 @@ func (vde *Engine) handleShowAction(ctx context.Context, dbClient binlogplayer.D } switch len(qr.Rows) { case 0: - return fmt.Errorf("no vdiff found for UUID %s keyspace %s and workflow %s on tablet %v", - vdiffUUID, req.Keyspace, req.Workflow, vde.thisTablet.Alias) + return fmt.Errorf("no vdiff found for UUID %s keyspace %s and workflow %s on tablet %s", + vdiffUUID, req.Keyspace, req.Workflow, topoproto.TabletAliasString(vde.thisTablet.Alias)) case 1: row := qr.Named().Row() vdiffID, _ := row["id"].ToInt64() @@ -323,8 +339,8 @@ func (vde *Engine) handleShowAction(ctx context.Context, dbClient binlogplayer.D return err } default: - return fmt.Errorf("too many vdiffs found (%d) for UUID %s keyspace %s and workflow %s on tablet %v", - len(qr.Rows), vdiffUUID, req.Keyspace, req.Workflow, vde.thisTablet.Alias) + return fmt.Errorf("too many vdiffs found (%d) for UUID %s keyspace %s and workflow %s on tablet %s", + len(qr.Rows), vdiffUUID, req.Keyspace, req.Workflow, topoproto.TabletAliasString(vde.thisTablet.Alias)) } } switch req.ActionArg { @@ -351,7 +367,7 @@ func (vde *Engine) handleShowAction(ctx context.Context, dbClient binlogplayer.D return nil } -func (vde *Engine) handleStopAction(ctx context.Context, dbClient binlogplayer.DBClient, action VDiffAction, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { +func (vde *Engine) handleStopAction(ctx context.Context, dbClient binlogplayer.DBClient, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { vde.mu.Lock() defer vde.mu.Unlock() for _, controller := range vde.controllers { @@ -366,7 +382,7 @@ func (vde *Engine) handleStopAction(ctx context.Context, dbClient binlogplayer.D return nil } -func (vde *Engine) handleDeleteAction(ctx context.Context, dbClient binlogplayer.DBClient, action VDiffAction, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { +func (vde *Engine) handleDeleteAction(ctx context.Context, dbClient binlogplayer.DBClient, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { vde.mu.Lock() defer vde.mu.Unlock() var deleteQuery string @@ -425,8 +441,8 @@ func (vde *Engine) handleDeleteAction(ctx context.Context, dbClient binlogplayer } row := res.Named().Row() // Must only be one if row == nil { - return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "no vdiff found for UUID %s on tablet %v", - uuid, vde.thisTablet.Alias) + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "no vdiff found for UUID %s on tablet %s", + uuid, topoproto.TabletAliasString(vde.thisTablet.Alias)) } cleanupController(vde.controllers[row.AsInt64("id", -1)]) deleteQuery, err = sqlparser.ParseAndBind(sqlDeleteVDiffByUUID, diff --git a/go/vt/vttablet/tabletmanager/vdiff/action_test.go b/go/vt/vttablet/tabletmanager/vdiff/action_test.go index 6949b411f13..6bdc7044878 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/action_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/action_test.go @@ -26,6 +26,7 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/vterrors" @@ -46,6 +47,7 @@ func TestPerformVDiffAction(t *testing.T) { query string result *sqltypes.Result // Optional if you need a non-empty result } + tests := []struct { name string vde *Engine @@ -93,6 +95,27 @@ func TestPerformVDiffAction(t *testing.T) { return tstenv.TopoServ.DeleteCellInfo(ctx, "zone100_test", true) }, }, + { + name: "create without starting", + req: &tabletmanagerdatapb.VDiffRequest{ + Action: string(CreateAction), + VdiffUuid: uuid, + Options: &tabletmanagerdatapb.VDiffOptions{ + PickerOptions: &tabletmanagerdatapb.VDiffPickerOptions{}, + CoreOptions: &tabletmanagerdatapb.VDiffCoreOptions{ + AutoStart: ptr.Of(false), + }, + }, + }, + expectQueries: []queryAndResult{ + { + query: fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), + }, + { + query: fmt.Sprintf(`insert into _vt.vdiff(keyspace, workflow, state, options, shard, db_name, vdiff_uuid) values('', '', 'stopped', '{"picker_options":{"source_cell":"cell1","target_cell":"cell1"},"core_options":{"auto_start":false}}', '0', 'vt_vttest', %s)`, encodeString(uuid)), + }, + }, + }, { name: "create with cell alias", req: &tabletmanagerdatapb.VDiffRequest{ @@ -130,6 +153,79 @@ func TestPerformVDiffAction(t *testing.T) { return tstenv.TopoServ.DeleteCellsAlias(ctx, "all") }, }, + { + name: "resume never started vdiff", + req: &tabletmanagerdatapb.VDiffRequest{ + Action: string(ResumeAction), + VdiffUuid: uuid, + Keyspace: keyspace, + Workflow: workflow, + }, + expectQueries: []queryAndResult{ + { + query: fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), + result: sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id", + "int64", + ), + "1", + ), + }, + { + query: fmt.Sprintf(`update _vt.vdiff as vd, _vt.vdiff_table as vdt set vd.started_at = NULL, vd.completed_at = NULL, vd.state = 'pending', + vdt.state = 'pending' where vd.vdiff_uuid = %s and vd.id = vdt.vdiff_id and vd.state in ('completed', 'stopped') + and vdt.state in ('completed', 'stopped')`, encodeString(uuid)), + result: &sqltypes.Result{ + RowsAffected: 0, // No _vt.vdiff_table records + }, + }, + { + query: fmt.Sprintf(`update _vt.vdiff as vd set vd.state = 'pending' where vd.vdiff_uuid = %s and vd.state = 'stopped' and + vd.started_at is NULL and vd.completed_at is NULL and + (select count(*) as cnt from _vt.vdiff_table as vdt where vd.id = vdt.vdiff_id) = 0`, + encodeString(uuid)), + result: &sqltypes.Result{ + RowsAffected: 1, + }, + }, + { + query: "select * from _vt.vdiff where id = 1", + }, + }, + }, + { + name: "resume completed vdiff", + req: &tabletmanagerdatapb.VDiffRequest{ + Action: string(ResumeAction), + VdiffUuid: uuid, + Keyspace: keyspace, + Workflow: workflow, + }, + expectQueries: []queryAndResult{ + { + query: fmt.Sprintf("select id as id from _vt.vdiff where vdiff_uuid = %s", encodeString(uuid)), + result: sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "id", + "int64", + ), + "1", + ), + }, + { + query: fmt.Sprintf(`update _vt.vdiff as vd, _vt.vdiff_table as vdt set vd.started_at = NULL, vd.completed_at = NULL, vd.state = 'pending', + vdt.state = 'pending' where vd.vdiff_uuid = %s and vd.id = vdt.vdiff_id and vd.state in ('completed', 'stopped') + and vdt.state in ('completed', 'stopped')`, encodeString(uuid)), + result: &sqltypes.Result{ + RowsAffected: 1, + }, + }, + { + query: "select * from _vt.vdiff where id = 1", + }, + }, + }, { name: "delete by uuid", req: &tabletmanagerdatapb.VDiffRequest{ @@ -213,6 +309,7 @@ func TestPerformVDiffAction(t *testing.T) { }, }, } + errCount := int64(0) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go index ef3c673cc8f..61d713a8e58 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/engine_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/engine_test.go @@ -77,10 +77,10 @@ func TestEngineOpen(t *testing.T) { fmt.Sprintf("1|%s|%s|%s|%s|%s|%s|%s|", UUID, vdiffenv.workflow, tstenv.KeyspaceName, tstenv.ShardName, vdiffDBName, tt.state, optionsJS), ), nil) vdenv.dbClient.ExpectRequest(fmt.Sprintf("select * from _vt.vreplication where workflow = '%s' and db_name = '%s'", vdiffenv.workflow, vdiffDBName), sqltypes.MakeTestResult(sqltypes.MakeTestFields( - "id|workflow|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type", - "int64|varbinary|blob|varbinary|varbinary|int64|int64|varbinary|varbinary|int64|int64|varbinary|varbinary|varbinary|int64|varbinary|int64|int64|int64|varchar|int64", + "id|workflow|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|options", + "int64|varbinary|blob|varbinary|varbinary|int64|int64|varbinary|varbinary|int64|int64|varbinary|varbinary|varbinary|int64|varbinary|int64|int64|int64|varchar|int64|varchar", ), - fmt.Sprintf("1|%s|%s|%s||9223372036854775807|9223372036854775807||PRIMARY,REPLICA|1669511347|0|Running||%s|200||1669511347|1|0||1", vdiffenv.workflow, vreplSource, vdiffSourceGtid, vdiffDBName), + fmt.Sprintf("1|%s|%s|%s||9223372036854775807|9223372036854775807||PRIMARY,REPLICA|1669511347|0|Running||%s|200||1669511347|1|0||1|{}", vdiffenv.workflow, vreplSource, vdiffSourceGtid, vdiffDBName), ), nil) // Now let's short circuit the vdiff as we know that the open has worked as expected. @@ -126,10 +126,10 @@ func TestVDiff(t *testing.T) { vdenv.dbClient.ExpectRequest("select * from _vt.vdiff where id = 1", controllerQR, nil) vdenv.dbClient.ExpectRequest(fmt.Sprintf("select * from _vt.vreplication where workflow = '%s' and db_name = '%s'", vdiffenv.workflow, vdiffDBName), sqltypes.MakeTestResult(sqltypes.MakeTestFields( - "id|workflow|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type", - "int64|varbinary|blob|varbinary|varbinary|int64|int64|varbinary|varbinary|int64|int64|varbinary|varbinary|varbinary|int64|varbinary|int64|int64|int64|varchar|int64", + "id|workflow|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|options", + "int64|varbinary|blob|varbinary|varbinary|int64|int64|varbinary|varbinary|int64|int64|varbinary|varbinary|varbinary|int64|varbinary|int64|int64|int64|varchar|int64|varchar", ), - fmt.Sprintf("1|%s|%s|%s||9223372036854775807|9223372036854775807||PRIMARY,REPLICA|1669511347|0|Running||%s|200||1669511347|1|0||1", vdiffenv.workflow, vreplSource, vdiffSourceGtid, vdiffDBName), + fmt.Sprintf("1|%s|%s|%s||9223372036854775807|9223372036854775807||PRIMARY,REPLICA|1669511347|0|Running||%s|200||1669511347|1|0||1|{}", vdiffenv.workflow, vreplSource, vdiffSourceGtid, vdiffDBName), ), nil) vdenv.dbClient.ExpectRequest("update _vt.vdiff set state = 'started', last_error = left('', 1024) , started_at = utc_timestamp() where id = 1", singleRowAffected, nil) vdenv.dbClient.ExpectRequest("insert into _vt.vdiff_log(vdiff_id, message) values (1, 'State changed to: started')", singleRowAffected, nil) @@ -263,10 +263,10 @@ func TestEngineRetryErroredVDiffs(t *testing.T) { fmt.Sprintf("%s|%s|%s|%s|%s|%s|pending|%s|", id, UUID, vdiffenv.workflow, tstenv.KeyspaceName, tstenv.ShardName, vdiffDBName, optionsJS), ), nil) vdiffenv.dbClient.ExpectRequest(fmt.Sprintf("select * from _vt.vreplication where workflow = '%s' and db_name = '%s'", vdiffenv.workflow, vdiffDBName), sqltypes.MakeTestResult(sqltypes.MakeTestFields( - "id|workflow|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type", - "int64|varbinary|blob|varbinary|varbinary|int64|int64|varbinary|varbinary|int64|int64|varbinary|varbinary|varbinary|int64|varbinary|int64|int64|int64|varchar|int64", + "id|workflow|source|pos|stop_pos|max_tps|max_replication_lag|cell|tablet_types|time_updated|transaction_timestamp|state|message|db_name|rows_copied|tags|time_heartbeat|workflow_type|time_throttled|component_throttled|workflow_sub_type|options", + "int64|varbinary|blob|varbinary|varbinary|int64|int64|varbinary|varbinary|int64|int64|varbinary|varbinary|varbinary|int64|varbinary|int64|int64|int64|varchar|int64|varchar", ), - fmt.Sprintf("%s|%s|%s|%s||9223372036854775807|9223372036854775807||PRIMARY,REPLICA|1669511347|0|Running||%s|200||1669511347|1|0||1", id, vdiffenv.workflow, vreplSource, vdiffSourceGtid, vdiffDBName), + fmt.Sprintf("%s|%s|%s|%s||9223372036854775807|9223372036854775807||PRIMARY,REPLICA|1669511347|0|Running||%s|200||1669511347|1|0||1|{}", id, vdiffenv.workflow, vreplSource, vdiffSourceGtid, vdiffDBName), ), nil) // At this point we know that we kicked off the expected retry so we can short circuit the vdiff. diff --git a/go/vt/vttablet/tabletmanager/vdiff/framework_test.go b/go/vt/vttablet/tabletmanager/vdiff/framework_test.go index cf24950bda3..33a0da8e23f 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/framework_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/framework_test.go @@ -26,10 +26,13 @@ import ( "sync" "testing" + "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + _flag "vitess.io/vitess/go/internal/flag" "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/mysql/capabilities" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/grpcclient" @@ -182,6 +185,7 @@ func init() { } func TestMain(m *testing.M) { + _flag.ParseFlagsForTest() exitCode := func() int { var err error ctx, cancel := context.WithCancel(context.Background()) @@ -212,7 +216,7 @@ func shortCircuitTestAfterQuery(query string, dbClient *binlogplayer.MockDBClien dbClient.ExpectRequest("insert into _vt.vdiff_log(vdiff_id, message) values (1, 'Error: Short circuiting test')", singleRowAffected, nil) } -//-------------------------------------- +// -------------------------------------- // Topos and tablets // fakeTabletConn implement TabletConn interface. We only care about the @@ -248,7 +252,7 @@ func (ftc *fakeTabletConn) VStream(ctx context.Context, request *binlogdatapb.VS if vstreamHook != nil { vstreamHook(ctx) } - return vdiffenv.vse.Stream(ctx, request.Position, request.TableLastPKs, request.Filter, throttlerapp.VStreamerName, send) + return vdiffenv.vse.Stream(ctx, request.Position, request.TableLastPKs, request.Filter, throttlerapp.VStreamerName, send, nil) } // vstreamRowsHook allows you to do work just before calling VStreamRows. @@ -275,14 +279,14 @@ func (ftc *fakeTabletConn) VStreamRows(ctx context.Context, request *binlogdatap vstreamRowsSendHook(ctx) } return send(rows) - }) + }, nil) } func (ftc *fakeTabletConn) Close(ctx context.Context) error { return nil } -//-------------------------------------- +// -------------------------------------- // Binlog Client to TabletManager // fakeBinlogClient satisfies binlogplayer.Client. @@ -343,7 +347,7 @@ func (bts *btStream) Recv() (*binlogdatapb.BinlogTransaction, error) { return nil, bts.ctx.Err() } -//-------------------------------------- +// -------------------------------------- // DBCLient wrapper func realDBClientFactory() binlogplayer.DBClient { @@ -422,7 +426,11 @@ func (dbc *realDBClient) ExecuteFetchMulti(query string, maxrows int) ([]*sqltyp return results, nil } -//---------------------------------------------- +func (dbc *realDBClient) SupportsCapability(capability capabilities.FlavorCapability) (bool, error) { + return dbc.conn.SupportsCapability(capability) +} + +// ---------------------------------------------- // fakeTMClient type fakeTMClient struct { @@ -617,10 +625,10 @@ func (tvde *testVDiffEnv) close() { tstenv.SchemaEngine.Reload(context.Background()) } tvde.tablets = nil - vdiffenv.vse.Close() - vdiffenv.vre.Close() - vdiffenv.vde.Close() - vdiffenv.dbClient.Close() + tvde.vse.Close() + tvde.vre.Close() + tvde.vde.Close() + tvde.dbClient.Close() } func (tvde *testVDiffEnv) addTablet(id int, keyspace, shard string, tabletType topodatapb.TabletType) *fakeTabletConn { @@ -655,3 +663,16 @@ func (tvde *testVDiffEnv) addTablet(id int, keyspace, shard string, tabletType t tstenv.SchemaEngine.Reload(context.Background()) return tvde.tablets[id] } + +func (tvde *testVDiffEnv) createController(t *testing.T, id int) *controller { + controllerQR := sqltypes.MakeTestResult(sqltypes.MakeTestFields( + vdiffTestCols, + vdiffTestColTypes, + ), + fmt.Sprintf("%d|%s|%s|%s|%s|%s|%s|%s|", id, uuid.New(), tvde.workflow, tstenv.KeyspaceName, tstenv.ShardName, vdiffDBName, PendingState, optionsJS), + ) + tvde.dbClient.ExpectRequest(fmt.Sprintf("select * from _vt.vdiff where id = %d", id), noResults, nil) + ct, err := newController(context.Background(), controllerQR.Named().Row(), tvde.dbClientFactory, tstenv.TopoServ, tvde.vde, tvde.opts) + require.NoError(t, err) + return ct +} diff --git a/go/vt/vttablet/tabletmanager/vdiff/report.go b/go/vt/vttablet/tabletmanager/vdiff/report.go index 62ce6d24585..b53288b3019 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/report.go +++ b/go/vt/vttablet/tabletmanager/vdiff/report.go @@ -18,11 +18,11 @@ package vdiff import ( "fmt" - "sort" - "strings" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/sqlparser" + + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" ) const ( @@ -63,9 +63,9 @@ type RowDiff struct { Query string `json:"Query,omitempty"` } -func (td *tableDiffer) genRowDiff(queryStmt string, row []sqltypes.Value, debug, onlyPks bool) (*RowDiff, error) { - drp := &RowDiff{} - drp.Row = make(map[string]string) +func (td *tableDiffer) genRowDiff(queryStmt string, row []sqltypes.Value, opts *tabletmanagerdatapb.VDiffReportOptions) (*RowDiff, error) { + rd := &RowDiff{} + rd.Row = make(map[string]string) statement, err := td.wd.ct.vde.parser.Parse(queryStmt) if err != nil { return nil, err @@ -75,30 +75,44 @@ func (td *tableDiffer) genRowDiff(queryStmt string, row []sqltypes.Value, debug, return nil, fmt.Errorf("unexpected: %+v", sqlparser.String(statement)) } - if debug { - drp.Query = td.genDebugQueryDiff(sel, row, onlyPks) + if opts.GetDebugQuery() { + rd.Query = td.genDebugQueryDiff(sel, row, opts.GetOnlyPks()) } - setVal := func(index int) { + addVal := func(index int, truncateAt int) { buf := sqlparser.NewTrackedBuffer(nil) sel.SelectExprs[index].Format(buf) col := buf.String() - drp.Row[col] = row[index].ToString() + // Let's truncate if it's really worth it to avoid losing + // value for a few chars. + if truncateAt > 0 && row[index].Len() >= truncateAt+len(truncatedNotation)+20 { + rd.Row[col] = row[index].ToString()[:truncateAt] + truncatedNotation + } else { + rd.Row[col] = row[index].ToString() + } } - if onlyPks { - for _, pkI := range td.tablePlan.selectPks { - setVal(pkI) - } - return drp, nil + // Include PK columns first and do not truncate them so that + // the user can always at a minimum identify the row for + // further investigation. + pks := make(map[int]struct{}, len(td.tablePlan.selectPks)) + for _, pkI := range td.tablePlan.selectPks { + addVal(pkI, 0) + pks[pkI] = struct{}{} } + if opts.GetOnlyPks() { + return rd, nil + } + + truncateAt := int(opts.GetRowDiffColumnTruncateAt()) for i := range sel.SelectExprs { - setVal(i) + if _, pk := pks[i]; !pk { + addVal(i, truncateAt) + } } - formatSampleRow(drp) - return drp, nil + return rd, nil } func (td *tableDiffer) genDebugQueryDiff(sel *sqlparser.Select, row []sqltypes.Value, onlyPks bool) string { @@ -130,22 +144,3 @@ func (td *tableDiffer) genDebugQueryDiff(sel *sqlparser.Select, row []sqltypes.V buf.Myprintf(";") return buf.String() } - -// formatSampleRow returns a formatted string representing a sample -// extra/mismatched row -func formatSampleRow(rd *RowDiff) { - keys := make([]string, 0, len(rd.Row)) - rowString := strings.Builder{} - for k := range rd.Row { - keys = append(keys, k) - } - - sort.Strings(keys) - for _, k := range keys { - // Let's truncate if it's really worth it to avoid losing value for a few chars - if len(rd.Row[k]) >= 30+len(truncatedNotation)+20 { - rd.Row[k] = rd.Row[k][:30] + truncatedNotation - } - rowString.WriteString(fmt.Sprintf("%s: %s\n", k, rd.Row[k])) - } -} diff --git a/go/vt/vttablet/tabletmanager/vdiff/report_test.go b/go/vt/vttablet/tabletmanager/vdiff/report_test.go new file mode 100644 index 00000000000..9b6d840f751 --- /dev/null +++ b/go/vt/vttablet/tabletmanager/vdiff/report_test.go @@ -0,0 +1,186 @@ +/* +Copyright 2024 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 vdiff + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/mysql/collations" + "vitess.io/vitess/go/sqltypes" + + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" +) + +func TestGenRowDiff(t *testing.T) { + vdenv := newTestVDiffEnv(t) + defer vdenv.close() + + testCases := []struct { + name string + schema *tabletmanagerdatapb.SchemaDefinition + query string + tablePlan *tablePlan + row []sqltypes.Value + reportOptions *tabletmanagerdatapb.VDiffReportOptions + want *RowDiff + }{ + { + name: "defaults", + schema: &tabletmanagerdatapb.SchemaDefinition{ + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: "t1", + Columns: []string{"c1", "c2", "c3", "c4", "c5"}, + PrimaryKeyColumns: []string{"c1", "c5"}, + Fields: sqltypes.MakeTestFields("c1|c2|c3|c4|c5", "int64|int64|varchar|varchar|int64"), + }, + }, + }, + query: "select c1,c2,c3,c4,c5 from t1", + tablePlan: &tablePlan{ + selectPks: []int{0, 4}, + }, + row: []sqltypes.Value{ + sqltypes.NewInt64(1), + sqltypes.NewInt64(2), + sqltypes.NewVarChar("hi3"), + sqltypes.NewVarChar("hi4"), + sqltypes.NewInt64(5), + }, + reportOptions: &tabletmanagerdatapb.VDiffReportOptions{}, + want: &RowDiff{ + Row: map[string]string{ // The two PK cols should be first + "c1": "1", "c5": "5", "c2": "2", "c3": "hi3", "c4": "hi4", + }, + }, + }, + { + name: "only PKs", + schema: &tabletmanagerdatapb.SchemaDefinition{ + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: "t1", + Columns: []string{"c1", "c2"}, + PrimaryKeyColumns: []string{"c1"}, + Fields: sqltypes.MakeTestFields("c1|c2", "int64|int64"), + }, + }, + }, + query: "select c1,c2 from t1", + tablePlan: &tablePlan{ + selectPks: []int{0}, + }, + row: []sqltypes.Value{ + sqltypes.NewInt64(1), + sqltypes.NewInt64(2), + }, + reportOptions: &tabletmanagerdatapb.VDiffReportOptions{ + OnlyPks: true, + }, + want: &RowDiff{ + Row: map[string]string{ + "c1": "1", + }, + }, + }, + { + name: "debug query", + schema: &tabletmanagerdatapb.SchemaDefinition{ + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: "t1", + Columns: []string{"c1", "c2"}, + PrimaryKeyColumns: []string{"c1"}, + Fields: sqltypes.MakeTestFields("c1|c2", "int64|int64"), + }, + }, + }, + query: "select c1,c2 from t1", + tablePlan: &tablePlan{ + selectPks: []int{0}, + }, + row: []sqltypes.Value{ + sqltypes.NewInt64(1), + sqltypes.NewInt64(2), + }, + reportOptions: &tabletmanagerdatapb.VDiffReportOptions{ + DebugQuery: true, + }, + want: &RowDiff{ + Row: map[string]string{ + "c1": "1", + "c2": "2", + }, + Query: "select c1, c2 from t1 where c1=1;", + }, + }, + { + name: "column truncation", + schema: &tabletmanagerdatapb.SchemaDefinition{ + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{ + { + Name: "t1", + Columns: []string{"c1", "c2"}, + PrimaryKeyColumns: []string{"c1"}, + Fields: sqltypes.MakeTestFields("c1|c2", "varchar|varchar"), + }, + }, + }, + query: "select c1,c2 from t1", + tablePlan: &tablePlan{ + selectPks: []int{0}, + }, + row: []sqltypes.Value{ + sqltypes.NewVarChar(strings.Repeat("a", 100)), + sqltypes.NewVarChar(strings.Repeat("b", 100)), + }, + reportOptions: &tabletmanagerdatapb.VDiffReportOptions{ + RowDiffColumnTruncateAt: 5, + }, + want: &RowDiff{ + Row: map[string]string{ + "c1": strings.Repeat("a", 100), // PK fields are not truncated + "c2": strings.Repeat("b", 5) + truncatedNotation, + }, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + require.NotNil(t, tc.tablePlan) + require.NotNil(t, tc.row) + require.NotNil(t, tc.reportOptions) + + vdenv.tmc.schema = tc.schema + ct := vdenv.createController(t, 1) + wd, err := newWorkflowDiffer(ct, vdenv.opts, collations.MySQL8()) + require.NoError(t, err) + td := &tableDiffer{ + wd: wd, + sourceQuery: tc.query, + tablePlan: tc.tablePlan, + } + + got, err := td.genRowDiff(tc.query, tc.row, tc.reportOptions) + require.NoError(t, err) + require.EqualValues(t, tc.want, got) + }) + } +} diff --git a/go/vt/vttablet/tabletmanager/vdiff/schema.go b/go/vt/vttablet/tabletmanager/vdiff/schema.go index afb79b4e4b3..9fef975e1e0 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/schema.go +++ b/go/vt/vttablet/tabletmanager/vdiff/schema.go @@ -22,6 +22,9 @@ const ( sqlResumeVDiff = `update _vt.vdiff as vd, _vt.vdiff_table as vdt set vd.started_at = NULL, vd.completed_at = NULL, vd.state = 'pending', vdt.state = 'pending' where vd.vdiff_uuid = %a and vd.id = vdt.vdiff_id and vd.state in ('completed', 'stopped') and vdt.state in ('completed', 'stopped')` + sqlStartVDiff = `update _vt.vdiff as vd set vd.state = 'pending' where vd.vdiff_uuid = %a and vd.state = 'stopped' and + vd.started_at is NULL and vd.completed_at is NULL and + (select count(*) as cnt from _vt.vdiff_table as vdt where vd.id = vdt.vdiff_id) = 0` sqlRetryVDiff = `update _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) set vd.state = 'pending', vd.last_error = '', vdt.state = 'pending' where vd.id = %a and (vd.state = 'error' or vdt.state = 'error')` sqlGetVDiffByKeyspaceWorkflowUUID = "select * from _vt.vdiff where keyspace = %a and workflow = %a and vdiff_uuid = %a" diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go index f91a82b9d2c..102d7535af9 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_differ.go @@ -486,7 +486,7 @@ func (td *tableDiffer) setupRowSorters() { } } -func (td *tableDiffer) diff(ctx context.Context, rowsToCompare int64, debug, onlyPks bool, maxExtraRowsToCompare int64, maxReportSampleRows int64, stop <-chan time.Time) (*DiffReport, error) { +func (td *tableDiffer) diff(ctx context.Context, coreOpts *tabletmanagerdatapb.VDiffCoreOptions, reportOpts *tabletmanagerdatapb.VDiffReportOptions, stop <-chan time.Time) (*DiffReport, error) { defer td.wd.ct.TableDiffPhaseTimings.Record(fmt.Sprintf("%s.%s", td.table.Name, diffingTable), time.Now()) dbClient := td.wd.ct.dbClientFactory() if err := dbClient.Connect(); err != nil { @@ -539,6 +539,10 @@ func (td *tableDiffer) diff(ctx context.Context, rowsToCompare int64, debug, onl globalStats.RowsDiffedCount.Add(dr.ProcessedRows) }() + rowsToCompare := coreOpts.GetMaxRows() + maxExtraRowsToCompare := coreOpts.GetMaxExtraRowsToCompare() + maxReportSampleRows := reportOpts.GetMaxSampleRows() + for { lastProcessedRow = sourceRow @@ -560,6 +564,7 @@ func (td *tableDiffer) diff(ctx context.Context, rowsToCompare int64, debug, onl return nil, err } } + rowsToCompare-- if rowsToCompare < 0 { log.Infof("Stopping vdiff, specified row limit reached") @@ -587,7 +592,7 @@ func (td *tableDiffer) diff(ctx context.Context, rowsToCompare int64, debug, onl advanceSource = true advanceTarget = true if sourceRow == nil { - diffRow, err := td.genRowDiff(td.tablePlan.sourceQuery, targetRow, debug, onlyPks) + diffRow, err := td.genRowDiff(td.tablePlan.sourceQuery, targetRow, reportOpts) if err != nil { return nil, vterrors.Wrap(err, "unexpected error generating diff") } @@ -605,7 +610,7 @@ func (td *tableDiffer) diff(ctx context.Context, rowsToCompare int64, debug, onl if targetRow == nil { // No more rows from the target but we know we have more rows from // source, so drain them and update the counts. - diffRow, err := td.genRowDiff(td.tablePlan.sourceQuery, sourceRow, debug, onlyPks) + diffRow, err := td.genRowDiff(td.tablePlan.sourceQuery, sourceRow, reportOpts) if err != nil { return nil, vterrors.Wrap(err, "unexpected error generating diff") } @@ -628,7 +633,7 @@ func (td *tableDiffer) diff(ctx context.Context, rowsToCompare int64, debug, onl return nil, err case c < 0: if dr.ExtraRowsSource < maxExtraRowsToCompare { - diffRow, err := td.genRowDiff(td.tablePlan.sourceQuery, sourceRow, debug, onlyPks) + diffRow, err := td.genRowDiff(td.tablePlan.sourceQuery, sourceRow, reportOpts) if err != nil { return nil, vterrors.Wrap(err, "unexpected error generating diff") } @@ -639,7 +644,7 @@ func (td *tableDiffer) diff(ctx context.Context, rowsToCompare int64, debug, onl continue case c > 0: if dr.ExtraRowsTarget < maxExtraRowsToCompare { - diffRow, err := td.genRowDiff(td.tablePlan.targetQuery, targetRow, debug, onlyPks) + diffRow, err := td.genRowDiff(td.tablePlan.targetQuery, targetRow, reportOpts) if err != nil { return nil, vterrors.Wrap(err, "unexpected error generating diff") } @@ -659,11 +664,11 @@ func (td *tableDiffer) diff(ctx context.Context, rowsToCompare int64, debug, onl case c != 0: // We don't do a second pass to compare mismatched rows so we can cap the slice here. if maxReportSampleRows == 0 || dr.MismatchedRows < maxReportSampleRows { - sourceDiffRow, err := td.genRowDiff(td.tablePlan.targetQuery, sourceRow, debug, onlyPks) + sourceDiffRow, err := td.genRowDiff(td.tablePlan.targetQuery, sourceRow, reportOpts) if err != nil { return nil, vterrors.Wrap(err, "unexpected error generating diff") } - targetDiffRow, err := td.genRowDiff(td.tablePlan.targetQuery, targetRow, debug, onlyPks) + targetDiffRow, err := td.genRowDiff(td.tablePlan.targetQuery, targetRow, reportOpts) if err != nil { return nil, vterrors.Wrap(err, "unexpected error generating diff") } diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_plan.go b/go/vt/vttablet/tabletmanager/vdiff/table_plan.go index becce6f90e6..836df8ffe94 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_plan.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_plan.go @@ -30,6 +30,7 @@ import ( "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/engine" "vitess.io/vitess/go/vt/vtgate/engine/opcode" + vttablet "vitess.io/vitess/go/vt/vttablet/common" querypb "vitess.io/vitess/go/vt/proto/query" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" @@ -54,17 +55,19 @@ type tablePlan struct { pkCols []int // selectPks is the list of pk columns as they appear in the select clause for the diff. - selectPks []int - dbName string - table *tabletmanagerdatapb.TableDefinition - orderBy sqlparser.OrderBy - aggregates []*engine.AggregateParams + selectPks []int + dbName string + table *tabletmanagerdatapb.TableDefinition + orderBy sqlparser.OrderBy + aggregates []*engine.AggregateParams + WorkflowConfig **vttablet.VReplicationConfig } func (td *tableDiffer) buildTablePlan(dbClient binlogplayer.DBClient, dbName string, collationEnv *collations.Environment) (*tablePlan, error) { tp := &tablePlan{ - table: td.table, - dbName: dbName, + table: td.table, + dbName: dbName, + WorkflowConfig: td.wd.WorkflowConfig, } statement, err := td.wd.ct.vde.parser.Parse(td.sourceQuery) if err != nil { diff --git a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go index 8c00b61b784..ef30d8f14b0 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go +++ b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ.go @@ -24,8 +24,6 @@ import ( "strings" "time" - "vitess.io/vitess/go/vt/schema" - "google.golang.org/protobuf/encoding/prototext" "vitess.io/vitess/go/mysql/collations" @@ -33,10 +31,12 @@ import ( "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtctl/schematools" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/vindexes" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletmanager/vreplication" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -53,15 +53,18 @@ type workflowDiffer struct { tableDiffers map[string]*tableDiffer // key is table name opts *tabletmanagerdatapb.VDiffOptions - collationEnv *collations.Environment + collationEnv *collations.Environment + WorkflowConfig **vttablet.VReplicationConfig } func newWorkflowDiffer(ct *controller, opts *tabletmanagerdatapb.VDiffOptions, collationEnv *collations.Environment) (*workflowDiffer, error) { + vttablet.InitVReplicationConfigDefaults() wd := &workflowDiffer{ - ct: ct, - opts: opts, - tableDiffers: make(map[string]*tableDiffer, 1), - collationEnv: collationEnv, + ct: ct, + opts: opts, + tableDiffers: make(map[string]*tableDiffer, 1), + collationEnv: collationEnv, + WorkflowConfig: &vttablet.DefaultVReplicationConfig, } return wd, nil } @@ -205,7 +208,7 @@ func (wd *workflowDiffer) diffTable(ctx context.Context, dbClient binlogplayer.D } log.Infof("Table initialization done on table %s for vdiff %s", td.table.Name, wd.ct.uuid) diffTimer = time.NewTimer(maxDiffRuntime) - diffReport, diffErr = td.diff(ctx, wd.opts.CoreOptions.MaxRows, wd.opts.ReportOptions.DebugQuery, wd.opts.ReportOptions.OnlyPks, wd.opts.CoreOptions.MaxExtraRowsToCompare, wd.opts.ReportOptions.MaxSampleRows, diffTimer.C) + diffReport, diffErr = td.diff(ctx, wd.opts.CoreOptions, wd.opts.ReportOptions, diffTimer.C) if diffErr == nil { // We finished the diff successfully break } diff --git a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go index d4f9ddb001d..c51b6fdf281 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/workflow_differ_test.go @@ -574,6 +574,7 @@ func TestBuildPlanSuccess(t *testing.T) { err = wd.buildPlan(dbc, filter, testSchema) require.NoError(t, err, tcase.input) require.Equal(t, 1, len(wd.tableDiffers), tcase.input) + wd.tableDiffers[tcase.table].tablePlan.WorkflowConfig = nil assert.Equal(t, tcase.tablePlan, wd.tableDiffers[tcase.table].tablePlan, tcase.input) // Confirm that the options are passed through. @@ -588,15 +589,7 @@ func TestBuildPlanInclude(t *testing.T) { vdenv := newTestVDiffEnv(t) defer vdenv.close() - controllerQR := sqltypes.MakeTestResult(sqltypes.MakeTestFields( - vdiffTestCols, - vdiffTestColTypes, - ), - fmt.Sprintf("1|%s|%s|%s|%s|%s|%s|%s|", uuid.New(), vdiffenv.workflow, tstenv.KeyspaceName, tstenv.ShardName, vdiffDBName, PendingState, optionsJS), - ) - vdiffenv.dbClient.ExpectRequest("select * from _vt.vdiff where id = 1", noResults, nil) - ct, err := newController(context.Background(), controllerQR.Named().Row(), vdiffenv.dbClientFactory, tstenv.TopoServ, vdiffenv.vde, vdiffenv.opts) - require.NoError(t, err) + ct := vdenv.createController(t, 1) schm := &tabletmanagerdatapb.SchemaDefinition{ TableDefinitions: []*tabletmanagerdatapb.TableDefinition{{ diff --git a/go/vt/vttablet/tabletmanager/vreplication/controller.go b/go/vt/vttablet/tabletmanager/vreplication/controller.go index 581244eebb3..7067211ff10 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/controller.go +++ b/go/vt/vttablet/tabletmanager/vreplication/controller.go @@ -18,6 +18,7 @@ package vreplication import ( "context" + "encoding/json" "fmt" "strconv" "strings" @@ -31,12 +32,14 @@ import ( "vitess.io/vitess/go/vt/discovery" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/mysqlctl" + "vitess.io/vitess/go/vt/proto/vtctldata" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) const ( @@ -44,6 +47,9 @@ const ( // give up and return an error message that the user // can see and act upon if needed. tabletPickerRetries = 5 + + // Prepended to the message to indicate that it is a terminal error. + TerminalErrorIndicator = "terminal error" ) // controller is created by Engine. Members are initialized upfront. @@ -68,15 +74,36 @@ type controller struct { sourceTablet atomic.Value lastWorkflowError *vterrors.LastError + WorkflowConfig *vttablet.VReplicationConfig +} + +func processWorkflowOptions(params map[string]string) (*vttablet.VReplicationConfig, error) { + options, ok := params["options"] + if !ok { + options = "{}" + } + var workflowOptions vtctldata.WorkflowOptions + if err := json.Unmarshal([]byte(options), &workflowOptions); err != nil { + return nil, fmt.Errorf("failed to parse options column: %v", err) + } + workflowConfig, err := vttablet.NewVReplicationConfig(workflowOptions.Config) + if err != nil { + return nil, fmt.Errorf("failed to process config options: %v", err) + } + return workflowConfig, nil } // newController creates a new controller. Unless a stream is explicitly 'Stopped', // this function launches a goroutine to perform continuous vreplication. -func newController(ctx context.Context, params map[string]string, dbClientFactory func() binlogplayer.DBClient, mysqld mysqlctl.MysqlDaemon, ts *topo.Server, cell, tabletTypesStr string, blpStats *binlogplayer.Stats, vre *Engine, tpo discovery.TabletPickerOptions) (*controller, error) { +func newController(ctx context.Context, params map[string]string, dbClientFactory func() binlogplayer.DBClient, mysqld mysqlctl.MysqlDaemon, ts *topo.Server, cell string, blpStats *binlogplayer.Stats, vre *Engine, tpo discovery.TabletPickerOptions) (*controller, error) { if blpStats == nil { blpStats = binlogplayer.NewStats() } - + workflowConfig, err := processWorkflowOptions(params) + if err != nil { + return nil, err + } + tabletTypesStr := workflowConfig.TabletTypesStr ct := &controller{ vre: vre, dbClientFactory: dbClientFactory, @@ -84,7 +111,9 @@ func newController(ctx context.Context, params map[string]string, dbClientFactor blpStats: blpStats, done: make(chan struct{}), source: &binlogdatapb.BinlogSource{}, + WorkflowConfig: workflowConfig, } + blpStats.WorkflowConfig = workflowConfig.String() ct.sourceTablet.Store(&topodatapb.TabletAlias{}) log.Infof("creating controller with cell: %v, tabletTypes: %v, and params: %v", cell, tabletTypesStr, params) @@ -94,7 +123,7 @@ func newController(ctx context.Context, params map[string]string, dbClientFactor } ct.id = int32(id) ct.workflow = params["workflow"] - ct.lastWorkflowError = vterrors.NewLastError(fmt.Sprintf("VReplication controller %d for workflow %q", ct.id, ct.workflow), maxTimeToRetryError) + ct.lastWorkflowError = vterrors.NewLastError(fmt.Sprintf("VReplication controller %d for workflow %q", ct.id, ct.workflow), workflowConfig.MaxTimeToRetryError) state := params["state"] blpStats.State.Store(state) @@ -164,8 +193,8 @@ func (ct *controller) run(ctx context.Context) { } ct.blpStats.ErrorCounts.Add([]string{"Stream Error"}, 1) - binlogplayer.LogError(fmt.Sprintf("error in stream %v, will retry after %v", ct.id, retryDelay), err) - timer := time.NewTimer(retryDelay) + binlogplayer.LogError(fmt.Sprintf("error in stream %v, will retry after %v", ct.id, ct.WorkflowConfig.RetryDelay), err) + timer := time.NewTimer(ct.WorkflowConfig.RetryDelay) select { case <-ctx.Done(): log.Warningf("context canceled: %s", err.Error()) @@ -176,6 +205,38 @@ func (ct *controller) run(ctx context.Context) { } } +func setDBClientSettings(dbClient binlogplayer.DBClient, workflowConfig *vttablet.VReplicationConfig) error { + if workflowConfig == nil { + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "vreplication controller: workflowConfig is nil") + } + const maxRows = 10000 + // Timestamp fields from binlogs are always sent as UTC. + // So, we should set the timezone to be UTC for those values to be correctly inserted. + if _, err := dbClient.ExecuteFetch("set @@session.time_zone = '+00:00'", maxRows); err != nil { + return err + } + // Tables may have varying character sets. To ship the bits without interpreting them + // we set the character set to be binary. + if _, err := dbClient.ExecuteFetch("set names 'binary'", maxRows); err != nil { + return err + } + if _, err := dbClient.ExecuteFetch(fmt.Sprintf("set @@session.net_read_timeout = %v", + workflowConfig.NetReadTimeout), maxRows); err != nil { + return err + } + if _, err := dbClient.ExecuteFetch(fmt.Sprintf("set @@session.net_write_timeout = %v", + workflowConfig.NetWriteTimeout), maxRows); err != nil { + return err + } + // We must apply AUTO_INCREMENT values precisely as we got them. This include the 0 value, which is + // not recommended in AUTO_INCREMENT, and yet is valid. + if _, err := dbClient.ExecuteFetch("set @@session.sql_mode = CONCAT(@@session.sql_mode, ',NO_AUTO_VALUE_ON_ZERO')", + maxRows); err != nil { + return err + } + return nil +} + func (ct *controller) runBlp(ctx context.Context) (err error) { defer func() { ct.sourceTablet.Store(&topodatapb.TabletAlias{}) @@ -217,27 +278,9 @@ func (ct *controller) runBlp(ctx context.Context) (err error) { player := binlogplayer.NewBinlogPlayerKeyRange(dbClient, tablet, ct.source.KeyRange, ct.id, ct.blpStats) return player.ApplyBinlogEvents(ctx) case ct.source.Filter != nil: - // Timestamp fields from binlogs are always sent as UTC. - // So, we should set the timezone to be UTC for those values to be correctly inserted. - if _, err := dbClient.ExecuteFetch("set @@session.time_zone = '+00:00'", 10000); err != nil { - return err - } - // Tables may have varying character sets. To ship the bits without interpreting them - // we set the character set to be binary. - if _, err := dbClient.ExecuteFetch("set names 'binary'", 10000); err != nil { + if err := setDBClientSettings(dbClient, ct.WorkflowConfig); err != nil { return err } - if _, err := dbClient.ExecuteFetch(fmt.Sprintf("set @@session.net_read_timeout = %v", vttablet.VReplicationNetReadTimeout), 10000); err != nil { - return err - } - if _, err := dbClient.ExecuteFetch(fmt.Sprintf("set @@session.net_write_timeout = %v", vttablet.VReplicationNetWriteTimeout), 10000); err != nil { - return err - } - // We must apply AUTO_INCREMENT values precisely as we got them. This include the 0 value, which is not recommended in AUTO_INCREMENT, and yet is valid. - if _, err := dbClient.ExecuteFetch("set @@session.sql_mode = CONCAT(@@session.sql_mode, ',NO_AUTO_VALUE_ON_ZERO')", 10000); err != nil { - return err - } - var vsClient VStreamerClient var err error if name := ct.source.GetExternalMysql(); name != "" { @@ -253,7 +296,7 @@ func (ct *controller) runBlp(ctx context.Context) (err error) { } defer vsClient.Close(ctx) - vr := newVReplicator(ct.id, ct.source, vsClient, ct.blpStats, dbClient, ct.mysqld, ct.vre) + vr := newVReplicator(ct.id, ct.source, vsClient, ct.blpStats, dbClient, ct.mysqld, ct.vre, ct.WorkflowConfig) err = vr.Replicate(ctx) ct.lastWorkflowError.Record(err) @@ -265,7 +308,7 @@ func (ct *controller) runBlp(ctx context.Context) (err error) { if (err != nil && vr.WorkflowSubType == int32(binlogdatapb.VReplicationWorkflowSubType_AtomicCopy)) || isUnrecoverableError(err) || !ct.lastWorkflowError.ShouldRetry() { - + err = vterrors.Wrapf(err, TerminalErrorIndicator) if errSetState := vr.setState(binlogdatapb.VReplicationWorkflowState_Error, err.Error()); errSetState != nil { log.Errorf("INTERNAL: unable to setState() in controller: %v. Could not set error text to: %v.", errSetState, err) return err // yes, err and not errSetState. diff --git a/go/vt/vttablet/tabletmanager/vreplication/controller_test.go b/go/vt/vttablet/tabletmanager/vreplication/controller_test.go index 57cb60384c6..9a0b6ca833c 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/controller_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/controller_test.go @@ -23,6 +23,8 @@ import ( "testing" "time" + vttablet "vitess.io/vitess/go/vt/vttablet/common" + "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/discovery" @@ -70,20 +72,29 @@ var ( defaultTabletPickerOptions = discovery.TabletPickerOptions{} ) +func setTabletTypesStr(tabletTypesStr string) func() { + oldTabletTypesStr := vttablet.DefaultVReplicationConfig.TabletTypesStr + vttablet.DefaultVReplicationConfig.TabletTypesStr = tabletTypesStr + return func() { + vttablet.DefaultVReplicationConfig.TabletTypesStr = oldTabletTypesStr + } +} + func TestControllerKeyRange(t *testing.T) { resetBinlogClient() wantTablet := addTablet(100) defer deleteTablet(wantTablet) params := map[string]string{ - "id": "1", - "state": binlogdatapb.VReplicationWorkflowState_Running.String(), - "source": fmt.Sprintf(`keyspace:"%s" shard:"0" key_range:{end:"\x80"}`, env.KeyspaceName), + "id": "1", + "state": binlogdatapb.VReplicationWorkflowState_Running.String(), + "source": fmt.Sprintf(`keyspace:"%s" shard:"0" key_range:{end:"\x80"}`, env.KeyspaceName), + "options": "{}", } dbClient := binlogplayer.NewMockDBClient(t) dbClient.ExpectRequestRE("update _vt.vreplication set message='Picked source tablet.*", testDMLResponse, nil) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(binlogplayer.TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -94,7 +105,8 @@ func TestControllerKeyRange(t *testing.T) { mysqld.MysqlPort.Store(3306) vre := NewTestEngine(nil, wantTablet.GetAlias().Cell, mysqld, dbClientFactory, dbClientFactory, dbClient.DBName(), nil) - ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], "replica", nil, vre, defaultTabletPickerOptions) + defer setTabletTypesStr("replica")() + ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], nil, vre, defaultTabletPickerOptions) if err != nil { t.Fatal(err) } @@ -113,15 +125,16 @@ func TestControllerTables(t *testing.T) { resetBinlogClient() params := map[string]string{ - "id": "1", - "state": binlogdatapb.VReplicationWorkflowState_Running.String(), - "source": fmt.Sprintf(`keyspace:"%s" shard:"0" tables:"table1" tables:"/funtables_/" `, env.KeyspaceName), + "id": "1", + "state": binlogdatapb.VReplicationWorkflowState_Running.String(), + "source": fmt.Sprintf(`keyspace:"%s" shard:"0" tables:"table1" tables:"/funtables_/" `, env.KeyspaceName), + "options": "{}", } dbClient := binlogplayer.NewMockDBClient(t) dbClient.ExpectRequestRE("update _vt.vreplication set message='Picked source tablet.*", testDMLResponse, nil) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(binlogplayer.TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -155,8 +168,8 @@ func TestControllerTables(t *testing.T) { } mysqld.MysqlPort.Store(3306) vre := NewTestEngine(nil, wantTablet.GetAlias().Cell, mysqld, dbClientFactory, dbClientFactory, dbClient.DBName(), nil) - - ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], "replica", nil, vre, defaultTabletPickerOptions) + defer setTabletTypesStr("replica")() + ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], nil, vre, defaultTabletPickerOptions) if err != nil { t.Fatal(err) } @@ -171,9 +184,10 @@ func TestControllerTables(t *testing.T) { func TestControllerBadID(t *testing.T) { params := map[string]string{ - "id": "bad", + "id": "bad", + "options": "{}", } - _, err := newController(context.Background(), params, nil, nil, nil, "", "", nil, nil, defaultTabletPickerOptions) + _, err := newController(context.Background(), params, nil, nil, nil, "", nil, nil, defaultTabletPickerOptions) want := `strconv.ParseInt: parsing "bad": invalid syntax` if err == nil || err.Error() != want { t.Errorf("newController err: %v, want %v", err, want) @@ -182,11 +196,12 @@ func TestControllerBadID(t *testing.T) { func TestControllerStopped(t *testing.T) { params := map[string]string{ - "id": "1", - "state": binlogdatapb.VReplicationWorkflowState_Stopped.String(), + "id": "1", + "state": binlogdatapb.VReplicationWorkflowState_Stopped.String(), + "options": "{}", } - ct, err := newController(context.Background(), params, nil, nil, nil, "", "", nil, nil, defaultTabletPickerOptions) + ct, err := newController(context.Background(), params, nil, nil, nil, "", nil, nil, defaultTabletPickerOptions) if err != nil { t.Fatal(err) } @@ -210,12 +225,13 @@ func TestControllerOverrides(t *testing.T) { "source": fmt.Sprintf(`keyspace:"%s" shard:"0" key_range:{end:"\x80"}`, env.KeyspaceName), "cell": env.Cells[0], "tablet_types": "replica", + "options": "{}", } dbClient := binlogplayer.NewMockDBClient(t) dbClient.ExpectRequestRE("update _vt.vreplication set message='Picked source tablet.*", testDMLResponse, nil) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(binlogplayer.TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -226,7 +242,8 @@ func TestControllerOverrides(t *testing.T) { mysqld.MysqlPort.Store(3306) vre := NewTestEngine(nil, wantTablet.GetAlias().Cell, mysqld, dbClientFactory, dbClientFactory, dbClient.DBName(), nil) - ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], "rdonly", nil, vre, defaultTabletPickerOptions) + defer setTabletTypesStr("rdonly")() + ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], nil, vre, defaultTabletPickerOptions) if err != nil { t.Fatal(err) } @@ -244,16 +261,17 @@ func TestControllerCanceledContext(t *testing.T) { defer deleteTablet(wantTablet) params := map[string]string{ - "id": "1", - "state": binlogdatapb.VReplicationWorkflowState_Running.String(), - "source": fmt.Sprintf(`keyspace:"%s" shard:"0" key_range:{end:"\x80"}`, env.KeyspaceName), + "id": "1", + "state": binlogdatapb.VReplicationWorkflowState_Running.String(), + "source": fmt.Sprintf(`keyspace:"%s" shard:"0" key_range:{end:"\x80"}`, env.KeyspaceName), + "options": "{}", } ctx, cancel := context.WithCancel(context.Background()) cancel() vre := NewTestEngine(nil, wantTablet.GetAlias().Cell, nil, nil, nil, "", nil) - ct, err := newController(ctx, params, nil, nil, env.TopoServ, env.Cells[0], "rdonly", nil, vre, defaultTabletPickerOptions) + ct, err := newController(ctx, params, nil, nil, env.TopoServ, env.Cells[0], nil, vre, defaultTabletPickerOptions) if err != nil { t.Fatal(err) } @@ -267,9 +285,9 @@ func TestControllerCanceledContext(t *testing.T) { } func TestControllerRetry(t *testing.T) { - savedDelay := retryDelay - defer func() { retryDelay = savedDelay }() - retryDelay = 10 * time.Millisecond + savedDelay := vttablet.DefaultVReplicationConfig.RetryDelay + defer func() { vttablet.DefaultVReplicationConfig.RetryDelay = savedDelay }() + vttablet.DefaultVReplicationConfig.RetryDelay = 10 * time.Millisecond resetBinlogClient() defer deleteTablet(addTablet(100)) @@ -280,16 +298,17 @@ func TestControllerRetry(t *testing.T) { "source": fmt.Sprintf(`keyspace:"%s" shard:"0" key_range:{end:"\x80"}`, env.KeyspaceName), "cell": env.Cells[0], "tablet_types": "replica", + "options": "{}", } dbClient := binlogplayer.NewMockDBClient(t) dbClient.ExpectRequestRE("update _vt.vreplication set message='Picked source tablet.*", testDMLResponse, nil) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", nil, errors.New("(expected error)")) - dbClient.ExpectRequest("update _vt.vreplication set state='Error', message='error (expected error) in selecting vreplication settings select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1' where id=1", testDMLResponse, nil) + dbClient.ExpectRequest(binlogplayer.TestGetWorkflowQueryId1, nil, errors.New("(expected error)")) + dbClient.ExpectRequest("update _vt.vreplication set state='Error', message='error (expected error) in selecting vreplication settings select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys, options from _vt.vreplication where id=1' where id=1", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set message='Picked source tablet.*", testDMLResponse, nil) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(binlogplayer.TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -299,7 +318,8 @@ func TestControllerRetry(t *testing.T) { mysqld.MysqlPort.Store(3306) vre := NewTestEngine(nil, env.Cells[0], mysqld, dbClientFactory, dbClientFactory, dbClient.DBName(), nil) - ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], "rdonly", nil, vre, defaultTabletPickerOptions) + defer setTabletTypesStr("rdonly")() + ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], nil, vre, defaultTabletPickerOptions) if err != nil { t.Fatal(err) } @@ -314,9 +334,10 @@ func TestControllerStopPosition(t *testing.T) { defer deleteTablet(wantTablet) params := map[string]string{ - "id": "1", - "state": binlogdatapb.VReplicationWorkflowState_Running.String(), - "source": fmt.Sprintf(`keyspace:"%s" shard:"0" key_range:{end:"\x80"}`, env.KeyspaceName), + "id": "1", + "state": binlogdatapb.VReplicationWorkflowState_Running.String(), + "source": fmt.Sprintf(`keyspace:"%s" shard:"0" key_range:{end:"\x80"}`, env.KeyspaceName), + "options": "{}", } dbClient := binlogplayer.NewMockDBClient(t) @@ -349,7 +370,7 @@ func TestControllerStopPosition(t *testing.T) { }, }, } - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", withStop, nil) + dbClient.ExpectRequest(binlogplayer.TestGetWorkflowQueryId1, withStop, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -361,7 +382,7 @@ func TestControllerStopPosition(t *testing.T) { mysqld.MysqlPort.Store(3306) vre := NewTestEngine(nil, wantTablet.GetAlias().Cell, mysqld, dbClientFactory, dbClientFactory, dbClient.DBName(), nil) - ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], "replica", nil, vre, defaultTabletPickerOptions) + ct, err := newController(context.Background(), params, dbClientFactory, mysqld, env.TopoServ, env.Cells[0], nil, vre, defaultTabletPickerOptions) if err != nil { t.Fatal(err) } diff --git a/go/vt/vttablet/tabletmanager/vreplication/engine.go b/go/vt/vttablet/tabletmanager/vreplication/engine.go index d407bfe403b..e692781538a 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/engine.go +++ b/go/vt/vttablet/tabletmanager/vreplication/engine.go @@ -229,6 +229,10 @@ func (vre *Engine) Open(ctx context.Context) { log.Infof("VReplication engine opened successfully") } +func (vre *Engine) ThrottlerClient() *throttle.Client { + return vre.throttlerClient +} + func (vre *Engine) openLocked(ctx context.Context) error { rows, err := vre.readAllRows(ctx) if err != nil { @@ -282,9 +286,9 @@ func (vre *Engine) retry(ctx context.Context, err error) { func (vre *Engine) initControllers(rows []map[string]string) { for _, row := range rows { - ct, err := newController(vre.ctx, row, vre.dbClientFactoryFiltered, vre.mysqld, vre.ts, vre.cell, tabletTypesStr, nil, vre, discovery.TabletPickerOptions{}) + ct, err := newController(vre.ctx, row, vre.dbClientFactoryFiltered, vre.mysqld, vre.ts, vre.cell, nil, vre, discovery.TabletPickerOptions{}) if err != nil { - log.Errorf("Controller could not be initialized for stream: %v", row) + log.Errorf("Controller could not be initialized for stream: %v: %v", row, err) continue } vre.controllers[ct.id] = ct @@ -405,8 +409,6 @@ func (vre *Engine) exec(query string, runAsAdmin bool) (*sqltypes.Result, error) return nil, fmt.Errorf("insert id %v out of range", qr.InsertID) } - vdbc := newVDBClient(dbClient, stats) - // If we are creating multiple streams, for example in a // merge workflow going from 2 shards to 1 shard, we // will be inserting multiple rows. To get the ids of @@ -430,11 +432,12 @@ func (vre *Engine) exec(query string, runAsAdmin bool) (*sqltypes.Result, error) if err != nil { return nil, err } - ct, err := newController(vre.ctx, params, vre.dbClientFactoryFiltered, vre.mysqld, vre.ts, vre.cell, tabletTypesStr, nil, vre, plan.tabletPickerOptions) + ct, err := newController(vre.ctx, params, vre.dbClientFactoryFiltered, vre.mysqld, vre.ts, vre.cell, nil, vre, plan.tabletPickerOptions) if err != nil { return nil, err } vre.controllers[id] = ct + vdbc := newVDBClient(dbClient, stats, ct.WorkflowConfig.RelayLogMaxSize) insertLogWithParams(vdbc, LogStreamCreate, id, params) } return qr, nil @@ -462,7 +465,6 @@ func (vre *Engine) exec(query string, runAsAdmin bool) (*sqltypes.Result, error) if err != nil { return nil, err } - vdbc := newVDBClient(dbClient, stats) for _, id := range ids { params, err := readRow(dbClient, id) if err != nil { @@ -470,11 +472,12 @@ func (vre *Engine) exec(query string, runAsAdmin bool) (*sqltypes.Result, error) } // Create a new controller in place of the old one. // For continuity, the new controller inherits the previous stats. - ct, err := newController(vre.ctx, params, vre.dbClientFactoryFiltered, vre.mysqld, vre.ts, vre.cell, tabletTypesStr, blpStats[id], vre, plan.tabletPickerOptions) + ct, err := newController(vre.ctx, params, vre.dbClientFactoryFiltered, vre.mysqld, vre.ts, vre.cell, blpStats[id], vre, plan.tabletPickerOptions) if err != nil { return nil, err } vre.controllers[id] = ct + vdbc := newVDBClient(dbClient, stats, ct.WorkflowConfig.RelayLogMaxSize) insertLog(vdbc, LogStateChange, id, params["state"], "") } return qr, nil @@ -487,13 +490,13 @@ func (vre *Engine) exec(query string, runAsAdmin bool) (*sqltypes.Result, error) return &sqltypes.Result{}, nil } // Stop and delete the current controllers. - vdbc := newVDBClient(dbClient, stats) for _, id := range ids { if ct := vre.controllers[id]; ct != nil { + vdbc := newVDBClient(dbClient, stats, ct.WorkflowConfig.RelayLogMaxSize) ct.Stop() delete(vre.controllers, id) + insertLogWithParams(vdbc, LogStreamDelete, id, nil) } - insertLogWithParams(vdbc, LogStreamDelete, id, nil) } if err := dbClient.Begin(); err != nil { return nil, err @@ -640,7 +643,7 @@ func (vre *Engine) transitionJournal(je *journalEvent) { log.Infof("Transitioning for journal:workload %v", je) - //sort both participants and shardgtids + // sort both participants and shardgtids participants := make([]string, 0) for ks := range je.participants { participants = append(participants, ks) @@ -691,7 +694,7 @@ func (vre *Engine) transitionJournal(je *journalEvent) { deferSecondaryKeys, _ := strconv.ParseBool(params["defer_secondary_keys"]) ig := NewInsertGenerator(binlogdatapb.VReplicationWorkflowState_Running, vre.dbName) ig.AddRow(params["workflow"], bls, sgtid.Gtid, params["cell"], params["tablet_types"], - binlogdatapb.VReplicationWorkflowType(workflowType), binlogdatapb.VReplicationWorkflowSubType(workflowSubType), deferSecondaryKeys) + binlogdatapb.VReplicationWorkflowType(workflowType), binlogdatapb.VReplicationWorkflowSubType(workflowSubType), deferSecondaryKeys, "") qr, err := dbClient.ExecuteFetch(ig.String(), maxRows) if err != nil { log.Errorf("transitionJournal: %v", err) @@ -730,7 +733,7 @@ func (vre *Engine) transitionJournal(je *journalEvent) { log.Errorf("transitionJournal: %v", err) return } - ct, err := newController(vre.ctx, params, vre.dbClientFactoryFiltered, vre.mysqld, vre.ts, vre.cell, tabletTypesStr, nil, vre, discovery.TabletPickerOptions{}) + ct, err := newController(vre.ctx, params, vre.dbClientFactoryFiltered, vre.mysqld, vre.ts, vre.cell, nil, vre, discovery.TabletPickerOptions{}) if err != nil { log.Errorf("transitionJournal: %v", err) return diff --git a/go/vt/vttablet/tabletmanager/vreplication/engine_test.go b/go/vt/vttablet/tabletmanager/vreplication/engine_test.go index ea46e126895..af054932c89 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/engine_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/engine_test.go @@ -50,14 +50,14 @@ func TestEngineOpen(t *testing.T) { dbClient.ExpectRequest("select * from _vt.vreplication where db_name='db'", sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|state|source|tablet_types", - "int64|varchar|varchar|varbinary", + "id|state|source|tablet_types|options", + "int64|varchar|varchar|varbinary|varchar", ), - fmt.Sprintf(`1|Running|keyspace:"%s" shard:"0" key_range:{end:"\x80"}|PRIMARY,REPLICA`, env.KeyspaceName), + fmt.Sprintf(`1|Running|keyspace:"%s" shard:"0" key_range:{end:"\x80"}|PRIMARY,REPLICA|{}`, env.KeyspaceName), ), nil) dbClient.ExpectRequestRE("update _vt.vreplication set message='Picked source tablet.*", testDMLResponse, nil) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(binlogplayer.TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -93,8 +93,8 @@ func TestEngineOpenRetry(t *testing.T) { dbClient.ExpectRequest("select * from _vt.vreplication where db_name='db'", nil, errors.New("err")) dbClient.ExpectRequest("select * from _vt.vreplication where db_name='db'", sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|state|source", - "int64|varchar|varchar", + "id|state|source|options", + "int64|varchar|varchar|varchar", ), ), nil) @@ -161,14 +161,14 @@ func TestEngineExec(t *testing.T) { dbClient.ExpectRequest("select @@session.auto_increment_increment", &sqltypes.Result{}, nil) dbClient.ExpectRequest("select * from _vt.vreplication where id = 1", sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|state|source|tablet_types", - "int64|varchar|varchar|varbinary", + "id|state|source|tablet_types|options", + "int64|varchar|varchar|varbinary|varchar", ), - fmt.Sprintf(`1|Running|keyspace:"%s" shard:"0" key_range:{end:"\x80"}|PRIMARY,REPLICA`, env.KeyspaceName), + fmt.Sprintf(`1|Running|keyspace:"%s" shard:"0" key_range:{end:"\x80"}|PRIMARY,REPLICA|{}`, env.KeyspaceName), ), nil) dbClient.ExpectRequestRE("update _vt.vreplication set message='Picked source tablet.*", testDMLResponse, nil) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(binlogplayer.TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) @@ -187,6 +187,7 @@ func TestEngineExec(t *testing.T) { ct := vre.controllers[1] if ct == nil || ct.id != 1 { t.Errorf("ct: %v, id should be 1", ct) + return } // Verify stats @@ -203,14 +204,14 @@ func TestEngineExec(t *testing.T) { dbClient.ExpectRequest("update _vt.vreplication set pos = 'MariaDB/0-1-1084', state = 'Running' where id in (1)", testDMLResponse, nil) dbClient.ExpectRequest("select * from _vt.vreplication where id = 1", sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|state|source", - "int64|varchar|varchar", + "id|state|source|options", + "int64|varchar|varchar|varchar", ), - fmt.Sprintf(`1|Running|keyspace:"%s" shard:"0" key_range:{end:"\x80"}`, env.KeyspaceName), + fmt.Sprintf(`1|Running|keyspace:"%s" shard:"0" key_range:{end:"\x80"}|{}`, env.KeyspaceName), ), nil) dbClient.ExpectRequestRE("update _vt.vreplication set message='Picked source tablet.*", testDMLResponse, nil) dbClient.ExpectRequest("update _vt.vreplication set state='Running', message='' where id=1", testDMLResponse, nil) - dbClient.ExpectRequest("select pos, stop_pos, max_tps, max_replication_lag, state, workflow_type, workflow, workflow_sub_type, defer_secondary_keys from _vt.vreplication where id=1", testSettingsResponse, nil) + dbClient.ExpectRequest(binlogplayer.TestGetWorkflowQueryId1, testSettingsResponse, nil) dbClient.ExpectRequest("begin", nil, nil) dbClient.ExpectRequest("insert into t values(1)", testDMLResponse, nil) dbClient.ExpectRequestRE("update _vt.vreplication set pos='MariaDB/0-1-1235', time_updated=.*", testDMLResponse, nil) diff --git a/go/vt/vttablet/tabletmanager/vreplication/external_connector.go b/go/vt/vttablet/tabletmanager/vreplication/external_connector.go index c53bfd2a584..c14d792da04 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/external_connector.go +++ b/go/vt/vttablet/tabletmanager/vreplication/external_connector.go @@ -48,13 +48,16 @@ type VStreamerClient interface { Close(context.Context) error // VStream streams VReplication events based on the specified filter. - VStream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error) error + VStream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, + send func([]*binlogdatapb.VEvent) error, options *binlogdatapb.VStreamOptions) error // VStreamRows streams rows of a table from the specified starting point. - VStreamRows(ctx context.Context, query string, lastpk *querypb.QueryResult, send func(*binlogdatapb.VStreamRowsResponse) error) error + VStreamRows(ctx context.Context, query string, lastpk *querypb.QueryResult, + send func(*binlogdatapb.VStreamRowsResponse) error, options *binlogdatapb.VStreamOptions) error // VStreamTables streams rows of a table from the specified starting point. - VStreamTables(ctx context.Context, send func(*binlogdatapb.VStreamTablesResponse) error) error + VStreamTables(ctx context.Context, + send func(*binlogdatapb.VStreamTablesResponse) error, options *binlogdatapb.VStreamOptions) error } type externalConnector struct { @@ -110,7 +113,7 @@ func (ec *externalConnector) Get(name string) (*mysqlConnector, error) { return c, nil } -//----------------------------------------------------------- +// ----------------------------------------------------------- type mysqlConnector struct { env tabletenv.Env @@ -131,11 +134,13 @@ func (c *mysqlConnector) Close(ctx context.Context) error { return nil } -func (c *mysqlConnector) VStream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error) error { - return c.vstreamer.Stream(ctx, startPos, tablePKs, filter, throttlerapp.ExternalConnectorName, send) +func (c *mysqlConnector) VStream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, + filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error, options *binlogdatapb.VStreamOptions) error { + return c.vstreamer.Stream(ctx, startPos, tablePKs, filter, throttlerapp.ExternalConnectorName, send, options) } -func (c *mysqlConnector) VStreamRows(ctx context.Context, query string, lastpk *querypb.QueryResult, send func(*binlogdatapb.VStreamRowsResponse) error) error { +func (c *mysqlConnector) VStreamRows(ctx context.Context, query string, lastpk *querypb.QueryResult, + send func(*binlogdatapb.VStreamRowsResponse) error, options *binlogdatapb.VStreamOptions) error { var row []sqltypes.Value if lastpk != nil { r := sqltypes.Proto3ToResult(lastpk) @@ -144,14 +149,15 @@ func (c *mysqlConnector) VStreamRows(ctx context.Context, query string, lastpk * } row = r.Rows[0] } - return c.vstreamer.StreamRows(ctx, query, row, send) + return c.vstreamer.StreamRows(ctx, query, row, send, options) } -func (c *mysqlConnector) VStreamTables(ctx context.Context, send func(response *binlogdatapb.VStreamTablesResponse) error) error { - return c.vstreamer.StreamTables(ctx, send) +func (c *mysqlConnector) VStreamTables(ctx context.Context, + send func(response *binlogdatapb.VStreamTablesResponse) error, options *binlogdatapb.VStreamOptions) error { + return c.vstreamer.StreamTables(ctx, send, options) } -//----------------------------------------------------------- +// ----------------------------------------------------------- type tabletConnector struct { tablet *topodatapb.Tablet @@ -180,17 +186,20 @@ func (tc *tabletConnector) Close(ctx context.Context) error { return tc.qs.Close(ctx) } -func (tc *tabletConnector) VStream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error) error { - req := &binlogdatapb.VStreamRequest{Target: tc.target, Position: startPos, TableLastPKs: tablePKs, Filter: filter} +func (tc *tabletConnector) VStream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, + filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error, options *binlogdatapb.VStreamOptions) error { + req := &binlogdatapb.VStreamRequest{Target: tc.target, Position: startPos, TableLastPKs: tablePKs, Filter: filter, Options: options} return tc.qs.VStream(ctx, req, send) } -func (tc *tabletConnector) VStreamRows(ctx context.Context, query string, lastpk *querypb.QueryResult, send func(*binlogdatapb.VStreamRowsResponse) error) error { - req := &binlogdatapb.VStreamRowsRequest{Target: tc.target, Query: query, Lastpk: lastpk} +func (tc *tabletConnector) VStreamRows(ctx context.Context, query string, lastpk *querypb.QueryResult, + send func(*binlogdatapb.VStreamRowsResponse) error, options *binlogdatapb.VStreamOptions) error { + req := &binlogdatapb.VStreamRowsRequest{Target: tc.target, Query: query, Lastpk: lastpk, Options: options} return tc.qs.VStreamRows(ctx, req, send) } -func (tc *tabletConnector) VStreamTables(ctx context.Context, send func(*binlogdatapb.VStreamTablesResponse) error) error { - req := &binlogdatapb.VStreamTablesRequest{Target: tc.target} +func (tc *tabletConnector) VStreamTables(ctx context.Context, + send func(*binlogdatapb.VStreamTablesResponse) error, options *binlogdatapb.VStreamOptions) error { + req := &binlogdatapb.VStreamTablesRequest{Target: tc.target, Options: options} return tc.qs.VStreamTables(ctx, req, send) } diff --git a/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go b/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go index 24e6cb0dbc3..e00a5578171 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/external_connector_test.go @@ -64,7 +64,7 @@ func TestExternalConnectorCopy(t *testing.T) { expectDBClientAndVreplicationQueries(t, []string{ "begin", - "insert into tab1(id,val) values (1,'a'), (2,'b')", + "insert into tab1(id,val) values (1,_binary'a'), (2,_binary'b')", "/insert into _vt.copy_state", "commit", "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name", @@ -73,7 +73,7 @@ func TestExternalConnectorCopy(t *testing.T) { execStatements(t, []string{"insert into tab1 values(3, 'c')"}) expectDBClientQueries(t, qh.Expect( "begin", - "insert into tab1(id,val) values (3,'c')", + "insert into tab1(id,val) values (3,_binary'c')", "/update _vt.vreplication set pos=", "commit", )) @@ -96,7 +96,7 @@ func TestExternalConnectorCopy(t *testing.T) { expectDBClientAndVreplicationQueries(t, []string{ "begin", - "insert into tab2(id,val) values (1,'a'), (2,'b')", + "insert into tab2(id,val) values (1,_binary'a'), (2,_binary'b')", "/insert into _vt.copy_state", "commit", "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name", @@ -121,7 +121,7 @@ func TestExternalConnectorCopy(t *testing.T) { expectDBClientAndVreplicationQueries(t, []string{ "begin", - "insert into tab3(id,val) values (1,'a'), (2,'b')", + "insert into tab3(id,val) values (1,_binary'a'), (2,_binary'b')", "/insert into _vt.copy_state", "commit", "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name", @@ -163,8 +163,8 @@ func TestExternalConnectorPlay(t *testing.T) { expectDBClientAndVreplicationQueries(t, []string{ "begin", - "insert into tab1(id,val) values (1,'a')", - "insert into tab1(id,val) values (2,'b')", + "insert into tab1(id,val) values (1,_binary'a')", + "insert into tab1(id,val) values (2,_binary'b')", "/update _vt.vreplication set pos=", "commit", }, pos) diff --git a/go/vt/vttablet/tabletmanager/vreplication/flags.go b/go/vt/vttablet/tabletmanager/vreplication/flags.go deleted file mode 100644 index e45158ab99a..00000000000 --- a/go/vt/vttablet/tabletmanager/vreplication/flags.go +++ /dev/null @@ -1,67 +0,0 @@ -/* -Copyright 2022 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 vreplication - -import ( - "time" - - "github.com/spf13/pflag" - - "vitess.io/vitess/go/vt/servenv" -) - -var ( - retryDelay = 5 * time.Second - maxTimeToRetryError time.Duration // Default behavior is to keep retrying, for backward compatibility - - tabletTypesStr = "in_order:REPLICA,PRIMARY" // Default value - - relayLogMaxSize = 250000 - relayLogMaxItems = 5000 - - replicaLagTolerance = 1 * time.Minute - - vreplicationHeartbeatUpdateInterval = 1 - - vreplicationStoreCompressedGTID = false - vreplicationParallelInsertWorkers = 1 -) - -func registerVReplicationFlags(fs *pflag.FlagSet) { - fs.DurationVar(&retryDelay, "vreplication_retry_delay", retryDelay, "delay before retrying a failed workflow event in the replication phase") - fs.DurationVar(&maxTimeToRetryError, "vreplication_max_time_to_retry_on_error", maxTimeToRetryError, "stop automatically retrying when we've had consecutive failures with the same error for this long after the first occurrence") - - fs.IntVar(&relayLogMaxSize, "relay_log_max_size", relayLogMaxSize, "Maximum buffer size (in bytes) for VReplication target buffering. If single rows are larger than this, a single row is buffered at a time.") - fs.IntVar(&relayLogMaxItems, "relay_log_max_items", relayLogMaxItems, "Maximum number of rows for VReplication target buffering.") - - fs.DurationVar(&replicaLagTolerance, "vreplication_replica_lag_tolerance", replicaLagTolerance, "Replica lag threshold duration: once lag is below this we switch from copy phase to the replication (streaming) phase") - - // vreplicationHeartbeatUpdateInterval determines how often the time_updated column is updated if there are no real events on the source and the source - // vstream is only sending heartbeats for this long. Keep this low if you expect high QPS and are monitoring this column to alert about potential - // outages. Keep this high if - // you have too many streams the extra write qps or cpu load due to these updates are unacceptable - // you have too many streams and/or a large source field (lot of participating tables) which generates unacceptable increase in your binlog size - fs.IntVar(&vreplicationHeartbeatUpdateInterval, "vreplication_heartbeat_update_interval", vreplicationHeartbeatUpdateInterval, "Frequency (in seconds, default 1, max 60) at which the time_updated column of a vreplication stream when idling") - fs.BoolVar(&vreplicationStoreCompressedGTID, "vreplication_store_compressed_gtid", vreplicationStoreCompressedGTID, "Store compressed gtids in the pos column of the sidecar database's vreplication table") - - fs.IntVar(&vreplicationParallelInsertWorkers, "vreplication-parallel-insert-workers", vreplicationParallelInsertWorkers, "Number of parallel insertion workers to use during copy phase. Set <= 1 to disable parallelism, or > 1 to enable concurrent insertion during copy phase.") -} - -func init() { - servenv.OnParseFor("vtcombo", registerVReplicationFlags) - servenv.OnParseFor("vttablet", registerVReplicationFlags) -} diff --git a/go/vt/vttablet/tabletmanager/vreplication/framework_test.go b/go/vt/vttablet/tabletmanager/vreplication/framework_test.go index d4253de27e7..12d20e3a867 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/framework_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/framework_test.go @@ -34,6 +34,7 @@ import ( _flag "vitess.io/vitess/go/internal/flag" "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/mysql/capabilities" "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/test/utils" @@ -46,7 +47,7 @@ import ( "vitess.io/vitess/go/vt/sidecardb" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/topo" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/queryservice" "vitess.io/vitess/go/vt/vttablet/queryservice/fakes" "vitess.io/vitess/go/vt/vttablet/tabletconn" @@ -139,7 +140,8 @@ func setup(ctx context.Context) (func(), int) { globalDBQueries = make(chan string, 1000) resetBinlogClient() - vttablet.VReplicationExperimentalFlags = 0 + vttablet.InitVReplicationConfigDefaults() + vttablet.DefaultVReplicationConfig.ExperimentalFlags = 0 // Engines cannot be initialized in testenv because it introduces circular dependencies. streamerEngine = vstreamer.NewEngine(env.TabletEnv, env.SrvTopo, env.SchemaEngine, nil, env.Cells[0]) @@ -236,7 +238,7 @@ func execConnStatements(t *testing.T, conn *dbconnpool.DBConnection, queries []s } } -//-------------------------------------- +// -------------------------------------- // Topos and tablets func addTablet(id int) *topodatapb.Tablet { @@ -318,7 +320,7 @@ func (ftc *fakeTabletConn) VStream(ctx context.Context, request *binlogdatapb.VS if vstreamHook != nil { vstreamHook(ctx) } - return streamerEngine.Stream(ctx, request.Position, request.TableLastPKs, request.Filter, throttlerapp.VStreamerName, send) + return streamerEngine.Stream(ctx, request.Position, request.TableLastPKs, request.Filter, throttlerapp.VStreamerName, send, nil) } // vstreamRowsHook allows you to do work just before calling VStreamRows. @@ -340,15 +342,18 @@ func (ftc *fakeTabletConn) VStreamRows(ctx context.Context, request *binlogdatap } row = r.Rows[0] } + vstreamOptions := &binlogdatapb.VStreamOptions{ + ConfigOverrides: vttablet.GetVReplicationConfigDefaults(false).Map(), + } return streamerEngine.StreamRows(ctx, request.Query, row, func(rows *binlogdatapb.VStreamRowsResponse) error { if vstreamRowsSendHook != nil { vstreamRowsSendHook(ctx) } return send(rows) - }) + }, vstreamOptions) } -//-------------------------------------- +// -------------------------------------- // Binlog Client to TabletManager // fakeBinlogClient satisfies binlogplayer.Client. @@ -425,7 +430,7 @@ func expectFBCRequest(t *testing.T, tablet *topodatapb.Tablet, pos string, table } } -//-------------------------------------- +// -------------------------------------- // DBCLient wrapper func realDBClientFactory() binlogplayer.DBClient { @@ -486,7 +491,7 @@ func (dbc *realDBClient) ExecuteFetch(query string, maxrows int) (*sqltypes.Resu globalDBQueries <- query } else if testSetForeignKeyQueries && strings.Contains(query, "set foreign_key_checks") { globalDBQueries <- query - } else if testForeignKeyQueries && strings.Contains(query, "foreign_key_checks") { //allow select/set for foreign_key_checks + } else if testForeignKeyQueries && strings.Contains(query, "foreign_key_checks") { // allow select/set for foreign_key_checks globalDBQueries <- query } return qr, err @@ -509,6 +514,10 @@ func (dbc *realDBClient) ExecuteFetchMulti(query string, maxrows int) ([]*sqltyp return results, nil } +func (dbc *realDBClient) SupportsCapability(capability capabilities.FlavorCapability) (bool, error) { + return dbc.conn.SupportsCapability(capability) +} + func expectDeleteQueries(t *testing.T) { t.Helper() if doNotLogDBQueries { @@ -679,7 +688,7 @@ func expectNontxQueries(t *testing.T, expectations qh.ExpectationSequence, recvT } result := validator.AcceptQuery(got) - + require.NotNil(t, result) require.True(t, result.Accepted, fmt.Sprintf( "query:%q\nmessage:%s\nexpectation:%s\nmatched:%t\nerror:%v\nhistory:%s", got, result.Message, result.Expectation, result.Matched, result.Error, validator.History(), diff --git a/go/vt/vttablet/tabletmanager/vreplication/insert_generator.go b/go/vt/vttablet/tabletmanager/vreplication/insert_generator.go index 6a127b084b5..a43278d783c 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/insert_generator.go +++ b/go/vt/vttablet/tabletmanager/vreplication/insert_generator.go @@ -51,7 +51,10 @@ func NewInsertGenerator(state binlogdatapb.VReplicationWorkflowState, dbname str // AddRow adds a row to the insert statement. func (ig *InsertGenerator) AddRow(workflow string, bls *binlogdatapb.BinlogSource, pos, cell, tabletTypes string, - workflowType binlogdatapb.VReplicationWorkflowType, workflowSubType binlogdatapb.VReplicationWorkflowSubType, deferSecondaryKeys bool) { + workflowType binlogdatapb.VReplicationWorkflowType, workflowSubType binlogdatapb.VReplicationWorkflowSubType, deferSecondaryKeys bool, options string) { + if options == "" { + options = "'{}'" + } protoutil.SortBinlogSourceTables(bls) fmt.Fprintf(ig.buf, "%s(%v, %v, %v, %v, %v, %v, %v, %v, 0, '%v', %v, %d, %d, %v, %v)", ig.prefix, @@ -68,7 +71,7 @@ func (ig *InsertGenerator) AddRow(workflow string, bls *binlogdatapb.BinlogSourc workflowType, workflowSubType, deferSecondaryKeys, - "'{}'", + options, ) ig.prefix = ", " } diff --git a/go/vt/vttablet/tabletmanager/vreplication/insert_generator_test.go b/go/vt/vttablet/tabletmanager/vreplication/insert_generator_test.go index 92100429963..30c626ec02e 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/insert_generator_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/insert_generator_test.go @@ -27,12 +27,12 @@ import ( func TestInsertGenerator(t *testing.T) { ig := NewInsertGenerator(binlogdatapb.VReplicationWorkflowState_Stopped, "a") ig.now = 111 - ig.AddRow("b", &binlogdatapb.BinlogSource{Keyspace: "c"}, "d", "e", "f", binlogdatapb.VReplicationWorkflowType_Materialize, binlogdatapb.VReplicationWorkflowSubType_None, false) + ig.AddRow("b", &binlogdatapb.BinlogSource{Keyspace: "c"}, "d", "e", "f", binlogdatapb.VReplicationWorkflowType_Materialize, binlogdatapb.VReplicationWorkflowSubType_None, false, "") want := `insert into _vt.vreplication(workflow, source, pos, max_tps, max_replication_lag, cell, tablet_types, time_updated, transaction_timestamp, state, db_name, workflow_type, workflow_sub_type, defer_secondary_keys, options) values ` + `('b', 'keyspace:"c"', 'd', 9223372036854775807, 9223372036854775807, 'e', 'f', 111, 0, 'Stopped', 'a', 0, 0, false, '{}')` assert.Equal(t, ig.String(), want) - ig.AddRow("g", &binlogdatapb.BinlogSource{Keyspace: "h"}, "i", "j", "k", binlogdatapb.VReplicationWorkflowType_Reshard, binlogdatapb.VReplicationWorkflowSubType_Partial, true) + ig.AddRow("g", &binlogdatapb.BinlogSource{Keyspace: "h"}, "i", "j", "k", binlogdatapb.VReplicationWorkflowType_Reshard, binlogdatapb.VReplicationWorkflowSubType_Partial, true, "") want += `, ('g', 'keyspace:"h"', 'i', 9223372036854775807, 9223372036854775807, 'j', 'k', 111, 0, 'Stopped', 'a', 4, 1, true, '{}')` assert.Equal(t, ig.String(), want) } diff --git a/go/vt/vttablet/tabletmanager/vreplication/queryhistory/verifier.go b/go/vt/vttablet/tabletmanager/vreplication/queryhistory/verifier.go index ebe145461d7..aeddf5344d5 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/queryhistory/verifier.go +++ b/go/vt/vttablet/tabletmanager/vreplication/queryhistory/verifier.go @@ -72,7 +72,7 @@ func (v *Verifier) AcceptQuery(query string) *Result { break } } - + result.Message += fmt.Sprintf(" (query: %q) (pending: %q)", query, v.Pending()) return result } diff --git a/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go b/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go index c3cd073f0bf..f26b5054d01 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go +++ b/go/vt/vttablet/tabletmanager/vreplication/replica_connector.go @@ -58,7 +58,7 @@ func NewReplicaConnector(venv *vtenv.Environment, connParams *mysql.ConnParams) return c } -//----------------------------------------------------------- +// ----------------------------------------------------------- type ReplicaConnector struct { conn *mysql.ConnParams @@ -73,5 +73,5 @@ func (c *ReplicaConnector) Close() error { } func (c *ReplicaConnector) VStream(ctx context.Context, startPos string, filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error) error { - return c.vstreamer.Stream(ctx, startPos, nil, filter, throttlerapp.ReplicaConnectorName, send) + return c.vstreamer.Stream(ctx, startPos, nil, filter, throttlerapp.ReplicaConnectorName, send, nil) } diff --git a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan.go b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan.go index 3bef997d0be..aee7f5c8909 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan.go +++ b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan.go @@ -27,12 +27,13 @@ import ( "vitess.io/vitess/go/mysql/collations/charset" "vitess.io/vitess/go/mysql/collations/colldata" vjson "vitess.io/vitess/go/mysql/json" + "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/evalengine" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" @@ -53,13 +54,14 @@ import ( // of the members, leaving the original plan unchanged. // The constructor is buildReplicatorPlan in table_plan_builder.go type ReplicatorPlan struct { - VStreamFilter *binlogdatapb.Filter - TargetTables map[string]*TablePlan - TablePlans map[string]*TablePlan - ColInfoMap map[string][]*ColumnInfo - stats *binlogplayer.Stats - Source *binlogdatapb.BinlogSource - collationEnv *collations.Environment + VStreamFilter *binlogdatapb.Filter + TargetTables map[string]*TablePlan + TablePlans map[string]*TablePlan + ColInfoMap map[string][]*ColumnInfo + stats *binlogplayer.Stats + Source *binlogdatapb.BinlogSource + collationEnv *collations.Environment + workflowConfig *vttablet.VReplicationConfig } // buildExecution plan uses the field info as input and the partially built @@ -88,7 +90,7 @@ func (rp *ReplicatorPlan) buildExecutionPlan(fieldEvent *binlogdatapb.FieldEvent // select * construct was used. We need to use the field names. tplan, err := rp.buildFromFields(prelim.TargetName, prelim.Lastpk, fieldEvent.Fields) if err != nil { - return nil, err + return nil, vterrors.Wrapf(err, "failed to build replication plan for %s table", fieldEvent.TableName) } tplan.Fields = fieldEvent.Fields return tplan, nil @@ -99,12 +101,13 @@ func (rp *ReplicatorPlan) buildExecutionPlan(fieldEvent *binlogdatapb.FieldEvent // requires us to wait for the field info sent by the source. func (rp *ReplicatorPlan) buildFromFields(tableName string, lastpk *sqltypes.Result, fields []*querypb.Field) (*TablePlan, error) { tpb := &tablePlanBuilder{ - name: sqlparser.NewIdentifierCS(tableName), - lastpk: lastpk, - colInfos: rp.ColInfoMap[tableName], - stats: rp.stats, - source: rp.Source, - collationEnv: rp.collationEnv, + name: sqlparser.NewIdentifierCS(tableName), + lastpk: lastpk, + colInfos: rp.ColInfoMap[tableName], + stats: rp.stats, + source: rp.Source, + collationEnv: rp.collationEnv, + workflowConfig: rp.workflowConfig, } for _, field := range fields { colName := sqlparser.NewIdentifierCI(field.Name) @@ -219,7 +222,8 @@ type TablePlan struct { // PartialUpdates are same as PartialInserts, but for update statements PartialUpdates map[string]*sqlparser.ParsedQuery - CollationEnv *collations.Environment + CollationEnv *collations.Environment + WorkflowConfig *vttablet.VReplicationConfig } // MarshalJSON performs a custom JSON Marshalling. @@ -257,7 +261,7 @@ func (tp *TablePlan) applyBulkInsert(sqlbuffer *bytes2.Buffer, rows []*querypb.R if i > 0 { sqlbuffer.WriteString(", ") } - if err := appendFromRow(tp.BulkInsertValues, sqlbuffer, tp.Fields, row, tp.FieldsToSkip); err != nil { + if err := tp.appendFromRow(sqlbuffer, row); err != nil { return nil, err } } @@ -285,7 +289,7 @@ func (tp *TablePlan) applyBulkInsert(sqlbuffer *bytes2.Buffer, rows []*querypb.R // now and punt on the others. func (tp *TablePlan) isOutsidePKRange(bindvars map[string]*querypb.BindVariable, before, after bool, stmtType string) bool { // added empty comments below, otherwise gofmt removes the spaces between the bitwise & and obfuscates this check! - if vttablet.VReplicationExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagOptimizeInserts == 0 { + if tp.WorkflowConfig.ExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagOptimizeInserts == 0 { return false } // Ensure there is one and only one value in lastpk and pkrefs. @@ -296,7 +300,7 @@ func (tp *TablePlan) isOutsidePKRange(bindvars map[string]*querypb.BindVariable, case !before && after: bindvar = bindvars["a_"+tp.PKReferences[0]] } - if bindvar == nil { //should never happen + if bindvar == nil { // should never happen return false } @@ -312,6 +316,30 @@ func (tp *TablePlan) isOutsidePKRange(bindvars map[string]*querypb.BindVariable, return false } +// convertStringCharset does a charset conversion given raw data and an applicable conversion rule. +// In case of a conversion error, it returns an equivalent of MySQL error 1366, which is what you'd +// get in a failed `CONVERT()` function, e.g.: +// +// > create table tascii(v varchar(100) charset ascii); +// > insert into tascii values ('€'); +// ERROR 1366 (HY000): Incorrect string value: '\xE2\x82\xAC' for column 'v' at row 1 +func (tp *TablePlan) convertStringCharset(raw []byte, conversion *binlogdatapb.CharsetConversion, fieldName string) ([]byte, error) { + fromCollation := tp.CollationEnv.DefaultCollationForCharset(conversion.FromCharset) + if fromCollation == collations.Unknown { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "character set %s not supported for column %s", conversion.FromCharset, fieldName) + } + toCollation := tp.CollationEnv.DefaultCollationForCharset(conversion.ToCharset) + if toCollation == collations.Unknown { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "character set %s not supported for column %s", conversion.ToCharset, fieldName) + } + + out, err := charset.Convert(nil, colldata.Lookup(toCollation).Charset(), raw, colldata.Lookup(fromCollation).Charset()) + if err != nil { + return nil, sqlerror.NewSQLErrorf(sqlerror.ERTruncatedWrongValueForField, sqlerror.SSUnknownSQLState, "Incorrect string value: %s", err.Error()) + } + return out, nil +} + // bindFieldVal returns a bind variable based on given field and value. // Most values will just bind directly. But some values may need manipulation: // - text values with charset conversion @@ -320,11 +348,7 @@ func (tp *TablePlan) isOutsidePKRange(bindvars map[string]*querypb.BindVariable, func (tp *TablePlan) bindFieldVal(field *querypb.Field, val *sqltypes.Value) (*querypb.BindVariable, error) { if conversion, ok := tp.ConvertCharset[field.Name]; ok && !val.IsNull() { // Non-null string value, for which we have a charset conversion instruction - fromCollation := tp.CollationEnv.DefaultCollationForCharset(conversion.FromCharset) - if fromCollation == collations.Unknown { - return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "Character set %s not supported for column %s", conversion.FromCharset, field.Name) - } - out, err := charset.Convert(nil, charset.Charset_utf8mb4{}, val.Raw(), colldata.Lookup(fromCollation).Charset()) + out, err := tp.convertStringCharset(val.Raw(), conversion, field.Name) if err != nil { return nil, err } @@ -590,28 +614,30 @@ func valsEqual(v1, v2 sqltypes.Value) bool { // note: there can be more fields than bind locations since extra columns might be requested from the source if not all // primary keys columns are present in the target table, for example. Also some values in the row may not correspond for // values from the database on the source: sum/count for aggregation queries, for example -func appendFromRow(pq *sqlparser.ParsedQuery, buf *bytes2.Buffer, fields []*querypb.Field, row *querypb.Row, skipFields map[string]bool) error { - bindLocations := pq.BindLocations() - if len(fields) < len(bindLocations) { +func (tp *TablePlan) appendFromRow(buf *bytes2.Buffer, row *querypb.Row) error { + bindLocations := tp.BulkInsertValues.BindLocations() + if len(tp.Fields) < len(bindLocations) { return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "wrong number of fields: got %d fields for %d bind locations ", - len(fields), len(bindLocations)) + len(tp.Fields), len(bindLocations)) } type colInfo struct { typ querypb.Type length int64 offset int64 + field *querypb.Field } rowInfo := make([]*colInfo, 0) offset := int64(0) - for i, field := range fields { // collect info required for fields to be bound + for i, field := range tp.Fields { // collect info required for fields to be bound length := row.Lengths[i] - if !skipFields[strings.ToLower(field.Name)] { + if !tp.FieldsToSkip[strings.ToLower(field.Name)] { rowInfo = append(rowInfo, &colInfo{ typ: field.Type, length: length, offset: offset, + field: field, }) } if length > 0 { @@ -623,7 +649,7 @@ func appendFromRow(pq *sqlparser.ParsedQuery, buf *bytes2.Buffer, fields []*quer var offsetQuery int for i, loc := range bindLocations { col := rowInfo[i] - buf.WriteString(pq.Query[offsetQuery:loc.Offset]) + buf.WriteString(tp.BulkInsertValues.Query[offsetQuery:loc.Offset]) typ := col.typ switch typ { @@ -645,12 +671,25 @@ func appendFromRow(pq *sqlparser.ParsedQuery, buf *bytes2.Buffer, fields []*quer // -1 means a null variable; serialize it directly buf.WriteString(sqltypes.NullStr) } else { - vv := sqltypes.MakeTrusted(typ, row.Values[col.offset:col.offset+col.length]) + raw := row.Values[col.offset : col.offset+col.length] + var vv sqltypes.Value + + if conversion, ok := tp.ConvertCharset[col.field.Name]; ok && col.length > 0 { + // Non-null string value, for which we have a charset conversion instruction + out, err := tp.convertStringCharset(raw, conversion, col.field.Name) + if err != nil { + return err + } + vv = sqltypes.MakeTrusted(typ, out) + } else { + vv = sqltypes.MakeTrusted(typ, raw) + } + vv.EncodeSQLBytes2(buf) } } offsetQuery = loc.Offset + loc.Length } - buf.WriteString(pq.Query[offsetQuery:]) + buf.WriteString(tp.BulkInsertValues.Query[offsetQuery:]) return nil } diff --git a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go index 6c9f92128ac..644b4585914 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go @@ -21,6 +21,8 @@ import ( "strings" "testing" + vttablet "vitess.io/vitess/go/vt/vttablet/common" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -574,7 +576,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "bad query", }}, }, - err: "syntax error at position 4 near 'bad' in query: bad query", + err: "failed to build table replication plan for t1 table: syntax error at position 4 near 'bad' in query: bad query", }, { // not a select input: &binlogdatapb.Filter{ @@ -583,7 +585,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "update t1 set val = 1", }}, }, - err: "unsupported non-select statement in query: update t1 set val = 1", + err: "failed to build table replication plan for t1 table: unsupported non-select statement in query: update t1 set val = 1", }, { // no distinct input: &binlogdatapb.Filter{ @@ -592,7 +594,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select distinct c1 from t1", }}, }, - err: "unsupported distinct clause in query: select distinct c1 from t1", + err: "failed to build table replication plan for t1 table: unsupported distinct clause in query: select distinct c1 from t1", }, { // no ',' join input: &binlogdatapb.Filter{ @@ -601,7 +603,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select * from t1, t2", }}, }, - err: "unsupported multi-table usage in query: select * from t1, t2", + err: "failed to build table replication plan for t1 table: unsupported multi-table usage in query: select * from t1, t2", }, { // no join input: &binlogdatapb.Filter{ @@ -610,7 +612,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select * from t1 join t2", }}, }, - err: "unsupported from expression (*sqlparser.JoinTableExpr) in query: select * from t1 join t2", + err: "failed to build table replication plan for t1 table: unsupported from expression (*sqlparser.JoinTableExpr) in query: select * from t1 join t2", }, { // no subqueries input: &binlogdatapb.Filter{ @@ -619,7 +621,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select * from (select * from t2) as a", }}, }, - err: "unsupported from source (*sqlparser.DerivedTable) in query: select * from (select * from t2) as a", + err: "failed to build table replication plan for t1 table: unsupported from source (*sqlparser.DerivedTable) in query: select * from (select * from t2) as a", }, { // cannot combine '*' with other input: &binlogdatapb.Filter{ @@ -628,7 +630,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select *, c1 from t1", }}, }, - err: "unsupported mix of '*' and columns in query: select *, c1 from t1", + err: "failed to build table replication plan for t1 table: unsupported mix of '*' and columns in query: select *, c1 from t1", }, { // cannot combine '*' with other (different code path) input: &binlogdatapb.Filter{ @@ -637,7 +639,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select c1, * from t1", }}, }, - err: "invalid expression: * in query: select c1, * from t1", + err: "failed to build table replication plan for t1 table: invalid expression: * in query: select c1, * from t1", }, { // no distinct in func input: &binlogdatapb.Filter{ @@ -646,7 +648,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select hour(distinct c1) as a from t1", }}, }, - err: "syntax error at position 21 near 'distinct' in query: select hour(distinct c1) as a from t1", + err: "failed to build table replication plan for t1 table: syntax error at position 21 near 'distinct' in query: select hour(distinct c1) as a from t1", }, { // funcs need alias input: &binlogdatapb.Filter{ @@ -655,7 +657,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select hour(c1) from t1", }}, }, - err: "expression needs an alias: hour(c1) in query: select hour(c1) from t1", + err: "failed to build table replication plan for t1 table: expression needs an alias: hour(c1) in query: select hour(c1) from t1", }, { // only count(*) input: &binlogdatapb.Filter{ @@ -664,7 +666,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select count(c1) as c from t1", }}, }, - err: "only count(*) is supported: count(c1) in query: select count(c1) as c from t1", + err: "failed to build table replication plan for t1 table: only count(*) is supported: count(c1) in query: select count(c1) as c from t1", }, { // no sum(*) input: &binlogdatapb.Filter{ @@ -673,7 +675,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select sum(*) as c from t1", }}, }, - err: "syntax error at position 13 in query: select sum(*) as c from t1", + err: "failed to build table replication plan for t1 table: syntax error at position 13 in query: select sum(*) as c from t1", }, { // sum should have only one argument input: &binlogdatapb.Filter{ @@ -682,7 +684,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select sum(a, b) as c from t1", }}, }, - err: "syntax error at position 14 in query: select sum(a, b) as c from t1", + err: "failed to build table replication plan for t1 table: syntax error at position 14 in query: select sum(a, b) as c from t1", }, { // no complex expr in sum input: &binlogdatapb.Filter{ @@ -691,7 +693,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select sum(a + b) as c from t1", }}, }, - err: "unsupported non-column name in sum clause: sum(a + b) in query: select sum(a + b) as c from t1", + err: "failed to build table replication plan for t1 table: unsupported non-column name in sum clause: sum(a + b) in query: select sum(a + b) as c from t1", }, { // no complex expr in group by input: &binlogdatapb.Filter{ @@ -700,7 +702,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select a from t1 group by a + 1", }}, }, - err: "unsupported non-column name or alias in group by clause: a + 1 in query: select a from t1 group by a + 1", + err: "failed to build table replication plan for t1 table: unsupported non-column name or alias in group by clause: a + 1 in query: select a from t1 group by a + 1", }, { // group by does not reference alias input: &binlogdatapb.Filter{ @@ -709,7 +711,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select a as b from t1 group by a", }}, }, - err: "group by expression does not reference an alias in the select list: a in query: select a as b from t1 group by a", + err: "failed to build table replication plan for t1 table: group by expression does not reference an alias in the select list: a in query: select a as b from t1 group by a", }, { // cannot group by aggr input: &binlogdatapb.Filter{ @@ -718,7 +720,7 @@ func TestBuildPlayerPlan(t *testing.T) { Filter: "select count(*) as a from t1 group by a", }}, }, - err: "group by expression is not allowed to reference an aggregate expression: a in query: select count(*) as a from t1 group by a", + err: "failed to build table replication plan for t1 table: group by expression is not allowed to reference an aggregate expression: a in query: select count(*) as a from t1 group by a", }} PrimaryKeyInfos := map[string][]*ColumnInfo{ @@ -735,8 +737,12 @@ func TestBuildPlayerPlan(t *testing.T) { ), } + vttablet.InitVReplicationConfigDefaults() for _, tcase := range testcases { - plan, err := buildReplicatorPlan(getSource(tcase.input), PrimaryKeyInfos, nil, binlogplayer.NewStats(), collations.MySQL8(), sqlparser.NewTestParser()) + vr := &vreplicator{ + workflowConfig: vttablet.DefaultVReplicationConfig, + } + plan, err := vr.buildReplicatorPlan(getSource(tcase.input), PrimaryKeyInfos, nil, binlogplayer.NewStats(), collations.MySQL8(), sqlparser.NewTestParser()) gotErr := "" if err != nil { gotErr = err.Error() @@ -745,8 +751,7 @@ func TestBuildPlayerPlan(t *testing.T) { gotPlan, _ := json.Marshal(plan) wantPlan, _ := json.Marshal(tcase.plan) require.Equal(t, string(wantPlan), string(gotPlan), "Filter(%v):\n%s, want\n%s", tcase.input, gotPlan, wantPlan) - - plan, err = buildReplicatorPlan(getSource(tcase.input), PrimaryKeyInfos, copyState, binlogplayer.NewStats(), collations.MySQL8(), sqlparser.NewTestParser()) + plan, err = vr.buildReplicatorPlan(getSource(tcase.input), PrimaryKeyInfos, copyState, binlogplayer.NewStats(), collations.MySQL8(), sqlparser.NewTestParser()) if err != nil { continue } @@ -774,7 +779,10 @@ func TestBuildPlayerPlanNoDup(t *testing.T) { Filter: "select * from t", }}, } - _, err := buildReplicatorPlan(getSource(input), PrimaryKeyInfos, nil, binlogplayer.NewStats(), collations.MySQL8(), sqlparser.NewTestParser()) + vr := &vreplicator{ + workflowConfig: vttablet.DefaultVReplicationConfig, + } + _, err := vr.buildReplicatorPlan(getSource(input), PrimaryKeyInfos, nil, binlogplayer.NewStats(), collations.MySQL8(), sqlparser.NewTestParser()) want := "more than one target for source table t" if err == nil || !strings.Contains(err.Error(), want) { t.Errorf("buildReplicatorPlan err: %v, must contain: %v", err, want) @@ -795,7 +803,10 @@ func TestBuildPlayerPlanExclude(t *testing.T) { Filter: "", }}, } - plan, err := buildReplicatorPlan(getSource(input), PrimaryKeyInfos, nil, binlogplayer.NewStats(), collations.MySQL8(), sqlparser.NewTestParser()) + vr := &vreplicator{ + workflowConfig: vttablet.DefaultVReplicationConfig, + } + plan, err := vr.buildReplicatorPlan(getSource(input), PrimaryKeyInfos, nil, binlogplayer.NewStats(), collations.MySQL8(), sqlparser.NewTestParser()) assert.NoError(t, err) want := &TestReplicatorPlan{ diff --git a/go/vt/vttablet/tabletmanager/vreplication/stats.go b/go/vt/vttablet/tabletmanager/vreplication/stats.go index 11f458d9541..1aaae3b84ec 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/stats.go +++ b/go/vt/vttablet/tabletmanager/vreplication/stats.go @@ -543,6 +543,15 @@ func (st *vrStats) register() { } return result }) + stats.Publish("VReplicationConfig", stats.StringMapFunc(func() map[string]string { + st.mu.Lock() + defer st.mu.Unlock() + result := make(map[string]string, len(st.controllers)) + for _, ct := range st.controllers { + result[fmt.Sprintf("%s.%d", ct.workflow, ct.id)] = ct.WorkflowConfig.String() + } + return result + })) } func (st *vrStats) numControllers() int64 { diff --git a/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go b/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go index 2e44fd49e9b..12afc3fec28 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go +++ b/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go @@ -29,11 +29,11 @@ import ( "vitess.io/vitess/go/vt/key" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + vttablet "vitess.io/vitess/go/vt/vttablet/common" ) // This file contains just the builders for ReplicatorPlan and TablePlan. @@ -61,7 +61,8 @@ type tablePlanBuilder struct { source *binlogdatapb.BinlogSource pkIndices []bool - collationEnv *collations.Environment + collationEnv *collations.Environment + workflowConfig *vttablet.VReplicationConfig } // colExpr describes the processing to be performed to @@ -131,16 +132,17 @@ const ( // The TablePlan built is a partial plan. The full plan for a table is built // when we receive field information from events or rows sent by the source. // buildExecutionPlan is the function that builds the full plan. -func buildReplicatorPlan(source *binlogdatapb.BinlogSource, colInfoMap map[string][]*ColumnInfo, copyState map[string]*sqltypes.Result, stats *binlogplayer.Stats, collationEnv *collations.Environment, parser *sqlparser.Parser) (*ReplicatorPlan, error) { +func (vr *vreplicator) buildReplicatorPlan(source *binlogdatapb.BinlogSource, colInfoMap map[string][]*ColumnInfo, copyState map[string]*sqltypes.Result, stats *binlogplayer.Stats, collationEnv *collations.Environment, parser *sqlparser.Parser) (*ReplicatorPlan, error) { filter := source.Filter plan := &ReplicatorPlan{ - VStreamFilter: &binlogdatapb.Filter{FieldEventMode: filter.FieldEventMode}, - TargetTables: make(map[string]*TablePlan), - TablePlans: make(map[string]*TablePlan), - ColInfoMap: colInfoMap, - stats: stats, - Source: source, - collationEnv: collationEnv, + VStreamFilter: &binlogdatapb.Filter{FieldEventMode: filter.FieldEventMode}, + TargetTables: make(map[string]*TablePlan), + TablePlans: make(map[string]*TablePlan), + ColInfoMap: colInfoMap, + stats: stats, + Source: source, + collationEnv: collationEnv, + workflowConfig: vr.workflowConfig, } for tableName := range colInfoMap { lastpk, ok := copyState[tableName] @@ -159,9 +161,9 @@ func buildReplicatorPlan(source *binlogdatapb.BinlogSource, colInfoMap map[strin if !ok { return nil, fmt.Errorf("table %s not found in schema", tableName) } - tablePlan, err := buildTablePlan(tableName, rule, colInfos, lastpk, stats, source, collationEnv, parser) + tablePlan, err := buildTablePlan(tableName, rule, colInfos, lastpk, stats, source, collationEnv, parser, vr.workflowConfig) if err != nil { - return nil, err + return nil, vterrors.Wrapf(err, "failed to build table replication plan for %s table", tableName) } if tablePlan == nil { // Table was excluded. @@ -199,7 +201,8 @@ func MatchTable(tableName string, filter *binlogdatapb.Filter) (*binlogdatapb.Ru } func buildTablePlan(tableName string, rule *binlogdatapb.Rule, colInfos []*ColumnInfo, lastpk *sqltypes.Result, - stats *binlogplayer.Stats, source *binlogdatapb.BinlogSource, collationEnv *collations.Environment, parser *sqlparser.Parser) (*TablePlan, error) { + stats *binlogplayer.Stats, source *binlogdatapb.BinlogSource, collationEnv *collations.Environment, + parser *sqlparser.Parser, workflowConfig *vttablet.VReplicationConfig) (*TablePlan, error) { planError := func(err error, query string) error { // Use the error string here to ensure things are uniform across @@ -248,6 +251,7 @@ func buildTablePlan(tableName string, rule *binlogdatapb.Rule, colInfos []*Colum ConvertCharset: rule.ConvertCharset, ConvertIntToEnum: rule.ConvertIntToEnum, CollationEnv: collationEnv, + WorkflowConfig: workflowConfig, } return tablePlan, nil @@ -259,11 +263,12 @@ func buildTablePlan(tableName string, rule *binlogdatapb.Rule, colInfos []*Colum From: sel.From, Where: sel.Where, }, - lastpk: lastpk, - colInfos: colInfos, - stats: stats, - source: source, - collationEnv: collationEnv, + lastpk: lastpk, + colInfos: colInfos, + stats: stats, + source: source, + collationEnv: collationEnv, + workflowConfig: workflowConfig, } if err := tpb.analyzeExprs(sel.SelectExprs); err != nil { @@ -358,7 +363,6 @@ func (tpb *tablePlanBuilder) generate() *TablePlan { fieldsToSkip[colInfo.Name] = true } } - return &TablePlan{ TargetName: tpb.name.String(), Lastpk: tpb.lastpk, @@ -378,6 +382,7 @@ func (tpb *tablePlanBuilder) generate() *TablePlan { PartialInserts: make(map[string]*sqlparser.ParsedQuery, 0), PartialUpdates: make(map[string]*sqlparser.ParsedQuery, 0), CollationEnv: tpb.collationEnv, + WorkflowConfig: tpb.workflowConfig, } } @@ -598,7 +603,7 @@ func (tpb *tablePlanBuilder) analyzePK(cols []*ColumnInfo) error { // TODO(shlomi): at some point in the futue we want to make this check stricter. // We could be reading a generated column c1 which in turn selects some other column c2. // We will want t oensure that `c2` is found in select list... - return fmt.Errorf("primary key column %v not found in select list", col) + return fmt.Errorf("primary key column %v not found in table's select filter or the TableMap event within the GTID", col) } if cexpr.operation != opExpr { return fmt.Errorf("primary key column %v is not allowed to reference an aggregate expression", col) @@ -880,7 +885,7 @@ func (tpb *tablePlanBuilder) generateDeleteStatement() *sqlparser.ParsedQuery { } func (tpb *tablePlanBuilder) generateMultiDeleteStatement() *sqlparser.ParsedQuery { - if vttablet.VReplicationExperimentalFlags&vttablet.VReplicationExperimentalFlagVPlayerBatching == 0 || + if tpb.workflowConfig.ExperimentalFlags&vttablet.VReplicationExperimentalFlagVPlayerBatching == 0 || (len(tpb.pkCols)+len(tpb.extraSourcePkCols)) != 1 { return nil } diff --git a/go/vt/vttablet/tabletmanager/vreplication/table_plan_partial.go b/go/vt/vttablet/tabletmanager/vreplication/table_plan_partial.go index c6ccb898996..cb8ac6dc515 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/table_plan_partial.go +++ b/go/vt/vttablet/tabletmanager/vreplication/table_plan_partial.go @@ -26,7 +26,7 @@ import ( "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" ) // isBitSet returns true if the bit at index is set @@ -37,7 +37,7 @@ func isBitSet(data []byte, index int) bool { } func (tp *TablePlan) isPartial(rowChange *binlogdatapb.RowChange) bool { - if (vttablet.VReplicationExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagAllowNoBlobBinlogRowImage) == 0 || + if (tp.WorkflowConfig.ExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagAllowNoBlobBinlogRowImage) == 0 || rowChange.DataColumns == nil || rowChange.DataColumns.Count == 0 { diff --git a/go/vt/vttablet/tabletmanager/vreplication/utils.go b/go/vt/vttablet/tabletmanager/vreplication/utils.go index 2b80bfb62a2..bb1c469cc93 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/utils.go +++ b/go/vt/vttablet/tabletmanager/vreplication/utils.go @@ -134,7 +134,12 @@ func isUnrecoverableError(err error) bool { if err == nil { return false } - if vterrors.Code(err) == vtrpcpb.Code_FAILED_PRECONDITION { + switch vterrors.Code(err) { + case vtrpcpb.Code_FAILED_PRECONDITION: + if vterrors.RxWrongTablet.MatchString(err.Error()) { + // If the chosen tablet type picked changes, say due to PRS/ERS, we should retry. + return false + } return true } sqlErr, isSQLErr := sqlerror.NewSQLErrorFromError(err).(*sqlerror.SQLError) @@ -222,6 +227,8 @@ func isUnrecoverableError(err error) bool { sqlerror.ERWrongParametersToProcedure, sqlerror.ERWrongUsage, sqlerror.ERWrongValue, + sqlerror.ERWrongParamcountToNativeFct, + sqlerror.ERVectorConversion, sqlerror.ERWrongValueCountOnRow: log.Errorf("Got unrecoverable error: %v", sqlErr) return true diff --git a/go/vt/vttablet/tabletmanager/vreplication/utils_test.go b/go/vt/vttablet/tabletmanager/vreplication/utils_test.go index bfe79036f3c..69a57c34341 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/utils_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/utils_test.go @@ -17,17 +17,23 @@ limitations under the License. package vreplication import ( + "errors" "fmt" "strings" "testing" + vttablet "vitess.io/vitess/go/vt/vttablet/common" + "github.com/stretchr/testify/require" + "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/binlog/binlogplayer" + "vitess.io/vitess/go/vt/vterrors" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) func TestInsertLogTruncation(t *testing.T) { @@ -36,7 +42,7 @@ func TestInsertLogTruncation(t *testing.T) { dbClient.RemoveInvariant("insert into _vt.vreplication_log") // Otherwise the insert will be ignored stats := binlogplayer.NewStats() defer stats.Stop() - vdbClient := newVDBClient(dbClient, stats) + vdbClient := newVDBClient(dbClient, stats, vttablet.DefaultVReplicationConfig.RelayLogMaxItems) defer vdbClient.Close() vrID := int32(1) typ := "Testing" @@ -97,3 +103,60 @@ func TestInsertLogTruncation(t *testing.T) { }) } } + +// TestIsUnrecoverableError tests the different error cases for isUnrecoverableError(). +func TestIsUnrecoverableError(t *testing.T) { + if runNoBlobTest { + t.Skip() + } + + type testCase struct { + name string + err error + expected bool + } + + testCases := []testCase{ + { + name: "Nil error", + err: nil, + expected: false, + }, + { + name: "vterrors.Code_FAILED_PRECONDITION", + err: vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "test error"), + expected: true, + }, + { + name: "vterrors.Code_FAILED_PRECONDITION, WrongTablet", + err: vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "%s: %v, want: %v or %v", vterrors.WrongTablet, "PRIMARY", "REPLICA", nil), + expected: false, + }, + { + name: "Non-SQL error", + err: errors.New("non-SQL error"), + expected: false, + }, + { + name: "SQL error with ERUnknownError", + err: sqlerror.NewSQLError(sqlerror.ERUnknownError, "test SQL error", "test"), + expected: false, + }, + { + name: "SQL error with ERAccessDeniedError", + err: sqlerror.NewSQLError(sqlerror.ERAccessDeniedError, "access denied", "test"), + expected: true, + }, + { + name: "SQL error with ERDataOutOfRange", + err: sqlerror.NewSQLError(sqlerror.ERDataOutOfRange, "data out of range", "test"), + expected: true, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := isUnrecoverableError(tc.err) + require.Equal(t, tc.expected, result) + }) + } +} diff --git a/go/vt/vttablet/tabletmanager/vreplication/vcopier.go b/go/vt/vttablet/tabletmanager/vreplication/vcopier.go index 9057a55707f..e3a12258691 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vcopier.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vcopier.go @@ -37,7 +37,6 @@ import ( "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -221,7 +220,7 @@ func newVCopierCopyWorker( func (vc *vcopier) initTablesForCopy(ctx context.Context) error { defer vc.vr.dbClient.Rollback() - plan, err := buildReplicatorPlan(vc.vr.source, vc.vr.colInfoMap, nil, vc.vr.stats, vc.vr.vre.env.CollationEnv(), vc.vr.vre.env.Parser()) + plan, err := vc.vr.buildReplicatorPlan(vc.vr.source, vc.vr.colInfoMap, nil, vc.vr.stats, vc.vr.vre.env.CollationEnv(), vc.vr.vre.env.Parser()) if err != nil { return err } @@ -348,7 +347,7 @@ func (vc *vcopier) catchup(ctx context.Context, copyState map[string]*sqltypes.R // Wait for catchup. tkr := time.NewTicker(waitRetryTime) defer tkr.Stop() - seconds := int64(replicaLagTolerance / time.Second) + seconds := int64(vc.vr.workflowConfig.ReplicaLagTolerance / time.Second) for { sbm := vc.vr.stats.ReplicationLagSeconds.Load() if sbm < seconds { @@ -382,7 +381,7 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma log.Infof("Copying table %s, lastpk: %v", tableName, copyState[tableName]) - plan, err := buildReplicatorPlan(vc.vr.source, vc.vr.colInfoMap, nil, vc.vr.stats, vc.vr.vre.env.CollationEnv(), vc.vr.vre.env.Parser()) + plan, err := vc.vr.buildReplicatorPlan(vc.vr.source, vc.vr.colInfoMap, nil, vc.vr.stats, vc.vr.vre.env.CollationEnv(), vc.vr.vre.env.Parser()) if err != nil { return err } @@ -392,7 +391,7 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma return fmt.Errorf("plan not found for table: %s, current plans are: %#v", tableName, plan.TargetTables) } - ctx, cancel := context.WithTimeout(ctx, vttablet.CopyPhaseDuration) + ctx, cancel := context.WithTimeout(ctx, vc.vr.workflowConfig.CopyPhaseDuration) defer cancel() var lastpkpb *querypb.QueryResult @@ -405,7 +404,7 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma copyStateGCTicker := time.NewTicker(copyStateGCInterval) defer copyStateGCTicker.Stop() - parallelism := getInsertParallelism() + parallelism := int(math.Max(1, float64(vc.vr.workflowConfig.ParallelInsertWorkers))) copyWorkerFactory := vc.newCopyWorkerFactory(parallelism) copyWorkQueue := vc.newCopyWorkQueue(parallelism, copyWorkerFactory) defer copyWorkQueue.close() @@ -420,6 +419,9 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma // Use this for task sequencing. var prevCh <-chan *vcopierCopyTaskResult + vstreamOptions := &binlogdatapb.VStreamOptions{ + ConfigOverrides: vc.vr.workflowConfig.Overrides, + } serr := vc.vr.sourceVStreamer.VStreamRows(ctx, initialPlan.SendRule.Filter, lastpkpb, func(rows *binlogdatapb.VStreamRowsResponse) error { for { select { @@ -456,7 +458,7 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma default: } if rows.Throttled { - _ = vc.vr.updateTimeThrottled(throttlerapp.RowStreamerName) + _ = vc.vr.updateTimeThrottled(throttlerapp.RowStreamerName, rows.ThrottledReason) return nil } if rows.Heartbeat { @@ -464,10 +466,10 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma return nil } // verify throttler is happy, otherwise keep looping - if vc.vr.vre.throttlerClient.ThrottleCheckOKOrWaitAppName(ctx, throttlerapp.Name(vc.throttlerAppName)) { + if checkResult, ok := vc.vr.vre.throttlerClient.ThrottleCheckOKOrWaitAppName(ctx, throttlerapp.Name(vc.throttlerAppName)); ok { break // out of 'for' loop } else { // we're throttled - _ = vc.vr.updateTimeThrottled(throttlerapp.VCopierName) + _ = vc.vr.updateTimeThrottled(throttlerapp.VCopierName, checkResult.Summary()) } } if !copyWorkQueue.isOpen { @@ -593,7 +595,7 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma } return nil - }) + }, vstreamOptions) // Close the work queue. This will prevent new tasks from being enqueued, // and will wait until all workers are returned to the worker pool. @@ -683,7 +685,7 @@ func (vc *vcopier) updatePos(ctx context.Context, gtid string) error { if err != nil { return err } - update := binlogplayer.GenerateUpdatePos(vc.vr.id, pos, time.Now().Unix(), 0, vc.vr.stats.CopyRowCount.Get(), vreplicationStoreCompressedGTID) + update := binlogplayer.GenerateUpdatePos(vc.vr.id, pos, time.Now().Unix(), 0, vc.vr.stats.CopyRowCount.Get(), vc.vr.workflowConfig.StoreCompressedGTID) _, err = vc.vr.dbClient.Execute(update) return err } @@ -699,7 +701,7 @@ func (vc *vcopier) fastForward(ctx context.Context, copyState map[string]*sqltyp return err } if settings.StartPos.IsZero() { - update := binlogplayer.GenerateUpdatePos(vc.vr.id, pos, time.Now().Unix(), 0, vc.vr.stats.CopyRowCount.Get(), vreplicationStoreCompressedGTID) + update := binlogplayer.GenerateUpdatePos(vc.vr.id, pos, time.Now().Unix(), 0, vc.vr.stats.CopyRowCount.Get(), vc.vr.workflowConfig.StoreCompressedGTID) _, err := vc.vr.dbClient.Execute(update) return err } @@ -1201,9 +1203,3 @@ func vcopierCopyTaskGetNextState(vts vcopierCopyTaskState) vcopierCopyTaskState } return vts } - -// getInsertParallelism returns the number of parallel workers to use for inserting batches during the copy phase. -func getInsertParallelism() int { - parallelism := int(math.Max(1, float64(vreplicationParallelInsertWorkers))) - return parallelism -} diff --git a/go/vt/vttablet/tabletmanager/vreplication/vcopier_atomic.go b/go/vt/vttablet/tabletmanager/vreplication/vcopier_atomic.go index 02e1188cdb7..3a0996e0c39 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vcopier_atomic.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vcopier_atomic.go @@ -20,21 +20,19 @@ import ( "context" "fmt" "io" + "math" "strconv" "time" - "vitess.io/vitess/go/vt/vttablet" - "google.golang.org/protobuf/encoding/prototext" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/log" - "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/vterrors" - binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" ) /* @@ -54,7 +52,7 @@ func newCopyAllState(vc *vcopier) (*copyAllState, error) { state := ©AllState{ vc: vc, } - plan, err := buildReplicatorPlan(vc.vr.source, vc.vr.colInfoMap, nil, vc.vr.stats, vc.vr.vre.env.CollationEnv(), vc.vr.vre.env.Parser()) + plan, err := vc.vr.buildReplicatorPlan(vc.vr.source, vc.vr.colInfoMap, nil, vc.vr.stats, vc.vr.vre.env.CollationEnv(), vc.vr.vre.env.Parser()) if err != nil { return nil, err } @@ -79,13 +77,13 @@ func (vc *vcopier) copyAll(ctx context.Context, settings binlogplayer.VRSettings return err } - ctx, cancel := context.WithTimeout(ctx, vttablet.CopyPhaseDuration) + ctx, cancel := context.WithTimeout(ctx, vc.vr.workflowConfig.CopyPhaseDuration) defer cancel() rowsCopiedTicker := time.NewTicker(rowsCopiedUpdateInterval) defer rowsCopiedTicker.Stop() - parallelism := getInsertParallelism() + parallelism := int(math.Max(1, float64(vc.vr.workflowConfig.ParallelInsertWorkers))) copyWorkerFactory := vc.newCopyWorkerFactory(parallelism) var copyWorkQueue *vcopierCopyWorkQueue @@ -102,6 +100,9 @@ func (vc *vcopier) copyAll(ctx context.Context, settings binlogplayer.VRSettings var prevCh <-chan *vcopierCopyTaskResult var gtid string + vstreamOptions := &binlogdatapb.VStreamOptions{ + ConfigOverrides: vc.vr.workflowConfig.Overrides, + } serr := vc.vr.sourceVStreamer.VStreamTables(ctx, func(resp *binlogdatapb.VStreamTablesResponse) error { defer vc.vr.stats.PhaseTimings.Record("copy", time.Now()) defer vc.vr.stats.CopyLoopCount.Add(1) @@ -274,7 +275,7 @@ func (vc *vcopier) copyAll(ctx context.Context, settings binlogplayer.VRSettings default: } return nil - }) + }, vstreamOptions) if serr != nil { log.Infof("VStreamTables failed: %v", serr) return serr diff --git a/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go b/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go index fda9012c1b5..a95e0bf17c5 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vcopier_test.go @@ -25,10 +25,9 @@ import ( "testing" "time" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletserver/vstreamer/testenv" - "vitess.io/vitess/go/vt/vttablet" - "vitess.io/vitess/go/vt/log" "github.com/stretchr/testify/require" @@ -49,30 +48,30 @@ func commonVcopierTestCases() []vcopierTestCase { return []vcopierTestCase{ // Default experimental flags. { - vreplicationExperimentalFlags: vttablet.VReplicationExperimentalFlags, + vreplicationExperimentalFlags: vttablet.DefaultVReplicationConfig.ExperimentalFlags, }, // Parallel bulk inserts enabled with 4 workers. { - vreplicationExperimentalFlags: vttablet.VReplicationExperimentalFlags, + vreplicationExperimentalFlags: vttablet.DefaultVReplicationConfig.ExperimentalFlags, vreplicationParallelInsertWorkers: 4, }, } } func testVcopierTestCases(t *testing.T, test func(*testing.T), cases []vcopierTestCase) { - oldVreplicationExperimentalFlags := vttablet.VReplicationExperimentalFlags - oldVreplicationParallelInsertWorkers := vreplicationParallelInsertWorkers + oldVreplicationExperimentalFlags := vttablet.DefaultVReplicationConfig.ExperimentalFlags + oldVreplicationParallelInsertWorkers := vttablet.DefaultVReplicationConfig.ParallelInsertWorkers // Extra reset at the end in case we return prematurely. defer func() { - vttablet.VReplicationExperimentalFlags = oldVreplicationExperimentalFlags - vreplicationParallelInsertWorkers = oldVreplicationParallelInsertWorkers + vttablet.DefaultVReplicationConfig.ExperimentalFlags = oldVreplicationExperimentalFlags + vttablet.DefaultVReplicationConfig.ParallelInsertWorkers = oldVreplicationParallelInsertWorkers }() for _, tc := range cases { tc := tc // Avoid export loop bugs. // Set test flags. - vttablet.VReplicationExperimentalFlags = tc.vreplicationExperimentalFlags - vreplicationParallelInsertWorkers = tc.vreplicationParallelInsertWorkers + vttablet.DefaultVReplicationConfig.ExperimentalFlags = tc.vreplicationExperimentalFlags + vttablet.DefaultVReplicationConfig.ParallelInsertWorkers = tc.vreplicationParallelInsertWorkers // Run test case. t.Run( fmt.Sprintf( @@ -82,8 +81,8 @@ func testVcopierTestCases(t *testing.T, test func(*testing.T), cases []vcopierTe test, ) // Reset. - vttablet.VReplicationExperimentalFlags = oldVreplicationExperimentalFlags - vreplicationParallelInsertWorkers = oldVreplicationParallelInsertWorkers + vttablet.DefaultVReplicationConfig.ExperimentalFlags = oldVreplicationExperimentalFlags + vttablet.DefaultVReplicationConfig.ParallelInsertWorkers = oldVreplicationParallelInsertWorkers } } @@ -97,10 +96,10 @@ func testPlayerCopyCharPK(t *testing.T) { reset := vstreamer.AdjustPacketSize(1) defer reset() - savedCopyPhaseDuration := vttablet.CopyPhaseDuration + savedCopyPhaseDuration := vttablet.DefaultVReplicationConfig.CopyPhaseDuration // copyPhaseDuration should be low enough to have time to send one row. - vttablet.CopyPhaseDuration = 500 * time.Millisecond - defer func() { vttablet.CopyPhaseDuration = savedCopyPhaseDuration }() + vttablet.DefaultVReplicationConfig.CopyPhaseDuration = 500 * time.Millisecond + defer func() { vttablet.DefaultVReplicationConfig.CopyPhaseDuration = savedCopyPhaseDuration }() savedWaitRetryTime := waitRetryTime // waitRetry time should be very low to cause the wait loop to execute multiple times. @@ -175,11 +174,11 @@ func testPlayerCopyCharPK(t *testing.T) { "/update _vt.vreplication set message='Picked source tablet.*", "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", - "insert into dst(idc,val) values ('a\\0',1)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"idc" type:BINARY charset:63 flags:20611} rows:{lengths:2 values:"a\\\\x00"}'.*`, - `update dst set val=3 where idc='a\0' and ('a\0') <= ('a\0')`, - "insert into dst(idc,val) values ('c\\0',2)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"idc" type:BINARY charset:63 flags:20611} rows:{lengths:2 values:"c\\\\x00"}'.*`, + "insert into dst(idc,val) values (_binary'a\\0',1)", + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"idc" type:BINARY charset:63 flags:20611} rows:{lengths:2 values:"a\\\\x00"}'.*`, + `update dst set val=3 where idc=_binary'a\0' and (_binary'a\0') <= (_binary'a\0')`, + "insert into dst(idc,val) values (_binary'c\\0',2)", + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"idc" type:BINARY charset:63 flags:20611} rows:{lengths:2 values:"c\\\\x00"}'.*`, "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name.*dst", "/update _vt.vreplication set state='Running", ), recvTimeout) @@ -203,10 +202,10 @@ func testPlayerCopyVarcharPKCaseInsensitive(t *testing.T) { reset := vstreamer.AdjustPacketSize(1) defer reset() - savedCopyPhaseDuration := vttablet.CopyPhaseDuration + savedCopyPhaseDuration := vttablet.DefaultVReplicationConfig.CopyPhaseDuration // copyPhaseDuration should be low enough to have time to send one row. - vttablet.CopyPhaseDuration = 500 * time.Millisecond - defer func() { vttablet.CopyPhaseDuration = savedCopyPhaseDuration }() + vttablet.DefaultVReplicationConfig.CopyPhaseDuration = 500 * time.Millisecond + defer func() { vttablet.DefaultVReplicationConfig.CopyPhaseDuration = savedCopyPhaseDuration }() savedWaitRetryTime := waitRetryTime // waitRetry time should be very low to cause the wait loop to execute multiple times. @@ -283,21 +282,21 @@ func testPlayerCopyVarcharPKCaseInsensitive(t *testing.T) { "/update _vt.vreplication set state='Copying'", // Copy mode. "insert into dst(idc,val) values ('a',1)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"idc" type:VARCHAR charset:33 flags:20483} rows:{lengths:1 values:"a"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"idc" type:VARCHAR charset:33 flags:20483} rows:{lengths:1 values:"a"}'.*`, // Copy-catchup mode. `/insert into dst\(idc,val\) select 'B', 3 from dual where \( .* 'B' COLLATE .* \) <= \( .* 'a' COLLATE .* \)`, ).Then(func(expect qh.ExpectationSequencer) qh.ExpectationSequencer { // Back to copy mode. // Inserts can happen out of order. // Updates must happen in order. - //upd1 := expect. + // upd1 := expect. upd1 := expect.Then(qh.Eventually( "insert into dst(idc,val) values ('B',3)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"idc" type:VARCHAR charset:33 flags:20483} rows:{lengths:1 values:"B"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"idc" type:VARCHAR charset:33 flags:20483} rows:{lengths:1 values:"B"}'.*`, )) upd2 := expect.Then(qh.Eventually( "insert into dst(idc,val) values ('c',2)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"idc" type:VARCHAR charset:33 flags:20483} rows:{lengths:1 values:"c"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"idc" type:VARCHAR charset:33 flags:20483} rows:{lengths:1 values:"c"}'.*`, )) upd1.Then(upd2.Eventually()) return upd2 @@ -325,10 +324,10 @@ func testPlayerCopyVarcharCompositePKCaseSensitiveCollation(t *testing.T) { reset := vstreamer.AdjustPacketSize(1) defer reset() - savedCopyPhaseDuration := vttablet.CopyPhaseDuration + savedCopyPhaseDuration := vttablet.DefaultVReplicationConfig.CopyPhaseDuration // copyPhaseDuration should be low enough to have time to send one row. - vttablet.CopyPhaseDuration = 500 * time.Millisecond - defer func() { vttablet.CopyPhaseDuration = savedCopyPhaseDuration }() + vttablet.DefaultVReplicationConfig.CopyPhaseDuration = 500 * time.Millisecond + defer func() { vttablet.DefaultVReplicationConfig.CopyPhaseDuration = savedCopyPhaseDuration }() savedWaitRetryTime := waitRetryTime // waitRetry time should be very low to cause the wait loop to execute multiple times. @@ -337,7 +336,7 @@ func testPlayerCopyVarcharCompositePKCaseSensitiveCollation(t *testing.T) { execStatements(t, []string{ "create table src(id int, idc varbinary(20), idc2 varbinary(20), val int, primary key(id,idc,idc2))", - "insert into src values(1, 'a', 'a', 1), (1, 'c', 'c', 2)", + "insert into src values(1, _binary'a', _binary'a', 1), (1, _binary'c', _binary'c', 2)", fmt.Sprintf("create table %s.dst(id int, idc varbinary(20), idc2 varbinary(20), val int, primary key(id,idc,idc2))", vrepldb), }) defer execStatements(t, []string{ @@ -355,7 +354,7 @@ func testPlayerCopyVarcharCompositePKCaseSensitiveCollation(t *testing.T) { } // Insert a row with PK which is < the lastPK till now because of the utf8mb4 collation execStatements(t, []string{ - "insert into src values(1, 'B', 'B', 3)", + "insert into src values(1, _binary'B', _binary'B', 3)", }) // Wait for context to expire and then send the row. // This will cause the copier to abort and go back to catchup mode. @@ -405,13 +404,13 @@ func testPlayerCopyVarcharCompositePKCaseSensitiveCollation(t *testing.T) { "/insert into _vt.copy_state", "/update _vt.vreplication set state='Copying'", // Copy mode. - "insert into dst(id,idc,idc2,val) values (1,'a','a',1)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} fields:{name:"idc" type:VARBINARY charset:63 flags:20611} fields:{name:"idc2" type:VARBINARY charset:63 flags:20611} rows:{lengths:1 lengths:1 lengths:1 values:"1aa"}'.*`, + "insert into dst(id,idc,idc2,val) values (1,_binary'a',_binary'a',1)", + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} fields:{name:"idc" type:VARBINARY charset:63 flags:20611} fields:{name:"idc2" type:VARBINARY charset:63 flags:20611} rows:{lengths:1 lengths:1 lengths:1 values:"1aa"}'.*`, // Copy-catchup mode. - `insert into dst(id,idc,idc2,val) select 1, 'B', 'B', 3 from dual where (1,'B','B') <= (1,'a','a')`, + `insert into dst(id,idc,idc2,val) select 1, _binary'B', _binary'B', 3 from dual where (1,_binary'B',_binary'B') <= (1,_binary'a',_binary'a')`, // Copy mode. - "insert into dst(id,idc,idc2,val) values (1,'c','c',2)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} fields:{name:"idc" type:VARBINARY charset:63 flags:20611} fields:{name:"idc2" type:VARBINARY charset:63 flags:20611} rows:{lengths:1 lengths:1 lengths:1 values:"1cc"}'.*`, + "insert into dst(id,idc,idc2,val) values (1,_binary'c',_binary'c',2)", + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} fields:{name:"idc" type:VARBINARY charset:63 flags:20611} fields:{name:"idc2" type:VARBINARY charset:63 flags:20611} rows:{lengths:1 lengths:1 lengths:1 values:"1cc"}'.*`, // Wrap-up. "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name.*dst", "/update _vt.vreplication set state='Running'", @@ -486,7 +485,7 @@ func testPlayerCopyTablesWithFK(t *testing.T) { "/update _vt.vreplication set pos=", ).Then(func(expect qh.ExpectationSequencer) qh.ExpectationSequencer { // With parallel inserts, new db client connects are created on-the-fly. - if vreplicationParallelInsertWorkers > 1 { + if vttablet.DefaultVReplicationConfig.ParallelInsertWorkers > 1 { return expect.Then(qh.Eventually("set @@session.foreign_key_checks=0")) } return expect @@ -495,7 +494,7 @@ func testPlayerCopyTablesWithFK(t *testing.T) { // Inserts may happen out-of-order. Update happen in-order. "begin", "insert into dst1(id,id2) values (1,1), (2,2)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, "commit", )).Then(qh.Immediately( "set @@session.foreign_key_checks=0", @@ -508,7 +507,7 @@ func testPlayerCopyTablesWithFK(t *testing.T) { "commit", )).Then(func(expect qh.ExpectationSequencer) qh.ExpectationSequencer { // With parallel inserts, new db client connects are created on-the-fly. - if vreplicationParallelInsertWorkers > 1 { + if vttablet.DefaultVReplicationConfig.ParallelInsertWorkers > 1 { return expect.Then(qh.Eventually("set @@session.foreign_key_checks=0")) } return expect @@ -516,7 +515,7 @@ func testPlayerCopyTablesWithFK(t *testing.T) { // copy dst2 "begin", "insert into dst2(id,id2) values (1,21), (2,22)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, "commit", )).Then(qh.Immediately( "set @@session.foreign_key_checks=0", @@ -561,13 +560,13 @@ func testPlayerCopyTables(t *testing.T) { execStatements(t, []string{ "create table ast1(id int, primary key(id))", - "create table src1(id int, val varbinary(128), d decimal(8,0), j json, primary key(id))", + "create table src1(id int, val varchar(128), d decimal(8,0), j json, primary key(id))", "insert into src1 values(2, 'bbb', 1, '{\"foo\": \"bar\"}'), (1, 'aaa', 0, JSON_ARRAY(123456789012345678901234567890, \"abcd\")), (3, 'ccc', 2, 'null'), (4, 'ddd', 3, '{\"name\": \"matt\", \"size\": null}'), (5, 'eee', 4, null)", fmt.Sprintf("create table %s.ast1(id int, primary key(id))", vrepldb), - fmt.Sprintf("create table %s.dst1(id int, val varbinary(128), val2 varbinary(128), d decimal(8,0), j json, primary key(id))", vrepldb), - "create table yes(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.yes(id int, val varbinary(128), primary key(id))", vrepldb), - "create table no(id int, val varbinary(128), primary key(id))", + fmt.Sprintf("create table %s.dst1(id int, val varchar(128), val2 varchar(128), d decimal(8,0), j json, primary key(id))", vrepldb), + "create table yes(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.yes(id int, val varchar(128), primary key(id))", vrepldb), + "create table no(id int, val varchar(128), primary key(id))", }) defer execStatements(t, []string{ "drop table ast1", @@ -629,7 +628,7 @@ func testPlayerCopyTables(t *testing.T) { "commit", "begin", "insert into dst1(id,val,val2,d,j) values (1,'aaa','aaa',0,JSON_ARRAY(123456789012345678901234567890, _utf8mb4'abcd')), (2,'bbb','bbb',1,JSON_OBJECT(_utf8mb4'foo', _utf8mb4'bar')), (3,'ccc','ccc',2,CAST(_utf8mb4'null' as JSON)), (4,'ddd','ddd',3,JSON_OBJECT(_utf8mb4'name', _utf8mb4'matt', _utf8mb4'size', null)), (5,'eee','eee',4,null)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"5"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"5"}'.*`, "commit", // copy of dst1 is done: delete from copy_state. "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name.*dst1", @@ -685,10 +684,10 @@ func testPlayerCopyBigTable(t *testing.T) { reset := vstreamer.AdjustPacketSize(1) defer reset() - savedCopyPhaseDuration := vttablet.CopyPhaseDuration + savedCopyPhaseDuration := vttablet.DefaultVReplicationConfig.CopyPhaseDuration // copyPhaseDuration should be low enough to have time to send one row. - vttablet.CopyPhaseDuration = 500 * time.Millisecond - defer func() { vttablet.CopyPhaseDuration = savedCopyPhaseDuration }() + vttablet.DefaultVReplicationConfig.CopyPhaseDuration = 500 * time.Millisecond + defer func() { vttablet.DefaultVReplicationConfig.CopyPhaseDuration = savedCopyPhaseDuration }() savedWaitRetryTime := waitRetryTime // waitRetry time should be very low to cause the wait loop to execute multiple times. @@ -696,9 +695,9 @@ func testPlayerCopyBigTable(t *testing.T) { defer func() { waitRetryTime = savedWaitRetryTime }() execStatements(t, []string{ - "create table src(id int, val varbinary(128), primary key(id))", + "create table src(id int, val varchar(128), primary key(id))", "insert into src values(1, 'aaa'), (2, 'bbb')", - fmt.Sprintf("create table %s.dst(id int, val varbinary(128), primary key(id))", vrepldb), + fmt.Sprintf("create table %s.dst(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table src", @@ -765,7 +764,7 @@ func testPlayerCopyBigTable(t *testing.T) { // The first fast-forward has no starting point. So, it just saves the current position. "/update _vt.vreplication set state='Copying'", "insert into dst(id,val) values (1,'aaa')", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"1"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"1"}'.*`, // The next catchup executes the new row insert, but will be a no-op. "insert into dst(id,val) select 3, 'ccc' from dual where (3) <= (1)", // fastForward has nothing to add. Just saves position. @@ -775,12 +774,12 @@ func testPlayerCopyBigTable(t *testing.T) { ).Then(func(expect qh.ExpectationSequencer) qh.ExpectationSequencer { ins1 := expect.Then(qh.Eventually("insert into dst(id,val) values (2,'bbb')")) upd1 := ins1.Then(qh.Eventually( - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, )) // Third row copied without going back to catchup state. ins3 := expect.Then(qh.Eventually("insert into dst(id,val) values (3,'ccc')")) upd3 := ins3.Then(qh.Eventually( - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"3"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"3"}'.*`, )) upd1.Then(upd3.Eventually()) return upd3 @@ -815,10 +814,10 @@ func testPlayerCopyWildcardRule(t *testing.T) { reset := vstreamer.AdjustPacketSize(1) defer reset() - savedCopyPhaseDuration := vttablet.CopyPhaseDuration + savedCopyPhaseDuration := vttablet.DefaultVReplicationConfig.CopyPhaseDuration // copyPhaseDuration should be low enough to have time to send one row. - vttablet.CopyPhaseDuration = 500 * time.Millisecond - defer func() { vttablet.CopyPhaseDuration = savedCopyPhaseDuration }() + vttablet.DefaultVReplicationConfig.CopyPhaseDuration = 500 * time.Millisecond + defer func() { vttablet.DefaultVReplicationConfig.CopyPhaseDuration = savedCopyPhaseDuration }() savedWaitRetryTime := waitRetryTime // waitRetry time should be very low to cause the wait loop to execute multiple times. @@ -826,9 +825,9 @@ func testPlayerCopyWildcardRule(t *testing.T) { defer func() { waitRetryTime = savedWaitRetryTime }() execStatements(t, []string{ - "create table src(id int, val varbinary(128), primary key(id))", + "create table src(id int, val varchar(128), primary key(id))", "insert into src values(1, 'aaa'), (2, 'bbb')", - fmt.Sprintf("create table %s.src(id int, val varbinary(128), primary key(id))", vrepldb), + fmt.Sprintf("create table %s.src(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table src", @@ -894,7 +893,7 @@ func testPlayerCopyWildcardRule(t *testing.T) { "/update _vt.vreplication set state='Copying'", // The first fast-forward has no starting point. So, it just saves the current position. "insert into src(id,val) values (1,'aaa')", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"1"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"1"}'.*`, // The next catchup executes the new row insert, but will be a no-op. "insert into src(id,val) select 3, 'ccc' from dual where (3) <= (1)", // fastForward has nothing to add. Just saves position. @@ -904,12 +903,12 @@ func testPlayerCopyWildcardRule(t *testing.T) { ).Then(func(expect qh.ExpectationSequencer) qh.ExpectationSequencer { ins1 := expect.Then(qh.Eventually("insert into src(id,val) values (2,'bbb')")) upd1 := ins1.Then(qh.Eventually( - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, )) // Third row copied without going back to catchup state. ins3 := expect.Then(qh.Eventually("insert into src(id,val) values (3,'ccc')")) upd3 := ins3.Then(qh.Eventually( - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"3"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"3"}'.*`, )) upd1.Then(upd3.Eventually()) return upd3 @@ -944,19 +943,19 @@ func testPlayerCopyTableContinuation(t *testing.T) { // src1 is initialized as partially copied. // lastpk will be initialized at (6,6) later below. // dst1 only copies id1 and val. This will allow us to test for correctness if id2 changes in the source. - "create table src1(id1 int, id2 int, val varbinary(128), primary key(id1, id2))", + "create table src1(id1 int, id2 int, val varchar(128), primary key(id1, id2))", "insert into src1 values(2,2,'no change'), (3,3,'update'), (4,4,'delete'), (5,5,'move within'), (6,6,'move out'), (8,8,'no change'), (9,9,'delete'), (10,10,'update'), (11,11,'move in')", - fmt.Sprintf("create table %s.dst1(id int, val varbinary(128), primary key(id))", vrepldb), + fmt.Sprintf("create table %s.dst1(id int, val varchar(128), primary key(id))", vrepldb), fmt.Sprintf("insert into %s.dst1 values(2,'no change'), (3,'update'), (4,'delete'), (5,'move within'), (6,'move out')", vrepldb), // copied is initialized as fully copied - "create table copied(id int, val varbinary(128), primary key(id))", + "create table copied(id int, val varchar(128), primary key(id))", "insert into copied values(1,'aaa')", - fmt.Sprintf("create table %s.copied(id int, val varbinary(128), primary key(id))", vrepldb), + fmt.Sprintf("create table %s.copied(id int, val varchar(128), primary key(id))", vrepldb), fmt.Sprintf("insert into %s.copied values(1,'aaa')", vrepldb), // not_copied yet to be copied. - "create table not_copied(id int, val varbinary(128), primary key(id))", + "create table not_copied(id int, val varchar(128), primary key(id))", "insert into not_copied values(1,'aaa')", - fmt.Sprintf("create table %s.not_copied(id int, val varbinary(128), primary key(id))", vrepldb), + fmt.Sprintf("create table %s.not_copied(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table src1", @@ -1068,13 +1067,13 @@ func testPlayerCopyTableContinuation(t *testing.T) { ).Then(qh.Immediately( "insert into dst1(id,val) values (7,'insert out'), (8,'no change'), (10,'updated'), (12,'move out')", )).Then(qh.Eventually( - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id1" type:INT32 charset:63 flags:53251} fields:{name:"id2" type:INT32 charset:63 flags:53251} rows:{lengths:2 lengths:1 values:"126"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id1" type:INT32 charset:63 flags:53251} fields:{name:"id2" type:INT32 charset:63 flags:53251} rows:{lengths:2 lengths:1 values:"126"}'.*`, )).Then(qh.Immediately( "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name.*dst1", "insert into not_copied(id,val) values (1,'bbb')", )).Then(qh.Eventually( // Copy again. There should be no events for catchup. - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"1"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"1"}'.*`, )).Then(qh.Immediately( "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name.*not_copied", "/update _vt.vreplication set state='Running'", @@ -1119,9 +1118,9 @@ func testPlayerCopyWildcardTableContinuation(t *testing.T) { defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table src(id int, val varbinary(128), primary key(id))", + "create table src(id int, val varchar(128), primary key(id))", "insert into src values(2,'copied'), (3,'uncopied')", - fmt.Sprintf("create table %s.dst(id int, val varbinary(128), primary key(id))", vrepldb), + fmt.Sprintf("create table %s.dst(id int, val varchar(128), primary key(id))", vrepldb), fmt.Sprintf("insert into %s.dst values(2,'copied')", vrepldb), }) defer execStatements(t, []string{ @@ -1173,7 +1172,7 @@ func testPlayerCopyWildcardTableContinuation(t *testing.T) { expectDeleteQueries(t) }() - optimizeInsertsEnabled := vttablet.VReplicationExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagOptimizeInserts != 0 + optimizeInsertsEnabled := vttablet.DefaultVReplicationConfig.ExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagOptimizeInserts != 0 expectNontxQueries(t, qh.Expect( "/insert into _vt.vreplication", @@ -1203,21 +1202,25 @@ func testPlayerCopyWildcardTableContinuation(t *testing.T) { } } +func setExperimentalFlags(flags int64) func() { + oldVreplicationExperimentalFlags := vttablet.DefaultVReplicationConfig.ExperimentalFlags + vttablet.DefaultVReplicationConfig.ExperimentalFlags = flags + return func() { + vttablet.DefaultVReplicationConfig.ExperimentalFlags = oldVreplicationExperimentalFlags + } +} + // TestPlayerCopyWildcardTableContinuationWithOptimizeInserts tests the copy workflow where tables have been partially copied // enabling the optimize inserts functionality func TestPlayerCopyWildcardTableContinuationWithOptimizeInserts(t *testing.T) { - oldVreplicationExperimentalFlags := vttablet.VReplicationExperimentalFlags - vttablet.VReplicationExperimentalFlags = vttablet.VReplicationExperimentalFlagOptimizeInserts - defer func() { - vttablet.VReplicationExperimentalFlags = oldVreplicationExperimentalFlags - }() + defer setExperimentalFlags(vttablet.VReplicationExperimentalFlagOptimizeInserts)() defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table src(id int, val varbinary(128), primary key(id))", + "create table src(id int, val varchar(128), primary key(id))", "insert into src values(2,'copied'), (3,'uncopied')", - fmt.Sprintf("create table %s.dst(id int, val varbinary(128), primary key(id))", vrepldb), + fmt.Sprintf("create table %s.dst(id int, val varchar(128), primary key(id))", vrepldb), fmt.Sprintf("insert into %s.dst values(2,'copied')", vrepldb), }) defer execStatements(t, []string{ @@ -1341,9 +1344,9 @@ func testPlayerCopyTablesStopAfterCopy(t *testing.T) { defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table src1(id int, val varbinary(128), primary key(id))", + "create table src1(id int, val varchar(128), primary key(id))", "insert into src1 values(2, 'bbb'), (1, 'aaa')", - fmt.Sprintf("create table %s.dst1(id int, val varbinary(128), primary key(id))", vrepldb), + fmt.Sprintf("create table %s.dst1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table src1", @@ -1390,7 +1393,7 @@ func testPlayerCopyTablesStopAfterCopy(t *testing.T) { ).Then(qh.Eventually( "begin", "insert into dst1(id,val) values (1,'aaa'), (2,'bbb')", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, "commit", )).Then(qh.Immediately( // copy of dst1 is done: delete from copy_state. @@ -1420,13 +1423,13 @@ func testPlayerCopyTablesGIPK(t *testing.T) { execStatements(t, []string{ "SET @@session.sql_generate_invisible_primary_key=ON;", - "create table src1(val varbinary(128))", + "create table src1(val varchar(128))", "insert into src1 values('aaa'), ('bbb')", - "create table src2(val varbinary(128))", + "create table src2(val varchar(128))", "insert into src2 values('aaa'), ('bbb')", - fmt.Sprintf("create table %s.dst1(val varbinary(128))", vrepldb), + fmt.Sprintf("create table %s.dst1(val varchar(128))", vrepldb), "SET @@session.sql_generate_invisible_primary_key=OFF;", - fmt.Sprintf("create table %s.dst2(my_row_id int, val varbinary(128), primary key(my_row_id))", vrepldb), + fmt.Sprintf("create table %s.dst2(my_row_id int, val varchar(128), primary key(my_row_id))", vrepldb), }) defer execStatements(t, []string{ "drop table src1", @@ -1478,7 +1481,7 @@ func testPlayerCopyTablesGIPK(t *testing.T) { ).Then(qh.Eventually( "begin", "insert into dst1(my_row_id,val) values (1,'aaa'), (2,'bbb')", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"my_row_id" type:UINT64 charset:63 flags:49699} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"my_row_id" type:UINT64 charset:63 flags:49699} rows:{lengths:1 values:"2"}'.*`, "commit", )).Then(qh.Immediately( // copy of dst1 is done: delete from copy_state. @@ -1489,7 +1492,7 @@ func testPlayerCopyTablesGIPK(t *testing.T) { "commit", "begin", "insert into dst2(my_row_id,val) values (1,'aaa'), (2,'bbb')", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"my_row_id" type:UINT64 charset:63 flags:49699} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"my_row_id" type:UINT64 charset:63 flags:49699} rows:{lengths:1 values:"2"}'.*`, "commit", )).Then(qh.Immediately( // copy of dst2 is done: delete from copy_state. @@ -1516,23 +1519,25 @@ func testPlayerCopyTableCancel(t *testing.T) { defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table src1(id int, val varbinary(128), primary key(id))", + "create table src1(id int, val varchar(128), primary key(id))", "insert into src1 values(2, 'bbb'), (1, 'aaa')", - fmt.Sprintf("create table %s.dst1(id int, val varbinary(128), primary key(id))", vrepldb), + fmt.Sprintf("create table %s.dst1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table src1", fmt.Sprintf("drop table %s.dst1", vrepldb), }) - saveTimeout := vttablet.CopyPhaseDuration - vttablet.CopyPhaseDuration = 1 * time.Millisecond - defer func() { vttablet.CopyPhaseDuration = saveTimeout }() + saveTimeout := vttablet.DefaultVReplicationConfig.CopyPhaseDuration + vttablet.DefaultVReplicationConfig.CopyPhaseDuration = 1 * time.Millisecond + defer func() { vttablet.DefaultVReplicationConfig.CopyPhaseDuration = saveTimeout }() // Set a hook to reset the copy timeout after first call. vstreamRowsHook = func(ctx context.Context) { <-ctx.Done() - vttablet.CopyPhaseDuration = saveTimeout + for _, ct := range playerEngine.controllers { + ct.WorkflowConfig.CopyPhaseDuration = saveTimeout + } vstreamRowsHook = nil } @@ -1578,7 +1583,7 @@ func testPlayerCopyTableCancel(t *testing.T) { ).Then(qh.Eventually( "begin", "insert into dst1(id,val) values (1,'aaa'), (2,'bbb')", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, "commit", )).Then(qh.Immediately( // copy of dst1 is done: delete from copy_state. @@ -1601,12 +1606,12 @@ func testPlayerCopyTablesWithGeneratedColumn(t *testing.T) { defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table src1(id int, val varbinary(128), val2 varbinary(128) as (concat(id, val)), val3 varbinary(128) as (concat(val, id)), id2 int, primary key(id))", + "create table src1(id int, val varchar(128), val2 varchar(128) as (concat(id, val)), val3 varchar(128) as (concat(val, id)), id2 int, primary key(id))", "insert into src1(id, val, id2) values(2, 'bbb', 20), (1, 'aaa', 10)", - fmt.Sprintf("create table %s.dst1(id int, val varbinary(128), val2 varbinary(128) as (concat(id, val)), val3 varbinary(128), id2 int, primary key(id))", vrepldb), - "create table src2(id int, val varbinary(128), val2 varbinary(128) as (concat(id, val)), val3 varbinary(128) as (concat(val, id)), id2 int, primary key(id))", + fmt.Sprintf("create table %s.dst1(id int, val varchar(128), val2 varchar(128) as (concat(id, val)), val3 varchar(128), id2 int, primary key(id))", vrepldb), + "create table src2(id int, val varchar(128), val2 varchar(128) as (concat(id, val)), val3 varchar(128) as (concat(val, id)), id2 int, primary key(id))", "insert into src2(id, val, id2) values(2, 'bbb', 20), (1, 'aaa', 10)", - fmt.Sprintf("create table %s.dst2(val3 varbinary(128), val varbinary(128), id2 int)", vrepldb), + fmt.Sprintf("create table %s.dst2(val3 varchar(128), val varchar(128), id2 int)", vrepldb), }) defer execStatements(t, []string{ "drop table src1", @@ -1651,11 +1656,11 @@ func testPlayerCopyTablesWithGeneratedColumn(t *testing.T) { "/update _vt.vreplication set state", // The first fast-forward has no starting point. So, it just saves the current position. "insert into dst1(id,val,val3,id2) values (1,'aaa','aaa1',10), (2,'bbb','bbb2',20)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, // copy of dst1 is done: delete from copy_state. "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name.*dst1", "insert into dst2(val3,val,id2) values ('aaa1','aaa',10), ('bbb2','bbb',20)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, // copy of dst2 is done: delete from copy_state. "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name.*dst2", "/update _vt.vreplication set state", @@ -1732,7 +1737,7 @@ func testCopyTablesWithInvalidDates(t *testing.T) { ).Then(qh.Eventually( "begin", "insert into dst1(id,dt) values (1,'2020-01-12'), (2,'0000-00-00')", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} rows:{lengths:1 values:"2"}'.*`, "commit", )).Then(qh.Immediately( // copy of dst1 is done: delete from copy_state. @@ -1822,7 +1827,7 @@ func testCopyInvisibleColumns(t *testing.T) { "/update _vt.vreplication set state='Copying'", // The first fast-forward has no starting point. So, it just saves the current position. "insert into dst1(id,id2,inv1,inv2) values (1,10,100,1000), (2,20,200,2000)", - `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \('fields:{name:"id" type:INT32 charset:63 flags:53251} fields:{name:"inv1" type:INT32 charset:63 flags:53251} rows:{lengths:1 lengths:3 values:"2200"}'.*`, + `/insert into _vt.copy_state \(lastpk, vrepl_id, table_name\) values \(_binary'fields:{name:"id" type:INT32 charset:63 flags:53251} fields:{name:"inv1" type:INT32 charset:63 flags:53251} rows:{lengths:1 lengths:3 values:"2200"}'.*`, // copy of dst1 is done: delete from copy_state. "/delete cs, pca from _vt.copy_state as cs left join _vt.post_copy_action as pca on cs.vrepl_id=pca.vrepl_id and cs.table_name=pca.table_name.*dst1", "/update _vt.vreplication set state='Running'", diff --git a/go/vt/vttablet/tabletmanager/vreplication/vdbclient.go b/go/vt/vttablet/tabletmanager/vreplication/vdbclient.go index 39a8229efc6..b8339cdf874 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vdbclient.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vdbclient.go @@ -34,19 +34,21 @@ import ( // It allows us to retry a failed transactions on lock errors. type vdbClient struct { binlogplayer.DBClient - stats *binlogplayer.Stats - InTransaction bool - startTime time.Time - queries []string - queriesPos int64 - batchSize int64 - maxBatchSize int64 + stats *binlogplayer.Stats + InTransaction bool + startTime time.Time + queries []string + queriesPos int64 + batchSize int64 + maxBatchSize int64 + relayLogMaxItems int } -func newVDBClient(dbclient binlogplayer.DBClient, stats *binlogplayer.Stats) *vdbClient { +func newVDBClient(dbclient binlogplayer.DBClient, stats *binlogplayer.Stats, relayLogMaxItems int) *vdbClient { return &vdbClient{ - DBClient: dbclient, - stats: stats, + DBClient: dbclient, + stats: stats, + relayLogMaxItems: relayLogMaxItems, } } @@ -163,7 +165,7 @@ func (vc *vdbClient) ExecuteTrxQueryBatch() ([]*sqltypes.Result, error) { // Execute is ExecuteFetch without the maxrows. func (vc *vdbClient) Execute(query string) (*sqltypes.Result, error) { // Number of rows should never exceed relayLogMaxItems. - return vc.ExecuteFetch(query, relayLogMaxItems) + return vc.ExecuteFetch(query, vc.relayLogMaxItems) } func (vc *vdbClient) ExecuteWithRetry(ctx context.Context, query string) (*sqltypes.Result, error) { @@ -199,7 +201,7 @@ func (vc *vdbClient) Retry() (*sqltypes.Result, error) { continue } // Number of rows should never exceed relayLogMaxItems. - result, err := vc.DBClient.ExecuteFetch(q, relayLogMaxItems) + result, err := vc.DBClient.ExecuteFetch(q, vc.relayLogMaxItems) if err != nil { return nil, err } diff --git a/go/vt/vttablet/tabletmanager/vreplication/vplayer.go b/go/vt/vttablet/tabletmanager/vreplication/vplayer.go index c2eba565524..db2f3f341ac 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vplayer.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vplayer.go @@ -31,7 +31,7 @@ import ( "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -133,20 +133,20 @@ func newVPlayer(vr *vreplicator, settings binlogplayer.VRSettings, copyState map return vr.dbClient.Commit() } batchMode := false - if vttablet.VReplicationExperimentalFlags&vttablet.VReplicationExperimentalFlagVPlayerBatching != 0 { + if vr.workflowConfig.ExperimentalFlags&vttablet.VReplicationExperimentalFlagVPlayerBatching != 0 { batchMode = true } if batchMode { // relayLogMaxSize is effectively the limit used when not batching. - maxAllowedPacket := int64(relayLogMaxSize) + maxAllowedPacket := int64(vr.workflowConfig.RelayLogMaxSize) // We explicitly do NOT want to batch this, we want to send it down the wire // immediately so we use ExecuteFetch directly. res, err := vr.dbClient.ExecuteFetch("select @@session.max_allowed_packet as max_allowed_packet", 1) if err != nil { - log.Errorf("Error getting max_allowed_packet, will use the relay_log_max_size value of %d bytes: %v", relayLogMaxSize, err) + log.Errorf("Error getting max_allowed_packet, will use the relay_log_max_size value of %d bytes: %v", vr.workflowConfig.RelayLogMaxSize, err) } else { if maxAllowedPacket, err = res.Rows[0][0].ToInt64(); err != nil { - log.Errorf("Error getting max_allowed_packet, will use the relay_log_max_size value of %d bytes: %v", relayLogMaxSize, err) + log.Errorf("Error getting max_allowed_packet, will use the relay_log_max_size value of %d bytes: %v", vr.workflowConfig.RelayLogMaxSize, err) } } // Leave 64 bytes of room for the commit to be sure that we have a more than @@ -176,7 +176,7 @@ func newVPlayer(vr *vreplicator, settings binlogplayer.VRSettings, copyState map timeLastSaved: time.Now(), tablePlans: make(map[string]*TablePlan), phase: phase, - throttlerAppName: throttlerapp.VCopierName.ConcatenateString(vr.throttlerAppName()), + throttlerAppName: throttlerapp.VPlayerName.ConcatenateString(vr.throttlerAppName()), query: queryFunc, commit: commitFunc, batchMode: batchMode, @@ -193,7 +193,7 @@ func (vp *vplayer) play(ctx context.Context) error { return nil } - plan, err := buildReplicatorPlan(vp.vr.source, vp.vr.colInfoMap, vp.copyState, vp.vr.stats, vp.vr.vre.env.CollationEnv(), vp.vr.vre.env.Parser()) + plan, err := vp.vr.buildReplicatorPlan(vp.vr.source, vp.vr.colInfoMap, vp.copyState, vp.vr.stats, vp.vr.vre.env.CollationEnv(), vp.vr.vre.env.Parser()) if err != nil { vp.vr.stats.ErrorCounts.Add([]string{"Plan"}, 1) return err @@ -269,13 +269,17 @@ func (vp *vplayer) fetchAndApply(ctx context.Context) (err error) { ctx, cancel := context.WithCancel(ctx) defer cancel() - relay := newRelayLog(ctx, relayLogMaxItems, relayLogMaxSize) + relay := newRelayLog(ctx, vp.vr.workflowConfig.RelayLogMaxItems, vp.vr.workflowConfig.RelayLogMaxSize) streamErr := make(chan error, 1) go func() { - streamErr <- vp.vr.sourceVStreamer.VStream(ctx, replication.EncodePosition(vp.startPos), nil, vp.replicatorPlan.VStreamFilter, func(events []*binlogdatapb.VEvent) error { - return relay.Send(events) - }) + vstreamOptions := &binlogdatapb.VStreamOptions{ + ConfigOverrides: vp.vr.workflowConfig.Overrides, + } + streamErr <- vp.vr.sourceVStreamer.VStream(ctx, replication.EncodePosition(vp.startPos), nil, + vp.replicatorPlan.VStreamFilter, func(events []*binlogdatapb.VEvent) error { + return relay.Send(events) + }, vstreamOptions) }() applyErr := make(chan error, 1) @@ -382,7 +386,7 @@ func (vp *vplayer) applyRowEvent(ctx context.Context, rowEvent *binlogdatapb.Row // updatePos should get called at a minimum of vreplicationMinimumHeartbeatUpdateInterval. func (vp *vplayer) updatePos(ctx context.Context, ts int64) (posReached bool, err error) { - update := binlogplayer.GenerateUpdatePos(vp.vr.id, vp.pos, time.Now().Unix(), ts, vp.vr.stats.CopyRowCount.Get(), vreplicationStoreCompressedGTID) + update := binlogplayer.GenerateUpdatePos(vp.vr.id, vp.pos, time.Now().Unix(), ts, vp.vr.stats.CopyRowCount.Get(), vp.vr.workflowConfig.StoreCompressedGTID) if _, err := vp.query(ctx, update); err != nil { return false, fmt.Errorf("error %v updating position", err) } @@ -403,7 +407,7 @@ func (vp *vplayer) updatePos(ctx context.Context, ts int64) (posReached bool, er } func (vp *vplayer) mustUpdateHeartbeat() bool { - return vp.numAccumulatedHeartbeats >= vreplicationHeartbeatUpdateInterval || + return vp.numAccumulatedHeartbeats >= vp.vr.workflowConfig.HeartbeatUpdateInterval || vp.numAccumulatedHeartbeats >= vreplicationMinimumHeartbeatUpdateInterval } @@ -414,7 +418,7 @@ func (vp *vplayer) recordHeartbeat() error { return nil } if err := vp.vr.updateHeartbeatTime(tm); err != nil { - return vterrors.Wrapf(errVPlayerStalled, fmt.Sprintf("%s: %v", failedToRecordHeartbeatMsg, err)) + return vterrors.Wrapf(errVPlayerStalled, "%s: %v", failedToRecordHeartbeatMsg, err) } // Only reset the pending heartbeat count if the update was successful. // Otherwise the vplayer may not actually be making progress and nobody @@ -476,19 +480,26 @@ func (vp *vplayer) recordHeartbeat() error { func (vp *vplayer) applyEvents(ctx context.Context, relay *relayLog) error { defer vp.vr.dbClient.Rollback() + estimateLag := func() { + behind := time.Now().UnixNano() - vp.lastTimestampNs - vp.timeOffsetNs + vp.vr.stats.ReplicationLagSeconds.Store(behind / 1e9) + vp.vr.stats.VReplicationLags.Add(strconv.Itoa(int(vp.vr.id)), time.Duration(behind/1e9)*time.Second) + } + // If we're not running, set ReplicationLagSeconds to be very high. // TODO(sougou): if we also stored the time of the last event, we // can estimate this value more accurately. defer vp.vr.stats.ReplicationLagSeconds.Store(math.MaxInt64) defer vp.vr.stats.VReplicationLags.Add(strconv.Itoa(int(vp.vr.id)), math.MaxInt64) - var sbm int64 = -1 + var lagSecs int64 for { if ctx.Err() != nil { return ctx.Err() } // Check throttler. - if !vp.vr.vre.throttlerClient.ThrottleCheckOKOrWaitAppName(ctx, throttlerapp.Name(vp.throttlerAppName)) { - _ = vp.vr.updateTimeThrottled(throttlerapp.VPlayerName) + if checkResult, ok := vp.vr.vre.throttlerClient.ThrottleCheckOKOrWaitAppName(ctx, throttlerapp.Name(vp.throttlerAppName)); !ok { + _ = vp.vr.updateTimeThrottled(throttlerapp.VPlayerName, checkResult.Summary()) + estimateLag() continue } @@ -496,13 +507,7 @@ func (vp *vplayer) applyEvents(ctx context.Context, relay *relayLog) error { if err != nil { return err } - // No events were received. This likely means that there's a network partition. - // So, we should assume we're falling behind. - if len(items) == 0 { - behind := time.Now().UnixNano() - vp.lastTimestampNs - vp.timeOffsetNs - vp.vr.stats.ReplicationLagSeconds.Store(behind / 1e9) - vp.vr.stats.VReplicationLags.Add(strconv.Itoa(int(vp.vr.id)), time.Duration(behind/1e9)*time.Second) - } + // Empty transactions are saved at most once every idleTimeout. // This covers two situations: // 1. Fetch was idle for idleTimeout. @@ -520,12 +525,20 @@ func (vp *vplayer) applyEvents(ctx context.Context, relay *relayLog) error { } } + lagSecs = -1 for i, events := range items { for j, event := range events { if event.Timestamp != 0 { - vp.lastTimestampNs = event.Timestamp * 1e9 - vp.timeOffsetNs = time.Now().UnixNano() - event.CurrentTime - sbm = event.CurrentTime/1e9 - event.Timestamp + // If the event is a heartbeat sent while throttled then do not update + // the lag based on it. + // If the batch consists only of throttled heartbeat events then we cannot + // determine the actual lag, as the vstreamer is fully throttled, and we + // will estimate it after processing the batch. + if !(event.Type == binlogdatapb.VEventType_HEARTBEAT && event.Throttled) { + vp.lastTimestampNs = event.Timestamp * 1e9 + vp.timeOffsetNs = time.Now().UnixNano() - event.CurrentTime + lagSecs = event.CurrentTime/1e9 - event.Timestamp + } } mustSave := false switch event.Type { @@ -549,7 +562,7 @@ func (vp *vplayer) applyEvents(ctx context.Context, relay *relayLog) error { if err := vp.applyEvent(ctx, event, mustSave); err != nil { if err != io.EOF { vp.vr.stats.ErrorCounts.Add([]string{"Apply"}, 1) - var table, tableLogMsg string + var table, tableLogMsg, gtidLogMsg string switch { case event.GetFieldEvent() != nil: table = event.GetFieldEvent().TableName @@ -559,18 +572,24 @@ func (vp *vplayer) applyEvents(ctx context.Context, relay *relayLog) error { if table != "" { tableLogMsg = fmt.Sprintf(" for table %s", table) } - log.Errorf("Error applying event%s: %s", tableLogMsg, err.Error()) + pos := getNextPosition(items, i, j+1) + if pos != "" { + gtidLogMsg = fmt.Sprintf(" while processing position %s", pos) + } + log.Errorf("Error applying event%s%s: %s", tableLogMsg, gtidLogMsg, err.Error()) + err = vterrors.Wrapf(err, "error applying event%s%s", tableLogMsg, gtidLogMsg) } return err } } } - if sbm >= 0 { - vp.vr.stats.ReplicationLagSeconds.Store(sbm) - vp.vr.stats.VReplicationLags.Add(strconv.Itoa(int(vp.vr.id)), time.Duration(sbm)*time.Second) + if lagSecs >= 0 { + vp.vr.stats.ReplicationLagSeconds.Store(lagSecs) + vp.vr.stats.VReplicationLags.Add(strconv.Itoa(int(vp.vr.id)), time.Duration(lagSecs)*time.Second) + } else { // We couldn't determine the lag, so we need to estimate it + estimateLag() } - } } @@ -592,6 +611,34 @@ func hasAnotherCommit(items [][]*binlogdatapb.VEvent, i, j int) bool { return false } +// getNextPosition returns the GTID set/position we would be at if the current +// transaction was committed. This is useful for error handling as we can then +// determine which GTID we're failing to process from the source and examine the +// binlog events for that GTID directly on the source to debug the issue. +// This is needed as it's not as simple as the user incrementing the current +// position in the stream by 1 as we may be skipping N intermediate GTIDs in the +// stream due to filtering. For GTIDs that we filter out we still replicate the +// GTID event itself, just without any internal events and a COMMIT event (see +// the unsavedEvent handling). +func getNextPosition(items [][]*binlogdatapb.VEvent, i, j int) string { + for i < len(items) { + for j < len(items[i]) { + switch items[i][j].Type { + case binlogdatapb.VEventType_GTID: + pos, err := binlogplayer.DecodePosition(items[i][j].Gtid) + if err != nil { + return "" + } + return pos.String() + } + j++ + } + j = 0 + i++ + } + return "" +} + func (vp *vplayer) applyEvent(ctx context.Context, event *binlogdatapb.VEvent, mustSave bool) error { stats := NewVrLogStats(event.Type.String()) switch event.Type { @@ -794,7 +841,7 @@ func (vp *vplayer) applyEvent(ctx context.Context, event *binlogdatapb.VEvent, m return io.EOF case binlogdatapb.VEventType_HEARTBEAT: if event.Throttled { - if err := vp.vr.updateTimeThrottled(throttlerapp.VStreamerName); err != nil { + if err := vp.vr.updateTimeThrottled(throttlerapp.VStreamerName, event.ThrottledReason); err != nil { return err } } diff --git a/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go b/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go index b1925c3c64f..0cc568c1cf1 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vplayer_flaky_test.go @@ -36,7 +36,7 @@ import ( "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/logutil" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletserver/vstreamer/testenv" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -53,11 +53,11 @@ func TestPlayerGeneratedInvisiblePrimaryKey(t *testing.T) { execStatements(t, []string{ "SET @@session.sql_generate_invisible_primary_key=ON;", - "create table t1(val varbinary(128))", - fmt.Sprintf("create table %s.t1(val varbinary(128))", vrepldb), - "create table t2(val varbinary(128))", + "create table t1(val varchar(128))", + fmt.Sprintf("create table %s.t1(val varchar(128))", vrepldb), + "create table t2(val varchar(128))", "SET @@session.sql_generate_invisible_primary_key=OFF;", - fmt.Sprintf("create table %s.t2(my_row_id int, val varbinary(128), primary key(my_row_id))", vrepldb), + fmt.Sprintf("create table %s.t2(my_row_id int, val varchar(128), primary key(my_row_id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -193,14 +193,18 @@ func TestPlayerInvisibleColumns(t *testing.T) { } func TestHeartbeatFrequencyFlag(t *testing.T) { - origVReplicationHeartbeatUpdateInterval := vreplicationHeartbeatUpdateInterval + origVReplicationHeartbeatUpdateInterval := vttablet.DefaultVReplicationConfig.HeartbeatUpdateInterval defer func() { - vreplicationHeartbeatUpdateInterval = origVReplicationHeartbeatUpdateInterval + vttablet.DefaultVReplicationConfig.HeartbeatUpdateInterval = origVReplicationHeartbeatUpdateInterval }() stats := binlogplayer.NewStats() defer stats.Stop() - vp := &vplayer{vr: &vreplicator{dbClient: newVDBClient(realDBClientFactory(), stats), stats: stats}} + vp := &vplayer{vr: &vreplicator{ + dbClient: newVDBClient(realDBClientFactory(), stats, vttablet.DefaultVReplicationConfig.RelayLogMaxItems), + stats: stats, + workflowConfig: vttablet.DefaultVReplicationConfig, + }} type testcount struct { count int @@ -218,7 +222,7 @@ func TestHeartbeatFrequencyFlag(t *testing.T) { } for _, tcase := range testcases { t.Run(tcase.name, func(t *testing.T) { - vreplicationHeartbeatUpdateInterval = tcase.interval + vttablet.DefaultVReplicationConfig.HeartbeatUpdateInterval = tcase.interval for _, tcount := range tcase.counts { vp.numAccumulatedHeartbeats = tcount.count require.Equal(t, tcount.mustUpdate, vp.mustUpdateHeartbeat()) @@ -231,8 +235,8 @@ func TestVReplicationTimeUpdated(t *testing.T) { ctx := context.Background() defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table t1(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val varbinary(128), primary key(id))", vrepldb), + "create table t1(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -334,21 +338,21 @@ func TestCharPK(t *testing.T) { output string table string data [][]string - }{{ //binary(2) + }{{ // binary(2) input: "insert into t1 values(1, 'a')", - output: "insert into t1(id,val) values (1,'a\\0')", + output: "insert into t1(id,val) values (1,_binary'a\\0')", table: "t1", data: [][]string{ {"1", "a\000"}, }, }, { input: "update t1 set id = 2 where val = 'a\000'", - output: "update t1 set id=2 where val='a\\0'", + output: "update t1 set id=2 where val=_binary'a\\0'", table: "t1", data: [][]string{ {"2", "a\000"}, }, - }, { //char(2) + }, { // char(2) input: "insert into t2 values(1, 'a')", output: "insert into t2(id,val) values (1,'a')", table: "t2", @@ -362,21 +366,21 @@ func TestCharPK(t *testing.T) { data: [][]string{ {"2", "a"}, }, - }, { //varbinary(2) + }, { // varbinary(2) input: "insert into t3 values(1, 'a')", - output: "insert into t3(id,val) values (1,'a')", + output: "insert into t3(id,val) values (1,_binary'a')", table: "t3", data: [][]string{ {"1", "a"}, }, }, { input: "update t3 set id = 2 where val = 'a'", - output: "update t3 set id=2 where val='a'", + output: "update t3 set id=2 where val=_binary'a'", table: "t3", data: [][]string{ {"2", "a"}, }, - }, { //varchar(2) + }, { // varchar(2) input: "insert into t4 values(1, 'a')", output: "insert into t4(id,val) values (1,'a')", table: "t4", @@ -575,9 +579,20 @@ func TestPlayerForeignKeyCheck(t *testing.T) { cancel() } -func TestPlayerStatementModeWithFilter(t *testing.T) { +// TestPlayerStatementModeWithFilterAndErrorHandling confirms that we get the +// expected error when using a filter with statement mode. It also tests the +// general vplayer applyEvent error and log message handling. +func TestPlayerStatementModeWithFilterAndErrorHandling(t *testing.T) { defer deleteTablet(addTablet(100)) + // We want to check for the expected log message. + ole := log.Errorf + logger := logutil.NewMemoryLogger() + log.Errorf = logger.Errorf + defer func() { + log.Errorf = ole + }() + execStatements(t, []string{ "create table src1(id int, val varbinary(128), primary key(id))", }) @@ -600,21 +615,29 @@ func TestPlayerStatementModeWithFilter(t *testing.T) { cancel, _ := startVReplication(t, bls, "") defer cancel() + const gtid = "37f16b4c-5a74-11ef-87de-56bfd605e62e:100" input := []string{ "set @@session.binlog_format='STATEMENT'", + fmt.Sprintf("set @@session.gtid_next='%s'", gtid), "insert into src1 values(1, 'aaa')", + "set @@session.gtid_next='AUTOMATIC'", "set @@session.binlog_format='ROW'", } + expectedMsg := fmt.Sprintf("[Ee]rror applying event while processing position .*%s.* filter rules are not supported for SBR.*", gtid) + // It does not work when filter is enabled output := qh.Expect( "begin", "rollback", - "/update _vt.vreplication set message='filter rules are not supported for SBR", + fmt.Sprintf("/update _vt.vreplication set message='%s", expectedMsg), ) execStatements(t, input) expectDBClientQueries(t, output) + + logs := logger.String() + require.Regexp(t, expectedMsg, logs) } func TestPlayerStatementMode(t *testing.T) { @@ -725,7 +748,7 @@ func TestPlayerFilters(t *testing.T) { Filter: "select id1, val from src5 where val = 'abc'", }, { Match: "dst_charset", - Filter: "select id1, concat(substr(_utf8mb4 val collate utf8mb4_bin,1,1),'abcxyz') val, concat(substr(_utf8mb4 val collate utf8mb4_bin,1,1),'abcxyz') val2 from src_charset", + Filter: "select id1, concat(substr(CONVERT(val USING utf8mb4) COLLATE utf8mb4_bin,1,1),'abcxyz') val, concat(substr(CONVERT(val USING utf8mb4) COLLATE utf8mb4_bin,1,1),'abcxyz') val2 from src_charset", }}, } bls := &binlogdatapb.BinlogSource{ @@ -749,7 +772,7 @@ func TestPlayerFilters(t *testing.T) { input: "insert into src1 values(1, 'aaa')", output: qh.Expect( "begin", - "insert into dst1(id,val) values (1,'aaa')", + "insert into dst1(id,val) values (1,_binary'aaa')", "/update _vt.vreplication set pos=", "commit", ), @@ -759,7 +782,7 @@ func TestPlayerFilters(t *testing.T) { }, logs: []LogExpectation{ {"FIELD", "/src1.*id.*INT32.*val.*VARBINARY.*"}, - {"ROWCHANGE", "insert into dst1(id,val) values (1,'aaa')"}, + {"ROWCHANGE", "insert into dst1(id,val) values (1,_binary'aaa')"}, {"ROW", "/src1.*3.*1aaa.*"}, }, }, { @@ -767,7 +790,7 @@ func TestPlayerFilters(t *testing.T) { input: "update src1 set val='bbb'", output: qh.Expect( "begin", - "update dst1 set val='bbb' where id=1", + "update dst1 set val=_binary'bbb' where id=1", "/update _vt.vreplication set pos=", "commit", ), @@ -776,7 +799,7 @@ func TestPlayerFilters(t *testing.T) { {"1", "bbb"}, }, logs: []LogExpectation{ - {"ROWCHANGE", "update dst1 set val='bbb' where id=1"}, + {"ROWCHANGE", "update dst1 set val=_binary'bbb' where id=1"}, {"ROW", "/src1.*3.*1aaa.*"}, }, }, { @@ -846,7 +869,7 @@ func TestPlayerFilters(t *testing.T) { input: "insert into src3 values(1, 'aaa')", output: qh.Expect( "begin", - "insert ignore into dst3(id,val) values (1,'aaa')", + "insert ignore into dst3(id,val) values (1,_binary'aaa')", "/update _vt.vreplication set pos=", "commit", ), @@ -859,7 +882,7 @@ func TestPlayerFilters(t *testing.T) { input: "update src3 set val='bbb'", output: qh.Expect( "begin", - "insert ignore into dst3(id,val) values (1,'bbb')", + "insert ignore into dst3(id,val) values (1,_binary'bbb')", "/update _vt.vreplication set pos=", "commit", ), @@ -884,7 +907,7 @@ func TestPlayerFilters(t *testing.T) { input: "insert into yes values(1, 'aaa')", output: qh.Expect( "begin", - "insert into yes(id,val) values (1,'aaa')", + "insert into yes(id,val) values (1,_binary'aaa')", "/update _vt.vreplication set pos=", "commit", ), @@ -897,7 +920,7 @@ func TestPlayerFilters(t *testing.T) { input: "update yes set val='bbb'", output: qh.Expect( "begin", - "update yes set val='bbb' where id=1", + "update yes set val=_binary'bbb' where id=1", "/update _vt.vreplication set pos=", "commit", ), @@ -914,7 +937,7 @@ func TestPlayerFilters(t *testing.T) { input: "insert into nopk values(1, 'aaa')", output: qh.Expect( "begin", - "insert into nopk(id,val) values (1,'aaa')", + "insert into nopk(id,val) values (1,_binary'aaa')", "/update _vt.vreplication set pos=", "commit", ), @@ -927,8 +950,8 @@ func TestPlayerFilters(t *testing.T) { input: "update nopk set val='bbb' where id=1", output: qh.Expect( "begin", - "delete from nopk where id=1 and val='aaa'", - "insert into nopk(id,val) values (1,'bbb')", + "delete from nopk where id=1 and val=_binary'aaa'", + "insert into nopk(id,val) values (1,_binary'bbb')", "/update _vt.vreplication set pos=", "commit", ), @@ -941,7 +964,7 @@ func TestPlayerFilters(t *testing.T) { input: "delete from nopk where id=1", output: qh.Expect( "begin", - "delete from nopk where id=1 and val='bbb'", + "delete from nopk where id=1 and val=_binary'bbb'", "/update _vt.vreplication set pos=", "commit", ), @@ -952,8 +975,8 @@ func TestPlayerFilters(t *testing.T) { input: "insert into src4 values (1,100,'aaa'),(2,200,'bbb'),(3,100,'ccc')", output: qh.Expect( "begin", - "insert into dst4(id1,val) values (1,'aaa')", - "insert into dst4(id1,val) values (3,'ccc')", + "insert into dst4(id1,val) values (1,_binary'aaa')", + "insert into dst4(id1,val) values (3,_binary'ccc')", "/update _vt.vreplication set pos=", "commit", ), @@ -964,8 +987,8 @@ func TestPlayerFilters(t *testing.T) { input: "insert into src5 values (1,100,'abc'),(2,200,'xyz'),(3,100,'xyz'),(4,300,'abc'),(5,200,'xyz')", output: qh.Expect( "begin", - "insert into dst5(id1,val) values (1,'abc')", - "insert into dst5(id1,val) values (4,'abc')", + "insert into dst5(id1,val) values (1,_binary'abc')", + "insert into dst5(id1,val) values (4,_binary'abc')", "/update _vt.vreplication set pos=", "commit", ), @@ -976,7 +999,7 @@ func TestPlayerFilters(t *testing.T) { input: "insert into src_charset values (1,'木元')", output: qh.Expect( "begin", - "insert into dst_charset(id1,val,val2) values (1,concat(substr(_utf8mb4 '木元' collate utf8mb4_bin, 1, 1), 'abcxyz'),concat(substr(_utf8mb4 '木元' collate utf8mb4_bin, 1, 1), 'abcxyz'))", + "insert into dst_charset(id1,val,val2) values (1,concat(substr(convert(_binary'木元' using utf8mb4) collate utf8mb4_bin, 1, 1), 'abcxyz'),concat(substr(convert(_binary'木元' using utf8mb4) collate utf8mb4_bin, 1, 1), 'abcxyz'))", "/update _vt.vreplication set pos=", "commit", ), @@ -1003,12 +1026,12 @@ func TestPlayerKeywordNames(t *testing.T) { defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table `begin`(`primary` int, `column` varbinary(128), primary key(`primary`))", - fmt.Sprintf("create table %s.`begin`(`primary` int, `column` varbinary(128), primary key(`primary`))", vrepldb), - "create table `rollback`(`primary` int, `column` varbinary(128), primary key(`primary`))", - fmt.Sprintf("create table %s.`rollback`(`primary` int, `column` varbinary(128), primary key(`primary`))", vrepldb), - "create table `commit`(`primary` int, `column` varbinary(128), primary key(`primary`))", - fmt.Sprintf("create table %s.`commit`(`primary` int, `column` varbinary(128), primary key(`primary`))", vrepldb), + "create table `begin`(`primary` int, `column` varchar(128), primary key(`primary`))", + fmt.Sprintf("create table %s.`begin`(`primary` int, `column` varchar(128), primary key(`primary`))", vrepldb), + "create table `rollback`(`primary` int, `column` varchar(128), primary key(`primary`))", + fmt.Sprintf("create table %s.`rollback`(`primary` int, `column` varchar(128), primary key(`primary`))", vrepldb), + "create table `commit`(`primary` int, `column` varchar(128), primary key(`primary`))", + fmt.Sprintf("create table %s.`commit`(`primary` int, `column` varchar(128), primary key(`primary`))", vrepldb), }) defer execStatements(t, []string{ "drop table `begin`", @@ -1234,7 +1257,7 @@ func TestPlayerKeyspaceID(t *testing.T) { input: "insert into src1 values(1, 'aaa')", output: qh.Expect( "begin", - "insert into dst1(id,val) values (1,'\x16k@\xb4J\xbaK\xd6')", + "insert into dst1(id,val) values (1,_binary'\x16k@\xb4J\xbaK\xd6')", "/update _vt.vreplication set pos=", "commit", ), @@ -1579,7 +1602,7 @@ func TestPlayerTypes(t *testing.T) { }, }, { input: "insert into vitess_strings values('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'a', 'a,b,f,l,q,s,v,z')", - output: "insert into vitess_strings(vb,c,vc,b,tb,bl,ttx,tx,en,s) values ('a','b','c','d\\0\\0\\0\\0','e','f','g','h','a','a,b,f,l,q,s,v,z')", + output: "insert into vitess_strings(vb,c,vc,b,tb,bl,ttx,tx,en,s) values (_binary'a','b','c',_binary'd\\0\\0\\0\\0',_binary'e',_binary'f','g','h','a','a,b,f,l,q,s,v,z')", table: "vitess_strings", data: [][]string{ {"a", "b", "c", "d\000\000\000\000", "e", "f", "g", "h", "a", "a,b,f,l,q,s,v,z"}, @@ -1600,7 +1623,7 @@ func TestPlayerTypes(t *testing.T) { }, }, { input: "insert into binary_pk values('a', 'aaa')", - output: "insert into binary_pk(b,val) values ('a\\0\\0\\0','aaa')", + output: "insert into binary_pk(b,val) values (_binary'a\\0\\0\\0',_binary'aaa')", table: "binary_pk", data: [][]string{ {"a\000\000\000", "aaa"}, @@ -1615,7 +1638,7 @@ func TestPlayerTypes(t *testing.T) { }, { // Binary pk is a special case: https://github.com/vitessio/vitess/issues/3984 input: "update binary_pk set val='bbb' where b='a\\0\\0\\0'", - output: "update binary_pk set val='bbb' where b='a\\0\\0\\0'", + output: "update binary_pk set val=_binary'bbb' where b=_binary'a\\0\\0\\0'", table: "binary_pk", data: [][]string{ {"a\000\000\000", "bbb"}, @@ -1709,7 +1732,7 @@ func TestPlayerDDL(t *testing.T) { OnDdl: binlogdatapb.OnDDLAction_STOP, } cancel, id := startVReplication(t, bls, "") - pos0 := primaryPosition(t) //For debugging only + pos0 := primaryPosition(t) // For debugging only execStatements(t, []string{"alter table t1 add column val varchar(128)"}) pos1 := primaryPosition(t) // The stop position must be the GTID of the first DDL @@ -1723,7 +1746,7 @@ func TestPlayerDDL(t *testing.T) { execStatements(t, []string{"alter table t1 drop column val"}) pos2 := primaryPosition(t) log.Errorf("Expected log:: TestPlayerDDL Positions are: before first alter %v, after first alter %v, before second alter %v, after second alter %v", - pos0, pos1, pos2b, pos2) //For debugging only: to check what are the positions when test works and if/when it fails + pos0, pos1, pos2b, pos2) // For debugging only: to check what are the positions when test works and if/when it fails // Restart vreplication if _, err := playerEngine.Exec(fmt.Sprintf(`update _vt.vreplication set state = 'Running', message='' where id=%d`, id)); err != nil { t.Fatal(err) @@ -1758,8 +1781,8 @@ func TestPlayerDDL(t *testing.T) { execStatements(t, []string{"alter table t1 add column val2 varchar(128)"}) expectDBClientQueries(t, qh.Expect( "alter table t1 add column val2 varchar(128)", - "/update _vt.vreplication set message='Duplicate", - "/update _vt.vreplication set state='Error', message='Duplicate", + "/update _vt.vreplication set message='error applying event: Duplicate", + "/update _vt.vreplication set state='Error', message='terminal error: error applying event: Duplicate", )) cancel() @@ -1846,14 +1869,14 @@ func TestGTIDCompress(t *testing.T) { func TestPlayerStopPos(t *testing.T) { defer deleteTablet(addTablet(100)) - vreplicationStoreCompressedGTID = true + vttablet.DefaultVReplicationConfig.StoreCompressedGTID = true defer func() { - vreplicationStoreCompressedGTID = false + vttablet.DefaultVReplicationConfig.StoreCompressedGTID = false }() execStatements(t, []string{ - "create table yes(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.yes(id int, val varbinary(128), primary key(id))", vrepldb), - "create table no(id int, val varbinary(128), primary key(id))", + "create table yes(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.yes(id int, val varchar(128), primary key(id))", vrepldb), + "create table no(id int, val varchar(128), primary key(id))", }) defer execStatements(t, []string{ "drop table yes", @@ -2061,8 +2084,8 @@ func TestPlayerIdleUpdate(t *testing.T) { idleTimeout = 100 * time.Millisecond execStatements(t, []string{ - "create table t1(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val varbinary(128), primary key(id))", vrepldb), + "create table t1(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -2114,8 +2137,8 @@ func TestPlayerSplitTransaction(t *testing.T) { defer setFlag("vstream_packet_size", "10000") execStatements(t, []string{ - "create table t1(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val varbinary(128), primary key(id))", vrepldb), + "create table t1(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -2157,8 +2180,8 @@ func TestPlayerLockErrors(t *testing.T) { defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table t1(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val varbinary(128), primary key(id))", vrepldb), + "create table t1(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -2236,8 +2259,8 @@ func TestPlayerCancelOnLock(t *testing.T) { defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table t1(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val varbinary(128), primary key(id))", vrepldb), + "create table t1(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -2313,8 +2336,8 @@ func TestPlayerTransactions(t *testing.T) { defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table t1(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val varbinary(128), primary key(id))", vrepldb), + "create table t1(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -2408,18 +2431,18 @@ func TestPlayerRelayLogMaxSize(t *testing.T) { func() { switch i { case 0: - savedSize := relayLogMaxSize - defer func() { relayLogMaxSize = savedSize }() - relayLogMaxSize = 10 + savedSize := vttablet.DefaultVReplicationConfig.RelayLogMaxSize + defer func() { vttablet.DefaultVReplicationConfig.RelayLogMaxSize = savedSize }() + vttablet.DefaultVReplicationConfig.RelayLogMaxSize = 10 case 1: - savedLen := relayLogMaxItems - defer func() { relayLogMaxItems = savedLen }() - relayLogMaxItems = 2 + savedLen := vttablet.DefaultVReplicationConfig.RelayLogMaxItems + defer func() { vttablet.DefaultVReplicationConfig.RelayLogMaxItems = savedLen }() + vttablet.DefaultVReplicationConfig.RelayLogMaxItems = 2 } execStatements(t, []string{ - "create table t1(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val varbinary(128), primary key(id))", vrepldb), + "create table t1(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -2507,13 +2530,13 @@ func TestPlayerRelayLogMaxSize(t *testing.T) { func TestRestartOnVStreamEnd(t *testing.T) { defer deleteTablet(addTablet(100)) - savedDelay := retryDelay - defer func() { retryDelay = savedDelay }() - retryDelay = 1 * time.Millisecond + savedDelay := vttablet.DefaultVReplicationConfig.RetryDelay + defer func() { vttablet.DefaultVReplicationConfig.RetryDelay = savedDelay }() + vttablet.DefaultVReplicationConfig.RetryDelay = 1 * time.Millisecond execStatements(t, []string{ - "create table t1(id int, val varbinary(128), primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val varbinary(128), primary key(id))", vrepldb), + "create table t1(id int, val varchar(128), primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val varchar(128), primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -2755,7 +2778,7 @@ func TestVReplicationLogs(t *testing.T) { err := dbClient.Connect() require.NoError(t, err) defer dbClient.Close() - vdbc := newVDBClient(dbClient, binlogplayer.NewStats()) + vdbc := newVDBClient(dbClient, binlogplayer.NewStats(), vttablet.DefaultVReplicationConfig.RelayLogMaxItems) query := "select vrepl_id, state, message, count from _vt.vreplication_log order by id desc limit 1" expected := []string{ @@ -2778,10 +2801,10 @@ func TestGeneratedColumns(t *testing.T) { defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table t1(id int, val varbinary(6), val2 varbinary(6) as (concat(id, val)), val3 varbinary(6) as (concat(val, id)), id2 int, primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val varbinary(6), val2 varbinary(6) as (concat(id, val)), val3 varbinary(6), id2 int, primary key(id))", vrepldb), - "create table t2(id int, val varbinary(128), val2 varbinary(128) as (concat(id, val)) stored, val3 varbinary(128) as (concat(val, id)), id2 int, primary key(id))", - fmt.Sprintf("create table %s.t2(id int, val3 varbinary(128), val varbinary(128), id2 int, primary key(id))", vrepldb), + "create table t1(id int, val varchar(6), val2 varchar(6) as (concat(id, val)), val3 varchar(6) as (concat(val, id)), id2 int, primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val varchar(6), val2 varchar(6) as (concat(id, val)), val3 varchar(6), id2 int, primary key(id))", vrepldb), + "create table t2(id int, val varchar(128), val2 varchar(128) as (concat(id, val)) stored, val3 varchar(128) as (concat(val, id)), id2 int, primary key(id))", + fmt.Sprintf("create table %s.t2(id int, val3 varchar(128), val varchar(128), id2 int, primary key(id))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -2931,18 +2954,18 @@ func TestPlayerNoBlob(t *testing.T) { if !runNoBlobTest { t.Skip() } - oldVreplicationExperimentalFlags := vttablet.VReplicationExperimentalFlags - vttablet.VReplicationExperimentalFlags = vttablet.VReplicationExperimentalFlagAllowNoBlobBinlogRowImage + oldVreplicationExperimentalFlags := vttablet.DefaultVReplicationConfig.ExperimentalFlags + vttablet.DefaultVReplicationConfig.ExperimentalFlags = vttablet.VReplicationExperimentalFlagAllowNoBlobBinlogRowImage defer func() { - vttablet.VReplicationExperimentalFlags = oldVreplicationExperimentalFlags + vttablet.DefaultVReplicationConfig.ExperimentalFlags = oldVreplicationExperimentalFlags }() defer deleteTablet(addTablet(100)) execStatements(t, []string{ - "create table t1(id int, val1 varchar(20), blb1 blob, id2 int, blb2 longblob, val2 varbinary(10), primary key(id))", - fmt.Sprintf("create table %s.t1(id int, val1 varchar(20), blb1 blob, id2 int, blb2 longblob, val2 varbinary(10), primary key(id))", vrepldb), - "create table t2(id int, val1 varchar(20), txt1 text, id2 int, val2 varbinary(10), unique key(id, val1))", - fmt.Sprintf("create table %s.t2(id int, val1 varchar(20), txt1 text, id2 int, val2 varbinary(10), primary key(id, val1))", vrepldb), + "create table t1(id int, val1 varchar(20), blb1 text, id2 int, blb2 longtext, val2 varchar(10), primary key(id))", + fmt.Sprintf("create table %s.t1(id int, val1 varchar(20), blb1 text, id2 int, blb2 longtext, val2 varchar(10), primary key(id))", vrepldb), + "create table t2(id int, val1 varchar(20), txt1 text, id2 int, val2 varchar(10), unique key(id, val1))", + fmt.Sprintf("create table %s.t2(id int, val1 varchar(20), txt1 text, id2 int, val2 varchar(10), primary key(id, val1))", vrepldb), }) defer execStatements(t, []string{ "drop table t1", @@ -3071,10 +3094,10 @@ func TestPlayerNoBlob(t *testing.T) { func TestPlayerBatchMode(t *testing.T) { // To test trx batch splitting at 1024-64 bytes. maxAllowedPacket := 1024 - oldVreplicationExperimentalFlags := vttablet.VReplicationExperimentalFlags - vttablet.VReplicationExperimentalFlags = vttablet.VReplicationExperimentalFlagVPlayerBatching + oldVreplicationExperimentalFlags := vttablet.DefaultVReplicationConfig.ExperimentalFlags + vttablet.DefaultVReplicationConfig.ExperimentalFlags = vttablet.VReplicationExperimentalFlagVPlayerBatching defer func() { - vttablet.VReplicationExperimentalFlags = oldVreplicationExperimentalFlags + vttablet.DefaultVReplicationConfig.ExperimentalFlags = oldVreplicationExperimentalFlags }() defer deleteTablet(addTablet(100)) @@ -3329,16 +3352,16 @@ func TestPlayerStalls(t *testing.T) { logger := logutil.NewMemoryLogger() log.Errorf = logger.Errorf - ovmhu := vreplicationMinimumHeartbeatUpdateInterval - ogvpt := vplayerProgressDeadline - orlmi := relayLogMaxItems - ord := retryDelay + oldMinimumHeartbeatUpdateInterval := vreplicationMinimumHeartbeatUpdateInterval + oldProgressDeadline := vplayerProgressDeadline + oldRelayLogMaxItems := vttablet.DefaultVReplicationConfig.RelayLogMaxItems + oldRetryDelay := vttablet.DefaultVReplicationConfig.RetryDelay defer func() { log.Errorf = ole - vreplicationMinimumHeartbeatUpdateInterval = ovmhu - vplayerProgressDeadline = ogvpt - relayLogMaxItems = orlmi - retryDelay = ord + vreplicationMinimumHeartbeatUpdateInterval = oldMinimumHeartbeatUpdateInterval + vplayerProgressDeadline = oldProgressDeadline + vttablet.DefaultVReplicationConfig.RelayLogMaxItems = oldRelayLogMaxItems + vttablet.DefaultVReplicationConfig.RetryDelay = oldRetryDelay }() // Shorten the deadline for the test. @@ -3346,11 +3369,11 @@ func TestPlayerStalls(t *testing.T) { // Shorten the time for a required heartbeat recording for the test. vreplicationMinimumHeartbeatUpdateInterval = 5 // So each relay log batch will be a single statement transaction. - relayLogMaxItems = 1 + vttablet.DefaultVReplicationConfig.RelayLogMaxItems = 1 // Don't retry the workflow if it goes into the error state. - retryDelay = 10 * time.Minute - maxTimeToRetryError = 1 * time.Second + vttablet.DefaultVReplicationConfig.RetryDelay = 10 * time.Minute + vttablet.DefaultVReplicationConfig.MaxTimeToRetryError = 1 * time.Second // A channel to communicate across goroutines. done := make(chan struct{}) diff --git a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go index 8a01cf7c8ed..0c5c0b5b334 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go @@ -26,6 +26,7 @@ import ( "strings" "time" + "vitess.io/vitess/go/mysql/capabilities" "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/sqltypes" @@ -36,6 +37,7 @@ import ( "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -105,12 +107,14 @@ type vreplicator struct { originalFKCheckSetting int64 originalSQLMode string + originalFKRestrict int64 WorkflowType int32 WorkflowSubType int32 WorkflowName string throttleUpdatesRateLimiter *timer.RateLimiter + workflowConfig *vttablet.VReplicationConfig } // newVReplicator creates a new vreplicator. The valid fields from the source are: @@ -135,19 +139,25 @@ type vreplicator struct { // alias like "a+b as targetcol" must be used. // More advanced constructs can be used. Please see the table plan builder // documentation for more info. -func newVReplicator(id int32, source *binlogdatapb.BinlogSource, sourceVStreamer VStreamerClient, stats *binlogplayer.Stats, dbClient binlogplayer.DBClient, mysqld mysqlctl.MysqlDaemon, vre *Engine) *vreplicator { - if vreplicationHeartbeatUpdateInterval > vreplicationMinimumHeartbeatUpdateInterval { +func newVReplicator(id int32, source *binlogdatapb.BinlogSource, sourceVStreamer VStreamerClient, stats *binlogplayer.Stats, + dbClient binlogplayer.DBClient, mysqld mysqlctl.MysqlDaemon, vre *Engine, workflowConfig *vttablet.VReplicationConfig) *vreplicator { + if workflowConfig == nil { + workflowConfig = vttablet.DefaultVReplicationConfig + } + if workflowConfig.HeartbeatUpdateInterval > vreplicationMinimumHeartbeatUpdateInterval { log.Warningf("The supplied value for vreplication_heartbeat_update_interval:%d seconds is larger than the maximum allowed:%d seconds, vreplication will fallback to %d", - vreplicationHeartbeatUpdateInterval, vreplicationMinimumHeartbeatUpdateInterval, vreplicationMinimumHeartbeatUpdateInterval) + workflowConfig.HeartbeatUpdateInterval, vreplicationMinimumHeartbeatUpdateInterval, vreplicationMinimumHeartbeatUpdateInterval) } + vttablet.InitVReplicationConfigDefaults() vr := &vreplicator{ vre: vre, id: id, source: source, sourceVStreamer: sourceVStreamer, stats: stats, - dbClient: newVDBClient(dbClient, stats), + dbClient: newVDBClient(dbClient, stats, workflowConfig.RelayLogMaxItems), mysqld: mysqld, + workflowConfig: workflowConfig, } vr.setExistingRowsCopied() return vr @@ -237,8 +247,12 @@ func (vr *vreplicator) replicate(ctx context.Context) error { if err := vr.getSettingFKCheck(); err != nil { return err } - //defensive guard, should be a no-op since it should happen after copy is done + // defensive guard, should be a no-op since it should happen after copy is done defer vr.resetFKCheckAfterCopy(vr.dbClient) + if err := vr.getSettingFKRestrict(); err != nil { + return err + } + defer vr.resetFKRestrictAfterCopy(vr.dbClient) vr.throttleUpdatesRateLimiter = timer.NewRateLimiter(time.Second) defer vr.throttleUpdatesRateLimiter.Stop() @@ -272,6 +286,10 @@ func (vr *vreplicator) replicate(ctx context.Context) error { log.Warningf("Unable to clear FK check %v", err) return err } + if err := vr.clearFKRestrict(vr.dbClient); err != nil { + log.Warningf("Unable to clear FK restrict %v", err) + return err + } if vr.WorkflowSubType == int32(binlogdatapb.VReplicationWorkflowSubType_AtomicCopy) { if err := newVCopier(vr).copyAll(ctx, settings); err != nil { log.Infof("Error atomically copying all tables: %v", err) @@ -301,6 +319,10 @@ func (vr *vreplicator) replicate(ctx context.Context) error { log.Warningf("Unable to reset FK check %v", err) return err } + if err := vr.resetFKRestrictAfterCopy(vr.dbClient); err != nil { + log.Warningf("Unable to reset FK restrict %v", err) + return err + } if vr.source.StopAfterCopy { return vr.setState(binlogdatapb.VReplicationWorkflowState_Stopped, "Stopped after copy.") } @@ -512,11 +534,45 @@ func (vr *vreplicator) getSettingFKCheck() error { return nil } +func (vr *vreplicator) needFKRestrict() bool { + ok, err := vr.dbClient.SupportsCapability(capabilities.RestrictFKOnNonStandardKey) + if err != nil { + return false + } + return ok +} + +func (vr *vreplicator) getSettingFKRestrict() error { + if !vr.needFKRestrict() { + return nil + } + qr, err := vr.dbClient.Execute("select @@session.restrict_fk_on_non_standard_key") + if err != nil { + return err + } + if len(qr.Rows) != 1 || len(qr.Fields) != 1 { + return fmt.Errorf("unable to select @@session.restrict_fk_on_non_standard_key") + } + vr.originalFKRestrict, err = qr.Rows[0][0].ToCastInt64() + if err != nil { + return err + } + return nil +} + func (vr *vreplicator) resetFKCheckAfterCopy(dbClient *vdbClient) error { _, err := dbClient.Execute(fmt.Sprintf("set @@session.foreign_key_checks=%d", vr.originalFKCheckSetting)) return err } +func (vr *vreplicator) resetFKRestrictAfterCopy(dbClient *vdbClient) error { + if !vr.needFKRestrict() { + return nil + } + _, err := dbClient.Execute(fmt.Sprintf("set @@session.restrict_fk_on_non_standard_key=%d", vr.originalFKRestrict)) + return err +} + func (vr *vreplicator) setSQLMode(ctx context.Context, dbClient *vdbClient) (func(), error) { resetFunc := func() {} // First save the original SQL mode if we have not already done so @@ -582,13 +638,13 @@ func (vr *vreplicator) throttlerAppName() string { // tablet throttler over time. It also increments the global throttled count to keep // track of how many times in total vreplication has been throttled across all workflows // (both ones that currently exist and ones that no longer do). -func (vr *vreplicator) updateTimeThrottled(appThrottled throttlerapp.Name) error { +func (vr *vreplicator) updateTimeThrottled(appThrottled throttlerapp.Name, reasonThrottled string) error { appName := appThrottled.String() vr.stats.ThrottledCounts.Add([]string{"tablet", appName}, 1) globalStats.ThrottledCount.Add(1) err := vr.throttleUpdatesRateLimiter.Do(func() error { tm := time.Now().Unix() - update, err := binlogplayer.GenerateUpdateTimeThrottled(vr.id, tm, appName) + update, err := binlogplayer.GenerateUpdateTimeThrottled(vr.id, tm, appName, reasonThrottled) if err != nil { return err } @@ -616,6 +672,14 @@ func (vr *vreplicator) clearFKCheck(dbClient *vdbClient) error { return err } +func (vr *vreplicator) clearFKRestrict(dbClient *vdbClient) error { + if !vr.needFKRestrict() { + return nil + } + _, err := dbClient.Execute("set @@session.restrict_fk_on_non_standard_key=0") + return err +} + func recalculatePKColsInfoByColumnNames(uniqueKeyColumnNames []string, colInfos []*ColumnInfo) (pkColInfos []*ColumnInfo) { pkColInfos = colInfos[:] columnOrderMap := map[string]int64{} @@ -1049,13 +1113,16 @@ func (vr *vreplicator) newClientConnection(ctx context.Context) (*vdbClient, err if err := dbc.Connect(); err != nil { return nil, vterrors.Wrap(err, "can't connect to database") } - dbClient := newVDBClient(dbc, vr.stats) + dbClient := newVDBClient(dbc, vr.stats, vr.workflowConfig.RelayLogMaxItems) if _, err := vr.setSQLMode(ctx, dbClient); err != nil { return nil, vterrors.Wrap(err, "failed to set sql_mode") } if err := vr.clearFKCheck(dbClient); err != nil { return nil, vterrors.Wrap(err, "failed to clear foreign key check") } + if err := vr.clearFKRestrict(dbClient); err != nil { + return nil, vterrors.Wrap(err, "failed to clear foreign key restriction") + } return dbClient, nil } diff --git a/go/vt/vttablet/tabletmanager/vreplication/vreplicator_test.go b/go/vt/vttablet/tabletmanager/vreplication/vreplicator_test.go index e4f55cc2384..b4e3ba4e366 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vreplicator_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vreplicator_test.go @@ -31,10 +31,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/vt/binlog/binlogplayer" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/schemadiff" + vttablet "vitess.io/vitess/go/vt/vttablet/common" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" @@ -231,7 +233,7 @@ func TestDeferSecondaryKeys(t *testing.T) { _, err = dbClient.ExecuteFetch(fmt.Sprintf("delete from _vt.vreplication where id = %d", id), 1) require.NoError(t, err) }() - vr := newVReplicator(id, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine) + vr := newVReplicator(id, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine, vttablet.DefaultVReplicationConfig) getActionsSQLf := "select action from _vt.post_copy_action where table_name='%s'" getCurrentDDL := func(tableName string) string { req := &tabletmanagerdatapb.GetSchemaRequest{Tables: []string{tableName}} @@ -385,7 +387,7 @@ func TestDeferSecondaryKeys(t *testing.T) { if err != nil { return err } - myvr := newVReplicator(myid, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine) + myvr := newVReplicator(myid, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine, vttablet.DefaultVReplicationConfig) myvr.WorkflowType = int32(binlogdatapb.VReplicationWorkflowType_Reshard) // Insert second post copy action record to simulate a shard merge where you // have N controllers/replicators running for the same table on the tablet. @@ -481,7 +483,15 @@ func TestDeferSecondaryKeys(t *testing.T) { } // Create the table. - _, err := dbClient.ExecuteFetch(tcase.initialDDL, 1) + if vr.needFKRestrict() { + _, err := dbClient.ExecuteFetch("set @@session.restrict_fk_on_non_standard_key=0", 1) + require.NoError(t, err) + defer func() { + _, err = dbClient.ExecuteFetch("set @@session.restrict_fk_on_non_standard_key=1", 1) + require.NoError(t, err) + }() + } + _, err = dbClient.ExecuteFetch(tcase.initialDDL, 1) require.NoError(t, err) defer func() { _, err = dbClient.ExecuteFetch(fmt.Sprintf("drop table %s.%s", dbName, tcase.tableName), 1) @@ -621,7 +631,7 @@ func TestCancelledDeferSecondaryKeys(t *testing.T) { _, err = dbClient.ExecuteFetch(fmt.Sprintf("delete from _vt.vreplication where id = %d", id), 1) require.NoError(t, err) }() - vr := newVReplicator(id, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine) + vr := newVReplicator(id, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine, vttablet.DefaultVReplicationConfig) vr.WorkflowType = int32(binlogdatapb.VReplicationWorkflowType_MoveTables) getCurrentDDL := func(tableName string) string { req := &tabletmanagerdatapb.GetSchemaRequest{Tables: []string{tableName}} @@ -683,7 +693,7 @@ func TestCancelledDeferSecondaryKeys(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 1, len(res.Rows)) // TODO: figure out why the KILL never shows up... - //require.Equal(t, "1", res.Rows[0][0].ToString()) + // require.Equal(t, "1", res.Rows[0][0].ToString()) // Confirm that the post copy action record still exists // so it will later be retried. @@ -740,7 +750,7 @@ func TestResumingFromPreviousWorkflowKeepingRowsCopied(t *testing.T) { _, err = dbClient.ExecuteFetch(fmt.Sprintf("delete from _vt.vreplication where id = %d", id), 1) require.NoError(t, err) }() - vr := newVReplicator(id, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine) + vr := newVReplicator(id, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine, vttablet.DefaultVReplicationConfig) assert.Equal(t, rowsCopied, vr.stats.CopyRowCount.Get()) } @@ -807,3 +817,59 @@ func waitForQueryResult(t *testing.T, dbc binlogplayer.DBClient, query, val stri } } } + +func TestThrottlerAppNames(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + tablet := addTablet(100) + defer deleteTablet(tablet) + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "t1", + }}, + } + bls := &binlogdatapb.BinlogSource{ + Keyspace: env.KeyspaceName, + Shard: env.ShardName, + Filter: filter, + } + id := int32(1) + vsclient := newTabletConnector(tablet) + stats := binlogplayer.NewStats() + defer stats.Stop() + dbClient := playerEngine.dbClientFactoryFiltered() + err := dbClient.Connect() + require.NoError(t, err) + defer dbClient.Close() + dbName := dbClient.DBName() + // Ensure there's a dummy vreplication workflow record + _, err = dbClient.ExecuteFetch(fmt.Sprintf("insert into _vt.vreplication (id, workflow, source, pos, max_tps, max_replication_lag, time_updated, transaction_timestamp, state, db_name, options) values (%d, 'test_workflow', '', '', 99999, 99999, 0, 0, 'Running', '%s', '{}') on duplicate key update workflow='test', source='', pos='', max_tps=99999, max_replication_lag=99999, time_updated=0, transaction_timestamp=0, state='Running', db_name='%s'", + id, dbName, dbName), 1) + require.NoError(t, err) + defer func() { + _, err = dbClient.ExecuteFetch(fmt.Sprintf("delete from _vt.vreplication where id = %d", id), 1) + require.NoError(t, err) + }() + vr := newVReplicator(id, bls, vsclient, stats, dbClient, env.Mysqld, playerEngine, vttablet.DefaultVReplicationConfig) + settings, _, err := vr.loadSettings(ctx, newVDBClient(dbClient, stats, vttablet.DefaultVReplicationConfig.RelayLogMaxItems)) + require.NoError(t, err) + + throttlerAppName := vr.throttlerAppName() + assert.Contains(t, throttlerAppName, "test_workflow") + assert.Contains(t, throttlerAppName, "vreplication") + assert.NotContains(t, throttlerAppName, "vcopier") + assert.NotContains(t, throttlerAppName, "vplayer") + + vp := newVPlayer(vr, settings, nil, replication.Position{}, "") + assert.Contains(t, vp.throttlerAppName, "test_workflow") + assert.Contains(t, vp.throttlerAppName, "vreplication") + assert.Contains(t, vp.throttlerAppName, "vplayer") + assert.NotContains(t, vp.throttlerAppName, "vcopier") + + vc := newVCopier(vr) + assert.Contains(t, vc.throttlerAppName, "test_workflow") + assert.Contains(t, vc.throttlerAppName, "vreplication") + assert.Contains(t, vc.throttlerAppName, "vcopier") + assert.NotContains(t, vc.throttlerAppName, "vplayer") +} diff --git a/go/vt/vttablet/tabletmanager/vreplication/vrlog_test.go b/go/vt/vttablet/tabletmanager/vreplication/vrlog_test.go index 3bd0dcf3217..48fe7fa983e 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vrlog_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vrlog_test.go @@ -23,6 +23,8 @@ import ( "strings" "testing" "time" + + "github.com/stretchr/testify/require" ) func TestVrLog(t *testing.T) { @@ -49,9 +51,7 @@ func TestVrLog(t *testing.T) { } want := fmt.Sprintf("%s Event %s", eventType, detail) - if !strings.Contains(s, want) { - t.Fatalf(fmt.Sprintf("want %s, got %s", want, s)) - } + require.Contains(t, s, want) if strings.HasSuffix(s, "\\n") { t.Fatalf("does not end in a newline: %s", s) } @@ -65,9 +65,7 @@ func TestVrLog(t *testing.T) { if err != nil { t.Fatalf("Duration is not an integer: %s", err) } - if lastColValue == 0 { - t.Fatalf("Duration should not be zero") - } + require.NotZero(t, lastColValue, "duration") stats = &VrLogStats{} stats.Send("detail123") diff --git a/go/vt/vttablet/tabletserver/binlog_watcher.go b/go/vt/vttablet/tabletserver/binlog_watcher.go index cff7697c18a..80ac1194c7e 100644 --- a/go/vt/vttablet/tabletserver/binlog_watcher.go +++ b/go/vt/vttablet/tabletserver/binlog_watcher.go @@ -31,7 +31,9 @@ import ( // VStreamer defines the functions of VStreamer // that the BinlogWatcher needs. type VStreamer interface { - Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error) error + Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, + filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error, + options *binlogdatapb.VStreamOptions) error } // BinlogWatcher is a tabletserver service that watches the @@ -93,7 +95,7 @@ func (blw *BinlogWatcher) process(ctx context.Context) { // VStreamer will reload the schema when it encounters a DDL. err := blw.vs.Stream(ctx, "current", nil, filter, throttlerapp.BinlogWatcherName, func(events []*binlogdatapb.VEvent) error { return nil - }) + }, nil) log.Infof("ReplicationWatcher VStream ended: %v, retrying in 5 seconds", err) select { case <-ctx.Done(): diff --git a/go/vt/vttablet/tabletserver/connpool/dbconn.go b/go/vt/vttablet/tabletserver/connpool/dbconn.go index af8c5fbc78e..4f3d5fe893d 100644 --- a/go/vt/vttablet/tabletserver/connpool/dbconn.go +++ b/go/vt/vttablet/tabletserver/connpool/dbconn.go @@ -166,7 +166,7 @@ func (dbc *Conn) execOnce(ctx context.Context, query string, maxrows int, wantfi // Check if the context is already past its deadline before // trying to execute the query. if err := ctx.Err(); err != nil { - return nil, fmt.Errorf("%v before execution started", err) + return nil, vterrors.Errorf(vtrpcpb.Code_CANCELED, "%s before execution started", dbc.getErrorMessageFromContextError(ctx)) } now := time.Now() @@ -200,8 +200,8 @@ func (dbc *Conn) execOnce(ctx context.Context, query string, maxrows int, wantfi } } -// terminate kills the query or connection based on the transaction status -func (dbc *Conn) terminate(ctx context.Context, insideTxn bool, now time.Time) { +// getErrorMessageFromContextError gets the error message from context error. +func (dbc *Conn) getErrorMessageFromContextError(ctx context.Context) string { var errMsg string switch { case errors.Is(ctx.Err(), context.DeadlineExceeded): @@ -211,6 +211,12 @@ func (dbc *Conn) terminate(ctx context.Context, insideTxn bool, now time.Time) { default: errMsg = ctx.Err().Error() } + return errMsg +} + +// terminate kills the query or connection based on the transaction status +func (dbc *Conn) terminate(ctx context.Context, insideTxn bool, now time.Time) { + errMsg := dbc.getErrorMessageFromContextError(ctx) if insideTxn { // we can't safely kill a query in a transaction, we need to kill the connection _ = dbc.Kill(errMsg, time.Since(now)) @@ -229,7 +235,7 @@ func (dbc *Conn) FetchNext(ctx context.Context, maxrows int, wantfields bool) (* // Check if the context is already past its deadline before // trying to fetch the next result. if err := ctx.Err(); err != nil { - return nil, fmt.Errorf("%v before reading next result set", err) + return nil, vterrors.Errorf(vtrpcpb.Code_CANCELED, "%s before reading next result set", dbc.getErrorMessageFromContextError(ctx)) } res, _, _, err := dbc.conn.ReadQueryResult(maxrows, wantfields) if err != nil { @@ -598,3 +604,7 @@ func (dbc *Conn) applySameSetting(ctx context.Context) error { _, err := dbc.execOnce(ctx, dbc.setting.ApplyQuery(), 1, false, false) return err } + +func (dbc *Conn) IsUnixSocket() bool { + return dbc.conn.IsClientUnixSocket() +} diff --git a/go/vt/vttablet/tabletserver/connpool/dbconn_test.go b/go/vt/vttablet/tabletserver/connpool/dbconn_test.go index 6f3c77de528..1d9104c4354 100644 --- a/go/vt/vttablet/tabletserver/connpool/dbconn_test.go +++ b/go/vt/vttablet/tabletserver/connpool/dbconn_test.go @@ -20,7 +20,6 @@ import ( "context" "errors" "fmt" - "strings" "sync/atomic" "testing" "time" @@ -76,18 +75,12 @@ func TestDBConnExec(t *testing.T) { if dbConn != nil { defer dbConn.Close() } - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) // Exec succeed, not asking for fields. result, err := dbConn.Exec(ctx, sql, 1, false) - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) expectedResult.Fields = nil - if !expectedResult.Equal(result) { - t.Errorf("Exec: %v, want %v", expectedResult, result) - } + require.True(t, expectedResult.Equal(result)) compareTimingCounts(t, "PoolTest.Exec", 1, startCounts, mysqlTimings.Counts()) @@ -100,10 +93,8 @@ func TestDBConnExec(t *testing.T) { Query: "", }) _, err = dbConn.Exec(ctx, sql, 1, false) - want := "connection fail" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("Exec: %v, want %s", err, want) - } + require.Error(t, err) + require.ErrorContains(t, err, "connection fail") // The client side error triggers a retry in exec. compareTimingCounts(t, "PoolTest.Exec", 2, startCounts, mysqlTimings.Counts()) @@ -114,10 +105,8 @@ func TestDBConnExec(t *testing.T) { // This time the initial query fails as does the reconnect attempt. db.EnableConnFail() _, err = dbConn.Exec(ctx, sql, 1, false) - want = "packet read failed" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("Exec: %v, want %s", err, want) - } + require.Error(t, err) + require.ErrorContains(t, err, "packet read failed") db.DisableConnFail() compareTimingCounts(t, "PoolTest.Exec", 1, startCounts, mysqlTimings.Counts()) @@ -150,14 +139,10 @@ func TestDBConnExecLost(t *testing.T) { if dbConn != nil { defer dbConn.Close() } - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) // Exec succeed, not asking for fields. result, err := dbConn.Exec(ctx, sql, 1, false) - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) expectedResult.Fields = nil if !expectedResult.Equal(result) { t.Errorf("Exec: %v, want %v", expectedResult, result) @@ -173,10 +158,8 @@ func TestDBConnExecLost(t *testing.T) { Query: "", }) _, err = dbConn.Exec(ctx, sql, 1, false) - want := "Lost connection to MySQL server during query" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("Exec: %v, want %s", err, want) - } + require.Error(t, err) + require.ErrorContains(t, err, "Lost connection to MySQL server during query") // Should *not* see a retry, so only increment by 1 compareTimingCounts(t, "PoolTest.Exec", 1, startCounts, mysqlTimings.Counts()) @@ -212,15 +195,11 @@ func TestDBConnDeadline(t *testing.T) { if dbConn != nil { defer dbConn.Close() } - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) _, err = dbConn.Exec(ctx, sql, 1, false) - want := "context deadline exceeded before execution started" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("Exec: %v, want %s", err, want) - } + require.Error(t, err) + require.ErrorContains(t, err, "(errno 3024) (sqlstate HY000): Query execution was interrupted, maximum statement execution time exceeded before execution started") compareTimingCounts(t, "PoolTest.Exec", 0, startCounts, mysqlTimings.Counts()) @@ -230,9 +209,7 @@ func TestDBConnDeadline(t *testing.T) { defer cancel() result, err := dbConn.Exec(ctx, sql, 1, false) - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) expectedResult.Fields = nil if !expectedResult.Equal(result) { t.Errorf("Exec: %v, want %v", expectedResult, result) @@ -244,9 +221,7 @@ func TestDBConnDeadline(t *testing.T) { // Test with just the Background context (with no deadline) result, err = dbConn.Exec(context.Background(), sql, 1, false) - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) expectedResult.Fields = nil if !expectedResult.Equal(result) { t.Errorf("Exec: %v, want %v", expectedResult, result) @@ -266,18 +241,14 @@ func TestDBConnKill(t *testing.T) { if dbConn != nil { defer dbConn.Close() } - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) query := fmt.Sprintf("kill %d", dbConn.ID()) db.AddQuery(query, &sqltypes.Result{}) // Kill failed because we are not able to connect to the database db.EnableConnFail() err = dbConn.Kill("test kill", 0) - want := "errno 2013" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("Exec: %v, want %s", err, want) - } + require.Error(t, err) + require.ErrorContains(t, err, "errno 2013") db.DisableConnFail() // Kill succeed @@ -294,10 +265,8 @@ func TestDBConnKill(t *testing.T) { // Kill failed because "kill query_id" failed db.AddRejectedQuery(newKillQuery, errors.New("rejected")) err = dbConn.Kill("test kill", 0) - want = "rejected" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("Exec: %v, want %s", err, want) - } + require.Error(t, err) + require.ErrorContains(t, err, "rejected") } func TestDBKillWithContext(t *testing.T) { @@ -479,18 +448,17 @@ func TestDBNoPoolConnKill(t *testing.T) { if dbConn != nil { defer dbConn.Close() } - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) query := fmt.Sprintf("kill %d", dbConn.ID()) db.AddQuery(query, &sqltypes.Result{}) // Kill failed because we are not able to connect to the database db.EnableConnFail() err = dbConn.Kill("test kill", 0) - want := "errno 2013" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("Exec: %v, want %s", err, want) - } + require.Error(t, err) + var sqlErr *sqlerror.SQLError + isSqlErr := errors.As(sqlerror.NewSQLErrorFromError(err), &sqlErr) + require.True(t, isSqlErr) + require.EqualValues(t, sqlerror.CRServerLost, sqlErr.Number()) db.DisableConnFail() // Kill succeed @@ -507,10 +475,8 @@ func TestDBNoPoolConnKill(t *testing.T) { // Kill failed because "kill query_id" failed db.AddRejectedQuery(newKillQuery, errors.New("rejected")) err = dbConn.Kill("test kill", 0) - want = "rejected" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("Exec: %v, want %s", err, want) - } + require.Error(t, err) + require.ErrorContains(t, err, "rejected") } func TestDBConnStream(t *testing.T) { @@ -536,9 +502,7 @@ func TestDBConnStream(t *testing.T) { if dbConn != nil { defer dbConn.Close() } - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } + require.NoError(t, err) var result sqltypes.Result err = dbConn.Stream( ctx, sql, func(r *sqltypes.Result) error { @@ -552,12 +516,8 @@ func TestDBConnStream(t *testing.T) { return nil }, alloc, 10, querypb.ExecuteOptions_ALL) - if err != nil { - t.Fatalf("should not get an error, err: %v", err) - } - if !expectedResult.Equal(&result) { - t.Errorf("Exec: %v, want %v", expectedResult, &result) - } + require.NoError(t, err) + require.True(t, expectedResult.Equal(&result)) // Stream fail db.Close() dbConn.Close() @@ -569,10 +529,8 @@ func TestDBConnStream(t *testing.T) { }, 10, querypb.ExecuteOptions_ALL) db.DisableConnFail() - want := "no such file or directory (errno 2002)" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("Error: '%v', must contain '%s'", err, want) - } + require.Error(t, err) + require.ErrorContains(t, err, "no such file or directory (errno 2002)") } // TestDBConnKillCall tests that direct Kill method calls work as expected. diff --git a/go/vt/vttablet/tabletserver/controller.go b/go/vt/vttablet/tabletserver/controller.go index 0336d9a73cc..abb7b390e0d 100644 --- a/go/vt/vttablet/tabletserver/controller.go +++ b/go/vt/vttablet/tabletserver/controller.go @@ -93,6 +93,28 @@ type Controller interface { // CheckThrottler CheckThrottler(ctx context.Context, appName string, flags *throttle.CheckFlags) *throttle.CheckResult GetThrottlerStatus(ctx context.Context) *throttle.ThrottlerStatus + + // RedoPreparedTransactions recreates the transactions with stored prepared transaction log. + RedoPreparedTransactions() + + // SetTwoPCAllowed sets whether TwoPC is allowed or not. It also takes the reason of why it is being set. + // The reason should be an enum value defined in the tabletserver. + SetTwoPCAllowed(int, bool) + + // UnresolvedTransactions returns all unresolved transactions list + UnresolvedTransactions(ctx context.Context, target *querypb.Target, abandonAgeSeconds int64) ([]*querypb.TransactionMetadata, error) + + // ReadTransaction returns all unresolved transactions list + ReadTransaction(ctx context.Context, target *querypb.Target, dtid string) (*querypb.TransactionMetadata, error) + + // ConcludeTransaction deletes the distributed transaction metadata + ConcludeTransaction(ctx context.Context, target *querypb.Target, dtid string) error + + // RollbackPrepared rolls back the prepared transaction and removes the transaction log. + RollbackPrepared(ctx context.Context, target *querypb.Target, dtid string, originalID int64) error + + // WaitForPreparedTwoPCTransactions waits for all prepared transactions to be resolved. + WaitForPreparedTwoPCTransactions(ctx context.Context) error } // Ensure TabletServer satisfies Controller interface. diff --git a/go/vt/vttablet/tabletserver/debug_2pc.go b/go/vt/vttablet/tabletserver/debug_2pc.go new file mode 100644 index 00000000000..5db72be0fba --- /dev/null +++ b/go/vt/vttablet/tabletserver/debug_2pc.go @@ -0,0 +1,73 @@ +//go:build debug2PC + +/* +Copyright 2024 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 tabletserver + +import ( + "context" + "os" + "path" + "strconv" + "time" + + "vitess.io/vitess/go/vt/callerid" + "vitess.io/vitess/go/vt/log" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" +) + +const DebugTwoPc = true + +// readFileForTestSynchronization is a test-only function that reads a file +// that we use for synchronizing some of the tests. +func readFileForTestSynchronization(fileName string) string { + res, _ := os.ReadFile(path.Join(os.Getenv("VTDATAROOT"), fileName)) + return string(res) +} + +// commitPreparedDelayForTest is a test-only function that delays the commit that have already been prepared. +func commitPreparedDelayForTest(tsv *TabletServer) { + sh := readFileForTestSynchronization("VT_DELAY_COMMIT_SHARD") + if tsv.sm.target.Shard == sh { + delay := readFileForTestSynchronization("VT_DELAY_COMMIT_TIME") + delVal, _ := strconv.Atoi(delay) + log.Infof("Delaying commit for shard %v for %d seconds", sh, delVal) + time.Sleep(time.Duration(delVal) * time.Second) + } +} + +// checkTestFailure is used to simulate failures in 2PC flow for testing when DebugTwoPc is true. +func checkTestFailure(ctx context.Context, shard string) error { + if shard != "80-" { + return nil + } + callerID := callerid.EffectiveCallerIDFromContext(ctx) + if callerID == nil { + return nil + } + switch callerID.Principal { + case "CP_80-_R": + // retryable error. + return vterrors.Errorf(vtrpcpb.Code_UNAVAILABLE, "commit prepared: retryable error") + case "CP_80-_NR": + // non retryable error. + return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "commit prepared: non retryable error") + default: + return nil + } +} diff --git a/go/vt/vttablet/tabletserver/dt_executor.go b/go/vt/vttablet/tabletserver/dt_executor.go index 3bc4d4d98b5..126c99814b8 100644 --- a/go/vt/vttablet/tabletserver/dt_executor.go +++ b/go/vt/vttablet/tabletserver/dt_executor.go @@ -24,24 +24,30 @@ import ( "vitess.io/vitess/go/vt/log" querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vttablet/tabletserver/rules" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" ) // DTExecutor is used for executing a distributed transactional request. type DTExecutor struct { - ctx context.Context - logStats *tabletenv.LogStats - te *TxEngine + ctx context.Context + logStats *tabletenv.LogStats + te *TxEngine + qe *QueryEngine + shardFunc func() string } // NewDTExecutor creates a new distributed transaction executor. -func NewDTExecutor(ctx context.Context, te *TxEngine, logStats *tabletenv.LogStats) *DTExecutor { +func NewDTExecutor(ctx context.Context, logStats *tabletenv.LogStats, te *TxEngine, qe *QueryEngine, shardFunc func() string) *DTExecutor { return &DTExecutor{ - ctx: ctx, - te: te, - logStats: logStats, + ctx: ctx, + logStats: logStats, + te: te, + qe: qe, + shardFunc: shardFunc, } } @@ -53,6 +59,9 @@ func (dte *DTExecutor) Prepare(transactionID int64, dtid string) error { if !dte.te.twopcEnabled { return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "2pc is not enabled") } + if !dte.te.IsTwoPCAllowed() { + return vterrors.VT10002("two-pc is enabled, but semi-sync is not") + } defer dte.te.env.Stats().QueryTimings.Record("PREPARE", time.Now()) dte.logStats.TransactionID = transactionID @@ -62,15 +71,37 @@ func (dte *DTExecutor) Prepare(transactionID int64, dtid string) error { } // If no queries were executed, we just rollback. - if len(conn.TxProperties().Queries) == 0 { - conn.Release(tx.TxRollback) + queries := conn.TxProperties().GetQueries() + if len(queries) == 0 { + dte.te.txPool.RollbackAndRelease(dte.ctx, conn) return nil } + // We can only prepare on a Unix socket connection. + // Unix socket are reliable and we can be sure that the connection is not lost with the server after prepare. + if !conn.IsUnixSocket() { + dte.te.txPool.RollbackAndRelease(dte.ctx, conn) + return vterrors.VT10002("cannot prepare the transaction on a network connection") + } + // If the connection is tainted, we cannot prepare it. As there could be temporary tables involved. if conn.IsTainted() { - conn.Release(tx.TxRollback) - return vterrors.VT12001("cannot prepare the transaction on a reserved connection") + dte.te.txPool.RollbackAndRelease(dte.ctx, conn) + return vterrors.VT10002("cannot prepare the transaction on a reserved connection") + } + + // Fail Prepare if any query rule disallows it. + // This could be due to ongoing cutover happening in vreplication workflow + // regarding OnlineDDL or MoveTables. + for _, query := range queries { + qr := dte.qe.queryRuleSources.FilterByPlan(query.Sql, 0, query.Tables...) + if qr != nil { + act, _, _, _ := qr.GetAction("", "", nil, sqlparser.MarginComments{}) + if act != rules.QRContinue { + dte.te.txPool.RollbackAndRelease(dte.ctx, conn) + return vterrors.VT10002("cannot prepare the transaction due to query rule") + } + } } err = dte.te.preparedPool.Put(conn, dtid) @@ -79,8 +110,30 @@ func (dte *DTExecutor) Prepare(transactionID int64, dtid string) error { return vterrors.Errorf(vtrpcpb.Code_RESOURCE_EXHAUSTED, "prepare failed for transaction %d: %v", transactionID, err) } + // Recheck the rules. As some prepare transaction could have passed the first check. + // If they are put in the prepared pool, then vreplication workflow waits. + // This check helps reject the prepare that came later. + for _, query := range queries { + qr := dte.qe.queryRuleSources.FilterByPlan(query.Sql, 0, query.Tables...) + if qr != nil { + act, _, _, _ := qr.GetAction("", "", nil, sqlparser.MarginComments{}) + if act != rules.QRContinue { + dte.te.txPool.RollbackAndRelease(dte.ctx, conn) + dte.te.preparedPool.FetchForRollback(dtid) + return vterrors.VT10002("cannot prepare the transaction due to query rule") + } + } + } + + // If OnlineDDL killed the connection. We should avoid the prepare for it. + if conn.IsClosed() { + dte.te.txPool.RollbackAndRelease(dte.ctx, conn) + dte.te.preparedPool.FetchForRollback(dtid) + return vterrors.VT10002("cannot prepare the transaction on a closed connection") + } + return dte.inTransaction(func(localConn *StatefulConnection) error { - return dte.te.twoPC.SaveRedo(dte.ctx, localConn, dtid, conn.TxProperties().Queries) + return dte.te.twoPC.SaveRedo(dte.ctx, localConn, dtid, queries) }) } @@ -88,63 +141,51 @@ func (dte *DTExecutor) Prepare(transactionID int64, dtid string) error { // CommitPrepared commits a prepared transaction. If the operation // fails, an error counter is incremented and the transaction is // marked as failed in the redo log. -func (dte *DTExecutor) CommitPrepared(dtid string) error { +func (dte *DTExecutor) CommitPrepared(dtid string) (err error) { if !dte.te.twopcEnabled { return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "2pc is not enabled") } defer dte.te.env.Stats().QueryTimings.Record("COMMIT_PREPARED", time.Now()) - conn, err := dte.te.preparedPool.FetchForCommit(dtid) + var conn *StatefulConnection + conn, err = dte.te.preparedPool.FetchForCommit(dtid) if err != nil { - return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "cannot commit dtid %s, state: %v", dtid, err) + return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "cannot commit dtid %s, err: %v", dtid, err) } + // No connection means the transaction was already committed. if conn == nil { return nil } // We have to use a context that will never give up, // even if the original context expires. ctx := trace.CopySpan(context.Background(), dte.ctx) - defer dte.te.txPool.RollbackAndRelease(ctx, conn) - err = dte.te.twoPC.DeleteRedo(ctx, conn, dtid) - if err != nil { - dte.markFailed(ctx, dtid) + defer func() { + if err != nil { + log.Warningf("failed to commit the prepared transaction '%s' with error: %v", dtid, err) + fail := dte.te.checkErrorAndMarkFailed(ctx, dtid, err, "TwopcCommit") + if fail { + dte.te.env.Stats().CommitPreparedFail.Add("NonRetryable", 1) + } else { + dte.te.env.Stats().CommitPreparedFail.Add("Retryable", 1) + } + } + dte.te.txPool.RollbackAndRelease(ctx, conn) + }() + if DebugTwoPc { + if err := checkTestFailure(dte.ctx, dte.shardFunc()); err != nil { + log.Errorf("failing test on commit prepared: %v", err) + return err + } + } + if err = dte.te.twoPC.DeleteRedo(ctx, conn, dtid); err != nil { return err } - _, err = dte.te.txPool.Commit(ctx, conn) - if err != nil { - dte.markFailed(ctx, dtid) + if _, err = dte.te.txPool.Commit(ctx, conn); err != nil { return err } dte.te.preparedPool.Forget(dtid) return nil } -// markFailed does the necessary work to mark a CommitPrepared -// as failed. It marks the dtid as failed in the prepared pool, -// increments the InternalErros counter, and also changes the -// state of the transaction in the redo log as failed. If the -// state change does not succeed, it just logs the event. -// The function uses the passed in context that has no timeout -// instead of DTExecutor's context. -func (dte *DTExecutor) markFailed(ctx context.Context, dtid string) { - dte.te.env.Stats().InternalErrors.Add("TwopcCommit", 1) - dte.te.preparedPool.SetFailed(dtid) - conn, _, _, err := dte.te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) - if err != nil { - log.Errorf("markFailed: Begin failed for dtid %s: %v", dtid, err) - return - } - defer dte.te.txPool.RollbackAndRelease(ctx, conn) - - if err = dte.te.twoPC.UpdateRedo(ctx, conn, dtid, RedoStateFailed); err != nil { - log.Errorf("markFailed: UpdateRedo failed for dtid %s: %v", dtid, err) - return - } - - if _, err = dte.te.txPool.Commit(ctx, conn); err != nil { - log.Errorf("markFailed: Commit failed for dtid %s: %v", dtid, err) - } -} - // RollbackPrepared rolls back a prepared transaction. This function handles // the case of an incomplete prepare. // @@ -207,7 +248,16 @@ func (dte *DTExecutor) StartCommit(transactionID int64, dtid string) error { } defer dte.te.txPool.RollbackAndRelease(dte.ctx, conn) - err = dte.te.twoPC.Transition(dte.ctx, conn, dtid, querypb.TransactionState_COMMIT) + // If the connection is tainted, we cannot take a commit decision on it. + if conn.IsTainted() { + dte.inTransaction(func(conn *StatefulConnection) error { + return dte.te.twoPC.Transition(dte.ctx, conn, dtid, DTStateRollback) + }) + // return the error, defer call above will roll back the transaction. + return vterrors.VT10002("cannot commit the transaction on a reserved connection") + } + + err = dte.te.twoPC.Transition(dte.ctx, conn, dtid, DTStateCommit) if err != nil { return err } @@ -225,11 +275,16 @@ func (dte *DTExecutor) SetRollback(dtid string, transactionID int64) error { dte.logStats.TransactionID = transactionID if transactionID != 0 { + // If the transaction is still open, it will be rolled back. + // Otherwise, it would have been rolled back by other means, like a timeout or vttablet/mysql restart. dte.te.Rollback(dte.ctx, transactionID) + } else { + // This is a warning because it should not happen in normal operation. + log.Warningf("SetRollback called with no transactionID for dtid %s", dtid) } return dte.inTransaction(func(conn *StatefulConnection) error { - return dte.te.twoPC.Transition(dte.ctx, conn, dtid, querypb.TransactionState_ROLLBACK) + return dte.te.twoPC.Transition(dte.ctx, conn, dtid, DTStateRollback) }) } @@ -271,7 +326,7 @@ func (dte *DTExecutor) ReadTwopcInflight() (distributed []*tx.DistributedTx, pre } func (dte *DTExecutor) inTransaction(f func(*StatefulConnection) error) error { - conn, _, _, err := dte.te.txPool.Begin(dte.ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn, _, _, err := dte.te.txPool.Begin(dte.ctx, &querypb.ExecuteOptions{}, false, 0, nil) if err != nil { return err } @@ -290,6 +345,14 @@ func (dte *DTExecutor) inTransaction(f func(*StatefulConnection) error) error { } // UnresolvedTransactions returns the list of unresolved distributed transactions. -func (dte *DTExecutor) UnresolvedTransactions() ([]*querypb.TransactionMetadata, error) { - return dte.te.twoPC.UnresolvedTransactions(dte.ctx, time.Now().Add(-dte.te.abandonAge)) +func (dte *DTExecutor) UnresolvedTransactions(requestedAge time.Duration) ([]*querypb.TransactionMetadata, error) { + if !dte.te.twopcEnabled { + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "2pc is not enabled") + } + // override default time if provided in the request. + age := dte.te.abandonAge + if requestedAge > 0 { + age = requestedAge + } + return dte.te.twoPC.UnresolvedTransactions(dte.ctx, time.Now().Add(-age)) } diff --git a/go/vt/vttablet/tabletserver/dt_executor_test.go b/go/vt/vttablet/tabletserver/dt_executor_test.go index 448dd63bf5a..103112bd7c7 100644 --- a/go/vt/vttablet/tabletserver/dt_executor_test.go +++ b/go/vt/vttablet/tabletserver/dt_executor_test.go @@ -21,9 +21,17 @@ import ( "errors" "fmt" "reflect" + "regexp" + "strconv" + "strings" "testing" "time" + "vitess.io/vitess/go/event/syslogger" + "vitess.io/vitess/go/mysql/sqlerror" + "vitess.io/vitess/go/vt/vtenv" + "vitess.io/vitess/go/vt/vttablet/tabletserver/rules" + "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" "github.com/stretchr/testify/require" @@ -40,22 +48,50 @@ import ( func TestTxExecutorEmptyPrepare(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() + + // start a transaction. txid := newTransaction(tsv, nil) - err := txe.Prepare(txid, "aa") + + // taint the connection. + sc, err := tsv.te.txPool.GetAndLock(txid, "taint") + require.NoError(t, err) + sc.Taint(ctx, nil) + sc.Unlock() + + err = txe.Prepare(txid, "aa") require.NoError(t, err) // Nothing should be prepared. require.Empty(t, txe.te.preparedPool.conns, "txe.te.preparedPool.conns") + require.False(t, sc.IsInTransaction(), "transaction should be roll back before returning the connection to the pool") +} + +func TestExecutorPrepareFailure(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + txe, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() + + // start a transaction + txid := newTxForPrep(ctx, tsv) + + // taint the connection. + sc, err := tsv.te.txPool.GetAndLock(txid, "taint") + require.NoError(t, err) + sc.Taint(ctx, nil) + sc.Unlock() + + // try 2pc commit of Metadata Manager. + err = txe.Prepare(txid, "aa") + require.EqualError(t, err, "VT10002: atomic distributed transaction not allowed: cannot prepare the transaction on a reserved connection") } func TestTxExecutorPrepare(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() txid := newTxForPrep(ctx, tsv) err := txe.Prepare(txid, "aa") require.NoError(t, err) @@ -73,24 +109,22 @@ func TestTxExecutorPrepare(t *testing.T) { func TestDTExecutorPrepareResevedConn(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() txid := newTxForPrep(ctx, tsv) // Reserve a connection txe.te.Reserve(ctx, nil, txid, nil) err := txe.Prepare(txid, "aa") - require.ErrorContains(t, err, "VT12001: unsupported: cannot prepare the transaction on a reserved connection") + require.ErrorContains(t, err, "VT10002: atomic distributed transaction not allowed: cannot prepare the transaction on a reserved connection") } func TestTxExecutorPrepareNotInTx(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, _, _, closer := newTestTxExecutor(t, ctx) + defer closer() err := txe.Prepare(0, "aa") require.EqualError(t, err, "transaction 0: not found (potential transaction timeout)") } @@ -98,9 +132,8 @@ func TestTxExecutorPrepareNotInTx(t *testing.T) { func TestTxExecutorPreparePoolFail(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() txid1 := newTxForPrep(ctx, tsv) txid2 := newTxForPrep(ctx, tsv) err := txe.Prepare(txid1, "aa") @@ -114,9 +147,8 @@ func TestTxExecutorPreparePoolFail(t *testing.T) { func TestTxExecutorPrepareRedoBeginFail(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() txid := newTxForPrep(ctx, tsv) db.AddRejectedQuery("begin", errors.New("begin fail")) err := txe.Prepare(txid, "aa") @@ -128,9 +160,8 @@ func TestTxExecutorPrepareRedoBeginFail(t *testing.T) { func TestTxExecutorPrepareRedoFail(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() txid := newTxForPrep(ctx, tsv) err := txe.Prepare(txid, "bb") defer txe.RollbackPrepared("bb", 0) @@ -141,9 +172,8 @@ func TestTxExecutorPrepareRedoFail(t *testing.T) { func TestTxExecutorPrepareRedoCommitFail(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() txid := newTxForPrep(ctx, tsv) db.AddRejectedQuery("commit", errors.New("commit fail")) err := txe.Prepare(txid, "aa") @@ -152,12 +182,63 @@ func TestTxExecutorPrepareRedoCommitFail(t *testing.T) { require.Contains(t, err.Error(), "commit fail") } +func TestExecutorPrepareRuleFailure(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + txe, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() + + alterRule := rules.NewQueryRule("disable update", "disable update", rules.QRBuffer) + alterRule.AddTableCond("test_table") + + r := rules.New() + r.Add(alterRule) + txe.qe.queryRuleSources.RegisterSource("bufferQuery") + err := txe.qe.queryRuleSources.SetRules("bufferQuery", r) + require.NoError(t, err) + + // start a transaction + txid := newTxForPrep(ctx, tsv) + + // taint the connection. + sc, err := tsv.te.txPool.GetAndLock(txid, "adding query property") + require.NoError(t, err) + sc.txProps.Queries = append(sc.txProps.Queries, tx.Query{ + Sql: "update test_table set col = 5", + Tables: []string{"test_table"}, + }) + sc.Unlock() + + // try 2pc commit of Metadata Manager. + err = txe.Prepare(txid, "aa") + require.EqualError(t, err, "VT10002: atomic distributed transaction not allowed: cannot prepare the transaction due to query rule") +} + +func TestExecutorPrepareConnFailure(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + txe, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() + + // start a transaction + txid := newTxForPrep(ctx, tsv) + + // taint the connection. + sc, err := tsv.te.txPool.GetAndLock(txid, "adding query property") + require.NoError(t, err) + sc.Unlock() + sc.dbConn.Close() + + // try 2pc commit of Metadata Manager. + err = txe.Prepare(txid, "aa") + require.EqualError(t, err, "VT10002: atomic distributed transaction not allowed: cannot prepare the transaction on a closed connection") +} + func TestTxExecutorCommit(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() txid := newTxForPrep(ctx, tsv) err := txe.Prepare(txid, "aa") require.NoError(t, err) @@ -171,31 +252,40 @@ func TestTxExecutorCommit(t *testing.T) { func TestTxExecutorCommitRedoFail(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() + + tl := syslogger.NewTestLogger() + defer tl.Close() + + // start a transaction. txid := newTxForPrep(ctx, tsv) - // Allow all additions to redo logs to succeed + + // prepare the transaction db.AddQueryPattern("insert into _vt\\.redo_state.*", &sqltypes.Result{}) err := txe.Prepare(txid, "bb") require.NoError(t, err) - defer txe.RollbackPrepared("bb", 0) - db.AddQuery("update _vt.redo_state set state = 'Failed' where dtid = 'bb'", &sqltypes.Result{}) + + // fail commit prepare as the delete redo query is in rejected query. + db.AddRejectedQuery("delete from _vt.redo_state where dtid = _binary'bb'", errors.New("delete redo log fail")) + db.AddQuery("update _vt.redo_state set state = 0 where dtid = _binary'bb'", sqltypes.MakeTestResult(nil)) err = txe.CommitPrepared("bb") - require.Error(t, err) - require.Contains(t, err.Error(), "is not supported") - // A retry should fail differently. + require.ErrorContains(t, err, "delete redo log fail") + + // A retry should fail differently as the prepared transaction is marked as failed. err = txe.CommitPrepared("bb") require.Error(t, err) - require.Contains(t, err.Error(), "cannot commit dtid bb, state: failed") + require.Contains(t, err.Error(), "cannot commit dtid bb, err: VT09025: atomic transaction error: failed to commit") + + require.Contains(t, strings.Join(tl.GetAllLogs(), "|"), + "failed to commit the prepared transaction 'bb' with error: unknown error: delete redo log fail") } func TestTxExecutorCommitRedoCommitFail(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() txid := newTxForPrep(ctx, tsv) err := txe.Prepare(txid, "aa") require.NoError(t, err) @@ -209,9 +299,8 @@ func TestTxExecutorCommitRedoCommitFail(t *testing.T) { func TestTxExecutorRollbackBeginFail(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() txid := newTxForPrep(ctx, tsv) err := txe.Prepare(txid, "aa") require.NoError(t, err) @@ -224,9 +313,8 @@ func TestTxExecutorRollbackBeginFail(t *testing.T) { func TestTxExecutorRollbackRedoFail(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() txid := newTxForPrep(ctx, tsv) // Allow all additions to redo logs to succeed db.AddQueryPattern("insert into _vt\\.redo_state.*", &sqltypes.Result{}) @@ -240,12 +328,11 @@ func TestTxExecutorRollbackRedoFail(t *testing.T) { func TestExecutorCreateTransaction(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, _, db, closer := newTestTxExecutor(t, ctx) + defer closer() - db.AddQueryPattern(fmt.Sprintf("insert into _vt\\.dt_state\\(dtid, state, time_created\\) values \\('aa', %d,.*", int(querypb.TransactionState_PREPARE)), &sqltypes.Result{}) - db.AddQueryPattern("insert into _vt\\.dt_participant\\(dtid, id, keyspace, shard\\) values \\('aa', 1,.*", &sqltypes.Result{}) + db.AddQueryPattern(fmt.Sprintf("insert into _vt\\.dt_state\\(dtid, state, time_created\\) values \\(_binary'aa', %d,.*", int(querypb.TransactionState_PREPARE)), &sqltypes.Result{}) + db.AddQueryPattern("insert into _vt\\.dt_participant\\(dtid, id, keyspace, shard\\) values \\(_binary'aa', 1,.*", &sqltypes.Result{}) err := txe.CreateTransaction("aa", []*querypb.Target{{ Keyspace: "t1", Shard: "0", @@ -256,11 +343,10 @@ func TestExecutorCreateTransaction(t *testing.T) { func TestExecutorStartCommit(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() - commitTransition := fmt.Sprintf("update _vt.dt_state set state = %d where dtid = 'aa' and state = %d", int(querypb.TransactionState_COMMIT), int(querypb.TransactionState_PREPARE)) + commitTransition := fmt.Sprintf("update _vt.dt_state set state = %d where dtid = _binary'aa' and state = %d", int(querypb.TransactionState_COMMIT), int(querypb.TransactionState_PREPARE)) db.AddQuery(commitTransition, &sqltypes.Result{RowsAffected: 1}) txid := newTxForPrep(ctx, tsv) err := txe.StartCommit(txid, "aa") @@ -273,14 +359,37 @@ func TestExecutorStartCommit(t *testing.T) { require.Contains(t, err.Error(), "could not transition to COMMIT: aa") } +func TestExecutorStartCommitFailure(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + txe, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() + + // start a transaction + txid := newTxForPrep(ctx, tsv) + + // taint the connection. + sc, err := tsv.te.txPool.GetAndLock(txid, "taint") + require.NoError(t, err) + sc.Taint(ctx, nil) + sc.Unlock() + + // add rollback state update expectation + rollbackTransition := fmt.Sprintf("update _vt.dt_state set state = %d where dtid = _binary'aa' and state = %d", int(querypb.TransactionState_ROLLBACK), int(querypb.TransactionState_PREPARE)) + db.AddQuery(rollbackTransition, sqltypes.MakeTestResult(nil)) + + // try 2pc commit of Metadata Manager. + err = txe.StartCommit(txid, "aa") + require.EqualError(t, err, "VT10002: atomic distributed transaction not allowed: cannot commit the transaction on a reserved connection") +} + func TestExecutorSetRollback(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() - rollbackTransition := fmt.Sprintf("update _vt.dt_state set state = %d where dtid = 'aa' and state = %d", int(querypb.TransactionState_ROLLBACK), int(querypb.TransactionState_PREPARE)) + rollbackTransition := fmt.Sprintf("update _vt.dt_state set state = %d where dtid = _binary'aa' and state = %d", int(querypb.TransactionState_ROLLBACK), int(querypb.TransactionState_PREPARE)) db.AddQuery(rollbackTransition, &sqltypes.Result{RowsAffected: 1}) txid := newTxForPrep(ctx, tsv) err := txe.SetRollback("aa", txid) @@ -293,15 +402,70 @@ func TestExecutorSetRollback(t *testing.T) { require.Contains(t, err.Error(), "could not transition to ROLLBACK: aa") } +// TestExecutorUnresolvedTransactions tests with what timestamp value the query is executed to fetch unresolved transactions. +func TestExecutorUnresolvedTransactions(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + txe, _, db, closer := newTestTxExecutor(t, ctx) + defer closer() + + pattern := `(?i)select\s+t\.dtid,\s+t\.state,\s+t\.time_created,\s+p\.keyspace,\s+p\.shard\s+from\s+_vt\.dt_state\s+t\s+join\s+_vt\.dt_participant\s+p\s+on\s+t\.dtid\s+=\s+p\.dtid\s+where\s+time_created\s+<\s+(\d+)\s+order\s+by\s+t\.state\s+desc,\s+t\.dtid` + re := regexp.MustCompile(pattern) + + var executedQuery string + db.AddQueryPatternWithCallback(pattern, &sqltypes.Result{}, func(query string) { + executedQuery = query + }) + + tcases := []struct { + abandonAge time.Duration + expected time.Time + }{ + {abandonAge: 0, expected: time.Now().Add(-txe.te.abandonAge)}, + {abandonAge: 100 * time.Second, expected: time.Now().Add(-100 * time.Second)}, + } + + for _, tcase := range tcases { + t.Run(fmt.Sprintf("abandonAge=%v", tcase.abandonAge), func(t *testing.T) { + _, err := txe.UnresolvedTransactions(tcase.abandonAge) + require.NoError(t, err) + require.NotEmpty(t, executedQuery) + + // extract the time value + matches := re.FindStringSubmatch(executedQuery) + require.Len(t, matches, 2) + timeCreated := convertNanoStringToTime(t, matches[1]) + + // diff should be in microseconds, so we allow 10ms difference + require.WithinDuration(t, timeCreated, tcase.expected, 10*time.Millisecond) + }) + } + +} + +func convertNanoStringToTime(t *testing.T, unixNanoStr string) time.Time { + t.Helper() + + // Convert the string to an integer (int64) + unixNano, err := strconv.ParseInt(unixNanoStr, 10, 64) + require.NoError(t, err) + + // Convert nanoseconds to seconds and nanoseconds + seconds := unixNano / int64(time.Second) + nanos := unixNano % int64(time.Second) + + // Create a time.Time object + return time.Unix(seconds, nanos) +} + func TestExecutorConcludeTransaction(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, _, db, closer := newTestTxExecutor(t, ctx) + defer closer() - db.AddQuery("delete from _vt.dt_state where dtid = 'aa'", &sqltypes.Result{}) - db.AddQuery("delete from _vt.dt_participant where dtid = 'aa'", &sqltypes.Result{}) + db.AddQuery("delete from _vt.dt_state where dtid = _binary'aa'", &sqltypes.Result{}) + db.AddQuery("delete from _vt.dt_participant where dtid = _binary'aa'", &sqltypes.Result{}) err := txe.ConcludeTransaction("aa") require.NoError(t, err) } @@ -309,11 +473,10 @@ func TestExecutorConcludeTransaction(t *testing.T) { func TestExecutorReadTransaction(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, _, db, closer := newTestTxExecutor(t, ctx) + defer closer() - db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = 'aa'", &sqltypes.Result{}) + db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = _binary'aa'", &sqltypes.Result{}) got, err := txe.ReadTransaction("aa") require.NoError(t, err) want := &querypb.TransactionMetadata{} @@ -333,8 +496,8 @@ func TestExecutorReadTransaction(t *testing.T) { sqltypes.NewVarBinary("1"), }}, } - db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = 'aa'", txResult) - db.AddQuery("select keyspace, shard from _vt.dt_participant where dtid = 'aa'", &sqltypes.Result{ + db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = _binary'aa'", txResult) + db.AddQuery("select keyspace, shard from _vt.dt_participant where dtid = _binary'aa'", &sqltypes.Result{ Fields: []*querypb.Field{ {Type: sqltypes.VarChar}, {Type: sqltypes.VarChar}, @@ -379,7 +542,7 @@ func TestExecutorReadTransaction(t *testing.T) { sqltypes.NewVarBinary("1"), }}, } - db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = 'aa'", txResult) + db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = _binary'aa'", txResult) want.State = querypb.TransactionState_COMMIT got, err = txe.ReadTransaction("aa") require.NoError(t, err) @@ -399,7 +562,7 @@ func TestExecutorReadTransaction(t *testing.T) { sqltypes.NewVarBinary("1"), }}, } - db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = 'aa'", txResult) + db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = _binary'aa'", txResult) want.State = querypb.TransactionState_ROLLBACK got, err = txe.ReadTransaction("aa") require.NoError(t, err) @@ -411,9 +574,8 @@ func TestExecutorReadTransaction(t *testing.T) { func TestExecutorReadAllTransactions(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - txe, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + txe, _, db, closer := newTestTxExecutor(t, ctx) + defer closer() db.AddQuery(txe.te.twoPC.readAllTransactions, &sqltypes.Result{ Fields: []*querypb.Field{ @@ -528,6 +690,12 @@ func TestNoTwopc(t *testing.T) { _, _, _, err := txe.ReadTwopcInflight() return err }, + }, { + desc: "UnresolvedTransactions", + fun: func() error { + _, err := txe.UnresolvedTransactions(0 /* requestedAge */) + return err + }, }} want := "2pc is not enabled" @@ -537,20 +705,30 @@ func TestNoTwopc(t *testing.T) { } } -func newTestTxExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv *TabletServer, db *fakesqldb.DB) { +func newTestTxExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, tsv *TabletServer, db *fakesqldb.DB, closer func()) { db = setUpQueryExecutorTest(t) logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor") tsv = newTestTabletServer(ctx, smallTxPool, db) - db.AddQueryPattern("insert into _vt\\.redo_state\\(dtid, state, time_created\\) values \\('aa', 1,.*", &sqltypes.Result{}) + cfg := tabletenv.NewDefaultConfig() + cfg.DB = newDBConfigs(db) + env := tabletenv.NewEnv(vtenv.NewTestEnv(), cfg, "TabletServerTest") + se := schema.NewEngine(env) + qe := NewQueryEngine(env, se) + db.AddQueryPattern("insert into _vt\\.redo_state\\(dtid, state, time_created\\) values \\(_binary'aa', 1,.*", &sqltypes.Result{}) db.AddQueryPattern("insert into _vt\\.redo_statement.*", &sqltypes.Result{}) - db.AddQuery("delete from _vt.redo_state where dtid = 'aa'", &sqltypes.Result{}) - db.AddQuery("delete from _vt.redo_statement where dtid = 'aa'", &sqltypes.Result{}) + db.AddQuery("delete from _vt.redo_state where dtid = _binary'aa'", &sqltypes.Result{}) + db.AddQuery("delete from _vt.redo_statement where dtid = _binary'aa'", &sqltypes.Result{}) db.AddQuery("update test_table set `name` = 2 where pk = 1 limit 10001", &sqltypes.Result{}) + db.AddRejectedQuery("bogus", sqlerror.NewSQLError(sqlerror.ERUnknownError, sqlerror.SSUnknownSQLState, "bogus query")) return &DTExecutor{ - ctx: ctx, - logStats: logStats, - te: tsv.te, - }, tsv, db + ctx: ctx, + logStats: logStats, + te: tsv.te, + qe: qe, + }, tsv, db, func() { + db.Close() + tsv.StopService() + } } // newShortAgeExecutor is same as newTestTxExecutor, but shorter transaction abandon age. @@ -558,10 +736,10 @@ func newShortAgeExecutor(t *testing.T, ctx context.Context) (txe *DTExecutor, ts db = setUpQueryExecutorTest(t) logStats := tabletenv.NewLogStats(ctx, "TestTxExecutor") tsv = newTestTabletServer(ctx, smallTxPool|shortTwopcAge, db) - db.AddQueryPattern("insert into _vt\\.redo_state\\(dtid, state, time_created\\) values \\('aa', 1,.*", &sqltypes.Result{}) + db.AddQueryPattern("insert into _vt\\.redo_state\\(dtid, state, time_created\\) values \\(_binary'aa', 1,.*", &sqltypes.Result{}) db.AddQueryPattern("insert into _vt\\.redo_statement.*", &sqltypes.Result{}) - db.AddQuery("delete from _vt.redo_state where dtid = 'aa'", &sqltypes.Result{}) - db.AddQuery("delete from _vt.redo_statement where dtid = 'aa'", &sqltypes.Result{}) + db.AddQuery("delete from _vt.redo_state where dtid = _binary'aa'", &sqltypes.Result{}) + db.AddQuery("delete from _vt.redo_statement where dtid = _binary'aa'", &sqltypes.Result{}) db.AddQuery("update test_table set `name` = 2 where pk = 1 limit 10001", &sqltypes.Result{}) return &DTExecutor{ ctx: ctx, diff --git a/go/vt/vttablet/tabletserver/gc/tablegc.go b/go/vt/vttablet/tabletserver/gc/tablegc.go index f1d64aebea3..4d1714532a3 100644 --- a/go/vt/vttablet/tabletserver/gc/tablegc.go +++ b/go/vt/vttablet/tabletserver/gc/tablegc.go @@ -551,7 +551,7 @@ func (collector *TableGC) purge(ctx context.Context) (tableName string, err erro // cancelled return tableName, err } - if !collector.throttlerClient.ThrottleCheckOKOrWait(ctx) { + if _, ok := collector.throttlerClient.ThrottleCheckOKOrWait(ctx); !ok { continue } // OK, we're clear to go! diff --git a/go/vt/vttablet/tabletserver/messager/engine.go b/go/vt/vttablet/tabletserver/messager/engine.go index 612619f7ccc..2e526fcdc3d 100644 --- a/go/vt/vttablet/tabletserver/messager/engine.go +++ b/go/vt/vttablet/tabletserver/messager/engine.go @@ -45,7 +45,8 @@ type TabletService interface { // VStreamer defines the functions of VStreamer // that the messager needs. type VStreamer interface { - Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error) error + Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, + throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error, options *binlogdatapb.VStreamOptions) error StreamResults(ctx context.Context, query string, send func(*binlogdatapb.VStreamResultsResponse) error) error } diff --git a/go/vt/vttablet/tabletserver/messager/message_manager.go b/go/vt/vttablet/tabletserver/messager/message_manager.go index 2f4f8605870..7a217fb63b7 100644 --- a/go/vt/vttablet/tabletserver/messager/message_manager.go +++ b/go/vt/vttablet/tabletserver/messager/message_manager.go @@ -236,6 +236,9 @@ type messageManager struct { ackQuery *sqlparser.ParsedQuery postponeQuery *sqlparser.ParsedQuery purgeQuery *sqlparser.ParsedQuery + + // idType is the type of the id column in the message table. + idType sqltypes.Type } // newMessageManager creates a new message manager. @@ -259,6 +262,7 @@ func newMessageManager(tsv TabletService, vs VStreamer, table *schema.Table, pos purgeTicks: timer.NewTimer(table.MessageInfo.PollInterval), postponeSema: postponeSema, messagesPending: true, + idType: table.MessageInfo.IDType, } mm.cond.L = &mm.mu @@ -742,7 +746,7 @@ func (mm *messageManager) runOneVStream(ctx context.Context) error { } } return nil - }) + }, nil) return err } @@ -856,7 +860,7 @@ func (mm *messageManager) GenerateAckQuery(ids []string) (string, map[string]*qu } for _, id := range ids { idbvs.Values = append(idbvs.Values, &querypb.Value{ - Type: querypb.Type_VARBINARY, + Type: mm.idType, Value: []byte(id), }) } @@ -874,7 +878,7 @@ func (mm *messageManager) GeneratePostponeQuery(ids []string) (string, map[strin } for _, id := range ids { idbvs.Values = append(idbvs.Values, &querypb.Value{ - Type: querypb.Type_VARBINARY, + Type: mm.idType, Value: []byte(id), }) } diff --git a/go/vt/vttablet/tabletserver/messager/message_manager_test.go b/go/vt/vttablet/tabletserver/messager/message_manager_test.go index fdf39556e5c..5e1c21f773f 100644 --- a/go/vt/vttablet/tabletserver/messager/message_manager_test.go +++ b/go/vt/vttablet/tabletserver/messager/message_manager_test.go @@ -74,6 +74,7 @@ func newMMTable() *schema.Table { BatchSize: 1, CacheSize: 10, PollInterval: 1 * time.Second, + IDType: sqltypes.VarBinary, }, } } @@ -91,6 +92,7 @@ func newMMTableWithBackoff() *schema.Table { BatchSize: 1, CacheSize: 10, PollInterval: 1 * time.Second, + IDType: sqltypes.VarBinary, }, } } @@ -889,7 +891,8 @@ func (fv *fakeVStreamer) setPollerResponse(pr []*binlogdatapb.VStreamResultsResp fv.pollerResponse = pr } -func (fv *fakeVStreamer) Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error) error { +func (fv *fakeVStreamer) Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, + filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error, options *binlogdatapb.VStreamOptions) error { fv.streamInvocations.Add(1) for { fv.mu.Lock() diff --git a/go/vt/vttablet/tabletserver/planbuilder/builder.go b/go/vt/vttablet/tabletserver/planbuilder/builder.go index 94f5fc1caa2..6df89f7caf8 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/builder.go +++ b/go/vt/vttablet/tabletserver/planbuilder/builder.go @@ -33,7 +33,7 @@ func analyzeSelect(env *vtenv.Environment, sel *sqlparser.Select, tables map[str PlanID: PlanSelect, FullQuery: GenerateLimitQuery(sel), } - plan.Table, plan.AllTables = lookupTables(sel.From, tables) + plan.Table = lookupTables(sel.From, tables) if sel.Where != nil { comp, ok := sel.Where.Expr.(*sqlparser.ComparisonExpr) @@ -72,7 +72,7 @@ func analyzeUpdate(upd *sqlparser.Update, tables map[string]*schema.Table) (plan plan = &Plan{ PlanID: PlanUpdate, } - plan.Table, plan.AllTables = lookupTables(upd.TableExprs, tables) + plan.Table = lookupTables(upd.TableExprs, tables) // Store the WHERE clause as string for the hot row protection (txserializer). if upd.Where != nil { @@ -102,7 +102,7 @@ func analyzeDelete(del *sqlparser.Delete, tables map[string]*schema.Table) (plan plan = &Plan{ PlanID: PlanDelete, } - plan.Table, plan.AllTables = lookupTables(del.TableExprs, tables) + plan.Table = lookupTables(del.TableExprs, tables) if del.Where != nil { buf := sqlparser.NewTrackedBuffer(nil) @@ -127,11 +127,7 @@ func analyzeInsert(ins *sqlparser.Insert, tables map[string]*schema.Table) (plan FullQuery: GenerateFullQuery(ins), } - tableName, err := ins.Table.TableName() - if err != nil { - return nil, err - } - plan.Table = tables[sqlparser.GetTableName(tableName).String()] + plan.Table = lookupTables(sqlparser.TableExprs{ins.Table}, tables) return plan, nil } @@ -188,16 +184,26 @@ func analyzeSet(set *sqlparser.Set) (plan *Plan) { } } -func lookupTables(tableExprs sqlparser.TableExprs, tables map[string]*schema.Table) (singleTable *schema.Table, allTables []*schema.Table) { +func lookupTables(tableExprs sqlparser.TableExprs, tables map[string]*schema.Table) (singleTable *schema.Table) { for _, tableExpr := range tableExprs { if t := lookupSingleTable(tableExpr, tables); t != nil { - allTables = append(allTables, t) + if singleTable != nil { + return nil + } + singleTable = t } } - if len(allTables) == 1 { - singleTable = allTables[0] + return singleTable +} + +func lookupAllTables(stmt sqlparser.Statement, tables map[string]*schema.Table) (allTables []*schema.Table) { + tablesUsed := sqlparser.ExtractAllTables(stmt) + for _, tbl := range tablesUsed { + if t := tables[tbl]; t != nil { + allTables = append(allTables, t) + } } - return singleTable, allTables + return allTables } func lookupSingleTable(tableExpr sqlparser.TableExpr, tables map[string]*schema.Table) *schema.Table { @@ -229,12 +235,14 @@ func analyzeFlush(stmt *sqlparser.Flush, tables map[string]*schema.Table) (*Plan for _, tbl := range stmt.TableNames { if schemaTbl, ok := tables[tbl.Name.String()]; ok { - plan.AllTables = append(plan.AllTables, schemaTbl) + if plan.Table != nil { + // If there are multiple tables, we empty out the table field. + plan.Table = nil + break + } + plan.Table = schemaTbl } } - if len(plan.AllTables) == 1 { - plan.Table = plan.AllTables[0] - } if stmt.WithLock { plan.NeedsReservedConn = true diff --git a/go/vt/vttablet/tabletserver/planbuilder/permission.go b/go/vt/vttablet/tabletserver/planbuilder/permission.go index 79b2f9eb430..1949d6ce739 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/permission.go +++ b/go/vt/vttablet/tabletserver/planbuilder/permission.go @@ -36,20 +36,26 @@ func BuildPermissions(stmt sqlparser.Statement) []Permission { var permissions []Permission // All Statement types myst be covered here. switch node := stmt.(type) { - case *sqlparser.Union, *sqlparser.Select: + case *sqlparser.Select: + role := tableacl.READER + if _, ok := node.SelectExprs[0].(*sqlparser.Nextval); ok { + role = tableacl.WRITER + } + permissions = buildSubqueryPermissions(node, role, permissions) + case *sqlparser.Union: permissions = buildSubqueryPermissions(node, tableacl.READER, permissions) case *sqlparser.Insert: - permissions = buildTableExprPermissions(node.Table, tableacl.WRITER, permissions) + permissions = buildTableExprPermissions(node.Table, tableacl.WRITER, nil, permissions) permissions = buildSubqueryPermissions(node, tableacl.READER, permissions) case *sqlparser.Update: - permissions = buildTableExprsPermissions(node.TableExprs, tableacl.WRITER, permissions) + permissions = buildTableExprsPermissions(node.TableExprs, tableacl.WRITER, nil, permissions) permissions = buildSubqueryPermissions(node, tableacl.READER, permissions) case *sqlparser.Delete: - permissions = buildTableExprsPermissions(node.TableExprs, tableacl.WRITER, permissions) + permissions = buildTableExprsPermissions(node.TableExprs, tableacl.WRITER, nil, permissions) permissions = buildSubqueryPermissions(node, tableacl.READER, permissions) case sqlparser.DDLStatement: for _, t := range node.AffectedTables() { - permissions = buildTableNamePermissions(t, tableacl.ADMIN, permissions) + permissions = buildTableNamePermissions(t, tableacl.ADMIN, nil, permissions) } case *sqlparser.AlterMigration, @@ -60,10 +66,10 @@ func BuildPermissions(stmt sqlparser.Statement) []Permission { permissions = []Permission{} // TODO(shlomi) what are the correct permissions here? Table is unknown case *sqlparser.Flush: for _, t := range node.TableNames { - permissions = buildTableNamePermissions(t, tableacl.ADMIN, permissions) + permissions = buildTableNamePermissions(t, tableacl.ADMIN, nil, permissions) } case *sqlparser.Analyze: - permissions = buildTableNamePermissions(node.Table, tableacl.WRITER, permissions) + permissions = buildTableNamePermissions(node.Table, tableacl.WRITER, nil, permissions) case *sqlparser.OtherAdmin, *sqlparser.CallProc, *sqlparser.Begin, *sqlparser.Commit, *sqlparser.Rollback, *sqlparser.Load, *sqlparser.Savepoint, *sqlparser.Release, *sqlparser.SRollback, *sqlparser.Set, *sqlparser.Show, sqlparser.Explain, *sqlparser.UnlockTables: @@ -75,43 +81,92 @@ func BuildPermissions(stmt sqlparser.Statement) []Permission { } func buildSubqueryPermissions(stmt sqlparser.Statement, role tableacl.Role, permissions []Permission) []Permission { - _ = sqlparser.Walk(func(node sqlparser.SQLNode) (bool, error) { - if sel, ok := node.(*sqlparser.Select); ok { - permissions = buildTableExprsPermissions(sel.From, role, permissions) + var cteScopes [][]sqlparser.IdentifierCS + sqlparser.Rewrite(stmt, func(cursor *sqlparser.Cursor) bool { + switch node := cursor.Node().(type) { + case *sqlparser.Select: + if node.With != nil { + cteScopes = append(cteScopes, gatherCTEs(node.With)) + } + var ctes []sqlparser.IdentifierCS + for _, cteScope := range cteScopes { + ctes = append(ctes, cteScope...) + } + permissions = buildTableExprsPermissions(node.From, role, ctes, permissions) + case *sqlparser.Delete: + if node.With != nil { + cteScopes = append(cteScopes, gatherCTEs(node.With)) + } + case *sqlparser.Update: + if node.With != nil { + cteScopes = append(cteScopes, gatherCTEs(node.With)) + } + case *sqlparser.Union: + if node.With != nil { + cteScopes = append(cteScopes, gatherCTEs(node.With)) + } + } + return true + }, func(cursor *sqlparser.Cursor) bool { + // When we encounter a With expression coming up, we should remove + // the last value from the cte scopes to ensure we none of the outer + // elements of the query see this table name. + _, isWith := cursor.Node().(*sqlparser.With) + if isWith { + cteScopes = cteScopes[:len(cteScopes)-1] } - return true, nil - }, stmt) + return true + }) return permissions } -func buildTableExprsPermissions(node []sqlparser.TableExpr, role tableacl.Role, permissions []Permission) []Permission { +// gatherCTEs gathers the CTEs from the WITH clause. +func gatherCTEs(with *sqlparser.With) []sqlparser.IdentifierCS { + var ctes []sqlparser.IdentifierCS + for _, cte := range with.CTEs { + ctes = append(ctes, cte.ID) + } + return ctes +} + +func buildTableExprsPermissions(node []sqlparser.TableExpr, role tableacl.Role, ctes []sqlparser.IdentifierCS, permissions []Permission) []Permission { for _, node := range node { - permissions = buildTableExprPermissions(node, role, permissions) + permissions = buildTableExprPermissions(node, role, ctes, permissions) } return permissions } -func buildTableExprPermissions(node sqlparser.TableExpr, role tableacl.Role, permissions []Permission) []Permission { +func buildTableExprPermissions(node sqlparser.TableExpr, role tableacl.Role, ctes []sqlparser.IdentifierCS, permissions []Permission) []Permission { switch node := node.(type) { case *sqlparser.AliasedTableExpr: // An AliasedTableExpr can also be a derived table, but we should skip them here // because the buildSubQueryPermissions walker will catch them and extract // the corresponding table names. if tblName, ok := node.Expr.(sqlparser.TableName); ok { - permissions = buildTableNamePermissions(tblName, role, permissions) + permissions = buildTableNamePermissions(tblName, role, ctes, permissions) } case *sqlparser.ParenTableExpr: - permissions = buildTableExprsPermissions(node.Exprs, role, permissions) + permissions = buildTableExprsPermissions(node.Exprs, role, ctes, permissions) case *sqlparser.JoinTableExpr: - permissions = buildTableExprPermissions(node.LeftExpr, role, permissions) - permissions = buildTableExprPermissions(node.RightExpr, role, permissions) + permissions = buildTableExprPermissions(node.LeftExpr, role, ctes, permissions) + permissions = buildTableExprPermissions(node.RightExpr, role, ctes, permissions) } return permissions } -func buildTableNamePermissions(node sqlparser.TableName, role tableacl.Role, permissions []Permission) []Permission { +func buildTableNamePermissions(node sqlparser.TableName, role tableacl.Role, ctes []sqlparser.IdentifierCS, permissions []Permission) []Permission { + tableName := node.Name.String() + // Check whether this table is a cte or not. + // If the table name is qualified, then it cannot be a cte. + if node.Qualifier.IsEmpty() { + for _, cte := range ctes { + if cte.String() == tableName { + return permissions + } + } + } permissions = append(permissions, Permission{ - TableName: node.Name.String(), + TableName: tableName, Role: role, }) return permissions diff --git a/go/vt/vttablet/tabletserver/planbuilder/permission_test.go b/go/vt/vttablet/tabletserver/planbuilder/permission_test.go index 6d42118cb0b..ab238661664 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/permission_test.go +++ b/go/vt/vttablet/tabletserver/planbuilder/permission_test.go @@ -174,6 +174,51 @@ func TestBuildPermissions(t *testing.T) { }, { TableName: "t1", // derived table in update or delete needs reader permission as they cannot be modified. }}, + }, { + input: "select next 10 values from seq", + output: []Permission{{ + TableName: "seq", + Role: tableacl.WRITER, + }}, + }, { + input: "with t as (select count(*) as a from user) select a from t", + output: []Permission{{ + TableName: "user", + Role: tableacl.READER, + }}, + }, { + input: "with d as (select id, count(*) as a from user) select d.a from music join d on music.user_id = d.id group by 1", + output: []Permission{{ + TableName: "music", + Role: tableacl.READER, + }, { + TableName: "user", + Role: tableacl.READER, + }}, + }, { + input: "WITH t1 AS ( SELECT id FROM t2 ) SELECT * FROM t1 JOIN ks.t1 AS t3", + output: []Permission{{ + TableName: "t1", + Role: tableacl.READER, + }, { + TableName: "t2", + Role: tableacl.READER, + }}, + }, { + input: "WITH RECURSIVE t1 (n) AS ( SELECT id from t2 UNION ALL SELECT n + 1 FROM t1 WHERE n < 5 ) SELECT * FROM t1 JOIN t1 AS t3", + output: []Permission{{ + TableName: "t2", + Role: tableacl.READER, + }}, + }, { + input: "(with t1 as (select count(*) as a from user) select a from t1) union select * from t1", + output: []Permission{{ + TableName: "user", + Role: tableacl.READER, + }, { + TableName: "t1", + Role: tableacl.READER, + }}, }} for _, tcase := range tcases { diff --git a/go/vt/vttablet/tabletserver/planbuilder/plan.go b/go/vt/vttablet/tabletserver/planbuilder/plan.go index 7b1e57c2f90..5dbabcc8763 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/plan.go +++ b/go/vt/vttablet/tabletserver/planbuilder/plan.go @@ -157,7 +157,7 @@ type Plan struct { PlanID PlanType // When the query indicates a single table Table *schema.Table - // SELECT, UPDATE, DELETE statements may list multiple tables + // This indicates all the tables that are accessed in the query. AllTables []*schema.Table // Permissions stores the permissions for the tables accessed in the query. @@ -205,10 +205,7 @@ func (plan *Plan) TableNames() (names []string) { func Build(env *vtenv.Environment, statement sqlparser.Statement, tables map[string]*schema.Table, dbName string, viewsEnabled bool) (plan *Plan, err error) { switch stmt := statement.(type) { case *sqlparser.Union: - plan, err = &Plan{ - PlanID: PlanSelect, - FullQuery: GenerateLimitQuery(stmt), - }, nil + plan = &Plan{PlanID: PlanSelect, FullQuery: GenerateLimitQuery(stmt)} case *sqlparser.Select: plan, err = analyzeSelect(env, stmt, tables) case *sqlparser.Insert: @@ -218,45 +215,51 @@ func Build(env *vtenv.Environment, statement sqlparser.Statement, tables map[str case *sqlparser.Delete: plan, err = analyzeDelete(stmt, tables) case *sqlparser.Set: - plan, err = analyzeSet(stmt), nil + plan = analyzeSet(stmt) case sqlparser.DDLStatement: plan, err = analyzeDDL(stmt) case *sqlparser.AlterMigration: - plan, err = &Plan{PlanID: PlanAlterMigration, FullStmt: stmt}, nil + plan = &Plan{PlanID: PlanAlterMigration, FullStmt: stmt} case *sqlparser.RevertMigration: - plan, err = &Plan{PlanID: PlanRevertMigration, FullStmt: stmt}, nil + plan = &Plan{PlanID: PlanRevertMigration, FullStmt: stmt} case *sqlparser.ShowMigrationLogs: - plan, err = &Plan{PlanID: PlanShowMigrationLogs, FullStmt: stmt}, nil + plan = &Plan{PlanID: PlanShowMigrationLogs, FullStmt: stmt} case *sqlparser.ShowThrottledApps: - plan, err = &Plan{PlanID: PlanShowThrottledApps, FullStmt: stmt}, nil + plan = &Plan{PlanID: PlanShowThrottledApps, FullStmt: stmt} case *sqlparser.ShowThrottlerStatus: - plan, err = &Plan{PlanID: PlanShowThrottlerStatus, FullStmt: stmt}, nil + plan = &Plan{PlanID: PlanShowThrottlerStatus, FullStmt: stmt} case *sqlparser.Show: plan, err = analyzeShow(stmt, dbName) case *sqlparser.Analyze, sqlparser.Explain: - plan, err = &Plan{PlanID: PlanOtherRead}, nil + // Analyze and Explain are treated as read-only queries. + // We send down a string, and get a table result back. + plan = &Plan{ + PlanID: PlanSelect, + FullQuery: GenerateFullQuery(stmt), + } case *sqlparser.OtherAdmin: - plan, err = &Plan{PlanID: PlanOtherAdmin}, nil + plan = &Plan{PlanID: PlanOtherAdmin} case *sqlparser.Savepoint: - plan, err = &Plan{PlanID: PlanSavepoint}, nil + plan = &Plan{PlanID: PlanSavepoint, FullStmt: stmt} case *sqlparser.Release: - plan, err = &Plan{PlanID: PlanRelease}, nil + plan = &Plan{PlanID: PlanRelease} case *sqlparser.SRollback: - plan, err = &Plan{PlanID: PlanSRollback}, nil + plan = &Plan{PlanID: PlanSRollback, FullStmt: stmt} case *sqlparser.Load: - plan, err = &Plan{PlanID: PlanLoad}, nil + plan = &Plan{PlanID: PlanLoad} case *sqlparser.Flush: plan, err = analyzeFlush(stmt, tables) case *sqlparser.UnlockTables: - plan, err = &Plan{PlanID: PlanUnlockTables}, nil + plan = &Plan{PlanID: PlanUnlockTables} case *sqlparser.CallProc: - plan, err = &Plan{PlanID: PlanCallProc, FullQuery: GenerateFullQuery(stmt)}, nil + plan = &Plan{PlanID: PlanCallProc, FullQuery: GenerateFullQuery(stmt)} default: return nil, vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "invalid SQL") } if err != nil { return nil, err } + plan.AllTables = lookupAllTables(statement, tables) plan.Permissions = BuildPermissions(statement) return plan, nil } @@ -274,14 +277,14 @@ func BuildStreaming(statement sqlparser.Statement, tables map[string]*schema.Tab if hasLockFunc(stmt) { plan.NeedsReservedConn = true } - plan.Table, plan.AllTables = lookupTables(stmt.From, tables) + plan.Table = lookupTables(stmt.From, tables) case *sqlparser.Show, *sqlparser.Union, *sqlparser.CallProc, sqlparser.Explain: case *sqlparser.Analyze: plan.PlanID = PlanOtherRead default: return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "%s not allowed for streaming", sqlparser.ASTToStatementType(statement)) } - + plan.AllTables = lookupAllTables(statement, tables) return plan, nil } diff --git a/go/vt/vttablet/tabletserver/planbuilder/testdata/exec_cases.txt b/go/vt/vttablet/tabletserver/planbuilder/testdata/exec_cases.txt index 977b3822050..f549f506ad3 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/testdata/exec_cases.txt +++ b/go/vt/vttablet/tabletserver/planbuilder/testdata/exec_cases.txt @@ -140,7 +140,7 @@ "Permissions": [ { "TableName": "seq", - "Role": 0 + "Role": 1 } ], "NextCount": "1" @@ -154,7 +154,7 @@ "Permissions": [ { "TableName": "seq", - "Role": 0 + "Role": 1 } ], "NextCount": "10" @@ -169,7 +169,7 @@ "Permissions": [ { "TableName": "seq", - "Role": 0 + "Role": 1 } ], "NextCount": ":a" @@ -183,7 +183,7 @@ "Permissions": [ { "TableName": "seq", - "Role": 0 + "Role": 1 } ], "NextCount": "12345667852342342342323423423" @@ -763,14 +763,15 @@ options:PassthroughDMLs # analyze "analyze table a" { - "PlanID": "OtherRead", + "PlanID": "Select", "TableName": "", "Permissions": [ - { - "TableName": "a", - "Role": 1 - } - ] + { + "TableName": "a", + "Role": 1 + } + ], + "FullQuery": "analyze table a" } # show @@ -783,15 +784,17 @@ options:PassthroughDMLs # describe "describe a" { - "PlanID": "OtherRead", - "TableName": "" + "PlanID": "Select", + "TableName": "", + "FullQuery": "explain a" } # explain "explain a" { - "PlanID": "OtherRead", - "TableName": "" + "PlanID": "Select", + "TableName": "", + "FullQuery": "explain a" } # repair diff --git a/go/vt/vttablet/tabletserver/production.go b/go/vt/vttablet/tabletserver/production.go new file mode 100644 index 00000000000..e0d8cb4fd66 --- /dev/null +++ b/go/vt/vttablet/tabletserver/production.go @@ -0,0 +1,38 @@ +//go:build !debug2PC + +/* +Copyright 2024 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 tabletserver + +import ( + "context" +) + +// This file defines debug constants that are always false. +// This file is used for building production code. +// We use go build directives to include a file that defines the constant to true +// when certain tags are provided while building binaries. +// This allows to have debugging code written in normal code flow without affecting +// production performance. + +const DebugTwoPc = false + +func commitPreparedDelayForTest(tsv *TabletServer) {} + +func checkTestFailure(context.Context, string) error { + return nil +} diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index 86269050418..abf296c0583 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -29,12 +29,14 @@ import ( "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/pools/smartconnpool" - "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/callerid" "vitess.io/vitess/go/vt/callinfo" "vitess.io/vitess/go/vt/log" + querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/tableacl" @@ -45,10 +47,7 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/rules" eschema "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" - - querypb "vitess.io/vitess/go/vt/proto/query" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" ) // QueryExecutor is used for executing a query request. @@ -168,9 +167,15 @@ func (qre *QueryExecutor) Execute() (reply *sqltypes.Result, err error) { } defer conn.Unlock() if qre.setting != nil { - if err = conn.ApplySetting(qre.ctx, qre.setting); err != nil { + applied, err := conn.ApplySetting(qre.ctx, qre.setting) + if err != nil { return nil, vterrors.Wrap(err, "failed to execute system setting on the connection") } + // If we have applied the settings on the connection, then we should record the query detail. + // This is required for redoing the transaction in case of a failure. + if applied { + conn.TxProperties().RecordQueryDetail(qre.setting.ApplyQuery(), nil) + } } return qre.txConnExec(conn) } @@ -192,8 +197,10 @@ func (qre *QueryExecutor) Execute() (reply *sqltypes.Result, err error) { return qr, nil case p.PlanOtherRead, p.PlanOtherAdmin, p.PlanFlush, p.PlanSavepoint, p.PlanRelease, p.PlanSRollback: return qre.execOther() - case p.PlanInsert, p.PlanUpdate, p.PlanDelete, p.PlanInsertMessage, p.PlanDDL, p.PlanLoad: + case p.PlanInsert, p.PlanUpdate, p.PlanDelete, p.PlanInsertMessage, p.PlanLoad: return qre.execAutocommit(qre.txConnExec) + case p.PlanDDL: + return qre.execDDL(nil) case p.PlanUpdateLimit, p.PlanDeleteLimit: return qre.execAsTransaction(qre.txConnExec) case p.PlanCallProc: @@ -203,7 +210,7 @@ func (qre *QueryExecutor) Execute() (reply *sqltypes.Result, err error) { case p.PlanRevertMigration: return qre.execRevertMigration() case p.PlanShowMigrations: - return qre.execShowMigrations() + return qre.execShowMigrations(nil) case p.PlanShowMigrationLogs: return qre.execShowMigrationLogs() case p.PlanShowThrottledApps: @@ -234,7 +241,7 @@ func (qre *QueryExecutor) execAutocommit(f func(conn *StatefulConnection) (*sqlt return nil, errTxThrottled } - conn, _, _, err := qre.tsv.te.txPool.Begin(qre.ctx, qre.options, false, 0, nil, qre.setting) + conn, _, _, err := qre.tsv.te.txPool.Begin(qre.ctx, qre.options, false, 0, qre.setting) if err != nil { return nil, err @@ -248,7 +255,7 @@ func (qre *QueryExecutor) execAsTransaction(f func(conn *StatefulConnection) (*s if qre.tsv.txThrottler.Throttle(qre.tsv.getPriorityFromOptions(qre.options), qre.options.GetWorkloadName()) { return nil, errTxThrottled } - conn, beginSQL, _, err := qre.tsv.te.txPool.Begin(qre.ctx, qre.options, false, 0, nil, qre.setting) + conn, beginSQL, _, err := qre.tsv.te.txPool.Begin(qre.ctx, qre.options, false, 0, qre.setting) if err != nil { return nil, err } @@ -277,8 +284,10 @@ func (qre *QueryExecutor) execAsTransaction(f func(conn *StatefulConnection) (*s func (qre *QueryExecutor) txConnExec(conn *StatefulConnection) (*sqltypes.Result, error) { switch qre.plan.PlanID { - case p.PlanInsert, p.PlanUpdate, p.PlanDelete, p.PlanSet: + case p.PlanInsert, p.PlanUpdate, p.PlanDelete: return qre.txFetch(conn, true) + case p.PlanSet: + return qre.txFetch(conn, false) case p.PlanInsertMessage: qre.bindVars["#time_now"] = sqltypes.Int64BindVariable(time.Now().UnixNano()) return qre.txFetch(conn, true) @@ -286,8 +295,12 @@ func (qre *QueryExecutor) txConnExec(conn *StatefulConnection) (*sqltypes.Result return qre.execDMLLimit(conn) case p.PlanOtherRead, p.PlanOtherAdmin, p.PlanFlush, p.PlanUnlockTables: return qre.execStatefulConn(conn, qre.query, true) - case p.PlanSavepoint, p.PlanRelease, p.PlanSRollback: - return qre.execStatefulConn(conn, qre.query, true) + case p.PlanSavepoint: + return qre.execSavepointQuery(conn, qre.query, qre.plan.FullStmt) + case p.PlanSRollback: + return qre.execRollbackToSavepoint(conn, qre.query, qre.plan.FullStmt) + case p.PlanRelease: + return qre.execTxQuery(conn, qre.query, false) case p.PlanSelect, p.PlanSelectImpossible, p.PlanShow, p.PlanSelectLockFunc: maxrows := qre.getSelectLimit() qre.bindVars["#maxLimit"] = sqltypes.Int64BindVariable(maxrows + 1) @@ -308,6 +321,8 @@ func (qre *QueryExecutor) txConnExec(conn *StatefulConnection) (*sqltypes.Result return qre.execLoad(conn) case p.PlanCallProc: return qre.execProc(conn) + case p.PlanShowMigrations: + return qre.execShowMigrations(conn) } return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "[BUG] %s unexpected plan type", qre.plan.PlanID.String()) } @@ -375,7 +390,7 @@ func (qre *QueryExecutor) Stream(callback StreamCallback) error { } defer txConn.Unlock() if qre.setting != nil { - if err = txConn.ApplySetting(qre.ctx, qre.setting); err != nil { + if _, err = txConn.ApplySetting(qre.ctx, qre.setting); err != nil { return vterrors.Wrap(err, "failed to execute system setting on the connection") } } @@ -536,7 +551,7 @@ func (qre *QueryExecutor) checkAccess(authorized *tableacl.ACLResult, tableName return nil } -func (qre *QueryExecutor) execDDL(conn *StatefulConnection) (*sqltypes.Result, error) { +func (qre *QueryExecutor) execDDL(conn *StatefulConnection) (result *sqltypes.Result, err error) { // Let's see if this is a normal DDL statement or an Online DDL statement. // An Online DDL statement is identified by /*vt+ .. */ comment with expected directives, like uuid etc. if onlineDDL, err := schema.OnlineDDLFromCommentedStatement(qre.plan.FullStmt); err == nil { @@ -547,6 +562,21 @@ func (qre *QueryExecutor) execDDL(conn *StatefulConnection) (*sqltypes.Result, e } } + if conn == nil { + conn, err = qre.tsv.te.txPool.createConn(qre.ctx, qre.options, qre.setting) + if err != nil { + return nil, err + } + defer conn.Release(tx.ConnRelease) + } + + // A DDL statement should commit the current transaction in the VTGate. + // The change was made in PR: https://github.com/vitessio/vitess/pull/14110 in v18. + // DDL statement received by vttablet will be outside of a transaction. + if conn.txProps != nil { + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "DDL statement executed inside a transaction") + } + isTemporaryTable := false if ddlStmt, ok := qre.plan.FullStmt.(sqlparser.DDLStatement); ok { isTemporaryTable = ddlStmt.IsTemporary() @@ -578,19 +608,7 @@ func (qre *QueryExecutor) execDDL(conn *StatefulConnection) (*sqltypes.Result, e return nil, err } } - result, err := qre.execStatefulConn(conn, sql, true) - if err != nil { - return nil, err - } - // Only perform this operation when the connection has transaction open. - // TODO: This actually does not retain the old transaction. We should see how to provide correct behaviour to client. - if conn.txProps != nil { - err = qre.BeginAgain(qre.ctx, conn) - if err != nil { - return nil, err - } - } - return result, nil + return qre.execStatefulConn(conn, sql, true) } func (qre *QueryExecutor) execLoad(conn *StatefulConnection) (*sqltypes.Result, error) { @@ -601,20 +619,6 @@ func (qre *QueryExecutor) execLoad(conn *StatefulConnection) (*sqltypes.Result, return result, nil } -// BeginAgain commits the existing transaction and begins a new one -func (*QueryExecutor) BeginAgain(ctx context.Context, dc *StatefulConnection) error { - if dc.IsClosed() || dc.TxProperties().Autocommit { - return nil - } - if _, err := dc.Exec(ctx, "commit", 1, false); err != nil { - return err - } - if _, err := dc.Exec(ctx, "begin", 1, false); err != nil { - return err - } - return nil -} - func (qre *QueryExecutor) execNextval() (*sqltypes.Result, error) { env := evalengine.NewExpressionEnv(qre.ctx, qre.bindVars, evalengine.NewEmptyVCursor(qre.tsv.Environment(), time.Local)) result, err := env.Evaluate(qre.plan.NextCount) @@ -668,7 +672,6 @@ func (qre *QueryExecutor) execNextval() (*sqltypes.Result, error) { newLast += cache } query = fmt.Sprintf("update %s set next_id = %d where id = 0", sqlparser.String(tableName), newLast) - conn.TxProperties().RecordQuery(query) _, err = qre.execStatefulConn(conn, query, false) if err != nil { return nil, err @@ -799,17 +802,56 @@ func (qre *QueryExecutor) txFetch(conn *StatefulConnection, record bool) (*sqlty if err != nil { return nil, err } + return qre.execTxQuery(conn, sql, record) +} + +// execTxQuery executes the query provided and record in Tx Property if record is true. +func (qre *QueryExecutor) execTxQuery(conn *StatefulConnection, sql string, record bool) (*sqltypes.Result, error) { qr, err := qre.execStatefulConn(conn, sql, true) if err != nil { return nil, err } // Only record successful queries. if record { - conn.TxProperties().RecordQuery(sql) + conn.TxProperties().RecordQueryDetail(sql, qre.plan.TableNames()) } return qr, nil } +// execTxQuery executes the query provided and record in Tx Property if record is true. +func (qre *QueryExecutor) execSavepointQuery(conn *StatefulConnection, sql string, ast sqlparser.Statement) (*sqltypes.Result, error) { + qr, err := qre.execStatefulConn(conn, sql, true) + if err != nil { + return nil, err + } + + // Only record successful queries. + sp, ok := ast.(*sqlparser.Savepoint) + if !ok { + return nil, vterrors.VT13001("expected to get a savepoint statement") + } + conn.TxProperties().RecordSavePointDetail(sp.Name.String()) + + return qr, nil +} + +// execTxQuery executes the query provided and record in Tx Property if record is true. +func (qre *QueryExecutor) execRollbackToSavepoint(conn *StatefulConnection, sql string, ast sqlparser.Statement) (*sqltypes.Result, error) { + qr, err := qre.execStatefulConn(conn, sql, true) + if err != nil { + return nil, err + } + + // Only record successful queries. + sp, ok := ast.(*sqlparser.SRollback) + if !ok { + return nil, vterrors.VT13001("expected to get a rollback statement") + } + + _ = conn.TxProperties().RollbackToSavepoint(sp.Name.String()) + return qr, nil +} + func (qre *QueryExecutor) generateFinalSQL(parsedQuery *sqlparser.ParsedQuery, bindVars map[string]*querypb.BindVariable) (string, string, error) { query, err := parsedQuery.GenerateQuery(bindVars, nil) if err != nil { @@ -923,6 +965,8 @@ func (qre *QueryExecutor) execAlterMigration() (*sqltypes.Result, error) { return qre.tsv.onlineDDLExecutor.RetryMigration(qre.ctx, alterMigration.UUID) case sqlparser.CleanupMigrationType: return qre.tsv.onlineDDLExecutor.CleanupMigration(qre.ctx, alterMigration.UUID) + case sqlparser.CleanupAllMigrationType: + return qre.tsv.onlineDDLExecutor.CleanupAllMigrations(qre.ctx) case sqlparser.LaunchMigrationType: return qre.tsv.onlineDDLExecutor.LaunchMigration(qre.ctx, alterMigration.UUID, alterMigration.Shards) case sqlparser.LaunchAllMigrationType: @@ -958,7 +1002,7 @@ func (qre *QueryExecutor) execRevertMigration() (*sqltypes.Result, error) { return qre.tsv.onlineDDLExecutor.SubmitMigration(qre.ctx, qre.plan.FullStmt) } -func (qre *QueryExecutor) execShowMigrations() (*sqltypes.Result, error) { +func (qre *QueryExecutor) execShowMigrations(conn *StatefulConnection) (*sqltypes.Result, error) { if showStmt, ok := qre.plan.FullStmt.(*sqlparser.Show); ok { return qre.tsv.onlineDDLExecutor.ShowMigrations(qre.ctx, showStmt) } diff --git a/go/vt/vttablet/tabletserver/query_executor_test.go b/go/vt/vttablet/tabletserver/query_executor_test.go index 771d9e3479d..78daad2e616 100644 --- a/go/vt/vttablet/tabletserver/query_executor_test.go +++ b/go/vt/vttablet/tabletserver/query_executor_test.go @@ -87,7 +87,8 @@ func TestQueryExecutorPlans(t *testing.T) { // If empty, then we should expect the same as logWant. inTxWant string // errorWant is the error we expect to get, if any, and should be nil if no error should be returned - errorWant error + errorWant string + onlyInTxErr bool // TxThrottler allows the test case to override the transaction throttler txThrottler txthrottler.TxThrottler }{{ @@ -196,9 +197,11 @@ func TestQueryExecutorPlans(t *testing.T) { query: "alter table test_table add column zipcode int", result: dmlResult, }}, - resultWant: dmlResult, - planWant: "DDL", - logWant: "alter table test_table add column zipcode int", + resultWant: dmlResult, + planWant: "DDL", + logWant: "alter table test_table add column zipcode int", + onlyInTxErr: true, + errorWant: "DDL statement executed inside a transaction", }, { input: "savepoint a", dbResponses: []dbResponse{{ @@ -215,20 +218,24 @@ func TestQueryExecutorPlans(t *testing.T) { query: "alter table `user` add key a (id)", result: emptyResult, }}, - resultWant: emptyResult, - planWant: "DDL", - logWant: "alter table `user` add key a (id)", - inTxWant: "alter table `user` add key a (id)", + resultWant: emptyResult, + planWant: "DDL", + logWant: "alter table `user` add key a (id)", + inTxWant: "alter table `user` add key a (id)", + onlyInTxErr: true, + errorWant: "DDL statement executed inside a transaction", }, { input: "create index a on user(id1 + id2)", dbResponses: []dbResponse{{ query: "create index a on user(id1 + id2)", result: emptyResult, }}, - resultWant: emptyResult, - planWant: "DDL", - logWant: "create index a on user(id1 + id2)", - inTxWant: "create index a on user(id1 + id2)", + resultWant: emptyResult, + planWant: "DDL", + logWant: "create index a on user(id1 + id2)", + inTxWant: "create index a on user(id1 + id2)", + onlyInTxErr: true, + errorWant: "DDL statement executed inside a transaction", }, { input: "ROLLBACK work to SAVEPOINT a", dbResponses: []dbResponse{{ @@ -282,7 +289,7 @@ func TestQueryExecutorPlans(t *testing.T) { query: "update test_table set a = 1 limit 10001", result: dmlResult, }}, - errorWant: errTxThrottled, + errorWant: "Transaction throttled", txThrottler: &mockTxThrottler{true}, }, { input: "update test_table set a=1", @@ -291,7 +298,7 @@ func TestQueryExecutorPlans(t *testing.T) { query: "update test_table set a = 1 limit 10001", result: dmlResult, }}, - errorWant: errTxThrottled, + errorWant: "Transaction throttled", txThrottler: &mockTxThrottler{true}, }, } @@ -315,13 +322,13 @@ func TestQueryExecutorPlans(t *testing.T) { // Test outside a transaction. qre := newTestQueryExecutor(ctx, tsv, tcase.input, 0) got, err := qre.Execute() - if tcase.errorWant == nil { + if tcase.errorWant != "" && !tcase.onlyInTxErr { + assert.EqualError(t, err, tcase.errorWant) + } else { require.NoError(t, err, tcase.input) assert.Equal(t, tcase.resultWant, got, tcase.input) assert.Equal(t, tcase.planWant, qre.logStats.PlanType, tcase.input) assert.Equal(t, tcase.logWant, qre.logStats.RewrittenSQL(), tcase.input) - } else { - assert.True(t, vterrors.Equals(err, tcase.errorWant)) } // Wait for the existing query to be processed by the cache time.Sleep(100 * time.Millisecond) @@ -329,25 +336,29 @@ func TestQueryExecutorPlans(t *testing.T) { // Test inside a transaction. target := tsv.sm.Target() state, err := tsv.Begin(ctx, target, nil) - if tcase.errorWant == nil { - require.NoError(t, err) - require.NotNil(t, state.TabletAlias, "alias should not be nil") - assert.Equal(t, tsv.alias, state.TabletAlias, "Wrong alias returned by Begin") - defer tsv.Commit(ctx, target, state.TransactionID) - - qre = newTestQueryExecutor(ctx, tsv, tcase.input, state.TransactionID) - got, err = qre.Execute() - require.NoError(t, err, tcase.input) - assert.Equal(t, tcase.resultWant, got, "in tx: %v", tcase.input) - assert.Equal(t, tcase.planWant, qre.logStats.PlanType, "in tx: %v", tcase.input) - want := tcase.logWant - if tcase.inTxWant != "" { - want = tcase.inTxWant - } - assert.Equal(t, want, qre.logStats.RewrittenSQL(), "in tx: %v", tcase.input) - } else { - assert.True(t, vterrors.Equals(err, tcase.errorWant)) + if tcase.errorWant != "" && !tcase.onlyInTxErr { + require.EqualError(t, err, tcase.errorWant) + return } + require.NoError(t, err) + require.NotNil(t, state.TabletAlias, "alias should not be nil") + assert.Equal(t, tsv.alias, state.TabletAlias, "Wrong alias returned by Begin") + defer tsv.Commit(ctx, target, state.TransactionID) + + qre = newTestQueryExecutor(ctx, tsv, tcase.input, state.TransactionID) + got, err = qre.Execute() + if tcase.onlyInTxErr { + require.EqualError(t, err, tcase.errorWant) + return + } + require.NoError(t, err, tcase.input) + assert.Equal(t, tcase.resultWant, got, "in tx: %v", tcase.input) + assert.Equal(t, tcase.planWant, qre.logStats.PlanType, "in tx: %v", tcase.input) + want := tcase.logWant + if tcase.inTxWant != "" { + want = tcase.inTxWant + } + assert.Equal(t, want, qre.logStats.RewrittenSQL(), "in tx: %v", tcase.input) }) } } @@ -1532,9 +1543,6 @@ func newTestTabletServer(ctx context.Context, flags executorFlags, db *fakesqldb tsv := NewTabletServer(ctx, vtenv.NewTestEnv(), "TabletServerTest", cfg, memorytopo.NewServer(ctx, ""), &topodatapb.TabletAlias{}, srvTopoCounts) target := &querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} err := tsv.StartService(target, dbconfigs, nil /* mysqld */) - if cfg.TwoPCEnable { - tsv.TwoPCEngineWait() - } if err != nil { panic(err) } diff --git a/go/vt/vttablet/tabletserver/schema/cached_size.go b/go/vt/vttablet/tabletserver/schema/cached_size.go index 8ca75534a62..4db9f313644 100644 --- a/go/vt/vttablet/tabletserver/schema/cached_size.go +++ b/go/vt/vttablet/tabletserver/schema/cached_size.go @@ -25,7 +25,7 @@ func (cached *MessageInfo) CachedSize(alloc bool) int64 { } size := int64(0) if alloc { - size += int64(80) + size += int64(96) } // field Fields []*vitess.io/vitess/go/vt/proto/query.Field { diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index 5babed271ca..afb28080167 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -40,6 +40,7 @@ import ( "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/dbconnpool" "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/tmutils" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/servenv" @@ -85,9 +86,10 @@ type Engine struct { historian *historian - conns *connpool.Pool - ticks *timer.Timer - reloadTimeout time.Duration + conns *connpool.Pool + ticks *timer.Timer + reloadTimeout time.Duration + throttledLogger *logutil.ThrottledLogger // dbCreationFailed is for preventing log spam. dbCreationFailed bool @@ -109,7 +111,8 @@ func NewEngine(env tabletenv.Env) *Engine { Size: 3, IdleTimeout: env.Config().OltpReadPool.IdleTimeout, }), - ticks: timer.NewTimer(reloadTime), + ticks: timer.NewTimer(reloadTime), + throttledLogger: logutil.NewThrottledLogger("schema-tracker", 1*time.Minute), } se.schemaCopy = env.Config().SignalWhenSchemaChange _ = env.Exporter().NewGaugeDurationFunc("SchemaReloadTime", "vttablet keeps table schemas in its own memory and periodically refreshes it from MySQL. This config controls the reload time.", se.ticks.Interval) @@ -177,14 +180,15 @@ func (se *Engine) syncSidecarDB(ctx context.Context, conn *dbconnpool.DBConnecti // EnsureConnectionAndDB ensures that we can connect to mysql. // If tablet type is primary and there is no db, then the database is created. // This function can be called before opening the Engine. -func (se *Engine) EnsureConnectionAndDB(tabletType topodatapb.TabletType) error { +func (se *Engine) EnsureConnectionAndDB(tabletType topodatapb.TabletType, serving bool) error { ctx := tabletenv.LocalContext() // We use AllPrivs since syncSidecarDB() might need to upgrade the schema conn, err := dbconnpool.NewDBConnection(ctx, se.env.Config().DB.AllPrivsWithDB()) if err == nil { se.dbCreationFailed = false // upgrade sidecar db if required, for a tablet with an existing database - if tabletType == topodatapb.TabletType_PRIMARY { + // only run DDL updates when a PRIMARY is transitioning to serving state. + if tabletType == topodatapb.TabletType_PRIMARY && serving { if err := se.syncSidecarDB(ctx, conn); err != nil { conn.Close() return err @@ -193,7 +197,7 @@ func (se *Engine) EnsureConnectionAndDB(tabletType topodatapb.TabletType) error conn.Close() return nil } - if tabletType != topodatapb.TabletType_PRIMARY { + if tabletType != topodatapb.TabletType_PRIMARY || !serving { return err } if merr, isSQLErr := err.(*sqlerror.SQLError); !isSQLErr || merr.Num != sqlerror.ERBadDb { @@ -448,7 +452,7 @@ func (se *Engine) reload(ctx context.Context, includeStats bool) error { udfsChanged, err := getChangedUserDefinedFunctions(ctx, conn.Conn, shouldUseDatabase) if err != nil { - return err + se.throttledLogger.Errorf("error in getting changed UDFs: %v", err) } rec := concurrency.AllErrorRecorder{} diff --git a/go/vt/vttablet/tabletserver/schema/engine_test.go b/go/vt/vttablet/tabletserver/schema/engine_test.go index d4271dee876..caaf505779d 100644 --- a/go/vt/vttablet/tabletserver/schema/engine_test.go +++ b/go/vt/vttablet/tabletserver/schema/engine_test.go @@ -42,6 +42,7 @@ import ( "vitess.io/vitess/go/stats" "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/dbconfigs" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtenv" "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" @@ -95,6 +96,19 @@ func TestOpenAndReload(t *testing.T) { assert.Equal(t, int64(0), se.tableFileSizeGauge.Counts()["msg"]) assert.Equal(t, int64(0), se.tableAllocatedSizeGauge.Counts()["msg"]) + t.Run("EnsureConnectionAndDB", func(t *testing.T) { + // Verify that none of the following configurations run any schema change detection queries - + // 1. REPLICA serving + // 2. REPLICA non-serving + // 3. PRIMARY serving + err := se.EnsureConnectionAndDB(topodatapb.TabletType_REPLICA, true) + require.NoError(t, err) + err = se.EnsureConnectionAndDB(topodatapb.TabletType_PRIMARY, false) + require.NoError(t, err) + err = se.EnsureConnectionAndDB(topodatapb.TabletType_REPLICA, false) + require.NoError(t, err) + }) + // Advance time some more. db.AddQuery("select unix_timestamp()", sqltypes.MakeTestResult(sqltypes.MakeTestFields( "t", @@ -467,7 +481,7 @@ func TestOpenFailedDueToExecErr(t *testing.T) { defer db.Close() schematest.AddDefaultQueries(db) want := "injected error" - db.AddRejectedQuery(mysql.BaseShowTables, fmt.Errorf(want)) + db.AddRejectedQuery(mysql.BaseShowTables, errors.New(want)) se := newEngine(1*time.Second, 1*time.Second, 0, db) err := se.Open() if err == nil || !strings.Contains(err.Error(), want) { @@ -626,8 +640,10 @@ func newEngine(reloadTime time.Duration, idleTimeout time.Duration, schemaMaxAge cfg.OlapReadPool.IdleTimeout = idleTimeout cfg.TxPool.IdleTimeout = idleTimeout cfg.SchemaVersionMaxAgeSeconds = schemaMaxAgeSeconds + dbConfigs := newDBConfigs(db) + cfg.DB = dbConfigs se := NewEngine(tabletenv.NewEnv(vtenv.NewTestEnv(), cfg, "SchemaTest")) - se.InitDBConfig(newDBConfigs(db).DbaWithDB()) + se.InitDBConfig(dbConfigs.DbaWithDB()) return se } @@ -737,6 +753,7 @@ func initialSchema() map[string]*Table { BatchSize: 1, CacheSize: 10, PollInterval: 30 * time.Second, + IDType: sqltypes.Int64, }, }, } @@ -1331,7 +1348,8 @@ func TestEngineReload(t *testing.T) { } // adding query pattern for udfs - db.AddQueryPattern("SELECT name.*", &sqltypes.Result{}) + udfQueryPattern := "SELECT name.*" + db.AddQueryPattern(udfQueryPattern, &sqltypes.Result{}) // Verify the list of created, altered and dropped tables seen. se.RegisterNotifier("test", func(full map[string]*Table, created, altered, dropped []*Table, _ bool) { @@ -1344,6 +1362,16 @@ func TestEngineReload(t *testing.T) { err = se.reload(context.Background(), false) require.NoError(t, err) require.NoError(t, db.LastError()) + require.Zero(t, se.throttledLogger.GetLastLogTime()) + + // Now if we remove the query pattern for udfs, schema engine shouldn't fail. + // Instead we should see a log message with the error. + db.RemoveQueryPattern(udfQueryPattern) + se.UnregisterNotifier("test") + err = se.reload(context.Background(), false) + require.NoError(t, err) + // Check for the udf error being logged. The last log time should be less than a second. + require.Less(t, time.Since(se.throttledLogger.GetLastLogTime()), 1*time.Second) } // TestEngineReload tests the vreplication specific GetTableForPos function to ensure diff --git a/go/vt/vttablet/tabletserver/schema/load_table.go b/go/vt/vttablet/tabletserver/schema/load_table.go index 6022f8724eb..2a2be33a208 100644 --- a/go/vt/vttablet/tabletserver/schema/load_table.go +++ b/go/vt/vttablet/tabletserver/schema/load_table.go @@ -157,6 +157,14 @@ func loadMessageInfo(ta *Table, comment string, collationEnv *collations.Environ ta.MessageInfo.Fields = getDefaultMessageFields(ta.Fields, hiddenCols) } + ta.MessageInfo.IDType = sqltypes.VarBinary + for _, field := range ta.MessageInfo.Fields { + if field.Name == "id" { + ta.MessageInfo.IDType = field.Type + break + } + } + return nil } diff --git a/go/vt/vttablet/tabletserver/schema/load_table_test.go b/go/vt/vttablet/tabletserver/schema/load_table_test.go index 6416e2e306e..e451624c0d7 100644 --- a/go/vt/vttablet/tabletserver/schema/load_table_test.go +++ b/go/vt/vttablet/tabletserver/schema/load_table_test.go @@ -149,6 +149,7 @@ func TestLoadTableMessage(t *testing.T) { BatchSize: 1, CacheSize: 10, PollInterval: 30 * time.Second, + IDType: sqltypes.Int64, }, } assert.Equal(t, want, table) diff --git a/go/vt/vttablet/tabletserver/schema/schema.go b/go/vt/vttablet/tabletserver/schema/schema.go index 4b3d9c88fb5..e800477da3b 100644 --- a/go/vt/vttablet/tabletserver/schema/schema.go +++ b/go/vt/vttablet/tabletserver/schema/schema.go @@ -20,6 +20,7 @@ import ( "sync" "time" + "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/sqlparser" @@ -125,6 +126,9 @@ type MessageInfo struct { // MaxBackoff specifies the longest duration message manager // should wait before rescheduling a message MaxBackoff time.Duration + + // IDType specifies the type of the ID column + IDType sqltypes.Type } // NewTable creates a new Table. diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index 8db202efa13..252a81f3493 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -39,7 +39,8 @@ import ( // VStreamer defines the functions of VStreamer // that the replicationWatcher needs. type VStreamer interface { - Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error) error + Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, + throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error, options *binlogdatapb.VStreamOptions) error } // Tracker watches the replication and saves the latest schema into the schema_version table when a DDL is encountered. @@ -144,7 +145,7 @@ func (tr *Tracker) process(ctx context.Context) { } } return nil - }) + }, nil) select { case <-ctx.Done(): return diff --git a/go/vt/vttablet/tabletserver/schema/tracker_test.go b/go/vt/vttablet/tabletserver/schema/tracker_test.go index 32f68597779..0e7444b39b9 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker_test.go +++ b/go/vt/vttablet/tabletserver/schema/tracker_test.go @@ -139,7 +139,8 @@ type fakeVstreamer struct { events [][]*binlogdatapb.VEvent } -func (f *fakeVstreamer) Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error) error { +func (f *fakeVstreamer) Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, + filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error, options *binlogdatapb.VStreamOptions) error { for _, events := range f.events { err := send(events) if err != nil { diff --git a/go/vt/vttablet/tabletserver/state_manager.go b/go/vt/vttablet/tabletserver/state_manager.go index 308f9165ba6..cae6a237dc8 100644 --- a/go/vt/vttablet/tabletserver/state_manager.go +++ b/go/vt/vttablet/tabletserver/state_manager.go @@ -140,7 +140,7 @@ type stateManager struct { type ( schemaEngine interface { - EnsureConnectionAndDB(topodatapb.TabletType) error + EnsureConnectionAndDB(topodatapb.TabletType, bool) error Open() error MakeNonPrimary() MakePrimary(bool) @@ -164,6 +164,7 @@ type ( AcceptReadWrite() AcceptReadOnly() Close() + RollbackPrepared() } subComponent interface { @@ -446,7 +447,7 @@ func (sm *stateManager) verifyTargetLocked(ctx context.Context, target *querypb. func (sm *stateManager) servePrimary() error { sm.watcher.Close() - if err := sm.connect(topodatapb.TabletType_PRIMARY); err != nil { + if err := sm.connect(topodatapb.TabletType_PRIMARY, true); err != nil { return err } @@ -475,7 +476,7 @@ func (sm *stateManager) unservePrimary() error { sm.watcher.Close() - if err := sm.connect(topodatapb.TabletType_PRIMARY); err != nil { + if err := sm.connect(topodatapb.TabletType_PRIMARY, false); err != nil { return err } @@ -499,7 +500,7 @@ func (sm *stateManager) serveNonPrimary(wantTabletType topodatapb.TabletType) er sm.se.MakeNonPrimary() sm.hs.MakeNonPrimary() - if err := sm.connect(wantTabletType); err != nil { + if err := sm.connect(wantTabletType, true); err != nil { return err } @@ -517,7 +518,7 @@ func (sm *stateManager) unserveNonPrimary(wantTabletType topodatapb.TabletType) sm.se.MakeNonPrimary() sm.hs.MakeNonPrimary() - if err := sm.connect(wantTabletType); err != nil { + if err := sm.connect(wantTabletType, false); err != nil { return err } @@ -527,8 +528,8 @@ func (sm *stateManager) unserveNonPrimary(wantTabletType topodatapb.TabletType) return nil } -func (sm *stateManager) connect(tabletType topodatapb.TabletType) error { - if err := sm.se.EnsureConnectionAndDB(tabletType); err != nil { +func (sm *stateManager) connect(tabletType topodatapb.TabletType, serving bool) error { + if err := sm.se.EnsureConnectionAndDB(tabletType, serving); err != nil { return err } if err := sm.se.Open(); err != nil { @@ -610,6 +611,12 @@ func (sm *stateManager) terminateAllQueries(wg *sync.WaitGroup) (cancel func()) log.Infof("Killed all stateless OLTP queries.") sm.statefulql.TerminateAll() log.Infof("Killed all OLTP queries.") + // We can rollback prepared transactions only after we have killed all the write queries in progress. + // This is essential because when we rollback a prepared transaction, it lets go of the locks it was holding. + // If there were some other conflicting write in progress that hadn't been killed, then it could potentially go through + // and cause data corruption since we won't be able to prepare the transaction again. + sm.te.RollbackPrepared() + log.Infof("Rollbacked all prepared transactions") }() return cancel } diff --git a/go/vt/vttablet/tabletserver/state_manager_test.go b/go/vt/vttablet/tabletserver/state_manager_test.go index 02896eeefe0..df819c6f05c 100644 --- a/go/vt/vttablet/tabletserver/state_manager_test.go +++ b/go/vt/vttablet/tabletserver/state_manager_test.go @@ -379,6 +379,9 @@ func (te *delayedTxEngine) Close() { time.Sleep(50 * time.Millisecond) } +func (te *delayedTxEngine) RollbackPrepared() { +} + type killableConn struct { id int64 killed atomic.Bool @@ -806,7 +809,7 @@ type testSchemaEngine struct { failMySQL bool } -func (te *testSchemaEngine) EnsureConnectionAndDB(tabletType topodatapb.TabletType) error { +func (te *testSchemaEngine) EnsureConnectionAndDB(topodatapb.TabletType, bool) error { if te.failMySQL { te.failMySQL = false return errors.New("intentional error") @@ -903,6 +906,8 @@ func (te *testTxEngine) Close() { te.state = testStateClosed } +func (te *testTxEngine) RollbackPrepared() {} + type testSubcomponent struct { testOrderState } diff --git a/go/vt/vttablet/tabletserver/stateful_connection.go b/go/vt/vttablet/tabletserver/stateful_connection.go index 067f2194655..10fc763984f 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection.go +++ b/go/vt/vttablet/tabletserver/stateful_connection.go @@ -150,7 +150,7 @@ func (sc *StatefulConnection) unlock(updateTime bool) { return } if sc.dbConn.Conn.IsClosed() { - sc.Releasef("unlocked closed connection") + sc.ReleaseString("unlocked closed connection") } else { sc.pool.markAsNotInUse(sc, updateTime) } @@ -159,16 +159,24 @@ func (sc *StatefulConnection) unlock(updateTime bool) { // Release is used when the connection will not be used ever again. // The underlying dbConn is removed so that this connection cannot be used by mistake. func (sc *StatefulConnection) Release(reason tx.ReleaseReason) { - sc.Releasef(reason.String()) + sc.ReleaseString(reason.String()) } // Releasef is used when the connection will not be used ever again. // The underlying dbConn is removed so that this connection cannot be used by mistake. func (sc *StatefulConnection) Releasef(reasonFormat string, a ...any) { + sc.ReleaseString(fmt.Sprintf(reasonFormat, a...)) +} + +// ReleaseString is used when the connection will not be used ever again. +// The underlying dbConn is removed so that this connection cannot be used by mistake. +func (sc *StatefulConnection) ReleaseString(reason string) { if sc.dbConn == nil { return } - sc.pool.unregister(sc.ConnID, fmt.Sprintf(reasonFormat, a...)) + if sc.pool != nil { + sc.pool.unregister(sc.ConnID, reason) + } sc.dbConn.Recycle() sc.dbConn = nil sc.logReservedConn() @@ -264,7 +272,7 @@ func (sc *StatefulConnection) IsTainted() bool { // LogTransaction logs transaction related stats func (sc *StatefulConnection) LogTransaction(reason tx.ReleaseReason) { if sc.txProps == nil { - return //Nothing to log as no transaction exists on this connection. + return // Nothing to log as no transaction exists on this connection. } sc.txProps.Conclusion = reason.Name() sc.txProps.EndTime = time.Now() @@ -288,7 +296,7 @@ func (sc *StatefulConnection) SetTimeout(timeout time.Duration) { // logReservedConn logs reserved connection related stats. func (sc *StatefulConnection) logReservedConn() { if sc.reservedProps == nil { - return //Nothing to log as this connection is not reserved. + return // Nothing to log as this connection is not reserved. } duration := time.Since(sc.reservedProps.StartTime) username := sc.getUsername() @@ -305,13 +313,19 @@ func (sc *StatefulConnection) getUsername() string { return callerid.GetUsername(sc.reservedProps.ImmediateCaller) } -func (sc *StatefulConnection) ApplySetting(ctx context.Context, setting *smartconnpool.Setting) error { +// ApplySetting returns whether the settings where applied or not. It also returns an error, if encountered. +func (sc *StatefulConnection) ApplySetting(ctx context.Context, setting *smartconnpool.Setting) (bool, error) { if sc.dbConn.Conn.Setting() == setting { - return nil + return false, nil } - return sc.dbConn.Conn.ApplySetting(ctx, setting) + return true, sc.dbConn.Conn.ApplySetting(ctx, setting) } func (sc *StatefulConnection) resetExpiryTime() { sc.expiryTime = time.Now().Add(sc.timeout) } + +// IsUnixSocket returns true if the connection is using a unix socket +func (sc *StatefulConnection) IsUnixSocket() bool { + return sc.dbConn.Conn.IsUnixSocket() +} diff --git a/go/vt/vttablet/tabletserver/stateful_connection_pool.go b/go/vt/vttablet/tabletserver/stateful_connection_pool.go index 64268825b70..88fbc56fd0c 100644 --- a/go/vt/vttablet/tabletserver/stateful_connection_pool.go +++ b/go/vt/vttablet/tabletserver/stateful_connection_pool.go @@ -96,7 +96,7 @@ func (sf *StatefulConnectionPool) Close() { log.Warningf("killing %s for shutdown: %s", thing, conn.String(sf.env.Config().SanitizeLogMessages, sf.env.Environment().Parser())) sf.env.Stats().InternalErrors.Add("StrayTransactions", 1) conn.Close() - conn.Releasef("pool closed") + conn.ReleaseString("pool closed") } sf.conns.Close() sf.foundRowsPool.Close() @@ -111,7 +111,7 @@ func (sf *StatefulConnectionPool) ShutdownNonTx() { return !sc.(*StatefulConnection).IsInTransaction() })) for _, sc := range conns { - sc.Releasef("kill non-tx") + sc.ReleaseString("kill non-tx") } } @@ -231,14 +231,14 @@ func (sf *StatefulConnectionPool) markAsNotInUse(sc *StatefulConnection, updateT switch sf.state.Load() { case scpKillingNonTx: if !sc.IsInTransaction() { - sc.Releasef("kill non-tx") + sc.ReleaseString("kill non-tx") return } case scpKillingAll: if sc.IsInTransaction() { sc.Close() } - sc.Releasef("kill all") + sc.ReleaseString("kill all") return } if updateTime { diff --git a/go/vt/vttablet/tabletserver/tabletenv/stats.go b/go/vt/vttablet/tabletserver/tabletenv/stats.go index 1ad93532719..52bb6a5a3b0 100644 --- a/go/vt/vttablet/tabletserver/tabletenv/stats.go +++ b/go/vt/vttablet/tabletserver/tabletenv/stats.go @@ -34,7 +34,6 @@ type Stats struct { ErrorCounters *stats.CountersWithSingleLabel InternalErrors *stats.CountersWithSingleLabel Warnings *stats.CountersWithSingleLabel - Unresolved *stats.GaugesWithSingleLabel // For now, only Prepares are tracked UserTableQueryCount *stats.CountersWithMultiLabels // Per CallerID/table counts UserTableQueryTimesNs *stats.CountersWithMultiLabels // Per CallerID/table latencies UserTransactionCount *stats.CountersWithMultiLabels // Per CallerID transaction counts @@ -49,6 +48,11 @@ type Stats struct { UserReservedTimesNs *stats.CountersWithSingleLabel // Per CallerID reserved connection duration QueryTimingsByTabletType *servenv.TimingsWrapper // Query timings split by current tablet type + + // Atomic Transactions + Unresolved *stats.GaugesWithSingleLabel + CommitPreparedFail *stats.CountersWithSingleLabel + RedoPreparedFail *stats.CountersWithSingleLabel } // NewStats instantiates a new set of stats scoped by exporter. @@ -83,7 +87,6 @@ func NewStats(exporter *servenv.Exporter) *Stats { ), InternalErrors: exporter.NewCountersWithSingleLabel("InternalErrors", "Internal component errors", "type", "Task", "StrayTransactions", "Panic", "HungQuery", "Schema", "TwopcCommit", "TwopcResurrection", "WatchdogFail", "Messages"), Warnings: exporter.NewCountersWithSingleLabel("Warnings", "Warnings", "type", "ResultsExceeded"), - Unresolved: exporter.NewGaugesWithSingleLabel("Unresolved", "Unresolved items", "item_type", "Prepares"), UserTableQueryCount: exporter.NewCountersWithMultiLabels("UserTableQueryCount", "Queries received for each CallerID/table combination", []string{"TableName", "CallerID", "Type"}), UserTableQueryTimesNs: exporter.NewCountersWithMultiLabels("UserTableQueryTimesNs", "Total latency for each CallerID/table combination", []string{"TableName", "CallerID", "Type"}), UserTransactionCount: exporter.NewCountersWithMultiLabels("UserTransactionCount", "transactions received for each CallerID", []string{"CallerID", "Conclusion"}), @@ -98,6 +101,10 @@ func NewStats(exporter *servenv.Exporter) *Stats { UserReservedTimesNs: exporter.NewCountersWithSingleLabel("UserReservedTimesNs", "Total reserved connection latency for each CallerID", "CallerID"), QueryTimingsByTabletType: exporter.NewTimings("QueryTimingsByTabletType", "Query timings broken down by active tablet type", "TabletType"), + + Unresolved: exporter.NewGaugesWithSingleLabel("UnresolvedTransaction", "Current unresolved transactions", "ManagerType"), + CommitPreparedFail: exporter.NewCountersWithSingleLabel("CommitPreparedFail", "failed prepared transactions commit", "FailureType"), + RedoPreparedFail: exporter.NewCountersWithSingleLabel("RedoPreparedFail", "failed prepared transactions on redo", "FailureType"), } stats.QPSRates = exporter.NewRates("QPS", stats.QueryTimings, 15*60/5, 5*time.Second) return stats diff --git a/go/vt/vttablet/tabletserver/tabletserver.go b/go/vt/vttablet/tabletserver/tabletserver.go index 8a6d1a0be39..f96911971be 100644 --- a/go/vt/vttablet/tabletserver/tabletserver.go +++ b/go/vt/vttablet/tabletserver/tabletserver.go @@ -46,6 +46,7 @@ import ( "vitess.io/vitess/go/vt/mysqlctl" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" querypb "vitess.io/vitess/go/vt/proto/query" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/servenv" @@ -175,7 +176,7 @@ func NewTabletServer(ctx context.Context, env *vtenv.Environment, name string, c tsv.se = schema.NewEngine(tsv) tsv.hs = newHealthStreamer(tsv, alias, tsv.se) tsv.rt = repltracker.NewReplTracker(tsv, alias) - tsv.lagThrottler = throttle.NewThrottler(tsv, srvTopoServer, topoServer, alias.Cell, tsv.rt.HeartbeatWriter(), tabletTypeFunc) + tsv.lagThrottler = throttle.NewThrottler(tsv, srvTopoServer, topoServer, alias, tsv.rt.HeartbeatWriter(), tabletTypeFunc) tsv.vstreamer = vstreamer.NewEngine(tsv, srvTopoServer, tsv.se, tsv.lagThrottler, alias.Cell) tsv.tracker = schema.NewTracker(tsv, tsv.vstreamer, tsv.se) tsv.watcher = NewBinlogWatcher(tsv, tsv.vstreamer, tsv.config) @@ -185,7 +186,7 @@ func NewTabletServer(ctx context.Context, env *vtenv.Environment, name string, c tsv.messager = messager.NewEngine(tsv, tsv.se, tsv.vstreamer) tsv.tableGC = gc.NewTableGC(tsv, topoServer, tsv.lagThrottler) - tsv.onlineDDLExecutor = onlineddl.NewExecutor(tsv, alias, topoServer, tsv.lagThrottler, tabletTypeFunc, tsv.onlineDDLExecutorToggleTableBuffer, tsv.tableGC.RequestChecks) + tsv.onlineDDLExecutor = onlineddl.NewExecutor(tsv, alias, topoServer, tsv.lagThrottler, tabletTypeFunc, tsv.onlineDDLExecutorToggleTableBuffer, tsv.tableGC.RequestChecks, tsv.te.preparedPool.IsEmptyForTable) tsv.sm = &stateManager{ statelessql: tsv.statelessql, @@ -216,7 +217,9 @@ func NewTabletServer(ctx context.Context, env *vtenv.Environment, name string, c tsv.exporter.NewGaugesFuncWithMultiLabels("TabletServerState", "Tablet server state labeled by state name", []string{"name"}, func() map[string]int64 { return map[string]int64{tsv.sm.IsServingString(): 1} }) - tsv.exporter.NewGaugeDurationFunc("QueryTimeout", "Tablet server query timeout", tsv.loadQueryTimeout) + tsv.exporter.NewGaugeDurationFunc("QueryTimeout", "Tablet server query timeout", func() time.Duration { + return time.Duration(tsv.QueryTimeout.Load()) + }) tsv.registerHealthzHealthHandler() tsv.registerDebugHealthHandler() @@ -236,6 +239,28 @@ func (tsv *TabletServer) loadQueryTimeout() time.Duration { return time.Duration(tsv.QueryTimeout.Load()) } +func (tsv *TabletServer) loadQueryTimeoutWithTxAndOptions(txID int64, options *querypb.ExecuteOptions) time.Duration { + timeout := tsv.loadQueryTimeoutWithOptions(options) + + if txID == 0 { + return timeout + } + + // fetch the transaction timeout. + txTimeout := tsv.config.TxTimeoutForWorkload(querypb.ExecuteOptions_OLTP) + + // Use the smaller of the two values (0 means infinity). + return smallerTimeout(timeout, txTimeout) +} + +func (tsv *TabletServer) loadQueryTimeoutWithOptions(options *querypb.ExecuteOptions) time.Duration { + // returns the authoritative timeout if it is set. + if options != nil && options.Timeout != nil { + return time.Duration(options.GetAuthoritativeTimeout()) * time.Millisecond + } + return time.Duration(tsv.QueryTimeout.Load()) +} + // onlineDDLExecutorToggleTableBuffer is called by onlineDDLExecutor as a callback function. onlineDDLExecutor // uses it to start/stop query buffering for a given table. // It is onlineDDLExecutor's responsibility to make sure buffering is stopped after some definite amount of time. @@ -475,11 +500,6 @@ func (tsv *TabletServer) TableGC() *gc.TableGC { return tsv.tableGC } -// TwoPCEngineWait waits until the TwoPC engine has been opened, and the redo read -func (tsv *TabletServer) TwoPCEngineWait() { - tsv.te.twoPCReady.Wait() -} - // SchemaEngine returns the SchemaEngine part of TabletServer. func (tsv *TabletServer) SchemaEngine() *schema.Engine { return tsv.se @@ -490,10 +510,17 @@ func (tsv *TabletServer) Begin(ctx context.Context, target *querypb.Target, opti return tsv.begin(ctx, target, nil, 0, nil, options) } -func (tsv *TabletServer) begin(ctx context.Context, target *querypb.Target, savepointQueries []string, reservedID int64, settings []string, options *querypb.ExecuteOptions) (state queryservice.TransactionState, err error) { +func (tsv *TabletServer) begin( + ctx context.Context, + target *querypb.Target, + postBeginQueries []string, + reservedID int64, + settings []string, + options *querypb.ExecuteOptions, +) (state queryservice.TransactionState, err error) { state.TabletAlias = tsv.alias err = tsv.execRequest( - ctx, tsv.loadQueryTimeout(), + ctx, tsv.loadQueryTimeoutWithOptions(options), "Begin", "begin", nil, target, options, false, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { @@ -508,12 +535,43 @@ func (tsv *TabletServer) begin(ctx context.Context, target *querypb.Target, save return err } } - transactionID, beginSQL, sessionStateChanges, err := tsv.te.Begin(ctx, savepointQueries, reservedID, connSetting, options) + transactionID, beginSQL, sessionStateChanges, err := tsv.te.Begin(ctx, reservedID, connSetting, options) state.TransactionID = transactionID state.SessionStateChanges = sessionStateChanges logStats.TransactionID = transactionID logStats.ReservedID = reservedID + if err != nil { + return err + } + + targetType, err := tsv.resolveTargetType(ctx, target) + if err != nil { + return err + } + for _, query := range postBeginQueries { + plan, err := tsv.qe.GetPlan(ctx, logStats, query, true) + if err != nil { + return err + } + + qre := &QueryExecutor{ + ctx: ctx, + query: query, + connID: transactionID, + options: options, + plan: plan, + logStats: logStats, + tsv: tsv, + targetTabletType: targetType, + setting: connSetting, + } + _, err = qre.Execute() + if err != nil { + return err + } + } + // Record the actual statements that were executed in the logStats. // If nothing was actually executed, don't count the operation in // the tablet metrics, and clear out the logStats Method so that @@ -532,7 +590,7 @@ func (tsv *TabletServer) begin(ctx context.Context, target *querypb.Target, save return err }, ) - return state, err + return } func (tsv *TabletServer) getPriorityFromOptions(options *querypb.ExecuteOptions) int { @@ -645,7 +703,7 @@ func (tsv *TabletServer) Prepare(ctx context.Context, target *querypb.Target, tr "Prepare", "prepare", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { - txe := NewDTExecutor(ctx, tsv.te, logStats) + txe := NewDTExecutor(ctx, logStats, tsv.te, tsv.qe, tsv.getShard) return txe.Prepare(transactionID, dtid) }, ) @@ -658,7 +716,10 @@ func (tsv *TabletServer) CommitPrepared(ctx context.Context, target *querypb.Tar "CommitPrepared", "commit_prepared", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { - txe := NewDTExecutor(ctx, tsv.te, logStats) + txe := NewDTExecutor(ctx, logStats, tsv.te, tsv.qe, tsv.getShard) + if DebugTwoPc { + commitPreparedDelayForTest(tsv) + } return txe.CommitPrepared(dtid) }, ) @@ -671,12 +732,32 @@ func (tsv *TabletServer) RollbackPrepared(ctx context.Context, target *querypb.T "RollbackPrepared", "rollback_prepared", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { - txe := NewDTExecutor(ctx, tsv.te, logStats) + txe := NewDTExecutor(ctx, logStats, tsv.te, tsv.qe, tsv.getShard) return txe.RollbackPrepared(dtid, originalID) }, ) } +// WaitForPreparedTwoPCTransactions waits for all the prepared transactions to complete. +func (tsv *TabletServer) WaitForPreparedTwoPCTransactions(ctx context.Context) error { + if tsv.te.preparedPool.IsEmpty() { + return nil + } + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + // Return an error if we run out of time. + return vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, "Prepared transactions have not been resolved yet") + case <-ticker.C: + if tsv.te.preparedPool.IsEmpty() { + return nil + } + } + } +} + // CreateTransaction creates the metadata for a 2PC transaction. func (tsv *TabletServer) CreateTransaction(ctx context.Context, target *querypb.Target, dtid string, participants []*querypb.Target) (err error) { return tsv.execRequest( @@ -684,7 +765,7 @@ func (tsv *TabletServer) CreateTransaction(ctx context.Context, target *querypb. "CreateTransaction", "create_transaction", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { - txe := NewDTExecutor(ctx, tsv.te, logStats) + txe := NewDTExecutor(ctx, logStats, tsv.te, tsv.qe, tsv.getShard) return txe.CreateTransaction(dtid, participants) }, ) @@ -698,7 +779,7 @@ func (tsv *TabletServer) StartCommit(ctx context.Context, target *querypb.Target "StartCommit", "start_commit", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { - txe := NewDTExecutor(ctx, tsv.te, logStats) + txe := NewDTExecutor(ctx, logStats, tsv.te, tsv.qe, tsv.getShard) return txe.StartCommit(transactionID, dtid) }, ) @@ -712,7 +793,7 @@ func (tsv *TabletServer) SetRollback(ctx context.Context, target *querypb.Target "SetRollback", "set_rollback", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { - txe := NewDTExecutor(ctx, tsv.te, logStats) + txe := NewDTExecutor(ctx, logStats, tsv.te, tsv.qe, tsv.getShard) return txe.SetRollback(dtid, transactionID) }, ) @@ -726,7 +807,7 @@ func (tsv *TabletServer) ConcludeTransaction(ctx context.Context, target *queryp "ConcludeTransaction", "conclude_transaction", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { - txe := NewDTExecutor(ctx, tsv.te, logStats) + txe := NewDTExecutor(ctx, logStats, tsv.te, tsv.qe, tsv.getShard) return txe.ConcludeTransaction(dtid) }, ) @@ -739,7 +820,7 @@ func (tsv *TabletServer) ReadTransaction(ctx context.Context, target *querypb.Ta "ReadTransaction", "read_transaction", nil, target, nil, true, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { - txe := NewDTExecutor(ctx, tsv.te, logStats) + txe := NewDTExecutor(ctx, logStats, tsv.te, tsv.qe, tsv.getShard) metadata, err = txe.ReadTransaction(dtid) return err }, @@ -748,14 +829,14 @@ func (tsv *TabletServer) ReadTransaction(ctx context.Context, target *querypb.Ta } // UnresolvedTransactions returns the unresolved distributed transaction record. -func (tsv *TabletServer) UnresolvedTransactions(ctx context.Context, target *querypb.Target) (transactions []*querypb.TransactionMetadata, err error) { +func (tsv *TabletServer) UnresolvedTransactions(ctx context.Context, target *querypb.Target, abandonAgeSeconds int64) (transactions []*querypb.TransactionMetadata, err error) { err = tsv.execRequest( ctx, tsv.loadQueryTimeout(), "UnresolvedTransactions", "unresolved_transaction", nil, target, nil, false, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { - txe := NewDTExecutor(ctx, tsv.te, logStats) - transactions, err = txe.UnresolvedTransactions() + txe := NewDTExecutor(ctx, logStats, tsv.te, tsv.qe, tsv.getShard) + transactions, err = txe.UnresolvedTransactions(time.Duration(abandonAgeSeconds) * time.Second) return err }, ) @@ -776,17 +857,8 @@ func (tsv *TabletServer) Execute(ctx context.Context, target *querypb.Target, sq } func (tsv *TabletServer) execute(ctx context.Context, target *querypb.Target, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, reservedID int64, settings []string, options *querypb.ExecuteOptions) (result *sqltypes.Result, err error) { - allowOnShutdown := false - timeout := tsv.loadQueryTimeout() - if transactionID != 0 { - allowOnShutdown = true - // Execute calls happen for OLTP only, so we can directly fetch the - // OLTP TX timeout. - txTimeout := tsv.config.TxTimeoutForWorkload(querypb.ExecuteOptions_OLTP) - // Use the smaller of the two values (0 means infinity). - // TODO(sougou): Assign deadlines to each transaction and set query timeout accordingly. - timeout = smallerTimeout(timeout, txTimeout) - } + allowOnShutdown := transactionID != 0 + timeout := tsv.loadQueryTimeoutWithTxAndOptions(transactionID, options) err = tsv.execRequest( ctx, timeout, "Execute", sql, bindVariables, @@ -944,7 +1016,7 @@ func (tsv *TabletServer) streamExecute(ctx context.Context, target *querypb.Targ } // BeginExecute combines Begin and Execute. -func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Target, preQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (queryservice.TransactionState, *sqltypes.Result, error) { +func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Target, postBeginQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (queryservice.TransactionState, *sqltypes.Result, error) { // Disable hot row protection in case of reserve connection. if tsv.enableHotRowProtection && reservedID == 0 { @@ -957,7 +1029,7 @@ func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Targe } } - state, err := tsv.begin(ctx, target, preQueries, reservedID, nil, options) + state, err := tsv.begin(ctx, target, postBeginQueries, reservedID, nil, options) if err != nil { return state, nil, err } @@ -970,14 +1042,14 @@ func (tsv *TabletServer) BeginExecute(ctx context.Context, target *querypb.Targe func (tsv *TabletServer) BeginStreamExecute( ctx context.Context, target *querypb.Target, - preQueries []string, + postBeginQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions, callback func(*sqltypes.Result) error, ) (queryservice.TransactionState, error) { - state, err := tsv.begin(ctx, target, preQueries, reservedID, nil, options) + state, err := tsv.begin(ctx, target, postBeginQueries, reservedID, nil, options) if err != nil { return state, err } @@ -1003,7 +1075,7 @@ func (tsv *TabletServer) beginWaitForSameRangeTransactions(ctx context.Context, err := tsv.execRequest( // Use (potentially longer) -queryserver-config-query-timeout and not // -queryserver-config-txpool-timeout (defaults to 1s) to limit the waiting. - ctx, tsv.loadQueryTimeout(), + ctx, tsv.loadQueryTimeoutWithOptions(options), "", "waitForSameRangeTransactions", nil, target, options, false, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { @@ -1167,7 +1239,7 @@ func (tsv *TabletServer) VStream(ctx context.Context, request *binlogdatapb.VStr if err := tsv.sm.VerifyTarget(ctx, request.Target); err != nil { return err } - return tsv.vstreamer.Stream(ctx, request.Position, request.TableLastPKs, request.Filter, throttlerapp.VStreamerName, send) + return tsv.vstreamer.Stream(ctx, request.Position, request.TableLastPKs, request.Filter, throttlerapp.VStreamerName, send, request.Options) } // VStreamRows streams rows from the specified starting point. @@ -1183,7 +1255,7 @@ func (tsv *TabletServer) VStreamRows(ctx context.Context, request *binlogdatapb. } row = r.Rows[0] } - return tsv.vstreamer.StreamRows(ctx, request.Query, row, send) + return tsv.vstreamer.StreamRows(ctx, request.Query, row, send, request.Options) } // VStreamTables streams all tables. @@ -1191,7 +1263,7 @@ func (tsv *TabletServer) VStreamTables(ctx context.Context, request *binlogdatap if err := tsv.sm.VerifyTarget(ctx, request.Target); err != nil { return err } - return tsv.vstreamer.StreamTables(ctx, send) + return tsv.vstreamer.StreamTables(ctx, send, request.Options) } // VStreamResults streams rows from the specified starting point. @@ -1203,8 +1275,8 @@ func (tsv *TabletServer) VStreamResults(ctx context.Context, target *querypb.Tar } // ReserveBeginExecute implements the QueryService interface -func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *querypb.Target, preQueries []string, postBeginQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (state queryservice.ReservedTransactionState, result *sqltypes.Result, err error) { - state, result, err = tsv.beginExecuteWithSettings(ctx, target, preQueries, postBeginQueries, sql, bindVariables, options) +func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *querypb.Target, settings []string, postBeginQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (state queryservice.ReservedTransactionState, result *sqltypes.Result, err error) { + state, result, err = tsv.beginExecuteWithSettings(ctx, target, settings, postBeginQueries, sql, bindVariables, options) // If there is an error and the error message is about allowing query in reserved connection only, // then we do not return an error from here and continue to use the reserved connection path. // This is specially for get_lock function call from vtgate that needs a reserved connection. @@ -1222,7 +1294,7 @@ func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *queryp state.TabletAlias = tsv.alias err = tsv.execRequest( - ctx, tsv.loadQueryTimeout(), + ctx, tsv.loadQueryTimeoutWithOptions(options), "ReserveBegin", "begin", bindVariables, target, options, false, /* allowOnShutdown */ func(ctx context.Context, logStats *tabletenv.LogStats) error { @@ -1232,12 +1304,35 @@ func (tsv *TabletServer) ReserveBeginExecute(ctx context.Context, target *queryp return err } defer tsv.stats.QueryTimingsByTabletType.Record(targetType.String(), time.Now()) - connID, sessionStateChanges, err = tsv.te.ReserveBegin(ctx, options, preQueries, postBeginQueries) + connID, sessionStateChanges, err = tsv.te.ReserveBegin(ctx, options, settings) + logStats.TransactionID = connID + logStats.ReservedID = connID if err != nil { return err } - logStats.TransactionID = connID - logStats.ReservedID = connID + + for _, query := range postBeginQueries { + plan, err := tsv.qe.GetPlan(ctx, logStats, query, true) + if err != nil { + return err + } + + qre := &QueryExecutor{ + ctx: ctx, + query: query, + connID: connID, + options: options, + plan: plan, + logStats: logStats, + tsv: tsv, + targetTabletType: targetType, + } + _, err = qre.Execute() + if err != nil { + return err + } + } + return nil }, ) @@ -1258,13 +1353,13 @@ func (tsv *TabletServer) ReserveBeginStreamExecute( ctx context.Context, target *querypb.Target, settings []string, - savepointQueries []string, + postBeginQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions, callback func(*sqltypes.Result) error, ) (state queryservice.ReservedTransactionState, err error) { - txState, err := tsv.begin(ctx, target, savepointQueries, 0, settings, options) + txState, err := tsv.begin(ctx, target, postBeginQueries, 0, settings, options) if err != nil { return txToReserveState(txState), err } @@ -1274,9 +1369,9 @@ func (tsv *TabletServer) ReserveBeginStreamExecute( } // ReserveExecute implements the QueryService interface -func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, preQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (state queryservice.ReservedState, result *sqltypes.Result, err error) { +func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Target, settings []string, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (state queryservice.ReservedState, result *sqltypes.Result, err error) { - result, err = tsv.executeWithSettings(ctx, target, preQueries, sql, bindVariables, transactionID, options) + result, err = tsv.executeWithSettings(ctx, target, settings, sql, bindVariables, transactionID, options) // If there is an error and the error message is about allowing query in reserved connection only, // then we do not return an error from here and continue to use the reserved connection path. // This is specially for get_lock function call from vtgate that needs a reserved connection. @@ -1287,16 +1382,8 @@ func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Tar // needs a reserved connection to execute the query. state.TabletAlias = tsv.alias - allowOnShutdown := false - timeout := tsv.loadQueryTimeout() - if transactionID != 0 { - allowOnShutdown = true - // ReserveExecute is for OLTP only, so we can directly fetch the OLTP - // TX timeout. - txTimeout := tsv.config.TxTimeoutForWorkload(querypb.ExecuteOptions_OLTP) - // Use the smaller of the two values (0 means infinity). - timeout = smallerTimeout(timeout, txTimeout) - } + allowOnShutdown := transactionID != 0 + timeout := tsv.loadQueryTimeoutWithTxAndOptions(transactionID, options) err = tsv.execRequest( ctx, timeout, @@ -1309,7 +1396,7 @@ func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Tar return err } defer tsv.stats.QueryTimingsByTabletType.Record(targetType.String(), time.Now()) - state.ReservedID, err = tsv.te.Reserve(ctx, options, transactionID, preQueries) + state.ReservedID, err = tsv.te.Reserve(ctx, options, transactionID, settings) if err != nil { return err } @@ -1331,14 +1418,14 @@ func (tsv *TabletServer) ReserveExecute(ctx context.Context, target *querypb.Tar func (tsv *TabletServer) ReserveStreamExecute( ctx context.Context, target *querypb.Target, - preQueries []string, + settings []string, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions, callback func(*sqltypes.Result) error, ) (state queryservice.ReservedState, err error) { - return state, tsv.streamExecute(ctx, target, sql, bindVariables, transactionID, 0, preQueries, options, callback) + return state, tsv.streamExecute(ctx, target, sql, bindVariables, transactionID, 0, settings, options, callback) } // Release implements the QueryService interface @@ -1378,8 +1465,8 @@ func (tsv *TabletServer) executeWithSettings(ctx context.Context, target *queryp return tsv.execute(ctx, target, sql, bindVariables, transactionID, 0, settings, options) } -func (tsv *TabletServer) beginExecuteWithSettings(ctx context.Context, target *querypb.Target, settings []string, savepointQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (queryservice.ReservedTransactionState, *sqltypes.Result, error) { - txState, err := tsv.begin(ctx, target, savepointQueries, 0, settings, options) +func (tsv *TabletServer) beginExecuteWithSettings(ctx context.Context, target *querypb.Target, settings []string, postBeginQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, options *querypb.ExecuteOptions) (queryservice.ReservedTransactionState, *sqltypes.Result, error) { + txState, err := tsv.begin(ctx, target, postBeginQueries, 0, settings, options) if err != nil { return txToReserveState(txState), nil, err } @@ -1594,7 +1681,7 @@ func convertErrorCode(err error) vtrpcpb.Code { sqlerror.ERTooLongString, sqlerror.ERDelayedInsertTableLocked, sqlerror.ERDupUnique, sqlerror.ERRequiresPrimaryKey, sqlerror.ERCantDoThisDuringAnTransaction, sqlerror.ERReadOnlyTransaction, sqlerror.ERCannotAddForeign, sqlerror.ERNoReferencedRow, sqlerror.ERRowIsReferenced, sqlerror.ERCantUpdateWithReadLock, sqlerror.ERNoDefault, sqlerror.EROperandColumns, sqlerror.ERSubqueryNo1Row, sqlerror.ERNonUpdateableTable, sqlerror.ERFeatureDisabled, sqlerror.ERDuplicatedValueInType, sqlerror.ERRowIsReferenced2, - sqlerror.ErNoReferencedRow2, sqlerror.ERWarnDataOutOfRange: + sqlerror.ErNoReferencedRow2, sqlerror.ERWarnDataOutOfRange, sqlerror.ERInnodbIndexCorrupt: errCode = vtrpcpb.Code_FAILED_PRECONDITION case sqlerror.EROptionPreventsStatement: errCode = vtrpcpb.Code_CLUSTER_EVENT @@ -1619,7 +1706,7 @@ func convertErrorCode(err error) vtrpcpb.Code { sqlerror.ERCantAggregate3Collations, sqlerror.ERCantAggregateNCollations, sqlerror.ERVariableIsNotStruct, sqlerror.ERUnknownCollation, sqlerror.ERWrongNameForIndex, sqlerror.ERWrongNameForCatalog, sqlerror.ERBadFTColumn, sqlerror.ERTruncatedWrongValue, sqlerror.ERTooMuchAutoTimestampCols, sqlerror.ERInvalidOnUpdate, sqlerror.ERUnknownTimeZone, sqlerror.ERInvalidCharacterString, sqlerror.ERIllegalReference, sqlerror.ERDerivedMustHaveAlias, sqlerror.ERTableNameNotAllowedHere, sqlerror.ERDataTooLong, sqlerror.ERDataOutOfRange, - sqlerror.ERTruncatedWrongValueForField, sqlerror.ERIllegalValueForType: + sqlerror.ERTruncatedWrongValueForField, sqlerror.ERIllegalValueForType, sqlerror.ERWrongValue, sqlerror.ERWrongParamcountToNativeFct: errCode = vtrpcpb.Code_INVALID_ARGUMENT case sqlerror.ERSpecifiedAccessDenied: errCode = vtrpcpb.Code_PERMISSION_DENIED @@ -1688,6 +1775,17 @@ func (tsv *TabletServer) GetThrottlerStatus(ctx context.Context) *throttle.Throt return r } +// RedoPreparedTransactions redoes the prepared transactions. +func (tsv *TabletServer) RedoPreparedTransactions() { + tsv.te.RedoPreparedTransactions() +} + +// SetTwoPCAllowed sets whether TwoPC is allowed or not. It also takes the reason of why it is being set. +// The reason should be an enum value defined in the tabletserver. +func (tsv *TabletServer) SetTwoPCAllowed(reason int, allowed bool) { + tsv.te.twopcAllowed[reason] = allowed +} + // HandlePanic is part of the queryservice.QueryService interface func (tsv *TabletServer) HandlePanic(err *error) { if x := recover(); x != nil { @@ -1767,7 +1865,7 @@ func (tsv *TabletServer) registerQueryListHandlers(queryLists []*QueryList) { func (tsv *TabletServer) registerTwopczHandler() { tsv.exporter.HandleFunc("/twopcz", func(w http.ResponseWriter, r *http.Request) { ctx := tabletenv.LocalContext() - txe := NewDTExecutor(ctx, tsv.te, tabletenv.NewLogStats(ctx, "twopcz")) + txe := NewDTExecutor(ctx, tabletenv.NewLogStats(ctx, "twopcz"), tsv.te, tsv.qe, tsv.getShard) twopczHandler(txe, w, r) }) } @@ -1800,8 +1898,9 @@ func (tsv *TabletServer) registerThrottlerCheckHandlers() { } metricNames := tsv.lagThrottler.MetricNames(r.URL.Query()["m"]) checkResult := tsv.lagThrottler.Check(ctx, appName, metricNames, flags) - if checkResult.StatusCode == http.StatusNotFound && flags.OKIfNotExists { + if checkResult.ResponseCode == tabletmanagerdatapb.CheckThrottlerResponseCode_UNKNOWN_METRIC && flags.OKIfNotExists { checkResult.StatusCode = http.StatusOK // 200 + checkResult.ResponseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_OK } if r.Method == http.MethodGet { @@ -2055,3 +2154,7 @@ func skipQueryPlanCache(options *querypb.ExecuteOptions) bool { } return options.SkipQueryPlanCache || options.HasCreatedTempTables } + +func (tsv *TabletServer) getShard() string { + return tsv.sm.Target().Shard +} diff --git a/go/vt/vttablet/tabletserver/tabletserver_test.go b/go/vt/vttablet/tabletserver/tabletserver_test.go index 7ffd201c0a4..be842e8e76e 100644 --- a/go/vt/vttablet/tabletserver/tabletserver_test.go +++ b/go/vt/vttablet/tabletserver/tabletserver_test.go @@ -36,6 +36,7 @@ import ( "vitess.io/vitess/go/vt/callerid" "vitess.io/vitess/go/vt/sidecardb" "vitess.io/vitess/go/vt/vtenv" + "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/test/utils" @@ -152,13 +153,13 @@ func TestTabletServerPrimaryToReplica(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Reuse code from tx_executor_test. - _, tsv, db := newTestTxExecutor(t, ctx) + _, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() // This is required because the test is verifying that we rollback transactions on changing serving type, - // but that only happens immediately if the shut down grace period is not specified. - tsv.te.shutdownGracePeriod = 0 - tsv.sm.shutdownGracePeriod = 0 - defer tsv.StopService() - defer db.Close() + // but that only happens when we have a shutdown grace period, otherwise we wait for transactions to be resolved + // indefinitely. + tsv.te.shutdownGracePeriod = 1 + tsv.sm.shutdownGracePeriod = 1 target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} state1, err := tsv.Begin(ctx, &target, nil) require.NoError(t, err) @@ -197,17 +198,22 @@ func TestTabletServerRedoLogIsKeptBetweenRestarts(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Reuse code from tx_executor_test. - _, tsv, db := newTestTxExecutor(t, ctx) - defer tsv.StopService() - defer db.Close() - tsv.SetServingType(topodatapb.TabletType_REPLICA, time.Time{}, true, "") + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() + // This is required because the test is verifying that we rollback transactions on changing serving type, + // but that only happens when we have a shutdown grace period, otherwise we wait for transactions to be resolved + // indefinitely. + tsv.te.shutdownGracePeriod = 1 + tsv.sm.shutdownGracePeriod = 1 + tsv.SetServingType(topodatapb.TabletType_PRIMARY, time.Time{}, false, "") turnOnTxEngine := func() { tsv.SetServingType(topodatapb.TabletType_PRIMARY, time.Time{}, true, "") - tsv.TwoPCEngineWait() } turnOffTxEngine := func() { - tsv.SetServingType(topodatapb.TabletType_REPLICA, time.Time{}, true, "") + // We can use a transition to PRIMARY non-serving or REPLICA serving to turn off the transaction engine. + // With primary serving, the shutdown of prepared transactions is synchronous, but for the latter its asynchronous. + tsv.SetServingType(topodatapb.TabletType_PRIMARY, time.Time{}, false, "") } tpc := tsv.te.twoPC @@ -223,18 +229,22 @@ func TestTabletServerRedoLogIsKeptBetweenRestarts(t *testing.T) { {Type: sqltypes.Uint64}, {Type: sqltypes.Uint64}, {Type: sqltypes.VarBinary}, + {Type: sqltypes.Text}, }, Rows: [][]sqltypes.Value{{ sqltypes.NewVarBinary("dtid0"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary(""), sqltypes.NewVarBinary("update test_table set `name` = 2 where pk = 1 limit 10001"), + sqltypes.NULL, }}, }) turnOnTxEngine() assert.EqualValues(t, 1, len(tsv.te.preparedPool.conns), "len(tsv.te.preparedPool.conns)") got := tsv.te.preparedPool.conns["dtid0"].TxProperties().Queries - want := []string{"update test_table set `name` = 2 where pk = 1 limit 10001"} + want := []tx.Query{{ + Sql: "update test_table set `name` = 2 where pk = 1 limit 10001", + Tables: []string{"test_table"}}} utils.MustMatch(t, want, got, "Prepared queries") turnOffTxEngine() assert.Empty(t, tsv.te.preparedPool.conns, "tsv.te.preparedPool.conns") @@ -247,30 +257,39 @@ func TestTabletServerRedoLogIsKeptBetweenRestarts(t *testing.T) { {Type: sqltypes.Uint64}, {Type: sqltypes.Uint64}, {Type: sqltypes.VarBinary}, + {Type: sqltypes.Text}, }, Rows: [][]sqltypes.Value{{ sqltypes.NewVarBinary("bogus"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary(""), sqltypes.NewVarBinary("bogus"), + sqltypes.NULL, }, { sqltypes.NewVarBinary("a:b:10"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary(""), sqltypes.NewVarBinary("update test_table set `name` = 2 where pk = 1 limit 10001"), + sqltypes.NULL, }, { sqltypes.NewVarBinary("a:b:20"), sqltypes.NewInt64(RedoStateFailed), sqltypes.NewVarBinary(""), sqltypes.NewVarBinary("unused"), + sqltypes.TestValue(sqltypes.Text, "deadlock detected, transaction rolled back"), }}, }) turnOnTxEngine() assert.EqualValues(t, 1, len(tsv.te.preparedPool.conns), "len(tsv.te.preparedPool.conns)") got = tsv.te.preparedPool.conns["a:b:10"].TxProperties().Queries - want = []string{"update test_table set `name` = 2 where pk = 1 limit 10001"} + want = []tx.Query{{ + Sql: "update test_table set `name` = 2 where pk = 1 limit 10001", + Tables: []string{"test_table"}}} utils.MustMatch(t, want, got, "Prepared queries") - wantFailed := map[string]error{"a:b:20": errPrepFailed} + wantFailed := map[string]error{ + "bogus": errPrepFailed, // The query is rejected by database so added to failed list. + "a:b:20": errPrepFailed, // The DTID is already in failed state. + } utils.MustMatch(t, tsv.te.preparedPool.reserved, wantFailed, fmt.Sprintf("Failed dtids: %v, want %v", tsv.te.preparedPool.reserved, wantFailed)) // Verify last id got adjusted. assert.EqualValues(t, 20, tsv.te.txPool.scp.lastID.Load(), "tsv.te.txPool.lastID.Get()") @@ -281,13 +300,12 @@ func TestTabletServerRedoLogIsKeptBetweenRestarts(t *testing.T) { func TestTabletServerCreateTransaction(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer tsv.StopService() - defer db.Close() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} - db.AddQueryPattern(fmt.Sprintf("insert into _vt\\.dt_state\\(dtid, state, time_created\\) values \\('aa', %d,.*", int(querypb.TransactionState_PREPARE)), &sqltypes.Result{}) - db.AddQueryPattern("insert into _vt\\.dt_participant\\(dtid, id, keyspace, shard\\) values \\('aa', 1,.*", &sqltypes.Result{}) + db.AddQueryPattern(fmt.Sprintf("insert into _vt\\.dt_state\\(dtid, state, time_created\\) values \\(_binary'aa', %d,.*", int(querypb.TransactionState_PREPARE)), &sqltypes.Result{}) + db.AddQueryPattern("insert into _vt\\.dt_participant\\(dtid, id, keyspace, shard\\) values \\(_binary'aa', 1,.*", &sqltypes.Result{}) err := tsv.CreateTransaction(ctx, &target, "aa", []*querypb.Target{{ Keyspace: "t1", Shard: "0", @@ -298,12 +316,11 @@ func TestTabletServerCreateTransaction(t *testing.T) { func TestTabletServerStartCommit(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer tsv.StopService() - defer db.Close() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} - commitTransition := fmt.Sprintf("update _vt.dt_state set state = %d where dtid = 'aa' and state = %d", int(querypb.TransactionState_COMMIT), int(querypb.TransactionState_PREPARE)) + commitTransition := fmt.Sprintf("update _vt.dt_state set state = %d where dtid = _binary'aa' and state = %d", int(querypb.TransactionState_COMMIT), int(querypb.TransactionState_PREPARE)) db.AddQuery(commitTransition, &sqltypes.Result{RowsAffected: 1}) txid := newTxForPrep(ctx, tsv) err := tsv.StartCommit(ctx, &target, txid, "aa") @@ -318,12 +335,11 @@ func TestTabletServerStartCommit(t *testing.T) { func TestTabletserverSetRollback(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer tsv.StopService() - defer db.Close() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} - rollbackTransition := fmt.Sprintf("update _vt.dt_state set state = %d where dtid = 'aa' and state = %d", int(querypb.TransactionState_ROLLBACK), int(querypb.TransactionState_PREPARE)) + rollbackTransition := fmt.Sprintf("update _vt.dt_state set state = %d where dtid = _binary'aa' and state = %d", int(querypb.TransactionState_ROLLBACK), int(querypb.TransactionState_PREPARE)) db.AddQuery(rollbackTransition, &sqltypes.Result{RowsAffected: 1}) txid := newTxForPrep(ctx, tsv) err := tsv.SetRollback(ctx, &target, "aa", txid) @@ -338,12 +354,11 @@ func TestTabletserverSetRollback(t *testing.T) { func TestTabletServerReadTransaction(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer tsv.StopService() - defer db.Close() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} - db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = 'aa'", &sqltypes.Result{}) + db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = _binary'aa'", &sqltypes.Result{}) got, err := tsv.ReadTransaction(ctx, &target, "aa") require.NoError(t, err) want := &querypb.TransactionMetadata{} @@ -361,8 +376,8 @@ func TestTabletServerReadTransaction(t *testing.T) { sqltypes.NewVarBinary("1"), }}, } - db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = 'aa'", txResult) - db.AddQuery("select keyspace, shard from _vt.dt_participant where dtid = 'aa'", &sqltypes.Result{ + db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = _binary'aa'", txResult) + db.AddQuery("select keyspace, shard from _vt.dt_participant where dtid = _binary'aa'", &sqltypes.Result{ Fields: []*querypb.Field{ {Type: sqltypes.VarBinary}, {Type: sqltypes.VarBinary}, @@ -405,7 +420,7 @@ func TestTabletServerReadTransaction(t *testing.T) { sqltypes.NewVarBinary("1"), }}, } - db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = 'aa'", txResult) + db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = _binary'aa'", txResult) want.State = querypb.TransactionState_COMMIT got, err = tsv.ReadTransaction(ctx, &target, "aa") require.NoError(t, err) @@ -423,7 +438,7 @@ func TestTabletServerReadTransaction(t *testing.T) { sqltypes.NewVarBinary("1"), }}, } - db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = 'aa'", txResult) + db.AddQuery("select dtid, state, time_created from _vt.dt_state where dtid = _binary'aa'", txResult) want.State = querypb.TransactionState_ROLLBACK got, err = tsv.ReadTransaction(ctx, &target, "aa") require.NoError(t, err) @@ -433,13 +448,12 @@ func TestTabletServerReadTransaction(t *testing.T) { func TestTabletServerConcludeTransaction(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer tsv.StopService() - defer db.Close() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} - db.AddQuery("delete from _vt.dt_state where dtid = 'aa'", &sqltypes.Result{}) - db.AddQuery("delete from _vt.dt_participant where dtid = 'aa'", &sqltypes.Result{}) + db.AddQuery("delete from _vt.dt_state where dtid = _binary'aa'", &sqltypes.Result{}) + db.AddQuery("delete from _vt.dt_participant where dtid = _binary'aa'", &sqltypes.Result{}) err := tsv.ConcludeTransaction(ctx, &target, "aa") require.NoError(t, err) } @@ -537,9 +551,8 @@ func TestTabletServerPrepare(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Reuse code from tx_executor_test. - _, tsv, db := newTestTxExecutor(t, ctx) - defer tsv.StopService() - defer db.Close() + _, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} state, err := tsv.Begin(ctx, &target, nil) require.NoError(t, err) @@ -554,9 +567,8 @@ func TestTabletServerCommitPrepared(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Reuse code from tx_executor_test. - _, tsv, db := newTestTxExecutor(t, ctx) - defer tsv.StopService() - defer db.Close() + _, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} state, err := tsv.Begin(ctx, &target, nil) require.NoError(t, err) @@ -671,6 +683,80 @@ func TestSmallerTimeout(t *testing.T) { } } +func TestLoadQueryTimeout(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + db, tsv := setupTabletServerTest(t, ctx, "") + defer tsv.StopService() + defer db.Close() + + testcases := []struct { + name string + txID int64 + setOptions bool + optionTimeout int64 + + want time.Duration + }{{ + name: "no options and no transaction", + want: 30 * time.Second, + }, { + name: "only transaction", + txID: 1234, + want: 30 * time.Second, + }, { + name: "only option - infinite time", + setOptions: true, + optionTimeout: 0, + want: 0 * time.Millisecond, + }, { + name: "only option - lower time", + setOptions: true, + optionTimeout: 3, // 3ms + want: 3 * time.Millisecond, + }, { + name: "only option - higher time", + setOptions: true, + optionTimeout: 40000, // 40s + want: 40 * time.Second, + }, { + name: "transaction and option - infinite time", + txID: 1234, + setOptions: true, + optionTimeout: 0, + want: 30 * time.Second, + }, { + name: "transaction and option - lower time", + txID: 1234, + setOptions: true, + optionTimeout: 3, // 3ms + want: 3 * time.Millisecond, + }, { + name: "transaction and option - higher time", + txID: 1234, + setOptions: true, + optionTimeout: 40000, // 40s + want: 30 * time.Second, + }} + for _, tcase := range testcases { + t.Run(tcase.name, func(t *testing.T) { + var options *querypb.ExecuteOptions + if tcase.setOptions { + options = &querypb.ExecuteOptions{ + Timeout: &querypb.ExecuteOptions_AuthoritativeTimeout{AuthoritativeTimeout: tcase.optionTimeout}, + } + } + var got time.Duration + if tcase.txID != 0 { + got = tsv.loadQueryTimeoutWithTxAndOptions(tcase.txID, options) + } else { + got = tsv.loadQueryTimeoutWithOptions(options) + } + assert.Equal(t, tcase.want, got) + }) + } +} + func TestTabletServerReserveConnection(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -801,9 +887,8 @@ func TestTabletServerRollbackPrepared(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Reuse code from tx_executor_test. - _, tsv, db := newTestTxExecutor(t, ctx) - defer tsv.StopService() - defer db.Close() + _, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} state, err := tsv.Begin(ctx, &target, nil) require.NoError(t, err) @@ -1435,9 +1520,8 @@ func TestSerializeTransactionsSameRow_RequestCanceled(t *testing.T) { func TestMessageStream(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + _, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} err := tsv.MessageStream(ctx, &target, "nomsg", func(qr *sqltypes.Result) error { @@ -1463,9 +1547,8 @@ func TestMessageStream(t *testing.T) { func TestCheckMySQLGauge(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + _, tsv, _, closer := newTestTxExecutor(t, ctx) + defer closer() // Check that initially checkMySQLGauge has 0 value assert.EqualValues(t, 0, tsv.checkMysqlGaugeFunc.Get()) @@ -1493,9 +1576,8 @@ func TestCheckMySQLGauge(t *testing.T) { func TestMessageAck(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} ids := []*querypb.Value{{ @@ -1524,9 +1606,8 @@ func TestMessageAck(t *testing.T) { func TestRescheduleMessages(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} _, err := tsv.messager.GetGenerator("nonmsg") @@ -1550,9 +1631,8 @@ func TestRescheduleMessages(t *testing.T) { func TestPurgeMessages(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() target := querypb.Target{TabletType: topodatapb.TabletType_PRIMARY} _, err := tsv.messager.GetGenerator("nonmsg") diff --git a/go/vt/vttablet/tabletserver/throttle/base/throttle_metric_cache.go b/go/vt/vttablet/tabletserver/throttle/base/metric_cache.go similarity index 100% rename from go/vt/vttablet/tabletserver/throttle/base/throttle_metric_cache.go rename to go/vt/vttablet/tabletserver/throttle/base/metric_cache.go diff --git a/go/vt/vttablet/tabletserver/throttle/base/metric_name.go b/go/vt/vttablet/tabletserver/throttle/base/metric_name.go new file mode 100644 index 00000000000..98e1288fb23 --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/metric_name.go @@ -0,0 +1,128 @@ +/* +Copyright 2023 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 base + +import ( + "fmt" + "slices" + "strings" +) + +// MetricName is a formalized name for a metric, such as "lag" or "threads_running". A metric name +// may include a scope, such as "self/lag" or "shard/threads_running". It is possible to add a +// scope to a name, or to parse the scope out of a name, and there is also always a default scope +// associated with a metric name. +type MetricName string + +// MetricNames is a formalized list of metric names +type MetricNames []MetricName + +func (names MetricNames) Contains(name MetricName) bool { + return slices.Contains(names, name) +} + +func (names MetricNames) String() string { + s := make([]string, len(names)) + for i, name := range names { + s[i] = name.String() + } + return strings.Join(s, ",") +} + +// Unique returns a subset of unique metric names, in same order as the original names +func (names MetricNames) Unique() MetricNames { + if names == nil { + return nil + } + uniqueMetricNamesMap := map[MetricName]bool{} + uniqueMetricNames := MetricNames{} + for _, metricName := range names { + if _, ok := uniqueMetricNamesMap[metricName]; !ok { + uniqueMetricNames = append(uniqueMetricNames, metricName) + uniqueMetricNamesMap[metricName] = true + } + } + return uniqueMetricNames +} + +const ( + DefaultMetricName MetricName = "default" + LagMetricName MetricName = "lag" + ThreadsRunningMetricName MetricName = "threads_running" + CustomMetricName MetricName = "custom" + LoadAvgMetricName MetricName = "loadavg" +) + +func (metric MetricName) DefaultScope() Scope { + if selfMetric := RegisteredSelfMetrics[metric]; selfMetric != nil { + return selfMetric.DefaultScope() + } + return SelfScope +} + +func (metric MetricName) String() string { + return string(metric) +} + +// AggregatedName returns the string representation of this metric in the given scope, e.g.: +// - "self/loadavg" +// - "shard/lag" +func (metric MetricName) AggregatedName(scope Scope) string { + if metric == DefaultMetricName { + // backwards (v20) compatibility + return scope.String() + } + if scope == UndefinedScope { + scope = metric.DefaultScope() + } + return fmt.Sprintf("%s/%s", scope.String(), metric.String()) +} + +// Disaggregated returns a breakdown of this metric into scope + name. +func (metric MetricName) Disaggregated() (scope Scope, metricName MetricName, err error) { + return DisaggregateMetricName(metric.String()) +} + +type AggregatedMetricName struct { + Scope Scope + Metric MetricName +} + +var ( + KnownMetricNames = make(MetricNames, 0) + // aggregatedMetricNames precomputes the aggregated metric names for all known metric names, + // mapped to their breakdowns. e.g. "self/loadavg" -> {SelfScope, LoadAvgMetricName} + // This means: + // - no textual parsing is needed in the critical path + // - we can easily check if a metric name is valid + aggregatedMetricNames = make(map[string]AggregatedMetricName) +) + +// DisaggregateMetricName splits a metric name into its scope name and metric name +// aggregated metric name could be in the form: +// - loadavg +// - self +// - self/threads_running +// - shard +// - shard/lag +func DisaggregateMetricName(aggregatedMetricName string) (scope Scope, metricName MetricName, err error) { + breakdown, ok := aggregatedMetricNames[aggregatedMetricName] + if !ok { + return UndefinedScope, DefaultMetricName, ErrNoSuchMetric + } + return breakdown.Scope, breakdown.Metric, nil +} diff --git a/go/vt/vttablet/tabletserver/throttle/base/throttle_metric_test.go b/go/vt/vttablet/tabletserver/throttle/base/metric_name_test.go similarity index 93% rename from go/vt/vttablet/tabletserver/throttle/base/throttle_metric_test.go rename to go/vt/vttablet/tabletserver/throttle/base/metric_name_test.go index 8a0f9b85a16..9867ca18db3 100644 --- a/go/vt/vttablet/tabletserver/throttle/base/throttle_metric_test.go +++ b/go/vt/vttablet/tabletserver/throttle/base/metric_name_test.go @@ -230,3 +230,12 @@ func TestContains(t *testing.T) { }) } } + +func TestKnownMetricNames(t *testing.T) { + assert.NotEmpty(t, KnownMetricNames) + assert.Contains(t, KnownMetricNames, LagMetricName) + assert.Contains(t, KnownMetricNames, ThreadsRunningMetricName) + assert.Contains(t, KnownMetricNames, LoadAvgMetricName) + assert.Contains(t, KnownMetricNames, CustomMetricName) + assert.Contains(t, KnownMetricNames, DefaultMetricName) +} diff --git a/go/vt/vttablet/tabletserver/throttle/base/metric_result.go b/go/vt/vttablet/tabletserver/throttle/base/metric_result.go new file mode 100644 index 00000000000..0fa48fe3240 --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/metric_result.go @@ -0,0 +1,121 @@ +/* +Copyright 2024 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 base + +import ( + "errors" + "net" +) + +// MetricResult is what we expect our probes to return. This can be a numeric result, or +// a special type of result indicating more meta-information +type MetricResult interface { + Get() (float64, error) +} + +// MetricResultFunc is a function that returns a metric result +type MetricResultFunc func() (metricResult MetricResult, threshold float64) + +type MetricResultMap map[MetricName]MetricResult + +func NewMetricResultMap() MetricResultMap { + result := make(MetricResultMap, len(KnownMetricNames)) + for _, metricName := range KnownMetricNames { + result[metricName] = nil + } + return result +} + +// ErrThresholdExceeded is the common error one may get checking on metric result +var ErrThresholdExceeded = errors.New("threshold exceeded") +var ErrNoResultYet = errors.New("metric not collected yet") + +// ErrNoSuchMetric is for when a user requests a metric by an unknown metric name +var ErrNoSuchMetric = errors.New("no such metric") + +// ErrAppDenied is seen when an app is denied access +var ErrAppDenied = errors.New("app denied") + +// ErrInvalidCheckType is an internal error indicating an unknown check type +var ErrInvalidCheckType = errors.New("unknown throttler check type") + +// IsDialTCPError sees if the given error indicates a TCP issue +func IsDialTCPError(err error) bool { + if err == nil { + return false + } + switch err := err.(type) { + case *net.OpError: + return err.Op == "dial" && err.Net == "tcp" + } + return false +} + +type noHostsMetricResult struct{} + +// Get implements MetricResult +func (metricResult *noHostsMetricResult) Get() (float64, error) { + return 0, nil +} + +// NoHostsMetricResult is a result indicating "no hosts" +var NoHostsMetricResult = &noHostsMetricResult{} + +type noMetricResultYet struct{} + +// Get implements MetricResult +func (metricResult *noMetricResultYet) Get() (float64, error) { + return 0, ErrNoResultYet +} + +// NoMetricResultYet is a result indicating "no data" +var NoMetricResultYet = &noMetricResultYet{} + +type noSuchMetric struct{} + +// Get implements MetricResult +func (metricResult *noSuchMetric) Get() (float64, error) { + return 0, ErrNoSuchMetric +} + +// NoSuchMetric is a metric results for an unknown metric name +var NoSuchMetric = &noSuchMetric{} + +// simpleMetricResult is a result with float value +type simpleMetricResult struct { + Value float64 +} + +// NewSimpleMetricResult creates a simpleMetricResult +func NewSimpleMetricResult(value float64) MetricResult { + return &simpleMetricResult{Value: value} +} + +// Get implements MetricResult +func (metricResult *simpleMetricResult) Get() (float64, error) { + return metricResult.Value, nil +} + +type appDeniedMetric struct{} + +// Get implements MetricResult +func (metricResult *appDeniedMetric) Get() (float64, error) { + return 0, ErrAppDenied +} + +// AppDeniedMetric is a special metric indicating a "denied" situation +var AppDeniedMetric = &appDeniedMetric{} diff --git a/go/vt/vttablet/tabletserver/throttle/base/metric_scope.go b/go/vt/vttablet/tabletserver/throttle/base/metric_scope.go new file mode 100644 index 00000000000..60d116861c3 --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/metric_scope.go @@ -0,0 +1,44 @@ +/* +Copyright 2024 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 base + +import ( + "fmt" +) + +// Scope defines the tablet range from which a metric is collected. This can be the local tablet +// ("self") or the entire shard ("shard") +type Scope string + +const ( + UndefinedScope Scope = "" + ShardScope Scope = "shard" + SelfScope Scope = "self" +) + +func (s Scope) String() string { + return string(s) +} + +func ScopeFromString(s string) (Scope, error) { + switch scope := Scope(s); scope { + case UndefinedScope, ShardScope, SelfScope: + return scope, nil + default: + return "", fmt.Errorf("unknown scope: %s", s) + } +} diff --git a/go/vt/vttablet/tabletserver/throttle/base/recent_app.go b/go/vt/vttablet/tabletserver/throttle/base/recent_app.go index 148e6b31fe4..7ae2bf789af 100644 --- a/go/vt/vttablet/tabletserver/throttle/base/recent_app.go +++ b/go/vt/vttablet/tabletserver/throttle/base/recent_app.go @@ -42,21 +42,25 @@ package base import ( "time" + + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" ) // RecentApp indicates when an app was last checked type RecentApp struct { - AppName string - CheckedAt time.Time - StatusCode int + AppName string + CheckedAt time.Time + StatusCode int + ResponseCode tabletmanagerdatapb.CheckThrottlerResponseCode } // NewRecentApp creates a RecentApp -func NewRecentApp(appName string, statusCode int) *RecentApp { +func NewRecentApp(appName string, statusCode int, responseCode tabletmanagerdatapb.CheckThrottlerResponseCode) *RecentApp { result := &RecentApp{ - AppName: appName, - CheckedAt: time.Now(), - StatusCode: statusCode, + AppName: appName, + CheckedAt: time.Now(), + StatusCode: statusCode, + ResponseCode: responseCode, } return result } diff --git a/go/vt/vttablet/tabletserver/throttle/base/self_metric.go b/go/vt/vttablet/tabletserver/throttle/base/self_metric.go new file mode 100644 index 00000000000..220dfa6bf60 --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/self_metric.go @@ -0,0 +1,91 @@ +/* +Copyright 2024 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 base + +import ( + "context" + "fmt" + "strconv" + + "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" +) + +type SelfMetric interface { + Name() MetricName + DefaultScope() Scope + DefaultThreshold() float64 + RequiresConn() bool + Read(ctx context.Context, throttler ThrottlerMetricsPublisher, conn *connpool.Conn) *ThrottleMetric +} + +var ( + RegisteredSelfMetrics = make(map[MetricName]SelfMetric) +) + +func registerSelfMetric(selfMetric SelfMetric) SelfMetric { + RegisteredSelfMetrics[selfMetric.Name()] = selfMetric + KnownMetricNames = append(KnownMetricNames, selfMetric.Name()) + aggregatedMetricNames[selfMetric.Name().String()] = AggregatedMetricName{ + Scope: selfMetric.DefaultScope(), + Metric: selfMetric.Name(), + } + for _, scope := range []Scope{ShardScope, SelfScope} { + aggregatedName := selfMetric.Name().AggregatedName(scope) + aggregatedMetricNames[aggregatedName] = AggregatedMetricName{ + Scope: scope, + Metric: selfMetric.Name(), + } + } + return selfMetric +} + +// ReadSelfMySQLThrottleMetric reads a metric using a given MySQL connection and a query. +func ReadSelfMySQLThrottleMetric(ctx context.Context, conn *connpool.Conn, query string) *ThrottleMetric { + metric := &ThrottleMetric{ + Scope: SelfScope, + } + if query == "" { + return metric + } + if conn == nil { + return metric.WithError(fmt.Errorf("conn is nil")) + } + + tm, err := conn.Exec(ctx, query, 1, true) + if err != nil { + return metric.WithError(err) + } + if len(tm.Rows) == 0 { + return metric.WithError(fmt.Errorf("no results in ReadSelfMySQLThrottleMetric for query %s", query)) + } + if len(tm.Rows) > 1 { + return metric.WithError(fmt.Errorf("expecting single row in ReadSelfMySQLThrottleMetric for query %s", query)) + } + + metricsQueryType := GetMetricsQueryType(query) + switch metricsQueryType { + case MetricsQueryTypeSelect: + metric.Value, metric.Err = tm.Rows[0][0].ToFloat64() + case MetricsQueryTypeShowGlobal: + // Columns are [Variable_name, Value] + metric.Value, metric.Err = strconv.ParseFloat(tm.Rows[0][1].ToString(), 64) + default: + metric.Err = fmt.Errorf("unsupported metrics query type for query: %s", query) + } + + return metric +} diff --git a/go/vt/vttablet/tabletserver/throttle/base/self_metric_custom_query.go b/go/vt/vttablet/tabletserver/throttle/base/self_metric_custom_query.go new file mode 100644 index 00000000000..585e63ea285 --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/self_metric_custom_query.go @@ -0,0 +1,48 @@ +/* +Copyright 2024 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 base + +import ( + "context" + + "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" +) + +var _ SelfMetric = registerSelfMetric(&CustomQuerySelfMetric{}) + +type CustomQuerySelfMetric struct { +} + +func (m *CustomQuerySelfMetric) Name() MetricName { + return CustomMetricName +} + +func (m *CustomQuerySelfMetric) DefaultScope() Scope { + return SelfScope +} + +func (m *CustomQuerySelfMetric) DefaultThreshold() float64 { + return 0 +} + +func (m *CustomQuerySelfMetric) RequiresConn() bool { + return true +} + +func (m *CustomQuerySelfMetric) Read(ctx context.Context, throttler ThrottlerMetricsPublisher, conn *connpool.Conn) *ThrottleMetric { + return ReadSelfMySQLThrottleMetric(ctx, conn, throttler.GetCustomMetricsQuery()) +} diff --git a/go/vt/vttablet/tabletserver/throttle/base/self_metric_default.go b/go/vt/vttablet/tabletserver/throttle/base/self_metric_default.go new file mode 100644 index 00000000000..8bce295da7c --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/self_metric_default.go @@ -0,0 +1,51 @@ +/* +Copyright 2024 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 base + +import ( + "context" + "fmt" + + "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" +) + +var _ SelfMetric = registerSelfMetric(&DefaultSelfMetric{}) + +type DefaultSelfMetric struct { +} + +func (m *DefaultSelfMetric) Name() MetricName { + return DefaultMetricName +} + +func (m *DefaultSelfMetric) DefaultScope() Scope { + return SelfScope +} + +func (m *DefaultSelfMetric) DefaultThreshold() float64 { + return 0 +} + +func (m *DefaultSelfMetric) RequiresConn() bool { + return false +} + +func (m *DefaultSelfMetric) Read(ctx context.Context, throttler ThrottlerMetricsPublisher, conn *connpool.Conn) *ThrottleMetric { + return &ThrottleMetric{ + Err: fmt.Errorf("unexpected direct call to DefaultSelfMetric.Read"), + } +} diff --git a/go/vt/vttablet/tabletserver/throttle/base/self_metric_lag.go b/go/vt/vttablet/tabletserver/throttle/base/self_metric_lag.go new file mode 100644 index 00000000000..dc25ee5622a --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/self_metric_lag.go @@ -0,0 +1,70 @@ +/* +Copyright 2024 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 base + +import ( + "context" + "sync/atomic" + "time" + + "vitess.io/vitess/go/constants/sidecar" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" +) + +var ( + lagSelfMetricQueryBase = "select unix_timestamp(now(6))-max(ts/1000000000) as replication_lag from %s.heartbeat" + lagSelfDefaultThreshold = 5 * time.Second +) + +var _ SelfMetric = registerSelfMetric(&LagSelfMetric{}) + +type LagSelfMetric struct { + lagSelfMetricQuery atomic.Value +} + +// SetQuery is only used by unit tests to override the query. +func (m *LagSelfMetric) SetQuery(query string) { + m.lagSelfMetricQuery.Store(query) +} + +func (m *LagSelfMetric) GetQuery() string { + if query := m.lagSelfMetricQuery.Load(); query == nil { + m.lagSelfMetricQuery.Store(sqlparser.BuildParsedQuery(lagSelfMetricQueryBase, sidecar.GetIdentifier()).Query) + } + return m.lagSelfMetricQuery.Load().(string) +} + +func (m *LagSelfMetric) Name() MetricName { + return LagMetricName +} + +func (m *LagSelfMetric) DefaultScope() Scope { + return ShardScope +} + +func (m *LagSelfMetric) DefaultThreshold() float64 { + return lagSelfDefaultThreshold.Seconds() +} + +func (m *LagSelfMetric) RequiresConn() bool { + return true +} + +func (m *LagSelfMetric) Read(ctx context.Context, throttler ThrottlerMetricsPublisher, conn *connpool.Conn) *ThrottleMetric { + return ReadSelfMySQLThrottleMetric(ctx, conn, m.GetQuery()) +} diff --git a/go/vt/vttablet/tabletserver/throttle/base/self_metric_loadavg.go b/go/vt/vttablet/tabletserver/throttle/base/self_metric_loadavg.go new file mode 100644 index 00000000000..40a2878421a --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/self_metric_loadavg.go @@ -0,0 +1,81 @@ +/* +Copyright 2024 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 base + +import ( + "context" + "fmt" + "os" + "runtime" + "strconv" + "strings" + + "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" +) + +var ( + loadavgOnlyAvailableOnLinuxMetric = &ThrottleMetric{ + Scope: SelfScope, + Err: fmt.Errorf("loadavg metric is only available on Linux"), + } +) + +var _ SelfMetric = registerSelfMetric(&LoadAvgSelfMetric{}) + +type LoadAvgSelfMetric struct { +} + +func (m *LoadAvgSelfMetric) Name() MetricName { + return LoadAvgMetricName +} + +func (m *LoadAvgSelfMetric) DefaultScope() Scope { + return SelfScope +} + +func (m *LoadAvgSelfMetric) DefaultThreshold() float64 { + return 1.0 +} + +func (m *LoadAvgSelfMetric) RequiresConn() bool { + return false +} + +func (m *LoadAvgSelfMetric) Read(ctx context.Context, throttler ThrottlerMetricsPublisher, conn *connpool.Conn) *ThrottleMetric { + if runtime.GOOS != "linux" { + return loadavgOnlyAvailableOnLinuxMetric + } + metric := &ThrottleMetric{ + Scope: SelfScope, + } + { + content, err := os.ReadFile("/proc/loadavg") + if err != nil { + return metric.WithError(err) + } + fields := strings.Fields(string(content)) + if len(fields) == 0 { + return metric.WithError(fmt.Errorf("unexpected /proc/loadavg content")) + } + loadAvg, err := strconv.ParseFloat(fields[0], 64) + if err != nil { + return metric.WithError(err) + } + metric.Value = loadAvg / float64(runtime.NumCPU()) + } + return metric +} diff --git a/go/vt/vttablet/tabletserver/throttle/base/self_metric_threads_running.go b/go/vt/vttablet/tabletserver/throttle/base/self_metric_threads_running.go new file mode 100644 index 00000000000..08f7d408d1c --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/self_metric_threads_running.go @@ -0,0 +1,52 @@ +/* +Copyright 2024 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 base + +import ( + "context" + + "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" +) + +var ( + threadsRunningMetricQuery = "show global status like 'threads_running'" +) + +var _ SelfMetric = registerSelfMetric(&ThreadsRunningSelfMetric{}) + +type ThreadsRunningSelfMetric struct { +} + +func (m *ThreadsRunningSelfMetric) Name() MetricName { + return ThreadsRunningMetricName +} + +func (m *ThreadsRunningSelfMetric) DefaultScope() Scope { + return SelfScope +} + +func (m *ThreadsRunningSelfMetric) DefaultThreshold() float64 { + return 100 +} + +func (m *ThreadsRunningSelfMetric) RequiresConn() bool { + return true +} + +func (m *ThreadsRunningSelfMetric) Read(ctx context.Context, throttler ThrottlerMetricsPublisher, conn *connpool.Conn) *ThrottleMetric { + return ReadSelfMySQLThrottleMetric(ctx, conn, threadsRunningMetricQuery) +} diff --git a/go/vt/vttablet/tabletserver/throttle/base/throttle_metric.go b/go/vt/vttablet/tabletserver/throttle/base/throttle_metric.go deleted file mode 100644 index 054687cdd3f..00000000000 --- a/go/vt/vttablet/tabletserver/throttle/base/throttle_metric.go +++ /dev/null @@ -1,260 +0,0 @@ -/* -Copyright 2023 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 base - -import ( - "errors" - "fmt" - "slices" - "strings" -) - -// Scope defines the tablet range from which a metric is collected. This can be the local tablet -// ("self") or the entire shard ("shard") -type Scope string - -const ( - UndefinedScope Scope = "" - ShardScope Scope = "shard" - SelfScope Scope = "self" -) - -func (s Scope) String() string { - return string(s) -} - -func ScopeFromString(s string) (Scope, error) { - switch scope := Scope(s); scope { - case UndefinedScope, ShardScope, SelfScope: - return scope, nil - default: - return "", fmt.Errorf("unknown scope: %s", s) - } -} - -// MetricName is a formalized name for a metric, such as "lag" or "threads_running". A metric name -// may include a scope, such as "self/lag" or "shard/threads_running". It is possible to add a -// scope to a name, or to parse the scope out of a name, and there is also always a default scope -// associated with a metric name. -type MetricName string - -// MetricNames is a formalized list of metric names -type MetricNames []MetricName - -func (names MetricNames) Contains(name MetricName) bool { - return slices.Contains(names, name) -} - -func (names MetricNames) String() string { - s := make([]string, len(names)) - for i, name := range names { - s[i] = name.String() - } - return strings.Join(s, ",") -} - -// Unique returns a subset of unique metric names, in same order as the original names -func (names MetricNames) Unique() MetricNames { - if names == nil { - return nil - } - uniqueMetricNamesMap := map[MetricName]bool{} - uniqueMetricNames := MetricNames{} - for _, metricName := range names { - if _, ok := uniqueMetricNamesMap[metricName]; !ok { - uniqueMetricNames = append(uniqueMetricNames, metricName) - uniqueMetricNamesMap[metricName] = true - } - } - return uniqueMetricNames -} - -const ( - DefaultMetricName MetricName = "default" - LagMetricName MetricName = "lag" - ThreadsRunningMetricName MetricName = "threads_running" - CustomMetricName MetricName = "custom" - LoadAvgMetricName MetricName = "loadavg" -) - -func (metric MetricName) DefaultScope() Scope { - switch metric { - case LagMetricName: - return ShardScope - default: - return SelfScope - } -} - -func (metric MetricName) String() string { - return string(metric) -} - -// AggregatedName returns the string representation of this metric in the given scope, e.g.: -// - "self/loadavg" -// - "shard/lag" -func (metric MetricName) AggregatedName(scope Scope) string { - if metric == DefaultMetricName { - // backwards (v20) compatibility - return scope.String() - } - if scope == UndefinedScope { - scope = metric.DefaultScope() - } - return fmt.Sprintf("%s/%s", scope.String(), metric.String()) -} - -// Disaggregated returns a breakdown of this metric into scope + name. -func (metric MetricName) Disaggregated() (scope Scope, metricName MetricName, err error) { - return DisaggregateMetricName(metric.String()) -} - -var KnownMetricNames = MetricNames{ - DefaultMetricName, - LagMetricName, - ThreadsRunningMetricName, - CustomMetricName, - LoadAvgMetricName, -} - -type AggregatedMetricName struct { - Scope Scope - Metric MetricName -} - -var ( - // aggregatedMetricNames precomputes the aggregated metric names for all known metric names, - // mapped to their breakdowns. e.g. "self/loadavg" -> {SelfScope, LoadAvgMetricName} - // This means: - // - no textual parsing is needed in the critical path - // - we can easily check if a metric name is valid - aggregatedMetricNames map[string]AggregatedMetricName -) - -func init() { - aggregatedMetricNames = make(map[string]AggregatedMetricName, 3*len(KnownMetricNames)) - for _, metricName := range KnownMetricNames { - aggregatedMetricNames[metricName.String()] = AggregatedMetricName{ - Scope: metricName.DefaultScope(), - Metric: metricName, - } - for _, scope := range []Scope{ShardScope, SelfScope} { - aggregatedName := metricName.AggregatedName(scope) - aggregatedMetricNames[aggregatedName] = AggregatedMetricName{ - Scope: scope, - Metric: metricName, - } - } - } -} - -// DisaggregateMetricName splits a metric name into its scope name and metric name -// aggregated metric name could be in the form: -// - loadavg -// - self -// - self/threads_running -// - shard -// - shard/lag -func DisaggregateMetricName(aggregatedMetricName string) (scope Scope, metricName MetricName, err error) { - breakdown, ok := aggregatedMetricNames[aggregatedMetricName] - if !ok { - return UndefinedScope, DefaultMetricName, ErrNoSuchMetric - } - return breakdown.Scope, breakdown.Metric, nil -} - -// MetricResult is what we expect our probes to return. This can be a numeric result, or -// a special type of result indicating more meta-information -type MetricResult interface { - Get() (float64, error) -} - -// MetricResultFunc is a function that returns a metric result -type MetricResultFunc func() (metricResult MetricResult, threshold float64) - -type MetricResultMap map[MetricName]MetricResult - -func NewMetricResultMap() MetricResultMap { - result := make(MetricResultMap, len(KnownMetricNames)) - for _, metricName := range KnownMetricNames { - result[metricName] = nil - } - return result -} - -// ErrThresholdExceeded is the common error one may get checking on metric result -var ErrThresholdExceeded = errors.New("threshold exceeded") -var ErrNoResultYet = errors.New("metric not collected yet") - -// ErrNoSuchMetric is for when a user requests a metric by an unknown metric name -var ErrNoSuchMetric = errors.New("no such metric") - -// ErrInvalidCheckType is an internal error indicating an unknown check type -var ErrInvalidCheckType = errors.New("unknown throttler check type") - -// IsDialTCPError sees if the given error indicates a TCP issue -func IsDialTCPError(e error) bool { - if e == nil { - return false - } - return strings.HasPrefix(e.Error(), "dial tcp") -} - -type noHostsMetricResult struct{} - -// Get implements MetricResult -func (metricResult *noHostsMetricResult) Get() (float64, error) { - return 0, nil -} - -// NoHostsMetricResult is a result indicating "no hosts" -var NoHostsMetricResult = &noHostsMetricResult{} - -type noMetricResultYet struct{} - -// Get implements MetricResult -func (metricResult *noMetricResultYet) Get() (float64, error) { - return 0, ErrNoResultYet -} - -// NoMetricResultYet is a result indicating "no data" -var NoMetricResultYet = &noMetricResultYet{} - -type noSuchMetric struct{} - -// Get implements MetricResult -func (metricResult *noSuchMetric) Get() (float64, error) { - return 0, ErrNoSuchMetric -} - -// NoSuchMetric is a metric results for an unknown metric name -var NoSuchMetric = &noSuchMetric{} - -// simpleMetricResult is a result with float value -type simpleMetricResult struct { - Value float64 -} - -// NewSimpleMetricResult creates a simpleMetricResult -func NewSimpleMetricResult(value float64) MetricResult { - return &simpleMetricResult{Value: value} -} - -// Get implements MetricResult -func (metricResult *simpleMetricResult) Get() (float64, error) { - return metricResult.Value, nil -} diff --git a/go/vt/vttablet/tabletserver/throttle/base/throttle_metric_app.go b/go/vt/vttablet/tabletserver/throttle/base/throttle_metric_app.go deleted file mode 100644 index 482f319365f..00000000000 --- a/go/vt/vttablet/tabletserver/throttle/base/throttle_metric_app.go +++ /dev/null @@ -1,59 +0,0 @@ -/* -Copyright 2023 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 codebase originates from https://github.com/github/freno, See https://github.com/github/freno/blob/master/LICENSE -/* - MIT License - - Copyright (c) 2017 GitHub - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -*/ - -package base - -import ( - "errors" -) - -// ErrAppDenied is seen when an app is denied access -var ErrAppDenied = errors.New("App denied") - -type appDeniedMetric struct{} - -// Get implements MetricResult -func (metricResult *appDeniedMetric) Get() (float64, error) { - return 0, ErrAppDenied -} - -// AppDeniedMetric is a special metric indicating a "denied" situation -var AppDeniedMetric = &appDeniedMetric{} diff --git a/go/vt/vttablet/tabletserver/throttle/base/throttler_metrics_publisher.go b/go/vt/vttablet/tabletserver/throttle/base/throttler_metrics_publisher.go new file mode 100644 index 00000000000..1d2d4d0652c --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/base/throttler_metrics_publisher.go @@ -0,0 +1,23 @@ +/* +Copyright 2024 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 base + +// ThrottlerMetricsPublisher is implemented by throttler.Throttler and is used by SelfMetric +// implementations to query the throttler. +type ThrottlerMetricsPublisher interface { + GetCustomMetricsQuery() string +} diff --git a/go/vt/vttablet/tabletserver/throttle/check.go b/go/vt/vttablet/tabletserver/throttle/check.go index e43c4cab043..ccdfcb2ce23 100644 --- a/go/vt/vttablet/tabletserver/throttle/check.go +++ b/go/vt/vttablet/tabletserver/throttle/check.go @@ -51,6 +51,8 @@ import ( "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" + + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" ) const ( @@ -94,54 +96,65 @@ func (check *ThrottlerCheck) checkAppMetricResult(ctx context.Context, appName s // Handle deprioritized app logic denyApp := false // - metricResult, threshold := check.throttler.AppRequestMetricResult(ctx, appName, metricResultFunc, denyApp) + metricResult, threshold, matchedApp := check.throttler.AppRequestMetricResult(ctx, appName, metricResultFunc, denyApp) if flags.OverrideThreshold > 0 { threshold = flags.OverrideThreshold } value, err := metricResult.Get() if appName == "" { - return NewCheckResult(http.StatusExpectationFailed, value, threshold, fmt.Errorf("no app indicated")) + return NewCheckResult(tabletmanagerdatapb.CheckThrottlerResponseCode_APP_DENIED, http.StatusExpectationFailed, value, threshold, "", fmt.Errorf("no app indicated")) } var statusCode int + var responseCode tabletmanagerdatapb.CheckThrottlerResponseCode switch { case err == base.ErrAppDenied: // app specifically not allowed to get metrics statusCode = http.StatusExpectationFailed // 417 + responseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_APP_DENIED case err == base.ErrNoSuchMetric: // not collected yet, or metric does not exist statusCode = http.StatusNotFound // 404 + responseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_UNKNOWN_METRIC case err != nil: // any error statusCode = http.StatusInternalServerError // 500 + responseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_INTERNAL_ERROR case value > threshold: // casual throttling statusCode = http.StatusTooManyRequests // 429 + responseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED err = base.ErrThresholdExceeded default: // all good! statusCode = http.StatusOK // 200 + responseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_OK } - return NewCheckResult(statusCode, value, threshold, err) + return NewCheckResult(responseCode, statusCode, value, threshold, matchedApp, err) } // Check is the core function that runs when a user wants to check a metric func (check *ThrottlerCheck) Check(ctx context.Context, appName string, scope base.Scope, metricNames base.MetricNames, flags *CheckFlags) (checkResult *CheckResult) { checkResult = &CheckResult{ - StatusCode: http.StatusOK, - Metrics: make(map[string]*MetricResult), + StatusCode: http.StatusOK, + ResponseCode: tabletmanagerdatapb.CheckThrottlerResponseCode_OK, + Metrics: make(map[string]*MetricResult), } if len(metricNames) == 0 { metricNames = base.MetricNames{check.throttler.metricNameUsedAsDefault()} } metricNames = metricNames.Unique() - applyMetricToCheckResult := func(metric *MetricResult) { + applyMetricToCheckResult := func(metricName base.MetricName, metric *MetricResult) { checkResult.StatusCode = metric.StatusCode + checkResult.ResponseCode = metric.ResponseCode checkResult.Value = metric.Value checkResult.Threshold = metric.Threshold checkResult.Error = metric.Error checkResult.Message = metric.Message + checkResult.AppName = metric.AppName + checkResult.Scope = metric.Scope + checkResult.MetricName = metricName.String() } for _, metricName := range metricNames { // Make sure not to modify the given scope. We create a new scope variable to work with. @@ -168,7 +181,7 @@ func (check *ThrottlerCheck) Check(ctx context.Context, appName string, scope ba metricCheckResult := check.checkAppMetricResult(ctx, appName, metricResultFunc, flags) if !throttlerapp.VitessName.Equals(appName) { - go func(statusCode int) { + go func(metricCheckResult *CheckResult) { if metricScope == base.UndefinedScope { // While we should never get here, the following code will panic if we do // because it will attempt to recreate ThrottlerCheckAnyTotal. @@ -176,21 +189,23 @@ func (check *ThrottlerCheck) Check(ctx context.Context, appName string, scope ba return } stats.GetOrNewCounter(fmt.Sprintf("ThrottlerCheck%s%sTotal", textutil.SingleWordCamel(metricScope.String()), textutil.SingleWordCamel(metricName.String())), "").Add(1) - if statusCode != http.StatusOK { + if !metricCheckResult.IsOK() { stats.GetOrNewCounter(fmt.Sprintf("ThrottlerCheck%s%sError", textutil.SingleWordCamel(metricScope.String()), textutil.SingleWordCamel(metricName.String())), "").Add(1) } - }(metricCheckResult.StatusCode) + }(metricCheckResult) } if metricCheckResult.RecentlyChecked { checkResult.RecentlyChecked = true } metric := &MetricResult{ - StatusCode: metricCheckResult.StatusCode, - Value: metricCheckResult.Value, - Threshold: metricCheckResult.Threshold, - Error: metricCheckResult.Error, - Message: metricCheckResult.Message, - Scope: metricScope.String(), // This reports back the actual scope used for the check + StatusCode: metricCheckResult.StatusCode, + ResponseCode: metricCheckResult.ResponseCode, + Value: metricCheckResult.Value, + Threshold: metricCheckResult.Threshold, + Error: metricCheckResult.Error, + Message: metricCheckResult.Message, + AppName: metricCheckResult.AppName, + Scope: metricScope.String(), // This reports back the actual scope used for the check } checkResult.Metrics[metricName.String()] = metric if flags.MultiMetricsEnabled && !metricCheckResult.IsOK() && metricName != base.DefaultMetricName { @@ -199,25 +214,26 @@ func (check *ThrottlerCheck) Check(ctx context.Context, appName string, scope ba // metrics, because a v20 primary would not know how to deal with it, and is not expecting any of those // metrics. // The only metric we ever report back is the default metric, see below. - applyMetricToCheckResult(metric) + applyMetricToCheckResult(metricName, metric) } } - if metric, ok := checkResult.Metrics[check.throttler.metricNameUsedAsDefault().String()]; ok && checkResult.IsOK() { - applyMetricToCheckResult(metric) + metricNameUsedAsDefault := check.throttler.metricNameUsedAsDefault() + if metric, ok := checkResult.Metrics[metricNameUsedAsDefault.String()]; ok && checkResult.IsOK() { + applyMetricToCheckResult(metricNameUsedAsDefault, metric) } if metric, ok := checkResult.Metrics[base.DefaultMetricName.String()]; ok && checkResult.IsOK() { // v20 compatibility: if this v21 server is a replica, reporting to a v20 primary, // then we must supply the v20-flavor check result. // If checkResult is not OK, then we will have populated these fields already by the failing metric. - applyMetricToCheckResult(metric) + applyMetricToCheckResult(base.DefaultMetricName, metric) } - go func(statusCode int) { + go func(checkResult *CheckResult) { statsThrottlerCheckAnyTotal.Add(1) - if statusCode != http.StatusOK { + if !checkResult.IsOK() { statsThrottlerCheckAnyError.Add(1) } - }(checkResult.StatusCode) - go check.throttler.markRecentApp(appName, checkResult.StatusCode) + }(checkResult) + go check.throttler.markRecentApp(appName, checkResult.StatusCode, checkResult.ResponseCode) return checkResult } @@ -229,7 +245,7 @@ func (check *ThrottlerCheck) localCheck(ctx context.Context, aggregatedMetricNam } checkResult = check.Check(ctx, throttlerapp.VitessName.String(), scope, base.MetricNames{metricName}, selfCheckFlags) - if checkResult.StatusCode == http.StatusOK { + if checkResult.IsOK() { check.throttler.markMetricHealthy(aggregatedMetricName) } if timeSinceHealthy, found := check.throttler.timeSinceMetricHealthy(aggregatedMetricName); found { diff --git a/go/vt/vttablet/tabletserver/throttle/check_result.go b/go/vt/vttablet/tabletserver/throttle/check_result.go index 3c8852e4042..34532b7ce37 100644 --- a/go/vt/vttablet/tabletserver/throttle/check_result.go +++ b/go/vt/vttablet/tabletserver/throttle/check_result.go @@ -42,38 +42,78 @@ limitations under the License. package throttle import ( + "fmt" "net/http" + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" ) +// ResponseCodeFromStatus returns a ResponseCode based on either given response code or HTTP status code. +// It is used to handle the transition period from v20 to v21 where v20 only returns HTTP status code. +// In v22 and beyond, the HTTP status code will be removed, and so will this function. +func ResponseCodeFromStatus(responseCode tabletmanagerdatapb.CheckThrottlerResponseCode, statusCode int) tabletmanagerdatapb.CheckThrottlerResponseCode { + if responseCode != tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED { + return responseCode + } + switch statusCode { + case http.StatusOK: + return tabletmanagerdatapb.CheckThrottlerResponseCode_OK + case http.StatusExpectationFailed: + return tabletmanagerdatapb.CheckThrottlerResponseCode_APP_DENIED + case http.StatusTooManyRequests: + return tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED + case http.StatusNotFound: + return tabletmanagerdatapb.CheckThrottlerResponseCode_UNKNOWN_METRIC + case http.StatusInternalServerError: + return tabletmanagerdatapb.CheckThrottlerResponseCode_INTERNAL_ERROR + default: + return tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED + } +} + type MetricResult struct { - StatusCode int `json:"StatusCode"` - Scope string `json:"Scope"` - Value float64 `json:"Value"` - Threshold float64 `json:"Threshold"` - Error error `json:"-"` - Message string `json:"Message"` + ResponseCode tabletmanagerdatapb.CheckThrottlerResponseCode `json:"ResponseCode"` + StatusCode int `json:"StatusCode"` + Scope string `json:"Scope"` + Value float64 `json:"Value"` + Threshold float64 `json:"Threshold"` + Error error `json:"-"` + Message string `json:"Message"` + AppName string `json:"AppName"` +} + +func (m *MetricResult) IsOK() bool { + if m.ResponseCode != tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED { + return m.ResponseCode == tabletmanagerdatapb.CheckThrottlerResponseCode_OK + } + return m.StatusCode == http.StatusOK } // CheckResult is the result for an app inquiring on a metric. It also exports as JSON via the API type CheckResult struct { - StatusCode int `json:"StatusCode"` - Value float64 `json:"Value"` - Threshold float64 `json:"Threshold"` - Error error `json:"-"` - Message string `json:"Message"` - RecentlyChecked bool `json:"RecentlyChecked"` - Metrics map[string]*MetricResult `json:"Metrics"` // New in multi-metrics support. Will eventually replace the above fields. + ResponseCode tabletmanagerdatapb.CheckThrottlerResponseCode `json:"ResponseCode"` + StatusCode int `json:"StatusCode"` + Value float64 `json:"Value"` + Threshold float64 `json:"Threshold"` + Error error `json:"-"` + Message string `json:"Message"` + RecentlyChecked bool `json:"RecentlyChecked"` + AppName string `json:"AppName"` + MetricName string `json:"MetricName"` + Scope string `json:"Scope"` + Metrics map[string]*MetricResult `json:"Metrics"` // New in multi-metrics support. Will eventually replace the above fields. } // NewCheckResult returns a CheckResult -func NewCheckResult(statusCode int, value float64, threshold float64, err error) *CheckResult { +func NewCheckResult(responseCode tabletmanagerdatapb.CheckThrottlerResponseCode, statusCode int, value float64, threshold float64, appName string, err error) *CheckResult { result := &CheckResult{ - StatusCode: statusCode, - Value: value, - Threshold: threshold, - Error: err, + ResponseCode: responseCode, + StatusCode: statusCode, + Value: value, + Threshold: threshold, + AppName: appName, + Error: err, } if err != nil { result.Message = err.Error() @@ -82,17 +122,38 @@ func NewCheckResult(statusCode int, value float64, threshold float64, err error) } func (c *CheckResult) IsOK() bool { + if c.ResponseCode != tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED { + return c.ResponseCode == tabletmanagerdatapb.CheckThrottlerResponseCode_OK + } return c.StatusCode == http.StatusOK } +// Summary returns a human-readable summary of the check result +func (c *CheckResult) Summary() string { + switch ResponseCodeFromStatus(c.ResponseCode, c.StatusCode) { + case tabletmanagerdatapb.CheckThrottlerResponseCode_OK: + return fmt.Sprintf("%s is granted access", c.AppName) + case tabletmanagerdatapb.CheckThrottlerResponseCode_APP_DENIED: + return fmt.Sprintf("%s is explicitly denied access", c.AppName) + case tabletmanagerdatapb.CheckThrottlerResponseCode_INTERNAL_ERROR: + return fmt.Sprintf("%s is denied access due to unexpected error: %v", c.AppName, c.Error) + case tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED: + return fmt.Sprintf("%s is denied access due to %s/%s metric value %v exceeding threshold %v", c.AppName, c.Scope, c.MetricName, c.Value, c.Threshold) + case tabletmanagerdatapb.CheckThrottlerResponseCode_UNKNOWN_METRIC: + return fmt.Sprintf("%s is denied access due to unknown or uncollected metric", c.AppName) + case tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED: + return "" + default: + return fmt.Sprintf("unknown response code: %v", c.ResponseCode) + } +} + // NewErrorCheckResult returns a check result that indicates an error -func NewErrorCheckResult(statusCode int, err error) *CheckResult { - return NewCheckResult(statusCode, 0, 0, err) +func NewErrorCheckResult(responseCode tabletmanagerdatapb.CheckThrottlerResponseCode, statusCode int, err error) *CheckResult { + return NewCheckResult(responseCode, statusCode, 0, 0, "", err) } // NoSuchMetricCheckResult is a result returns when a metric is unknown -var NoSuchMetricCheckResult = NewErrorCheckResult(http.StatusNotFound, base.ErrNoSuchMetric) - -var okMetricCheckResult = NewCheckResult(http.StatusOK, 0, 0, nil) +var NoSuchMetricCheckResult = NewErrorCheckResult(tabletmanagerdatapb.CheckThrottlerResponseCode_UNKNOWN_METRIC, http.StatusNotFound, base.ErrNoSuchMetric) -var invalidCheckTypeCheckResult = NewErrorCheckResult(http.StatusInternalServerError, base.ErrInvalidCheckType) +var okMetricCheckResult = NewCheckResult(tabletmanagerdatapb.CheckThrottlerResponseCode_OK, http.StatusOK, 0, 0, "", nil) diff --git a/go/vt/vttablet/tabletserver/throttle/check_result_test.go b/go/vt/vttablet/tabletserver/throttle/check_result_test.go new file mode 100644 index 00000000000..fdb0ee600ba --- /dev/null +++ b/go/vt/vttablet/tabletserver/throttle/check_result_test.go @@ -0,0 +1,143 @@ +/* +Copyright 2024 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 throttle + +import ( + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" +) + +func TestReponseCodeFromStatus(t *testing.T) { + tcases := []struct { + responseCode tabletmanagerdatapb.CheckThrottlerResponseCode + statusCode int + expect tabletmanagerdatapb.CheckThrottlerResponseCode + }{ + { + tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED, + http.StatusOK, + tabletmanagerdatapb.CheckThrottlerResponseCode_OK, + }, + { + tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED, + http.StatusExpectationFailed, + tabletmanagerdatapb.CheckThrottlerResponseCode_APP_DENIED, + }, + { + tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED, + http.StatusNotFound, + tabletmanagerdatapb.CheckThrottlerResponseCode_UNKNOWN_METRIC, + }, + { + tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED, + http.StatusInternalServerError, + tabletmanagerdatapb.CheckThrottlerResponseCode_INTERNAL_ERROR, + }, + { + tabletmanagerdatapb.CheckThrottlerResponseCode_UNDEFINED, + http.StatusTooManyRequests, + tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED, + }, + { + tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED, + http.StatusTooManyRequests, + tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED, + }, + { + tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED, + http.StatusOK, + tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED, + }, + } + for _, tcase := range tcases { + t.Run("", func(t *testing.T) { + result := ResponseCodeFromStatus(tcase.responseCode, tcase.statusCode) + assert.Equal(t, tcase.expect, result) + }) + } +} + +func TestCheckResultSummary(t *testing.T) { + tcases := []struct { + checkResult *CheckResult + summary string + }{ + { + checkResult: &CheckResult{}, + summary: "", + }, + { + checkResult: &CheckResult{ + StatusCode: http.StatusOK, + AppName: "test", + }, + summary: "test is granted access", + }, + { + checkResult: &CheckResult{ + StatusCode: http.StatusTooManyRequests, + AppName: "test", + MetricName: "bugginess", + Threshold: 100, + Value: 200, + Scope: "self", + }, + summary: "test is denied access due to self/bugginess metric value 200 exceeding threshold 100", + }, + { + checkResult: &CheckResult{ + StatusCode: http.StatusExpectationFailed, + AppName: "test", + }, + summary: "test is explicitly denied access", + }, + { + checkResult: &CheckResult{ + ResponseCode: tabletmanagerdatapb.CheckThrottlerResponseCode_OK, + AppName: "test", + }, + summary: "test is granted access", + }, + { + checkResult: &CheckResult{ + ResponseCode: tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED, + AppName: "test", + MetricName: "bugginess", + Threshold: 100, + Value: 200, + Scope: "self", + }, + summary: "test is denied access due to self/bugginess metric value 200 exceeding threshold 100", + }, + { + checkResult: &CheckResult{ + ResponseCode: tabletmanagerdatapb.CheckThrottlerResponseCode_APP_DENIED, + AppName: "test", + }, + summary: "test is explicitly denied access", + }, + } + for _, tcase := range tcases { + t.Run(tcase.summary, func(t *testing.T) { + assert.Equal(t, tcase.summary, tcase.checkResult.Summary()) + }) + } +} diff --git a/go/vt/vttablet/tabletserver/throttle/client.go b/go/vt/vttablet/tabletserver/throttle/client.go index e8eed627e04..8549fb099b6 100644 --- a/go/vt/vttablet/tabletserver/throttle/client.go +++ b/go/vt/vttablet/tabletserver/throttle/client.go @@ -18,7 +18,6 @@ package throttle import ( "context" - "net/http" "sync" "sync/atomic" "time" @@ -31,8 +30,11 @@ const ( throttleCheckDuration = 250 * time.Millisecond ) -var throttleTicks int64 -var throttleInit sync.Once +var ( + throttleTicks int64 + throttleInit sync.Once + emptyCheckResult = &CheckResult{} +) func initThrottleTicker() { throttleInit.Do(func() { @@ -87,14 +89,14 @@ func (c *Client) clearSuccessfulResultsCache() { // The function caches results for a brief amount of time, hence it's safe and efficient to // be called very frequently. // The function is not thread safe. -func (c *Client) ThrottleCheckOK(ctx context.Context, overrideAppName throttlerapp.Name) (throttleCheckOK bool) { +func (c *Client) ThrottleCheckOK(ctx context.Context, overrideAppName throttlerapp.Name) (checkResult *CheckResult, throttleCheckOK bool) { if c == nil { // no client - return true + return emptyCheckResult, true } if c.throttler == nil { // no throttler - return true + return emptyCheckResult, true } checkApp := c.appName if overrideAppName != "" { @@ -104,20 +106,20 @@ func (c *Client) ThrottleCheckOK(ctx context.Context, overrideAppName throttlera defer c.lastSuccessfulThrottleMu.Unlock() if c.lastSuccessfulThrottle[checkApp.String()] >= atomic.LoadInt64(&throttleTicks) { // if last check was OK just very recently there is no need to check again - return true + return emptyCheckResult, true } // It's time to run a throttler check - checkResult := c.throttler.Check(ctx, checkApp.String(), nil, &c.flags) - if checkResult.StatusCode != http.StatusOK { - return false + checkResult = c.throttler.Check(ctx, checkApp.String(), nil, &c.flags) + if !checkResult.IsOK() { + return checkResult, false } for _, metricResult := range checkResult.Metrics { - if metricResult.StatusCode != http.StatusOK { - return false + if !metricResult.IsOK() { + return checkResult, false } } c.lastSuccessfulThrottle[checkApp.String()] = atomic.LoadInt64(&throttleTicks) - return true + return checkResult, true } @@ -125,22 +127,23 @@ func (c *Client) ThrottleCheckOK(ctx context.Context, overrideAppName throttlera // otherwise it briefly sleeps and returns 'false'. // Non-empty appName overrides the default appName. // The function is not thread safe. -func (c *Client) ThrottleCheckOKOrWaitAppName(ctx context.Context, appName throttlerapp.Name) bool { - if c.ThrottleCheckOK(ctx, appName) { - return true +func (c *Client) ThrottleCheckOKOrWaitAppName(ctx context.Context, appName throttlerapp.Name) (checkResult *CheckResult, throttleCheckOK bool) { + checkResult, throttleCheckOK = c.ThrottleCheckOK(ctx, appName) + if throttleCheckOK { + return checkResult, true } if ctx.Err() != nil { // context expired, skip sleeping - return false + return checkResult, false } time.Sleep(throttleCheckDuration) - return false + return checkResult, false } // ThrottleCheckOKOrWait checks the throttler; if throttler is satisfied, the function returns 'true' immediately, // otherwise it briefly sleeps and returns 'false'. // The function is not thread safe. -func (c *Client) ThrottleCheckOKOrWait(ctx context.Context) bool { +func (c *Client) ThrottleCheckOKOrWait(ctx context.Context) (checkResult *CheckResult, throttleCheckOK bool) { return c.ThrottleCheckOKOrWaitAppName(ctx, "") } @@ -148,7 +151,10 @@ func (c *Client) ThrottleCheckOKOrWait(ctx context.Context) bool { // The function sleeps between throttle checks. // The function is not thread safe. func (c *Client) Throttle(ctx context.Context) { - for !c.ThrottleCheckOKOrWait(ctx) { + for { + if _, ok := c.ThrottleCheckOKOrWait(ctx); ok { + return + } // The function incorporates a bit of sleep so this is not a busy wait. } } diff --git a/go/vt/vttablet/tabletserver/throttle/config/mysql_config.go b/go/vt/vttablet/tabletserver/throttle/config/mysql_config.go index d4beb40deb4..76d5f2dd298 100644 --- a/go/vt/vttablet/tabletserver/throttle/config/mysql_config.go +++ b/go/vt/vttablet/tabletserver/throttle/config/mysql_config.go @@ -41,32 +41,15 @@ limitations under the License. package config -import ( - "sync/atomic" - - "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" -) - // // MySQL-specific configuration // -type MySQLMetricConfigurationSettings struct { - Name base.MetricName - CustomQuery string - Threshold atomic.Uint64 -} - // MySQLConfigurationSettings has the general configuration for all MySQL clusters type MySQLConfigurationSettings struct { - CacheMillis int // optional, if defined then probe result will be cached, and future probes may use cached value - Port int // Specify if different than 3306; applies to all clusters - IgnoreDialTCPErrors bool // Skip hosts where a metric cannot be retrieved due to TCP dial errors - IgnoreHostsCount int // Number of hosts that can be skipped/ignored even on error or on exceeding thresholds - IgnoreHostsThreshold float64 // Threshold beyond which IgnoreHostsCount applies (default: 0) - HTTPCheckPort int // port for HTTP check. -1 to disable. - HTTPCheckPath string // If non-empty, requires HTTPCheckPort - IgnoreHosts []string // If non empty, substrings to indicate hosts to be ignored/skipped - - Metrics map[base.MetricName]*MySQLMetricConfigurationSettings + CacheMillis int // optional, if defined then probe result will be cached, and future probes may use cached value + Port int // Specify if different than 3306; applies to all clusters + IgnoreDialTCPErrors bool // Skip hosts where a metric cannot be retrieved due to TCP dial errors + IgnoreHostsCount int // Number of hosts that can be skipped/ignored even on error or on exceeding thresholds + IgnoreHosts []string // If non empty, substrings to indicate hosts to be ignored/skipped } diff --git a/go/vt/vttablet/tabletserver/throttle/throttler.go b/go/vt/vttablet/tabletserver/throttle/throttler.go index 73458974dcb..af7f59abb7e 100644 --- a/go/vt/vttablet/tabletserver/throttle/throttler.go +++ b/go/vt/vttablet/tabletserver/throttle/throttler.go @@ -42,15 +42,12 @@ limitations under the License. package throttle import ( - "bufio" "context" "errors" "fmt" "math" "math/rand/v2" "net/http" - "os" - "strconv" "strings" "sync" "sync/atomic" @@ -59,17 +56,13 @@ import ( "github.com/patrickmn/go-cache" "github.com/spf13/pflag" - "vitess.io/vitess/go/constants/sidecar" "vitess.io/vitess/go/protoutil" "vitess.io/vitess/go/stats" "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/timer" "vitess.io/vitess/go/vt/log" - tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" - topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/servenv" - "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/srvtopo" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/topoproto" @@ -80,6 +73,9 @@ import ( "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/config" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" "vitess.io/vitess/go/vt/vttablet/tmclient" + + tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) const ( @@ -107,14 +103,6 @@ const ( var ( throttleTabletTypes = "replica" - - defaultThresholds = map[base.MetricName]float64{ - base.DefaultMetricName: 5 * time.Second.Seconds(), - base.LagMetricName: 5 * time.Second.Seconds(), - base.ThreadsRunningMetricName: 100, - base.CustomMetricName: 0, - base.LoadAvgMetricName: 1.0, - } ) var ( @@ -146,9 +134,9 @@ type throttlerTopoService interface { // Throttler is the main entity in the throttling mechanism. This service runs, probes, collects data, // aggregates, reads inventory, provides information, etc. type Throttler struct { - keyspace string - shard string - cell string + keyspace string + shard string + tabletAlias *topodatapb.TabletAlias check *ThrottlerCheck isEnabled atomic.Bool @@ -171,7 +159,6 @@ type Throttler struct { srvTopoServer srvtopo.Server heartbeatWriter heartbeat.HeartbeatWriter overrideTmClient tmclient.TabletManagerClient - tabletAlias string recentCheckRateLimiter *timer.RateLimiter recentCheckDormantDiff int64 @@ -186,7 +173,6 @@ type Throttler struct { inventory *base.Inventory - metricsQuery atomic.Value customMetricsQuery atomic.Value MetricsThreshold atomic.Uint64 checkAsCheckSelf atomic.Bool @@ -205,10 +191,6 @@ type Throttler struct { throttledAppsMutex sync.Mutex readSelfThrottleMetrics func(context.Context) base.ThrottleMetrics // overwritten by unit test - - httpClient *http.Client - - hostCpuCoreCount atomic.Int32 } // ThrottlerStatus published some status values from the throttler @@ -236,9 +218,9 @@ type ThrottlerStatus struct { } // NewThrottler creates a Throttler -func NewThrottler(env tabletenv.Env, srvTopoServer srvtopo.Server, ts *topo.Server, cell string, heartbeatWriter heartbeat.HeartbeatWriter, tabletTypeFunc func() topodatapb.TabletType) *Throttler { +func NewThrottler(env tabletenv.Env, srvTopoServer srvtopo.Server, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, heartbeatWriter heartbeat.HeartbeatWriter, tabletTypeFunc func() topodatapb.TabletType) *Throttler { throttler := &Throttler{ - cell: cell, + tabletAlias: tabletAlias, env: env, tabletTypeFunc: tabletTypeFunc, srvTopoServer: srvTopoServer, @@ -263,7 +245,6 @@ func NewThrottler(env tabletenv.Env, srvTopoServer srvtopo.Server, ts *topo.Serv throttler.metricsHealth = cache.New(cache.NoExpiration, 0) throttler.appCheckedMetrics = cache.New(cache.NoExpiration, 0) - throttler.httpClient = base.SetupHTTPClient(2 * activeCollectInterval) throttler.initThrottleTabletTypes() throttler.check = NewThrottlerCheck(throttler) @@ -280,14 +261,21 @@ func NewThrottler(env tabletenv.Env, srvTopoServer srvtopo.Server, ts *topo.Serv throttler.recentCheckDiff = 1 } - throttler.StoreMetricsThreshold(defaultThresholds[base.LagMetricName]) + throttler.StoreMetricsThreshold(base.RegisteredSelfMetrics[base.LagMetricName].DefaultThreshold()) throttler.readSelfThrottleMetrics = func(ctx context.Context) base.ThrottleMetrics { return throttler.readSelfThrottleMetricsInternal(ctx) } - return throttler } +// tabletAliasString returns tablet alias as string +func (throttler *Throttler) tabletAliasString() string { + if throttler.tabletAlias == nil { + return "" + } + return topoproto.TabletAliasString(throttler.tabletAlias) +} + func (throttler *Throttler) StoreMetricsThreshold(threshold float64) { throttler.MetricsThreshold.Store(math.Float64bits(threshold)) } @@ -315,7 +303,14 @@ func (throttler *Throttler) InitDBConfig(keyspace, shard string) { } func (throttler *Throttler) GetMetricsQuery() string { - return throttler.metricsQuery.Load().(string) + if customQuery := throttler.GetCustomMetricsQuery(); customQuery != "" { + return customQuery + } + lagSelfMetric, ok := base.RegisteredSelfMetrics[base.LagMetricName].(*base.LagSelfMetric) + if !ok { + return "" + } + return lagSelfMetric.GetQuery() } func (throttler *Throttler) GetCustomMetricsQuery() string { @@ -339,32 +334,11 @@ func (throttler *Throttler) initConfig() { IgnoreDialTCPErrors: true, }, } - metrics := make(map[base.MetricName]*config.MySQLMetricConfigurationSettings) - for _, metricsName := range base.KnownMetricNames { - metrics[metricsName] = &config.MySQLMetricConfigurationSettings{ - Name: metricsName, - } - } - metrics[base.DefaultMetricName].CustomQuery = "" - metrics[base.DefaultMetricName].Threshold.Store(throttler.MetricsThreshold.Load()) - - metrics[base.LagMetricName].CustomQuery = sqlparser.BuildParsedQuery(defaultReplicationLagQuery, sidecar.GetIdentifier()).Query - metrics[base.LagMetricName].Threshold.Store(throttler.MetricsThreshold.Load()) - - metrics[base.ThreadsRunningMetricName].CustomQuery = threadsRunningQuery - metrics[base.ThreadsRunningMetricName].Threshold.Store(math.Float64bits(defaultThresholds[base.ThreadsRunningMetricName])) - - metrics[base.CustomMetricName].CustomQuery = "" - metrics[base.CustomMetricName].Threshold.Store(math.Float64bits(defaultThresholds[base.CustomMetricName])) - - metrics[base.LoadAvgMetricName].Threshold.Store(math.Float64bits(defaultThresholds[base.LoadAvgMetricName])) - - throttler.configSettings.MySQLStore.Metrics = metrics } // readThrottlerConfig proactively reads the throttler's config from SrvKeyspace in local topo func (throttler *Throttler) readThrottlerConfig(ctx context.Context) (*topodatapb.ThrottlerConfig, error) { - srvks, err := throttler.ts.GetSrvKeyspace(ctx, throttler.cell, throttler.keyspace) + srvks, err := throttler.ts.GetSrvKeyspace(ctx, throttler.tabletAlias.Cell, throttler.keyspace) if err != nil { return nil, err } @@ -388,7 +362,7 @@ func (throttler *Throttler) normalizeThrottlerConfig(throttlerConfig *topodatapb if throttlerConfig.CustomQuery == "" { // no custom query; we check replication lag if throttlerConfig.Threshold == 0 { - throttlerConfig.Threshold = defaultThresholds[base.LagMetricName] + throttlerConfig.Threshold = base.RegisteredSelfMetrics[base.LagMetricName].DefaultThreshold() } } return throttlerConfig @@ -442,11 +416,6 @@ func (throttler *Throttler) convergeMetricThresholds() { // Note: you should be holding the initMutex when calling this function. func (throttler *Throttler) applyThrottlerConfig(ctx context.Context, throttlerConfig *topodatapb.ThrottlerConfig) { log.Infof("Throttler: applying topo config: %+v", throttlerConfig) - if throttlerConfig.CustomQuery == "" { - throttler.metricsQuery.Store(sqlparser.BuildParsedQuery(defaultReplicationLagQuery, sidecar.GetIdentifier()).Query) - } else { - throttler.metricsQuery.Store(throttlerConfig.CustomQuery) - } throttler.customMetricsQuery.Store(throttlerConfig.CustomQuery) if throttlerConfig.Threshold > 0 || throttlerConfig.CustomQuery != "" { // We do not allow Threshold=0, unless there is a custom query. @@ -616,7 +585,7 @@ func (throttler *Throttler) retryReadAndApplyThrottlerConfig(ctx context.Context go watchSrvKeyspaceOnce.Do(func() { // We start watching SrvKeyspace only after we know it's been created. Now is that time! // We watch using the given ctx, which is cancelled when the throttler is Close()d. - throttler.srvTopoServer.WatchSrvKeyspace(ctx, throttler.cell, throttler.keyspace, throttler.WatchSrvKeyspaceCallback) + throttler.srvTopoServer.WatchSrvKeyspace(ctx, throttler.tabletAlias.Cell, throttler.keyspace, throttler.WatchSrvKeyspaceCallback) }) return } @@ -646,10 +615,6 @@ func (throttler *Throttler) Open() error { log.Infof("Throttler: opening") var ctx context.Context ctx, throttler.cancelOpenContext = context.WithCancel(context.Background()) - // The query needs to be dynamically built because the sidecar database name - // is not known when the TabletServer is created, which in turn creates the - // Throttler. - throttler.metricsQuery.Store(sqlparser.BuildParsedQuery(defaultReplicationLagQuery, sidecar.GetIdentifier()).Query) // default throttler.customMetricsQuery.Store("") throttler.initConfig() throttler.pool.Open(throttler.env.Config().DB.AppWithDB(), throttler.env.Config().DB.DbaWithDB(), throttler.env.Config().DB.AppDebugWithDB()) @@ -726,99 +691,6 @@ func (throttler *Throttler) stimulatePrimaryThrottler(ctx context.Context, tmCli return nil } -func (throttler *Throttler) readSelfLoadAvgPerCore(ctx context.Context) *base.ThrottleMetric { - metric := &base.ThrottleMetric{ - Scope: base.SelfScope, - Alias: throttler.tabletAlias, - } - - coreCount := throttler.hostCpuCoreCount.Load() - if coreCount == 0 { - // Count cores. This number is not going to change in the lifetime of this tablet, - // hence it makes sense to read it once then cache it. - - // We choose to read /proc/cpuinfo over executing "nproc" or similar commands. - var coreCount int32 - f, err := os.Open("/proc/cpuinfo") - if err != nil { - return metric.WithError(err) - } - defer f.Close() - - scanner := bufio.NewScanner(f) - for scanner.Scan() { - if strings.HasPrefix(scanner.Text(), "processor") { - coreCount++ - } - } - - if err := scanner.Err(); err != nil { - return metric.WithError(err) - } - throttler.hostCpuCoreCount.Store(coreCount) - } - if coreCount == 0 { - return metric.WithError(fmt.Errorf("could not determine number of cores")) - } - { - content, err := os.ReadFile("/proc/loadavg") - if err != nil { - return metric.WithError(err) - } - fields := strings.Fields(string(content)) - if len(fields) == 0 { - return metric.WithError(fmt.Errorf("unexpected /proc/loadavg content")) - } - loadAvg, err := strconv.ParseFloat(fields[0], 64) - if err != nil { - return metric.WithError(err) - } - metric.Value = loadAvg / float64(throttler.hostCpuCoreCount.Load()) - } - return metric -} - -// readSelfMySQLThrottleMetric reads the metric from this very tablet or from its backend mysql. -func (throttler *Throttler) readSelfMySQLThrottleMetric(ctx context.Context, query string) *base.ThrottleMetric { - metric := &base.ThrottleMetric{ - Scope: base.SelfScope, - Alias: throttler.tabletAlias, - } - if query == "" { - return metric - } - conn, err := throttler.pool.Get(ctx, nil) - if err != nil { - return metric.WithError(err) - } - defer conn.Recycle() - - tm, err := conn.Conn.Exec(ctx, query, 1, true) - if err != nil { - return metric.WithError(err) - } - row := tm.Named().Row() - if row == nil { - return metric.WithError(fmt.Errorf("no results for readSelfThrottleMetric")) - } - - metricsQueryType := base.GetMetricsQueryType(query) - switch metricsQueryType { - case base.MetricsQueryTypeSelect: - // We expect a single row, single column result. - // The "for" iteration below is just a way to get first result without knowing column name - for k := range row { - metric.Value, metric.Err = row.ToFloat64(k) - } - case base.MetricsQueryTypeShowGlobal: - metric.Value, metric.Err = strconv.ParseFloat(row["Value"].ToString(), 64) - default: - metric.Err = fmt.Errorf("Unsupported metrics query type for query: %s", throttler.GetMetricsQuery()) - } - - return metric -} - // throttledAppsSnapshot returns a snapshot (a copy) of current throttled apps func (throttler *Throttler) throttledAppsSnapshot() map[string]cache.Item { return throttler.throttledApps.Items() @@ -878,6 +750,7 @@ func (throttler *Throttler) Operate(ctx context.Context, wg *sync.WaitGroup) { primaryStimulatorRateLimiter.Stop() throttler.aggregatedMetrics.Flush() throttler.recentApps.Flush() + clear(throttler.inventory.TabletMetrics) }() // we do not flush throttler.throttledApps because this is data submitted by the user; the user expects the data to survive a disable+enable @@ -977,7 +850,7 @@ func (throttler *Throttler) Operate(ctx context.Context, wg *sync.WaitGroup) { } case probes := <-throttler.clusterProbesChan: // incoming structural update, sparse, as result of refreshInventory() - throttler.updateClusterProbes(ctx, probes) + throttler.updateClusterProbes(probes) case <-metricsAggregateTicker.C: if throttler.IsOpen() { throttler.aggregateMetrics() @@ -1031,8 +904,11 @@ func (throttler *Throttler) generateTabletProbeFunction(scope base.Scope, tmClie return metricsWithError(fmt.Errorf("gRPC error accessing tablet %v. Err=%v", probe.Alias, gRPCErr)) } throttleMetric.Value = resp.Value + if resp.ResponseCode == tabletmanagerdatapb.CheckThrottlerResponseCode_INTERNAL_ERROR { + throttleMetric.Err = fmt.Errorf("response code: %d", resp.ResponseCode) + } if resp.StatusCode == http.StatusInternalServerError { - throttleMetric.Err = fmt.Errorf("Status code: %d", resp.StatusCode) + throttleMetric.Err = fmt.Errorf("status code: %d", resp.StatusCode) } if resp.RecentlyChecked { // We have just probed a tablet, and it reported back that someone just recently "check"ed it. @@ -1062,26 +938,45 @@ func (throttler *Throttler) generateTabletProbeFunction(scope base.Scope, tmClie } } +// readSelfThrottleMetricsInternal rreads all registsred self metrics on this tablet (or backend MySQL server). +// This is the actual place where metrics are read, to be later aggregated and/or propagated to other tablets. func (throttler *Throttler) readSelfThrottleMetricsInternal(ctx context.Context) base.ThrottleMetrics { - - writeMetric := func(metricName base.MetricName, metric *base.ThrottleMetric) { - metric.Name = metricName + result := make(base.ThrottleMetrics, len(base.RegisteredSelfMetrics)) + writeMetric := func(metric *base.ThrottleMetric) { select { case <-ctx.Done(): return case throttler.throttleMetricChan <- metric: } } + readMetric := func(selfMetric base.SelfMetric) *base.ThrottleMetric { + if !selfMetric.RequiresConn() { + return selfMetric.Read(ctx, throttler, nil) + } + conn, err := throttler.pool.Get(ctx, nil) + if err != nil { + return &base.ThrottleMetric{Err: err} + } + defer conn.Recycle() + return selfMetric.Read(ctx, throttler, conn.Conn) + } + for metricName, selfMetric := range base.RegisteredSelfMetrics { + if metricName == base.DefaultMetricName { + continue + } + metric := readMetric(selfMetric) + metric.Name = metricName + metric.Alias = throttler.tabletAliasString() - go writeMetric(base.LagMetricName, throttler.readSelfMySQLThrottleMetric(ctx, sqlparser.BuildParsedQuery(defaultReplicationLagQuery, sidecar.GetIdentifier()).Query)) - go writeMetric(base.ThreadsRunningMetricName, throttler.readSelfMySQLThrottleMetric(ctx, threadsRunningQuery)) - go writeMetric(base.CustomMetricName, throttler.readSelfMySQLThrottleMetric(ctx, throttler.GetCustomMetricsQuery())) - go writeMetric(base.LoadAvgMetricName, throttler.readSelfLoadAvgPerCore(ctx)) - return nil + go writeMetric(metric) + result[metricName] = metric + } + + return result } func (throttler *Throttler) collectSelfMetrics(ctx context.Context) { - probe := throttler.inventory.ClustersProbes[throttler.tabletAlias] + probe := throttler.inventory.ClustersProbes[throttler.tabletAliasString()] if probe == nil { // probe not created yet return @@ -1103,7 +998,7 @@ func (throttler *Throttler) collectShardMetrics(ctx context.Context, tmClient tm // probes is known not to change. It can be *replaced*, but not changed. // so it's safe to iterate it for _, probe := range throttler.inventory.ClustersProbes { - if probe.Alias == throttler.tabletAlias { + if probe.Alias == throttler.tabletAliasString() { // We skip collecting our own metrics continue } @@ -1169,21 +1064,19 @@ func (throttler *Throttler) refreshInventory(ctx context.Context) error { } } - metricsThreshold := throttler.MetricsThreshold.Load() metricNameUsedAsDefault := throttler.metricNameUsedAsDefault() - mysqlSettings := &throttler.configSettings.MySQLStore - mysqlSettings.Metrics[base.DefaultMetricName].Threshold.Store(metricsThreshold) - for metricName, metricConfig := range mysqlSettings.Metrics { - threshold := metricConfig.Threshold.Load() - if metricName == metricNameUsedAsDefault && metricsThreshold != 0 { + metricsThreshold := throttler.GetMetricsThreshold() + for metricName, selfMetric := range base.RegisteredSelfMetrics { + threshold := selfMetric.DefaultThreshold() + if (metricName == metricNameUsedAsDefault || metricName == base.DefaultMetricName) && metricsThreshold != 0 { // backwards compatibility to v20: threshold = metricsThreshold } - - throttler.metricThresholds.Set(inventoryPrefix+metricName.String(), math.Float64frombits(threshold), cache.DefaultExpiration) + throttler.metricThresholds.Set(inventoryPrefix+metricName.String(), threshold, cache.DefaultExpiration) } throttler.convergeMetricThresholds() - clusterSettingsCopy := *mysqlSettings + + var clusterSettingsCopy config.MySQLConfigurationSettings = throttler.configSettings.MySQLStore // config may dynamically change, but internal structure (config.Settings().MySQLStore.Clusters in our case) // is immutable and can only be _replaced_. Hence, it's safe to read in a goroutine: collect := func() error { @@ -1192,7 +1085,7 @@ func (throttler *Throttler) refreshInventory(ctx context.Context) error { TabletProbes: base.NewProbes(), } // self tablet - addProbe(throttler.tabletAlias, nil, base.SelfScope, &clusterSettingsCopy, clusterProbes.TabletProbes) + addProbe(throttler.tabletAliasString(), nil, base.SelfScope, &clusterSettingsCopy, clusterProbes.TabletProbes) if !throttler.isLeader.Load() { // This tablet may have used to be the primary, but it isn't now. It may have a recollection // of previous clusters it used to probe. It may have recollection of specific probes for such clusters. @@ -1232,10 +1125,25 @@ func (throttler *Throttler) refreshInventory(ctx context.Context) error { } // synchronous update of inventory -func (throttler *Throttler) updateClusterProbes(ctx context.Context, clusterProbes *base.ClusterProbes) error { +func (throttler *Throttler) updateClusterProbes(clusterProbes *base.ClusterProbes) error { throttler.inventory.ClustersProbes = clusterProbes.TabletProbes throttler.inventory.IgnoreHostsCount = clusterProbes.IgnoreHostsCount throttler.inventory.IgnoreHostsThreshold = clusterProbes.IgnoreHostsThreshold + + for alias := range throttler.inventory.TabletMetrics { + if alias == "" { + // *this* tablet uses the empty alias to identify itself. + continue + } + if _, found := clusterProbes.TabletProbes[alias]; !found { + // There seems to be a metric stored for some alias, say zone1-0000000102, + // but there is no alias for this probe in the new clusterProbes. This + // suggests that the corresponding tablet has been removed, or its type was changed + // (e.g. from REPLICA to RDONLY). We should therefore remove this cached metric. + delete(throttler.inventory.TabletMetrics, alias) + } + } + return nil } @@ -1268,7 +1176,7 @@ func (throttler *Throttler) aggregateMetrics() error { // is to be stored as "default" continue } - selfResultsMap, shardResultsMap := throttler.inventory.TabletMetrics.Split(throttler.tabletAlias) + selfResultsMap, shardResultsMap := throttler.inventory.TabletMetrics.Split(throttler.tabletAliasString()) aggregateTabletsMetrics(base.SelfScope, metricName, selfResultsMap) aggregateTabletsMetrics(base.ShardScope, metricName, shardResultsMap) } @@ -1378,8 +1286,8 @@ func (throttler *Throttler) UnthrottleApp(appName string) (appThrottle *base.App // IsAppThrottled tells whether some app should be throttled. // Assuming an app is throttled to some extend, it will randomize the result based // on the throttle ratio -func (throttler *Throttler) IsAppThrottled(appName string) bool { - appFound := false +func (throttler *Throttler) IsAppThrottled(appName string) (bool, string) { + appFound := "" isSingleAppNameThrottled := func(singleAppName string) bool { object, found := throttler.throttledApps.Get(singleAppName) if !found { @@ -1392,7 +1300,7 @@ func (throttler *Throttler) IsAppThrottled(appName string) bool { } // From this point on, we consider that this app has some throttling configuration // of any sort. - appFound = true + appFound = singleAppName if appThrottle.Exempt { return false } @@ -1403,32 +1311,32 @@ func (throttler *Throttler) IsAppThrottled(appName string) bool { return false } if isSingleAppNameThrottled(appName) { - return true + return true, appName } for _, singleAppName := range throttlerapp.Name(appName).SplitStrings() { if singleAppName == "" { continue } if isSingleAppNameThrottled(singleAppName) { - return true + return true, singleAppName } } // If app was found then there was some explicit throttle instruction for the app, and the app // passed the test. - if appFound { - return false + if appFound != "" { + return false, appFound } // If the app was not found, ie no specific throttle instruction was found for the app, then // the app should also consider the case where the "all" app is throttled. if isSingleAppNameThrottled(throttlerapp.AllName.String()) { // Means the "all" app is throttled. This is a special case, and it means "all apps are throttled" - return true + return true, throttlerapp.AllName.String() } - return false + return false, appName } // IsAppExempt -func (throttler *Throttler) IsAppExempted(appName string) bool { +func (throttler *Throttler) IsAppExempted(appName string) (bool, string) { isSingleAppNameExempted := func(singleAppName string) bool { if throttlerapp.ExemptFromChecks(appName) { // well known statically exempted apps return true @@ -1448,22 +1356,24 @@ func (throttler *Throttler) IsAppExempted(appName string) bool { return false } if isSingleAppNameExempted(appName) { - return true + return true, appName } for _, singleAppName := range throttlerapp.Name(appName).SplitStrings() { if singleAppName == "" { continue } if isSingleAppNameExempted(singleAppName) { - return true + return true, singleAppName } } - if isSingleAppNameExempted(throttlerapp.AllName.String()) && !throttler.IsAppThrottled(appName) { - return true + if isSingleAppNameExempted(throttlerapp.AllName.String()) { + if throttled, _ := throttler.IsAppThrottled(appName); !throttled { + return true, throttlerapp.AllName.String() + } } - return false + return false, appName } // ThrottledAppsMap returns a (copy) map of currently throttled apps @@ -1478,8 +1388,8 @@ func (throttler *Throttler) ThrottledAppsMap() (result map[string](*base.AppThro } // markRecentApp takes note that an app has just asked about throttling, making it "recent" -func (throttler *Throttler) markRecentApp(appName string, statusCode int) { - recentApp := base.NewRecentApp(appName, statusCode) +func (throttler *Throttler) markRecentApp(appName string, statusCode int, responseCode tabletmanagerdatapb.CheckThrottlerResponseCode) { + recentApp := base.NewRecentApp(appName, statusCode, responseCode) throttler.recentApps.Set(appName, recentApp, cache.DefaultExpiration) } @@ -1517,14 +1427,16 @@ func (throttler *Throttler) metricsHealthSnapshot() base.MetricHealthMap { } // AppRequestMetricResult gets a metric result in the context of a specific app -func (throttler *Throttler) AppRequestMetricResult(ctx context.Context, appName string, metricResultFunc base.MetricResultFunc, denyApp bool) (metricResult base.MetricResult, threshold float64) { +func (throttler *Throttler) AppRequestMetricResult(ctx context.Context, appName string, metricResultFunc base.MetricResultFunc, denyApp bool) (metricResult base.MetricResult, threshold float64, matchedApp string) { if denyApp { - return base.AppDeniedMetric, 0 + return base.AppDeniedMetric, 0, appName } - if throttler.IsAppThrottled(appName) { - return base.AppDeniedMetric, 0 + throttled, matchedApp := throttler.IsAppThrottled(appName) + if throttled { + return base.AppDeniedMetric, 0, matchedApp } - return metricResultFunc() + metricResult, threshold = metricResultFunc() + return metricResult, threshold, matchedApp } // checkScope checks the aggregated value of given store @@ -1532,12 +1444,15 @@ func (throttler *Throttler) checkScope(ctx context.Context, appName string, scop if !throttler.IsRunning() { return okMetricCheckResult } - if throttler.IsAppExempted(appName) { + if exempted, matchedApp := throttler.IsAppExempted(appName); exempted { // Some apps are exempt from checks. They are always responded with OK. This is because those apps are // continuous and do not generate a substantial load. - return okMetricCheckResult + result := okMetricCheckResult + result.AppName = matchedApp + return result } + matchedApp := appName if len(metricNames) == 0 { // No explicit metrics requested. // Get the metric names mappd to the given app @@ -1551,6 +1466,7 @@ func (throttler *Throttler) checkScope(ctx context.Context, appName string, scop case []base.MetricName: metricNames = append(metricNames, val...) } + matchedApp = appToken } } } @@ -1564,17 +1480,20 @@ func (throttler *Throttler) checkScope(ctx context.Context, appName string, scop case []base.MetricName: metricNames = val } + matchedApp = throttlerapp.AllName.String() } } if throttlerapp.VitessName.Equals(appName) { // "vitess" always checks all metrics, irrespective of what is mapped. metricNames = base.KnownMetricNames + matchedApp = appName } if len(metricNames) == 0 { // Nothing mapped? For backwards compatibility and as default, we use the "default" metric. metricNames = base.MetricNames{throttler.metricNameUsedAsDefault()} } checkResult = throttler.check.Check(ctx, appName, scope, metricNames, flags) + checkResult.AppName = matchedApp shouldRequestHeartbeats := !flags.SkipRequestHeartbeats if throttlerapp.VitessName.Equals(appName) { diff --git a/go/vt/vttablet/tabletserver/throttle/throttler_test.go b/go/vt/vttablet/tabletserver/throttle/throttler_test.go index 6363143fd43..fd7921899da 100644 --- a/go/vt/vttablet/tabletserver/throttle/throttler_test.go +++ b/go/vt/vttablet/tabletserver/throttle/throttler_test.go @@ -74,22 +74,27 @@ var ( } replicaMetrics = map[string]*MetricResult{ base.LagMetricName.String(): { - StatusCode: http.StatusOK, - Value: 0.9, + StatusCode: http.StatusOK, + ResponseCode: tabletmanagerdatapb.CheckThrottlerResponseCode_OK, + Value: 0.9, }, base.ThreadsRunningMetricName.String(): { - StatusCode: http.StatusOK, - Value: 13, + StatusCode: http.StatusOK, + ResponseCode: tabletmanagerdatapb.CheckThrottlerResponseCode_OK, + Value: 13, }, base.CustomMetricName.String(): { - StatusCode: http.StatusOK, - Value: 14, + StatusCode: http.StatusOK, + ResponseCode: tabletmanagerdatapb.CheckThrottlerResponseCode_OK, + Value: 14, }, base.LoadAvgMetricName.String(): { - StatusCode: http.StatusOK, - Value: 5.1, + StatusCode: http.StatusOK, + ResponseCode: tabletmanagerdatapb.CheckThrottlerResponseCode_OK, + Value: 5.1, }, } + nonPrimaryTabletType atomic.Int32 ) const ( @@ -116,14 +121,16 @@ func (c *fakeTMClient) CheckThrottler(ctx context.Context, tablet *topodatapb.Ta RecentlyChecked: false, } if !c.v20.Load() { + resp.ResponseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_OK resp.Metrics = make(map[string]*tabletmanagerdatapb.CheckThrottlerResponse_Metric) for name, metric := range replicaMetrics { resp.Metrics[name] = &tabletmanagerdatapb.CheckThrottlerResponse_Metric{ - Name: name, - StatusCode: int32(metric.StatusCode), - Value: metric.Value, - Threshold: metric.Threshold, - Message: metric.Message, + Name: name, + StatusCode: int32(metric.StatusCode), + ResponseCode: metric.ResponseCode, + Value: metric.Value, + Threshold: metric.Threshold, + Message: metric.Message, } } } @@ -145,7 +152,11 @@ type FakeTopoServer struct { func (ts *FakeTopoServer) GetTablet(ctx context.Context, alias *topodatapb.TabletAlias) (*topo.TabletInfo, error) { tabletType := topodatapb.TabletType_PRIMARY if alias.Uid != 100 { - tabletType = topodatapb.TabletType_REPLICA + val := topodatapb.TabletType(nonPrimaryTabletType.Load()) + if val == topodatapb.TabletType_UNKNOWN { + val = topodatapb.TabletType_REPLICA + } + tabletType = val } tablet := &topo.TabletInfo{ Tablet: &topodatapb.Tablet{ @@ -241,7 +252,8 @@ func newTestThrottler() *Throttler { tabletTypeFunc: func() topodatapb.TabletType { return topodatapb.TabletType_PRIMARY }, overrideTmClient: &fakeTMClient{}, } - throttler.metricsQuery.Store(metricsQuery) + lagSelfMetric := base.RegisteredSelfMetrics[base.LagMetricName].(*base.LagSelfMetric) + lagSelfMetric.SetQuery(metricsQuery) throttler.MetricsThreshold.Store(math.Float64bits(0.75)) throttler.configSettings = config.NewConfigurationSettings() throttler.initConfig() @@ -417,7 +429,9 @@ func TestApplyThrottlerConfigMetricThresholds(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.3, checkResult.Value) // self lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) t.Run("apply low threshold", func(t *testing.T) { assert.Equal(t, 0.75, throttler.GetMetricsThreshold()) @@ -439,7 +453,9 @@ func TestApplyThrottlerConfigMetricThresholds(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.3, checkResult.Value, "unexpected result: %+v", checkResult) // self lag value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to self/lag metric value") }) t.Run("apply low threshold but high 'lag' override", func(t *testing.T) { throttlerConfig := &topodatapb.ThrottlerConfig{ @@ -462,7 +478,9 @@ func TestApplyThrottlerConfigMetricThresholds(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.3, checkResult.Value, "unexpected result: %+v", checkResult) // self lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) }) @@ -519,7 +537,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to shard/lag metric value") }) t.Run("apply high lag threshold", func(t *testing.T) { throttlerConfig.Threshold = 4444.0 @@ -533,7 +553,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // self lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) }) t.Run("apply low 'loadavg' threshold", func(t *testing.T) { @@ -547,7 +569,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) }) t.Run("assign 'loadavg' to test app", func(t *testing.T) { @@ -565,7 +589,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 2.718, checkResult.Value) // self loadavg value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to self/loadavg metric value") }) }) t.Run("assign 'shard/loadavg' to test app", func(t *testing.T) { @@ -583,7 +609,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 5.1, checkResult.Value) // shard loadavg value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to shard/loadavg metric value") }) }) t.Run("assign 'lag,loadavg' to test app", func(t *testing.T) { @@ -600,7 +628,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 2.718, checkResult.Value) // self loadavg value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 2, len(checkResult.Metrics)) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to self/loadavg metric value") }) }) t.Run("assign 'lag,shard/loadavg' to test app", func(t *testing.T) { @@ -617,7 +647,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 5.1, checkResult.Value) // shard loadavg value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 2, len(checkResult.Metrics)) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to shard/loadavg metric value") }) }) t.Run("clear 'loadavg' threshold", func(t *testing.T) { @@ -630,7 +662,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 1, len(checkResult.Metrics), "unexpected metrics: %+v", checkResult.Metrics) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) }) t.Run("assign 'lag,threads_running' to test app", func(t *testing.T) { @@ -647,7 +681,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 2, len(checkResult.Metrics)) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) }) t.Run("assign 'custom,loadavg' to 'all' app", func(t *testing.T) { @@ -664,7 +700,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 2.718, checkResult.Value) // loadavg self value exceeds threshold assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 2, len(checkResult.Metrics)) + assert.Contains(t, checkResult.Summary(), throttlerapp.AllName.String()+" is denied access due to self/loadavg metric value") }) t.Run("check 'test' after assignment", func(t *testing.T) { // "test" app unaffected by 'all' assignment, because it has @@ -678,7 +716,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 2, len(checkResult.Metrics)) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) t.Run("'online-ddl' app affected by 'all'", func(t *testing.T) { // "online-ddl" app is affected by 'all' assignment, because it has @@ -691,7 +731,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 2.718, checkResult.Value) // loadavg self value exceeds threshold assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 2, len(checkResult.Metrics)) + assert.Contains(t, checkResult.Summary(), throttlerapp.AllName.String()+" is denied access due to self/loadavg metric value") }) }) t.Run("'vreplication:online-ddl:12345' app affected by 'all'", func(t *testing.T) { @@ -701,7 +743,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 2.718, checkResult.Value) // loadavg self value exceeds threshold assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 2, len(checkResult.Metrics)) + assert.Contains(t, checkResult.Summary(), throttlerapp.AllName.String()+" is denied access due to self/loadavg metric value") }) t.Run("'vreplication:online-ddl:test' app affected by 'test' and not by 'all'", func(t *testing.T) { // "vreplication:online-ddl:test" app is affected by 'test' assignment, because it has @@ -710,7 +754,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 2, len(checkResult.Metrics)) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) t.Run("deassign metrics from 'all' app", func(t *testing.T) { delete(throttlerConfig.AppCheckedMetrics, throttlerapp.AllName.String()) @@ -724,7 +770,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), throttlerapp.AllName.String()+" is granted access") }) t.Run("check 'test' after assignment", func(t *testing.T) { // "test" app unaffected by the entire 'all' assignment, because it has @@ -738,7 +786,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, 2, len(checkResult.Metrics)) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) t.Run("'online-ddl' no longer has 'all' impact", func(t *testing.T) { // "online-ddl" app is affected by 'all' assignment, because it has @@ -751,7 +801,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), throttlerapp.OnlineDDLName.String()+" is granted access") }) }) @@ -767,7 +819,9 @@ func TestApplyThrottlerConfigAppCheckedMetrics(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.Len(t, checkResult.Metrics, 1) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is granted access") }) }) @@ -790,10 +844,26 @@ func TestIsAppThrottled(t *testing.T) { heartbeatWriter: &FakeHeartbeatWriter{}, } t.Run("initial", func(t *testing.T) { - assert.False(t, throttler.IsAppThrottled("app1")) - assert.False(t, throttler.IsAppThrottled("app2")) - assert.False(t, throttler.IsAppThrottled("app3")) - assert.False(t, throttler.IsAppThrottled("app4")) + { + throttled, app := throttler.IsAppThrottled("app1") + assert.False(t, throttled) + assert.Equal(t, "app1", app) + } + { + throttled, app := throttler.IsAppThrottled("app2") + assert.False(t, throttled) + assert.Equal(t, "app2", app) + } + { + throttled, app := throttler.IsAppThrottled("app3") + assert.False(t, throttled) + assert.Equal(t, "app3", app) + } + { + throttled, app := throttler.IsAppThrottled("app4") + assert.False(t, throttled) + assert.Equal(t, "app4", app) + } assert.Equal(t, 0, throttler.throttledApps.ItemCount()) }) @@ -803,11 +873,31 @@ func TestIsAppThrottled(t *testing.T) { throttler.ThrottleApp("app2", time.Now(), DefaultThrottleRatio, false) // instantly expire throttler.ThrottleApp("app3", plusOneHour, DefaultThrottleRatio, false) throttler.ThrottleApp("app4", plusOneHour, 0, false) - assert.False(t, throttler.IsAppThrottled("app1")) // exempted - assert.False(t, throttler.IsAppThrottled("app2")) // expired - assert.True(t, throttler.IsAppThrottled("app3")) - assert.False(t, throttler.IsAppThrottled("app4")) // ratio is zero - assert.False(t, throttler.IsAppThrottled("app_other")) // not specified + { + throttled, app := throttler.IsAppThrottled("app1") + assert.False(t, throttled) // exempted + assert.Equal(t, "app1", app) + } + { + throttled, app := throttler.IsAppThrottled("app2") + assert.False(t, throttled) // expired + assert.Equal(t, "app2", app) + } + { + throttled, app := throttler.IsAppThrottled("app3") + assert.True(t, throttled) + assert.Equal(t, "app3", app) + } + { + throttled, app := throttler.IsAppThrottled("app4") + assert.False(t, throttled) // ratio is zero + assert.Equal(t, "app4", app) + } + { + throttled, app := throttler.IsAppThrottled("app_other") + assert.False(t, throttled) // not specified + assert.Equal(t, "app_other", app) + } assert.Equal(t, 3, throttler.throttledApps.ItemCount()) }) @@ -815,12 +905,36 @@ func TestIsAppThrottled(t *testing.T) { // throttle "all", see how it affects app throttler.ThrottleApp(throttlerapp.AllName.String(), plusOneHour, DefaultThrottleRatio, false) defer throttler.UnthrottleApp(throttlerapp.AllName.String()) - assert.True(t, throttler.IsAppThrottled("all")) // - assert.False(t, throttler.IsAppThrottled("app1")) // exempted - assert.True(t, throttler.IsAppThrottled("app2")) // expired, so falls under "all" - assert.True(t, throttler.IsAppThrottled("app3")) - assert.False(t, throttler.IsAppThrottled("app4")) // ratio is zero, there is a specific instruction for this app, so it doesn't fall under "all" - assert.True(t, throttler.IsAppThrottled("app_other")) // falls under "all" + { + throttled, app := throttler.IsAppThrottled("all") + assert.True(t, throttled) // explicitly throttled + assert.Equal(t, "all", app) + } + { + throttled, app := throttler.IsAppThrottled("app1") + assert.False(t, throttled) // exempted + assert.Equal(t, "app1", app) + } + { + throttled, app := throttler.IsAppThrottled("app2") + assert.True(t, throttled) // expired, so falls under "all" + assert.Equal(t, "all", app) + } + { + throttled, app := throttler.IsAppThrottled("app3") + assert.True(t, throttled) + assert.Equal(t, "app3", app) + } + { + throttled, app := throttler.IsAppThrottled("app4") + assert.False(t, throttled) // ratio is zero, there is a specific instruction for this app, so it doesn't fall under "all" + assert.Equal(t, "app4", app) + } + { + throttled, app := throttler.IsAppThrottled("app_other") + assert.True(t, throttled) // falls under "all" + assert.Equal(t, "all", app) + } // continuing previous test, we had 3 throttled apps. "all" is a new app being throttled. assert.Equal(t, 4, throttler.throttledApps.ItemCount()) @@ -831,10 +945,27 @@ func TestIsAppThrottled(t *testing.T) { throttler.UnthrottleApp("app2") throttler.UnthrottleApp("app3") throttler.UnthrottleApp("app4") - assert.False(t, throttler.IsAppThrottled("app1")) - assert.False(t, throttler.IsAppThrottled("app2")) - assert.False(t, throttler.IsAppThrottled("app3")) - assert.False(t, throttler.IsAppThrottled("app4")) + + { + throttled, app := throttler.IsAppThrottled("app1") + assert.False(t, throttled) + assert.Equal(t, "app1", app) + } + { + throttled, app := throttler.IsAppThrottled("app2") + assert.False(t, throttled) + assert.Equal(t, "app2", app) + } + { + throttled, app := throttler.IsAppThrottled("app3") + assert.False(t, throttled) + assert.Equal(t, "app3", app) + } + { + throttled, app := throttler.IsAppThrottled("app4") + assert.False(t, throttled) + assert.Equal(t, "app4", app) + } // we've manually unthrottled everything assert.Equal(t, 0, throttler.throttledApps.ItemCount()) @@ -843,12 +974,37 @@ func TestIsAppThrottled(t *testing.T) { // throttle "all", see how it affects app throttler.ThrottleApp(throttlerapp.AllName.String(), plusOneHour, DefaultThrottleRatio, false) defer throttler.UnthrottleApp(throttlerapp.AllName.String()) - assert.True(t, throttler.IsAppThrottled("all")) - assert.True(t, throttler.IsAppThrottled("app1")) - assert.True(t, throttler.IsAppThrottled("app2")) - assert.True(t, throttler.IsAppThrottled("app3")) - assert.True(t, throttler.IsAppThrottled("app4")) - assert.True(t, throttler.IsAppThrottled("app_other")) + + { + throttled, app := throttler.IsAppThrottled("all") + assert.True(t, throttled) // explicitly throttled + assert.Equal(t, "all", app) + } + { + throttled, app := throttler.IsAppThrottled("app1") + assert.True(t, throttled) + assert.Equal(t, "all", app) + } + { + throttled, app := throttler.IsAppThrottled("app2") + assert.True(t, throttled) + assert.Equal(t, "all", app) + } + { + throttled, app := throttler.IsAppThrottled("app3") + assert.True(t, throttled) + assert.Equal(t, "all", app) + } + { + throttled, app := throttler.IsAppThrottled("app4") + assert.True(t, throttled) + assert.Equal(t, "all", app) + } + { + throttled, app := throttler.IsAppThrottled("app_other") + assert.True(t, throttled) + assert.Equal(t, "all", app) + } // one rule, for "all" app assert.Equal(t, 1, throttler.throttledApps.ItemCount()) @@ -858,43 +1014,120 @@ func TestIsAppThrottled(t *testing.T) { throttler.ThrottleApp("app3", plusOneHour, DefaultThrottleRatio, false) throttler.ThrottleApp(throttlerapp.AllName.String(), plusOneHour, DefaultThrottleRatio, true) defer throttler.UnthrottleApp(throttlerapp.AllName.String()) - assert.False(t, throttler.IsAppThrottled("all")) - assert.False(t, throttler.IsAppThrottled("app1")) - assert.False(t, throttler.IsAppThrottled("app2")) - assert.True(t, throttler.IsAppThrottled("app3")) - assert.False(t, throttler.IsAppThrottled("app4")) - assert.False(t, throttler.IsAppThrottled("app_other")) + { + throttled, app := throttler.IsAppThrottled("all") + assert.False(t, throttled) // explicitly throttled + assert.Equal(t, "all", app) + } + { + throttled, app := throttler.IsAppThrottled("app1") + assert.False(t, throttled) + assert.Equal(t, "app1", app) + } + { + throttled, app := throttler.IsAppThrottled("app2") + assert.False(t, throttled) + assert.Equal(t, "app2", app) + } + { + throttled, app := throttler.IsAppThrottled("app3") + assert.True(t, throttled) // explicitly throttled + assert.Equal(t, "app3", app) + } + { + throttled, app := throttler.IsAppThrottled("app4") + assert.False(t, throttled) + assert.Equal(t, "app4", app) + } + { + throttled, app := throttler.IsAppThrottled("app_other") + assert.False(t, throttled) + assert.Equal(t, "app_other", app) + } assert.Equal(t, 2, throttler.throttledApps.ItemCount()) }) } func TestIsAppExempted(t *testing.T) { - + plusOneHour := time.Now().Add(time.Hour) throttler := Throttler{ throttledApps: cache.New(cache.NoExpiration, 0), heartbeatWriter: &FakeHeartbeatWriter{}, } - assert.False(t, throttler.IsAppExempted("app1")) - assert.False(t, throttler.IsAppExempted("app2")) - assert.False(t, throttler.IsAppExempted("app3")) - // - throttler.ThrottleApp("app1", time.Now().Add(time.Hour), DefaultThrottleRatio, true) - throttler.ThrottleApp("app2", time.Now(), DefaultThrottleRatio, true) // instantly expire - assert.True(t, throttler.IsAppExempted("app1")) - assert.True(t, throttler.IsAppExempted("app1:other-tag")) - assert.False(t, throttler.IsAppExempted("app2")) // expired - assert.False(t, throttler.IsAppExempted("app3")) - // - throttler.UnthrottleApp("app1") - throttler.ThrottleApp("app2", time.Now().Add(time.Hour), DefaultThrottleRatio, false) - assert.False(t, throttler.IsAppExempted("app1")) - assert.False(t, throttler.IsAppExempted("app2")) - assert.False(t, throttler.IsAppExempted("app3")) - // - assert.True(t, throttler.IsAppExempted("schema-tracker")) - throttler.UnthrottleApp("schema-tracker") // meaningless. App is statically exempted - assert.True(t, throttler.IsAppExempted("schema-tracker")) + t.Run("initial", func(t *testing.T) { + { + exempted, app := throttler.IsAppExempted("app1") + assert.False(t, exempted) + assert.Equal(t, "app1", app) + } + { + exempted, app := throttler.IsAppExempted("app2") + assert.False(t, exempted) + assert.Equal(t, "app2", app) + } + { + exempted, app := throttler.IsAppExempted("app3") + assert.False(t, exempted) + assert.Equal(t, "app3", app) + } + }) + t.Run("exempt", func(t *testing.T) { + throttler.ThrottleApp("app1", time.Now().Add(time.Hour), DefaultThrottleRatio, true) + throttler.ThrottleApp("app2", time.Now(), DefaultThrottleRatio, true) // instantly expire + { + exempted, app := throttler.IsAppExempted("app1") + assert.True(t, exempted) + assert.Equal(t, "app1", app) + } + { + exempted, app := throttler.IsAppExempted("app1:other-tag") + assert.True(t, exempted) + assert.Equal(t, "app1", app) + } + { + exempted, app := throttler.IsAppExempted("app2") + assert.False(t, exempted) + assert.Equal(t, "app2", app) + } + { + exempted, app := throttler.IsAppExempted("app3") + assert.False(t, exempted) + assert.Equal(t, "app3", app) + } + }) + t.Run("throttle", func(t *testing.T) { + throttler.UnthrottleApp("app1") + throttler.ThrottleApp("app2", time.Now().Add(time.Hour), DefaultThrottleRatio, false) + { + exempted, app := throttler.IsAppExempted("app1") + assert.False(t, exempted) + assert.Equal(t, "app1", app) + } + { + exempted, app := throttler.IsAppExempted("app2") + assert.False(t, exempted) + assert.Equal(t, "app2", app) + } + { + exempted, app := throttler.IsAppExempted("app3") + assert.False(t, exempted) + assert.Equal(t, "app3", app) + } + }) + t.Run("special", func(t *testing.T) { + { + exempted, app := throttler.IsAppExempted("schema-tracker") + assert.True(t, exempted) + assert.Equal(t, "schema-tracker", app) + } + throttler.ThrottleApp("schema-tracker", plusOneHour, 1.0, false) // meaningless. App is statically exempted + { + exempted, app := throttler.IsAppExempted("schema-tracker") + assert.True(t, exempted) + assert.Equal(t, "schema-tracker", app) + } + }) } // TestRefreshInventory tests the behavior of the throttler's RefreshInventory() function, which @@ -916,7 +1149,8 @@ func TestRefreshInventory(t *testing.T) { ts: &FakeTopoServer{}, inventory: base.NewInventory(), } - throttler.metricsQuery.Store(metricsQuery) + lagSelfMetric := base.RegisteredSelfMetrics[base.LagMetricName].(*base.LagSelfMetric) + lagSelfMetric.SetQuery(metricsQuery) throttler.configSettings = configSettings throttler.initConfig() throttler.initThrottleTabletTypes() @@ -927,9 +1161,9 @@ func TestRefreshInventory(t *testing.T) { // validateProbesCount expects number of probes according to cluster name and throttler's leadership status validateProbesCount := func(t *testing.T, probes base.Probes) { if throttler.isLeader.Load() { - assert.Equal(t, 3, len(probes)) + assert.Len(t, probes, 3) } else { - assert.Equal(t, 1, len(probes)) + assert.Len(t, probes, 1) } } t.Run("waiting for probes", func(t *testing.T) { @@ -942,7 +1176,7 @@ func TestRefreshInventory(t *testing.T) { // not run, and therefore there is none but us to both populate `clusterProbesChan` as well as // read from it. We do not compete here with any other goroutine. assert.NotNil(t, probes) - throttler.updateClusterProbes(ctx, probes) + throttler.updateClusterProbes(probes) validateProbesCount(t, probes.TabletProbes) // Achieved our goal return @@ -1116,8 +1350,10 @@ func TestProbesWhileOperating(t *testing.T) { throttler.refreshInventory(ctx) }) { - checkOK := client.ThrottleCheckOK(ctx, "") + checkResult, checkOK := client.ThrottleCheckOK(ctx, "") assert.False(t, checkOK) // we expect threshold exceeded + assert.NotNil(t, checkResult) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to") } }) @@ -1128,7 +1364,7 @@ func TestProbesWhileOperating(t *testing.T) { throttler.refreshInventory(ctx) }) { - checkOK := client.ThrottleCheckOK(ctx, "") + _, checkOK := client.ThrottleCheckOK(ctx, "") assert.True(t, checkOK) } }) @@ -1139,8 +1375,10 @@ func TestProbesWhileOperating(t *testing.T) { }) client.clearSuccessfulResultsCache() // ensure we don't read the successful result from the test above { - checkOK := client.ThrottleCheckOK(ctx, "") + checkResult, checkOK := client.ThrottleCheckOK(ctx, "") assert.False(t, checkOK) + assert.NotNil(t, checkResult) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to") } }) }) @@ -1205,8 +1443,9 @@ func TestProbesWhileOperating(t *testing.T) { throttler.refreshInventory(ctx) }) { - checkOK := client.ThrottleCheckOK(ctx, "") + checkResult, checkOK := client.ThrottleCheckOK(ctx, "") assert.False(t, checkOK) // we expect threshold exceeded + assert.NotNil(t, checkResult) } }) @@ -1217,7 +1456,7 @@ func TestProbesWhileOperating(t *testing.T) { throttler.refreshInventory(ctx) }) { - checkOK := client.ThrottleCheckOK(ctx, "") + _, checkOK := client.ThrottleCheckOK(ctx, "") assert.False(t, checkOK) // 0.95 still too low for custom query } }) @@ -1227,7 +1466,7 @@ func TestProbesWhileOperating(t *testing.T) { throttler.refreshInventory(ctx) }) { - checkOK := client.ThrottleCheckOK(ctx, "") + _, checkOK := client.ThrottleCheckOK(ctx, "") assert.False(t, checkOK) // 15 still too low for custom query because primary has 17 } }) @@ -1237,7 +1476,7 @@ func TestProbesWhileOperating(t *testing.T) { throttler.refreshInventory(ctx) }) { - checkOK := client.ThrottleCheckOK(ctx, "") + _, checkOK := client.ThrottleCheckOK(ctx, "") assert.True(t, checkOK) } }) @@ -1248,12 +1487,76 @@ func TestProbesWhileOperating(t *testing.T) { }) client.clearSuccessfulResultsCache() // ensure we don't read the successful result from the test above { - checkOK := client.ThrottleCheckOK(ctx, "") + _, checkOK := client.ThrottleCheckOK(ctx, "") assert.False(t, checkOK) } }) }) }) + + t.Run("metrics", func(t *testing.T) { + var results base.TabletResultMap + <-runSerialFunction(t, ctx, throttler, func(ctx context.Context) { + results = maps.Clone(throttler.inventory.TabletMetrics) + }) + assert.Len(t, results, 3) // 1 self tablet + 2 shard tablets + assert.Contains(t, results, "", "TabletMetrics: %+v", results) // primary self identifies with empty alias + assert.Contains(t, results, "fakezone1-0000000101", "TabletMetrics: %+v", results) + assert.Contains(t, results, "fakezone2-0000000102", "TabletMetrics: %+v", results) + }) + + t.Run("no REPLICA probes", func(t *testing.T) { + nonPrimaryTabletType.Store(int32(topodatapb.TabletType_RDONLY)) + defer nonPrimaryTabletType.Store(int32(topodatapb.TabletType_REPLICA)) + + t.Run("waiting for inventory metrics", func(t *testing.T) { + ctx, cancel := context.WithTimeout(ctx, waitForProbesTimeout) + defer cancel() + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + for { + var results base.TabletResultMap + <-runSerialFunction(t, ctx, throttler, func(ctx context.Context) { + results = maps.Clone(throttler.inventory.TabletMetrics) + }) + if len(results) == 1 { + // That's what we were waiting for. Good. + assert.Contains(t, results, "", "TabletMetrics: %+v", results) // primary self identifies with empty alias + return + } + + select { + case <-ticker.C: + case <-ctx.Done(): + assert.FailNowf(t, ctx.Err().Error(), "waiting for inventory metrics") + } + } + }) + }) + t.Run("again with probes", func(t *testing.T) { + t.Run("waiting for inventory metrics", func(t *testing.T) { + ctx, cancel := context.WithTimeout(ctx, waitForProbesTimeout) + defer cancel() + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + for { + var results base.TabletResultMap + <-runSerialFunction(t, ctx, throttler, func(ctx context.Context) { + results = maps.Clone(throttler.inventory.TabletMetrics) + }) + if len(results) == 3 { + // That's what we were waiting for. Good. + return + } + + select { + case <-ticker.C: + case <-ctx.Done(): + assert.FailNowf(t, ctx.Err().Error(), "waiting for inventory metrics") + } + } + }) + }) }) } @@ -1357,7 +1660,7 @@ func TestProbesPostDisable(t *testing.T) { localTabletFound := 0 for _, probe := range probes { require.NotNil(t, probe) - if probe.Alias == throttler.tabletAlias { + if probe.Alias == throttler.tabletAliasString() { localTabletFound++ } else { assert.NotEmpty(t, probe.Alias) @@ -1369,7 +1672,7 @@ func TestProbesPostDisable(t *testing.T) { }) t.Run("metrics", func(t *testing.T) { - assert.Equal(t, 3, len(throttler.inventory.TabletMetrics)) // 1 self tablet + 2 shard tablets + assert.Empty(t, throttler.inventory.TabletMetrics) // map has been cleared }) t.Run("aggregated", func(t *testing.T) { @@ -1502,6 +1805,8 @@ func TestChecks(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.3, checkResult.Value) // self lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) + assert.Equal(t, testAppName.String(), checkResult.AppName) assert.Len(t, checkResult.Metrics, 1) }) t.Run("explicit names", func(t *testing.T) { @@ -1513,6 +1818,13 @@ func TestChecks(t *testing.T) { t.Logf("%s: %+v", k, v) } } + if !assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) { + for k, v := range checkResult.Metrics { + t.Logf("%s: %+v", k, v) + } + } + + assert.Equal(t, testAppName.String(), checkResult.AppName) assert.Equal(t, len(base.KnownMetricNames), len(checkResult.Metrics)) assert.EqualValues(t, 0.3, checkResult.Metrics[base.LagMetricName.String()].Value) // self lag value, because flags.Scope is set @@ -1533,6 +1845,7 @@ func TestChecks(t *testing.T) { t.Run("implicit names, always all known", func(t *testing.T) { checkResult := throttler.Check(ctx, throttlerapp.VitessName.String(), nil, flags) // "vitess" app always checks all known metrics: + assert.Equal(t, throttlerapp.VitessName.String(), checkResult.AppName) assert.Equal(t, len(base.KnownMetricNames), len(checkResult.Metrics)) }) t.Run("explicit names, irrelevant, always all known", func(t *testing.T) { @@ -1543,6 +1856,7 @@ func TestChecks(t *testing.T) { checkResult := throttler.Check(ctx, throttlerapp.VitessName.String(), metricNames, flags) require.NotNil(t, checkResult) + assert.Equal(t, throttlerapp.VitessName.String(), checkResult.AppName) assert.Equal(t, len(base.KnownMetricNames), len(checkResult.Metrics)) }) }) @@ -1557,7 +1871,9 @@ func TestChecks(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.ErrorIs(t, checkResult.Error, base.ErrThresholdExceeded) + assert.Equal(t, testAppName.String(), checkResult.AppName) assert.Len(t, checkResult.Metrics, 1) }) t.Run("explicit names", func(t *testing.T) { @@ -1565,7 +1881,9 @@ func TestChecks(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.ErrorIs(t, checkResult.Error, base.ErrThresholdExceeded) + assert.Equal(t, testAppName.String(), checkResult.AppName) assert.Equal(t, len(base.KnownMetricNames), len(checkResult.Metrics)) assert.EqualValues(t, 0.9, checkResult.Metrics[base.LagMetricName.String()].Value) // shard lag value, because flags.Scope is set @@ -1587,6 +1905,7 @@ func TestChecks(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.ErrorIs(t, checkResult.Error, base.ErrThresholdExceeded) assert.Len(t, checkResult.Metrics, 1) }) @@ -1595,6 +1914,7 @@ func TestChecks(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.ErrorIs(t, checkResult.Error, base.ErrThresholdExceeded) assert.Equal(t, len(base.KnownMetricNames), len(checkResult.Metrics)) @@ -1626,6 +1946,7 @@ func TestChecks(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.9, checkResult.Value) // shard lag value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.ErrorIs(t, checkResult.Error, base.ErrThresholdExceeded) assert.Equal(t, len(metricNames), len(checkResult.Metrics)) @@ -1654,6 +1975,7 @@ func TestChecks(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.3, checkResult.Value) // explicitly set self lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.Equal(t, len(metricNames), len(checkResult.Metrics)) assert.EqualValues(t, 0.3, checkResult.Metrics[base.LagMetricName.String()].Value) // self lag value, because scope name is in metric name @@ -1716,6 +2038,7 @@ func TestReplica(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.3, checkResult.Value) // self lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.Len(t, checkResult.Metrics, 1) select { case <-ctx.Done(): @@ -1733,6 +2056,7 @@ func TestReplica(t *testing.T) { require.NotNil(t, checkResult) assert.EqualValues(t, 0.3, checkResult.Value) // self lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.Len(t, checkResult.Metrics, 1) assert.True(t, checkResult.RecentlyChecked) assert.True(t, throttler.recentlyChecked()) @@ -1740,6 +2064,7 @@ func TestReplica(t *testing.T) { recentApp, ok := throttler.recentAppsSnapshot()[throttlerapp.OnlineDDLName.String()] require.True(t, ok) assert.EqualValues(t, http.StatusOK, recentApp.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, recentApp.ResponseCode) } } { @@ -1770,6 +2095,7 @@ func TestReplica(t *testing.T) { // loadavg value exceeds threshold. This will show up in the check result as an error. assert.EqualValues(t, 2.718, checkResult.Value, "unexpected result: %+v", checkResult) // self lag value assert.NotEqualValues(t, http.StatusOK, checkResult.StatusCode, "unexpected result: %+v", checkResult) + assert.NotEqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode, "unexpected result: %+v", checkResult) assert.Equal(t, len(base.KnownMetricNames), len(checkResult.Metrics)) }) t.Run("validate v20 non-multi-metric results", func(t *testing.T) { @@ -1785,6 +2111,7 @@ func TestReplica(t *testing.T) { // reports the default metric. assert.EqualValues(t, 0.3, checkResult.Value) // self lag value assert.EqualValues(t, http.StatusOK, checkResult.StatusCode) + assert.EqualValues(t, tabletmanagerdatapb.CheckThrottlerResponseCode_OK, checkResult.ResponseCode) assert.EqualValues(t, 0.75, checkResult.Threshold) // The replica will still report the multi-metrics, and that's fine. As long // as it does not reflect any of their values in the checkResult.Value/StatusCode/Threshold/Error/Message. @@ -1845,11 +2172,11 @@ func TestReplica(t *testing.T) { defer throttler.appCheckedMetrics.Delete(testAppName.String()) checkResult := throttler.Check(ctx, testAppName.String(), nil, flags) require.NotNil(t, checkResult) - assert.Equal(t, 3, len(checkResult.Metrics)) + assert.Len(t, checkResult.Metrics, 3) }) t.Run("client, OK", func(t *testing.T) { client := NewBackgroundClient(throttler, throttlerapp.TestingName, base.UndefinedScope) - checkOK := client.ThrottleCheckOK(ctx, "") + _, checkOK := client.ThrottleCheckOK(ctx, "") assert.True(t, checkOK) }) t.Run("client, metrics names mapped, OK", func(t *testing.T) { @@ -1857,7 +2184,7 @@ func TestReplica(t *testing.T) { throttler.appCheckedMetrics.Set(throttlerapp.TestingName.String(), base.MetricNames{base.LagMetricName, base.ThreadsRunningMetricName}, cache.DefaultExpiration) defer throttler.appCheckedMetrics.Delete(throttlerapp.TestingName.String()) client := NewBackgroundClient(throttler, throttlerapp.TestingName, base.UndefinedScope) - checkOK := client.ThrottleCheckOK(ctx, "") + _, checkOK := client.ThrottleCheckOK(ctx, "") assert.True(t, checkOK) }) t.Run("client, metrics names mapped, not OK", func(t *testing.T) { @@ -1865,8 +2192,10 @@ func TestReplica(t *testing.T) { throttler.appCheckedMetrics.Set(throttlerapp.TestingName.String(), base.MetricNames{base.LagMetricName, base.LoadAvgMetricName, base.ThreadsRunningMetricName}, cache.DefaultExpiration) defer throttler.appCheckedMetrics.Delete(throttlerapp.TestingName.String()) client := NewBackgroundClient(throttler, throttlerapp.TestingName, base.UndefinedScope) - checkOK := client.ThrottleCheckOK(ctx, "") + checkResult, checkOK := client.ThrottleCheckOK(ctx, "") assert.False(t, checkOK) + assert.NotNil(t, checkResult) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to") }) t.Run("custom query, metrics", func(t *testing.T) { @@ -1900,8 +2229,10 @@ func TestReplica(t *testing.T) { }) t.Run("client, not OK", func(t *testing.T) { client := NewBackgroundClient(throttler, throttlerapp.TestingName, base.SelfScope) - checkOK := client.ThrottleCheckOK(ctx, "") + checkResult, checkOK := client.ThrottleCheckOK(ctx, "") assert.False(t, checkOK) + assert.NotNil(t, checkResult) + assert.Contains(t, checkResult.Summary(), testAppName.String()+" is denied access due to") }) }() }) diff --git a/go/vt/vttablet/tabletserver/twopc.go b/go/vt/vttablet/tabletserver/twopc.go index fff6d4b0cd8..577c10e55de 100644 --- a/go/vt/vttablet/tabletserver/twopc.go +++ b/go/vt/vttablet/tabletserver/twopc.go @@ -47,7 +47,7 @@ const ( // DTStateRollback represents the ROLLBACK state for dt_state. DTStateRollback = querypb.TransactionState_ROLLBACK - readAllRedo = `select t.dtid, t.state, t.time_created, s.statement + readAllRedo = `select t.dtid, t.state, t.time_created, s.statement, t.message from %s.redo_state t join %s.redo_statement s on t.dtid = s.dtid order by t.dtid, s.id` @@ -61,7 +61,7 @@ const ( // Resolving COMMIT first is crucial because we need to address transactions where a commit decision has already been made but remains unresolved. // For transactions with a commit decision, applications are already aware of the outcome and are waiting for the resolution. // By addressing these first, we ensure atomic commits and improve user experience. For other transactions, the decision is typically to rollback. - readUnresolvedTransactions = `select t.dtid, t.state, p.keyspace, p.shard + readUnresolvedTransactions = `select t.dtid, t.state, t.time_created, p.keyspace, p.shard from %s.dt_state t join %s.dt_participant p on t.dtid = p.dtid where time_created < %a @@ -109,8 +109,8 @@ func (tpc *TwoPC) initializeQueries() { "insert into %s.redo_statement(dtid, id, statement) values %a", dbname, ":vals") tpc.updateRedoTx = sqlparser.BuildParsedQuery( - "update %s.redo_state set state = %a where dtid = %a", - dbname, ":state", ":dtid") + "update %s.redo_state set state = %a, message = %a where dtid = %a", + dbname, ":state", ":message", ":dtid") tpc.deleteRedoTx = sqlparser.BuildParsedQuery( "delete from %s.redo_state where dtid = %a", dbname, ":dtid") @@ -169,9 +169,9 @@ func (tpc *TwoPC) Close() { } // SaveRedo saves the statements in the redo log using the supplied connection. -func (tpc *TwoPC) SaveRedo(ctx context.Context, conn *StatefulConnection, dtid string, queries []string) error { +func (tpc *TwoPC) SaveRedo(ctx context.Context, conn *StatefulConnection, dtid string, queries []tx.Query) error { bindVars := map[string]*querypb.BindVariable{ - "dtid": sqltypes.StringBindVariable(dtid), + "dtid": sqltypes.BytesBindVariable([]byte(dtid)), "state": sqltypes.Int64BindVariable(RedoStatePrepared), "time_created": sqltypes.Int64BindVariable(time.Now().UnixNano()), } @@ -185,7 +185,7 @@ func (tpc *TwoPC) SaveRedo(ctx context.Context, conn *StatefulConnection, dtid s rows[i] = []sqltypes.Value{ sqltypes.NewVarBinary(dtid), sqltypes.NewInt64(int64(i + 1)), - sqltypes.NewVarBinary(query), + sqltypes.NewVarBinary(query.Sql), } } extras := map[string]sqlparser.Encodable{ @@ -200,10 +200,11 @@ func (tpc *TwoPC) SaveRedo(ctx context.Context, conn *StatefulConnection, dtid s } // UpdateRedo changes the state of the redo log for the dtid. -func (tpc *TwoPC) UpdateRedo(ctx context.Context, conn *StatefulConnection, dtid string, state int) error { +func (tpc *TwoPC) UpdateRedo(ctx context.Context, conn *StatefulConnection, dtid string, state int, message string) error { bindVars := map[string]*querypb.BindVariable{ - "dtid": sqltypes.StringBindVariable(dtid), - "state": sqltypes.Int64BindVariable(int64(state)), + "dtid": sqltypes.BytesBindVariable([]byte(dtid)), + "state": sqltypes.Int64BindVariable(int64(state)), + "message": sqltypes.StringBindVariable(message), } _, err := tpc.exec(ctx, conn, tpc.updateRedoTx, bindVars) return err @@ -212,7 +213,7 @@ func (tpc *TwoPC) UpdateRedo(ctx context.Context, conn *StatefulConnection, dtid // DeleteRedo deletes the redo log for the dtid. func (tpc *TwoPC) DeleteRedo(ctx context.Context, conn *StatefulConnection, dtid string) error { bindVars := map[string]*querypb.BindVariable{ - "dtid": sqltypes.StringBindVariable(dtid), + "dtid": sqltypes.BytesBindVariable([]byte(dtid)), } _, err := tpc.exec(ctx, conn, tpc.deleteRedoTx, bindVars) if err != nil { @@ -244,8 +245,9 @@ func (tpc *TwoPC) ReadAllRedo(ctx context.Context) (prepared, failed []*tx.Prepa // which is harmless. tm, _ := row[2].ToCastInt64() curTx = &tx.PreparedTx{ - Dtid: dtid, - Time: time.Unix(0, tm), + Dtid: dtid, + Time: time.Unix(0, tm), + Message: row[4].ToString(), } st, err := row[1].ToCastInt64() if err != nil { @@ -289,7 +291,7 @@ func (tpc *TwoPC) CountUnresolvedRedo(ctx context.Context, unresolvedTime time.T // CreateTransaction saves the metadata of a 2pc transaction as Prepared. func (tpc *TwoPC) CreateTransaction(ctx context.Context, conn *StatefulConnection, dtid string, participants []*querypb.Target) error { bindVars := map[string]*querypb.BindVariable{ - "dtid": sqltypes.StringBindVariable(dtid), + "dtid": sqltypes.BytesBindVariable([]byte(dtid)), "state": sqltypes.Int64BindVariable(int64(DTStatePrepare)), "cur_time": sqltypes.Int64BindVariable(time.Now().UnixNano()), } @@ -322,7 +324,7 @@ func (tpc *TwoPC) CreateTransaction(ctx context.Context, conn *StatefulConnectio // If the transaction is not a in the Prepare state, an error is returned. func (tpc *TwoPC) Transition(ctx context.Context, conn *StatefulConnection, dtid string, state querypb.TransactionState) error { bindVars := map[string]*querypb.BindVariable{ - "dtid": sqltypes.StringBindVariable(dtid), + "dtid": sqltypes.BytesBindVariable([]byte(dtid)), "state": sqltypes.Int64BindVariable(int64(state)), "prepare": sqltypes.Int64BindVariable(int64(querypb.TransactionState_PREPARE)), } @@ -339,7 +341,7 @@ func (tpc *TwoPC) Transition(ctx context.Context, conn *StatefulConnection, dtid // DeleteTransaction deletes the metadata for the specified transaction. func (tpc *TwoPC) DeleteTransaction(ctx context.Context, conn *StatefulConnection, dtid string) error { bindVars := map[string]*querypb.BindVariable{ - "dtid": sqltypes.StringBindVariable(dtid), + "dtid": sqltypes.BytesBindVariable([]byte(dtid)), } _, err := tpc.exec(ctx, conn, tpc.deleteTransaction, bindVars) if err != nil { @@ -359,7 +361,7 @@ func (tpc *TwoPC) ReadTransaction(ctx context.Context, dtid string) (*querypb.Tr result := &querypb.TransactionMetadata{} bindVars := map[string]*querypb.BindVariable{ - "dtid": sqltypes.StringBindVariable(dtid), + "dtid": sqltypes.BytesBindVariable([]byte(dtid)), } qr, err := tpc.read(ctx, conn.Conn, tpc.readTransaction, bindVars) if err != nil { @@ -374,7 +376,7 @@ func (tpc *TwoPC) ReadTransaction(ctx context.Context, dtid string) (*querypb.Tr return nil, vterrors.Wrapf(err, "error parsing state for dtid %s", dtid) } result.State = querypb.TransactionState(st) - if result.State < querypb.TransactionState_PREPARE || result.State > querypb.TransactionState_COMMIT { + if result.State < DTStatePrepare || result.State > DTStateCommit { return nil, fmt.Errorf("unexpected state for dtid %s: %v", dtid, result.State) } // A failure in time parsing will show up as a very old time, @@ -427,7 +429,7 @@ func (tpc *TwoPC) ReadAllTransactions(ctx context.Context) ([]*tx.DistributedTx, log.Errorf("Error parsing state for dtid %s: %v.", dtid, err) } protostate := querypb.TransactionState(st) - if protostate < querypb.TransactionState_PREPARE || protostate > querypb.TransactionState_COMMIT { + if protostate < DTStatePrepare || protostate > DTStateCommit { log.Errorf("Unexpected state for dtid %s: %v.", dtid, protostate) } curTx = &tx.DistributedTx{ @@ -464,10 +466,10 @@ func (tpc *TwoPC) read(ctx context.Context, conn *connpool.Conn, pq *sqlparser.P // UnresolvedTransactions returns the list of unresolved transactions // the list from database is retrieved as -// dtid | state | keyspace | shard -// 1 | PREPARE | ks | 40-80 -// 1 | PREPARE | ks | 80-c0 -// 2 | COMMIT | ks | -40 +// dtid | state | time_created | keyspace | shard +// 1 | PREPARE | 1726748387 | ks | 40-80 +// 1 | PREPARE | 1726748387 | ks | 80-c0 +// 2 | COMMIT | 1726748387 | ks | -40 // Here there are 2 dtids with 2 participants for dtid:1 and 1 participant for dtid:2. func (tpc *TwoPC) UnresolvedTransactions(ctx context.Context, abandonTime time.Time) ([]*querypb.TransactionMetadata, error) { conn, err := tpc.readPool.Get(ctx, nil) @@ -506,17 +508,20 @@ func (tpc *TwoPC) UnresolvedTransactions(ctx context.Context, abandonTime time.T // Extract the transaction state and initialize a new TransactionMetadata stateID, _ := row[1].ToInt() + timeCreated, _ := row[2].ToCastInt64() currentTx = &querypb.TransactionMetadata{ Dtid: dtid, State: querypb.TransactionState(stateID), + TimeCreated: timeCreated, Participants: []*querypb.Target{}, } } // Add the current participant (keyspace and shard) to the transaction currentTx.Participants = append(currentTx.Participants, &querypb.Target{ - Keyspace: row[2].ToString(), - Shard: row[3].ToString(), + Keyspace: row[3].ToString(), + Shard: row[4].ToString(), + TabletType: topodatapb.TabletType_PRIMARY, }) } diff --git a/go/vt/vttablet/tabletserver/twopc_test.go b/go/vt/vttablet/tabletserver/twopc_test.go index f0fa77e0ff8..0dc10266e8c 100644 --- a/go/vt/vttablet/tabletserver/twopc_test.go +++ b/go/vt/vttablet/tabletserver/twopc_test.go @@ -28,6 +28,7 @@ import ( "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/test/utils" querypb "vitess.io/vitess/go/vt/proto/query" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" ) @@ -35,9 +36,9 @@ func TestReadAllRedo(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Reuse code from tx_executor_test. - _, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() + tpc := tsv.te.twoPC conn, err := tsv.qe.conns.Get(ctx, nil) @@ -65,12 +66,14 @@ func TestReadAllRedo(t *testing.T) { {Type: sqltypes.Int64}, {Type: sqltypes.Int64}, {Type: sqltypes.VarChar}, + {Type: sqltypes.Text}, }, Rows: [][]sqltypes.Value{{ sqltypes.NewVarBinary("dtid0"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt01"), + sqltypes.NULL, }}, }) prepared, failed, err = tpc.ReadAllRedo(ctx) @@ -95,17 +98,20 @@ func TestReadAllRedo(t *testing.T) { {Type: sqltypes.Int64}, {Type: sqltypes.Int64}, {Type: sqltypes.VarChar}, + {Type: sqltypes.Text}, }, Rows: [][]sqltypes.Value{{ sqltypes.NewVarBinary("dtid0"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt01"), + sqltypes.NULL, }, { sqltypes.NewVarBinary("dtid0"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt02"), + sqltypes.NULL, }}, }) prepared, failed, err = tpc.ReadAllRedo(ctx) @@ -130,22 +136,26 @@ func TestReadAllRedo(t *testing.T) { {Type: sqltypes.Int64}, {Type: sqltypes.Int64}, {Type: sqltypes.VarChar}, + {Type: sqltypes.Text}, }, Rows: [][]sqltypes.Value{{ sqltypes.NewVarBinary("dtid0"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt01"), + sqltypes.NULL, }, { sqltypes.NewVarBinary("dtid0"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt02"), + sqltypes.NULL, }, { sqltypes.NewVarBinary("dtid1"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt11"), + sqltypes.NULL, }}, }) prepared, failed, err = tpc.ReadAllRedo(ctx) @@ -174,37 +184,44 @@ func TestReadAllRedo(t *testing.T) { {Type: sqltypes.Int64}, {Type: sqltypes.Int64}, {Type: sqltypes.VarChar}, + {Type: sqltypes.Text}, }, Rows: [][]sqltypes.Value{{ sqltypes.NewVarBinary("dtid0"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt01"), + sqltypes.NULL, }, { sqltypes.NewVarBinary("dtid0"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt02"), + sqltypes.NULL, }, { sqltypes.NewVarBinary("dtid1"), - sqltypes.NewVarBinary("Failed"), + sqltypes.NewInt64(RedoStateFailed), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt11"), + sqltypes.TestValue(sqltypes.Text, "error1"), }, { sqltypes.NewVarBinary("dtid2"), - sqltypes.NewVarBinary("Failed"), + sqltypes.NewInt64(RedoStateFailed), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt21"), + sqltypes.TestValue(sqltypes.Text, "error2"), }, { sqltypes.NewVarBinary("dtid2"), - sqltypes.NewVarBinary("Failed"), + sqltypes.NewInt64(RedoStateFailed), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt22"), + sqltypes.TestValue(sqltypes.Text, "error2"), }, { sqltypes.NewVarBinary("dtid3"), sqltypes.NewInt64(RedoStatePrepared), sqltypes.NewVarBinary("1"), sqltypes.NewVarBinary("stmt31"), + sqltypes.NULL, }}, }) prepared, failed, err = tpc.ReadAllRedo(ctx) @@ -220,29 +237,27 @@ func TestReadAllRedo(t *testing.T) { Queries: []string{"stmt31"}, Time: time.Unix(0, 1), }} - if !reflect.DeepEqual(prepared, want) { - t.Errorf("ReadAllRedo: %s, want %s", jsonStr(prepared), jsonStr(want)) - } + utils.MustMatch(t, want, prepared) wantFailed := []*tx.PreparedTx{{ Dtid: "dtid1", Queries: []string{"stmt11"}, Time: time.Unix(0, 1), + Message: "error1", }, { Dtid: "dtid2", Queries: []string{"stmt21", "stmt22"}, Time: time.Unix(0, 1), + Message: "error2", }} - if !reflect.DeepEqual(failed, wantFailed) { - t.Errorf("ReadAllRedo failed): %s, want %s", jsonStr(failed), jsonStr(wantFailed)) - } + utils.MustMatch(t, wantFailed, failed) } func TestReadAllTransactions(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() + tpc := tsv.te.twoPC conn, err := tsv.qe.conns.Get(ctx, nil) @@ -403,9 +418,8 @@ func jsonStr(v any) string { func TestUnresolvedTransactions(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, tsv, db := newTestTxExecutor(t, ctx) - defer db.Close() - defer tsv.StopService() + _, tsv, db, closer := newTestTxExecutor(t, ctx) + defer closer() conn, err := tsv.qe.conns.Get(ctx, nil) require.NoError(t, err) @@ -421,38 +435,41 @@ func TestUnresolvedTransactions(t *testing.T) { }, { name: "one unresolved transaction", unresolvedTx: sqltypes.MakeTestResult( - sqltypes.MakeTestFields("dtid|state|keyspace|shard", - "VARBINARY|INT64|VARCHAR|VARCHAR"), - "dtid0|1|ks01|shard01", - "dtid0|1|ks01|shard02"), + sqltypes.MakeTestFields("dtid|state|time_created|keyspace|shard", + "VARBINARY|INT64|INT64|VARCHAR|VARCHAR"), + "dtid0|1|2|ks01|shard01", + "dtid0|1|2|ks01|shard02"), expectedTx: []*querypb.TransactionMetadata{{ - Dtid: "dtid0", - State: querypb.TransactionState_PREPARE, + Dtid: "dtid0", + State: querypb.TransactionState_PREPARE, + TimeCreated: 2, Participants: []*querypb.Target{ - {Keyspace: "ks01", Shard: "shard01"}, - {Keyspace: "ks01", Shard: "shard02"}, + {Keyspace: "ks01", Shard: "shard01", TabletType: topodatapb.TabletType_PRIMARY}, + {Keyspace: "ks01", Shard: "shard02", TabletType: topodatapb.TabletType_PRIMARY}, }}}, }, { name: "two unresolved transaction", unresolvedTx: sqltypes.MakeTestResult( - sqltypes.MakeTestFields("dtid|state|keyspace|shard", - "VARBINARY|INT64|VARCHAR|VARCHAR"), - "dtid0|3|ks01|shard01", - "dtid0|3|ks01|shard02", - "dtid1|2|ks02|shard03", - "dtid1|2|ks01|shard02"), + sqltypes.MakeTestFields("dtid|state|time_created|keyspace|shard", + "VARBINARY|INT64|INT64|VARCHAR|VARCHAR"), + "dtid0|3|1|ks01|shard01", + "dtid0|3|1|ks01|shard02", + "dtid1|2|2|ks02|shard03", + "dtid1|2|2|ks01|shard02"), expectedTx: []*querypb.TransactionMetadata{{ - Dtid: "dtid0", - State: querypb.TransactionState_COMMIT, + Dtid: "dtid0", + State: querypb.TransactionState_COMMIT, + TimeCreated: 1, Participants: []*querypb.Target{ - {Keyspace: "ks01", Shard: "shard01"}, - {Keyspace: "ks01", Shard: "shard02"}, + {Keyspace: "ks01", Shard: "shard01", TabletType: topodatapb.TabletType_PRIMARY}, + {Keyspace: "ks01", Shard: "shard02", TabletType: topodatapb.TabletType_PRIMARY}, }}, { - Dtid: "dtid1", - State: querypb.TransactionState_ROLLBACK, + Dtid: "dtid1", + TimeCreated: 2, + State: querypb.TransactionState_ROLLBACK, Participants: []*querypb.Target{ - {Keyspace: "ks02", Shard: "shard03"}, - {Keyspace: "ks01", Shard: "shard02"}, + {Keyspace: "ks02", Shard: "shard03", TabletType: topodatapb.TabletType_PRIMARY}, + {Keyspace: "ks01", Shard: "shard02", TabletType: topodatapb.TabletType_PRIMARY}, }}, }, }} diff --git a/go/vt/vttablet/tabletserver/tx/api.go b/go/vt/vttablet/tabletserver/tx/api.go index a392e530ffa..a7bc4389b89 100644 --- a/go/vt/vttablet/tabletserver/tx/api.go +++ b/go/vt/vttablet/tabletserver/tx/api.go @@ -21,45 +21,53 @@ import ( "strings" "time" + "vitess.io/vitess/go/slice" querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" ) type ( // ConnID as type int64 ConnID = int64 - - //DTID as type string + // DTID as type string DTID = string - - //EngineStateMachine is used to control the state the transactional engine - - //whether new connections and/or transactions are allowed or not. + // EngineStateMachine is used to control the state the transactional engine - + // whether new connections and/or transactions are allowed or not. EngineStateMachine interface { Init() error AcceptReadWrite() error AcceptReadOnly() error StopGently() } - // ReleaseReason as type int ReleaseReason int - - //Properties contains all information that is related to the currently running - //transaction on the connection + // Properties contains all information that is related to the currently running + // transaction on the connection Properties struct { EffectiveCaller *vtrpcpb.CallerID ImmediateCaller *querypb.VTGateCallerID StartTime time.Time EndTime time.Time - Queries []string + Queries []Query Autocommit bool Conclusion string LogToFile bool Stats *servenv.TimingsWrapper } + + // Query contains the query and involved tables executed inside transaction. + // A savepoint is represented by having only the Savepoint field set. + // This is used to rollback to a specific savepoint. + // The query log on commit, does not need to store the savepoint. + Query struct { + Savepoint string + Sql string + Tables []string + } ) const ( @@ -114,12 +122,57 @@ var txNames = map[ReleaseReason]string{ ConnRenewFail: "renewFail", } -// RecordQuery records the query against this transaction. -func (p *Properties) RecordQuery(query string) { +// RecordQueryDetail records the query and tables against this transaction. +func (p *Properties) RecordQueryDetail(query string, tables []string) { if p == nil { return } - p.Queries = append(p.Queries, query) + p.Queries = append(p.Queries, Query{ + Sql: query, + Tables: tables, + }) +} + +// RecordQueryDetail records the query and tables against this transaction. +func (p *Properties) RecordSavePointDetail(savepoint string) { + if p == nil { + return + } + p.Queries = append(p.Queries, Query{ + Savepoint: savepoint, + }) +} + +func (p *Properties) RollbackToSavepoint(savepoint string) error { + if p == nil { + return nil + } + for i, query := range p.Queries { + if query.Savepoint == savepoint { + p.Queries = p.Queries[:i] + return nil + } + } + + return vterrors.VT13001(fmt.Sprintf("savepoint %s not found", savepoint)) +} + +// RecordQuery records the query and extract tables against this transaction. +func (p *Properties) RecordQuery(query string, parser *sqlparser.Parser) { + if p == nil { + return + } + stmt, err := parser.Parse(query) + if err != nil { + // This should neven happen, but if it does, + // we would not be able to block cut-overs on this query. + return + } + tables := sqlparser.ExtractAllTables(stmt) + p.Queries = append(p.Queries, Query{ + Sql: query, + Tables: tables, + }) } // InTransaction returns true as soon as this struct is not nil @@ -134,10 +187,11 @@ func (p *Properties) String(sanitize bool, parser *sqlparser.Parser) string { printQueries := func() string { sb := strings.Builder{} for _, query := range p.Queries { + sql := query.Sql if sanitize { - query, _ = parser.RedactSQLQuery(query) + sql, _ = parser.RedactSQLQuery(sql) } - sb.WriteString(query) + sb.WriteString(sql) sb.WriteString(";") } return sb.String() @@ -154,3 +208,12 @@ func (p *Properties) String(sanitize bool, parser *sqlparser.Parser) string { printQueries(), ) } + +func (p *Properties) GetQueries() []Query { + if p == nil { + return nil + } + return slice.Filter(p.Queries, func(q Query) bool { + return q.Sql != "" + }) +} diff --git a/go/vt/vttablet/tabletserver/tx/api_test.go b/go/vt/vttablet/tabletserver/tx/api_test.go new file mode 100644 index 00000000000..cefb04c0391 --- /dev/null +++ b/go/vt/vttablet/tabletserver/tx/api_test.go @@ -0,0 +1,62 @@ +/* +Copyright 2024 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 tx + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/test/utils" +) + +/* + TestRollbackToSavePointQueryDetails tests the rollback to savepoint query details + +s1 +q1 +s2 +r1 +q2 +q3 +s3 +s4 +q4 +q5 +r2 -- error +r4 +*/ +func TestRollbackToSavePointQueryDetails(t *testing.T) { + p := &Properties{} + p.RecordSavePointDetail("s1") + p.RecordQueryDetail("select 1", nil) + p.RecordSavePointDetail("s2") + require.NoError(t, p.RollbackToSavepoint("s1")) + p.RecordQueryDetail("select 2", nil) + p.RecordQueryDetail("select 3", nil) + p.RecordSavePointDetail("s3") + p.RecordSavePointDetail("s4") + p.RecordQueryDetail("select 4", nil) + p.RecordQueryDetail("select 5", nil) + require.ErrorContains(t, p.RollbackToSavepoint("s2"), "savepoint s2 not found") + require.NoError(t, p.RollbackToSavepoint("s4")) + + utils.MustMatch(t, p.GetQueries(), []Query{ + {Sql: "select 2"}, + {Sql: "select 3"}, + }) +} diff --git a/go/vt/vttablet/tabletserver/tx/twopc.go b/go/vt/vttablet/tabletserver/tx/twopc.go index 56cfbd1a51f..6412fc53b4d 100644 --- a/go/vt/vttablet/tabletserver/tx/twopc.go +++ b/go/vt/vttablet/tabletserver/tx/twopc.go @@ -36,4 +36,5 @@ type PreparedTx struct { Dtid string Queries []string Time time.Time + Message string } diff --git a/go/vt/vttablet/tabletserver/tx_engine.go b/go/vt/vttablet/tabletserver/tx_engine.go index 57c6ff1fd64..b6e0e69b86d 100644 --- a/go/vt/vttablet/tabletserver/tx_engine.go +++ b/go/vt/vttablet/tabletserver/tx_engine.go @@ -22,15 +22,16 @@ import ( "sync" "time" + "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/pools/smartconnpool" "vitess.io/vitess/go/timer" "vitess.io/vitess/go/trace" - "vitess.io/vitess/go/vt/concurrency" "vitess.io/vitess/go/vt/dtids" "vitess.io/vitess/go/vt/log" querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/servenv" + "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletserver/connpool" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" @@ -75,9 +76,14 @@ type TxEngine struct { // transition while creating new transactions beginRequests sync.WaitGroup - twopcEnabled bool + // twopcEnabled is the flag value of whether the user has enabled twopc or not. + twopcEnabled bool + // twopcAllowed is whether it is safe to allow two pc transactions or not. + // There are multiple reasons to disallow TwoPC: + // 1. If the primary tablet doesn't run with semi-sync we set this to false, and disallow any prepared calls. + // 2. TabletControls have been set in the tablet record, and Query service is going to be disabled. + twopcAllowed []bool shutdownGracePeriod time.Duration - coordinatorAddress string abandonAge time.Duration ticks *timer.Timer @@ -87,10 +93,17 @@ type TxEngine struct { txPool *TxPool preparedPool *TxPreparedPool twoPC *TwoPC - twoPCReady sync.WaitGroup dxNotify func() } +// TwoPC can be disallowed for various reasons. These are the reasons we keep track off +// when deciding if new prepared transactions should be allowed or not. +const ( + TwoPCAllowed_SemiSync = iota + TwoPCAllowed_TabletControls + TwoPCAllowed_Len +) + // NewTxEngine creates a new TxEngine. func NewTxEngine(env tabletenv.Env, dxNotifier func()) *TxEngine { config := env.Config() @@ -101,6 +114,14 @@ func NewTxEngine(env tabletenv.Env, dxNotifier func()) *TxEngine { } limiter := txlimiter.New(env) te.txPool = NewTxPool(env, limiter) + // We initially allow twoPC (handles vttablet restarts). + // We will disallow them for a few reasons - + // 1. when a new tablet is promoted if semi-sync is turned off. + // 2. TabletControls have been set by a Resharding workflow. + te.twopcAllowed = make([]bool, TwoPCAllowed_Len) + for idx := range te.twopcAllowed { + te.twopcAllowed[idx] = true + } te.twopcEnabled = config.TwoPCEnable if te.twopcEnabled { if config.TwoPCAbandonAge <= 0 { @@ -116,7 +137,7 @@ func NewTxEngine(env tabletenv.Env, dxNotifier func()) *TxEngine { // perform metadata state change operations. Without this, // the system can deadlock if all connections get moved to // the TxPreparedPool. - te.preparedPool = NewTxPreparedPool(config.TxPool.Size - 2) + te.preparedPool = NewTxPreparedPool(config.TxPool.Size-2, te.twopcEnabled) readPool := connpool.NewPool(env, "TxReadPool", tabletenv.ConnPoolConfig{ Size: 3, IdleTimeout: env.Config().TxPool.IdleTimeout, @@ -128,9 +149,6 @@ func NewTxEngine(env tabletenv.Env, dxNotifier func()) *TxEngine { } // AcceptReadWrite will start accepting all transactions. -// If transitioning from RO mode, transactions are rolled -// back before accepting new transactions. This is to allow -// for 2PC state to be correctly initialized. func (te *TxEngine) AcceptReadWrite() { te.transition(AcceptingReadAndWrite) } @@ -149,35 +167,70 @@ func (te *TxEngine) transition(state txEngineState) { } log.Infof("TxEngine transition: %v", state) - switch te.state { - case AcceptingReadOnly, AcceptingReadAndWrite: + + // When we are transitioning from read write state, we should close all transactions. + if te.state == AcceptingReadAndWrite { te.shutdownLocked() - case NotServing: - // No special action. } te.state = state + if te.twopcEnabled && te.state == AcceptingReadAndWrite { + // If the prepared pool is not open, then we need to redo the prepared transactions + // before we open the transaction engine to accept new writes. + // This check is required because during a Promotion, we would have already setup the prepared pool + // and redid the prepared transactions when we turn super_read_only off. So we don't need to do it again. + if !te.preparedPool.IsOpen() { + // We need to redo prepared transactions here to handle vttablet restarts. + // If MySQL continues to work fine, then we won't end up redoing the prepared transactions as part of any RPC call + // since VTOrc won't call `UndoDemotePrimary`. We need to do them as part of this transition. + te.redoPreparedTransactionsLocked() + } + te.startTransactionWatcher() + } te.txPool.Open(te.env.Config().DB.AppWithDB(), te.env.Config().DB.DbaWithDB(), te.env.Config().DB.AppDebugWithDB()) +} - if te.twopcEnabled && te.state == AcceptingReadAndWrite { - // If there are errors, we choose to raise an alert and - // continue anyway. Serving traffic is considered more important - // than blocking everything for the sake of a few transactions. - // We do this async; so we do not end up blocking writes on - // failover for our setup tasks if using semi-sync replication. - te.twoPCReady.Add(1) - go func() { - defer te.twoPCReady.Done() - if err := te.twoPC.Open(te.env.Config().DB); err != nil { - te.env.Stats().InternalErrors.Add("TwopcOpen", 1) - log.Errorf("Could not open TwoPC engine: %v", err) - } - if err := te.prepareFromRedo(); err != nil { - te.env.Stats().InternalErrors.Add("TwopcResurrection", 1) - log.Errorf("Could not prepare transactions: %v", err) - } - te.startTransactionWatcher() - }() +// RedoPreparedTransactions acquires the state lock and calls redoPreparedTransactionsLocked. +func (te *TxEngine) RedoPreparedTransactions() { + if te.twopcEnabled { + te.stateLock.Lock() + defer te.stateLock.Unlock() + te.redoPreparedTransactionsLocked() + } +} + +// redoPreparedTransactionsLocked redoes the prepared transactions. +// If there are errors, we choose to raise an alert and +// continue anyway. Serving traffic is considered more important +// than blocking everything for the sake of a few transactions. +// We do this async; so we do not end up blocking writes on +// failover for our setup tasks if using semi-sync replication. +func (te *TxEngine) redoPreparedTransactionsLocked() { + oldState := te.state + // We shutdown to ensure no other writes are in progress. + te.shutdownLocked() + defer func() { + te.state = oldState + }() + + if err := te.twoPC.Open(te.env.Config().DB); err != nil { + te.env.Stats().InternalErrors.Add("TwopcOpen", 1) + log.Errorf("Could not open TwoPC engine: %v", err) + return + } + + // We should only open the prepared pool and the transaction pool if the opening of twoPC pool is successful. + // We use the prepared pool being open to know if we need to redo the prepared transactions. + // So if we open the prepared pool and then opening of twoPC fails, we will never end up opening the twoPC pool at all! + // This is why opening prepared pool after the twoPC pool is crucial for correctness. + te.preparedPool.Open() + // We have to defer opening the transaction pool because we call shutdown in the beginning that closes it. + // We want to open the transaction pool after the prepareFromRedo has run. Also, we want this to run even if that fails. + defer te.txPool.Open(te.env.Config().DB.AppWithDB(), te.env.Config().DB.DbaWithDB(), te.env.Config().DB.AppDebugWithDB()) + + if err := te.prepareFromRedo(); err != nil { + te.env.Stats().InternalErrors.Add("TwopcResurrection", 1) + log.Errorf("Could not prepare transactions: %v", err) } } @@ -217,7 +270,7 @@ func (te *TxEngine) isTxPoolAvailable(addToWaitGroup func(int)) error { // statement(s) used to execute the begin (if any). // // Subsequent statements can access the connection through the transaction id. -func (te *TxEngine) Begin(ctx context.Context, savepointQueries []string, reservedID int64, setting *smartconnpool.Setting, options *querypb.ExecuteOptions) (int64, string, string, error) { +func (te *TxEngine) Begin(ctx context.Context, reservedID int64, setting *smartconnpool.Setting, options *querypb.ExecuteOptions) (int64, string, string, error) { span, ctx := trace.NewSpan(ctx, "TxEngine.Begin") defer span.Finish() @@ -232,7 +285,7 @@ func (te *TxEngine) Begin(ctx context.Context, savepointQueries []string, reserv } defer te.beginRequests.Done() - conn, beginSQL, sessionStateChanges, err := te.txPool.Begin(ctx, options, te.state == AcceptingReadOnly, reservedID, savepointQueries, setting) + conn, beginSQL, sessionStateChanges, err := te.txPool.Begin(ctx, options, te.state == AcceptingReadOnly, reservedID, setting) if err != nil { return 0, "", "", err } @@ -304,11 +357,6 @@ func (te *TxEngine) shutdownLocked() { te.stateLock.Lock() log.Infof("TxEngine - state lock acquired again") - // Shut down functions are idempotent. - // No need to check if 2pc is enabled. - log.Infof("TxEngine - stop watchdog") - te.stopTransactionWatcher() - poolEmpty := make(chan bool) rollbackDone := make(chan bool) // This goroutine decides if transactions have to be @@ -331,13 +379,6 @@ func (te *TxEngine) shutdownLocked() { // connections. te.txPool.scp.ShutdownNonTx() if te.shutdownGracePeriod <= 0 { - // No grace period was specified. Wait indefinitely for transactions to be concluded. - // TODO(sougou): invoking rollbackPrepared is incorrect here. Prepared statements should - // actually be rolled back last. But this will cause the shutdown to hang because the - // tx pool will never become empty, because the prepared pool is holding on to connections - // from the tx pool. But we plan to deprecate this approach to 2PC. So, this - // should eventually be deleted. - te.rollbackPrepared() log.Info("No grace period specified: performing normal wait.") return } @@ -352,6 +393,9 @@ func (te *TxEngine) shutdownLocked() { log.Info("Transactions completed before grace period: shutting down.") } }() + // It is important to note, that we aren't rolling back prepared transactions here. + // That is happneing in the same place where we are killing queries. This will block + // until either all prepared transactions get resolved or rollbacked. log.Infof("TxEngine - waiting for empty txPool") te.txPool.WaitForEmpty() // If the goroutine is still running, signal that it can exit. @@ -360,10 +404,19 @@ func (te *TxEngine) shutdownLocked() { log.Infof("TxEngine - making sure the goroutine has returned") <-rollbackDone + // We stop the transaction watcher so late, because if the user isn't running + // with any shutdown grace period, we still want the watcher to run while we are waiting + // for resolving transactions. + log.Infof("TxEngine - stop transaction watcher") + te.stopTransactionWatcher() + + // Mark the prepared pool closed. log.Infof("TxEngine - closing the txPool") te.txPool.Close() log.Infof("TxEngine - closing twoPC") te.twoPC.Close() + log.Infof("TxEngine - closing the prepared pool") + te.preparedPool.Close() log.Infof("TxEngine - finished shutdownLocked") } @@ -373,76 +426,166 @@ func (te *TxEngine) shutdownLocked() { // to ensure there are no future collisions. func (te *TxEngine) prepareFromRedo() error { ctx := tabletenv.LocalContext() - var allErr concurrency.AllErrorRecorder - prepared, failed, err := te.twoPC.ReadAllRedo(ctx) - if err != nil { - return err + + prepared, failed, readErr := te.twoPC.ReadAllRedo(ctx) + if readErr != nil { + return readErr } - maxid := int64(0) -outer: + var ( + maxID = int64(0) + preparedCounter = 0 + failedCounter = len(failed) + allErrs []error + ) + + // While going through the prepared transaction. + // We will extract the transaction ID from the dtid and + // update the last transaction ID to max value to avoid any collision with the new transactions. + for _, preparedTx := range prepared { - txid, err := dtids.TransactionID(preparedTx.Dtid) - if err != nil { - log.Errorf("Error extracting transaction ID from dtid: %v", err) - } - if txid > maxid { - maxid = txid + txID, _ := dtids.TransactionID(preparedTx.Dtid) + if txID > maxID { + maxID = txID } - conn, _, _, err := te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + + prepFailed, err := te.prepareTx(ctx, preparedTx) if err != nil { - allErr.RecordError(err) - continue - } - for _, stmt := range preparedTx.Queries { - conn.TxProperties().RecordQuery(stmt) - _, err := conn.Exec(ctx, stmt, 1, false) - if err != nil { - allErr.RecordError(err) - te.txPool.RollbackAndRelease(ctx, conn) - continue outer + allErrs = append(allErrs, vterrors.Wrapf(err, "dtid - %v", preparedTx.Dtid)) + if prepFailed { + failedCounter++ + te.env.Stats().RedoPreparedFail.Add("NonRetryable", 1) + } else { + te.env.Stats().RedoPreparedFail.Add("Retryable", 1) } - } - // We should not use the external Prepare because - // we don't want to write again to the redo log. - err = te.preparedPool.Put(conn, preparedTx.Dtid) - if err != nil { - allErr.RecordError(err) - continue + } else { + preparedCounter++ } } + for _, preparedTx := range failed { - txid, err := dtids.TransactionID(preparedTx.Dtid) + txID, _ := dtids.TransactionID(preparedTx.Dtid) + if txID > maxID { + maxID = txID + } + te.preparedPool.SetFailed(preparedTx.Dtid) + } + + te.txPool.AdjustLastID(maxID) + log.Infof("TwoPC: Prepared %d transactions, and registered %d failures.", preparedCounter, failedCounter) + return vterrors.Aggregate(allErrs) +} + +func (te *TxEngine) prepareTx(ctx context.Context, preparedTx *tx.PreparedTx) (failed bool, err error) { + defer func() { if err != nil { - log.Errorf("Error extracting transaction ID from dtid: %v", err) + failed = te.checkErrorAndMarkFailed(ctx, preparedTx.Dtid, err, "TwopcPrepareRedo") } - if txid > maxid { - maxid = txid + }() + + // We need to check whether the first query is a SET query or not. + // If it is then we need to run it before we begin the transaction because + // some connection settings can't be modified after a transaction has started + // For example - + // mysql> begin; + // Query OK, 0 rows affected (0.00 sec) + // mysql> set @@transaction_isolation="read-committed"; + // ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progress. + var settingsQuery string + firstQuery := preparedTx.Queries[0] + if sqlparser.Preview(firstQuery) == sqlparser.StmtSet { + settingsQuery = firstQuery + preparedTx.Queries = preparedTx.Queries[1:] + } + + // We need to redo the prepared transactions using a dba user because MySQL might still be in read only mode. + var conn *StatefulConnection + if conn, err = te.beginNewDbaConnection(ctx, settingsQuery); err != nil { + return + } + + for _, stmt := range preparedTx.Queries { + conn.TxProperties().RecordQuery(stmt, te.env.Environment().Parser()) + if _, err = conn.Exec(ctx, stmt, 1, false); err != nil { + te.txPool.RollbackAndRelease(ctx, conn) + return } - te.preparedPool.SetFailed(preparedTx.Dtid) } - te.txPool.AdjustLastID(maxid) - log.Infof("TwoPC: Prepared %d transactions, and registered %d failures.", len(prepared), len(failed)) - return allErr.Error() + // We should not use the external Prepare because + // we don't want to write again to the redo log. + err = te.preparedPool.Put(conn, preparedTx.Dtid) + return } -// shutdownTransactions rolls back all open transactions -// including the prepared ones. -// This is used for transitioning from a primary to a non-primary -// serving type. +// checkErrorAndMarkFailed check that the error is retryable or non-retryable error. +// If it is a non-retryable error than it marks the dtid as failed in the prepared pool, +// increments the InternalErrors counter, and also changes the state of the transaction in the redo log as failed. +func (te *TxEngine) checkErrorAndMarkFailed(ctx context.Context, dtid string, receivedErr error, metricName string) (fail bool) { + state := RedoStateFailed + if isRetryableError(receivedErr) { + log.Infof("retryable error for dtid: %s", dtid) + state = RedoStatePrepared + } else { + fail = true + te.env.Stats().InternalErrors.Add(metricName, 1) + te.preparedPool.SetFailed(dtid) + } + + // Update the state of the transaction in the redo log. + // Retryable Error: Update the message with error message. + // Non-retryable Error: Along with message, update the state as RedoStateFailed. + conn, _, _, err := te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) + if err != nil { + log.Errorf("markFailed: Begin failed for dtid %s: %v", dtid, err) + return + } + defer te.txPool.RollbackAndRelease(ctx, conn) + + if err = te.twoPC.UpdateRedo(ctx, conn, dtid, state, receivedErr.Error()); err != nil { + log.Errorf("markFailed: UpdateRedo failed for dtid %s: %v", dtid, err) + return + } + + if _, err = te.txPool.Commit(ctx, conn); err != nil { + log.Errorf("markFailed: Commit failed for dtid %s: %v", dtid, err) + } + return +} + +func isRetryableError(err error) bool { + switch vterrors.Code(err) { + case vtrpcpb.Code_OK, + vtrpcpb.Code_DEADLINE_EXCEEDED, + vtrpcpb.Code_CANCELED, + vtrpcpb.Code_UNAVAILABLE: + return true + case vtrpcpb.Code_UNKNOWN: + // If the error is unknown, convert to SQL Error. + sqlErr := sqlerror.NewSQLErrorFromError(err) + // Connection errors are retryable + return sqlerror.IsConnErr(sqlErr) + default: + return false + } +} + +// shutdownTransactions rolls back all open transactions that are idol. +// These are transactions that are open but no write is executing on them right now. +// By definition, prepared transactions aren't part of them since these are transactions on which +// the user has issued a commit command. These transactions are rollbacked elsewhere when we kill all writes. +// This is used for transitioning from a primary to a non-primary serving type. func (te *TxEngine) shutdownTransactions() { - te.rollbackPrepared() ctx := tabletenv.LocalContext() - // The order of rollbacks is currently not material because - // we don't allow new statements or commits during - // this function. In case of any such change, this will - // have to be revisited. te.txPool.Shutdown(ctx) } -func (te *TxEngine) rollbackPrepared() { +// RollbackPrepared rollbacks all the prepared transactions. +// This should only be called after we are certain no other writes are in progress. +// If there were some other conflicting write in progress that hadn't been killed, then it could potentially go through +// and cause data corruption since we won't be able to prepare the transaction again. +func (te *TxEngine) RollbackPrepared() { ctx := tabletenv.LocalContext() - for _, conn := range te.preparedPool.FetchAll() { + for _, conn := range te.preparedPool.FetchAllForRollback() { te.txPool.Rollback(ctx, conn) conn.Release(tx.TxRollback) } @@ -455,14 +598,13 @@ func (te *TxEngine) startTransactionWatcher() { ctx, cancel := context.WithTimeout(tabletenv.LocalContext(), te.abandonAge/4) defer cancel() - // Raise alerts on prepares that have been unresolved for too long. - // Use 5x abandonAge to give opportunity for transaction coordinator to resolve these redo logs. - count, err := te.twoPC.CountUnresolvedRedo(ctx, time.Now().Add(-te.abandonAge*5)) + // Track unresolved redo logs. + count, err := te.twoPC.CountUnresolvedRedo(ctx, time.Now().Add(-te.abandonAge)) if err != nil { te.env.Stats().InternalErrors.Add("RedoWatcherFail", 1) log.Errorf("Error reading prepared transactions: %v", err) } - te.env.Stats().Unresolved.Set("Prepares", count) + te.env.Stats().Unresolved.Set("ResourceManager", count) // Notify lingering distributed transactions. count, err = te.twoPC.CountUnresolvedTransaction(ctx, time.Now().Add(-te.abandonAge)) @@ -471,6 +613,7 @@ func (te *TxEngine) startTransactionWatcher() { log.Errorf("Error reading unresolved transactions: %v", err) return } + te.env.Stats().Unresolved.Set("MetadataManager", count) if count > 0 { te.dxNotify() } @@ -483,7 +626,7 @@ func (te *TxEngine) stopTransactionWatcher() { } // ReserveBegin creates a reserved connection, and in it opens a transaction -func (te *TxEngine) ReserveBegin(ctx context.Context, options *querypb.ExecuteOptions, preQueries []string, savepointQueries []string) (int64, string, error) { +func (te *TxEngine) ReserveBegin(ctx context.Context, options *querypb.ExecuteOptions, preQueries []string) (int64, string, error) { span, ctx := trace.NewSpan(ctx, "TxEngine.ReserveBegin") defer span.Finish() err := te.isTxPoolAvailable(te.beginRequests.Add) @@ -497,7 +640,7 @@ func (te *TxEngine) ReserveBegin(ctx context.Context, options *querypb.ExecuteOp return 0, "", err } defer conn.UnlockUpdateTime() - _, sessionStateChanges, err := te.txPool.begin(ctx, options, te.state == AcceptingReadOnly, conn, savepointQueries) + _, sessionStateChanges, err := te.txPool.begin(ctx, options, te.state == AcceptingReadOnly, conn) if err != nil { conn.Close() conn.Release(tx.ConnInitFail) @@ -579,3 +722,39 @@ func (te *TxEngine) Release(connID int64) error { return nil } + +// beginNewDbaConnection gets a new dba connection and starts a transaction in it. +// This should only be used to redo prepared transactions. All the other writes should use the normal pool. +func (te *TxEngine) beginNewDbaConnection(ctx context.Context, settingsQuery string) (*StatefulConnection, error) { + dbConn, err := connpool.NewConn(ctx, te.env.Config().DB.DbaWithDB(), nil, nil, te.env) + if err != nil { + return nil, err + } + + // If we have a settings query that we need to apply, we do that before starting the transaction. + if settingsQuery != "" { + if _, err = dbConn.ExecOnce(ctx, settingsQuery, 1, false); err != nil { + return nil, err + } + } + + sc := &StatefulConnection{ + dbConn: &connpool.PooledConn{ + Conn: dbConn, + }, + env: te.env, + } + + _, _, err = te.txPool.begin(ctx, nil, false, sc) + return sc, err +} + +// IsTwoPCAllowed checks if TwoPC is allowed. +func (te *TxEngine) IsTwoPCAllowed() bool { + for _, allowed := range te.twopcAllowed { + if !allowed { + return false + } + } + return true +} diff --git a/go/vt/vttablet/tabletserver/tx_engine_test.go b/go/vt/vttablet/tabletserver/tx_engine_test.go index 95057d754fb..f4dd0596691 100644 --- a/go/vt/vttablet/tabletserver/tx_engine_test.go +++ b/go/vt/vttablet/tabletserver/tx_engine_test.go @@ -25,7 +25,10 @@ import ( "testing" "time" + "vitess.io/vitess/go/mysql/sqlerror" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vtenv" + "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" "github.com/stretchr/testify/assert" @@ -59,11 +62,11 @@ func TestTxEngineClose(t *testing.T) { // Normal close with timeout wait. te.AcceptReadWrite() - c, beginSQL, _, err := te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + c, beginSQL, _, err := te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) require.Equal(t, "begin", beginSQL) c.Unlock() - c, beginSQL, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + c, beginSQL, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) require.Equal(t, "begin", beginSQL) c.Unlock() @@ -75,7 +78,7 @@ func TestTxEngineClose(t *testing.T) { // Immediate close. te.AcceptReadOnly() - c, _, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + c, _, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) if err != nil { t.Fatal(err) } @@ -87,7 +90,7 @@ func TestTxEngineClose(t *testing.T) { // Normal close with short grace period. te.shutdownGracePeriod = 25 * time.Millisecond te.AcceptReadWrite() - c, _, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + c, _, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) c.Unlock() start = time.Now() @@ -98,7 +101,7 @@ func TestTxEngineClose(t *testing.T) { // Normal close with short grace period, but pool gets empty early. te.shutdownGracePeriod = 25 * time.Millisecond te.AcceptReadWrite() - c, _, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + c, _, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) c.Unlock() go func() { @@ -114,7 +117,7 @@ func TestTxEngineClose(t *testing.T) { // Immediate close, but connection is in use. te.AcceptReadOnly() - c, _, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + c, _, _, err = te.txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) go func() { time.Sleep(100 * time.Millisecond) @@ -135,7 +138,7 @@ func TestTxEngineClose(t *testing.T) { te.AcceptReadWrite() _, err = te.Reserve(ctx, &querypb.ExecuteOptions{}, 0, nil) require.NoError(t, err) - _, _, err = te.ReserveBegin(ctx, &querypb.ExecuteOptions{}, nil, nil) + _, _, err = te.ReserveBegin(ctx, &querypb.ExecuteOptions{}, nil) require.NoError(t, err) start = time.Now() te.Close() @@ -156,11 +159,11 @@ func TestTxEngineBegin(t *testing.T) { for _, exec := range []func() (int64, string, error){ func() (int64, string, error) { - tx, _, schemaStateChanges, err := te.Begin(ctx, nil, 0, nil, &querypb.ExecuteOptions{}) + tx, _, schemaStateChanges, err := te.Begin(ctx, 0, nil, &querypb.ExecuteOptions{}) return tx, schemaStateChanges, err }, func() (int64, string, error) { - return te.ReserveBegin(ctx, &querypb.ExecuteOptions{}, nil, nil) + return te.ReserveBegin(ctx, &querypb.ExecuteOptions{}, nil) }, } { te.AcceptReadOnly() @@ -201,7 +204,7 @@ func TestTxEngineRenewFails(t *testing.T) { te := NewTxEngine(tabletenv.NewEnv(vtenv.NewTestEnv(), cfg, "TabletServerTest"), nil) te.AcceptReadOnly() options := &querypb.ExecuteOptions{} - connID, _, err := te.ReserveBegin(ctx, options, nil, nil) + connID, _, err := te.ReserveBegin(ctx, options, nil) require.NoError(t, err) conn, err := te.txPool.GetAndLock(connID, "for test") @@ -556,7 +559,7 @@ func startTx(te *TxEngine, writeTransaction bool) error { } else { options.TransactionIsolation = querypb.ExecuteOptions_CONSISTENT_SNAPSHOT_READ_ONLY } - _, _, _, err := te.Begin(context.Background(), nil, 0, nil, options) + _, _, _, err := te.Begin(context.Background(), 0, nil, options) return err } @@ -574,7 +577,7 @@ func TestTxEngineFailReserve(t *testing.T) { _, err := te.Reserve(ctx, options, 0, nil) assert.EqualError(t, err, "tx engine can't accept new connections in state NotServing") - _, _, err = te.ReserveBegin(ctx, options, nil, nil) + _, _, err = te.ReserveBegin(ctx, options, nil) assert.EqualError(t, err, "tx engine can't accept new connections in state NotServing") te.AcceptReadOnly() @@ -583,14 +586,14 @@ func TestTxEngineFailReserve(t *testing.T) { _, err = te.Reserve(ctx, options, 0, []string{"dummy_query"}) assert.EqualError(t, err, "unknown error: failed executing dummy_query (errno 1105) (sqlstate HY000) during query: dummy_query") - _, _, err = te.ReserveBegin(ctx, options, []string{"dummy_query"}, nil) + _, _, err = te.ReserveBegin(ctx, options, []string{"dummy_query"}) assert.EqualError(t, err, "unknown error: failed executing dummy_query (errno 1105) (sqlstate HY000) during query: dummy_query") nonExistingID := int64(42) _, err = te.Reserve(ctx, options, nonExistingID, nil) assert.EqualError(t, err, "transaction 42: not found (potential transaction timeout)") - txID, _, _, err := te.Begin(ctx, nil, 0, nil, options) + txID, _, _, err := te.Begin(ctx, 0, nil, options) require.NoError(t, err) conn, err := te.txPool.GetAndLock(txID, "for test") require.NoError(t, err) @@ -603,3 +606,205 @@ func TestTxEngineFailReserve(t *testing.T) { require.Error(t, err) assert.Zero(t, connID) } + +func TestCheckReceivedError(t *testing.T) { + db := setUpQueryExecutorTest(t) + defer db.Close() + cfg := tabletenv.NewDefaultConfig() + cfg.DB = newDBConfigs(db) + env := tabletenv.NewEnv(vtenv.NewTestEnv(), cfg, "TabletServerTest") + env.Config().TwoPCEnable = true + env.Config().TwoPCAbandonAge = 5 + te := NewTxEngine(env, nil) + te.AcceptReadWrite() + + tcases := []struct { + receivedErr error + retryable bool + expQuery string + }{{ + receivedErr: vterrors.New(vtrpcpb.Code_DEADLINE_EXCEEDED, "deadline exceeded"), + retryable: true, + expQuery: `update _vt.redo_state set state = 1, message = 'deadline exceeded' where dtid = _binary'aa'`, + }, { + receivedErr: vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "invalid argument"), + retryable: false, + expQuery: `update _vt.redo_state set state = 0, message = 'invalid argument' where dtid = _binary'aa'`, + }, { + receivedErr: sqlerror.NewSQLError(sqlerror.ERLockDeadlock, sqlerror.SSLockDeadlock, "Deadlock found when trying to get lock; try restarting transaction"), + retryable: false, + expQuery: `update _vt.redo_state set state = 0, message = 'Deadlock found when trying to get lock; try restarting transaction (errno 1213) (sqlstate 40001)' where dtid = _binary'aa'`, + }, { + receivedErr: context.DeadlineExceeded, + retryable: true, + expQuery: `update _vt.redo_state set state = 1, message = 'context deadline exceeded' where dtid = _binary'aa'`, + }, { + receivedErr: context.Canceled, + retryable: true, + expQuery: `update _vt.redo_state set state = 1, message = 'context canceled' where dtid = _binary'aa'`, + }, { + receivedErr: sqlerror.NewSQLError(sqlerror.CRServerLost, sqlerror.SSUnknownSQLState, "Lost connection to MySQL server during query"), + retryable: true, + expQuery: `update _vt.redo_state set state = 1, message = 'Lost connection to MySQL server during query (errno 2013) (sqlstate HY000)' where dtid = _binary'aa'`, + }, { + receivedErr: sqlerror.NewSQLError(sqlerror.CRMalformedPacket, sqlerror.SSUnknownSQLState, "Malformed packet"), + retryable: false, + expQuery: `update _vt.redo_state set state = 0, message = 'Malformed packet (errno 2027) (sqlstate HY000)' where dtid = _binary'aa'`, + }, { + receivedErr: sqlerror.NewSQLError(sqlerror.CRServerGone, sqlerror.SSUnknownSQLState, "Server has gone away"), + retryable: true, + expQuery: `update _vt.redo_state set state = 1, message = 'Server has gone away (errno 2006) (sqlstate HY000)' where dtid = _binary'aa'`, + }, { + receivedErr: vterrors.New(vtrpcpb.Code_ABORTED, "Row count exceeded"), + retryable: false, + expQuery: `update _vt.redo_state set state = 0, message = 'Row count exceeded' where dtid = _binary'aa'`, + }, { + receivedErr: errors.New("(errno 2013) (sqlstate HY000) lost connection"), + retryable: true, + expQuery: `update _vt.redo_state set state = 1, message = '(errno 2013) (sqlstate HY000) lost connection' where dtid = _binary'aa'`, + }} + + for _, tc := range tcases { + t.Run(tc.receivedErr.Error(), func(t *testing.T) { + if tc.expQuery != "" { + db.AddQuery(tc.expQuery, &sqltypes.Result{}) + } + nonRetryable := te.checkErrorAndMarkFailed(context.Background(), "aa", tc.receivedErr, "") + require.NotEqual(t, tc.retryable, nonRetryable) + if !tc.retryable { + require.Equal(t, errPrepFailed, te.preparedPool.reserved["aa"]) + } + delete(te.preparedPool.reserved, "aa") + }) + } +} + +func TestIsTwoPCAllowed(t *testing.T) { + testcases := []struct { + semiSyncAllowed bool + tabletControllsAllowed bool + wantAllowed bool + }{ + { + semiSyncAllowed: true, + tabletControllsAllowed: true, + wantAllowed: true, + }, + { + semiSyncAllowed: false, + tabletControllsAllowed: true, + wantAllowed: false, + }, + { + semiSyncAllowed: true, + tabletControllsAllowed: false, + wantAllowed: false, + }, + { + semiSyncAllowed: false, + tabletControllsAllowed: false, + wantAllowed: false, + }, + } + + for _, tt := range testcases { + t.Run(fmt.Sprintf("SemiSyncAllowed - %v, TabletControlsAllowed - %v", tt.semiSyncAllowed, tt.tabletControllsAllowed), func(t *testing.T) { + te := &TxEngine{ + twopcAllowed: []bool{true, true}, + } + tsv := TabletServer{ + te: te, + } + tsv.SetTwoPCAllowed(TwoPCAllowed_SemiSync, tt.semiSyncAllowed) + tsv.SetTwoPCAllowed(TwoPCAllowed_TabletControls, tt.tabletControllsAllowed) + require.Equal(t, tt.wantAllowed, te.IsTwoPCAllowed()) + }) + } +} + +// TestPrepareTx tests prepareTx function in transaction engine. +func TestPrepareTx(t *testing.T) { + testcases := []struct { + name string + preparedTx *tx.PreparedTx + requireFailure bool + errWanted string + queryLogWanted string + }{ + { + name: "Success", + preparedTx: &tx.PreparedTx{ + Queries: []string{ + "insert into vitess_test (intval) values(40)", + "set @@time_zone='+10:30'", + "insert into vitess_test (intval) values(20)", + }, + }, + requireFailure: false, + errWanted: "", + queryLogWanted: "use `fakesqldb`;begin;insert into vitess_test (intval) values(40);set @@time_zone='+10:30';insert into vitess_test (intval) values(20)", + }, + { + name: "Unretryable failure during query", + preparedTx: &tx.PreparedTx{ + Queries: []string{ + "insert into vitess_test (intval) values(40)", + "failing query", + "insert into vitess_test (intval) values(20)", + }, + }, + requireFailure: true, + errWanted: "(errno 1105) (sqlstate HY000)", + }, + { + name: "Retryable failure during query", + preparedTx: &tx.PreparedTx{ + Queries: []string{ + "insert into vitess_test (intval) values(40)", + "retryable query", + "insert into vitess_test (intval) values(20)", + }, + }, + requireFailure: false, + errWanted: "Retryable error (errno 2002) (sqlstate HY000)", + }, + { + name: "Success - Settings query in the beginning", + preparedTx: &tx.PreparedTx{ + Queries: []string{ + "set @@time_zone='+10:30'", + "insert into vitess_test (intval) values(40)", + "insert into vitess_test (intval) values(20)", + }, + }, + requireFailure: false, + errWanted: "", + queryLogWanted: "use `fakesqldb`;set @@time_zone='+10:30';begin;insert into vitess_test (intval) values(40);insert into vitess_test (intval) values(20)", + }, + } + for _, tt := range testcases { + t.Run(tt.name, func(t *testing.T) { + db := setUpQueryExecutorTest(t) + defer db.Close() + db.AddQueryPattern(".*", &sqltypes.Result{}) + db.AddRejectedQuery("failing query", assert.AnError) + db.AddRejectedQuery("retryable query", sqlerror.NewSQLError(sqlerror.CRConnectionError, "", "Retryable error")) + cfg := tabletenv.NewDefaultConfig() + cfg.DB = newDBConfigs(db) + cfg.TwoPCEnable = true + cfg.TwoPCAbandonAge = 200 + te := NewTxEngine(tabletenv.NewEnv(vtenv.NewTestEnv(), cfg, "TabletServerTest"), nil) + te.AcceptReadWrite() + db.ResetQueryLog() + failed, err := te.prepareTx(context.Background(), tt.preparedTx) + require.EqualValues(t, tt.requireFailure, failed) + if tt.errWanted != "" { + require.ErrorContains(t, err, tt.errWanted) + return + } + require.NoError(t, err) + require.EqualValues(t, 1, len(te.preparedPool.conns)) + require.EqualValues(t, tt.queryLogWanted, db.QueryLog()) + }) + } +} diff --git a/go/vt/vttablet/tabletserver/tx_pool.go b/go/vt/vttablet/tabletserver/tx_pool.go index 52f356e0cca..ca8a0ea34b2 100644 --- a/go/vt/vttablet/tabletserver/tx_pool.go +++ b/go/vt/vttablet/tabletserver/tx_pool.go @@ -230,7 +230,7 @@ func (tp *TxPool) Rollback(ctx context.Context, txConn *StatefulConnection) erro // the statements (if any) executed to initiate the transaction. In autocommit // mode the statement will be "". // The connection returned is locked for the callee and its responsibility is to unlock the connection. -func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, reservedID int64, savepointQueries []string, setting *smartconnpool.Setting) (*StatefulConnection, string, string, error) { +func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, reservedID int64, setting *smartconnpool.Setting) (*StatefulConnection, string, string, error) { span, ctx := trace.NewSpan(ctx, "TxPool.Begin") defer span.Finish() @@ -262,25 +262,28 @@ func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, re if err != nil { return nil, "", "", err } - sql, sessionStateChanges, err := tp.begin(ctx, options, readOnly, conn, savepointQueries) + sql, sessionStateChanges, err := tp.begin(ctx, options, readOnly, conn) if err != nil { conn.Close() conn.Release(tx.ConnInitFail) return nil, "", "", err } + // If we have applied any settings on the connection, then we need to record the query + // in case we need to redo the transaction because of a failure. + if setting != nil { + conn.TxProperties().RecordQueryDetail(setting.ApplyQuery(), nil) + } return conn, sql, sessionStateChanges, nil } -func (tp *TxPool) begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, conn *StatefulConnection, savepointQueries []string) (string, string, error) { +func (tp *TxPool) begin(ctx context.Context, options *querypb.ExecuteOptions, readOnly bool, conn *StatefulConnection) (string, string, error) { immediateCaller := callerid.ImmediateCallerIDFromContext(ctx) effectiveCaller := callerid.EffectiveCallerIDFromContext(ctx) - beginQueries, autocommit, sessionStateChanges, err := createTransaction(ctx, options, conn, readOnly, savepointQueries) + beginQueries, autocommit, sessionStateChanges, err := createTransaction(ctx, options, conn, readOnly) if err != nil { return "", "", err } - conn.txProps = tp.NewTxProps(immediateCaller, effectiveCaller, autocommit) - return beginQueries, sessionStateChanges, nil } @@ -306,7 +309,6 @@ func createTransaction( options *querypb.ExecuteOptions, conn *StatefulConnection, readOnly bool, - savepointQueries []string, ) (beginQueries string, autocommitTransaction bool, sessionStateChanges string, err error) { switch options.GetTransactionIsolation() { case querypb.ExecuteOptions_CONSISTENT_SNAPSHOT_READ_ONLY: @@ -344,12 +346,6 @@ func createTransaction( default: return "", false, "", vterrors.Errorf(vtrpcpb.Code_INTERNAL, "[BUG] don't know how to open a transaction of this type: %v", options.GetTransactionIsolation()) } - - for _, savepoint := range savepointQueries { - if _, err = conn.Exec(ctx, savepoint, 1, false); err != nil { - return "", false, "", err - } - } return } diff --git a/go/vt/vttablet/tabletserver/tx_pool_test.go b/go/vt/vttablet/tabletserver/tx_pool_test.go index aa2d5b69e89..c03cac92878 100644 --- a/go/vt/vttablet/tabletserver/tx_pool_test.go +++ b/go/vt/vttablet/tabletserver/tx_pool_test.go @@ -48,7 +48,7 @@ func TestTxPoolExecuteCommit(t *testing.T) { sql := "select 'this is a query'" // begin a transaction and then return the connection - conn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) id := conn.ReservedID() @@ -83,7 +83,7 @@ func TestTxPoolExecuteRollback(t *testing.T) { db, txPool, _, closer := setup(t) defer closer() - conn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) defer conn.Release(tx.TxRollback) @@ -104,7 +104,7 @@ func TestTxPoolExecuteRollbackOnClosedConn(t *testing.T) { db, txPool, _, closer := setup(t) defer closer() - conn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) defer conn.Release(tx.TxRollback) @@ -125,9 +125,9 @@ func TestTxPoolRollbackNonBusy(t *testing.T) { defer closer() // start two transactions, and mark one of them as unused - conn1, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn1, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) - conn2, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn2, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) conn2.Unlock() // this marks conn2 as NonBusy @@ -154,7 +154,7 @@ func TestTxPoolTransactionIsolation(t *testing.T) { db, txPool, _, closer := setup(t) defer closer() - c2, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{TransactionIsolation: querypb.ExecuteOptions_READ_COMMITTED}, false, 0, nil, nil) + c2, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{TransactionIsolation: querypb.ExecuteOptions_READ_COMMITTED}, false, 0, nil) require.NoError(t, err) c2.Release(tx.TxClose) @@ -172,7 +172,7 @@ func TestTxPoolAutocommit(t *testing.T) { // to mysql. // This test is meaningful because if txPool.Begin were to send a BEGIN statement to the connection, it will fatal // because is not in the list of expected queries (i.e db.AddQuery hasn't been called). - conn1, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{TransactionIsolation: querypb.ExecuteOptions_AUTOCOMMIT}, false, 0, nil, nil) + conn1, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{TransactionIsolation: querypb.ExecuteOptions_AUTOCOMMIT}, false, 0, nil) require.NoError(t, err) // run a query to see it in the query log @@ -204,7 +204,7 @@ func TestTxPoolBeginWithPoolConnectionError_Errno2006_Transient(t *testing.T) { err := db.WaitForClose(2 * time.Second) require.NoError(t, err) - txConn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + txConn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err, "Begin should have succeeded after the retry in DBConn.Exec()") txConn.Release(tx.TxCommit) } @@ -225,7 +225,7 @@ func primeTxPoolWithConnection(t *testing.T, ctx context.Context) (*fakesqldb.DB // reused by subsequent transactions. db.AddQuery("begin", &sqltypes.Result{}) db.AddQuery("rollback", &sqltypes.Result{}) - txConn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + txConn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) txConn.Release(tx.TxCommit) @@ -248,7 +248,7 @@ func TestTxPoolBeginWithError(t *testing.T) { } ctxWithCallerID := callerid.NewContext(ctx, ef, im) - _, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, 0, nil, nil) + _, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, 0, nil) require.Error(t, err) require.Contains(t, err.Error(), "error: rejected") require.Equal(t, vtrpcpb.Code_UNKNOWN, vterrors.Code(err), "wrong error code for Begin error") @@ -270,19 +270,6 @@ func TestTxPoolBeginWithError(t *testing.T) { }, limiter.Actions()) } -func TestTxPoolBeginWithPreQueryError(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - db, txPool, _, closer := setup(t) - defer closer() - db.AddRejectedQuery("pre_query", errRejected) - _, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, []string{"pre_query"}, nil) - require.Error(t, err) - require.Contains(t, err.Error(), "error: rejected") - require.Equal(t, vtrpcpb.Code_UNKNOWN, vterrors.Code(err), "wrong error code for Begin error") -} - func TestTxPoolCancelledContextError(t *testing.T) { // given db, txPool, _, closer := setup(t) @@ -291,7 +278,7 @@ func TestTxPoolCancelledContextError(t *testing.T) { cancel() // when - _, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + _, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) // then require.Error(t, err) @@ -312,12 +299,12 @@ func TestTxPoolWaitTimeoutError(t *testing.T) { defer closer() // lock the only connection in the pool. - conn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) defer conn.Unlock() // try locking one more connection. - _, _, _, err = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + _, _, _, err = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) // then require.Error(t, err) @@ -337,7 +324,7 @@ func TestTxPoolRollbackFailIsPassedThrough(t *testing.T) { defer closer() db.AddRejectedQuery("rollback", errRejected) - conn1, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn1, _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) _, err = conn1.Exec(ctx, sql, 1, true) @@ -357,7 +344,7 @@ func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { db, txPool, _, _ := setup(t) defer db.Close() - conn1, _, _, _ := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn1, _, _, _ := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) id := conn1.ReservedID() conn1.Unlock() txPool.Close() @@ -365,7 +352,7 @@ func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { assertErrorMatch := func(id int64, reason string) { conn, err := txPool.GetAndLock(id, "for query") if err == nil { // - conn.Releasef("fail") + conn.ReleaseString("fail") t.Errorf("expected to get an error") return } @@ -380,12 +367,12 @@ func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { params := dbconfigs.New(db.ConnParams()) txPool.Open(params, params, params) - conn1, _, _, _ = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn1, _, _, _ = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) id = conn1.ReservedID() _, err := txPool.Commit(ctx, conn1) require.NoError(t, err) - conn1.Releasef("transaction committed") + conn1.ReleaseString("transaction committed") assertErrorMatch(id, "transaction committed") @@ -396,7 +383,7 @@ func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { txPool.Open(params, params, params) defer txPool.Close() - conn1, _, _, err = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn1, _, _, err = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err, "unable to start transaction: %v", err) conn1.Unlock() id = conn1.ReservedID() @@ -412,7 +399,7 @@ func TestTxPoolCloseKillsStrayTransactions(t *testing.T) { startingStray := txPool.env.Stats().InternalErrors.Counts()["StrayTransactions"] // Start stray transaction. - conn, _, _, err := txPool.Begin(context.Background(), &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn, _, _, err := txPool.Begin(context.Background(), &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) conn.Unlock() @@ -443,7 +430,7 @@ func TestTxTimeoutKillsTransactions(t *testing.T) { ctxWithCallerID := callerid.NewContext(ctx, ef, im) // Start transaction. - conn, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) conn.Unlock() @@ -491,7 +478,7 @@ func TestTxTimeoutDoesNotKillShortLivedTransactions(t *testing.T) { ctxWithCallerID := callerid.NewContext(ctx, ef, im) // Start transaction. - conn, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) conn.Unlock() @@ -526,7 +513,7 @@ func TestTxTimeoutKillsOlapTransactions(t *testing.T) { // Start transaction. conn, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{ Workload: querypb.ExecuteOptions_OLAP, - }, false, 0, nil, nil) + }, false, 0, nil) require.NoError(t, err) conn.Unlock() @@ -561,11 +548,11 @@ func TestTxTimeoutNotEnforcedForZeroLengthTimeouts(t *testing.T) { ctxWithCallerID := callerid.NewContext(ctx, ef, im) // Start transactions. - conn0, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, 0, nil, nil) + conn0, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, 0, nil) require.NoError(t, err) conn1, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{ Workload: querypb.ExecuteOptions_OLAP, - }, false, 0, nil, nil) + }, false, 0, nil) require.NoError(t, err) conn0.Unlock() conn1.Unlock() @@ -606,7 +593,7 @@ func TestTxTimeoutReservedConn(t *testing.T) { // Start OLAP transaction and return it to pool right away. conn0, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{ Workload: querypb.ExecuteOptions_OLAP, - }, false, 0, nil, nil) + }, false, 0, nil) require.NoError(t, err) // Taint the connection. conn0.Taint(ctxWithCallerID, nil) @@ -648,14 +635,14 @@ func TestTxTimeoutReusedReservedConn(t *testing.T) { // Start OLAP transaction and return it to pool right away. conn0, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{ Workload: querypb.ExecuteOptions_OLAP, - }, false, 0, nil, nil) + }, false, 0, nil) require.NoError(t, err) // Taint the connection. conn0.Taint(ctxWithCallerID, nil) conn0.Unlock() // Reuse underlying connection in an OLTP transaction. - conn1, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, conn0.ReservedID(), nil, nil) + conn1, _, _, err := txPool.Begin(ctxWithCallerID, &querypb.ExecuteOptions{}, false, conn0.ReservedID(), nil) require.NoError(t, err) require.Equal(t, conn1.ReservedID(), conn0.ReservedID()) conn1.Unlock() @@ -786,7 +773,7 @@ func TestTxPoolBeginStatements(t *testing.T) { TransactionIsolation: tc.txIsolationLevel, TransactionAccessMode: tc.txAccessModes, } - conn, beginSQL, _, err := txPool.Begin(ctx, options, tc.readOnly, 0, nil, nil) + conn, beginSQL, _, err := txPool.Begin(ctx, options, tc.readOnly, 0, nil) if tc.expErr != "" { require.Error(t, err) require.Contains(t, err.Error(), tc.expErr) diff --git a/go/vt/vttablet/tabletserver/tx_prep_pool.go b/go/vt/vttablet/tabletserver/tx_prep_pool.go index 89547570cfc..8e766062a92 100644 --- a/go/vt/vttablet/tabletserver/tx_prep_pool.go +++ b/go/vt/vttablet/tabletserver/tx_prep_pool.go @@ -17,14 +17,16 @@ limitations under the License. package tabletserver import ( - "errors" "fmt" "sync" + + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" ) var ( - errPrepCommitting = errors.New("committing") - errPrepFailed = errors.New("failed") + errPrepCommitting = vterrors.VT09025("locked for committing") + errPrepFailed = vterrors.VT09025("failed to commit") ) // TxPreparedPool manages connections for prepared transactions. @@ -34,35 +36,65 @@ type TxPreparedPool struct { mu sync.Mutex conns map[string]*StatefulConnection reserved map[string]error + // open tells if the prepared pool is open for accepting transactions. + open bool capacity int + // twoPCEnabled is set to true if 2PC is enabled. + twoPCEnabled bool } // NewTxPreparedPool creates a new TxPreparedPool. -func NewTxPreparedPool(capacity int) *TxPreparedPool { +func NewTxPreparedPool(capacity int, twoPCEnabled bool) *TxPreparedPool { if capacity < 0 { // If capacity is 0 all prepares will fail. capacity = 0 } return &TxPreparedPool{ - conns: make(map[string]*StatefulConnection, capacity), - reserved: make(map[string]error), - capacity: capacity, + conns: make(map[string]*StatefulConnection, capacity), + reserved: make(map[string]error), + capacity: capacity, + twoPCEnabled: twoPCEnabled, } } +// Open marks the prepared pool open for use. +func (pp *TxPreparedPool) Open() { + pp.mu.Lock() + defer pp.mu.Unlock() + pp.open = true +} + +// Close marks the prepared pool closed. +func (pp *TxPreparedPool) Close() { + pp.mu.Lock() + defer pp.mu.Unlock() + pp.open = false +} + +// IsOpen checks if the prepared pool is open for use. +func (pp *TxPreparedPool) IsOpen() bool { + pp.mu.Lock() + defer pp.mu.Unlock() + return pp.open +} + // Put adds the connection to the pool. It returns an error // if the pool is full or on duplicate key. func (pp *TxPreparedPool) Put(c *StatefulConnection, dtid string) error { pp.mu.Lock() defer pp.mu.Unlock() + // If the pool is shutdown, we don't accept new prepared transactions. + if !pp.open { + return vterrors.VT09025("pool is shutdown") + } if _, ok := pp.reserved[dtid]; ok { - return errors.New("duplicate DTID in Prepare: " + dtid) + return vterrors.VT09025("duplicate DTID in Prepare: " + dtid) } if _, ok := pp.conns[dtid]; ok { - return errors.New("duplicate DTID in Prepare: " + dtid) + return vterrors.VT09025("duplicate DTID in Prepare: " + dtid) } if len(pp.conns) >= pp.capacity { - return fmt.Errorf("prepared transactions exceeded limit: %d", pp.capacity) + return vterrors.New(vtrpcpb.Code_RESOURCE_EXHAUSTED, fmt.Sprintf("prepared transactions exceeded limit: %d", pp.capacity)) } pp.conns[dtid] = c return nil @@ -95,6 +127,11 @@ func (pp *TxPreparedPool) FetchForRollback(dtid string) *StatefulConnection { func (pp *TxPreparedPool) FetchForCommit(dtid string) (*StatefulConnection, error) { pp.mu.Lock() defer pp.mu.Unlock() + // If the pool is shutdown, we don't have any connections to return. + // That however doesn't mean this transaction was committed, it could very well have been rollbacked. + if !pp.open { + return nil, vterrors.VT09025("pool is shutdown") + } if err, ok := pp.reserved[dtid]; ok { return nil, err } @@ -121,11 +158,12 @@ func (pp *TxPreparedPool) Forget(dtid string) { delete(pp.reserved, dtid) } -// FetchAll removes all connections and returns them as a list. +// FetchAllForRollback removes all connections and returns them as a list. // It also forgets all reserved dtids. -func (pp *TxPreparedPool) FetchAll() []*StatefulConnection { +func (pp *TxPreparedPool) FetchAllForRollback() []*StatefulConnection { pp.mu.Lock() defer pp.mu.Unlock() + pp.open = false conns := make([]*StatefulConnection, 0, len(pp.conns)) for _, c := range pp.conns { conns = append(conns, c) @@ -134,3 +172,40 @@ func (pp *TxPreparedPool) FetchAll() []*StatefulConnection { pp.reserved = make(map[string]error) return conns } + +// IsEmptyForTable returns true if no prepared transactions are found for the table. +func (pp *TxPreparedPool) IsEmptyForTable(tableName string) bool { + pp.mu.Lock() + defer pp.mu.Unlock() + if !pp.twoPCEnabled { + return true + } + // If the pool is shutdown, we do not know the correct state of prepared transactions. + if !pp.open { + return false + } + for _, connection := range pp.conns { + for _, query := range connection.txProps.Queries { + for _, table := range query.Tables { + if table == tableName { + return false + } + } + } + } + return true +} + +// IsEmpty returns true if the pool is empty. +func (pp *TxPreparedPool) IsEmpty() bool { + pp.mu.Lock() + defer pp.mu.Unlock() + if !pp.twoPCEnabled { + return true + } + // If the pool is shutdown, we do not know the correct state of prepared transactions. + if !pp.open { + return false + } + return len(pp.conns) == 0 +} diff --git a/go/vt/vttablet/tabletserver/tx_prep_pool_test.go b/go/vt/vttablet/tabletserver/tx_prep_pool_test.go index a1cf50edb56..e8c889990f0 100644 --- a/go/vt/vttablet/tabletserver/tx_prep_pool_test.go +++ b/go/vt/vttablet/tabletserver/tx_prep_pool_test.go @@ -19,48 +19,40 @@ package tabletserver import ( "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/vttablet/tabletserver/tx" ) func TestEmptyPrep(t *testing.T) { - pp := NewTxPreparedPool(0) - want := "prepared transactions exceeded limit: 0" + pp := createAndOpenPreparedPool(0) err := pp.Put(nil, "aa") - if err == nil || err.Error() != want { - t.Errorf("Put err: %v, want %s", err, want) - } + require.ErrorContains(t, err, "prepared transactions exceeded limit: 0") } func TestPrepPut(t *testing.T) { - pp := NewTxPreparedPool(2) + pp := createAndOpenPreparedPool(2) err := pp.Put(nil, "aa") require.NoError(t, err) err = pp.Put(nil, "bb") require.NoError(t, err) - want := "prepared transactions exceeded limit: 2" err = pp.Put(nil, "cc") - if err == nil || err.Error() != want { - t.Errorf("Put err: %v, want %s", err, want) - } + require.ErrorContains(t, err, "prepared transactions exceeded limit: 2") err = pp.Put(nil, "aa") - want = "duplicate DTID in Prepare: aa" - if err == nil || err.Error() != want { - t.Errorf("Put err: %v, want %s", err, want) - } + require.ErrorContains(t, err, "duplicate DTID in Prepare: aa") + _, err = pp.FetchForCommit("aa") require.NoError(t, err) err = pp.Put(nil, "aa") - want = "duplicate DTID in Prepare: aa" - if err == nil || err.Error() != want { - t.Errorf("Put err: %v, want %s", err, want) - } + require.ErrorContains(t, err, "duplicate DTID in Prepare: aa") pp.Forget("aa") err = pp.Put(nil, "aa") require.NoError(t, err) } func TestPrepFetchForRollback(t *testing.T) { - pp := NewTxPreparedPool(2) + pp := createAndOpenPreparedPool(2) conn := &StatefulConnection{} pp.Put(conn, "aa") got := pp.FetchForRollback("bb") @@ -78,55 +70,183 @@ func TestPrepFetchForRollback(t *testing.T) { } func TestPrepFetchForCommit(t *testing.T) { - pp := NewTxPreparedPool(2) + pp := createAndOpenPreparedPool(2) conn := &StatefulConnection{} got, err := pp.FetchForCommit("aa") require.NoError(t, err) - if got != nil { - t.Errorf("Get(aa): %v, want nil", got) - } + assert.Nil(t, got) + pp.Put(conn, "aa") got, err = pp.FetchForCommit("aa") require.NoError(t, err) - if got != conn { - t.Errorf("pp.Get(aa): %p, want %p", got, conn) - } + assert.Equal(t, conn, got) + _, err = pp.FetchForCommit("aa") - want := "committing" - if err == nil || err.Error() != want { - t.Errorf("FetchForCommit err: %v, want %s", err, want) - } + assert.ErrorContains(t, err, "locked for committing") + pp.SetFailed("aa") _, err = pp.FetchForCommit("aa") - want = "failed" - if err == nil || err.Error() != want { - t.Errorf("FetchForCommit err: %v, want %s", err, want) - } + assert.ErrorContains(t, err, "failed to commit") + pp.SetFailed("bb") _, err = pp.FetchForCommit("bb") - want = "failed" - if err == nil || err.Error() != want { - t.Errorf("FetchForCommit err: %v, want %s", err, want) - } + assert.ErrorContains(t, err, "failed to commit") + pp.Forget("aa") got, err = pp.FetchForCommit("aa") require.NoError(t, err) - if got != nil { - t.Errorf("Get(aa): %v, want nil", got) - } + assert.Nil(t, got) } func TestPrepFetchAll(t *testing.T) { - pp := NewTxPreparedPool(2) + pp := createAndOpenPreparedPool(2) conn1 := &StatefulConnection{} conn2 := &StatefulConnection{} pp.Put(conn1, "aa") pp.Put(conn2, "bb") - got := pp.FetchAll() - if len(got) != 2 { - t.Errorf("FetchAll len: %d, want 2", len(got)) + got := pp.FetchAllForRollback() + require.Len(t, got, 2) + require.Len(t, pp.conns, 0) + _, err := pp.FetchForCommit("aa") + require.ErrorContains(t, err, "pool is shutdown") +} + +// createAndOpenPreparedPool creates a new transaction prepared pool and opens it. +// Used as a helper function for testing. +func createAndOpenPreparedPool(capacity int) *TxPreparedPool { + pp := NewTxPreparedPool(capacity, true) + pp.Open() + return pp +} + +func TestTxPreparedPoolIsEmptyForTable(t *testing.T) { + tests := []struct { + name string + setupFunc func(pp *TxPreparedPool) + wantIsEmpty bool + }{ + { + name: "Closed prepared pool", + setupFunc: func(pp *TxPreparedPool) { + pp.mu.Lock() + defer pp.mu.Unlock() + pp.open = false + }, + wantIsEmpty: false, + }, + { + name: "Two PC Disabled", + setupFunc: func(pp *TxPreparedPool) { + pp.mu.Lock() + defer pp.mu.Unlock() + pp.twoPCEnabled = false + }, + wantIsEmpty: true, + }, + { + name: "No prepared transactions", + setupFunc: func(pp *TxPreparedPool) { + pp.mu.Lock() + defer pp.mu.Unlock() + pp.open = true + }, + wantIsEmpty: true, + }, + { + name: "Prepared transactions for table t1", + setupFunc: func(pp *TxPreparedPool) { + pp.mu.Lock() + pp.open = true + pp.mu.Unlock() + pp.Put(&StatefulConnection{ + txProps: &tx.Properties{ + Queries: []tx.Query{ + { + Tables: []string{"t1", "t2"}, + }, + }, + }, + }, "dtid1") + }, + wantIsEmpty: false, + }, + { + name: "Prepared transactions for other tables", + setupFunc: func(pp *TxPreparedPool) { + pp.mu.Lock() + pp.open = true + pp.mu.Unlock() + pp.Put(&StatefulConnection{ + txProps: &tx.Properties{ + Queries: []tx.Query{ + { + Tables: []string{"t3", "t2"}, + }, + }, + }, + }, "dtid1") + }, + wantIsEmpty: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + pp := NewTxPreparedPool(1, true) + tt.setupFunc(pp) + assert.Equalf(t, tt.wantIsEmpty, pp.IsEmptyForTable("t1"), "IsEmptyForTable()") + }) + } +} + +func TestTxPreparedPoolIsEmpty(t *testing.T) { + tests := []struct { + name string + setupFunc func(pp *TxPreparedPool) + wantIsEmpty bool + }{ + { + name: "Closed prepared pool", + setupFunc: func(pp *TxPreparedPool) { + pp.mu.Lock() + defer pp.mu.Unlock() + pp.open = false + }, + wantIsEmpty: false, + }, + { + name: "Two PC Disabled", + setupFunc: func(pp *TxPreparedPool) { + pp.mu.Lock() + defer pp.mu.Unlock() + pp.twoPCEnabled = false + }, + wantIsEmpty: true, + }, + { + name: "No prepared transactions", + setupFunc: func(pp *TxPreparedPool) { + pp.mu.Lock() + defer pp.mu.Unlock() + pp.open = true + }, + wantIsEmpty: true, + }, + { + name: "Prepared transactions exist", + setupFunc: func(pp *TxPreparedPool) { + pp.mu.Lock() + pp.open = true + pp.mu.Unlock() + pp.Put(&StatefulConnection{}, "dtid1") + }, + wantIsEmpty: false, + }, } - if len(pp.conns) != 0 { - t.Errorf("len(pp.conns): %d, want 0", len(pp.conns)) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + pp := NewTxPreparedPool(1, true) + tt.setupFunc(pp) + assert.Equalf(t, tt.wantIsEmpty, pp.IsEmpty(), "IsEmpty()") + }) } } diff --git a/go/vt/vttablet/tabletserver/txlogz_test.go b/go/vt/vttablet/tabletserver/txlogz_test.go index 319669a0023..8faec74d07b 100644 --- a/go/vt/vttablet/tabletserver/txlogz_test.go +++ b/go/vt/vttablet/tabletserver/txlogz_test.go @@ -60,7 +60,7 @@ func testHandler(req *http.Request, t *testing.T) { ImmediateCaller: callerid.NewImmediateCallerID("immediate-caller"), StartTime: time.Now(), Conclusion: "unknown", - Queries: []string{"select * from test"}, + Queries: []tx.Query{{Sql: "select * from test"}}, }, } txConn.txProps.EndTime = txConn.txProps.StartTime diff --git a/go/vt/vttablet/tabletserver/txthrottler/tx_throttler.go b/go/vt/vttablet/tabletserver/txthrottler/tx_throttler.go index 18fafa8eb96..cf0a88ad310 100644 --- a/go/vt/vttablet/tabletserver/txthrottler/tx_throttler.go +++ b/go/vt/vttablet/tabletserver/txthrottler/tx_throttler.go @@ -40,7 +40,7 @@ import ( // These vars store the functions used to create the topo server, healthcheck, // and go/vt/throttler. These are provided here so that they can be overridden // in tests to generate mocks. -type healthCheckFactoryFunc func(topoServer *topo.Server, cell string, cellsToWatch []string) discovery.HealthCheck +type healthCheckFactoryFunc func(ctx context.Context, topoServer *topo.Server, cell, keyspace, shard string, cellsToWatch []string) (discovery.HealthCheck, error) type throttlerFactoryFunc func(name, unit string, threadCount int, maxRate int64, maxReplicationLagConfig throttler.MaxReplicationLagModuleConfig) (throttler.Throttler, error) var ( @@ -49,8 +49,13 @@ var ( ) func resetTxThrottlerFactories() { - healthCheckFactory = func(topoServer *topo.Server, cell string, cellsToWatch []string) discovery.HealthCheck { - return discovery.NewHealthCheck(context.Background(), discovery.DefaultHealthCheckRetryDelay, discovery.DefaultHealthCheckTimeout, topoServer, cell, strings.Join(cellsToWatch, ",")) + healthCheckFactory = func(ctx context.Context, topoServer *topo.Server, cell, keyspace, shard string, cellsToWatch []string) (discovery.HealthCheck, error) { + // discovery.NewFilterByShard expects a single-shard filter to be in "keyspace|shard" format. + filter, err := discovery.NewFilterByShard([]string{keyspace + "|" + shard}) + if err != nil { + return nil, err + } + return discovery.NewHealthCheck(ctx, discovery.DefaultHealthCheckRetryDelay, discovery.DefaultHealthCheckTimeout, topoServer, cell, strings.Join(cellsToWatch, ","), filter), nil } throttlerFactory = func(name, unit string, threadCount int, maxRate int64, maxReplicationLagConfig throttler.MaxReplicationLagModuleConfig) (throttler.Throttler, error) { return throttler.NewThrottlerFromConfig(name, unit, threadCount, maxRate, maxReplicationLagConfig, time.Now) @@ -142,9 +147,11 @@ type txThrottlerStateImpl struct { // throttleMu serializes calls to throttler.Throttler.Throttle(threadId). // That method is required to be called in serial for each threadId. - throttleMu sync.Mutex - throttler throttler.Throttler - stopHealthCheck context.CancelFunc + throttleMu sync.Mutex + throttler throttler.Throttler + + ctx context.Context + cancel context.CancelFunc healthCheck discovery.HealthCheck healthCheckChan chan *discovery.TabletHealth @@ -268,7 +275,10 @@ func newTxThrottlerState(txThrottler *txThrottler, config *tabletenv.TabletConfi tabletTypes[tabletType] = true } + ctx, cancel := context.WithCancel(context.Background()) state := &txThrottlerStateImpl{ + ctx: ctx, + cancel: cancel, config: config, healthCheckCells: config.TxThrottlerHealthCheckCells, tabletTypes: tabletTypes, @@ -279,38 +289,42 @@ func newTxThrottlerState(txThrottler *txThrottler, config *tabletenv.TabletConfi // get cells from topo if none defined in tabletenv config if len(state.healthCheckCells) == 0 { - ctx, cancel := context.WithTimeout(context.Background(), topo.RemoteOperationTimeout) - defer cancel() - state.healthCheckCells = fetchKnownCells(ctx, txThrottler.topoServer, target) + cellsCtx, cellsCancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) + defer cellsCancel() + state.healthCheckCells = fetchKnownCells(cellsCtx, txThrottler.topoServer, target) state.cellsFromTopo = true } - ctx, cancel := context.WithCancel(context.Background()) - state.stopHealthCheck = cancel - state.initHealthCheckStream(txThrottler.topoServer, target) + if err := state.initHealthCheckStream(txThrottler.topoServer, target); err != nil { + return nil, err + } state.healthCheck.RegisterStats() - go state.healthChecksProcessor(ctx, txThrottler.topoServer, target) + go state.healthChecksProcessor(txThrottler.topoServer, target) state.waitForTermination.Add(1) go state.updateMaxLag() return state, nil } -func (ts *txThrottlerStateImpl) initHealthCheckStream(topoServer *topo.Server, target *querypb.Target) { - ts.healthCheck = healthCheckFactory(topoServer, target.Cell, ts.healthCheckCells) +func (ts *txThrottlerStateImpl) initHealthCheckStream(topoServer *topo.Server, target *querypb.Target) (err error) { + ts.healthCheck, err = healthCheckFactory(ts.ctx, topoServer, target.Cell, target.Keyspace, target.Shard, ts.healthCheckCells) + if err != nil { + return err + } ts.healthCheckChan = ts.healthCheck.Subscribe() + return nil } func (ts *txThrottlerStateImpl) closeHealthCheckStream() { if ts.healthCheck == nil { return } - ts.stopHealthCheck() + ts.cancel() ts.healthCheck.Close() } -func (ts *txThrottlerStateImpl) updateHealthCheckCells(ctx context.Context, topoServer *topo.Server, target *querypb.Target) { - fetchCtx, cancel := context.WithTimeout(ctx, topo.RemoteOperationTimeout) +func (ts *txThrottlerStateImpl) updateHealthCheckCells(topoServer *topo.Server, target *querypb.Target) error { + fetchCtx, cancel := context.WithTimeout(ts.ctx, topo.RemoteOperationTimeout) defer cancel() knownCells := fetchKnownCells(fetchCtx, topoServer, target) @@ -318,11 +332,12 @@ func (ts *txThrottlerStateImpl) updateHealthCheckCells(ctx context.Context, topo log.Info("txThrottler: restarting healthcheck stream due to topology cells update") ts.healthCheckCells = knownCells ts.closeHealthCheckStream() - ts.initHealthCheckStream(topoServer, target) + return ts.initHealthCheckStream(topoServer, target) } + return nil } -func (ts *txThrottlerStateImpl) healthChecksProcessor(ctx context.Context, topoServer *topo.Server, target *querypb.Target) { +func (ts *txThrottlerStateImpl) healthChecksProcessor(topoServer *topo.Server, target *querypb.Target) { var cellsUpdateTicks <-chan time.Time if ts.cellsFromTopo { ticker := time.NewTicker(ts.config.TxThrottlerTopoRefreshInterval) @@ -331,10 +346,12 @@ func (ts *txThrottlerStateImpl) healthChecksProcessor(ctx context.Context, topoS } for { select { - case <-ctx.Done(): + case <-ts.ctx.Done(): return case <-cellsUpdateTicks: - ts.updateHealthCheckCells(ctx, topoServer, target) + if err := ts.updateHealthCheckCells(topoServer, target); err != nil { + log.Errorf("txThrottler: failed to update cell list: %+v", err) + } case th := <-ts.healthCheckChan: ts.StatsUpdate(th) } diff --git a/go/vt/vttablet/tabletserver/txthrottler/tx_throttler_test.go b/go/vt/vttablet/tabletserver/txthrottler/tx_throttler_test.go index 25c855b898b..1d3c9f57e72 100644 --- a/go/vt/vttablet/tabletserver/txthrottler/tx_throttler_test.go +++ b/go/vt/vttablet/tabletserver/txthrottler/tx_throttler_test.go @@ -74,8 +74,8 @@ func TestEnabledThrottler(t *testing.T) { hcCall2.After(hcCall1) hcCall3 := mockHealthCheck.EXPECT().Close() hcCall3.After(hcCall2) - healthCheckFactory = func(topoServer *topo.Server, cell string, cellsToWatch []string) discovery.HealthCheck { - return mockHealthCheck + healthCheckFactory = func(ctx context.Context, topoServer *topo.Server, cell, keyspace, shard string, cellsToWatch []string) (discovery.HealthCheck, error) { + return mockHealthCheck, nil } mockThrottler := NewMockThrottler(mockCtrl) diff --git a/go/vt/vttablet/tabletserver/vstreamer/copy.go b/go/vt/vttablet/tabletserver/vstreamer/copy.go index 2f54ea235fe..1e1d432956d 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/copy.go +++ b/go/vt/vttablet/tabletserver/vstreamer/copy.go @@ -74,7 +74,7 @@ func (uvs *uvstreamer) catchup(ctx context.Context) error { errch := make(chan error, 1) go func() { startPos := replication.EncodePosition(uvs.pos) - vs := newVStreamer(ctx, uvs.cp, uvs.se, startPos, "", uvs.filter, uvs.getVSchema(), uvs.throttlerApp, uvs.send2, "catchup", uvs.vse) + vs := newVStreamer(ctx, uvs.cp, uvs.se, startPos, "", uvs.filter, uvs.getVSchema(), uvs.throttlerApp, uvs.send2, "catchup", uvs.vse, nil) uvs.setVs(vs) errch <- vs.Stream() uvs.setVs(nil) @@ -306,7 +306,7 @@ func (uvs *uvstreamer) copyTable(ctx context.Context, tableName string) error { uvs.setCopyState(tableName, qrLastPK) log.V(2).Infof("NewLastPK: %v", qrLastPK) return nil - }) + }, nil) if err != nil { uvs.vse.errorCounts.Add("StreamRows", 1) return err @@ -333,7 +333,7 @@ func (uvs *uvstreamer) fastForward(stopPos string) error { }() log.Infof("starting fastForward from %s upto pos %s", replication.EncodePosition(uvs.pos), stopPos) uvs.stopPos, _ = replication.DecodePosition(stopPos) - vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, replication.EncodePosition(uvs.pos), "", uvs.filter, uvs.getVSchema(), uvs.throttlerApp, uvs.send2, "fastforward", uvs.vse) + vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, replication.EncodePosition(uvs.pos), "", uvs.filter, uvs.getVSchema(), uvs.throttlerApp, uvs.send2, "fastforward", uvs.vse, nil) uvs.setVs(vs) return vs.Stream() } diff --git a/go/vt/vttablet/tabletserver/vstreamer/engine.go b/go/vt/vttablet/tabletserver/vstreamer/engine.go index 3dc1f5f9a92..eba6e736a21 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/engine.go +++ b/go/vt/vttablet/tabletserver/vstreamer/engine.go @@ -39,6 +39,7 @@ import ( "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/vindexes" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle" @@ -233,7 +234,10 @@ func (vse *Engine) validateBinlogRowImage(ctx context.Context, db dbconfigs.Conn // Stream starts a new stream. // This streams events from the binary logs -func (vse *Engine) Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error) error { +func (vse *Engine) Stream(ctx context.Context, startPos string, tablePKs []*binlogdatapb.TableLastPK, + filter *binlogdatapb.Filter, throttlerApp throttlerapp.Name, + send func([]*binlogdatapb.VEvent) error, options *binlogdatapb.VStreamOptions) error { + if err := vse.validateBinlogRowImage(ctx, vse.se.GetDBConnector()); err != nil { return err } @@ -250,7 +254,8 @@ func (vse *Engine) Stream(ctx context.Context, startPos string, tablePKs []*binl } vse.mu.Lock() defer vse.mu.Unlock() - streamer := newUVStreamer(ctx, vse, vse.env.Config().DB.FilteredWithDB(), vse.se, startPos, tablePKs, filter, vse.lvschema, throttlerApp, send) + streamer := newUVStreamer(ctx, vse, vse.env.Config().DB.FilteredWithDB(), vse.se, startPos, tablePKs, + filter, vse.lvschema, throttlerApp, send, options) idx := vse.streamIdx vse.streamers[idx] = streamer vse.streamIdx++ @@ -277,7 +282,8 @@ func (vse *Engine) Stream(ctx context.Context, startPos string, tablePKs []*binl // StreamRows streams rows. // This streams the table data rows (so we can copy the table data snapshot) -func (vse *Engine) StreamRows(ctx context.Context, query string, lastpk []sqltypes.Value, send func(*binlogdatapb.VStreamRowsResponse) error) error { +func (vse *Engine) StreamRows(ctx context.Context, query string, lastpk []sqltypes.Value, + send func(*binlogdatapb.VStreamRowsResponse) error, options *binlogdatapb.VStreamOptions) error { // Ensure vschema is initialized and the watcher is started. // Starting of the watcher has to be delayed till the first call to Stream // because this overhead should be incurred only if someone uses this feature. @@ -292,7 +298,8 @@ func (vse *Engine) StreamRows(ctx context.Context, query string, lastpk []sqltyp vse.mu.Lock() defer vse.mu.Unlock() - rowStreamer := newRowStreamer(ctx, vse.env.Config().DB.FilteredWithDB(), vse.se, query, lastpk, vse.lvschema, send, vse, RowStreamerModeSingleTable, nil) + rowStreamer := newRowStreamer(ctx, vse.env.Config().DB.FilteredWithDB(), vse.se, query, lastpk, vse.lvschema, + send, vse, RowStreamerModeSingleTable, nil, options) idx := vse.streamIdx vse.rowStreamers[idx] = rowStreamer vse.streamIdx++ @@ -318,7 +325,9 @@ func (vse *Engine) StreamRows(ctx context.Context, query string, lastpk []sqltyp } // StreamTables streams all tables. -func (vse *Engine) StreamTables(ctx context.Context, send func(*binlogdatapb.VStreamTablesResponse) error) error { +func (vse *Engine) StreamTables(ctx context.Context, + send func(*binlogdatapb.VStreamTablesResponse) error, options *binlogdatapb.VStreamOptions) error { + // Ensure vschema is initialized and the watcher is started. // Starting of the watcher is delayed till the first call to StreamTables // so that this overhead is incurred only if someone uses this feature. @@ -333,7 +342,7 @@ func (vse *Engine) StreamTables(ctx context.Context, send func(*binlogdatapb.VSt vse.mu.Lock() defer vse.mu.Unlock() - tableStreamer := newTableStreamer(ctx, vse.env.Config().DB.FilteredWithDB(), vse.se, vse.lvschema, send, vse) + tableStreamer := newTableStreamer(ctx, vse.env.Config().DB.FilteredWithDB(), vse.se, vse.lvschema, send, vse, options) idx := vse.streamIdx vse.tableStreamers[idx] = tableStreamer vse.streamIdx++ @@ -359,7 +368,9 @@ func (vse *Engine) StreamTables(ctx context.Context, send func(*binlogdatapb.VSt } // StreamResults streams results of the query with the gtid. -func (vse *Engine) StreamResults(ctx context.Context, query string, send func(*binlogdatapb.VStreamResultsResponse) error) error { +func (vse *Engine) StreamResults(ctx context.Context, query string, + send func(*binlogdatapb.VStreamResultsResponse) error) error { + // Create stream and add it to the map. resultStreamer, idx, err := func() (*resultStreamer, int, error) { if atomic.LoadInt32(&vse.isOpen) == 0 { @@ -465,7 +476,7 @@ func (vse *Engine) setWatch() { } func getPacketSize() int64 { - return int64(defaultPacketSize) + return int64(vttablet.VStreamerDefaultPacketSize) } // waitForMySQL ensures that the source is able to stay within defined bounds for diff --git a/go/vt/vttablet/tabletserver/vstreamer/engine_test.go b/go/vt/vttablet/tabletserver/vstreamer/engine_test.go index b0b31e256cc..7cafcc6d485 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/engine_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/engine_test.go @@ -96,7 +96,7 @@ func TestUpdateVSchema(t *testing.T) { // Stream should terminate immediately due to invalid pos. _ = engine.Stream(ctx, "invalid", nil, filter, throttlerapp.VStreamerName, func(_ []*binlogdatapb.VEvent) error { return nil - }) + }, nil) startCount := expectUpdateCount(t, 1) @@ -106,6 +106,7 @@ func TestUpdateVSchema(t *testing.T) { expectUpdateCount(t, startCount+1) want := `{ + "mirror_rules": {}, "routing_rules": {}, "keyspaces": { "vttest": { diff --git a/go/vt/vttablet/tabletserver/vstreamer/helper_event_test.go b/go/vt/vttablet/tabletserver/vstreamer/helper_event_test.go index 49dabae3973..c52e81564c0 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/helper_event_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/helper_event_test.go @@ -158,10 +158,10 @@ func (s *TestRowEventSpec) String() string { TableName: s.table, } var rowChanges []*binlogdatapb.RowChange - if s.changes != nil && len(s.changes) > 0 { + if len(s.changes) > 0 { for _, c := range s.changes { rowChange := binlogdatapb.RowChange{} - if c.before != nil && len(c.before) > 0 { + if len(c.before) > 0 { rowChange.Before = &query.Row{} for _, val := range c.before { if val == sqltypes.NullStr { @@ -171,7 +171,7 @@ func (s *TestRowEventSpec) String() string { rowChange.Before.Values = append(rowChange.Before.Values, []byte(val)...) } } - if c.after != nil && len(c.after) > 0 { + if len(c.after) > 0 { rowChange.After = &query.Row{} for i, val := range c.after { if val == sqltypes.NullStr { @@ -318,7 +318,7 @@ func (ts *TestSpec) Init() { // Close() should be called (via defer) at the end of the test to clean up the tables created in the test. func (ts *TestSpec) Close() { - dropStatement := fmt.Sprintf("drop tables %s", strings.Join(ts.schema.TableNames(), ", ")) + dropStatement := fmt.Sprintf("drop table if exists %s", strings.Join(ts.schema.TableNames(), ", ")) execStatement(ts.t, dropStatement) } @@ -780,6 +780,8 @@ func getQueryType(strType string) query.Type { return query.Type_SET case "JSON": return query.Type_JSON + case "VECTOR": + return query.Type_VECTOR default: panic("unknown type " + strType) } diff --git a/go/vt/vttablet/tabletserver/vstreamer/main_test.go b/go/vt/vttablet/tabletserver/vstreamer/main_test.go index aade1511060..18b5e1f1b3b 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/main_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/main_test.go @@ -22,11 +22,14 @@ import ( "io" "os" "slices" + "strconv" "strings" "sync" "testing" "time" + vttablet "vitess.io/vitess/go/vt/vttablet/common" + "github.com/stretchr/testify/require" _flag "vitess.io/vitess/go/internal/flag" @@ -309,6 +312,14 @@ func vstream(ctx context.Context, t *testing.T, pos string, tablePKs []*binlogda }}, } } + + // Some unit tests currently change the packet size options for the scope of those tests. We want to pass those + // values to the VStreamer for the duration of this test. + var options binlogdatapb.VStreamOptions + options.ConfigOverrides = make(map[string]string) + options.ConfigOverrides["vstream_dynamic_packet_size"] = strconv.FormatBool(vttablet.VStreamerUseDynamicPacketSize) + options.ConfigOverrides["vstream_packet_size"] = strconv.Itoa(vttablet.VStreamerDefaultPacketSize) + return engine.Stream(ctx, pos, tablePKs, filter, throttlerapp.VStreamerName, func(evs []*binlogdatapb.VEvent) error { timer := time.NewTimer(2 * time.Second) defer timer.Stop() @@ -323,7 +334,7 @@ func vstream(ctx context.Context, t *testing.T, pos string, tablePKs []*binlogda return io.EOF } return nil - }) + }, &options) } func execStatement(t *testing.T, query string) { diff --git a/go/vt/vttablet/tabletserver/vstreamer/packet_size.go b/go/vt/vttablet/tabletserver/vstreamer/packet_size.go index 50bc1e57cd2..7ce430d1811 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/packet_size.go +++ b/go/vt/vttablet/tabletserver/vstreamer/packet_size.go @@ -21,14 +21,9 @@ import ( "github.com/spf13/pflag" - "vitess.io/vitess/go/vt/servenv" - "vitess.io/vitess/go/mathstats" -) - -var ( - defaultPacketSize = 250000 - useDynamicPacketSize = true + "vitess.io/vitess/go/vt/servenv" + vttablet "vitess.io/vitess/go/vt/vttablet/common" ) func init() { @@ -38,9 +33,9 @@ func init() { func registerPacketSizeFlags(fs *pflag.FlagSet) { // defaultPacketSize is the suggested packet size for VReplication streamer. - fs.IntVar(&defaultPacketSize, "vstream_packet_size", defaultPacketSize, "Suggested packet size for VReplication streamer. This is used only as a recommendation. The actual packet size may be more or less than this amount.") + fs.IntVar(&vttablet.VStreamerDefaultPacketSize, "vstream_packet_size", vttablet.VStreamerDefaultPacketSize, "Suggested packet size for VReplication streamer. This is used only as a recommendation. The actual packet size may be more or less than this amount.") // useDynamicPacketSize controls whether to use dynamic packet size adjustments to increase performance while streaming - fs.BoolVar(&useDynamicPacketSize, "vstream_dynamic_packet_size", useDynamicPacketSize, "Enable dynamic packet sizing for VReplication. This will adjust the packet size during replication to improve performance.") + fs.BoolVar(&vttablet.VStreamerUseDynamicPacketSize, "vstream_dynamic_packet_size", vttablet.VStreamerUseDynamicPacketSize, "Enable dynamic packet sizing for VReplication. This will adjust the packet size during replication to improve performance.") } // PacketSizer is a controller that adjusts the size of the packets being sent by the vstreamer at runtime @@ -50,28 +45,29 @@ type PacketSizer interface { Limit() int } -// DefaultPacketSizer creates a new PacketSizer using the default settings. +// DefaultPacketSizer creates a new PacketSizer based on the provided values. // If dynamic packet sizing is enabled, this will return a dynamicPacketSizer. -func DefaultPacketSizer() PacketSizer { +// Otherwise it will return a fixedPacketSize of packetSize. +func DefaultPacketSizer(useDynamicPacketSize bool, packetSize int) PacketSizer { if useDynamicPacketSize { - return newDynamicPacketSizer(defaultPacketSize) + return newDynamicPacketSizer(packetSize) } - return newFixedPacketSize(defaultPacketSize) + return newFixedPacketSize(packetSize) } // AdjustPacketSize temporarily adjusts the default packet sizes to the given value. // Calling the returned cleanup function resets them to their original value. // This function is only used for testing. func AdjustPacketSize(size int) func() { - originalSize := defaultPacketSize - originalDyn := useDynamicPacketSize + originalSize := vttablet.VStreamerDefaultPacketSize + originalDyn := vttablet.VStreamerUseDynamicPacketSize - defaultPacketSize = size - useDynamicPacketSize = false + vttablet.VStreamerDefaultPacketSize = size + vttablet.VStreamerUseDynamicPacketSize = false return func() { - defaultPacketSize = originalSize - useDynamicPacketSize = originalDyn + vttablet.VStreamerDefaultPacketSize = originalSize + vttablet.VStreamerUseDynamicPacketSize = originalDyn } } diff --git a/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go b/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go index 2c768d7d3c6..9bbc98ca2bd 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go +++ b/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go @@ -64,6 +64,9 @@ type Plan struct { EnumSetValuesMap map[int](map[int]string) env *vtenv.Environment + + // IsInternal is set to true if the plan is for a sidecar table. + IsInternal bool } // Opcode enumerates the operators supported in a where clause diff --git a/go/vt/vttablet/tabletserver/vstreamer/resultstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/resultstreamer.go index 4632bea672b..ca3929979c3 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/resultstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/resultstreamer.go @@ -25,6 +25,7 @@ import ( "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/sqlparser" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -55,7 +56,7 @@ func newResultStreamer(ctx context.Context, cp dbconfigs.Connector, query string query: query, send: send, vse: vse, - pktsize: DefaultPacketSizer(), + pktsize: DefaultPacketSizer(vttablet.VStreamerUseDynamicPacketSize, vttablet.VStreamerDefaultPacketSize), } } @@ -109,7 +110,7 @@ func (rs *resultStreamer) Stream() error { } // check throttler. - if !rs.vse.throttlerClient.ThrottleCheckOKOrWaitAppName(rs.ctx, throttlerapp.ResultStreamerName) { + if _, ok := rs.vse.throttlerClient.ThrottleCheckOKOrWaitAppName(rs.ctx, throttlerapp.ResultStreamerName); !ok { logger.Infof("throttled.") continue } diff --git a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go index bb8ff7af85f..31c47674233 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go @@ -33,7 +33,7 @@ import ( "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" @@ -79,14 +79,20 @@ type rowStreamer struct { vse *Engine pktsize PacketSizer - mode RowStreamerMode - conn *snapshotConn + mode RowStreamerMode + conn *snapshotConn + options *binlogdatapb.VStreamOptions + config *vttablet.VReplicationConfig } func newRowStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine, query string, lastpk []sqltypes.Value, vschema *localVSchema, send func(*binlogdatapb.VStreamRowsResponse) error, vse *Engine, - mode RowStreamerMode, conn *snapshotConn) *rowStreamer { + mode RowStreamerMode, conn *snapshotConn, options *binlogdatapb.VStreamOptions) *rowStreamer { + config, err := GetVReplicationConfig(options) + if err != nil { + return nil + } ctx, cancel := context.WithCancel(ctx) return &rowStreamer{ ctx: ctx, @@ -98,9 +104,11 @@ func newRowStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engi send: send, vschema: vschema, vse: vse, - pktsize: DefaultPacketSizer(), + pktsize: DefaultPacketSizer(config.VStreamDynamicPacketSize, config.VStreamPacketSize), mode: mode, conn: conn, + options: options, + config: config, } } @@ -128,10 +136,10 @@ func (rs *rowStreamer) Stream() error { if _, err := rs.conn.ExecuteFetch("set names 'binary'", 1, false); err != nil { return err } - if _, err := conn.ExecuteFetch(fmt.Sprintf("set @@session.net_read_timeout = %v", vttablet.VReplicationNetReadTimeout), 1, false); err != nil { + if _, err := conn.ExecuteFetch(fmt.Sprintf("set @@session.net_read_timeout = %v", rs.config.NetReadTimeout), 1, false); err != nil { return err } - if _, err := conn.ExecuteFetch(fmt.Sprintf("set @@session.net_write_timeout = %v", vttablet.VReplicationNetWriteTimeout), 1, false); err != nil { + if _, err := conn.ExecuteFetch(fmt.Sprintf("set @@session.net_write_timeout = %v", rs.config.NetReadTimeout), 1, false); err != nil { return err } } @@ -240,7 +248,7 @@ func (rs *rowStreamer) buildPKColumns(st *binlogdatapb.MinimalTable) ([]int, err func (rs *rowStreamer) buildSelect(st *binlogdatapb.MinimalTable) (string, error) { buf := sqlparser.NewTrackedBuffer(nil) // We could have used select *, but being explicit is more predictable. - buf.Myprintf("select %s", GetVReplicationMaxExecutionTimeQueryHint()) + buf.Myprintf("select %s", GetVReplicationMaxExecutionTimeQueryHint(rs.config.CopyPhaseDuration)) prefix := "" for _, col := range rs.plan.Table.Fields { if rs.plan.isConvertColumnUsingUTF8(col.Name) { @@ -388,9 +396,9 @@ func (rs *rowStreamer) streamQuery(send func(*binlogdatapb.VStreamRowsResponse) } // check throttler. - if !rs.vse.throttlerClient.ThrottleCheckOKOrWaitAppName(rs.ctx, throttlerapp.RowStreamerName) { + if checkResult, ok := rs.vse.throttlerClient.ThrottleCheckOKOrWaitAppName(rs.ctx, throttlerapp.RowStreamerName); !ok { throttleResponseRateLimiter.Do(func() error { - return safeSend(&binlogdatapb.VStreamRowsResponse{Throttled: true}) + return safeSend(&binlogdatapb.VStreamRowsResponse{Throttled: true, ThrottledReason: checkResult.Summary()}) }) logger.Infof("throttled.") continue @@ -455,6 +463,6 @@ func (rs *rowStreamer) streamQuery(send func(*binlogdatapb.VStreamRowsResponse) return nil } -func GetVReplicationMaxExecutionTimeQueryHint() string { - return fmt.Sprintf("/*+ MAX_EXECUTION_TIME(%v) */ ", vttablet.CopyPhaseDuration.Milliseconds()) +func GetVReplicationMaxExecutionTimeQueryHint(copyPhaseDuration time.Duration) string { + return fmt.Sprintf("/*+ MAX_EXECUTION_TIME(%v) */ ", copyPhaseDuration.Milliseconds()) } diff --git a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer_test.go index 48d11d9e856..47db5fb839a 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer_test.go @@ -20,8 +20,11 @@ import ( "context" "fmt" "regexp" + "strconv" "testing" + vttablet "vitess.io/vitess/go/vt/vttablet/common" + "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql" @@ -79,7 +82,7 @@ func TestRowStreamerQuery(t *testing.T) { }) } return nil - }) + }, nil) require.NoError(t, err) } @@ -199,7 +202,7 @@ func TestStreamRowsScan(t *testing.T) { `fields:{name:"id" type:INT32 table:"t3" org_table:"t3" database:"vttest" org_name:"id" column_length:11 charset:63 column_type:"int(11)"} fields:{name:"val" type:VARBINARY table:"t3" org_table:"t3" database:"vttest" org_name:"val" column_length:128 charset:63 column_type:"varbinary(128)"} pkfields:{name:"id" type:INT32 charset:63} pkfields:{name:"val" type:VARBINARY charset:63}`, `rows:{lengths:1 lengths:3 values:"2bbb"} lastpk:{lengths:1 lengths:3 values:"2bbb"}`, } - wantQuery = "select /*+ MAX_EXECUTION_TIME(3600000) */ id, val from t3 where (id = 1 and val > 'aaa') or (id > 1) order by id, val" + wantQuery = "select /*+ MAX_EXECUTION_TIME(3600000) */ id, val from t3 where (id = 1 and val > _binary'aaa') or (id > 1) order by id, val" checkStream(t, "select * from t3", []sqltypes.Value{sqltypes.NewInt64(1), sqltypes.NewVarBinary("aaa")}, wantQuery, wantStream) // t4: all rows @@ -285,7 +288,7 @@ func TestStreamRowsUnicode(t *testing.T) { t.Errorf("rows.Rows[0].Values: %s, want %s", got, want) } return nil - }) + }, nil) require.NoError(t, err) } @@ -423,10 +426,14 @@ func TestStreamRowsCancel(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() + var options binlogdatapb.VStreamOptions + options.ConfigOverrides = make(map[string]string) + options.ConfigOverrides["vstream_dynamic_packet_size"] = "false" + options.ConfigOverrides["vstream_packet_size"] = "10" err := engine.StreamRows(ctx, "select * from t1", nil, func(rows *binlogdatapb.VStreamRowsResponse) error { cancel() return nil - }) + }, &options) if got, want := err.Error(), "stream ended: context canceled"; got != want { t.Errorf("err: %v, want %s", err, want) } @@ -442,6 +449,10 @@ func checkStream(t *testing.T, query string, lastpk []sqltypes.Value, wantQuery go func() { first := true defer close(ch) + var options binlogdatapb.VStreamOptions + options.ConfigOverrides = make(map[string]string) + options.ConfigOverrides["vstream_dynamic_packet_size"] = strconv.FormatBool(vttablet.VStreamerUseDynamicPacketSize) + options.ConfigOverrides["vstream_packet_size"] = strconv.Itoa(vttablet.VStreamerDefaultPacketSize) err := engine.StreamRows(context.Background(), query, lastpk, func(rows *binlogdatapb.VStreamRowsResponse) error { if first { if rows.Gtid == "" { @@ -469,7 +480,7 @@ func checkStream(t *testing.T, query string, lastpk []sqltypes.Value, wantQuery } i++ return nil - }) + }, &options) if err != nil { ch <- err } @@ -486,7 +497,7 @@ func expectStreamError(t *testing.T, query string, want string) { defer close(ch) err := engine.StreamRows(context.Background(), query, nil, func(rows *binlogdatapb.VStreamRowsResponse) error { return nil - }) + }, nil) require.EqualError(t, err, want, "Got incorrect error") }() } diff --git a/go/vt/vttablet/tabletserver/vstreamer/snapshot_conn.go b/go/vt/vttablet/tabletserver/vstreamer/snapshot_conn.go index f3eda83bd45..ec326cc4159 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/snapshot_conn.go +++ b/go/vt/vttablet/tabletserver/vstreamer/snapshot_conn.go @@ -25,23 +25,17 @@ import ( "github.com/spf13/pflag" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/mysql/sqlerror" - - "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" + vttablet "vitess.io/vitess/go/vt/vttablet/common" ) -// If the current binary log is greater than this byte size, we -// will attempt to rotate it before starting a GTID snapshot -// based stream. -// Default is 64MiB. -var binlogRotationThreshold = int64(64 * 1024 * 1024) // 64MiB - // snapshotConn is wrapper on mysql.Conn capable of // reading a table along with a GTID snapshot. type snapshotConn struct { @@ -55,7 +49,7 @@ func init() { } func registerSnapshotConnFlags(fs *pflag.FlagSet) { - fs.Int64Var(&binlogRotationThreshold, "vstream-binlog-rotation-threshold", binlogRotationThreshold, "Byte size at which a VStreamer will attempt to rotate the source's open binary log before starting a GTID snapshot based stream (e.g. a ResultStreamer or RowStreamer)") + fs.Int64Var(&vttablet.VStreamerBinlogRotationThreshold, "vstream-binlog-rotation-threshold", vttablet.VStreamerBinlogRotationThreshold, "Byte size at which a VStreamer will attempt to rotate the source's open binary log before starting a GTID snapshot based stream (e.g. a ResultStreamer or RowStreamer)") } func snapshotConnect(ctx context.Context, cp dbconfigs.Connector) (*snapshotConn, error) { @@ -189,7 +183,7 @@ func (conn *snapshotConn) limitOpenBinlogSize() (bool, error) { if err != nil { return rotatedLog, err } - if curLogSize > atomic.LoadInt64(&binlogRotationThreshold) { + if curLogSize > atomic.LoadInt64(&vttablet.VStreamerBinlogRotationThreshold) { if _, err = conn.ExecuteFetch("FLUSH BINARY LOGS", 0, false); err != nil { return rotatedLog, err } @@ -202,14 +196,14 @@ func (conn *snapshotConn) limitOpenBinlogSize() (bool, error) { // will attempt to rotate the binary log before starting a GTID snapshot based // stream (e.g. a ResultStreamer or RowStreamer). func GetBinlogRotationThreshold() int64 { - return atomic.LoadInt64(&binlogRotationThreshold) + return atomic.LoadInt64(&vttablet.VStreamerBinlogRotationThreshold) } // SetBinlogRotationThreshold sets the byte size at which a VStreamer will // attempt to rotate the binary log before starting a GTID snapshot based // stream (e.g. a ResultStreamer or RowStreamer). func SetBinlogRotationThreshold(threshold int64) { - atomic.StoreInt64(&binlogRotationThreshold, threshold) + atomic.StoreInt64(&vttablet.VStreamerBinlogRotationThreshold, threshold) } // startSnapshotAllTables starts a streaming query with a snapshot view of all tables, returning the diff --git a/go/vt/vttablet/tabletserver/vstreamer/tablestreamer.go b/go/vt/vttablet/tabletserver/vstreamer/tablestreamer.go index d3bbd136f12..6ed291387e1 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/tablestreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/tablestreamer.go @@ -28,7 +28,7 @@ import ( "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/mysqlctl/tmutils" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" @@ -60,10 +60,17 @@ type tableStreamer struct { snapshotConn *snapshotConn tables []string gtid string + options *binlogdatapb.VStreamOptions + config *vttablet.VReplicationConfig } func newTableStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine, vschema *localVSchema, - send func(response *binlogdatapb.VStreamTablesResponse) error, vse *Engine) *tableStreamer { + send func(response *binlogdatapb.VStreamTablesResponse) error, vse *Engine, options *binlogdatapb.VStreamOptions) *tableStreamer { + + config, err := GetVReplicationConfig(options) + if err != nil { + return nil + } ctx, cancel := context.WithCancel(ctx) return &tableStreamer{ ctx: ctx, @@ -73,6 +80,8 @@ func newTableStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.En send: send, vschema: vschema, vse: vse, + options: options, + config: config, } } @@ -103,10 +112,10 @@ func (ts *tableStreamer) Stream() error { if _, err := conn.ExecuteFetch("set names 'binary'", 1, false); err != nil { return err } - if _, err := conn.ExecuteFetch(fmt.Sprintf("set @@session.net_read_timeout = %v", vttablet.VReplicationNetReadTimeout), 1, false); err != nil { + if _, err := conn.ExecuteFetch(fmt.Sprintf("set @@session.net_read_timeout = %v", ts.config.NetReadTimeout), 1, false); err != nil { return err } - if _, err := conn.ExecuteFetch(fmt.Sprintf("set @@session.net_write_timeout = %v", vttablet.VReplicationNetWriteTimeout), 1, false); err != nil { + if _, err := conn.ExecuteFetch(fmt.Sprintf("set @@session.net_write_timeout = %v", ts.config.NetWriteTimeout), 1, false); err != nil { return err } @@ -149,7 +158,7 @@ func (ts *tableStreamer) newRowStreamer(ctx context.Context, query string, lastp defer vse.mu.Unlock() rowStreamer := newRowStreamer(ctx, vse.env.Config().DB.FilteredWithDB(), vse.se, query, lastpk, vse.lvschema, - send, vse, RowStreamerModeAllTables, ts.snapshotConn) + send, vse, RowStreamerModeAllTables, ts.snapshotConn, ts.options) idx := vse.streamIdx vse.rowStreamers[idx] = rowStreamer diff --git a/go/vt/vttablet/tabletserver/vstreamer/tablestreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/tablestreamer_test.go index 9be3940c01d..8fe3849b8a4 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/tablestreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/tablestreamer_test.go @@ -69,7 +69,7 @@ func TestTableStreamer(t *testing.T) { } gotStream = append(gotStream, fmt.Sprintf("%v", response)) return nil - }) + }, nil) require.NoError(t, err) require.EqualValues(t, wantStream, gotStream) require.Equal(t, int64(4), engine.tableStreamerNumTables.Get()) diff --git a/go/vt/vttablet/tabletserver/vstreamer/utils.go b/go/vt/vttablet/tabletserver/vstreamer/utils.go new file mode 100644 index 00000000000..9597f80c07c --- /dev/null +++ b/go/vt/vttablet/tabletserver/vstreamer/utils.go @@ -0,0 +1,37 @@ +/* +Copyright 2024 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 vstreamer + +import ( + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/vterrors" + vttablet "vitess.io/vitess/go/vt/vttablet/common" + + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" +) + +func GetVReplicationConfig(options *binlogdatapb.VStreamOptions) (*vttablet.VReplicationConfig, error) { + if options == nil { + return vttablet.InitVReplicationConfigDefaults(), nil + } + config, err := vttablet.NewVReplicationConfig(options.ConfigOverrides) + if err != nil { + log.Errorf("Error parsing VReplicationConfig: %v", err) + return nil, vterrors.Wrapf(err, "failed to parse VReplicationConfig") + } + return config, nil +} diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go index 2b770c1d4f4..ea475d19676 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go @@ -88,7 +88,8 @@ type uvstreamer struct { config *uvstreamerConfig - vs *vstreamer //last vstreamer created in uvstreamer + vs *vstreamer // last vstreamer created in uvstreamer + options *binlogdatapb.VStreamOptions } type uvstreamerConfig struct { @@ -96,7 +97,10 @@ type uvstreamerConfig struct { CatchupRetryTime time.Duration } -func newUVStreamer(ctx context.Context, vse *Engine, cp dbconfigs.Connector, se *schema.Engine, startPos string, tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, vschema *localVSchema, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error) *uvstreamer { +func newUVStreamer(ctx context.Context, vse *Engine, cp dbconfigs.Connector, se *schema.Engine, startPos string, + tablePKs []*binlogdatapb.TableLastPK, filter *binlogdatapb.Filter, vschema *localVSchema, + throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error, options *binlogdatapb.VStreamOptions) *uvstreamer { + ctx, cancel := context.WithCancel(ctx) config := &uvstreamerConfig{ MaxReplicationLag: 1 * time.Nanosecond, @@ -123,6 +127,7 @@ func newUVStreamer(ctx context.Context, vse *Engine, cp dbconfigs.Connector, se config: config, inTablePKs: tablePKs, throttlerApp: throttlerApp, + options: options, } return uvs @@ -138,6 +143,9 @@ func (uvs *uvstreamer) buildTablePlan() error { uvs.plans = make(map[string]*tablePlan) tableLastPKs := make(map[string]*binlogdatapb.TableLastPK) for _, tablePK := range uvs.inTablePKs { + if tablePK != nil && tablePK.Lastpk != nil && len(tablePK.Lastpk.Fields) == 0 { + return fmt.Errorf("lastpk for table %s has no fields defined", tablePK.TableName) + } tableLastPKs[tablePK.TableName] = tablePK } tables := uvs.se.GetSchema() @@ -313,7 +321,6 @@ func (uvs *uvstreamer) send2(evs []*binlogdatapb.VEvent) error { } behind := time.Now().UnixNano() - uvs.lastTimestampNs uvs.setReplicationLagSeconds(behind / 1e9) - //log.Infof("sbm set to %d", uvs.ReplicationLagSeconds) var evs2 []*binlogdatapb.VEvent if len(uvs.plans) > 0 { evs2 = uvs.filterEvents(evs) @@ -425,7 +432,7 @@ func (uvs *uvstreamer) Stream() error { } } vs := newVStreamer(uvs.ctx, uvs.cp, uvs.se, replication.EncodePosition(uvs.pos), replication.EncodePosition(uvs.stopPos), - uvs.filter, uvs.getVSchema(), uvs.throttlerApp, uvs.send, "replicate", uvs.vse) + uvs.filter, uvs.getVSchema(), uvs.throttlerApp, uvs.send, "replicate", uvs.vse, uvs.options) uvs.setVs(vs) return vs.Stream() diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_flaky_test.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_flaky_test.go index 389c06a671e..e2972bb7071 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_flaky_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_flaky_test.go @@ -454,7 +454,7 @@ func startVStreamCopy(ctx context.Context, t *testing.T, filter *binlogdatapb.Fi pos := "" go func() { err := engine.Stream(ctx, pos, tablePKs, filter, throttlerapp.VStreamerName, func(evs []*binlogdatapb.VEvent) error { - //t.Logf("Received events: %v", evs) + // t.Logf("Received events: %v", evs) muAllEvents.Lock() defer muAllEvents.Unlock() for _, ev := range evs { @@ -474,7 +474,7 @@ func startVStreamCopy(ctx context.Context, t *testing.T, filter *binlogdatapb.Fi allEvents = append(allEvents, ev) } return nil - }) + }, nil) require.Nil(t, err) }() } @@ -503,7 +503,7 @@ var expectedEvents = []string{ "type:FIELD field_event:{table_name:\"t1\" fields:{name:\"id11\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id11\" column_length:11 charset:63 column_type:\"int(11)\"} fields:{name:\"id12\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id12\" column_length:11 charset:63 column_type:\"int(11)\"} enum_set_string_values:true}", "type:ROW row_event:{table_name:\"t1\" row_changes:{after:{lengths:2 lengths:3 values:\"11110\"}}}", "type:GTID", - "type:COMMIT", //insert for t2 done along with t1 does not generate an event since t2 is not yet copied + "type:COMMIT", // insert for t2 done along with t1 does not generate an event since t2 is not yet copied fmt.Sprintf("type:OTHER gtid:\"%s t2\"", copyPhaseStart), "type:BEGIN", "type:FIELD field_event:{table_name:\"t1\" fields:{name:\"id11\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id11\" column_length:11 charset:63 column_type:\"int(11)\"} fields:{name:\"id12\" type:INT32 table:\"t1\" org_table:\"t1\" database:\"vttest\" org_name:\"id12\" column_length:11 charset:63 column_type:\"int(11)\"} enum_set_string_values:true}", diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go index 3413c53d811..e7453b2b70f 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go @@ -31,7 +31,6 @@ import ( "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/mysql/replication" "vitess.io/vitess/go/sqltypes" - "vitess.io/vitess/go/timer" "vitess.io/vitess/go/vt/binlog" "vitess.io/vitess/go/vt/dbconfigs" "vitess.io/vitess/go/vt/log" @@ -39,7 +38,7 @@ import ( vtschema "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vttablet" + vttablet "vitess.io/vitess/go/vt/vttablet/common" "vitess.io/vitess/go/vt/vttablet/tabletserver/schema" "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/throttlerapp" @@ -84,8 +83,10 @@ type vstreamer struct { pos replication.Position stopPos string - phase string - vse *Engine + phase string + vse *Engine + options *binlogdatapb.VStreamOptions + config *vttablet.VReplicationConfig } // streamerPlan extends the original plan to also include @@ -106,7 +107,7 @@ type streamerPlan struct { // filter: the list of filtering rules. If a rule has a select expression for its filter, // // the select list can only reference direct columns. No other expressions are allowed. -// The select expression is allowed to contain the special 'keyspace_id()' function which +// The select expression is allowed to contain the special 'in_keyrange()' function which // will return the keyspace id of the row. Examples: // "select * from t", same as an empty Filter, // "select * from t where in_keyrange('-80')", same as "-80", @@ -118,7 +119,14 @@ type streamerPlan struct { // // vschema: the current vschema. This value can later be changed through the SetVSchema method. // send: callback function to send events. -func newVStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine, startPos string, stopPos string, filter *binlogdatapb.Filter, vschema *localVSchema, throttlerApp throttlerapp.Name, send func([]*binlogdatapb.VEvent) error, phase string, vse *Engine) *vstreamer { +func newVStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine, startPos string, stopPos string, + filter *binlogdatapb.Filter, vschema *localVSchema, throttlerApp throttlerapp.Name, + send func([]*binlogdatapb.VEvent) error, phase string, vse *Engine, options *binlogdatapb.VStreamOptions) *vstreamer { + + config, err := GetVReplicationConfig(options) + if err != nil { + return nil + } ctx, cancel := context.WithCancel(ctx) return &vstreamer{ ctx: ctx, @@ -135,6 +143,8 @@ func newVStreamer(ctx context.Context, cp dbconfigs.Connector, se *schema.Engine plans: make(map[uint64]*streamerPlan), phase: phase, vse: vse, + options: options, + config: config, } } @@ -246,7 +256,7 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog return vs.send(vevents) case binlogdatapb.VEventType_INSERT, binlogdatapb.VEventType_DELETE, binlogdatapb.VEventType_UPDATE, binlogdatapb.VEventType_REPLACE: newSize := len(vevent.GetDml()) - if curSize+newSize > defaultPacketSize { + if curSize+newSize > vs.config.VStreamPacketSize { vs.vse.vstreamerNumPackets.Add(1) vevents := bufferedEvents bufferedEvents = []*binlogdatapb.VEvent{vevent} @@ -267,7 +277,7 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog newSize += len(rowChange.After.Values) } } - if curSize+newSize > defaultPacketSize { + if curSize+newSize > vs.config.VStreamPacketSize { vs.vse.vstreamerNumPackets.Add(1) vevents := bufferedEvents bufferedEvents = []*binlogdatapb.VEvent{vevent} @@ -287,41 +297,40 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog hbTimer := time.NewTimer(HeartbeatTime) defer hbTimer.Stop() - injectHeartbeat := func(throttled bool) error { - now := time.Now().UnixNano() + injectHeartbeat := func(throttled bool, throttledReason string) error { select { case <-ctx.Done(): return vterrors.Errorf(vtrpcpb.Code_CANCELED, "context has expired") default: + now := time.Now().UnixNano() err := bufferAndTransmit(&binlogdatapb.VEvent{ - Type: binlogdatapb.VEventType_HEARTBEAT, - Timestamp: now / 1e9, - CurrentTime: now, - Throttled: throttled, + Type: binlogdatapb.VEventType_HEARTBEAT, + Timestamp: now / 1e9, + CurrentTime: now, + Throttled: throttled, + ThrottledReason: throttledReason, }) return err } } logger := logutil.NewThrottledLogger(vs.vse.GetTabletInfo(), throttledLoggerInterval) + wfNameLog := "" + if vs.filter != nil && vs.filter.WorkflowName != "" { + wfNameLog = fmt.Sprintf(" in workflow %s", vs.filter.WorkflowName) + } throttleEvents := func(throttledEvents chan mysql.BinlogEvent) { - throttledHeartbeatsRateLimiter := timer.NewRateLimiter(HeartbeatTime) - defer throttledHeartbeatsRateLimiter.Stop() for { - // check throttler. - if !vs.vse.throttlerClient.ThrottleCheckOKOrWaitAppName(ctx, vs.throttlerApp) { - // make sure to leave if context is cancelled + // Check throttler. + if checkResult, ok := vs.vse.throttlerClient.ThrottleCheckOKOrWaitAppName(ctx, vs.throttlerApp); !ok { + // Make sure to leave if context is cancelled. select { case <-ctx.Done(): return default: - // do nothing special + // Do nothing special. } - throttledHeartbeatsRateLimiter.Do(func() error { - return injectHeartbeat(true) - }) - // we won't process events, until we're no longer throttling - logger.Infof("throttled.") + logger.Infof("vstreamer throttled%s: %s.", wfNameLog, checkResult.Summary()) continue } select { @@ -393,7 +402,8 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog case <-ctx.Done(): return nil case <-hbTimer.C: - if err := injectHeartbeat(false); err != nil { + checkResult, ok := vs.vse.throttlerClient.ThrottleCheckOK(ctx, vs.throttlerApp) + if err := injectHeartbeat(!ok, checkResult.Summary()); err != nil { if err == io.EOF { return nil } @@ -566,26 +576,28 @@ func (vs *vstreamer) parseEvent(ev mysql.BinlogEvent) ([]*binlogdatapb.VEvent, e if err != nil { return nil, err } - if plan, ok := vs.plans[id]; ok { // When the underlying mysql server restarts the table map can change. // Usually the vstreamer will also error out when this happens, and vstreamer re-initializes its table map. // But if the vstreamer is not aware of the restart, we could get an id that matches one in the cache, but // is for a different table. We then invalidate and recompute the plan for this id. - if plan == nil || plan.Table.Name == tm.Name { + isInternal := tm.Database == sidecar.GetName() + if plan == nil || + (plan.Table.Name == tm.Name && isInternal == plan.IsInternal) { return nil, nil } vs.plans[id] = nil log.Infof("table map changed: id %d for %s has changed to %s", id, plan.Table.Name, tm.Name) } - if tm.Database == sidecar.GetName() && tm.Name == "resharding_journal" { - // A journal is a special case that generates a JOURNAL event. - return nil, vs.buildJournalPlan(id, tm) - } else if tm.Database == sidecar.GetName() && tm.Name == "schema_version" && !vs.se.SkipMetaCheck { - // Generates a Version event when it detects that a schema is stored in the schema_version table. - return nil, vs.buildVersionPlan(id, tm) + // The database connector `vs.cp` points to the keyspace's database. + // If this is also setup as the sidecar database name, as is the case in the distributed transaction unit tests, + // for example, we stream all tables as usual. + // If not, we only stream the schema_version and journal tables and those specified in the internal_tables list. + if tm.Database == sidecar.GetName() && vs.cp.DBName() != sidecar.GetName() { + return vs.buildSidecarTablePlan(id, tm) } + if tm.Database != "" && tm.Database != vs.cp.DBName() { vs.plans[id] = nil return nil, nil @@ -674,72 +686,84 @@ func (vs *vstreamer) parseEvent(ev mysql.BinlogEvent) ([]*binlogdatapb.VEvent, e return vevents, nil } -func (vs *vstreamer) buildJournalPlan(id uint64, tm *mysql.TableMap) error { - conn, err := vs.cp.Connect(vs.ctx) - if err != nil { - return err - } - defer conn.Close() - qr, err := conn.ExecuteFetch(sqlparser.BuildParsedQuery("select * from %s.resharding_journal where 1 != 1", - sidecar.GetIdentifier()).Query, 1, true) - if err != nil { - return err - } - fields := qr.Fields - if len(fields) < len(tm.Types) { - return fmt.Errorf("cannot determine table columns for %s: event has %v, schema has %v", tm.Name, tm.Types, fields) - } - table := &Table{ - Name: fmt.Sprintf("%s.resharding_journal", sidecar.GetIdentifier()), - Fields: fields[:len(tm.Types)], - } - // Build a normal table plan, which means, return all rows - // and columns as is. Special handling is done when we actually - // receive the row event. We'll build a JOURNAL event instead. - plan, err := buildREPlan(vs.se.Environment(), table, nil, "") - if err != nil { - return err - } - vs.plans[id] = &streamerPlan{ - Plan: plan, - TableMap: tm, +func (vs *vstreamer) buildSidecarTablePlan(id uint64, tm *mysql.TableMap) ([]*binlogdatapb.VEvent, error) { + tableName := tm.Name + switch tableName { + case "resharding_journal": + // A journal is a special case that generates a JOURNAL event. + case "schema_version": + // Generates a Version event when it detects that a schema is stored in the schema_version table. + + // SkipMetaCheck is set during PITR restore: some table metadata is not fetched in that case. + if vs.se.SkipMetaCheck { + return nil, nil + } + default: + if vs.options == nil { + return nil, nil + } + found := false + for _, table := range vs.options.InternalTables { + if table == tableName { + found = true + break + } + } + if !found { + return nil, nil + } } - vs.journalTableID = id - return nil -} -func (vs *vstreamer) buildVersionPlan(id uint64, tm *mysql.TableMap) error { conn, err := vs.cp.Connect(vs.ctx) if err != nil { - return err + return nil, err } defer conn.Close() - qr, err := conn.ExecuteFetch(sqlparser.BuildParsedQuery("select * from %s.schema_version where 1 != 1", - sidecar.GetIdentifier()).Query, 1, true) + qr, err := conn.ExecuteFetch(sqlparser.BuildParsedQuery("select * from %s.%s where 1 != 1", + sidecar.GetIdentifier(), tableName).Query, 1, true) if err != nil { - return err + return nil, err } fields := qr.Fields if len(fields) < len(tm.Types) { - return fmt.Errorf("cannot determine table columns for %s: event has %v, schema has %v", tm.Name, tm.Types, fields) + return nil, fmt.Errorf("cannot determine table columns for %s: event has %v, schema has %v", tm.Name, tm.Types, fields) } table := &Table{ - Name: fmt.Sprintf("%s.schema_version", sidecar.GetIdentifier()), + Name: tableName, Fields: fields[:len(tm.Types)], } + // Build a normal table plan, which means, return all rows - // and columns as is. Special handling is done when we actually - // receive the row event. We'll build a JOURNAL event instead. + // and columns as is. Special handling may be done when we actually + // receive the row event, example: we'll build a JOURNAL or VERSION event instead. plan, err := buildREPlan(vs.se.Environment(), table, nil, "") if err != nil { - return err + return nil, err } + plan.IsInternal = true vs.plans[id] = &streamerPlan{ Plan: plan, TableMap: tm, } - vs.versionTableID = id - return nil + + var vevents []*binlogdatapb.VEvent + switch tm.Name { + case "resharding_journal": + vs.journalTableID = id + case "schema_version": + vs.versionTableID = id + default: + vevents = append(vevents, &binlogdatapb.VEvent{ + Type: binlogdatapb.VEventType_FIELD, + FieldEvent: &binlogdatapb.FieldEvent{ + TableName: tableName, + Fields: plan.fields(), + Keyspace: vs.vse.keyspace, + Shard: vs.vse.shard, + IsInternalTable: plan.IsInternal, + }}) + } + return vevents, nil } func (vs *vstreamer) buildTablePlan(id uint64, tm *mysql.TableMap) (*binlogdatapb.VEvent, error) { @@ -979,7 +1003,7 @@ func (vs *vstreamer) processRowEvent(vevents []*binlogdatapb.VEvent, plan *strea } if afterOK { rowChange.After = sqltypes.RowToProto3(afterValues) - if (vttablet.VReplicationExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagAllowNoBlobBinlogRowImage != 0) && + if (vs.config.ExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagAllowNoBlobBinlogRowImage != 0) && partial { rowChange.DataColumns = &binlogdatapb.RowChange_Bitmap{ @@ -994,11 +1018,12 @@ func (vs *vstreamer) processRowEvent(vevents []*binlogdatapb.VEvent, plan *strea vevents = append(vevents, &binlogdatapb.VEvent{ Type: binlogdatapb.VEventType_ROW, RowEvent: &binlogdatapb.RowEvent{ - TableName: plan.Table.Name, - RowChanges: rowChanges, - Keyspace: vs.vse.keyspace, - Shard: vs.vse.shard, - Flags: uint32(rows.Flags), + TableName: plan.Table.Name, + RowChanges: rowChanges, + Keyspace: vs.vse.keyspace, + Shard: vs.vse.shard, + Flags: uint32(rows.Flags), + IsInternalTable: plan.IsInternal, }, }) } @@ -1042,7 +1067,7 @@ func (vs *vstreamer) extractRowAndFilter(plan *streamerPlan, data []byte, dataCo partial := false for colNum := 0; colNum < dataColumns.Count(); colNum++ { if !dataColumns.Bit(colNum) { - if vttablet.VReplicationExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagAllowNoBlobBinlogRowImage == 0 { + if vs.config.ExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagAllowNoBlobBinlogRowImage == 0 { return false, nil, false, fmt.Errorf("partial row image encountered: ensure binlog_row_image is set to 'full'") } else { partial = true diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go index 8d0d182790e..c265fb45b85 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "io" + "slices" "strconv" "strings" "sync" @@ -51,10 +52,7 @@ func checkIfOptionIsSupported(t *testing.T, variable string) bool { qr, err := env.Mysqld.FetchSuperQuery(context.Background(), fmt.Sprintf("show variables like '%s'", variable)) require.NoError(t, err) require.NotNil(t, qr) - if qr.Rows != nil && len(qr.Rows) == 1 { - return true - } - return false + return len(qr.Rows) == 1 } // TestPlayerNoBlob sets up a new environment with mysql running with @@ -398,6 +396,98 @@ func TestMissingTables(t *testing.T) { runCases(t, filter, testcases, startPos, nil) } +// TestSidecarDBTables tests streaming of sidecar db tables. +func TestSidecarDBTables(t *testing.T) { + ts := &TestSpec{ + t: t, + ddls: []string{ + "create table t1(id11 int, id12 int, primary key(id11))", + "create table _vt.internal1(id int, primary key(id))", + "create table _vt.internal2(id int, primary key(id))", + }, + } + ts.Init() + defer func() { + execStatements(t, []string{ + "drop table _vt.internal1", + "drop table _vt.internal2", + }) + }() + defer ts.Close() + position := primaryPosition(t) + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "t1", + Filter: "select * from t1", + }}, + } + execStatements(t, []string{ + "insert into t1 values (1, 1)", + "insert into t1 values (2, 2)", + "insert into _vt.internal1 values (1)", + "insert into _vt.internal2 values (1)", + "insert into _vt.internal2 values (2)", + }) + options := &binlogdatapb.VStreamOptions{ + InternalTables: []string{"internal1", "internal2"}, + } + ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second)) + defer cancel() + wantRowEvents := map[string]int{ + "t1": 2, + "internal1": 1, + "internal2": 2, + } + gotRowEvents := make(map[string]int) + gotFieldEvents := make(map[string]int) + err := engine.Stream(ctx, position, nil, filter, "", func(events []*binlogdatapb.VEvent) error { + for _, ev := range events { + if ev.Type == binlogdatapb.VEventType_ROW { + gotRowEvents[ev.RowEvent.TableName]++ + require.Equal(t, slices.Contains(options.InternalTables, ev.RowEvent.TableName), ev.RowEvent.IsInternalTable) + } + if ev.Type == binlogdatapb.VEventType_FIELD { + require.Equal(t, slices.Contains(options.InternalTables, ev.FieldEvent.TableName), ev.FieldEvent.IsInternalTable) + gotFieldEvents[ev.FieldEvent.TableName]++ + } + } + return nil + }, options) + require.NoError(t, err) + require.EqualValues(t, wantRowEvents, gotRowEvents) + for k, v := range gotFieldEvents { + require.Equal(t, 1, v, "gotFieldEvents[%s] = %d", k, v) + } +} + +// TestVStreamMissingFieldsInLastPK tests that we error out if the lastpk for a table is missing the fields spec. +func TestVStreamMissingFieldsInLastPK(t *testing.T) { + ts := &TestSpec{ + t: t, + ddls: []string{ + "create table t1(id11 int, id12 int, primary key(id11))", + }, + } + ts.Init() + defer ts.Close() + + filter := &binlogdatapb.Filter{ + Rules: []*binlogdatapb.Rule{{ + Match: "t1", + Filter: "select * from t1", + }}, + } + var tablePKs []*binlogdatapb.TableLastPK + tablePKs = append(tablePKs, getTablePK("t1", 1)) + for _, tpk := range tablePKs { + tpk.Lastpk.Fields = nil + } + ctx := context.Background() + ch := make(chan []*binlogdatapb.VEvent) + err := vstream(ctx, t, "", tablePKs, filter, ch) + require.ErrorContains(t, err, "lastpk for table t1 has no fields defined") +} + func TestVStreamCopySimpleFlow(t *testing.T) { ts := &TestSpec{ t: t, @@ -408,7 +498,6 @@ func TestVStreamCopySimpleFlow(t *testing.T) { } ts.Init() defer ts.Close() - log.Infof("Pos before bulk insert: %s", primaryPosition(t)) insertSomeRows(t, 10) log.Infof("Pos after bulk insert: %s", primaryPosition(t)) @@ -636,11 +725,11 @@ func TestVStreamCopyWithDifferentFilters(t *testing.T) { return io.EOF } return nil - }) + }, nil) }() wg.Wait() if errGoroutine != nil { - t.Fatalf(errGoroutine.Error()) + t.Fatal(errGoroutine.Error()) } } @@ -1460,7 +1549,7 @@ func TestBestEffortNameInFieldEvent(t *testing.T) { // todo: migrate to new framework // test that vstreamer ignores tables created by OnlineDDL -func TestInternalTables(t *testing.T) { +func TestOnlineDDLTables(t *testing.T) { if version.GoOS == "darwin" { t.Skip("internal online ddl table matching doesn't work on Mac because it is case insensitive") } @@ -1736,7 +1825,7 @@ func TestMinimalMode(t *testing.T) { engine = oldEngine env = oldEnv }() - err := engine.Stream(context.Background(), "current", nil, nil, throttlerapp.VStreamerName, func(evs []*binlogdatapb.VEvent) error { return nil }) + err := engine.Stream(context.Background(), "current", nil, nil, throttlerapp.VStreamerName, func(evs []*binlogdatapb.VEvent) error { return nil }, nil) require.Error(t, err, "minimal binlog_row_image is not supported by Vitess VReplication") } diff --git a/go/vt/vttablet/tabletservermock/controller.go b/go/vt/vttablet/tabletservermock/controller.go index 7c7055b3e15..9e97c033776 100644 --- a/go/vt/vttablet/tabletservermock/controller.go +++ b/go/vt/vttablet/tabletservermock/controller.go @@ -91,6 +91,8 @@ type Controller struct { // queryRulesMap has the latest query rules. queryRulesMap map[string]*rules.Rules + + MethodCalled map[string]bool } // NewController returns a mock of tabletserver.Controller @@ -101,6 +103,7 @@ func NewController() *Controller { BroadcastData: make(chan *BroadcastData, 10), StateChanges: make(chan *StateChange, 10), queryRulesMap: make(map[string]*rules.Rules), + MethodCalled: make(map[string]bool), } } @@ -226,6 +229,44 @@ func (tqsc *Controller) GetThrottlerStatus(ctx context.Context) *throttle.Thrott return nil } +// RedoPreparedTransactions is part of the tabletserver.Controller interface +func (tqsc *Controller) RedoPreparedTransactions() {} + +// SetTwoPCAllowed sets whether TwoPC is allowed or not. It also takes the reason of why it is being set. +// The reason should be an enum value defined in the tabletserver. +func (tqsc *Controller) SetTwoPCAllowed(int, bool) { +} + +// UnresolvedTransactions is part of the tabletserver.Controller interface +func (tqsc *Controller) UnresolvedTransactions(context.Context, *querypb.Target, int64) ([]*querypb.TransactionMetadata, error) { + tqsc.MethodCalled["UnresolvedTransactions"] = true + return nil, nil +} + +// ReadTransaction is part of the tabletserver.Controller interface +func (tqsc *Controller) ReadTransaction(ctx context.Context, target *querypb.Target, dtid string) (*querypb.TransactionMetadata, error) { + tqsc.MethodCalled["ReadTransaction"] = true + return nil, nil +} + +// ConcludeTransaction is part of the tabletserver.Controller interface +func (tqsc *Controller) ConcludeTransaction(context.Context, *querypb.Target, string) error { + tqsc.MethodCalled["ConcludeTransaction"] = true + return nil +} + +// RollbackPrepared is part of the tabletserver.Controller interface +func (tqsc *Controller) RollbackPrepared(context.Context, *querypb.Target, string, int64) error { + tqsc.MethodCalled["RollbackPrepared"] = true + return nil +} + +// WaitForPreparedTwoPCTransactions is part of the tabletserver.Controller interface +func (tqsc *Controller) WaitForPreparedTwoPCTransactions(context.Context) error { + tqsc.MethodCalled["WaitForPreparedTwoPCTransactions"] = true + return nil +} + // EnterLameduck implements tabletserver.Controller. func (tqsc *Controller) EnterLameduck() { tqsc.mu.Lock() diff --git a/go/vt/vttablet/tmclient/rpc_client_api.go b/go/vt/vttablet/tmclient/rpc_client_api.go index 7da1a6196dd..0cc1f9ec979 100644 --- a/go/vt/vttablet/tmclient/rpc_client_api.go +++ b/go/vt/vttablet/tmclient/rpc_client_api.go @@ -91,6 +91,9 @@ type TabletManagerClient interface { // SetReadWrite makes the mysql instance read-write SetReadWrite(ctx context.Context, tablet *topodatapb.Tablet) error + // ChangeTags asks the remote tablet to change its tags + ChangeTags(ctx context.Context, tablet *topodatapb.Tablet, tabletTags map[string]string, replace bool) (*tabletmanagerdatapb.ChangeTagsResponse, error) + // ChangeType asks the remote tablet to change its type ChangeType(ctx context.Context, tablet *topodatapb.Tablet, dbType topodatapb.TabletType, semiSync bool) error @@ -146,6 +149,22 @@ type TabletManagerClient interface { // query faster. Close() should close the pool in that case. ExecuteFetchAsApp(ctx context.Context, tablet *topodatapb.Tablet, usePool bool, req *tabletmanagerdatapb.ExecuteFetchAsAppRequest) (*querypb.QueryResult, error) + // + // Distributed Transaction related methods + // + + // GetUnresolvedTransactions returns the list of unresolved transactions for the tablet. + GetUnresolvedTransactions(ctx context.Context, tablet *topodatapb.Tablet) ([]*querypb.TransactionMetadata, error) + + // ReadTransaction returns the metadata for the specified distributed transaction ID. + ReadTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string) (*querypb.TransactionMetadata, error) + + // ConcludeTransaction conclude the transaction on the tablet. + ConcludeTransaction(ctx context.Context, tablet *topodatapb.Tablet, dtid string, mm bool) error + + // MysqlHostMetrics returns mysql system metrics + MysqlHostMetrics(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.MysqlHostMetricsRequest) (*tabletmanagerdatapb.MysqlHostMetricsResponse, error) + // // Replication related methods // @@ -186,12 +205,14 @@ type TabletManagerClient interface { // CreateVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.CreateVReplicationWorkflowRequest) (*tabletmanagerdatapb.CreateVReplicationWorkflowResponse, error) + DeleteTableData(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.DeleteTableDataRequest) (*tabletmanagerdatapb.DeleteTableDataResponse, error) DeleteVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (*tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, error) HasVReplicationWorkflows(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.HasVReplicationWorkflowsRequest) (*tabletmanagerdatapb.HasVReplicationWorkflowsResponse, error) ReadVReplicationWorkflows(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.ReadVReplicationWorkflowsRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowsResponse, error) ReadVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.ReadVReplicationWorkflowRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowResponse, error) UpdateVReplicationWorkflow(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.UpdateVReplicationWorkflowRequest) (*tabletmanagerdatapb.UpdateVReplicationWorkflowResponse, error) UpdateVReplicationWorkflows(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest) (*tabletmanagerdatapb.UpdateVReplicationWorkflowsResponse, error) + ValidateVReplicationPermissions(ctx context.Context, tablet *topodatapb.Tablet, request *tabletmanagerdatapb.ValidateVReplicationPermissionsRequest) (*tabletmanagerdatapb.ValidateVReplicationPermissionsResponse, error) // VReplicationExec executes a VReplication command VReplicationExec(ctx context.Context, tablet *topodatapb.Tablet, query string) (*querypb.QueryResult, error) VReplicationWaitForPos(ctx context.Context, tablet *topodatapb.Tablet, id int32, pos string) error @@ -215,6 +236,9 @@ type TabletManagerClient interface { // its reparent_journal table. PopulateReparentJournal(ctx context.Context, tablet *topodatapb.Tablet, timeCreatedNS int64, actionName string, tabletAlias *topodatapb.TabletAlias, pos string) error + // ReadReparentJournalInfo reads the information from reparent journal + ReadReparentJournalInfo(ctx context.Context, tablet *topodatapb.Tablet) (int, error) + // InitReplica tells a tablet to start replicating from the // passed in primary tablet alias, and wait for the row in the // reparent_journal table. diff --git a/go/vt/vttablet/tmrpctest/test_tm_rpc.go b/go/vt/vttablet/tmrpctest/test_tm_rpc.go index 9ba01b13d5a..08dbb78ba64 100644 --- a/go/vt/vttablet/tmrpctest/test_tm_rpc.go +++ b/go/vt/vttablet/tmrpctest/test_tm_rpc.go @@ -26,6 +26,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" "vitess.io/vitess/go/mysql/replication" @@ -56,47 +57,57 @@ type fakeRPCTM struct { } func (fra *fakeRPCTM) CreateVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.CreateVReplicationWorkflowRequest) (*tabletmanagerdatapb.CreateVReplicationWorkflowResponse, error) { - //TODO implement me + // TODO implement me + panic("implement me") +} + +func (fra *fakeRPCTM) DeleteTableData(ctx context.Context, req *tabletmanagerdatapb.DeleteTableDataRequest) (*tabletmanagerdatapb.DeleteTableDataResponse, error) { + // TODO implement me panic("implement me") } func (fra *fakeRPCTM) DeleteVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.DeleteVReplicationWorkflowRequest) (*tabletmanagerdatapb.DeleteVReplicationWorkflowResponse, error) { - //TODO implement me + // TODO implement me panic("implement me") } func (fra *fakeRPCTM) HasVReplicationWorkflows(ctx context.Context, req *tabletmanagerdatapb.HasVReplicationWorkflowsRequest) (*tabletmanagerdatapb.HasVReplicationWorkflowsResponse, error) { - //TODO implement me + // TODO implement me panic("implement me") } func (fra *fakeRPCTM) ReadVReplicationWorkflows(ctx context.Context, req *tabletmanagerdatapb.ReadVReplicationWorkflowsRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowsResponse, error) { - //TODO implement me + // TODO implement me panic("implement me") } func (fra *fakeRPCTM) ReadVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.ReadVReplicationWorkflowRequest) (*tabletmanagerdatapb.ReadVReplicationWorkflowResponse, error) { - //TODO implement me + // TODO implement me panic("implement me") } func (fra *fakeRPCTM) UpdateVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.UpdateVReplicationWorkflowRequest) (*tabletmanagerdatapb.UpdateVReplicationWorkflowResponse, error) { - //TODO implement me + // TODO implement me panic("implement me") } func (fra *fakeRPCTM) UpdateVReplicationWorkflows(ctx context.Context, req *tabletmanagerdatapb.UpdateVReplicationWorkflowsRequest) (*tabletmanagerdatapb.UpdateVReplicationWorkflowsResponse, error) { - //TODO implement me + // TODO implement me panic("implement me") } func (fra *fakeRPCTM) ResetSequences(ctx context.Context, tables []string) error { - //TODO implement me + // TODO implement me + panic("implement me") +} + +func (fra *fakeRPCTM) ValidateVReplicationPermissions(ctx context.Context, req *tabletmanagerdatapb.ValidateVReplicationPermissionsRequest) (*tabletmanagerdatapb.ValidateVReplicationPermissionsResponse, error) { + // TODO implement me panic("implement me") } func (fra *fakeRPCTM) VDiff(ctx context.Context, req *tabletmanagerdatapb.VDiffRequest) (*tabletmanagerdatapb.VDiffResponse, error) { - //TODO implement me + // TODO implement me panic("implement me") } @@ -108,6 +119,11 @@ func (fra *fakeRPCTM) UnlockTables(ctx context.Context) error { panic("implement me") } +func (fra *fakeRPCTM) MysqlHostMetrics(ctx context.Context, req *tabletmanagerdatapb.MysqlHostMetricsRequest) (*tabletmanagerdatapb.MysqlHostMetricsResponse, error) { + // TODO implement me + panic("implement me") +} + func (fra *fakeRPCTM) setSlow(slow bool) { fra.mu.Lock() fra.slow = slow @@ -404,6 +420,26 @@ func tmRPCTestGetGlobalStatusVarsPanic(ctx context.Context, t *testing.T, client expectHandleRPCPanic(t, "GetGlobalStatusVars", false /*verbose*/, err) } +func tmRPCTestGetUnresolvedTransactions(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { + _, err := client.GetUnresolvedTransactions(ctx, tablet) + require.NoError(t, err) +} + +func tmRPCTestGetUnresolvedTransactionsPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { + _, err := client.GetUnresolvedTransactions(ctx, tablet) + expectHandleRPCPanic(t, "GetUnresolvedTransactions", false /*verbose*/, err) +} + +func tmRPCTestReadTransaction(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { + _, err := client.ReadTransaction(ctx, tablet, "aa") + require.NoError(t, err) +} + +func tmRPCTestReadTransactionPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { + _, err := client.ReadTransaction(ctx, tablet, "aa") + expectHandleRPCPanic(t, "ReadTransaction", false /*verbose*/, err) +} + // // Various read-write methods // @@ -440,6 +476,30 @@ func tmRPCTestSetReadOnlyPanic(ctx context.Context, t *testing.T, client tmclien expectHandleRPCPanic(t, "SetReadWrite", true /*verbose*/, err) } +var testChangeTagsValue = map[string]string{ + "test": "12345", +} + +func (fra *fakeRPCTM) ChangeTags(ctx context.Context, tabletTags map[string]string, replace bool) (map[string]string, error) { + if fra.panics { + panic(fmt.Errorf("test-triggered panic")) + } + compare(fra.t, "ChangeTags tabletType", tabletTags, testChangeTagsValue) + return tabletTags, nil +} + +func tmRPCTestChangeTags(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { + _, err := client.ChangeTags(ctx, tablet, testChangeTagsValue, false) + if err != nil { + t.Errorf("ChangeTags failed: %v", err) + } +} + +func tmRPCTestChangeTagsPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { + _, err := client.ChangeTags(ctx, tablet, testChangeTagsValue, false) + expectHandleRPCPanic(t, "ChangeTags", true /*verbose*/, err) +} + var testChangeTypeValue = topodatapb.TabletType_REPLICA func (fra *fakeRPCTM) ChangeType(ctx context.Context, tabletType topodatapb.TabletType, semiSync bool) error { @@ -726,6 +786,27 @@ func (fra *fakeRPCTM) ExecuteFetchAsApp(ctx context.Context, req *tabletmanagerd return testExecuteFetchResult, nil } +func (fra *fakeRPCTM) GetUnresolvedTransactions(ctx context.Context, abandonAgeSeconds int64) ([]*querypb.TransactionMetadata, error) { + if fra.panics { + panic(fmt.Errorf("test-triggered panic")) + } + return nil, nil +} + +func (fra *fakeRPCTM) ReadTransaction(ctx context.Context, req *tabletmanagerdatapb.ReadTransactionRequest) (*querypb.TransactionMetadata, error) { + if fra.panics { + panic(fmt.Errorf("test-triggered panic")) + } + return nil, nil +} + +func (fra *fakeRPCTM) ConcludeTransaction(ctx context.Context, req *tabletmanagerdatapb.ConcludeTransactionRequest) error { + if fra.panics { + panic(fmt.Errorf("test-triggered panic")) + } + return nil +} + func tmRPCTestExecuteFetch(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { // using pool qr, err := client.ExecuteFetchAsDba(ctx, tablet, true, &tabletmanagerdatapb.ExecuteFetchAsDbaRequest{ @@ -1081,6 +1162,15 @@ func (fra *fakeRPCTM) PopulateReparentJournal(ctx context.Context, timeCreatedNS return nil } +var testReparentJournalLen = 10 + +func (fra *fakeRPCTM) ReadReparentJournalInfo(context.Context) (int, error) { + if fra.panics { + panic(fmt.Errorf("test-triggered panic")) + } + return testReparentJournalLen, nil +} + func tmRPCTestPopulateReparentJournal(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.PopulateReparentJournal(ctx, tablet, testTimeCreatedNS, testActionName, testPrimaryAlias, testReplicationPosition) compareError(t, "PopulateReparentJournal", err, true, testPopulateReparentJournalCalled) @@ -1091,6 +1181,16 @@ func tmRPCTestPopulateReparentJournalPanic(ctx context.Context, t *testing.T, cl expectHandleRPCPanic(t, "PopulateReparentJournal", true /*verbose*/, err) } +func tmRPCTestReadReparentJournalInfo(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { + length, err := client.ReadReparentJournalInfo(ctx, tablet) + compareError(t, "ReadReparentJournalInfo", err, length, testReparentJournalLen) +} + +func tmRPCTestReadReparentJournalInfoPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { + _, err := client.ReadReparentJournalInfo(ctx, tablet) + expectHandleRPCPanic(t, "ReadReparentJournalInfo", true /*verbose*/, err) +} + func tmRPCTestWaitForPositionPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { err := client.WaitForPosition(ctx, tablet, testReplicationPosition) expectHandleRPCPanic(t, "WaitForPosition", true /*verbose*/, err) @@ -1348,7 +1448,7 @@ func (fra *fakeRPCTM) CheckThrottler(ctx context.Context, req *tabletmanagerdata panic(fmt.Errorf("test-triggered panic")) } - //TODO implement me + // TODO implement me panic("implement me") } @@ -1357,7 +1457,7 @@ func (fra *fakeRPCTM) GetThrottlerStatus(ctx context.Context, req *tabletmanager panic(fmt.Errorf("test-triggered panic")) } - //TODO implement me + // TODO implement me panic("implement me") } @@ -1424,6 +1524,8 @@ func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.T tmRPCTestGetSchema(ctx, t, client, tablet) tmRPCTestGetPermissions(ctx, t, client, tablet) tmRPCTestGetGlobalStatusVars(ctx, t, client, tablet) + tmRPCTestGetUnresolvedTransactions(ctx, t, client, tablet) + tmRPCTestReadTransaction(ctx, t, client, tablet) // Various read-write methods tmRPCTestSetReadOnly(ctx, t, client, tablet) @@ -1457,6 +1559,7 @@ func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.T tmRPCTestResetReplication(ctx, t, client, tablet) tmRPCTestInitPrimary(ctx, t, client, tablet) tmRPCTestPopulateReparentJournal(ctx, t, client, tablet) + tmRPCTestReadReparentJournalInfo(ctx, t, client, tablet) tmRPCTestDemotePrimary(ctx, t, client, tablet) tmRPCTestUndoDemotePrimary(ctx, t, client, tablet) tmRPCTestSetReplicationSource(ctx, t, client, tablet) @@ -1485,6 +1588,8 @@ func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.T tmRPCTestGetSchemaPanic(ctx, t, client, tablet) tmRPCTestGetPermissionsPanic(ctx, t, client, tablet) tmRPCTestGetGlobalStatusVarsPanic(ctx, t, client, tablet) + tmRPCTestGetUnresolvedTransactionsPanic(ctx, t, client, tablet) + tmRPCTestReadTransactionPanic(ctx, t, client, tablet) // Various read-write methods tmRPCTestSetReadOnlyPanic(ctx, t, client, tablet) @@ -1514,6 +1619,7 @@ func Run(t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.T tmRPCTestResetReplicationPanic(ctx, t, client, tablet) tmRPCTestInitPrimaryPanic(ctx, t, client, tablet) tmRPCTestPopulateReparentJournalPanic(ctx, t, client, tablet) + tmRPCTestReadReparentJournalInfoPanic(ctx, t, client, tablet) tmRPCTestWaitForPositionPanic(ctx, t, client, tablet) tmRPCTestDemotePrimaryPanic(ctx, t, client, tablet) tmRPCTestUndoDemotePrimaryPanic(ctx, t, client, tablet) diff --git a/go/vt/vttest/local_cluster.go b/go/vt/vttest/local_cluster.go index 406269ef749..576a78bb761 100644 --- a/go/vt/vttest/local_cluster.go +++ b/go/vt/vttest/local_cluster.go @@ -292,6 +292,15 @@ func (db *LocalCluster) MySQLConnParams() mysql.ConnParams { return connParams } +func (db *LocalCluster) MySQLTCPConnParams() mysql.ConnParams { + connParams := db.mysql.Params(db.DbName()) + _, port := db.mysql.Address() + connParams.UnixSocket = "" + connParams.Host = "127.0.0.1" + connParams.Port = port + return connParams +} + // MySQLAppDebugConnParams returns a mysql.ConnParams struct that can be used // to connect directly to the mysqld service in the self-contained cluster, // using the appdebug user. It's valid only if you used MySQLOnly option. diff --git a/go/vt/wrangler/fake_dbclient_test.go b/go/vt/wrangler/fake_dbclient_test.go index 7fce5ce9afc..14ef0913383 100644 --- a/go/vt/wrangler/fake_dbclient_test.go +++ b/go/vt/wrangler/fake_dbclient_test.go @@ -25,10 +25,10 @@ import ( "github.com/stretchr/testify/assert" + "vitess.io/vitess/go/mysql/capabilities" + "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/sqlparser" - - "vitess.io/vitess/go/sqltypes" ) func verifyQueries(t *testing.T, dcs []*fakeDBClient) { @@ -177,6 +177,10 @@ func (dc *fakeDBClient) ExecuteFetchMulti(query string, maxrows int) ([]*sqltype return results, nil } +func (dc *fakeDBClient) SupportsCapability(capability capabilities.FlavorCapability) (bool, error) { + return false, nil +} + // ExecuteFetch is part of the DBClient interface func (dc *fakeDBClient) executeFetch(query string, maxrows int) (*sqltypes.Result, error) { if dbrs := dc.queries[query]; dbrs != nil { diff --git a/go/vt/wrangler/keyspace.go b/go/vt/wrangler/keyspace.go index a5f7d6ae0bf..98551a084c9 100644 --- a/go/vt/wrangler/keyspace.go +++ b/go/vt/wrangler/keyspace.go @@ -19,6 +19,7 @@ package wrangler import ( "bytes" "context" + "errors" "fmt" "sync" "time" @@ -82,7 +83,7 @@ func (wr *Wrangler) validateNewWorkflow(ctx context.Context, keyspace, workflow return } if p3qr != nil && len(p3qr.Rows) != 0 { - allErrors.RecordError(vterrors.Wrap(fmt.Errorf(validation.msg), "validateWorkflowName.VReplicationExec")) + allErrors.RecordError(vterrors.Wrap(errors.New(validation.msg), "validateWorkflowName.VReplicationExec")) return } } diff --git a/go/vt/wrangler/materializer.go b/go/vt/wrangler/materializer.go index 9367c43c310..7e24945cde7 100644 --- a/go/vt/wrangler/materializer.go +++ b/go/vt/wrangler/materializer.go @@ -18,6 +18,7 @@ package wrangler import ( "context" + "errors" "fmt" "hash/fnv" "math" @@ -355,7 +356,7 @@ func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, ta migrationID, strings.Join(tablets, ",")) msg += fmt.Sprintf("please review and delete it before proceeding and restart the workflow using the Workflow %s.%s start", workflow, targetKeyspace) - return fmt.Errorf(msg) + return errors.New(msg) } } if autoStart { @@ -1397,7 +1398,19 @@ func (mz *materializer) generateInserts(ctx context.Context, sourceShards []*top for _, mappedCol := range mappedCols { subExprs = append(subExprs, mappedCol) } - vindexName := fmt.Sprintf("%s.%s", mz.ms.TargetKeyspace, cv.Name) + var vindexName string + if mz.getWorkflowType() == binlogdatapb.VReplicationWorkflowType_Migrate { + // For a Migrate, if the TargetKeyspace name is different from the SourceKeyspace name, we need to use the + // SourceKeyspace name to determine the vindex since the TargetKeyspace name is not known to the source. + // Note: it is expected that the source and target keyspaces have the same vindex name and data type. + keyspace := mz.ms.TargetKeyspace + if mz.ms.ExternalCluster != "" { + keyspace = mz.ms.SourceKeyspace + } + vindexName = fmt.Sprintf("%s.%s", keyspace, cv.Name) + } else { + vindexName = fmt.Sprintf("%s.%s", mz.ms.TargetKeyspace, cv.Name) + } subExprs = append(subExprs, sqlparser.NewStrLiteral(vindexName)) subExprs = append(subExprs, sqlparser.NewStrLiteral("{{.keyrange}}")) inKeyRange := &sqlparser.FuncExpr{ @@ -1442,7 +1455,7 @@ func (mz *materializer) generateInserts(ctx context.Context, sourceShards []*top ig.AddRow(mz.ms.Workflow, bls, "", mz.ms.Cell, tabletTypeStr, workflowType, workflowSubType, - mz.ms.DeferSecondaryKeys, + mz.ms.DeferSecondaryKeys, "", ) } return ig.String(), nil diff --git a/go/vt/wrangler/resharder.go b/go/vt/wrangler/resharder.go index 536f4c643cc..b041ce32041 100644 --- a/go/vt/wrangler/resharder.go +++ b/go/vt/wrangler/resharder.go @@ -341,7 +341,7 @@ func (rs *resharder) createStreams(ctx context.Context) error { ig.AddRow(rs.workflow, bls, "", rs.cell, rs.tabletTypes, binlogdatapb.VReplicationWorkflowType_Reshard, binlogdatapb.VReplicationWorkflowSubType_None, - rs.deferSecondaryKeys) + rs.deferSecondaryKeys, "") } for _, rstream := range rs.refStreams { @@ -349,7 +349,7 @@ func (rs *resharder) createStreams(ctx context.Context) error { //todo: fix based on original stream binlogdatapb.VReplicationWorkflowType_Reshard, binlogdatapb.VReplicationWorkflowSubType_None, - rs.deferSecondaryKeys) + rs.deferSecondaryKeys, "") } query := ig.String() if _, err := rs.wr.tmc.VReplicationExec(ctx, targetPrimary.Tablet, query); err != nil { diff --git a/go/vt/wrangler/testlib/backup_test.go b/go/vt/wrangler/testlib/backup_test.go index 5e73d266705..cb61c4bab99 100644 --- a/go/vt/wrangler/testlib/backup_test.go +++ b/go/vt/wrangler/testlib/backup_test.go @@ -37,7 +37,6 @@ import ( "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/mysqlctl/backupstorage" "vitess.io/vitess/go/vt/mysqlctl/filebackupstorage" - "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/topo/topoproto" "vitess.io/vitess/go/vt/vtenv" @@ -150,7 +149,7 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { primary := NewFakeTablet(t, wr, "cell1", 0, topodatapb.TabletType_PRIMARY, db) primary.FakeMysqlDaemon.ReadOnly = false primary.FakeMysqlDaemon.Replicating = false - primary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -158,7 +157,7 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { Sequence: 457, }, }, - } + }) // start primary so that replica can fetch primary position from it primary.StartActionLoop(t, wr) @@ -170,7 +169,7 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { sourceTablet.FakeMysqlDaemon.ReadOnly = true sourceTablet.FakeMysqlDaemon.Replicating = true sourceTablet.FakeMysqlDaemon.SetReplicationSourceInputs = []string{fmt.Sprintf("%s:%d", primary.Tablet.MysqlHostname, primary.Tablet.MysqlPort)} - sourceTablet.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + sourceTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -178,7 +177,7 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { Sequence: 457, }, }, - } + }) sourceTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These 3 statements come from tablet startup "STOP REPLICA", @@ -221,7 +220,7 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { destTablet := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, db) destTablet.FakeMysqlDaemon.ReadOnly = true destTablet.FakeMysqlDaemon.Replicating = true - destTablet.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + destTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -229,7 +228,7 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { Sequence: 457, }, }, - } + }) destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These 3 statements come from tablet startup "STOP REPLICA", @@ -248,7 +247,7 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { destTablet.FakeMysqlDaemon.FetchSuperQueryMap = map[string]*sqltypes.Result{ "SHOW DATABASES": {}, } - destTablet.FakeMysqlDaemon.SetReplicationPositionPos = sourceTablet.FakeMysqlDaemon.CurrentPrimaryPosition + destTablet.FakeMysqlDaemon.SetReplicationPositionPos = sourceTablet.FakeMysqlDaemon.GetPrimaryPositionLocked() destTablet.FakeMysqlDaemon.SetReplicationSourceInputs = append(destTablet.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) destTablet.StartActionLoop(t, wr) @@ -264,7 +263,7 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { RelayLogInfoPath: path.Join(root, "relay-log.info"), } - err = destTablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* backupTime */, time.Time{} /* restoreToTimestamp */, "", mysqlShutdownTimeout) + err = destTablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* backupTime */, time.Time{} /* restoreToTimestamp */, "" /* restoreToPos */, []string{} /* ignoreBackupEngines */, mysqlShutdownTimeout) if err != nil { return err } @@ -301,10 +300,10 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { "START REPLICA", } - primary.FakeMysqlDaemon.SetReplicationPositionPos = primary.FakeMysqlDaemon.CurrentPrimaryPosition + primary.FakeMysqlDaemon.SetReplicationPositionPos = primary.FakeMysqlDaemon.GetPrimaryPositionLocked() // restore primary from latest backup - require.NoError(t, primary.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* restoreFromBackupTs */, time.Time{} /* restoreToTimestamp */, "", mysqlShutdownTimeout), + require.NoError(t, primary.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* restoreFromBackupTs */, time.Time{} /* restoreToTimestamp */, "" /* restoreToPos */, []string{} /* ignoreBackupEngines */, mysqlShutdownTimeout), "RestoreData failed") // tablet was created as PRIMARY, so it's baseTabletType is PRIMARY assert.Equal(t, topodatapb.TabletType_PRIMARY, primary.Tablet.Type) @@ -320,7 +319,7 @@ func testBackupRestore(t *testing.T, cDetails *compressionDetails) error { } // Test restore with the backup timestamp - require.NoError(t, primary.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, backupTime, time.Time{} /* restoreToTimestamp */, "", mysqlShutdownTimeout), + require.NoError(t, primary.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, backupTime, time.Time{} /* restoreToTimestamp */, "" /* restoreToPos */, []string{} /* ignoreBackupEngines */, mysqlShutdownTimeout), "RestoreData with backup timestamp failed") assert.Equal(t, topodatapb.TabletType_PRIMARY, primary.Tablet.Type) assert.False(t, primary.FakeMysqlDaemon.Replicating) @@ -388,7 +387,7 @@ func TestBackupRestoreLagged(t *testing.T) { primary := NewFakeTablet(t, wr, "cell1", 0, topodatapb.TabletType_PRIMARY, db) primary.FakeMysqlDaemon.ReadOnly = false primary.FakeMysqlDaemon.Replicating = false - primary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -396,7 +395,7 @@ func TestBackupRestoreLagged(t *testing.T) { Sequence: 457, }, }, - } + }) // start primary so that replica can fetch primary position from it primary.StartActionLoop(t, wr) @@ -407,7 +406,7 @@ func TestBackupRestoreLagged(t *testing.T) { sourceTablet := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_REPLICA, db) sourceTablet.FakeMysqlDaemon.ReadOnly = true sourceTablet.FakeMysqlDaemon.Replicating = true - sourceTablet.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + sourceTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -415,7 +414,7 @@ func TestBackupRestoreLagged(t *testing.T) { Sequence: 456, }, }, - } + }) sourceTablet.FakeMysqlDaemon.SetReplicationSourceInputs = []string{fmt.Sprintf("%s:%d", primary.Tablet.MysqlHostname, primary.Tablet.MysqlPort)} sourceTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These 3 statements come from tablet startup @@ -449,7 +448,7 @@ func TestBackupRestoreLagged(t *testing.T) { timer := time.NewTicker(1 * time.Second) <-timer.C - sourceTablet.FakeMysqlDaemon.CurrentPrimaryPositionLocked(replication.Position{ + sourceTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -468,7 +467,7 @@ func TestBackupRestoreLagged(t *testing.T) { require.NoError(t, sourceTablet.FakeMysqlDaemon.CheckSuperQueryList()) assert.True(t, sourceTablet.FakeMysqlDaemon.Replicating) assert.True(t, sourceTablet.FakeMysqlDaemon.Running) - assert.Equal(t, primary.FakeMysqlDaemon.CurrentPrimaryPosition, sourceTablet.FakeMysqlDaemon.CurrentPrimaryPosition) + assert.Equal(t, primary.FakeMysqlDaemon.GetPrimaryPositionLocked(), sourceTablet.FakeMysqlDaemon.GetPrimaryPositionLocked()) case <-timer2.C: require.FailNow(t, "Backup timed out") } @@ -477,7 +476,7 @@ func TestBackupRestoreLagged(t *testing.T) { destTablet := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, db) destTablet.FakeMysqlDaemon.ReadOnly = true destTablet.FakeMysqlDaemon.Replicating = true - destTablet.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + destTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -485,7 +484,7 @@ func TestBackupRestoreLagged(t *testing.T) { Sequence: 456, }, }, - } + }) destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These 3 statements come from tablet startup "STOP REPLICA", @@ -504,7 +503,7 @@ func TestBackupRestoreLagged(t *testing.T) { destTablet.FakeMysqlDaemon.FetchSuperQueryMap = map[string]*sqltypes.Result{ "SHOW DATABASES": {}, } - destTablet.FakeMysqlDaemon.SetReplicationPositionPos = destTablet.FakeMysqlDaemon.CurrentPrimaryPosition + destTablet.FakeMysqlDaemon.SetReplicationPositionPos = destTablet.FakeMysqlDaemon.GetPrimaryPositionLocked() destTablet.FakeMysqlDaemon.SetReplicationSourceInputs = append(destTablet.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) destTablet.StartActionLoop(t, wr) @@ -522,12 +521,12 @@ func TestBackupRestoreLagged(t *testing.T) { errCh = make(chan error, 1) go func(ctx context.Context, tablet *FakeTablet) { - errCh <- tablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* restoreFromBackupTs */, time.Time{} /* restoreToTimestamp */, "", mysqlShutdownTimeout) + errCh <- tablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* restoreFromBackupTs */, time.Time{} /* restoreToTimestamp */, "" /* restoreToPos */, []string{} /* ignoreBackupEngines */, mysqlShutdownTimeout) }(ctx, destTablet) timer = time.NewTicker(1 * time.Second) <-timer.C - destTablet.FakeMysqlDaemon.CurrentPrimaryPositionLocked(replication.Position{ + destTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -545,7 +544,7 @@ func TestBackupRestoreLagged(t *testing.T) { require.NoError(t, destTablet.FakeMysqlDaemon.CheckSuperQueryList(), "destTablet.FakeMysqlDaemon.CheckSuperQueryList failed") assert.True(t, destTablet.FakeMysqlDaemon.Replicating) assert.True(t, destTablet.FakeMysqlDaemon.Running) - assert.Equal(t, primary.FakeMysqlDaemon.CurrentPrimaryPosition, destTablet.FakeMysqlDaemon.CurrentPrimaryPosition) + assert.Equal(t, primary.FakeMysqlDaemon.GetPrimaryPositionLocked(), destTablet.FakeMysqlDaemon.GetPrimaryPositionLocked()) case <-timer2.C: require.FailNow(t, "Restore timed out") } @@ -608,7 +607,7 @@ func TestRestoreUnreachablePrimary(t *testing.T) { primary := NewFakeTablet(t, wr, "cell1", 0, topodatapb.TabletType_PRIMARY, db) primary.FakeMysqlDaemon.ReadOnly = false primary.FakeMysqlDaemon.Replicating = false - primary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -616,7 +615,7 @@ func TestRestoreUnreachablePrimary(t *testing.T) { Sequence: 457, }, }, - } + }) // start primary so that replica can fetch primary position from it primary.StartActionLoop(t, wr) @@ -626,7 +625,7 @@ func TestRestoreUnreachablePrimary(t *testing.T) { sourceTablet := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_REPLICA, db) sourceTablet.FakeMysqlDaemon.ReadOnly = true sourceTablet.FakeMysqlDaemon.Replicating = true - sourceTablet.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + sourceTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -634,7 +633,7 @@ func TestRestoreUnreachablePrimary(t *testing.T) { Sequence: 457, }, }, - } + }) sourceTablet.FakeMysqlDaemon.SetReplicationSourceInputs = []string{fmt.Sprintf("%s:%d", primary.Tablet.MysqlHostname, primary.Tablet.MysqlPort)} sourceTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These 3 statements come from tablet startup @@ -668,7 +667,7 @@ func TestRestoreUnreachablePrimary(t *testing.T) { destTablet := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, db) destTablet.FakeMysqlDaemon.ReadOnly = true destTablet.FakeMysqlDaemon.Replicating = true - destTablet.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + destTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -676,7 +675,7 @@ func TestRestoreUnreachablePrimary(t *testing.T) { Sequence: 457, }, }, - } + }) destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These 3 statements come from tablet startup "STOP REPLICA", @@ -688,14 +687,11 @@ func TestRestoreUnreachablePrimary(t *testing.T) { "FAKE RESET REPLICA ALL", "FAKE RESET BINARY LOGS AND GTIDS", "FAKE SET GLOBAL gtid_purged", - "STOP REPLICA", - "FAKE SET SOURCE", - "START REPLICA", } destTablet.FakeMysqlDaemon.FetchSuperQueryMap = map[string]*sqltypes.Result{ "SHOW DATABASES": {}, } - destTablet.FakeMysqlDaemon.SetReplicationPositionPos = sourceTablet.FakeMysqlDaemon.CurrentPrimaryPosition + destTablet.FakeMysqlDaemon.SetReplicationPositionPos = sourceTablet.FakeMysqlDaemon.GetPrimaryPositionLocked() destTablet.FakeMysqlDaemon.SetReplicationSourceInputs = append(destTablet.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) destTablet.StartActionLoop(t, wr) @@ -714,13 +710,16 @@ func TestRestoreUnreachablePrimary(t *testing.T) { // stop primary so that it is unreachable primary.StopActionLoop(t) - // set a short timeout so that we don't have to wait 30 seconds - topo.RemoteOperationTimeout = 2 * time.Second - // Restore should still succeed - require.NoError(t, destTablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* restoreFromBackupTs */, time.Time{} /* restoreToTimestamp */, "", mysqlShutdownTimeout)) + // Attempt to fix the test, but its still failing :man_shrugging. + ctx, cancel = context.WithTimeout(ctx, 2*time.Second) + defer cancel() + // Restore will return an error while trying to contact the primary for its position, but otherwise will succeed. + // The replication won't be running however, since we can't run errant GTID detection without the primary being online. + err = destTablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* restoreFromBackupTs */, time.Time{} /* restoreToTimestamp */, "" /* restoreToPos */, []string{} /* ignoreBackupEngines */, mysqlShutdownTimeout) + require.ErrorContains(t, err, "DeadlineExceeded") // verify the full status require.NoError(t, destTablet.FakeMysqlDaemon.CheckSuperQueryList(), "destTablet.FakeMysqlDaemon.CheckSuperQueryList failed") - assert.True(t, destTablet.FakeMysqlDaemon.Replicating) + assert.False(t, destTablet.FakeMysqlDaemon.Replicating) assert.True(t, destTablet.FakeMysqlDaemon.Running) } @@ -784,7 +783,7 @@ func TestDisableActiveReparents(t *testing.T) { primary := NewFakeTablet(t, wr, "cell1", 0, topodatapb.TabletType_PRIMARY, db) primary.FakeMysqlDaemon.ReadOnly = false primary.FakeMysqlDaemon.Replicating = false - primary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -792,7 +791,7 @@ func TestDisableActiveReparents(t *testing.T) { Sequence: 457, }, }, - } + }) // start primary so that replica can fetch primary position from it primary.StartActionLoop(t, wr) @@ -803,7 +802,7 @@ func TestDisableActiveReparents(t *testing.T) { sourceTablet := NewFakeTablet(t, wr, "cell1", 1, topodatapb.TabletType_REPLICA, db) sourceTablet.FakeMysqlDaemon.ReadOnly = true sourceTablet.FakeMysqlDaemon.Replicating = true - sourceTablet.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + sourceTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -811,7 +810,7 @@ func TestDisableActiveReparents(t *testing.T) { Sequence: 457, }, }, - } + }) sourceTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "STOP REPLICA", } @@ -836,7 +835,7 @@ func TestDisableActiveReparents(t *testing.T) { destTablet := NewFakeTablet(t, wr, "cell1", 2, topodatapb.TabletType_REPLICA, db) destTablet.FakeMysqlDaemon.ReadOnly = true destTablet.FakeMysqlDaemon.Replicating = true - destTablet.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + destTablet.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -844,7 +843,7 @@ func TestDisableActiveReparents(t *testing.T) { Sequence: 457, }, }, - } + }) destTablet.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE RESET BINARY LOGS AND GTIDS", "FAKE SET GLOBAL gtid_purged", @@ -856,7 +855,7 @@ func TestDisableActiveReparents(t *testing.T) { destTablet.FakeMysqlDaemon.FetchSuperQueryMap = map[string]*sqltypes.Result{ "SHOW DATABASES": {}, } - destTablet.FakeMysqlDaemon.SetReplicationPositionPos = sourceTablet.FakeMysqlDaemon.CurrentPrimaryPosition + destTablet.FakeMysqlDaemon.SetReplicationPositionPos = sourceTablet.FakeMysqlDaemon.GetPrimaryPositionLocked() destTablet.FakeMysqlDaemon.SetReplicationSourceInputs = append(destTablet.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) destTablet.StartActionLoop(t, wr) @@ -872,7 +871,7 @@ func TestDisableActiveReparents(t *testing.T) { RelayLogInfoPath: path.Join(root, "relay-log.info"), } - require.NoError(t, destTablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* restoreFromBackupTs */, time.Time{} /* restoreToTimestamp */, "", mysqlShutdownTimeout)) + require.NoError(t, destTablet.TM.RestoreData(ctx, logutil.NewConsoleLogger(), 0 /* waitForBackupInterval */, false /* deleteBeforeRestore */, time.Time{} /* restoreFromBackupTs */, time.Time{} /* restoreToTimestamp */, "" /* restoreToPos */, []string{} /* ignoreBackupEngines */, mysqlShutdownTimeout)) // verify the full status require.NoError(t, destTablet.FakeMysqlDaemon.CheckSuperQueryList(), "destTablet.FakeMysqlDaemon.CheckSuperQueryList failed") assert.False(t, destTablet.FakeMysqlDaemon.Replicating) diff --git a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go index 96f9df74405..3167be5e512 100644 --- a/go/vt/wrangler/testlib/emergency_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/emergency_reparent_shard_test.go @@ -63,7 +63,7 @@ func TestEmergencyReparentShard(t *testing.T) { reparenttestutil.SetKeyspaceDurability(context.Background(), t, ts, "test_keyspace", "semi_sync") oldPrimary.FakeMysqlDaemon.Replicating = false - oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + oldPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -71,7 +71,7 @@ func TestEmergencyReparentShard(t *testing.T) { Sequence: 456, }, }, - } + }) currentPrimaryFilePosition, _ := replication.ParseFilePosGTIDSet("mariadb-bin.000010:456") oldPrimary.FakeMysqlDaemon.CurrentSourceFilePosition = replication.Position{ GTIDSet: currentPrimaryFilePosition, @@ -80,7 +80,7 @@ func TestEmergencyReparentShard(t *testing.T) { // new primary newPrimary.FakeMysqlDaemon.ReadOnly = true newPrimary.FakeMysqlDaemon.Replicating = true - newPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + newPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -88,7 +88,7 @@ func TestEmergencyReparentShard(t *testing.T) { Sequence: 456, }, }, - } + }) newPrimaryRelayLogPos, _ := replication.ParseFilePosGTIDSet("relay-bin.000004:456") newPrimary.FakeMysqlDaemon.CurrentSourceFilePosition = replication.Position{ GTIDSet: newPrimaryRelayLogPos, @@ -123,7 +123,7 @@ func TestEmergencyReparentShard(t *testing.T) { // good replica 1 is replicating goodReplica1.FakeMysqlDaemon.ReadOnly = true goodReplica1.FakeMysqlDaemon.Replicating = true - goodReplica1.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + goodReplica1.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -131,7 +131,7 @@ func TestEmergencyReparentShard(t *testing.T) { Sequence: 455, }, }, - } + }) goodReplica1RelayLogPos, _ := replication.ParseFilePosGTIDSet("relay-bin.000004:455") goodReplica1.FakeMysqlDaemon.CurrentSourceFilePosition = replication.Position{ GTIDSet: goodReplica1RelayLogPos, @@ -154,7 +154,7 @@ func TestEmergencyReparentShard(t *testing.T) { // good replica 2 is not replicating goodReplica2.FakeMysqlDaemon.ReadOnly = true goodReplica2.FakeMysqlDaemon.Replicating = false - goodReplica2.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + goodReplica2.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -162,7 +162,7 @@ func TestEmergencyReparentShard(t *testing.T) { Sequence: 454, }, }, - } + }) goodReplica2RelayLogPos, _ := replication.ParseFilePosGTIDSet("relay-bin.000004:454") goodReplica2.FakeMysqlDaemon.CurrentSourceFilePosition = replication.Position{ GTIDSet: goodReplica2RelayLogPos, @@ -217,7 +217,7 @@ func TestEmergencyReparentShardPrimaryElectNotBest(t *testing.T) { newPrimary.FakeMysqlDaemon.Replicating = true // It has transactions in its relay log, but not as many as // moreAdvancedReplica - newPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + newPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -225,7 +225,7 @@ func TestEmergencyReparentShardPrimaryElectNotBest(t *testing.T) { Sequence: 456, }, }, - } + }) newPrimaryRelayLogPos, _ := replication.ParseFilePosGTIDSet("relay-bin.000004:456") newPrimary.FakeMysqlDaemon.CurrentSourceFilePosition = replication.Position{ GTIDSet: newPrimaryRelayLogPos, @@ -250,7 +250,7 @@ func TestEmergencyReparentShardPrimaryElectNotBest(t *testing.T) { // more advanced replica moreAdvancedReplica.FakeMysqlDaemon.Replicating = true // relay log position is more advanced than desired new primary - moreAdvancedReplica.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + moreAdvancedReplica.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 2: replication.MariadbGTID{ Domain: 2, @@ -258,14 +258,14 @@ func TestEmergencyReparentShardPrimaryElectNotBest(t *testing.T) { Sequence: 457, }, }, - } + }) moreAdvancedReplicaLogPos, _ := replication.ParseFilePosGTIDSet("relay-bin.000004:457") moreAdvancedReplica.FakeMysqlDaemon.CurrentSourceFilePosition = replication.Position{ GTIDSet: moreAdvancedReplicaLogPos, } moreAdvancedReplica.FakeMysqlDaemon.SetReplicationSourceInputs = append(moreAdvancedReplica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet), topoproto.MysqlAddr(oldPrimary.Tablet)) moreAdvancedReplica.FakeMysqlDaemon.WaitPrimaryPositions = append(moreAdvancedReplica.FakeMysqlDaemon.WaitPrimaryPositions, moreAdvancedReplica.FakeMysqlDaemon.CurrentSourceFilePosition) - newPrimary.FakeMysqlDaemon.WaitPrimaryPositions = append(newPrimary.FakeMysqlDaemon.WaitPrimaryPositions, moreAdvancedReplica.FakeMysqlDaemon.CurrentPrimaryPosition) + newPrimary.FakeMysqlDaemon.WaitPrimaryPositions = append(newPrimary.FakeMysqlDaemon.WaitPrimaryPositions, moreAdvancedReplica.FakeMysqlDaemon.GetPrimaryPositionLocked()) moreAdvancedReplica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ // These 3 statements come from tablet startup "STOP REPLICA", diff --git a/go/vt/wrangler/testlib/planned_reparent_shard_test.go b/go/vt/wrangler/testlib/planned_reparent_shard_test.go index 28ffd34b756..1894c6bb4eb 100644 --- a/go/vt/wrangler/testlib/planned_reparent_shard_test.go +++ b/go/vt/wrangler/testlib/planned_reparent_shard_test.go @@ -96,7 +96,7 @@ func TestPlannedReparentShardNoPrimaryProvided(t *testing.T) { oldPrimary.FakeMysqlDaemon.ReadOnly = false oldPrimary.FakeMysqlDaemon.Replicating = false oldPrimary.FakeMysqlDaemon.ReplicationStatusError = mysql.ErrNotReplica - oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] + oldPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0]) oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE SET SOURCE", @@ -213,7 +213,7 @@ func TestPlannedReparentShardNoError(t *testing.T) { oldPrimary.FakeMysqlDaemon.ReadOnly = false oldPrimary.FakeMysqlDaemon.Replicating = false oldPrimary.FakeMysqlDaemon.ReplicationStatusError = mysql.ErrNotReplica - oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] + oldPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0]) oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE SET SOURCE", @@ -434,7 +434,7 @@ func TestPlannedReparentShardWaitForPositionFail(t *testing.T) { oldPrimary.FakeMysqlDaemon.ReadOnly = false oldPrimary.FakeMysqlDaemon.Replicating = false // set to incorrect value to make promote fail on WaitForReplicationPos - oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.PromoteResult + oldPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(newPrimary.FakeMysqlDaemon.PromoteResult) oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE SET SOURCE", @@ -542,7 +542,7 @@ func TestPlannedReparentShardWaitForPositionTimeout(t *testing.T) { // old primary oldPrimary.FakeMysqlDaemon.ReadOnly = false oldPrimary.FakeMysqlDaemon.Replicating = false - oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] + oldPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0]) oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE SET SOURCE", @@ -616,7 +616,7 @@ func TestPlannedReparentShardRelayLogError(t *testing.T) { primary.FakeMysqlDaemon.ReadOnly = false primary.FakeMysqlDaemon.Replicating = false primary.FakeMysqlDaemon.ReplicationStatusError = mysql.ErrNotReplica - primary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 7: replication.MariadbGTID{ Domain: 7, @@ -624,7 +624,7 @@ func TestPlannedReparentShardRelayLogError(t *testing.T) { Sequence: 990, }, }, - } + }) primary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", } @@ -697,7 +697,7 @@ func TestPlannedReparentShardRelayLogErrorStartReplication(t *testing.T) { primary.FakeMysqlDaemon.ReadOnly = false primary.FakeMysqlDaemon.Replicating = false primary.FakeMysqlDaemon.ReplicationStatusError = mysql.ErrNotReplica - primary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 7: replication.MariadbGTID{ Domain: 7, @@ -705,7 +705,7 @@ func TestPlannedReparentShardRelayLogErrorStartReplication(t *testing.T) { Sequence: 990, }, }, - } + }) primary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", } @@ -815,7 +815,7 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { oldPrimary.FakeMysqlDaemon.ReadOnly = false oldPrimary.FakeMysqlDaemon.Replicating = false oldPrimary.FakeMysqlDaemon.ReplicationStatusError = mysql.ErrNotReplica - oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] + oldPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0]) oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs = append(oldPrimary.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(newPrimary.Tablet)) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "FAKE SET SOURCE", @@ -823,7 +823,7 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { // We call a SetReplicationSource explicitly "FAKE SET SOURCE", "START REPLICA", - // extra SetReplicationSource call due to retry + // extra SetReplicationSource call due to retry) "FAKE SET SOURCE", "START REPLICA", } @@ -885,7 +885,7 @@ func TestPlannedReparentShardPromoteReplicaFail(t *testing.T) { // retrying should work newPrimary.FakeMysqlDaemon.PromoteError = nil - newPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0] + newPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(newPrimary.FakeMysqlDaemon.WaitPrimaryPositions[0]) // run PlannedReparentShard err = vp.Run([]string{"PlannedReparentShard", "--wait_replicas_timeout", "10s", "--keyspace_shard", newPrimary.Tablet.Keyspace + "/" + newPrimary.Tablet.Shard, "--new_primary", topoproto.TabletAliasString(newPrimary.Tablet.Alias)}) @@ -922,7 +922,7 @@ func TestPlannedReparentShardSamePrimary(t *testing.T) { oldPrimary.FakeMysqlDaemon.ReadOnly = true oldPrimary.FakeMysqlDaemon.Replicating = false oldPrimary.FakeMysqlDaemon.ReplicationStatusError = mysql.ErrNotReplica - oldPrimary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + oldPrimary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 7: replication.MariadbGTID{ Domain: 7, @@ -930,7 +930,7 @@ func TestPlannedReparentShardSamePrimary(t *testing.T) { Sequence: 990, }, }, - } + }) oldPrimary.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ "SUBINSERT INTO _vt.reparent_journal (time_created_ns, action_name, primary_alias, replication_position) VALUES", } diff --git a/go/vt/wrangler/testlib/reparent_utils_test.go b/go/vt/wrangler/testlib/reparent_utils_test.go index e0a2077c778..b199a64340a 100644 --- a/go/vt/wrangler/testlib/reparent_utils_test.go +++ b/go/vt/wrangler/testlib/reparent_utils_test.go @@ -67,7 +67,7 @@ func TestShardReplicationStatuses(t *testing.T) { } // primary action loop (to initialize host and port) - primary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 5: replication.MariadbGTID{ Domain: 5, @@ -75,12 +75,12 @@ func TestShardReplicationStatuses(t *testing.T) { Sequence: 892, }, }, - } + }) primary.StartActionLoop(t, wr) defer primary.StopActionLoop(t) // replica loop - replica.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + replica.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 5: replication.MariadbGTID{ Domain: 5, @@ -88,7 +88,7 @@ func TestShardReplicationStatuses(t *testing.T) { Sequence: 890, }, }, - } + }) replica.FakeMysqlDaemon.CurrentSourceHost = primary.Tablet.MysqlHostname replica.FakeMysqlDaemon.CurrentSourcePort = primary.Tablet.MysqlPort replica.FakeMysqlDaemon.SetReplicationSourceInputs = append(replica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) @@ -205,6 +205,10 @@ func TestSetReplicationSource(t *testing.T) { return nil }) require.NoError(t, err, "UpdateShardFields failed") + pos, err := replication.DecodePosition("MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-8") + require.NoError(t, err) + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(pos) + primary.FakeMysqlDaemon.ServerUUID = "8bc65c84-3fe4-11ed-a912-257f0fcdd6c9" // primary action loop (to initialize host and port) primary.StartActionLoop(t, wr) @@ -246,6 +250,36 @@ func TestSetReplicationSource(t *testing.T) { checkSemiSyncEnabled(t, false, true, replica) }) + t.Run("Errant GTIDs on the replica", func(t *testing.T) { + replica := NewFakeTablet(t, wr, "cell1", 4, topodatapb.TabletType_REPLICA, nil) + // replica loop + replica.FakeMysqlDaemon.Replicating = true + replica.FakeMysqlDaemon.IOThreadRunning = true + replica.FakeMysqlDaemon.SetReplicationSourceInputs = append(replica.FakeMysqlDaemon.SetReplicationSourceInputs, topoproto.MysqlAddr(primary.Tablet)) + replica.FakeMysqlDaemon.ExpectedExecuteSuperQueryList = []string{ + // These 3 statements come from tablet startup + "STOP REPLICA", + "FAKE SET SOURCE", + "START REPLICA", + } + replica.StartActionLoop(t, wr) + defer replica.StopActionLoop(t) + + // Set replica's GTID to have a write that the primary's GTID doesn't have + pos, err = replication.DecodePosition("MySQL56/8bc65c84-3fe4-11ed-a912-257f0fcdd6c9:1-7,8bc65cca-3fe4-11ed-bbfb-091034d48b3e:1") + require.NoError(t, err) + replica.FakeMysqlDaemon.CurrentRelayLogPosition = pos + + // run SetReplicationSource + err = wr.SetReplicationSource(ctx, replica.Tablet) + require.ErrorContains(t, err, "Errant GTID detected") + + // check what was run + err = replica.FakeMysqlDaemon.CheckSuperQueryList() + require.NoError(t, err, "CheckSuperQueryList failed") + checkSemiSyncEnabled(t, false, true, replica) + }) + // test setting an empty hostname because of primary shutdown t.Run("Primary tablet already shutdown", func(t *testing.T) { replica := NewFakeTablet(t, wr, "cell1", 3, topodatapb.TabletType_REPLICA, nil) diff --git a/go/vt/wrangler/testlib/version_test.go b/go/vt/wrangler/testlib/version_test.go index cf5f3fd1487..552f7f29c04 100644 --- a/go/vt/wrangler/testlib/version_test.go +++ b/go/vt/wrangler/testlib/version_test.go @@ -56,7 +56,7 @@ func expvarHandler(gitRev *string) func(http.ResponseWriter, *http.Request) { http.Error(w, fmt.Sprintf("cannot marshal json: %s", err), http.StatusInternalServerError) return } - fmt.Fprintf(w, string(result)+"\n") + fmt.Fprint(w, string(result)+"\n") } } diff --git a/go/vt/wrangler/traffic_switcher.go b/go/vt/wrangler/traffic_switcher.go index 448f4f99734..d337c1ee515 100644 --- a/go/vt/wrangler/traffic_switcher.go +++ b/go/vt/wrangler/traffic_switcher.go @@ -278,12 +278,12 @@ func (wr *Wrangler) getWorkflowState(ctx context.Context, targetKeyspace, workfl } } } else { - state.RdonlyCellsSwitched, state.RdonlyCellsNotSwitched, err = ws.GetCellsWithTableReadsSwitched(ctx, targetKeyspace, table, topodatapb.TabletType_RDONLY) + state.RdonlyCellsSwitched, state.RdonlyCellsNotSwitched, err = ws.GetCellsWithTableReadsSwitched(ctx, sourceKeyspace, targetKeyspace, table, topodatapb.TabletType_RDONLY) if err != nil { return nil, nil, err } - state.ReplicaCellsSwitched, state.ReplicaCellsNotSwitched, err = ws.GetCellsWithTableReadsSwitched(ctx, targetKeyspace, table, topodatapb.TabletType_REPLICA) + state.ReplicaCellsSwitched, state.ReplicaCellsNotSwitched, err = ws.GetCellsWithTableReadsSwitched(ctx, sourceKeyspace, targetKeyspace, table, topodatapb.TabletType_REPLICA) if err != nil { return nil, nil, err } @@ -335,7 +335,7 @@ func (wr *Wrangler) SwitchReads(ctx context.Context, targetKeyspace, workflowNam cells []string, direction workflow.TrafficSwitchDirection, dryRun bool) (*[]string, error) { // Consistently handle errors by logging and returning them. handleError := func(message string, err error) (*[]string, error) { - werr := vterrors.Errorf(vtrpcpb.Code_INTERNAL, fmt.Sprintf("%s: %v", message, err)) + werr := vterrors.Errorf(vtrpcpb.Code_INTERNAL, "%s: %v", message, err) wr.Logger().Error(werr) return nil, werr } @@ -346,7 +346,7 @@ func (wr *Wrangler) SwitchReads(ctx context.Context, targetKeyspace, workflowNam } if ts == nil { errorMsg := fmt.Sprintf("workflow %s not found in keyspace %s", workflowName, targetKeyspace) - return handleError("failed to get the current state of the workflow", fmt.Errorf(errorMsg)) + return handleError("failed to get the current state of the workflow", errors.New(errorMsg)) } log.Infof("Switching reads: %s.%s tt %+v, cells %+v, workflow state: %+v", targetKeyspace, workflowName, servedTypes, cells, ws) var switchReplicas, switchRdonly bool @@ -478,7 +478,7 @@ func (wr *Wrangler) SwitchWrites(ctx context.Context, targetKeyspace, workflowNa cancel, reverse, reverseReplication bool, dryRun, initializeTargetSequences bool) (journalID int64, dryRunResults *[]string, err error) { // Consistently handle errors by logging and returning them. handleError := func(message string, err error) (int64, *[]string, error) { - werr := vterrors.Errorf(vtrpcpb.Code_INTERNAL, fmt.Sprintf("%s: %v", message, err)) + werr := vterrors.Errorf(vtrpcpb.Code_INTERNAL, "%s: %v", message, err) wr.Logger().Error(werr) return 0, nil, werr } @@ -490,7 +490,7 @@ func (wr *Wrangler) SwitchWrites(ctx context.Context, targetKeyspace, workflowNa } if ts == nil { errorMsg := fmt.Sprintf("workflow %s not found in keyspace %s", workflowName, targetKeyspace) - return handleError("failed to get the current workflow state", fmt.Errorf(errorMsg)) + return handleError("failed to get the current workflow state", errors.New(errorMsg)) } var sw iswitcher @@ -1723,7 +1723,7 @@ func doValidateWorkflowHasCompleted(ctx context.Context, ts *trafficSwitcher) er _ = ts.ForAllSources(func(source *workflow.MigrationSource) error { wg.Add(1) if source.GetShard().IsPrimaryServing { - rec.RecordError(fmt.Errorf(fmt.Sprintf("Shard %s is still serving", source.GetShard().ShardName()))) + rec.RecordError(fmt.Errorf("Shard %s is still serving", source.GetShard().ShardName())) } wg.Done() return nil diff --git a/go/vt/wrangler/traffic_switcher_env_test.go b/go/vt/wrangler/traffic_switcher_env_test.go index 4e58024785d..a99e6ba2c43 100644 --- a/go/vt/wrangler/traffic_switcher_env_test.go +++ b/go/vt/wrangler/traffic_switcher_env_test.go @@ -776,7 +776,7 @@ func (tme *testMigraterEnv) createDBClients(ctx context.Context, t *testing.T) { func (tme *testMigraterEnv) setPrimaryPositions() { for _, primary := range tme.sourcePrimaries { - primary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 5: replication.MariadbGTID{ Domain: 5, @@ -784,10 +784,10 @@ func (tme *testMigraterEnv) setPrimaryPositions() { Sequence: 892, }, }, - } + }) } for _, primary := range tme.targetPrimaries { - primary.FakeMysqlDaemon.CurrentPrimaryPosition = replication.Position{ + primary.FakeMysqlDaemon.SetPrimaryPositionLocked(replication.Position{ GTIDSet: replication.MariadbGTIDSet{ 5: replication.MariadbGTID{ Domain: 5, @@ -795,7 +795,7 @@ func (tme *testMigraterEnv) setPrimaryPositions() { Sequence: 893, }, }, - } + }) } } diff --git a/go/vt/wrangler/vexec.go b/go/vt/wrangler/vexec.go index 2c279c5c6cf..41f02ef9e63 100644 --- a/go/vt/wrangler/vexec.go +++ b/go/vt/wrangler/vexec.go @@ -445,9 +445,9 @@ func (wr *Wrangler) execWorkflowAction(ctx context.Context, workflow, keyspace, changes = true dryRunChanges.WriteString(fmt.Sprintf(" tablet_types=%q\n", topoproto.MakeStringTypeCSV(rpcReq.TabletTypes))) } - if !textutil.ValueIsSimulatedNull(rpcReq.OnDdl) { + if rpcReq.OnDdl != nil { changes = true - dryRunChanges.WriteString(fmt.Sprintf(" on_ddl=%q\n", binlogdatapb.OnDDLAction_name[int32(rpcReq.OnDdl)])) + dryRunChanges.WriteString(fmt.Sprintf(" on_ddl=%q\n", binlogdatapb.OnDDLAction_name[int32(*rpcReq.OnDdl)])) } if !changes { return nil, fmt.Errorf("no updates were provided; use --cells, --tablet-types, or --on-ddl to specify new values") diff --git a/go/vt/wrangler/vexec_test.go b/go/vt/wrangler/vexec_test.go index 80cd2aef565..223e338b303 100644 --- a/go/vt/wrangler/vexec_test.go +++ b/go/vt/wrangler/vexec_test.go @@ -29,13 +29,15 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/ptr" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/logutil" + "vitess.io/vitess/go/vt/vtenv" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" - "vitess.io/vitess/go/vt/vtenv" ) var ( @@ -397,49 +399,45 @@ func TestWorkflowUpdate(t *testing.T) { defer env.close() logger := logutil.NewMemoryLogger() wr := New(vtenv.NewTestEnv(), logger, env.topoServ, env.tmc) - nullSlice := textutil.SimulatedNullStringSlice // Used to represent a non-provided value - nullOnDDL := binlogdatapb.OnDDLAction(textutil.SimulatedNullInt) // Used to represent a non-provided value + tests := []struct { name string cells []string tabletTypes []topodatapb.TabletType - onDDL binlogdatapb.OnDDLAction + onDDL *binlogdatapb.OnDDLAction output string wantErr string }{ { name: "no flags", - cells: nullSlice, - tabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, - onDDL: nullOnDDL, + cells: textutil.SimulatedNullStringSlice, + tabletTypes: textutil.SimulatedNullTabletTypeSlice, wantErr: "no updates were provided; use --cells, --tablet-types, or --on-ddl to specify new values", }, { name: "only cells", cells: []string{"zone1"}, - tabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, - onDDL: nullOnDDL, + tabletTypes: textutil.SimulatedNullTabletTypeSlice, output: "The following workflow fields will be updated:\n cells=\"zone1\"\nOn the following tablets in the target keyspace for workflow wrWorkflow:\n zone1-0000000200 (target/-80)\n zone1-0000000210 (target/80-)\n", }, { name: "only tablet types", - cells: nullSlice, + cells: textutil.SimulatedNullStringSlice, tabletTypes: []topodatapb.TabletType{topodatapb.TabletType_PRIMARY, topodatapb.TabletType_REPLICA}, - onDDL: nullOnDDL, output: "The following workflow fields will be updated:\n tablet_types=\"primary,replica\"\nOn the following tablets in the target keyspace for workflow wrWorkflow:\n zone1-0000000200 (target/-80)\n zone1-0000000210 (target/80-)\n", }, { name: "only on-ddl", - cells: nullSlice, - tabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, - onDDL: binlogdatapb.OnDDLAction_EXEC_IGNORE, + cells: textutil.SimulatedNullStringSlice, + tabletTypes: textutil.SimulatedNullTabletTypeSlice, + onDDL: ptr.Of(binlogdatapb.OnDDLAction_EXEC_IGNORE), output: "The following workflow fields will be updated:\n on_ddl=\"EXEC_IGNORE\"\nOn the following tablets in the target keyspace for workflow wrWorkflow:\n zone1-0000000200 (target/-80)\n zone1-0000000210 (target/80-)\n", }, { name: "all flags", cells: []string{"zone1", "zone2"}, tabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY, topodatapb.TabletType_SPARE}, - onDDL: binlogdatapb.OnDDLAction_EXEC, + onDDL: ptr.Of(binlogdatapb.OnDDLAction_EXEC), output: "The following workflow fields will be updated:\n cells=\"zone1,zone2\"\n tablet_types=\"rdonly,spare\"\n on_ddl=\"EXEC\"\nOn the following tablets in the target keyspace for workflow wrWorkflow:\n zone1-0000000200 (target/-80)\n zone1-0000000210 (target/80-)\n", }, } diff --git a/go/vt/wrangler/workflow.go b/go/vt/wrangler/workflow.go index 6862f5f4d3f..6e74e4c9ebd 100644 --- a/go/vt/wrangler/workflow.go +++ b/go/vt/wrangler/workflow.go @@ -2,6 +2,7 @@ package wrangler import ( "context" + "errors" "fmt" "sort" "strings" @@ -114,7 +115,7 @@ func (wr *Wrangler) NewVReplicationWorkflow(ctx context.Context, workflowType VR return nil, err } log.Infof("Workflow state is %+v", ws) - if ts != nil { //Other than on create we need to get SourceKeyspace from the workflow + if ts != nil { // Other than on create we need to get SourceKeyspace from the workflow vrw.params.TargetKeyspace = ts.targetKeyspace vrw.params.Workflow = ts.workflow vrw.params.SourceKeyspace = ts.sourceKeyspace @@ -379,7 +380,7 @@ func (vrw *VReplicationWorkflow) Complete() (*[]string, error) { } if !ws.WritesSwitched || len(ws.ReplicaCellsNotSwitched) > 0 || len(ws.RdonlyCellsNotSwitched) > 0 { - return nil, fmt.Errorf(ErrWorkflowNotFullySwitched) + return nil, errors.New(ErrWorkflowNotFullySwitched) } var renameTable workflow.TableRemovalType if vrw.params.RenameTables { @@ -404,7 +405,7 @@ func (vrw *VReplicationWorkflow) Cancel() error { } if ws.WritesSwitched || len(ws.ReplicaCellsSwitched) > 0 || len(ws.RdonlyCellsSwitched) > 0 { - return fmt.Errorf(ErrWorkflowPartiallySwitched) + return errors.New(ErrWorkflowPartiallySwitched) } if _, err := vrw.wr.DropTargets(vrw.ctx, vrw.ws.TargetKeyspace, vrw.ws.Workflow, vrw.params.KeepData, vrw.params.KeepRoutingRules, false); err != nil { return err diff --git a/go/vt/wrangler/workflow_test.go b/go/vt/wrangler/workflow_test.go index 4f508766330..92996c9d931 100644 --- a/go/vt/wrangler/workflow_test.go +++ b/go/vt/wrangler/workflow_test.go @@ -325,6 +325,18 @@ func TestPartialMoveTables(t *testing.T) { tme := newTestTablePartialMigrater(ctx, t, shards, shards[0:1], "select * %s") defer tme.stopTablets(t) + // Add the schema for the primary tablets, so that we don't fail while applying the denied table rules. + schm := &tabletmanagerdatapb.SchemaDefinition{ + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{{ + Name: "t1", + }, { + Name: "t2", + }}, + } + for _, primary := range append(tme.sourcePrimaries, tme.targetPrimaries...) { + primary.FakeMysqlDaemon.Schema = schm + } + // Save some unrelated shard routing rules to be sure that // they don't interfere in any way. srr, err := tme.ts.GetShardRoutingRules(ctx) @@ -400,6 +412,17 @@ func TestPartialMoveTablesShardSubset(t *testing.T) { } tme := newTestTablePartialMigrater(ctx, t, shards, shardsToMove, "select * %s") defer tme.stopTablets(t) + // Add the schema for the primary tablets, so that we don't fail while applying the denied table rules. + schm := &tabletmanagerdatapb.SchemaDefinition{ + TableDefinitions: []*tabletmanagerdatapb.TableDefinition{{ + Name: "t1", + }, { + Name: "t2", + }}, + } + for _, primary := range append(tme.sourcePrimaries, tme.targetPrimaries...) { + primary.FakeMysqlDaemon.Schema = schm + } // Save some unrelated shard routing rules to be sure that // they don't interfere in any way. diff --git a/java/client/pom.xml b/java/client/pom.xml index fc78d17b564..1cb1ecb5862 100644 --- a/java/client/pom.xml +++ b/java/client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 21.0.0-SNAPSHOT + 22.0.0-SNAPSHOT vitess-client diff --git a/java/client/src/main/java/io/vitess/client/VTGateBlockingConnection.java b/java/client/src/main/java/io/vitess/client/VTGateBlockingConnection.java index 4c24c12bfcf..8a19659ef65 100644 --- a/java/client/src/main/java/io/vitess/client/VTGateBlockingConnection.java +++ b/java/client/src/main/java/io/vitess/client/VTGateBlockingConnection.java @@ -111,9 +111,6 @@ public Cursor streamExecute(Context ctx, return vtGateConnection.streamExecute(ctx, query, bindVars, vtSession); } - /** - * @inheritDoc - */ @Override public void close() throws IOException { vtGateConnection.close(); diff --git a/java/client/src/main/java/io/vitess/client/VTGateConnection.java b/java/client/src/main/java/io/vitess/client/VTGateConnection.java index ee2fb270a9a..683f4bf5f15 100644 --- a/java/client/src/main/java/io/vitess/client/VTGateConnection.java +++ b/java/client/src/main/java/io/vitess/client/VTGateConnection.java @@ -205,9 +205,6 @@ StreamIterator getVStream(Context ctx, VStreamRequest vstreamRe return client.getVStream(ctx, request); } - /** - * @inheritDoc - */ @Override public void close() throws IOException { client.close(); diff --git a/java/client/src/main/java/io/vitess/client/VTSession.java b/java/client/src/main/java/io/vitess/client/VTSession.java index 9974e5f034a..3b52b4d3c2e 100644 --- a/java/client/src/main/java/io/vitess/client/VTSession.java +++ b/java/client/src/main/java/io/vitess/client/VTSession.java @@ -103,7 +103,7 @@ public Query.ExecuteOptions.TransactionIsolation getTransactionIsolation() { /** * Sets this session's transaction isolation level. * - * @param Transaction Isolation Level of the Session + * @param isolation Isolation Level of the Session */ public void setTransactionIsolation(Query.ExecuteOptions.TransactionIsolation isolation) { this.session = this.session.toBuilder() diff --git a/java/client/src/main/java/io/vitess/client/grpc/tls/TlsOptions.java b/java/client/src/main/java/io/vitess/client/grpc/tls/TlsOptions.java index ffd570d413b..4defac70378 100644 --- a/java/client/src/main/java/io/vitess/client/grpc/tls/TlsOptions.java +++ b/java/client/src/main/java/io/vitess/client/grpc/tls/TlsOptions.java @@ -17,11 +17,10 @@ package io.vitess.client.grpc.tls; import java.io.File; -import java.net.InetSocketAddress; /** *

A wrapper type holding TLS-related fields for the - * {@link io.vitess.client.RpcClientFactory#createTls(InetSocketAddress, TlsOptions)} method, so + * createTls(InetSocketAddress, TlsOptions) method, so * that this method won't have an unwieldy number of direct parameters.

* *

This path uses a builder pattern style:

diff --git a/java/example/pom.xml b/java/example/pom.xml index c2b226b6806..fa3220f51bd 100644 --- a/java/example/pom.xml +++ b/java/example/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 21.0.0-SNAPSHOT + 22.0.0-SNAPSHOT vitess-example diff --git a/java/grpc-client/pom.xml b/java/grpc-client/pom.xml index 41bd4de8291..55c406b0e8f 100644 --- a/java/grpc-client/pom.xml +++ b/java/grpc-client/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 21.0.0-SNAPSHOT + 22.0.0-SNAPSHOT vitess-grpc-client @@ -51,6 +51,10 @@ io.grpc grpc-api + + io.grpc + grpc-inprocess + io.netty netty-handler diff --git a/java/grpc-client/src/main/java/io/vitess/client/grpc/RetryingInterceptor.java b/java/grpc-client/src/main/java/io/vitess/client/grpc/RetryingInterceptor.java index 9323a1b00d4..301ddaed282 100644 --- a/java/grpc-client/src/main/java/io/vitess/client/grpc/RetryingInterceptor.java +++ b/java/grpc-client/src/main/java/io/vitess/client/grpc/RetryingInterceptor.java @@ -39,8 +39,8 @@ /** * RetryingInterceptor is used for retrying certain classes of failed requests in the underlying - * gRPC connection. At this time it handles {@link MethodDescriptor.MethodType.UNARY} requests with - * status {@link Status.Code.UNAVAILABLE}, which is according to the spec meant to be a transient + * gRPC connection. At this time it handles unary requests with + * status Unavailable, which is according to the spec meant to be a transient * error. This class can be configured with {@link RetryingInterceptorConfig} to determine what * level of exponential backoff to apply to the handled types of failing requests. * diff --git a/java/grpc-client/src/test/java/io/vitess/client/grpc/RetryingInterceptorTest.java b/java/grpc-client/src/test/java/io/vitess/client/grpc/RetryingInterceptorTest.java index 376a920ad31..9b3644139fd 100644 --- a/java/grpc-client/src/test/java/io/vitess/client/grpc/RetryingInterceptorTest.java +++ b/java/grpc-client/src/test/java/io/vitess/client/grpc/RetryingInterceptorTest.java @@ -55,6 +55,8 @@ public void testNoopConfigPassesThrough() throws ExecutionException, Interrupted Assert.fail("Should have failed after 1 attempt"); } catch (Exception e) { Assert.assertEquals(1, forceRetryNTimesInterceptor.getNumRetryableFailures()); + }finally { + channel.shutdownNow(); } } @@ -75,6 +77,8 @@ public void testRetryAfterBackoff() throws ExecutionException, InterruptedExcept } catch (Exception e) { e.printStackTrace(); Assert.assertEquals(3, forceRetryNTimesInterceptor.getNumRetryableFailures()); + } finally { + channel.shutdownNow(); } } @@ -95,6 +99,8 @@ public void testRetryDeadlineExceeded() throws ExecutionException, InterruptedEx Assert.fail("Should have failed"); } catch (Exception e) { Assert.assertEquals(1, forceRetryNTimesInterceptor.getNumRetryableFailures()); + }finally { + channel.shutdownNow(); } } diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index 49a5d61779b..dd554e64501 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -5,7 +5,7 @@ io.vitess vitess-parent - 21.0.0-SNAPSHOT + 22.0.0-SNAPSHOT vitess-jdbc diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessConnection.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessConnection.java index 5e51ff908dc..f4bc43ed65e 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessConnection.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessConnection.java @@ -105,7 +105,7 @@ public Statement createStatement() throws SQLException { } /** - * Create PreparedStatement for the given connection & sql + * Create PreparedStatement for the given connection and sql * * @param sql - Sql Statement * @return PreparedStatement Object @@ -338,7 +338,6 @@ public void setTransactionIsolation(int level) throws SQLException { /** * Return Warnings - *

* TODO: Not implementing as Error is Thrown when occurred * * @return SQLWarning or null diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessDriver.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessDriver.java index 5b6a889103f..a77e1ec0860 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessDriver.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessDriver.java @@ -60,12 +60,10 @@ public Connection connect(String url, Properties info) throws SQLException { /** * Checks whether a given url is in a valid format. - *

* The current uri format is: jdbc:vitess://[host]:[port] * * @param url the URL of the database * @return true, if this driver understands the given URL; false, otherwise - *

* TODO: Write a better regex */ @Override diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java index 6234d037807..e6a1b0187dd 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessJDBCUrl.java @@ -93,7 +93,6 @@ public String toString() { *

  • trustAlias=alias_under_which_certificate_chain_is_stored (if not set, * then the first valid X509Certificate found in the trustStore will be used)
  • * - *

    *

    *

    If useSSL=true, and any of these additional properties are not set on the JDBC * URL, then the driver will look to see if these corresponding property was set at JVM startup @@ -109,7 +108,6 @@ public String toString() { *

  • -Djavax.net.ssl.trustStorePassword
  • *
  • -Djavax.net.ssl.trustStoreAlias
  • * - *

    *

    *

    See:

    *

    https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/#tls-ssl

    diff --git a/java/jdbc/src/main/java/io/vitess/jdbc/VitessStatement.java b/java/jdbc/src/main/java/io/vitess/jdbc/VitessStatement.java index ddaf813af2d..90a83b56485 100644 --- a/java/jdbc/src/main/java/io/vitess/jdbc/VitessStatement.java +++ b/java/jdbc/src/main/java/io/vitess/jdbc/VitessStatement.java @@ -241,7 +241,6 @@ public void setQueryTimeout(int seconds) throws SQLException { /** * Return Warnings - *

    * Not implementing as Error is Thrown when occurred * * @return SQLWarning or null diff --git a/java/jdbc/src/main/java/io/vitess/util/MysqlDefs.java b/java/jdbc/src/main/java/io/vitess/util/MysqlDefs.java index 6edd18353e3..add98e470c7 100644 --- a/java/jdbc/src/main/java/io/vitess/util/MysqlDefs.java +++ b/java/jdbc/src/main/java/io/vitess/util/MysqlDefs.java @@ -87,6 +87,7 @@ public final class MysqlDefs { static final int FIELD_TYPE_VARCHAR = 15; // Newer data types static final int FIELD_TYPE_YEAR = 13; + static final int FIELD_TYPE_VECTOR = 242; static final int FIELD_TYPE_JSON = 245; static final int INIT_DB = 2; @@ -166,6 +167,7 @@ public final class MysqlDefs { mysqlToJdbcTypesMap.put("SET", mysqlToJavaType(FIELD_TYPE_SET)); mysqlToJdbcTypesMap.put("GEOMETRY", mysqlToJavaType(FIELD_TYPE_GEOMETRY)); mysqlToJdbcTypesMap.put("JSON", mysqlToJavaType(FIELD_TYPE_JSON)); + mysqlToJdbcTypesMap.put("VECTOR", mysqlToJavaType(FIELD_TYPE_VECTOR)); } static { @@ -200,6 +202,7 @@ public final class MysqlDefs { vitesstoMySqlType.put(Query.Type.TUPLE, Types.OTHER); vitesstoMySqlType.put(Query.Type.GEOMETRY, Types.BINARY); vitesstoMySqlType.put(Query.Type.JSON, Types.CHAR); + vitesstoMySqlType.put(Query.Type.VECTOR, Types.BINARY); } static { @@ -337,6 +340,7 @@ public static int mysqlToJavaType(int mysqlType) { break; case MysqlDefs.FIELD_TYPE_GEOMETRY: + case MysqlDefs.FIELD_TYPE_VECTOR: jdbcType = Types.BINARY; break; @@ -423,6 +427,8 @@ public static int mysqlToJavaType(String mysqlType) { return mysqlToJavaType(FIELD_TYPE_BIT); } else if (mysqlType.equalsIgnoreCase("JSON")) { return mysqlToJavaType(FIELD_TYPE_JSON); + } else if (mysqlType.equalsIgnoreCase("VECTOR")) { + return mysqlToJavaType(FIELD_TYPE_VECTOR); } // Punt @@ -509,6 +515,9 @@ public static String typeToName(int mysqlType) { case MysqlDefs.FIELD_TYPE_GEOMETRY: return "FIELD_TYPE_GEOMETRY"; + case MysqlDefs.FIELD_TYPE_VECTOR: + return "FIELD_TYPE_VECTOR"; + case MysqlDefs.FIELD_TYPE_JSON: return "FIELD_TYPE_JSON"; diff --git a/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java b/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java index c1388bfb7bb..343ae0e90eb 100644 --- a/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java +++ b/java/jdbc/src/main/java/io/vitess/util/charset/CharsetMapping.java @@ -541,6 +541,7 @@ public class CharsetMapping { /** * MySQL charset could map to several Java encodings. So here we choose the one according to next * rules: + *

      *
    • if there is no static mapping for this charset then return javaEncoding value as is * because this could be a custom charset for example *
    • if static mapping exists and javaEncoding equals to one of Java encoding canonical names @@ -550,6 +551,7 @@ public class CharsetMapping { *
    • if static mapping exists and javaEncoding doesn't match any Java encoding canonical * names or aliases available for this mapping then return default Java encoding (the first in * mapping list) + *
    */ public static String getJavaEncodingForCollationIndex(Integer collationIndex, String javaEncoding) { diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java index bcadc49d33a..26ad5fd11b3 100644 --- a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java +++ b/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java @@ -16,6 +16,9 @@ package io.vitess.jdbc; +import java.util.Set; +import java.util.EnumSet; + import io.vitess.proto.Query; import io.vitess.util.MysqlDefs; import io.vitess.util.charset.CharsetMapping; @@ -274,6 +277,16 @@ public void testNumericAndDateTimeEncoding() throws SQLException { } } + // Define the types to skip + Set typesToSkip = EnumSet.of( + Query.Type.UNRECOGNIZED, + Query.Type.EXPRESSION, + Query.Type.HEXVAL, + Query.Type.HEXNUM, + Query.Type.BITNUM, + Query.Type.RAW + ); + @Test public void testPrecisionAdjustFactor() throws SQLException { VitessConnection conn = getVitessConnection(); @@ -294,7 +307,8 @@ public void testPrecisionAdjustFactor() throws SQLException { conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); for (Query.Type type : Query.Type.values()) { - if (type == Query.Type.UNRECOGNIZED || type == Query.Type.EXPRESSION || type == Query.Type.HEXVAL || type == Query.Type.HEXNUM || type == Query.Type.BITNUM) { + // Skip if the type is in the set + if (typesToSkip.contains(type)) { continue; } diff --git a/java/pom.xml b/java/pom.xml index 079f185ad70..6742258a6b8 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -11,7 +11,7 @@ io.vitess vitess-parent - 21.0.0-SNAPSHOT + 22.0.0-SNAPSHOT pom Vitess Java Client libraries [Parent] @@ -66,16 +66,16 @@ UTF-8 - 1.57.1 + 1.67.1 - 4.1.94.Final - 2.0.61.Final + 4.1.110.Final + 2.0.65.Final - 3.24.3 + 4.28.3 3.24.3 3.0.0 - 2.17.1 + 2.24.1 @@ -89,12 +89,12 @@ com.google.code.gson gson - 2.8.9 + 2.11.0 com.google.guava guava - 32.0.0-jre + 33.3.1-jre com.google.protobuf @@ -109,7 +109,7 @@ commons-io commons-io - 2.7 + 2.17.0 @@ -122,6 +122,11 @@ grpc-netty ${grpc.version} + + io.grpc + grpc-inprocess + ${grpc.version} + io.grpc grpc-stub @@ -180,7 +185,7 @@ joda-time joda-time - 2.10 + 2.13.0 @@ -227,7 +232,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.13.0 1.8 1.8 @@ -288,7 +293,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.13 + 1.7.0 true ossrh @@ -299,7 +304,7 @@ org.apache.maven.plugins maven-source-plugin - 2.4 + 3.3.1 attach-sources @@ -312,7 +317,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.3.1 attach-javadocs @@ -325,7 +330,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.6 + 3.2.7 sign-artifacts diff --git a/misc/errcheck_excludes.txt b/misc/errcheck_excludes.txt deleted file mode 100644 index fb689e26288..00000000000 --- a/misc/errcheck_excludes.txt +++ /dev/null @@ -1,49 +0,0 @@ -// This file contains one function signature per line, which errcheck should not warn about. -// -// The format for function signatures is `package.FunctionName`. -// The format for method signatures is `(package.Receiver).MethodName` for value receivers, -// and the format for pointer receivers is `(*package.Receiver).MethodName`. -// -// See https://github.com/kisielk/errcheck#excluding-functions for more details. - -flag.Set -(*flag.FlagSet).Parse -(flag.Value).Set - -fmt.Fprint -fmt.Fprintf - -io.WriteString(fmt.State) -io.WriteString(net/http.ResponseWriter) - -(net.Listener).Close -(net/http.ResponseWriter).Write - -(*os.File).Close -os.Remove -os.RemoveAll -os.Rename - -(*github.com/spf13/cobra.Command).Help -(*github.com/spf13/cobra.Command).MarkFlagRequired -(*github.com/spf13/cobra.Command).MarkPersistentFlagRequired -(*github.com/spf13/cobra.Command).MarkPersistentFlagFilename - -(*github.com/spf13/pflag.FlagSet).MarkDeprecated - -(*google.golang.org/grpc.ClientConn).Close -(*google.golang.org/grpc.Server).Serve - -(*vitess.io/vitess/go/bytes2.Buffer).Write -(*vitess.io/vitess/go/bytes2.Buffer).WriteByte -(*vitess.io/vitess/go/bytes2.Buffer).WriteString - -(vitess.io/vitess/go/sqltypes.BinWriter).Write - -vitess.io/vitess/go/vt/orchestrator/external/golib/log.Errore -vitess.io/vitess/go/vt/orchestrator/external/golib/log.Errorf -vitess.io/vitess/go/vt/orchestrator/external/golib/log.Fatal -vitess.io/vitess/go/vt/orchestrator/external/golib/log.Fatale -vitess.io/vitess/go/vt/orchestrator/external/golib/log.Fatalf - -(*vitess.io/vitess/go/vt/vttest.LocalCluster).TearDown diff --git a/misc/git/hooks/golangci-lint b/misc/git/hooks/golangci-lint index d152cb965a3..21313316a12 100755 --- a/misc/git/hooks/golangci-lint +++ b/misc/git/hooks/golangci-lint @@ -13,18 +13,58 @@ # See the License for the specific language governing permissions and # limitations under the License. -GOLANGCI_LINT=$(command -v golangci-lint >/dev/null 2>&1) -if [ $? -eq 1 ]; then - echo "Downloading golangci-lint..." - go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.56.2 +# Required version of golangci-lint +REQUIRED_VERSION="v1.60.2" + +# Function to compare versions in pure Bash +version_greater_or_equal() { + local IFS=. + local i + local ver1=($1) + local ver2=($2) + + # Fill empty fields in ver1 with zeros + for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do + ver1[i]=0 + done + # Fill empty fields in ver2 with zeros + for ((i=${#ver2[@]}; i<${#ver1[@]}; i++)); do + ver2[i]=0 + done + + for ((i=0; i<${#ver1[@]}; i++)); do + if ((10#${ver1[i]} > 10#${ver2[i]})); then + return 0 + elif ((10#${ver1[i]} < 10#${ver2[i]})); then + return 1 + fi + done + return 0 +} + +# Check if golangci-lint is installed and capture the version +if ! command -v golangci-lint >/dev/null 2>&1; then + echo "golangci-lint not found. Installing version $REQUIRED_VERSION..." + go install github.com/golangci/golangci-lint/cmd/golangci-lint@$REQUIRED_VERSION +else + VERSION_OUTPUT=$(golangci-lint --version) + INSTALLED_VERSION=$(echo "$VERSION_OUTPUT" | sed -n 's/^golangci-lint has version v\([0-9.]*\).*/\1/p') + if ! version_greater_or_equal "$INSTALLED_VERSION" "${REQUIRED_VERSION#v}"; then + echo "golangci-lint version $INSTALLED_VERSION found, but $REQUIRED_VERSION or newer is required." + echo "Installing version $REQUIRED_VERSION..." + go install github.com/golangci/golangci-lint/cmd/golangci-lint@$REQUIRED_VERSION + fi fi +# Get list of Go files to lint gofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '^go/.*\.go$') if [ -z "$gofiles" ]; then exit 0 fi +# Get unique directories of the Go files gopackages=$(echo "$gofiles" | xargs -n1 dirname | sort -u | paste -sd ' ' -) +# Lint the Go packages echo "Linting $gopackages" -golangci-lint run $gopackages +golangci-lint run $gopackages \ No newline at end of file diff --git a/proto/binlogdata.proto b/proto/binlogdata.proto index 1e70275e8b5..595760dcd52 100644 --- a/proto/binlogdata.proto +++ b/proto/binlogdata.proto @@ -344,6 +344,7 @@ message RowEvent { string keyspace = 3; string shard = 4; uint32 flags = 5; // https://dev.mysql.com/doc/dev/mysql-server/latest/classbinary__log_1_1Rows__event.html + bool is_internal_table = 6; // set for sidecardb tables } // FieldEvent represents the field info for a table. @@ -360,6 +361,7 @@ message FieldEvent { // NOTE: because this is the use case, this is ONLY ever set today in // vstreams managed by the vstreamManager. bool enum_set_string_values = 25; + bool is_internal_table = 26; // set for sidecardb tables } // ShardGtid contains the GTID position for one shard. @@ -458,6 +460,8 @@ message VEvent { string shard = 23; // indicate that we are being throttled right now bool throttled = 24; + // ThrottledReason is a human readable string that explains why the stream is throttled + string throttled_reason = 25; } message MinimalTable { @@ -474,6 +478,11 @@ message MinimalSchema { repeated MinimalTable tables = 1; } +message VStreamOptions { + repeated string internal_tables = 1; + map config_overrides = 2; +} + // VStreamRequest is the payload for VStreamer message VStreamRequest { vtrpc.CallerID effective_caller_id = 1; @@ -483,6 +492,8 @@ message VStreamRequest { string position = 4; Filter filter = 5; repeated TableLastPK table_last_p_ks = 6; + + VStreamOptions options = 7; } // VStreamResponse is the response from VStreamer @@ -498,6 +509,7 @@ message VStreamRowsRequest { string query = 4; query.QueryResult lastpk = 5; + VStreamOptions options = 6; } // VStreamRowsResponse is the response from VStreamRows @@ -511,6 +523,8 @@ message VStreamRowsResponse { bool throttled = 6; // Heartbeat indicates that this is a heartbeat message bool heartbeat = 7; + // ThrottledReason is a human readable string that explains why the stream is throttled + string throttled_reason = 8; } @@ -519,6 +533,7 @@ message VStreamTablesRequest { vtrpc.CallerID effective_caller_id = 1; query.VTGateCallerID immediate_caller_id = 2; query.Target target = 3; + VStreamOptions options = 4; } // VStreamTablesResponse is the response from VStreamTables diff --git a/proto/mysqlctl.proto b/proto/mysqlctl.proto index 7e5fe13b991..095172c6a1b 100644 --- a/proto/mysqlctl.proto +++ b/proto/mysqlctl.proto @@ -24,6 +24,7 @@ package mysqlctl; import "topodata.proto"; import "vttime.proto"; +import "vtrpc.proto"; message StartRequest{ repeated string mysqld_args = 1; @@ -79,6 +80,22 @@ message VersionStringResponse{ string version = 1; } +message HostMetricsRequest{} + +message HostMetricsResponse{ + message Metric { + // Name of the metric + string name = 1; + // Value is the metric value + double value = 2; + // Error indicates an error retrieving the value + vtrpc.RPCError error = 3; + } + // Metrics is a map (metric name -> metric value/error) so that the client has as much + // information as possible about all the checked metrics. + map metrics = 1; +} + // MysqlCtl is the service definition service MysqlCtl { rpc Start(StartRequest) returns (StartResponse) {}; @@ -89,6 +106,7 @@ service MysqlCtl { rpc ReinitConfig(ReinitConfigRequest) returns (ReinitConfigResponse) {}; rpc RefreshConfig(RefreshConfigRequest) returns (RefreshConfigResponse) {}; rpc VersionString(VersionStringRequest) returns (VersionStringResponse) {}; + rpc HostMetrics(HostMetricsRequest) returns (HostMetricsResponse) {}; } // BackupInfo is the read-only attributes of a mysqlctl/backupstorage.BackupHandle. diff --git a/proto/query.proto b/proto/query.proto index 99bef7780ac..91c1f28ef09 100644 --- a/proto/query.proto +++ b/proto/query.proto @@ -215,6 +215,11 @@ enum Type { // BITNUM specifies a base 2 binary type (unquoted varbinary). // Properties: 34, IsText. BITNUM = 4130; + // VECTOR specifies a VECTOR type + // Properties: 35, IsQuoted. + VECTOR = 2083; + // RAW specifies a type which won't be quoted but the value used as-is while encoding. + RAW = 2084; } // Value represents a typed value. @@ -353,6 +358,11 @@ message ExecuteOptions { // priority specifies the priority of the query, between 0 and 100. This is leveraged by the transaction // throttler to determine whether, under resource contention, a query should or should not be throttled. string priority = 16; + + // timeout specifies the query timeout in milliseconds. If not set, the default timeout is used. + oneof timeout { + int64 authoritative_timeout = 17; + } } // Field describes a single column returned by a query @@ -643,6 +653,7 @@ message UnresolvedTransactionsRequest { vtrpc.CallerID effective_caller_id = 1; VTGateCallerID immediate_caller_id = 2; Target target = 3; + int64 abandon_age = 4; // Unresolved Transactions older than this (in seconds). } // UnresolvedTransactionsResponse is the returned value from UnresolvedTransactions diff --git a/proto/replicationdata.proto b/proto/replicationdata.proto index 1a8b608f984..7107332233b 100644 --- a/proto/replicationdata.proto +++ b/proto/replicationdata.proto @@ -77,6 +77,7 @@ enum StopReplicationMode { message PrimaryStatus { string position = 1; string file_position = 2; + string server_uuid = 3; } // FullStatus contains the full status of MySQL including the replication information, semi-sync information, GTID information among others diff --git a/proto/tabletmanagerdata.proto b/proto/tabletmanagerdata.proto index ffe4aa29abf..7a7f9f8cfcd 100644 --- a/proto/tabletmanagerdata.proto +++ b/proto/tabletmanagerdata.proto @@ -29,6 +29,7 @@ import "replicationdata.proto"; import "logutil.proto"; import "vttime.proto"; import "vtrpc.proto"; +import "mysqlctl.proto"; // // Data structures @@ -309,6 +310,39 @@ message ExecuteFetchAsAppResponse { query.QueryResult result = 1; } +message GetUnresolvedTransactionsRequest { + int64 abandon_age = 1; +} + +message GetUnresolvedTransactionsResponse { + repeated query.TransactionMetadata transactions = 1; +} + +message ReadTransactionRequest { + string dtid = 1; +} + +message ReadTransactionResponse { + query.TransactionMetadata transaction = 1; +} + +message ConcludeTransactionRequest { + string dtid = 1; + bool mm = 2; +} + +message ConcludeTransactionResponse { +} + + +message MysqlHostMetricsRequest { +} + +message MysqlHostMetricsResponse { + mysqlctl.HostMetricsResponse HostMetrics = 1; +} + + message ReplicationStatusRequest { } @@ -414,6 +448,13 @@ message PopulateReparentJournalRequest { message PopulateReparentJournalResponse { } +message ReadReparentJournalInfoRequest { +} + +message ReadReparentJournalInfoResponse { + int32 length = 1; +} + message InitReplicaRequest { topodata.TabletAlias parent = 1; string replication_position = 2; @@ -516,6 +557,8 @@ message BackupRequest { // UpgradeSafe indicates if the backup should be taken with innodb_fast_shutdown=0 // so that it's a backup that can be used for an upgrade. bool upgrade_safe = 4; + // BackupEngine specifies if we want to use a particular backup engine for this backup request + optional string backup_engine = 5; } message BackupResponse { @@ -533,6 +576,8 @@ message RestoreFromBackupRequest { // RestoreToTimestamp, if given, requested an inremental restore up to (and excluding) the given timestamp. // RestoreToTimestamp and RestoreToPos are mutually exclusive. vttime.Time restore_to_timestamp = 4; + // AllowedBackupEngines, if present will filter out any backups taken with engines not included in the list + repeated string allowed_backup_engines = 5; } message RestoreFromBackupResponse { @@ -567,6 +612,18 @@ message CreateVReplicationWorkflowResponse { query.QueryResult result = 1; } +message DeleteTableDataRequest { + // The key is the table that we want to delete data from. + // The value is the filter or WHERE clause to use when deleting + // data in the table. + map table_filters = 1; + // BatchSize is the number of rows to delete in a single batch. + int64 batch_size = 2; +} + +message DeleteTableDataResponse { +} + message DeleteVReplicationWorkflowRequest { string workflow = 1; } @@ -627,6 +684,18 @@ message ReadVReplicationWorkflowResponse { } repeated Stream streams = 11; string options = 12; + map config_overrides = 13; +} + +message ValidateVReplicationPermissionsRequest { +} + +message ValidateVReplicationPermissionsResponse { + // The --db_filtered_user on the tablet. + string user = 1; + // Does the user have the minimum privileges needed to manage + // vreplication metadata. + bool ok = 2; } message VDiffRequest { @@ -657,6 +726,7 @@ message VDiffReportOptions { bool debug_query = 2; string format = 3; int64 max_sample_rows = 4; + int64 row_diff_column_truncate_at = 5; } message VDiffCoreOptions { @@ -669,6 +739,7 @@ message VDiffCoreOptions { int64 max_extra_rows_to_compare = 7; bool update_table_stats = 8; int64 max_diff_seconds = 9; + optional bool auto_start = 10; } message VDiffOptions { @@ -677,6 +748,7 @@ message VDiffOptions { VDiffReportOptions report_options = 3; } + // UpdateVReplicationWorkflowRequest is used to update an existing VReplication // workflow. Note that the following fields MUST have an explicit value provided // if you do NOT wish to update the existing value to the given type's ZeroValue: @@ -687,10 +759,11 @@ message UpdateVReplicationWorkflowRequest { string workflow = 1; repeated string cells = 2; repeated topodata.TabletType tablet_types = 3; - TabletSelectionPreference tablet_selection_preference = 4; - binlogdata.OnDDLAction on_ddl = 5; - binlogdata.VReplicationWorkflowState state = 6; + optional TabletSelectionPreference tablet_selection_preference = 4; + optional binlogdata.OnDDLAction on_ddl = 5; + optional binlogdata.VReplicationWorkflowState state = 6; reserved 7; // unused, was: repeated string shards + map config_overrides = 8; } message UpdateVReplicationWorkflowResponse { @@ -707,9 +780,9 @@ message UpdateVReplicationWorkflowsRequest { bool all_workflows = 1; repeated string include_workflows = 2; repeated string exclude_workflows = 3; - binlogdata.VReplicationWorkflowState state = 4; - string message = 5; - string stop_position = 6; + optional binlogdata.VReplicationWorkflowState state = 4; + optional string message = 5; + optional string stop_position = 6; } message UpdateVReplicationWorkflowsResponse { @@ -736,6 +809,14 @@ message CheckThrottlerRequest { bool multi_metrics_enabled = 5; } +enum CheckThrottlerResponseCode { + UNDEFINED = 0; + OK = 1; + THRESHOLD_EXCEEDED = 2; + APP_DENIED = 3; + UNKNOWN_METRIC = 4; + INTERNAL_ERROR = 5; +} message CheckThrottlerResponse { // StatusCode is HTTP compliant response code (e.g. 200 for OK) @@ -767,10 +848,21 @@ message CheckThrottlerResponse { string message = 6; // Scope used in this check string scope = 7; + // ResponseCode is the enum representation of the response + CheckThrottlerResponseCode response_code = 8; } // Metrics is a map (metric name -> metric value/error) so that the client has as much // information as possible about all the checked metrics. map metrics = 7; + + // AppName is the name of app that was matched by the throttler + string app_name = 8; + + // Summary is a human readable analysis of the result + string summary = 9; + + // ResponseCode is the enum representation of the response + CheckThrottlerResponseCode response_code = 10; } message GetThrottlerStatusRequest { @@ -829,7 +921,18 @@ message GetThrottlerStatusResponse { message RecentApp { vttime.Time checked_at = 1; int32 status_code = 2; + // ResponseCode is the enum representation of the response + CheckThrottlerResponseCode response_code = 3; } // RecentApps is a map of app names to their recent check status map recent_apps = 18; } + +message ChangeTagsRequest { + map tags = 1; + bool replace = 2; +} + +message ChangeTagsResponse { + map tags = 1; +} diff --git a/proto/tabletmanagerservice.proto b/proto/tabletmanagerservice.proto index 2a593273a0c..0c26ea2d568 100644 --- a/proto/tabletmanagerservice.proto +++ b/proto/tabletmanagerservice.proto @@ -57,6 +57,9 @@ service TabletManager { rpc SetReadWrite(tabletmanagerdata.SetReadWriteRequest) returns (tabletmanagerdata.SetReadWriteResponse) {}; + // ChangeTags asks the remote tablet to change its tags + rpc ChangeTags(tabletmanagerdata.ChangeTagsRequest) returns (tabletmanagerdata.ChangeTagsResponse) {}; + // ChangeType asks the remote tablet to change its type rpc ChangeType(tabletmanagerdata.ChangeTypeRequest) returns (tabletmanagerdata.ChangeTypeResponse) {}; @@ -86,6 +89,18 @@ service TabletManager { rpc ExecuteFetchAsApp(tabletmanagerdata.ExecuteFetchAsAppRequest) returns (tabletmanagerdata.ExecuteFetchAsAppResponse) {}; + // + // Distributed Transaction related methods + // + + rpc GetUnresolvedTransactions(tabletmanagerdata.GetUnresolvedTransactionsRequest) returns (tabletmanagerdata.GetUnresolvedTransactionsResponse) {}; + + rpc ReadTransaction(tabletmanagerdata.ReadTransactionRequest) returns (tabletmanagerdata.ReadTransactionResponse) {}; + + rpc ConcludeTransaction(tabletmanagerdata.ConcludeTransactionRequest) returns (tabletmanagerdata.ConcludeTransactionResponse) {}; + + rpc MysqlHostMetrics(tabletmanagerdata.MysqlHostMetricsRequest) returns (tabletmanagerdata.MysqlHostMetricsResponse) {}; + // // Replication related methods // @@ -121,14 +136,16 @@ service TabletManager { // VReplication API rpc CreateVReplicationWorkflow(tabletmanagerdata.CreateVReplicationWorkflowRequest) returns (tabletmanagerdata.CreateVReplicationWorkflowResponse) {}; + rpc DeleteTableData(tabletmanagerdata.DeleteTableDataRequest) returns(tabletmanagerdata.DeleteTableDataResponse) {} rpc DeleteVReplicationWorkflow(tabletmanagerdata.DeleteVReplicationWorkflowRequest) returns(tabletmanagerdata.DeleteVReplicationWorkflowResponse) {}; rpc HasVReplicationWorkflows(tabletmanagerdata.HasVReplicationWorkflowsRequest) returns(tabletmanagerdata.HasVReplicationWorkflowsResponse) {}; rpc ReadVReplicationWorkflow(tabletmanagerdata.ReadVReplicationWorkflowRequest) returns(tabletmanagerdata.ReadVReplicationWorkflowResponse) {}; rpc ReadVReplicationWorkflows(tabletmanagerdata.ReadVReplicationWorkflowsRequest) returns(tabletmanagerdata.ReadVReplicationWorkflowsResponse) {}; - rpc VReplicationExec(tabletmanagerdata.VReplicationExecRequest) returns(tabletmanagerdata.VReplicationExecResponse) {}; - rpc VReplicationWaitForPos(tabletmanagerdata.VReplicationWaitForPosRequest) returns(tabletmanagerdata.VReplicationWaitForPosResponse) {}; rpc UpdateVReplicationWorkflow(tabletmanagerdata.UpdateVReplicationWorkflowRequest) returns(tabletmanagerdata.UpdateVReplicationWorkflowResponse) {}; rpc UpdateVReplicationWorkflows(tabletmanagerdata.UpdateVReplicationWorkflowsRequest) returns(tabletmanagerdata.UpdateVReplicationWorkflowsResponse) {}; + rpc ValidateVReplicationPermissions(tabletmanagerdata.ValidateVReplicationPermissionsRequest) returns(tabletmanagerdata.ValidateVReplicationPermissionsResponse) {}; + rpc VReplicationExec(tabletmanagerdata.VReplicationExecRequest) returns(tabletmanagerdata.VReplicationExecResponse) {}; + rpc VReplicationWaitForPos(tabletmanagerdata.VReplicationWaitForPosRequest) returns(tabletmanagerdata.VReplicationWaitForPosResponse) {}; // VDiff API rpc VDiff(tabletmanagerdata.VDiffRequest) returns(tabletmanagerdata.VDiffResponse) {}; @@ -147,6 +164,9 @@ service TabletManager { // reparent journal rpc PopulateReparentJournal(tabletmanagerdata.PopulateReparentJournalRequest) returns (tabletmanagerdata.PopulateReparentJournalResponse) {}; + // ReadReparentJournalInfo reads the information from reparent journal + rpc ReadReparentJournalInfo(tabletmanagerdata.ReadReparentJournalInfoRequest) returns (tabletmanagerdata.ReadReparentJournalInfoResponse) {}; + // InitReplica tells the tablet to reparent to the primary unconditionally rpc InitReplica(tabletmanagerdata.InitReplicaRequest) returns (tabletmanagerdata.InitReplicaResponse) {}; diff --git a/proto/vtadmin.proto b/proto/vtadmin.proto index d6f1047fc1e..593c9b47db2 100644 --- a/proto/vtadmin.proto +++ b/proto/vtadmin.proto @@ -44,6 +44,8 @@ service VTAdmin { // CompleteSchemaMigration completes one or all migrations in the given // cluster executed with --postpone-completion. rpc CompleteSchemaMigration(CompleteSchemaMigrationRequest) returns (vtctldata.CompleteSchemaMigrationResponse) {}; + // ConcludeTransaction concludes a distributed transaction identified by the provided dtid. + rpc ConcludeTransaction(ConcludeTransactionRequest) returns (vtctldata.ConcludeTransactionResponse) {}; // CreateKeyspace creates a new keyspace in the given cluster. rpc CreateKeyspace(CreateKeyspaceRequest) returns (CreateKeyspaceResponse) {}; // CreateShard creates a new shard in the given cluster and keyspace. @@ -114,6 +116,8 @@ service VTAdmin { rpc GetTablets(GetTabletsRequest) returns (GetTabletsResponse) {}; // GetTopologyPath returns the cell located at the specified path in the topology server. rpc GetTopologyPath(GetTopologyPathRequest) returns (vtctldata.GetTopologyPathResponse){}; + // GetUnresolvedTransactions returns the unresolved transactions for the request. + rpc GetUnresolvedTransactions(GetUnresolvedTransactionsRequest) returns (vtctldata.GetUnresolvedTransactionsResponse){}; // GetVSchema returns a VSchema for the specified keyspace in the specified // cluster. rpc GetVSchema(GetVSchemaRequest) returns (VSchema) {}; @@ -126,9 +130,24 @@ service VTAdmin { rpc GetWorkflow(GetWorkflowRequest) returns (Workflow) {}; // GetWorkflows returns the Workflows for all specified clusters. rpc GetWorkflows(GetWorkflowsRequest) returns (GetWorkflowsResponse) {}; + // GetWorkflowStatus returns the status for a specific workflow. + rpc GetWorkflowStatus(GetWorkflowStatusRequest) returns (vtctldata.WorkflowStatusResponse) {}; + // StartWorkflow starts a vreplication workflow. + rpc StartWorkflow(StartWorkflowRequest) returns (vtctldata.WorkflowUpdateResponse) {}; + // StopWorkflow stops a vreplication workflow. + rpc StopWorkflow(StopWorkflowRequest) returns (vtctldata.WorkflowUpdateResponse) {}; // LaunchSchemaMigration launches one or all migrations in the given // cluster executed with --postpone-launch. rpc LaunchSchemaMigration(LaunchSchemaMigrationRequest) returns (vtctldata.LaunchSchemaMigrationResponse) {}; + // MoveTablesComplete completes the move and cleans up the workflow and + // its related artifacts. + rpc MoveTablesComplete(MoveTablesCompleteRequest) returns (vtctldata.MoveTablesCompleteResponse) {}; + // MoveTablesCreate creates a workflow which moves one or more tables from a + // source keyspace to a target keyspace. + rpc MoveTablesCreate(MoveTablesCreateRequest) returns (vtctldata.WorkflowStatusResponse) {}; + // MaterializeCreate creates a workflow to materialize one or more tables + // from a source keyspace to a target keyspace using a provided expressions. + rpc MaterializeCreate(MaterializeCreateRequest) returns (vtctldata.MaterializeCreateResponse) {}; // PingTablet checks that the specified tablet is awake and responding to // RPCs. This command can be blocked by other in-flight operations. rpc PingTablet(PingTabletRequest) returns (PingTabletResponse) {}; @@ -160,6 +179,8 @@ service VTAdmin { rpc RetrySchemaMigration(RetrySchemaMigrationRequest) returns (vtctldata.RetrySchemaMigrationResponse) {}; // RunHealthCheck runs a healthcheck on the tablet. rpc RunHealthCheck(RunHealthCheckRequest) returns (RunHealthCheckResponse) {}; + // ReshardCreate creates a workflow to reshard a keyspace. + rpc ReshardCreate(ReshardCreateRequest) returns (vtctldata.WorkflowStatusResponse) {}; // SetReadOnly sets the tablet to read-only mode. rpc SetReadOnly(SetReadOnlyRequest) returns (SetReadOnlyResponse) {}; // SetReadWrite sets the tablet to read-write mode. @@ -197,9 +218,15 @@ service VTAdmin { rpc ValidateVersionKeyspace(ValidateVersionKeyspaceRequest) returns (vtctldata.ValidateVersionKeyspaceResponse) {}; // ValidateVersionShard validates that the version on the primary matches all of the replicas. rpc ValidateVersionShard(ValidateVersionShardRequest) returns (vtctldata.ValidateVersionShardResponse) {}; + rpc VDiffCreate(VDiffCreateRequest) returns (vtctldata.VDiffCreateResponse) {}; + rpc VDiffShow(VDiffShowRequest) returns (VDiffShowResponse) {}; // VTExplain provides information on how Vitess plans to execute a // particular query. rpc VTExplain(VTExplainRequest) returns (VTExplainResponse) {}; + // WorkflowDelete deletes a vreplication workflow. + rpc WorkflowDelete(WorkflowDeleteRequest) returns (vtctldata.WorkflowDeleteResponse) {}; + // WorkflowSwitchTraffic switches traffic for a VReplication workflow. + rpc WorkflowSwitchTraffic(WorkflowSwitchTrafficRequest) returns (vtctldata.WorkflowSwitchTrafficResponse) {}; } /* Data types */ @@ -345,6 +372,16 @@ message Workflow { vtctldata.Workflow workflow = 3; } +message WorkflowDeleteRequest { + string cluster_id = 1; + vtctldata.WorkflowDeleteRequest request = 2; +} + +message WorkflowSwitchTrafficRequest { + string cluster_id = 1; + vtctldata.WorkflowSwitchTrafficRequest request = 2; +} + /* Request/Response types */ message ApplySchemaRequest { @@ -367,6 +404,11 @@ message CompleteSchemaMigrationRequest { vtctldata.CompleteSchemaMigrationRequest request = 2; } +message ConcludeTransactionRequest { + string cluster_id = 1; + string dtid = 2; +} + message CreateKeyspaceRequest { string cluster_id = 1; vtctldata.CreateKeyspaceRequest options = 2; @@ -613,6 +655,12 @@ message GetTopologyPathRequest { string path = 2; } +message GetUnresolvedTransactionsRequest { + string cluster_id = 1; + string keyspace = 2; + int64 abandon_age = 3; +} + message GetVSchemaRequest { string cluster_id = 1; string keyspace = 2; @@ -641,6 +689,24 @@ message GetWorkflowRequest { bool active_only = 4; } +message GetWorkflowStatusRequest { + string cluster_id = 1; + string keyspace = 2; + string name = 3; +} + +message StartWorkflowRequest { + string cluster_id = 1; + string keyspace = 2; + string workflow = 3; +} + +message StopWorkflowRequest { + string cluster_id = 1; + string keyspace = 2; + string workflow = 3; +} + message GetWorkflowsRequest { repeated string cluster_ids = 1; // ActiveOnly specifies whether to return workflows that are currently @@ -672,6 +738,24 @@ message LaunchSchemaMigrationRequest { vtctldata.LaunchSchemaMigrationRequest request = 2; } +message MaterializeCreateRequest { + string cluster_id = 1; + // TableSettings is a JSON string defining what tables to materialize using + // what select statements. + string table_settings = 2; + vtctldata.MaterializeCreateRequest request = 3; +} + +message MoveTablesCompleteRequest { + string cluster_id = 1; + vtctldata.MoveTablesCompleteRequest request = 2; +} + +message MoveTablesCreateRequest { + string cluster_id = 1; + vtctldata.MoveTablesCreateRequest request = 2; +} + message PingTabletRequest { // Unique (per cluster) tablet alias of the standard form: "$cell-$uid" topodata.TabletAlias alias = 1; @@ -870,6 +954,11 @@ message RunHealthCheckResponse { Cluster cluster = 2; } +message ReshardCreateRequest { + string cluster_id = 1; + vtctldata.ReshardCreateRequest request = 2; +} + message SetReadOnlyRequest { topodata.TabletAlias alias = 1; repeated string cluster_ids = 2; @@ -960,6 +1049,34 @@ message ValidateVersionShardRequest { string shard = 3; } +message VDiffCreateRequest { + string cluster_id = 1; + vtctldata.VDiffCreateRequest request = 2; +} + +message VDiffShowRequest { + string cluster_id = 1; + vtctldata.VDiffShowRequest request = 2; +} + +message VDiffProgress { + double percentage = 1; + string eta = 2; +} + +message VDiffShardReport { + string state = 1; + int64 rows_compared = 2; + bool has_mismatch = 3; + string started_at = 4; + string completed_at = 5; + VDiffProgress progress = 6; +} + +message VDiffShowResponse { + map shard_report = 1; +} + message VTExplainRequest { string cluster = 1; string keyspace = 2; diff --git a/proto/vtctldata.proto b/proto/vtctldata.proto index 317e8706584..13b2045a8f9 100644 --- a/proto/vtctldata.proto +++ b/proto/vtctldata.proto @@ -98,6 +98,9 @@ message MaterializeSettings { tabletmanagerdata.TabletSelectionPreference tablet_selection_preference = 15; bool atomic_copy = 16; WorkflowOptions workflow_options = 17; + + // ReferenceTables is set to a csv list of tables, if the materialization is for reference tables. + repeated string reference_tables = 18; } /* Data types for VtctldServer */ @@ -206,14 +209,25 @@ message Shard { topodata.Shard shard = 3; } +enum ShardedAutoIncrementHandling { + LEAVE = 0; + REMOVE = 1; + REPLACE = 2; +} + message WorkflowOptions { string tenant_id = 1; // Remove auto_increment clauses on tables when moving them to a sharded - // keyspace. - bool strip_sharded_auto_increment = 2; + // keyspace and optionally replace them with vschema AutoIncrement + // definitions. + ShardedAutoIncrementHandling sharded_auto_increment_handling = 2; // Shards on which vreplication streams in the target keyspace are created for this workflow and to which the data // from the source will be vreplicated. repeated string shards = 3; + map config = 4; + // Where to create any related schema and vschema objects such as + // sequence tables. + string global_keyspace = 5; } // TODO: comment the hell out of this. @@ -445,6 +459,8 @@ message BackupRequest { // UpgradeSafe indicates if the backup should be taken with innodb_fast_shutdown=0 // so that it's a backup that can be used for an upgrade. bool upgrade_safe = 5; + // BackupEngine specifies if we want to use a particular backup engine for this backup request + optional string backup_engine = 6; } message BackupResponse { @@ -481,6 +497,17 @@ message CancelSchemaMigrationResponse { map rows_affected_by_shard = 1; } +message ChangeTabletTagsRequest { + topodata.TabletAlias tablet_alias = 1; + map tags = 2; + bool replace = 3; +} + +message ChangeTabletTagsResponse { + map before_tags = 1; + map after_tags = 2; +} + message ChangeTabletTypeRequest { topodata.TabletAlias tablet_alias = 1; topodata.TabletType db_type = 2; @@ -680,6 +707,9 @@ message EmergencyReparentShardRequest { // WaitForAllTablets makes ERS wait for a response from all the tablets before proceeding. // Useful when all the tablets are up and reachable. bool wait_for_all_tablets = 7; + // ExpectedPrimary is the optional alias we expect to be the current primary in order for + // the reparent operation to succeed. + topodata.TabletAlias expected_primary = 8; } message EmergencyReparentShardResponse { @@ -1101,6 +1131,23 @@ message TopologyCell { int64 version = 5; } +message GetUnresolvedTransactionsRequest { + string keyspace = 1; + int64 abandon_age = 2; // in seconds +} + +message GetUnresolvedTransactionsResponse { + repeated query.TransactionMetadata transactions = 1; +} + +message ConcludeTransactionRequest { + string dtid = 1; + repeated query.Target participants = 2; +} + +message ConcludeTransactionResponse { +} + message GetVSchemaRequest { string keyspace = 1; } @@ -1357,6 +1404,11 @@ message PlannedReparentShardRequest { // acceptable for a tablet to be eligible for promotion when Vitess makes the choice of a new primary. // A value of 0 indicates that Vitess shouldn't consider the replication lag at all. vttime.Duration tolerable_replication_lag = 6; + // AllowCrossCellPromotion allows cross cell promotion, + bool allow_cross_cell_promotion = 7; + // ExpectedPrimary is the optional alias we expect to be the current primary in order for + // the reparent operation to succeed. + topodata.TabletAlias expected_primary = 8; } message PlannedReparentShardResponse { @@ -1523,6 +1575,8 @@ message ReshardCreateRequest { bool defer_secondary_keys = 11; // Start the workflow after creating it. bool auto_start = 12; + WorkflowOptions workflow_options = 13; + } message RestoreFromBackupRequest { @@ -1539,6 +1593,8 @@ message RestoreFromBackupRequest { // RestoreToTimestamp, if given, requested an inremental restore up to (and excluding) the given timestamp. // RestoreToTimestamp and RestoreToPos are mutually exclusive. vttime.Time restore_to_timestamp = 5; + // AllowedBackupEngines, if present will filter out any backups taken with engines not included in the list + repeated string allowed_backup_engines = 6; } message RestoreFromBackupResponse { @@ -1840,26 +1896,86 @@ message ValidateVSchemaResponse { } message VDiffCreateRequest { + // The name of the workflow that we're diffing tables for. string workflow = 1; + // The keyspace where the vreplication workflow is running. string target_keyspace = 2; + // A unique identifier for the vdiff. + // If empty, a new UUID will be generated. string uuid = 3; + // The cells to look for source tablets in. + // If empty, all cells are used. repeated string source_cells = 4; + // The cells to look for target tablets in. + // If empty, all cells are used. repeated string target_cells = 5; + // The tablet types to use when searching for tablets to use when streaming + // results. + // A default value of "replica,rdonly,primary" is used by the tablet picker. repeated topodata.TabletType tablet_types = 6; + // When performing source tablet selection, look for candidates in the type + // order as they are listed in the tablet_types value (or the default of + // "replica,rdonly,primary" that the tablet picker uses). + // The default is ANY (0) and you can use INORDER (1) to e.g. ensure that a + // primary tablet is only used if there are no available replica or rdonly + // tablets. tabletmanagerdata.TabletSelectionPreference tablet_selection_preference = 7; + // The tables to compare. If empty, all tables in the workflow are compared. repeated string tables = 8; + // The maximum number of rows to compare for each table on each shard. + // The default is a max int64 value: 2^63 - 1 or 9,223,372,036,854,775,807. int64 limit = 9; + // How long to wait for the relevant vreplication stream(s) to catch up when + // attempting to setup the table snapshots on the source and target to use for + // the diff on each shard. + // The default is 30s. vttime.Duration filtered_replication_wait_time = 10; + // Include the MySQL query used for the diff in the report that is stored on + // each shard primary tablet in the _vt.vdiff_table records. bool debug_query = 11; + // Only show the Primary Key columns in any row diff output. You would + // typically want to use this if you set the max_sample_rows very high. bool only_p_ks = 12; + // Update the table statistics, using ANALYZE TABLE, on each table involved + // in the vdiff during initialization on each target shard. This will ensure + // that progress estimates are as accurate as possible -- but it does involve + // locks and can potentially impact query processing on the target keyspace. bool update_table_stats = 13; + // If there are collation differences between the source and target, you can + // have rows that are identical but simply returned in a different order from + // MySQL. We will do a second pass to compare the rows for any actual + // differences in this case and this flag allows you to control the resources + // used for this operation. + // The default is 0, comparing no extra rows. int64 max_extra_rows_to_compare = 14; + // Wait for the vdiff to complete before returning (making the call synchronous + // vs asynchronous by default). bool wait = 15; + // When wait is true, this is how frequently the vdiff progress will be shown. vttime.Duration wait_update_interval = 16; + // Automatically retry the vdiff if we encounter an error. This should almost + // always be set to true (default is false). bool auto_retry = 17; + // Include additional information in the vdiff report that is produced and + // stored on each target shard primary's _vt sidecar database. bool verbose = 18; + // The maximum number of rows to include in the row diff report (when + // differences are found) for each table on each shard. + // The default is 0, which will include no sample rows that differed. int64 max_report_sample_rows = 19; + // The maximum time that a diff of a single table can run on each target shard + // before it is stopped and then later resumed from where we left off. This + // can be helpful in limiting the impact of holding open that large transaction + // where we scan up to every row in the table. + // The default is 0 or no limit. vttime.Duration max_diff_duration = 20; + // At what length should we truncate the column values in the row diff report + // generated for each table on each shard when differences are detected. + // The default is 0, meaning do not truncate. + int64 row_diff_column_truncate_at = 21; + // Auto start the vdiff after creating it. + // The default is true if no value is specified. + optional bool auto_start = 22; } message VDiffCreateResponse { @@ -1882,6 +1998,7 @@ message VDiffResumeRequest { string workflow = 1; string target_keyspace = 2; string uuid = 3; + repeated string target_shards = 4; } message VDiffResumeResponse { @@ -1903,6 +2020,7 @@ message VDiffStopRequest { string workflow = 1; string target_keyspace = 2; string uuid = 3; + repeated string target_shards = 4; } message VDiffStopResponse { @@ -1914,6 +2032,10 @@ message WorkflowDeleteRequest { bool keep_data = 3; bool keep_routing_rules = 4; repeated string shards = 5; + // The max records to delete from the moved tables when cleaning + // up the migrated data. This is only used with multi-tenant + // MoveTables migrations. + int64 delete_batch_size = 6; } message WorkflowDeleteResponse { @@ -1970,6 +2092,7 @@ message WorkflowSwitchTrafficRequest { bool dry_run = 9; bool initialize_target_sequences = 10; repeated string shards = 11; + bool force = 12; } message WorkflowSwitchTrafficResponse { diff --git a/proto/vtctlservice.proto b/proto/vtctlservice.proto index 672374038b5..82a7907bc60 100644 --- a/proto/vtctlservice.proto +++ b/proto/vtctlservice.proto @@ -58,6 +58,8 @@ service Vtctld { rpc BackupShard(vtctldata.BackupShardRequest) returns (stream vtctldata.BackupResponse) {}; // CancelSchemaMigration cancels one or all migrations, terminating any running ones as needed. rpc CancelSchemaMigration(vtctldata.CancelSchemaMigrationRequest) returns (vtctldata.CancelSchemaMigrationResponse) {}; + // ChangeTabletTags changes the tags of the specified tablet, if possible. + rpc ChangeTabletTags(vtctldata.ChangeTabletTagsRequest) returns (vtctldata.ChangeTabletTagsResponse) {}; // ChangeTabletType changes the db type for the specified tablet, if possible. // This is used primarily to arrange replicas, and it will not convert a // primary. For that, use InitShardPrimary. @@ -70,6 +72,8 @@ service Vtctld { rpc CleanupSchemaMigration(vtctldata.CleanupSchemaMigrationRequest) returns (vtctldata.CleanupSchemaMigrationResponse) {}; // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. rpc CompleteSchemaMigration(vtctldata.CompleteSchemaMigrationRequest) returns (vtctldata.CompleteSchemaMigrationResponse) {}; + // CompleteSchemaMigration completes one or all migrations executed with --postpone-completion. + rpc ConcludeTransaction(vtctldata.ConcludeTransactionRequest) returns (vtctldata.ConcludeTransactionResponse) {}; // CreateKeyspace creates the specified keyspace in the topology. For a // SNAPSHOT keyspace, the request must specify the name of a base keyspace, // as well as a snapshot time. @@ -169,6 +173,8 @@ service Vtctld { rpc GetThrottlerStatus(vtctldata.GetThrottlerStatusRequest) returns (vtctldata.GetThrottlerStatusResponse) {}; // GetTopologyPath returns the topology cell at a given path. rpc GetTopologyPath(vtctldata.GetTopologyPathRequest) returns (vtctldata.GetTopologyPathResponse) {}; + // GetTransactions returns the unresolved transactions for the request. + rpc GetUnresolvedTransactions(vtctldata.GetUnresolvedTransactionsRequest) returns (vtctldata.GetUnresolvedTransactionsResponse) {}; // GetVersion returns the version of a tablet from its debug vars. rpc GetVersion(vtctldata.GetVersionRequest) returns (vtctldata.GetVersionResponse) {}; // GetVSchema returns the vschema for a keyspace. diff --git a/proto/vtgate.proto b/proto/vtgate.proto index 0d8781bcd61..5b080178218 100644 --- a/proto/vtgate.proto +++ b/proto/vtgate.proto @@ -302,6 +302,10 @@ message VStreamFlags { string cells = 4; string cell_preference = 5; string tablet_order = 6; + // When set, all new row events from the `heartbeat` table, for all shards, in the sidecardb will be streamed. + bool stream_keyspace_heartbeats = 7; + // Include reshard journal events in the stream. + bool include_reshard_journal_events = 8; } // VStreamRequest is the payload for VStream. diff --git a/proto/vtgateservice.proto b/proto/vtgateservice.proto index 745302ecdad..fe6170b3ecc 100644 --- a/proto/vtgateservice.proto +++ b/proto/vtgateservice.proto @@ -48,10 +48,6 @@ service Vitess { // API group: v3 rpc StreamExecute(vtgate.StreamExecuteRequest) returns (stream vtgate.StreamExecuteResponse) {}; - // ResolveTransaction resolves a transaction. - // API group: Transactions - rpc ResolveTransaction(vtgate.ResolveTransactionRequest) returns (vtgate.ResolveTransactionResponse) {}; - // VStream streams binlog events from the requested sources. rpc VStream(vtgate.VStreamRequest) returns (stream vtgate.VStreamResponse) {}; diff --git a/test.go b/test.go index 74438cbb504..aa4b2b5c4d0 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql80", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "34", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "37", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") @@ -98,6 +98,7 @@ var ( dryRun = flag.Bool("dry-run", false, "For each test to be run, it will output the test attributes, but NOT run the tests. Useful while debugging changes to test.go (this file)") remoteStats = flag.String("remote-stats", "", "url to send remote stats") buildVTAdmin = flag.Bool("build-vtadmin", false, "Enable or disable VTAdmin build during 'make build'") + buildTag = flag.String("build-tag", "", "Build tag to create a custom debug build") ) var ( @@ -111,7 +112,7 @@ const ( configFileName = "test/config.json" // List of flavors for which a bootstrap Docker image is available. - flavors = "mysql57,mysql80,percona,percona57,percona80" + flavors = "mysql80,percona80" ) // Config is the overall object serialized in test/config.json. @@ -433,6 +434,9 @@ func main() { if !*buildVTAdmin { command.Env = append(os.Environ(), "NOVTADMINBUILD=1") } + if *buildTag != "" { + command.Env = append(command.Env, fmt.Sprintf(`EXTRA_BUILD_TAGS=%s`, *buildTag)) + } if out, err := command.CombinedOutput(); err != nil { log.Fatalf("make build failed; exit code: %d, error: %v\n%s", command.ProcessState.ExitCode(), err, out) diff --git a/test/ci_workflow_gen.go b/test/ci_workflow_gen.go index 9ead7f07963..af8b0a84d47 100644 --- a/test/ci_workflow_gen.go +++ b/test/ci_workflow_gen.go @@ -31,6 +31,7 @@ type mysqlVersion string const ( mysql57 mysqlVersion = "mysql57" mysql80 mysqlVersion = "mysql80" + mysql84 mysqlVersion = "mysql84" defaultMySQLVersion = mysql80 ) @@ -42,7 +43,7 @@ var ( ) var ( - unitTestDatabases = []mysqlVersion{mysql57, mysql80} + unitTestDatabases = []mysqlVersion{mysql57, mysql80, mysql84} ) const ( @@ -74,6 +75,7 @@ var ( "xb_backup", "backup_pitr", "backup_pitr_xtrabackup", + "backup_pitr_mysqlshell", "21", "mysql_server_vault", "vstream", @@ -122,6 +124,10 @@ var ( "vttablet_prscomplex", } + buildTag = map[string]string{ + "vtgate_transaction": "debug2PC", + } + vitessTesterMap = map[string]string{ "vtgate": "./go/test/endtoend/vtgate/vitess_tester", } @@ -158,6 +164,7 @@ type unitTest struct { type clusterTest struct { Name, Shard, Platform string FileName string + BuildTag string MemoryCheck bool MakeTools, InstallXtraBackup bool Docker bool @@ -245,8 +252,9 @@ func generateClusterWorkflows(list []string, tpl string) { for _, cluster := range clusters { for _, mysqlVersion := range clusterMySQLVersions() { test := &clusterTest{ - Name: fmt.Sprintf("Cluster (%s)", cluster), - Shard: cluster, + Name: fmt.Sprintf("Cluster (%s)", cluster), + Shard: cluster, + BuildTag: buildTag[cluster], } cores16Clusters := canonnizeList(clusterRequiring16CoresMachines) for _, cores16Cluster := range cores16Clusters { diff --git a/test/config.json b/test/config.json index 4670d85ee7e..48de7daaf58 100644 --- a/test/config.json +++ b/test/config.json @@ -109,6 +109,15 @@ "RetryMax": 1, "Tags": [] }, + "backup_pitr_mysqlshell": { + "File": "unused.go", + "Args": ["vitess.io/vitess/go/test/endtoend/backup/pitr_mysqlshell", "-timeout", "30m"], + "Command": [], + "Manual": false, + "Shard": "backup_pitr_mysqlshell", + "RetryMax": 1, + "Tags": [] + }, "backup": { "File": "unused.go", "Args": ["vitess.io/vitess/go/test/endtoend/backup/vtctlbackup", "-timeout", "30m"], @@ -799,7 +808,7 @@ }, "vtgate_transaction": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction"], + "Args": ["vitess.io/vitess/go/test/endtoend/transaction"], "Command": [], "Manual": false, "Shard": "vtgate_transaction", @@ -808,7 +817,7 @@ }, "vtgate_transaction_restart": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction/restart"], + "Args": ["vitess.io/vitess/go/test/endtoend/transaction/restart"], "Command": [], "Manual": false, "Shard": "vtgate_transaction", @@ -817,7 +826,7 @@ }, "vtgate_transaction_rollback": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction/rollback"], + "Args": ["vitess.io/vitess/go/test/endtoend/transaction/rollback"], "Command": [], "Manual": false, "Shard": "vtgate_transaction", @@ -826,7 +835,7 @@ }, "vtgate_transaction_single": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction/single"], + "Args": ["vitess.io/vitess/go/test/endtoend/transaction/single"], "Command": [], "Manual": false, "Shard": "vtgate_transaction", @@ -835,7 +844,34 @@ }, "vtgate_transaction_twopc": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction/twopc"], + "Args": ["vitess.io/vitess/go/test/endtoend/transaction/twopc"], + "Command": [], + "Manual": false, + "Shard": "vtgate_transaction", + "RetryMax": 1, + "Tags": [] + }, + "vtgate_transaction_twopc_metric": { + "File": "unused.go", + "Args": ["vitess.io/vitess/go/test/endtoend/transaction/twopc/metric"], + "Command": [], + "Manual": false, + "Shard": "vtgate_transaction", + "RetryMax": 1, + "Tags": [] + }, + "vtgate_transaction_twopc_stress": { + "File": "unused.go", + "Args": ["vitess.io/vitess/go/test/endtoend/transaction/twopc/stress"], + "Command": [], + "Manual": false, + "Shard": "vtgate_transaction", + "RetryMax": 1, + "Tags": [] + }, + "vtgate_transaction_twopc_fuzz": { + "File": "unused.go", + "Args": ["vitess.io/vitess/go/test/endtoend/transaction/twopc/fuzz"], "Command": [], "Manual": false, "Shard": "vtgate_transaction", @@ -1033,7 +1069,7 @@ }, "vreplication_materialize": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/vreplication", "-run", "TestMaterialize"], + "Args": ["vitess.io/vitess/go/test/endtoend/vreplication", "-run", "Materialize"], "Command": [], "Manual": false, "Shard": "vreplication_partial_movetables_and_materialize", diff --git a/test/config_partial_keyspace.json b/test/config_partial_keyspace.json index 38149fe7acd..bcd445d34bc 100644 --- a/test/config_partial_keyspace.json +++ b/test/config_partial_keyspace.json @@ -29,7 +29,7 @@ }, "vtgate_transaction_partial_keyspace": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction"], + "Args": ["vitess.io/vitess/go/test/endtoend/transaction"], "Command": [], "Manual": false, "Shard": "vtgate_partial_keyspace", @@ -38,7 +38,7 @@ }, "vtgate_transaction_rollback_partial_keyspace": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction/rollback"], + "Args": ["vitess.io/vitess/go/test/endtoend/transaction/rollback"], "Command": [], "Manual": false, "Shard": "vtgate_partial_keyspace", @@ -47,7 +47,7 @@ }, "vtgate_transaction_single_partial_keyspace": { "File": "unused.go", - "Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction/single"], + "Args": ["vitess.io/vitess/go/test/endtoend/transaction/single"], "Command": [], "Manual": false, "Shard": "vtgate_partial_keyspace", diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index 46078cfcc0c..1b035ff0807 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -14,7 +14,7 @@ env: jobs: build: name: Run endtoend tests on {{.Name}} - runs-on: {{if .Cores16}}gh-hosted-runners-16cores-1{{else}}gh-hosted-runners-4cores-1{{end}} + runs-on: {{if .Cores16}}gh-hosted-runners-16cores-1{{else}}ubuntu-latest{{end}} steps: - name: Skip CI @@ -56,11 +56,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -85,13 +85,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -124,12 +124,12 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update # Install everything else we need, and configure - sudo apt-get -qq install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 + sudo apt-get -qq install -y mysql-server mysql-shell mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils libncurses5 {{end}} @@ -207,7 +207,7 @@ jobs: {{end}} # run the tests however you normally do, then produce a JUnit XML file - eatmydata -- go run test.go -docker={{if .Docker}}true -flavor={{.Platform}}{{else}}false{{end}} -follow -shard {{.Shard}}{{if .PartialKeyspace}} -partial-keyspace=true {{end}} | tee -a output.txt | go-junit-report -set-exit-code > report.xml + eatmydata -- go run test.go -docker={{if .Docker}}true -flavor={{.Platform}}{{else}}false{{end}} -follow -shard {{.Shard}}{{if .PartialKeyspace}} -partial-keyspace=true {{end}}{{if .BuildTag}} -build-tag={{.BuildTag}} {{end}} | tee -a output.txt | go-junit-report -set-exit-code > report.xml - name: Print test output and Record test result in launchable if PR is not a draft if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() @@ -222,7 +222,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/test/templates/cluster_endtoend_test_docker.tpl b/test/templates/cluster_endtoend_test_docker.tpl index 2b63e6d3516..f68e4223c75 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -6,7 +6,7 @@ permissions: read-all jobs: build: name: Run endtoend tests on {{.Name}} - runs-on: {{if .Cores16}}gh-hosted-runners-16cores-1{{else}}gh-hosted-runners-4cores-1{{end}} + runs-on: {{if .Cores16}}gh-hosted-runners-16cores-1{{else}}ubuntu-latest{{end}} steps: - name: Skip CI @@ -28,11 +28,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -54,9 +54,9 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/cluster_endtoend_test_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index 17d49c382e2..6e2b98cb7e4 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -19,7 +19,7 @@ env: jobs: build: name: Run endtoend tests on {{.Name}} - runs-on: {{if .Cores16}}gh-hosted-runners-16cores-1{{else}}gh-hosted-runners-4cores-1{{end}} + runs-on: {{if .Cores16}}gh-hosted-runners-16cores-1{{else}}ubuntu-latest{{end}} steps: - name: Skip CI @@ -61,11 +61,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -90,13 +90,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -126,7 +126,7 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb # Bionic packages are still compatible for Jammy since there's no MySQL 5.7 # packages for Jammy. echo mysql-apt-config mysql-apt-config/repo-codename select bionic | sudo debconf-set-selections @@ -228,7 +228,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/test/templates/cluster_vitess_tester.tpl b/test/templates/cluster_vitess_tester.tpl index bd34c2de088..92c895eb0cd 100644 --- a/test/templates/cluster_vitess_tester.tpl +++ b/test/templates/cluster_vitess_tester.tpl @@ -14,7 +14,7 @@ env: jobs: build: name: Run endtoend tests on {{.Name}} - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -43,11 +43,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -55,7 +55,7 @@ jobs: end_to_end: - 'go/**/*.go' - 'go/vt/sidecardb/**/*.sql' - - 'go/test/endtoend/onlineddl/vrepl_suite/**' + - 'go/test/endtoend/vtgate/vitess_tester/**' - 'test.go' - 'Makefile' - 'build.env' @@ -69,13 +69,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' @@ -93,7 +93,7 @@ jobs: # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C # Setup MySQL 8.0 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update @@ -110,7 +110,7 @@ jobs: go install github.com/vitessio/go-junit-report@HEAD # install vitess tester - go install github.com/vitessio/vitess-tester@eb953122baba163ed8ccaa6642458ee984f5d7e4 + go install github.com/vitessio/vt/go/vt@e43009309f599378504905d4b804460f47822ac5 - name: Setup launchable dependencies if: steps.skip-workflow.outputs.is_draft == 'false' && steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && github.base_ref == 'main' @@ -132,6 +132,7 @@ jobs: # which musn't be more than 107 characters long. export VTDATAROOT="/tmp/" source build.env + export NOVTADMINBUILD=1 make build set -exo pipefail @@ -139,11 +140,11 @@ jobs: i=1 for dir in {{.Path}}/*/; do # We go over all the directories in the given path. - # If there is a vschema file there, we use it, otherwise we let vitess-tester autogenerate it. + # If there is a vschema file there, we use it, otherwise we let vt tester autogenerate it. if [ -f $dir/vschema.json ]; then - vitess-tester --sharded --xunit --test-dir $dir --vschema "$dir"vschema.json + vt tester --xunit --vschema "$dir"vschema.json $dir/*.test else - vitess-tester --sharded --xunit --test-dir $dir + vt tester --sharded --xunit $dir/*.test fi # Number the reports by changing their file names. mv report.xml report"$i".xml @@ -163,7 +164,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report*.xml" - show: "fail, skip" + show: "fail" diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index 437971aa532..70c15c8ae64 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=34 +ARG bootstrap_version=37 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index 7fd872bde1d..3f5556ee314 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -14,7 +14,7 @@ env: jobs: test: name: {{.Name}} - runs-on: gh-hosted-runners-4cores-1 + runs-on: ubuntu-latest steps: - name: Skip CI @@ -43,11 +43,11 @@ jobs: - name: Check out code if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: actions/checkout@v4 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check for changes in relevant files if: steps.skip-workflow.outputs.skip-workflow == 'false' - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1 id: changes with: token: '' @@ -67,13 +67,13 @@ jobs: - name: Set up Go if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-go@v5 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.22.5 + go-version-file: go.mod - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' - uses: actions/setup-python@v5 + uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' @@ -98,12 +98,11 @@ jobs: sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql - {{if (eq .Platform "mysql57")}} # Get key to latest MySQL repo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C + wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.32-1_all.deb - # mysql57 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb + {{if (eq .Platform "mysql57")}} # Bionic packages are still compatible for Jammy since there's no MySQL 5.7 # packages for Jammy. echo mysql-apt-config mysql-apt-config/repo-codename select bionic | sudo debconf-set-selections @@ -111,20 +110,20 @@ jobs: sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq install -y mysql-client=5.7* mysql-community-server=5.7* mysql-server=5.7* libncurses5 - {{end}} {{if (eq .Platform "mysql80")}} - # Get key to latest MySQL repo - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C - - # mysql80 - wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* sudo apt-get -qq update sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq install -y mysql-server mysql-client + {{end}} + {{if (eq .Platform "mysql84")}} + echo mysql-apt-config mysql-apt-config/select-server select mysql-8.4-lts | sudo debconf-set-selections + sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* + sudo apt-get -qq update + sudo DEBIAN_FRONTEND="noninteractive" apt-get -qq install -y mysql-server mysql-client {{end}} sudo apt-get -qq install -y make unzip g++ curl git wget ant openjdk-11-jdk eatmydata @@ -187,7 +186,7 @@ jobs: - name: Test Summary if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' && always() - uses: test-summary/action@v2 + uses: test-summary/action@31493c76ec9e7aa675f1585d3ed6f1da69269a86 # v2.4 with: paths: "report.xml" - show: "fail, skip" + show: "fail" diff --git a/tools/check_go_versions.sh b/tools/check_go_versions.sh index 3549cdc10e9..846a10322f1 100755 --- a/tools/check_go_versions.sh +++ b/tools/check_go_versions.sh @@ -14,25 +14,9 @@ if [ -z "${GO_MOD_VERSION}" ]; then exit 1 fi -# ci workflows -TPL_GO_VERSIONS="$(awk '/go-version: /{print $(NF-0)}' .github/workflows/*.yml test/templates/*.tpl | sort -u)" -TPL_GO_VERSIONS_COUNT=$(echo "$TPL_GO_VERSIONS" | wc -l | tr -d [:space:]) -if [ "${TPL_GO_VERSIONS_COUNT}" -gt 1 ]; then - echo -e "expected a consistent 'go-version:' in CI workflow files/templates, found versions:\n${TPL_GO_VERSIONS}" - exit 1 -fi -TPL_GO_VERSION="${TPL_GO_VERSIONS}" -if [[ ! "${TPL_GO_VERSION}" =~ "${GO_MOD_VERSION}" ]]; then - echo "expected go-version in test/templates/* to be equal to go.mod: '${TPL_GO_VERSION}' != '${GO_MOD_VERSION}'" - exit 1 -fi - # docker/bootstrap/Dockerfile.common BOOTSTRAP_GO_VERSION="$(awk -F ':' '/golang:/{print $(NF-0)}' docker/bootstrap/Dockerfile.common | cut -d- -f1)" if [[ ! "${BOOTSTRAP_GO_VERSION}" =~ "${GO_MOD_VERSION}" ]]; then echo "expected golang docker version in docker/bootstrap/Dockerfile.common to be equal to go.mod: '${TPL_GO_VERSION}' != '${GO_MOD_VERSION}'" exit 1 -elif [ "${TPL_GO_VERSION}" != "${BOOTSTRAP_GO_VERSION}" ]; then - echo "expected equal go version in CI workflow files/templates and bootstrap Dockerfile: '${TPL_GO_VERSIONS}' != '${BOOTSTRAP_GO_VERSION}'" - exit 1 fi diff --git a/vitess-mixin/.env b/vitess-mixin/.env deleted file mode 100644 index 2dd23ee5572..00000000000 --- a/vitess-mixin/.env +++ /dev/null @@ -1,15 +0,0 @@ -TOPOLOGY_FLAGS=--topo_implementation consul --topo_global_server_address consul1:8500 --topo_global_root vitess/global -GRPC_PORT=15999 -WEB_PORT=8080 -MYSQL_PORT=15306 - -CELL=local -KEYSPACE=commerce -DB=commerce - -EXTERNAL_DB=0 -DB_HOST=external_db_host -DB_PORT=3306 -DB_USER=external_db_user -DB_PASS=external_db_password -DB_CHARSET=CHARACTER SET utf8 COLLATE utf8_general_ci \ No newline at end of file diff --git a/vitess-mixin/.gitignore b/vitess-mixin/.gitignore deleted file mode 100644 index eb410a1f9e8..00000000000 --- a/vitess-mixin/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.DS_Store -*.yaml -dashboards_out -prometheus_alerts.yaml -prometheus_rules.yaml -jsonnetfile.lock.json -vendor -.vscode/ diff --git a/vitess-mixin/Makefile b/vitess-mixin/Makefile deleted file mode 100644 index 267bc569312..00000000000 --- a/vitess-mixin/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -.PHONY: dashboards_out prometheus_alerts.yaml prometheus_rules.yaml test tools all e2e e2e-dev e2e-compose-up e2e-compose-down lint fmt - -help: #: Show this message. - @echo "\nAvailable Targets:\n" - @sed -ne '/@sed/!s/#: //p' $(MAKEFILE_LIST) - -all: #: format all .jsonnet/.libsonnet files, generate all dashboards json, alerts and rules yaml - @make tools - @make clean > /dev/null - @make fmt > /dev/null - @make test - @make dashboards_out > /dev/null - @make prometheus_rules.yaml > /dev/null - -fmt: #: Usage make fmt - @echo "# Formatting all .libsonnet and .jsonnet files...\n" - @scripts/fmt.sh - @echo "\nDone!\n" - -a.yaml: #: Build prometheus alerts - @echo "# Building 'prometheus_alerts.yaml'...\n" - @jsonnet -S lib/alerts.jsonnet > $@ - @echo "\nDone!\n" - -prometheus_rules.yaml: #: Build prometheus rules - @echo "# Building 'prometheus_rules.yaml'...\n" - @jsonnet -S lib/rules.jsonnet > $@ - @echo "\nDone!\n" - -dashboards_out: #: Generate Grafana Dashboards Usage: `ENV='prod' make dashboards_out` - @echo "# Building Grafana dashboards...\n" - @make clean > /dev/null - @mkdir -p dashboards_out - @[ "${ENV}" = 'dev' ] || [ "${ENV}" = 'prod' ] || ( echo -e "##ERROR\nPlease specify ENV (prod or dev)"; exit 1) - @jsonnet -J vendor --ext-str env="${ENV}" -m dashboards_out lib/dashboards.jsonnet - @echo "\nDone!\n" - -lint: #: Usage: make lint - @echo "# Linting all .libsonnet and .jsonnet files...\n" - @scripts/fmt.sh --check - @echo "\nDone!\n" - @echo "# Linting 'prometheus_rules.yaml'...\n" - @make prometheus_rules.yaml > /dev/null - @promtool check rules prometheus_rules.yaml - @echo "Done!\n" - -clean: #: Delete generated dashboards (/dashboards_out) Usage: make clean - @echo "# Cleaning up all generated files...\n" - @rm -rf dashboards_out prometheus_alerts.yaml prometheus_rules.yaml > /dev/null - @echo "\nDone!\n" - -test: #: Compare your .json generated dashboards local version with the origin/main version. - @make clean > /dev/null - @ENV=${ENV} scripts/vitess-mixin-plan.sh - @make clean > /dev/null - -tools: tools.go - @# -mod='' tells go to ignore the vendor/ directory - @cat $^ | grep _ | awk -F'"' '{print $$2}' | xargs -I% go install -mod='' % - @jb install - @jb update https://github.com/grafana/grafonnet-lib/grafonnet > /dev/null 2>&1 - - -E2E_GRAFANA_VERSION ?= 7.3.6 - -e2e: #: Run all Grafana end-to-end tests. - GRAFANA_VERSION=${E2E_GRAFANA_VERSION} \ - docker-compose -f e2e/docker-compose.yml up \ - --abort-on-container-exit \ - --exit-code-from e2e \ - --remove-orphans - -e2e-dev: #: Run Grafana e2e tests in Cypress test runner. - GRAFANA_VERSION=${E2E_GRAFANA_VERSION} \ - DISPLAY=$$(ipconfig getifaddr en0):0 \ - docker-compose -f e2e/docker-compose.dev.yml up \ - --abort-on-container-exit \ - --exit-code-from e2e \ - --remove-orphans - -e2e-compose-up: #: Run Grafana e2e environment spining Prometheus and Vitess in the backend. - GRAFANA_VERSION=${E2E_GRAFANA_VERSION} \ - COMPOSE_HTTP_TIMEOUT=200 \ - DISPLAY=$$(ipconfig getifaddr en0):0 \ - docker-compose -f e2e/docker-compose.vt.yml up \ - --remove-orphans - -e2e-compose-down: #: Clean docker compose resources - @docker-compose -f e2e/docker-compose.vt.yml down -v --remove-orphans - @rm e2e/grafana/provisioning/dashboards/*.json - @rm e2e/prometheus/prometheus_rules.yaml diff --git a/vitess-mixin/README.md b/vitess-mixin/README.md deleted file mode 100644 index 695a943295c..00000000000 --- a/vitess-mixin/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# (Beta) Monitoring Mixin for Vitess - -A set of Grafana dashboards, Prometheus rules and alerts for Vitess, packaged together in a reusable and extensible bundle. - -## 🔁 Prerequisites - -1. Go (programming language) - - Install binaries using the official [installer](https://golang.org/dl/) - - Ensure `GOPATH` variable is set in your system. See instructions [here](https://golang.org/doc/install#install). Here below there's a sample config: - - ```shell - export GOPATH=$HOME/go - export PATH="$GOPATH/bin:/usr/local/go/bin:$PATH" - ``` - -1. Install the go tools: `make tools`, `jb`, `jsonnet`, `jsonnetfmt`, and `promtool` should now be in `$GOPATH/bin`. - -1. Install the dependencies by running: `jb install` - -## ℹ️ How-to - -Customize `config.libsonnet` based on your setup. Example: specify the `dataSource` name (default to `Prometheus_Vitess`). You can then generate: - -- Prometheus alerts: `$ make prometheus_alerts.yaml` -(Note: This files is empty because the current version of the mixin uses Grafana Alerts) - -- Prometheus rules: `$ make prometheus_rules.yaml` - -- Grafana dashboard: `$ ENV='prod' make dashboards_out` (Supported environments are `dev` and `prod`). - -The `prometheus_alerts.yaml` and `prometheus_rules.yaml` file then need to passed to your Prometheus server, and the files in `dashboards_out` need to be imported into you Grafana server. - -## 👩‍💻 Development - -If you want to contribute please read [Vitess mixin quickstart guide](vitess-mixin-quickstart.md) - -## 📚 Useful links & further learning - -- For more information about monitoring mixins, see this [design doc](https://docs.google.com/document/d/1A9xvzwqnFVSOZ5fD3blKODXfsat5fg6ZhnKu9LK3lB4/edit#). -- For more motivation, see -"[The RED Method: How to instrument your services](https://kccncna17.sched.com/event/CU8K/the-red-method-how-to-instrument-your-services-b-tom-wilkie-kausal?iframe=no&w=100%&sidebar=yes&bg=no)" talk from CloudNativeCon Austin. diff --git a/vitess-mixin/alerts/alerts.libsonnet b/vitess-mixin/alerts/alerts.libsonnet deleted file mode 100644 index 732a682f8b6..00000000000 --- a/vitess-mixin/alerts/alerts.libsonnet +++ /dev/null @@ -1,5 +0,0 @@ -{ - prometheusAlerts+:: { - - }, -} diff --git a/vitess-mixin/config.libsonnet b/vitess-mixin/config.libsonnet deleted file mode 100644 index 8c8f69ca0ee..00000000000 --- a/vitess-mixin/config.libsonnet +++ /dev/null @@ -1,74 +0,0 @@ -{ - _config+:: { - - // Selectors are inserted between {} in Prometheus queries. - vtctldSelector: 'job="vitess-vtctld"', - vtgateSelector: 'job="vitess-vtgate"', - vttabletSelector: 'job="vitess-vttablet"', - vtgateNodeSelector: 'job="node-exporter-vitess-vtgate"', - mysqlSelector: 'job="mysql"', - defaultTimeFrom: 'now-30m', - vttabletMountpoint: '/mnt', - - // Datasource to use - dataSource: 'Prometheus', - nodeDataSource: 'Prometheus', - - // Default config for the Grafana dashboards in the Vitess Mixin - grafanaDashboardMetadataDefault: { - dashboardNameSuffix: '(auto-generated)', - dashboardAlertPrefix: 'alerts', - dashboardTags: ['vitess-mixin'], - }, - - dashborardLinks: { - title: 'vitess-mixin', - tags: ['vitess-mixin'], - keepTime: true, - includeVars: false, - }, - - // Grafana dashboard IDs are necessary for stable links for dashboards - grafanaDashboardMetadata: { - - local defaultDashboard = { - environments: ['dev', 'prod'], - time_from: $._config.defaultTimeFrom, - }, - - // Overview - clusterOverview+: defaultDashboard { - uid: 'vitess-cluster-overview', - title: 'cluster - overview %(dashboardNameSuffix)s' % $._config.grafanaDashboardMetadataDefault, - description: 'General cluster overview', - dashboardTags: $._config.grafanaDashboardMetadataDefault.dashboardTags + ['overview', 'cluster'], - }, - vtgateOverview+: defaultDashboard { - uid: 'vitess-vtgate-overview', - title: 'vtgate - overview %(dashboardNameSuffix)s' % $._config.grafanaDashboardMetadataDefault, - description: 'General vtgate overview', - dashboardTags: $._config.grafanaDashboardMetadataDefault.dashboardTags + ['overview', 'vtgate'], - }, - - // Host View - vttabletHostView+: defaultDashboard { - uid: 'vitess-vttablet-host-view', - title: 'vttablet - host view %(dashboardNameSuffix)s' % $._config.grafanaDashboardMetadataDefault, - description: 'Detailed vttablet host view', - dashboardTags: $._config.grafanaDashboardMetadataDefault.dashboardTags + ['vttablet', 'host'], - }, - vtgateHostView+: defaultDashboard { - uid: 'vitess-vtgate-host-view', - title: 'vtgate - host view %(dashboardNameSuffix)s' % $._config.grafanaDashboardMetadataDefault, - description: 'Detailed vtgate view by host', - dashboardTags: $._config.grafanaDashboardMetadataDefault.dashboardTags + ['vtgate', 'host'], - }, - }, - }, - - os: import 'dashboards/resources/config/os_config.libsonnet', - vttablet: import 'dashboards/resources/config/vttablet_config.libsonnet', - vtgate: import 'dashboards/resources/config/vtgate_config.libsonnet', - mysql: import 'dashboards/resources/config/mysql_config.libsonnet', - row: import 'dashboards/resources/config/row_config.libsonnet', -} diff --git a/vitess-mixin/dashboards/dashboards.libsonnet b/vitess-mixin/dashboards/dashboards.libsonnet deleted file mode 100644 index 5840e4b5228..00000000000 --- a/vitess-mixin/dashboards/dashboards.libsonnet +++ /dev/null @@ -1,5 +0,0 @@ -(import 'layouts/cluster_overview.libsonnet') + -(import 'layouts/vtgate_host_view.libsonnet') + -(import 'layouts/vtgate_overview.libsonnet') + -(import 'layouts/vttablet_host_view.libsonnet') + -(import 'defaults.libsonnet') diff --git a/vitess-mixin/dashboards/defaults.libsonnet b/vitess-mixin/dashboards/defaults.libsonnet deleted file mode 100644 index d94de1fab09..00000000000 --- a/vitess-mixin/dashboards/defaults.libsonnet +++ /dev/null @@ -1,24 +0,0 @@ -{ - local grafanaDashboards = super.grafanaDashboards, - - grafanaDashboards:: { - [filename]: grafanaDashboards[filename] { - // Modify tooltip to only show a single value - rows: [ - row { - panels: [ - panel { - tooltip+: { - shared: false, - }, - } - for panel in super.panels - ], - } - for row in super.rows - ], - - } - for filename in std.objectFields(grafanaDashboards) - }, -} diff --git a/vitess-mixin/dashboards/layouts/cluster_overview.libsonnet b/vitess-mixin/dashboards/layouts/cluster_overview.libsonnet deleted file mode 100644 index 6db716c982c..00000000000 --- a/vitess-mixin/dashboards/layouts/cluster_overview.libsonnet +++ /dev/null @@ -1,56 +0,0 @@ -local helpers = import '../resources/grafonnet/helpers/helpers.libsonnet'; -local panels = import '../resources/grafonnet/panels.libsonnet'; -local rows = import '../resources/grafonnet/rows.libsonnet'; -local singlestats = import '../resources/grafonnet/singlestats.libsonnet'; -local templates = import '../resources/grafonnet/templates.libsonnet'; -local texts = import '../resources/grafonnet/texts.libsonnet'; - -local config = import '../../config.libsonnet'; - -{ - grafanaDashboards+:: { - 'cluster_overview.json': - - helpers.dashboard.getDashboard(config._config.grafanaDashboardMetadata.clusterOverview) - .addTemplates([ - templates.interval, - ]) - .addLink(helpers.default.getDashboardLink(config._config.dashborardLinks)) - .addPanels([ - texts.clusterOverview { gridPos: { h: 3, w: 24, x: 0, y: 0 } }, - singlestats.vtgateSuccessRate { gridPos: { h: 4, w: 4, x: 0, y: 3 } }, - singlestats.vttabletQuerySuccess { gridPos: { h: 4, w: 4, x: 4, y: 3 } }, - helpers.vtgate.getSingleStat(config.vtgate.singlestats.vtgateQueryLatencyP99) { gridPos: { h: 4, w: 4, x: 8, y: 3 } }, - helpers.vtgate.getSingleStat(config.vtgate.singlestats.vtgateQPS) { gridPos: { h: 2, w: 4, x: 12, y: 3 } }, - helpers.vttablet.getSingleStat(config.vttablet.singlestats.vttabletQPS) { gridPos: { h: 2, w: 4, x: 12, y: 5 } }, - singlestats.mysqlQPS { gridPos: { h: 2, w: 4, x: 16, y: 3 } }, - singlestats.keyspaceCount { gridPos: { h: 2, w: 2, x: 16, y: 3 } }, - singlestats.shardCount { gridPos: { h: 2, w: 2, x: 18, y: 3 } }, - singlestats.vtgateUp { gridPos: { h: 2, w: 2, x: 20, y: 3 } }, - singlestats.vtctldUp { gridPos: { h: 2, w: 2, x: 20, y: 5 } }, - singlestats.vttabletUp { gridPos: { h: 2, w: 2, x: 22, y: 3 } }, - - helpers.vtgate.getPanel(config.vtgate.panels.vtgateRequests) { gridPos: { h: 6, w: 8, x: 0, y: 7 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorRate) { gridPos: { h: 6, w: 8, x: 8, y: 7 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP99) { gridPos: { h: 6, w: 8, x: 16, y: 7 } }, - - rows.RED { gridPos: { h: 1, w: 24, x: 0, y: 13 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateRequestsByKeyspace) { gridPos: { h: 8, w: 8, x: 0, y: 14 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorRateByKeyspace) { gridPos: { h: 8, w: 8, x: 8, y: 14 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP99ByKeyspace) { gridPos: { h: 8, w: 8, x: 16, y: 14 } }, - - rows.tabletsQueries { gridPos: { h: 1, w: 24, x: 0, y: 22 } }, - helpers.vttablet.getPanel(config.vttablet.panels.countServingTablets) { gridPos: { h: 8, w: 8, x: 0, y: 23 } }, - helpers.mysql.getPanel(config.mysql.panels.mysqlSlowQueries) { gridPos: { h: 8, w: 8, x: 8, y: 23 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryTransactionKilled) { gridPos: { h: 8, w: 8, x: 16, y: 23 } }, - - rows.serviceRestart { gridPos: { h: 1, w: 24, x: 0, y: 31 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateRestart) { gridPos: { h: 8, w: 8, x: 0, y: 32 } }, - panels.vtctldRestart { gridPos: { h: 8, w: 8, x: 8, y: 32 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletRestart) { gridPos: { h: 8, w: 8, x: 16, y: 32 } }, - - helpers.mysql.getPanel(config.mysql.panels.mysqlRestart) { gridPos: { h: 8, w: 8, x: 16, y: 40 } }, - ]), - - }, -} diff --git a/vitess-mixin/dashboards/layouts/vtgate_host_view.libsonnet b/vitess-mixin/dashboards/layouts/vtgate_host_view.libsonnet deleted file mode 100644 index 139999e09fc..00000000000 --- a/vitess-mixin/dashboards/layouts/vtgate_host_view.libsonnet +++ /dev/null @@ -1,49 +0,0 @@ -local heatmaps = import '../resources/grafonnet/heatmaps.libsonnet'; -local helpers = import '../resources/grafonnet/helpers/helpers.libsonnet'; -local rows = import '../resources/grafonnet/rows.libsonnet'; -local singlestats = import '../resources/grafonnet/singlestats.libsonnet'; -local templates = import '../resources/grafonnet/templates.libsonnet'; -local texts = import '../resources/grafonnet/texts.libsonnet'; - -local config = import '../../config.libsonnet'; - -// TODO: add connections info - -{ - grafanaDashboards+:: { - 'vtgate_host_view.json': - - helpers.dashboard.getDashboard(config._config.grafanaDashboardMetadata.vtgateHostView) - .addTemplates([ - templates.hostVtgate, - ]) - .addLink(helpers.default.getDashboardLink(config._config.dashborardLinks)) - .addPanels([ - texts.vtgateHost { gridPos: { h: 3, w: 24, x: 0, y: 0 } }, - rows.RED { gridPos: { h: 1, w: 24, x: 0, y: 4 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateRequestsByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 5 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorRateByInstance) { gridPos: { h: 7, w: 8, x: 8, y: 5 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP99ByInstance) { gridPos: { h: 7, w: 8, x: 16, y: 5 } }, - rows.REDByTabletType.addPanels([ - helpers.vtgate.getPanel(config.vtgate.panels.vtgateRequestsByInstanceDBType) { gridPos: { h: 7, w: 8, x: 0, y: 9 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorRateByInstanceDBType) { gridPos: { h: 7, w: 8, x: 8, y: 9 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP99ByInstanceDBType) { gridPos: { h: 7, w: 8, x: 16, y: 9 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 8 } }, - rows.errors.addPanels([ - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorsByInstanceKeyspace) { gridPos: { h: 7, w: 8, x: 0, y: 17 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorsByInstanceCode) { gridPos: { h: 7, w: 8, x: 8, y: 17 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 16 } }, - rows.duration.addPanels([ - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationAVGByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 25 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP50ByInstance) { gridPos: { h: 7, w: 8, x: 8, y: 25 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP95ByInstance) { gridPos: { h: 7, w: 8, x: 16, y: 25 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 24 } }, - rows.OS.addPanels([ - helpers.os.getPanel(config.os.panels.CPUUsageByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 33 } }, - helpers.os.getPanel(config.os.panels.MemoryUsageByInstance) { gridPos: { h: 7, w: 8, x: 8, y: 33 } }, - helpers.os.getPanel(config.os.panels.NetworkUsageByInstance) { gridPos: { h: 7, w: 8, x: 16, y: 33 } }, - helpers.os.getPanel(config.os.panels.TCPRetransmissionsByInstance) { gridPos: { h: 7, w: 8, x: 16, y: 40 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 32 } }, - ]), - }, -} diff --git a/vitess-mixin/dashboards/layouts/vtgate_overview.libsonnet b/vitess-mixin/dashboards/layouts/vtgate_overview.libsonnet deleted file mode 100644 index b2c14eb8563..00000000000 --- a/vitess-mixin/dashboards/layouts/vtgate_overview.libsonnet +++ /dev/null @@ -1,58 +0,0 @@ -local heatmaps = import '../resources/grafonnet/heatmaps.libsonnet'; -local helpers = import '../resources/grafonnet/helpers/helpers.libsonnet'; -local rows = import '../resources/grafonnet/rows.libsonnet'; -local singlestats = import '../resources/grafonnet/singlestats.libsonnet'; -local templates = import '../resources/grafonnet/templates.libsonnet'; -local texts = import '../resources/grafonnet/texts.libsonnet'; - -local config = import '../../config.libsonnet'; - -// TODO: add connections info - -{ - grafanaDashboards+:: { - 'vtgate_overview.json': - - helpers.dashboard.getDashboard(config._config.grafanaDashboardMetadata.vtgateOverview) - .addLink(helpers.default.getDashboardLink(config._config.dashborardLinks)) - .addPanels([ - texts.vtgateOverview { gridPos: { h: 3, w: 24, x: 0, y: 0 } }, - - rows.RED { gridPos: { h: 1, w: 24, x: 0, y: 4 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateRequests) { gridPos: { h: 7, w: 8, x: 0, y: 5 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorRate) { gridPos: { h: 7, w: 8, x: 8, y: 5 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP99) { gridPos: { h: 7, w: 8, x: 16, y: 5 } }, - - rows.REDByKeyspace.addPanels([ - helpers.vtgate.getPanel(config.vtgate.panels.vtgateRequestsByKeyspace) { gridPos: { h: 7, w: 8, x: 0, y: 13 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorRateByKeyspace) { gridPos: { h: 7, w: 8, x: 8, y: 13 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP99ByKeyspace) { gridPos: { h: 7, w: 8, x: 16, y: 13 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 12 } }, - - rows.REDByTabletType.addPanels([ - helpers.vtgate.getPanel(config.vtgate.panels.vtgateRequestsByDBType) { gridPos: { h: 7, w: 8, x: 0, y: 21 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorRateByDBType) { gridPos: { h: 7, w: 8, x: 8, y: 21 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP99ByDBType) { gridPos: { h: 7, w: 8, x: 16, y: 21 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 20 } }, - - rows.errors.addPanels([ - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorsByCode) { gridPos: { h: 7, w: 8, x: 0, y: 29 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorsByOperation) { gridPos: { h: 7, w: 8, x: 8, y: 29 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateErrorsByDbtype) { gridPos: { h: 7, w: 8, x: 16, y: 29 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 28 } }, - - rows.duration.addPanels([ - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationAVG) { gridPos: { h: 7, w: 8, x: 0, y: 37 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP50) { gridPos: { h: 7, w: 8, x: 8, y: 37 } }, - helpers.vtgate.getPanel(config.vtgate.panels.vtgateDurationP95) { gridPos: { h: 7, w: 8, x: 16, y: 37 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 36 } }, - - rows.OS.addPanels([ - helpers.os.getPanel(config.os.panels.CPUUsage) { gridPos: { h: 7, w: 8, x: 0, y: 45 } }, - helpers.os.getPanel(config.os.panels.MemoryUsage) { gridPos: { h: 7, w: 8, x: 8, y: 45 } }, - helpers.os.getPanel(config.os.panels.NetworkUsage) { gridPos: { h: 7, w: 8, x: 16, y: 45 } }, - helpers.os.getPanel(config.os.panels.TCPRetransmissions) { gridPos: { h: 7, w: 8, x: 16, y: 52 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 44 } }, - ]), - }, -} diff --git a/vitess-mixin/dashboards/layouts/vttablet_host_view.libsonnet b/vitess-mixin/dashboards/layouts/vttablet_host_view.libsonnet deleted file mode 100644 index 7148deb44ee..00000000000 --- a/vitess-mixin/dashboards/layouts/vttablet_host_view.libsonnet +++ /dev/null @@ -1,103 +0,0 @@ -local heatmaps = import '../resources/grafonnet/heatmaps.libsonnet'; -local helpers = import '../resources/grafonnet/helpers/helpers.libsonnet'; -local rows = import '../resources/grafonnet/rows.libsonnet'; -local templates = import '../resources/grafonnet/templates.libsonnet'; -local texts = import '../resources/grafonnet/texts.libsonnet'; - -local config = import '../../config.libsonnet'; -local rows_helper = helpers.default; - -{ - grafanaDashboards+:: { - 'vttablet_host_view.json': - - helpers.dashboard.getDashboard(config._config.grafanaDashboardMetadata.vttabletHostView) - .addTemplates( - [ - templates.hostVttablet, - ] - ).addLink(helpers.default.getDashboardLink(config._config.dashborardLinks)) - .addPanels( - [ - texts.vttabletHost { gridPos: { h: 3, w: 24, x: 0, y: 0 } }, - - rows.RED { gridPos: { h: 1, w: 24, x: 0, y: 4 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletRequestsByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 5 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletErrorRateByInstance) { gridPos: { h: 7, w: 8, x: 8, y: 5 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryDurationP99ByInstance) { gridPos: { h: 7, w: 8, x: 16, y: 5 } }, - - rows.REDByPlanType.addPanels([ - helpers.vttablet.getPanel(config.vttablet.panels.vttabletRequestsByPlanType) { gridPos: { h: 7, w: 8, x: 0, y: 13 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletErrorRateByPlanFilteredByInstance) { gridPos: { h: 7, w: 8, x: 8, y: 13 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryDurationP99ByPlan) { gridPos: { h: 7, w: 8, x: 16, y: 13 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 12 } }, - - rows.REDByTable.addPanels([ - helpers.vttablet.getPanel(config.vttablet.panels.vttabletRequestsByTableFilteredByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 29 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletErrorRateByTableFilteredByInstance) { gridPos: { h: 7, w: 8, x: 8, y: 29 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 28 } }, - - rows.rowsReturned.addPanels([ - helpers.vttablet.getPanel(config.vttablet.panels.vttabletRowsReturnedByTableFilteredByInstance) { gridPos: { h: 7, w: 12, x: 0, y: 37 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletRowsReturnedByPlansFilterByInstance) { gridPos: { h: 7, w: 12, x: 12, y: 37 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 36 } }, - - rows_helper.getRow(config.row.queryErrors).addPanels([ - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueriesKilled) { gridPos: { h: 7, w: 8, x: 0, y: 45 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryErrorsByType) { gridPos: { h: 7, w: 8, x: 8, y: 45 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 44 } }, - - rows.vitessQueryPool.addPanels([ - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryPoolAvailableConnections) { gridPos: { h: 7, w: 8, x: 0, y: 52 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryPoolActiveConnections) { gridPos: { h: 7, w: 8, x: 8, y: 52 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryPoolIddleClosedRate) { gridPos: { h: 7, w: 8, x: 16, y: 52 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryPoolWaitCount) { gridPos: { h: 7, w: 8, x: 0, y: 59 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryPoolAvgWaitTime) { gridPos: { h: 7, w: 8, x: 8, y: 59 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 51 } }, - - rows.vitessTransactionPool.addPanels([ - helpers.vttablet.getPanel(config.vttablet.panels.vttabletTransactionPoolAvailableConnections) { gridPos: { h: 7, w: 8, x: 0, y: 67 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletTransactionPoolActiveConnections) { gridPos: { h: 7, w: 8, x: 8, y: 67 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletTransactionPoolIddleClosedRate) { gridPos: { h: 7, w: 8, x: 16, y: 67 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletTransactionPoolWaitCount) { gridPos: { h: 7, w: 8, x: 0, y: 74 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletTransactionPoolAvgWaitTime) { gridPos: { h: 7, w: 8, x: 8, y: 74 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 66 } }, - - rows_helper.getRow(config.row.vitessTimings).addPanels([ - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryDurationAvgByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 82 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryDurationP50ByInstance) { gridPos: { h: 7, w: 8, x: 8, y: 82 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletQueryDurationP95ByInstance) { gridPos: { h: 7, w: 8, x: 16, y: 82 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletTransactionDurationAvgByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 89 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletTransactionDurationP50ByInstance) { gridPos: { h: 7, w: 8, x: 8, y: 89 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletTransactionDurationP95ByInstance) { gridPos: { h: 7, w: 8, x: 16, y: 89 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vtgateToVtTabletCallTimeAvgFilteredByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 86 } }, - heatmaps.vttabletQueryTimeDistribution { gridPos: { h: 7, w: 16, x: 8, y: 86 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 81 } }, - - rows.mysql.addPanels([ - helpers.mysql.getPanel(config.mysql.panels.mysqlSlowQueriesByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 94 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 93 } }, - - rows_helper.getRow(config.row.mysqlTimings).addPanels([ - helpers.vttablet.getPanel(config.vttablet.panels.vttabletMysqlTimeAvgFilteredByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 102 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletMysqlExecTimeP50FilterebyInstance) { gridPos: { h: 7, w: 8, x: 8, y: 102 } }, - helpers.vttablet.getPanel(config.vttablet.panels.vttabletMysqlExecTimeP95FilterebyInstance) { gridPos: { h: 7, w: 8, x: 16, y: 102 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 101 } }, - - rows.OS.addPanels([ - helpers.os.getPanel(config.os.panels.CPUUsageByInstance) { gridPos: { h: 7, w: 8, x: 0, y: 110 } }, - helpers.os.getPanel(config.os.panels.MemoryUsageByInstance) { gridPos: { h: 7, w: 8, x: 8, y: 110 } }, - helpers.os.getPanel(config.os.panels.DiskUsageByInstance) { gridPos: { h: 7, w: 8, x: 16, y: 110 } }, - helpers.os.getPanel(config.os.panels.NetworkTxByInstance) { gridPos: { h: 7, w: 12, x: 0, y: 117 } }, - helpers.os.getPanel(config.os.panels.NetworkRxByInstance) { gridPos: { h: 7, w: 12, x: 12, y: 117 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 109 } }, - - rows_helper.getRow(config.row.misc).addPanels([ - helpers.os.getPanel(config.vttablet.panels.vttabletGarbageCollectionCount) { gridPos: { h: 7, w: 8, x: 0, y: 125 } }, - helpers.os.getPanel(config.vttablet.panels.vttabletGarbageCollectionDuration) { gridPos: { h: 7, w: 8, x: 8, y: 125 } }, - helpers.os.getPanel(config.vttablet.panels.vttabletGarbageCollectionDurationQuantiles) { gridPos: { h: 7, w: 8, x: 16, y: 125 } }, - ]) { gridPos: { h: 1, w: 24, x: 0, y: 124 } }, - ], - ), - }, -} diff --git a/vitess-mixin/dashboards/resources/config/configuration_templates.libsonnet b/vitess-mixin/dashboards/resources/config/configuration_templates.libsonnet deleted file mode 100644 index 6f1f85da0a3..00000000000 --- a/vitess-mixin/dashboards/resources/config/configuration_templates.libsonnet +++ /dev/null @@ -1,125 +0,0 @@ -local config = import '../../../config.libsonnet'; - -{ - //Override default_panel values with custom configuration - prometheus_vitess: { - panel: { - - datasource: { - datasource: '%(dataSource)s' % config._config, - }, - - default+: self.datasource { - fill: 0, - legend_alignAsTable: true, - legend_values: true, - min: 0, - shared_tooltip: false, - }, - - legend_max+: self.default { - legend_max: true, - }, - - legend_min_max_avg+: self.default { - legend_max: true, - legend_min: true, - legend_avg: true, - }, - - legend_min_max_current+: self.default { - legend_max: true, - legend_min: true, - legend_current: true, - }, - - null_as_zeros+: self.default { - nullPointMode: 'null as zero', - }, - - mysql_default+: self.default { - legend_max: true, - legend_sort: 'max', - }, - - orc_default+: self.default { - legend_current: true, - legend_rightSide: true, - legend_sort: 'current', - legend_sortDesc: false, - pointradius: 5, - sort: 'none', - }, - - vitess_vttablet_host_view+: self.mysql_default { - legend_current: true, - legend_min: true, - legend_sort: 'current', - legend_sortDesc: true, - }, - - go_gc_seconds+: self.legend_max { - format: 's', - }, - - go_gc_ops+: self.legend_max { - format: 'ops', - }, - - mysql_timings+: self.legend_min_max_avg { - legend_sort: 'max', - legend_sortDesc: true, - format: 's', - }, - - vtgate_to_vttablet_calls: self.legend_min_max_avg + self.null_as_zeros { - format: 's', - legend_sortDesc: true, - legend_sort: 'max', - }, - - }, - }, - - prometheus_node: { - panel: { - default: { - datasource: '%(nodeDataSource)s' % config._config, - fill: 0, - legend_alignAsTable: true, - legend_current: true, - legend_sort: 'current', - legend_sortDesc: true, - legend_values: true, - min: 0, - sort: 'decreasing', - }, - - percent_panel: self.default { - format: 'percentunit', - legend_min: true, - legend_max: true, - }, - - null_as_zeros+: self.default { - nullPointMode: 'null as zero', - }, - - vttablet_host_view: self.percent_panel { - legend_avg: true, - legend_current: false, - legend_sort: 'max', - }, - - performance_analysis_short: self.percent_panel { - format: 'short', - legend_min: false, - legend_max: false, - }, - - performance_analysis_seconds+: self.performance_analysis_short { - format: 's', - }, - }, - }, -} diff --git a/vitess-mixin/dashboards/resources/config/mysql_config.libsonnet b/vitess-mixin/dashboards/resources/config/mysql_config.libsonnet deleted file mode 100644 index 543e3565902..00000000000 --- a/vitess-mixin/dashboards/resources/config/mysql_config.libsonnet +++ /dev/null @@ -1,87 +0,0 @@ -local config = import '../../../config.libsonnet'; -local configuration_templates = import './configuration_templates.libsonnet'; -local vitess_ct = configuration_templates.prometheus_vitess; - -// TODO: move local template variables and fields to ./configuration_templates.libsonnet. -{ - // TODO: add description for each panel. - panels: { - - local panel_template = vitess_ct.panel.mysql_default, - local vttablet_host_view_panel_template = vitess_ct.panel.vitess_vttablet_host_view, - - // TODO Create a recording rule for the prometheus target. - mysqlRestart: panel_template { - title: 'MySQL (by keyspace/shard)', - bars: true, - format: 'short', - legend_sort: 'max', - legend_sortDesc: false, - lines: false, - sort: 'increasing', - targets: [ - { - expr: ||| - count by (keyspace, shard) ( - idelta ( - mysql_global_status_uptime{ - %(mysqlSelector)s - }[5m] - ) < 0 - ) - ||| % config._config, - legendFormat: '{{keyspace}}/{{shard}}', - }, - ], - }, - - // TODO Create a recording rule for the prometheus target. - mysqlSlowQueries: panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Slow queries', - format: 'cps', - legend_min: true, - legend_current: true, - legend_sort: 'current', - legend_sortDesc: true, - sort: 'decreasing', - nullPointMode: 'null as zero', - targets: [ - { - expr: ||| - sum ( - rate( - mysql_global_status_slow_queries{ - %(mysqlSelector)s - }[$interval] - ) - ) - ||| % config._config, - legendFormat: 'Slow Queries', - }, - ], - }, - - // TODO Create a recording rule for the prometheus target. - mysqlSlowQueriesByInstance: vttablet_host_view_panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Slow Queries', - format: 'ops', - targets: [ - { - expr: ||| - sum by(instance)( - rate( - mysql_global_status_slow_queries{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - intervalFactor: 1, - }, - ], - }, - }, -} diff --git a/vitess-mixin/dashboards/resources/config/os_config.libsonnet b/vitess-mixin/dashboards/resources/config/os_config.libsonnet deleted file mode 100644 index 8451311cb1b..00000000000 --- a/vitess-mixin/dashboards/resources/config/os_config.libsonnet +++ /dev/null @@ -1,384 +0,0 @@ -/** This is a configuration file containing metadata for OS (Prometheus Node) grafana resources. */ - -local config = import '../../../config.libsonnet'; -local configuration_templates = import './configuration_templates.libsonnet'; -local node_ct = configuration_templates.prometheus_node; - -// TODO: move local template variables and fields to ./configuration_templates.libsonnet. -{ - // TODO: add description for each panel. - panels: { - - local vtgate_panel_template = node_ct.panel.percent_panel, - local vttablet_host_view_panel_template = node_ct.panel.vttablet_host_view, - - CPUUsage: - vtgate_panel_template - + node_ct.panel.null_as_zeros { - title: 'CPU Usage', - targets: [ - { - expr: - ||| - 1 - - avg ( - rate( - node_cpu_seconds_total{ - %(vtgateNodeSelector)s, - mode="idle" - }[1m] - ) - ) - ||| % config._config, - legendFormat: 'cpu usage', - }, - ], - }, - - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - CPUUsageByInstance: - vtgate_panel_template - + node_ct.panel.null_as_zeros { - title: 'CPU Usage', - targets: [ - { - expr: - ||| - 1 - - avg by (instance)( - rate( - node_cpu_seconds_total{ - instance=~"$host", - mode="idle" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - MemoryUsage: - vtgate_panel_template - + node_ct.panel.null_as_zeros { - title: 'Memory Usage', - targets: [ - { - expr: - ||| - 1 - - sum ( - node_memory_MemAvailable_bytes{ - %(vtgateNodeSelector)s - } - ) - / - sum ( - node_memory_MemTotal_bytes{ - %(vtgateNodeSelector)s - } - ) - ||| % config._config, - legendFormat: 'Memory Usage', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - MemoryUsageByInstance: - vtgate_panel_template - + node_ct.panel.null_as_zeros { - title: 'Memory Usage', - targets: [ - { - expr: - ||| - 1 - - sum by (instance)( - node_memory_MemAvailable_bytes{ - instance=~"$host" - } - ) - / - sum by (instance)( - node_memory_MemTotal_bytes{ - instance=~"$host" - } - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - TCPRetransmissions: - vtgate_panel_template - + node_ct.panel.null_as_zeros { - title: 'TCP Retransmissions', - targets: [ - { - expr: - ||| - sum ( - rate( - node_netstat_Tcp_RetransSegs{ - %(vtgateNodeSelector)s - }[1m] - ) - ) - / - sum ( - rate( - node_netstat_Tcp_OutSegs{ - %(vtgateNodeSelector)s - }[1m] - ) - ) - ||| % config._config, - legendFormat: 'TCP retransmissions', - }, - ], - }, - - TCPRetransmissionsByInstance: - vtgate_panel_template - + node_ct.panel.null_as_zeros { - title: 'TCP Retransmissions', - targets: [ - { - expr: - ||| - sum by (instance) ( - rate( - node_netstat_Tcp_RetransSegs{ - instance=~"$host" - }[1m] - ) - ) - / - sum by (instance) ( - rate( - node_netstat_Tcp_OutSegs{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - NetworkUsage: - vtgate_panel_template - + node_ct.panel.null_as_zeros { - title: 'Network Usage', - format: 'bps', - min: null, - seriesOverrides: [ - { - alias: '/egress .*/', - transform: 'negative-Y', - }, - ], - targets: [ - { - expr: - ||| - sum ( - rate( - node_network_receive_bytes_total{ - %(vtgateNodeSelector)s - }[5m] - ) - ) - * 8 - ||| % config._config, - legendFormat: 'ingress', - }, - { - expr: - ||| - sum ( - rate( - node_network_transmit_bytes_total{ - %(vtgateNodeSelector)s - }[5m] - ) - ) - * 8 - ||| % config._config, - legendFormat: 'egress', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROM TARGET - NetworkUsageByInstance: - vtgate_panel_template - + node_ct.panel.null_as_zeros { - title: 'Network Usage', - format: 'Bps', - min: null, - seriesOverrides: [ - { - alias: '/egress .*/', - transform: 'negative-Y', - }, - ], - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - node_network_receive_bytes_total{ - instance=~"$host" - }[5m] - ) - ) - ||| % config._config, - legendFormat: 'ingress - {{instance}}', - }, - { - expr: - ||| - sum by (instance)( - rate( - node_network_transmit_bytes_total{ - instance=~"$host" - }[5m] - ) - ) - ||| % config._config, - legendFormat: 'egress - {{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROM TARGET - NetworkUsageByInstanceFilteredByShardKeyspace: - vttablet_host_view_panel_template - + node_ct.panel.null_as_zeros { - title: 'Network Usage', - format: 'bps', - min: null, - seriesOverrides: [ - { - alias: '/egress .*/', - transform: 'negative-Y', - }, - ], - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - node_network_receive_bytes_total{ - keyspace="$keyspace", - shard=~"$shard", - instance=~"$host" - }[5m] - ) - ) - * 8 - |||, - legendFormat: 'ingress - {{instance}}', - }, - { - expr: - ||| - sum by (instance)( - rate( - node_network_transmit_bytes_total{ - keyspace="$keyspace", - shard=~"$shard", - instance=~"$host" - }[5m] - ) - ) - * 8 - |||, - legendFormat: 'egress - {{instance}}', - }, - ], - }, - - NetworkRxByInstance: - vttablet_host_view_panel_template - + node_ct.panel.null_as_zeros { - title: 'Network Rx Bytes', - format: 'bps', - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - node_network_receive_bytes_total{ - instance=~"$host" - }[1m] - ) - ) - * 8 - |||, - legendFormat: 'ingress - {{instance}}', - }, - ], - }, - - NetworkTxByInstance: - vttablet_host_view_panel_template - + node_ct.panel.null_as_zeros { - title: 'Network Tx Bytes', - format: 'bps', - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - node_network_transmit_bytes_total{ - instance=~"$host" - }[1m] - ) - ) - * 8 - |||, - legendFormat: 'egress - {{instance}}', - }, - ], - }, - - DiskUsageByInstance: - vtgate_panel_template - + node_ct.panel.null_as_zeros { - title: '/mnt disk free', - min: null, - targets: [ - { - expr: - ||| - avg by(instance)( - node_filesystem_avail_bytes{ - instance=~"$host", - mountpoint="%(vttabletMountpoint)s" - } - / - node_filesystem_size_bytes{ - instance=~"$host", - mountpoint="%(vttabletMountpoint)s" - } - ) - ||| % config._config, - legendFormat: '{{instance}}', - intervalFactor: 1, - }, - ], - }, - }, -} diff --git a/vitess-mixin/dashboards/resources/config/row_config.libsonnet b/vitess-mixin/dashboards/resources/config/row_config.libsonnet deleted file mode 100644 index 2fb6d6cb355..00000000000 --- a/vitess-mixin/dashboards/resources/config/row_config.libsonnet +++ /dev/null @@ -1,18 +0,0 @@ -{ - misc:: { - title: 'Misc', - collapse: true, - }, - mysqlTimings: { - title: 'MySQL Timings', - collapse: true, - }, - queryErrors:: { - title: 'Queries/Errors', - collapse: true, - }, - vitessTimings:: { - title: 'Vitess Timings', - collapse: true, - }, -} diff --git a/vitess-mixin/dashboards/resources/config/vtgate_config.libsonnet b/vitess-mixin/dashboards/resources/config/vtgate_config.libsonnet deleted file mode 100644 index acbc7e19efb..00000000000 --- a/vitess-mixin/dashboards/resources/config/vtgate_config.libsonnet +++ /dev/null @@ -1,765 +0,0 @@ -/** This is a configuration file containing metadata for vtgate grafana resources. */ - -local config = import '../../../config.libsonnet'; -local configuration_templates = import './configuration_templates.libsonnet'; -local vitess_ct = configuration_templates.prometheus_vitess; - -// TODO: move local template variables and fields to ./configuration_templates.libsonnet. -{ - // ____ _ - // | _ \ __ _ _ __ ___| |___ - // | |_) / _` | '_ \ / _ \ / __| - // | __/ (_| | | | | __/ \__ \ - // |_| \__,_|_| |_|\___|_|___/ - - // TODO: add description for each panel. - panels: { - - //Override default_panel values with custom configuration - local panel_template = { - datasource: '%(dataSource)s' % config._config, - format: 'rps', - fill: 0, - legend_values: true, - legend_alignAsTable: true, - legend_min: true, - legend_max: true, - legend_current: true, - legend_sort: 'current', - legend_sortDesc: true, - min: 0, - sort: 'decreasing', - }, - - local garbage_collector_panel_template = panel_template { - format: 's', - legend_sort: 'max', - }, - - vtgateRequests: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Requests', - fill: 1, - targets: [ - { - expr: ||| - sum ( - vitess_mixin:vtgate_api_count:rate1m - ) - |||, - legendFormat: 'Requests', - }, - ], - }, - - vtgateRequestsByKeyspace: - panel_template + - vitess_ct.panel.null_as_zeros { - title: 'Requests (by keyspace)', - targets: [ - { - expr: ||| - sum by(keyspace)( - vitess_mixin:vtgate_api_count_by_keyspace:rate1m - ) - ||| % config._config, - legendFormat: '{{keyspace}}', - }, - ], - }, - - - vtgateRequestsByDBType: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Requests (by db_type)', - targets: [ - { - expr: ||| - sum by (db_type)( - vitess_mixin:vtgate_api_count_by_db_type:rate1m - ) - |||, - legendFormat: '{{db_type}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vtgateRequestsByInstanceDBType: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Requests (by db_type)', - fill: 0, - targets: [ - { - expr: ||| - sum by (instance, db_type)( - rate( - vtgate_api_count{ - instance=~"$host", - }[1m] - ) - ) - |||, - legendFormat: '{{instance}} - {{db_type}}', - intervalFactor: 1, - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS TARGET - vtgateRequestsByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Requests', - fill: 0, - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - vtgate_api_count{ - instance=~'$host' - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - intervalFactor: 1, - }, - ], - }, - - vtgateErrorRate: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Error rate', - format: 'percentunit', - fill: 1, - aliasColors: { - 'Error rate': '#F2495C', - }, - targets: [ - { - expr: ||| - sum ( - vitess_mixin:vtgate_api_error_counts:rate1m) - / - sum ( - vitess_mixin:vtgate_api_count:rate1m) - |||, - legendFormat: 'Error rate', - }, - ], - }, - - vtgateErrorRateByKeyspace: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Error rate (by keyspace)', - format: 'percentunit', - targets: [ - { - expr: ||| - sum by(keyspace)( - vitess_mixin:vtgate_api_error_counts_by_keyspace:rate1m) - / - sum by(keyspace)( - vitess_mixin:vtgate_api_count_by_keyspace:rate1m) - |||, - legendFormat: '{{keyspace}}', - }, - ], - }, - - vtgateErrorRateByDBType: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Error rate (by db_type)', - format: 'percentunit', - targets: [ - { - expr: ||| - sum by (db_type)( - vitess_mixin:vtgate_api_error_counts_by_db_type:rate1m - ) - / - sum by (db_type)( - vitess_mixin:vtgate_api_count_by_db_type:rate1m - ) - ||| % config._config, - legendFormat: '{{db_type}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS TARGET - vtgateErrorRateByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Error rate', - fill: 0, - format: 'percentunit', - nullPointMode: 'null as zero', - targets: [ - { - expr: - ||| - sum by(instance)( - rate( - vtgate_api_error_counts[1m] - ) > 0 - ) - / - sum by(instance)( - rate( - vtgate_api_count[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - intervalFactor: 1, - }, - ], - }, - - //TODO Create RECORDING RULES FOR THESE PROM TARGETS - vtgateErrorRateByInstanceDBType: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Error rate (by db_type)', - fill: 0, - format: 'percentunit', - targets: [ - { - expr: - ||| - sum by(instance, db_type)( - rate(vtgate_api_error_counts{ - instance=~"$host" - }[1m] - ) > 0 - ) - / - sum by(instance, db_type)( - rate( - vtgate_api_count{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}} - {{db_type}}', - intervalFactor: 1, - }, - ], - }, - - vtgateDurationP99: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Duration 99th quantile', - fill: 1, - format: 's', - aliasColors: { - Duration: '#5794F2', - }, - targets: [ - { - expr: ||| - histogram_quantile( - 0.99, - sum by(le)( - vitess_mixin:vtgate_api_bucket:rate1m - ) - ) - |||, - legendFormat: 'Duration', - }, - ], - }, - - vtgateDurationP99ByKeyspace: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Duration 99th quantile (by keyspace)', - format: 's', - targets: [ - { - expr: ||| - histogram_quantile( - 0.99, - sum by(keyspace,le)( - vitess_mixin:vtgate_api_bucket_by_keyspace:rate1m - ) - ) - ||| % config._config, - legendFormat: '{{keyspace}}', - }, - ], - }, - - local vtgateDurationTemplate = - panel_template - + vitess_ct.panel.null_as_zeros { - fill: 1, - format: 's', - aliasColors: { - Duration: '#5794F2', - }, - }, - - //TODO crete a recording rule for this prometheus vitess target - vtgateDurationP99ByInstance: vtgateDurationTemplate { - title: 'Duration 99th quantile', - fill: 0, - targets: [ - { - expr: ||| - histogram_quantile( - 0.99, - sum by(instance,le)( - rate( - vtgate_api_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - intervalFactor: 1, - }, - ], - }, - - //TODO crete a recording rule for this prometheus vitess target - vtgateDurationP99ByInstanceDBType: vtgateDurationTemplate { - title: 'Duration 99th quantile (by db_type)', - fill: 0, - targets: [ - { - expr: ||| - histogram_quantile( - 0.99, - sum by(instance,db_type,le)( - rate( - vtgate_api_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}} - {{db_type}}', - intervalFactor: 1, - }, - ], - }, - - vtgateDurationP50: vtgateDurationTemplate { - title: 'Duration 50th quantile', - fill: 0, - targets: [ - { - expr: ||| - histogram_quantile( - 0.50, - sum by(le)( - vitess_mixin:vtgate_api_bucket:rate1m - ) - ) - |||, - legendFormat: 'Duration p50', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROM TARGET - vtgateDurationP50ByInstance: vtgateDurationTemplate { - title: 'Duration 50th quantile', - fill: 0, - targets: [ - { - expr: ||| - histogram_quantile( - 0.50, - sum by(instance, le)( - rate( - vtgate_api_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - vtgateDurationP95: vtgateDurationTemplate { - title: 'Duration 95th quantile', - fill: 0, - targets: [ - { - expr: ||| - histogram_quantile( - 0.95, - sum by(le)( - vitess_mixin:vtgate_api_bucket:rate1m - ) - ) - |||, - legendFormat: 'Duration p95', - }, - ], - }, - - vtgateDurationP95ByInstance: vtgateDurationTemplate { - title: 'Duration 95th quantile', - fill: 0, - targets: [ - { - expr: ||| - histogram_quantile( - 0.95, - sum by(instance, le)( - rate( - vtgate_api_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO write a recording rule for this prometheus_vitess target - // only vtgate_api_sum requires a rule. Use 1m interval instead of 5m. - vtgateDurationAVG: vtgateDurationTemplate { - title: 'Duration (Avg)', - fill: 0, - targets: [ - { - expr: ||| - sum ( - rate( - vtgate_api_sum[5m] - ) - ) - / - sum ( - rate( - vtgate_api_count[5m] - ) - ) - |||, - legendFormat: 'Avg Latency', - }, - ], - }, - - //TODO write a recording rule for this prometheus_vitess target - vtgateDurationAVGByInstance: vtgateDurationTemplate { - title: 'Duration (Avg)', - fill: 0, - targets: [ - { - expr: ||| - sum by (instance)( - rate( - vtgate_api_sum{ - instance=~"$host" - }[5m] - ) - ) - / - sum by (instance)( - rate( - vtgate_api_count{ - instance=~"$host" - }[5m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - vtgateDurationP99ByDBType: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Duration 99th quantile (by db_type)', - format: 's', - targets: [ - { - expr: ||| - histogram_quantile( - 0.99, - sum by (db_type, le)( - vitess_mixin:vtgate_api_bucket_by_db_type:rate1m - ) - ) - |||, - legendFormat: '{{db_type}}', - }, - ], - }, - - vtgateErrorsByCode: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Errors (by code)', - format: 'cps', - targets: [ - { - expr: ||| - sum by (code)( - vitess_mixin:vtgate_api_error_counts_by_code:rate1m - ) - |||, - legendFormat: '{{code}}', - }, - ], - - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROM TARGET - vtgateErrorsByInstanceCode: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Errors (by code)', - format: 'cps', - targets: [ - { - expr: ||| - sum by (instance,code)( - rate( - vtgate_api_error_counts{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}} - {{code}}', - }, - ], - - }, - - vtgateErrorsByOperation: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Errors (by operation)', - format: 'cps', - targets: [ - { - expr: ||| - sum by (operation)( - vitess_mixin:vtgate_api_error_counts_by_operation:rate1m - ) - |||, - legendFormat: '{{operation}}', - }, - ], - - }, - - vtgateErrorsByDbtype: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Errors (by db_type)', - format: 'cps', - targets: [ - { - expr: ||| - sum by (db_type)( - vitess_mixin:vtgate_api_error_counts_by_db_type:rate1m - ) - |||, - legendFormat: '{{db_type}}', - }, - ], - - }, - - //TODO CREATE RECORDING RULE FOR THIS PROM TARGET - vtgateErrorsByInstanceKeyspace: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Errors (by keyspace)', - format: 'cps', - targets: [ - { - expr: ||| - sum by (instance,keyspace)( - rate( - vtgate_api_error_counts{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{keyspace}}', - intervalFactor: 1, - }, - ], - }, - - vtgateRestart: { - title: 'vtgate', - bars: true, - datasource: '%(dataSource)s' % config._config, - fill: 0, - format: 'short', - legend_alignAsTable: true, - legend_current: false, - legend_max: true, - legend_min: false, - legend_sort: 'max', - legend_sortDesc: false, - legend_values: true, - lines: false, - min: 0, - shared_tooltip: false, - sort: 'increasing', - targets: [ - { - expr: ||| - sum by (instance)( - vitess_mixin:process_start_time_seconds_by_instance_job:sum5m{ - %(vtgateSelector)s - } - ) - ||| % config._config, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO crete a recording rule for this prometheus vitess target - vtgateGarbageCollectionCount: garbage_collector_panel_template { - title: 'GC Count', - format: 'ops', - targets: [ - { - expr: - ||| - sum by(instance)( - rate( - go_gc_duration_seconds_count{ - %(vtgateSelector)s - }[1m] - ) - ) - ||| % config._config, - legendFormat: '{{instance}}', - intervalFactor: 1, - }, - ], - }, - //TODO crete a recording rule for this prometheus vitess target - vtgateGarbageCollectionDuration: garbage_collector_panel_template { - title: 'GC Duration total per second', - description: 'A summary of the pause duration of garbage collection cycles', - targets: [ - { - expr: - ||| - sum by(instance)( - rate( - go_gc_duration_seconds_count{ - %(vtgateSelector)s - }[1m] - ) - ) - ||| % config._config, - legendFormat: '{{instance}}', - intervalFactor: 1, - }, - ], - }, - //TODO crete a recording rule for this prometheus vitess target - vtgateGarbageCollectionDurationQuantiles: garbage_collector_panel_template { - title: 'GC Duration quantiles', - targets: [ - { - expr: - ||| - sum by(quantile)( - rate( - go_gc_duration_seconds{ - %(vtgateSelector)s - }[1m] - ) - ) - ||| % config._config, - legendFormat: 'p{{quantile}}', - intervalFactor: 1, - }, - ], - }, - }, - - // _ _ _ _ - // ___(_)_ __ __ _| | ___ ___| |_ __ _| |_ ___ - // / __| | '_ \ / _` | |/ _ \/ __| __/ _` | __/ __| - // \__ \ | | | | (_| | | __/\__ \ || (_| | |_\__ \ - // |___/_|_| |_|\__, |_|\___||___/\__\__,_|\__|___/ - // |___/ - - //TODO move default configurations to helper code (vttablet_helper) - singlestats: { - - vtgateQPS: { - title: 'QPS - vtgate', - datasource: '%(dataSource)s' % config._config, - format: 'short', - valueFontSize: '70%', - valueName: 'current', - sparklineFull: true, - sparklineShow: true, - target: - { - expr: ||| - sum ( - vitess_mixin:vtgate_api_count:rate1m - ) - |||, - intervalFactor: 1, - }, - }, - - vtgateQueryLatencyP99: { - title: 'Query latency p99', - datasource: '%(dataSource)s' % config._config, - colorBackground: true, - decimals: 2, - format: 'ms', - valueFontSize: '70%', - valueName: 'current', - thresholds: '30,50', - target: - { - expr: ||| - 1000 * histogram_quantile( - 0.99, - sum by(le)( - vitess_mixin:vtgate_api_bucket:rate1m - ) - ) - |||, - instant: true, - intervalFactor: 1, - }, - }, - }, -} diff --git a/vitess-mixin/dashboards/resources/config/vttablet_config.libsonnet b/vitess-mixin/dashboards/resources/config/vttablet_config.libsonnet deleted file mode 100644 index 4dbd8a989de..00000000000 --- a/vitess-mixin/dashboards/resources/config/vttablet_config.libsonnet +++ /dev/null @@ -1,1073 +0,0 @@ -/** This is a configuration file containing metadata for vttablet grafana resources. */ - -local config = import '../../../config.libsonnet'; -local configuration_templates = import './configuration_templates.libsonnet'; -local vitess_ct = configuration_templates.prometheus_vitess; - -// TODO: move local template variables to ./configurations_templates.libsonnet. -{ - panels: { - // ____ _ - // | _ \ __ _ _ __ ___| |___ - // | |_) / _` | '_ \ / _ \ / __| - // | __/ (_| | | | | __/ \__ \ - // |_| \__,_|_| |_|\___|_|___/ - - // TODO: add description for each panel. - - //Override default_panel values with custom configuration - local vttablet_queries_killed = vitess_ct.panel.legend_min_max_avg + vitess_ct.panel.null_as_zeros, - local vttablet_query_errors_by_type = vitess_ct.panel.legend_min_max_avg + vitess_ct.panel.null_as_zeros, - - local panel_template = vitess_ct.panel.legend_min_max_current { - legend_sort: 'current', - legend_sortDesc: true, - shared_tooltip: true, - sort: 'decreasing', - }, - - local vttablet_host_view_panel_template = panel_template { - legend_sort: 'avg', - legend_avg: true, - legend_current: false, - }, - - //TODO Create a recording rule. - countServingTablets: - panel_template { - title: '# of serving tablets', - legend_sortDesc: false, - shared_tooltip: false, - sort: 'increasing', - targets: [ - { - expr: - ||| - count( - vttablet_tablet_server_state{ - %(vttabletSelector)s, - name="SERVING" - } - ) - ||| - % config._config, - legendFormat: 'SERVING', - }, - ], - }, - - vttabletRequestsByTable: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Requests (by table)', - format: 'rps', - targets: [ - { - expr: - ||| - sum by (table)( - vitess_mixin:vttablet_query_counts_by_keyspace_table:rate1m{ - table=~"$table" - } - ) - or - vector(0) - |||, - legendFormat: '{{table}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMEHTEUS TARGET - vttabletRequestsByPlanType: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Requests (by plan type)', - format: 'ops', - nullPointMode: 'null as zero', - targets: [ - { - expr: - ||| - sum by (plan_type)( - rate( - vttablet_queries_count{ - instance=~"$host" - } [1m] - ) - ) - |||, - legendFormat: '{{plan_type}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROM TARGET - vttabletRequestsByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Requests', - format: 'ops', - legend_current: false, - legend_avg: true, - legend_sort: 'avg', - nullPointMode: 'null as zero', - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - vttablet_query_counts{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROM TARGET - vttabletRequestsByTableFilteredByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Requests (by table)', - format: 'ops', - nullPointMode: 'null as zero', - targets: [ - { - expr: - ||| - sum by (table)( - rate( - vttablet_query_counts{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{table}}', - intervalFactor: 1, - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROM TARGET - vttabletErrorRateByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Error rate', - format: 'percentunit', - legend_current: false, - legend_avg: true, - legend_sort: 'avg', - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - vttablet_query_error_counts{ - instance=~"$host" - }[1m] - ) - ) - / - ( - sum by (instance)( - rate( - vttablet_query_error_counts{ - instance=~"$host" - }[1m] - ) - ) - + - sum by (instance)( - rate( - vttablet_query_counts{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - vttabletErrorRateByPlanFilteredByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Error rate (by plan type)', - format: 'percentunit', - legend_current: false, - legend_avg: true, - legend_sort: 'avg', - targets: [ - { - expr: - ||| - sum by (plan)( - rate( - vttablet_query_error_counts{ - instance=~"$host" - }[1m] - ) - ) - / - ( - sum by (plan)( - rate( - vttablet_query_error_counts{ - instance=~"$host" - }[1m] - ) - ) - + - sum by (plan)( - rate( - vttablet_query_counts{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{plan}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROM TARGET - vttabletErrorRateByTableFilteredByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Error rate (by table)', - format: 'percentunit', - legend_current: false, - legend_avg: true, - legend_sort: 'avg', - targets: [ - { - expr: - ||| - sum by (table)( - rate( - vttablet_query_error_counts{ - instance=~"$host" - }[1m] - ) - ) - / - ( - sum by (table)( - rate( - vttablet_query_error_counts{ - instance=~"$host" - }[1m] - ) - ) - + - sum by (table)( - rate( - vttablet_query_counts{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{table}}', - }, - ], - }, - - vttabletRowsReturnedByTableFilteredByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Rows Returned (by table)', - targets: [ - { - expr: - ||| - sum by (table) ( - rate( - vttablet_query_row_counts{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{table}}', - }, - ], - }, - - vttabletRowsReturnedByPlansFilterByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Rows Returned (by plan)', - targets: [ - { - expr: - ||| - sum by (plan) ( - rate( - vttablet_query_row_counts{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{plan}}', - }, - ], - }, - - //TODO DEDUPLICATE LEGEND CONFIGURATION FOR QUERY DURATION PANELS - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryDurationAvgByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Query Duration (avg)', - format: 's', - legend_current: false, - legend_avg: true, - legend_sort: 'max', - targets: [ - { - expr: - ||| - sum by(instance)( - rate( - vttablet_queries_sum{ - instance=~"$host" - }[1m] - ) - ) - / - sum by(instance)( - rate( - vttablet_queries_count{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryDurationP50ByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Query Duration (p50)', - format: 's', - legend_current: false, - legend_avg: true, - legend_sort: 'max', - targets: [ - { - expr: - ||| - histogram_quantile( - 0.50,sum by(instance,le)( - rate( - vttablet_queries_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryDurationP95ByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Query Duration (p95)', - format: 's', - legend_current: false, - legend_avg: true, - legend_sort: 'max', - targets: [ - { - expr: - ||| - histogram_quantile( - 0.95,sum by(instance,le)( - rate( - vttablet_queries_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryDurationP99ByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Duration (p99)', - format: 's', - legend_current: false, - legend_avg: true, - legend_sort: 'avg', - targets: [ - { - expr: - ||| - histogram_quantile( - 0.99,sum by(instance,le)( - rate( - vttablet_queries_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryDurationP99ByPlan: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Duration p99 (by plan type)', - format: 's', - legend_current: false, - legend_avg: true, - legend_sort: 'avg', - targets: [ - { - expr: - ||| - histogram_quantile( - 0.99,sum by(plan_type,le)( - rate( - vttablet_queries_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{plan_type}}', - }, - ], - }, - - //TODO DEDUPLICATE LEGEND CONFIGURATION FOR TRANSACTION DURATION PANELS - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletTransactionDurationAvgByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Transaction Duration (avg)', - format: 's', - legend_current: false, - legend_avg: true, - legend_sort: 'max', - targets: [ - { - expr: - ||| - sum by(instance)( - rate( - vttablet_transactions_sum{ - instance=~"$host" - }[1m] - ) - ) - / - sum by(instance)( - rate( - vttablet_transactions_count{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletTransactionDurationP50ByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Transaction Duration (p50)', - format: 's', - legend_current: false, - legend_avg: true, - legend_sort: 'max', - targets: [ - { - expr: - ||| - histogram_quantile( - 0.50,sum by(instance,le)( - rate( - vttablet_transactions_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletTransactionDurationP95ByInstance: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Transaction Duration (p95)', - format: 's', - legend_current: false, - legend_avg: true, - legend_sort: 'max', - targets: [ - { - expr: - ||| - histogram_quantile( - 0.95,sum by(instance,le)( - rate( - vttablet_transactions_bucket{ - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - vttabletQueryTransactionKilled: - panel_template - + vitess_ct.panel.null_as_zeros { - title: 'Query/Transaction killed', - format: 'cps', - legend_alignAsTable: true, - shared_tooltip: false, - targets: [ - { - expr: - ||| - sum ( - vitess_mixin:vttablet_kills:rate1m - ) - |||, - legendFormat: 'Killed', - }, - ], - }, - - vttabletRestart: { - title: 'vttablet', - bars: true, - datasource: '%(dataSource)s' % config._config, - fill: 0, - format: 'short', - legend_values: true, - legend_alignAsTable: true, - legend_max: true, - legend_sort: 'max', - legend_sortDesc: false, - lines: false, - min: 0, - shared_tooltip: false, - sort: 'increasing', - targets: [ - { - expr: - ||| - sum by (instance) ( - vitess_mixin:process_start_time_seconds_by_instance_job:sum5m{ - %(vttabletSelector)s - } - ) - ||| % config._config, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryPoolAvailableConnections: vttablet_host_view_panel_template { - title: 'Available Connections', - description: 'number of available connections in the pool in real-time', - format: 'short', - targets: [ - { - expr: - ||| - sum by (instance)( - vttablet_conn_pool_available{ - instance=~'$host' - } - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryPoolActiveConnections: vttablet_host_view_panel_template { - title: 'Active Connections', - description: 'count of in use connections to mysql', - format: 'short', - targets: [ - { - expr: - ||| - sum by(instance) ( - vttablet_conn_pool_active{ - instance=~'$host' - } - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryPoolIddleClosedRate: vttablet_host_view_panel_template { - title: 'Idle Closed Rate', - description: 'rate of closing connections due to the idle timeout', - format: 'ops', - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - vttablet_conn_pool_idle_closed{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryPoolWaitCount: vttablet_host_view_panel_template { - title: 'Wait count', - description: 'WaitCount will give you how often the transaction pool gets full that causes new transactions to wait.', - format: 'short', - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - vttablet_conn_pool_wait_count{ - instance=~'$host' - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryPoolAvgWaitTime: vttablet_host_view_panel_template { - title: 'Avg wait time', - format: 's', - description: 'WaitTime/WaitCount will tell you the average wait time.', - targets: [ - { - expr: - ||| - sum by (instance) ( - rate( - vttablet_conn_pool_wait_time{ - instance=~"$host" - }[1m] - ) - ) - / - sum by (instance) ( - rate( - vttablet_conn_pool_wait_count{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - vttabletQueriesKilled: vttablet_queries_killed { - title: 'Queries Killed', - description: ||| - Kills reports the queries and transactions killed by VTTablet due to timeout. - It’s a very important variable to look at during outages. - |||, - targets: [ - { - expr: ||| - sum by (instance)( - vitess_mixin:vttablet_kills_by_instance:rate1m{ - instance=~"$host" - } - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - vttabletQueryErrorsByType: vttablet_query_errors_by_type { - title: 'Query errors (by error code)', - description: '', - targets: [ - { - expr: ||| - sum by (error_code)( - vitess_mixin:vttablet_errors:rate1m{ - instance=~"$host" - } - ) - |||, - legendFormat: 'ErrorCode: {{error_code}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletTransactionPoolAvailableConnections: vttablet_host_view_panel_template { - title: 'Available Connections', - description: 'number of available connections in the pool', - format: 'short', - targets: [ - { - expr: - ||| - sum by (instance)( - vttablet_transaction_pool_available{ - instance=~'$host' - } - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletTransactionPoolActiveConnections: vttablet_host_view_panel_template { - title: 'Active Connections', - description: 'Number of connections actually open to mysql', - format: 'short', - targets: [ - { - expr: - ||| - sum by(instance) ( - vttablet_transaction_pool_active{ - instance=~'$host' - } - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletTransactionPoolIddleClosedRate: vttablet_host_view_panel_template { - title: 'Idle Closed Rate', - description: 'Rate of closing connections due to the idle timeout', - format: 'ops', - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - vttablet_transaction_pool_idle_closed{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletTransactionPoolWaitCount: vttablet_host_view_panel_template { - title: 'Wait count', - description: 'WaitCount will give you how often the transaction pool gets full that causes new transactions to wait.', - format: 'short', - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - vttablet_transaction_pool_wait_count{ - instance=~'$host' - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletTransactionPoolAvgWaitTime: vttablet_host_view_panel_template { - title: 'Avg wait time', - format: 's', - description: 'WaitTime/WaitCount will tell you the average wait time.', - targets: [ - { - expr: - ||| - sum by (instance) ( - rate( - vttablet_transaction_pool_wait_time{ - instance=~"$host" - }[1m] - ) - ) - / - sum by (instance) ( - rate( - vttablet_transaction_pool_wait_count{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletGarbageCollectionCount: vitess_ct.panel.go_gc_ops { - title: 'GC Count', - targets: [ - { - expr: - ||| - sum by(instance)( - rate( - go_gc_duration_seconds_count{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - intervalFactor: 1, - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletGarbageCollectionDuration: vitess_ct.panel.go_gc_seconds { - title: 'GC Duration total per second', - description: 'A summary of the pause duration of garbage collection cycles', - targets: [ - { - expr: - ||| - sum by(instance)( - rate( - go_gc_duration_seconds_count{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - intervalFactor: 1, - }, - ], - }, - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletGarbageCollectionDurationQuantiles: vitess_ct.panel.go_gc_seconds { - title: 'GC Duration quantiles (all hosts)', - targets: [ - { - expr: - ||| - sum by(quantile)( - rate( - go_gc_duration_seconds{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: 'p{{quantile}}', - intervalFactor: 1, - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletMysqlTimeAvgFilteredByInstance: vitess_ct.panel.mysql_timings { - title: 'MySQL time (avg)', - targets: [ - { - expr: - ||| - sum by (instance) ( - rate( - vttablet_mysql_sum{ - instance=~"$host" - }[1m] - ) - ) - / - sum by (instance) ( - rate( - vttablet_mysql_count{ - instance=~"$host" - }[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletMysqlExecTimeP50FilterebyInstance: vitess_ct.panel.mysql_timings { - title: 'MySQL Exec Time P50', - targets: [ - { - expr: ||| - histogram_quantile( - 0.50, - sum by (le, instance) ( - rate( - vttablet_mysql_bucket{ - operation="Exec", - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletMysqlExecTimeP95FilterebyInstance: vitess_ct.panel.mysql_timings { - title: 'MySQL Exec Time P95', - targets: [ - { - expr: ||| - histogram_quantile( - 0.95, - sum by (le, instance) ( - rate( - vttablet_mysql_bucket{ - operation="Exec", - instance=~"$host" - }[1m] - ) - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vtgateToVtTabletCallTimeAvgFilteredByInstance: vitess_ct.panel.vtgate_to_vttablet_calls { - title: 'VtGate -> VtTablet Call Time (avg)', - targets: [ - { - expr: - ||| - sum by (instance)( - rate( - vtgate_vttablet_call_sum[1m] - ) - ) - / - sum by (instance)( - rate( - vtgate_vttablet_call_count[1m] - ) - ) - |||, - legendFormat: '{{instance}}', - }, - ], - }, - - }, - - singlestats: { - // _ _ _ _ - // ___(_)_ __ __ _| | ___ ___| |_ __ _| |_ ___ - // / __| | '_ \ / _` | |/ _ \/ __| __/ _` | __/ __| - // \__ \ | | | | (_| | | __/\__ \ || (_| | |_\__ \ - // |___/_|_| |_|\__, |_|\___||___/\__\__,_|\__|___/ - // |___/ - - vttabletQPS: { - title: 'QPS - vttablet', - datasource: '%(dataSource)s' % config._config, - format: 'short', - valueFontSize: '70%', - valueName: 'current', - sparklineFull: true, - sparklineShow: true, - target: - { - expr: ||| - sum ( - vitess_mixin:vttablet_query_counts:rate1m - ) - |||, - intervalFactor: 1, - }, - }, - }, -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/heatmaps.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/heatmaps.libsonnet deleted file mode 100644 index 9a6e5f41527..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/heatmaps.libsonnet +++ /dev/null @@ -1,36 +0,0 @@ -// Re-cyclable components for heatmap resources -local config = import '../../../config.libsonnet'; -local grafana = import '../../../vendor/grafonnet/grafana.libsonnet'; - -local heatmap = grafana.heatmapPanel; -local prometheus = grafana.prometheus; -{ - //TODO move to resources/vttablet - //TODO CREATE A RECORDING RULE FOR THIS PROMETHEUS TARGET - vttabletQueryTimeDistribution:: - heatmap.new( - title='Query Time Distribution (Heatmap)', - description='Shows a heatmap of the histogram bucketing of the time per read query.', - datasource='%(dataSource)s' % config._config, - dataFormat='tsbuckets', - yAxis_format='s', - color_cardColor='#FF9830', - color_exponent=0.3, - color_mode='opacity', - yAxis_decimals=0, - ).addTarget( - prometheus.target( - ||| - sum by (le) ( - rate( - vttablet_queries_bucket{ - instance=~"$host" - }[1m] - ) - ) - |||, - format='heatmap', - legendFormat='{{le}}' - ) - ), -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/helpers/dashboard_helper.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/helpers/dashboard_helper.libsonnet deleted file mode 100644 index d998cc65540..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/helpers/dashboard_helper.libsonnet +++ /dev/null @@ -1,16 +0,0 @@ -/** This is a helper library to load grafonnet dashboards using the mixin metadata stored in `config.libshonnet` */ - -local grafonnet_helper = import 'grafonnet_helper.libsonnet'; - -{ - /** - * Builds a dashboard using grafonnet and the configuration from `config.libsonnet` - * - * @name dashboard_helper.getDashboard - * - * @param config The dashboard configuration from mixin config file. - * @return A new graphPanel with the configuration specified in `config.libsonnet` - * - */ - getDashboard(config):: grafonnet_helper.getDashboard(config), -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/helpers/grafonnet_helper.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/helpers/grafonnet_helper.libsonnet deleted file mode 100644 index 2ff41c6a06f..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/helpers/grafonnet_helper.libsonnet +++ /dev/null @@ -1,376 +0,0 @@ -/** - * This is a helper library to generate grafana resources reading the configuration from a config file. - */ - -local grafana = import '../../../../vendor/grafonnet/grafana.libsonnet'; -local prometheus = grafana.prometheus; -local alert_condition = grafana.alertCondition; - -// _ _ _ -// __ _ _ __ _ __ ___ | |_ __ _| |_(_) ___ _ __ -// / _` | '_ \| '_ \ / _ \| __/ _` | __| |/ _ \| '_ \ -// | (_| | | | | | | | (_) | || (_| | |_| | (_) | | | | -// \__,_|_| |_|_| |_|\___/ \__\__,_|\__|_|\___/|_| |_| - -local getAnnotation(config) = if (config.name == 'default') then - grafana.annotation.default -else - // TODO when the properties are supported by grafonnet use the lib constructor - // instead of using composition - grafana.annotation.datasource( - config.name, - config.datasource - ) + - config.properties; - -// _ _ _ _ -// __| | __ _ ___| |__ | |__ ___ __ _ _ __ __| | -// / _` |/ _` / __| '_ \| '_ \ / _ \ / _` | '__/ _` | -// | (_| | (_| \__ \ | | | |_) | (_) | (_| | | | (_| | -// \__,_|\__,_|___/_| |_|_.__/ \___/ \__,_|_| \__,_| - -local getDashboard(config) = grafana.dashboard.new( - title=config.title, - description=config.description, - uid=config.uid, - time_from=config.time_from, - tags=(config.dashboardTags), - editable=true, - graphTooltip='shared_crosshair', -) + { - environments:: config.environments, -}; - -// _ -// _ __ __ _ _ __ ___| | -// | '_ \ / _` | '_ \ / _ \ | -// | |_) | (_| | | | | __/ | -// | .__/ \__,_|_| |_|\___|_| -// |_| -// The default panel contains all the parameters that we want to override. -// https://github.com/grafana/grafonnet-lib/blob/master/grafonnet/graph_panel.libsonnet - -local default_panel = { - title: '', - aliasColors: {}, - bars: false, - decimals: null, - description: null, - format: 'short', - fill: 1, - legend_alignAsTable: false, - legend_avg: false, - legend_current: false, - legend_hideZero: null, - legend_max: false, - legend_min: false, - legend_rightSide: false, - legend_sort: null, - legend_sortDesc: null, - legend_values: false, - lines: true, - linewidth: 1, - max: null, - min: null, - points: false, - pointradius: 5, - nullPointMode: 'null', - shared_tooltip: true, - sort: 0, - thresholds: [], -}; - -local default_prometheus_target = { - format: 'time_series', - instant: null, - intervalFactor: 2, - legendFormat: '', -}; - -local default_alert_condition = { - evaluatorParams: [], - evaluatorType: 'gt', - operatorType: 'and', - queryRefId: 'A', - queryTimeEnd: 'now', - queryTimeStart: '5m', - reducerParams: [], - reducerType: 'avg', -}; - -local getConditions(config) = - if std.objectHas(config.alert[std.extVar('env')], 'conditions') then - //reducerType is a grafonnet field value. This asserts the config is not legacy - if std.objectHas(config.alert[std.extVar('env')].conditions[0], 'reducerType') - then - local x = std.map( - function(c) default_alert_condition + c - , config.alert[std.extVar('env')].conditions - ); - std.map( - function(c) - alert_condition.new( - evaluatorParams=c.evaluatorParams, - evaluatorType=c.evaluatorType, - operatorType=c.operatorType, - queryRefId=c.queryRefId, - queryTimeEnd=c.queryTimeEnd, - queryTimeStart=c.queryTimeStart, - reducerParams=c.reducerParams, - reducerType=c.reducerType, - ) - , x - ) - else - //Legacy config files include calls to grafonnet.alert_condition.new() - //TODO update legacy config files to use alert conditions in json format, - config.alert[std.extVar('env')].conditions - else []; - -local getTargets(config) = - if std.objectHas(config, 'targets') then - if config.datasource != null && - std.startsWith(config.datasource, 'Prometheus') && - std.objectHas(config.targets[0], 'expr') - then - local x = std.map( - function(t) default_prometheus_target + t - , config.targets - ); - std.map( - function(t) - prometheus.target( - t.expr, - legendFormat=t.legendFormat, - instant=t.instant, - intervalFactor=t.intervalFactor, - format=t.format - ) - , x - ) - else - //When the datasource is not prometheus(elastic, graphite) config file - //include calls to graphite.target() and elasticsearch.target(). - //see webapp_config.lisonnet - //TODO Update this method to decouple grafonnet code from the configuration files. - //Legacy configuration files include prometheus.target() calls. - //TODO update legacy config files to use {'expr':'Prom query' ...} format, - config.targets - else []; - -// This method overriddes grafonnet graphPanel defaults with the values in the config file . -// https://github.com/grafana/grafonnet-lib/blob/master/grafonnet/graph_panel.libsonnet -// TODO: When grapPanel supports either addLinks (https://github.com/grafana/grafonnet-lib/pull/278) -// we should add the links there instead of composing the `options` field. -local initPanel(config) = - grafana.graphPanel.new( - title=config.title, - aliasColors=config.aliasColors, - bars=config.bars, - datasource=config.datasource, - decimals=config.decimals, - description=config.description, - fill=config.fill, - format=config.format, - legend_alignAsTable=config.legend_alignAsTable, - legend_avg=config.legend_avg, - legend_rightSide=config.legend_rightSide, - legend_hideZero=config.legend_hideZero, - legend_min=config.legend_min, - legend_max=config.legend_max, - legend_current=config.legend_current, - legend_sort=config.legend_sort, - legend_sortDesc=config.legend_sortDesc, - legend_values=config.legend_values, - lines=config.lines, - linewidth=config.linewidth, - max=config.max, - min=config.min, - points=config.points, - pointradius=config.pointradius, - nullPointMode=config.nullPointMode, - shared_tooltip=config.shared_tooltip, - sort=config.sort, - thresholds=config.thresholds, - ).addTargets( - getTargets(config) - ) + - { - [if std.objectHas(config, 'options') - then 'options']: - config.options, - }; - -local getPanel(c) = - if std.objectHas(c, 'alert') then - local config = default_panel + c; - local panel = initPanel(config).addAlert( - config.alert.name, - executionErrorState=config.alert.executionErrorState, - forDuration=config.alert.forDuration, - frequency=config.alert.frequency, - message=config.alert.message, - noDataState=config.alert.noDataState, - notifications=config.alert[std.extVar('env')].notifications, - ).addConditions( - getConditions(config) - ); - if std.objectHas(config, 'seriesOverrides') then - local it = panel; - std.foldl(function(p, o) p.addSeriesOverride(o), config.seriesOverrides, it) - else - panel - else - (local config = default_panel + c; - local panel = initPanel(config); - if std.objectHas(config, 'seriesOverrides') then - local it = panel; - std.foldl(function(p, o) p.addSeriesOverride(o), config.seriesOverrides, it) - else - panel); - -// _ __ _____ __ -// | '__/ _ \ \ /\ / / -// | | | (_) \ V V / -// |_| \___/ \_/\_/ - -local row_default = { - title: '', - height: null, - collapse: false, - repeat: null, - showTitle: null, - titleSize: 'h6', -}; - -local getRow(c) = - local config = row_default + c; - grafana.row.new( - title=config.title, - height=config.height, - collapse=config.collapse, - repeat=config.repeat, - showTitle=config.showTitle, - titleSize=config.titleSize - ); - -// _ _ _ _ -// ___(_)_ __ __ _| | ___ ___| |_ __ _| |_ -// / __| | '_ \ / _` | |/ _ \/ __| __/ _` | __| -// \__ \ | | | | (_| | | __/\__ \ || (_| | |_ -// |___/_|_| |_|\__, |_|\___||___/\__\__,_|\__| -// |___/ -//The default value should include all the parameters that are overridden by the objects that extend the default. -//Default values match grafonnet defaults > https://github.com/grafana/grafonnet-lib/blob/master/grafonnet/singlestat.libsonnet - -local default_singlestat = { - colors: [ - '#299c46', - 'rgba(237, 129, 40, 0.89)', - '#d44a3a', - ], - colorBackground: false, - decimals: null, - format: 'none', - valueFontSize: '80%', - valueName: 'avg', - sparklineFull: false, - sparklineShow: false, - thresholds: '', -}; - -local initSingleStat(config) = grafana.singlestat.new( - title=config.title, - datasource=config.datasource, - colors=config.colors, - colorBackground=config.colorBackground, - decimals=config.decimals, - format=config.format, - valueFontSize=config.valueFontSize, - valueName=config.valueName, - sparklineFull=config.sparklineFull, - sparklineShow=config.sparklineShow, - thresholds=config.thresholds, -); - -local getSingleStat(c) = if std.objectHas(c, 'target') -then - local config = default_singlestat + c; - local tc = default_prometheus_target + config.target; - local t = prometheus.target( - tc.expr, - legendFormat=tc.legendFormat, - instant=tc.instant, - intervalFactor=tc.intervalFactor, - format=tc.format - ); - initSingleStat(config).addTarget(t) -else - local config = default_singlestat + c; - initSingleStat(config); - -// _ _ _ -// | |_ ___ _ __ ___ _ __ | | __ _| |_ ___ -// | __/ _ \ '_ ` _ \| '_ \| |/ _` | __/ _ \ -// | || __/ | | | | | |_) | | (_| | || __/ -// \__\___|_| |_| |_| .__/|_|\__,_|\__\___| -// |_| -// default values from https://github.com/grafana/grafonnet-lib/blob/master/grafonnet/template.libsonnet -local template_default = { - label: null, - allValues: null, - tagValuesQuery: '', - current: null, - hide: '', - regex: '', - refresh: 'never', - includeAll: false, - multi: false, - sort: 0, -}; -local getTemplate(c) = - local config = template_default + c; - grafana.template.new( - name=config.name, - datasource=config.datasource, - query=config.query, - label=config.label, - current=config.current, - regex=config.regex, - refresh=config.refresh, - sort=config.sort, - ); - -// _ _ _ _ _ _ _ -// __| | __ _ ___| |__ | |__ ___ __ _ _ __ __| | | (_)_ __ | | __ -// / _` |/ _` / __| '_ \| '_ \ / _ \ / _` | '__/ _` | | | | '_ \| |/ / -// | (_| | (_| \__ \ | | | |_) | (_) | (_| | | | (_| | | | | | | | < -// \__,_|\__,_|___/_| |_|_.__/ \___/ \__,_|_| \__,_| |_|_|_| |_|_|\_\ -local link_default = { - asDropdown: true, - includeVars: false, - keepTime: false, - icon: 'external link', - url: '', - targetBlank: false, - type: 'dashboards', -}; - -local getDashboardLink(c) = - local config = link_default + c; - grafana.link.dashboards( - title=config.title, - tags=config.tags, - keepTime=config.keepTime, - includeVars=config.includeVars, - ); - -{ - getAnnotation(config):: getAnnotation(config), - getDashboard(config):: getDashboard(config), - getPanel(config):: getPanel(config), - getRow(config):: getRow(config), - getSingleStat(config):: getSingleStat(config), - getTemplate(config):: getTemplate(config), - getDashboardLink(config):: getDashboardLink(config), -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/helpers/helpers.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/helpers/helpers.libsonnet deleted file mode 100644 index a6d74985dd3..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/helpers/helpers.libsonnet +++ /dev/null @@ -1,9 +0,0 @@ -// TODO deduplicate helper code. Same/similar functions are used by vtgate, vttablet and orchestrator helpers -{ - dashboard:: import 'dashboard_helper.libsonnet', - default:: import 'grafonnet_helper.libsonnet', - mysql:: import 'mysql_helper.libsonnet', - os:: import 'os_helper.libsonnet', - vtgate:: import 'vtgate_helper.libsonnet', - vttablet:: import 'vttablet_helper.libsonnet', -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/helpers/mysql_helper.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/helpers/mysql_helper.libsonnet deleted file mode 100644 index 3d0b1ff6a44..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/helpers/mysql_helper.libsonnet +++ /dev/null @@ -1,19 +0,0 @@ -/** - * This is a helper library to generate os resources reading the configuration from mysql_config.libsonnet - */ - -local grafonnet_helper = import './grafonnet_helper.libsonnet'; - -/** - * Builds grapPanel using grafonnet and the configuration from `mysql_config.libsonnet` - * - * @name mysql_helper.getPanel - * - * @param `config`: The panel configuration from mysql_config file. - * - * @return A new graphPanel with the configuration specified in `mysql_config.libsonnet` - * - */ -{ - getPanel(config):: grafonnet_helper.getPanel(config), -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/helpers/os_helper.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/helpers/os_helper.libsonnet deleted file mode 100644 index 2580d54e43a..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/helpers/os_helper.libsonnet +++ /dev/null @@ -1,19 +0,0 @@ -/** - * This is a helper library to generate os resources reading the configuration from os_config.libsonnet - */ - -local grafonnet_helper = import './grafonnet_helper.libsonnet'; - -{ - /** - * Builds grapPanel using grafonnet and the configuration from `os_config.libsonnet` - * - * @name os_helper.getPanel - * - * @param `config`: The panel configuration from os_config file. - * - * @return A new graphPanel with the configuration specified in `os_config.libsonnet` - * - */ - getPanel(config):: grafonnet_helper.getPanel(config), -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/helpers/vtgate_helper.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/helpers/vtgate_helper.libsonnet deleted file mode 100644 index 2997979edf4..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/helpers/vtgate_helper.libsonnet +++ /dev/null @@ -1,31 +0,0 @@ -/** - * This is a helper library to generate vtgate resources reading the configuration from vtgate_config.libsonnet - */ - -local grafonnet_helper = import './grafonnet_helper.libsonnet'; - -{ - /** - * Builds grapPanel using grafonnet and the configuration from `vtgate_config.libsonnet` - * - * @name vtgate_helper.getPanel - * - * @param `config`: The panel configuration from vtgate_config file. - * - * @return A new graphPanel with the configuration specified in `vtgate_config.libsonnet` - * - */ - getPanel(config):: grafonnet_helper.getPanel(config), - - /** - * Builds a singlestat using grafonnet and the configuration from `vtgate_config.libsonnet` - * - * @name vtgate_helper.getSingleStat - * - * @param `config`: The singlestat configuration from vtgate_config file. - * - * @return A new singlestat with the configuration specified in `vtgate_config.libsonnet` - * - */ - getSingleStat(config):: grafonnet_helper.getSingleStat(config), -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/helpers/vttablet_helper.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/helpers/vttablet_helper.libsonnet deleted file mode 100644 index 2613de0f094..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/helpers/vttablet_helper.libsonnet +++ /dev/null @@ -1,29 +0,0 @@ -/** - * This is a helper library to generate vttablet resources reading the configuration from `vttablet_config.libsonnet` - */ -local grafonnet_helper = import './grafonnet_helper.libsonnet'; - -{ - /** - * Builds grapPanel using grafonnet and the configuration from `vttablet_config.libsonnet` - * - * @name vttablet_helper.getPanel - * - * @param `config`: The panel configuration from vttablet_config file. - * - * @return A new graphPanel with the configuration specified in `vttablet_config.libsonnet` - * - */ - getPanel(config):: grafonnet_helper.getPanel(config), - /** - * Builds singlestat using grafonnet and the configuration from `vttablet_config.libsonnet` - * - * @name vttablet_helper.getPanel - * - * @param `config`: The singlestat configuration from vttablet_config file. - * - * @return A new singlestat with the configuration specified in `vttablet_config.libsonnet` - * - */ - getSingleStat(config):: grafonnet_helper.getSingleStat(config), -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/panels.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/panels.libsonnet deleted file mode 100644 index 40c20a2cb10..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/panels.libsonnet +++ /dev/null @@ -1,65 +0,0 @@ -// Re-cyclable components for panel resources -local config = import '../../../config.libsonnet'; -local grafana = import '../../../vendor/grafonnet/grafana.libsonnet'; - -local graphPanel = grafana.graphPanel; -local prometheus = grafana.prometheus; - -// TODO: add description for each panel. -// TODO: create a _helper _config file for each group [vtctld], -{ - // _ _ _ _ - // __ _| |_ ___| |_| | __| | - // \ \ / / __/ __| __| |/ _` | - // \ V /| || (__| |_| | (_| | - // \_/ \__\___|\__|_|\__,_| - // - - // _ - // _ __ ___ (_)___ ___ - // | '_ ` _ \| / __|/ __| - // | | | | | | \__ \ (__ - // |_| |_| |_|_|___/\___| - // - local default_notification_config = { - prod+: { - notifications: [ - { uid: 'alerts-vitess' }, - { uid: 'pagerduty-vitess' }, - ], - }, - dev+: { - notifications: [ - { uid: 'alerts-vitess-dev' }, - ], - }, - }, - - vtctldRestart:: - graphPanel.new( - 'vtctld', - bars=true, - datasource='%(dataSource)s' % config._config, - fill=0, - format='short', - legend_values=true, - legend_alignAsTable=true, - legend_max=true, - legend_sort='max', - legend_sortDesc=false, - lines=false, - min=0, - shared_tooltip=false, - sort='increasing', - ) - .addTarget(prometheus.target( - ||| - sum by (instance) ( - vitess_mixin:process_start_time_seconds_by_instance_job:sum5m{ - %(vtctldSelector)s - } - ) > 0 - ||| % config._config, - legendFormat='{{instance}}' - )), -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/rows.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/rows.libsonnet deleted file mode 100644 index 54173c2a3f1..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/rows.libsonnet +++ /dev/null @@ -1,182 +0,0 @@ -// Re-cyclable components for row resources -local grafana = import '../../../vendor/grafonnet/grafana.libsonnet'; -local row = grafana.row; - -//TODO move all rows to config/row_config.libsonnet and update the layouts to use grafonnet_helper.getRow() -{ - connection:: - row.new( - title='Connection', - ), - - cpu:: - row.new( - title='CPU', - collapse=true, - ), - - duration:: - row.new( - title='Duration', - collapse=true, - ), - - errorsRowsReturned:: - row.new( - title='Errors / Rows returned', - ), - - errors:: - row.new( - title='Errors', - collapse=true, - ), - - healthcheck:: - row.new( - title='Healthcheck', - collapse=true, - ), - - tabletsQueries:: - row.new( - title='Tablets/Queries', - ), - - mysql:: - row.new( - title='MySQL', - collapse=true, - ), - - misc:: - row.new( - title='Misc', - collapse=true, - ), - - networkingTCP:: - row.new( - title='Networking TCP', - collapse=true, - ), - - networkNIC:: - row.new( - title='Network NIC', - collapse=true, - ), - - OS:: - row.new( - title='OS', - collapse=true, - ), - - processes:: - row.new( - title='Processes', - collapse=true, - ), - - queryTimings:: - row.new( - // as we don't have timings by table (yet!) - title="Query/Transaction timings (table filter doesn't apply)", - collapse=true, - ), - - query:: - row.new( - title='Query', - ), - - RED:: - row.new( - title='RED - Requests / Error rate / Duration', - ), - - REDByKeyspace:: - row.new( - title='RED (by keyspace)', - collapse=true - ), - - REDByTabletType:: - row.new( - title='RED (by tablet type)', - collapse=true - ), - - REDByPlanType:: - row.new( - title='RED (by plan type)', - collapse=true - ), - - REDByShard:: - row.new( - title='RED (by shard)', - collapse=true - ), - - REDByTable:: - row.new( - title='RED (by table)', - collapse=true - ), - - - rowsReturned:: - row.new( - title='Rows returned', - collapse=true, - ), - - serviceRestart:: - row.new( - title='Service restart', - ), - - storage:: - row.new( - title='Storage', - collapse=true, - ), - - topLevel:: - row.new( - title='Top level', - ), - - topologyWatcher:: - row.new( - title='Topology watcher', - collapse=true, - ), - - vitessQueryPool:: - row.new( - title='Vitess - Query pool', - collapse=true, - ), - - vitessTransactionPool:: - row.new( - title='Vitess - Transaction pool', - collapse=true, - ), - - vtgate:: - row.new( - title='vtgate - Requests (by table / by plan / by keyspace )', - collapse=true, - ), - - vttablet:: - row.new( - title='vttablet - Requests (by table / by plan / by keyspace )', - collapse=true, - ), - -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/singlestats.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/singlestats.libsonnet deleted file mode 100644 index e3930e382d8..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/singlestats.libsonnet +++ /dev/null @@ -1,221 +0,0 @@ -// Re-cyclable components for singlestat resources -local config = import '../../../config.libsonnet'; -local grafana = import '../../../vendor/grafonnet/grafana.libsonnet'; - -local singlestat = grafana.singlestat; -local prometheus = grafana.prometheus; - -{ - //TODO move to resource to use vtgate_config/vtgate_helper - vtgateSuccessRate:: - singlestat.new( - 'Query success - vtgate', - datasource='%(dataSource)s' % config._config, - colorBackground=true, - decimals=4, - format='percent', - colors=[ - '#d44a3a', - 'rgba(237, 129, 40, 0.89)', - '#299c46', - ], - valueFontSize='70%', - valueName='current', - thresholds='0.99,0.999', - ) - .addTarget( - prometheus.target( - ||| - 100 - - - sum( - rate( - vtgate_api_error_counts{ - %(vtgateSelector)s - }[$interval] - ) OR vector(0) - ) - / - sum( - rate( - vtgate_api_count{ - %(vtgateSelector)s - }[$interval] - ) - ) - ||| % config._config, - instant=true, - intervalFactor=1 - ) - ), - - //TODO move to resource to use vtgate_config/vtgate_helper - vtgateUp:: - singlestat.new( - 'vtgate', - datasource='%(dataSource)s' % config._config, - valueFontSize='50%', - valueName='current', - ) - .addTarget( - prometheus.target( - ||| - sum( - up{ - %(vtgateSelector)s - } - ) - ||| % config._config, - instant=true, - intervalFactor=1 - ) - ), - - //TODO move to resource to use vttablet_config/vttablet_helper - vttabletQuerySuccess:: - singlestat.new( - 'Query success - vttablet', - datasource='%(dataSource)s' % config._config, - colorBackground=true, - decimals=4, - format='percent', - colors=[ - '#d44a3a', - 'rgba(237, 129, 40, 0.89)', - '#299c46', - ], - valueFontSize='70%', - valueName='current', - thresholds='0.99,0.999', - ) - .addTarget( - prometheus.target( - ||| - 100 - - - ( - sum ( - vitess_mixin:vttablet_errors:rate1m - ) - / - sum ( - vitess_mixin:vttablet_query_counts:rate1m - ) - ) - ||| % config._config, - instant=true, - intervalFactor=1 - ) - ), - - //TODO move to resource to use vttablet_config/vttablet_helper - vttabletUp:: - singlestat.new( - 'vttablet', - datasource='%(dataSource)s' % config._config, - valueFontSize='50%', - valueName='current', - ) - .addTarget( - prometheus.target( - ||| - sum( - up{ - %(vttabletSelector)s - } - ) - ||| % config._config, - instant=true, - intervalFactor=1 - ) - ), - - - //TODO move to resource to use vttablet_config/vttablet_helper - keyspaceCount:: - singlestat.new( - 'keyspace', - description='count of keyspaces with active queries', - datasource='%(dataSource)s' % config._config, - valueFontSize='50%', - valueName='current', - ) - .addTarget( - prometheus.target( - ||| - count( - count by (keyspace)( - vtgate_vttablet_call_count{ - } - ) - ) - ||| % config._config, - instant=true, - intervalFactor=1 - ) - ), - - //TODO move to resource to use vttablet_config/vttablet_helper - shardCount:: - singlestat.new( - 'shard', - datasource='%(dataSource)s' % config._config, - valueFontSize='50%', - valueName='current', - ) - .addTarget( - prometheus.target( - ||| - count( - count by(shard)( - vttablet_tablet_state{ - %(vttabletSelector)s - } - ) - ) - ||| % config._config, - instant=true, - intervalFactor=1 - ) - ), - - mysqlQPS:: - singlestat.new( - 'QPS - MySQL', - datasource='%(dataSource)s' % config._config, - format='short', - valueFontSize='70%', - valueName='current', - sparklineFull=true, - sparklineShow=true, - ) - .addTarget( - prometheus.target( - ||| - sum ( - vitess_mixin:mysql_global_status_queries:rate1m - ) - |||, - intervalFactor=1 - ) - ), - - vtctldUp:: - singlestat.new( - 'vtctld', - datasource='%(dataSource)s' % config._config, - valueFontSize='50%', - valueName='current', - ) - .addTarget( - prometheus.target( - ||| - sum( - up{ - %(vtctldSelector)s}) - ||| % config._config, - instant=true, - intervalFactor=1 - ) - ), -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/templates.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/templates.libsonnet deleted file mode 100644 index a32b71283c4..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/templates.libsonnet +++ /dev/null @@ -1,51 +0,0 @@ -// Re-cyclable components for template resources -local config = import '../../../config.libsonnet'; -local grafana = import '../../../vendor/grafonnet/grafana.libsonnet'; - -local template = grafana.template; -{ - interval:: template.interval( - name='interval', - label='Interval', - query='auto,1m,5m,10m,30m,1h,6h,12h', - current='auto', - auto_min='1m' - ), - - table:: - template.new( - 'table', - '%(dataSource)s' % config._config, - 'query_result(sum by(table)(vitess_mixin:vtgate_queries_processed_by_table:rate1m{keyspace="$keyspace"}))', - regex='.*table="(.*)".*', - label='Table', - refresh='time', - includeAll=true, - sort=1, - allValues='.*', - ), - - hostVtgate:: - template.new( - 'host', - '%(dataSource)s' % config._config, - 'label_values(vtgate_build_number, instance)', - label='Host(s)', - refresh='time', - multi=true, - allValues='.*', - ), - - hostVttablet:: - template.new( - 'host', - '%(dataSource)s' % config._config, - 'label_values(vttablet_build_number{}, instance)', - label='Host(s)', - refresh='time', - multi=true, - allValues='.*', - sort=1 - ), - -} diff --git a/vitess-mixin/dashboards/resources/grafonnet/texts.libsonnet b/vitess-mixin/dashboards/resources/grafonnet/texts.libsonnet deleted file mode 100644 index 44478b7a13f..00000000000 --- a/vitess-mixin/dashboards/resources/grafonnet/texts.libsonnet +++ /dev/null @@ -1,65 +0,0 @@ -// Re-cyclable components for text resources -local config = import '../../../config.libsonnet'; -local grafana = import '../../../vendor/grafonnet/grafana.libsonnet'; - -local text = grafana.text; - -// TODO: figure out how to make emoji work in jsonnet. They are not correctly handled -{ - - local footnote = - ||| - This Dasboard has been automatically generated using vitess-mixin. - If you want to contribute please visit [https://github.com/vitess/vitess-mixin](https://github.com/vitessio/vitess/tree/main/vitess-mixin)! - |||, - - local notes = { - footnote: footnote, - }, - - clusterOverview:: - text.new( - '', - mode='markdown', - content=||| - #### Cluster overview - - This is a general overview of the Vitess clusters. - - %(footnote)s - ||| % notes - ), - - vtgateOverview:: - text.new( - '', - mode='markdown', - content=||| - #### vtgate overview - - This is a general overview of the vtgate tier. - - %(footnote)s - ||| % notes - ), - - vtgateHost:: - text.new( - '', - mode='markdown', - content=||| - #### vtgate host - %s - ||| % footnote, - ), - - vttabletHost:: - text.new( - '', - mode='markdown', - content=||| - #### vttablet host - %s - ||| % footnote, - ), -} diff --git a/vitess-mixin/e2e/.env b/vitess-mixin/e2e/.env deleted file mode 100644 index 00e3ed4bf0a..00000000000 --- a/vitess-mixin/e2e/.env +++ /dev/null @@ -1,18 +0,0 @@ -TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 -topo_global_root vitess/global -GRPC_PORT=15999 -WEB_PORT=8080 -MYSQL_PORT=15306 - -CELL=local -KEYSPACE=commerce -DB=commerce - -EXTERNAL_DB=0 -DB_HOST=external_db_host -DB_PORT=3306 -DB_USER=external_db_user -DB_PASS=external_db_password -DB_CHARSET=CHARACTER SET utf8 COLLATE utf8_general_ci - -GRAFANA_VERSION=7.3.6 -DISPLAY= \ No newline at end of file diff --git a/vitess-mixin/e2e/Dockerfile b/vitess-mixin/e2e/Dockerfile deleted file mode 100644 index cf4a4a9f85e..00000000000 --- a/vitess-mixin/e2e/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -ARG CYPRESS_IMAGE - -FROM $CYPRESS_IMAGE -WORKDIR /e2e - -# dependencies will be installed only if the package files change -COPY package.json . -COPY package-lock.json . - -# by setting CI environment variable we switch the Cypress install messages -# to small "started / finished" and avoid 1000s of lines of progress messages -# https://github.com/cypress-io/cypress/issues/1243 -ENV CI=1 -RUN npm ci -# verify that Cypress has been installed correctly. -# running this command separately from "cypress run" will also cache its result -# to avoid verifying again when running the tests -RUN npx cypress verify diff --git a/vitess-mixin/e2e/backups/.gitignore b/vitess-mixin/e2e/backups/.gitignore deleted file mode 100644 index 35bc8010eb9..00000000000 --- a/vitess-mixin/e2e/backups/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# ignore all files in this dir... -* -# ... except for this one. -!.gitignore diff --git a/vitess-mixin/e2e/config/init_db.sql b/vitess-mixin/e2e/config/init_db.sql deleted file mode 100644 index 6059bbf7ca6..00000000000 --- a/vitess-mixin/e2e/config/init_db.sql +++ /dev/null @@ -1,79 +0,0 @@ -# This file is executed immediately after mysql_install_db, -# to initialize a fresh data directory. -############################################################################### -# Equivalent of mysql_secure_installation -############################################################################### -# We need to ensure that super_read_only is disabled so that we can execute -# these commands. Note that disabling it does NOT disable read_only. -# We save the current value so that we only re-enable it at the end if it was -# enabled before. -SET @original_super_read_only=IF(@@global.super_read_only=1, 'ON', 'OFF'); -SET GLOBAL super_read_only='OFF'; -# Changes during the init db should not make it to the binlog. -# They could potentially create errant transactions on replicas. -SET sql_log_bin = 0; -# Remove anonymous users & disable remote root access (only allow UNIX socket). -DROP USER IF EXISTS ''@'%', ''@'localhost', 'root'@'%'; -# Remove test database. -DROP DATABASE IF EXISTS test; -############################################################################### -# Vitess defaults -############################################################################### -# Vitess-internal database. -CREATE DATABASE IF NOT EXISTS _vt; -# Note that definitions of local_metadata and shard_metadata should be the same -# as in production which is defined in go/vt/mysqlctl/metadata_tables.go. -CREATE TABLE IF NOT EXISTS _vt.local_metadata ( - name VARCHAR(255) NOT NULL, - value VARCHAR(255) NOT NULL, - db_name VARBINARY(255) NOT NULL, - PRIMARY KEY (db_name, name) - ) ENGINE=InnoDB; -CREATE TABLE IF NOT EXISTS _vt.shard_metadata ( - name VARCHAR(255) NOT NULL, - value MEDIUMBLOB NOT NULL, - db_name VARBINARY(255) NOT NULL, - PRIMARY KEY (db_name, name) - ) ENGINE=InnoDB; -# Admin user with all privileges. -CREATE USER 'vt_dba'@'localhost'; -GRANT ALL ON *.* TO 'vt_dba'@'localhost'; -GRANT GRANT OPTION ON *.* TO 'vt_dba'@'localhost'; -# User for app traffic, with global read-write access. -CREATE USER 'vt_app'@'localhost'; -GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, - REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, - LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, - SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER - ON *.* TO 'vt_app'@'localhost'; -# User for app debug traffic, with global read access. -CREATE USER 'vt_appdebug'@'localhost'; -GRANT SELECT, SHOW DATABASES, PROCESS ON *.* TO 'vt_appdebug'@'localhost'; -# User for administrative operations that need to be executed as non-SUPER. -# Same permissions as vt_app here. -CREATE USER 'vt_allprivs'@'localhost'; -GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, - REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, - LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, - SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER - ON *.* TO 'vt_allprivs'@'localhost'; -# User for slave replication connections. -# TODO: Should we set a password on this since it allows remote connections? -CREATE USER 'vt_repl'@'%'; -GRANT REPLICATION SLAVE ON *.* TO 'vt_repl'@'%'; -# User for Vitess filtered replication (binlog player). -# Same permissions as vt_app. -CREATE USER 'vt_filtered'@'localhost'; -GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, - REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, - LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, - SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER - ON *.* TO 'vt_filtered'@'localhost'; - -RESET SLAVE ALL; -RESET MASTER; -# custom sql is used to add custom scripts like creating users/passwords. We use it in our tests -# {{custom_sql}} - -# We need to set super_read_only back to what it was before -SET GLOBAL super_read_only=IFNULL(@original_super_read_only, 'ON'); diff --git a/vitess-mixin/e2e/cypress.json b/vitess-mixin/e2e/cypress.json deleted file mode 100644 index c1ffae0a972..00000000000 --- a/vitess-mixin/e2e/cypress.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "viewportWidth": 1200, - "viewportHeight": 900 -} diff --git a/vitess-mixin/e2e/cypress/integration/cluster_overview_spec.js b/vitess-mixin/e2e/cypress/integration/cluster_overview_spec.js deleted file mode 100644 index 5bb40a68c3b..00000000000 --- a/vitess-mixin/e2e/cypress/integration/cluster_overview_spec.js +++ /dev/null @@ -1,56 +0,0 @@ -const fs = require('fs') - -describe('vitess-mixin: Cluster Overview Dashboard Test', function () { - - let panelTitles = [] - - before(function () { - cy.readFile('./test/cluster_overview.json').then((data) => { - cy.createDashboard(data) - }) - }) - it('renders cluster overview dashboard', function () { - cy.visit('/d/vitess-cluster-overview/cluster-overview-auto-generated') - }) - //TEMPLATES - it('contains the Interval Template', function () { - cy.get('.submenu-controls').contains('Interval'); - }) - //LINKS - it('contains vitess-mixin Dashboard links dropdown', function () { - cy.get('.submenu-controls').get('.gf-form').contains('vitess-mixin') - }) - // INIT PANELS - it('checks all panels in the cluster overview dashboard exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(22) - expect(titles).to.deep.eq([ - '', - 'Query success - vtgate', - 'Query success - vttablet', - 'Query latency p99', - 'QPS - vtgate', - 'QPS - MySQL', - 'vtgate', - 'vttablet', - 'QPS - vttablet', - 'keyspace', - 'shard', - 'vtctld', - 'Requests', - 'Error rate', - 'Duration 99th quantile', - 'Requests (by keyspace)', - 'Error rate (by keyspace)', - 'Duration 99th quantile (by keyspace)', - '# of serving tablets', - 'Slow queries', - 'Query/Transaction killed' - ]) - }) - }) -}) diff --git a/vitess-mixin/e2e/cypress/integration/vtgate_host_view.js b/vitess-mixin/e2e/cypress/integration/vtgate_host_view.js deleted file mode 100644 index 7cbbcdb0e9a..00000000000 --- a/vitess-mixin/e2e/cypress/integration/vtgate_host_view.js +++ /dev/null @@ -1,174 +0,0 @@ -const fs = require('fs') - -describe('vitess-mixin: Vtgate Host View Dashboard Test', function() { - - let panelTitles = [] - - before(function() { - cy.readFile('./test/vtgate_host_view.json').then((data) => { - cy.createDashboard(data) - }) - }) - it('renders vtgate hostview dashboard', function() { - cy.visit('/d/vitess-vtgate-host-view/vtgate - host view (auto-generated)') - }) - //SUB-MENU CONTROLS - it('contains the Host(s) Template', function() { - cy.get('.submenu-controls').contains('Host(s)'); - }) - it('contains vitess-mixin Dashboard links dropdown', function() { - cy.get('.submenu-controls').get('.gf-form').contains('vitess-mixin') - }) - //Rows are loaded at start time - it('contains 5 rows', function() { - cy.get('.dashboard-row').should('have.length',5) - }) - // RED ROW - it('contains the RED row', function() { - cy.get('.dashboard-row').contains('RED - Requests / Error rate / Duration') - }) - - it('checks all panels in the RED row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Requests', - 'Error rate', - 'Duration 99th quantile' - ]) - }) - }) - - it('collapses the RED row', function(){ - cy.get('.dashboard-row__title.pointer').contains('RED - Requests / Error rate / Duration').click(); - }) - - // ROW (BY TABLET TYPE) - it('contains the RED (by tablet type) row', function() { - cy.get('.dashboard-row').contains('RED (by tablet type)'); - }) - it('RED (by tablet type) row is collapsed', function() { - cy.get('.dashboard-row--collapsed').contains('RED (by tablet type)'); - }) - it('expands the RED (by tablet type) row', function(){ - cy.get('.dashboard-row__title.pointer').contains('RED (by tablet type)').click(); - }) - - it('checks all panels in the RED (by tablet type) row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Requests (by db_type)', - 'Error rate (by db_type)', - 'Duration 99th quantile (by db_type)' - ]) - }) - }) - - it('collapses the RED (by tablet type) row', function(){ - cy.get('.dashboard-row__title.pointer').contains('RED (by tablet type)').click(); - cy.get('.dashboard-row--collapsed').contains('RED (by tablet type)'); - }) - - //ERRORS ROW - it('contains the Errors row', function() { - cy.get('.dashboard-row').contains('Errors'); - }) - it('Errors row is collapsed', function() { - cy.get('.dashboard-row--collapsed').contains('Errors'); - }) - it('expands the Errors row', function(){ - cy.get('.dashboard-row__title.pointer').contains('Errors').scrollIntoView().click(); - }) - it('checks all panels in the Errors Row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(3) - expect(titles).to.deep.eq([ - '', - 'Errors (by keyspace)', - 'Errors (by code)' - ]) - }) - }) - it('collapses the Errors row', function(){ - cy.get('.dashboard-row__title.pointer').contains('Errors').click(); - cy.get('.dashboard-row--collapsed').contains('Errors'); - }) - //DURATION ROW - it('contains the Duration row', function() { - cy.get('.dashboard-row').contains(/^Duration/) - }) - it('Duration row is collapsed', function() { - cy.get('.dashboard-row--collapsed').contains(/^Duration/) - }) - it('expands the Duration row', function(){ - cy.get('.dashboard-row__title.pointer').contains(/^Duration/).click(); - }) - - it('checks all panels in the Duration row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Duration (Avg)', - 'Duration 50th quantile', - 'Duration 95th quantile' - ]) - }) - }) - - it('collapses the Duration row', function(){ - cy.get('.dashboard-row__title.pointer').contains(/^Duration/).click(); - cy.get('.dashboard-row--collapsed').contains(/^Duration/); - }) - //OS ROW - it('contains the OS row', function() { - cy.get('.dashboard-row').contains('OS') - }) - it('OS row is collapsed', function() { - cy.get('.dashboard-row--collapsed').contains('OS') - }) - it('expands the OS row', function(){ - cy.get('.dashboard-row__title.pointer').contains('OS').click(); - }) - - it('checks all panels in the OS row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(5) - expect(titles).to.deep.eq([ - '', - 'CPU Usage', - 'Memory Usage', - 'Network Usage', - 'TCP Retransmissions' - ]) - }) - }) - - it('collapses the OS row', function(){ - cy.get('.dashboard-row__title.pointer').contains('OS').click(); - cy.get('.dashboard-row--collapsed').contains('OS'); - }) -}) diff --git a/vitess-mixin/e2e/cypress/integration/vtgate_overview.js b/vitess-mixin/e2e/cypress/integration/vtgate_overview.js deleted file mode 100644 index eb8122ca403..00000000000 --- a/vitess-mixin/e2e/cypress/integration/vtgate_overview.js +++ /dev/null @@ -1,201 +0,0 @@ -const fs = require('fs') - -describe('vitess-mixin: Vtgate Overview Dashboard Test', function() { - - let panelTitles = [] - - before(function() { - cy.readFile('./test/vtgate_overview.json').then((data) => { - cy.createDashboard(data) - }) - }) - it('renders vtgate overview dashboard', function() { - cy.visit('/d/vitess-vtgate-overview/vtgate - overview (auto-generated)') - }) - //SUB-MENU CONTROLS - it('contains vitess-mixin Dashboard links dropdown', function() { - cy.get('.submenu-controls').get('.gf-form').contains('vitess-mixin'); - }) - // RED ROW - it('contains the RED row', function() { - cy.get('.dashboard-row').contains('RED - Requests / Error rate / Duration'); - }) - - it('checks all panels in the RED row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Requests', - 'Error rate', - 'Duration 99th quantile' - ]) - }) - }) - - it('collapses the RED row', function(){ - cy.get('.dashboard-row__title.pointer').contains('RED - Requests / Error rate / Duration').click(); - }) - - // RED (BY KEYSPACE) ROW - it('contains the RED (by keyspace) row', function() { - cy.get('.dashboard-row').contains('RED (by keyspace)'); - }) - it('RED (by keyspace) row is collapsed', function() { - cy.get('.dashboard-row--collapsed').contains('RED (by keyspace)'); - }) - it('expands the RED (by keyspace) row', function(){ - cy.get('.dashboard-row__title.pointer').contains('RED (by keyspace)').click(); - }) - - it('checks all panels in the RED (by keyspace) row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Requests (by keyspace)', - 'Error rate (by keyspace)', - 'Duration 99th quantile (by keyspace)' - ]) - }) - }) - - it('collapses the RED (by keyspace) row', function(){ - cy.get('.dashboard-row__title.pointer').contains('RED (by keyspace)').click(); - }) - - // ROW (BY TABLET TYPE) - it('contains the RED (by tablet type) row', function() { - cy.get('.dashboard-row').contains('RED (by tablet type)'); - }) - it('RED (by tablet type) row is collapsed', function() { - cy.get('.dashboard-row--collapsed').contains('RED (by tablet type)'); - }) - it('expands the RED (by tablet type) row', function(){ - cy.get('.dashboard-row__title.pointer').contains('RED (by tablet type)').click(); - }) - - it('checks all panels in the RED (By tablet type) row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Requests (by db_type)', - 'Error rate (by db_type)', - 'Duration 99th quantile (by db_type)' - ]) - }) - }) - - it('collapses the RED (by tablet type) row', function(){ - cy.get('.dashboard-row__title.pointer').contains('RED (by tablet type)').click(); - cy.get('.dashboard-row--collapsed').contains('RED (by tablet type)'); - }) - - //ERRORS ROW - it('contains the Errors row', function() { - cy.get('.dashboard-row').contains('Errors'); - }) - it('Errors row is collapsed', function() { - cy.get('.dashboard-row--collapsed').contains('Errors'); - }) - it('expands the Errors row', function(){ - cy.get('.dashboard-row__title.pointer').contains('Errors').click(); - }) - - it('checks all panels in the Errors row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Errors (by code)', - 'Errors (by operation)', - 'Errors (by db_type)' - ]) - }) - }) - - it('collapses the Errors row', function(){ - cy.get('.dashboard-row__title.pointer').contains('Errors').click(); - }) - - //DURATION ROW - it('contains the Duration row', function() { - cy.get('.dashboard-row').contains(/^Duration/); - }) - it('Duration row is collapsed', function() { - cy.get('.dashboard-row--collapsed').contains(/^Duration/); - }) - it('expands the Duration row', function(){ - cy.get('.dashboard-row__title.pointer').contains(/^Duration/).click(); - }) - - it('checks all panels in the Duration row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Duration (Avg)', - 'Duration 50th quantile', - 'Duration 95th quantile' - ]) - }) - }) - - it('collapses the Duration row', function(){ - cy.get('.dashboard-row__title.pointer').contains(/^Duration/).click(); - }) - - //OS ROW - it('contains the OS row', function() { - cy.get('.dashboard-row').contains('OS'); - }) - it('OS row is collapsed', function() { - cy.get('.dashboard-row--collapsed').contains('OS'); - }) - it('expands the OS row', function(){ - cy.get('.dashboard-row__title.pointer').contains('OS').click(); - }) - - it('checks all panels in the row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(5) - expect(titles).to.deep.eq([ - '', - 'CPU Usage', - 'Memory Usage', - 'Network Usage', - 'TCP Retransmissions' - ]) - }) - }) - - it('collapses the OS row', function(){ - cy.get('.dashboard-row__title.pointer').contains('OS').click(); - cy.get('.dashboard-row--collapsed').contains('OS'); - }) -}) diff --git a/vitess-mixin/e2e/cypress/integration/vttablet_host_view.js b/vitess-mixin/e2e/cypress/integration/vttablet_host_view.js deleted file mode 100644 index f98ba803d85..00000000000 --- a/vitess-mixin/e2e/cypress/integration/vttablet_host_view.js +++ /dev/null @@ -1,409 +0,0 @@ -const fs = require('fs') - -describe('vitess-mixin: Vttablet Host View Dashboard Test', function () { - - let panelTitles = [] - - before(function () { - cy.readFile('./test/vttablet_host_view.json').then((data) => { - cy.createDashboard(data) - }) - }) - it('renders vttablet hostview dashboard', function () { - cy.visit('/d/vitess-vttablet-host-view/vttablet - host view (auto-generated)') - }) - //SUB-MENU CONTROLS - it('contains the Host(s) Template', function () { - cy.get('.submenu-controls').contains('Host(s)'); - }) - it('contains vitess-mixin Dashboard links dropdown', function () { - cy.get('.submenu-controls').get('.gf-form').contains('vitess-mixin') - }) - //All Rows are loaded at start time - it('contains 12 rows', function () { - cy.get('.dashboard-row').should('have.length', 12) - }) - - // RED ROW - it('contains the RED row', function () { - cy.get('.dashboard-row').contains('RED - Requests / Error rate / Duration') - }) - - it('checks all panels in the RED row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Requests', - 'Error rate', - 'Duration (p99)' - ]) - }) - }) - - it('collapses the RED row', function () { - cy.get('.dashboard-row__title.pointer').contains('RED - Requests / Error rate / Duration').click(); - }) - // RED BY PLAN TYPE ROW - - it('contains the RED (by plan type) row', function () { - cy.get('.dashboard-row').contains('RED (by plan type)') - }) - it('RED (by plan type) row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains('RED (by plan type)') - }) - it('expands the RED (by plan type) row', function () { - cy.get('.dashboard-row__title.pointer').contains('RED (by plan type)').click(); - }) - - it('checks all panels in the RED (by plan type) row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'Requests (by plan type)', - 'Error rate (by plan type)', - 'Duration p99 (by plan type)' - ]) - }) - }) - - it('collapses the RED (by plan type) row', function () { - cy.get('.dashboard-row__title.pointer').contains('RED (by plan type)').click(); - cy.get('.dashboard-row--collapsed').contains('RED (by plan type)'); - }) - - // RED BY TABLE ROW - - it('contains the RED (by table) row', function () { - cy.get('.dashboard-row').contains('RED (by table)') - }) - it('RED (by table) row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains('RED (by table)') - }) - it('expands the RED (by table) row', function () { - cy.get('.dashboard-row__title.pointer').contains('RED (by table)').click(); - }) - - it('checks all panels in the RED (by table) row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(3) - expect(titles).to.deep.eq([ - '', - 'Requests (by table)', - 'Error rate (by table)' - ]) - }) - }) - - it('collapses the RED (by table) row', function () { - cy.get('.dashboard-row__title.pointer').contains('RED (by table)').click(); - cy.get('.dashboard-row--collapsed').contains('RED (by table)'); - }) - - // Rows Returned - it('contains the Rows Returned row', function () { - cy.get('.dashboard-row').contains(/^Rows returned/) - }) - it('Rows returned row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains(/^Rows returned/) - }) - it('expands the Rows returned row', function () { - cy.get('.dashboard-row__title.pointer').contains(/^Rows returned/).click(); - }) - - it('checks all panels in the Rows returned row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(3) - expect(titles).to.deep.eq([ - '', - 'Rows Returned (by table)', - 'Rows Returned (by plan)' - ]) - }) - }) - - it('collapses the Rows returned row', function () { - cy.get('.dashboard-row__title.pointer').contains(/^Rows returned/).click(); - cy.get('.dashboard-row--collapsed').contains(/^Rows returned/); - }) - - // Queries/Errors - it('contains the Queries/Errors row', function () { - cy.get('.dashboard-row').contains(/^Queries\/Errors/) - }) - it('Queries/Errors row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains(/^Queries\/Errors/) - }) - it('expands the Queries/Errors row', function () { - cy.get('.dashboard-row__title.pointer').contains(/^Queries\/Errors/).click(); - }) - - it('checks all panels in the Queries/Errors row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(3) - expect(titles).to.deep.eq([ - '', - 'Queries Killed', - 'Query errors (by error code)' - ]) - }) - }) - - it('collapses the Queries/Errors row', function () { - cy.get('.dashboard-row__title.pointer').contains(/^Queries\/Errors/).click(); - cy.get('.dashboard-row--collapsed').contains(/^Queries\/Errors/); - }) - - // Vitess Query pool - it('contains the Vitess - Query pool row', function () { - cy.get('.dashboard-row').contains('Vitess - Query pool') - }) - it('Vitess - Query pool row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains('Vitess - Query pool') - }) - it('expands the Vitess - Query pool row', function () { - cy.get('.dashboard-row__title.pointer').contains('Vitess - Query pool').click(); - }) - - it('checks all panels in the Query pool row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(6) - expect(titles).to.deep.eq([ - '', - 'Available Connections', - 'Active Connections', - 'Idle Closed Rate', - 'Wait count', - 'Avg wait time' - ]) - }) - }) - - it('collapses the Vitess - Query pool row', function () { - cy.get('.dashboard-row__title.pointer').contains('Vitess - Query pool').click(); - cy.get('.dashboard-row--collapsed').contains('Vitess - Query pool'); - }) - - // Vitess Transaction pool - it('contains the Vitess - Transaction pool row', function () { - cy.get('.dashboard-row').contains('Vitess - Transaction pool') - }) - it('Vitess - Transaction pool row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains('Vitess - Transaction pool') - }) - it('expands the Vitess - Transaction pool row', function () { - cy.get('.dashboard-row__title.pointer').contains('Vitess - Transaction pool').click(); - }) - - it('checks all panels in the Transaction row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(6) - expect(titles).to.deep.eq([ - '', - 'Available Connections', - 'Active Connections', - 'Idle Closed Rate', - 'Wait count', - 'Avg wait time' - ]) - }) - }) - - it('collapses the Vitess - Transaction pool row', function () { - cy.get('.dashboard-row__title.pointer').contains('Vitess - Transaction pool').click(); - cy.get('.dashboard-row--collapsed').contains('Vitess - Transaction pool'); - }) - - //Vitess timings - it('contains the Vitess Timings row', function () { - cy.get('.dashboard-row').contains(/^Vitess Timings/) - }) - it('Vitess Timings row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains(/^Vitess Timings/) - }) - it('Vitess Timings row has 8 panels', function () { - cy.get('.dashboard-row').contains(/^Vitess Timings/).find('.dashboard-row__panel_count').contains('(8 panels)') - }) - it('expands the Vitess Timings row', function () { - cy.get('.dashboard-row__title.pointer').contains(/^Vitess Timings/).click(); - }) - - it('checks all panels in the Vitess Timings row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(9) - expect(titles).to.deep.eq([ - '', - 'Query Duration (avg)', - 'Query Duration (p50)', - 'Query Duration (p95)', - 'VtGate -> VtTablet Call Time (avg)', - 'Query Time Distribution (Heatmap)', - 'Transaction Duration (avg)', - 'Transaction Duration (p50)', - 'Transaction Duration (p95)' - ]) - }) - }) - - it('collapses the Vitess Timings row', function () { - cy.get('.dashboard-row__title.pointer').contains(/^Vitess Timings/).click(); - cy.get('.dashboard-row--collapsed').contains(/^Vitess Timings/); - }) - - - //MYSQL ROW - it('contains the MySQL row', function () { - cy.get('.dashboard-row').contains('MySQL'); - }) - it('MySQL row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains('MySQL'); - }) - it('expands the MySQL row', function () { - cy.get('.dashboard-row__title.pointer').contains('MySQL').click(); - }) - it('checks all panels in the MySQL row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(2) - expect(titles).to.deep.eq([ - '', - 'Slow Queries' - ]) - }) - }) - it('collapses the MySQL row', function () { - cy.get('.dashboard-row__title.pointer').contains('MySQL').click(); - cy.get('.dashboard-row--collapsed').contains('MySQL'); - }) - - //MYSQL Timings ROW - it('contains the MySQL Timings row', function () { - cy.get('.dashboard-row').contains(/MySQL Timings/); - }) - it('MySQL Timings row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains(/MySQL Timings/); - }) - it('expands the MySQL Timings row', function () { - cy.get('.dashboard-row__title.pointer').contains(/MySQL Timings/).click(); - }) - - it('checks all panels in the MySQL row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'MySQL time (avg)', - 'MySQL Exec Time P50', - 'MySQL Exec Time P95' - ]) - }) - }) - - it('collapses the MySQL Timings row', function () { - cy.get('.dashboard-row__title.pointer').contains(/MySQL Timings/).click(); - cy.get('.dashboard-row--collapsed').contains(/MySQL Timings/); - }) - - //OS ROW - it('contains the OS row', function () { - cy.get('.dashboard-row').contains('OS'); - }) - it('OS row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains('OS'); - }) - it('expands the OS row', function () { - cy.get('.dashboard-row__title.pointer').contains('OS').scrollIntoView().click(); - }) - it('checks all panels in the OS row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(6) - expect(titles).to.deep.eq([ - '', - 'CPU Usage', - 'Memory Usage', - '/mnt disk free', - 'Network Tx Bytes', - 'Network Rx Bytes' - ]) - }) - }) - it('collapses the OS row', function () { - cy.get('.dashboard-row__title.pointer').contains('OS').click(); - cy.get('.dashboard-row--collapsed').contains('OS'); - }) - - //Misc ROW - it('contains the Misc row', function () { - cy.get('.dashboard-row').contains(/^Misc/); - }) - it('Misc row is collapsed', function () { - cy.get('.dashboard-row--collapsed').contains(/^Misc/); - }) - it('expands the Misc row', function () { - cy.get('.dashboard-row__title.pointer').contains(/^Misc/).click(); - }) - it('checks all panels in the Misc row exist',function() { - cy.get('.panel-title').should(($p) => { - let titles = $p.map((i,el) => { - return Cypress.$(el).text() - }) - titles = titles.get() - expect(titles).to.have.length(4) - expect(titles).to.deep.eq([ - '', - 'GC Count', - 'GC Duration total per second', - 'GC Duration quantiles (all hosts)' - ]) - }) - }) - it('collapses the Misc row', function () { - cy.get('.dashboard-row__title.pointer').contains(/^Misc/).click(); - cy.get('.dashboard-row--collapsed').contains(/^Misc/); - }) - -}) diff --git a/vitess-mixin/e2e/cypress/plugins/index.js b/vitess-mixin/e2e/cypress/plugins/index.js deleted file mode 100644 index aa9918d2153..00000000000 --- a/vitess-mixin/e2e/cypress/plugins/index.js +++ /dev/null @@ -1,21 +0,0 @@ -/// -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} diff --git a/vitess-mixin/e2e/cypress/support/commands.js b/vitess-mixin/e2e/cypress/support/commands.js deleted file mode 100644 index 88dec8ed7b0..00000000000 --- a/vitess-mixin/e2e/cypress/support/commands.js +++ /dev/null @@ -1,33 +0,0 @@ -const http = require("http") - -Cypress.Commands.overwrite('visit', (orig, url, options) => { - options = options || {} - options.auth = { - username: 'admin', - password: 'admin', - } - return orig(url, options) -}) - -Cypress.Commands.add('createDashboard', function(dashboardJSON) { - - const payload = JSON.stringify({ - dashboard: dashboardJSON, - overwrite: true - }) - - const options = { - auth: 'admin:admin', - hostname: 'grafana', - port: 3000, - path: '/api/dashboards/db', - method: 'POST', - headers: { - 'Content-Type': 'application/json', - } - } - - const req = http.request(options) - req.write(payload) - req.end() -}) diff --git a/vitess-mixin/e2e/cypress/support/index.js b/vitess-mixin/e2e/cypress/support/index.js deleted file mode 100644 index 614041bb83f..00000000000 --- a/vitess-mixin/e2e/cypress/support/index.js +++ /dev/null @@ -1,28 +0,0 @@ -require('./commands') - -const fs = require('fs') - -// This does not use the usual Cypress.Commands.add registration so that it's -// performed synchronously and we're able to return the panelTitles variable. -cy.createDashboardFromUnitTests = function(testDir, uid, excludePanels=[]) { - let panelTitles = [] - cy.readFile(testDir).then(function(str) { - let panels = [] - for (let [i, [name, panel]] of Object.entries(Object.entries(str))) { - if (excludePanels.includes(name)) { - continue - } - panel['id'] = parseInt(i) - panel['gridPos'] = {'w': 6, 'h': 4, 'x': i * 6 % 24 } - panelTitles.push(panel.title) - panels.push(panel) - } - let dashboardJSON = { - 'uid': uid, - 'title': uid, - 'panels': panels - } - cy.createDashboard(dashboardJSON) - }) - return panelTitles -} diff --git a/vitess-mixin/e2e/dbcli.sh b/vitess-mixin/e2e/dbcli.sh deleted file mode 100755 index 6d56f0b2763..00000000000 --- a/vitess-mixin/e2e/dbcli.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# 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. - -usage () { - echo "Starts a session on a sideloaded vttablet." - echo "Note that this is a direct MySQL connection; if you actually want to work with Vitess, connect via the vtgate with:" - echo " mysql --port=15306 --host=127.0.0.1" - echo - echo "Usage: $0 []" - echo " Don't forget the 'vt_' before the keyspace!" -} - -if [ $# -lt 1 ]; then - usage - exit -1 -fi - -keyspace=${2:-vt_test_keyspace} -long_alias=`printf "%010d" $1` -docker-compose exec vttablet$1 mysql -uvt_dba -S /vt/vtdataroot/vt_${long_alias}/mysql.sock $keyspace diff --git a/vitess-mixin/e2e/default_vschema.json b/vitess-mixin/e2e/default_vschema.json deleted file mode 100644 index e0b50a66037..00000000000 --- a/vitess-mixin/e2e/default_vschema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "sharded": false, - "vindexes": { - "hash": { - "type": "hash" - } - } -} diff --git a/vitess-mixin/e2e/docker-compose.beginners.yml b/vitess-mixin/e2e/docker-compose.beginners.yml deleted file mode 100644 index 46eadd57801..00000000000 --- a/vitess-mixin/e2e/docker-compose.beginners.yml +++ /dev/null @@ -1,312 +0,0 @@ -version: "2.1" -services: - consul1: - image: consul:latest - hostname: "consul1" - ports: - - "8400:8400" - - "8500:8500" - - "8600:8600" - command: "agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0" - consul2: - image: consul:latest - hostname: "consul2" - expose: - - "8400" - - "8500" - - "8600" - command: "agent -server -retry-join consul1 -disable-host-node-id" - depends_on: - - consul1 - consul3: - image: consul:latest - hostname: "consul3" - expose: - - "8400" - - "8500" - - "8600" - command: "agent -server -retry-join consul1 -disable-host-node-id" - depends_on: - - consul1 - # This is a convenience container to quickly test vitess against an external database. - # In practice you will point Vitess to your existing database and migrate to a Vitess managed cluster. - external_db_host: - build: - context: ./external_db/mysql - dockerfile: Dockerfile - restart: always - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-pass} - MYSQL_DATABASE: ${DB:-commerce} - MYSQL_USER: ${DB_USER:-external_db_user} - MYSQL_PASSWORD: ${DB_PASS:-external_db_password} - volumes: - - ./external_db/mysql/:/docker-entrypoint-initdb.d/ - - ./external_db/mysql/log:/var/log/mysql - command: - - --server-id=1 - - --log-bin=mysql-bin - - --gtid_mode=ON - - --enforce_gtid_consistency - - --general_log=1 - - --slow_query_log=1 - healthcheck: - test: "/usr/bin/mysql --user=root --password=$${MYSQL_ROOT_PASSWORD} --execute \"SHOW DATABASES;\"" - timeout: 10s - retries: 10 - ports: - - "3306" - - vtctld: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15000:$WEB_PORT" - - "$GRPC_PORT" - command: ["sh", "-c", " /vt/bin/vtctld \ - $TOPOLOGY_FLAGS \ - -cell $CELL \ - -service_map 'grpc-vtctl' \ - -backup_storage_implementation file \ - -file_backup_storage_root /vt/vtdataroot/backups \ - -logtostderr=true \ - -port $WEB_PORT \ - -grpc_port $GRPC_PORT - "] - depends_on: - - consul1 - - consul2 - - consul3 - depends_on: - external_db_host: - condition: service_healthy - - vtgate: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15099:$WEB_PORT" - - "$GRPC_PORT" - - "15306:$MYSQL_PORT" - command: ["sh", "-c", "/vt/bin/vtgate \ - $TOPOLOGY_FLAGS \ - --logtostderr=true \ - --port $WEB_PORT \ - --grpc_port $GRPC_PORT \ - --mysql_server_port $MYSQL_PORT \ - --mysql_auth_server_impl none \ - --cell $CELL \ - --cells_to_watch $CELL \ - --tablet_types_to_wait PRIMARY,REPLICA \ - --service_map 'grpc-vtgateservice' \ - --enable_system_settings=true \ - "] - volumes: - - ".:/script" - environment: - - KEYSPACE - - DB - depends_on: - - vtctld - depends_on: - vttablet101: - condition: service_healthy - - schemaload: - image: vitess/lite:${VITESS_TAG:-latest} - command: - - sh - - -c - - /script/schemaload.sh - environment: - - TOPOLOGY_FLAGS - - WEB_PORT - - GRPC_PORT - - CELL - - KEYSPACE - - TARGETTAB - - SLEEPTIME - - VSCHEMA_FILE - - SCHEMA_FILES - - POST_LOAD_FILE - - EXTERNAL_DB - volumes: - - .:/script - depends_on: - vttablet101: - condition: service_healthy - - vttablet100: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15100:$WEB_PORT" - - "$GRPC_PORT" - - "3306" - volumes: - - ".:/script" - - "./backups:/vt/vtdataroot/backups" - environment: - - TOPOLOGY_FLAGS - - WEB_PORT - - GRPC_PORT - - CELL - - KEYSPACE - - DB - - EXTERNAL_DB - - DB_PORT - - DB_HOST - - DB_USER - - DB_PASS - - DB_CHARSET - - ROLE=primary - command: ["sh", "-c", "[ $$EXTERNAL_DB -eq 1 ] && /script/vttablet-up.sh 100 || exit 0"] - depends_on: - - vtctld - healthcheck: - test: ["CMD-SHELL","curl -s --fail --show-error localhost:$$WEB_PORT/debug/health"] - interval: 30s - timeout: 10s - retries: 15 - - vttablet101: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15101:$WEB_PORT" - - "$GRPC_PORT" - - "3306" - volumes: - - ".:/script" - - "./backups:/vt/vtdataroot/backups" - environment: - - TOPOLOGY_FLAGS - - WEB_PORT - - GRPC_PORT - - CELL - - KEYSPACE - - DB - - EXTERNAL_DB - - DB_PORT - - DB_HOST - - DB_USER - - DB_PASS - - DB_CHARSET - - ROLE=primary - command: ["sh", "-c", "/script/vttablet-up.sh 101"] - depends_on: - - vtctld - healthcheck: - test: ["CMD-SHELL","curl -s --fail --show-error localhost:$$WEB_PORT/debug/health"] - interval: 30s - timeout: 10s - retries: 15 - - vttablet102: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15102:$WEB_PORT" - - "$GRPC_PORT" - - "3306" - volumes: - - ".:/script" - - "./backups:/vt/vtdataroot/backups" - environment: - - TOPOLOGY_FLAGS - - WEB_PORT - - GRPC_PORT - - CELL - - KEYSPACE - - DB - - EXTERNAL_DB - - DB_PORT - - DB_HOST - - DB_USER - - DB_PASS - - DB_CHARSET - command: ["sh", "-c", "/script/vttablet-up.sh 102"] - depends_on: - - vtctld - - vttablet101 - healthcheck: - test: ["CMD-SHELL","curl -s --fail --show-error localhost:$$WEB_PORT/debug/health"] - interval: 30s - timeout: 10s - retries: 15 - - vttablet103: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15103:$WEB_PORT" - - "$GRPC_PORT" - - "3306" - volumes: - - ".:/script" - - "./backups:/vt/vtdataroot/backups" - environment: - - TOPOLOGY_FLAGS - - WEB_PORT - - GRPC_PORT - - CELL - - KEYSPACE - - DB - - EXTERNAL_DB - - DB_PORT - - DB_HOST - - DB_USER - - DB_PASS - - DB_CHARSET - command: ["sh", "-c", "/script/vttablet-up.sh 103"] - depends_on: - - vtctld - - vttablet101 - healthcheck: - test: ["CMD-SHELL","curl -s --fail --show-error localhost:$$WEB_PORT/debug/health"] - interval: 30s - timeout: 10s - retries: 15 - - vtorc: - image: vitess/lite:${VITESS_TAG:-latest} - command: ["sh", "-c", "/script/vtorc-up.sh"] - depends_on: - - vtctld - ports: - - "13000:3000" - volumes: - - ".:/script" - environment: - - TOPOLOGY_FLAGS - - WEB_PORT - - GRPC_PORT - - CELL - - KEYSPACE - - DB - - EXTERNAL_DB - - DB_PORT - - DB_HOST - - DB_USER - - DB_PASS - - DB_CHARSET - healthcheck: - test: ["CMD-SHELL","curl -s --fail --show-error localhost:3000/api/status"] - interval: 5s - timeout: 10s - retries: 15 - - vreplication: - image: vitess/lite:${VITESS_TAG:-latest} - volumes: - - ".:/script" - environment: - - TOPOLOGY_FLAGS - - WEB_PORT - - GRPC_PORT - - CELL - - KEYSPACE - - DB - - EXTERNAL_DB - - DB_PORT - - DB_HOST - - DB_USER - - DB_PASS - - DB_CHARSET - command: ["sh", "-c", "[ $$EXTERNAL_DB -eq 1 ] && /script/externaldb_vreplication.sh || exit 0"] - depends_on: - - vtctld diff --git a/vitess-mixin/e2e/docker-compose.dev.yml b/vitess-mixin/e2e/docker-compose.dev.yml deleted file mode 100644 index e5bb4f20ef5..00000000000 --- a/vitess-mixin/e2e/docker-compose.dev.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: '3' -services: - grafana: - image: grafana/grafana:${GRAFANA_VERSION?err} - ports: - - "3030:3000" - e2e: - build: - context: . - args: - CYPRESS_IMAGE: cypress/included:5.3.0 - image: grafonnet-e2e-dev - entrypoint: cypress open --project . - depends_on: - - grafana - environment: - - CYPRESS_baseUrl=http://grafana:3000 - - CYPRESS_video=false - - DISPLAY=${DISPLAY?err} - volumes: - - ./cypress:/e2e/cypress - - ./cypress.json:/e2e/cypress.json - - ../dashboards_out:/e2e/test - - /tmp/.X11-unix:/tmp/.X11-unix - deploy: - resources: - limits: - memory: 2G - reservations: - memory: 1G -volumes: - prometheus-data: {} diff --git a/vitess-mixin/e2e/docker-compose.vt.yml b/vitess-mixin/e2e/docker-compose.vt.yml deleted file mode 100644 index 1132068f252..00000000000 --- a/vitess-mixin/e2e/docker-compose.vt.yml +++ /dev/null @@ -1,447 +0,0 @@ -version: '3' -services: - consul1: - command: agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0 - hostname: consul1 - image: consul:latest - ports: - - 8400:8400 - - 8500:8500 - - 8600:8600 - consul2: - command: agent -server -retry-join consul1 -disable-host-node-id - depends_on: - - consul1 - expose: - - "8400" - - "8500" - - "8600" - hostname: consul2 - image: consul:latest - consul3: - command: agent -server -retry-join consul1 -disable-host-node-id - depends_on: - - consul1 - expose: - - "8400" - - "8500" - - "8600" - hostname: consul3 - image: consul:latest - external_db_host: - build: - context: ./external_db/mysql - dockerfile: Dockerfile - command: - - --server-id=1 - - --log-bin=mysql-bin - - --gtid_mode=ON - - --enforce_gtid_consistency - - --general_log=1 - - --slow_query_log=1 - environment: - MYSQL_DATABASE: ${DB:-commerce} - MYSQL_PASSWORD: ${DB_PASS:-external_db_password} - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-pass} - MYSQL_USER: ${DB_USER:-external_db_user} - healthcheck: - retries: 10 - test: /usr/bin/mysql --user=root --password=$${MYSQL_ROOT_PASSWORD} --execute - "SHOW DATABASES;" - timeout: 10s - ports: - - "3306" - restart: always - volumes: - - ./external_db/mysql/:/docker-entrypoint-initdb.d/ - - ./external_db/mysql/log:/var/log/mysql - schemaload_lookup_keyspace: - command: - - sh - - -c - - /script/schemaload.sh - depends_on: - vttablet301: - condition: service_healthy - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=lookup_keyspace - - TARGETTAB=test-0000000301 - - SLEEPTIME=15 - - VSCHEMA_FILE=lookup_keyspace_vschema.json - - SCHEMA_FILES=lookup_keyspace_schema_file.sql - - POST_LOAD_FILE= - - EXTERNAL_DB=0 - image: vitess/lite:${VITESS_TAG:-latest} - volumes: - - .:/script - schemaload_test_keyspace: - command: - - sh - - -c - - /script/schemaload.sh - depends_on: - vttablet101: - condition: service_healthy - vttablet201: - condition: service_healthy - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - TARGETTAB=test-0000000101 - - SLEEPTIME=15 - - VSCHEMA_FILE=test_keyspace_vschema.json - - SCHEMA_FILES=test_keyspace_schema_file.sql - - POST_LOAD_FILE= - - EXTERNAL_DB=0 - image: vitess/lite:${VITESS_TAG:-latest} - volumes: - - .:/script - vreplication: - command: - - sh - - -c - - '[ $$EXTERNAL_DB -eq 1 ] && /script/externaldb_vreplication.sh || exit 0' - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - EXTERNAL_DB=0 - image: vitess/lite:${VITESS_TAG:-latest} - volumes: - - .:/script - vtctld: - command: - - sh - - -c - - ' /vt/bin/vtctld -topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global -cell test - -service_map ''grpc-vtctl'' -backup_storage_implementation file -file_backup_storage_root - /vt/vtdataroot/backups -logtostderr=true -port 8080 -grpc_port 15999 ' - depends_on: - external_db_host: - condition: service_healthy - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - 15000:8080 - - "15999" - volumes: - - .:/script - vtgate: - command: - - sh - - -c - - '/script/run-forever.sh /vt/bin/vtgate --topo_implementation consul --topo_global_server_address - consul1:8500 --topo_global_root vitess/global --logtostderr=true --port 8080 --grpc_port - 15999 --mysql_server_port 15306 --mysql_auth_server_impl none --cell test --cells_to_watch - test --tablet_types_to_wait PRIMARY,REPLICA,RDONLY --service_map ''grpc-vtgateservice'' - --normalize_queries=true ' - depends_on: - - vtctld - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - 15099:8080 - - "15999" - - 15306:15306 - volumes: - - .:/script - vtorc: - command: - - sh - - -c - - /script/vtorc-up.sh - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - EXTERNAL_DB=0 - - DB_USER= - - DB_PASS= - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - 13000:3000 - volumes: - - .:/script - vttablet101: - command: - - sh - - -c - - /script/vttablet-up.sh 101 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - SHARD=-80 - - ROLE=primary - - VTHOST=vttablet101 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl -s --fail --show-error localhost:8080/debug/health - timeout: 10s - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - 15101:8080 - - "15999" - - "3306" - volumes: - - .:/script - vttablet102: - command: - - sh - - -c - - /script/vttablet-up.sh 102 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - SHARD=-80 - - ROLE=replica - - VTHOST=vttablet102 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl -s --fail --show-error localhost:8080/debug/health - timeout: 10s - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - 15102:8080 - - "15999" - - "3306" - volumes: - - .:/script - vttablet201: - command: - - sh - - -c - - /script/vttablet-up.sh 201 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - SHARD=80- - - ROLE=primary - - VTHOST=vttablet201 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl -s --fail --show-error localhost:8080/debug/health - timeout: 10s - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - 15201:8080 - - "15999" - - "3306" - volumes: - - .:/script - vttablet202: - command: - - sh - - -c - - /script/vttablet-up.sh 202 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - SHARD=80- - - ROLE=replica - - VTHOST=vttablet202 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl -s --fail --show-error localhost:8080/debug/health - timeout: 10s - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - 15202:8080 - - "15999" - - "3306" - volumes: - - .:/script - vttablet301: - command: - - sh - - -c - - /script/vttablet-up.sh 301 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=lookup_keyspace - - SHARD=- - - ROLE=primary - - VTHOST=vttablet301 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl -s --fail --show-error localhost:8080/debug/health - timeout: 10s - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - 15301:8080 - - "15999" - - "3306" - volumes: - - .:/script - vttablet302: - command: - - sh - - -c - - /script/vttablet-up.sh 302 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=lookup_keyspace - - SHARD=- - - ROLE=replica - - VTHOST=vttablet302 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl -s --fail --show-error localhost:8080/debug/health - timeout: 10s - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - 15302:8080 - - "15999" - - "3306" - volumes: - - .:/script - prometheus: - image: prom/prometheus:v2.21.0 - ports: - - 9000:9090 - volumes: - - ./prometheus:/etc/prometheus - - ../prometheus_rules.yaml:/etc/prometheus/prometheus_rules.yaml - - prometheus-data:/prometheus - command: --web.enable-lifecycle --config.file=/etc/prometheus/prometheus.yml - depends_on: - - vtctld - grafana: - image: grafana/grafana:${GRAFANA_VERSION?err} - ports: - - "3030:3000" - volumes: - - ./grafana/provisioning:/etc/grafana/provisioning - - ../dashboards_out/cluster_overview.json:/etc/grafana/provisioning/dashboards/cluster_overview.json - - ../dashboards_out/vtgate_overview.json:/etc/grafana/provisioning/dashboards/vtgate_overview.json - - ../dashboards_out/vtgate_host_view.json:/etc/grafana/provisioning/dashboards/vtgate_host_view.json - - ../dashboards_out/vttablet_host_view.json:/etc/grafana/provisioning/dashboards/vttablet_host_view.json - depends_on: - - prometheus - - vtgate - - vttablet101 - node-exporter: - image: prom/node-exporter - volumes: - - /proc:/host/proc:ro - - /sys:/host/sys:ro - - /:/rootfs:ro - command: - - '--path.procfs=/host/proc' - - '--path.sysfs=/host/sys' - - --collector.filesystem.ignored-mount-points - - "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)" - ports: - - '9100:9100' - deploy: - mode: global - mysqld_exporter: - image: prom/mysqld-exporter:latest - environment: - - DATA_SOURCE_NAME=root:pass@(external_db_host:3306)/ - ports: - - "9104:9104" - depends_on: - - external_db_host - # TODO: ADD CYPRESS FOR AUTOMATED TESTING -volumes: - prometheus-data: {} diff --git a/vitess-mixin/e2e/docker-compose.yml b/vitess-mixin/e2e/docker-compose.yml deleted file mode 100644 index e46fbcab849..00000000000 --- a/vitess-mixin/e2e/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: '3' -services: - grafana: - image: grafana/grafana:${GRAFANA_VERSION?err} - e2e: - build: - context: . - args: - CYPRESS_IMAGE: cypress/base:12 - image: grafonnet-e2e - command: npx cypress run - depends_on: - - grafana - environment: - - CYPRESS_baseUrl=http://grafana:3000 - - CYPRESS_video=false - volumes: - - ./cypress:/e2e/cypress - - ./cypress.json:/e2e/cypress.json - - ../dashboards_out:/e2e/test diff --git a/vitess-mixin/e2e/external_db/.env b/vitess-mixin/e2e/external_db/.env deleted file mode 100644 index f2745ff08ef..00000000000 --- a/vitess-mixin/e2e/external_db/.env +++ /dev/null @@ -1,4 +0,0 @@ -MYSQL_ROOT_PASSWORD=pass -MYSQL_USER=dbuser -MYSQL_PASSWORD=dbpass -MYSQL_DB=commerce \ No newline at end of file diff --git a/vitess-mixin/e2e/external_db/README.md b/vitess-mixin/e2e/external_db/README.md deleted file mode 100644 index 610a9350111..00000000000 --- a/vitess-mixin/e2e/external_db/README.md +++ /dev/null @@ -1,113 +0,0 @@ -**This README is kept here for reference, however the parent [README](../README) contains all the information necesaary to simulate this in a better way** - -# Simulate external/remote database for Vitess using docker-compose - -This directory has a docker-compose that will bring up a mysql instance. -You can then point your vitess cluster to it to understand how to use Vitess for your existing database -when you cannot install Vitess on the mysql instance. - -First you will need to [install docker-compose](https://docs.docker.com/compose/install/). - - -### Create new docker-machine -Create a new docker-machine that will run your mysql container. -Creating a new machine allows you to more comprehensively test the remote functionality. -``` -vitess/examples/compose/external_db$ docker-machine create remote-db -``` - -Grab the docker-machine ip -``` -vitess/examples/compose/external_db$ docker-machine ip remote-db -192.168.99.101 -``` - -Set the environment variables for the remote-db machine -``` -vitess/examples/compose/external_db$ eval $(docker-machine ip remote-db) -``` - -### Start mysql -Start the mysql instance -``` -vitess/examples/compose/external_db$ docker-compose up -d -``` -This will do the following; -1. Starts mysql service and exposes it at `:3306` -2. Creates a `commerce` database with `users` table -3. Adds sample data to the users table -4. Starts a lightweight adminer container to interact with the database accessible at `:8081` -5. Default credentials - ``` - MYSQL_DB: commerce - MYSQL_USER: dbuser - MYSQL_PASSWORD: dbpass - MYSQL_ROOT_PASSWORD: pass - ``` - -### Confirm containers are up -Run the following -``` -vitess/examples/compose/external_db$ docker-compose ps -``` - -A valid response should look like below -```sh - Name Command State Ports ---------------------------------------------------------------------------------------------------------- -external_db_adminer_1 entrypoint.sh docker-php-e ... Up 0.0.0.0:8081->8080/tcp -external_db_db_1 docker-entrypoint.sh mysqld Up (healthy) 0.0.0.0:3306->3306/tcp, 33060/tcp -``` -You now have a mysql instance ready to be *migrated* to Vitess. - -### Start Vitess pointed to this remote database -Head on to [vitess compose instructions](../README.md ) - -If using docker-compose.beginners.yml, run; -``` -vitess/examples/compose$ cp docker-compose.beginners.yml docker-compose.yml -``` -Update your `.env` file with these; -``` -KEYSPACE=commerce -DB=commerce -EXTERNAL_DB=1 -DB_HOST= -DB_PORT=3306 -DB_USER=dbuser -DB_PASS=dbpass -DB_CHARSET=CHARACTER SET latin1 COLLATE latin1_swedish_ci -``` - - -If using `vtcompose` command, run; -``` -vitess/examples/compose$ go run vtcompose/vtcompose.go -keyspaceData="commerce:0:2::" -externalDbData="commerce::3306:dbuser:dbpass:CHARACTER SET latin1 COLLATE latin1_swedish_ci" -``` - -**Ensure you start Vitess in a different docker-machine!!** -If not, run; -``` -vitess/examples/compose$ docker-machine create vitess -vitess/examples/compose$ $(docker-machine env vitess) -``` - -Start Vitess -``` -vitess/examples/compose$ docker-compose up -d -``` - -You should now have Vitess running against your external database instance. - -* [Follow this guide for advanced usage](../README.md#advanced-usage "Advanced Usage" ) -* [See this for common issues](../README.md#common-errors "Common Issues" ) - -### Migrating to Vitess -Migrating to Vitess entirely can be done from; -a) The Vitess Control Panel at http://:15000 -b) The `lvtctl.sh` Helper Script; - -The steps are same -1. Do an EmergencyReparentShard to make a replica the new primary. -2. Ran InitShardPrimary on the new primary. -3. If Vitess is wrong about who the MySQL primary is, you can update it with TabletExternallyReparented diff --git a/vitess-mixin/e2e/external_db/docker-compose.yml b/vitess-mixin/e2e/external_db/docker-compose.yml deleted file mode 100644 index 4c414324e63..00000000000 --- a/vitess-mixin/e2e/external_db/docker-compose.yml +++ /dev/null @@ -1,41 +0,0 @@ -version: '2.1' - -volumes: - vol-db: - -services: - db: - build: - context: ./mysql - dockerfile: Dockerfile - restart: always - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-pass} - MYSQL_DATABASE: ${MYSQL_DB:-commerce} - MYSQL_USER: ${MYSQL_USER:-dbuser} - MYSQL_PASSWORD: ${MYSQL_PASSWORD:-dbpass} - volumes: - - vol-db:/var/lib/mysql - - ./mysql/:/docker-entrypoint-initdb.d/ - - ./mysql/mysql57.cnf:/etc/mysql/conf.d/mysql57.cnf:ro - - ./mysql/log:/var/log/mysql - command: - - --server-id=1 - - --log-bin=mysql-bin - - --gtid_mode=ON - - --enforce_gtid_consistency - - --general_log=1 - - --slow_query_log=1 - healthcheck: - test: "/usr/bin/mysql --user=root --password=$${MYSQL_ROOT_PASSWORD} --execute \"SHOW DATABASES;\"" - timeout: 10s - retries: 10 - ports: - - "3306:3306" - - adminer: - image: adminer - environment: - ADMINER_DESIGN: rmsoft - ports: - - "8081:8080" diff --git a/vitess-mixin/e2e/external_db/mysql/Dockerfile b/vitess-mixin/e2e/external_db/mysql/Dockerfile deleted file mode 100644 index f44c63951e3..00000000000 --- a/vitess-mixin/e2e/external_db/mysql/Dockerfile +++ /dev/null @@ -1,2 +0,0 @@ -FROM mysql:5.7 -COPY . /docker-entrypoint-initdb.d \ No newline at end of file diff --git a/vitess-mixin/e2e/external_db/mysql/commerce.sql b/vitess-mixin/e2e/external_db/mysql/commerce.sql deleted file mode 100644 index 8154d91e7f5..00000000000 --- a/vitess-mixin/e2e/external_db/mysql/commerce.sql +++ /dev/null @@ -1,20 +0,0 @@ -CREATE DATABASE IF NOT EXISTS commerce; -USE commerce; -DROP TABLE IF EXISTS users; -CREATE TABLE users ( - device_id BIGINT, - first_name VARCHAR(50), - last_name VARCHAR(50), - telephone BIGINT, - gender VARCHAR(16), - reference_id INT, - confidence INT, - coverage INT, - refstart DATETIME, - refstop DATETIME, - qrystart DATETIME, - qrystop DATETIME); - -LOAD DATA LOCAL INFILE '/docker-entrypoint-initdb.d/dataset.csv' INTO TABLE users FIELDS TERMINATED BY ','; - -ALTER TABLE users ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY; \ No newline at end of file diff --git a/vitess-mixin/e2e/external_db/mysql/dataset.csv b/vitess-mixin/e2e/external_db/mysql/dataset.csv deleted file mode 100644 index f2af8d74ce7..00000000000 --- a/vitess-mixin/e2e/external_db/mysql/dataset.csv +++ /dev/null @@ -1,1000 +0,0 @@ -1,Elianore,Dunbleton,867-921-5436,Female,1,4,90,2018-11-20 00:23:59,2018-02-11 11:32:09,2018-06-18 23:40:59,2018-07-14 00:59:56 -2,Isa,Gilfoyle,539-533-8647,Male,7,86,65,2018-03-22 18:52:41,2019-01-16 21:08:18,2019-01-03 10:48:54,2018-08-29 14:52:14 -3,Millicent,Jedrys,184-899-3979,Female,5,30,17,2018-06-29 14:14:44,2018-06-07 05:03:57,2018-04-08 03:56:39,2018-02-12 06:41:48 -4,Davey,Sutch,862-838-8206,Male,1,62,94,2018-11-14 06:47:18,2018-08-08 22:44:26,2018-07-12 21:09:27,2018-03-04 16:23:22 -5,Adiana,Strowger,792-848-5008,Female,6,97,75,2018-08-07 01:32:59,2018-08-06 16:19:48,2019-01-20 13:11:37,2018-09-02 22:39:39 -6,Oby,Winthrop,522-736-9711,Male,7,95,11,2018-09-29 06:49:44,2018-02-02 11:07:25,2018-08-17 12:49:31,2018-06-03 13:27:48 -7,Berte,Beldon,947-708-5622,Female,6,3,26,2018-11-21 14:55:27,2018-11-15 17:16:04,2018-01-23 06:12:07,2018-08-30 14:40:37 -8,Logan,Atack,103-849-8439,Male,1,20,86,2019-01-04 01:18:38,2018-09-20 23:59:42,2018-05-10 13:14:24,2018-09-25 10:05:29 -9,Vania,Rosenblum,302-132-8289,Female,5,85,32,2018-03-31 00:24:32,2018-07-28 14:50:39,2018-04-19 12:32:49,2018-04-03 08:31:11 -10,Giffie,Lindblad,312-429-3236,Male,1,52,65,2018-04-15 15:34:57,2018-09-03 05:54:49,2019-01-05 06:42:27,2018-11-05 21:47:08 -11,Bili,Weigh,442-992-2387,Female,5,88,97,2018-12-01 04:31:51,2018-08-22 15:52:23,2018-12-07 23:25:46,2018-08-08 07:47:35 -12,Marlin,Stair,854-643-9633,Male,1,62,61,2018-05-30 14:08:25,2018-03-02 03:34:27,2018-03-21 22:43:12,2018-06-03 18:02:22 -13,Dacey,Corradino,364-281-2170,Female,3,82,19,2018-04-10 01:42:36,2019-01-08 17:42:03,2018-05-20 04:07:33,2018-10-14 03:57:57 -14,Caresse,Santon,221-929-9690,Female,7,97,50,2018-11-20 23:15:03,2019-01-01 18:46:08,2018-04-08 05:49:39,2018-10-04 04:00:37 -15,Trixi,Westphalen,681-738-3653,Female,7,100,87,2018-07-09 18:04:01,2018-11-21 04:36:24,2018-11-25 09:43:50,2018-09-10 07:40:31 -16,Pauline,Breslauer,821-177-6696,Female,6,63,24,2018-11-02 19:56:35,2018-02-09 07:46:00,2019-01-08 03:21:02,2018-09-18 08:18:06 -17,Meridith,Briddock,716-528-7645,Female,3,72,24,2018-11-30 20:13:26,2018-04-04 00:17:34,2018-07-12 04:42:43,2018-07-13 02:53:00 -18,Cordy,Sothern,733-369-1763,Male,6,72,5,2018-08-19 02:02:51,2018-10-01 16:39:38,2019-01-18 12:58:50,2018-04-26 11:01:54 -19,Thom,Swarbrigg,566-424-7472,Male,3,56,29,2018-01-25 19:13:40,2018-09-06 20:39:48,2018-12-23 14:49:40,2018-09-19 13:03:37 -20,Amelina,Ekell,514-321-8056,Female,5,42,43,2018-12-15 14:21:28,2018-08-07 02:53:55,2018-09-30 04:29:03,2018-08-02 18:29:13 -21,Cesare,Lahy,446-382-1825,Male,2,32,10,2018-07-08 01:24:43,2018-03-24 15:25:21,2018-11-15 18:50:17,2018-03-27 19:18:16 -22,Elnora,Cheale,489-718-9700,Female,6,12,73,2018-10-26 17:34:35,2018-12-22 05:44:59,2018-05-09 01:25:04,2018-09-21 18:40:44 -23,Hadrian,Snarie,859-447-4644,Male,1,18,4,2018-08-31 12:15:30,2018-04-16 11:19:30,2018-02-28 10:55:26,2018-10-31 07:05:29 -24,Ravid,Meriott,518-484-9203,Male,1,83,12,2018-12-01 21:38:00,2018-02-12 17:25:00,2018-09-18 16:34:45,2018-09-08 17:32:17 -25,Elenore,De Gowe,180-237-8349,Female,7,75,3,2018-03-20 20:52:00,2018-12-22 19:52:58,2018-07-06 23:18:01,2018-08-12 22:02:21 -26,Juieta,Pridie,278-696-9233,Female,1,93,57,2018-09-04 18:45:44,2018-06-04 17:38:47,2018-11-16 10:31:12,2018-07-15 10:27:10 -27,Neddie,Mosedall,956-605-6537,Male,3,94,19,2018-04-09 13:54:22,2018-04-12 10:58:25,2018-08-21 10:57:27,2018-08-22 20:29:53 -28,Octavius,Fordham,797-217-3886,Male,3,32,82,2018-11-23 16:25:55,2018-11-15 12:08:34,2018-10-28 03:46:45,2018-06-22 03:16:15 -29,Edwin,Tapson,578-261-4030,Male,7,83,39,2018-12-16 01:07:34,2018-12-27 23:39:47,2018-12-03 00:30:10,2018-03-09 18:09:49 -30,Korry,Dyos,108-910-1353,Female,3,80,93,2018-06-14 09:39:58,2018-08-12 21:17:11,2018-09-14 12:22:43,2018-04-08 23:31:12 -31,Kenn,Leist,300-420-7371,Male,5,100,90,2018-11-24 01:42:36,2018-10-27 21:31:19,2019-01-05 02:32:45,2018-11-24 06:45:27 -32,Eldredge,Kemmis,451-974-5763,Male,2,44,42,2018-11-18 11:28:34,2018-02-17 08:01:53,2018-08-21 19:25:26,2018-12-23 12:29:15 -33,Suzanne,Matthiae,560-959-3441,Female,4,56,7,2018-05-04 04:19:19,2018-04-11 11:59:42,2018-02-01 16:22:38,2018-11-15 19:58:02 -34,Josh,Callendar,719-551-3561,Male,4,61,56,2018-10-12 07:20:47,2018-06-14 12:53:31,2018-07-20 09:35:33,2018-03-26 05:54:27 -35,Ian,Thoresby,392-740-5436,Male,7,77,8,2018-03-04 19:37:23,2018-08-07 02:19:40,2018-09-24 07:54:33,2018-07-09 15:36:52 -36,Cordi,Vanichkin,773-231-4509,Female,1,99,90,2018-07-02 02:43:15,2019-01-20 04:28:54,2018-09-05 05:02:38,2019-01-08 04:08:00 -37,Ariel,Le land,917-249-6942,Male,5,9,45,2018-04-29 18:48:49,2018-06-23 08:15:12,2018-01-22 01:29:55,2019-01-03 21:24:23 -38,Delila,Assard,119-780-7155,Female,3,83,70,2018-12-01 01:09:53,2018-05-22 00:23:40,2018-05-19 13:53:02,2018-02-17 03:43:18 -39,Deny,Cullrford,100-298-0840,Female,5,50,39,2018-05-09 23:21:57,2018-05-31 23:46:32,2018-12-03 09:53:47,2019-01-12 10:16:35 -40,Frannie,Sharer,410-855-0951,Male,6,72,43,2018-05-12 06:05:03,2018-04-21 17:15:14,2018-08-30 07:18:18,2018-06-20 04:51:13 -41,Jonis,Lintin,803-933-8038,Female,4,89,84,2018-09-13 20:13:23,2018-08-28 18:20:52,2018-03-13 03:07:16,2018-03-05 07:10:50 -42,Bessie,Hackett,443-436-4804,Female,4,20,36,2018-06-13 07:34:49,2018-06-01 11:23:42,2018-10-19 12:40:14,2018-02-10 12:37:05 -43,Gayel,Tabard,704-527-0263,Female,6,40,44,2019-01-04 14:41:19,2018-04-15 00:21:22,2018-12-30 07:24:38,2018-05-02 21:10:48 -44,Ardisj,Ridder,899-877-7365,Female,1,21,84,2018-06-13 21:09:11,2018-12-02 20:33:23,2018-03-25 07:43:03,2018-10-12 11:26:41 -45,Hammad,Stroband,874-825-9046,Male,3,30,83,2018-09-14 06:04:39,2018-10-23 13:35:20,2018-03-10 08:19:18,2018-07-18 20:31:55 -46,Darius,Sorel,750-599-8665,Male,7,98,76,2018-09-17 22:09:17,2018-06-02 14:07:06,2018-12-08 15:52:18,2018-05-05 12:38:37 -47,Dido,Stockin,339-433-0084,Female,1,89,59,2018-04-30 07:42:06,2018-10-18 22:27:31,2018-11-11 05:06:09,2019-01-01 14:19:17 -48,Sholom,Cobbing,828-431-0433,Male,4,53,86,2018-11-03 23:21:35,2018-10-23 13:33:47,2018-09-03 06:25:27,2019-01-18 06:26:39 -49,Melinde,Hynd,283-446-7128,Female,5,97,84,2018-07-31 06:28:22,2018-10-24 04:00:28,2018-07-28 03:47:24,2018-02-10 19:44:46 -50,Hedvige,Fontenot,534-558-8139,Female,4,94,62,2018-07-15 15:22:39,2018-03-20 18:21:30,2018-03-04 17:34:45,2018-05-25 22:41:39 -51,Killian,Gilmartin,722-114-3059,Male,1,47,8,2018-08-24 01:48:56,2018-07-21 08:24:06,2018-11-05 06:28:14,2018-05-06 13:37:33 -52,Inness,O'Cullinane,630-746-2431,Male,3,71,93,2018-06-14 22:12:56,2018-04-12 23:09:39,2018-02-02 09:42:12,2018-11-14 01:06:15 -53,Doretta,Galiford,528-456-0043,Female,3,84,95,2018-09-09 15:03:41,2018-03-30 03:54:32,2018-10-03 10:51:33,2018-12-15 22:54:24 -54,Alicia,Kemmons,695-461-8136,Female,7,16,82,2018-03-26 20:29:48,2018-03-25 15:58:54,2018-01-30 03:52:35,2018-02-11 04:14:39 -55,Brandea,Nannizzi,215-545-0363,Female,2,86,20,2018-11-05 15:18:22,2018-02-18 13:05:40,2018-11-27 14:37:52,2018-05-04 23:08:00 -56,Jordan,Parkman,473-392-8118,Male,1,41,46,2018-09-27 14:56:49,2018-04-27 06:35:47,2018-02-04 22:54:44,2018-12-06 04:53:24 -57,Bourke,Whittaker,712-907-5729,Male,2,71,6,2018-10-19 17:00:36,2018-12-02 03:28:48,2018-04-13 01:02:14,2018-04-11 23:42:42 -58,Honey,Adriano,822-890-9194,Female,4,31,95,2018-06-18 04:19:51,2018-03-12 03:05:16,2018-02-02 00:52:15,2019-01-07 13:33:51 -59,Tracie,Warrender,617-331-6980,Male,3,69,37,2018-07-09 15:19:55,2018-07-26 13:00:13,2018-03-06 19:39:06,2018-10-05 14:56:58 -60,Billy,Eadmead,556-100-5109,Female,6,16,63,2018-10-04 07:52:43,2018-07-02 07:34:18,2018-05-03 01:03:27,2018-06-03 11:04:04 -61,Jamesy,Mellenby,554-299-7370,Male,6,53,82,2018-10-25 22:03:32,2018-05-03 02:36:00,2018-01-26 21:04:03,2018-09-15 17:06:05 -62,Goober,Mawby,765-918-7080,Male,1,70,20,2018-08-05 15:03:53,2018-09-15 16:38:46,2018-03-02 01:37:07,2018-12-15 23:40:37 -63,Zach,Tompkins,798-498-7252,Male,6,45,65,2018-06-26 09:42:40,2018-04-20 17:05:50,2018-09-18 16:58:53,2018-06-24 00:57:54 -64,Augustine,Cornbill,600-318-2489,Male,7,30,38,2018-02-08 08:08:53,2018-08-14 07:05:17,2018-10-14 01:12:13,2018-09-20 19:42:49 -65,Cort,Rosingdall,915-533-3544,Male,5,81,82,2019-01-18 02:20:54,2018-03-12 08:02:19,2018-05-13 15:10:29,2018-05-16 21:38:26 -66,Broddie,Dziwisz,404-420-5799,Male,7,3,22,2018-08-30 21:01:34,2018-03-13 06:37:11,2018-04-27 16:13:37,2018-12-09 08:39:26 -67,Clarke,Goodge,499-845-2443,Male,2,14,95,2018-04-02 10:32:42,2018-04-27 00:42:32,2018-05-29 08:36:44,2018-04-01 23:40:09 -68,Madelyn,Knight,724-972-4025,Female,6,12,57,2018-04-25 04:45:31,2018-08-13 14:34:24,2018-05-25 09:58:32,2018-09-02 04:03:25 -69,Bibby,Pace,266-593-6853,Female,2,11,87,2018-04-12 22:35:20,2018-03-10 11:28:13,2018-04-12 15:22:53,2018-04-21 18:57:47 -70,Nedi,Tambling,534-778-4478,Female,5,69,95,2018-04-27 15:43:27,2018-07-27 11:55:14,2018-04-05 07:02:04,2018-08-26 01:25:05 -71,Veronica,Alejandro,208-365-2416,Female,1,22,32,2018-04-09 03:42:21,2018-03-30 02:47:59,2018-02-08 16:43:52,2018-03-10 19:51:53 -72,Cecil,Walewicz,133-144-8036,Male,3,58,23,2018-12-26 06:56:13,2018-06-08 09:09:35,2018-02-16 16:39:15,2018-12-21 00:33:53 -73,Salem,Armell,186-906-5312,Male,7,25,47,2018-10-08 00:28:48,2018-09-03 00:55:23,2018-01-31 20:13:21,2018-04-06 20:30:43 -74,Brook,Buckston,714-565-2523,Female,1,13,92,2018-02-12 13:53:51,2019-01-10 22:17:38,2018-08-03 18:27:58,2018-09-06 10:38:45 -75,Benson,MacParlan,881-685-7375,Male,7,95,39,2018-04-07 06:40:34,2018-05-10 22:04:48,2018-10-06 01:07:35,2018-12-25 18:36:48 -76,Lukas,Kittle,845-541-8229,Male,1,52,85,2018-04-14 08:08:32,2018-08-21 12:21:22,2018-11-17 23:14:34,2018-06-21 02:48:31 -77,Jessa,Claus,611-425-9914,Female,7,99,56,2018-10-22 02:50:57,2018-11-25 03:44:27,2018-06-30 15:33:40,2018-07-02 03:59:50 -78,Hieronymus,Schurig,840-630-9703,Male,6,98,77,2018-01-24 18:01:57,2018-06-05 08:22:05,2018-07-12 07:09:14,2018-07-31 08:09:20 -79,Quintilla,Risborough,367-606-2805,Female,4,15,15,2018-10-24 13:48:18,2018-12-16 11:17:17,2018-05-17 19:15:19,2018-06-22 16:46:31 -80,Arv,Billingsley,438-164-1166,Male,3,54,65,2018-07-21 13:35:44,2018-10-07 14:37:53,2018-11-16 15:38:23,2018-10-19 21:07:38 -81,Happy,Rodrigo,427-752-3843,Female,2,28,25,2018-01-28 21:31:16,2018-07-06 04:48:40,2018-02-19 10:50:55,2018-10-20 15:58:59 -82,Cos,Chalfain,609-228-7131,Male,6,12,80,2018-02-24 18:06:52,2018-07-21 03:12:50,2018-02-22 09:53:50,2018-12-04 18:31:35 -83,Dael,Crother,249-141-1807,Male,3,11,86,2018-09-09 23:04:41,2018-02-24 13:19:31,2018-11-05 15:18:33,2018-12-23 18:55:24 -84,Evin,Tettley,974-233-5051,Male,1,57,61,2018-12-26 14:24:36,2018-05-28 19:09:40,2018-09-18 10:01:10,2018-04-04 21:11:05 -85,Bethanne,Hynson,395-152-0590,Female,5,51,39,2018-11-12 01:12:14,2018-07-21 02:07:45,2019-01-06 17:16:22,2018-11-15 16:58:09 -86,Adrian,Sapson,962-473-8077,Female,4,19,63,2018-02-13 14:27:28,2018-06-26 14:23:38,2018-09-17 04:28:22,2018-07-19 18:25:11 -87,Zaneta,Alforde,961-173-4877,Female,2,70,67,2018-11-04 11:27:20,2018-06-09 18:02:24,2018-08-17 03:13:55,2018-09-02 00:28:34 -88,Grady,Kobiera,687-321-5987,Male,1,62,96,2018-06-23 20:06:04,2018-02-08 04:03:21,2018-12-05 23:36:55,2018-10-26 14:17:35 -89,Dominique,Carslake,230-143-4475,Male,4,38,64,2018-05-19 01:14:57,2018-09-24 20:05:20,2018-06-26 12:15:04,2018-10-30 18:21:59 -90,Julietta,Gude,585-759-9173,Female,7,59,75,2018-11-25 20:42:33,2018-08-31 21:59:40,2018-12-31 21:04:44,2018-11-23 04:31:37 -91,Lothaire,Macrow,510-775-2964,Male,1,91,59,2018-04-22 14:12:47,2018-07-05 11:15:49,2018-06-04 12:44:19,2018-10-12 10:28:46 -92,Agneta,Trematick,391-964-4713,Female,6,6,91,2018-01-31 13:00:06,2018-11-24 20:48:15,2018-07-27 00:12:28,2018-02-17 08:41:55 -93,Pet,Padgett,690-476-6060,Female,2,17,84,2018-03-21 11:54:39,2018-03-08 01:51:40,2018-12-21 16:41:23,2018-02-07 14:47:44 -94,Barclay,Binion,516-626-1251,Male,4,49,46,2018-10-19 13:16:50,2018-06-25 01:26:53,2018-02-23 06:44:17,2018-10-08 11:01:59 -95,Dillie,Quilleash,676-581-4684,Male,3,27,14,2019-01-02 01:50:23,2019-01-02 04:16:15,2018-07-21 11:54:44,2018-03-06 02:17:37 -96,Marissa,Twinterman,855-444-0657,Female,6,52,62,2018-07-27 09:41:53,2018-03-18 21:07:51,2018-09-05 04:45:41,2018-05-01 14:08:21 -97,Perl,Braun,639-977-9224,Female,7,93,88,2018-03-12 07:21:26,2018-11-12 18:45:36,2018-09-10 10:45:15,2018-09-30 10:28:01 -98,Gwenette,Jozef,804-642-8405,Female,1,67,64,2018-05-02 20:04:22,2018-05-25 14:26:42,2018-12-22 04:00:00,2018-04-27 17:36:21 -99,Gabbi,Nassey,998-336-4318,Female,3,35,79,2018-11-13 07:58:46,2018-02-23 01:11:32,2018-11-08 17:30:31,2018-07-24 03:14:25 -100,Susana,Ebben,826-329-4492,Female,5,9,98,2018-07-08 08:40:45,2018-07-12 00:41:34,2018-10-12 15:33:58,2018-06-16 15:33:32 -101,Mallorie,Marsters,637-209-9862,Female,5,18,34,2018-07-30 15:18:09,2018-09-23 17:22:45,2018-12-21 17:11:36,2018-07-06 19:42:09 -102,Marley,Bethell,102-272-8411,Female,6,70,7,2018-10-08 12:25:07,2018-04-13 04:50:24,2018-03-01 09:20:29,2018-04-05 02:02:24 -103,Genvieve,McMeekin,679-490-4369,Female,3,7,25,2018-02-25 15:34:48,2018-06-24 16:32:10,2018-07-03 20:04:57,2018-12-11 02:53:30 -104,Bartram,Leahey,830-491-8399,Male,3,100,57,2018-10-18 18:39:57,2018-04-08 02:16:41,2018-07-20 01:10:35,2018-06-20 09:41:56 -105,Livvyy,Thornewell,872-138-4425,Female,6,58,58,2019-01-17 09:36:59,2018-04-13 07:25:55,2018-11-28 12:44:14,2018-07-14 04:05:13 -106,Gabriella,Cornish,202-570-6308,Female,7,79,67,2018-08-25 01:20:02,2018-11-30 22:05:13,2018-10-21 11:47:58,2018-11-20 04:28:53 -107,Humberto,Lanfranchi,636-653-6377,Male,3,18,85,2018-08-21 03:38:03,2018-09-01 07:20:38,2018-04-27 04:23:16,2018-08-15 14:45:48 -108,Othella,Asaaf,386-100-6369,Female,4,59,93,2018-05-20 17:17:26,2018-10-23 01:32:55,2018-09-20 03:27:06,2018-12-17 21:11:18 -109,Mil,Booij,494-405-6566,Female,5,88,97,2018-07-12 19:07:28,2018-02-14 12:57:18,2018-12-11 19:22:18,2018-11-23 12:41:41 -110,Orel,Blaxland,309-372-2193,Female,7,30,93,2018-11-18 23:18:41,2018-06-21 19:30:46,2018-09-15 13:43:25,2018-02-04 09:51:54 -111,Sibeal,Fennelow,543-514-6831,Female,6,92,56,2018-10-09 14:48:56,2018-12-18 22:29:16,2018-04-09 03:30:48,2018-04-04 18:11:19 -112,Sidnee,Thorby,687-609-9785,Male,2,30,12,2018-03-28 10:27:39,2018-07-01 07:12:38,2018-02-16 12:58:34,2018-11-16 01:37:38 -113,Lora,Ridewood,164-690-9005,Female,1,37,55,2018-11-13 21:13:39,2018-09-06 23:00:39,2019-01-17 10:31:22,2018-12-05 22:14:39 -114,Velma,Brolan,359-817-6834,Female,6,26,38,2019-01-16 21:47:15,2018-11-25 16:54:49,2018-10-07 01:07:24,2018-10-11 01:14:02 -115,Vassili,Kirkbride,287-966-8144,Male,6,52,16,2018-12-20 23:23:45,2018-12-21 08:42:29,2018-02-25 02:07:40,2018-06-28 04:39:19 -116,Nettie,Bulmer,357-176-0651,Female,5,16,44,2018-09-19 15:07:17,2018-03-16 17:55:44,2018-09-06 22:48:36,2018-04-28 23:48:07 -117,Elyn,Matthew,176-489-8486,Female,4,25,95,2018-04-10 12:26:47,2019-01-10 03:12:46,2018-07-28 23:51:46,2018-07-07 16:15:50 -118,Nat,Enderlein,480-924-1165,Male,4,94,42,2018-09-10 06:56:16,2018-04-24 02:55:47,2018-03-17 15:48:28,2018-04-30 06:11:27 -119,Allister,Laundon,267-536-1588,Male,6,86,21,2018-08-21 09:06:13,2018-11-26 09:47:45,2018-04-05 15:01:24,2018-01-21 02:29:49 -120,Suzy,Dubery,631-694-1983,Female,5,54,24,2018-07-12 11:08:05,2018-07-21 06:22:14,2018-09-04 03:44:08,2018-11-14 04:59:58 -121,Reinaldo,Assel,927-809-0971,Male,3,4,44,2018-10-17 17:15:04,2018-12-24 21:34:45,2019-01-15 07:39:25,2018-02-06 19:16:38 -122,Claudell,Reckus,196-391-8789,Male,1,34,75,2018-08-12 02:29:09,2018-11-28 02:43:43,2018-08-21 09:11:37,2018-07-14 12:51:48 -123,Kary,Jee,656-508-4636,Female,2,67,47,2018-12-17 10:42:46,2018-05-16 14:59:10,2018-12-23 02:44:31,2018-12-19 01:28:44 -124,Giustino,Tinan,292-383-3412,Male,7,100,96,2018-02-05 08:16:51,2018-04-10 02:46:18,2018-12-07 23:33:47,2018-03-25 18:50:56 -125,Matthew,Palmer,562-655-9301,Male,5,87,100,2018-07-14 00:43:30,2018-01-22 19:53:17,2018-05-18 08:37:49,2018-04-16 10:03:59 -126,Helge,Paradyce,454-788-5166,Female,4,31,87,2018-12-29 12:15:52,2018-02-08 19:33:17,2018-12-29 06:51:56,2018-11-11 03:52:39 -127,Anthe,Cullinan,517-178-4457,Female,4,61,14,2018-07-10 05:46:54,2018-12-22 09:39:32,2018-12-06 16:59:53,2018-12-30 08:24:22 -128,Cindy,Bellie,284-376-7890,Female,6,26,95,2018-02-04 23:09:03,2018-09-06 16:30:50,2018-05-25 00:39:04,2018-12-20 19:03:33 -129,Deva,Branthwaite,272-973-9361,Female,5,4,74,2018-06-05 05:56:15,2018-06-26 03:23:22,2018-06-06 00:42:51,2018-12-01 12:32:06 -130,Karen,Frank,495-748-4715,Female,6,55,54,2018-10-26 02:19:25,2018-04-11 12:50:31,2019-01-12 15:29:42,2018-12-23 04:07:28 -131,Batsheva,Wressell,364-562-3308,Female,2,93,2,2018-12-08 11:50:47,2018-10-05 08:11:01,2018-12-29 23:04:37,2018-10-13 09:59:34 -132,Damian,Devon,617-622-5769,Male,1,81,84,2018-03-03 22:21:45,2018-02-09 02:46:29,2018-02-04 03:39:23,2018-06-24 17:15:50 -133,Mischa,Feldbrin,941-794-4981,Male,2,17,93,2018-07-05 04:20:06,2018-11-22 10:46:44,2018-10-25 23:05:17,2018-08-04 04:19:58 -134,Remus,Mochar,964-251-2864,Male,2,78,88,2018-05-08 23:51:18,2019-01-19 19:38:55,2018-06-13 09:14:44,2019-01-10 12:37:02 -135,Cleon,Ambroise,790-235-3681,Male,3,38,95,2018-08-11 11:07:40,2018-07-06 04:03:45,2018-12-18 09:47:22,2018-03-31 14:59:58 -136,Sidney,Duthy,739-113-2227,Male,4,95,79,2018-09-25 19:41:46,2018-09-05 07:30:26,2018-03-21 18:52:33,2018-04-25 13:58:28 -137,Xavier,Gon,942-422-7024,Male,5,35,47,2018-09-05 22:08:31,2018-05-10 20:19:08,2018-06-25 18:32:07,2018-04-11 04:44:32 -138,Ara,Gwyllt,450-595-4186,Male,4,4,28,2018-10-28 21:12:39,2018-02-13 08:26:45,2018-06-16 21:44:05,2018-08-01 11:08:43 -139,Libbey,Millwall,764-602-4598,Female,7,89,31,2019-01-14 17:04:08,2018-02-22 03:01:08,2018-02-27 08:56:59,2018-11-09 13:18:23 -140,Rosalynd,Wellard,798-378-3350,Female,4,58,44,2018-07-13 19:23:05,2018-11-20 20:46:20,2018-01-31 02:28:58,2018-10-25 13:31:05 -141,Reinaldo,O'Dea,896-868-5961,Male,2,72,69,2018-08-08 04:21:04,2018-06-23 08:34:34,2018-08-31 08:41:08,2018-11-19 09:43:28 -142,Veradis,Holyard,706-725-9446,Female,3,78,56,2018-09-05 17:38:33,2018-05-04 13:04:38,2018-11-05 12:46:29,2018-09-25 08:56:54 -143,Birdie,Collerd,319-380-7196,Female,2,22,1,2018-10-16 19:45:08,2018-08-05 06:38:47,2018-11-22 11:10:39,2018-10-20 09:48:22 -144,Sada,Schout,825-204-2108,Female,7,88,10,2018-04-13 13:44:13,2018-06-06 14:39:37,2018-11-09 10:29:00,2018-09-15 05:38:03 -145,Ambros,Mayoral,819-227-9360,Male,7,50,91,2018-03-27 15:27:05,2018-08-02 02:18:35,2018-06-27 17:10:44,2018-07-21 14:18:29 -146,Emile,Abraham,622-769-6584,Male,6,10,44,2018-09-15 10:24:46,2018-07-10 07:58:58,2018-06-18 22:49:01,2018-04-20 09:07:25 -147,Lira,Reboulet,983-623-7858,Female,4,54,39,2018-06-27 09:11:33,2018-10-01 07:52:19,2018-10-21 09:48:43,2018-09-09 22:17:51 -148,Bucky,Dubery,127-215-3377,Male,1,13,5,2018-02-15 22:03:55,2018-10-15 16:35:39,2018-02-20 10:22:26,2018-11-05 12:56:42 -149,Ced,Meert,482-685-6526,Male,1,85,40,2018-11-09 04:11:10,2019-01-16 14:34:41,2018-05-22 12:18:01,2018-03-13 13:09:46 -150,Hamlen,Boyson,723-641-9907,Male,7,3,25,2018-07-08 10:27:28,2018-09-06 08:34:00,2018-10-19 17:18:48,2018-02-22 19:31:50 -151,Scotty,Bromell,605-116-4137,Male,4,44,83,2018-02-03 11:10:35,2018-03-05 15:14:24,2018-06-20 01:47:46,2018-04-09 17:34:46 -152,Betti,Cuttelar,947-869-1635,Female,7,31,68,2018-07-14 23:35:44,2018-09-07 08:03:02,2018-05-02 15:32:32,2018-02-26 15:33:55 -153,Lothario,Whellams,959-671-9821,Male,3,91,85,2018-12-17 02:20:59,2018-08-31 16:54:24,2018-09-30 18:16:21,2018-06-06 21:30:55 -154,Maurits,Eisenberg,612-730-0598,Male,5,95,2,2018-07-11 05:38:06,2018-01-26 15:01:11,2018-11-11 22:30:48,2018-04-16 07:20:25 -155,Jeffry,Wilprecht,420-521-7374,Male,2,2,19,2018-07-31 12:28:42,2018-03-19 23:14:58,2018-11-29 11:25:28,2018-02-19 02:42:46 -156,Victor,Grinter,303-176-4062,Male,3,28,82,2018-04-15 17:22:33,2018-04-26 11:56:35,2018-10-06 23:26:58,2018-04-05 07:32:13 -157,Sonnie,Lobe,794-424-7798,Male,1,68,99,2018-12-23 13:36:28,2018-11-24 21:42:21,2018-03-23 12:37:58,2018-06-26 15:29:05 -158,Krishna,Fletcher,520-484-4343,Male,5,77,26,2018-05-15 11:17:35,2018-12-22 22:52:12,2018-05-10 22:50:32,2018-05-05 21:38:09 -159,Kerrie,Bartholomieu,654-465-0213,Female,4,7,56,2018-11-02 19:08:33,2018-01-27 09:11:25,2018-12-13 16:53:49,2018-05-06 13:16:06 -160,Rasla,Dibbs,192-692-8022,Female,5,58,38,2018-05-13 16:41:12,2018-12-17 01:00:54,2018-08-19 15:33:37,2019-01-11 00:33:40 -161,Mellisa,Prinn,884-570-1200,Female,3,2,44,2018-06-17 15:55:01,2018-02-09 22:16:46,2018-01-21 11:35:44,2018-03-22 01:43:34 -162,Shandeigh,Prise,284-912-2475,Female,1,24,63,2018-04-16 10:09:01,2018-09-06 02:59:22,2018-05-21 00:23:45,2018-05-18 15:59:58 -163,Aline,Pockey,145-621-3349,Female,5,46,99,2018-07-08 01:50:19,2018-07-23 03:08:04,2018-07-25 04:19:37,2018-08-02 04:28:24 -164,Quinton,Filon,646-285-5370,Male,7,71,90,2018-09-26 09:06:43,2018-09-15 14:33:28,2018-11-23 04:26:39,2019-01-20 06:07:08 -165,Brena,Bentke,336-549-2800,Female,6,52,73,2018-02-07 03:32:01,2018-09-21 09:41:58,2018-08-01 23:49:56,2018-04-24 04:41:42 -166,Kessia,Bentote,261-293-3478,Female,7,34,27,2019-01-03 17:12:12,2018-01-28 01:36:43,2018-09-06 07:29:49,2018-07-16 11:22:52 -167,Serene,Jellett,617-490-3045,Female,4,8,12,2018-08-01 05:18:42,2018-08-21 11:58:23,2018-02-17 11:36:57,2018-12-29 13:38:10 -168,Drugi,Chainey,642-531-9743,Male,1,27,14,2019-01-06 06:11:34,2018-11-02 16:07:48,2019-01-07 21:38:11,2018-10-26 19:58:30 -169,Benjamen,Angric,161-599-1534,Male,6,80,80,2018-03-25 19:49:25,2018-08-23 06:12:13,2018-05-09 05:22:56,2018-04-03 12:50:17 -170,Augustine,de Werk,986-128-9745,Male,7,40,35,2018-09-07 12:55:20,2018-09-15 16:46:53,2018-02-12 14:00:28,2018-02-20 11:54:00 -171,Rorke,Laidlaw,818-603-8046,Male,1,99,95,2018-12-25 21:27:03,2018-12-15 12:30:46,2018-11-06 04:14:51,2018-11-30 18:51:21 -172,Clywd,Cawdron,118-860-8931,Male,3,12,48,2018-10-28 00:46:43,2018-07-04 11:34:45,2018-01-24 04:40:57,2018-11-08 13:52:59 -173,Maudie,Habbijam,781-157-2628,Female,1,79,35,2018-11-30 12:07:21,2018-03-07 00:30:04,2018-11-14 11:01:28,2018-12-25 08:37:17 -174,Gina,Adamovitz,873-120-9534,Female,1,99,41,2018-10-15 08:16:08,2018-02-02 10:04:20,2018-03-11 05:28:50,2018-08-15 16:28:04 -175,Dorey,Berkeley,856-131-2818,Female,5,8,45,2018-06-14 02:47:10,2018-12-04 16:14:29,2018-02-20 02:19:22,2018-04-14 04:00:28 -176,Ashli,Stanistrete,507-365-9155,Female,3,50,85,2019-01-15 15:53:25,2018-09-08 00:21:37,2018-09-08 14:26:57,2018-08-12 18:04:42 -177,Aleta,Jessard,640-184-4123,Female,1,63,42,2018-12-13 11:45:35,2018-07-13 05:43:20,2018-07-19 01:29:59,2018-08-19 10:17:25 -178,Conney,Tansly,619-324-6788,Male,7,18,68,2018-02-06 08:22:33,2018-02-09 16:00:31,2018-02-17 20:35:12,2018-09-01 00:28:07 -179,Chaddie,Curling,967-821-4721,Male,3,50,28,2018-04-18 18:52:52,2018-10-04 03:42:09,2018-11-06 23:55:33,2018-12-23 04:01:13 -180,Skyler,Shard,173-185-5465,Male,7,48,76,2018-03-21 23:42:54,2018-05-22 07:52:04,2018-02-28 18:02:47,2018-08-20 09:21:32 -181,Alair,Bruggen,225-747-4685,Male,5,45,4,2018-03-13 03:01:40,2018-04-30 23:24:34,2018-04-25 03:14:01,2018-07-26 19:41:29 -182,Forester,Rackstraw,111-188-6870,Male,6,11,43,2018-09-26 04:05:12,2018-08-25 04:59:08,2018-02-09 16:50:13,2018-06-10 06:53:15 -183,Stinky,Klassmann,628-447-6394,Male,5,42,77,2018-12-29 18:37:51,2018-01-31 04:16:33,2018-05-27 09:10:31,2018-02-03 20:09:44 -184,Gabriella,Weeds,978-256-0633,Female,3,17,50,2018-10-10 14:56:11,2019-01-19 07:53:13,2018-08-28 10:02:39,2018-05-03 15:01:38 -185,Ingeborg,Swine,765-792-5768,Female,5,39,37,2018-10-13 03:17:12,2018-11-25 20:17:22,2018-08-25 21:54:45,2018-12-04 07:44:58 -186,Kain,Everingham,945-715-9320,Male,7,52,80,2018-10-22 01:58:35,2018-04-16 11:48:35,2018-02-22 17:07:19,2018-12-15 01:59:16 -187,Noble,Swadlinge,928-764-8545,Male,7,24,75,2018-07-02 20:12:53,2018-07-19 00:23:08,2018-08-06 21:50:01,2018-05-04 08:56:30 -188,Amber,Shropshire,983-928-3309,Female,1,100,37,2018-03-18 04:32:13,2018-08-09 03:16:35,2018-11-21 04:25:29,2018-10-03 06:20:54 -189,Hedy,Sapena,301-104-2652,Female,3,37,35,2018-07-04 12:54:06,2018-10-12 20:33:48,2018-04-10 07:32:31,2018-03-17 10:12:03 -190,Nerissa,Jedras,425-605-9508,Female,1,18,31,2019-01-12 14:05:35,2018-10-19 14:28:35,2018-06-14 21:07:02,2018-03-22 05:53:32 -191,Terrel,Kear,681-621-2157,Male,3,98,45,2018-02-20 10:42:05,2018-11-08 04:29:14,2018-03-09 02:33:02,2018-07-04 18:27:00 -192,Dennison,Theodoris,722-911-1627,Male,6,76,32,2018-11-18 05:15:23,2018-05-13 02:02:05,2019-01-15 21:45:30,2018-04-13 17:24:17 -193,Chrystel,Ferentz,497-580-2963,Female,2,96,6,2018-12-11 03:17:23,2018-05-23 04:35:09,2018-11-01 17:51:50,2018-08-02 02:44:29 -194,Devland,Butchers,313-172-9223,Male,6,42,38,2019-01-16 07:17:37,2018-11-09 17:37:48,2018-04-10 08:57:30,2018-05-02 13:47:28 -195,Simon,Astupenas,981-207-6441,Male,2,57,43,2018-11-07 15:02:00,2018-01-25 17:30:33,2018-07-13 05:08:19,2018-10-29 18:37:22 -196,Jordan,Attride,447-912-6034,Female,7,25,37,2018-06-06 14:29:43,2018-06-30 03:49:38,2018-12-09 18:11:23,2018-01-30 19:12:46 -197,Clerissa,Forsard,485-444-1412,Female,2,88,66,2018-09-19 00:56:28,2018-07-23 15:36:37,2018-11-17 11:43:09,2018-11-17 17:11:53 -198,Alastair,Toth,495-980-1189,Male,1,62,59,2018-03-04 17:35:31,2018-06-18 07:02:22,2018-07-30 02:31:33,2018-07-20 14:21:29 -199,Aldo,Bruton,488-482-2130,Male,2,33,99,2018-06-09 23:01:18,2018-08-22 04:11:53,2018-07-17 05:55:24,2018-04-08 10:13:23 -200,Lorin,Mourant,953-195-5245,Male,1,78,78,2018-02-04 07:07:36,2018-08-05 08:03:40,2018-11-22 13:04:30,2018-03-10 12:32:28 -201,Nonnah,Dreini,137-834-9350,Female,1,20,84,2018-11-23 21:47:29,2018-07-02 22:51:42,2018-05-28 23:33:57,2018-06-11 11:55:17 -202,Winnie,Muris,865-681-2171,Female,2,31,76,2018-10-29 21:53:21,2018-10-12 17:59:08,2018-03-21 12:37:41,2018-06-26 05:24:49 -203,Marybelle,Wedmore.,566-812-6518,Female,6,94,20,2018-04-08 17:51:07,2018-01-25 19:29:58,2018-05-29 08:33:21,2018-12-18 09:29:05 -204,Christophorus,La Batie,776-298-7693,Male,2,100,44,2018-11-26 01:22:44,2018-11-28 19:33:42,2018-01-26 20:34:09,2018-10-15 19:29:24 -205,Erhart,Laydon,425-854-5387,Male,7,15,35,2018-11-09 09:53:34,2018-11-11 01:43:14,2019-01-16 12:20:32,2018-08-01 09:34:47 -206,Myrta,Playfair,512-835-4158,Female,4,8,51,2018-05-04 15:28:01,2018-05-11 22:03:31,2018-05-21 02:28:31,2018-03-17 08:25:48 -207,Tybie,McGhee,155-902-0043,Female,5,25,55,2018-03-19 17:19:34,2018-11-11 01:53:03,2018-06-01 16:21:08,2018-08-21 09:39:26 -208,Augusto,Chelam,595-490-1187,Male,2,20,22,2018-02-26 17:51:20,2018-04-15 11:38:21,2018-11-29 19:44:24,2018-05-17 16:31:14 -209,Louisette,Firbanks,365-745-5229,Female,1,51,35,2018-04-17 19:42:14,2018-03-19 09:56:15,2018-04-22 09:48:27,2018-11-20 05:52:44 -210,Brucie,Speers,688-351-7130,Male,3,65,20,2018-09-22 06:54:04,2018-08-14 23:05:08,2018-03-13 17:38:11,2018-12-29 06:47:13 -211,Nathanial,Ayliff,974-831-8727,Male,1,23,95,2018-09-02 06:27:24,2018-06-18 22:51:54,2018-12-25 13:15:52,2018-03-09 05:29:17 -212,Shawnee,McClenan,177-754-4767,Female,4,54,82,2018-04-17 14:01:32,2018-08-15 14:02:31,2019-01-04 03:04:30,2018-10-20 15:25:45 -213,Giavani,Cay,976-869-6321,Male,1,92,27,2018-07-22 17:43:03,2018-02-20 03:19:34,2018-05-06 13:52:36,2018-12-05 18:14:41 -214,Claudia,Fazackerley,454-663-9623,Female,4,26,25,2019-01-07 16:15:34,2018-03-06 15:31:53,2018-02-06 23:08:37,2018-11-13 17:45:22 -215,Nevil,Phelp,255-488-7211,Male,5,22,40,2018-09-11 19:55:44,2018-05-13 12:07:30,2018-08-27 02:20:49,2019-01-17 21:11:30 -216,Elle,Antal,303-999-5794,Female,4,23,5,2018-02-15 19:05:09,2018-10-15 01:01:31,2018-12-31 16:08:16,2018-03-23 15:16:38 -217,Brnaby,Dewsbury,173-850-9221,Male,3,82,22,2018-05-19 14:05:10,2018-12-30 00:25:40,2018-09-27 06:32:26,2018-04-25 02:17:22 -218,Ronda,Dranfield,835-657-5998,Female,5,61,54,2018-10-18 03:51:07,2018-07-20 06:01:19,2018-11-17 15:09:04,2018-12-04 20:06:06 -219,Vania,Brannan,288-990-8986,Female,3,88,25,2018-07-03 11:19:29,2018-11-13 09:44:15,2018-02-28 13:57:43,2018-02-28 05:42:56 -220,Jessy,Baggelley,848-274-4914,Female,7,38,75,2018-12-04 13:44:16,2018-11-20 01:53:14,2018-02-25 03:07:40,2018-06-17 19:02:59 -221,Paxon,Kensall,262-215-6295,Male,1,3,63,2018-08-12 21:30:25,2018-11-24 01:13:12,2018-06-04 19:20:59,2018-08-16 14:48:22 -222,Tana,O'Donohue,514-853-5855,Female,4,99,1,2018-03-21 06:05:58,2018-05-01 00:39:55,2018-03-10 21:55:54,2018-10-31 10:25:10 -223,Thomasina,Gibbons,501-364-8398,Female,3,37,56,2018-11-22 03:07:49,2018-06-30 16:44:00,2018-08-05 18:41:13,2019-01-07 06:21:44 -224,Bellanca,Golston,673-979-3362,Female,1,57,53,2018-05-02 00:04:42,2018-01-21 22:51:57,2018-08-20 18:40:05,2018-02-09 08:22:11 -225,Maureene,Drejer,769-639-6612,Female,7,49,17,2018-02-20 12:00:24,2018-09-01 04:44:08,2018-08-15 22:04:06,2018-09-04 06:40:59 -226,Beatrisa,Blanche,914-368-0909,Female,4,47,77,2018-05-21 06:41:29,2018-10-04 19:21:53,2018-07-11 04:03:32,2018-04-05 01:26:21 -227,Melita,Filipczak,743-692-1202,Female,2,18,45,2018-04-04 09:49:49,2018-03-30 16:30:51,2019-01-09 03:34:15,2018-02-05 00:54:24 -228,Jean,Rzehor,983-469-9959,Male,2,76,95,2018-08-17 14:15:05,2018-09-25 10:05:56,2018-09-04 10:03:08,2018-02-16 04:46:04 -229,Netti,Odeson,140-282-6021,Female,7,46,99,2018-04-08 08:08:21,2018-05-07 06:33:55,2018-03-10 06:30:39,2018-08-27 01:08:06 -230,Lark,Komorowski,889-340-2588,Female,6,36,54,2018-05-27 12:55:35,2018-11-18 05:20:17,2018-11-19 04:18:03,2018-04-24 14:21:19 -231,Mae,Howells,972-510-2059,Female,2,54,97,2019-01-17 19:46:20,2018-07-10 05:29:24,2018-07-06 16:03:28,2018-07-18 17:41:40 -232,Brewer,Wolstencroft,243-516-4986,Male,4,68,84,2018-07-19 01:48:48,2018-12-31 10:44:05,2018-05-25 20:15:52,2018-04-27 22:38:48 -233,Chrystel,Buist,285-587-4608,Female,3,66,90,2018-02-06 05:43:09,2018-06-10 20:45:59,2018-11-27 09:40:02,2018-12-30 22:43:43 -234,Nicola,Feltoe,102-119-8958,Female,6,30,100,2018-05-26 00:46:42,2018-03-17 00:12:12,2019-01-16 18:40:38,2018-01-27 09:20:23 -235,Engelbert,Matveiko,868-192-6148,Male,3,3,6,2018-05-27 06:16:04,2018-12-24 00:22:43,2018-04-18 07:21:59,2018-12-03 08:49:41 -236,Lezley,M'Chirrie,749-737-2204,Male,4,16,17,2018-07-06 21:48:48,2018-02-09 05:08:49,2018-09-05 10:59:16,2018-03-22 01:13:02 -237,Josy,Larkins,826-241-0108,Female,1,8,18,2018-10-26 03:28:37,2018-02-24 22:01:17,2018-12-29 22:31:43,2018-05-23 06:28:27 -238,Armando,Girt,296-631-5842,Male,1,90,62,2018-03-14 20:02:06,2018-02-25 03:43:37,2018-05-29 18:43:28,2018-10-10 16:04:29 -239,Nevins,Boch,243-865-0986,Male,7,87,34,2018-04-27 05:11:05,2018-06-13 18:02:47,2018-04-17 23:28:45,2018-03-11 20:07:50 -240,Gordan,MacHoste,194-807-0099,Male,2,8,10,2018-11-30 11:09:40,2018-03-19 08:40:39,2018-07-07 07:58:57,2018-12-03 15:54:45 -241,Vlad,Urling,756-416-9308,Male,6,44,75,2018-07-01 08:10:44,2018-06-25 11:50:00,2018-02-18 09:41:26,2019-01-20 16:56:43 -242,Karney,Batteson,884-299-0885,Male,3,4,70,2018-04-21 18:15:47,2018-03-17 15:26:35,2018-09-21 06:49:36,2018-03-03 10:02:05 -243,Shep,Croisier,182-249-1703,Male,2,25,64,2018-11-27 15:36:38,2018-03-27 09:16:11,2018-07-27 14:14:49,2018-08-31 21:47:02 -244,Jackelyn,Franschini,203-947-2285,Female,5,93,18,2018-05-11 18:05:34,2018-07-09 02:56:23,2018-05-26 13:31:09,2018-11-12 13:51:54 -245,Kingston,Brazier,388-460-9266,Male,5,67,43,2018-11-17 16:06:03,2018-10-22 21:39:40,2018-11-03 04:17:45,2018-08-23 17:37:21 -246,Derwin,Postin,334-746-9914,Male,2,9,74,2018-04-28 10:39:48,2018-10-16 21:01:17,2019-01-17 12:54:27,2018-09-18 06:08:12 -247,Rustie,Boddington,499-187-3081,Male,7,75,92,2018-07-09 18:05:33,2018-09-15 11:50:52,2018-06-10 05:00:00,2018-09-23 05:52:23 -248,Araldo,MacConnulty,922-950-0398,Male,4,66,28,2018-11-11 12:46:18,2018-09-10 16:05:23,2018-09-21 00:16:24,2018-10-10 19:06:57 -249,Brear,Zuanelli,948-803-5705,Female,7,88,15,2018-03-03 08:12:37,2018-10-06 14:14:00,2018-09-06 21:02:50,2018-04-04 06:13:25 -250,Ruttger,Cartan,503-123-4758,Male,6,8,46,2018-07-02 10:33:15,2018-10-11 08:51:25,2018-02-16 18:01:35,2018-05-15 00:25:35 -251,Leta,Gravenell,798-643-9817,Female,6,19,50,2018-09-26 18:01:14,2018-12-31 01:08:01,2018-08-12 01:18:26,2018-08-12 11:04:31 -252,Nanny,Spellward,298-614-5133,Female,2,78,35,2018-07-31 14:38:53,2018-07-11 11:50:42,2018-06-24 03:47:24,2018-08-23 06:25:24 -253,Garwin,Overil,981-304-0345,Male,1,66,62,2018-02-20 05:57:01,2018-02-04 20:02:37,2018-04-21 16:30:20,2018-07-27 08:45:03 -254,Ancell,Bromidge,677-576-3535,Male,1,54,47,2018-02-27 19:07:09,2018-07-07 17:41:39,2018-03-14 05:31:23,2018-11-18 21:30:30 -255,Harmonia,McIleen,610-808-3838,Female,5,76,7,2018-05-09 14:49:35,2018-04-12 02:30:13,2019-01-17 21:59:23,2018-04-20 05:21:50 -256,Ginni,See,809-189-3574,Female,7,93,45,2018-04-11 20:22:07,2018-08-17 13:12:57,2018-04-20 06:30:33,2018-04-17 00:12:41 -257,Christi,Doorly,614-386-8893,Female,7,23,11,2018-08-09 05:01:14,2018-03-11 21:19:53,2018-05-09 23:37:07,2018-03-27 22:07:11 -258,Perice,Severy,433-906-1030,Male,1,18,5,2018-09-01 12:30:04,2018-09-13 05:34:16,2019-01-16 22:35:35,2019-01-09 20:31:49 -259,Dulsea,Yokel,279-965-4206,Female,2,93,50,2018-10-31 22:48:09,2018-07-13 09:25:20,2018-02-16 09:15:58,2018-05-12 21:55:26 -260,Marge,Cheng,549-350-8693,Female,2,10,68,2018-09-01 18:42:35,2018-04-07 10:58:53,2018-07-30 16:05:15,2018-10-20 05:45:19 -261,Baron,McIlmorow,283-456-4615,Male,2,41,89,2018-11-07 01:23:03,2018-12-20 18:25:28,2018-08-31 12:49:04,2018-05-27 07:39:41 -262,Rabbi,Beaglehole,904-724-1771,Male,2,94,67,2018-11-04 08:21:47,2018-12-28 20:54:40,2018-12-08 10:20:14,2018-11-29 19:47:40 -263,Olvan,Asher,310-502-8368,Male,7,76,67,2018-03-15 22:02:48,2018-07-30 12:08:26,2018-12-06 22:49:46,2018-06-17 22:03:05 -264,Yard,Beldon,209-784-5636,Male,7,90,9,2018-07-24 02:02:11,2018-05-11 03:54:15,2018-08-20 18:46:55,2018-03-10 04:11:33 -265,Enriqueta,Barraclough,332-372-0081,Female,6,75,69,2018-08-18 05:08:19,2018-01-27 11:36:23,2018-05-23 08:59:06,2018-02-11 04:14:36 -266,Alli,Smallcomb,255-741-1276,Female,2,8,1,2018-12-06 01:19:35,2018-07-16 16:10:12,2018-07-16 13:31:05,2018-10-26 07:03:09 -267,Shay,Amsden,816-821-9426,Male,6,25,35,2018-03-15 01:09:39,2018-11-26 05:57:30,2018-10-26 07:54:05,2018-04-14 01:42:13 -268,Jacynth,Boscott,970-121-0282,Female,1,88,89,2018-07-31 16:10:10,2018-05-10 10:28:44,2018-10-02 23:00:23,2018-07-02 13:55:14 -269,Dominique,Farny,782-337-7486,Male,1,17,29,2018-09-09 16:09:20,2018-04-10 15:04:16,2018-03-25 16:40:27,2019-01-04 20:02:55 -270,Keefe,Guerrero,440-254-1961,Male,4,96,29,2018-10-19 10:06:55,2018-07-28 18:31:17,2018-05-05 19:05:12,2018-06-01 05:55:25 -271,Buiron,Anfossi,512-333-8553,Male,2,92,51,2018-09-09 16:00:30,2018-02-20 14:27:22,2018-03-11 07:29:35,2018-07-12 02:19:45 -272,Eleonore,Puller,325-656-5909,Female,4,88,37,2018-12-04 20:39:40,2018-02-13 04:35:07,2018-08-16 18:26:05,2018-06-08 07:45:57 -273,Katuscha,Rasch,427-956-1046,Female,4,68,90,2018-06-19 01:20:15,2018-04-03 01:55:07,2018-04-17 19:09:09,2018-08-15 11:04:06 -274,Hoebart,Linger,972-926-3923,Male,4,74,74,2018-02-19 01:23:42,2018-01-26 15:34:23,2018-09-13 07:10:43,2018-06-07 23:26:33 -275,Patrick,Hryskiewicz,736-622-7490,Male,3,91,1,2019-01-13 09:57:23,2018-05-06 15:42:09,2018-07-01 17:16:14,2018-09-01 02:26:15 -276,Bert,Adrianello,485-126-1547,Female,7,33,12,2018-11-01 06:34:27,2018-09-14 23:29:20,2018-03-11 08:15:03,2018-09-21 21:53:26 -277,Burton,Spittall,570-586-9893,Male,7,46,33,2018-01-28 06:20:39,2018-06-15 19:15:06,2018-06-27 02:36:30,2018-03-24 02:52:03 -278,Tessy,Mitchley,167-983-7021,Female,5,45,26,2018-03-02 16:44:00,2018-12-25 18:48:13,2018-04-01 18:27:41,2018-04-03 20:39:05 -279,Nettle,Hause,489-296-7367,Female,2,99,15,2018-03-18 02:50:49,2018-03-02 01:31:53,2018-10-31 06:40:34,2018-04-28 11:21:14 -280,Pearce,Darwent,801-341-9474,Male,2,24,44,2018-05-28 23:54:50,2018-02-07 18:37:22,2018-09-11 02:48:52,2018-11-09 16:24:17 -281,Kelsey,Suttle,536-591-5133,Female,6,11,76,2018-02-14 19:05:31,2018-07-14 19:32:27,2018-03-26 04:59:22,2018-04-01 20:21:57 -282,Gillie,Sponton,270-390-2110,Female,2,94,57,2018-03-14 11:50:53,2018-03-27 13:10:53,2018-04-23 19:54:11,2018-08-22 21:53:12 -283,Marsha,Dietz,740-837-1891,Female,5,90,95,2018-03-18 04:53:06,2018-06-29 02:28:55,2018-08-10 05:14:09,2018-05-10 04:03:25 -284,Miles,Purchon,413-518-8673,Male,2,57,98,2018-04-02 15:49:11,2018-02-04 16:57:33,2018-09-09 22:23:44,2018-03-16 04:00:43 -285,Collette,Menego,440-637-0309,Female,3,21,56,2018-04-18 04:27:48,2018-05-05 08:32:40,2018-03-17 17:54:26,2018-04-12 00:24:45 -286,Heriberto,Dunkerton,321-657-4492,Male,5,99,91,2018-08-17 12:11:42,2018-10-26 14:33:07,2018-03-10 13:13:28,2018-05-03 02:14:30 -287,Hailee,Remington,671-722-2287,Female,6,69,53,2018-08-01 01:54:04,2018-08-20 04:05:47,2018-04-24 14:22:04,2018-11-02 14:15:55 -288,Ingunna,Errigo,378-401-4671,Female,3,83,66,2018-12-22 21:52:13,2018-12-24 18:41:25,2018-11-11 17:31:47,2018-06-27 14:34:11 -289,Barbie,Grishmanov,184-949-4040,Female,7,93,68,2018-08-14 21:25:04,2018-08-26 18:27:48,2018-04-28 10:50:33,2018-08-06 14:12:21 -290,Anderson,Freeland,842-434-1249,Male,6,22,71,2019-01-05 09:24:32,2018-06-13 07:19:06,2018-04-24 22:20:16,2018-05-31 21:18:59 -291,Olympie,Prantl,988-864-1736,Female,1,39,40,2018-04-06 05:52:26,2018-03-10 03:20:54,2018-02-06 16:53:55,2018-09-03 16:18:27 -292,Amos,Lanyon,552-486-3382,Male,1,17,35,2018-07-03 20:26:09,2018-11-16 06:37:27,2018-08-16 14:36:30,2018-04-07 19:59:08 -293,Gabby,Stockau,753-586-0632,Male,5,19,14,2018-12-10 13:52:07,2018-03-20 20:50:50,2018-04-11 20:54:39,2018-11-13 17:11:21 -294,Uta,Joan,660-241-5130,Female,7,67,41,2018-04-21 18:11:39,2018-07-12 17:47:45,2018-05-20 14:57:17,2018-09-19 10:15:02 -295,Elnar,Manjot,691-939-7359,Male,5,18,86,2018-11-24 20:27:24,2018-04-29 05:45:30,2018-09-06 04:15:04,2018-05-31 17:11:55 -296,Avram,Cowins,471-336-0418,Male,1,18,23,2018-10-07 19:35:52,2018-07-24 19:33:54,2018-05-09 12:43:10,2018-10-08 09:08:37 -297,Kyla,Fines,380-936-0659,Female,7,16,6,2018-12-04 05:02:51,2018-06-13 12:25:14,2018-05-15 10:17:43,2018-07-24 13:06:26 -298,Tymothy,Trevillion,740-586-6434,Male,4,99,5,2018-11-29 03:58:39,2018-07-10 01:02:27,2018-07-05 11:15:40,2018-07-17 11:17:00 -299,Rafaelita,Stiven,313-253-8470,Female,7,94,91,2018-05-11 22:09:50,2018-12-04 03:23:26,2018-06-04 22:13:06,2018-08-02 01:03:16 -300,Stanwood,Bracci,757-577-7619,Male,3,79,15,2018-06-02 08:42:52,2018-05-01 23:25:28,2018-10-27 06:54:40,2019-01-03 19:33:39 -301,Heddie,Pegden,750-484-0458,Female,3,85,74,2018-02-15 15:15:50,2018-08-13 10:31:12,2018-10-22 05:36:44,2018-07-27 21:33:04 -302,Letty,Ipplett,534-461-3389,Female,2,24,58,2018-12-30 15:03:42,2018-12-25 22:41:39,2018-08-06 08:13:19,2018-06-13 08:22:24 -303,Clarke,Buckberry,261-218-0110,Male,4,39,35,2018-11-25 02:26:48,2018-10-01 22:53:26,2019-01-01 07:32:49,2018-06-23 02:36:18 -304,Valina,Bouskill,292-930-7629,Female,2,63,32,2018-03-13 00:24:33,2018-12-08 10:39:51,2019-01-06 10:27:01,2018-07-13 00:19:13 -305,Jeth,Mosedall,326-529-0770,Male,7,44,30,2019-01-17 17:26:19,2018-03-23 23:40:12,2018-12-16 02:11:33,2018-09-08 07:21:24 -306,Mano,Komorowski,467-693-9454,Male,5,63,33,2018-12-05 21:37:13,2018-05-15 16:54:39,2018-11-21 08:06:01,2018-12-25 19:18:03 -307,Libby,Worters,651-420-4117,Female,6,62,73,2018-11-16 15:37:33,2018-04-10 08:47:08,2018-09-25 07:08:44,2018-12-20 18:11:17 -308,Ginnie,Dunnion,884-641-9401,Female,4,15,91,2018-02-25 04:25:07,2018-06-11 12:12:35,2018-12-20 05:03:34,2018-05-12 15:41:13 -309,Addi,Butterfill,454-471-6991,Female,6,45,37,2019-01-14 00:57:24,2018-10-22 12:37:53,2018-11-12 17:11:49,2018-04-13 08:39:20 -310,Eustace,Calway,260-583-1874,Male,3,98,96,2018-12-08 14:19:50,2018-03-09 04:33:52,2018-08-03 22:32:38,2018-12-17 16:12:12 -311,Greta,Tailour,864-452-3785,Female,5,63,78,2018-05-09 23:36:15,2018-09-16 21:21:51,2018-06-17 03:49:40,2018-06-25 12:40:03 -312,Nance,Ruston,102-299-0194,Female,4,66,33,2018-04-19 13:30:14,2018-08-22 20:55:14,2018-03-02 20:03:46,2018-03-23 09:40:10 -313,Harriette,Dicty,498-183-6908,Female,7,1,13,2018-12-31 04:35:08,2018-08-13 12:05:13,2018-04-30 22:42:00,2018-12-03 13:23:45 -314,Merrielle,Mapes,918-608-0262,Female,5,47,45,2018-12-16 07:21:41,2018-10-27 21:05:00,2018-03-23 14:05:12,2018-08-02 11:02:53 -315,Gris,Scurrell,392-726-5529,Male,4,71,95,2018-02-23 03:36:40,2018-04-09 20:52:39,2018-03-07 02:56:27,2018-10-22 11:26:37 -316,Novelia,Newdick,262-887-9640,Female,3,20,97,2018-05-18 12:00:02,2018-02-04 08:00:28,2018-01-28 09:59:37,2018-07-06 05:53:32 -317,Sean,Breton,304-133-1524,Male,4,91,49,2018-07-09 23:07:45,2018-10-27 06:20:49,2018-08-22 21:03:24,2018-06-13 05:33:30 -318,Winston,Springham,259-758-2788,Male,6,86,20,2018-03-20 19:07:57,2018-03-17 14:55:01,2018-08-05 20:39:20,2018-02-11 22:19:58 -319,Clemmie,Saywood,341-505-9072,Male,4,61,30,2018-06-08 02:47:28,2018-07-03 05:59:45,2018-10-28 00:28:02,2018-04-07 23:20:59 -320,Robinia,Vida,537-434-4616,Female,6,19,32,2018-05-03 10:52:24,2018-10-12 00:17:12,2018-11-27 23:47:32,2018-12-17 00:24:59 -321,Findley,Melanaphy,423-892-4436,Male,1,100,31,2018-02-04 19:41:01,2018-08-17 10:08:47,2018-11-04 14:37:46,2018-07-01 11:45:21 -322,Brooks,O'Keenan,840-842-8591,Female,4,82,84,2018-08-21 21:40:21,2018-08-31 04:07:15,2018-02-01 02:25:03,2018-12-09 10:50:21 -323,Caz,Leaf,797-315-7239,Male,6,75,22,2018-10-17 18:51:00,2018-11-22 19:03:52,2018-02-15 06:48:13,2018-04-19 22:25:23 -324,Ad,Harvey,336-617-2629,Male,4,46,5,2018-07-01 18:17:34,2018-05-24 05:31:23,2018-04-05 21:04:43,2018-07-21 06:50:26 -325,Berrie,Robardley,671-363-7428,Female,2,46,55,2018-05-14 01:56:01,2018-09-20 02:21:44,2019-01-14 15:24:34,2018-05-14 15:49:53 -326,Corliss,Halwell,154-276-2412,Female,3,63,16,2018-12-21 10:15:57,2018-11-26 00:14:11,2018-10-24 18:09:31,2018-05-27 11:41:11 -327,Carlina,Laird,357-488-1031,Female,5,59,27,2018-10-24 22:33:19,2018-10-23 00:27:39,2018-10-26 13:59:23,2018-07-19 02:41:32 -328,Rivalee,Bartolomucci,299-435-2483,Female,2,86,75,2018-06-02 23:51:58,2018-10-18 07:08:38,2019-01-11 07:36:58,2018-06-06 22:53:26 -329,Eleen,Girardy,254-561-4781,Female,6,99,58,2018-08-12 03:49:21,2019-01-04 17:17:54,2018-07-07 17:22:19,2018-02-08 00:26:15 -330,Junina,Scarisbrick,668-657-6435,Female,2,82,52,2018-10-08 01:58:04,2019-01-18 08:27:33,2018-10-13 10:36:18,2018-04-09 10:28:35 -331,Mufi,Insole,497-136-1156,Female,1,3,77,2018-07-01 05:18:23,2018-04-25 06:55:14,2018-12-23 07:35:00,2018-09-14 19:25:46 -332,Burk,Sawday,758-694-5610,Male,1,16,37,2018-05-18 17:42:50,2018-09-01 06:27:12,2018-05-06 06:30:31,2018-11-29 12:15:41 -333,Jess,Gully,330-430-8050,Female,5,2,75,2018-04-21 00:37:44,2018-06-12 02:34:07,2018-05-04 05:50:38,2018-11-25 21:02:42 -334,Dayna,Goublier,395-283-7995,Female,1,3,58,2018-03-10 13:08:34,2018-04-01 05:11:59,2018-07-17 13:31:35,2019-01-02 10:31:32 -335,Shandy,Grzegorczyk,271-236-1931,Female,6,32,34,2018-10-24 18:00:50,2018-03-17 19:11:58,2018-07-13 09:20:10,2018-07-07 03:03:48 -336,Alec,Nunnery,471-774-4412,Male,3,85,94,2018-02-15 09:59:45,2018-01-30 12:50:03,2018-03-01 13:47:47,2018-09-28 11:00:16 -337,Marti,Bedboro,799-912-3939,Female,3,88,26,2018-06-25 11:23:21,2018-10-30 08:43:52,2018-01-29 08:37:23,2018-06-06 00:28:49 -338,Malchy,Kobpac,819-568-9360,Male,4,9,14,2018-02-24 04:10:07,2018-10-05 18:35:23,2018-06-15 18:09:22,2018-11-15 08:05:17 -339,Egan,Dobbinson,366-886-7331,Male,5,43,13,2018-03-14 16:50:59,2018-08-08 23:17:17,2018-05-14 23:29:30,2018-08-19 04:54:16 -340,Maisie,Legg,700-620-6322,Female,7,85,21,2018-08-24 21:35:43,2018-08-30 17:01:27,2018-09-26 01:11:55,2018-12-29 12:04:35 -341,Fidel,Cossum,677-926-2862,Male,3,37,35,2018-07-26 05:42:32,2018-03-10 10:55:00,2018-12-22 17:20:15,2018-12-23 18:00:25 -342,Artemis,Beaton,301-959-5912,Male,7,15,26,2019-01-16 02:54:03,2018-10-28 11:08:44,2018-04-03 17:01:17,2018-04-13 04:28:34 -343,Culver,MacShirrie,126-770-5278,Male,4,28,43,2018-04-18 15:27:55,2018-08-01 10:35:51,2018-03-25 11:19:36,2018-06-01 19:23:11 -344,Jessa,Penreth,684-809-2622,Female,7,59,63,2018-08-04 18:24:37,2018-12-16 20:09:17,2018-04-11 13:14:28,2018-04-22 20:10:29 -345,Nydia,Hefner,535-519-6688,Female,3,70,29,2018-07-22 18:53:43,2018-09-02 00:30:03,2018-10-29 22:17:37,2018-05-07 11:46:24 -346,Ber,Naulty,311-674-2440,Male,6,85,70,2018-09-03 15:50:38,2018-07-04 22:30:51,2018-06-29 11:55:09,2018-05-16 11:27:56 -347,Margit,Greder,417-702-7174,Female,3,35,4,2018-04-28 01:58:34,2018-07-07 16:48:11,2018-10-08 13:45:45,2018-07-30 06:54:10 -348,Haroun,Kleynen,447-297-5270,Male,1,91,87,2018-05-14 13:40:54,2018-02-06 20:20:54,2018-04-24 19:09:01,2018-07-08 15:20:39 -349,Aylmer,Hubner,861-836-0360,Male,7,92,93,2018-02-10 06:55:44,2018-05-09 06:47:11,2018-07-09 15:46:54,2018-06-24 16:38:43 -350,Natty,Clemenzo,127-593-4758,Male,2,26,56,2018-02-01 13:02:29,2018-08-21 13:26:29,2018-12-24 09:27:03,2018-12-03 17:23:39 -351,Adriaens,Galier,704-551-4514,Female,1,64,55,2018-02-20 14:06:58,2018-09-17 22:53:46,2018-06-05 21:13:53,2018-02-25 03:51:27 -352,Raphaela,Higounet,493-470-8620,Female,7,72,86,2018-04-06 23:54:14,2018-11-09 00:01:09,2018-04-16 13:28:28,2018-10-15 09:06:54 -353,Nadia,Cureton,243-413-5780,Female,7,16,92,2018-10-20 06:35:07,2018-04-22 20:08:35,2018-04-07 15:26:39,2018-07-12 20:04:06 -354,Elliot,Bursell,301-524-4971,Male,6,59,44,2018-06-15 18:56:07,2018-03-14 21:30:37,2018-04-10 07:08:26,2018-10-03 23:57:13 -355,Miltie,Credland,318-601-5704,Male,3,5,47,2018-11-14 17:21:39,2018-04-18 22:02:24,2018-05-29 11:29:17,2018-08-28 19:44:37 -356,Andre,Dockray,631-438-3562,Male,2,1,36,2018-10-08 05:05:08,2018-10-07 10:51:00,2018-03-15 03:21:37,2018-08-31 02:22:35 -357,Marty,Vannah,864-526-0455,Male,5,32,9,2018-07-24 00:22:10,2018-08-26 02:40:08,2018-06-27 12:17:04,2018-05-23 03:24:49 -358,Timofei,Paddeley,941-127-2852,Male,4,75,28,2018-06-23 03:54:48,2018-06-16 19:23:26,2018-01-22 23:50:44,2018-09-17 11:00:42 -359,Susie,Bister,717-420-9064,Female,2,35,88,2018-08-09 20:57:50,2018-12-31 14:45:14,2018-04-16 17:44:38,2018-04-22 00:14:47 -360,Salvatore,Saenz,433-114-2254,Male,7,20,65,2018-02-14 15:55:26,2018-10-12 01:07:22,2018-11-29 04:17:51,2018-03-26 04:48:55 -361,Orin,Buttler,311-657-3727,Male,6,34,55,2018-04-05 00:11:44,2018-03-18 20:58:52,2018-09-14 10:40:07,2018-08-10 05:15:21 -362,Darbee,Garnam,956-529-4862,Male,1,75,26,2018-04-10 03:09:44,2018-06-29 01:39:43,2018-08-22 22:42:21,2018-09-15 23:23:04 -363,Lynne,Order,955-214-1203,Female,3,7,62,2018-11-15 23:40:31,2019-01-19 17:41:26,2018-02-14 19:18:25,2018-05-13 10:24:56 -364,Quinn,Hickinbottom,161-623-2666,Female,4,55,12,2018-10-24 13:06:05,2018-05-14 12:29:26,2018-10-03 06:49:08,2018-08-31 05:23:27 -365,Fionnula,Lonsbrough,271-974-9269,Female,2,24,86,2018-11-26 13:04:53,2018-04-30 00:03:02,2018-12-10 17:59:39,2018-11-02 17:56:01 -366,Blinni,Bound,991-243-7726,Female,3,34,55,2018-03-15 03:25:08,2018-07-17 18:13:35,2018-01-22 14:47:57,2018-07-03 10:31:07 -367,Joellyn,Duddin,562-523-2225,Female,3,91,7,2018-03-05 16:54:40,2018-07-11 18:24:57,2018-01-27 22:51:59,2018-06-14 14:18:32 -368,Shawn,McCandie,460-327-7535,Male,7,83,25,2018-03-04 04:08:42,2018-02-27 20:23:00,2018-05-03 04:17:09,2018-05-11 02:19:04 -369,Ferdinande,Beckinsall,555-188-2556,Female,1,23,71,2019-01-09 18:09:00,2018-11-05 21:40:44,2018-04-18 11:39:10,2018-05-26 04:58:28 -370,Dex,Hercock,124-933-7494,Male,4,66,59,2018-12-03 18:59:16,2018-08-24 14:54:44,2018-12-04 06:20:22,2018-02-12 20:16:12 -371,Auguste,Kindread,503-140-7531,Female,1,66,99,2018-09-06 02:28:55,2018-06-16 13:03:23,2018-12-18 05:54:52,2018-06-18 08:33:05 -372,Nicolle,McGarvie,977-633-1344,Female,3,80,30,2018-06-27 01:20:37,2019-01-03 07:13:42,2018-08-14 06:50:08,2018-03-11 19:28:21 -373,Meir,Poxson,979-687-3866,Male,4,95,64,2018-07-09 19:27:35,2018-05-02 06:46:01,2018-03-13 19:59:34,2018-02-14 17:37:01 -374,Aurore,Mathe,855-273-0680,Female,1,35,18,2018-12-25 19:52:38,2018-06-27 16:21:30,2018-09-05 07:24:39,2018-07-07 20:33:00 -375,Tara,Kovacs,289-503-0397,Female,1,96,65,2018-02-01 14:13:00,2018-09-13 12:52:31,2018-12-11 12:17:26,2018-01-27 11:08:31 -376,Oliver,Keitch,295-918-1908,Male,2,2,91,2018-04-25 08:41:36,2018-10-26 12:47:17,2018-09-17 07:21:55,2018-05-05 18:27:42 -377,Terrie,Van der Linde,437-439-0685,Female,5,40,86,2018-06-13 19:39:12,2018-09-27 20:24:10,2018-11-29 11:48:24,2018-08-03 10:38:12 -378,Dickie,Rhymes,812-341-6120,Male,1,20,77,2018-02-19 18:11:07,2018-07-04 05:36:40,2018-11-14 00:59:02,2018-11-24 17:13:06 -379,Lynette,Hadland,438-785-0370,Female,1,49,29,2018-04-01 23:24:07,2018-08-21 14:23:03,2018-05-13 18:28:29,2018-12-12 21:59:32 -380,Blanch,Smythin,325-174-1975,Female,1,13,78,2018-11-04 02:34:45,2018-10-22 10:28:57,2018-09-14 10:12:56,2018-10-23 19:59:00 -381,Camellia,Rickeard,681-592-9848,Female,5,53,4,2018-08-25 10:15:49,2018-04-05 06:53:58,2018-02-17 08:17:38,2018-09-11 01:16:02 -382,Muire,Minto,821-124-3681,Female,2,92,71,2018-10-16 14:05:30,2018-05-21 07:22:46,2018-10-26 09:45:10,2018-09-07 09:40:50 -383,Franz,Goullee,650-849-7354,Male,1,19,86,2018-07-14 09:46:05,2018-02-20 08:15:57,2018-06-05 10:37:07,2018-06-14 13:33:38 -384,Ardath,Salaman,542-596-2751,Female,6,3,76,2018-06-07 05:11:01,2018-09-17 09:28:04,2018-04-10 13:00:45,2018-11-27 21:22:09 -385,Graeme,Balshen,286-335-9657,Male,3,44,17,2018-07-18 15:23:20,2018-03-28 07:57:47,2018-11-12 18:58:13,2018-10-11 13:56:49 -386,Lola,Ainsbury,875-341-9340,Female,5,48,71,2018-03-12 03:05:33,2018-11-01 02:55:54,2018-02-15 04:37:51,2018-05-27 04:11:38 -387,Marchelle,Reynoollds,771-436-6596,Female,3,15,98,2018-07-21 06:24:35,2018-10-15 12:19:29,2018-10-21 17:19:01,2018-12-07 00:08:23 -388,Ruddie,Ginger,639-798-1010,Male,6,53,88,2018-10-27 08:25:56,2018-08-05 15:50:59,2018-05-26 08:38:25,2018-03-12 08:36:31 -389,Kathrine,Guiu,822-798-6112,Female,2,31,32,2018-07-21 23:07:18,2018-04-23 18:22:19,2018-12-14 04:50:14,2018-12-17 05:07:54 -390,Bobbie,Peet,321-618-4507,Male,6,40,10,2018-12-07 06:56:32,2018-05-26 07:54:01,2018-02-12 22:14:19,2018-03-02 09:00:13 -391,Waylon,Brignall,721-399-8864,Male,2,29,55,2018-03-05 23:01:40,2018-02-12 20:24:53,2018-10-03 20:50:03,2018-05-27 20:39:09 -392,Randene,M'Chirrie,274-833-8717,Female,7,5,29,2018-11-09 00:26:39,2018-05-08 06:51:45,2018-10-07 04:03:07,2018-07-11 15:11:59 -393,Venus,Burgise,888-311-2349,Female,5,49,10,2018-01-31 18:35:34,2018-06-11 17:52:44,2019-01-18 10:15:45,2018-01-29 11:19:22 -394,Patton,Atkirk,887-990-8528,Male,3,14,48,2018-09-02 04:16:21,2018-12-07 12:14:18,2018-09-11 02:15:29,2018-05-31 08:26:51 -395,Ethelda,Sclater,557-210-5737,Female,2,98,59,2018-10-08 02:45:35,2018-03-07 11:02:12,2018-03-09 22:30:08,2018-07-15 06:00:38 -396,Kerry,Mascall,178-504-3458,Male,3,83,65,2018-08-12 19:58:08,2018-07-06 21:04:42,2018-07-15 00:45:35,2018-11-11 14:30:45 -397,Kelsey,Bohills,477-245-9384,Female,4,23,40,2018-08-31 00:28:52,2018-04-23 15:33:52,2018-08-22 04:21:43,2018-12-27 08:56:06 -398,Brennen,Ahrendsen,666-924-8234,Male,3,47,82,2018-12-10 22:01:21,2018-11-13 15:03:16,2018-01-21 19:47:47,2018-07-28 11:39:10 -399,Carmelina,Mountcastle,871-952-4482,Female,6,14,79,2018-05-25 02:01:07,2018-05-15 19:52:19,2018-07-16 23:16:38,2018-05-22 23:32:19 -400,Dale,Eltone,663-128-1228,Male,1,80,26,2018-10-13 23:51:08,2018-02-19 19:49:01,2018-01-27 11:58:54,2018-07-02 14:05:44 -401,Brianna,Beauchop,922-667-1003,Female,5,12,12,2018-11-05 20:21:33,2018-06-24 22:17:20,2018-06-12 04:34:37,2018-07-09 06:48:22 -402,Guillema,MacKibbon,164-334-7955,Female,3,6,56,2018-06-24 21:01:56,2018-08-15 08:52:58,2018-07-21 21:42:02,2018-02-26 08:29:48 -403,Ettore,Brailsford,231-820-9624,Male,1,92,34,2019-01-17 05:37:42,2018-06-30 12:14:43,2018-04-11 20:55:10,2018-01-21 17:40:14 -404,Shawn,M'cowis,293-256-5912,Male,7,12,87,2018-02-07 20:27:20,2018-08-07 19:48:03,2019-01-01 18:32:27,2018-08-31 20:41:20 -405,Lolly,Rankcom,743-968-5736,Female,2,17,31,2018-11-03 21:37:26,2018-07-18 08:15:01,2018-12-28 23:22:36,2018-09-04 02:20:01 -406,Jeffry,Dingle,194-835-0524,Male,1,6,58,2018-10-21 16:42:07,2018-06-01 21:41:20,2018-06-17 04:34:34,2018-12-29 19:09:29 -407,Marcelle,Molder,766-356-8780,Female,3,85,45,2018-10-18 11:17:27,2018-10-17 20:18:59,2018-09-05 10:30:56,2018-08-10 06:31:09 -408,Binni,Ferney,214-353-4132,Female,6,6,98,2018-02-20 07:18:40,2018-06-24 11:40:51,2018-12-13 02:29:35,2018-10-04 10:52:07 -409,Pat,Whenham,885-713-4885,Male,7,64,5,2018-10-29 12:39:59,2018-11-08 18:24:31,2018-04-17 11:10:35,2018-10-13 22:45:02 -410,Towney,Mizzi,602-556-2702,Male,7,40,94,2018-03-02 22:07:54,2018-08-30 01:11:53,2018-12-21 22:30:09,2018-04-08 21:36:17 -411,Cecil,Bickerdike,577-476-2260,Male,2,2,65,2018-02-25 13:53:37,2018-02-13 04:10:01,2018-05-27 20:30:46,2018-04-11 01:36:56 -412,Franciskus,Thomlinson,539-919-8711,Male,4,69,14,2018-11-12 12:18:44,2018-02-07 14:40:19,2018-08-23 04:04:48,2018-02-11 00:53:06 -413,Valentino,Machent,281-308-6846,Male,6,76,23,2018-10-04 13:04:01,2018-09-13 11:56:13,2018-06-25 21:50:15,2018-06-03 04:08:35 -414,Evelin,Harpham,287-743-1401,Male,7,1,5,2018-06-15 01:25:03,2018-05-17 06:35:54,2018-10-22 08:02:14,2018-08-25 01:58:06 -415,Cassandre,Crum,685-341-7481,Female,3,25,79,2018-07-29 10:09:33,2018-01-30 23:16:22,2019-01-13 15:40:35,2018-07-14 15:57:17 -416,Loren,Leschelle,321-405-9197,Male,3,26,13,2018-04-29 06:52:46,2018-06-21 13:57:41,2018-07-30 18:39:32,2018-09-01 00:31:38 -417,Ilaire,Plose,336-197-4797,Male,1,53,50,2018-07-01 07:52:56,2018-10-30 02:18:43,2018-08-21 23:46:29,2018-08-07 13:03:11 -418,Hannis,Issacof,315-716-3782,Female,2,99,85,2019-01-19 10:40:46,2018-04-26 10:04:56,2018-11-15 02:42:19,2018-08-21 16:50:00 -419,Meggie,Beeke,556-174-4615,Female,1,13,85,2018-03-05 16:12:22,2018-09-19 22:31:27,2018-12-04 04:01:57,2018-04-14 20:14:40 -420,Clemens,Leades,183-447-0091,Male,7,98,12,2018-06-18 06:17:24,2018-04-10 09:59:20,2018-03-20 22:45:02,2018-05-10 17:11:21 -421,Dennis,Chifney,196-548-2180,Male,7,75,98,2018-12-09 00:19:15,2018-06-16 10:29:26,2018-09-12 03:26:46,2018-10-24 16:42:20 -422,Yuri,Laytham,783-967-4260,Male,7,72,60,2018-01-28 20:33:42,2018-11-10 15:59:58,2018-05-07 10:19:43,2018-03-08 01:03:28 -423,Rosaline,Gibbins,376-974-7633,Female,3,22,56,2018-06-26 01:09:00,2018-10-30 23:51:58,2018-07-31 09:43:54,2018-11-23 12:00:53 -424,Yule,Hadwick,795-430-0875,Male,2,99,87,2018-03-09 17:35:22,2018-07-18 20:38:41,2018-08-29 09:29:40,2018-12-12 13:21:09 -425,Albertine,Bernlin,415-360-6554,Female,2,40,34,2018-05-24 10:27:28,2018-10-31 10:36:51,2018-07-04 15:40:42,2018-05-23 02:22:57 -426,Donnell,Stammler,944-379-5489,Male,4,59,41,2018-06-28 16:01:29,2018-05-18 12:55:36,2018-03-07 06:37:32,2018-03-25 12:44:31 -427,Brant,Athy,987-827-3040,Male,5,52,7,2018-01-24 14:17:54,2018-10-06 04:10:01,2018-02-21 04:02:17,2018-05-27 20:44:43 -428,Rose,Barnaby,789-522-4912,Female,7,31,46,2018-11-30 14:09:29,2018-11-06 16:28:33,2018-12-13 23:06:42,2018-09-12 17:39:14 -429,Valina,Ply,729-373-7904,Female,3,65,27,2018-11-15 05:26:26,2018-11-28 15:21:13,2018-05-01 00:56:08,2018-02-05 07:37:50 -430,Berkley,Ferry,484-341-3250,Male,6,47,48,2018-07-26 11:27:11,2018-03-05 19:23:46,2018-08-05 08:09:19,2018-05-30 08:43:28 -431,Jarred,Cunnington,995-170-5820,Male,4,6,1,2018-07-12 11:36:19,2018-10-19 05:16:25,2018-06-28 12:38:16,2018-10-08 06:52:46 -432,Marys,Audry,449-892-8929,Female,2,25,86,2018-11-21 14:36:19,2018-11-26 13:31:27,2018-03-28 15:22:34,2018-01-28 08:07:21 -433,Coreen,Vinnicombe,267-868-6003,Female,6,64,45,2018-10-19 22:09:21,2018-12-08 23:41:39,2018-08-16 05:46:08,2018-11-18 14:46:52 -434,Spense,Sarfati,945-773-9494,Male,4,6,3,2018-03-18 13:44:54,2018-09-04 10:40:58,2019-01-15 18:23:55,2018-06-07 16:02:39 -435,Chandra,Burgin,130-446-4470,Female,4,95,96,2018-09-27 16:48:00,2018-05-20 20:44:56,2018-11-23 04:46:53,2018-01-31 16:31:14 -436,Tomas,Currin,756-279-5643,Male,4,41,4,2018-11-18 07:22:02,2018-11-14 14:03:44,2018-09-18 12:36:39,2018-06-05 09:28:43 -437,Conway,Wesson,754-769-3550,Male,1,52,46,2019-01-02 08:07:04,2018-02-14 00:52:12,2018-02-11 10:52:29,2018-02-16 15:31:25 -438,Stefa,Meese,610-105-6841,Female,7,39,28,2018-04-28 02:21:35,2018-10-21 01:33:19,2018-11-23 21:00:01,2019-01-10 08:36:35 -439,Theadora,Ubee,609-368-9924,Female,6,42,5,2018-04-22 17:02:17,2018-08-21 16:33:25,2018-08-25 04:12:23,2018-02-16 01:13:06 -440,Virginia,Flawn,711-955-7169,Female,3,20,19,2018-08-16 18:01:55,2018-04-18 10:08:19,2018-01-27 09:38:48,2018-05-29 02:29:24 -441,Marv,Mummery,820-192-1452,Male,5,75,95,2018-05-29 15:29:25,2018-03-19 14:00:54,2018-01-22 01:15:38,2018-08-17 08:36:00 -442,Fulton,Zelake,283-584-1765,Male,7,4,3,2019-01-13 23:55:52,2018-08-19 22:29:51,2018-04-16 02:28:54,2018-03-16 16:58:02 -443,Guillemette,Ferretti,776-408-8649,Female,3,24,79,2018-07-31 04:43:48,2018-08-04 15:42:51,2018-04-11 16:00:11,2019-01-07 22:56:20 -444,Egbert,Dureden,698-387-7895,Male,7,54,6,2018-02-25 13:06:41,2018-01-28 14:50:49,2019-01-01 05:38:28,2018-06-19 00:46:05 -445,Trumaine,Canniffe,563-399-5639,Male,1,79,93,2018-11-08 00:30:08,2018-04-07 04:15:13,2018-03-30 14:48:19,2018-04-10 23:29:00 -446,Burr,Goves,451-577-7757,Male,1,27,72,2018-03-16 22:57:50,2018-02-04 21:42:45,2018-06-27 04:37:53,2019-01-16 15:20:56 -447,Juditha,Luebbert,958-685-2937,Female,4,36,87,2018-08-30 23:36:55,2018-06-22 07:04:37,2018-08-23 08:03:08,2018-03-28 04:50:57 -448,Lilly,Smewings,246-392-5467,Female,7,61,65,2018-06-02 21:56:15,2018-09-21 22:08:51,2018-11-29 20:26:34,2018-09-09 13:36:55 -449,Beckie,Curd,239-783-9576,Female,2,18,69,2018-11-20 04:10:54,2018-07-09 08:10:52,2018-03-19 21:04:09,2018-06-19 12:09:53 -450,Cristie,Edmonds,203-875-9153,Female,6,75,68,2018-11-16 10:01:12,2018-08-05 10:10:51,2019-01-11 05:06:49,2018-02-27 23:12:37 -451,Richmound,Machans,259-901-3247,Male,6,7,81,2019-01-12 15:06:01,2018-08-04 16:50:11,2018-12-30 16:16:18,2018-04-24 01:22:55 -452,Murial,Heiss,686-151-1653,Female,6,62,44,2018-05-18 13:49:57,2018-07-31 04:58:55,2018-02-26 22:38:19,2018-06-03 12:20:39 -453,Leonhard,O'Hear,205-401-7116,Male,5,3,1,2018-12-01 20:43:01,2018-06-19 12:45:05,2018-06-17 21:31:22,2018-12-29 20:41:28 -454,Kin,Yakovlev,952-369-5846,Male,1,39,38,2018-03-05 07:22:54,2018-06-20 14:24:43,2018-12-24 17:56:41,2018-07-13 07:55:25 -455,Debee,Fransinelli,230-272-0203,Female,3,64,60,2018-03-28 12:01:56,2018-09-10 13:03:46,2018-05-10 07:50:05,2018-08-10 09:35:31 -456,Nappie,Seaton,809-725-5784,Male,1,67,52,2018-09-13 00:18:51,2018-07-10 10:46:33,2018-04-19 00:56:44,2018-06-17 12:12:31 -457,Adelheid,Wanjek,795-641-9749,Female,1,21,97,2018-03-09 22:00:35,2018-08-09 22:29:44,2018-05-22 14:09:09,2018-03-19 18:49:28 -458,Jeannette,Glanville,377-671-9024,Female,7,84,44,2018-10-05 10:17:32,2018-04-06 12:22:12,2018-05-10 03:19:20,2018-09-30 04:25:01 -459,Adrianna,Blezard,773-598-7742,Female,6,89,62,2018-04-25 21:46:25,2018-05-26 05:44:50,2018-07-14 12:21:26,2018-09-28 10:26:06 -460,Gloria,Keelin,120-823-7944,Female,4,9,68,2018-07-13 21:08:25,2018-03-14 15:55:09,2018-04-02 02:08:40,2019-01-09 11:56:17 -461,Becki,Gatling,845-125-4361,Female,4,1,71,2018-06-24 20:47:16,2018-08-28 04:29:09,2018-05-06 23:04:29,2018-06-01 05:37:42 -462,Gabriellia,Lobley,844-697-7445,Female,2,89,99,2018-09-15 13:57:53,2018-06-14 14:04:36,2018-12-09 22:49:10,2018-02-12 02:07:35 -463,Aaren,McVie,973-286-0455,Female,4,67,14,2018-10-24 23:51:19,2018-04-28 04:48:26,2018-08-01 00:36:09,2018-07-03 13:36:32 -464,Barbara,Luddy,270-772-2682,Female,6,31,58,2018-03-18 11:34:08,2018-11-10 07:14:55,2018-12-12 21:20:10,2018-08-31 00:15:05 -465,Ibrahim,Went,494-197-0863,Male,3,35,42,2018-10-27 09:01:43,2018-05-24 01:03:27,2018-11-12 00:22:15,2018-03-28 09:23:37 -466,Sherry,Meert,142-492-1426,Female,7,30,41,2018-09-05 17:22:28,2019-01-11 02:43:23,2018-08-24 21:28:14,2018-03-23 18:02:50 -467,Marietta,Caulwell,931-150-2069,Male,5,5,93,2018-10-20 06:55:32,2018-08-24 12:59:12,2018-02-05 08:19:35,2018-01-23 22:03:22 -468,Kaiser,Gossage,250-466-8664,Male,6,23,93,2018-08-30 13:38:00,2018-10-27 22:45:24,2018-06-20 08:32:02,2018-01-25 09:32:34 -469,Margie,Fenelon,570-190-5079,Female,7,83,33,2018-12-11 01:27:54,2018-02-18 13:46:59,2018-09-23 21:24:36,2018-09-12 19:05:02 -470,Alvin,Stallan,451-964-7576,Male,6,25,97,2018-10-10 09:53:05,2018-05-12 18:37:24,2018-04-16 18:11:41,2018-12-06 13:37:08 -471,Corbin,Lamport,950-956-7283,Male,2,80,15,2018-10-08 17:14:14,2018-12-03 17:06:55,2018-08-04 22:29:17,2018-12-03 12:04:13 -472,Imelda,Crat,346-373-3643,Female,3,60,21,2018-01-25 18:42:27,2018-02-02 11:29:22,2018-05-12 06:06:53,2018-05-24 14:31:31 -473,Kala,Aikenhead,665-137-0705,Female,3,5,83,2018-03-11 01:11:04,2019-01-18 14:28:39,2018-04-20 06:28:31,2018-06-21 01:18:27 -474,Bastien,Lavell,325-523-0512,Male,7,87,91,2019-01-14 08:13:00,2018-06-08 18:23:51,2018-12-02 08:49:53,2018-12-06 00:24:41 -475,Muriel,Cannon,174-249-0377,Female,7,11,49,2018-06-09 02:06:14,2018-05-19 03:47:34,2018-02-15 07:14:49,2018-03-19 22:10:50 -476,Duane,Presland,616-278-2852,Male,6,49,20,2018-02-10 17:43:55,2018-02-21 00:21:21,2018-10-01 16:17:22,2018-04-06 08:15:06 -477,Emmerich,Baildon,408-829-6965,Male,1,13,29,2018-11-08 20:46:52,2018-07-04 14:45:10,2018-05-22 03:30:35,2018-07-26 23:46:21 -478,El,Seabourne,745-257-4885,Male,6,13,60,2019-01-05 01:40:08,2019-01-07 01:30:58,2018-08-24 00:13:56,2018-08-20 02:39:03 -479,Rivalee,Robertsson,882-741-1264,Female,3,36,70,2018-10-07 07:27:41,2018-05-13 11:32:58,2018-12-07 16:22:21,2018-12-12 19:59:38 -480,Alexis,Lapping,852-596-1033,Female,1,48,44,2018-01-30 22:17:04,2018-08-30 00:34:37,2018-11-04 00:05:38,2018-12-11 02:01:32 -481,Francine,Slatcher,134-351-4974,Female,1,56,91,2018-12-25 00:49:27,2018-10-11 02:42:45,2018-10-09 12:40:08,2018-09-01 13:26:34 -482,Kristen,Petters,440-151-8788,Female,7,19,49,2018-02-17 01:34:14,2018-10-28 03:18:55,2018-09-13 14:14:48,2018-01-22 12:26:05 -483,Riobard,Helin,217-648-4050,Male,6,3,62,2019-01-08 20:13:28,2018-07-10 21:50:12,2018-02-14 10:54:30,2018-07-10 15:21:36 -484,Jere,Marrison,125-522-1752,Male,5,77,48,2018-03-27 12:35:57,2018-08-11 12:06:00,2018-07-10 09:48:33,2018-11-12 18:44:01 -485,Sheila,Edens,296-894-3200,Female,3,99,67,2018-09-02 05:54:01,2018-03-13 04:55:49,2019-01-07 04:42:32,2018-12-12 03:46:51 -486,Georgy,Sallings,860-751-2558,Male,5,42,98,2018-03-04 09:36:14,2018-12-18 03:43:57,2018-05-26 16:22:04,2018-09-02 12:56:41 -487,Marcellina,Ledgister,286-469-6281,Female,6,17,35,2018-07-04 19:56:40,2018-04-13 18:15:53,2018-06-22 16:02:20,2018-02-12 13:24:14 -488,Terra,Dodamead,913-630-9923,Female,1,82,1,2018-12-11 19:54:27,2018-12-11 20:39:38,2018-03-28 15:51:45,2018-08-25 04:08:21 -489,Alia,Morrel,431-923-1395,Female,7,7,38,2018-05-24 06:33:39,2018-03-16 20:23:58,2018-09-11 05:45:02,2018-02-10 15:26:52 -490,Henri,Cullivan,513-315-1874,Male,2,7,65,2018-02-21 12:36:28,2018-02-28 14:01:27,2018-11-04 00:27:37,2018-06-18 18:54:48 -491,Josie,Langrish,674-305-6918,Female,2,79,72,2018-07-26 02:09:25,2018-12-03 14:04:40,2018-10-18 18:24:47,2018-09-01 09:38:00 -492,Brittany,Redwall,197-871-1265,Female,2,98,39,2019-01-15 16:02:18,2018-07-28 14:31:51,2019-01-05 12:31:54,2018-02-17 02:21:53 -493,Phillie,Caulket,276-222-0475,Female,2,92,27,2018-10-19 10:58:15,2018-10-01 05:23:18,2018-10-31 20:41:31,2018-01-23 21:09:13 -494,Clair,Ring,789-696-3129,Female,1,60,89,2018-12-15 04:12:43,2018-03-14 18:18:51,2018-02-01 04:15:54,2018-05-24 23:34:59 -495,Allis,Sunner,601-505-2836,Female,3,37,9,2018-03-16 18:20:34,2018-10-03 23:52:03,2018-09-09 20:19:13,2018-09-12 13:27:03 -496,Madeleine,Haitlie,956-801-4088,Female,4,55,99,2018-05-23 09:24:40,2018-09-25 14:13:54,2018-12-07 06:01:21,2018-08-05 05:36:15 -497,Cirillo,Gronav,571-141-3522,Male,5,81,10,2018-10-11 20:52:40,2018-02-21 03:11:05,2018-09-16 08:35:42,2018-03-26 20:16:43 -498,Arturo,Cowitz,923-926-3273,Male,3,93,12,2018-11-22 05:37:54,2018-02-17 15:11:34,2018-03-31 00:15:46,2018-08-03 14:49:13 -499,Haley,Cartmill,139-891-8155,Female,2,79,56,2018-10-28 03:24:17,2018-09-26 03:42:15,2018-09-16 20:27:43,2018-10-21 06:51:02 -500,Caddric,Eim,386-491-4555,Male,4,88,81,2018-07-27 07:41:11,2018-11-06 13:25:15,2018-04-30 01:01:46,2018-10-27 13:14:40 -501,Sargent,Beart,958-909-4690,Male,1,44,9,2018-07-18 12:02:07,2018-07-23 05:06:07,2018-07-16 15:25:53,2018-08-26 13:12:34 -502,Dane,Gason,502-241-7120,Male,6,79,58,2018-11-17 04:47:55,2018-07-17 16:19:37,2018-12-02 13:39:55,2018-08-07 15:28:47 -503,Humfried,Canelas,275-518-1730,Male,3,82,87,2018-02-02 11:38:29,2018-10-18 04:09:03,2018-02-04 00:47:16,2018-07-23 00:37:30 -504,Sam,Freiberg,757-773-6048,Female,5,89,31,2018-12-01 22:51:12,2018-06-29 03:50:29,2018-07-25 14:13:37,2018-06-11 22:59:09 -505,Goddart,Crossgrove,820-183-6322,Male,3,41,25,2018-11-22 23:25:36,2018-01-29 08:12:28,2018-09-24 21:36:56,2018-03-04 00:40:37 -506,Joela,Bondesen,856-474-9498,Female,5,71,97,2018-05-08 08:23:42,2018-12-20 17:54:27,2018-08-13 11:11:11,2018-08-06 19:06:58 -507,Harrie,Nendick,943-670-9341,Female,3,66,6,2018-05-03 20:18:57,2018-11-06 16:35:09,2018-07-18 17:01:56,2018-03-29 06:23:00 -508,Farlay,Manderson,834-991-0018,Male,4,44,9,2018-08-16 12:51:08,2018-09-19 19:35:31,2018-09-28 07:49:16,2018-11-26 04:15:32 -509,Warren,Pegram,815-768-9711,Male,1,2,70,2018-11-03 16:08:12,2018-09-27 19:07:58,2018-02-15 09:57:42,2018-02-04 05:33:01 -510,Mylo,Haskayne,624-512-7407,Male,3,71,28,2018-11-05 07:00:48,2018-08-22 23:42:06,2018-10-13 09:30:14,2018-12-17 14:14:01 -511,Giacomo,Halsho,976-203-6826,Male,2,59,100,2018-04-11 12:30:03,2018-05-06 11:36:27,2019-01-03 21:44:26,2018-06-13 06:17:36 -512,Aloysia,Stuchburie,466-684-9228,Female,7,15,94,2018-05-05 20:22:16,2018-05-06 16:01:54,2018-11-13 03:57:27,2018-08-05 07:41:19 -513,Brit,Glentz,283-639-7723,Male,4,5,19,2018-04-07 12:25:00,2018-09-26 07:12:01,2018-06-05 14:15:20,2018-06-02 16:59:25 -514,Maddi,Kerfoot,543-438-1531,Female,3,16,67,2018-06-30 07:58:22,2018-12-16 23:14:43,2019-01-03 10:51:10,2018-09-10 17:15:42 -515,Ruy,Townson,801-852-6590,Male,1,31,55,2018-02-22 06:06:31,2019-01-20 20:38:59,2018-09-28 17:23:51,2018-09-30 05:48:30 -516,Rawley,Tatum,634-340-1379,Male,5,32,35,2018-02-14 04:43:24,2018-06-30 10:54:44,2018-11-22 11:23:10,2018-03-01 16:10:00 -517,Teddy,Pickford,404-551-3889,Male,2,82,54,2018-12-29 05:25:46,2018-04-13 05:46:18,2018-10-11 18:14:38,2018-11-07 08:35:59 -518,Randolph,Stealfox,750-802-5940,Male,3,91,11,2018-04-03 20:00:54,2018-11-29 19:15:41,2018-02-20 09:38:24,2018-03-25 15:38:52 -519,Filmer,Sumption,833-713-4339,Male,2,2,8,2018-01-26 04:26:32,2018-03-08 20:23:21,2018-07-27 10:41:05,2018-11-04 20:18:36 -520,Barbee,Salvador,475-228-6268,Female,1,13,71,2018-10-24 00:02:01,2018-01-21 21:29:45,2018-07-03 13:31:36,2019-01-07 14:59:36 -521,Valina,Spillett,588-767-5376,Female,5,27,8,2018-03-03 01:39:51,2018-01-28 01:22:11,2018-04-22 03:30:25,2018-03-08 04:45:22 -522,Taber,Faunt,428-608-8317,Male,5,46,93,2018-06-09 11:17:55,2018-09-01 01:34:32,2018-02-19 13:01:55,2018-08-15 06:00:48 -523,Lilas,Siemons,680-968-7597,Female,6,31,25,2018-11-26 22:08:43,2018-02-15 23:08:21,2018-12-26 05:40:57,2018-02-22 02:08:43 -524,Spence,Vosper,720-164-0499,Male,2,37,73,2018-01-31 08:38:29,2018-07-08 11:20:30,2018-10-31 09:36:46,2018-08-26 13:46:48 -525,Robinett,Le Breton De La Vieuville,690-247-8261,Female,6,47,79,2018-04-02 23:29:51,2018-04-26 14:43:49,2018-09-29 04:02:35,2018-02-22 14:19:00 -526,Pia,Favell,689-639-0553,Female,5,96,86,2018-09-27 09:10:13,2018-02-18 08:18:56,2018-09-16 10:20:42,2018-09-19 19:46:37 -527,Jody,Persich,875-503-4255,Female,5,1,63,2018-12-28 04:07:08,2018-02-19 06:37:40,2018-11-08 19:30:56,2018-04-16 19:36:13 -528,Mimi,Meach,664-906-5485,Female,3,46,59,2018-05-16 02:36:27,2018-02-06 06:52:54,2018-03-16 20:22:46,2018-12-24 10:29:20 -529,Nyssa,Hillborne,493-931-8360,Female,6,70,73,2018-12-08 00:07:34,2018-01-31 21:28:10,2018-04-14 12:33:22,2018-12-18 17:12:16 -530,Chrissie,Jagger,284-506-7117,Male,7,89,53,2018-03-21 21:11:02,2018-09-10 16:42:15,2019-01-17 21:11:31,2018-10-26 07:01:07 -531,Jacqueline,Hebblewhite,313-329-3935,Female,6,70,40,2018-07-29 17:39:44,2018-08-26 14:11:15,2018-12-18 12:39:49,2018-09-04 11:21:47 -532,Gunilla,Frarey,231-521-7913,Female,7,3,44,2018-03-05 06:12:04,2018-06-21 16:09:41,2018-01-27 13:30:18,2018-02-28 16:14:26 -533,Eleni,Fassum,149-906-0502,Female,1,40,27,2018-11-17 06:56:45,2018-06-22 05:04:09,2018-05-07 22:21:42,2018-12-21 21:39:19 -534,Kerr,Kelshaw,729-673-6161,Male,6,94,93,2018-11-23 00:31:03,2018-12-09 03:46:43,2018-02-22 16:54:17,2018-09-09 11:05:13 -535,Lisha,Curgenven,874-739-3351,Female,4,97,18,2018-02-20 18:11:36,2018-10-17 06:38:52,2018-12-26 02:40:15,2018-02-13 09:24:09 -536,Bevin,Jakeman,676-751-7045,Male,1,87,71,2018-02-20 13:08:18,2018-11-21 06:36:13,2018-09-22 09:22:49,2018-10-09 06:21:12 -537,Harland,Sidney,139-828-9659,Male,6,23,85,2018-09-18 02:15:28,2018-04-10 06:49:54,2018-12-05 20:08:51,2018-08-05 09:53:26 -538,Rori,Seys,180-907-6460,Female,5,27,23,2018-02-22 03:55:23,2018-08-01 08:40:28,2018-05-15 12:42:51,2018-10-22 00:24:22 -539,Baxy,Marjanski,580-759-7206,Male,4,95,30,2018-09-01 14:33:22,2018-12-14 23:01:00,2018-12-02 00:20:18,2018-08-25 13:54:47 -540,Martie,Dearsley,102-718-1278,Male,7,89,15,2018-03-15 10:57:25,2018-03-03 03:48:25,2018-07-12 03:48:36,2018-07-22 13:18:47 -541,Erin,Ruddick,969-222-3994,Male,1,97,56,2018-05-18 05:27:05,2018-02-23 12:22:10,2018-04-13 08:34:06,2018-11-25 15:51:09 -542,Tome,Lorne,842-424-5954,Male,4,58,76,2018-12-11 13:20:20,2018-07-29 14:26:59,2018-08-12 08:27:28,2018-04-03 13:46:52 -543,Nell,Borkin,228-448-5895,Female,1,3,1,2018-11-30 16:38:15,2018-07-27 09:33:59,2018-08-23 02:00:10,2018-09-28 00:28:48 -544,Teirtza,Springthorp,538-731-0003,Female,4,8,3,2018-03-28 08:52:40,2018-11-03 18:14:45,2019-01-02 06:05:23,2018-03-22 22:01:00 -545,Arlina,Feighney,977-853-6783,Female,1,18,40,2018-02-08 21:04:46,2018-03-02 23:43:32,2018-03-05 13:33:15,2018-05-12 17:12:38 -546,Melosa,Gifford,804-769-4197,Female,7,55,98,2018-02-04 08:50:49,2018-10-10 06:22:51,2018-06-01 01:45:08,2018-12-24 03:31:15 -547,Charin,Petrello,597-441-0171,Female,6,67,18,2018-09-10 08:11:34,2018-03-15 18:44:45,2018-10-22 23:24:05,2018-07-31 01:37:48 -548,Cristian,Stute,223-959-7392,Male,2,5,69,2018-11-01 17:37:10,2018-05-25 14:21:07,2018-10-09 08:14:38,2018-06-29 13:27:34 -549,Velvet,Morison,848-981-1316,Female,1,20,17,2018-02-14 02:16:51,2018-08-25 23:57:58,2018-04-20 10:47:18,2018-04-04 19:16:45 -550,Vivienne,Taillard,392-626-2926,Female,2,38,47,2019-01-20 11:03:04,2018-06-11 20:42:47,2018-05-13 17:10:39,2018-06-02 20:11:46 -551,Zach,Vials,406-733-0058,Male,1,28,88,2018-12-14 14:36:03,2018-02-25 21:52:58,2018-10-17 02:37:28,2018-02-05 17:26:59 -552,Christie,De Caville,268-836-0470,Male,6,28,91,2018-11-26 14:01:43,2018-06-27 22:05:24,2018-11-10 16:11:15,2018-07-20 12:01:34 -553,Dulce,Walesby,578-217-3628,Female,6,83,40,2018-04-12 08:24:30,2018-10-07 09:32:47,2018-04-10 12:21:16,2018-06-04 11:56:13 -554,Shermy,Martinek,627-924-0370,Male,1,54,86,2018-09-02 00:41:57,2018-09-16 02:42:47,2018-05-10 03:54:12,2018-11-14 17:54:47 -555,Curcio,Cudworth,355-447-1790,Male,2,43,26,2018-05-31 02:31:23,2018-11-18 23:47:19,2018-02-26 10:49:12,2018-08-22 04:36:14 -556,Newton,Zuan,810-756-5844,Male,5,85,20,2018-03-09 16:07:56,2018-10-12 16:45:42,2018-05-02 19:27:29,2018-04-21 12:37:09 -557,Gina,Keyho,566-476-0815,Female,4,8,83,2018-09-21 17:12:16,2018-03-20 10:13:51,2018-05-22 10:29:45,2018-09-23 17:23:36 -558,Emmanuel,Beacham,923-766-7627,Male,4,15,10,2018-10-14 04:16:42,2018-12-12 21:49:16,2018-04-06 14:49:00,2018-02-10 06:29:37 -559,Mel,Deniseau,577-125-8484,Female,3,12,6,2018-06-01 18:43:13,2018-11-09 14:24:38,2018-07-01 23:11:43,2018-11-24 10:28:42 -560,Deena,Knutton,544-886-5072,Female,2,98,57,2018-02-11 05:11:20,2018-08-19 14:06:35,2018-09-06 12:12:59,2018-10-07 13:53:21 -561,Flossy,Antonacci,108-542-7284,Female,2,20,36,2018-05-20 08:28:31,2018-04-01 14:07:20,2018-07-23 02:08:55,2018-08-29 00:40:11 -562,Gabriela,Gravy,565-992-0341,Female,3,54,70,2018-03-14 07:29:51,2018-11-24 05:40:57,2018-06-24 11:53:15,2018-12-13 15:23:43 -563,Emelen,Healey,821-210-6931,Male,7,16,79,2018-03-02 11:53:31,2018-07-04 07:43:45,2018-08-20 22:28:53,2018-08-20 07:13:10 -564,Anne-marie,Peatman,431-777-2495,Female,4,38,1,2018-02-28 18:38:14,2018-08-28 18:58:41,2018-09-01 22:16:42,2018-11-14 23:08:02 -565,Raymond,Truelock,671-694-3305,Male,5,20,76,2018-11-19 18:58:41,2018-10-26 03:22:35,2018-10-13 10:05:37,2018-10-20 00:19:39 -566,Gabriel,Matlock,704-620-9706,Female,1,29,24,2018-07-24 15:56:02,2018-12-23 10:03:48,2018-07-13 22:41:53,2018-06-12 13:42:42 -567,Leontine,Kollasch,793-692-0103,Female,4,68,78,2018-05-05 06:54:44,2018-07-26 19:41:30,2018-04-16 00:46:38,2018-11-20 19:18:17 -568,Amelina,Gullick,674-849-6707,Female,2,75,43,2019-01-01 12:18:11,2018-02-18 10:50:33,2018-09-11 05:30:18,2018-12-28 03:43:14 -569,Matthew,Gateley,450-774-0905,Male,5,93,62,2018-02-17 13:01:16,2018-06-17 01:27:48,2018-12-03 19:17:56,2018-08-31 08:39:46 -570,Alvan,Postance,415-301-3970,Male,5,36,24,2018-02-15 12:09:30,2018-07-26 19:38:06,2018-09-23 03:56:41,2018-09-17 12:13:43 -571,Ethelind,Otteridge,724-398-4832,Female,1,11,20,2019-01-09 07:06:55,2018-08-06 11:24:34,2018-02-04 09:08:33,2018-02-04 10:18:38 -572,Allayne,Pettegre,567-912-1393,Male,5,50,24,2019-01-17 18:14:12,2018-03-20 23:30:29,2018-07-08 17:53:55,2018-03-30 22:34:32 -573,Cindee,MacGill,218-267-2220,Female,3,85,36,2018-03-18 06:24:30,2018-08-12 14:08:59,2018-06-07 00:36:38,2018-07-28 18:35:16 -574,Jeramie,Fante,508-403-4318,Male,6,17,58,2018-09-05 21:09:00,2018-07-16 01:34:59,2018-05-30 20:15:51,2018-10-07 09:23:32 -575,Johannah,Treamayne,670-278-1704,Female,1,44,50,2018-09-01 12:25:07,2018-09-04 03:56:02,2018-03-25 08:47:56,2018-06-27 19:44:57 -576,Dari,Brocklesby,128-823-5176,Female,2,21,47,2018-11-06 21:06:13,2018-11-23 13:57:31,2019-01-01 00:06:22,2018-06-23 04:39:41 -577,Cob,Younglove,589-756-5544,Male,1,34,97,2018-06-06 05:48:43,2019-01-01 02:48:52,2018-09-20 02:52:35,2018-06-29 07:02:35 -578,Genevieve,Benois,718-259-0218,Female,1,83,84,2018-12-29 00:38:58,2019-01-17 14:12:58,2018-08-21 12:35:34,2018-07-15 16:50:51 -579,Demetra,Clineck,537-758-1797,Female,7,58,86,2018-04-18 09:28:08,2018-05-18 03:26:25,2018-02-24 07:51:24,2018-12-11 05:21:46 -580,Edithe,MacNeilage,254-201-0040,Female,5,2,46,2018-12-06 12:01:57,2018-02-16 02:10:30,2018-02-23 14:46:58,2018-12-31 17:43:21 -581,Osbourne,Scranny,682-363-4094,Male,3,29,17,2018-05-10 17:26:21,2018-11-02 03:59:01,2018-04-07 16:21:34,2018-07-31 23:17:47 -582,Con,Shyre,535-646-6697,Male,3,96,16,2018-07-14 00:36:39,2018-12-15 03:20:27,2018-07-23 10:48:18,2018-03-18 15:21:58 -583,Sylvester,Cannicott,456-905-3181,Male,1,2,37,2018-12-19 15:40:57,2018-06-18 08:08:39,2018-05-16 20:50:39,2018-10-02 13:56:35 -584,Any,Hayter,822-858-6900,Male,7,52,26,2018-11-06 13:05:00,2018-12-07 12:10:14,2018-12-30 08:34:38,2018-11-29 15:54:05 -585,Hebert,Casaro,238-642-2667,Male,5,86,80,2018-08-01 13:07:27,2018-11-03 12:14:52,2018-07-26 07:25:57,2019-01-19 03:35:48 -586,Lurlene,Feare,839-313-4455,Female,3,59,51,2018-08-26 04:27:58,2018-10-22 00:35:33,2018-06-26 19:50:51,2018-10-10 07:34:07 -587,Benjy,Mulvenna,623-742-2472,Male,3,63,37,2018-12-05 12:16:12,2018-06-01 06:27:24,2018-05-17 11:06:08,2018-11-03 18:34:32 -588,Odey,Burborough,705-824-5381,Male,7,35,7,2018-11-08 11:17:04,2018-10-02 17:39:13,2018-06-12 17:24:31,2018-11-16 00:36:52 -589,Marin,Piddletown,544-353-3265,Female,6,65,12,2018-06-05 02:00:30,2018-04-15 22:13:49,2018-10-25 08:48:07,2018-02-10 21:14:37 -590,Cyrille,holmes,735-579-6221,Male,7,40,75,2018-04-16 22:04:54,2018-04-25 22:55:07,2018-07-02 18:15:05,2018-08-10 21:27:54 -591,Maurice,Rains,484-638-1467,Male,5,73,91,2018-09-29 20:25:42,2018-05-09 00:14:24,2018-10-31 20:25:12,2018-10-07 19:50:59 -592,Caddric,Styant,859-759-9605,Male,6,10,38,2018-06-20 20:21:02,2018-12-09 17:47:12,2019-01-09 04:06:46,2018-07-19 05:01:01 -593,Vittorio,Straffon,643-403-5013,Male,3,46,7,2018-05-21 05:19:11,2018-12-06 16:33:18,2018-07-03 02:13:34,2018-11-03 12:50:20 -594,Filippo,Adamiak,414-171-7965,Male,5,13,70,2018-03-31 10:48:08,2018-07-07 00:41:10,2018-04-29 13:12:05,2018-08-12 07:32:33 -595,Abran,Blanning,940-243-9117,Male,6,88,72,2018-06-16 02:58:35,2018-08-17 14:00:04,2018-12-23 23:58:31,2018-04-15 17:28:52 -596,Ewart,Van Der Weedenburg,712-866-8225,Male,1,35,99,2018-12-03 12:43:02,2018-08-22 00:51:23,2018-06-03 09:07:10,2018-02-26 12:18:48 -597,Charmion,Toffoletto,139-517-9898,Female,2,60,33,2018-11-24 14:11:52,2018-10-26 03:35:48,2018-12-18 20:13:45,2018-09-23 22:05:26 -598,Marcellus,Casserly,253-327-1311,Male,3,41,81,2018-10-18 22:38:49,2018-03-13 20:31:39,2018-07-25 06:23:51,2018-06-05 20:55:02 -599,Bryant,Woonton,888-556-3681,Male,7,81,99,2018-02-28 09:31:55,2018-05-01 06:19:53,2019-01-09 14:08:26,2018-10-29 15:33:42 -600,Annnora,Beswick,518-587-0261,Female,6,56,22,2018-08-12 21:49:43,2019-01-08 19:34:20,2018-02-14 10:14:40,2018-08-01 03:40:27 -601,Donovan,Stenner,407-562-5695,Male,1,80,76,2018-08-31 07:45:11,2018-12-01 06:25:41,2018-02-28 03:57:11,2018-10-17 16:19:27 -602,Northrup,Limprecht,463-752-6075,Male,5,65,42,2018-11-03 02:27:29,2018-05-05 19:23:48,2018-02-18 06:54:36,2018-08-13 18:47:59 -603,Linoel,Havenhand,896-715-3769,Male,7,7,25,2018-05-10 18:45:39,2018-01-27 18:35:14,2018-06-14 18:17:37,2018-03-26 21:54:40 -604,Gerrilee,Morant,914-846-5569,Female,4,45,66,2018-02-17 20:40:10,2018-01-31 19:47:44,2018-10-09 22:28:47,2018-10-27 15:15:40 -605,Giralda,Daine,952-600-0863,Female,4,28,60,2018-06-15 19:09:55,2018-04-30 04:40:26,2018-09-14 06:48:06,2018-02-10 19:05:33 -606,Joela,Rand,808-932-6875,Female,1,27,3,2018-08-16 15:12:40,2018-09-27 15:12:49,2018-05-27 05:51:56,2018-04-13 14:52:35 -607,Obidiah,Beecham,324-361-0116,Male,7,72,18,2018-10-28 13:32:50,2018-06-20 18:58:47,2018-11-02 11:51:44,2018-03-11 23:29:03 -608,Karlik,Witherington,317-493-1871,Male,4,86,11,2019-01-20 03:58:33,2018-07-21 12:26:45,2018-08-23 20:09:48,2018-11-13 10:55:23 -609,Andras,Buttler,645-159-2747,Male,4,66,45,2018-05-19 10:32:36,2018-12-15 13:10:33,2018-01-31 23:04:41,2019-01-04 22:38:54 -610,Kevan,MacCorkell,902-102-9241,Male,5,35,56,2018-02-09 15:51:27,2018-07-17 04:54:50,2018-01-23 13:03:51,2018-07-12 19:59:05 -611,Dena,Welbelove,824-828-1515,Female,7,30,100,2018-03-13 11:53:11,2018-07-30 19:53:24,2019-01-12 19:12:36,2018-10-23 22:10:25 -612,Susette,Spurman,489-770-6265,Female,5,20,53,2018-05-08 12:17:52,2018-06-18 00:15:28,2018-04-14 14:12:49,2018-09-21 10:34:01 -613,Lisabeth,Clarycott,631-189-3198,Female,7,98,3,2018-08-30 00:26:48,2018-03-16 13:08:16,2018-10-12 07:44:50,2018-10-14 13:12:31 -614,Sheryl,Cicchinelli,508-453-8265,Female,6,77,4,2019-01-04 08:57:07,2018-07-27 00:56:42,2018-07-07 09:59:19,2018-08-03 11:54:06 -615,Milly,Harston,959-484-0888,Female,3,13,88,2018-05-02 06:02:08,2018-05-11 09:34:20,2019-01-11 22:42:26,2018-02-06 01:43:05 -616,Avery,Cant,144-536-3636,Male,5,59,83,2018-04-28 04:40:20,2018-02-20 10:21:26,2018-01-23 14:16:23,2018-06-13 17:25:06 -617,Odelle,Hauxley,311-843-6729,Female,2,15,33,2018-06-09 20:51:56,2018-03-22 15:09:29,2019-01-07 22:47:04,2018-10-30 05:38:26 -618,Symon,Dewi,944-566-4724,Male,6,79,26,2018-10-23 03:09:57,2018-04-20 15:52:10,2018-07-23 05:16:26,2018-09-05 13:15:24 -619,Nora,Ingerson,644-377-6341,Female,7,58,74,2018-12-31 01:35:50,2018-03-08 16:01:54,2018-04-02 13:25:27,2018-08-14 07:54:24 -620,Mariam,Ceschelli,722-520-3029,Female,5,65,57,2018-08-17 21:29:16,2018-11-14 18:13:13,2018-11-22 04:05:56,2018-03-25 21:13:21 -621,Guglielma,Fearey,399-683-0328,Female,2,48,46,2018-12-01 22:21:56,2018-05-05 09:53:28,2018-04-01 03:22:30,2018-10-31 05:13:13 -622,Putnem,Glanton,730-351-4499,Male,3,47,40,2018-05-06 05:22:19,2018-08-03 21:56:51,2018-07-27 03:42:36,2018-09-26 03:10:38 -623,Blancha,Penney,585-209-3640,Female,4,92,1,2018-04-24 13:18:47,2018-06-21 21:42:31,2018-03-11 01:50:30,2018-08-17 20:04:54 -624,Zacherie,Manoelli,211-774-0854,Male,7,41,38,2018-09-29 10:25:00,2018-11-03 11:49:35,2018-06-04 21:41:44,2018-10-24 16:29:50 -625,Seymour,Murphey,840-189-1695,Male,7,27,18,2018-11-22 02:51:55,2018-11-13 09:09:33,2018-04-26 15:24:33,2018-06-10 09:01:11 -626,Kiele,Potte,807-707-7776,Female,5,50,79,2018-12-10 09:07:14,2018-02-09 02:17:04,2018-12-02 09:39:41,2018-06-25 03:58:33 -627,Pascale,Keat,699-216-9743,Male,6,20,78,2018-11-23 01:30:15,2018-04-11 09:12:08,2018-03-14 20:14:59,2018-02-13 23:24:16 -628,Krisha,Sails,162-533-7679,Male,5,91,52,2019-01-17 01:56:16,2018-02-15 14:18:56,2018-03-05 23:19:21,2018-02-24 11:00:50 -629,Justen,McFeat,266-387-8084,Male,4,45,19,2018-10-17 20:09:40,2018-12-29 10:26:10,2018-07-21 12:46:49,2018-02-12 09:50:24 -630,Daloris,Adamson,173-669-4723,Female,4,46,42,2018-02-02 14:26:53,2018-08-15 00:31:20,2018-10-28 08:17:42,2018-04-21 16:28:19 -631,Saleem,Cawood,885-138-1413,Male,6,96,11,2018-09-04 09:51:41,2018-06-12 17:37:20,2018-12-09 22:22:56,2018-11-28 01:06:26 -632,Yettie,Glynn,672-547-0019,Female,3,84,66,2018-11-13 23:39:10,2018-07-14 16:14:12,2018-09-21 13:43:43,2018-09-29 15:57:10 -633,Waite,Smalls,320-394-9058,Male,4,2,55,2018-12-17 16:32:29,2018-11-15 01:45:06,2018-03-17 23:34:19,2018-03-06 15:12:35 -634,Tomkin,Adam,674-394-3276,Male,3,5,48,2018-02-07 03:48:38,2018-07-13 14:23:03,2018-06-02 14:48:09,2018-07-13 06:23:14 -635,Dilly,Strotone,507-532-7349,Male,2,63,15,2018-10-18 04:02:56,2018-08-29 04:49:57,2018-12-04 03:03:45,2018-10-13 05:54:24 -636,Townsend,Eytel,577-285-3662,Male,2,28,15,2018-06-01 12:29:01,2018-09-17 04:48:03,2018-08-12 21:57:59,2018-02-19 20:48:01 -637,Aurel,Taleworth,826-459-6823,Female,4,21,100,2018-08-04 08:00:57,2018-09-17 17:45:32,2018-10-01 19:40:32,2018-09-12 06:23:27 -638,Barnabe,Eldredge,303-934-8908,Male,1,96,66,2018-11-25 12:08:25,2018-09-28 04:15:54,2018-06-11 18:54:23,2018-01-29 01:27:18 -639,Brnaby,Kwietek,319-338-0342,Male,1,99,21,2018-07-11 05:00:49,2018-09-07 18:54:24,2019-01-02 06:20:42,2018-07-12 08:08:28 -640,Thea,Beamont,123-463-1082,Female,4,95,46,2018-03-04 16:30:12,2018-09-20 03:40:11,2018-07-15 14:34:10,2018-08-29 13:50:42 -641,Moyra,MacAne,973-363-3000,Female,3,50,66,2018-06-15 02:19:51,2018-07-18 23:41:04,2018-11-11 08:19:50,2018-07-28 23:40:30 -642,Luce,Hanmer,800-595-2765,Male,4,71,68,2018-12-29 07:24:16,2018-03-30 23:25:56,2018-12-20 17:22:17,2018-07-01 23:50:17 -643,Clement,Gobert,746-653-6801,Male,2,29,39,2018-03-16 20:33:17,2018-12-07 02:34:52,2018-12-12 16:45:55,2018-12-20 02:30:28 -644,Dalenna,Kingsnorth,366-634-1391,Female,5,42,29,2018-04-19 19:41:25,2018-11-24 02:02:50,2018-03-31 05:36:32,2018-07-16 23:22:03 -645,Gigi,MacGilrewy,807-983-4035,Female,2,5,59,2018-11-13 14:20:34,2018-09-08 20:54:02,2018-09-05 14:11:49,2018-06-05 21:12:39 -646,Josi,De Vere,191-357-7492,Female,3,26,63,2018-11-16 05:10:17,2018-05-10 22:27:04,2018-05-04 18:15:10,2018-06-28 04:26:52 -647,Ripley,Pedrozzi,564-644-3142,Male,4,81,64,2018-05-06 05:04:31,2018-09-08 07:15:00,2018-11-12 01:23:19,2018-08-14 01:45:01 -648,Angelina,Henriques,513-742-8132,Female,1,4,93,2018-08-13 00:14:12,2018-03-20 21:24:41,2018-08-07 23:30:14,2018-11-23 00:03:11 -649,Anthia,Dandy,983-456-4556,Female,4,7,96,2018-05-12 17:03:46,2018-12-07 05:19:51,2018-11-20 12:22:28,2018-10-03 06:06:09 -650,Audry,Mourge,237-352-0739,Female,3,87,13,2018-01-25 21:10:18,2018-04-08 08:11:55,2018-01-26 17:58:05,2018-11-22 16:05:01 -651,Konstanze,Skocroft,383-376-4511,Female,5,53,15,2018-07-06 21:47:19,2018-07-21 19:51:01,2019-01-05 19:31:14,2018-12-02 06:51:10 -652,Koo,Arington,553-175-9464,Female,4,51,72,2018-03-12 21:13:34,2018-01-29 22:50:56,2018-07-28 03:59:46,2018-09-08 20:40:26 -653,Mimi,Novakovic,282-495-5519,Female,2,13,7,2019-01-18 17:51:56,2018-03-21 21:03:27,2018-11-26 23:09:59,2018-02-15 16:11:04 -654,Aldus,Aguirrezabal,289-348-2177,Male,2,27,59,2018-11-06 12:55:08,2018-03-03 18:13:31,2018-04-12 18:22:35,2018-08-22 21:43:49 -655,Sullivan,Kelmere,595-312-2528,Male,1,42,45,2018-12-01 16:35:57,2018-10-25 18:48:22,2018-09-07 00:15:27,2018-04-27 11:34:49 -656,Taite,Ruffli,824-778-7852,Male,4,22,46,2018-07-28 22:54:17,2018-10-09 20:45:57,2018-08-03 04:38:39,2018-11-26 15:09:49 -657,Rosene,Missen,922-494-6731,Female,7,91,26,2018-08-17 20:06:33,2018-11-02 02:58:57,2018-03-05 00:03:11,2018-05-31 23:55:38 -658,Ty,Fucher,639-989-4144,Male,3,68,100,2018-07-22 01:36:24,2018-03-08 21:12:38,2018-05-04 21:30:03,2018-09-06 22:32:37 -659,Heddi,Assel,246-263-2031,Female,6,39,92,2018-02-15 08:32:02,2018-02-26 03:11:18,2018-01-27 11:33:06,2018-08-29 02:37:29 -660,Boonie,Djorvic,425-328-7219,Male,7,49,6,2018-02-11 23:21:23,2018-03-07 04:45:35,2019-01-16 02:27:45,2018-10-14 03:27:02 -661,Aurie,Esgate,216-596-1681,Female,4,44,39,2019-01-07 13:40:58,2018-09-29 18:40:04,2018-04-15 01:33:28,2018-11-16 00:59:28 -662,Dana,Edginton,762-855-7796,Male,7,11,7,2018-10-22 11:13:58,2018-02-25 07:53:13,2018-10-26 14:30:34,2018-02-21 08:22:28 -663,Christiana,Haslock(e),322-905-9384,Female,7,66,50,2018-04-08 07:38:08,2018-05-11 05:11:14,2018-03-13 07:31:38,2018-03-24 02:07:40 -664,Lelia,Kimmerling,462-373-6886,Female,2,22,47,2018-07-16 09:28:30,2018-01-31 12:00:37,2018-05-14 00:22:05,2018-04-02 06:04:19 -665,Kaleena,Ferrier,462-635-6827,Female,2,74,81,2018-06-05 11:09:52,2018-02-12 09:02:48,2018-09-11 19:00:25,2018-02-20 13:36:01 -666,Davon,Kroch,646-511-8893,Male,2,79,55,2018-08-11 12:22:33,2018-03-09 12:30:22,2018-10-04 12:31:33,2018-08-30 17:50:16 -667,Agathe,Kingwell,879-547-0641,Female,7,16,34,2018-06-12 18:22:16,2018-08-05 00:55:58,2018-12-27 12:31:25,2018-02-19 01:39:48 -668,Tami,Brum,925-535-6949,Female,6,13,16,2018-08-10 21:16:02,2018-07-10 10:42:55,2018-10-03 09:45:52,2018-09-02 08:04:13 -669,Meghan,Behan,666-973-3081,Female,2,37,72,2018-07-01 22:33:57,2018-12-23 00:46:46,2018-11-15 22:39:02,2018-02-15 12:20:24 -670,Elliott,Gumbley,891-324-8441,Male,3,100,20,2018-05-26 06:24:39,2018-08-24 00:11:20,2018-10-25 08:36:44,2018-03-14 08:39:54 -671,Roosevelt,Headan,845-354-1730,Male,5,3,90,2018-07-01 14:50:49,2018-09-15 12:12:40,2018-12-24 01:35:47,2018-09-20 01:17:08 -672,Judie,Cozins,719-163-5308,Female,6,64,26,2018-02-13 12:22:03,2018-11-17 08:43:37,2018-04-01 06:23:24,2018-09-21 04:32:48 -673,Zebulen,Bulger,201-223-1332,Male,5,98,53,2018-07-16 23:18:20,2018-05-29 12:17:27,2018-04-28 14:52:50,2018-06-12 16:22:23 -674,Lea,Fairpo,372-782-5016,Female,6,19,3,2018-09-03 14:58:22,2018-07-08 18:29:06,2018-05-16 18:23:32,2018-12-29 08:04:07 -675,Mayer,Demead,393-580-8088,Male,4,41,38,2018-09-26 07:35:23,2018-04-11 15:45:52,2018-03-27 15:23:59,2018-06-06 14:21:04 -676,Ana,Cannaway,492-510-5265,Female,7,61,68,2018-02-10 08:21:49,2019-01-17 12:57:29,2018-03-10 19:54:59,2018-05-05 03:55:19 -677,Cathrine,Featonby,618-545-3336,Female,2,13,20,2018-04-06 05:43:01,2018-08-08 21:16:04,2018-09-14 02:33:02,2018-02-21 21:27:00 -678,Wilt,Pitcher,482-827-8133,Male,3,100,4,2018-07-28 21:19:49,2018-05-26 09:01:20,2018-08-20 04:38:04,2018-12-20 10:33:58 -679,Mirabelle,Beric,266-468-3958,Female,5,22,72,2018-05-02 12:06:49,2018-04-08 13:34:02,2018-05-08 04:55:38,2018-04-08 07:43:46 -680,Kitti,Duell,600-603-0212,Female,6,63,11,2018-06-03 10:32:14,2018-02-28 16:15:11,2018-07-14 16:05:36,2018-12-09 20:55:23 -681,Pebrook,Tunuy,901-401-5075,Male,7,43,54,2018-05-03 21:20:23,2018-08-22 11:35:56,2019-01-16 05:29:13,2018-06-03 07:29:48 -682,Maryanna,Eayrs,722-426-6216,Female,1,44,84,2018-09-20 04:29:10,2018-03-25 00:25:02,2018-08-24 07:28:58,2019-01-03 12:51:01 -683,Obadias,Izzatt,379-850-7154,Male,6,6,27,2018-04-26 21:45:09,2018-02-05 01:27:51,2018-12-26 01:14:44,2018-08-29 23:20:18 -684,Cherye,Androletti,524-563-8173,Female,3,68,10,2018-04-21 19:56:00,2018-09-14 22:29:43,2018-12-29 20:14:49,2018-11-16 03:21:36 -685,Joachim,Dimitrescu,795-788-5797,Male,5,76,2,2018-12-11 21:33:57,2018-12-23 19:18:05,2018-11-25 10:00:13,2018-03-10 21:29:53 -686,Wynne,Heyward,438-352-0453,Female,2,24,17,2018-08-16 11:16:51,2018-07-01 06:49:35,2018-10-07 18:27:47,2018-12-09 16:04:47 -687,Renell,Ipwell,436-940-9778,Female,2,20,24,2018-11-20 12:06:05,2018-07-02 02:09:18,2018-09-08 02:49:34,2018-02-07 07:39:15 -688,Ricky,Alderson,299-400-6861,Male,6,41,97,2018-11-21 08:08:46,2018-08-15 09:54:31,2018-12-12 09:05:40,2018-11-13 16:44:40 -689,Rubi,Gail,300-475-1452,Female,4,37,26,2019-01-06 23:27:48,2018-11-12 10:44:21,2018-12-06 15:12:08,2018-03-19 12:15:14 -690,Sherill,Tallent,643-731-0806,Female,5,51,98,2018-10-30 15:13:26,2018-06-09 19:32:29,2018-02-06 16:40:35,2018-09-26 13:31:25 -691,Elia,Hairon,537-738-0445,Male,4,59,64,2018-06-18 11:14:46,2018-08-12 09:09:40,2018-03-22 09:13:44,2018-10-25 02:49:49 -692,Johny,Degoe,380-482-6021,Male,2,89,51,2018-12-18 10:28:50,2018-10-04 06:40:46,2018-05-17 13:11:00,2019-01-18 01:02:48 -693,Kirstin,Hopfer,520-920-5762,Female,7,7,29,2018-03-03 02:44:21,2018-07-08 01:31:26,2018-08-12 04:22:03,2018-10-07 12:47:55 -694,Addie,Hrycek,411-674-4016,Female,1,62,3,2018-08-02 04:43:18,2018-09-19 05:54:13,2018-09-30 17:33:04,2018-10-24 16:39:15 -695,Devinne,Dilrew,876-178-5135,Female,6,97,69,2018-01-22 00:39:19,2018-05-29 02:38:21,2018-10-17 03:17:47,2018-07-28 12:51:30 -696,Violet,Petren,352-136-0037,Female,3,20,80,2018-09-23 03:09:33,2018-05-22 01:24:08,2019-01-06 00:46:41,2018-04-13 04:27:36 -697,Inga,Cahalan,847-549-2394,Female,3,98,26,2018-03-24 12:37:49,2018-10-09 07:41:56,2019-01-07 22:18:43,2018-01-28 07:44:56 -698,Burg,Liepina,736-158-9051,Male,4,89,88,2018-02-04 05:58:15,2018-02-24 08:51:40,2018-12-01 18:20:15,2018-02-20 12:27:18 -699,Winnifred,Yakutin,165-178-2008,Female,1,74,93,2018-12-14 06:11:18,2018-12-23 02:09:43,2018-04-07 06:12:17,2018-08-16 08:12:28 -700,Boone,Walsom,432-415-6784,Male,3,91,63,2018-06-12 09:05:08,2018-09-21 04:24:21,2018-09-18 05:27:12,2018-09-10 10:46:37 -701,Alberto,Steadman,316-988-9996,Male,7,11,32,2019-01-13 23:25:22,2018-04-27 23:46:24,2018-12-07 20:28:14,2018-02-03 17:46:13 -702,Babbie,Ossulton,151-959-6676,Female,5,50,26,2018-08-25 20:54:00,2018-05-14 14:24:06,2019-01-14 14:14:51,2018-08-15 11:39:35 -703,Franni,Sparwell,411-855-1156,Female,6,95,65,2018-07-21 15:32:34,2018-07-03 10:42:20,2018-08-26 02:44:03,2018-04-13 05:52:48 -704,Carlos,MacNair,911-726-0315,Male,1,17,35,2018-12-05 14:25:42,2018-12-12 19:39:25,2018-04-29 02:34:46,2018-10-22 16:34:03 -705,Violetta,Crosbie,334-280-9073,Female,3,9,44,2018-01-30 22:36:27,2018-08-07 22:12:15,2018-11-27 09:47:02,2018-07-24 14:22:36 -706,Malanie,Perico,380-744-7181,Female,6,68,23,2019-01-03 09:08:46,2018-08-26 01:51:30,2018-12-02 23:44:58,2018-02-16 00:13:42 -707,Ivor,Bowcher,940-535-1313,Male,2,79,20,2018-09-05 08:48:25,2018-05-21 21:40:04,2018-05-02 19:33:24,2018-06-22 07:46:47 -708,Hyacinth,Trump,241-552-4852,Female,4,46,7,2018-02-27 17:57:22,2018-11-20 03:54:39,2018-10-27 00:44:50,2018-09-19 14:04:29 -709,Vittorio,Blincko,136-124-8825,Male,5,70,20,2018-12-17 01:45:05,2018-06-06 18:10:29,2018-12-01 18:11:21,2018-04-14 00:43:46 -710,Tadeas,Glendenning,676-274-2212,Male,3,70,6,2018-08-22 07:42:12,2018-07-12 17:41:15,2018-07-24 17:42:26,2018-12-27 05:34:05 -711,Sky,Flew,681-787-4952,Male,3,81,48,2018-11-13 09:16:39,2018-09-14 09:34:51,2018-09-23 01:44:43,2018-11-21 00:50:58 -712,Luise,Olivetti,707-121-6217,Female,4,68,4,2018-03-29 01:36:21,2018-05-06 13:38:59,2018-05-06 09:55:05,2018-02-04 21:27:46 -713,Drusy,Capinetti,432-896-1449,Female,5,94,80,2018-07-31 20:38:50,2018-11-28 22:41:39,2018-04-27 00:57:40,2018-08-30 16:16:05 -714,Miranda,Rissen,700-512-2672,Female,7,29,40,2018-03-15 22:30:44,2018-02-01 02:59:19,2018-11-25 08:02:09,2018-11-05 07:51:59 -715,Ario,Bashford,390-128-4254,Male,2,54,93,2018-06-14 08:22:43,2018-08-12 18:13:42,2018-11-28 21:40:32,2018-12-29 03:09:26 -716,Rochella,Shackesby,103-592-3468,Female,7,41,14,2018-02-12 09:44:28,2018-08-22 10:35:46,2019-01-09 02:25:18,2018-10-10 17:50:44 -717,Wes,Christofides,192-457-7659,Male,1,69,89,2018-05-29 07:31:48,2019-01-06 03:40:33,2018-02-04 22:20:47,2019-01-05 16:01:23 -718,Griselda,Lukes,232-886-4996,Female,2,96,24,2019-01-10 12:54:29,2019-01-16 20:13:57,2018-04-26 08:07:43,2018-10-11 15:19:29 -719,Dredi,Cooksey,432-670-0783,Female,2,24,32,2018-02-28 00:00:07,2018-06-20 03:18:14,2018-07-21 09:03:11,2018-07-06 03:35:06 -720,Coleman,Trudgian,273-535-1414,Male,4,97,47,2018-04-25 23:41:09,2018-03-11 00:03:13,2018-06-03 13:44:14,2018-08-08 09:07:58 -721,Averill,Shilstone,947-108-0865,Male,7,1,64,2018-08-18 22:21:07,2018-04-12 03:24:47,2018-03-10 08:58:27,2018-08-03 14:04:03 -722,Carmen,Syder,954-822-0919,Female,2,47,75,2018-10-09 09:52:34,2018-11-21 01:16:40,2018-02-12 03:27:35,2018-08-12 12:44:55 -723,Morgan,Leband,547-933-1630,Female,5,39,97,2018-03-25 07:19:57,2018-03-28 20:22:12,2018-09-05 13:29:46,2018-10-12 09:04:17 -724,Milzie,Fearnley,589-230-2628,Female,1,44,13,2018-05-17 23:12:31,2018-07-29 21:43:28,2018-07-06 23:27:59,2018-09-14 01:45:16 -725,Deb,Marjot,495-276-5931,Female,2,27,81,2018-09-28 15:27:35,2018-02-05 23:31:12,2018-07-29 04:18:34,2018-03-08 09:45:23 -726,Shayne,Artinstall,628-997-5039,Male,2,23,20,2018-11-19 12:44:15,2018-05-30 23:05:12,2018-11-23 10:18:23,2018-06-08 14:18:23 -727,Annabal,Standbridge,226-314-1568,Female,5,16,5,2018-08-11 00:40:31,2018-12-20 14:06:36,2018-04-15 04:33:53,2018-11-09 16:42:45 -728,Sheffield,Crielly,360-797-0933,Male,7,57,90,2018-03-08 03:32:17,2018-11-07 06:12:46,2019-01-12 22:10:52,2019-01-02 03:16:09 -729,Antonius,Delagua,336-343-1380,Male,2,64,60,2018-10-14 22:56:26,2018-11-13 00:50:03,2018-07-02 11:23:06,2018-08-09 09:29:32 -730,Brana,Cannell,157-563-3935,Female,2,74,73,2019-01-19 15:41:16,2018-04-20 09:34:06,2018-08-02 12:28:32,2018-02-21 06:29:31 -731,Bartram,Praundlin,631-372-3479,Male,2,35,7,2018-10-03 02:00:10,2018-07-31 21:29:22,2019-01-10 21:43:54,2018-08-28 13:29:28 -732,Anthiathia,Goodwins,664-616-3575,Female,7,76,19,2018-04-26 19:57:15,2018-10-28 17:07:05,2018-02-21 16:38:28,2018-04-18 17:58:31 -733,Deborah,Ekell,577-861-9112,Female,5,74,43,2018-10-19 06:10:04,2018-03-12 03:47:48,2018-05-17 13:04:37,2018-02-09 05:48:05 -734,Lauri,Arunowicz,862-427-5257,Female,4,58,81,2018-07-29 04:16:13,2018-04-23 19:30:17,2018-03-19 21:30:18,2018-11-18 20:46:33 -735,Fowler,Markus,496-831-3082,Male,7,18,52,2018-01-26 22:36:43,2019-01-14 00:15:25,2018-03-18 05:45:56,2018-02-27 16:55:19 -736,Klara,Ramme,103-225-9086,Female,7,28,67,2018-05-21 17:32:08,2018-10-05 08:11:16,2018-06-25 15:05:21,2018-03-13 14:44:42 -737,Melisenda,Chitham,158-699-0591,Female,2,49,88,2018-04-16 02:24:00,2018-10-27 14:52:15,2018-12-31 05:39:31,2018-12-09 09:15:25 -738,Hale,Layborn,106-961-8551,Male,3,66,90,2018-04-22 19:39:27,2018-08-12 19:37:50,2018-08-17 10:37:06,2018-09-14 15:17:48 -739,Ferdie,Stubbeley,686-279-8217,Male,7,62,96,2018-09-25 03:29:05,2018-06-27 23:31:12,2018-07-21 18:49:24,2018-06-19 05:08:00 -740,Licha,O' Kelleher,463-395-9023,Female,6,75,16,2018-07-05 08:29:21,2018-09-13 21:32:41,2018-08-26 17:50:16,2018-05-22 11:30:48 -741,Gualterio,Kernar,123-900-7702,Male,2,32,18,2018-12-30 04:11:35,2018-04-15 10:32:33,2018-06-21 01:01:16,2018-11-15 03:34:48 -742,Harley,Lyokhin,664-282-7716,Male,1,42,45,2018-07-26 12:07:21,2018-02-09 02:23:37,2018-05-10 13:39:44,2018-11-25 04:15:16 -743,Kylila,Hukin,726-438-0889,Female,2,2,74,2019-01-02 09:08:44,2018-04-07 07:18:19,2018-04-19 16:12:40,2018-03-03 19:00:47 -744,Natividad,Dahlbom,744-480-5437,Female,5,82,39,2018-12-30 01:10:05,2018-08-01 07:16:39,2018-05-29 02:44:28,2018-11-08 15:02:54 -745,Virgina,Couzens,947-544-5389,Female,6,14,38,2018-11-19 23:03:21,2018-11-21 13:32:21,2018-03-29 02:30:25,2018-12-31 17:15:49 -746,Peyter,Diano,292-294-3875,Male,2,23,76,2018-12-22 18:12:13,2018-09-23 11:29:07,2018-07-12 06:09:06,2018-07-28 01:53:40 -747,Jayme,O'Curneen,225-447-3103,Male,3,10,84,2018-06-20 10:29:48,2018-08-12 10:14:12,2018-04-28 06:15:40,2018-07-19 08:52:24 -748,Frederik,Wilkisson,963-312-1892,Male,3,4,18,2018-09-11 01:05:52,2018-05-17 07:03:54,2018-09-07 08:19:47,2018-12-27 05:51:37 -749,Yankee,Harrower,918-854-5590,Male,7,14,88,2019-01-12 12:01:21,2018-08-24 08:15:58,2018-06-19 00:06:07,2018-06-19 07:16:40 -750,Tamas,MacRinn,856-289-3684,Male,6,83,91,2018-05-18 15:58:10,2018-06-09 14:45:50,2018-06-16 17:21:20,2018-12-18 02:23:35 -751,Valentin,Rawlings,663-758-9646,Male,4,16,34,2018-06-27 02:03:36,2018-12-10 04:32:16,2018-07-07 05:22:18,2018-02-03 06:54:36 -752,Colver,Yarr,382-717-8711,Male,5,23,10,2018-05-13 09:06:22,2018-04-06 13:41:41,2018-05-07 22:03:59,2018-11-12 22:30:08 -753,Alisa,Gaynesford,417-789-3077,Female,2,87,12,2018-07-16 18:03:56,2018-02-06 07:27:34,2018-07-12 08:51:47,2018-02-22 19:25:29 -754,Xavier,Cornwell,777-401-4183,Male,7,12,13,2018-12-03 01:19:40,2018-05-30 23:16:32,2018-10-01 21:33:13,2018-04-13 23:28:08 -755,Hy,Raftery,563-495-4017,Male,7,54,93,2018-03-25 23:10:24,2018-11-20 07:01:06,2018-03-27 13:09:16,2018-08-03 19:07:10 -756,Holt,Rosenfeld,962-871-1674,Male,2,43,35,2018-08-07 04:15:12,2018-05-21 13:42:27,2018-11-13 19:28:52,2018-03-27 10:14:19 -757,Zola,Andreopolos,543-481-8409,Female,4,31,62,2018-02-08 17:26:50,2018-12-12 15:18:24,2018-02-22 22:58:13,2019-01-02 05:55:39 -758,Letty,Scotting,546-656-5808,Female,5,15,94,2018-10-21 18:22:43,2018-05-26 22:09:39,2018-08-04 15:48:15,2018-08-28 06:14:32 -759,Celina,Lauchlan,202-835-6732,Female,7,47,9,2018-02-26 21:58:16,2019-01-10 01:22:46,2018-11-03 06:10:35,2018-04-21 11:00:49 -760,Drusy,Izakov,129-552-5886,Female,1,45,2,2018-10-11 13:12:08,2018-06-26 11:16:28,2018-08-24 23:58:00,2018-09-09 05:46:23 -761,Shana,Ference,915-610-3990,Female,3,1,7,2018-10-31 18:47:12,2018-09-13 14:33:49,2018-10-02 08:57:46,2018-02-18 19:30:28 -762,Colin,Broy,868-631-8529,Male,2,22,32,2018-05-23 19:06:02,2018-09-08 07:49:35,2018-12-13 21:44:07,2018-06-25 07:15:53 -763,Farlay,Cromett,640-335-8081,Male,7,34,25,2018-06-29 00:34:53,2018-12-08 12:49:01,2018-12-03 13:22:54,2018-06-24 16:33:04 -764,Leandra,Hamberstone,786-332-2588,Female,2,37,90,2018-12-22 15:35:04,2018-02-04 16:23:41,2018-01-28 07:51:51,2018-06-01 00:25:34 -765,Gan,McCahey,450-198-7472,Male,2,79,7,2018-06-26 07:22:06,2018-09-27 09:42:20,2018-03-13 20:28:52,2018-02-10 02:05:39 -766,Brose,Gane,302-470-1094,Male,7,27,25,2018-11-05 10:16:11,2018-12-27 12:00:35,2018-12-13 06:00:05,2018-08-30 01:03:46 -767,Mabel,Nurdin,417-183-7374,Female,1,73,62,2018-12-09 01:11:47,2018-06-09 12:03:13,2018-11-30 04:52:49,2018-04-24 11:08:53 -768,Melinda,Belliard,277-126-4396,Female,6,39,83,2018-07-13 11:17:51,2018-08-04 10:46:43,2018-11-19 23:27:57,2018-02-19 10:08:24 -769,Percy,Yakolev,433-703-6347,Male,4,78,23,2018-11-02 23:32:50,2018-12-19 16:21:10,2018-02-17 21:43:15,2018-12-09 00:57:58 -770,Portia,Legonidec,761-180-7070,Female,6,27,1,2018-11-01 18:06:54,2018-05-16 10:56:05,2018-08-06 20:45:16,2018-08-14 23:11:03 -771,Harry,Lapley,950-309-5667,Male,5,8,58,2018-03-01 15:09:46,2018-05-13 05:24:49,2018-03-22 16:01:05,2018-08-18 02:05:37 -772,Cort,Gathwaite,964-902-3053,Male,5,33,89,2018-08-18 20:12:14,2018-01-27 16:39:37,2018-12-26 22:46:04,2018-02-16 22:31:58 -773,Moselle,Davidsson,813-238-6494,Female,4,13,60,2019-01-10 17:47:31,2018-11-04 08:31:17,2018-04-30 12:09:52,2018-04-14 19:47:23 -774,Avril,Britton,340-286-1678,Female,3,4,16,2018-03-18 00:19:38,2018-12-29 06:21:49,2019-01-03 02:03:40,2018-11-29 12:05:59 -775,Linn,Confait,176-807-2635,Female,6,18,70,2018-09-18 15:11:21,2018-05-02 18:32:49,2018-03-25 13:46:21,2018-10-06 04:29:26 -776,Joletta,Fyldes,547-358-7132,Female,3,92,6,2019-01-07 18:53:22,2018-09-07 21:09:08,2018-10-22 08:38:19,2018-07-08 07:01:37 -777,Alvira,Donnersberg,712-756-5926,Female,1,20,77,2018-06-09 12:41:30,2018-12-29 01:15:22,2018-02-11 19:44:50,2018-02-21 21:33:12 -778,Kirbee,Sherer,434-167-9643,Female,4,84,40,2018-10-18 16:54:05,2018-04-02 11:16:17,2018-02-26 17:45:53,2018-10-21 05:24:45 -779,Griffy,Guitton,326-132-8573,Male,4,60,19,2018-06-22 17:59:44,2018-09-11 16:22:32,2018-11-10 19:43:30,2018-02-06 10:06:41 -780,Emmott,Allitt,969-852-2661,Male,2,48,37,2018-04-24 21:17:55,2018-11-01 06:07:42,2018-07-30 22:56:18,2018-11-13 22:12:50 -781,Tailor,Dalman,521-811-9925,Male,5,60,72,2018-12-14 09:37:55,2018-12-26 17:43:11,2018-12-10 03:38:52,2018-04-07 11:21:07 -782,Brennen,Vasilechko,176-109-0551,Male,6,90,55,2018-08-31 12:29:00,2018-05-23 03:06:41,2018-10-10 17:44:50,2018-10-21 00:47:28 -783,Dotty,MacCallam,161-881-1371,Female,1,56,3,2018-03-01 02:18:19,2019-01-06 18:00:59,2018-04-28 10:26:11,2018-02-05 06:43:37 -784,Jedidiah,Guerin,645-152-7671,Male,5,56,83,2018-04-02 15:07:20,2018-08-24 12:42:12,2018-12-21 09:17:44,2018-10-06 00:19:03 -785,Hannie,Danes,716-637-6821,Female,5,40,18,2019-01-08 07:08:18,2019-01-05 20:40:19,2019-01-16 12:16:28,2018-03-23 12:28:41 -786,Galen,Scogin,453-714-4492,Male,6,38,18,2018-10-27 06:54:20,2018-06-19 09:26:07,2019-01-10 20:55:20,2018-10-18 17:04:44 -787,Aleta,Melonby,207-524-3356,Female,3,98,3,2018-04-04 12:13:59,2018-06-06 11:50:34,2018-05-05 17:38:56,2018-03-11 12:56:42 -788,Adlai,Mauchlen,601-977-7616,Male,7,88,64,2018-03-24 04:33:36,2018-03-07 16:46:25,2018-03-16 19:25:21,2018-07-20 14:23:29 -789,Amelie,Le Barre,576-950-1963,Female,5,28,53,2018-08-10 15:52:25,2018-05-07 07:19:32,2018-12-21 21:24:49,2018-07-21 01:11:54 -790,Rodrique,Lestor,723-918-4771,Male,4,26,72,2018-08-29 10:37:42,2018-11-16 09:49:01,2018-08-31 05:08:59,2018-12-18 10:17:32 -791,Gifford,Challoner,411-352-9364,Male,5,63,18,2018-10-16 12:33:24,2018-11-24 23:28:34,2018-05-29 22:33:36,2018-11-06 07:45:09 -792,Dorene,Pogosian,391-363-6103,Female,4,74,78,2018-04-26 20:52:42,2018-08-02 21:57:23,2018-04-29 21:18:02,2018-02-13 20:06:09 -793,Lynnell,De Filippi,418-713-4087,Female,7,78,47,2018-12-03 11:11:47,2019-01-05 12:23:37,2018-05-05 19:10:42,2018-04-22 16:11:38 -794,Tod,Willicott,354-257-4541,Male,5,34,18,2018-07-19 20:11:25,2018-08-12 01:02:55,2018-08-05 23:52:34,2018-02-15 00:20:31 -795,Myrlene,Wornham,331-165-6672,Female,7,51,75,2018-11-24 15:52:43,2018-07-01 06:12:47,2018-08-08 19:45:02,2018-11-19 14:51:56 -796,Sibyl,Burnsyde,981-826-0517,Female,2,24,2,2018-11-01 05:15:20,2018-10-15 22:30:33,2018-05-27 21:38:42,2018-05-08 15:34:52 -797,Barron,Hanrott,700-573-3103,Male,6,81,99,2018-08-12 21:14:38,2018-03-09 17:36:14,2018-06-03 16:23:47,2018-10-13 22:34:58 -798,Marylee,Hunnawill,501-536-2494,Female,7,30,33,2018-10-19 01:54:52,2018-04-12 03:02:28,2018-09-12 02:31:37,2018-06-14 10:58:08 -799,Chip,Hunnaball,249-377-3740,Male,3,98,59,2018-04-25 10:02:32,2019-01-18 16:00:40,2018-02-14 02:06:39,2018-06-17 23:32:24 -800,Major,Milsap,444-230-6774,Male,7,20,23,2018-03-11 15:00:30,2018-01-24 21:48:22,2018-12-27 13:31:21,2018-08-10 23:29:32 -801,Ashli,Romain,886-453-6140,Female,6,12,19,2018-02-24 23:38:53,2018-05-01 04:29:06,2018-06-03 17:41:53,2018-04-21 00:29:25 -802,Keeley,Frankom,894-599-8867,Female,3,30,4,2019-01-05 18:11:47,2018-03-25 21:31:27,2018-05-26 03:52:58,2018-10-23 16:17:28 -803,Curcio,Widmoor,934-987-4248,Male,5,23,84,2018-03-31 07:42:11,2018-10-25 03:00:08,2018-10-18 23:14:42,2018-05-07 19:58:59 -804,Crawford,Ballston,771-623-5016,Male,5,24,48,2018-12-27 07:13:13,2019-01-09 10:21:22,2018-05-20 08:49:26,2018-09-16 08:46:49 -805,Templeton,Snibson,650-275-2922,Male,3,55,83,2018-12-04 05:22:30,2018-09-29 21:23:56,2018-03-08 17:58:24,2018-08-15 02:38:52 -806,Gail,Peachment,906-123-1774,Male,4,59,13,2018-09-21 07:44:03,2018-08-02 22:34:51,2018-03-08 07:11:39,2018-08-25 15:39:59 -807,Adriano,Escale,888-817-1180,Male,3,92,78,2018-07-24 16:32:20,2018-02-22 12:50:50,2018-06-26 12:34:44,2018-06-06 08:04:35 -808,Trista,Tudgay,340-171-5505,Female,5,44,62,2018-09-04 12:09:41,2018-01-31 01:51:09,2018-09-13 08:38:11,2018-06-06 05:49:50 -809,Angie,Carradice,507-239-1908,Female,1,12,69,2018-08-13 18:36:13,2018-11-23 03:57:42,2018-06-17 07:44:13,2018-12-09 16:37:23 -810,Maureen,Perllman,116-299-8383,Female,1,91,1,2018-04-10 06:12:02,2018-08-02 04:31:50,2018-06-18 00:58:20,2018-10-12 02:31:31 -811,Renaud,Roylance,267-492-3743,Male,3,36,85,2018-02-05 00:59:50,2018-11-26 02:06:43,2018-11-16 00:25:18,2018-02-02 08:38:37 -812,Dasi,Rhucroft,505-753-6245,Female,4,96,84,2018-11-10 18:36:26,2018-07-17 05:54:10,2018-07-12 13:34:58,2018-11-10 01:57:49 -813,Arlee,Gerdts,220-186-9711,Female,6,76,30,2018-12-26 11:24:38,2018-11-21 22:09:49,2018-04-16 14:09:09,2018-05-27 06:24:32 -814,Darrel,Maseres,540-324-4576,Male,6,20,52,2018-01-25 13:38:00,2019-01-11 23:26:49,2018-07-10 03:23:20,2018-06-27 20:41:34 -815,Merle,Haggie,867-109-5010,Male,5,96,73,2018-05-11 09:41:28,2018-02-26 23:39:01,2019-01-18 06:20:26,2018-11-24 20:35:34 -816,Jordanna,Slocket,561-552-2274,Female,3,64,28,2018-06-05 00:07:31,2018-10-24 18:30:56,2018-04-11 09:26:10,2018-07-17 15:09:53 -817,Rosa,Naulty,104-742-5724,Female,1,49,36,2018-07-25 05:49:28,2018-12-11 01:12:50,2018-04-02 22:12:09,2019-01-03 01:54:51 -818,Abbott,Nenci,465-121-4813,Male,3,79,57,2018-11-14 21:12:41,2018-03-22 04:16:18,2018-08-26 18:31:33,2018-05-16 10:32:25 -819,Edsel,Brockley,602-592-8501,Male,1,30,96,2018-01-21 00:58:41,2018-12-18 18:52:15,2018-03-18 23:16:05,2018-11-22 00:32:00 -820,Rickie,Tace,237-311-6775,Female,4,14,43,2018-07-28 16:49:11,2018-12-14 07:30:09,2018-02-18 22:51:29,2018-06-05 16:20:34 -821,Shaun,Stagg,356-435-7464,Female,7,54,35,2018-09-08 08:01:19,2018-03-09 16:11:16,2019-01-16 17:00:44,2018-11-30 14:34:15 -822,Alfred,Durden,512-204-4387,Male,2,79,46,2018-12-31 13:42:16,2018-05-24 21:54:26,2018-07-10 23:33:53,2018-08-10 04:33:54 -823,Christoffer,Bolderstone,868-441-3575,Male,6,4,30,2018-11-03 00:46:09,2018-04-30 04:41:20,2018-07-26 23:17:02,2018-04-27 19:17:50 -824,Ellette,Robard,806-623-1247,Female,2,59,70,2018-01-31 22:31:04,2018-01-28 04:26:39,2018-06-10 10:50:30,2018-11-01 17:27:42 -825,Loren,Mitrovic,840-960-0930,Male,7,27,31,2018-11-09 15:53:11,2018-03-25 02:53:57,2018-12-15 15:59:47,2018-06-20 19:00:48 -826,Leigh,Beebee,483-570-2017,Male,5,56,99,2018-03-27 09:56:26,2018-09-05 03:40:42,2018-12-13 03:28:25,2018-11-23 13:45:15 -827,Debby,Beldham,686-330-6591,Female,5,65,17,2018-08-01 18:59:48,2018-03-24 14:20:35,2019-01-10 21:11:42,2018-12-19 08:48:47 -828,Barron,Lowell,115-742-2050,Male,5,85,65,2018-03-03 04:32:02,2018-04-24 11:36:33,2018-09-15 15:08:52,2018-06-25 22:46:54 -829,Randi,Skydall,223-820-2793,Male,2,86,47,2018-07-20 00:15:51,2018-06-26 06:23:43,2018-12-28 12:30:07,2018-08-25 21:27:50 -830,Isabel,Roggerone,927-569-8210,Female,4,85,41,2018-09-23 13:54:09,2018-03-09 05:31:36,2018-06-11 18:42:42,2018-04-13 18:03:27 -831,Alvan,Geake,401-432-6471,Male,5,71,66,2018-03-29 20:49:43,2018-04-25 14:10:14,2018-07-24 01:39:45,2018-12-24 09:39:46 -832,Sophey,Jeandel,338-361-7635,Female,6,60,18,2018-08-05 04:29:15,2018-09-21 05:26:30,2018-06-08 07:30:41,2018-12-27 19:45:07 -833,Howie,Maxsted,197-553-3905,Male,5,94,69,2018-08-25 23:10:38,2019-01-20 02:12:00,2019-01-15 20:11:44,2018-02-13 17:46:32 -834,Padraig,Torr,529-469-0039,Male,1,62,17,2018-03-14 04:21:56,2018-06-08 14:24:59,2018-10-08 09:31:56,2018-08-30 02:59:15 -835,Shirl,Jeratt,713-937-2841,Female,2,18,89,2018-09-25 03:56:45,2018-07-17 02:54:21,2019-01-08 21:13:42,2018-02-20 17:16:17 -836,Durward,Kermott,625-654-9223,Male,6,67,25,2018-02-14 15:04:10,2018-03-23 06:42:12,2018-09-16 13:56:48,2018-03-10 11:02:08 -837,Rici,Francie,992-830-9527,Female,5,75,22,2018-07-21 07:35:59,2018-01-24 21:24:42,2018-12-20 10:46:19,2018-04-27 01:28:33 -838,Vivian,Suddell,715-471-1918,Female,6,81,45,2018-07-29 02:06:46,2018-10-15 14:05:00,2018-06-12 17:01:30,2018-05-12 22:22:36 -839,Eugenia,Tudhope,527-791-1359,Female,2,95,25,2019-01-05 12:54:58,2018-12-12 20:07:15,2018-12-22 12:11:13,2018-12-25 06:49:43 -840,Hamnet,Gateman,792-883-5589,Male,1,84,45,2018-06-26 04:15:53,2018-02-21 14:45:49,2018-08-29 18:01:14,2019-01-15 09:03:43 -841,Laraine,Emma,256-645-5057,Female,3,88,52,2018-05-29 03:26:20,2018-03-10 02:05:24,2018-05-12 21:29:38,2018-12-10 02:39:56 -842,Harley,D'Ruel,359-498-9270,Male,4,16,57,2018-02-15 07:39:22,2018-08-24 22:23:10,2018-07-19 02:07:06,2018-02-13 01:45:52 -843,Theda,Eades,222-998-5683,Female,7,2,71,2018-03-06 07:09:18,2018-09-14 11:46:16,2018-11-23 01:07:59,2018-12-02 03:37:22 -844,Giselbert,Klimentyev,165-127-0115,Male,6,88,93,2018-11-13 03:56:59,2018-04-09 02:33:25,2018-07-04 00:34:57,2018-06-04 05:56:23 -845,Lynnet,Tidd,370-452-0577,Female,6,47,3,2018-08-25 20:45:24,2018-08-27 16:50:01,2018-08-22 21:33:48,2018-06-27 22:32:52 -846,Donetta,Giannassi,913-466-0403,Female,2,39,55,2018-02-26 16:34:20,2018-07-10 03:35:10,2018-09-29 14:23:34,2018-10-10 13:02:02 -847,Conrade,Ruddell,514-722-6544,Male,3,13,100,2018-05-31 18:14:29,2018-10-19 05:51:32,2018-11-22 09:45:08,2018-02-22 05:00:31 -848,Tynan,Ritchie,552-416-9192,Male,4,50,26,2018-02-13 01:36:31,2018-07-24 03:28:00,2018-02-22 16:37:36,2018-02-28 07:16:54 -849,Erv,Huggins,528-946-8385,Male,3,73,82,2018-03-23 14:37:41,2018-08-12 12:26:08,2018-02-09 16:56:21,2018-08-09 06:33:34 -850,Darby,Ambrogini,266-338-3612,Male,6,92,21,2018-04-27 07:57:01,2018-10-19 20:49:49,2018-02-10 16:39:59,2018-09-03 00:53:41 -851,Devondra,Boc,775-193-7341,Female,5,36,51,2018-10-18 04:36:21,2018-10-28 14:06:15,2018-03-25 15:47:47,2018-08-20 22:31:48 -852,Meggy,Paxforde,435-917-5199,Female,2,40,85,2018-08-27 05:39:35,2018-01-23 20:18:58,2018-02-01 16:43:58,2018-08-07 12:15:36 -853,Pattie,Macallam,901-370-6579,Female,1,4,32,2018-07-11 10:30:06,2018-10-01 12:33:55,2018-02-08 02:35:59,2018-11-30 18:29:14 -854,Ray,Thayre,822-459-4971,Male,7,13,79,2018-07-13 03:44:05,2018-07-07 04:47:58,2018-08-28 19:24:34,2018-08-13 10:49:03 -855,Sindee,Gong,919-731-7167,Female,6,23,3,2018-12-08 15:31:48,2018-04-27 17:10:40,2018-07-14 14:10:46,2018-09-23 22:25:52 -856,Giovanni,Elsie,739-171-4273,Male,3,100,20,2018-11-22 21:14:50,2018-09-29 00:12:07,2018-05-17 09:43:48,2018-04-05 15:26:17 -857,Hadley,Davidde,813-908-2619,Male,7,64,65,2018-01-31 19:26:32,2018-11-10 09:08:19,2018-06-20 20:16:01,2018-04-18 19:33:00 -858,Jud,Schleicher,248-874-9513,Male,1,24,8,2018-04-06 16:54:03,2018-12-08 11:46:05,2018-10-02 20:22:44,2018-04-27 09:04:18 -859,Berget,Rasmus,599-370-5265,Female,2,46,8,2018-11-11 16:46:30,2018-11-24 16:42:40,2019-01-05 12:53:51,2018-12-17 18:41:54 -860,Floris,Lelliott,495-754-4852,Female,1,35,72,2019-01-06 22:27:28,2018-06-14 07:45:20,2018-10-25 10:22:56,2018-07-09 00:48:19 -861,Marianna,Huge,136-171-1910,Female,1,92,73,2018-05-04 21:19:28,2018-04-08 18:45:35,2018-02-08 18:06:55,2018-07-12 04:08:00 -862,Federica,Seakings,778-573-1492,Female,5,42,100,2018-02-18 23:40:45,2018-08-29 22:07:35,2018-06-27 21:37:10,2018-06-27 18:13:29 -863,Christophorus,Tett,516-196-0657,Male,3,68,89,2018-09-28 20:37:26,2018-07-03 17:19:03,2018-04-20 09:01:09,2018-06-11 11:31:56 -864,Kathlin,Hubbart,400-384-9734,Female,5,75,62,2018-09-23 11:16:50,2018-11-22 07:00:07,2018-11-12 09:29:23,2018-03-19 17:19:13 -865,Toinette,Christophersen,222-218-6841,Female,4,81,80,2018-06-24 07:27:29,2018-03-08 17:25:42,2018-11-19 23:39:15,2018-04-02 19:04:26 -866,Mei,Dragon,891-366-6658,Female,2,14,22,2018-03-17 07:33:08,2018-06-23 20:11:56,2018-10-30 02:21:14,2018-10-21 08:13:29 -867,Wileen,Guittet,118-965-5819,Female,7,22,73,2018-04-12 00:04:07,2018-08-23 08:56:44,2018-07-09 08:29:36,2018-02-22 06:45:41 -868,Bill,Skechley,531-261-9052,Female,1,93,45,2018-03-25 13:30:53,2018-10-17 03:47:35,2018-10-18 02:26:47,2018-12-08 19:05:40 -869,Chrissy,Rapley,863-731-8995,Female,7,17,8,2018-09-12 01:35:07,2018-07-22 15:02:10,2018-06-18 19:06:47,2018-12-22 20:00:52 -870,Gwynne,Hymers,287-878-7144,Female,4,6,29,2018-08-19 13:41:56,2018-12-10 18:23:35,2018-03-26 01:25:26,2018-07-05 16:38:09 -871,Noland,Hornung,922-794-4200,Male,3,66,82,2018-12-10 23:49:55,2018-09-15 01:16:20,2018-10-24 20:37:00,2018-10-27 07:56:58 -872,Sybila,Caren,883-754-0514,Female,1,40,33,2018-11-01 03:29:07,2018-03-07 23:07:07,2018-09-06 01:46:46,2018-03-17 17:02:04 -873,Arnaldo,Ortelt,648-204-0219,Male,5,24,20,2018-04-19 00:26:30,2018-06-09 12:00:33,2018-09-30 00:21:33,2018-07-12 18:59:39 -874,Sascha,Thurner,504-586-1976,Male,4,9,34,2018-09-03 11:21:47,2018-12-06 09:23:43,2018-11-21 03:43:51,2018-05-28 10:34:36 -875,Janeva,Stallion,168-726-9745,Female,7,66,60,2018-07-05 04:40:09,2018-02-19 12:25:04,2018-05-31 06:47:34,2018-01-24 21:43:59 -876,Imelda,Daintrey,786-279-9676,Female,5,26,12,2018-07-29 01:32:45,2018-05-21 03:09:18,2018-10-03 07:09:16,2018-12-28 16:07:06 -877,Kaia,Pauleit,937-468-0457,Female,5,36,63,2018-08-20 03:23:06,2018-09-20 08:02:05,2018-05-13 23:35:38,2018-03-19 03:48:06 -878,Fons,Coton,673-868-5084,Male,6,51,39,2018-02-28 14:51:40,2018-08-02 02:13:10,2018-02-01 01:38:38,2018-09-22 00:49:46 -879,Amalee,Groneway,336-875-1596,Female,5,19,58,2018-04-12 20:12:37,2018-11-27 06:39:14,2018-09-18 01:05:22,2018-04-22 08:39:02 -880,Paquito,O'Dwyer,324-526-6202,Male,7,99,41,2018-10-12 02:35:53,2018-02-10 00:52:03,2018-02-07 03:12:35,2018-10-18 21:47:13 -881,Shea,Forst,307-995-7972,Female,1,41,41,2018-10-02 02:03:39,2018-10-24 23:10:36,2019-01-09 17:11:05,2018-05-16 22:15:02 -882,Sylvan,McKimm,999-270-7047,Male,1,21,29,2018-04-13 22:42:31,2018-12-10 08:47:39,2018-05-25 01:01:54,2018-04-17 08:03:17 -883,Peyter,Rotte,919-508-2810,Male,3,51,43,2018-05-25 10:20:40,2018-05-07 09:22:17,2018-10-29 16:34:13,2018-05-08 18:00:18 -884,Ernestine,Jankowski,998-337-8068,Female,3,7,44,2018-01-22 22:18:12,2018-11-04 08:03:53,2019-01-14 13:07:45,2018-01-25 10:53:54 -885,Bridget,Pettet,701-799-8814,Female,5,84,73,2018-04-24 13:06:17,2018-09-27 02:37:43,2018-11-23 08:52:31,2018-08-30 18:46:39 -886,Arlana,Wisniowski,321-679-5349,Female,7,1,72,2018-09-20 23:41:45,2018-07-29 00:16:49,2018-02-08 09:55:35,2018-04-07 15:34:38 -887,Darbie,Verzey,936-723-9548,Female,6,95,2,2018-09-15 23:29:11,2018-01-28 09:02:28,2018-12-05 08:05:15,2018-02-08 01:02:29 -888,Quintana,Nutley,896-674-7083,Female,3,38,16,2018-07-22 20:52:42,2018-09-19 19:39:52,2018-04-29 01:58:40,2018-07-30 22:07:46 -889,Padgett,Urwen,141-490-6319,Male,6,32,96,2018-05-09 19:03:45,2018-04-07 12:16:47,2018-07-17 13:53:15,2018-09-19 15:54:14 -890,Beret,Gilchrest,524-146-3660,Female,3,30,45,2018-12-09 18:08:35,2018-02-09 07:44:41,2019-01-09 06:31:54,2018-06-03 05:03:43 -891,Jacquette,McBlain,180-111-2719,Female,5,45,49,2018-08-25 23:50:05,2018-08-14 04:10:24,2018-06-28 01:21:56,2018-05-09 06:07:09 -892,Heriberto,Hardway,934-411-2153,Male,7,100,67,2018-08-12 07:20:08,2018-08-30 23:04:44,2018-08-09 09:18:15,2018-08-21 13:19:44 -893,Charo,Cheeney,934-194-4292,Female,2,79,49,2018-02-19 02:30:34,2018-07-26 21:32:10,2018-03-14 13:44:53,2019-01-02 19:07:53 -894,Barty,Delacour,352-181-7260,Male,7,68,1,2018-02-08 11:54:33,2018-12-22 15:26:11,2018-05-05 05:29:07,2018-01-28 16:34:01 -895,Arel,Qusklay,776-527-2939,Male,6,72,24,2018-02-10 23:05:47,2018-10-31 16:14:34,2018-04-17 06:36:20,2018-09-21 15:13:20 -896,Cleon,Westcarr,735-686-0389,Male,1,56,68,2018-12-14 09:21:13,2018-08-04 15:56:37,2018-09-09 11:38:56,2018-03-19 03:56:38 -897,Nicole,Gorrie,216-361-4858,Female,2,65,77,2018-08-05 12:50:07,2018-03-10 14:07:01,2018-02-15 13:44:04,2019-01-06 01:05:50 -898,Issiah,Patters,901-518-7348,Male,7,40,78,2018-04-27 08:43:08,2018-11-08 01:40:02,2018-02-05 13:31:35,2018-08-05 21:26:55 -899,Kimbell,Torvey,614-432-0846,Male,3,46,34,2018-10-10 17:10:59,2018-04-09 13:30:10,2018-12-26 11:39:55,2018-03-11 23:16:21 -900,Arabel,Reaney,250-158-0650,Female,1,39,42,2018-06-24 20:58:36,2018-06-13 01:05:57,2018-09-21 12:17:09,2018-05-12 01:20:04 -901,Lowrance,Birckmann,707-493-5823,Male,3,40,81,2018-10-30 04:51:25,2018-04-14 15:18:25,2018-11-26 23:12:20,2018-11-19 04:09:43 -902,Sande,Tinson,644-792-0309,Female,1,4,93,2018-06-05 12:30:15,2018-06-05 01:29:00,2018-04-13 08:38:54,2018-12-10 03:36:34 -903,Antonetta,Twelve,506-143-6120,Female,7,95,49,2018-10-15 14:45:58,2018-11-02 11:22:24,2018-02-20 23:03:06,2018-02-13 22:09:09 -904,Marietta,Christensen,356-415-2235,Male,5,80,58,2018-10-22 11:01:49,2018-02-01 17:42:35,2018-11-22 02:54:09,2018-09-30 12:05:18 -905,Jodee,Pietraszek,300-188-3774,Female,4,10,37,2018-10-23 06:33:49,2018-10-21 00:19:46,2018-11-29 18:55:51,2018-11-06 15:41:47 -906,Marthena,Kitson,601-214-9309,Female,4,28,26,2018-07-23 16:23:23,2018-06-22 12:00:30,2018-12-01 12:31:45,2018-12-23 15:09:43 -907,Daron,Mackison,682-377-7219,Female,4,89,96,2018-05-28 03:03:57,2018-03-02 01:25:11,2018-12-01 09:00:59,2018-02-21 02:24:22 -908,Hube,Feldhuhn,942-914-1709,Male,5,24,35,2018-10-02 04:25:27,2018-06-28 02:29:41,2018-02-06 01:40:17,2018-04-23 22:52:35 -909,Loretta,Pritty,613-563-4790,Female,7,75,82,2018-07-08 17:13:07,2018-11-22 22:05:00,2018-10-30 22:21:57,2018-08-13 01:05:15 -910,Cathyleen,McCallion,883-828-7510,Female,2,45,11,2018-09-09 14:13:19,2018-01-31 15:57:37,2018-08-13 04:55:36,2018-09-09 10:40:55 -911,Haleigh,Gleader,682-121-8965,Female,3,8,38,2018-12-20 06:38:29,2019-01-17 01:03:40,2019-01-19 16:23:53,2018-08-17 03:24:51 -912,Charles,Rosengarten,618-810-0078,Male,2,93,36,2018-10-15 16:20:15,2018-12-28 14:31:32,2018-09-12 08:52:44,2018-07-15 21:25:15 -913,Bjorn,Erskine Sandys,529-581-3333,Male,3,75,81,2018-04-14 17:13:49,2018-10-21 15:46:05,2018-05-28 06:44:30,2018-08-10 04:37:46 -914,Darill,Bostock,625-801-8242,Male,2,81,23,2018-10-11 19:47:21,2018-06-12 04:06:41,2019-01-15 07:56:54,2018-04-28 18:50:01 -915,Noellyn,Benwell,722-714-8266,Female,2,11,12,2018-02-15 07:48:35,2018-04-07 17:41:22,2018-05-18 02:39:40,2018-07-22 07:12:38 -916,Dov,Letrange,300-443-5277,Male,5,91,80,2018-12-27 15:44:06,2018-06-01 01:17:13,2018-06-04 08:44:49,2018-05-07 08:43:09 -917,Olympie,Louden,465-432-6397,Female,1,19,13,2018-01-25 05:55:27,2018-06-19 10:44:49,2018-10-06 16:38:12,2018-11-22 20:46:37 -918,Finley,Casbon,425-531-2684,Male,4,85,21,2018-09-04 05:24:44,2018-10-19 21:14:24,2018-09-24 15:11:59,2018-07-02 05:41:48 -919,Dewitt,Krolak,700-648-7734,Male,7,43,3,2018-04-11 09:56:52,2018-07-11 01:42:09,2018-02-28 00:53:56,2018-06-20 15:39:09 -920,Noby,De la Yglesia,405-211-0709,Male,4,1,49,2018-12-05 02:27:53,2018-07-03 10:21:49,2018-09-23 09:16:19,2018-05-12 09:47:56 -921,Aloysius,Baggs,272-379-1280,Male,2,40,53,2018-05-14 22:08:41,2018-12-03 09:03:58,2018-07-15 04:40:33,2018-09-15 06:12:36 -922,Karilynn,Costa,732-871-1192,Female,2,68,76,2018-12-29 05:05:50,2018-12-23 08:00:43,2018-04-13 17:50:47,2018-03-24 11:13:51 -923,Ky,Waggett,413-701-9663,Male,5,7,59,2018-02-05 06:17:54,2018-07-07 03:47:33,2018-09-13 00:11:05,2018-12-21 03:34:37 -924,Leeanne,Neasam,130-573-1360,Female,4,74,77,2018-11-30 04:33:22,2018-03-26 07:40:00,2018-05-03 16:40:09,2018-05-10 20:32:41 -925,Muffin,Eades,789-128-6773,Male,4,84,25,2018-04-19 09:16:22,2018-11-08 03:55:54,2018-02-03 05:36:52,2018-10-21 22:14:13 -926,Iormina,Baudry,644-418-1313,Female,4,72,19,2019-01-16 00:35:47,2018-11-23 14:35:13,2018-04-06 17:59:52,2018-02-24 14:59:31 -927,Fabe,Ziemke,161-651-6080,Male,6,36,12,2019-01-14 08:28:41,2018-10-28 13:42:55,2018-07-07 04:53:18,2018-08-04 15:37:00 -928,Danni,Leese,768-599-1814,Female,7,30,71,2018-11-08 21:26:44,2018-05-01 17:49:56,2018-08-03 00:06:41,2018-10-18 08:20:47 -929,Rycca,Petegre,433-887-8926,Female,4,5,34,2018-07-02 07:56:41,2018-02-10 11:51:30,2018-04-08 10:08:07,2018-06-11 19:43:31 -930,Berkie,Reveland,791-499-2738,Male,1,57,80,2018-07-18 08:14:02,2018-04-15 08:54:18,2018-09-25 23:13:59,2018-08-12 23:49:27 -931,Tommy,Swett,915-667-6497,Male,1,98,11,2018-06-26 21:33:59,2018-07-10 07:15:47,2018-07-15 03:48:37,2018-04-01 11:58:09 -932,Derrek,Perkinson,169-674-1053,Male,4,85,25,2018-08-23 05:51:09,2018-09-17 23:57:57,2018-03-06 01:30:46,2018-05-06 22:10:10 -933,Lonni,Polycote,996-492-4081,Female,2,7,6,2018-06-09 22:12:53,2018-04-09 09:26:53,2018-07-19 03:36:09,2018-12-01 16:50:15 -934,Phyllis,Gallamore,788-489-0287,Female,4,32,71,2018-07-08 11:07:20,2018-05-25 09:24:00,2018-04-23 04:53:35,2019-01-19 16:11:17 -935,Brittne,Caccavari,799-716-9817,Female,2,53,25,2018-12-11 00:47:47,2018-01-22 09:05:30,2018-09-30 14:03:22,2018-08-09 05:13:34 -936,Quinn,Torricina,342-560-9404,Female,3,60,72,2019-01-06 06:26:23,2018-11-21 02:21:54,2018-02-15 20:43:28,2018-08-15 17:59:55 -937,Jacklyn,Bohling,824-878-8873,Female,1,41,34,2018-06-23 18:52:40,2018-05-14 22:58:13,2018-06-08 07:11:42,2018-08-04 15:57:46 -938,Hunfredo,Millam,816-916-1240,Male,1,86,58,2019-01-08 04:02:45,2019-01-12 17:57:33,2019-01-20 14:58:14,2018-12-03 22:29:35 -939,Hymie,Vosse,980-181-0718,Male,4,67,59,2018-12-25 10:58:52,2018-03-09 06:50:03,2018-03-03 04:06:28,2018-07-17 18:26:14 -940,Olia,Wyse,875-970-0069,Female,4,54,96,2018-11-01 03:11:42,2018-12-29 18:01:06,2018-05-01 00:58:58,2018-08-29 17:41:08 -941,Arline,Bierton,582-902-5400,Female,4,36,83,2018-11-19 01:06:41,2018-07-20 08:22:25,2018-02-15 09:56:13,2018-07-07 12:00:06 -942,Nevsa,Jacquot,393-800-6240,Female,3,76,100,2018-12-03 03:10:20,2018-10-05 15:30:34,2018-07-03 08:10:26,2019-01-15 02:21:14 -943,Analise,Bechley,178-276-2761,Female,4,10,4,2018-08-03 05:49:50,2018-12-25 22:04:16,2019-01-18 22:16:01,2018-03-07 14:10:26 -944,Siffre,Cumbridge,484-369-3900,Male,1,30,98,2018-11-08 05:35:17,2018-07-06 03:41:16,2018-03-26 11:58:13,2018-10-05 22:55:01 -945,Berget,Oldred,470-380-7016,Female,2,34,3,2018-12-24 01:06:10,2018-03-01 08:09:07,2018-08-27 19:47:44,2018-07-15 17:16:39 -946,Aaron,Arnison,195-265-7576,Male,4,68,94,2018-06-02 08:58:18,2018-08-03 00:56:00,2018-05-06 14:32:24,2018-02-16 07:54:16 -947,Fay,Sarfas,659-275-5381,Female,6,34,96,2019-01-02 00:06:51,2018-12-05 05:47:36,2018-04-22 03:52:40,2018-09-20 19:16:51 -948,Pennie,Rappaport,851-746-8484,Female,5,74,57,2018-06-13 14:50:19,2018-05-10 00:00:37,2018-05-03 15:48:50,2018-12-06 19:15:10 -949,Ennis,Schindler,685-873-8208,Male,2,9,15,2018-12-06 10:23:57,2018-06-05 08:10:38,2018-08-19 04:20:22,2018-08-31 04:33:19 -950,Sean,Breckwell,511-213-8051,Male,4,65,20,2018-06-20 04:24:36,2018-12-24 06:27:41,2018-07-17 12:13:34,2018-06-02 06:09:01 -951,Carlene,Vials,130-632-1736,Female,2,71,12,2018-03-26 06:16:26,2018-03-25 23:10:14,2018-03-02 15:43:13,2018-06-01 08:30:44 -952,Nerita,Paolinelli,943-836-6191,Female,2,88,24,2018-11-19 20:39:05,2018-09-18 20:22:25,2018-07-16 13:15:28,2018-12-21 02:47:25 -953,Benoite,Gheorghescu,378-772-1101,Female,4,78,44,2018-11-09 02:22:49,2019-01-09 18:23:07,2018-04-05 11:06:02,2018-05-14 05:39:56 -954,Erik,Auchterlonie,766-720-0406,Male,1,17,56,2018-03-01 23:55:26,2018-10-18 17:00:40,2018-07-12 00:30:26,2018-11-30 15:38:30 -955,Jesse,Laurenty,586-274-7629,Female,2,10,63,2018-08-16 12:07:51,2018-05-30 23:14:43,2018-06-19 02:24:42,2018-03-17 09:24:46 -956,Lynnet,Cuel,652-339-4808,Female,1,26,91,2018-11-05 19:14:13,2018-11-22 14:06:17,2018-12-25 13:52:54,2018-10-28 04:14:09 -957,Marge,Adnet,901-394-6344,Female,7,46,51,2018-02-21 02:14:23,2018-12-29 22:39:34,2018-03-27 11:48:32,2019-01-05 10:26:02 -958,Clara,Rangeley,154-876-9501,Female,6,73,50,2018-07-06 13:52:31,2018-05-28 12:09:22,2018-09-08 04:19:54,2018-09-02 19:04:27 -959,Ciel,Ching,205-133-7293,Female,7,26,19,2018-06-13 01:00:22,2018-06-26 05:13:24,2018-03-12 09:15:19,2018-06-29 23:55:03 -960,Phebe,Pentecust,671-551-3717,Female,6,79,26,2018-07-17 05:39:55,2018-05-28 11:52:54,2018-11-17 17:20:32,2018-07-27 07:39:40 -961,Koralle,Doleman,733-411-3555,Female,4,50,86,2018-10-28 12:28:47,2018-04-19 14:24:23,2018-04-19 20:04:57,2018-11-03 19:27:30 -962,Gypsy,Ashard,627-318-6598,Female,4,84,97,2018-10-29 08:41:04,2018-04-12 21:17:30,2019-01-12 05:14:18,2018-08-11 13:20:16 -963,Zebedee,Guilayn,442-936-9333,Male,3,35,49,2018-06-20 19:42:39,2019-01-19 12:44:29,2018-10-03 09:52:26,2018-11-23 22:02:46 -964,Waldemar,Isaak,931-973-9119,Male,4,82,45,2018-04-23 15:37:02,2018-05-09 15:24:30,2018-02-14 08:08:10,2018-07-03 18:15:44 -965,Zackariah,Donaway,407-803-4328,Male,1,89,1,2018-07-08 18:27:27,2018-03-04 22:13:59,2018-12-18 03:57:10,2018-07-07 10:37:23 -966,Amie,Graddon,806-683-2495,Female,7,24,48,2018-08-12 05:59:08,2018-02-02 02:33:10,2018-12-27 15:24:26,2018-09-09 14:21:34 -967,Homere,Hinkes,540-511-8058,Male,2,18,21,2018-02-15 19:40:23,2018-03-12 20:21:06,2018-07-24 20:35:51,2018-11-05 01:00:48 -968,Hildy,Romaint,578-715-3279,Female,1,64,42,2018-08-05 12:04:55,2018-10-30 20:39:13,2018-11-01 10:01:51,2018-10-13 16:01:35 -969,Norbie,Reinhardt,522-463-8856,Male,6,73,39,2018-12-26 16:31:22,2018-05-04 07:05:54,2018-11-01 19:36:06,2018-08-22 23:10:40 -970,Farlee,Robb,921-988-0129,Male,2,92,32,2018-09-25 21:50:48,2018-01-29 06:17:06,2018-12-05 20:31:07,2018-10-13 17:19:53 -971,Husain,Coomes,167-999-0871,Male,7,43,13,2018-06-22 13:30:21,2018-10-26 10:44:10,2019-01-18 20:06:38,2018-12-02 03:52:12 -972,Milo,Ikringill,848-791-7005,Male,6,93,81,2018-04-23 10:40:56,2018-11-16 14:25:18,2018-05-08 11:02:49,2018-09-27 02:14:23 -973,Bendite,Ivan,797-480-5441,Female,4,19,47,2018-03-24 15:48:07,2019-01-18 21:56:06,2018-12-06 11:16:03,2018-03-11 17:19:09 -974,Dall,Hewson,361-271-3138,Male,7,51,12,2018-12-01 16:04:22,2018-07-19 15:52:08,2018-11-26 22:45:09,2018-02-12 13:20:52 -975,Alfonse,Paddell,215-108-6430,Male,3,67,39,2018-07-20 13:46:01,2019-01-09 15:28:08,2018-05-15 18:34:09,2018-09-24 12:02:27 -976,Rachelle,Parysowna,448-408-3939,Female,6,75,37,2019-01-08 01:40:17,2019-01-14 14:50:14,2018-09-08 20:13:56,2018-08-26 17:34:13 -977,Vlad,Massimo,958-382-7108,Male,6,83,50,2019-01-10 14:14:56,2018-04-03 09:05:13,2018-07-12 05:33:43,2018-08-03 07:52:29 -978,Orran,Labarre,603-601-4448,Male,1,62,88,2018-08-02 15:34:45,2018-11-25 10:40:27,2018-02-25 06:26:19,2018-08-02 08:35:57 -979,Goldi,McGaw,418-474-0723,Female,4,92,65,2018-03-02 17:07:20,2018-03-04 17:41:59,2018-08-24 13:07:56,2018-11-04 17:29:39 -980,Ddene,O'Halloran,269-505-5567,Female,5,40,82,2018-07-19 04:42:22,2018-10-21 20:43:40,2018-05-31 18:32:46,2018-05-27 23:48:19 -981,Franciska,Randalston,518-473-9956,Female,2,31,23,2018-08-10 19:43:25,2018-07-27 07:50:34,2018-09-05 22:19:23,2018-07-03 10:32:00 -982,Izak,Aaronson,559-374-9622,Male,3,42,87,2018-08-15 00:25:50,2018-04-15 10:04:12,2018-06-28 14:35:41,2018-01-21 11:06:29 -983,Trey,Battany,836-241-1102,Male,2,15,41,2019-01-10 17:37:08,2018-09-21 17:33:14,2018-10-31 07:41:53,2018-05-02 04:23:23 -984,Monty,Print,851-362-4374,Male,1,72,54,2018-07-29 11:59:40,2018-02-03 04:49:31,2019-01-10 13:05:52,2018-12-15 23:29:32 -985,Ashton,Cunnah,780-629-9147,Male,4,45,20,2018-02-10 13:25:53,2018-12-25 15:32:25,2018-01-23 10:29:44,2018-05-31 16:54:21 -986,Becky,Stavers,700-388-4222,Female,6,10,79,2018-03-04 20:32:59,2018-06-13 23:55:18,2018-06-02 22:41:53,2018-11-04 01:01:48 -987,Udall,Undrell,187-686-5781,Male,3,62,28,2018-07-29 04:00:33,2018-08-10 09:03:52,2018-12-20 19:09:22,2019-01-08 10:29:39 -988,Wait,Kippie,649-986-8035,Male,6,59,99,2018-08-26 01:11:54,2018-11-11 11:43:07,2018-11-26 18:10:23,2018-05-03 06:50:49 -989,Laurence,Dubs,725-348-9456,Male,5,80,78,2018-12-29 16:41:25,2018-03-04 01:25:41,2018-07-24 13:07:42,2018-03-02 01:22:54 -990,Cyrille,Ansley,464-181-4696,Male,7,71,25,2018-10-12 23:36:32,2018-05-18 07:03:48,2018-12-20 18:06:28,2018-09-16 15:37:18 -991,Emory,Manwell,415-640-8797,Male,5,12,56,2018-07-21 03:32:53,2018-11-15 00:05:50,2018-06-11 19:00:20,2018-03-30 06:39:44 -992,Chevalier,Pelosi,210-721-7355,Male,1,3,53,2018-09-10 01:51:52,2018-08-05 09:51:36,2018-07-09 12:50:42,2018-12-20 17:33:50 -993,Vale,Havenhand,885-493-5138,Male,5,37,72,2018-11-01 03:19:32,2018-11-02 06:12:05,2019-01-18 19:09:41,2018-07-29 06:54:36 -994,Shel,Kislingbury,683-829-9112,Female,2,57,75,2018-07-06 02:01:25,2018-11-17 02:11:03,2018-07-20 22:39:14,2018-05-08 16:48:52 -995,Kris,Rodear,296-572-9182,Male,5,24,22,2018-05-21 05:50:41,2018-12-04 14:27:38,2018-09-01 22:26:00,2018-09-05 14:46:56 -996,Jillayne,Mackerel,971-775-5324,Female,4,77,29,2018-08-29 09:36:26,2018-09-18 17:04:42,2018-12-08 03:41:26,2018-11-28 11:52:45 -997,Wilona,Yonnie,985-459-5111,Female,4,36,62,2018-08-07 01:17:54,2018-08-25 03:30:42,2018-02-17 20:26:24,2018-03-09 21:08:39 -998,Herbert,Liver,278-295-4343,Male,1,10,92,2018-04-27 00:14:36,2018-08-27 15:24:57,2018-02-11 18:53:26,2018-05-05 07:57:16 -999,Charmian,Robison,320-515-4401,Female,4,66,52,2018-11-29 19:32:40,2018-09-14 07:10:38,2018-07-04 09:36:16,2018-02-20 20:59:30 -1000,Cad,Alster,344-476-5489,Male,6,50,52,2018-09-12 09:49:44,2018-04-09 17:52:16,2018-12-18 02:15:47,2018-04-22 03:31:11 diff --git a/vitess-mixin/e2e/external_db/mysql/grant.sh b/vitess-mixin/e2e/external_db/mysql/grant.sh deleted file mode 100755 index 9371377d074..00000000000 --- a/vitess-mixin/e2e/external_db/mysql/grant.sh +++ /dev/null @@ -1,7 +0,0 @@ - -echo '**********GRANTING PRIVILEGES START*******************' -echo ${mysql[@]} -# PURGE BINARY LOGS BEFORE DATE(NOW()); -mysql --protocol=socket -uroot -hlocalhost --socket=/var/run/mysqld/mysqld.sock -p$MYSQL_ROOT_PASSWORD -e \ -"GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD'" -echo '*************GRANTING PRIVILEGES END****************' diff --git a/vitess-mixin/e2e/external_db/mysql/mysql56.cnf b/vitess-mixin/e2e/external_db/mysql/mysql56.cnf deleted file mode 100644 index fdd34b1bd2e..00000000000 --- a/vitess-mixin/e2e/external_db/mysql/mysql56.cnf +++ /dev/null @@ -1,41 +0,0 @@ -[mysqld] -# Options for enabling GTID -# https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-howto.html -gtid_mode = ON -log_bin -log_slave_updates -enforce_gtid_consistency - -# Crash-safe replication settings. -master_info_repository = TABLE -relay_log_info_repository = TABLE -relay_log_purge = 1 -relay_log_recovery = 1 - -# Native AIO tends to run into aio-max-nr limit during test startup. -innodb_use_native_aio = 0 - -# Semi-sync replication is required for automated unplanned failover -# (when the master goes away). Here we just load the plugin so it's -# available if desired, but it's disabled at startup. -# -# VTTablet will enable semi-sync at the proper time when replication is set up, -# or when a primary is promoted or demoted based on the durability policy configured. -plugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so - -# 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 -server-id = 1 -# Remove ONLY_FULL_GROUP_BY until queries are fixed -sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" - -general_log = 1 -general_log_file = /var/log/mysql/query.log - -slow_query_log = 1 -long_query_time = 1 # seconds -slow_query_log_file = /var/log/mysql/slow.log \ No newline at end of file diff --git a/vitess-mixin/e2e/external_db/mysql/mysql57.cnf b/vitess-mixin/e2e/external_db/mysql/mysql57.cnf deleted file mode 100644 index ebf301187eb..00000000000 --- a/vitess-mixin/e2e/external_db/mysql/mysql57.cnf +++ /dev/null @@ -1,43 +0,0 @@ -# This file is auto-included when MySQL 5.7 is detected. - -# MySQL 5.7 does not enable the binary log by default, and -# info repositories default to file -[mysqld] -gtid_mode = ON -log_slave_updates -enforce_gtid_consistency -expire_logs_days = 3 -master_info_repository = TABLE -relay_log_info_repository = TABLE -relay_log_purge = 1 -relay_log_recovery = 1 - -# In MySQL 5.7 the default charset is latin1 - -character_set_server = utf8 -collation_server = utf8_general_ci - -# Semi-sync replication is required for automated unplanned failover -# (when the master goes away). Here we just load the plugin so it's -# available if desired, but it's disabled at startup. -# -# VTTablet will enable semi-sync at the proper time when replication is set up, -# or when a primary is promoted or demoted based on the durability policy configured. -plugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so - -# 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 - -## Specific edits for this external_db ## -log_bin -server-id = 1 -general_log = 1 -general_log_file = /var/log/mysql/query.log - -slow_query_log = 1 -long_query_time = 1 # seconds -slow_query_log_file = /var/log/mysql/slow.log diff --git a/vitess-mixin/e2e/externaldb_vreplication.sh b/vitess-mixin/e2e/externaldb_vreplication.sh deleted file mode 100755 index 1138909aa13..00000000000 --- a/vitess-mixin/e2e/externaldb_vreplication.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash - -# Copyright 2020 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. - -set -ex - -VTCTLD_SERVER=${VTCTLD_SERVER:-'vtctld:15999'} - -# Wait until source and destination primaries are available -until (/vt/bin/vtctlclient --server $VTCTLD_SERVER ListAllTablets | grep "ext_" | grep "primary" ); do - echo 'waiting for external primary..'; - sleep 1; -done - -until (/vt/bin/vtctlclient --server $VTCTLD_SERVER ListAllTablets | grep -v "ext_" | grep "primary" ); do - echo 'waiting for managed primary..'; - sleep 1; -done - - -# Get source and destination tablet and shard information -TABLET_INFO=$(/vt/bin/vtctlclient --server $VTCTLD_SERVER ListAllTablets) -source_alias=$(echo "$TABLET_INFO "| grep "ext_" | grep "primary" | awk '{ print $1 }') -dest_alias=$(echo "$TABLET_INFO "| grep -v "ext_" | grep "primary" | awk '{ print $1 }') -source_keyspace=$(echo "$TABLET_INFO "| grep "ext_" | grep "primary" | awk '{ print $2 }') -dest_keyspace=$(echo "$TABLET_INFO "| grep -v "ext_" | grep "primary" | awk '{ print $2 }') -source_shard=$(echo "$TABLET_INFO "| grep "ext_" | grep "primary" | awk '{ print $3 }') -dest_shard=$(echo "$TABLET_INFO "| grep -v "ext_" | grep "primary" | awk '{ print $3 }') -source_tablet=$(echo "$TABLET_INFO "| grep "ext_" | grep "primary" | awk '{ print $2 "/" $3}') -dest_tablet=$(echo "$TABLET_INFO "| grep -v "ext_" | grep "primary" | awk '{ print $2 "/" $3}') - - -# Disable foreign_key checks on destination -/vt/bin/vtctlclient --server $VTCTLD_SERVER ExecuteFetchAsDba $dest_alias 'SET GLOBAL FOREIGN_KEY_CHECKS=0;' - -# Get source_sql mode -source_sql_mode=$(/vt/bin/vtctlclient --server $VTCTLD_SERVER ExecuteFetchAsDba $source_alias 'SELECT @@GLOBAL.sql_mode' | awk 'NR==4 {print $2}') - -# Apply source sql_mode to destination -# The intention is to avoid replication errors -/vt/bin/vtctlclient --server $VTCTLD_SERVER ExecuteFetchAsDba $dest_alias "SET GLOBAL sql_mode='$source_sql_mode';" - -# Verify sql_mode matches -[ $source_sql_mode == $(/vt/bin/vtctlclient --server $VTCTLD_SERVER ExecuteFetchAsDba $dest_alias 'SELECT @@GLOBAL.sql_mode' | awk 'NR==4 {print $2}') ] && \ -echo "Source and Destination sql_mode Match." || echo "sql_mode MisMatch" - -until /vt/bin/vtctlclient --server $VTCTLD_SERVER GetSchema $dest_alias; do - echo "Waiting for destination schema to be ready.."; - sleep 3; -done - -# Copy schema from source to destination shard -/vt/bin/vtctlclient --server $VTCTLD_SERVER CopySchemaShard $source_tablet $dest_tablet || true - -# Verify schema -/vt/bin/vtctlclient --server $VTCTLD_SERVER GetSchema $dest_alias - -# Start vreplication -/vt/bin/vtctlclient --server $VTCTLD_SERVER VReplicationExec $dest_alias 'insert into _vt.vreplication (db_name, source, pos, max_tps, max_replication_lag, tablet_types, time_updated, transaction_timestamp, state) values('"'"''"$dest_keyspace"''"'"', '"'"'keyspace:\"'"$source_keyspace"'\" shard:\"'"$source_shard"'\" filter: > on_ddl:EXEC_IGNORE '"'"', '"'"''"'"', 9999, 9999, '"'"'primary'"'"', 0, 0, '"'"'Running'"'"')' - -# Check vreplication status -/vt/bin/vtctlclient --server $VTCTLD_SERVER VReplicationExec $dest_alias 'select * from _vt.vreplication' - diff --git a/vitess-mixin/e2e/fix_replication.sh b/vitess-mixin/e2e/fix_replication.sh deleted file mode 100755 index e6a06c71124..00000000000 --- a/vitess-mixin/e2e/fix_replication.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/bash - -# 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 helper script to sync replicas for mysql. -# It handles the special case where the primary has purged bin logs that the replica requires. -# To use it place a mysql dump of the database on the same directory as this script. -# The name of the dump must be $KEYSPACE.sql. The script can also download the mysqldump for you. -# Replication is fixed by restoring the mysqldump and resetting the replica. -# https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-disable-gtids.html -# https://www.percona.com/blog/2013/02/08/how-to-createrestore-a-slave-using-gtid-replication-in-mysql-5-6/ - -cd "$(dirname "${BASH_SOURCE[0]}")" - -function get_replication_status() { - # Get replica status - STATUS_LINE=$(mysql -u$DB_USER -p$DB_PASS -h 127.0.0.1 -e "SHOW SLAVE STATUS\G") - LAST_ERRNO=$(grep "Last_IO_Errno:" <<< "$STATUS_LINE" | awk '{ print $2 }') - SLAVE_SQL_RUNNING=$(grep "Slave_SQL_Running:" <<< "$STATUS_LINE" | awk '{ print $2 }') - SLAVE_IO_RUNNING=$(grep "Slave_IO_Running:" <<< "$STATUS_LINE" | awk '{ print $2 }') - MASTER_HOST=$(grep "Master_Host:" <<< "$STATUS_LINE" | awk '{ print $2 }') - MASTER_PORT=$(grep "Master_Port:" <<< "$STATUS_LINE" | awk '{ print $2 }') - - echo "Slave_SQL_Running: $SLAVE_SQL_RUNNING" - echo "Slave_IO_Running: $SLAVE_IO_RUNNING" - echo "Last_IO_Errno: $LAST_ERRNO" -} - -function reset_replication() { - # Necessary before sql file can be imported - echo "Importing MysqlDump: $KEYSPACE.sql" - mysql -u$DB_USER -p$DB_PASS -h 127.0.0.1 -e "RESET MASTER;STOP SLAVE;CHANGE MASTER TO MASTER_AUTO_POSITION = 0;source $KEYSPACE.sql;START SLAVE;" - # Restore Master Auto Position - echo "Restoring Master Auto Setting" - mysql -u$DB_USER -p$DB_PASS -h 127.0.0.1 -e "STOP SLAVE;CHANGE MASTER TO MASTER_AUTO_POSITION = 1;START SLAVE;" -} - -# Retrieve replication status -get_replication_status - -# Exit script if called with argument 'status' -[ ${1:-''} != 'status' ] || exit 0; - -# Check if SLAVE_IO is running -if [[ $SLAVE_IO_RUNNING = "No" && $LAST_ERRNO = 1236 ]]; then - - echo "Primary has purged bin logs that replica requires. Sync will require restore from mysqldump" - if [[ -f $KEYSPACE.sql ]] ; then - echo "mysqldump file $KEYSPACE.sql exists, attempting to restore.." - echo "Resetting replication.." - reset_replication - else - echo "Starting mysqldump. This may take a while.." - # Modify flags to user's requirements - if mysqldump -h $MASTER_HOST -P $MASTER_PORT -u$DB_USER -p$DB_PASS --databases $KEYSPACE \ - --triggers --routines --events --hex-blob --master-data=1 --quick --order-by-primary \ - --no-autocommit --skip-comments --skip-add-drop-table --skip-add-locks \ - --skip-disable-keys --single-transaction --set-gtid-purged=on --verbose > $KEYSPACE.sql; then - echo "mysqldump complete for database $KEYSPACE" - echo "Resetting replication.." - reset_replication - else - echo "mysqldump failed for database $KEYSPACE" - fi - fi - -else - - echo "No Actions to perform" - -fi diff --git a/vitess-mixin/e2e/grafana/provisioning/dashboards/dashboard.yml b/vitess-mixin/e2e/grafana/provisioning/dashboards/dashboard.yml deleted file mode 100644 index edfcd4f2271..00000000000 --- a/vitess-mixin/e2e/grafana/provisioning/dashboards/dashboard.yml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: 1 - -providers: -- name: 'Vitess Mixin' - orgId: 1 - folder: '' - type: file - disableDeletion: false - editable: true - options: - path: /etc/grafana/provisioning/dashboards \ No newline at end of file diff --git a/vitess-mixin/e2e/grafana/provisioning/datasources/datasource.yml b/vitess-mixin/e2e/grafana/provisioning/datasources/datasource.yml deleted file mode 100644 index a2140b8834e..00000000000 --- a/vitess-mixin/e2e/grafana/provisioning/datasources/datasource.yml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: 1 - -deleteDatasources: - - name: Prometheus - orgId: 1 - -datasources: - -- name: Prometheus - type: prometheus - access: proxy - orgId: 1 - url: http://prometheus:9090 - user: - database: - basicAuth: false - basicAuthUser: - basicAuthPassword: - withCredentials: - isDefault: true - version: 1 - editable: true \ No newline at end of file diff --git a/vitess-mixin/e2e/lfixrepl.sh b/vitess-mixin/e2e/lfixrepl.sh deleted file mode 100755 index bd3e5646019..00000000000 --- a/vitess-mixin/e2e/lfixrepl.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# 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. - -# Enable tty for Windows users using git-bash or cygwin -if [[ "$OSTYPE" == "msys" ]]; then - # Lightweight shell and GNU utilities compiled for Windows (part of MinGW) - tty=winpty - script=//script//fix_replication.sh -fi - -# This is a convenience script to fix replication on replicas. -exec $tty docker-compose exec ${CS:-vttablet2} ${script:-/script/fix_replication.sh} "$@" \ No newline at end of file diff --git a/vitess-mixin/e2e/lmysql.sh b/vitess-mixin/e2e/lmysql.sh deleted file mode 100755 index d735e3783a8..00000000000 --- a/vitess-mixin/e2e/lmysql.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# 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. - -# Enable tty for Windows users using git-bash or cygwin -if [[ "$OSTYPE" == "msys" ]]; then - # Lightweight shell and GNU utilities compiled for Windows (part of MinGW) - tty=winpty -fi - -# This is a convenience script to run mysql client against the local example. -exec $tty docker-compose exec ${CS:-vttablet101} mysql "$@" diff --git a/vitess-mixin/e2e/load_test.sql b/vitess-mixin/e2e/load_test.sql deleted file mode 100644 index 71e7d805386..00000000000 --- a/vitess-mixin/e2e/load_test.sql +++ /dev/null @@ -1,46 +0,0 @@ --- INSERT TEST DATA --- mysql --port=15306 --host=127.0.0.1 < load_test.sql --- SIMULATED QUERIES --- mysqlslap -c 5 --port=15306 --host=127.0.0.1 --iterations=1000 --create-schema=test_keyspace:80-@primary --query="SELECT * FROM messages;" --- mysqlslap -c 5 --port=15306 --host=127.0.0.1 --iterations=1000 --create-schema=test_keyspace:80-@replica --query="SELECT * FROM messages;" --- mysqlslap -c 5 --port=15306 --host=127.0.0.1 --iterations=1000 --create-schema=lookup_keyspace:-@primary --query="SELECT * FROM messages_message_lookup;" --- mysqlslap -c 5 --port=15306 --host=127.0.0.1 --iterations=1000 --create-schema=lookup_keyspace:-@replica --query="SELECT * FROM messages_message_lookup;" --- SIMULATED ERRORS --- ╰─$ mysqlslap --port=15306 --host=127.0.0.1 --iterations=10000 --create-schema=test_keyspace:80-@primary --query="SELECT name FROM messages;" --- ╰─$ mysqlslap --port=15306 --host=127.0.0.1 --iterations=10000 --create-schema=lookup_keyspace:-@replica --query="SELECT name FROM messages_message_lookup;" - -USE test_keyspace:80-@primary; -INSERT INTO messages (page,time_created_ns,message) VALUES -(1,1,'test'), -(2,2,'test'), -(3,3,'test'), -(4,4,'test'), -(5,5,'test'), -(6,6,'test'), -(7,7,'test'), -(8,8,'test'), -(9,9,'test'); - -USE test_keyspace:-80@primary; -INSERT INTO messages (page,time_created_ns,message) VALUES -(10,1,'test'), -(11,2,'test'), -(12,3,'test'), -(13,4,'test'), -(14,5,'test'), -(15,6,'test'), -(16,7,'test'), -(17,8,'test'), -(18,9,'test'); - -USE lookup_keyspace:-@primary; -INSERT INTO messages_message_lookup (id,page,message) VALUES -(1,1,'test'), -(2,2,'test'), -(3,3,'test'), -(4,4,'test'), -(5,5,'test'), -(6,6,'test'), -(7,7,'test'), -(8,8,'test'), -(9,9,'test'); diff --git a/vitess-mixin/e2e/lookup_keyspace_vschema.json b/vitess-mixin/e2e/lookup_keyspace_vschema.json deleted file mode 100644 index f67289821fe..00000000000 --- a/vitess-mixin/e2e/lookup_keyspace_vschema.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "sharded": true, - "tables": { - "messages_message_lookup": { - "column_vindexes": [ - { - "column": "id", - "name": "hash" - } - ] - }, - "tokens_token_lookup": { - "column_vindexes": [ - { - "column": "id", - "name": "hash" - } - ] - } - }, - "vindexes": { - "hash": { - "type": "hash" - } - } -} \ No newline at end of file diff --git a/vitess-mixin/e2e/lvtctl.sh b/vitess-mixin/e2e/lvtctl.sh deleted file mode 100755 index 64110743073..00000000000 --- a/vitess-mixin/e2e/lvtctl.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# 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. - -# Enable tty for Windows users using git-bash or cygwin -if [[ "$OSTYPE" == "msys" ]]; then - # Lightweight shell and GNU utilities compiled for Windows (part of MinGW) - tty=winpty -fi - -# This is a convenience script to run vtctlclient against the local example. -exec $tty docker-compose exec ${CS:-vtctld} vtctlclient -server vtctld:15999 "$@" diff --git a/vitess-mixin/e2e/package-lock.json b/vitess-mixin/e2e/package-lock.json deleted file mode 100644 index d686ef99233..00000000000 --- a/vitess-mixin/e2e/package-lock.json +++ /dev/null @@ -1,1483 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@cypress/request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", - "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "6.10.4", - "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - } - }, - "@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@types/node": { - "version": "18.17.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.17.tgz", - "integrity": "sha512-cOxcXsQ2sxiwkykdJqvyFS+MLQPLvIdwh5l6gNg8qF6s+C7XSkEWOZjK+XhUZd+mYvHV/180g2cnCcIl4l06Pw==", - "dev": true - }, - "@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true - }, - "@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", - "dev": true - }, - "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "cachedir": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", - "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cypress": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.2.0.tgz", - "integrity": "sha512-AvDQxBydE771GTq0TR4ZUBvv9m9ffXuB/ueEtpDF/6gOcvFR96amgwSJP16Yhqw6VhmwqspT5nAGzoxxB+D89g==", - "dev": true, - "requires": { - "@cypress/request": "^3.0.0", - "@cypress/xvfb": "^1.2.4", - "@types/node": "^18.17.5", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.6.0", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", - "commander": "^6.2.1", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.4", - "enquirer": "^2.3.6", - "eventemitter2": "6.4.7", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-ci": "^3.0.0", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.8", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "process": "^0.11.10", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "semver": "^7.5.3", - "supports-color": "^8.1.1", - "tmp": "~0.2.1", - "untildify": "^4.0.0", - "yauzl": "^2.10.0" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eventemitter2": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "requires": { - "pify": "^2.2.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "requires": { - "async": "^3.2.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "requires": { - "ci-info": "^3.2.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true - }, - "listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true - }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "qs": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/vitess-mixin/e2e/package.json b/vitess-mixin/e2e/package.json deleted file mode 100644 index ccc95ba93b0..00000000000 --- a/vitess-mixin/e2e/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "license": "Apache-2.0", - "devDependencies": { - "cypress": "^13.2.0" - } -} diff --git a/vitess-mixin/e2e/prometheus/prometheus.yml b/vitess-mixin/e2e/prometheus/prometheus.yml deleted file mode 100644 index bd8fe98dfa7..00000000000 --- a/vitess-mixin/e2e/prometheus/prometheus.yml +++ /dev/null @@ -1,61 +0,0 @@ -global: - scrape_interval: 5s - scrape_timeout: 2s - -rule_files: - - prometheus_rules.yaml - -scrape_configs: - - job_name: vitess-vtctld - metrics_path: /metrics - static_configs: - - targets: - - 'vtctld:8080' - - job_name: vitess-vtgate - metrics_path: /metrics - static_configs: - - targets: - - 'vtgate:8080' - - job_name: vitess-vttablet - metrics_path: /metrics - static_configs: - - targets: - - 'vttablet101:8080' - - 'vttablet102:8080' - - 'vttablet201:8080' - - 'vttablet202:8080' - - 'vttablet301:8080' - - 'vttablet302:8080' - # Mock mysql exporter for vttablet - - job_name: mysql - metrics_path: /metrics - static_configs: - - targets: - - 'mysqld_exporter:9104' - metric_relabel_configs: - - source_labels: [ instance ] - target_label: instance - action: replace - replacement: vttablet101:8080 - # Mock node exporter for vtgate - - job_name: node-exporter-vitess-vtgate - metrics_path: /metrics - static_configs: - - targets: - - 'node-exporter:9100' - metric_relabel_configs: - - source_labels: [ instance ] - target_label: instance - action: replace - replacement: vtgate:8080 - # Mock node exporter for vttablet - - job_name: node-exporter-vitess-vttablet - metrics_path: /metrics - static_configs: - - targets: - - 'node-exporter:9100' - metric_relabel_configs: - - source_labels: [ instance ] - target_label: instance - action: replace - replacement: vttablet101:8080 diff --git a/vitess-mixin/e2e/run-forever.sh b/vitess-mixin/e2e/run-forever.sh deleted file mode 100755 index 51e511be77a..00000000000 --- a/vitess-mixin/e2e/run-forever.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# 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. - -while true -do - $@ - sleep 2 -done diff --git a/vitess-mixin/e2e/schemaload.sh b/vitess-mixin/e2e/schemaload.sh deleted file mode 100755 index b8f13ee8812..00000000000 --- a/vitess-mixin/e2e/schemaload.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash -e - -# Copyright 2020 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. - -sleeptime=${SLEEPTIME:-0} -targettab=${TARGETTAB:-"${CELL}-0000000101"} -schema_files=${SCHEMA_FILES:-'create_messages.sql create_tokens.sql create'} -vschema_file=${VSCHEMA_FILE:-'default_vschema.json'} -load_file=${POST_LOAD_FILE:-''} -external_db=${EXTERNAL_DB:-'0'} -export PATH=/vt/bin:$PATH - -sleep $sleeptime - -if [ ! -f schema_run ]; then - while true; do - vtctlclient -server vtctld:$GRPC_PORT GetTablet $targettab && break - sleep 1 - done - if [ "$external_db" = "0" ]; then - for schema_file in $schema_files; do - echo "Applying Schema ${schema_file} to ${KEYSPACE}" - vtctlclient -server vtctld:$GRPC_PORT ApplySchema -sql-file /script/tables/${schema_file} $KEYSPACE || \ - vtctlclient -server vtctld:$GRPC_PORT ApplySchema -sql "$(cat /script/tables/${schema_file})" $KEYSPACE || true - done - fi - echo "Applying VSchema ${vschema_file} to ${KEYSPACE}" - - vtctlclient -server vtctld:$GRPC_PORT ApplyVSchema -vschema_file /script/${vschema_file} $KEYSPACE || \ - vtctlclient -server vtctld:$GRPC_PORT ApplyVSchema -vschema "$(cat /script/${vschema_file})" $KEYSPACE - - echo "List All Tablets" - vtctlclient -server vtctld:$GRPC_PORT ListAllTablets - - if [ -n "$load_file" ]; then - # vtgate can take a REALLY long time to come up fully - sleep 60 - mysql --port=15306 --host=vtgate < /script/$load_file - fi - - touch /vt/schema_run - echo "Time: $(date). SchemaLoad completed at $(date "+%FT%T") " >> /vt/schema_run - echo "Done Loading Schema at $(date "+%FT%T")" -fi diff --git a/vitess-mixin/e2e/tables/create_dinosaurs.sql b/vitess-mixin/e2e/tables/create_dinosaurs.sql deleted file mode 100644 index ee9a5b624da..00000000000 --- a/vitess-mixin/e2e/tables/create_dinosaurs.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE TABLE dinosaurs ( - id BIGINT UNSIGNED, - time_created_ns BIGINT UNSIGNED, - name VARCHAR(255), - PRIMARY KEY (id) -) ENGINE=InnoDB; \ No newline at end of file diff --git a/vitess-mixin/e2e/tables/create_eggs.sql b/vitess-mixin/e2e/tables/create_eggs.sql deleted file mode 100644 index 7e74c50b5a1..00000000000 --- a/vitess-mixin/e2e/tables/create_eggs.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE TABLE eggs ( - id BIGINT UNSIGNED, - time_created_ns BIGINT UNSIGNED, - species VARCHAR(255), - PRIMARY KEY (id) -) ENGINE=InnoDB; \ No newline at end of file diff --git a/vitess-mixin/e2e/tables/create_messages.sql b/vitess-mixin/e2e/tables/create_messages.sql deleted file mode 100644 index 44c4cc16e87..00000000000 --- a/vitess-mixin/e2e/tables/create_messages.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE TABLE messages ( - page BIGINT(20) UNSIGNED, - time_created_ns BIGINT(20) UNSIGNED, - message VARCHAR(10000), - PRIMARY KEY (page, time_created_ns) -) ENGINE=InnoDB; \ No newline at end of file diff --git a/vitess-mixin/e2e/tables/create_messages_message_lookup.sql b/vitess-mixin/e2e/tables/create_messages_message_lookup.sql deleted file mode 100644 index 1eb667dac93..00000000000 --- a/vitess-mixin/e2e/tables/create_messages_message_lookup.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE messages_message_lookup ( - id BIGINT NOT NULL AUTO_INCREMENT, - page BIGINT UNSIGNED, - message VARCHAR(1000), - PRIMARY KEY (id), - UNIQUE KEY idx_message_page (`message`, `page`) -) ENGINE=InnoDB; \ No newline at end of file diff --git a/vitess-mixin/e2e/tables/create_tokens.sql b/vitess-mixin/e2e/tables/create_tokens.sql deleted file mode 100644 index 69f1be03dec..00000000000 --- a/vitess-mixin/e2e/tables/create_tokens.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE TABLE tokens ( - page BIGINT(20) UNSIGNED, - time_created_ns BIGINT(20) UNSIGNED, - token VARCHAR(255) DEFAULT NULL, - PRIMARY KEY (page, time_created_ns) -) ENGINE=InnoDB; \ No newline at end of file diff --git a/vitess-mixin/e2e/tables/create_tokens_token_lookup.sql b/vitess-mixin/e2e/tables/create_tokens_token_lookup.sql deleted file mode 100644 index d3208fdfc41..00000000000 --- a/vitess-mixin/e2e/tables/create_tokens_token_lookup.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE tokens_token_lookup ( - id BIGINT NOT NULL AUTO_INCREMENT, - page BIGINT UNSIGNED, - token VARCHAR(255) DEFAULT NULL, - PRIMARY KEY (id), - UNIQUE KEY idx_token_page (`token`, `page`) -) ENGINE=InnoDB; \ No newline at end of file diff --git a/vitess-mixin/e2e/tables/lookup_keyspace_schema_file.sql b/vitess-mixin/e2e/tables/lookup_keyspace_schema_file.sql deleted file mode 100644 index e9c66144176..00000000000 --- a/vitess-mixin/e2e/tables/lookup_keyspace_schema_file.sql +++ /dev/null @@ -1,16 +0,0 @@ -CREATE TABLE tokens_token_lookup ( - id BIGINT NOT NULL AUTO_INCREMENT, - page BIGINT UNSIGNED, - token VARCHAR(255) DEFAULT NULL, - PRIMARY KEY (id), - UNIQUE KEY idx_token_page (`token`, `page`) -) ENGINE=InnoDB; - -CREATE TABLE messages_message_lookup ( - id BIGINT NOT NULL AUTO_INCREMENT, - page BIGINT UNSIGNED, - message VARCHAR(1000), - PRIMARY KEY (id), - UNIQUE KEY idx_message_page (`message`, `page`) -) ENGINE=InnoDB; - diff --git a/vitess-mixin/e2e/tables/test_keyspace_schema_file.sql b/vitess-mixin/e2e/tables/test_keyspace_schema_file.sql deleted file mode 100644 index b049e4ef211..00000000000 --- a/vitess-mixin/e2e/tables/test_keyspace_schema_file.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE messages ( - page BIGINT(20) UNSIGNED, - time_created_ns BIGINT(20) UNSIGNED, - message VARCHAR(10000), - PRIMARY KEY (page, time_created_ns) -) ENGINE=InnoDB; - -CREATE TABLE tokens ( - page BIGINT(20) UNSIGNED, - time_created_ns BIGINT(20) UNSIGNED, - token VARCHAR(255) DEFAULT NULL, - PRIMARY KEY (page, time_created_ns) -) ENGINE=InnoDB; - diff --git a/vitess-mixin/e2e/tablet.yml b/vitess-mixin/e2e/tablet.yml deleted file mode 100644 index 86cc8316a41..00000000000 --- a/vitess-mixin/e2e/tablet.yml +++ /dev/null @@ -1,24 +0,0 @@ -externalConnections: - erpl: - flavor: FilePos - host: external_db_host - port: 3306 - dbName: commerce - app: - user: external_db_user - password: external_db_password - dba: - user: external_db_user - password: external_db_password - filtered: - user: external_db_user - password: external_db_password - repl: - user: external_db_user - password: external_db_password - appdebug: - user: external_db_user - password: external_db_password - allprivs: - user: external_db_user - password: external_db_password \ No newline at end of file diff --git a/vitess-mixin/e2e/test_keyspace_vschema.json b/vitess-mixin/e2e/test_keyspace_vschema.json deleted file mode 100644 index 55d0df96204..00000000000 --- a/vitess-mixin/e2e/test_keyspace_vschema.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "sharded": true, - "tables": { - "messages": { - "column_vindexes": [ - { - "column": "page", - "name": "hash" - }, - { - "column": "message", - "name": "messages_message_lookup" - } - ] - }, - "tokens": { - "column_vindexes": [ - { - "column": "page", - "name": "hash" - }, - { - "column": "token", - "name": "tokens_token_lookup" - } - ] - } - }, - "vindexes": { - "hash": { - "type": "hash" - }, - "messages_message_lookup": { - "type": "lookup_hash", - "params": { - "table": "lookup_keyspace.messages_message_lookup", - "from": "message", - "to": "page", - "autocommit": "true" - }, - "owner": "messages" - }, - "tokens_token_lookup": { - "type": "lookup_hash", - "params": { - "table": "lookup_keyspace.tokens_token_lookup", - "from": "token", - "to": "page", - "autocommit": "true" - }, - "owner": "tokens" - } - } -} \ No newline at end of file diff --git a/vitess-mixin/e2e/vtcompose/base_vschema.json b/vitess-mixin/e2e/vtcompose/base_vschema.json deleted file mode 100644 index b867400e5ee..00000000000 --- a/vitess-mixin/e2e/vtcompose/base_vschema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "sharded": true, - "vindexes": { - "hash": { - "type": "hash" - } - }, - "tables": { - } -} diff --git a/vitess-mixin/e2e/vtcompose/docker-compose.base.yml b/vitess-mixin/e2e/vtcompose/docker-compose.base.yml deleted file mode 100644 index 2f2fbc12c70..00000000000 --- a/vitess-mixin/e2e/vtcompose/docker-compose.base.yml +++ /dev/null @@ -1,58 +0,0 @@ -version: "2.1" -services: - consul1: - image: consul:latest - hostname: "consul1" - ports: - - "8400:8400" - - "8500:8500" - - "8600:8600" - command: "agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0" - consul2: - image: consul:latest - hostname: "consul2" - expose: - - "8400" - - "8500" - - "8600" - command: "agent -server -retry-join consul1 -disable-host-node-id" - depends_on: - - consul1 - consul3: - image: consul:latest - hostname: "consul3" - expose: - - "8400" - - "8500" - - "8600" - command: "agent -server -retry-join consul1 -disable-host-node-id" - depends_on: - - consul1 - # This is a convenience container to quickly test vitess against an external database. - # In practice you will point Vitess to your existing database and migrate to a Vitess managed cluster. - external_db_host: - build: - context: ./external_db/mysql - dockerfile: Dockerfile - restart: always - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-pass} - MYSQL_DATABASE: ${DB:-commerce} - MYSQL_USER: ${DB_USER:-external_db_user} - MYSQL_PASSWORD: ${DB_PASS:-external_db_password} - volumes: - - ./external_db/mysql/:/docker-entrypoint-initdb.d/ - - ./external_db/mysql/log:/var/log/mysql - command: - - --server-id=1 - - --log-bin=mysql-bin - - --gtid_mode=ON - - --enforce_gtid_consistency - - --general_log=1 - - --slow_query_log=1 - healthcheck: - test: "/usr/bin/mysql --user=root --password=$${MYSQL_ROOT_PASSWORD} --execute \"SHOW DATABASES;\"" - timeout: 10s - retries: 10 - ports: - - "3306" \ No newline at end of file diff --git a/vitess-mixin/e2e/vtcompose/docker-compose.test.yml b/vitess-mixin/e2e/vtcompose/docker-compose.test.yml deleted file mode 100644 index e6928d73acc..00000000000 --- a/vitess-mixin/e2e/vtcompose/docker-compose.test.yml +++ /dev/null @@ -1,303 +0,0 @@ -# This file was generated by running `go run vtcompose/vtcompose.go` with no arguments. - -services: - consul1: - command: agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0 - hostname: consul1 - image: consul:latest - ports: - - 8400:8400 - - 8500:8500 - - 8600:8600 - consul2: - command: agent -server -retry-join consul1 -disable-host-node-id - depends_on: - - consul1 - expose: - - "8400" - - "8500" - - "8600" - hostname: consul2 - image: consul:latest - consul3: - command: agent -server -retry-join consul1 -disable-host-node-id - depends_on: - - consul1 - expose: - - "8400" - - "8500" - - "8600" - hostname: consul3 - image: consul:latest - schemaload_test_keyspace: - command: - - sh - - -c - - /script/schemaload.sh - depends_on: - vttablet101: - condition: service_healthy - vttablet201: - condition: service_healthy - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - TARGETTAB=test-0000000101 - - SLEEPTIME=15 - - VSCHEMA_FILE=test_keyspace_vschema.json - - SCHEMA_FILES=test_keyspace_schema_file.sql - - POST_LOAD_FILE= - - EXTERNAL_DB=0 - image: vitess/lite - volumes: - - .:/script - schemaload_unsharded_keyspace: - command: - - sh - - -c - - /script/schemaload.sh - depends_on: - vttablet301: - condition: service_healthy - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=unsharded_keyspace - - TARGETTAB=test-0000000301 - - SLEEPTIME=15 - - VSCHEMA_FILE=unsharded_keyspace_vschema.json - - SCHEMA_FILES=unsharded_keyspace_schema_file.sql - - POST_LOAD_FILE= - - EXTERNAL_DB=0 - image: vitess/lite - volumes: - - .:/script - vtctld: - command: - - sh - - -c - - ' $$VTROOT/bin/vtctld -topo_implementation consul -topo_global_server_address - consul1:8500 -topo_global_root vitess/global -cell test ''grpc-vtctl'' -backup_storage_implementation - file -file_backup_storage_root $$VTDATAROOT/backups -logtostderr=true -port - 8080 -grpc_port 15999 -pid_file $$VTDATAROOT/tmp/vtctld.pid ' - depends_on: - - consul1 - - consul2 - - consul3 - image: vitess/lite - ports: - - 15000:8080 - - "15999" - volumes: - - .:/script - vtgate: - command: - - sh - - -c - - '/script/run-forever.sh $$VTROOT/bin/vtgate --topo_implementation consul --topo_global_server_address - consul1:8500 --topo_global_root vitess/global --logtostderr=true --port 8080 --grpc_port - 15999 --mysql_server_port 15306 --mysql_auth_server_impl none --cell test --cells_to_watch - test --tablet_types_to_wait PRIMARY,REPLICA,RDONLY --service_map ''grpc-vtgateservice'' - --pid_file $$VTDATAROOT/tmp/vtgate.pid --normalize_queries=true ' - depends_on: - - vtctld - image: vitess/lite - ports: - - 15099:8080 - - "15999" - - 15306:15306 - volumes: - - .:/script - vttablet101: - command: - - sh - - -c - - /script/vttablet-up.sh 101 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - SHARD=-80 - - ROLE=primary - - VTHOST=vttablet101 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl localhost:8080/debug/health - timeout: 10s - image: vitess/lite - ports: - - 15101:8080 - - "15999" - - "3306" - volumes: - - .:/script - vttablet102: - command: - - sh - - -c - - /script/vttablet-up.sh 102 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - SHARD=-80 - - ROLE=replica - - VTHOST=vttablet102 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl localhost:8080/debug/health - timeout: 10s - image: vitess/lite - ports: - - 15102:8080 - - "15999" - - "3306" - volumes: - - .:/script - vttablet201: - command: - - sh - - -c - - /script/vttablet-up.sh 201 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - SHARD=80- - - ROLE=primary - - VTHOST=vttablet201 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl localhost:8080/debug/health - timeout: 10s - image: vitess/lite - ports: - - 15201:8080 - - "15999" - - "3306" - volumes: - - .:/script - vttablet202: - command: - - sh - - -c - - /script/vttablet-up.sh 202 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=test_keyspace - - SHARD=80- - - ROLE=replica - - VTHOST=vttablet202 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl localhost:8080/debug/health - timeout: 10s - image: vitess/lite - ports: - - 15202:8080 - - "15999" - - "3306" - volumes: - - .:/script - vttablet301: - command: - - sh - - -c - - /script/vttablet-up.sh 301 - depends_on: - - vtctld - environment: - - TOPOLOGY_FLAGS=-topo_implementation consul -topo_global_server_address consul1:8500 - -topo_global_root vitess/global - - WEB_PORT=8080 - - GRPC_PORT=15999 - - CELL=test - - KEYSPACE=unsharded_keyspace - - SHARD=- - - ROLE=primary - - VTHOST=vttablet301 - - EXTERNAL_DB=0 - - DB_PORT= - - DB_HOST= - - DB_USER= - - DB_PASS= - - DB_CHARSET= - healthcheck: - interval: 30s - retries: 15 - test: - - CMD-SHELL - - curl localhost:8080/debug/health - timeout: 10s - image: vitess/lite - ports: - - 15301:8080 - - "15999" - - "3306" - volumes: - - .:/script -version: "2.1" diff --git a/vitess-mixin/e2e/vtcompose/vtcompose.go b/vitess-mixin/e2e/vtcompose/vtcompose.go deleted file mode 100644 index d272c7330ff..00000000000 --- a/vitess-mixin/e2e/vtcompose/vtcompose.go +++ /dev/null @@ -1,857 +0,0 @@ -/* - * Copyright 2020 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 main - -import ( - "bytes" - "encoding/json" - "flag" - "fmt" - "math" - "os" - "regexp" - "strconv" - "strings" - - jsonpatch "github.com/evanphx/json-patch" - yamlpatch "github.com/krishicks/yaml-patch" - - "vitess.io/vitess/go/vt/log" -) - -const ( - DefaultWebPort = 8080 - webPortUsage = "Web port to be used" - DefaultGrpcPort = 15999 - gRpcPortUsage = "gRPC port to be used" - DefaultMysqlPort = 15306 - mySqlPortUsage = "mySql port to be used" - DefaultKeyspaceData = "test_keyspace:2:1:create_messages.sql,create_tokens.sql;unsharded_keyspace:0:0:create_dinosaurs.sql,create_eggs.sql" - keyspaceDataUsage = "List of keyspace_name/external_db_name:num_of_shards:num_of_replica_tablets:schema_files:lookup_keyspace_name separated by ';'" - DefaultCell = "test" - cellUsage = "Vitess Cell name" - DefaultExternalDbData = "" - externalDbDataUsage = "List of Data corresponding to external DBs. List of ,,,,, separated by ';'" - DefaultTopologyFlags = "-topo_implementation consul -topo_global_server_address consul1:8500 -topo_global_root vitess/global" - topologyFlagsUsage = "Vitess Topology Flags config" -) - -var ( - tabletsUsed = 0 - tablesPath = "tables/" - baseDockerComposeFile = flag.String("base_yaml", "vtcompose/docker-compose.base.yml", "Starting docker-compose yaml") - baseVschemaFile = flag.String("base_vschema", "vtcompose/base_vschema.json", "Starting vschema json") - - topologyFlags = flag.String("topologyFlags", DefaultTopologyFlags, topologyFlagsUsage) - webPort = flag.Int("webPort", DefaultWebPort, webPortUsage) - gRpcPort = flag.Int("gRpcPort", DefaultGrpcPort, gRpcPortUsage) - mySqlPort = flag.Int("mySqlPort", DefaultMysqlPort, mySqlPortUsage) - cell = flag.String("cell", DefaultCell, cellUsage) - keyspaceData = flag.String("keyspaceData", DefaultKeyspaceData, keyspaceDataUsage) - externalDbData = flag.String("externalDbData", DefaultExternalDbData, externalDbDataUsage) -) - -type vtOptions struct { - webPort int - gRpcPort int - mySqlPort int - topologyFlags string - cell string -} - -type keyspaceInfo struct { - keyspace string - shards int - replicaTablets int - lookupKeyspace string - useLookups bool - schemaFile *os.File - schemaFileNames []string -} - -type externalDbInfo struct { - dbName string - dbHost string - dbPort string - dbUser string - dbPass string - dbCharset string -} - -func newKeyspaceInfo( - keyspace string, - shards int, - replicaTablets int, - schemaFiles []string, - lookupKeyspace string, -) keyspaceInfo { - k := keyspaceInfo{ - keyspace: keyspace, - shards: shards, - replicaTablets: replicaTablets, - schemaFileNames: schemaFiles, - lookupKeyspace: lookupKeyspace, - } - if len(strings.TrimSpace(lookupKeyspace)) == 0 { - k.useLookups = false - } else { - k.useLookups = true - } - - k.schemaFile = nil - return k -} - -func newExternalDbInfo(dbName, dbHost, dbPort, dbUser, dbPass, dbCharset string) externalDbInfo { - return externalDbInfo{ - dbName: dbName, - dbHost: dbHost, - dbPort: dbPort, - dbUser: dbUser, - dbPass: dbPass, - dbCharset: dbCharset, - } -} - -func parseKeyspaceInfo(keyspaceData string) map[string]keyspaceInfo { - keyspaceInfoMap := make(map[string]keyspaceInfo) - - for _, v := range strings.Split(keyspaceData, ";") { - tokens := strings.Split(v, ":") - shards, _ := strconv.Atoi(tokens[1]) - replicaTablets, _ := strconv.Atoi(tokens[2]) - schemaFileNames := []string{} - // Make schemafiles argument optional - if len(tokens) > 3 { - f := func(c rune) bool { - return c == ',' - } - schemaFileNames = strings.FieldsFunc(tokens[3], f) - } - - if len(tokens) > 4 { - keyspaceInfoMap[tokens[0]] = newKeyspaceInfo(tokens[0], shards, replicaTablets, schemaFileNames, tokens[4]) - } else { - keyspaceInfoMap[tokens[0]] = newKeyspaceInfo(tokens[0], shards, replicaTablets, schemaFileNames, "") - } - } - - return keyspaceInfoMap -} - -func parseExternalDbData(externalDbData string) map[string]externalDbInfo { - externalDbInfoMap := make(map[string]externalDbInfo) - for _, v := range strings.Split(externalDbData, ";") { - tokens := strings.Split(v, ":") - if len(tokens) > 1 { - externalDbInfoMap[tokens[0]] = - newExternalDbInfo(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5]) - } - } - - return externalDbInfoMap -} - -func main() { - flag.Parse() - keyspaceInfoMap := parseKeyspaceInfo(*keyspaceData) - externalDbInfoMap := parseExternalDbData(*externalDbData) - vtOpts := vtOptions{ - webPort: *webPort, - gRpcPort: *gRpcPort, - mySqlPort: *mySqlPort, - topologyFlags: *topologyFlags, - cell: *cell, - } - - // Write schemaFile. - for k, v := range keyspaceInfoMap { - if _, ok := externalDbInfoMap[k]; !ok { - v.schemaFile = createFile(fmt.Sprintf("%s%s_schema_file.sql", tablesPath, v.keyspace)) - appendToSqlFile(v.schemaFileNames, v.schemaFile) - closeFile(v.schemaFile) - } - } - - // Vschema Patching - for k, keyspaceData := range keyspaceInfoMap { - vSchemaFile := readFile(*baseVschemaFile) - if keyspaceData.shards == 0 { - vSchemaFile = applyJsonInMemoryPatch(vSchemaFile, `[{"op": "replace","path": "/sharded", "value": false}]`) - } - - // Check if it is an external_db - if _, ok := externalDbInfoMap[k]; ok { - //This is no longer necessary, but we'll keep it for reference - //https://github.com/vitessio/vitess/pull/4868, https://github.com/vitessio/vitess/pull/5010 - //vSchemaFile = applyJsonInMemoryPatch(vSchemaFile,`[{"op": "add","path": "/tables/*", "value": {}}]`) - } else { - var primaryTableColumns map[string]string - vSchemaFile, primaryTableColumns = addTablesVschemaPatch(vSchemaFile, keyspaceData.schemaFileNames) - - if keyspaceData.useLookups { - lookup := keyspaceInfoMap[keyspaceData.lookupKeyspace] - vSchemaFile = addLookupDataToVschema(vSchemaFile, lookup.schemaFileNames, primaryTableColumns, lookup.keyspace) - } - } - - writeVschemaFile(vSchemaFile, fmt.Sprintf("%s_vschema.json", keyspaceData.keyspace)) - } - - // Docker Compose File Patches - dockerComposeFile := readFile(*baseDockerComposeFile) - dockerComposeFile = applyDockerComposePatches(dockerComposeFile, keyspaceInfoMap, externalDbInfoMap, vtOpts) - writeFile(dockerComposeFile, "docker-compose.yml") -} - -func applyFilePatch(dockerYaml []byte, patchFile string) []byte { - yamlPatch, err := os.ReadFile(patchFile) - if err != nil { - log.Fatalf("reading yaml patch file %s: %s", patchFile, err) - } - - patch, err := yamlpatch.DecodePatch(yamlPatch) - if err != nil { - log.Fatalf("decoding patch failed: %s", err) - } - - bs, err := patch.Apply(dockerYaml) - if err != nil { - log.Fatalf("applying patch failed: %s", err) - } - return bs -} - -func applyJsonInMemoryPatch(vSchemaFile []byte, patchString string) []byte { - patch, err := jsonpatch.DecodePatch([]byte(patchString)) - if err != nil { - log.Fatalf("decoding vschema patch failed: %s", err) - } - - modified, err := patch.Apply(vSchemaFile) - if err != nil { - log.Fatalf("applying vschema patch failed: %s", err) - } - return modified -} - -func applyInMemoryPatch(dockerYaml []byte, patchString string) []byte { - patch, err := yamlpatch.DecodePatch([]byte(patchString)) - if err != nil { - log.Fatalf("decoding patch failed: %s", err) - } - - bs, err := patch.Apply(dockerYaml) - if err != nil { - log.Fatalf("applying patch failed: %s", err) - } - return bs -} - -func createFile(filePath string) *os.File { - f, err := os.Create(filePath) - if err != nil { - log.Fatalf("creating %s %s", filePath, err) - } - return f -} - -func readFile(filePath string) []byte { - file, err := os.ReadFile(filePath) - - if err != nil { - log.Fatalf("reading %s: %s", filePath, err) - } - - return file -} - -func closeFile(file *os.File) { - err := file.Close() - if err != nil { - log.Fatalf("Closing schema_file.sql %s", err) - } -} - -func handleError(err error) { - if err != nil { - log.Fatalf("Error: %s", err) - } -} - -func appendToSqlFile(schemaFileNames []string, f *os.File) { - for _, file := range schemaFileNames { - data, err := os.ReadFile(tablesPath + file) - if err != nil { - log.Fatalf("reading %s: %s", tablesPath+file, err) - } - - _, err = f.Write(data) - handleError(err) - - _, err = f.WriteString("\n\n") - handleError(err) - - err = f.Sync() - handleError(err) - } -} - -func getTableName(sqlFile string) string { - sqlFileData, err := os.ReadFile(sqlFile) - if err != nil { - log.Fatalf("reading sqlFile file %s: %s", sqlFile, err) - } - - r, _ := regexp.Compile("CREATE TABLE ([a-z_-]*) \\(") - rs := r.FindStringSubmatch(string(sqlFileData)) - // replace all ` from table name if exists - return strings.ReplaceAll(rs[1], "`", "") -} - -func getPrimaryKey(sqlFile string) string { - sqlFileData, err := os.ReadFile(sqlFile) - if err != nil { - log.Fatalf("reading sqlFile file %s: %s", sqlFile, err) - } - - r, _ := regexp.Compile("PRIMARY KEY \\((.*)\\).*") - rs := r.FindStringSubmatch(string(sqlFileData)) - - return rs[1] -} - -func getKeyColumns(sqlFile string) string { - sqlFileData, err := os.ReadFile(sqlFile) - if err != nil { - log.Fatalf("reading sqlFile file %s: %s", sqlFile, err) - } - - r, _ := regexp.Compile("[^PRIMARY] (KEY|UNIQUE KEY) .*\\((.*)\\).*") - rs := r.FindStringSubmatch(string(sqlFileData)) - // replace all ` from column names if exists - return strings.ReplaceAll(rs[2], "`", "") -} - -func addTablesVschemaPatch(vSchemaFile []byte, schemaFileNames []string) ([]byte, map[string]string) { - indexedColumns := "" - primaryTableColumns := make(map[string]string) - for _, fileName := range schemaFileNames { - tableName := getTableName(tablesPath + fileName) - indexedColumns = getPrimaryKey(tablesPath + fileName) - firstColumnName := strings.Split(indexedColumns, ", ")[0] - vSchemaFile = applyJsonInMemoryPatch(vSchemaFile, generatePrimaryVIndex(tableName, firstColumnName, "hash")) - primaryTableColumns[tableName] = firstColumnName - } - - return vSchemaFile, primaryTableColumns -} - -func addLookupDataToVschema( - vSchemaFile []byte, - schemaFileNames []string, - primaryTableColumns map[string]string, - keyspace string, -) []byte { - for _, fileName := range schemaFileNames { - tableName := fileName[7 : len(fileName)-4] - lookupTableOwner := "" - - // Find owner of lookup table - for primaryTableName := range primaryTableColumns { - if strings.HasPrefix(tableName, primaryTableName) && len(primaryTableName) > len(lookupTableOwner) { - lookupTableOwner = primaryTableName - } - } - - indexedColumns := getKeyColumns(tablesPath + fileName) - firstColumnName := strings.Split(indexedColumns, ", ")[0] - - // Lookup patch under "tables" - vSchemaFile = applyJsonInMemoryPatch(vSchemaFile, addToColumnVIndexes(lookupTableOwner, firstColumnName, tableName)) - - // Generate Vschema lookup hash types - lookupHash := generateVschemaLookupHash(tableName, keyspace, firstColumnName, primaryTableColumns[lookupTableOwner], lookupTableOwner) - vSchemaFile = applyJsonInMemoryPatch(vSchemaFile, lookupHash) - } - - return vSchemaFile -} - -func writeVschemaFile(file []byte, fileName string) { - // Format json file - var buf bytes.Buffer - err := json.Indent(&buf, file, "", "\t") - handleError(err) - file = buf.Bytes() - - writeFile(file, fileName) -} - -func writeFile(file []byte, fileName string) { - err := os.WriteFile(fileName, file, 0644) - if err != nil { - log.Fatalf("writing %s %s", fileName, err) - } -} - -func applyKeyspaceDependentPatches( - dockerComposeFile []byte, - keyspaceData keyspaceInfo, - externalDbInfoMap map[string]externalDbInfo, - opts vtOptions, -) []byte { - var externalDbInfo externalDbInfo - if val, ok := externalDbInfoMap[keyspaceData.keyspace]; ok { - externalDbInfo = val - } - tabAlias := 0 + tabletsUsed*100 - shard := "-" - var primaryTablets []string - if tabletsUsed == 0 { - primaryTablets = append(primaryTablets, "101") - } else { - primaryTablets = append(primaryTablets, strconv.Itoa((tabletsUsed+1)*100+1)) - } - interval := int(math.Floor(256 / float64(keyspaceData.shards))) - - for i := 1; i < keyspaceData.shards; i++ { - primaryTablets = append(primaryTablets, strconv.Itoa((i+1)*100+1)) - } - - schemaLoad := generateSchemaload(primaryTablets, "", keyspaceData.keyspace, externalDbInfo, opts) - dockerComposeFile = applyInMemoryPatch(dockerComposeFile, schemaLoad) - - // Append Primary and Replica Tablets - if keyspaceData.shards < 2 { - tabAlias = tabAlias + 100 - dockerComposeFile = applyTabletPatches(dockerComposeFile, tabAlias, shard, keyspaceData, externalDbInfoMap, opts) - dockerComposeFile = applyShardPatches(dockerComposeFile, tabAlias, shard, keyspaceData, externalDbInfoMap, opts) - } else { - // Determine shard range - for i := 0; i < keyspaceData.shards; i++ { - if i == 0 { - shard = fmt.Sprintf("-%x", interval) - } else if i == (keyspaceData.shards - 1) { - shard = fmt.Sprintf("%x-", interval*i) - } else { - shard = fmt.Sprintf("%x-%x", interval*(i), interval*(i+1)) - } - tabAlias = tabAlias + 100 - dockerComposeFile = applyTabletPatches(dockerComposeFile, tabAlias, shard, keyspaceData, externalDbInfoMap, opts) - dockerComposeFile = applyShardPatches(dockerComposeFile, tabAlias, shard, keyspaceData, externalDbInfoMap, opts) - } - } - - tabletsUsed += len(primaryTablets) - return dockerComposeFile -} - -func applyDefaultDockerPatches( - dockerComposeFile []byte, - keyspaceInfoMap map[string]keyspaceInfo, - externalDbInfoMap map[string]externalDbInfo, - opts vtOptions, -) []byte { - - var dbInfo externalDbInfo - // This is a workaround to check if there are any externalDBs defined - for _, keyspaceData := range keyspaceInfoMap { - if val, ok := externalDbInfoMap[keyspaceData.keyspace]; ok { - dbInfo = val - } - } - - dockerComposeFile = applyInMemoryPatch(dockerComposeFile, generateVtctld(opts)) - dockerComposeFile = applyInMemoryPatch(dockerComposeFile, generateVtgate(opts)) - dockerComposeFile = applyInMemoryPatch(dockerComposeFile, generateVreplication(dbInfo, opts)) - dockerComposeFile = applyInMemoryPatch(dockerComposeFile, generateVTOrc(dbInfo, opts)) - return dockerComposeFile -} - -func applyDockerComposePatches( - dockerComposeFile []byte, - keyspaceInfoMap map[string]keyspaceInfo, - externalDbInfoMap map[string]externalDbInfo, - vtOpts vtOptions, -) []byte { - // Vtctld, vtgate, vtwork patches. - dockerComposeFile = applyDefaultDockerPatches(dockerComposeFile, keyspaceInfoMap, externalDbInfoMap, vtOpts) - for _, keyspaceData := range keyspaceInfoMap { - dockerComposeFile = applyKeyspaceDependentPatches(dockerComposeFile, keyspaceData, externalDbInfoMap, vtOpts) - } - - return dockerComposeFile -} - -func applyShardPatches( - dockerComposeFile []byte, - tabAlias int, - shard string, - keyspaceData keyspaceInfo, - externalDbInfoMap map[string]externalDbInfo, - opts vtOptions, -) []byte { - var dbInfo externalDbInfo - if val, ok := externalDbInfoMap[keyspaceData.keyspace]; ok { - dbInfo = val - } - dockerComposeFile = applyInMemoryPatch(dockerComposeFile, generateExternalPrimary(tabAlias, shard, keyspaceData, dbInfo, opts)) - return dockerComposeFile -} - -func generateDefaultShard(tabAlias int, shard string, keyspaceData keyspaceInfo, opts vtOptions) string { - aliases := []int{tabAlias + 1} // primary alias, e.g. 201 - for i := 0; i < keyspaceData.replicaTablets; i++ { - aliases = append(aliases, tabAlias+2+i) // replica aliases, e.g. 202, 203, ... - } - tabletDepends := make([]string, len(aliases)) - for i, tabletId := range aliases { - tabletDepends[i] = fmt.Sprintf("vttablet%d: {condition : service_healthy}", tabletId) - } - // Wait on all shard tablets to be healthy - dependsOn := "depends_on: {" + strings.Join(tabletDepends, ", ") + "}" - - return fmt.Sprintf(` -- op: add - path: /services/init_shard_primary%[2]d - value: - image: vitess/lite:${VITESS_TAG:-latest} - command: ["sh", "-c", "/vt/bin/vtctlclient %[5]s InitShardPrimary -force %[4]s/%[3]s %[6]s-%[2]d "] - %[1]s -`, dependsOn, aliases[0], shard, keyspaceData.keyspace, opts.topologyFlags, opts.cell) -} - -func generateExternalPrimary( - tabAlias int, - shard string, - keyspaceData keyspaceInfo, - dbInfo externalDbInfo, - opts vtOptions, -) string { - - aliases := []int{tabAlias + 1} // primary alias, e.g. 201 - for i := 0; i < keyspaceData.replicaTablets; i++ { - aliases = append(aliases, tabAlias+2+i) // replica aliases, e.g. 202, 203, ... - } - - externalPrimaryTab := tabAlias - externalDb := "0" - - if dbInfo.dbName != "" { - externalDb = "1" - } else { - return fmt.Sprintf(``) - } - - return fmt.Sprintf(` -- op: add - path: /services/vttablet%[1]d - value: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15%[1]d:%[3]d" - - "%[4]d" - - "3306" - volumes: - - ".:/script" - environment: - - TOPOLOGY_FLAGS=%[2]s - - WEB_PORT=%[3]d - - GRPC_PORT=%[4]d - - CELL=%[5]s - - SHARD=%[6]s - - KEYSPACE=%[7]s - - ROLE=primary - - VTHOST=vttablet%[1]d - - EXTERNAL_DB=%[8]s - - DB_PORT=%[9]s - - DB_HOST=%[10]s - - DB_USER=%[11]s - - DB_PASS=%[12]s - - DB_CHARSET=%[13]s - command: ["sh", "-c", "[ $$EXTERNAL_DB -eq 1 ] && /script/vttablet-up.sh %[1]d || exit 0"] - depends_on: - - vtctld - healthcheck: - test: ["CMD-SHELL","curl -s --fail --show-error localhost:%[3]d/debug/health"] - interval: 30s - timeout: 10s - retries: 15 -`, externalPrimaryTab, opts.topologyFlags, opts.webPort, opts.gRpcPort, opts.cell, shard, keyspaceData.keyspace, externalDb, dbInfo.dbPort, dbInfo.dbHost, dbInfo.dbUser, dbInfo.dbPass, dbInfo.dbCharset) -} - -func applyTabletPatches( - dockerComposeFile []byte, - tabAlias int, - shard string, - keyspaceData keyspaceInfo, - externalDbInfoMap map[string]externalDbInfo, - opts vtOptions, -) []byte { - var dbInfo externalDbInfo - if val, ok := externalDbInfoMap[keyspaceData.keyspace]; ok { - dbInfo = val - } - dockerComposeFile = applyInMemoryPatch(dockerComposeFile, generateDefaultTablet(tabAlias+1, shard, "primary", keyspaceData.keyspace, dbInfo, opts)) - for i := 0; i < keyspaceData.replicaTablets; i++ { - dockerComposeFile = applyInMemoryPatch(dockerComposeFile, generateDefaultTablet(tabAlias+2+i, shard, "replica", keyspaceData.keyspace, dbInfo, opts)) - } - return dockerComposeFile -} - -func generateDefaultTablet(tabAlias int, shard, role, keyspace string, dbInfo externalDbInfo, opts vtOptions) string { - externalDb := "0" - if dbInfo.dbName != "" { - externalDb = "1" - } - - return fmt.Sprintf(` -- op: add - path: /services/vttablet%[1]d - value: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15%[1]d:%[4]d" - - "%[5]d" - - "3306" - volumes: - - ".:/script" - environment: - - TOPOLOGY_FLAGS=%[7]s - - WEB_PORT=%[4]d - - GRPC_PORT=%[5]d - - CELL=%[8]s - - KEYSPACE=%[6]s - - SHARD=%[2]s - - ROLE=%[3]s - - VTHOST=vttablet%[1]d - - EXTERNAL_DB=%[9]s - - DB_PORT=%[10]s - - DB_HOST=%[11]s - - DB_USER=%[12]s - - DB_PASS=%[13]s - - DB_CHARSET=%[14]s - command: ["sh", "-c", "/script/vttablet-up.sh %[1]d"] - depends_on: - - vtctld - healthcheck: - test: ["CMD-SHELL","curl -s --fail --show-error localhost:%[4]d/debug/health"] - interval: 30s - timeout: 10s - retries: 15 -`, tabAlias, shard, role, opts.webPort, opts.gRpcPort, keyspace, opts.topologyFlags, opts.cell, externalDb, dbInfo.dbPort, dbInfo.dbHost, dbInfo.dbUser, dbInfo.dbPass, dbInfo.dbCharset) -} - -func generateVtctld(opts vtOptions) string { - return fmt.Sprintf(` -- op: add - path: /services/vtctld - value: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15000:%[1]d" - - "%[2]d" - command: ["sh", "-c", " /vt/bin/vtctld \ - %[3]s \ - -cell %[4]s \ - -service_map 'grpc-vtctl' \ - -backup_storage_implementation file \ - -file_backup_storage_root /vt/vtdataroot/backups \ - -logtostderr=true \ - -port %[1]d \ - -grpc_port %[2]d \ - "] - volumes: - - .:/script - depends_on: - - consul1 - - consul2 - - consul3 - depends_on: - external_db_host: - condition: service_healthy -`, opts.webPort, opts.gRpcPort, opts.topologyFlags, opts.cell) -} - -func generateVtgate(opts vtOptions) string { - return fmt.Sprintf(` -- op: add - path: /services/vtgate - value: - image: vitess/lite:${VITESS_TAG:-latest} - ports: - - "15099:%[1]d" - - "%[2]d" - - "15306:%[3]d" - command: ["sh", "-c", "/script/run-forever.sh /vt/bin/vtgate \ - %[4]s \ - --logtostderr=true \ - --port %[1]d \ - --grpc_port %[2]d \ - --mysql_server_port %[3]d \ - --mysql_auth_server_impl none \ - --cell %[5]s \ - --cells_to_watch %[5]s \ - --tablet_types_to_wait PRIMARY,REPLICA,RDONLY \ - --service_map 'grpc-vtgateservice' \ - --normalize_queries=true \ - "] - volumes: - - .:/script - depends_on: - - vtctld -`, opts.webPort, opts.gRpcPort, opts.mySqlPort, opts.topologyFlags, opts.cell) -} - -func generateVTOrc(dbInfo externalDbInfo, opts vtOptions) string { - externalDb := "0" - if dbInfo.dbName != "" { - externalDb = "1" - } - return fmt.Sprintf(` -- op: add - path: /services/vtorc - value: - image: vitess/lite:${VITESS_TAG:-latest} - volumes: - - ".:/script" - environment: - - TOPOLOGY_FLAGS=%[1]s - - EXTERNAL_DB=%[2]s - - DB_USER=%[3]s - - DB_PASS=%[4]s - ports: - - "13000:3000" - command: ["sh", "-c", "/script/vtorc-up.sh"] - depends_on: - - vtctld -`, opts.topologyFlags, externalDb, dbInfo.dbUser, dbInfo.dbPass) -} - -func generateVreplication(dbInfo externalDbInfo, opts vtOptions) string { - externalDb := "0" - if dbInfo.dbName != "" { - externalDb = "1" - } - return fmt.Sprintf(` -- op: add - path: /services/vreplication - value: - image: vitess/lite:${VITESS_TAG:-latest} - volumes: - - ".:/script" - environment: - - TOPOLOGY_FLAGS=%[1]s - - EXTERNAL_DB=%[2]s - command: ["sh", "-c", "[ $$EXTERNAL_DB -eq 1 ] && /script/externaldb_vreplication.sh || exit 0"] - depends_on: - - vtctld -`, opts.topologyFlags, externalDb) -} - -func generateSchemaload( - tabletAliases []string, - postLoadFile string, - keyspace string, - dbInfo externalDbInfo, - opts vtOptions, -) string { - targetTab := tabletAliases[0] - schemaFileName := fmt.Sprintf("%s_schema_file.sql", keyspace) - externalDb := "0" - - if dbInfo.dbName != "" { - schemaFileName = "" - externalDb = "1" - } - - // Formatting for list in yaml - for i, tabletId := range tabletAliases { - tabletAliases[i] = "vttablet" + tabletId + ": " + "{condition : service_healthy}" - } - dependsOn := "depends_on: {" + strings.Join(tabletAliases, ", ") + "}" - - return fmt.Sprintf(` -- op: add - path: /services/schemaload_%[7]s - value: - image: vitess/lite:${VITESS_TAG:-latest} - volumes: - - ".:/script" - environment: - - TOPOLOGY_FLAGS=%[3]s - - WEB_PORT=%[4]d - - GRPC_PORT=%[5]d - - CELL=%[6]s - - KEYSPACE=%[7]s - - TARGETTAB=%[6]s-0000000%[2]s - - SLEEPTIME=15 - - VSCHEMA_FILE=%[7]s_vschema.json - - SCHEMA_FILES=%[9]s - - POST_LOAD_FILE=%[8]s - - EXTERNAL_DB=%[10]s - command: ["sh", "-c", "/script/schemaload.sh"] - %[1]s -`, dependsOn, targetTab, opts.topologyFlags, opts.webPort, opts.gRpcPort, opts.cell, keyspace, postLoadFile, schemaFileName, externalDb) -} - -func generatePrimaryVIndex(tableName, column, name string) string { - return fmt.Sprintf(` -[{"op": "add", -"path": "/tables/%[1]s", -"value": - {"column_vindexes": [ - { - "column": "%[2]s", - "name": "%[3]s" - } - ]} -}] -`, tableName, column, name) -} - -func generateVschemaLookupHash(tableName, tableKeyspace, from, to, owner string) string { - return fmt.Sprintf(` -[{"op": "add", -"path": "/vindexes/%[1]s", -"value": - {"type": "lookup_hash", - "params": { - "table": "%[2]s.%[1]s", - "from": "%[3]s", - "to": "%[4]s", - "autocommit": "true" - }, - "owner": "%[5]s" - } -}] -`, tableName, tableKeyspace, from, to, owner) -} - -func addToColumnVIndexes(tableName, column, referenceName string) string { - return fmt.Sprintf(` -[{"op": "add", -"path": "/tables/%[1]s/column_vindexes/-", -"value": - { - "column": "%[2]s", - "name": "%[3]s" - } -}] -`, tableName, column, referenceName) -} diff --git a/vitess-mixin/e2e/vtcompose/vtcompose_test.go b/vitess-mixin/e2e/vtcompose/vtcompose_test.go deleted file mode 100644 index 8e5cfaa2b89..00000000000 --- a/vitess-mixin/e2e/vtcompose/vtcompose_test.go +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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 main - -import ( - "fmt" - "strconv" - "testing" - - "github.com/stretchr/testify/assert" -) - -var ( - referenceYaml = string(readFile("./docker-compose.test.yml")) - testComposeFile = readFile("./docker-compose.base.yml") - testKeyspaceInfoMap = parseKeyspaceInfo(DefaultKeyspaceData) - testExternalDbInfoMap = parseExternalDbData(DefaultExternalDbData) - - testVtOpts = vtOptions{ - webPort: DefaultWebPort, - gRpcPort: DefaultGrpcPort, - mySqlPort: DefaultMysqlPort, - topologyFlags: DefaultTopologyFlags, - cell: DefaultCell, - } -) - -func TestGenerateCorrectFileWithDefaultOpts(t *testing.T) { - baseFile := testComposeFile - finalFile := applyDockerComposePatches(baseFile, testKeyspaceInfoMap, testExternalDbInfoMap, testVtOpts) - - yamlString := string(finalFile) - assert.YAMLEq(t, referenceYaml, yamlString) -} - -func TestOptsAppliedThroughoutGeneratedFile(t *testing.T) { - baseFile := testComposeFile - options := vtOptions{ - webPort: 55_555, - gRpcPort: 66_666, - mySqlPort: 77_777, - topologyFlags: "-custom -flags", - cell: "custom cell", - } - finalFile := applyDockerComposePatches(baseFile, testKeyspaceInfoMap, testExternalDbInfoMap, options) - yamlString := string(finalFile) - - // These asserts are not exhaustive, but should cover most cases. - assert.NotContains(t, yamlString, strconv.Itoa(DefaultWebPort)) - assert.Contains(t, yamlString, strconv.Itoa(options.webPort)) - - assert.NotContains(t, yamlString, strconv.Itoa(DefaultGrpcPort)) - assert.Contains(t, yamlString, strconv.Itoa(options.gRpcPort)) - - assert.NotContains(t, yamlString, ":"+strconv.Itoa(DefaultMysqlPort)) - assert.Contains(t, yamlString, ":"+strconv.Itoa(options.webPort)) - - assert.NotContains(t, yamlString, fmt.Sprintf("-cell %s", DefaultCell)) - assert.Contains(t, yamlString, fmt.Sprintf("-cell %s", options.cell)) - - assert.Contains(t, yamlString, fmt.Sprintf("- TOPOLOGY_FLAGS=%s", options.topologyFlags)) - assert.NotContains(t, yamlString, DefaultTopologyFlags) -} diff --git a/vitess-mixin/e2e/vtorc-up.sh b/vitess-mixin/e2e/vtorc-up.sh deleted file mode 100755 index 9d71831c3ea..00000000000 --- a/vitess-mixin/e2e/vtorc-up.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -# Copyright 2020 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. - -set -u - -external=${EXTERNAL_DB:-0} -config=${VTORC_CONFIG:-/vt/vtorc/config.json} -# Copy config directory -cp -R /script/vtorc /vt -# Update credentials -if [ $external = 1 ] ; then - # Terrible substitution but we don't have jq in this image - # This can be overridden by passing VTORC_CONFIG env variable - echo "Updating $config..." - cp /vt/vtorc/default.json /vt/vtorc/tmp.json - sed -i '/MySQLTopologyUser/c\ \"MySQLTopologyUser\" : \"'"$DB_USER"'\",' /vt/vtorc/tmp.json - sed -i '/MySQLTopologyPassword/c\ \"MySQLTopologyPassword\" : \"'"$DB_PASS"'\",' /vt/vtorc/tmp.json - sed -i '/MySQLReplicaUser/c\ \"MySQLReplicaUser\" : \"'"$DB_USER"'\",' /vt/vtorc/tmp.json - sed -i '/MySQLReplicaPassword/c\ \"MySQLReplicaPassword\" : \"'"$DB_PASS"'\",' /vt/vtorc/tmp.json - cat /vt/vtorc/tmp.json - cp /vt/vtorc/tmp.json /vt/vtorc/config.json -else - cp /vt/vtorc/default.json /vt/vtorc/config.json -fi - -echo "Starting vtorc..." -exec /vt/bin/vtorc \ -$TOPOLOGY_FLAGS \ --logtostderr=true \ --config $config diff --git a/vitess-mixin/e2e/vtorc/default.json b/vitess-mixin/e2e/vtorc/default.json deleted file mode 100644 index e0a03884c99..00000000000 --- a/vitess-mixin/e2e/vtorc/default.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "Debug": true, - "EnableSyslog": false, - "MySQLTopologyUser": "orc_client_user", - "MySQLTopologyPassword": "orc_client_user_password", - "MySQLReplicaUser": "vt_repl", - "MySQLReplicaPassword": "", - "BackendDB": "sqlite", - "SQLite3DataFile": "/tmp/vtorc.sqlite3", - "RecoverMasterClusterFilters": ["*"], - "RecoveryPeriodBlockSeconds": 5, - "DelayMasterPromotionIfSQLThreadNotUpToDate": true -} diff --git a/vitess-mixin/e2e/vttablet-up.sh b/vitess-mixin/e2e/vttablet-up.sh deleted file mode 100755 index 0bc9d7a629d..00000000000 --- a/vitess-mixin/e2e/vttablet-up.sh +++ /dev/null @@ -1,161 +0,0 @@ -#!/bin/bash - -# Copyright 2020 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. - -set -u -export VTROOT=/vt -export VTDATAROOT=/vt/vtdataroot - -keyspace=${KEYSPACE:-'test_keyspace'} -shard=${SHARD:-'0'} -grpc_port=${GRPC_PORT:-'15999'} -web_port=${WEB_PORT:-'8080'} -role=${ROLE:-'replica'} -vthost=${VTHOST:-`hostname -i`} -sleeptime=${SLEEPTIME:-'0'} -uid=$1 -external=${EXTERNAL_DB:-0} - -# If DB is not explicitly set, we default to behaviour of prefixing with vt_ -# If there is an external db, the db_nmae will always match the keyspace name -[ $external = 0 ] && db_name=${DB:-"vt_$keyspace"} || db_name=${DB:-"$keyspace"} -db_charset=${DB_CHARSET:-''} -tablet_hostname='' - -# Use IPs to simplify connections when testing in docker. -# Otherwise, blank hostname means the tablet auto-detects FQDN. -# This is now set further up - -printf -v alias '%s-%010d' $CELL $uid -printf -v tablet_dir 'vt_%010d' $uid - -tablet_role=$role -tablet_type='replica' - -# Make every 3rd tablet rdonly -if (( $uid % 100 % 3 == 0 )) ; then - tablet_type='rdonly' -fi - -# Consider every tablet with %d00 as external primary -if [ $external = 1 ] && (( $uid % 100 == 0 )) ; then - tablet_type='replica' - tablet_role='externalprimary' - keyspace="ext_$keyspace" -fi - -# Copy config directory -cp -R /script/config $VTROOT -init_db_sql_file="$VTROOT/config/init_db.sql" -# Clear in-place edits of init_db_sql_file if any exist -sed -i '/##\[CUSTOM_SQL/{:a;N;/END\]##/!ba};//d' $init_db_sql_file - -echo "##[CUSTOM_SQL_START]##" >> $init_db_sql_file - -if [ "$external" = "1" ]; then - # We need a common user for the unmanaged and managed tablets else tools like orchestrator will not function correctly - echo "Creating matching user for managed tablets..." - echo "CREATE USER IF NOT EXISTS '$DB_USER'@'%' IDENTIFIED BY '$DB_PASS';" >> $init_db_sql_file - echo "GRANT ALL ON *.* TO '$DB_USER'@'%';" >> $init_db_sql_file -fi -echo "##[CUSTOM_SQL_END]##" >> $init_db_sql_file - -echo "##[CUSTOM_SQL_END]##" >> $init_db_sql_file - -mkdir -p $VTDATAROOT/backups - - -export KEYSPACE=$keyspace -export SHARD=$shard -export TABLET_ID=$alias -export TABLET_DIR=$tablet_dir -export MYSQL_PORT=3306 -export TABLET_ROLE=$tablet_role -export DB_PORT=${DB_PORT:-3306} -export DB_HOST=${DB_HOST:-""} -export DB_NAME=$db_name - -# Delete socket files before running mysqlctld if exists. -# This is the primary reason for unhealthy state on restart. -# https://github.com/vitessio/vitess/pull/5115/files -echo "Removing $VTDATAROOT/$tablet_dir/{mysql.sock,mysql.sock.lock}..." -rm -rf $VTDATAROOT/$tablet_dir/{mysql.sock,mysql.sock.lock} - -# Create mysql instances -# Do not create mysql instance for primary if connecting to external mysql database -if [[ $tablet_role != "externalprimary" ]]; then - echo "Initing mysql for tablet: $uid role: $role external: $external.. " - $VTROOT/bin/mysqlctld \ - --init_db_sql_file=$init_db_sql_file \ - --logtostderr=true \ - --tablet_uid=$uid \ - & -fi - -sleep $sleeptime - -# Create the cell -# https://vitess.io/blog/2020-04-27-life-of-a-cluster/ -$VTROOT/bin/vtctlclient --server vtctld:$GRPC_PORT -- AddCellInfo --root vitess/$CELL --server_address consul1:8500 $CELL || true - -#Populate external db conditional args -if [ $tablet_role = "externalprimary" ]; then - echo "Setting external db args for primary: $DB_NAME" - external_db_args="--db_host $DB_HOST \ - --db_port $DB_PORT \ - --init_db_name_override $DB_NAME \ - --init_tablet_type $tablet_type \ - --mycnf_server_id $uid \ - --db_app_user $DB_USER \ - --db_app_password $DB_PASS \ - --db_allprivs_user $DB_USER \ - --db_allprivs_password $DB_PASS \ - --db_appdebug_user $DB_USER \ - --db_appdebug_password $DB_PASS \ - --db_dba_user $DB_USER \ - --db_dba_password $DB_PASS \ - --db_filtered_user $DB_USER \ - --db_filtered_password $DB_PASS \ - --db_repl_user $DB_USER \ - --db_repl_password $DB_PASS \ - --enable_replication_reporter=false \ - --enforce_strict_trans_tables=false \ - --track_schema_versions=true \ - --watch_replication_stream=true" -else - external_db_args="--init_db_name_override $DB_NAME \ - --init_tablet_type $tablet_type \ - --enable_replication_reporter=true \ - --restore_from_backup" -fi - - -echo "Starting vttablet..." -exec $VTROOT/bin/vttablet \ - $TOPOLOGY_FLAGS \ - --logtostderr=true \ - --tablet-path $alias \ - --tablet_hostname "$vthost" \ - --health_check_interval 5s \ - --disable_active_reparents=true \ - --port $web_port \ - --grpc_port $grpc_port \ - --service_map 'grpc-queryservice,grpc-tabletmanager,grpc-updatestream' \ - --init_keyspace $keyspace \ - --init_shard $shard \ - --backup_storage_implementation file \ - --file_backup_storage_root $VTDATAROOT/backups \ - --queryserver-config-schema-reload-time 60 \ - $external_db_args diff --git a/vitess-mixin/go.mod b/vitess-mixin/go.mod deleted file mode 100644 index 20d3f33eed8..00000000000 --- a/vitess-mixin/go.mod +++ /dev/null @@ -1,132 +0,0 @@ -module vitess-mixin - -go 1.22.5 - -require ( - github.com/evanphx/json-patch v5.9.0+incompatible - github.com/google/go-jsonnet v0.16.0 - github.com/jsonnet-bundler/jsonnet-bundler v0.4.0 - github.com/krishicks/yaml-patch v0.0.10 - // Believe it or not, this is actually version 2.13.1 - // See https://github.com/prometheus/prometheus/issues/5590#issuecomment-546368944 - github.com/prometheus/prometheus v1.8.2-0.20191017095924-6f92ce560538 - github.com/stretchr/testify v1.9.0 - vitess.io/vitess v0.19.4 -) - -require ( - cloud.google.com/go/compute v1.25.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/Azure/azure-sdk-for-go v23.2.0+incompatible // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.1 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect - github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go v1.50.32 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/edsrzf/mmap-go v1.0.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect - github.com/fatih/color v1.16.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-kit/kit v0.9.0 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/glog v1.2.1 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.2 // indirect - github.com/gophercloud/gophercloud v0.3.0 // indirect - github.com/hashicorp/consul/api v1.28.2 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.6.2 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/serf v0.10.1 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/jpillora/backoff v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/miekg/dns v1.1.41 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect - github.com/nxadm/tail v1.4.11 // indirect - github.com/oklog/ulid v1.3.1 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.0 // indirect - github.com/prometheus/client_model v0.6.0 // indirect - github.com/prometheus/common v0.49.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect - github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75 // indirect - github.com/spf13/pflag v1.0.5 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - google.golang.org/api v0.168.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240304212257-790db918fca8 // indirect - google.golang.org/grpc v1.62.1 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect - gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.26.1 // indirect - k8s.io/apimachinery v0.26.1 // indirect - k8s.io/client-go v0.26.1 // indirect - k8s.io/klog/v2 v2.90.0 // indirect - k8s.io/kube-openapi v0.0.0-20230202010329-39b3636cbaa3 // indirect - k8s.io/utils v0.0.0-20230115233650-391b47cb4029 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect -) - -replace k8s.io/client-go v2.0.0-alpha.0.0.20181121191925-a47917edff34+incompatible => k8s.io/client-go v2.0.0-alpha.1+incompatible diff --git a/vitess-mixin/go.sum b/vitess-mixin/go.sum deleted file mode 100644 index 73171b17f6a..00000000000 --- a/vitess-mixin/go.sum +++ /dev/null @@ -1,908 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go/compute v1.25.0 h1:H1/4SqSUhjPFE7L5ddzHOfY2bCAvjwNRZPNl6Ni5oYU= -cloud.google.com/go/compute v1.25.0/go.mod h1:GR7F0ZPZH8EhChlMo9FkLd7eUTwEymjqQagxzilIxIE= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -contrib.go.opencensus.io/exporter/ocagent v0.6.0/go.mod h1:zmKjrJcdo0aYcVS7bmEeSEBLPA9YJp5bjrofdU3pIXs= -github.com/Azure/azure-sdk-for-go v23.2.0+incompatible h1:bch1RS060vGpHpY3zvQDV4rOiRw25J1zmR/B9a76aSA= -github.com/Azure/azure-sdk-for-go v23.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v11.2.8+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1 h1:eVvIXUKiTgv++6YnWb42DUA1YL7qDugnKP0HljexdnQ= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= -github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.5 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI= -github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.23.12/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.50.32 h1:POt81DvegnpQKM4DMDLlHz1CO6OBnEoQ1gRhYFd7QRY= -github.com/aws/aws-sdk-go v1.50.32/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= -github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v0.0.0-20181017004759-096ff4a8a059/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v0.0.0-20160705203006-01aeca54ebda/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= -github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.18.0/go.mod h1:uI6pHuxWYTy94zZxgcwJkUWa9wbIlhteGfloI10GD4U= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.3/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.4/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.17.2/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= -github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-jsonnet v0.16.0 h1:Nb4EEOp+rdeGGyB1rQ5eisgSAqrTnhf9ip+X6lzZbY0= -github.com/google/go-jsonnet v0.16.0/go.mod h1:sOcuej3UW1vpPTZOr8L7RQimqai1a57bt5j22LzGZCw= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70 h1:XTnP8fJpa4Kvpw2qARB4KS9izqxPS0Sd92cDlY3uk+w= -github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= -github.com/gophercloud/gophercloud v0.3.0 h1:6sjpKIpVwRIIwmcEGp+WwNovNsem+c+2vm6oxshRpL8= -github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.28.2 h1:mXfkRHrpHN4YY3RqL09nXU1eHKLNiuAN4kHvDQ16k/8= -github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= -github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I= -github.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.8.3/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= -github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/influxdata/influxdb v1.7.7/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/jessevdk/go-flags v0.0.0-20180331124232-1c38ed7ad0cc/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jsonnet-bundler/jsonnet-bundler v0.4.0 h1:4BKZ6LDqPc2wJDmaKnmYD/vDjUptJtnUpai802MibFc= -github.com/jsonnet-bundler/jsonnet-bundler v0.4.0/go.mod h1:/by7P/OoohkI3q4CgSFqcoFsVY+IaNbzOVDknEsKDeU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/krishicks/yaml-patch v0.0.10 h1:H4FcHpnNwVmw8u0MjPRjWyIXtco6zM2F78t+57oNM3E= -github.com/krishicks/yaml-patch v0.0.10/go.mod h1:Sm5TchwZS6sm7RJoyg87tzxm2ZcKzdRE4Q7TjNhPrME= -github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= -github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v0.0.0-20170117200651-66bb6560562f/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs= -github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= -github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= -github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/alertmanager v0.18.0/go.mod h1:WcxHBl40VSPuOaqWae6l6HpnEOVRIycEJ7i9iYkadEE= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.2.0/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= -github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.49.0 h1:ToNTdK4zSnPVJmh698mGFkDor9wBI/iGaJy5dbH1EgI= -github.com/prometheus/common v0.49.0/go.mod h1:Kxm+EULxRbUkjGU6WFsQqo3ORzB4tyKvlWFOE9mB2sE= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/prometheus v0.0.0-20180315085919-58e2a31db8de/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= -github.com/prometheus/prometheus v1.8.2-0.20191017095924-6f92ce560538 h1:iyerK9/VU1F02ASqYyIXp60gKxo7ualRoEezXPqbQZE= -github.com/prometheus/prometheus v1.8.2-0.20191017095924-6f92ce560538/go.mod h1:SgN99nHQ/tVJyAuyLKKz6i2j5cJx3eLy9MCRCPOXqUI= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75 h1:cA+Ubq9qEVIQhIWvP2kNuSZ2CmnfBJFSRq+kO1pu2cc= -github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/vfsgen v0.0.0-20180825020608-02ddb050ef6b/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.0.4/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180805044716-cb6730876b98/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190118193359-16909d206f00/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190918214516-5a1a30219888/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.168.0 h1:MBRe+Ki4mMN93jhDDbpuRLjRddooArz4FeSObvUMmjY= -google.golang.org/api v0.168.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20240304212257-790db918fca8 h1:Fe8QycXyEd9mJgnwB9kmw00WgB43eQ/xYO5C6gceybQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 h1:8eadJkXbwDEMNwcB5O0s5Y5eCfyuCLdvaiOIaGTrWmQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240304212257-790db918fca8 h1:IR+hp6ypxjH24bkMfEJ0yHR21+gwPWdV+/IBrPQyn3k= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240304212257-790db918fca8/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= -google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.0.0-20190620084959-7cf5895f2711/go.mod h1:TBhBqb1AWbBQbW3XRusr7n7E4v2+5ZY8r8sAMnyFC5A= -k8s.io/api v0.0.0-20190813020757-36bff7324fb7/go.mod h1:3Iy+myeAORNCLgjd/Xu9ebwN7Vh59Bw0vh9jhoX+V58= -k8s.io/api v0.26.1 h1:f+SWYiPd/GsiWwVRz+NbFyCgvv75Pk9NK6dlkZgpCRQ= -k8s.io/api v0.26.1/go.mod h1:xd/GBNgR0f707+ATNyPmQ1oyKSgndzXij81FzWGsejg= -k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719/go.mod h1:I4A+glKBHiTgiEjQiCCQfCAIcIMFGt291SmsvcrFzJA= -k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010/go.mod h1:Waf/xTS2FGRrgXCkO5FP3XxTOWh0qLf2QhL1qFZZ/R8= -k8s.io/apimachinery v0.26.1 h1:8EZ/eGJL+hY/MYCNwhmDzVqq2lPl3N3Bo8rvweJwXUQ= -k8s.io/apimachinery v0.26.1/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74= -k8s.io/client-go v0.0.0-20190620085101-78d2af792bab/go.mod h1:E95RaSlHr79aHaX0aGSwcPNfygDiPKOVXdmivCIZT0k= -k8s.io/client-go v0.26.1 h1:87CXzYJnAMGaa/IDDfRdhTzxk/wzGZ+/HUQpqgVSZXU= -k8s.io/client-go v0.26.1/go.mod h1:IWNSglg+rQ3OcvDkhY6+QLeasV4OYHDjdqeWkDQZwGE= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.90.0 h1:VkTxIV/FjRXn1fgNNcKGM8cfmL1Z33ZjXRTVxKCoF5M= -k8s.io/klog/v2 v2.90.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= -k8s.io/kube-openapi v0.0.0-20190722073852-5e22f3d471e6/go.mod h1:RZvgC8MSN6DjiMV6oIfEE9pDL9CYXokkfaCKZeHm3nc= -k8s.io/kube-openapi v0.0.0-20230202010329-39b3636cbaa3 h1:vV3ZKAUX0nMjTflyfVea98dTfROpIxDaEsQws0FT2Ts= -k8s.io/kube-openapi v0.0.0-20230202010329-39b3636cbaa3/go.mod h1:/BYxry62FuDzmI+i9B+X2pqfySRmSOW2ARmj5Zbqhj0= -k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= -k8s.io/utils v0.0.0-20190809000727-6c36bc71fc4a/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20230115233650-391b47cb4029 h1:L8zDtT4jrxj+TaQYD0k8KNlr556WaVQylDXswKmX+dE= -k8s.io/utils v0.0.0-20230115233650-391b47cb4029/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= -vitess.io/vitess v0.19.4 h1:fJhZm5RknYbF7YUBXBmcvST/mvA4CeevlI9N0TLlYXA= -vitess.io/vitess v0.19.4/go.mod h1:15uIi9x/Gu+BdDhUR80yP0M1v7aMG2mZQXSd56CE2t0= diff --git a/vitess-mixin/jsonnetfile.json b/vitess-mixin/jsonnetfile.json deleted file mode 100644 index 93f3316ec38..00000000000 --- a/vitess-mixin/jsonnetfile.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": 1, - "dependencies": [ - { - "source": { - "git": { - "remote": "https://github.com/grafana/grafonnet-lib.git", - "subdir": "grafonnet" - } - }, - "version": "master" - } - ], - "legacyImports": true -} diff --git a/vitess-mixin/lib/alerts.jsonnet b/vitess-mixin/lib/alerts.jsonnet deleted file mode 100644 index d396a38cd71..00000000000 --- a/vitess-mixin/lib/alerts.jsonnet +++ /dev/null @@ -1 +0,0 @@ -std.manifestYamlDoc((import '../mixin.libsonnet').prometheusAlerts) diff --git a/vitess-mixin/lib/dashboards.jsonnet b/vitess-mixin/lib/dashboards.jsonnet deleted file mode 100644 index c260feb80e3..00000000000 --- a/vitess-mixin/lib/dashboards.jsonnet +++ /dev/null @@ -1,10 +0,0 @@ -local dashboards = (import '../mixin.libsonnet').grafanaDashboards; - -local config = (import '../config.libsonnet'); -local deploy_list = config._config.deploy_list; - -{ - [name]: dashboards[name] - for name in std.objectFields(dashboards) - if std.member(dashboards[name].environments, std.extVar('env')) -} diff --git a/vitess-mixin/lib/rules.jsonnet b/vitess-mixin/lib/rules.jsonnet deleted file mode 100644 index 2d7fa91f7ca..00000000000 --- a/vitess-mixin/lib/rules.jsonnet +++ /dev/null @@ -1 +0,0 @@ -std.manifestYamlDoc((import '../mixin.libsonnet').prometheusRules) diff --git a/vitess-mixin/mixin.libsonnet b/vitess-mixin/mixin.libsonnet deleted file mode 100644 index b9831f9380b..00000000000 --- a/vitess-mixin/mixin.libsonnet +++ /dev/null @@ -1,4 +0,0 @@ -(import 'config.libsonnet') + -(import 'alerts/alerts.libsonnet') + -(import 'dashboards/dashboards.libsonnet') + -(import 'rules/rules.libsonnet') diff --git a/vitess-mixin/rules/rules.libsonnet b/vitess-mixin/rules/rules.libsonnet deleted file mode 100644 index 903212ca351..00000000000 --- a/vitess-mixin/rules/rules.libsonnet +++ /dev/null @@ -1,221 +0,0 @@ -// Recording rules can be used to continually evaluate queries and -// store their results as new timeseries. This is commonly used to -// calculate expensive aggregates prior to querying them. You can have -// any number of rules, split across any number of files. -// -// Reference: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/ -local config = import '../config.libsonnet'; - -{ - prometheusRules+:: { - groups: [ - { - name: 'vitess_mixin_1', - rules: [ - { - record: 'vitess_mixin:vttablet_errors:rate1m', - expr: 'sum (rate(vttablet_errors[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_2', - rules: [ - { - record: 'vitess_mixin:vttablet_query_counts:rate1m', - expr: 'sum (rate(vttablet_query_counts[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_3', - rules: [ - { - record: 'vitess_mixin:mysql_global_status_queries:rate1m', - expr: 'sum (rate(mysql_global_status_queries[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_4', - rules: [ - { - record: 'vitess_mixin:vtgate_api_bucket:rate1m', - expr: 'sum by(le)(rate(vtgate_api_bucket[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_5', - rules: [ - { - record: 'vitess_mixin:vtgate_api_bucket_by_keyspace:rate1m', - expr: 'sum by(le,keyspace)(rate(vtgate_api_bucket[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_6', - rules: [ - { - record: 'vitess_mixin:vtgate_api_error_counts:rate1m', - expr: 'sum (rate(vtgate_api_error_counts[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_7', - rules: [ - { - record: 'vitess_mixin:vtgate_api_count:rate1m', - expr: 'sum (rate(vtgate_api_count[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_8', - rules: [ - { - record: 'vitess_mixin:vtgate_api_error_counts_by_keyspace:rate1m', - expr: 'sum by(keyspace)(rate(vtgate_api_error_counts[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_9', - rules: [ - { - record: 'vitess_mixin:vtgate_api_count_by_keyspace:rate1m', - expr: 'sum by(keyspace)(rate(vtgate_api_count[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_10', - rules: [ - { - record: 'vitess_mixin:vttablet_kills:rate1m', - expr: 'sum by (keyspace,shard)(rate(vttablet_kills[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_11', - rules: [ - { - record: 'vitess_mixin:vtgate_vttablet_call_error_count_byinstance:rate1m', - expr: 'sum by(instance)(rate(vtgate_vttablet_call_error_count[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_12', - rules: [ - { - record: 'vitess_mixin:vtgate_api_error_counts_by_db_type:rate1m', - expr: 'sum by(db_type)(rate(vtgate_api_error_counts[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_13', - rules: [ - { - record: 'vitess_mixin:vtgate_api_count_by_db_type:rate1m', - expr: 'sum by(db_type)(rate(vtgate_api_count[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_14', - rules: [ - { - record: 'vitess_mixin:vtgate_api_bucket_by_db_type:rate1m', - expr: 'sum by(le,db_type)(rate(vtgate_api_bucket[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_15', - rules: [ - { - record: 'vitess_mixin:vtgate_api_error_counts_by_operation:rate1m', - expr: 'sum by(operation)(rate(vtgate_api_error_counts[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_16', - rules: [ - { - record: 'vitess_mixin:vtgate_api_error_counts_by_code:rate1m', - expr: 'sum by(code)(rate(vtgate_api_error_counts[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_17', - rules: [ - { - record: 'vitess_mixin:vttablet_queries_sum_by_keyspace_shard:rate1m', - expr: 'sum by(keyspace,shard)(rate(vttablet_queries_sum[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_18', - rules: [ - { - record: 'vitess_mixin:vttablet_queries_count_by_keyspace_shard:rate1m', - expr: 'sum by(keyspace,shard)(rate(vttablet_queries_count[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_19', - rules: [ - { - record: 'vitess_mixin:vttablet_transactions_bucket_by_keyspace_shard:rate1m', - expr: 'sum by(keyspace,shard,le)(rate(vttablet_transactions_bucket[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_20', - rules: [ - { - record: 'vitess_mixin:process_start_time_seconds_by_instance_job:sum5m', - expr: 'sum by (instance,job) (changes (process_start_time_seconds[5m]))', - }, - ], - }, - { - name: 'vitess_mixin_21', - rules: [ - { - record: 'vitess_mixin:vttablet_kills_by_instance:rate1m', - expr: 'sum by(instance)(rate(vttablet_kills[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_22', - rules: [ - { - record: 'vitess_mixin:vttablet_errors:rate1m', - expr: 'sum by(keyspace,shard,instance,error_code)(rate(vttablet_errors[1m]))', - }, - ], - }, - { - name: 'vitess_mixin_23', - rules: [ - { - record: 'vitess_mixin:vtgate_queries_processed_by_table:rate1m', - expr: 'sum by(keyspace,plan,table) (rate(vtgate_queries_processed_by_table{plan!="Rollback"}[1m]))', - }, - ], - }, - ], - }, -} diff --git a/vitess-mixin/scripts/fmt.sh b/vitess-mixin/scripts/fmt.sh deleted file mode 100755 index e1a5976ee8e..00000000000 --- a/vitess-mixin/scripts/fmt.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash -#/ Usage: fmt [--check] -#/ --check Fail if changed files need changes, do not format in place. - -set -eu - -usage() { - grep '^#/' "$0" | cut -c'4-' >&2 - exit "$1" -} - -if ! [ -x "$(command -v jsonnet)" ] && ! [ -x "$(command -v jsonnetfmt)" ]; then - echo 'jsonnet or jsonnetfmt executable not found' - exit 1 -fi - -if [ -x "$(command -v jsonnetfmt)" ]; then - JSONNET_COMMAND='jsonnetfmt' -else - JSONNET_COMMAND='jsonnet fmt' -fi - -CHECK="false" -EXIT_STATUS=0 -FILES_CHANGED="$(git diff --name-only origin/main --diff-filter=d | grep -E '(jsonnet|TEMPLATE|libsonnet)$' || true)" - -while [ "$#" -gt 0 ]; do - case "$1" in - -c|--check) CHECK="true"; shift;; - *) usage ;; - esac -done - -if [ "${CHECK}" == "true" ]; then - if [ -n "${FILES_CHANGED}" ]; then - for FILE in ${FILES_CHANGED}; do - set +e - echo -n "Checking $FILE: " - ${JSONNET_COMMAND} --test "${FILE}" - EC=$? - if [ ${EC} -ne 0 ]; then - echo "⚠️" - EXIT_STATUS=1 - else - echo "✅" - fi - set -e - done - echo "" - fi - - echo -n "STATUS:" - if [ "$EXIT_STATUS" -eq 0 ]; then - echo "✅" - else - echo "❌" - fi - - exit $EXIT_STATUS - -else - for FILE in $FILES_CHANGED; do - echo -n "Formatting $FILE: " - $JSONNET_COMMAND -n 2 --max-blank-lines 2 --string-style s --comment-style s -i ../$FILE - echo "✅" - done -fi diff --git a/vitess-mixin/scripts/vitess-mixin-plan.sh b/vitess-mixin/scripts/vitess-mixin-plan.sh deleted file mode 100755 index 8c305601956..00000000000 --- a/vitess-mixin/scripts/vitess-mixin-plan.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash -if [[ -z "$ENV" || ("${ENV}" != 'dev' && "${ENV}" != 'prod') ]]; then - echo -e "##ERROR\nPlease specify ENV (prod or dev)\nUsage: ENV='prod' ./vitess-mixin-plan.sh" 1>&2 - exit 1 -fi - -export ENVIRONMENT=$ENV - -EXIT_STATUS=0; - -echo "#### Building origin/main" -REPODIR="$(pwd)" -TEMPDIR="$(mktemp -d)" - -cd $TEMPDIR -git clone git@github.com:vitessio/vitess.git > /dev/null 2>&1 -cd vitess/vitess-mixin -jb install > /dev/null 2>&1 -make dashboards_out > /dev/null 2>&1 -make prometheus_rules.yaml > /dev/null 2>&1 -# TODO enalbe when alerts are not empty. -# make prometheus_alerts.yaml > /dev/null 2>&1 - -echo -e "\nDone!\n" - -cd $REPODIR -make dashboards_out > /dev/null 2>&1 -make prometheus_rules.yaml > /dev/null 2>&1 -# TODO enalbe when alerts are not empty. -# make prometheus_alerts.yaml > /dev/null 2>&1 - -branch=$(git rev-parse --abbrev-ref HEAD) -echo -e "#### Diff origin/main with $branch:\n" - -# TODO check prometheus_alerts.yaml - -t="# Checking prometheus_rules.yaml..."; -d=$(diff -urt --label origin/main/prometheus_rules.yaml "$TEMPDIR/vitess/vitess-mixin/prometheus_rules.yaml" --label $branch/prometheus_rules.yaml "prometheus_rules.yaml" 2>/dev/null) -if [ "$?" = "0" ]; -then - echo $t OK -else - echo $t NOK - echo "$d" - EXIT_STATUS=2 -fi - -DASHBOARDS=() -for filename in $(ls dashboards_out) -do - t="# Checking $filename..." - DASHBOARDS+=($filename) - d=$(diff -urt --label origin/main/$filename "$TEMPDIR/vitess/vitess-mixin/dashboards_out/"$filename --label $branch/$filename "dashboards_out/"$filename 2>/dev/null) - if [ "$?" = "0" ]; - then - echo $t OK - else - if [ -e "$TEMPDIR/vitess-mixin/dashboards_out/"$filename ]; - then - echo $t NOK - echo "$d" - else - echo $t "This is a new dashboard not present in origin/main" NOK - fi - EXIT_STATUS=2 - fi -done - -for filename in $(ls $TEMPDIR/vitess/vitess-mixin/dashboards_out) -do - t="# Checking $filename..." - if [[ ! " ${DASHBOARDS[*]} " == *"$filename"* ]]; - then - echo $t This dashboard has been removed NOK ; - EXIT_STATUS=2 - fi -done - -echo -e "\nEXIT STATUS:" -if [ "$EXIT_STATUS" -eq 0 ]; then - echo -e "✅ Your dashboards local version matches the origin/main version" -elif [ "$EXIT_STATUS" -eq 2 ]; then - echo -e "👀 If you are happy with your changes open a PR" -else - echo "❌" - exit 1 -fi - -rm -rf $TEMPDIR diff --git a/vitess-mixin/tools.go b/vitess-mixin/tools.go deleted file mode 100644 index 63cc73e0bbb..00000000000 --- a/vitess-mixin/tools.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build tools -// +build tools - -package main - -import ( - _ "github.com/google/go-jsonnet/cmd/jsonnet" - _ "github.com/google/go-jsonnet/cmd/jsonnetfmt" - _ "github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb" - _ "github.com/prometheus/prometheus/cmd/promtool" -) diff --git a/vitess-mixin/vitess-mixin-quickstart.md b/vitess-mixin/vitess-mixin-quickstart.md deleted file mode 100644 index e15e6126211..00000000000 --- a/vitess-mixin/vitess-mixin-quickstart.md +++ /dev/null @@ -1,323 +0,0 @@ -# Vitess Mixin QuickStart - -## Table of Contents - -- [Vitess Mixin QuickStart](#vitess-mixin-quickstart) - - [Table of Contents](#table-of-contents) - - [What is the Vitess Mixin](#what-is-the-vitess-mixin) - - [Development](#development) - - [Building](#building) - - [1. Prometheus Recording Rules](#1-prometheus-recording-rules) - - [2. Grafana Dashboards](#2-grafana-dashboards) - - [Formatting](#formatting) - - [Linting](#linting) - - [Cleaning up](#cleaning-up) - - [Define a new Dashboard](#define-a-new-dashboard) - - [Update Existing Dashboards](#update-existing-dashboards) - - [Edit existing resources](#edit-existing-resources) - - [Adding new resources](#adding-new-resources) - - [Test and Deploy](#test-and-deploy) - - [Local Unit Tests with `make all`](#local-unit-tests-with-make-all) - - [Local e2e tests using Cypress (Alpha)](#local-e2e-tests-using-cypress-alpha) - - [Local e2e manual testing using compose (Alpha)](#local-e2e-manual-testing-using-compose-alpha) - -## What is the Vitess Mixin - -Vitess [mixin](https://en.wikipedia.org/wiki/Mixin) is a monitoring mixin defined using [jsonnet](https://jsonnet.org/) data templating language. The grafana `jsonnet` library for creating dashboards is [grafonnet](https://github.com/grafana/grafonnet-lib). While the package manager for easily reusing and extending the mixin is [jsonnet-bundler](https://github.com/jsonnet-bundler/jsonnet-bundler). - -## Development - -If you want to see all available targets run `make help`. - -Choose an IDE of your preference. We use VSCode with `heptio.jsonnet` plugin which includes some nice features like on mouse over documentation and (ctrl+space) autocomplete. - -### Building - -#### 1. Prometheus Recording Rules - - ```shell - $ make prometheus_rules.yaml - # Building 'prometheus_rules.yaml'... - - Done! - ``` - - Once generated the Vitess Mixin Prometheus recording rules are available at `prometheus_rules.yaml`. - - **Note:** The Vitess Mixin only includes recording rules for Prometheus Vitess metrics. Other metric like Prometheus Node are not currently included in the rules. - -#### 2. Grafana Dashboards - -The vitess mixin supports DEV/PROD configurations (Currently it is possible to enable/disable dashboards. And set different alert configurations for DEV/PROD). - - **Prod dashboards**: - - ```shell - $ ENV='prod' make dashboards_out - # Building Grafana dashboards... - - dashboards_out/cluster_overview.json - dashboards_out/vtgate_host_view.json - dashboards_out/vtgate_overview.json - dashboards_out/vttablet_host_view.json - - Done! - ``` - - **Dev dashboards**: - - ```shell - $ ENV=dev make dashboards_out - - # Building Grafana dashboards... - - dashboards_out/cluster_overview.json - dashboards_out/vtgate_host_view.json - dashboards_out/vtgate_overview.json - dashboards_out/vttablet_host_view.json - - Done! - ``` - - Voila!! the generated dashboards definitions in `.json` format are now available under `/dashboards_out`. (**Note**: dev and prod dashboards have the same names and they are stored in the same output folder. It is a good practice to run `make clean` after each build to make sure we are working with a clean `/dashboards_out` folder). - -### Formatting - - ```shell - $ make fmt - # Formatting all .libsonnet and .jsonnet files... - - Formatting dashboards/alerts_memory_events.libsonnet: ✅ - - Done! - ``` - -### Linting - - ```shell - $ make lint - # Linting all .libsonnet and .jsonnet files... - - Checking dashboards/alerts_memory_events.libsonnet: ✅ - - STATUS:✅ - - Done! - - # Linting 'prometheus_rules.yaml' and 'prometheus_alerts.yaml'... - TO BE IMPLEMENTED - Done! - ``` - -### Cleaning up - - ```shell - $ make clean - # Cleaning up all generated files... - - rm -rf dashboards_out prometheus_alerts.yaml prometheus_rules.yaml - - Done! - ``` - -## Define a new Dashboard - - Dashboards are defined in `.libsonnet` format under the `/dashboards` folder. - **Note** Files designed for import by convention end with `.libsonnet`. - - 1. Update the Mixin config to include the new **dashboard metadata** `config.libsonnet`. - The metadata needs to be added under `grafanaDashboardMetadata`. For example for `vtgate-overview dashboard` it looks like this: - - ```bash - vtgateOverview: { - environments: ['dev', 'prod'], - uid: 'vitess-vtgate-overview', - title: 'vtgate - overview %(dashboardNameSuffix)s' % $._config.grafanaDashboardMetadataDefault, - description: 'General vtgate overview', - dashboardTags: $._config.grafanaDashboardMetadataDefault.dashboardTags + ['overview', 'vtgate'], - } - ``` - - **Note**: It is possible to add/remove a dashboard from specific environments using the `environments` array field. - - 2. Define the **dashboard layout**: Create a new `.libsonnet` file following _Naming Convention_ (**TODO** Define a naming convention) in the `/dashboards/layouts` folder. - The dashboard skeleton should look something like this: - - ```js - local helpers = import '../resources/helpers.libsonnet'; - - local config = import '../../config.libsonnet'; - - { - grafanaDashboards+:: { - 'DASHBOARD_NAME.json': - - helpers.dashboard.getDashboard(config._config.grafanaDashboardMetadata.DASHBOARD_NAME) - .addTemplates( - [ - - ] - ).addLink(helpers.default.getDashboardLink(config._config.dashborardLinks)) - .addPanels( - [ - - ], - ), - }, - } - ``` - - 3. Import the new dashboard in the `dashboard.libsonnet` library. - - 4. Add/Edit dashboard resources. - - **Note:** Some of the resources have been grouped in the following categories `vtgate`, `vttablet`, `vtorc`, `webapp`, `os` for convenience. The resources under this categories follow a helper/config pattern. The `.*_helper.libsonnet` libraries within `grafonnet` folder functions to retrieve resources such as `getPanel(panel_name_config)`, reading the configuration by name for the desired resource from the corresponding `.*_config.libsonnet` library . - - **Note:** To isolate **PROD** and **DEV** the configuration files have a section for each environment where we can define specific `notifications`(ex: pagerduty, vitess-alerts...) and `conditions` (alert thresholds). - - In this example the alert has a different notification config. For **PROD** it pages and **DEV** it doesn't: - - ```js - alert: { - name: 'vitess-mixin - # of tablets with MySQL replication lag > 300s', - frequency: '1m', - forDuration: '3m', - noDataState: 'ok', - executionErrorState: 'keep_state', - message: ||| - The number of tablets with MySQL replication lag > 300s is above the threshold. - This usually indicate that replicas are not able to keep up with the write loads on the primary. Please take a look. - |||, - - prod+: { - notifications: [ - { uid: 'alerts-vitess' }, - { uid: 'pagerduty-vitess' }, - ], - conditions: [ - alert_condition.new( - evaluatorParams=[1], - evaluatorType='gt', - operatorType='and', - queryRefId='A', - queryTimeStart='1m', - reducerType='max'), - ], - }, - //override PROD notifications. - dev+: self.prod { - notifications: [ - { uid: 'alerts-vitess' }, - ], - }, - }, - ``` - - **Warning:** Editing existing resources can change other dashboards behavior. Since basic resources like `panels`, `rows`, `texts`... can be shared across dashboards. This can be easily checked running `make all` as explained bellow. - -## Update Existing Dashboards - - Same steps as **Define a new Dashboard** starting from step `.4`. - -### Edit existing resources - - 1. Look for the dashboard you want to edit in the `dashboards/layouts` folder. - 2. Find the resource you want to update in the `dashboards/resources` folder. - -### Adding new resources - - 1. Create the resource in the corresponding location under `dashboards/resources` folder. - 2. Add the resource to the desired layout in `dashboards/layouts`. - -## Test and Deploy - -### Local Unit Tests with `make all` - -These tests attempt to assert truth to the following: - -- Does this mixin generate valid dashboard JSON? -- Does this mixin generate valid recording rules YAML? -- Do the configured elements do what they are expected to do? - -This make target will format, lint, build all generated dashboards and recording rules using `origin/main` and diff with them your `local branch`. Printing a report to the `stdout`. - -```shell - $ pwd - /manfontan/vitess-mixin - $ ENV='prod' make all - #### Building origin/main - - Done! - - #### Diff origin/main with main: - - # Checking prometheus_rules.yaml... OK - # Checking cluster_overview.json... OK - # Checking vtgate_host_view.json... OK - # Checking vtgate_overview.json... OK - # Checking vttablet_host_view.json... OK - - EXIT STATUS: - ✅ Your dashboards local version matches the origin/main version -``` - -The above execution shows the report for a `local branch` matching `origin/main`. Any changes will be reported as **NOK** along with the diff report. This doesn't mean something is wrong it just points that there are changes in your local branch compared to `origin/main` which is expected. Review the diff report and once you are happy with your changes create a PR. - -### Local e2e tests using Cypress (Alpha) - -These tests attempt to assert truth to the following: - -- Are dashboard elements displayed as expected? - -The spec for each dashboard can be found at `/e2e/cypress/integration`. - -`docker-compose` is used to run Cypress and Grafana. There are two targets in -[Makefile](../Makefile) to help run it. - -- `make e2e`: runs tests headless and exits. - -- `make e2e-dev`: opens the [the test -runner](https://docs.cypress.io/guides/core-concepts/test-runner.html#Overview) -and exposes Grafana to the host machine - http://localhost:3030. This requires -an X11 server to work. [This -post](https://www.cypress.io/blog/2019/05/02/run-cypress-with-a-single-docker-command/#Interactive-mode) -describes how to set this up with [XQuartz](https://www.xquartz.org/). - -**Note** The dummy Grafana server is not connected to a Prometheus Backend for this reason dashboards will not display any data, templates will fail to load etc... If you don't have a Dev Prometheus server. Replacing prometheus datasources(`Prometheus_Vitess`, `Prometheus_Node` ...) with an empty string in the generated JSON file will default to the dummy datasource displaying dummy data. This is useful when testing using interactive mode `make e2e-dev`. - -### Local e2e manual testing using compose (Alpha) - -**Note**: This targets have been tested using docker for Mac. You may need to change the IPs and configurations for your specific setup. - -Before we run the local environment using compose it is necessary to generate the dashboards and recording rules using `ENV=dev make all` (Note: choose the environment you want to test). - -Once our dashboards are available simply run: - -- `make e2e-compose-up`: spin up the cluster - -Changes to the dashboards are not dynamically loaded so you will need to bring down the cluster and initialized it again to load your changes. - -If you are done testing or the cluster gets in a bad state quit and clean up using: - -- `make e2e-compose-down`: cleanup compose resources - -In order to generate some metrics we can use the following commands: - -```shell -## INSERT TEST DATA -mysql --port=15306 --host=127.0.0.1 < load_test.sql -## SIMULATED QUERIES -mysqlslap -c 5 --port=15306 --host=127.0.0.1 --iterations=1000 --create-schema=test_keyspace:80-@primary --query="SELECT * FROM messages;" -mysqlslap -c 5 --port=15306 --host=127.0.0.1 --iterations=1000 --create-schema=test_keyspace:80-@replica --query="SELECT * FROM messages;" -mysqlslap -c 5 --port=15306 --host=127.0.0.1 --iterations=1000 --create-schema=lookup_keyspace:-@primary --query="SELECT * FROM messages_message_lookup;" -mysqlslap -c 5 --port=15306 --host=127.0.0.1 --iterations=1000 --create-schema=lookup_keyspace:-@replica --query="SELECT * FROM messages_message_lookup;" -## SIMULATED ERRORS -mysqlslap --port=15306 --host=127.0.0.1 --iterations=10000 --create-schema=test_keyspace:80-@primary --query="SELECT name FROM messages;" -mysqlslap --port=15306 --host=127.0.0.1 --iterations=10000 --create-schema=lookup_keyspace:-@replica --query="SELECT name FROM messages_message_lookup;" -``` - -Once the cluster is up and running you should be able to access: - -- grafana (default credentials > admin/admin) http://localhost:3030/ -- prometheus http://localhost:9000/ -- vitess control panel http://localhost:15000/ diff --git a/web/vtadmin/package-lock.json b/web/vtadmin/package-lock.json index a14da6bf0ee..2dc201fbf88 100644 --- a/web/vtadmin/package-lock.json +++ b/web/vtadmin/package-lock.json @@ -21,6 +21,7 @@ "highcharts-react-official": "^3.1.0", "history": "^5.3.0", "lodash-es": "^4.17.21", + "path-to-regexp": "^8.1.0", "postcss-flexbugs-fixes": "^5.0.2", "postcss-preset-env": "^8.0.1", "query-string": "^7.1.3", @@ -3859,7 +3860,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^2.68.0||^3.0.0" + "rollup": "^3.29.5" }, "peerDependenciesMeta": { "rollup": { @@ -3881,7 +3882,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + "rollup": "^3.29.5" }, "peerDependenciesMeta": { "rollup": { @@ -5238,7 +5239,7 @@ "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.1.0-beta.0" + "vite": "^4.5.4" } }, "node_modules/@vitest/expect": { @@ -10339,7 +10340,7 @@ "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^12.0.1", - "ws": "^8.13.0", + "ws": "^8.17.1", "xml-name-validator": "^4.0.0" }, "engines": { @@ -10777,11 +10778,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -10927,7 +10928,7 @@ "is-node-process": "^1.0.1", "js-levenshtein": "^1.1.6", "node-fetch": "^2.6.7", - "path-to-regexp": "^6.2.0", + "path-to-regexp": "^8.0.0", "statuses": "^2.0.0", "strict-event-emitter": "^0.2.0", "type-fest": "^1.2.2", @@ -14130,10 +14131,12 @@ } }, "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", + "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", + "engines": { + "node": ">=16" + } }, "node_modules/path-type": { "version": "4.0.0", @@ -15479,7 +15482,7 @@ "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", + "path-to-regexp": "^1.9.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", "tiny-invariant": "^1.0.2", @@ -15538,9 +15541,9 @@ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "dependencies": { "isarray": "0.0.1" } @@ -16009,10 +16012,11 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -16205,7 +16209,7 @@ "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "^3.3.0", "range-parser": "1.2.0" } }, @@ -16231,9 +16235,9 @@ } }, "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", "dev": true }, "node_modules/serve/node_modules/ajv": { @@ -17662,14 +17666,15 @@ } }, "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", - "rollup": "^3.27.1" + "rollup": "^3.29.5" }, "bin": { "vite": "bin/vite.js" @@ -17727,7 +17732,7 @@ "mlly": "^1.1.0", "pathe": "^1.1.0", "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" + "vite": "^4.5.4" }, "bin": { "vite-node": "vite-node.mjs" @@ -17747,11 +17752,11 @@ "dependencies": { "@rollup/pluginutils": "^4.2.1", "@types/eslint": "^8.4.5", - "rollup": "^2.77.2" + "rollup": "^3.29.5" }, "peerDependencies": { "eslint": ">=7", - "vite": ">=2" + "vite": ">=4.5.4" } }, "node_modules/vite-plugin-eslint/node_modules/@rollup/pluginutils": { @@ -17767,21 +17772,6 @@ "node": ">= 8.0.0" } }, - "node_modules/vite-plugin-eslint/node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/vite-plugin-svgr": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz", @@ -17792,7 +17782,7 @@ "@svgr/core": "^6.5.1" }, "peerDependencies": { - "vite": "^2.6.0 || 3 || 4" + "vite": "^4.5.4" } }, "node_modules/vitest": { @@ -17822,7 +17812,7 @@ "tinybench": "^2.3.1", "tinypool": "^0.4.0", "tinyspy": "^1.0.2", - "vite": "^3.0.0 || ^4.0.0", + "vite": "^4.5.4", "vite-node": "0.29.8", "why-is-node-running": "^2.2.2" }, @@ -18182,9 +18172,9 @@ } }, "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/web/vtadmin/package.json b/web/vtadmin/package.json index 52029ddd9e4..78d14ea9e9c 100644 --- a/web/vtadmin/package.json +++ b/web/vtadmin/package.json @@ -20,6 +20,7 @@ "highcharts-react-official": "^3.1.0", "history": "^5.3.0", "lodash-es": "^4.17.21", + "path-to-regexp": "^8.1.0", "postcss-flexbugs-fixes": "^5.0.2", "postcss-preset-env": "^8.0.1", "query-string": "^7.1.3", diff --git a/web/vtadmin/src/api/http.ts b/web/vtadmin/src/api/http.ts index 33d192dbb6f..6f85a82e78d 100644 --- a/web/vtadmin/src/api/http.ts +++ b/web/vtadmin/src/api/http.ts @@ -265,7 +265,9 @@ export const deleteTablet = async ({ allowPrimary, clusterID, alias }: DeleteTab req.append('allow_primary', allowPrimary.toString()); } - const { result } = await vtfetch(`/api/tablet/${alias}?${req}`, { method: 'delete' }); + const { result } = await vtfetch(`/api/tablet/${alias}?${req}`, { + method: 'delete', + }); const err = pb.DeleteTabletResponse.verify(result); if (err) throw Error(err); @@ -419,6 +421,37 @@ export const fetchVSchema = async ({ clusterID, keyspace }: FetchVSchemaParams) return pb.VSchema.create(result); }; +export interface FetchTransactionsParams { + clusterID: string; + keyspace: string; + abandonAge?: string; +} + +export const fetchTransactions = async ({ clusterID, keyspace, abandonAge = '' }: FetchTransactionsParams) => { + const req = new URLSearchParams(); + req.append('abandon_age', abandonAge); + + const { result } = await vtfetch(`/api/transactions/${clusterID}/${keyspace}?${req}`); + + const err = vtctldata.GetUnresolvedTransactionsResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.GetUnresolvedTransactionsResponse.create(result); +}; + +export interface ConcludeTransactionParams { + clusterID: string; + dtid: string; +} + +export const concludeTransaction = async ({ clusterID, dtid }: ConcludeTransactionParams) => { + const { result } = await vtfetch(`/api/transaction/${clusterID}/${dtid}/conclude`); + const err = vtctldata.ConcludeTransactionResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.ConcludeTransactionResponse.create(result); +}; + export const fetchWorkflows = async () => { const { result } = await vtfetch(`/api/workflows`); @@ -437,6 +470,142 @@ export const fetchWorkflow = async (params: { clusterID: string; keyspace: strin return pb.Workflow.create(result); }; +export const fetchWorkflowStatus = async (params: { clusterID: string; keyspace: string; name: string }) => { + const { result } = await vtfetch(`/api/workflow/${params.clusterID}/${params.keyspace}/${params.name}/status`); + + const err = vtctldata.WorkflowStatusResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.WorkflowStatusResponse.create(result); +}; + +export interface CreateMaterializeParams { + clusterID: string; + tableSettings: string; + request: vtctldata.IMaterializeCreateRequest; +} + +export const createMaterialize = async ({ clusterID, tableSettings, request }: CreateMaterializeParams) => { + const body = { + table_settings: tableSettings, + request: request, + }; + + const { result } = await vtfetch(`/api/workflow/${clusterID}/materialize`, { + body: JSON.stringify(body), + method: 'post', + }); + + const err = vtctldata.MaterializeCreateResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.MaterializeCreateResponse.create(result); +}; + +export interface CreateMoveTablesParams { + clusterID: string; + request: vtctldata.IMoveTablesCreateRequest; +} + +export const createMoveTables = async ({ clusterID, request }: CreateMoveTablesParams) => { + const { result } = await vtfetch(`/api/workflow/${clusterID}/movetables`, { + body: JSON.stringify(request), + method: 'post', + }); + + const err = vtctldata.WorkflowStatusResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.WorkflowStatusResponse.create(result); +}; + +export interface CreateReshardParams { + clusterID: string; + request: vtctldata.IReshardCreateRequest; +} + +export const createReshard = async ({ clusterID, request }: CreateReshardParams) => { + const { result } = await vtfetch(`/api/workflow/${clusterID}/reshard`, { + body: JSON.stringify(request), + method: 'post', + }); + + const err = vtctldata.WorkflowStatusResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.WorkflowStatusResponse.create(result); +}; + +export interface WorkflowActionParams { + clusterID: string; + keyspace: string; + name: string; +} + +export const startWorkflow = async ({ clusterID, keyspace, name }: WorkflowActionParams) => { + const { result } = await vtfetch(`/api/workflow/${clusterID}/${keyspace}/${name}/start`); + const err = vtctldata.WorkflowUpdateResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.WorkflowUpdateResponse.create(result); +}; + +export const stopWorkflow = async ({ clusterID, keyspace, name }: WorkflowActionParams) => { + const { result } = await vtfetch(`/api/workflow/${clusterID}/${keyspace}/${name}/stop`); + const err = vtctldata.WorkflowUpdateResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.WorkflowUpdateResponse.create(result); +}; + +export interface MoveTablesCompleteParams { + clusterID: string; + request: vtctldata.IMoveTablesCompleteRequest; +} + +export const completeMoveTables = async ({ clusterID, request }: MoveTablesCompleteParams) => { + const { result } = await vtfetch(`/api/movetables/${clusterID}/complete`, { + body: JSON.stringify(request), + method: 'post', + }); + const err = vtctldata.MoveTablesCompleteResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.MoveTablesCompleteResponse.create(result); +}; + +export interface WorkflowSwitchTrafficParams { + clusterID: string; + request: vtctldata.IWorkflowSwitchTrafficRequest; +} + +export const workflowSwitchTraffic = async ({ clusterID, request }: WorkflowSwitchTrafficParams) => { + const { result } = await vtfetch(`/api/workflow/${clusterID}/switchtraffic`, { + body: JSON.stringify(request), + method: 'post', + }); + const err = vtctldata.WorkflowSwitchTrafficResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.WorkflowSwitchTrafficResponse.create(result); +}; + +export interface WorkflowDeleteParams { + clusterID: string; + request: vtctldata.IWorkflowDeleteRequest; +} + +export const workflowDelete = async ({ clusterID, request }: WorkflowDeleteParams) => { + const { result } = await vtfetch(`/api/workflow/${clusterID}/delete`, { + body: JSON.stringify(request), + method: 'post', + }); + const err = vtctldata.WorkflowDeleteResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.WorkflowDeleteResponse.create(result); +}; + export const fetchVTExplain = async ({ cluster, keyspace, sql }: R) => { // As an easy enhancement for later, we can also validate the request parameters on the front-end // instead of defaulting to '', to save a round trip. @@ -553,7 +722,9 @@ export const reloadSchema = async (params: ReloadSchemaParams) => { req.append('wait_position', params.waitPosition); } - const { result } = await vtfetch(`/api/schemas/reload?${req}`, { method: 'put' }); + const { result } = await vtfetch(`/api/schemas/reload?${req}`, { + method: 'put', + }); const err = pb.ReloadSchemasResponse.verify(result); if (err) throw Error(err); @@ -574,7 +745,9 @@ export const deleteShard = async (params: DeleteShardParams) => { req.append('even_if_serving', String(params.evenIfServing)); req.append('recursive', String(params.recursive)); - const { result } = await vtfetch(`/api/shards/${params.clusterID}?${req}`, { method: 'delete' }); + const { result } = await vtfetch(`/api/shards/${params.clusterID}?${req}`, { + method: 'delete', + }); const err = vtctldata.DeleteShardsResponse.verify(result); if (err) throw Error(err); @@ -701,7 +874,10 @@ export interface RebuildKeyspaceGraphParams { export const rebuildKeyspaceGraph = async (params: RebuildKeyspaceGraphParams) => { const { result } = await vtfetch(`/api/keyspace/${params.clusterID}/${params.keyspace}/rebuild_keyspace_graph`, { method: 'put', - body: JSON.stringify({ cells: params.cells, allow_partial: params.allowPartial }), + body: JSON.stringify({ + cells: params.cells, + allow_partial: params.allowPartial, + }), }); const err = pb.RebuildKeyspaceGraphRequest.verify(result); if (err) throw Error(err); @@ -720,7 +896,11 @@ export interface RemoveKeyspaceCellParams { export const removeKeyspaceCell = async (params: RemoveKeyspaceCellParams) => { const { result } = await vtfetch(`/api/keyspace/${params.clusterID}/${params.keyspace}/remove_keyspace_cell`, { method: 'put', - body: JSON.stringify({ cell: params.cell, force: params.force, recursive: params.recursive }), + body: JSON.stringify({ + cell: params.cell, + force: params.force, + recursive: params.recursive, + }), }); const err = pb.RemoveKeyspaceCellRequest.verify(result); if (err) throw Error(err); @@ -840,3 +1020,37 @@ export const validateVersionShard = async (params: ValidateVersionShardParams) = return vtctldata.ValidateVersionShardResponse.create(result); }; + +export interface CreateVDiffParams { + clusterID: string; + request: vtctldata.IVDiffCreateRequest; +} + +export const createVDiff = async ({ clusterID, request }: CreateVDiffParams) => { + const { result } = await vtfetch(`/api/vdiff/${clusterID}/`, { + body: JSON.stringify(request), + method: 'post', + }); + + const err = vtctldata.VDiffCreateResponse.verify(result); + if (err) throw Error(err); + + return vtctldata.VDiffCreateResponse.create(result); +}; + +export interface ShowVDiffParams { + clusterID: string; + request: vtctldata.IVDiffShowRequest; +} + +export const showVDiff = async ({ clusterID, request }: ShowVDiffParams) => { + const { result } = await vtfetch(`/api/vdiff/${clusterID}/show`, { + body: JSON.stringify(request), + method: 'post', + }); + + const err = vtadmin.VDiffShowResponse.verify(result); + if (err) throw Error(err); + + return vtadmin.VDiffShowResponse.create(result); +}; diff --git a/web/vtadmin/src/components/App.tsx b/web/vtadmin/src/components/App.tsx index f7821f3a4ad..505ea7e64eb 100644 --- a/web/vtadmin/src/components/App.tsx +++ b/web/vtadmin/src/components/App.tsx @@ -40,6 +40,10 @@ import { isReadOnlyMode } from '../util/env'; import { CreateKeyspace } from './routes/createKeyspace/CreateKeyspace'; import { Topology } from './routes/topology/Topology'; import { ClusterTopology } from './routes/topology/ClusterTopology'; +import { CreateMoveTables } from './routes/createWorkflow/CreateMoveTables'; +import { Transactions } from './routes/Transactions'; +import { CreateReshard } from './routes/createWorkflow/CreateReshard'; +import { CreateMaterialize } from './routes/createWorkflow/CreateMaterialize'; export const App = () => { return ( @@ -105,10 +109,28 @@ export const App = () => { - + + {!isReadOnlyMode() && ( + + + + )} + + {!isReadOnlyMode() && ( + + + + )} + + {!isReadOnlyMode() && ( + + + + )} + @@ -117,6 +139,10 @@ export const App = () => { + + + + diff --git a/web/vtadmin/src/components/NavRail.tsx b/web/vtadmin/src/components/NavRail.tsx index e2897395760..9f9e1bf1681 100644 --- a/web/vtadmin/src/components/NavRail.tsx +++ b/web/vtadmin/src/components/NavRail.tsx @@ -65,6 +65,9 @@ export const NavRail = () => {
      +
    • + +
    • diff --git a/web/vtadmin/src/components/TextInput.module.scss b/web/vtadmin/src/components/TextInput.module.scss index cb087f68956..8611985108c 100644 --- a/web/vtadmin/src/components/TextInput.module.scss +++ b/web/vtadmin/src/components/TextInput.module.scss @@ -30,6 +30,7 @@ $iconPositionHorizontalLarge: 1.6rem; &:disabled { background: var(--backgroundSecondary); border-color: var(--backgroundSecondaryHighlight); + color: var(--colorDisabled); cursor: not-allowed; } diff --git a/web/vtadmin/src/components/dropdown/Dropdown.tsx b/web/vtadmin/src/components/dropdown/Dropdown.tsx index c6f7e1285c3..a0db3cdd313 100644 --- a/web/vtadmin/src/components/dropdown/Dropdown.tsx +++ b/web/vtadmin/src/components/dropdown/Dropdown.tsx @@ -2,10 +2,14 @@ import React, { Fragment } from 'react'; import { Icon, Icons } from '../Icon'; import { Menu, Transition } from '@headlessui/react'; import style from './Dropdown.module.scss'; +import cx from 'classnames'; + interface DropdownProps { // Optionally pass in your own button if you don't want it styled like DropdownButton dropdownButton: React.FC | Icons; position?: 'top-left' | 'top-right' | 'bottom-right' | 'bottom-left'; + title?: string; + className?: string; } const positions: Record = { @@ -16,14 +20,21 @@ const positions: Record = { default: 'right-0', }; -export const DropdownButton: React.FC<{ icon: Icons }> = ({ icon }) => ( +export const DropdownButton: React.FC<{ icon: Icons; title?: string; className?: string }> = ({ + icon, + title, + className, +}) => (
      @@ -31,16 +42,16 @@ export const DropdownButton: React.FC<{ icon: Icons }> = ({ icon }) => ( ); -const Dropdown: React.FC = ({ children, dropdownButton, position }) => { +const Dropdown: React.FC = ({ children, dropdownButton, position, title, className }) => { let button; if (typeof dropdownButton == 'string') { - button = ; + button = ; } else { const ButtonComponent = dropdownButton as React.FC; button = ; } return ( - + {button} = ({ children, dropdownButton, position void; } -const MenuItem: React.FC = ({ children, className, intent = 'none', ...props }) => { +const MenuItem: React.FC = ({ children, disabled, className, intent = 'none', ...props }) => { return (
    + +
    {row.dtid}
    +
    + +
    {formatTransactionState(row)}
    +
    + + {row.participants?.map((participant) => { + const shard = `${participant.keyspace}/${participant.shard}`; + return ( + + {shard} + + ); + })} + + +
    {formatDateTime(row.time_created)}
    +
    + {formatRelativeTimeInSeconds(row.time_created)} +
    +
    + + + + + + + ); + }); + }; + + return ( +
    + + In Flight Distributed Transactions + + + +
    + + setParams((prevParams) => ({ ...prevParams, abandonAge: option?.abandonAge })) + } + placeholder={'Select abandon age'} + renderItem={(option) => `${option?.displayText}`} + selectedItem={selectedAbandonAge} + /> +
    + + +
    +
    + ); +}; diff --git a/web/vtadmin/src/components/routes/Workflows.tsx b/web/vtadmin/src/components/routes/Workflows.tsx index 32ddfcfb825..572907fba3c 100644 --- a/web/vtadmin/src/components/routes/Workflows.tsx +++ b/web/vtadmin/src/components/routes/Workflows.tsx @@ -35,9 +35,18 @@ import { Tooltip } from '../tooltip/Tooltip'; import { KeyspaceLink } from '../links/KeyspaceLink'; import { QueryLoadingPlaceholder } from '../placeholders/QueryLoadingPlaceholder'; import { UseQueryResult } from 'react-query'; +import { ReadOnlyGate } from '../ReadOnlyGate'; +import Dropdown from '../dropdown/Dropdown'; +import MenuItem from '../dropdown/MenuItem'; +import { Icons } from '../Icon'; +import WorkflowActions from './workflows/WorkflowActions'; +import { isReadOnlyMode } from '../../util/env'; export const ThrottleThresholdSeconds = 60; +const COLUMNS = ['Workflow', 'Source', 'Target', 'Streams', 'Last Updated', 'Actions']; +const READ_ONLY_COLUMNS = ['Workflow', 'Source', 'Target', 'Streams', 'Last Updated']; + export const Workflows = () => { useDocumentTitle('Workflows'); const workflowsQuery = useWorkflows(); @@ -180,6 +189,20 @@ export const Workflows = () => {
    {formatDateTime(row.timeUpdated)}
    {formatRelativeTime(row.timeUpdated)}
    + + + + + + ); }); @@ -187,7 +210,28 @@ export const Workflows = () => { return (
    - Workflows +
    + Workflows + +
    + + + MoveTables + + + Reshard + + + Materialize + + +
    +
    +
    { /> diff --git a/web/vtadmin/src/components/routes/createWorkflow/CreateMaterialize.tsx b/web/vtadmin/src/components/routes/createWorkflow/CreateMaterialize.tsx new file mode 100644 index 00000000000..c5d688a1fb7 --- /dev/null +++ b/web/vtadmin/src/components/routes/createWorkflow/CreateMaterialize.tsx @@ -0,0 +1,350 @@ +/** + * Copyright 2024 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. + */ +import { useEffect, useState } from 'react'; +import { Link, useHistory } from 'react-router-dom'; + +import { useClusters, useCreateMaterialize, useKeyspaces, useSchemas } from '../../../hooks/api'; +import { useDocumentTitle } from '../../../hooks/useDocumentTitle'; +import { Label } from '../../inputs/Label'; +import { Select } from '../../inputs/Select'; +import { ContentContainer } from '../../layout/ContentContainer'; +import { NavCrumbs } from '../../layout/NavCrumbs'; +import { WorkspaceHeader } from '../../layout/WorkspaceHeader'; +import { WorkspaceTitle } from '../../layout/WorkspaceTitle'; +import { TextInput } from '../../TextInput'; +import { success } from '../../Snackbar'; +import { FormError } from '../../forms/FormError'; +import Toggle from '../../toggle/Toggle'; +import { tabletmanagerdata, vtadmin, vtctldata } from '../../../proto/vtadmin'; +import { MultiSelect } from '../../inputs/MultiSelect'; +import { TABLET_TYPES } from '../../../util/tablets'; +import ErrorDialog from './ErrorDialog'; + +interface FormData { + clusterID: string; + workflow: string; + targetKeyspace: string; + sourceKeyspace: string; + tableSettings: string; + cells: string; + referenceTables: string[]; + tabletTypes: number[]; + stopAfterCopy: boolean; + tabletSelectionPreference: boolean; +} + +const DEFAULT_FORM_DATA: FormData = { + clusterID: '', + workflow: '', + targetKeyspace: '', + sourceKeyspace: '', + tableSettings: '', + cells: '', + referenceTables: [], + tabletTypes: [1, 2], + stopAfterCopy: false, + tabletSelectionPreference: true, +}; + +const TABLET_OPTIONS = [1, 2, 3]; + +export const CreateMaterialize = () => { + useDocumentTitle('Create a Materialize Workflow'); + + const history = useHistory(); + + const [formData, setFormData] = useState(DEFAULT_FORM_DATA); + + const [clusterKeyspaces, setClusterKeyspaces] = useState([]); + + const [targetTables, setTargetTables] = useState([]); + + const [errorDialogOpen, setErrorDialogOpen] = useState(false); + + const { data: schemas = [] } = useSchemas(); + + const { data: clusters = [], ...clustersQuery } = useClusters(); + + const { data: keyspaces = [], ...keyspacesQuery } = useKeyspaces(); + + const mutation = useCreateMaterialize( + { + clusterID: formData.clusterID, + tableSettings: formData.tableSettings, + request: { + settings: { + workflow: formData.workflow, + source_keyspace: formData.sourceKeyspace, + target_keyspace: formData.targetKeyspace, + reference_tables: formData.referenceTables, + cell: formData.cells + .split(',') + .map((cell) => cell.trim()) + .join(','), + tablet_types: formData.tabletTypes.map((tt) => TABLET_TYPES[tt]).join(','), + stop_after_copy: formData.stopAfterCopy, + tablet_selection_preference: formData.tabletSelectionPreference + ? tabletmanagerdata.TabletSelectionPreference.INORDER + : tabletmanagerdata.TabletSelectionPreference.ANY, + // Default Value + materialization_intent: vtctldata.MaterializationIntent.CUSTOM, + }, + }, + }, + { + onSuccess: () => { + success(`Created workflow ${formData.workflow}`, { autoClose: 1600 }); + history.push(`/workflows`); + }, + onError: () => { + setErrorDialogOpen(true); + }, + } + ); + + let selectedCluster = null; + if (!!formData.clusterID) { + selectedCluster = clusters.find((c) => c.id === formData.clusterID); + } + + let selectedSourceKeyspace = null; + if (!!formData.sourceKeyspace) { + selectedSourceKeyspace = keyspaces.find((ks) => ks.keyspace?.name === formData.sourceKeyspace); + } + + let selectedTargetKeyspace = null; + if (!!formData.targetKeyspace) { + selectedTargetKeyspace = keyspaces.find((ks) => ks.keyspace?.name === formData.targetKeyspace); + } + + const isValid = + !!selectedCluster && + !!formData.sourceKeyspace && + !!formData.targetKeyspace && + !!formData.workflow && + !!formData.tableSettings; + + const isDisabled = !isValid || mutation.isLoading; + + const onSubmit: React.FormEventHandler = (e) => { + e.preventDefault(); + mutation.mutate(); + }; + + useEffect(() => { + // Clear out the selected keyspaces if selected cluster is changed. + setFormData((prevFormData) => ({ ...prevFormData, sourceKeyspace: '', targetKeyspace: '' })); + setClusterKeyspaces(keyspaces.filter((ks) => ks.cluster?.id === formData.clusterID)); + }, [formData.clusterID, keyspaces]); + + useEffect(() => { + if (clusters.length === 1) { + setFormData((prevFormData) => ({ ...prevFormData, clusterID: clusters[0].id })); + } + }, [clusters]); + + useEffect(() => { + // Clear out the selected tables if the source keypsace is changed. + setFormData((prevFormData) => ({ ...prevFormData, tables: [] })); + setTargetTables([]); + if (schemas) { + const schemaData = schemas.find( + (s) => s.keyspace === formData.targetKeyspace && s.cluster?.id === formData.clusterID + ); + if (schemaData) { + setTargetTables(schemaData?.table_definitions.map((def) => def.name || '')); + } + } + }, [formData.targetKeyspace, formData.clusterID, schemas]); + + return ( +
    + + + Workflows + + + Create New Materialize Workflow + + + +
    +
    + + ks?.keyspace?.name || ''} + items={clusterKeyspaces} + label="Target Keyspace" + onChange={(ks) => setFormData({ ...formData, targetKeyspace: ks?.keyspace?.name || '' })} + placeholder={keyspacesQuery.isLoading ? 'Loading keyspaces...' : 'Select a keyspace'} + renderItem={(ks) => `${ks?.keyspace?.name}`} + selectedItem={selectedTargetKeyspace} + /> + +
    + +

    Advanced

    + +
    + + ks?.keyspace?.name || ''} + items={clusterKeyspaces} + label="Source Keyspace" + onChange={(ks) => setFormData({ ...formData, sourceKeyspace: ks?.keyspace?.name || '' })} + placeholder={keyspacesQuery.isLoading ? 'Loading keyspaces...' : 'Select a keyspace'} + renderItem={(ks) => `${ks?.keyspace?.name}`} + selectedItem={selectedSourceKeyspace} + /> + setFormData({ ...formData, onDDL: option || '' })} + placeholder={'Select the OnDDL strategy'} + selectedItem={formData.onDDL} + /> + ks?.keyspace?.name || ''} + items={clusterKeyspaces} + label="Keyspace" + onChange={(ks) => setFormData({ ...formData, keyspace: ks?.keyspace?.name || '' })} + placeholder={keyspacesQuery.isLoading ? 'Loading keyspaces...' : 'Select a keyspace'} + renderItem={(ks) => `${ks?.keyspace?.name}`} + selectedItem={selectedKeyspace} + /> +
    + + +
    +
    + +
    +
    + setFormData({ ...formData, autoStart: !formData.autoStart })} + /> +
    +
    + +

    Advanced

    + +
    + + cluster?.name || ''} + items={clusters} + label="Cluster" + onChange={(c) => setFormData({ ...formData, clusterID: c?.id || '' })} + placeholder={clustersQuery.isLoading ? 'Loading clusters...' : 'Select a cluster'} + renderItem={(c) => `${c?.name} (${c?.id})`} + selectedItem={selectedCluster} + /> + TABLET_TYPES[tt]} + selectedItems={formData.tabletTypes} + label="Tablet Types" + helpText={'Source tablet types to replicate table data from'} + onChange={(types) => setFormData({ ...formData, tabletTypes: types })} + placeholder="Select tablet types" + /> +
    + +
    +
    +
    + + setFormData({ + ...formData, + tabletSelectionPreference: !formData.tabletSelectionPreference, + }) + } + /> +
    +
    + +
    +
    + + setFormData({ ...formData, skipSchemaCopy: !formData.skipSchemaCopy }) + } + /> +
    +
    + +
    +
    + + setFormData({ ...formData, stopAfterCopy: !formData.stopAfterCopy }) + } + /> +
    +
    + +
    +
    + + setFormData({ ...formData, deferSecondaryKeys: !formData.deferSecondaryKeys }) + } + /> +
    +
    +
    + + {clustersQuery.isError && ( + + )} + +
    + +
    + + + {mutation.isError && !mutation.isLoading && ( + { + setErrorDialogOpen(false); + }} + /> + )} +
    +
    + ); +}; diff --git a/web/vtadmin/src/components/routes/createWorkflow/ErrorDialog.tsx b/web/vtadmin/src/components/routes/createWorkflow/ErrorDialog.tsx new file mode 100644 index 00000000000..25ac5dedb0b --- /dev/null +++ b/web/vtadmin/src/components/routes/createWorkflow/ErrorDialog.tsx @@ -0,0 +1,41 @@ +/** + * Copyright 2024 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. + */ +import React from 'react'; +import Dialog from '../../dialog/Dialog'; +import { Icon, Icons } from '../../Icon'; + +export interface ErrorDialogProps { + errorTitle?: string; + errorDescription: string; + isOpen: boolean; + onClose: () => void; +} + +const ErrorDialog: React.FC = ({ errorTitle, errorDescription, isOpen, onClose }) => { + return ( + +
    + + + +
    {errorTitle || 'Error'}
    +
    {errorDescription}
    +
    +
    + ); +}; + +export default ErrorDialog; diff --git a/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx b/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx index 28d10712074..6b123258d3c 100644 --- a/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx +++ b/web/vtadmin/src/components/routes/keyspaces/KeyspaceActions.tsx @@ -24,7 +24,7 @@ const KeyspaceActions: React.FC = ({ keyspace, clusterID } return (
    - + setCurrentDialog('Validate Keyspace')}>Validate Keyspace setCurrentDialog('Validate Schema')}>Validate Schema setCurrentDialog('Validate Version')}>Validate Version diff --git a/web/vtadmin/src/components/routes/tablets/InfoDropdown.tsx b/web/vtadmin/src/components/routes/tablets/InfoDropdown.tsx index dd7616b5396..451882251e2 100644 --- a/web/vtadmin/src/components/routes/tablets/InfoDropdown.tsx +++ b/web/vtadmin/src/components/routes/tablets/InfoDropdown.tsx @@ -50,7 +50,7 @@ const InfoDropdown: React.FC = ({ alias, clusterID }) => { return (
    - + openDialog('ping')}>Ping openDialog('refresh')}>Refresh state openDialog('healthcheck')}>Run health check diff --git a/web/vtadmin/src/components/routes/transactions/TransactionAction.tsx b/web/vtadmin/src/components/routes/transactions/TransactionAction.tsx new file mode 100644 index 00000000000..bfb91569421 --- /dev/null +++ b/web/vtadmin/src/components/routes/transactions/TransactionAction.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import { Icon, Icons } from '../../Icon'; +import Dialog from '../../dialog/Dialog'; +import { UseMutationResult } from 'react-query'; + +interface TransactionActionProps { + isOpen: boolean; + mutation: UseMutationResult; + title: string; + confirmText: string; + successText: string; + errorText: string; + loadingText: string; + description?: string; + body?: JSX.Element; + refetchTransactions: Function; + closeDialog: () => void; +} + +const TransactionAction: React.FC = ({ + isOpen, + closeDialog, + mutation, + title, + confirmText, + description, + successText, + loadingText, + errorText, + refetchTransactions, + body, +}) => { + const onCloseDialog = () => { + setTimeout(mutation.reset, 500); + closeDialog(); + }; + + const hasRun = mutation.data || mutation.error; + const onConfirm = () => { + mutation.mutate( + {}, + { + onSuccess: () => { + refetchTransactions(); + }, + } + ); + }; + return ( + +
    + {!hasRun && body} + {mutation.data && !mutation.error && ( +
    + + + +
    {successText}
    +
    + )} + {mutation.error && ( +
    + + + +
    {errorText}
    +
    {mutation.error.message}
    +
    + )} +
    +
    + ); +}; + +export default TransactionAction; diff --git a/web/vtadmin/src/components/routes/transactions/TransactionActions.tsx b/web/vtadmin/src/components/routes/transactions/TransactionActions.tsx new file mode 100644 index 00000000000..a9b71a010dc --- /dev/null +++ b/web/vtadmin/src/components/routes/transactions/TransactionActions.tsx @@ -0,0 +1,45 @@ +import React, { useState } from 'react'; +import Dropdown from '../../dropdown/Dropdown'; +import MenuItem from '../../dropdown/MenuItem'; +import { Icons } from '../../Icon'; +import TransactionAction from './TransactionAction'; +import { useConcludeTransaction } from '../../../hooks/api'; + +interface TransactionActionsProps { + refetchTransactions: Function; + clusterID: string; + dtid: string; +} + +const TransactionActions: React.FC = ({ refetchTransactions, clusterID, dtid }) => { + const [currentDialog, setCurrentDialog] = useState(''); + const closeDialog = () => setCurrentDialog(''); + + const concludeTransactionMutation = useConcludeTransaction({ clusterID, dtid }); + + return ( +
    + + setCurrentDialog('Conclude Transaction')}>Conclude Transaction + + + Conclude the transaction with id: {dtid}. +
    + } + /> +
    + ); +}; + +export default TransactionActions; diff --git a/web/vtadmin/src/components/routes/workflow/Workflow.tsx b/web/vtadmin/src/components/routes/workflow/Workflow.tsx index a81901786d8..939d1c6d386 100644 --- a/web/vtadmin/src/components/routes/workflow/Workflow.tsx +++ b/web/vtadmin/src/components/routes/workflow/Workflow.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ import { Link, Redirect, Route, Switch, useParams, useRouteMatch } from 'react-router-dom'; +import { useState } from 'react'; import style from './Workflow.module.scss'; @@ -24,11 +25,16 @@ import { WorkspaceTitle } from '../../layout/WorkspaceTitle'; import { useDocumentTitle } from '../../../hooks/useDocumentTitle'; import { KeyspaceLink } from '../../links/KeyspaceLink'; import { WorkflowStreams } from './WorkflowStreams'; +import { WorkflowDetails } from './WorkflowDetails'; import { ContentContainer } from '../../layout/ContentContainer'; import { TabContainer } from '../../tabs/TabContainer'; import { Tab } from '../../tabs/Tab'; import { getStreams } from '../../../util/workflows'; import { Code } from '../../Code'; +import { ShardLink } from '../../links/ShardLink'; +import { WorkflowVDiff } from './WorkflowVDiff'; +import { Select } from '../../inputs/Select'; +import { formatDateTimeShort } from '../../../util/time'; interface RouteParams { clusterID: string; @@ -36,44 +42,131 @@ interface RouteParams { name: string; } +const REFETCH_OPTIONS = [ + { + displayText: '10s', + interval: 10 * 1000, + }, + { + displayText: '30s', + interval: 30 * 1000, + }, + { + displayText: '1m', + interval: 60 * 1000, + }, + { + displayText: '10m', + interval: 600 * 1000, + }, + { + displayText: 'Never', + interval: 0, + }, +]; + export const Workflow = () => { const { clusterID, keyspace, name } = useParams(); const { path, url } = useRouteMatch(); useDocumentTitle(`${name} (${keyspace})`); - const { data } = useWorkflow({ clusterID, keyspace, name }); + const [refetchInterval, setRefetchInterval] = useState(60 * 1000); + + const { data, ...workflowQuery } = useWorkflow({ clusterID, keyspace, name }, { refetchInterval }); const streams = getStreams(data); + let isReshard = false; + if (data && data.workflow) { + isReshard = data.workflow.workflow_type === 'Reshard'; + } + return (
    - - Workflows - +
    +
    + + Workflows + + {name} +
    - {name} +
    +
    + {row.streamSummary ? row.streamSummary : '-'} + {row.workflowStatus ? row.workflowStatus.traffic_state : '-'} + {maxVReplicationLag} + + {reverseWorkflow ? ( + + {reverseWorkflow.workflow?.name} + + ) : ( + '-' + )} + + + ); + }); + }; + + const renderStreamRows = (rows: typeof streams) => { + return rows.map((row) => { + const source = getStreamSource(row); + const target = getStreamTarget(row, keyspace); + const href = + row.tablet && row.id + ? `/workflow/${clusterID}/${keyspace}/${name}/stream/${row.tablet.cell}/${row.tablet.uid}/${row.id}` + : null; + + var isThrottled = + Number(row?.throttler_status?.time_throttled?.seconds) > Date.now() / 1000 - ThrottleThresholdSeconds; + const rowState = isThrottled ? 'Throttled' : row.state; + return ( + + + + + {' '} + + + + {row.key} + +
    + Tablet{' '} + + {formatAlias(row.tablet)} + +
    +
    + Updated {formatDateTimeShort(row.time_updated?.seconds)} +
    + {isThrottled ? ( +
    + Throttled: + in {row.throttler_status?.component_throttled} +
    + ) : null} +
    + + {source ? ( + + {source} + + ) : ( + '-' + )} + + + {target ? ( + + {target} + + ) : ( + '-' + )} + + {row.message ? row.message : '-'} + + {row.transaction_timestamp && row.transaction_timestamp.seconds + ? `${formatDateTimeShort(row.transaction_timestamp.seconds)}` + : '-'} + + {row.db_name} + + ); + }); + }; + + const renderLogRows = (rows: vtctldata.Workflow.Stream.ILog[]) => { + return rows.map((row) => { + let message: string = row.message ? `${row.message}` : '-'; + // TODO: Investigate if message needs to be JSON parsed in case of "Stream Created" + if (row.type === 'Stream Created') { + message = '-'; + } + return ( + + {`${row.type}`} + {`${row.state}`} + {`${formatDateTimeShort(parseInt(`${row.updated_at?.seconds}`, 10))}`} + {message} + {`${row.count}`} + + ); + }); + }; + + const renderTableCopyStateRows = (tableCopyStates: TableCopyState[]) => { + return tableCopyStates.map((copyState, index) => { + const tableKey = `${copyState.tableName}/${index}`; + return ( + + {`${copyState.tableName}`} + {copyState.bytes_total ? `${copyState.bytes_total}` : `N/A`} + + {copyState.bytes_copied ? `${copyState.bytes_copied}` : `N/A`}{' '} + {copyState.bytes_percentage ? `(${copyState.bytes_percentage}%)` : ``} + + {copyState.rows_total ? `${copyState.rows_total}` : `N/A`} + + {copyState.rows_copied ? `${copyState.rows_copied}` : `N/A`}{' '} + {copyState.rows_percentage ? `(${copyState.rows_percentage}%)` : ``} + + + ); + }); + }; + + return ( +
    + + + + {tableCopyStates && ( + + )} +

    Recent Logs

    + {streams.length <= 8 ? ( + streams.map((stream) => ( +
    + +
    + )) + ) : ( + Recent logs from streams are not displayed due to the large number of shards. + )} +
    + ); +}; diff --git a/web/vtadmin/src/components/routes/workflow/WorkflowStreams.tsx b/web/vtadmin/src/components/routes/workflow/WorkflowStreams.tsx index 2d86e1141a6..27696b68b93 100644 --- a/web/vtadmin/src/components/routes/workflow/WorkflowStreams.tsx +++ b/web/vtadmin/src/components/routes/workflow/WorkflowStreams.tsx @@ -14,22 +14,10 @@ * limitations under the License. */ -import { groupBy, orderBy } from 'lodash-es'; -import React, { useMemo } from 'react'; -import { Link } from 'react-router-dom'; +import React from 'react'; -import { useWorkflow } from '../../../hooks/api'; -import { formatAlias } from '../../../util/tablets'; -import { formatDateTime, formatRelativeTime } from '../../../util/time'; -import { formatStreamKey, getStreams, getStreamSource, getStreamTarget } from '../../../util/workflows'; -import { DataCell } from '../../dataTable/DataCell'; -import { DataTable } from '../../dataTable/DataTable'; -import { TabletLink } from '../../links/TabletLink'; -import { StreamStatePip } from '../../pips/StreamStatePip'; import { WorkflowStreamsLagChart } from '../../charts/WorkflowStreamsLagChart'; -import { ShardLink } from '../../links/ShardLink'; import { env } from '../../../util/env'; -import { ThrottleThresholdSeconds } from '../Workflows'; interface Props { clusterID: string; @@ -37,83 +25,7 @@ interface Props { name: string; } -const COLUMNS = ['Stream', 'Source', 'Target', 'Tablet']; - export const WorkflowStreams = ({ clusterID, keyspace, name }: Props) => { - const { data } = useWorkflow({ clusterID, keyspace, name }); - - const streams = useMemo(() => { - const rows = getStreams(data).map((stream) => ({ - key: formatStreamKey(stream), - ...stream, - })); - - return orderBy(rows, 'streamKey'); - }, [data]); - - const streamsByState = groupBy(streams, 'state'); - - const renderRows = (rows: typeof streams) => { - return rows.map((row) => { - const href = - row.tablet && row.id - ? `/workflow/${clusterID}/${keyspace}/${name}/stream/${row.tablet.cell}/${row.tablet.uid}/${row.id}` - : null; - - const source = getStreamSource(row); - const target = getStreamTarget(row, keyspace); - var isThrottled = - Number(row?.throttler_status?.time_throttled?.seconds) > Date.now() / 1000 - ThrottleThresholdSeconds; - const rowState = isThrottled ? 'Throttled' : row.state; - return ( - - - {' '} - - {row.key} - -
    - Updated {formatDateTime(row.time_updated?.seconds)} -
    - {isThrottled ? ( -
    - Throttled: - in {row.throttler_status?.component_throttled} -
    - ) : null} -
    - - {source ? ( - - {source} - - ) : ( - N/A - )} - - - {target ? ( - - {target} - - ) : ( - N/A - )} - - - - {formatAlias(row.tablet)} - - - - ); - }); - }; - return (
    {env().VITE_ENABLE_EXPERIMENTAL_TABLET_DEBUG_VARS && ( @@ -122,29 +34,6 @@ export const WorkflowStreams = ({ clusterID, keyspace, name }: Props) => { )} - -

    - Streams -

    - {/* TODO(doeg): add a protobuf enum for this (https://github.com/vitessio/vitess/projects/12#card-60190340) */} - {['Error', 'Copying', 'Running', 'Stopped'].map((streamState) => { - if (!Array.isArray(streamsByState[streamState])) { - return null; - } - - return ( -
    - -
    - ); - })}
    ); }; diff --git a/web/vtadmin/src/components/routes/workflow/WorkflowVDiff.tsx b/web/vtadmin/src/components/routes/workflow/WorkflowVDiff.tsx new file mode 100644 index 00000000000..f3ec33488b6 --- /dev/null +++ b/web/vtadmin/src/components/routes/workflow/WorkflowVDiff.tsx @@ -0,0 +1,168 @@ +/** + * Copyright 2024 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. + */ + +import React, { useMemo, useState } from 'react'; + +import { useCreateVDiff, useShowVDiff } from '../../../hooks/api'; +import { DataTable } from '../../dataTable/DataTable'; +import { DataCell } from '../../dataTable/DataCell'; +import Dialog from '../../dialog/Dialog'; +import { Icon, Icons } from '../../Icon'; + +interface Props { + clusterID: string; + keyspace: string; + name: string; +} + +const COLUMNS = ['Shard', 'State', 'Has Mismatch', 'Rows Compared', 'Started At', 'Completed At', 'Progress']; + +export const WorkflowVDiff = ({ clusterID, keyspace, name }: Props) => { + const [dialogOpen, setDialogOpen] = useState(false); + + // Status for the last VDiff + const { data: lastVDiffStatus, ...showVDiffQuery } = useShowVDiff({ + clusterID, + request: { + target_keyspace: keyspace, + workflow: name, + arg: 'last', + }, + }); + + const createVDiffMutation = useCreateVDiff( + { + clusterID: clusterID, + request: { + target_keyspace: keyspace, + workflow: name, + }, + }, + { + onSuccess: () => { + showVDiffQuery.refetch(); + }, + } + ); + + const handleCreateVDiff = () => { + createVDiffMutation.mutate(); + }; + + let hasMutationRun = !!createVDiffMutation.data || !!createVDiffMutation.error; + + const closeDialog = () => { + setDialogOpen(false); + setTimeout(createVDiffMutation.reset, 500); + }; + + const shardReports = useMemo(() => { + if (!lastVDiffStatus) { + return []; + } + return Object.keys(lastVDiffStatus.shard_report).map((shard) => { + return { + shard, + ...lastVDiffStatus.shard_report[shard], + }; + }); + }, [lastVDiffStatus]); + + const isStatusEmpty = + !lastVDiffStatus || + (Object.keys(lastVDiffStatus.shard_report).length === 1 && + !lastVDiffStatus.shard_report[Object.keys(lastVDiffStatus.shard_report)[0]].state); + + const renderRows = (rows: typeof shardReports) => { + return rows.map((row) => { + let hasMismatch = 'False'; + if (row.has_mismatch) { + hasMismatch = 'True'; + } + const progress = + row.progress && row.progress.eta ? `ETA: ${row.progress.eta} (${row.progress.percentage}%)` : '-'; + return ( + + {row.shard} + {row.state ? row.state.toUpperCase() : '-'} + {hasMismatch} + {row.rows_compared ? `${row.rows_compared}` : '-'} + {row.started_at ? row.started_at : '-'} + {row.completed_at ? row.completed_at : '-'} + {progress} + + ); + }); + }; + + return ( +
    +
    +

    Last VDiff Status

    +
    + +
    +
    + {!isStatusEmpty ? ( + + ) : ( +
    No VDiff status to show.
    + )} + +
    + {createVDiffMutation.data && !createVDiffMutation.error && ( +
    + + + +
    Created VDiff
    + Successfully created VDiff: {createVDiffMutation.data.UUID} +
    + )} + {createVDiffMutation.error && ( +
    + + + +
    Error creating VDiff
    + {createVDiffMutation.error.message} +
    + )} +
    +
    +
    + ); +}; diff --git a/web/vtadmin/src/components/routes/workflows/WorkflowAction.tsx b/web/vtadmin/src/components/routes/workflows/WorkflowAction.tsx new file mode 100644 index 00000000000..ebc667272cd --- /dev/null +++ b/web/vtadmin/src/components/routes/workflows/WorkflowAction.tsx @@ -0,0 +1,100 @@ +import React from 'react'; +import { Icon, Icons } from '../../Icon'; +import Dialog from '../../dialog/Dialog'; +import { UseMutationResult } from 'react-query'; + +interface WorkflowActionProps { + isOpen: boolean; + mutation: UseMutationResult; + title: string; + confirmText: string; + successText?: string; + errorText: string; + errorDescription?: string; + loadingText: string; + description?: string; + className?: string; + body?: JSX.Element; + successBody?: JSX.Element; + hideSuccessDialog?: boolean; + refetchWorkflows: Function; + closeDialog: () => void; +} + +const WorkflowAction: React.FC = ({ + isOpen, + closeDialog, + mutation, + title, + confirmText, + description, + successText, + successBody, + loadingText, + errorText, + errorDescription, + refetchWorkflows, + hideSuccessDialog, + body, + className, +}) => { + const onCloseDialog = () => { + setTimeout(mutation.reset, 500); + closeDialog(); + }; + + const hasRun = mutation.data || mutation.error; + const onConfirm = () => { + mutation.mutate( + {}, + { + onSuccess: () => { + if (hideSuccessDialog) { + closeDialog(); + } + refetchWorkflows(); + }, + } + ); + }; + return ( + +
    + {!hasRun && body} + {!hideSuccessDialog && mutation.data && !mutation.error && ( +
    + + + +
    {successText}
    + {successBody} +
    + )} + {mutation.error && ( +
    + + + +
    {errorText}
    + {errorDescription &&
    {errorDescription}
    } +
    + )} +
    +
    + ); +}; + +export default WorkflowAction; diff --git a/web/vtadmin/src/components/routes/workflows/WorkflowActions.tsx b/web/vtadmin/src/components/routes/workflows/WorkflowActions.tsx new file mode 100644 index 00000000000..f8ac57162b4 --- /dev/null +++ b/web/vtadmin/src/components/routes/workflows/WorkflowActions.tsx @@ -0,0 +1,405 @@ +import React, { useState } from 'react'; +import Dropdown from '../../dropdown/Dropdown'; +import MenuItem from '../../dropdown/MenuItem'; +import { Icons } from '../../Icon'; +import WorkflowAction from './WorkflowAction'; +import { + useCompleteMoveTables, + useStartWorkflow, + useStopWorkflow, + useWorkflowDelete, + useWorkflowSwitchTraffic, +} from '../../../hooks/api'; +import Toggle from '../../toggle/Toggle'; +import { success } from '../../Snackbar'; +import { vtadmin, vtctldata } from '../../../proto/vtadmin'; +import { getReverseWorkflow } from '../../../util/workflows'; + +interface WorkflowActionsProps { + streamsByState: { + [index: string]: vtctldata.Workflow.IStream[]; + }; + workflows?: vtadmin.Workflow[]; + refetchWorkflows: Function; + keyspace: string; + clusterID: string; + name: string; + workflowType: string; +} + +interface CompleteMoveTablesOptions { + keepData: boolean; + keepRoutingRoules: boolean; + renameTables: boolean; +} + +const DefaultCompleteMoveTablesOptions: CompleteMoveTablesOptions = { + keepData: false, + keepRoutingRoules: false, + renameTables: false, +}; + +interface CancelWorkflowOptions { + keepData: boolean; + keepRoutingRoules: boolean; +} + +const DefaultCancelWorkflowOptions: CancelWorkflowOptions = { + keepData: false, + keepRoutingRoules: false, +}; + +const WorkflowActions: React.FC = ({ + streamsByState, + workflows, + refetchWorkflows, + keyspace, + clusterID, + name, + workflowType, +}) => { + const [currentDialog, setCurrentDialog] = useState(''); + + const [completeMoveTablesOptions, SetCompleteMoveTablesOptions] = useState( + DefaultCompleteMoveTablesOptions + ); + + const [cancelWorkflowOptions, SetCancelWorkflowOptions] = + useState(DefaultCancelWorkflowOptions); + + const closeDialog = () => setCurrentDialog(''); + + const startWorkflowMutation = useStartWorkflow({ keyspace, clusterID, name }); + + const stopWorkflowMutation = useStopWorkflow({ keyspace, clusterID, name }); + + const switchTrafficMutation = useWorkflowSwitchTraffic({ + clusterID, + request: { + keyspace: keyspace, + workflow: name, + direction: 0, + }, + }); + + const reverseTrafficMutation = useWorkflowSwitchTraffic({ + clusterID, + request: { + keyspace: keyspace, + workflow: name, + direction: 1, + }, + }); + + const cancelWorkflowMutation = useWorkflowDelete( + { + clusterID, + request: { + keyspace: keyspace, + workflow: name, + keep_data: cancelWorkflowOptions.keepData, + keep_routing_rules: cancelWorkflowOptions.keepRoutingRoules, + }, + }, + { + onSuccess: (data) => { + success(data.summary, { autoClose: 1600 }); + }, + } + ); + + const completeMoveTablesMutation = useCompleteMoveTables( + { + clusterID, + request: { + workflow: name, + target_keyspace: keyspace, + keep_data: completeMoveTablesOptions.keepData, + keep_routing_rules: completeMoveTablesOptions.keepRoutingRoules, + rename_tables: completeMoveTablesOptions.renameTables, + }, + }, + { + onSuccess: (data) => { + success(data.summary, { autoClose: 1600 }); + }, + } + ); + + const isMoveTablesWorkflow = workflowType === 'MoveTables'; + + const isRunning = + !(streamsByState['Error'] && streamsByState['Error'].length) && + !(streamsByState['Copying'] && streamsByState['Copying'].length) && + !(streamsByState['Stopped'] && streamsByState['Stopped'].length); + + const isStopped = + !(streamsByState['Error'] && streamsByState['Error'].length) && + !(streamsByState['Copying'] && streamsByState['Copying'].length) && + !(streamsByState['Running'] && streamsByState['Running'].length); + + const isSwitched = + workflows && + isStopped && + !!getReverseWorkflow( + workflows, + workflows.find((w) => w.workflow?.name === name && w.cluster?.id === clusterID) + ); + + const isReverseWorkflow = name.endsWith('_reverse'); + + return ( +
    + + {!isReverseWorkflow && ( + <> + {isMoveTablesWorkflow && isSwitched && ( + setCurrentDialog('Complete MoveTables')}>Complete + )} + {isRunning && ( + setCurrentDialog('Switch Traffic')}>Switch Traffic + )} + {isSwitched && ( + setCurrentDialog('Reverse Traffic')}>Reverse Traffic + )} + {!isSwitched && ( + setCurrentDialog('Cancel Workflow')}>Cancel Workflow + )} + + )} + {!isRunning && setCurrentDialog('Start Workflow')}>Start Workflow} + {!isStopped && setCurrentDialog('Stop Workflow')}>Stop Workflow} + + + {startWorkflowMutation.data && startWorkflowMutation.data.summary && ( +
    {startWorkflowMutation.data.summary}
    + )} +
    + } + body={ +
    + Start the {name} workflow. +
    + } + /> + + {stopWorkflowMutation.data && stopWorkflowMutation.data.summary && ( +
    {stopWorkflowMutation.data.summary}
    + )} + + } + body={ +
    + Stop the {name} workflow. +
    + } + /> + + {switchTrafficMutation.data && switchTrafficMutation.data.summary && ( +
    {switchTrafficMutation.data.summary}
    + )} + + } + body={ +
    + Switch traffic for the {name} workflow. +
    + } + /> + + {reverseTrafficMutation.data && reverseTrafficMutation.data.summary && ( +
    {reverseTrafficMutation.data.summary}
    + )} + + } + body={ +
    + Reverse traffic for the {name} workflow. +
    + } + /> + + {cancelWorkflowMutation.data && cancelWorkflowMutation.data.summary && ( +
    {cancelWorkflowMutation.data.summary}
    + )} + + } + body={ +
    +
    +
    +
    Keep Data
    +

    + Keep the partially copied table data from the MoveTables workflow in the target + keyspace. +

    +
    + + SetCancelWorkflowOptions((prevOptions) => ({ + ...prevOptions, + keepData: !prevOptions.keepData, + })) + } + /> +
    +
    +
    +
    Keep Routing Rules
    +

    + Keep the routing rules created for the MoveTables workflow. +

    +
    + + SetCancelWorkflowOptions((prevOptions) => ({ + ...prevOptions, + keepRoutingRoules: !prevOptions.keepRoutingRoules, + })) + } + /> +
    +
    + } + /> + +
    +
    +
    Keep Data
    +

    + Keep the original source table data that was copied by the MoveTables workflow. +

    +
    + + SetCompleteMoveTablesOptions((prevOptions) => ({ + ...prevOptions, + keepData: !prevOptions.keepData, + })) + } + /> +
    +
    +
    +
    Keep Routing Rules
    +

    + Keep the routing rules in place that direct table traffic from the source keyspace + to the target keyspace of the MoveTables workflow. +

    +
    + + SetCompleteMoveTablesOptions((prevOptions) => ({ + ...prevOptions, + keepRoutingRoules: !prevOptions.keepRoutingRoules, + })) + } + /> +
    +
    +
    +
    Rename Tables
    +

    + Keep the original source table data that was copied by the MoveTables workflow, but + rename each table to{' '} + {'__old'}. +

    +
    + + SetCompleteMoveTablesOptions((prevOptions) => ({ + ...prevOptions, + renameTables: !prevOptions.renameTables, + })) + } + /> +
    + + } + /> + + ); +}; + +export default WorkflowActions; diff --git a/web/vtadmin/src/hooks/api.ts b/web/vtadmin/src/hooks/api.ts index f84eff40cf4..375fcd7a959 100644 --- a/web/vtadmin/src/hooks/api.ts +++ b/web/vtadmin/src/hooks/api.ts @@ -41,6 +41,7 @@ import { fetchVtctlds, fetchVTExplain, fetchWorkflow, + fetchWorkflowStatus, fetchWorkflows, TabletDebugVarsResponse, refreshState, @@ -78,6 +79,20 @@ import { GetFullStatusParams, validateVersionShard, ValidateVersionShardParams, + createMoveTables, + startWorkflow, + stopWorkflow, + FetchTransactionsParams, + fetchTransactions, + completeMoveTables, + workflowSwitchTraffic, + workflowDelete, + createReshard, + concludeTransaction, + createVDiff, + showVDiff, + ShowVDiffParams, + createMaterialize, } from '../api/http'; import { vtadmin as pb, vtctldata } from '../proto/vtadmin'; import { formatAlias } from '../util/tablets'; @@ -402,6 +417,28 @@ export const useVSchema = (params: FetchVSchemaParams, options?: UseQueryOptions return useQuery(['vschema', params], () => fetchVSchema(params)); }; +/** + * useTransactions is a query hook that fetches unresolved transactions for the given keyspace. + */ +export const useTransactions = ( + params: FetchTransactionsParams, + options?: UseQueryOptions | undefined +) => { + return useQuery(['transactions', params], () => fetchTransactions(params), { ...options }); +}; + +/** + * useConcludeTransaction is a mutate hook that concludes a transaction. + */ +export const useConcludeTransaction = ( + params: Parameters[0], + options?: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return concludeTransaction(params); + }, options); +}; + export const useVTExplain = ( params: Parameters[0], options?: UseQueryOptions | undefined @@ -449,6 +486,112 @@ export const useWorkflow = ( }); }; +/** + * useWorkflowStatus is a query hook that fetches status for a single workflow. + */ +export const useWorkflowStatus = ( + params: Parameters[0], + options?: UseQueryOptions | undefined +) => { + return useQuery(['workflow_status', params], () => fetchWorkflowStatus(params), options); +}; + +/** + * useCreateMaterialize is a mutation query hook that creates a materialize workflow. + */ +export const useCreateMaterialize = ( + params: Parameters[0], + options: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return createMaterialize(params); + }, options); +}; + +/** + * useCreateMoveTables is a mutation query hook that creates a move tables workflow. + */ +export const useCreateMoveTables = ( + params: Parameters[0], + options: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return createMoveTables(params); + }, options); +}; + +/** + * useCreateReshard is a mutation query hook that creates a reshard workflow. + */ +export const useCreateReshard = ( + params: Parameters[0], + options: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return createReshard(params); + }, options); +}; + +/** + * useStartWorkflow is a mutate hook that starts a workflow. + */ +export const useStartWorkflow = ( + params: Parameters[0], + options?: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return startWorkflow(params); + }, options); +}; + +/** + * useStopWorkflow is a mutate hook that stops a workflow. + */ +export const useStopWorkflow = ( + params: Parameters[0], + options?: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return stopWorkflow(params); + }, options); +}; + +/** + * useCompleteMoveTables is a mutate hook that completes a MoveTables workflow. + */ +export const useCompleteMoveTables = ( + params: Parameters[0], + options?: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return completeMoveTables(params); + }, options); +}; + +/** + * useWorkflowSwitchTraffic is a mutate hook that switches traffic for a workflow. + */ +export const useWorkflowSwitchTraffic = ( + params: Parameters[0], + options?: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return workflowSwitchTraffic(params); + }, options); +}; + +/** + * useWorkflowDelete is a mutate hook that deletes a workflow. + */ +export const useWorkflowDelete = ( + params: Parameters[0], + options?: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return workflowDelete(params); + }, options); +}; + /** * useReloadSchema is a mutate hook that reloads schemas in one or more * keyspaces, shards, or tablets in the cluster, depending on the request parameters. @@ -619,3 +762,25 @@ export const useValidateVersionShard = ( return validateVersionShard(params); }, options); }; + +/** + * useCreateVDiff is a mutation query hook that creates a VDiff. + */ +export const useCreateVDiff = ( + params: Parameters[0], + options?: UseMutationOptions>, Error> +) => { + return useMutation>, Error>(() => { + return createVDiff(params); + }, options); +}; + +/** + * useShowVDiff is a query hook fetches VDiff status. + */ +export const useShowVDiff = ( + params: ShowVDiffParams, + options?: UseQueryOptions | undefined +) => { + return useQuery(['vdiff_show', params], () => showVDiff(params), { ...options }); +}; diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index f347f0f33c8..615214cc81a 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -79,6 +79,20 @@ export namespace vtadmin { */ public completeSchemaMigration(request: vtadmin.ICompleteSchemaMigrationRequest): Promise; + /** + * Calls ConcludeTransaction. + * @param request ConcludeTransactionRequest message or plain object + * @param callback Node-style callback called with the error, if any, and ConcludeTransactionResponse + */ + public concludeTransaction(request: vtadmin.IConcludeTransactionRequest, callback: vtadmin.VTAdmin.ConcludeTransactionCallback): void; + + /** + * Calls ConcludeTransaction. + * @param request ConcludeTransactionRequest message or plain object + * @returns Promise + */ + public concludeTransaction(request: vtadmin.IConcludeTransactionRequest): Promise; + /** * Calls CreateKeyspace. * @param request CreateKeyspaceRequest message or plain object @@ -443,6 +457,20 @@ export namespace vtadmin { */ public getTopologyPath(request: vtadmin.IGetTopologyPathRequest): Promise; + /** + * Calls GetUnresolvedTransactions. + * @param request GetUnresolvedTransactionsRequest message or plain object + * @param callback Node-style callback called with the error, if any, and GetUnresolvedTransactionsResponse + */ + public getUnresolvedTransactions(request: vtadmin.IGetUnresolvedTransactionsRequest, callback: vtadmin.VTAdmin.GetUnresolvedTransactionsCallback): void; + + /** + * Calls GetUnresolvedTransactions. + * @param request GetUnresolvedTransactionsRequest message or plain object + * @returns Promise + */ + public getUnresolvedTransactions(request: vtadmin.IGetUnresolvedTransactionsRequest): Promise; + /** * Calls GetVSchema. * @param request GetVSchemaRequest message or plain object @@ -513,6 +541,48 @@ export namespace vtadmin { */ public getWorkflows(request: vtadmin.IGetWorkflowsRequest): Promise; + /** + * Calls GetWorkflowStatus. + * @param request GetWorkflowStatusRequest message or plain object + * @param callback Node-style callback called with the error, if any, and WorkflowStatusResponse + */ + public getWorkflowStatus(request: vtadmin.IGetWorkflowStatusRequest, callback: vtadmin.VTAdmin.GetWorkflowStatusCallback): void; + + /** + * Calls GetWorkflowStatus. + * @param request GetWorkflowStatusRequest message or plain object + * @returns Promise + */ + public getWorkflowStatus(request: vtadmin.IGetWorkflowStatusRequest): Promise; + + /** + * Calls StartWorkflow. + * @param request StartWorkflowRequest message or plain object + * @param callback Node-style callback called with the error, if any, and WorkflowUpdateResponse + */ + public startWorkflow(request: vtadmin.IStartWorkflowRequest, callback: vtadmin.VTAdmin.StartWorkflowCallback): void; + + /** + * Calls StartWorkflow. + * @param request StartWorkflowRequest message or plain object + * @returns Promise + */ + public startWorkflow(request: vtadmin.IStartWorkflowRequest): Promise; + + /** + * Calls StopWorkflow. + * @param request StopWorkflowRequest message or plain object + * @param callback Node-style callback called with the error, if any, and WorkflowUpdateResponse + */ + public stopWorkflow(request: vtadmin.IStopWorkflowRequest, callback: vtadmin.VTAdmin.StopWorkflowCallback): void; + + /** + * Calls StopWorkflow. + * @param request StopWorkflowRequest message or plain object + * @returns Promise + */ + public stopWorkflow(request: vtadmin.IStopWorkflowRequest): Promise; + /** * Calls LaunchSchemaMigration. * @param request LaunchSchemaMigrationRequest message or plain object @@ -527,6 +597,48 @@ export namespace vtadmin { */ public launchSchemaMigration(request: vtadmin.ILaunchSchemaMigrationRequest): Promise; + /** + * Calls MoveTablesComplete. + * @param request MoveTablesCompleteRequest message or plain object + * @param callback Node-style callback called with the error, if any, and MoveTablesCompleteResponse + */ + public moveTablesComplete(request: vtadmin.IMoveTablesCompleteRequest, callback: vtadmin.VTAdmin.MoveTablesCompleteCallback): void; + + /** + * Calls MoveTablesComplete. + * @param request MoveTablesCompleteRequest message or plain object + * @returns Promise + */ + public moveTablesComplete(request: vtadmin.IMoveTablesCompleteRequest): Promise; + + /** + * Calls MoveTablesCreate. + * @param request MoveTablesCreateRequest message or plain object + * @param callback Node-style callback called with the error, if any, and WorkflowStatusResponse + */ + public moveTablesCreate(request: vtadmin.IMoveTablesCreateRequest, callback: vtadmin.VTAdmin.MoveTablesCreateCallback): void; + + /** + * Calls MoveTablesCreate. + * @param request MoveTablesCreateRequest message or plain object + * @returns Promise + */ + public moveTablesCreate(request: vtadmin.IMoveTablesCreateRequest): Promise; + + /** + * Calls MaterializeCreate. + * @param request MaterializeCreateRequest message or plain object + * @param callback Node-style callback called with the error, if any, and MaterializeCreateResponse + */ + public materializeCreate(request: vtadmin.IMaterializeCreateRequest, callback: vtadmin.VTAdmin.MaterializeCreateCallback): void; + + /** + * Calls MaterializeCreate. + * @param request MaterializeCreateRequest message or plain object + * @returns Promise + */ + public materializeCreate(request: vtadmin.IMaterializeCreateRequest): Promise; + /** * Calls PingTablet. * @param request PingTabletRequest message or plain object @@ -667,6 +779,20 @@ export namespace vtadmin { */ public runHealthCheck(request: vtadmin.IRunHealthCheckRequest): Promise; + /** + * Calls ReshardCreate. + * @param request ReshardCreateRequest message or plain object + * @param callback Node-style callback called with the error, if any, and WorkflowStatusResponse + */ + public reshardCreate(request: vtadmin.IReshardCreateRequest, callback: vtadmin.VTAdmin.ReshardCreateCallback): void; + + /** + * Calls ReshardCreate. + * @param request ReshardCreateRequest message or plain object + * @returns Promise + */ + public reshardCreate(request: vtadmin.IReshardCreateRequest): Promise; + /** * Calls SetReadOnly. * @param request SetReadOnlyRequest message or plain object @@ -821,6 +947,34 @@ export namespace vtadmin { */ public validateVersionShard(request: vtadmin.IValidateVersionShardRequest): Promise; + /** + * Calls VDiffCreate. + * @param request VDiffCreateRequest message or plain object + * @param callback Node-style callback called with the error, if any, and VDiffCreateResponse + */ + public vDiffCreate(request: vtadmin.IVDiffCreateRequest, callback: vtadmin.VTAdmin.VDiffCreateCallback): void; + + /** + * Calls VDiffCreate. + * @param request VDiffCreateRequest message or plain object + * @returns Promise + */ + public vDiffCreate(request: vtadmin.IVDiffCreateRequest): Promise; + + /** + * Calls VDiffShow. + * @param request VDiffShowRequest message or plain object + * @param callback Node-style callback called with the error, if any, and VDiffShowResponse + */ + public vDiffShow(request: vtadmin.IVDiffShowRequest, callback: vtadmin.VTAdmin.VDiffShowCallback): void; + + /** + * Calls VDiffShow. + * @param request VDiffShowRequest message or plain object + * @returns Promise + */ + public vDiffShow(request: vtadmin.IVDiffShowRequest): Promise; + /** * Calls VTExplain. * @param request VTExplainRequest message or plain object @@ -834,6 +988,34 @@ export namespace vtadmin { * @returns Promise */ public vTExplain(request: vtadmin.IVTExplainRequest): Promise; + + /** + * Calls WorkflowDelete. + * @param request WorkflowDeleteRequest message or plain object + * @param callback Node-style callback called with the error, if any, and WorkflowDeleteResponse + */ + public workflowDelete(request: vtadmin.IWorkflowDeleteRequest, callback: vtadmin.VTAdmin.WorkflowDeleteCallback): void; + + /** + * Calls WorkflowDelete. + * @param request WorkflowDeleteRequest message or plain object + * @returns Promise + */ + public workflowDelete(request: vtadmin.IWorkflowDeleteRequest): Promise; + + /** + * Calls WorkflowSwitchTraffic. + * @param request WorkflowSwitchTrafficRequest message or plain object + * @param callback Node-style callback called with the error, if any, and WorkflowSwitchTrafficResponse + */ + public workflowSwitchTraffic(request: vtadmin.IWorkflowSwitchTrafficRequest, callback: vtadmin.VTAdmin.WorkflowSwitchTrafficCallback): void; + + /** + * Calls WorkflowSwitchTraffic. + * @param request WorkflowSwitchTrafficRequest message or plain object + * @returns Promise + */ + public workflowSwitchTraffic(request: vtadmin.IWorkflowSwitchTrafficRequest): Promise; } namespace VTAdmin { @@ -866,6 +1048,13 @@ export namespace vtadmin { */ type CompleteSchemaMigrationCallback = (error: (Error|null), response?: vtctldata.CompleteSchemaMigrationResponse) => void; + /** + * Callback as used by {@link vtadmin.VTAdmin#concludeTransaction}. + * @param error Error, if any + * @param [response] ConcludeTransactionResponse + */ + type ConcludeTransactionCallback = (error: (Error|null), response?: vtctldata.ConcludeTransactionResponse) => void; + /** * Callback as used by {@link vtadmin.VTAdmin#createKeyspace}. * @param error Error, if any @@ -1048,6 +1237,13 @@ export namespace vtadmin { */ type GetTopologyPathCallback = (error: (Error|null), response?: vtctldata.GetTopologyPathResponse) => void; + /** + * Callback as used by {@link vtadmin.VTAdmin#getUnresolvedTransactions}. + * @param error Error, if any + * @param [response] GetUnresolvedTransactionsResponse + */ + type GetUnresolvedTransactionsCallback = (error: (Error|null), response?: vtctldata.GetUnresolvedTransactionsResponse) => void; + /** * Callback as used by {@link vtadmin.VTAdmin#getVSchema}. * @param error Error, if any @@ -1083,6 +1279,27 @@ export namespace vtadmin { */ type GetWorkflowsCallback = (error: (Error|null), response?: vtadmin.GetWorkflowsResponse) => void; + /** + * Callback as used by {@link vtadmin.VTAdmin#getWorkflowStatus}. + * @param error Error, if any + * @param [response] WorkflowStatusResponse + */ + type GetWorkflowStatusCallback = (error: (Error|null), response?: vtctldata.WorkflowStatusResponse) => void; + + /** + * Callback as used by {@link vtadmin.VTAdmin#startWorkflow}. + * @param error Error, if any + * @param [response] WorkflowUpdateResponse + */ + type StartWorkflowCallback = (error: (Error|null), response?: vtctldata.WorkflowUpdateResponse) => void; + + /** + * Callback as used by {@link vtadmin.VTAdmin#stopWorkflow}. + * @param error Error, if any + * @param [response] WorkflowUpdateResponse + */ + type StopWorkflowCallback = (error: (Error|null), response?: vtctldata.WorkflowUpdateResponse) => void; + /** * Callback as used by {@link vtadmin.VTAdmin#launchSchemaMigration}. * @param error Error, if any @@ -1090,6 +1307,27 @@ export namespace vtadmin { */ type LaunchSchemaMigrationCallback = (error: (Error|null), response?: vtctldata.LaunchSchemaMigrationResponse) => void; + /** + * Callback as used by {@link vtadmin.VTAdmin#moveTablesComplete}. + * @param error Error, if any + * @param [response] MoveTablesCompleteResponse + */ + type MoveTablesCompleteCallback = (error: (Error|null), response?: vtctldata.MoveTablesCompleteResponse) => void; + + /** + * Callback as used by {@link vtadmin.VTAdmin#moveTablesCreate}. + * @param error Error, if any + * @param [response] WorkflowStatusResponse + */ + type MoveTablesCreateCallback = (error: (Error|null), response?: vtctldata.WorkflowStatusResponse) => void; + + /** + * Callback as used by {@link vtadmin.VTAdmin#materializeCreate}. + * @param error Error, if any + * @param [response] MaterializeCreateResponse + */ + type MaterializeCreateCallback = (error: (Error|null), response?: vtctldata.MaterializeCreateResponse) => void; + /** * Callback as used by {@link vtadmin.VTAdmin#pingTablet}. * @param error Error, if any @@ -1160,6 +1398,13 @@ export namespace vtadmin { */ type RunHealthCheckCallback = (error: (Error|null), response?: vtadmin.RunHealthCheckResponse) => void; + /** + * Callback as used by {@link vtadmin.VTAdmin#reshardCreate}. + * @param error Error, if any + * @param [response] WorkflowStatusResponse + */ + type ReshardCreateCallback = (error: (Error|null), response?: vtctldata.WorkflowStatusResponse) => void; + /** * Callback as used by {@link vtadmin.VTAdmin#setReadOnly}. * @param error Error, if any @@ -1237,12 +1482,40 @@ export namespace vtadmin { */ type ValidateVersionShardCallback = (error: (Error|null), response?: vtctldata.ValidateVersionShardResponse) => void; + /** + * Callback as used by {@link vtadmin.VTAdmin#vDiffCreate}. + * @param error Error, if any + * @param [response] VDiffCreateResponse + */ + type VDiffCreateCallback = (error: (Error|null), response?: vtctldata.VDiffCreateResponse) => void; + + /** + * Callback as used by {@link vtadmin.VTAdmin#vDiffShow}. + * @param error Error, if any + * @param [response] VDiffShowResponse + */ + type VDiffShowCallback = (error: (Error|null), response?: vtadmin.VDiffShowResponse) => void; + /** * Callback as used by {@link vtadmin.VTAdmin#vTExplain}. * @param error Error, if any * @param [response] VTExplainResponse */ type VTExplainCallback = (error: (Error|null), response?: vtadmin.VTExplainResponse) => void; + + /** + * Callback as used by {@link vtadmin.VTAdmin#workflowDelete}. + * @param error Error, if any + * @param [response] WorkflowDeleteResponse + */ + type WorkflowDeleteCallback = (error: (Error|null), response?: vtctldata.WorkflowDeleteResponse) => void; + + /** + * Callback as used by {@link vtadmin.VTAdmin#workflowSwitchTraffic}. + * @param error Error, if any + * @param [response] WorkflowSwitchTrafficResponse + */ + type WorkflowSwitchTrafficCallback = (error: (Error|null), response?: vtctldata.WorkflowSwitchTrafficResponse) => void; } /** Properties of a Cluster. */ @@ -3214,6 +3487,212 @@ export namespace vtadmin { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a WorkflowDeleteRequest. */ + interface IWorkflowDeleteRequest { + + /** WorkflowDeleteRequest cluster_id */ + cluster_id?: (string|null); + + /** WorkflowDeleteRequest request */ + request?: (vtctldata.IWorkflowDeleteRequest|null); + } + + /** Represents a WorkflowDeleteRequest. */ + class WorkflowDeleteRequest implements IWorkflowDeleteRequest { + + /** + * Constructs a new WorkflowDeleteRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IWorkflowDeleteRequest); + + /** WorkflowDeleteRequest cluster_id. */ + public cluster_id: string; + + /** WorkflowDeleteRequest request. */ + public request?: (vtctldata.IWorkflowDeleteRequest|null); + + /** + * Creates a new WorkflowDeleteRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns WorkflowDeleteRequest instance + */ + public static create(properties?: vtadmin.IWorkflowDeleteRequest): vtadmin.WorkflowDeleteRequest; + + /** + * Encodes the specified WorkflowDeleteRequest message. Does not implicitly {@link vtadmin.WorkflowDeleteRequest.verify|verify} messages. + * @param message WorkflowDeleteRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IWorkflowDeleteRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified WorkflowDeleteRequest message, length delimited. Does not implicitly {@link vtadmin.WorkflowDeleteRequest.verify|verify} messages. + * @param message WorkflowDeleteRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IWorkflowDeleteRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a WorkflowDeleteRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns WorkflowDeleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.WorkflowDeleteRequest; + + /** + * Decodes a WorkflowDeleteRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns WorkflowDeleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.WorkflowDeleteRequest; + + /** + * Verifies a WorkflowDeleteRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a WorkflowDeleteRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns WorkflowDeleteRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.WorkflowDeleteRequest; + + /** + * Creates a plain object from a WorkflowDeleteRequest message. Also converts values to other types if specified. + * @param message WorkflowDeleteRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.WorkflowDeleteRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this WorkflowDeleteRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for WorkflowDeleteRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a WorkflowSwitchTrafficRequest. */ + interface IWorkflowSwitchTrafficRequest { + + /** WorkflowSwitchTrafficRequest cluster_id */ + cluster_id?: (string|null); + + /** WorkflowSwitchTrafficRequest request */ + request?: (vtctldata.IWorkflowSwitchTrafficRequest|null); + } + + /** Represents a WorkflowSwitchTrafficRequest. */ + class WorkflowSwitchTrafficRequest implements IWorkflowSwitchTrafficRequest { + + /** + * Constructs a new WorkflowSwitchTrafficRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IWorkflowSwitchTrafficRequest); + + /** WorkflowSwitchTrafficRequest cluster_id. */ + public cluster_id: string; + + /** WorkflowSwitchTrafficRequest request. */ + public request?: (vtctldata.IWorkflowSwitchTrafficRequest|null); + + /** + * Creates a new WorkflowSwitchTrafficRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns WorkflowSwitchTrafficRequest instance + */ + public static create(properties?: vtadmin.IWorkflowSwitchTrafficRequest): vtadmin.WorkflowSwitchTrafficRequest; + + /** + * Encodes the specified WorkflowSwitchTrafficRequest message. Does not implicitly {@link vtadmin.WorkflowSwitchTrafficRequest.verify|verify} messages. + * @param message WorkflowSwitchTrafficRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IWorkflowSwitchTrafficRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified WorkflowSwitchTrafficRequest message, length delimited. Does not implicitly {@link vtadmin.WorkflowSwitchTrafficRequest.verify|verify} messages. + * @param message WorkflowSwitchTrafficRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IWorkflowSwitchTrafficRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a WorkflowSwitchTrafficRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns WorkflowSwitchTrafficRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.WorkflowSwitchTrafficRequest; + + /** + * Decodes a WorkflowSwitchTrafficRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns WorkflowSwitchTrafficRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.WorkflowSwitchTrafficRequest; + + /** + * Verifies a WorkflowSwitchTrafficRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a WorkflowSwitchTrafficRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns WorkflowSwitchTrafficRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.WorkflowSwitchTrafficRequest; + + /** + * Creates a plain object from a WorkflowSwitchTrafficRequest message. Also converts values to other types if specified. + * @param message WorkflowSwitchTrafficRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.WorkflowSwitchTrafficRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this WorkflowSwitchTrafficRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for WorkflowSwitchTrafficRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of an ApplySchemaRequest. */ interface IApplySchemaRequest { @@ -3626,6 +4105,109 @@ export namespace vtadmin { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a ConcludeTransactionRequest. */ + interface IConcludeTransactionRequest { + + /** ConcludeTransactionRequest cluster_id */ + cluster_id?: (string|null); + + /** ConcludeTransactionRequest dtid */ + dtid?: (string|null); + } + + /** Represents a ConcludeTransactionRequest. */ + class ConcludeTransactionRequest implements IConcludeTransactionRequest { + + /** + * Constructs a new ConcludeTransactionRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IConcludeTransactionRequest); + + /** ConcludeTransactionRequest cluster_id. */ + public cluster_id: string; + + /** ConcludeTransactionRequest dtid. */ + public dtid: string; + + /** + * Creates a new ConcludeTransactionRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ConcludeTransactionRequest instance + */ + public static create(properties?: vtadmin.IConcludeTransactionRequest): vtadmin.ConcludeTransactionRequest; + + /** + * Encodes the specified ConcludeTransactionRequest message. Does not implicitly {@link vtadmin.ConcludeTransactionRequest.verify|verify} messages. + * @param message ConcludeTransactionRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IConcludeTransactionRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ConcludeTransactionRequest message, length delimited. Does not implicitly {@link vtadmin.ConcludeTransactionRequest.verify|verify} messages. + * @param message ConcludeTransactionRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IConcludeTransactionRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.ConcludeTransactionRequest; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.ConcludeTransactionRequest; + + /** + * Verifies a ConcludeTransactionRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ConcludeTransactionRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ConcludeTransactionRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.ConcludeTransactionRequest; + + /** + * Creates a plain object from a ConcludeTransactionRequest message. Also converts values to other types if specified. + * @param message ConcludeTransactionRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.ConcludeTransactionRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ConcludeTransactionRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ConcludeTransactionRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a CreateKeyspaceRequest. */ interface ICreateKeyspaceRequest { @@ -8010,6 +8592,115 @@ export namespace vtadmin { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a GetUnresolvedTransactionsRequest. */ + interface IGetUnresolvedTransactionsRequest { + + /** GetUnresolvedTransactionsRequest cluster_id */ + cluster_id?: (string|null); + + /** GetUnresolvedTransactionsRequest keyspace */ + keyspace?: (string|null); + + /** GetUnresolvedTransactionsRequest abandon_age */ + abandon_age?: (number|Long|null); + } + + /** Represents a GetUnresolvedTransactionsRequest. */ + class GetUnresolvedTransactionsRequest implements IGetUnresolvedTransactionsRequest { + + /** + * Constructs a new GetUnresolvedTransactionsRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IGetUnresolvedTransactionsRequest); + + /** GetUnresolvedTransactionsRequest cluster_id. */ + public cluster_id: string; + + /** GetUnresolvedTransactionsRequest keyspace. */ + public keyspace: string; + + /** GetUnresolvedTransactionsRequest abandon_age. */ + public abandon_age: (number|Long); + + /** + * Creates a new GetUnresolvedTransactionsRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns GetUnresolvedTransactionsRequest instance + */ + public static create(properties?: vtadmin.IGetUnresolvedTransactionsRequest): vtadmin.GetUnresolvedTransactionsRequest; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message. Does not implicitly {@link vtadmin.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @param message GetUnresolvedTransactionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IGetUnresolvedTransactionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message, length delimited. Does not implicitly {@link vtadmin.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @param message GetUnresolvedTransactionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IGetUnresolvedTransactionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.GetUnresolvedTransactionsRequest; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.GetUnresolvedTransactionsRequest; + + /** + * Verifies a GetUnresolvedTransactionsRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GetUnresolvedTransactionsRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GetUnresolvedTransactionsRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.GetUnresolvedTransactionsRequest; + + /** + * Creates a plain object from a GetUnresolvedTransactionsRequest message. Also converts values to other types if specified. + * @param message GetUnresolvedTransactionsRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.GetUnresolvedTransactionsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GetUnresolvedTransactionsRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetUnresolvedTransactionsRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a GetVSchemaRequest. */ interface IGetVSchemaRequest { @@ -8616,6 +9307,333 @@ export namespace vtadmin { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a GetWorkflowStatusRequest. */ + interface IGetWorkflowStatusRequest { + + /** GetWorkflowStatusRequest cluster_id */ + cluster_id?: (string|null); + + /** GetWorkflowStatusRequest keyspace */ + keyspace?: (string|null); + + /** GetWorkflowStatusRequest name */ + name?: (string|null); + } + + /** Represents a GetWorkflowStatusRequest. */ + class GetWorkflowStatusRequest implements IGetWorkflowStatusRequest { + + /** + * Constructs a new GetWorkflowStatusRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IGetWorkflowStatusRequest); + + /** GetWorkflowStatusRequest cluster_id. */ + public cluster_id: string; + + /** GetWorkflowStatusRequest keyspace. */ + public keyspace: string; + + /** GetWorkflowStatusRequest name. */ + public name: string; + + /** + * Creates a new GetWorkflowStatusRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns GetWorkflowStatusRequest instance + */ + public static create(properties?: vtadmin.IGetWorkflowStatusRequest): vtadmin.GetWorkflowStatusRequest; + + /** + * Encodes the specified GetWorkflowStatusRequest message. Does not implicitly {@link vtadmin.GetWorkflowStatusRequest.verify|verify} messages. + * @param message GetWorkflowStatusRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IGetWorkflowStatusRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GetWorkflowStatusRequest message, length delimited. Does not implicitly {@link vtadmin.GetWorkflowStatusRequest.verify|verify} messages. + * @param message GetWorkflowStatusRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IGetWorkflowStatusRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GetWorkflowStatusRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GetWorkflowStatusRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.GetWorkflowStatusRequest; + + /** + * Decodes a GetWorkflowStatusRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GetWorkflowStatusRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.GetWorkflowStatusRequest; + + /** + * Verifies a GetWorkflowStatusRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GetWorkflowStatusRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GetWorkflowStatusRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.GetWorkflowStatusRequest; + + /** + * Creates a plain object from a GetWorkflowStatusRequest message. Also converts values to other types if specified. + * @param message GetWorkflowStatusRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.GetWorkflowStatusRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GetWorkflowStatusRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetWorkflowStatusRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a StartWorkflowRequest. */ + interface IStartWorkflowRequest { + + /** StartWorkflowRequest cluster_id */ + cluster_id?: (string|null); + + /** StartWorkflowRequest keyspace */ + keyspace?: (string|null); + + /** StartWorkflowRequest workflow */ + workflow?: (string|null); + } + + /** Represents a StartWorkflowRequest. */ + class StartWorkflowRequest implements IStartWorkflowRequest { + + /** + * Constructs a new StartWorkflowRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IStartWorkflowRequest); + + /** StartWorkflowRequest cluster_id. */ + public cluster_id: string; + + /** StartWorkflowRequest keyspace. */ + public keyspace: string; + + /** StartWorkflowRequest workflow. */ + public workflow: string; + + /** + * Creates a new StartWorkflowRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns StartWorkflowRequest instance + */ + public static create(properties?: vtadmin.IStartWorkflowRequest): vtadmin.StartWorkflowRequest; + + /** + * Encodes the specified StartWorkflowRequest message. Does not implicitly {@link vtadmin.StartWorkflowRequest.verify|verify} messages. + * @param message StartWorkflowRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IStartWorkflowRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified StartWorkflowRequest message, length delimited. Does not implicitly {@link vtadmin.StartWorkflowRequest.verify|verify} messages. + * @param message StartWorkflowRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IStartWorkflowRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a StartWorkflowRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns StartWorkflowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.StartWorkflowRequest; + + /** + * Decodes a StartWorkflowRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns StartWorkflowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.StartWorkflowRequest; + + /** + * Verifies a StartWorkflowRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a StartWorkflowRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns StartWorkflowRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.StartWorkflowRequest; + + /** + * Creates a plain object from a StartWorkflowRequest message. Also converts values to other types if specified. + * @param message StartWorkflowRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.StartWorkflowRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this StartWorkflowRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for StartWorkflowRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a StopWorkflowRequest. */ + interface IStopWorkflowRequest { + + /** StopWorkflowRequest cluster_id */ + cluster_id?: (string|null); + + /** StopWorkflowRequest keyspace */ + keyspace?: (string|null); + + /** StopWorkflowRequest workflow */ + workflow?: (string|null); + } + + /** Represents a StopWorkflowRequest. */ + class StopWorkflowRequest implements IStopWorkflowRequest { + + /** + * Constructs a new StopWorkflowRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IStopWorkflowRequest); + + /** StopWorkflowRequest cluster_id. */ + public cluster_id: string; + + /** StopWorkflowRequest keyspace. */ + public keyspace: string; + + /** StopWorkflowRequest workflow. */ + public workflow: string; + + /** + * Creates a new StopWorkflowRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns StopWorkflowRequest instance + */ + public static create(properties?: vtadmin.IStopWorkflowRequest): vtadmin.StopWorkflowRequest; + + /** + * Encodes the specified StopWorkflowRequest message. Does not implicitly {@link vtadmin.StopWorkflowRequest.verify|verify} messages. + * @param message StopWorkflowRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IStopWorkflowRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified StopWorkflowRequest message, length delimited. Does not implicitly {@link vtadmin.StopWorkflowRequest.verify|verify} messages. + * @param message StopWorkflowRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IStopWorkflowRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a StopWorkflowRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns StopWorkflowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.StopWorkflowRequest; + + /** + * Decodes a StopWorkflowRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns StopWorkflowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.StopWorkflowRequest; + + /** + * Verifies a StopWorkflowRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a StopWorkflowRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns StopWorkflowRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.StopWorkflowRequest; + + /** + * Creates a plain object from a StopWorkflowRequest message. Also converts values to other types if specified. + * @param message StopWorkflowRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.StopWorkflowRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this StopWorkflowRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for StopWorkflowRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a GetWorkflowsRequest. */ interface IGetWorkflowsRequest { @@ -8931,6 +9949,321 @@ export namespace vtadmin { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a MaterializeCreateRequest. */ + interface IMaterializeCreateRequest { + + /** MaterializeCreateRequest cluster_id */ + cluster_id?: (string|null); + + /** MaterializeCreateRequest table_settings */ + table_settings?: (string|null); + + /** MaterializeCreateRequest request */ + request?: (vtctldata.IMaterializeCreateRequest|null); + } + + /** Represents a MaterializeCreateRequest. */ + class MaterializeCreateRequest implements IMaterializeCreateRequest { + + /** + * Constructs a new MaterializeCreateRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IMaterializeCreateRequest); + + /** MaterializeCreateRequest cluster_id. */ + public cluster_id: string; + + /** MaterializeCreateRequest table_settings. */ + public table_settings: string; + + /** MaterializeCreateRequest request. */ + public request?: (vtctldata.IMaterializeCreateRequest|null); + + /** + * Creates a new MaterializeCreateRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns MaterializeCreateRequest instance + */ + public static create(properties?: vtadmin.IMaterializeCreateRequest): vtadmin.MaterializeCreateRequest; + + /** + * Encodes the specified MaterializeCreateRequest message. Does not implicitly {@link vtadmin.MaterializeCreateRequest.verify|verify} messages. + * @param message MaterializeCreateRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IMaterializeCreateRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MaterializeCreateRequest message, length delimited. Does not implicitly {@link vtadmin.MaterializeCreateRequest.verify|verify} messages. + * @param message MaterializeCreateRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IMaterializeCreateRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MaterializeCreateRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MaterializeCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.MaterializeCreateRequest; + + /** + * Decodes a MaterializeCreateRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MaterializeCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.MaterializeCreateRequest; + + /** + * Verifies a MaterializeCreateRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MaterializeCreateRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MaterializeCreateRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.MaterializeCreateRequest; + + /** + * Creates a plain object from a MaterializeCreateRequest message. Also converts values to other types if specified. + * @param message MaterializeCreateRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.MaterializeCreateRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MaterializeCreateRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for MaterializeCreateRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a MoveTablesCompleteRequest. */ + interface IMoveTablesCompleteRequest { + + /** MoveTablesCompleteRequest cluster_id */ + cluster_id?: (string|null); + + /** MoveTablesCompleteRequest request */ + request?: (vtctldata.IMoveTablesCompleteRequest|null); + } + + /** Represents a MoveTablesCompleteRequest. */ + class MoveTablesCompleteRequest implements IMoveTablesCompleteRequest { + + /** + * Constructs a new MoveTablesCompleteRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IMoveTablesCompleteRequest); + + /** MoveTablesCompleteRequest cluster_id. */ + public cluster_id: string; + + /** MoveTablesCompleteRequest request. */ + public request?: (vtctldata.IMoveTablesCompleteRequest|null); + + /** + * Creates a new MoveTablesCompleteRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns MoveTablesCompleteRequest instance + */ + public static create(properties?: vtadmin.IMoveTablesCompleteRequest): vtadmin.MoveTablesCompleteRequest; + + /** + * Encodes the specified MoveTablesCompleteRequest message. Does not implicitly {@link vtadmin.MoveTablesCompleteRequest.verify|verify} messages. + * @param message MoveTablesCompleteRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IMoveTablesCompleteRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MoveTablesCompleteRequest message, length delimited. Does not implicitly {@link vtadmin.MoveTablesCompleteRequest.verify|verify} messages. + * @param message MoveTablesCompleteRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IMoveTablesCompleteRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MoveTablesCompleteRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MoveTablesCompleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.MoveTablesCompleteRequest; + + /** + * Decodes a MoveTablesCompleteRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MoveTablesCompleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.MoveTablesCompleteRequest; + + /** + * Verifies a MoveTablesCompleteRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MoveTablesCompleteRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MoveTablesCompleteRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.MoveTablesCompleteRequest; + + /** + * Creates a plain object from a MoveTablesCompleteRequest message. Also converts values to other types if specified. + * @param message MoveTablesCompleteRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.MoveTablesCompleteRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MoveTablesCompleteRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for MoveTablesCompleteRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a MoveTablesCreateRequest. */ + interface IMoveTablesCreateRequest { + + /** MoveTablesCreateRequest cluster_id */ + cluster_id?: (string|null); + + /** MoveTablesCreateRequest request */ + request?: (vtctldata.IMoveTablesCreateRequest|null); + } + + /** Represents a MoveTablesCreateRequest. */ + class MoveTablesCreateRequest implements IMoveTablesCreateRequest { + + /** + * Constructs a new MoveTablesCreateRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IMoveTablesCreateRequest); + + /** MoveTablesCreateRequest cluster_id. */ + public cluster_id: string; + + /** MoveTablesCreateRequest request. */ + public request?: (vtctldata.IMoveTablesCreateRequest|null); + + /** + * Creates a new MoveTablesCreateRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns MoveTablesCreateRequest instance + */ + public static create(properties?: vtadmin.IMoveTablesCreateRequest): vtadmin.MoveTablesCreateRequest; + + /** + * Encodes the specified MoveTablesCreateRequest message. Does not implicitly {@link vtadmin.MoveTablesCreateRequest.verify|verify} messages. + * @param message MoveTablesCreateRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IMoveTablesCreateRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MoveTablesCreateRequest message, length delimited. Does not implicitly {@link vtadmin.MoveTablesCreateRequest.verify|verify} messages. + * @param message MoveTablesCreateRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IMoveTablesCreateRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MoveTablesCreateRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MoveTablesCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.MoveTablesCreateRequest; + + /** + * Decodes a MoveTablesCreateRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MoveTablesCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.MoveTablesCreateRequest; + + /** + * Verifies a MoveTablesCreateRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MoveTablesCreateRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MoveTablesCreateRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.MoveTablesCreateRequest; + + /** + * Creates a plain object from a MoveTablesCreateRequest message. Also converts values to other types if specified. + * @param message MoveTablesCreateRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.MoveTablesCreateRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MoveTablesCreateRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for MoveTablesCreateRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a PingTabletRequest. */ interface IPingTabletRequest { @@ -11302,6 +12635,109 @@ export namespace vtadmin { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a ReshardCreateRequest. */ + interface IReshardCreateRequest { + + /** ReshardCreateRequest cluster_id */ + cluster_id?: (string|null); + + /** ReshardCreateRequest request */ + request?: (vtctldata.IReshardCreateRequest|null); + } + + /** Represents a ReshardCreateRequest. */ + class ReshardCreateRequest implements IReshardCreateRequest { + + /** + * Constructs a new ReshardCreateRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IReshardCreateRequest); + + /** ReshardCreateRequest cluster_id. */ + public cluster_id: string; + + /** ReshardCreateRequest request. */ + public request?: (vtctldata.IReshardCreateRequest|null); + + /** + * Creates a new ReshardCreateRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ReshardCreateRequest instance + */ + public static create(properties?: vtadmin.IReshardCreateRequest): vtadmin.ReshardCreateRequest; + + /** + * Encodes the specified ReshardCreateRequest message. Does not implicitly {@link vtadmin.ReshardCreateRequest.verify|verify} messages. + * @param message ReshardCreateRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IReshardCreateRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ReshardCreateRequest message, length delimited. Does not implicitly {@link vtadmin.ReshardCreateRequest.verify|verify} messages. + * @param message ReshardCreateRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IReshardCreateRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ReshardCreateRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ReshardCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.ReshardCreateRequest; + + /** + * Decodes a ReshardCreateRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ReshardCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.ReshardCreateRequest; + + /** + * Verifies a ReshardCreateRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ReshardCreateRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ReshardCreateRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.ReshardCreateRequest; + + /** + * Creates a plain object from a ReshardCreateRequest message. Also converts values to other types if specified. + * @param message ReshardCreateRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.ReshardCreateRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ReshardCreateRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ReshardCreateRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a SetReadOnlyRequest. */ interface ISetReadOnlyRequest { @@ -13071,6 +14507,539 @@ export namespace vtadmin { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a VDiffCreateRequest. */ + interface IVDiffCreateRequest { + + /** VDiffCreateRequest cluster_id */ + cluster_id?: (string|null); + + /** VDiffCreateRequest request */ + request?: (vtctldata.IVDiffCreateRequest|null); + } + + /** Represents a VDiffCreateRequest. */ + class VDiffCreateRequest implements IVDiffCreateRequest { + + /** + * Constructs a new VDiffCreateRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IVDiffCreateRequest); + + /** VDiffCreateRequest cluster_id. */ + public cluster_id: string; + + /** VDiffCreateRequest request. */ + public request?: (vtctldata.IVDiffCreateRequest|null); + + /** + * Creates a new VDiffCreateRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns VDiffCreateRequest instance + */ + public static create(properties?: vtadmin.IVDiffCreateRequest): vtadmin.VDiffCreateRequest; + + /** + * Encodes the specified VDiffCreateRequest message. Does not implicitly {@link vtadmin.VDiffCreateRequest.verify|verify} messages. + * @param message VDiffCreateRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IVDiffCreateRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VDiffCreateRequest message, length delimited. Does not implicitly {@link vtadmin.VDiffCreateRequest.verify|verify} messages. + * @param message VDiffCreateRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IVDiffCreateRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VDiffCreateRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VDiffCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.VDiffCreateRequest; + + /** + * Decodes a VDiffCreateRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VDiffCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.VDiffCreateRequest; + + /** + * Verifies a VDiffCreateRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VDiffCreateRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VDiffCreateRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.VDiffCreateRequest; + + /** + * Creates a plain object from a VDiffCreateRequest message. Also converts values to other types if specified. + * @param message VDiffCreateRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.VDiffCreateRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VDiffCreateRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for VDiffCreateRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a VDiffShowRequest. */ + interface IVDiffShowRequest { + + /** VDiffShowRequest cluster_id */ + cluster_id?: (string|null); + + /** VDiffShowRequest request */ + request?: (vtctldata.IVDiffShowRequest|null); + } + + /** Represents a VDiffShowRequest. */ + class VDiffShowRequest implements IVDiffShowRequest { + + /** + * Constructs a new VDiffShowRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IVDiffShowRequest); + + /** VDiffShowRequest cluster_id. */ + public cluster_id: string; + + /** VDiffShowRequest request. */ + public request?: (vtctldata.IVDiffShowRequest|null); + + /** + * Creates a new VDiffShowRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns VDiffShowRequest instance + */ + public static create(properties?: vtadmin.IVDiffShowRequest): vtadmin.VDiffShowRequest; + + /** + * Encodes the specified VDiffShowRequest message. Does not implicitly {@link vtadmin.VDiffShowRequest.verify|verify} messages. + * @param message VDiffShowRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IVDiffShowRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VDiffShowRequest message, length delimited. Does not implicitly {@link vtadmin.VDiffShowRequest.verify|verify} messages. + * @param message VDiffShowRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IVDiffShowRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VDiffShowRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VDiffShowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.VDiffShowRequest; + + /** + * Decodes a VDiffShowRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VDiffShowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.VDiffShowRequest; + + /** + * Verifies a VDiffShowRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VDiffShowRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VDiffShowRequest + */ + public static fromObject(object: { [k: string]: any }): vtadmin.VDiffShowRequest; + + /** + * Creates a plain object from a VDiffShowRequest message. Also converts values to other types if specified. + * @param message VDiffShowRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.VDiffShowRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VDiffShowRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for VDiffShowRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a VDiffProgress. */ + interface IVDiffProgress { + + /** VDiffProgress percentage */ + percentage?: (number|null); + + /** VDiffProgress eta */ + eta?: (string|null); + } + + /** Represents a VDiffProgress. */ + class VDiffProgress implements IVDiffProgress { + + /** + * Constructs a new VDiffProgress. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IVDiffProgress); + + /** VDiffProgress percentage. */ + public percentage: number; + + /** VDiffProgress eta. */ + public eta: string; + + /** + * Creates a new VDiffProgress instance using the specified properties. + * @param [properties] Properties to set + * @returns VDiffProgress instance + */ + public static create(properties?: vtadmin.IVDiffProgress): vtadmin.VDiffProgress; + + /** + * Encodes the specified VDiffProgress message. Does not implicitly {@link vtadmin.VDiffProgress.verify|verify} messages. + * @param message VDiffProgress message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IVDiffProgress, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VDiffProgress message, length delimited. Does not implicitly {@link vtadmin.VDiffProgress.verify|verify} messages. + * @param message VDiffProgress message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IVDiffProgress, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VDiffProgress message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VDiffProgress + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.VDiffProgress; + + /** + * Decodes a VDiffProgress message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VDiffProgress + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.VDiffProgress; + + /** + * Verifies a VDiffProgress message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VDiffProgress message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VDiffProgress + */ + public static fromObject(object: { [k: string]: any }): vtadmin.VDiffProgress; + + /** + * Creates a plain object from a VDiffProgress message. Also converts values to other types if specified. + * @param message VDiffProgress + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.VDiffProgress, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VDiffProgress to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for VDiffProgress + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a VDiffShardReport. */ + interface IVDiffShardReport { + + /** VDiffShardReport state */ + state?: (string|null); + + /** VDiffShardReport rows_compared */ + rows_compared?: (number|Long|null); + + /** VDiffShardReport has_mismatch */ + has_mismatch?: (boolean|null); + + /** VDiffShardReport started_at */ + started_at?: (string|null); + + /** VDiffShardReport completed_at */ + completed_at?: (string|null); + + /** VDiffShardReport progress */ + progress?: (vtadmin.IVDiffProgress|null); + } + + /** Represents a VDiffShardReport. */ + class VDiffShardReport implements IVDiffShardReport { + + /** + * Constructs a new VDiffShardReport. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IVDiffShardReport); + + /** VDiffShardReport state. */ + public state: string; + + /** VDiffShardReport rows_compared. */ + public rows_compared: (number|Long); + + /** VDiffShardReport has_mismatch. */ + public has_mismatch: boolean; + + /** VDiffShardReport started_at. */ + public started_at: string; + + /** VDiffShardReport completed_at. */ + public completed_at: string; + + /** VDiffShardReport progress. */ + public progress?: (vtadmin.IVDiffProgress|null); + + /** + * Creates a new VDiffShardReport instance using the specified properties. + * @param [properties] Properties to set + * @returns VDiffShardReport instance + */ + public static create(properties?: vtadmin.IVDiffShardReport): vtadmin.VDiffShardReport; + + /** + * Encodes the specified VDiffShardReport message. Does not implicitly {@link vtadmin.VDiffShardReport.verify|verify} messages. + * @param message VDiffShardReport message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IVDiffShardReport, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VDiffShardReport message, length delimited. Does not implicitly {@link vtadmin.VDiffShardReport.verify|verify} messages. + * @param message VDiffShardReport message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IVDiffShardReport, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VDiffShardReport message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VDiffShardReport + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.VDiffShardReport; + + /** + * Decodes a VDiffShardReport message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VDiffShardReport + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.VDiffShardReport; + + /** + * Verifies a VDiffShardReport message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VDiffShardReport message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VDiffShardReport + */ + public static fromObject(object: { [k: string]: any }): vtadmin.VDiffShardReport; + + /** + * Creates a plain object from a VDiffShardReport message. Also converts values to other types if specified. + * @param message VDiffShardReport + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.VDiffShardReport, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VDiffShardReport to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for VDiffShardReport + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a VDiffShowResponse. */ + interface IVDiffShowResponse { + + /** VDiffShowResponse shard_report */ + shard_report?: ({ [k: string]: vtadmin.IVDiffShardReport }|null); + } + + /** Represents a VDiffShowResponse. */ + class VDiffShowResponse implements IVDiffShowResponse { + + /** + * Constructs a new VDiffShowResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtadmin.IVDiffShowResponse); + + /** VDiffShowResponse shard_report. */ + public shard_report: { [k: string]: vtadmin.IVDiffShardReport }; + + /** + * Creates a new VDiffShowResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns VDiffShowResponse instance + */ + public static create(properties?: vtadmin.IVDiffShowResponse): vtadmin.VDiffShowResponse; + + /** + * Encodes the specified VDiffShowResponse message. Does not implicitly {@link vtadmin.VDiffShowResponse.verify|verify} messages. + * @param message VDiffShowResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtadmin.IVDiffShowResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VDiffShowResponse message, length delimited. Does not implicitly {@link vtadmin.VDiffShowResponse.verify|verify} messages. + * @param message VDiffShowResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtadmin.IVDiffShowResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VDiffShowResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VDiffShowResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtadmin.VDiffShowResponse; + + /** + * Decodes a VDiffShowResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VDiffShowResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtadmin.VDiffShowResponse; + + /** + * Verifies a VDiffShowResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VDiffShowResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VDiffShowResponse + */ + public static fromObject(object: { [k: string]: any }): vtadmin.VDiffShowResponse; + + /** + * Creates a plain object from a VDiffShowResponse message. Also converts values to other types if specified. + * @param message VDiffShowResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtadmin.VDiffShowResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VDiffShowResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for VDiffShowResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a VTExplainRequest. */ interface IVTExplainRequest { @@ -15152,6 +17121,306 @@ export namespace mysqlctl { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a HostMetricsRequest. */ + interface IHostMetricsRequest { + } + + /** Represents a HostMetricsRequest. */ + class HostMetricsRequest implements IHostMetricsRequest { + + /** + * Constructs a new HostMetricsRequest. + * @param [properties] Properties to set + */ + constructor(properties?: mysqlctl.IHostMetricsRequest); + + /** + * Creates a new HostMetricsRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns HostMetricsRequest instance + */ + public static create(properties?: mysqlctl.IHostMetricsRequest): mysqlctl.HostMetricsRequest; + + /** + * Encodes the specified HostMetricsRequest message. Does not implicitly {@link mysqlctl.HostMetricsRequest.verify|verify} messages. + * @param message HostMetricsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: mysqlctl.IHostMetricsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HostMetricsRequest message, length delimited. Does not implicitly {@link mysqlctl.HostMetricsRequest.verify|verify} messages. + * @param message HostMetricsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: mysqlctl.IHostMetricsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HostMetricsRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HostMetricsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): mysqlctl.HostMetricsRequest; + + /** + * Decodes a HostMetricsRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HostMetricsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): mysqlctl.HostMetricsRequest; + + /** + * Verifies a HostMetricsRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HostMetricsRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HostMetricsRequest + */ + public static fromObject(object: { [k: string]: any }): mysqlctl.HostMetricsRequest; + + /** + * Creates a plain object from a HostMetricsRequest message. Also converts values to other types if specified. + * @param message HostMetricsRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: mysqlctl.HostMetricsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HostMetricsRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for HostMetricsRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a HostMetricsResponse. */ + interface IHostMetricsResponse { + + /** HostMetricsResponse metrics */ + metrics?: ({ [k: string]: mysqlctl.HostMetricsResponse.IMetric }|null); + } + + /** Represents a HostMetricsResponse. */ + class HostMetricsResponse implements IHostMetricsResponse { + + /** + * Constructs a new HostMetricsResponse. + * @param [properties] Properties to set + */ + constructor(properties?: mysqlctl.IHostMetricsResponse); + + /** HostMetricsResponse metrics. */ + public metrics: { [k: string]: mysqlctl.HostMetricsResponse.IMetric }; + + /** + * Creates a new HostMetricsResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns HostMetricsResponse instance + */ + public static create(properties?: mysqlctl.IHostMetricsResponse): mysqlctl.HostMetricsResponse; + + /** + * Encodes the specified HostMetricsResponse message. Does not implicitly {@link mysqlctl.HostMetricsResponse.verify|verify} messages. + * @param message HostMetricsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: mysqlctl.IHostMetricsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HostMetricsResponse message, length delimited. Does not implicitly {@link mysqlctl.HostMetricsResponse.verify|verify} messages. + * @param message HostMetricsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: mysqlctl.IHostMetricsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HostMetricsResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HostMetricsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): mysqlctl.HostMetricsResponse; + + /** + * Decodes a HostMetricsResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HostMetricsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): mysqlctl.HostMetricsResponse; + + /** + * Verifies a HostMetricsResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HostMetricsResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HostMetricsResponse + */ + public static fromObject(object: { [k: string]: any }): mysqlctl.HostMetricsResponse; + + /** + * Creates a plain object from a HostMetricsResponse message. Also converts values to other types if specified. + * @param message HostMetricsResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: mysqlctl.HostMetricsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HostMetricsResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for HostMetricsResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + namespace HostMetricsResponse { + + /** Properties of a Metric. */ + interface IMetric { + + /** Metric name */ + name?: (string|null); + + /** Metric value */ + value?: (number|null); + + /** Metric error */ + error?: (vtrpc.IRPCError|null); + } + + /** Represents a Metric. */ + class Metric implements IMetric { + + /** + * Constructs a new Metric. + * @param [properties] Properties to set + */ + constructor(properties?: mysqlctl.HostMetricsResponse.IMetric); + + /** Metric name. */ + public name: string; + + /** Metric value. */ + public value: number; + + /** Metric error. */ + public error?: (vtrpc.IRPCError|null); + + /** + * Creates a new Metric instance using the specified properties. + * @param [properties] Properties to set + * @returns Metric instance + */ + public static create(properties?: mysqlctl.HostMetricsResponse.IMetric): mysqlctl.HostMetricsResponse.Metric; + + /** + * Encodes the specified Metric message. Does not implicitly {@link mysqlctl.HostMetricsResponse.Metric.verify|verify} messages. + * @param message Metric message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: mysqlctl.HostMetricsResponse.IMetric, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Metric message, length delimited. Does not implicitly {@link mysqlctl.HostMetricsResponse.Metric.verify|verify} messages. + * @param message Metric message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: mysqlctl.HostMetricsResponse.IMetric, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Metric message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Metric + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): mysqlctl.HostMetricsResponse.Metric; + + /** + * Decodes a Metric message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Metric + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): mysqlctl.HostMetricsResponse.Metric; + + /** + * Verifies a Metric message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Metric message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Metric + */ + public static fromObject(object: { [k: string]: any }): mysqlctl.HostMetricsResponse.Metric; + + /** + * Creates a plain object from a Metric message. Also converts values to other types if specified. + * @param message Metric + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: mysqlctl.HostMetricsResponse.Metric, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Metric to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for Metric + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + } + /** Represents a MysqlCtl */ class MysqlCtl extends $protobuf.rpc.Service { @@ -15283,6 +17552,20 @@ export namespace mysqlctl { * @returns Promise */ public versionString(request: mysqlctl.IVersionStringRequest): Promise; + + /** + * Calls HostMetrics. + * @param request HostMetricsRequest message or plain object + * @param callback Node-style callback called with the error, if any, and HostMetricsResponse + */ + public hostMetrics(request: mysqlctl.IHostMetricsRequest, callback: mysqlctl.MysqlCtl.HostMetricsCallback): void; + + /** + * Calls HostMetrics. + * @param request HostMetricsRequest message or plain object + * @returns Promise + */ + public hostMetrics(request: mysqlctl.IHostMetricsRequest): Promise; } namespace MysqlCtl { @@ -15342,6 +17625,13 @@ export namespace mysqlctl { * @param [response] VersionStringResponse */ type VersionStringCallback = (error: (Error|null), response?: mysqlctl.VersionStringResponse) => void; + + /** + * Callback as used by {@link mysqlctl.MysqlCtl#hostMetrics}. + * @param error Error, if any + * @param [response] HostMetricsResponse + */ + type HostMetricsCallback = (error: (Error|null), response?: mysqlctl.HostMetricsResponse) => void; } /** Properties of a BackupInfo. */ @@ -17977,6 +20267,251 @@ export namespace topodata { } } +/** Namespace vtrpc. */ +export namespace vtrpc { + + /** Properties of a CallerID. */ + interface ICallerID { + + /** CallerID principal */ + principal?: (string|null); + + /** CallerID component */ + component?: (string|null); + + /** CallerID subcomponent */ + subcomponent?: (string|null); + + /** CallerID groups */ + groups?: (string[]|null); + } + + /** Represents a CallerID. */ + class CallerID implements ICallerID { + + /** + * Constructs a new CallerID. + * @param [properties] Properties to set + */ + constructor(properties?: vtrpc.ICallerID); + + /** CallerID principal. */ + public principal: string; + + /** CallerID component. */ + public component: string; + + /** CallerID subcomponent. */ + public subcomponent: string; + + /** CallerID groups. */ + public groups: string[]; + + /** + * Creates a new CallerID instance using the specified properties. + * @param [properties] Properties to set + * @returns CallerID instance + */ + public static create(properties?: vtrpc.ICallerID): vtrpc.CallerID; + + /** + * Encodes the specified CallerID message. Does not implicitly {@link vtrpc.CallerID.verify|verify} messages. + * @param message CallerID message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtrpc.ICallerID, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CallerID message, length delimited. Does not implicitly {@link vtrpc.CallerID.verify|verify} messages. + * @param message CallerID message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtrpc.ICallerID, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CallerID message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CallerID + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtrpc.CallerID; + + /** + * Decodes a CallerID message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CallerID + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtrpc.CallerID; + + /** + * Verifies a CallerID message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CallerID message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CallerID + */ + public static fromObject(object: { [k: string]: any }): vtrpc.CallerID; + + /** + * Creates a plain object from a CallerID message. Also converts values to other types if specified. + * @param message CallerID + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtrpc.CallerID, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CallerID to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for CallerID + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Code enum. */ + enum Code { + OK = 0, + CANCELED = 1, + UNKNOWN = 2, + INVALID_ARGUMENT = 3, + DEADLINE_EXCEEDED = 4, + NOT_FOUND = 5, + ALREADY_EXISTS = 6, + PERMISSION_DENIED = 7, + RESOURCE_EXHAUSTED = 8, + FAILED_PRECONDITION = 9, + ABORTED = 10, + OUT_OF_RANGE = 11, + UNIMPLEMENTED = 12, + INTERNAL = 13, + UNAVAILABLE = 14, + DATA_LOSS = 15, + UNAUTHENTICATED = 16, + CLUSTER_EVENT = 17, + READ_ONLY = 18 + } + + /** Properties of a RPCError. */ + interface IRPCError { + + /** RPCError message */ + message?: (string|null); + + /** RPCError code */ + code?: (vtrpc.Code|null); + } + + /** Represents a RPCError. */ + class RPCError implements IRPCError { + + /** + * Constructs a new RPCError. + * @param [properties] Properties to set + */ + constructor(properties?: vtrpc.IRPCError); + + /** RPCError message. */ + public message: string; + + /** RPCError code. */ + public code: vtrpc.Code; + + /** + * Creates a new RPCError instance using the specified properties. + * @param [properties] Properties to set + * @returns RPCError instance + */ + public static create(properties?: vtrpc.IRPCError): vtrpc.RPCError; + + /** + * Encodes the specified RPCError message. Does not implicitly {@link vtrpc.RPCError.verify|verify} messages. + * @param message RPCError message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtrpc.IRPCError, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RPCError message, length delimited. Does not implicitly {@link vtrpc.RPCError.verify|verify} messages. + * @param message RPCError message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtrpc.IRPCError, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RPCError message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RPCError + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtrpc.RPCError; + + /** + * Decodes a RPCError message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RPCError + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtrpc.RPCError; + + /** + * Verifies a RPCError message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RPCError message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RPCError + */ + public static fromObject(object: { [k: string]: any }): vtrpc.RPCError; + + /** + * Creates a plain object from a RPCError message. Also converts values to other types if specified. + * @param message RPCError + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtrpc.RPCError, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RPCError to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for RPCError + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } +} + /** Namespace tabletmanagerdata. */ export namespace tabletmanagerdata { @@ -22841,6 +25376,776 @@ export namespace tabletmanagerdata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a GetUnresolvedTransactionsRequest. */ + interface IGetUnresolvedTransactionsRequest { + + /** GetUnresolvedTransactionsRequest abandon_age */ + abandon_age?: (number|Long|null); + } + + /** Represents a GetUnresolvedTransactionsRequest. */ + class GetUnresolvedTransactionsRequest implements IGetUnresolvedTransactionsRequest { + + /** + * Constructs a new GetUnresolvedTransactionsRequest. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IGetUnresolvedTransactionsRequest); + + /** GetUnresolvedTransactionsRequest abandon_age. */ + public abandon_age: (number|Long); + + /** + * Creates a new GetUnresolvedTransactionsRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns GetUnresolvedTransactionsRequest instance + */ + public static create(properties?: tabletmanagerdata.IGetUnresolvedTransactionsRequest): tabletmanagerdata.GetUnresolvedTransactionsRequest; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message. Does not implicitly {@link tabletmanagerdata.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @param message GetUnresolvedTransactionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IGetUnresolvedTransactionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @param message GetUnresolvedTransactionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IGetUnresolvedTransactionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.GetUnresolvedTransactionsRequest; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.GetUnresolvedTransactionsRequest; + + /** + * Verifies a GetUnresolvedTransactionsRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GetUnresolvedTransactionsRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GetUnresolvedTransactionsRequest + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.GetUnresolvedTransactionsRequest; + + /** + * Creates a plain object from a GetUnresolvedTransactionsRequest message. Also converts values to other types if specified. + * @param message GetUnresolvedTransactionsRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.GetUnresolvedTransactionsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GetUnresolvedTransactionsRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetUnresolvedTransactionsRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a GetUnresolvedTransactionsResponse. */ + interface IGetUnresolvedTransactionsResponse { + + /** GetUnresolvedTransactionsResponse transactions */ + transactions?: (query.ITransactionMetadata[]|null); + } + + /** Represents a GetUnresolvedTransactionsResponse. */ + class GetUnresolvedTransactionsResponse implements IGetUnresolvedTransactionsResponse { + + /** + * Constructs a new GetUnresolvedTransactionsResponse. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IGetUnresolvedTransactionsResponse); + + /** GetUnresolvedTransactionsResponse transactions. */ + public transactions: query.ITransactionMetadata[]; + + /** + * Creates a new GetUnresolvedTransactionsResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns GetUnresolvedTransactionsResponse instance + */ + public static create(properties?: tabletmanagerdata.IGetUnresolvedTransactionsResponse): tabletmanagerdata.GetUnresolvedTransactionsResponse; + + /** + * Encodes the specified GetUnresolvedTransactionsResponse message. Does not implicitly {@link tabletmanagerdata.GetUnresolvedTransactionsResponse.verify|verify} messages. + * @param message GetUnresolvedTransactionsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IGetUnresolvedTransactionsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GetUnresolvedTransactionsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.GetUnresolvedTransactionsResponse.verify|verify} messages. + * @param message GetUnresolvedTransactionsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IGetUnresolvedTransactionsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GetUnresolvedTransactionsResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GetUnresolvedTransactionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.GetUnresolvedTransactionsResponse; + + /** + * Decodes a GetUnresolvedTransactionsResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GetUnresolvedTransactionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.GetUnresolvedTransactionsResponse; + + /** + * Verifies a GetUnresolvedTransactionsResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GetUnresolvedTransactionsResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GetUnresolvedTransactionsResponse + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.GetUnresolvedTransactionsResponse; + + /** + * Creates a plain object from a GetUnresolvedTransactionsResponse message. Also converts values to other types if specified. + * @param message GetUnresolvedTransactionsResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.GetUnresolvedTransactionsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GetUnresolvedTransactionsResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetUnresolvedTransactionsResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ReadTransactionRequest. */ + interface IReadTransactionRequest { + + /** ReadTransactionRequest dtid */ + dtid?: (string|null); + } + + /** Represents a ReadTransactionRequest. */ + class ReadTransactionRequest implements IReadTransactionRequest { + + /** + * Constructs a new ReadTransactionRequest. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IReadTransactionRequest); + + /** ReadTransactionRequest dtid. */ + public dtid: string; + + /** + * Creates a new ReadTransactionRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ReadTransactionRequest instance + */ + public static create(properties?: tabletmanagerdata.IReadTransactionRequest): tabletmanagerdata.ReadTransactionRequest; + + /** + * Encodes the specified ReadTransactionRequest message. Does not implicitly {@link tabletmanagerdata.ReadTransactionRequest.verify|verify} messages. + * @param message ReadTransactionRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IReadTransactionRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ReadTransactionRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ReadTransactionRequest.verify|verify} messages. + * @param message ReadTransactionRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IReadTransactionRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ReadTransactionRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ReadTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ReadTransactionRequest; + + /** + * Decodes a ReadTransactionRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ReadTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ReadTransactionRequest; + + /** + * Verifies a ReadTransactionRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ReadTransactionRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ReadTransactionRequest + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ReadTransactionRequest; + + /** + * Creates a plain object from a ReadTransactionRequest message. Also converts values to other types if specified. + * @param message ReadTransactionRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ReadTransactionRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ReadTransactionRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ReadTransactionRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ReadTransactionResponse. */ + interface IReadTransactionResponse { + + /** ReadTransactionResponse transaction */ + transaction?: (query.ITransactionMetadata|null); + } + + /** Represents a ReadTransactionResponse. */ + class ReadTransactionResponse implements IReadTransactionResponse { + + /** + * Constructs a new ReadTransactionResponse. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IReadTransactionResponse); + + /** ReadTransactionResponse transaction. */ + public transaction?: (query.ITransactionMetadata|null); + + /** + * Creates a new ReadTransactionResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ReadTransactionResponse instance + */ + public static create(properties?: tabletmanagerdata.IReadTransactionResponse): tabletmanagerdata.ReadTransactionResponse; + + /** + * Encodes the specified ReadTransactionResponse message. Does not implicitly {@link tabletmanagerdata.ReadTransactionResponse.verify|verify} messages. + * @param message ReadTransactionResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IReadTransactionResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ReadTransactionResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ReadTransactionResponse.verify|verify} messages. + * @param message ReadTransactionResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IReadTransactionResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ReadTransactionResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ReadTransactionResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ReadTransactionResponse; + + /** + * Decodes a ReadTransactionResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ReadTransactionResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ReadTransactionResponse; + + /** + * Verifies a ReadTransactionResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ReadTransactionResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ReadTransactionResponse + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ReadTransactionResponse; + + /** + * Creates a plain object from a ReadTransactionResponse message. Also converts values to other types if specified. + * @param message ReadTransactionResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ReadTransactionResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ReadTransactionResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ReadTransactionResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ConcludeTransactionRequest. */ + interface IConcludeTransactionRequest { + + /** ConcludeTransactionRequest dtid */ + dtid?: (string|null); + + /** ConcludeTransactionRequest mm */ + mm?: (boolean|null); + } + + /** Represents a ConcludeTransactionRequest. */ + class ConcludeTransactionRequest implements IConcludeTransactionRequest { + + /** + * Constructs a new ConcludeTransactionRequest. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IConcludeTransactionRequest); + + /** ConcludeTransactionRequest dtid. */ + public dtid: string; + + /** ConcludeTransactionRequest mm. */ + public mm: boolean; + + /** + * Creates a new ConcludeTransactionRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ConcludeTransactionRequest instance + */ + public static create(properties?: tabletmanagerdata.IConcludeTransactionRequest): tabletmanagerdata.ConcludeTransactionRequest; + + /** + * Encodes the specified ConcludeTransactionRequest message. Does not implicitly {@link tabletmanagerdata.ConcludeTransactionRequest.verify|verify} messages. + * @param message ConcludeTransactionRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IConcludeTransactionRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ConcludeTransactionRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ConcludeTransactionRequest.verify|verify} messages. + * @param message ConcludeTransactionRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IConcludeTransactionRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ConcludeTransactionRequest; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ConcludeTransactionRequest; + + /** + * Verifies a ConcludeTransactionRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ConcludeTransactionRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ConcludeTransactionRequest + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ConcludeTransactionRequest; + + /** + * Creates a plain object from a ConcludeTransactionRequest message. Also converts values to other types if specified. + * @param message ConcludeTransactionRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ConcludeTransactionRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ConcludeTransactionRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ConcludeTransactionRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ConcludeTransactionResponse. */ + interface IConcludeTransactionResponse { + } + + /** Represents a ConcludeTransactionResponse. */ + class ConcludeTransactionResponse implements IConcludeTransactionResponse { + + /** + * Constructs a new ConcludeTransactionResponse. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IConcludeTransactionResponse); + + /** + * Creates a new ConcludeTransactionResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ConcludeTransactionResponse instance + */ + public static create(properties?: tabletmanagerdata.IConcludeTransactionResponse): tabletmanagerdata.ConcludeTransactionResponse; + + /** + * Encodes the specified ConcludeTransactionResponse message. Does not implicitly {@link tabletmanagerdata.ConcludeTransactionResponse.verify|verify} messages. + * @param message ConcludeTransactionResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IConcludeTransactionResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ConcludeTransactionResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ConcludeTransactionResponse.verify|verify} messages. + * @param message ConcludeTransactionResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IConcludeTransactionResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ConcludeTransactionResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ConcludeTransactionResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ConcludeTransactionResponse; + + /** + * Decodes a ConcludeTransactionResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ConcludeTransactionResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ConcludeTransactionResponse; + + /** + * Verifies a ConcludeTransactionResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ConcludeTransactionResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ConcludeTransactionResponse + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ConcludeTransactionResponse; + + /** + * Creates a plain object from a ConcludeTransactionResponse message. Also converts values to other types if specified. + * @param message ConcludeTransactionResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ConcludeTransactionResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ConcludeTransactionResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ConcludeTransactionResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a MysqlHostMetricsRequest. */ + interface IMysqlHostMetricsRequest { + } + + /** Represents a MysqlHostMetricsRequest. */ + class MysqlHostMetricsRequest implements IMysqlHostMetricsRequest { + + /** + * Constructs a new MysqlHostMetricsRequest. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IMysqlHostMetricsRequest); + + /** + * Creates a new MysqlHostMetricsRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns MysqlHostMetricsRequest instance + */ + public static create(properties?: tabletmanagerdata.IMysqlHostMetricsRequest): tabletmanagerdata.MysqlHostMetricsRequest; + + /** + * Encodes the specified MysqlHostMetricsRequest message. Does not implicitly {@link tabletmanagerdata.MysqlHostMetricsRequest.verify|verify} messages. + * @param message MysqlHostMetricsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IMysqlHostMetricsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MysqlHostMetricsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.MysqlHostMetricsRequest.verify|verify} messages. + * @param message MysqlHostMetricsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IMysqlHostMetricsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MysqlHostMetricsRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MysqlHostMetricsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.MysqlHostMetricsRequest; + + /** + * Decodes a MysqlHostMetricsRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MysqlHostMetricsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.MysqlHostMetricsRequest; + + /** + * Verifies a MysqlHostMetricsRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MysqlHostMetricsRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MysqlHostMetricsRequest + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.MysqlHostMetricsRequest; + + /** + * Creates a plain object from a MysqlHostMetricsRequest message. Also converts values to other types if specified. + * @param message MysqlHostMetricsRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.MysqlHostMetricsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MysqlHostMetricsRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for MysqlHostMetricsRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a MysqlHostMetricsResponse. */ + interface IMysqlHostMetricsResponse { + + /** MysqlHostMetricsResponse HostMetrics */ + HostMetrics?: (mysqlctl.IHostMetricsResponse|null); + } + + /** Represents a MysqlHostMetricsResponse. */ + class MysqlHostMetricsResponse implements IMysqlHostMetricsResponse { + + /** + * Constructs a new MysqlHostMetricsResponse. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IMysqlHostMetricsResponse); + + /** MysqlHostMetricsResponse HostMetrics. */ + public HostMetrics?: (mysqlctl.IHostMetricsResponse|null); + + /** + * Creates a new MysqlHostMetricsResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns MysqlHostMetricsResponse instance + */ + public static create(properties?: tabletmanagerdata.IMysqlHostMetricsResponse): tabletmanagerdata.MysqlHostMetricsResponse; + + /** + * Encodes the specified MysqlHostMetricsResponse message. Does not implicitly {@link tabletmanagerdata.MysqlHostMetricsResponse.verify|verify} messages. + * @param message MysqlHostMetricsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IMysqlHostMetricsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MysqlHostMetricsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.MysqlHostMetricsResponse.verify|verify} messages. + * @param message MysqlHostMetricsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IMysqlHostMetricsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MysqlHostMetricsResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MysqlHostMetricsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.MysqlHostMetricsResponse; + + /** + * Decodes a MysqlHostMetricsResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MysqlHostMetricsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.MysqlHostMetricsResponse; + + /** + * Verifies a MysqlHostMetricsResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MysqlHostMetricsResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MysqlHostMetricsResponse + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.MysqlHostMetricsResponse; + + /** + * Creates a plain object from a MysqlHostMetricsResponse message. Also converts values to other types if specified. + * @param message MysqlHostMetricsResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.MysqlHostMetricsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MysqlHostMetricsResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for MysqlHostMetricsResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a ReplicationStatusRequest. */ interface IReplicationStatusRequest { } @@ -25515,6 +28820,194 @@ export namespace tabletmanagerdata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a ReadReparentJournalInfoRequest. */ + interface IReadReparentJournalInfoRequest { + } + + /** Represents a ReadReparentJournalInfoRequest. */ + class ReadReparentJournalInfoRequest implements IReadReparentJournalInfoRequest { + + /** + * Constructs a new ReadReparentJournalInfoRequest. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IReadReparentJournalInfoRequest); + + /** + * Creates a new ReadReparentJournalInfoRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ReadReparentJournalInfoRequest instance + */ + public static create(properties?: tabletmanagerdata.IReadReparentJournalInfoRequest): tabletmanagerdata.ReadReparentJournalInfoRequest; + + /** + * Encodes the specified ReadReparentJournalInfoRequest message. Does not implicitly {@link tabletmanagerdata.ReadReparentJournalInfoRequest.verify|verify} messages. + * @param message ReadReparentJournalInfoRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IReadReparentJournalInfoRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ReadReparentJournalInfoRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ReadReparentJournalInfoRequest.verify|verify} messages. + * @param message ReadReparentJournalInfoRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IReadReparentJournalInfoRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ReadReparentJournalInfoRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ReadReparentJournalInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ReadReparentJournalInfoRequest; + + /** + * Decodes a ReadReparentJournalInfoRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ReadReparentJournalInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ReadReparentJournalInfoRequest; + + /** + * Verifies a ReadReparentJournalInfoRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ReadReparentJournalInfoRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ReadReparentJournalInfoRequest + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ReadReparentJournalInfoRequest; + + /** + * Creates a plain object from a ReadReparentJournalInfoRequest message. Also converts values to other types if specified. + * @param message ReadReparentJournalInfoRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ReadReparentJournalInfoRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ReadReparentJournalInfoRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ReadReparentJournalInfoRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ReadReparentJournalInfoResponse. */ + interface IReadReparentJournalInfoResponse { + + /** ReadReparentJournalInfoResponse length */ + length?: (number|null); + } + + /** Represents a ReadReparentJournalInfoResponse. */ + class ReadReparentJournalInfoResponse implements IReadReparentJournalInfoResponse { + + /** + * Constructs a new ReadReparentJournalInfoResponse. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IReadReparentJournalInfoResponse); + + /** ReadReparentJournalInfoResponse length. */ + public length: number; + + /** + * Creates a new ReadReparentJournalInfoResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ReadReparentJournalInfoResponse instance + */ + public static create(properties?: tabletmanagerdata.IReadReparentJournalInfoResponse): tabletmanagerdata.ReadReparentJournalInfoResponse; + + /** + * Encodes the specified ReadReparentJournalInfoResponse message. Does not implicitly {@link tabletmanagerdata.ReadReparentJournalInfoResponse.verify|verify} messages. + * @param message ReadReparentJournalInfoResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IReadReparentJournalInfoResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ReadReparentJournalInfoResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ReadReparentJournalInfoResponse.verify|verify} messages. + * @param message ReadReparentJournalInfoResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IReadReparentJournalInfoResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ReadReparentJournalInfoResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ReadReparentJournalInfoResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ReadReparentJournalInfoResponse; + + /** + * Decodes a ReadReparentJournalInfoResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ReadReparentJournalInfoResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ReadReparentJournalInfoResponse; + + /** + * Verifies a ReadReparentJournalInfoResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ReadReparentJournalInfoResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ReadReparentJournalInfoResponse + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ReadReparentJournalInfoResponse; + + /** + * Creates a plain object from a ReadReparentJournalInfoResponse message. Also converts values to other types if specified. + * @param message ReadReparentJournalInfoResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ReadReparentJournalInfoResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ReadReparentJournalInfoResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ReadReparentJournalInfoResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of an InitReplicaRequest. */ interface IInitReplicaRequest { @@ -27457,6 +30950,9 @@ export namespace tabletmanagerdata { /** BackupRequest upgrade_safe */ upgrade_safe?: (boolean|null); + + /** BackupRequest backup_engine */ + backup_engine?: (string|null); } /** Represents a BackupRequest. */ @@ -27480,6 +30976,12 @@ export namespace tabletmanagerdata { /** BackupRequest upgrade_safe. */ public upgrade_safe: boolean; + /** BackupRequest backup_engine. */ + public backup_engine?: (string|null); + + /** BackupRequest _backup_engine. */ + public _backup_engine?: "backup_engine"; + /** * Creates a new BackupRequest instance using the specified properties. * @param [properties] Properties to set @@ -27669,6 +31171,9 @@ export namespace tabletmanagerdata { /** RestoreFromBackupRequest restore_to_timestamp */ restore_to_timestamp?: (vttime.ITime|null); + + /** RestoreFromBackupRequest allowed_backup_engines */ + allowed_backup_engines?: (string[]|null); } /** Represents a RestoreFromBackupRequest. */ @@ -27692,6 +31197,9 @@ export namespace tabletmanagerdata { /** RestoreFromBackupRequest restore_to_timestamp. */ public restore_to_timestamp?: (vttime.ITime|null); + /** RestoreFromBackupRequest allowed_backup_engines. */ + public allowed_backup_engines: string[]; + /** * Creates a new RestoreFromBackupRequest instance using the specified properties. * @param [properties] Properties to set @@ -28121,6 +31629,200 @@ export namespace tabletmanagerdata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a DeleteTableDataRequest. */ + interface IDeleteTableDataRequest { + + /** DeleteTableDataRequest table_filters */ + table_filters?: ({ [k: string]: string }|null); + + /** DeleteTableDataRequest batch_size */ + batch_size?: (number|Long|null); + } + + /** Represents a DeleteTableDataRequest. */ + class DeleteTableDataRequest implements IDeleteTableDataRequest { + + /** + * Constructs a new DeleteTableDataRequest. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IDeleteTableDataRequest); + + /** DeleteTableDataRequest table_filters. */ + public table_filters: { [k: string]: string }; + + /** DeleteTableDataRequest batch_size. */ + public batch_size: (number|Long); + + /** + * Creates a new DeleteTableDataRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns DeleteTableDataRequest instance + */ + public static create(properties?: tabletmanagerdata.IDeleteTableDataRequest): tabletmanagerdata.DeleteTableDataRequest; + + /** + * Encodes the specified DeleteTableDataRequest message. Does not implicitly {@link tabletmanagerdata.DeleteTableDataRequest.verify|verify} messages. + * @param message DeleteTableDataRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IDeleteTableDataRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DeleteTableDataRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.DeleteTableDataRequest.verify|verify} messages. + * @param message DeleteTableDataRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IDeleteTableDataRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DeleteTableDataRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DeleteTableDataRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.DeleteTableDataRequest; + + /** + * Decodes a DeleteTableDataRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DeleteTableDataRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.DeleteTableDataRequest; + + /** + * Verifies a DeleteTableDataRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DeleteTableDataRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DeleteTableDataRequest + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.DeleteTableDataRequest; + + /** + * Creates a plain object from a DeleteTableDataRequest message. Also converts values to other types if specified. + * @param message DeleteTableDataRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.DeleteTableDataRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DeleteTableDataRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for DeleteTableDataRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a DeleteTableDataResponse. */ + interface IDeleteTableDataResponse { + } + + /** Represents a DeleteTableDataResponse. */ + class DeleteTableDataResponse implements IDeleteTableDataResponse { + + /** + * Constructs a new DeleteTableDataResponse. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IDeleteTableDataResponse); + + /** + * Creates a new DeleteTableDataResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns DeleteTableDataResponse instance + */ + public static create(properties?: tabletmanagerdata.IDeleteTableDataResponse): tabletmanagerdata.DeleteTableDataResponse; + + /** + * Encodes the specified DeleteTableDataResponse message. Does not implicitly {@link tabletmanagerdata.DeleteTableDataResponse.verify|verify} messages. + * @param message DeleteTableDataResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IDeleteTableDataResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DeleteTableDataResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.DeleteTableDataResponse.verify|verify} messages. + * @param message DeleteTableDataResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IDeleteTableDataResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DeleteTableDataResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DeleteTableDataResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.DeleteTableDataResponse; + + /** + * Decodes a DeleteTableDataResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DeleteTableDataResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.DeleteTableDataResponse; + + /** + * Verifies a DeleteTableDataResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DeleteTableDataResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DeleteTableDataResponse + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.DeleteTableDataResponse; + + /** + * Creates a plain object from a DeleteTableDataResponse message. Also converts values to other types if specified. + * @param message DeleteTableDataResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.DeleteTableDataResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DeleteTableDataResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for DeleteTableDataResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a DeleteVReplicationWorkflowRequest. */ interface IDeleteVReplicationWorkflowRequest { @@ -28859,6 +32561,9 @@ export namespace tabletmanagerdata { /** ReadVReplicationWorkflowResponse options */ options?: (string|null); + + /** ReadVReplicationWorkflowResponse config_overrides */ + config_overrides?: ({ [k: string]: string }|null); } /** Represents a ReadVReplicationWorkflowResponse. */ @@ -28903,6 +32608,9 @@ export namespace tabletmanagerdata { /** ReadVReplicationWorkflowResponse options. */ public options: string; + /** ReadVReplicationWorkflowResponse config_overrides. */ + public config_overrides: { [k: string]: string }; + /** * Creates a new ReadVReplicationWorkflowResponse instance using the specified properties. * @param [properties] Properties to set @@ -29159,6 +32867,200 @@ export namespace tabletmanagerdata { } } + /** Properties of a ValidateVReplicationPermissionsRequest. */ + interface IValidateVReplicationPermissionsRequest { + } + + /** Represents a ValidateVReplicationPermissionsRequest. */ + class ValidateVReplicationPermissionsRequest implements IValidateVReplicationPermissionsRequest { + + /** + * Constructs a new ValidateVReplicationPermissionsRequest. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IValidateVReplicationPermissionsRequest); + + /** + * Creates a new ValidateVReplicationPermissionsRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ValidateVReplicationPermissionsRequest instance + */ + public static create(properties?: tabletmanagerdata.IValidateVReplicationPermissionsRequest): tabletmanagerdata.ValidateVReplicationPermissionsRequest; + + /** + * Encodes the specified ValidateVReplicationPermissionsRequest message. Does not implicitly {@link tabletmanagerdata.ValidateVReplicationPermissionsRequest.verify|verify} messages. + * @param message ValidateVReplicationPermissionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IValidateVReplicationPermissionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ValidateVReplicationPermissionsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ValidateVReplicationPermissionsRequest.verify|verify} messages. + * @param message ValidateVReplicationPermissionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IValidateVReplicationPermissionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ValidateVReplicationPermissionsRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ValidateVReplicationPermissionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ValidateVReplicationPermissionsRequest; + + /** + * Decodes a ValidateVReplicationPermissionsRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ValidateVReplicationPermissionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ValidateVReplicationPermissionsRequest; + + /** + * Verifies a ValidateVReplicationPermissionsRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ValidateVReplicationPermissionsRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ValidateVReplicationPermissionsRequest + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ValidateVReplicationPermissionsRequest; + + /** + * Creates a plain object from a ValidateVReplicationPermissionsRequest message. Also converts values to other types if specified. + * @param message ValidateVReplicationPermissionsRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ValidateVReplicationPermissionsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ValidateVReplicationPermissionsRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ValidateVReplicationPermissionsRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ValidateVReplicationPermissionsResponse. */ + interface IValidateVReplicationPermissionsResponse { + + /** ValidateVReplicationPermissionsResponse user */ + user?: (string|null); + + /** ValidateVReplicationPermissionsResponse ok */ + ok?: (boolean|null); + } + + /** Represents a ValidateVReplicationPermissionsResponse. */ + class ValidateVReplicationPermissionsResponse implements IValidateVReplicationPermissionsResponse { + + /** + * Constructs a new ValidateVReplicationPermissionsResponse. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IValidateVReplicationPermissionsResponse); + + /** ValidateVReplicationPermissionsResponse user. */ + public user: string; + + /** ValidateVReplicationPermissionsResponse ok. */ + public ok: boolean; + + /** + * Creates a new ValidateVReplicationPermissionsResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ValidateVReplicationPermissionsResponse instance + */ + public static create(properties?: tabletmanagerdata.IValidateVReplicationPermissionsResponse): tabletmanagerdata.ValidateVReplicationPermissionsResponse; + + /** + * Encodes the specified ValidateVReplicationPermissionsResponse message. Does not implicitly {@link tabletmanagerdata.ValidateVReplicationPermissionsResponse.verify|verify} messages. + * @param message ValidateVReplicationPermissionsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IValidateVReplicationPermissionsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ValidateVReplicationPermissionsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ValidateVReplicationPermissionsResponse.verify|verify} messages. + * @param message ValidateVReplicationPermissionsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IValidateVReplicationPermissionsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ValidateVReplicationPermissionsResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ValidateVReplicationPermissionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ValidateVReplicationPermissionsResponse; + + /** + * Decodes a ValidateVReplicationPermissionsResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ValidateVReplicationPermissionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ValidateVReplicationPermissionsResponse; + + /** + * Verifies a ValidateVReplicationPermissionsResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ValidateVReplicationPermissionsResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ValidateVReplicationPermissionsResponse + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ValidateVReplicationPermissionsResponse; + + /** + * Creates a plain object from a ValidateVReplicationPermissionsResponse message. Also converts values to other types if specified. + * @param message ValidateVReplicationPermissionsResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ValidateVReplicationPermissionsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ValidateVReplicationPermissionsResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ValidateVReplicationPermissionsResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a VDiffRequest. */ interface IVDiffRequest { @@ -29518,6 +33420,9 @@ export namespace tabletmanagerdata { /** VDiffReportOptions max_sample_rows */ max_sample_rows?: (number|Long|null); + + /** VDiffReportOptions row_diff_column_truncate_at */ + row_diff_column_truncate_at?: (number|Long|null); } /** Represents a VDiffReportOptions. */ @@ -29541,6 +33446,9 @@ export namespace tabletmanagerdata { /** VDiffReportOptions max_sample_rows. */ public max_sample_rows: (number|Long); + /** VDiffReportOptions row_diff_column_truncate_at. */ + public row_diff_column_truncate_at: (number|Long); + /** * Creates a new VDiffReportOptions instance using the specified properties. * @param [properties] Properties to set @@ -29648,6 +33556,9 @@ export namespace tabletmanagerdata { /** VDiffCoreOptions max_diff_seconds */ max_diff_seconds?: (number|Long|null); + + /** VDiffCoreOptions auto_start */ + auto_start?: (boolean|null); } /** Represents a VDiffCoreOptions. */ @@ -29686,6 +33597,12 @@ export namespace tabletmanagerdata { /** VDiffCoreOptions max_diff_seconds. */ public max_diff_seconds: (number|Long); + /** VDiffCoreOptions auto_start. */ + public auto_start?: (boolean|null); + + /** VDiffCoreOptions _auto_start. */ + public _auto_start?: "auto_start"; + /** * Creates a new VDiffCoreOptions instance using the specified properties. * @param [properties] Properties to set @@ -29893,6 +33810,9 @@ export namespace tabletmanagerdata { /** UpdateVReplicationWorkflowRequest state */ state?: (binlogdata.VReplicationWorkflowState|null); + + /** UpdateVReplicationWorkflowRequest config_overrides */ + config_overrides?: ({ [k: string]: string }|null); } /** Represents an UpdateVReplicationWorkflowRequest. */ @@ -29914,13 +33834,25 @@ export namespace tabletmanagerdata { public tablet_types: topodata.TabletType[]; /** UpdateVReplicationWorkflowRequest tablet_selection_preference. */ - public tablet_selection_preference: tabletmanagerdata.TabletSelectionPreference; + public tablet_selection_preference?: (tabletmanagerdata.TabletSelectionPreference|null); /** UpdateVReplicationWorkflowRequest on_ddl. */ - public on_ddl: binlogdata.OnDDLAction; + public on_ddl?: (binlogdata.OnDDLAction|null); /** UpdateVReplicationWorkflowRequest state. */ - public state: binlogdata.VReplicationWorkflowState; + public state?: (binlogdata.VReplicationWorkflowState|null); + + /** UpdateVReplicationWorkflowRequest config_overrides. */ + public config_overrides: { [k: string]: string }; + + /** UpdateVReplicationWorkflowRequest _tablet_selection_preference. */ + public _tablet_selection_preference?: "tablet_selection_preference"; + + /** UpdateVReplicationWorkflowRequest _on_ddl. */ + public _on_ddl?: "on_ddl"; + + /** UpdateVReplicationWorkflowRequest _state. */ + public _state?: "state"; /** * Creates a new UpdateVReplicationWorkflowRequest instance using the specified properties. @@ -30138,13 +34070,22 @@ export namespace tabletmanagerdata { public exclude_workflows: string[]; /** UpdateVReplicationWorkflowsRequest state. */ - public state: binlogdata.VReplicationWorkflowState; + public state?: (binlogdata.VReplicationWorkflowState|null); /** UpdateVReplicationWorkflowsRequest message. */ - public message: string; + public message?: (string|null); /** UpdateVReplicationWorkflowsRequest stop_position. */ - public stop_position: string; + public stop_position?: (string|null); + + /** UpdateVReplicationWorkflowsRequest _state. */ + public _state?: "state"; + + /** UpdateVReplicationWorkflowsRequest _message. */ + public _message?: "message"; + + /** UpdateVReplicationWorkflowsRequest _stop_position. */ + public _stop_position?: "stop_position"; /** * Creates a new UpdateVReplicationWorkflowsRequest instance using the specified properties. @@ -30630,6 +34571,16 @@ export namespace tabletmanagerdata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** CheckThrottlerResponseCode enum. */ + enum CheckThrottlerResponseCode { + UNDEFINED = 0, + OK = 1, + THRESHOLD_EXCEEDED = 2, + APP_DENIED = 3, + UNKNOWN_METRIC = 4, + INTERNAL_ERROR = 5 + } + /** Properties of a CheckThrottlerResponse. */ interface ICheckThrottlerResponse { @@ -30653,6 +34604,15 @@ export namespace tabletmanagerdata { /** CheckThrottlerResponse metrics */ metrics?: ({ [k: string]: tabletmanagerdata.CheckThrottlerResponse.IMetric }|null); + + /** CheckThrottlerResponse app_name */ + app_name?: (string|null); + + /** CheckThrottlerResponse summary */ + summary?: (string|null); + + /** CheckThrottlerResponse response_code */ + response_code?: (tabletmanagerdata.CheckThrottlerResponseCode|null); } /** Represents a CheckThrottlerResponse. */ @@ -30685,6 +34645,15 @@ export namespace tabletmanagerdata { /** CheckThrottlerResponse metrics. */ public metrics: { [k: string]: tabletmanagerdata.CheckThrottlerResponse.IMetric }; + /** CheckThrottlerResponse app_name. */ + public app_name: string; + + /** CheckThrottlerResponse summary. */ + public summary: string; + + /** CheckThrottlerResponse response_code. */ + public response_code: tabletmanagerdata.CheckThrottlerResponseCode; + /** * Creates a new CheckThrottlerResponse instance using the specified properties. * @param [properties] Properties to set @@ -30788,6 +34757,9 @@ export namespace tabletmanagerdata { /** Metric scope */ scope?: (string|null); + + /** Metric response_code */ + response_code?: (tabletmanagerdata.CheckThrottlerResponseCode|null); } /** Represents a Metric. */ @@ -30820,6 +34792,9 @@ export namespace tabletmanagerdata { /** Metric scope. */ public scope: string; + /** Metric response_code. */ + public response_code: tabletmanagerdata.CheckThrottlerResponseCode; + /** * Creates a new Metric instance using the specified properties. * @param [properties] Properties to set @@ -31405,6 +35380,9 @@ export namespace tabletmanagerdata { /** RecentApp status_code */ status_code?: (number|null); + + /** RecentApp response_code */ + response_code?: (tabletmanagerdata.CheckThrottlerResponseCode|null); } /** Represents a RecentApp. */ @@ -31422,6 +35400,9 @@ export namespace tabletmanagerdata { /** RecentApp status_code. */ public status_code: number; + /** RecentApp response_code. */ + public response_code: tabletmanagerdata.CheckThrottlerResponseCode; + /** * Creates a new RecentApp instance using the specified properties. * @param [properties] Properties to set @@ -31500,6 +35481,206 @@ export namespace tabletmanagerdata { public static getTypeUrl(typeUrlPrefix?: string): string; } } + + /** Properties of a ChangeTagsRequest. */ + interface IChangeTagsRequest { + + /** ChangeTagsRequest tags */ + tags?: ({ [k: string]: string }|null); + + /** ChangeTagsRequest replace */ + replace?: (boolean|null); + } + + /** Represents a ChangeTagsRequest. */ + class ChangeTagsRequest implements IChangeTagsRequest { + + /** + * Constructs a new ChangeTagsRequest. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IChangeTagsRequest); + + /** ChangeTagsRequest tags. */ + public tags: { [k: string]: string }; + + /** ChangeTagsRequest replace. */ + public replace: boolean; + + /** + * Creates a new ChangeTagsRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ChangeTagsRequest instance + */ + public static create(properties?: tabletmanagerdata.IChangeTagsRequest): tabletmanagerdata.ChangeTagsRequest; + + /** + * Encodes the specified ChangeTagsRequest message. Does not implicitly {@link tabletmanagerdata.ChangeTagsRequest.verify|verify} messages. + * @param message ChangeTagsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IChangeTagsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ChangeTagsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ChangeTagsRequest.verify|verify} messages. + * @param message ChangeTagsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IChangeTagsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ChangeTagsRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ChangeTagsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ChangeTagsRequest; + + /** + * Decodes a ChangeTagsRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ChangeTagsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ChangeTagsRequest; + + /** + * Verifies a ChangeTagsRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ChangeTagsRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ChangeTagsRequest + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ChangeTagsRequest; + + /** + * Creates a plain object from a ChangeTagsRequest message. Also converts values to other types if specified. + * @param message ChangeTagsRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ChangeTagsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ChangeTagsRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ChangeTagsRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ChangeTagsResponse. */ + interface IChangeTagsResponse { + + /** ChangeTagsResponse tags */ + tags?: ({ [k: string]: string }|null); + } + + /** Represents a ChangeTagsResponse. */ + class ChangeTagsResponse implements IChangeTagsResponse { + + /** + * Constructs a new ChangeTagsResponse. + * @param [properties] Properties to set + */ + constructor(properties?: tabletmanagerdata.IChangeTagsResponse); + + /** ChangeTagsResponse tags. */ + public tags: { [k: string]: string }; + + /** + * Creates a new ChangeTagsResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ChangeTagsResponse instance + */ + public static create(properties?: tabletmanagerdata.IChangeTagsResponse): tabletmanagerdata.ChangeTagsResponse; + + /** + * Encodes the specified ChangeTagsResponse message. Does not implicitly {@link tabletmanagerdata.ChangeTagsResponse.verify|verify} messages. + * @param message ChangeTagsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: tabletmanagerdata.IChangeTagsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ChangeTagsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ChangeTagsResponse.verify|verify} messages. + * @param message ChangeTagsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: tabletmanagerdata.IChangeTagsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ChangeTagsResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ChangeTagsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): tabletmanagerdata.ChangeTagsResponse; + + /** + * Decodes a ChangeTagsResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ChangeTagsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): tabletmanagerdata.ChangeTagsResponse; + + /** + * Verifies a ChangeTagsResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ChangeTagsResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ChangeTagsResponse + */ + public static fromObject(object: { [k: string]: any }): tabletmanagerdata.ChangeTagsResponse; + + /** + * Creates a plain object from a ChangeTagsResponse message. Also converts values to other types if specified. + * @param message ChangeTagsResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: tabletmanagerdata.ChangeTagsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ChangeTagsResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ChangeTagsResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } } /** Namespace binlogdata. */ @@ -33086,6 +37267,9 @@ export namespace binlogdata { /** RowEvent flags */ flags?: (number|null); + + /** RowEvent is_internal_table */ + is_internal_table?: (boolean|null); } /** Represents a RowEvent. */ @@ -33112,6 +37296,9 @@ export namespace binlogdata { /** RowEvent flags. */ public flags: number; + /** RowEvent is_internal_table. */ + public is_internal_table: boolean; + /** * Creates a new RowEvent instance using the specified properties. * @param [properties] Properties to set @@ -33207,6 +37394,9 @@ export namespace binlogdata { /** FieldEvent enum_set_string_values */ enum_set_string_values?: (boolean|null); + + /** FieldEvent is_internal_table */ + is_internal_table?: (boolean|null); } /** Represents a FieldEvent. */ @@ -33233,6 +37423,9 @@ export namespace binlogdata { /** FieldEvent enum_set_string_values. */ public enum_set_string_values: boolean; + /** FieldEvent is_internal_table. */ + public is_internal_table: boolean; + /** * Creates a new FieldEvent instance using the specified properties. * @param [properties] Properties to set @@ -33809,6 +38002,9 @@ export namespace binlogdata { /** VEvent throttled */ throttled?: (boolean|null); + + /** VEvent throttled_reason */ + throttled_reason?: (string|null); } /** Represents a VEvent. */ @@ -33862,6 +38058,9 @@ export namespace binlogdata { /** VEvent throttled. */ public throttled: boolean; + /** VEvent throttled_reason. */ + public throttled_reason: string; + /** * Creates a new VEvent instance using the specified properties. * @param [properties] Properties to set @@ -34152,6 +38351,109 @@ export namespace binlogdata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a VStreamOptions. */ + interface IVStreamOptions { + + /** VStreamOptions internal_tables */ + internal_tables?: (string[]|null); + + /** VStreamOptions config_overrides */ + config_overrides?: ({ [k: string]: string }|null); + } + + /** Represents a VStreamOptions. */ + class VStreamOptions implements IVStreamOptions { + + /** + * Constructs a new VStreamOptions. + * @param [properties] Properties to set + */ + constructor(properties?: binlogdata.IVStreamOptions); + + /** VStreamOptions internal_tables. */ + public internal_tables: string[]; + + /** VStreamOptions config_overrides. */ + public config_overrides: { [k: string]: string }; + + /** + * Creates a new VStreamOptions instance using the specified properties. + * @param [properties] Properties to set + * @returns VStreamOptions instance + */ + public static create(properties?: binlogdata.IVStreamOptions): binlogdata.VStreamOptions; + + /** + * Encodes the specified VStreamOptions message. Does not implicitly {@link binlogdata.VStreamOptions.verify|verify} messages. + * @param message VStreamOptions message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: binlogdata.IVStreamOptions, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VStreamOptions message, length delimited. Does not implicitly {@link binlogdata.VStreamOptions.verify|verify} messages. + * @param message VStreamOptions message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: binlogdata.IVStreamOptions, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VStreamOptions message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VStreamOptions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): binlogdata.VStreamOptions; + + /** + * Decodes a VStreamOptions message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VStreamOptions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): binlogdata.VStreamOptions; + + /** + * Verifies a VStreamOptions message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VStreamOptions message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VStreamOptions + */ + public static fromObject(object: { [k: string]: any }): binlogdata.VStreamOptions; + + /** + * Creates a plain object from a VStreamOptions message. Also converts values to other types if specified. + * @param message VStreamOptions + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: binlogdata.VStreamOptions, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VStreamOptions to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for VStreamOptions + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a VStreamRequest. */ interface IVStreamRequest { @@ -34172,6 +38474,9 @@ export namespace binlogdata { /** VStreamRequest table_last_p_ks */ table_last_p_ks?: (binlogdata.ITableLastPK[]|null); + + /** VStreamRequest options */ + options?: (binlogdata.IVStreamOptions|null); } /** Represents a VStreamRequest. */ @@ -34201,6 +38506,9 @@ export namespace binlogdata { /** VStreamRequest table_last_p_ks. */ public table_last_p_ks: binlogdata.ITableLastPK[]; + /** VStreamRequest options. */ + public options?: (binlogdata.IVStreamOptions|null); + /** * Creates a new VStreamRequest instance using the specified properties. * @param [properties] Properties to set @@ -34393,6 +38701,9 @@ export namespace binlogdata { /** VStreamRowsRequest lastpk */ lastpk?: (query.IQueryResult|null); + + /** VStreamRowsRequest options */ + options?: (binlogdata.IVStreamOptions|null); } /** Represents a VStreamRowsRequest. */ @@ -34419,6 +38730,9 @@ export namespace binlogdata { /** VStreamRowsRequest lastpk. */ public lastpk?: (query.IQueryResult|null); + /** VStreamRowsRequest options. */ + public options?: (binlogdata.IVStreamOptions|null); + /** * Creates a new VStreamRowsRequest instance using the specified properties. * @param [properties] Properties to set @@ -34520,6 +38834,9 @@ export namespace binlogdata { /** VStreamRowsResponse heartbeat */ heartbeat?: (boolean|null); + + /** VStreamRowsResponse throttled_reason */ + throttled_reason?: (string|null); } /** Represents a VStreamRowsResponse. */ @@ -34552,6 +38869,9 @@ export namespace binlogdata { /** VStreamRowsResponse heartbeat. */ public heartbeat: boolean; + /** VStreamRowsResponse throttled_reason. */ + public throttled_reason: string; + /** * Creates a new VStreamRowsResponse instance using the specified properties. * @param [properties] Properties to set @@ -34641,6 +38961,9 @@ export namespace binlogdata { /** VStreamTablesRequest target */ target?: (query.ITarget|null); + + /** VStreamTablesRequest options */ + options?: (binlogdata.IVStreamOptions|null); } /** Represents a VStreamTablesRequest. */ @@ -34661,6 +38984,9 @@ export namespace binlogdata { /** VStreamTablesRequest target. */ public target?: (query.ITarget|null); + /** VStreamTablesRequest options. */ + public options?: (binlogdata.IVStreamOptions|null); + /** * Creates a new VStreamTablesRequest instance using the specified properties. * @param [properties] Properties to set @@ -35297,251 +39623,6 @@ export namespace binlogdata { } } -/** Namespace vtrpc. */ -export namespace vtrpc { - - /** Properties of a CallerID. */ - interface ICallerID { - - /** CallerID principal */ - principal?: (string|null); - - /** CallerID component */ - component?: (string|null); - - /** CallerID subcomponent */ - subcomponent?: (string|null); - - /** CallerID groups */ - groups?: (string[]|null); - } - - /** Represents a CallerID. */ - class CallerID implements ICallerID { - - /** - * Constructs a new CallerID. - * @param [properties] Properties to set - */ - constructor(properties?: vtrpc.ICallerID); - - /** CallerID principal. */ - public principal: string; - - /** CallerID component. */ - public component: string; - - /** CallerID subcomponent. */ - public subcomponent: string; - - /** CallerID groups. */ - public groups: string[]; - - /** - * Creates a new CallerID instance using the specified properties. - * @param [properties] Properties to set - * @returns CallerID instance - */ - public static create(properties?: vtrpc.ICallerID): vtrpc.CallerID; - - /** - * Encodes the specified CallerID message. Does not implicitly {@link vtrpc.CallerID.verify|verify} messages. - * @param message CallerID message or plain object to encode - * @param [writer] Writer to encode to - * @returns Writer - */ - public static encode(message: vtrpc.ICallerID, writer?: $protobuf.Writer): $protobuf.Writer; - - /** - * Encodes the specified CallerID message, length delimited. Does not implicitly {@link vtrpc.CallerID.verify|verify} messages. - * @param message CallerID message or plain object to encode - * @param [writer] Writer to encode to - * @returns Writer - */ - public static encodeDelimited(message: vtrpc.ICallerID, writer?: $protobuf.Writer): $protobuf.Writer; - - /** - * Decodes a CallerID message from the specified reader or buffer. - * @param reader Reader or buffer to decode from - * @param [length] Message length if known beforehand - * @returns CallerID - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtrpc.CallerID; - - /** - * Decodes a CallerID message from the specified reader or buffer, length delimited. - * @param reader Reader or buffer to decode from - * @returns CallerID - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtrpc.CallerID; - - /** - * Verifies a CallerID message. - * @param message Plain object to verify - * @returns `null` if valid, otherwise the reason why it is not - */ - public static verify(message: { [k: string]: any }): (string|null); - - /** - * Creates a CallerID message from a plain object. Also converts values to their respective internal types. - * @param object Plain object - * @returns CallerID - */ - public static fromObject(object: { [k: string]: any }): vtrpc.CallerID; - - /** - * Creates a plain object from a CallerID message. Also converts values to other types if specified. - * @param message CallerID - * @param [options] Conversion options - * @returns Plain object - */ - public static toObject(message: vtrpc.CallerID, options?: $protobuf.IConversionOptions): { [k: string]: any }; - - /** - * Converts this CallerID to JSON. - * @returns JSON object - */ - public toJSON(): { [k: string]: any }; - - /** - * Gets the default type url for CallerID - * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns The default type url - */ - public static getTypeUrl(typeUrlPrefix?: string): string; - } - - /** Code enum. */ - enum Code { - OK = 0, - CANCELED = 1, - UNKNOWN = 2, - INVALID_ARGUMENT = 3, - DEADLINE_EXCEEDED = 4, - NOT_FOUND = 5, - ALREADY_EXISTS = 6, - PERMISSION_DENIED = 7, - RESOURCE_EXHAUSTED = 8, - FAILED_PRECONDITION = 9, - ABORTED = 10, - OUT_OF_RANGE = 11, - UNIMPLEMENTED = 12, - INTERNAL = 13, - UNAVAILABLE = 14, - DATA_LOSS = 15, - UNAUTHENTICATED = 16, - CLUSTER_EVENT = 17, - READ_ONLY = 18 - } - - /** Properties of a RPCError. */ - interface IRPCError { - - /** RPCError message */ - message?: (string|null); - - /** RPCError code */ - code?: (vtrpc.Code|null); - } - - /** Represents a RPCError. */ - class RPCError implements IRPCError { - - /** - * Constructs a new RPCError. - * @param [properties] Properties to set - */ - constructor(properties?: vtrpc.IRPCError); - - /** RPCError message. */ - public message: string; - - /** RPCError code. */ - public code: vtrpc.Code; - - /** - * Creates a new RPCError instance using the specified properties. - * @param [properties] Properties to set - * @returns RPCError instance - */ - public static create(properties?: vtrpc.IRPCError): vtrpc.RPCError; - - /** - * Encodes the specified RPCError message. Does not implicitly {@link vtrpc.RPCError.verify|verify} messages. - * @param message RPCError message or plain object to encode - * @param [writer] Writer to encode to - * @returns Writer - */ - public static encode(message: vtrpc.IRPCError, writer?: $protobuf.Writer): $protobuf.Writer; - - /** - * Encodes the specified RPCError message, length delimited. Does not implicitly {@link vtrpc.RPCError.verify|verify} messages. - * @param message RPCError message or plain object to encode - * @param [writer] Writer to encode to - * @returns Writer - */ - public static encodeDelimited(message: vtrpc.IRPCError, writer?: $protobuf.Writer): $protobuf.Writer; - - /** - * Decodes a RPCError message from the specified reader or buffer. - * @param reader Reader or buffer to decode from - * @param [length] Message length if known beforehand - * @returns RPCError - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtrpc.RPCError; - - /** - * Decodes a RPCError message from the specified reader or buffer, length delimited. - * @param reader Reader or buffer to decode from - * @returns RPCError - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtrpc.RPCError; - - /** - * Verifies a RPCError message. - * @param message Plain object to verify - * @returns `null` if valid, otherwise the reason why it is not - */ - public static verify(message: { [k: string]: any }): (string|null); - - /** - * Creates a RPCError message from a plain object. Also converts values to their respective internal types. - * @param object Plain object - * @returns RPCError - */ - public static fromObject(object: { [k: string]: any }): vtrpc.RPCError; - - /** - * Creates a plain object from a RPCError message. Also converts values to other types if specified. - * @param message RPCError - * @param [options] Conversion options - * @returns Plain object - */ - public static toObject(message: vtrpc.RPCError, options?: $protobuf.IConversionOptions): { [k: string]: any }; - - /** - * Converts this RPCError to JSON. - * @returns JSON object - */ - public toJSON(): { [k: string]: any }; - - /** - * Gets the default type url for RPCError - * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns The default type url - */ - public static getTypeUrl(typeUrlPrefix?: string): string; - } -} - /** Namespace query. */ export namespace query { @@ -35943,7 +40024,9 @@ export namespace query { EXPRESSION = 31, HEXNUM = 4128, HEXVAL = 4129, - BITNUM = 4130 + BITNUM = 4130, + VECTOR = 2083, + RAW = 2084 } /** Properties of a Value. */ @@ -36299,6 +40382,9 @@ export namespace query { /** ExecuteOptions priority */ priority?: (string|null); + + /** ExecuteOptions authoritative_timeout */ + authoritative_timeout?: (number|Long|null); } /** Represents an ExecuteOptions. */ @@ -36346,6 +40432,12 @@ export namespace query { /** ExecuteOptions priority. */ public priority: string; + /** ExecuteOptions authoritative_timeout. */ + public authoritative_timeout?: (number|Long|null); + + /** ExecuteOptions timeout. */ + public timeout?: "authoritative_timeout"; + /** * Creates a new ExecuteOptions instance using the specified properties. * @param [properties] Properties to set @@ -40113,6 +44205,9 @@ export namespace query { /** UnresolvedTransactionsRequest target */ target?: (query.ITarget|null); + + /** UnresolvedTransactionsRequest abandon_age */ + abandon_age?: (number|Long|null); } /** Represents an UnresolvedTransactionsRequest. */ @@ -40133,6 +44228,9 @@ export namespace query { /** UnresolvedTransactionsRequest target. */ public target?: (query.ITarget|null); + /** UnresolvedTransactionsRequest abandon_age. */ + public abandon_age: (number|Long); + /** * Creates a new UnresolvedTransactionsRequest instance using the specified properties. * @param [properties] Properties to set @@ -43851,6 +47949,9 @@ export namespace replicationdata { /** PrimaryStatus file_position */ file_position?: (string|null); + + /** PrimaryStatus server_uuid */ + server_uuid?: (string|null); } /** Represents a PrimaryStatus. */ @@ -43868,6 +47969,9 @@ export namespace replicationdata { /** PrimaryStatus file_position. */ public file_position: string; + /** PrimaryStatus server_uuid. */ + public server_uuid: string; + /** * Creates a new PrimaryStatus instance using the specified properties. * @param [properties] Properties to set @@ -46322,6 +50426,9 @@ export namespace vtctldata { /** MaterializeSettings workflow_options */ workflow_options?: (vtctldata.IWorkflowOptions|null); + + /** MaterializeSettings reference_tables */ + reference_tables?: (string[]|null); } /** Represents a MaterializeSettings. */ @@ -46384,6 +50491,9 @@ export namespace vtctldata { /** MaterializeSettings workflow_options. */ public workflow_options?: (vtctldata.IWorkflowOptions|null); + /** MaterializeSettings reference_tables. */ + public reference_tables: string[]; + /** * Creates a new MaterializeSettings instance using the specified properties. * @param [properties] Properties to set @@ -47121,17 +51231,30 @@ export namespace vtctldata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** ShardedAutoIncrementHandling enum. */ + enum ShardedAutoIncrementHandling { + LEAVE = 0, + REMOVE = 1, + REPLACE = 2 + } + /** Properties of a WorkflowOptions. */ interface IWorkflowOptions { /** WorkflowOptions tenant_id */ tenant_id?: (string|null); - /** WorkflowOptions strip_sharded_auto_increment */ - strip_sharded_auto_increment?: (boolean|null); + /** WorkflowOptions sharded_auto_increment_handling */ + sharded_auto_increment_handling?: (vtctldata.ShardedAutoIncrementHandling|null); /** WorkflowOptions shards */ shards?: (string[]|null); + + /** WorkflowOptions config */ + config?: ({ [k: string]: string }|null); + + /** WorkflowOptions global_keyspace */ + global_keyspace?: (string|null); } /** Represents a WorkflowOptions. */ @@ -47146,12 +51269,18 @@ export namespace vtctldata { /** WorkflowOptions tenant_id. */ public tenant_id: string; - /** WorkflowOptions strip_sharded_auto_increment. */ - public strip_sharded_auto_increment: boolean; + /** WorkflowOptions sharded_auto_increment_handling. */ + public sharded_auto_increment_handling: vtctldata.ShardedAutoIncrementHandling; /** WorkflowOptions shards. */ public shards: string[]; + /** WorkflowOptions config. */ + public config: { [k: string]: string }; + + /** WorkflowOptions global_keyspace. */ + public global_keyspace: string; + /** * Creates a new WorkflowOptions instance using the specified properties. * @param [properties] Properties to set @@ -49750,6 +53879,9 @@ export namespace vtctldata { /** BackupRequest upgrade_safe */ upgrade_safe?: (boolean|null); + + /** BackupRequest backup_engine */ + backup_engine?: (string|null); } /** Represents a BackupRequest. */ @@ -49776,6 +53908,12 @@ export namespace vtctldata { /** BackupRequest upgrade_safe. */ public upgrade_safe: boolean; + /** BackupRequest backup_engine. */ + public backup_engine?: (string|null); + + /** BackupRequest _backup_engine. */ + public _backup_engine?: "backup_engine"; + /** * Creates a new BackupRequest instance using the specified properties. * @param [properties] Properties to set @@ -50296,6 +54434,218 @@ export namespace vtctldata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a ChangeTabletTagsRequest. */ + interface IChangeTabletTagsRequest { + + /** ChangeTabletTagsRequest tablet_alias */ + tablet_alias?: (topodata.ITabletAlias|null); + + /** ChangeTabletTagsRequest tags */ + tags?: ({ [k: string]: string }|null); + + /** ChangeTabletTagsRequest replace */ + replace?: (boolean|null); + } + + /** Represents a ChangeTabletTagsRequest. */ + class ChangeTabletTagsRequest implements IChangeTabletTagsRequest { + + /** + * Constructs a new ChangeTabletTagsRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IChangeTabletTagsRequest); + + /** ChangeTabletTagsRequest tablet_alias. */ + public tablet_alias?: (topodata.ITabletAlias|null); + + /** ChangeTabletTagsRequest tags. */ + public tags: { [k: string]: string }; + + /** ChangeTabletTagsRequest replace. */ + public replace: boolean; + + /** + * Creates a new ChangeTabletTagsRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ChangeTabletTagsRequest instance + */ + public static create(properties?: vtctldata.IChangeTabletTagsRequest): vtctldata.ChangeTabletTagsRequest; + + /** + * Encodes the specified ChangeTabletTagsRequest message. Does not implicitly {@link vtctldata.ChangeTabletTagsRequest.verify|verify} messages. + * @param message ChangeTabletTagsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IChangeTabletTagsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ChangeTabletTagsRequest message, length delimited. Does not implicitly {@link vtctldata.ChangeTabletTagsRequest.verify|verify} messages. + * @param message ChangeTabletTagsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IChangeTabletTagsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ChangeTabletTagsRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ChangeTabletTagsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ChangeTabletTagsRequest; + + /** + * Decodes a ChangeTabletTagsRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ChangeTabletTagsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ChangeTabletTagsRequest; + + /** + * Verifies a ChangeTabletTagsRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ChangeTabletTagsRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ChangeTabletTagsRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ChangeTabletTagsRequest; + + /** + * Creates a plain object from a ChangeTabletTagsRequest message. Also converts values to other types if specified. + * @param message ChangeTabletTagsRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ChangeTabletTagsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ChangeTabletTagsRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ChangeTabletTagsRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ChangeTabletTagsResponse. */ + interface IChangeTabletTagsResponse { + + /** ChangeTabletTagsResponse before_tags */ + before_tags?: ({ [k: string]: string }|null); + + /** ChangeTabletTagsResponse after_tags */ + after_tags?: ({ [k: string]: string }|null); + } + + /** Represents a ChangeTabletTagsResponse. */ + class ChangeTabletTagsResponse implements IChangeTabletTagsResponse { + + /** + * Constructs a new ChangeTabletTagsResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IChangeTabletTagsResponse); + + /** ChangeTabletTagsResponse before_tags. */ + public before_tags: { [k: string]: string }; + + /** ChangeTabletTagsResponse after_tags. */ + public after_tags: { [k: string]: string }; + + /** + * Creates a new ChangeTabletTagsResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ChangeTabletTagsResponse instance + */ + public static create(properties?: vtctldata.IChangeTabletTagsResponse): vtctldata.ChangeTabletTagsResponse; + + /** + * Encodes the specified ChangeTabletTagsResponse message. Does not implicitly {@link vtctldata.ChangeTabletTagsResponse.verify|verify} messages. + * @param message ChangeTabletTagsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IChangeTabletTagsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ChangeTabletTagsResponse message, length delimited. Does not implicitly {@link vtctldata.ChangeTabletTagsResponse.verify|verify} messages. + * @param message ChangeTabletTagsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IChangeTabletTagsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ChangeTabletTagsResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ChangeTabletTagsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ChangeTabletTagsResponse; + + /** + * Decodes a ChangeTabletTagsResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ChangeTabletTagsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ChangeTabletTagsResponse; + + /** + * Verifies a ChangeTabletTagsResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ChangeTabletTagsResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ChangeTabletTagsResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ChangeTabletTagsResponse; + + /** + * Creates a plain object from a ChangeTabletTagsResponse message. Also converts values to other types if specified. + * @param message ChangeTabletTagsResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ChangeTabletTagsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ChangeTabletTagsResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ChangeTabletTagsResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a ChangeTabletTypeRequest. */ interface IChangeTabletTypeRequest { @@ -52791,6 +57141,9 @@ export namespace vtctldata { /** EmergencyReparentShardRequest wait_for_all_tablets */ wait_for_all_tablets?: (boolean|null); + + /** EmergencyReparentShardRequest expected_primary */ + expected_primary?: (topodata.ITabletAlias|null); } /** Represents an EmergencyReparentShardRequest. */ @@ -52823,6 +57176,9 @@ export namespace vtctldata { /** EmergencyReparentShardRequest wait_for_all_tablets. */ public wait_for_all_tablets: boolean; + /** EmergencyReparentShardRequest expected_primary. */ + public expected_primary?: (topodata.ITabletAlias|null); + /** * Creates a new EmergencyReparentShardRequest instance using the specified properties. * @param [properties] Properties to set @@ -59327,6 +63683,400 @@ export namespace vtctldata { public static getTypeUrl(typeUrlPrefix?: string): string; } + /** Properties of a GetUnresolvedTransactionsRequest. */ + interface IGetUnresolvedTransactionsRequest { + + /** GetUnresolvedTransactionsRequest keyspace */ + keyspace?: (string|null); + + /** GetUnresolvedTransactionsRequest abandon_age */ + abandon_age?: (number|Long|null); + } + + /** Represents a GetUnresolvedTransactionsRequest. */ + class GetUnresolvedTransactionsRequest implements IGetUnresolvedTransactionsRequest { + + /** + * Constructs a new GetUnresolvedTransactionsRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IGetUnresolvedTransactionsRequest); + + /** GetUnresolvedTransactionsRequest keyspace. */ + public keyspace: string; + + /** GetUnresolvedTransactionsRequest abandon_age. */ + public abandon_age: (number|Long); + + /** + * Creates a new GetUnresolvedTransactionsRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns GetUnresolvedTransactionsRequest instance + */ + public static create(properties?: vtctldata.IGetUnresolvedTransactionsRequest): vtctldata.GetUnresolvedTransactionsRequest; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message. Does not implicitly {@link vtctldata.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @param message GetUnresolvedTransactionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IGetUnresolvedTransactionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message, length delimited. Does not implicitly {@link vtctldata.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @param message GetUnresolvedTransactionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IGetUnresolvedTransactionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.GetUnresolvedTransactionsRequest; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.GetUnresolvedTransactionsRequest; + + /** + * Verifies a GetUnresolvedTransactionsRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GetUnresolvedTransactionsRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GetUnresolvedTransactionsRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.GetUnresolvedTransactionsRequest; + + /** + * Creates a plain object from a GetUnresolvedTransactionsRequest message. Also converts values to other types if specified. + * @param message GetUnresolvedTransactionsRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.GetUnresolvedTransactionsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GetUnresolvedTransactionsRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetUnresolvedTransactionsRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a GetUnresolvedTransactionsResponse. */ + interface IGetUnresolvedTransactionsResponse { + + /** GetUnresolvedTransactionsResponse transactions */ + transactions?: (query.ITransactionMetadata[]|null); + } + + /** Represents a GetUnresolvedTransactionsResponse. */ + class GetUnresolvedTransactionsResponse implements IGetUnresolvedTransactionsResponse { + + /** + * Constructs a new GetUnresolvedTransactionsResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IGetUnresolvedTransactionsResponse); + + /** GetUnresolvedTransactionsResponse transactions. */ + public transactions: query.ITransactionMetadata[]; + + /** + * Creates a new GetUnresolvedTransactionsResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns GetUnresolvedTransactionsResponse instance + */ + public static create(properties?: vtctldata.IGetUnresolvedTransactionsResponse): vtctldata.GetUnresolvedTransactionsResponse; + + /** + * Encodes the specified GetUnresolvedTransactionsResponse message. Does not implicitly {@link vtctldata.GetUnresolvedTransactionsResponse.verify|verify} messages. + * @param message GetUnresolvedTransactionsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IGetUnresolvedTransactionsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GetUnresolvedTransactionsResponse message, length delimited. Does not implicitly {@link vtctldata.GetUnresolvedTransactionsResponse.verify|verify} messages. + * @param message GetUnresolvedTransactionsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IGetUnresolvedTransactionsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GetUnresolvedTransactionsResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GetUnresolvedTransactionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.GetUnresolvedTransactionsResponse; + + /** + * Decodes a GetUnresolvedTransactionsResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GetUnresolvedTransactionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.GetUnresolvedTransactionsResponse; + + /** + * Verifies a GetUnresolvedTransactionsResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GetUnresolvedTransactionsResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GetUnresolvedTransactionsResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.GetUnresolvedTransactionsResponse; + + /** + * Creates a plain object from a GetUnresolvedTransactionsResponse message. Also converts values to other types if specified. + * @param message GetUnresolvedTransactionsResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.GetUnresolvedTransactionsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GetUnresolvedTransactionsResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for GetUnresolvedTransactionsResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ConcludeTransactionRequest. */ + interface IConcludeTransactionRequest { + + /** ConcludeTransactionRequest dtid */ + dtid?: (string|null); + + /** ConcludeTransactionRequest participants */ + participants?: (query.ITarget[]|null); + } + + /** Represents a ConcludeTransactionRequest. */ + class ConcludeTransactionRequest implements IConcludeTransactionRequest { + + /** + * Constructs a new ConcludeTransactionRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IConcludeTransactionRequest); + + /** ConcludeTransactionRequest dtid. */ + public dtid: string; + + /** ConcludeTransactionRequest participants. */ + public participants: query.ITarget[]; + + /** + * Creates a new ConcludeTransactionRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ConcludeTransactionRequest instance + */ + public static create(properties?: vtctldata.IConcludeTransactionRequest): vtctldata.ConcludeTransactionRequest; + + /** + * Encodes the specified ConcludeTransactionRequest message. Does not implicitly {@link vtctldata.ConcludeTransactionRequest.verify|verify} messages. + * @param message ConcludeTransactionRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IConcludeTransactionRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ConcludeTransactionRequest message, length delimited. Does not implicitly {@link vtctldata.ConcludeTransactionRequest.verify|verify} messages. + * @param message ConcludeTransactionRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IConcludeTransactionRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ConcludeTransactionRequest; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ConcludeTransactionRequest; + + /** + * Verifies a ConcludeTransactionRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ConcludeTransactionRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ConcludeTransactionRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ConcludeTransactionRequest; + + /** + * Creates a plain object from a ConcludeTransactionRequest message. Also converts values to other types if specified. + * @param message ConcludeTransactionRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ConcludeTransactionRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ConcludeTransactionRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ConcludeTransactionRequest + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + + /** Properties of a ConcludeTransactionResponse. */ + interface IConcludeTransactionResponse { + } + + /** Represents a ConcludeTransactionResponse. */ + class ConcludeTransactionResponse implements IConcludeTransactionResponse { + + /** + * Constructs a new ConcludeTransactionResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IConcludeTransactionResponse); + + /** + * Creates a new ConcludeTransactionResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ConcludeTransactionResponse instance + */ + public static create(properties?: vtctldata.IConcludeTransactionResponse): vtctldata.ConcludeTransactionResponse; + + /** + * Encodes the specified ConcludeTransactionResponse message. Does not implicitly {@link vtctldata.ConcludeTransactionResponse.verify|verify} messages. + * @param message ConcludeTransactionResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IConcludeTransactionResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ConcludeTransactionResponse message, length delimited. Does not implicitly {@link vtctldata.ConcludeTransactionResponse.verify|verify} messages. + * @param message ConcludeTransactionResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IConcludeTransactionResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ConcludeTransactionResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ConcludeTransactionResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ConcludeTransactionResponse; + + /** + * Decodes a ConcludeTransactionResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ConcludeTransactionResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ConcludeTransactionResponse; + + /** + * Verifies a ConcludeTransactionResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ConcludeTransactionResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ConcludeTransactionResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ConcludeTransactionResponse; + + /** + * Creates a plain object from a ConcludeTransactionResponse message. Also converts values to other types if specified. + * @param message ConcludeTransactionResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ConcludeTransactionResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ConcludeTransactionResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + + /** + * Gets the default type url for ConcludeTransactionResponse + * @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns The default type url + */ + public static getTypeUrl(typeUrlPrefix?: string): string; + } + /** Properties of a GetVSchemaRequest. */ interface IGetVSchemaRequest { @@ -63056,6 +67806,12 @@ export namespace vtctldata { /** PlannedReparentShardRequest tolerable_replication_lag */ tolerable_replication_lag?: (vttime.IDuration|null); + + /** PlannedReparentShardRequest allow_cross_cell_promotion */ + allow_cross_cell_promotion?: (boolean|null); + + /** PlannedReparentShardRequest expected_primary */ + expected_primary?: (topodata.ITabletAlias|null); } /** Represents a PlannedReparentShardRequest. */ @@ -63085,6 +67841,12 @@ export namespace vtctldata { /** PlannedReparentShardRequest tolerable_replication_lag. */ public tolerable_replication_lag?: (vttime.IDuration|null); + /** PlannedReparentShardRequest allow_cross_cell_promotion. */ + public allow_cross_cell_promotion: boolean; + + /** PlannedReparentShardRequest expected_primary. */ + public expected_primary?: (topodata.ITabletAlias|null); + /** * Creates a new PlannedReparentShardRequest instance using the specified properties. * @param [properties] Properties to set @@ -65546,6 +70308,9 @@ export namespace vtctldata { /** ReshardCreateRequest auto_start */ auto_start?: (boolean|null); + + /** ReshardCreateRequest workflow_options */ + workflow_options?: (vtctldata.IWorkflowOptions|null); } /** Represents a ReshardCreateRequest. */ @@ -65593,6 +70358,9 @@ export namespace vtctldata { /** ReshardCreateRequest auto_start. */ public auto_start: boolean; + /** ReshardCreateRequest workflow_options. */ + public workflow_options?: (vtctldata.IWorkflowOptions|null); + /** * Creates a new ReshardCreateRequest instance using the specified properties. * @param [properties] Properties to set @@ -65688,6 +70456,9 @@ export namespace vtctldata { /** RestoreFromBackupRequest restore_to_timestamp */ restore_to_timestamp?: (vttime.ITime|null); + + /** RestoreFromBackupRequest allowed_backup_engines */ + allowed_backup_engines?: (string[]|null); } /** Represents a RestoreFromBackupRequest. */ @@ -65714,6 +70485,9 @@ export namespace vtctldata { /** RestoreFromBackupRequest restore_to_timestamp. */ public restore_to_timestamp?: (vttime.ITime|null); + /** RestoreFromBackupRequest allowed_backup_engines. */ + public allowed_backup_engines: string[]; + /** * Creates a new RestoreFromBackupRequest instance using the specified properties. * @param [properties] Properties to set @@ -71283,6 +76057,12 @@ export namespace vtctldata { /** VDiffCreateRequest max_diff_duration */ max_diff_duration?: (vttime.IDuration|null); + + /** VDiffCreateRequest row_diff_column_truncate_at */ + row_diff_column_truncate_at?: (number|Long|null); + + /** VDiffCreateRequest auto_start */ + auto_start?: (boolean|null); } /** Represents a VDiffCreateRequest. */ @@ -71354,6 +76134,15 @@ export namespace vtctldata { /** VDiffCreateRequest max_diff_duration. */ public max_diff_duration?: (vttime.IDuration|null); + /** VDiffCreateRequest row_diff_column_truncate_at. */ + public row_diff_column_truncate_at: (number|Long); + + /** VDiffCreateRequest auto_start. */ + public auto_start?: (boolean|null); + + /** VDiffCreateRequest _auto_start. */ + public _auto_start?: "auto_start"; + /** * Creates a new VDiffCreateRequest instance using the specified properties. * @param [properties] Properties to set @@ -71740,6 +76529,9 @@ export namespace vtctldata { /** VDiffResumeRequest uuid */ uuid?: (string|null); + + /** VDiffResumeRequest target_shards */ + target_shards?: (string[]|null); } /** Represents a VDiffResumeRequest. */ @@ -71760,6 +76552,9 @@ export namespace vtctldata { /** VDiffResumeRequest uuid. */ public uuid: string; + /** VDiffResumeRequest target_shards. */ + public target_shards: string[]; + /** * Creates a new VDiffResumeRequest instance using the specified properties. * @param [properties] Properties to set @@ -72146,6 +76941,9 @@ export namespace vtctldata { /** VDiffStopRequest uuid */ uuid?: (string|null); + + /** VDiffStopRequest target_shards */ + target_shards?: (string[]|null); } /** Represents a VDiffStopRequest. */ @@ -72166,6 +76964,9 @@ export namespace vtctldata { /** VDiffStopRequest uuid. */ public uuid: string; + /** VDiffStopRequest target_shards. */ + public target_shards: string[]; + /** * Creates a new VDiffStopRequest instance using the specified properties. * @param [properties] Properties to set @@ -72352,6 +77153,9 @@ export namespace vtctldata { /** WorkflowDeleteRequest shards */ shards?: (string[]|null); + + /** WorkflowDeleteRequest delete_batch_size */ + delete_batch_size?: (number|Long|null); } /** Represents a WorkflowDeleteRequest. */ @@ -72378,6 +77182,9 @@ export namespace vtctldata { /** WorkflowDeleteRequest shards. */ public shards: string[]; + /** WorkflowDeleteRequest delete_batch_size. */ + public delete_batch_size: (number|Long); + /** * Creates a new WorkflowDeleteRequest instance using the specified properties. * @param [properties] Properties to set @@ -73272,6 +78079,9 @@ export namespace vtctldata { /** WorkflowSwitchTrafficRequest shards */ shards?: (string[]|null); + + /** WorkflowSwitchTrafficRequest force */ + force?: (boolean|null); } /** Represents a WorkflowSwitchTrafficRequest. */ @@ -73316,6 +78126,9 @@ export namespace vtctldata { /** WorkflowSwitchTrafficRequest shards. */ public shards: string[]; + /** WorkflowSwitchTrafficRequest force. */ + public force: boolean; + /** * Creates a new WorkflowSwitchTrafficRequest instance using the specified properties. * @param [properties] Properties to set diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index 7cf7fdc61b1..3649e9e2c67 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -180,6 +180,39 @@ export const vtadmin = $root.vtadmin = (() => { * @variation 2 */ + /** + * Callback as used by {@link vtadmin.VTAdmin#concludeTransaction}. + * @memberof vtadmin.VTAdmin + * @typedef ConcludeTransactionCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.ConcludeTransactionResponse} [response] ConcludeTransactionResponse + */ + + /** + * Calls ConcludeTransaction. + * @function concludeTransaction + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IConcludeTransactionRequest} request ConcludeTransactionRequest message or plain object + * @param {vtadmin.VTAdmin.ConcludeTransactionCallback} callback Node-style callback called with the error, if any, and ConcludeTransactionResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.concludeTransaction = function concludeTransaction(request, callback) { + return this.rpcCall(concludeTransaction, $root.vtadmin.ConcludeTransactionRequest, $root.vtctldata.ConcludeTransactionResponse, request, callback); + }, "name", { value: "ConcludeTransaction" }); + + /** + * Calls ConcludeTransaction. + * @function concludeTransaction + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IConcludeTransactionRequest} request ConcludeTransactionRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + /** * Callback as used by {@link vtadmin.VTAdmin#createKeyspace}. * @memberof vtadmin.VTAdmin @@ -1038,6 +1071,39 @@ export const vtadmin = $root.vtadmin = (() => { * @variation 2 */ + /** + * Callback as used by {@link vtadmin.VTAdmin#getUnresolvedTransactions}. + * @memberof vtadmin.VTAdmin + * @typedef GetUnresolvedTransactionsCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.GetUnresolvedTransactionsResponse} [response] GetUnresolvedTransactionsResponse + */ + + /** + * Calls GetUnresolvedTransactions. + * @function getUnresolvedTransactions + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IGetUnresolvedTransactionsRequest} request GetUnresolvedTransactionsRequest message or plain object + * @param {vtadmin.VTAdmin.GetUnresolvedTransactionsCallback} callback Node-style callback called with the error, if any, and GetUnresolvedTransactionsResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.getUnresolvedTransactions = function getUnresolvedTransactions(request, callback) { + return this.rpcCall(getUnresolvedTransactions, $root.vtadmin.GetUnresolvedTransactionsRequest, $root.vtctldata.GetUnresolvedTransactionsResponse, request, callback); + }, "name", { value: "GetUnresolvedTransactions" }); + + /** + * Calls GetUnresolvedTransactions. + * @function getUnresolvedTransactions + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IGetUnresolvedTransactionsRequest} request GetUnresolvedTransactionsRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + /** * Callback as used by {@link vtadmin.VTAdmin#getVSchema}. * @memberof vtadmin.VTAdmin @@ -1203,6 +1269,105 @@ export const vtadmin = $root.vtadmin = (() => { * @variation 2 */ + /** + * Callback as used by {@link vtadmin.VTAdmin#getWorkflowStatus}. + * @memberof vtadmin.VTAdmin + * @typedef GetWorkflowStatusCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.WorkflowStatusResponse} [response] WorkflowStatusResponse + */ + + /** + * Calls GetWorkflowStatus. + * @function getWorkflowStatus + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IGetWorkflowStatusRequest} request GetWorkflowStatusRequest message or plain object + * @param {vtadmin.VTAdmin.GetWorkflowStatusCallback} callback Node-style callback called with the error, if any, and WorkflowStatusResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.getWorkflowStatus = function getWorkflowStatus(request, callback) { + return this.rpcCall(getWorkflowStatus, $root.vtadmin.GetWorkflowStatusRequest, $root.vtctldata.WorkflowStatusResponse, request, callback); + }, "name", { value: "GetWorkflowStatus" }); + + /** + * Calls GetWorkflowStatus. + * @function getWorkflowStatus + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IGetWorkflowStatusRequest} request GetWorkflowStatusRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link vtadmin.VTAdmin#startWorkflow}. + * @memberof vtadmin.VTAdmin + * @typedef StartWorkflowCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.WorkflowUpdateResponse} [response] WorkflowUpdateResponse + */ + + /** + * Calls StartWorkflow. + * @function startWorkflow + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IStartWorkflowRequest} request StartWorkflowRequest message or plain object + * @param {vtadmin.VTAdmin.StartWorkflowCallback} callback Node-style callback called with the error, if any, and WorkflowUpdateResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.startWorkflow = function startWorkflow(request, callback) { + return this.rpcCall(startWorkflow, $root.vtadmin.StartWorkflowRequest, $root.vtctldata.WorkflowUpdateResponse, request, callback); + }, "name", { value: "StartWorkflow" }); + + /** + * Calls StartWorkflow. + * @function startWorkflow + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IStartWorkflowRequest} request StartWorkflowRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link vtadmin.VTAdmin#stopWorkflow}. + * @memberof vtadmin.VTAdmin + * @typedef StopWorkflowCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.WorkflowUpdateResponse} [response] WorkflowUpdateResponse + */ + + /** + * Calls StopWorkflow. + * @function stopWorkflow + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IStopWorkflowRequest} request StopWorkflowRequest message or plain object + * @param {vtadmin.VTAdmin.StopWorkflowCallback} callback Node-style callback called with the error, if any, and WorkflowUpdateResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.stopWorkflow = function stopWorkflow(request, callback) { + return this.rpcCall(stopWorkflow, $root.vtadmin.StopWorkflowRequest, $root.vtctldata.WorkflowUpdateResponse, request, callback); + }, "name", { value: "StopWorkflow" }); + + /** + * Calls StopWorkflow. + * @function stopWorkflow + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IStopWorkflowRequest} request StopWorkflowRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + /** * Callback as used by {@link vtadmin.VTAdmin#launchSchemaMigration}. * @memberof vtadmin.VTAdmin @@ -1236,6 +1401,105 @@ export const vtadmin = $root.vtadmin = (() => { * @variation 2 */ + /** + * Callback as used by {@link vtadmin.VTAdmin#moveTablesComplete}. + * @memberof vtadmin.VTAdmin + * @typedef MoveTablesCompleteCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.MoveTablesCompleteResponse} [response] MoveTablesCompleteResponse + */ + + /** + * Calls MoveTablesComplete. + * @function moveTablesComplete + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IMoveTablesCompleteRequest} request MoveTablesCompleteRequest message or plain object + * @param {vtadmin.VTAdmin.MoveTablesCompleteCallback} callback Node-style callback called with the error, if any, and MoveTablesCompleteResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.moveTablesComplete = function moveTablesComplete(request, callback) { + return this.rpcCall(moveTablesComplete, $root.vtadmin.MoveTablesCompleteRequest, $root.vtctldata.MoveTablesCompleteResponse, request, callback); + }, "name", { value: "MoveTablesComplete" }); + + /** + * Calls MoveTablesComplete. + * @function moveTablesComplete + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IMoveTablesCompleteRequest} request MoveTablesCompleteRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link vtadmin.VTAdmin#moveTablesCreate}. + * @memberof vtadmin.VTAdmin + * @typedef MoveTablesCreateCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.WorkflowStatusResponse} [response] WorkflowStatusResponse + */ + + /** + * Calls MoveTablesCreate. + * @function moveTablesCreate + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IMoveTablesCreateRequest} request MoveTablesCreateRequest message or plain object + * @param {vtadmin.VTAdmin.MoveTablesCreateCallback} callback Node-style callback called with the error, if any, and WorkflowStatusResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.moveTablesCreate = function moveTablesCreate(request, callback) { + return this.rpcCall(moveTablesCreate, $root.vtadmin.MoveTablesCreateRequest, $root.vtctldata.WorkflowStatusResponse, request, callback); + }, "name", { value: "MoveTablesCreate" }); + + /** + * Calls MoveTablesCreate. + * @function moveTablesCreate + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IMoveTablesCreateRequest} request MoveTablesCreateRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link vtadmin.VTAdmin#materializeCreate}. + * @memberof vtadmin.VTAdmin + * @typedef MaterializeCreateCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.MaterializeCreateResponse} [response] MaterializeCreateResponse + */ + + /** + * Calls MaterializeCreate. + * @function materializeCreate + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IMaterializeCreateRequest} request MaterializeCreateRequest message or plain object + * @param {vtadmin.VTAdmin.MaterializeCreateCallback} callback Node-style callback called with the error, if any, and MaterializeCreateResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.materializeCreate = function materializeCreate(request, callback) { + return this.rpcCall(materializeCreate, $root.vtadmin.MaterializeCreateRequest, $root.vtctldata.MaterializeCreateResponse, request, callback); + }, "name", { value: "MaterializeCreate" }); + + /** + * Calls MaterializeCreate. + * @function materializeCreate + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IMaterializeCreateRequest} request MaterializeCreateRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + /** * Callback as used by {@link vtadmin.VTAdmin#pingTablet}. * @memberof vtadmin.VTAdmin @@ -1566,6 +1830,39 @@ export const vtadmin = $root.vtadmin = (() => { * @variation 2 */ + /** + * Callback as used by {@link vtadmin.VTAdmin#reshardCreate}. + * @memberof vtadmin.VTAdmin + * @typedef ReshardCreateCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.WorkflowStatusResponse} [response] WorkflowStatusResponse + */ + + /** + * Calls ReshardCreate. + * @function reshardCreate + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IReshardCreateRequest} request ReshardCreateRequest message or plain object + * @param {vtadmin.VTAdmin.ReshardCreateCallback} callback Node-style callback called with the error, if any, and WorkflowStatusResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.reshardCreate = function reshardCreate(request, callback) { + return this.rpcCall(reshardCreate, $root.vtadmin.ReshardCreateRequest, $root.vtctldata.WorkflowStatusResponse, request, callback); + }, "name", { value: "ReshardCreate" }); + + /** + * Calls ReshardCreate. + * @function reshardCreate + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IReshardCreateRequest} request ReshardCreateRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + /** * Callback as used by {@link vtadmin.VTAdmin#setReadOnly}. * @memberof vtadmin.VTAdmin @@ -1929,6 +2226,72 @@ export const vtadmin = $root.vtadmin = (() => { * @variation 2 */ + /** + * Callback as used by {@link vtadmin.VTAdmin#vDiffCreate}. + * @memberof vtadmin.VTAdmin + * @typedef VDiffCreateCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.VDiffCreateResponse} [response] VDiffCreateResponse + */ + + /** + * Calls VDiffCreate. + * @function vDiffCreate + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IVDiffCreateRequest} request VDiffCreateRequest message or plain object + * @param {vtadmin.VTAdmin.VDiffCreateCallback} callback Node-style callback called with the error, if any, and VDiffCreateResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.vDiffCreate = function vDiffCreate(request, callback) { + return this.rpcCall(vDiffCreate, $root.vtadmin.VDiffCreateRequest, $root.vtctldata.VDiffCreateResponse, request, callback); + }, "name", { value: "VDiffCreate" }); + + /** + * Calls VDiffCreate. + * @function vDiffCreate + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IVDiffCreateRequest} request VDiffCreateRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link vtadmin.VTAdmin#vDiffShow}. + * @memberof vtadmin.VTAdmin + * @typedef VDiffShowCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtadmin.VDiffShowResponse} [response] VDiffShowResponse + */ + + /** + * Calls VDiffShow. + * @function vDiffShow + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IVDiffShowRequest} request VDiffShowRequest message or plain object + * @param {vtadmin.VTAdmin.VDiffShowCallback} callback Node-style callback called with the error, if any, and VDiffShowResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.vDiffShow = function vDiffShow(request, callback) { + return this.rpcCall(vDiffShow, $root.vtadmin.VDiffShowRequest, $root.vtadmin.VDiffShowResponse, request, callback); + }, "name", { value: "VDiffShow" }); + + /** + * Calls VDiffShow. + * @function vDiffShow + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IVDiffShowRequest} request VDiffShowRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + /** * Callback as used by {@link vtadmin.VTAdmin#vTExplain}. * @memberof vtadmin.VTAdmin @@ -1962,6 +2325,72 @@ export const vtadmin = $root.vtadmin = (() => { * @variation 2 */ + /** + * Callback as used by {@link vtadmin.VTAdmin#workflowDelete}. + * @memberof vtadmin.VTAdmin + * @typedef WorkflowDeleteCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.WorkflowDeleteResponse} [response] WorkflowDeleteResponse + */ + + /** + * Calls WorkflowDelete. + * @function workflowDelete + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IWorkflowDeleteRequest} request WorkflowDeleteRequest message or plain object + * @param {vtadmin.VTAdmin.WorkflowDeleteCallback} callback Node-style callback called with the error, if any, and WorkflowDeleteResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.workflowDelete = function workflowDelete(request, callback) { + return this.rpcCall(workflowDelete, $root.vtadmin.WorkflowDeleteRequest, $root.vtctldata.WorkflowDeleteResponse, request, callback); + }, "name", { value: "WorkflowDelete" }); + + /** + * Calls WorkflowDelete. + * @function workflowDelete + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IWorkflowDeleteRequest} request WorkflowDeleteRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link vtadmin.VTAdmin#workflowSwitchTraffic}. + * @memberof vtadmin.VTAdmin + * @typedef WorkflowSwitchTrafficCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {vtctldata.WorkflowSwitchTrafficResponse} [response] WorkflowSwitchTrafficResponse + */ + + /** + * Calls WorkflowSwitchTraffic. + * @function workflowSwitchTraffic + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IWorkflowSwitchTrafficRequest} request WorkflowSwitchTrafficRequest message or plain object + * @param {vtadmin.VTAdmin.WorkflowSwitchTrafficCallback} callback Node-style callback called with the error, if any, and WorkflowSwitchTrafficResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(VTAdmin.prototype.workflowSwitchTraffic = function workflowSwitchTraffic(request, callback) { + return this.rpcCall(workflowSwitchTraffic, $root.vtadmin.WorkflowSwitchTrafficRequest, $root.vtctldata.WorkflowSwitchTrafficResponse, request, callback); + }, "name", { value: "WorkflowSwitchTraffic" }); + + /** + * Calls WorkflowSwitchTraffic. + * @function workflowSwitchTraffic + * @memberof vtadmin.VTAdmin + * @instance + * @param {vtadmin.IWorkflowSwitchTrafficRequest} request WorkflowSwitchTrafficRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + return VTAdmin; })(); @@ -6905,6 +7334,470 @@ export const vtadmin = $root.vtadmin = (() => { return Workflow; })(); + vtadmin.WorkflowDeleteRequest = (function() { + + /** + * Properties of a WorkflowDeleteRequest. + * @memberof vtadmin + * @interface IWorkflowDeleteRequest + * @property {string|null} [cluster_id] WorkflowDeleteRequest cluster_id + * @property {vtctldata.IWorkflowDeleteRequest|null} [request] WorkflowDeleteRequest request + */ + + /** + * Constructs a new WorkflowDeleteRequest. + * @memberof vtadmin + * @classdesc Represents a WorkflowDeleteRequest. + * @implements IWorkflowDeleteRequest + * @constructor + * @param {vtadmin.IWorkflowDeleteRequest=} [properties] Properties to set + */ + function WorkflowDeleteRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * WorkflowDeleteRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.WorkflowDeleteRequest + * @instance + */ + WorkflowDeleteRequest.prototype.cluster_id = ""; + + /** + * WorkflowDeleteRequest request. + * @member {vtctldata.IWorkflowDeleteRequest|null|undefined} request + * @memberof vtadmin.WorkflowDeleteRequest + * @instance + */ + WorkflowDeleteRequest.prototype.request = null; + + /** + * Creates a new WorkflowDeleteRequest instance using the specified properties. + * @function create + * @memberof vtadmin.WorkflowDeleteRequest + * @static + * @param {vtadmin.IWorkflowDeleteRequest=} [properties] Properties to set + * @returns {vtadmin.WorkflowDeleteRequest} WorkflowDeleteRequest instance + */ + WorkflowDeleteRequest.create = function create(properties) { + return new WorkflowDeleteRequest(properties); + }; + + /** + * Encodes the specified WorkflowDeleteRequest message. Does not implicitly {@link vtadmin.WorkflowDeleteRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.WorkflowDeleteRequest + * @static + * @param {vtadmin.IWorkflowDeleteRequest} message WorkflowDeleteRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WorkflowDeleteRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.request != null && Object.hasOwnProperty.call(message, "request")) + $root.vtctldata.WorkflowDeleteRequest.encode(message.request, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified WorkflowDeleteRequest message, length delimited. Does not implicitly {@link vtadmin.WorkflowDeleteRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.WorkflowDeleteRequest + * @static + * @param {vtadmin.IWorkflowDeleteRequest} message WorkflowDeleteRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WorkflowDeleteRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a WorkflowDeleteRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.WorkflowDeleteRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.WorkflowDeleteRequest} WorkflowDeleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WorkflowDeleteRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.WorkflowDeleteRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.cluster_id = reader.string(); + break; + } + case 2: { + message.request = $root.vtctldata.WorkflowDeleteRequest.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a WorkflowDeleteRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.WorkflowDeleteRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.WorkflowDeleteRequest} WorkflowDeleteRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WorkflowDeleteRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a WorkflowDeleteRequest message. + * @function verify + * @memberof vtadmin.WorkflowDeleteRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + WorkflowDeleteRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.request != null && message.hasOwnProperty("request")) { + let error = $root.vtctldata.WorkflowDeleteRequest.verify(message.request); + if (error) + return "request." + error; + } + return null; + }; + + /** + * Creates a WorkflowDeleteRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.WorkflowDeleteRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.WorkflowDeleteRequest} WorkflowDeleteRequest + */ + WorkflowDeleteRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.WorkflowDeleteRequest) + return object; + let message = new $root.vtadmin.WorkflowDeleteRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.request != null) { + if (typeof object.request !== "object") + throw TypeError(".vtadmin.WorkflowDeleteRequest.request: object expected"); + message.request = $root.vtctldata.WorkflowDeleteRequest.fromObject(object.request); + } + return message; + }; + + /** + * Creates a plain object from a WorkflowDeleteRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.WorkflowDeleteRequest + * @static + * @param {vtadmin.WorkflowDeleteRequest} message WorkflowDeleteRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + WorkflowDeleteRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.cluster_id = ""; + object.request = null; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.request != null && message.hasOwnProperty("request")) + object.request = $root.vtctldata.WorkflowDeleteRequest.toObject(message.request, options); + return object; + }; + + /** + * Converts this WorkflowDeleteRequest to JSON. + * @function toJSON + * @memberof vtadmin.WorkflowDeleteRequest + * @instance + * @returns {Object.} JSON object + */ + WorkflowDeleteRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for WorkflowDeleteRequest + * @function getTypeUrl + * @memberof vtadmin.WorkflowDeleteRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + WorkflowDeleteRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.WorkflowDeleteRequest"; + }; + + return WorkflowDeleteRequest; + })(); + + vtadmin.WorkflowSwitchTrafficRequest = (function() { + + /** + * Properties of a WorkflowSwitchTrafficRequest. + * @memberof vtadmin + * @interface IWorkflowSwitchTrafficRequest + * @property {string|null} [cluster_id] WorkflowSwitchTrafficRequest cluster_id + * @property {vtctldata.IWorkflowSwitchTrafficRequest|null} [request] WorkflowSwitchTrafficRequest request + */ + + /** + * Constructs a new WorkflowSwitchTrafficRequest. + * @memberof vtadmin + * @classdesc Represents a WorkflowSwitchTrafficRequest. + * @implements IWorkflowSwitchTrafficRequest + * @constructor + * @param {vtadmin.IWorkflowSwitchTrafficRequest=} [properties] Properties to set + */ + function WorkflowSwitchTrafficRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * WorkflowSwitchTrafficRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @instance + */ + WorkflowSwitchTrafficRequest.prototype.cluster_id = ""; + + /** + * WorkflowSwitchTrafficRequest request. + * @member {vtctldata.IWorkflowSwitchTrafficRequest|null|undefined} request + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @instance + */ + WorkflowSwitchTrafficRequest.prototype.request = null; + + /** + * Creates a new WorkflowSwitchTrafficRequest instance using the specified properties. + * @function create + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @static + * @param {vtadmin.IWorkflowSwitchTrafficRequest=} [properties] Properties to set + * @returns {vtadmin.WorkflowSwitchTrafficRequest} WorkflowSwitchTrafficRequest instance + */ + WorkflowSwitchTrafficRequest.create = function create(properties) { + return new WorkflowSwitchTrafficRequest(properties); + }; + + /** + * Encodes the specified WorkflowSwitchTrafficRequest message. Does not implicitly {@link vtadmin.WorkflowSwitchTrafficRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @static + * @param {vtadmin.IWorkflowSwitchTrafficRequest} message WorkflowSwitchTrafficRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WorkflowSwitchTrafficRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.request != null && Object.hasOwnProperty.call(message, "request")) + $root.vtctldata.WorkflowSwitchTrafficRequest.encode(message.request, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified WorkflowSwitchTrafficRequest message, length delimited. Does not implicitly {@link vtadmin.WorkflowSwitchTrafficRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @static + * @param {vtadmin.IWorkflowSwitchTrafficRequest} message WorkflowSwitchTrafficRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WorkflowSwitchTrafficRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a WorkflowSwitchTrafficRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.WorkflowSwitchTrafficRequest} WorkflowSwitchTrafficRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WorkflowSwitchTrafficRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.WorkflowSwitchTrafficRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.cluster_id = reader.string(); + break; + } + case 2: { + message.request = $root.vtctldata.WorkflowSwitchTrafficRequest.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a WorkflowSwitchTrafficRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.WorkflowSwitchTrafficRequest} WorkflowSwitchTrafficRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WorkflowSwitchTrafficRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a WorkflowSwitchTrafficRequest message. + * @function verify + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + WorkflowSwitchTrafficRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.request != null && message.hasOwnProperty("request")) { + let error = $root.vtctldata.WorkflowSwitchTrafficRequest.verify(message.request); + if (error) + return "request." + error; + } + return null; + }; + + /** + * Creates a WorkflowSwitchTrafficRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.WorkflowSwitchTrafficRequest} WorkflowSwitchTrafficRequest + */ + WorkflowSwitchTrafficRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.WorkflowSwitchTrafficRequest) + return object; + let message = new $root.vtadmin.WorkflowSwitchTrafficRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.request != null) { + if (typeof object.request !== "object") + throw TypeError(".vtadmin.WorkflowSwitchTrafficRequest.request: object expected"); + message.request = $root.vtctldata.WorkflowSwitchTrafficRequest.fromObject(object.request); + } + return message; + }; + + /** + * Creates a plain object from a WorkflowSwitchTrafficRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @static + * @param {vtadmin.WorkflowSwitchTrafficRequest} message WorkflowSwitchTrafficRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + WorkflowSwitchTrafficRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.cluster_id = ""; + object.request = null; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.request != null && message.hasOwnProperty("request")) + object.request = $root.vtctldata.WorkflowSwitchTrafficRequest.toObject(message.request, options); + return object; + }; + + /** + * Converts this WorkflowSwitchTrafficRequest to JSON. + * @function toJSON + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @instance + * @returns {Object.} JSON object + */ + WorkflowSwitchTrafficRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for WorkflowSwitchTrafficRequest + * @function getTypeUrl + * @memberof vtadmin.WorkflowSwitchTrafficRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + WorkflowSwitchTrafficRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.WorkflowSwitchTrafficRequest"; + }; + + return WorkflowSwitchTrafficRequest; + })(); + vtadmin.ApplySchemaRequest = (function() { /** @@ -7833,6 +8726,233 @@ export const vtadmin = $root.vtadmin = (() => { return CompleteSchemaMigrationRequest; })(); + vtadmin.ConcludeTransactionRequest = (function() { + + /** + * Properties of a ConcludeTransactionRequest. + * @memberof vtadmin + * @interface IConcludeTransactionRequest + * @property {string|null} [cluster_id] ConcludeTransactionRequest cluster_id + * @property {string|null} [dtid] ConcludeTransactionRequest dtid + */ + + /** + * Constructs a new ConcludeTransactionRequest. + * @memberof vtadmin + * @classdesc Represents a ConcludeTransactionRequest. + * @implements IConcludeTransactionRequest + * @constructor + * @param {vtadmin.IConcludeTransactionRequest=} [properties] Properties to set + */ + function ConcludeTransactionRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ConcludeTransactionRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.ConcludeTransactionRequest + * @instance + */ + ConcludeTransactionRequest.prototype.cluster_id = ""; + + /** + * ConcludeTransactionRequest dtid. + * @member {string} dtid + * @memberof vtadmin.ConcludeTransactionRequest + * @instance + */ + ConcludeTransactionRequest.prototype.dtid = ""; + + /** + * Creates a new ConcludeTransactionRequest instance using the specified properties. + * @function create + * @memberof vtadmin.ConcludeTransactionRequest + * @static + * @param {vtadmin.IConcludeTransactionRequest=} [properties] Properties to set + * @returns {vtadmin.ConcludeTransactionRequest} ConcludeTransactionRequest instance + */ + ConcludeTransactionRequest.create = function create(properties) { + return new ConcludeTransactionRequest(properties); + }; + + /** + * Encodes the specified ConcludeTransactionRequest message. Does not implicitly {@link vtadmin.ConcludeTransactionRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.ConcludeTransactionRequest + * @static + * @param {vtadmin.IConcludeTransactionRequest} message ConcludeTransactionRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ConcludeTransactionRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.dtid != null && Object.hasOwnProperty.call(message, "dtid")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.dtid); + return writer; + }; + + /** + * Encodes the specified ConcludeTransactionRequest message, length delimited. Does not implicitly {@link vtadmin.ConcludeTransactionRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.ConcludeTransactionRequest + * @static + * @param {vtadmin.IConcludeTransactionRequest} message ConcludeTransactionRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ConcludeTransactionRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.ConcludeTransactionRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.ConcludeTransactionRequest} ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ConcludeTransactionRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.ConcludeTransactionRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.cluster_id = reader.string(); + break; + } + case 2: { + message.dtid = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.ConcludeTransactionRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.ConcludeTransactionRequest} ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ConcludeTransactionRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ConcludeTransactionRequest message. + * @function verify + * @memberof vtadmin.ConcludeTransactionRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ConcludeTransactionRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.dtid != null && message.hasOwnProperty("dtid")) + if (!$util.isString(message.dtid)) + return "dtid: string expected"; + return null; + }; + + /** + * Creates a ConcludeTransactionRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.ConcludeTransactionRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.ConcludeTransactionRequest} ConcludeTransactionRequest + */ + ConcludeTransactionRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.ConcludeTransactionRequest) + return object; + let message = new $root.vtadmin.ConcludeTransactionRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.dtid != null) + message.dtid = String(object.dtid); + return message; + }; + + /** + * Creates a plain object from a ConcludeTransactionRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.ConcludeTransactionRequest + * @static + * @param {vtadmin.ConcludeTransactionRequest} message ConcludeTransactionRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ConcludeTransactionRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.cluster_id = ""; + object.dtid = ""; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.dtid != null && message.hasOwnProperty("dtid")) + object.dtid = message.dtid; + return object; + }; + + /** + * Converts this ConcludeTransactionRequest to JSON. + * @function toJSON + * @memberof vtadmin.ConcludeTransactionRequest + * @instance + * @returns {Object.} JSON object + */ + ConcludeTransactionRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ConcludeTransactionRequest + * @function getTypeUrl + * @memberof vtadmin.ConcludeTransactionRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ConcludeTransactionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.ConcludeTransactionRequest"; + }; + + return ConcludeTransactionRequest; + })(); + vtadmin.CreateKeyspaceRequest = (function() { /** @@ -18128,6 +19248,270 @@ export const vtadmin = $root.vtadmin = (() => { return GetTopologyPathRequest; })(); + vtadmin.GetUnresolvedTransactionsRequest = (function() { + + /** + * Properties of a GetUnresolvedTransactionsRequest. + * @memberof vtadmin + * @interface IGetUnresolvedTransactionsRequest + * @property {string|null} [cluster_id] GetUnresolvedTransactionsRequest cluster_id + * @property {string|null} [keyspace] GetUnresolvedTransactionsRequest keyspace + * @property {number|Long|null} [abandon_age] GetUnresolvedTransactionsRequest abandon_age + */ + + /** + * Constructs a new GetUnresolvedTransactionsRequest. + * @memberof vtadmin + * @classdesc Represents a GetUnresolvedTransactionsRequest. + * @implements IGetUnresolvedTransactionsRequest + * @constructor + * @param {vtadmin.IGetUnresolvedTransactionsRequest=} [properties] Properties to set + */ + function GetUnresolvedTransactionsRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetUnresolvedTransactionsRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @instance + */ + GetUnresolvedTransactionsRequest.prototype.cluster_id = ""; + + /** + * GetUnresolvedTransactionsRequest keyspace. + * @member {string} keyspace + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @instance + */ + GetUnresolvedTransactionsRequest.prototype.keyspace = ""; + + /** + * GetUnresolvedTransactionsRequest abandon_age. + * @member {number|Long} abandon_age + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @instance + */ + GetUnresolvedTransactionsRequest.prototype.abandon_age = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new GetUnresolvedTransactionsRequest instance using the specified properties. + * @function create + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @static + * @param {vtadmin.IGetUnresolvedTransactionsRequest=} [properties] Properties to set + * @returns {vtadmin.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest instance + */ + GetUnresolvedTransactionsRequest.create = function create(properties) { + return new GetUnresolvedTransactionsRequest(properties); + }; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message. Does not implicitly {@link vtadmin.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @static + * @param {vtadmin.IGetUnresolvedTransactionsRequest} message GetUnresolvedTransactionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetUnresolvedTransactionsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.keyspace); + if (message.abandon_age != null && Object.hasOwnProperty.call(message, "abandon_age")) + writer.uint32(/* id 3, wireType 0 =*/24).int64(message.abandon_age); + return writer; + }; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message, length delimited. Does not implicitly {@link vtadmin.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @static + * @param {vtadmin.IGetUnresolvedTransactionsRequest} message GetUnresolvedTransactionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetUnresolvedTransactionsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetUnresolvedTransactionsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.GetUnresolvedTransactionsRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.cluster_id = reader.string(); + break; + } + case 2: { + message.keyspace = reader.string(); + break; + } + case 3: { + message.abandon_age = reader.int64(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetUnresolvedTransactionsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetUnresolvedTransactionsRequest message. + * @function verify + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetUnresolvedTransactionsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.abandon_age != null && message.hasOwnProperty("abandon_age")) + if (!$util.isInteger(message.abandon_age) && !(message.abandon_age && $util.isInteger(message.abandon_age.low) && $util.isInteger(message.abandon_age.high))) + return "abandon_age: integer|Long expected"; + return null; + }; + + /** + * Creates a GetUnresolvedTransactionsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest + */ + GetUnresolvedTransactionsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.GetUnresolvedTransactionsRequest) + return object; + let message = new $root.vtadmin.GetUnresolvedTransactionsRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.abandon_age != null) + if ($util.Long) + (message.abandon_age = $util.Long.fromValue(object.abandon_age)).unsigned = false; + else if (typeof object.abandon_age === "string") + message.abandon_age = parseInt(object.abandon_age, 10); + else if (typeof object.abandon_age === "number") + message.abandon_age = object.abandon_age; + else if (typeof object.abandon_age === "object") + message.abandon_age = new $util.LongBits(object.abandon_age.low >>> 0, object.abandon_age.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a GetUnresolvedTransactionsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @static + * @param {vtadmin.GetUnresolvedTransactionsRequest} message GetUnresolvedTransactionsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetUnresolvedTransactionsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.cluster_id = ""; + object.keyspace = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.abandon_age = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.abandon_age = options.longs === String ? "0" : 0; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.abandon_age != null && message.hasOwnProperty("abandon_age")) + if (typeof message.abandon_age === "number") + object.abandon_age = options.longs === String ? String(message.abandon_age) : message.abandon_age; + else + object.abandon_age = options.longs === String ? $util.Long.prototype.toString.call(message.abandon_age) : options.longs === Number ? new $util.LongBits(message.abandon_age.low >>> 0, message.abandon_age.high >>> 0).toNumber() : message.abandon_age; + return object; + }; + + /** + * Converts this GetUnresolvedTransactionsRequest to JSON. + * @function toJSON + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @instance + * @returns {Object.} JSON object + */ + GetUnresolvedTransactionsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for GetUnresolvedTransactionsRequest + * @function getTypeUrl + * @memberof vtadmin.GetUnresolvedTransactionsRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetUnresolvedTransactionsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.GetUnresolvedTransactionsRequest"; + }; + + return GetUnresolvedTransactionsRequest; + })(); + vtadmin.GetVSchemaRequest = (function() { /** @@ -19514,6 +20898,756 @@ export const vtadmin = $root.vtadmin = (() => { return GetWorkflowRequest; })(); + vtadmin.GetWorkflowStatusRequest = (function() { + + /** + * Properties of a GetWorkflowStatusRequest. + * @memberof vtadmin + * @interface IGetWorkflowStatusRequest + * @property {string|null} [cluster_id] GetWorkflowStatusRequest cluster_id + * @property {string|null} [keyspace] GetWorkflowStatusRequest keyspace + * @property {string|null} [name] GetWorkflowStatusRequest name + */ + + /** + * Constructs a new GetWorkflowStatusRequest. + * @memberof vtadmin + * @classdesc Represents a GetWorkflowStatusRequest. + * @implements IGetWorkflowStatusRequest + * @constructor + * @param {vtadmin.IGetWorkflowStatusRequest=} [properties] Properties to set + */ + function GetWorkflowStatusRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetWorkflowStatusRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.GetWorkflowStatusRequest + * @instance + */ + GetWorkflowStatusRequest.prototype.cluster_id = ""; + + /** + * GetWorkflowStatusRequest keyspace. + * @member {string} keyspace + * @memberof vtadmin.GetWorkflowStatusRequest + * @instance + */ + GetWorkflowStatusRequest.prototype.keyspace = ""; + + /** + * GetWorkflowStatusRequest name. + * @member {string} name + * @memberof vtadmin.GetWorkflowStatusRequest + * @instance + */ + GetWorkflowStatusRequest.prototype.name = ""; + + /** + * Creates a new GetWorkflowStatusRequest instance using the specified properties. + * @function create + * @memberof vtadmin.GetWorkflowStatusRequest + * @static + * @param {vtadmin.IGetWorkflowStatusRequest=} [properties] Properties to set + * @returns {vtadmin.GetWorkflowStatusRequest} GetWorkflowStatusRequest instance + */ + GetWorkflowStatusRequest.create = function create(properties) { + return new GetWorkflowStatusRequest(properties); + }; + + /** + * Encodes the specified GetWorkflowStatusRequest message. Does not implicitly {@link vtadmin.GetWorkflowStatusRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.GetWorkflowStatusRequest + * @static + * @param {vtadmin.IGetWorkflowStatusRequest} message GetWorkflowStatusRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetWorkflowStatusRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.keyspace); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.name); + return writer; + }; + + /** + * Encodes the specified GetWorkflowStatusRequest message, length delimited. Does not implicitly {@link vtadmin.GetWorkflowStatusRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.GetWorkflowStatusRequest + * @static + * @param {vtadmin.IGetWorkflowStatusRequest} message GetWorkflowStatusRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetWorkflowStatusRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetWorkflowStatusRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.GetWorkflowStatusRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.GetWorkflowStatusRequest} GetWorkflowStatusRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetWorkflowStatusRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.GetWorkflowStatusRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.cluster_id = reader.string(); + break; + } + case 2: { + message.keyspace = reader.string(); + break; + } + case 3: { + message.name = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetWorkflowStatusRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.GetWorkflowStatusRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.GetWorkflowStatusRequest} GetWorkflowStatusRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetWorkflowStatusRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetWorkflowStatusRequest message. + * @function verify + * @memberof vtadmin.GetWorkflowStatusRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetWorkflowStatusRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + return null; + }; + + /** + * Creates a GetWorkflowStatusRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.GetWorkflowStatusRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.GetWorkflowStatusRequest} GetWorkflowStatusRequest + */ + GetWorkflowStatusRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.GetWorkflowStatusRequest) + return object; + let message = new $root.vtadmin.GetWorkflowStatusRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.name != null) + message.name = String(object.name); + return message; + }; + + /** + * Creates a plain object from a GetWorkflowStatusRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.GetWorkflowStatusRequest + * @static + * @param {vtadmin.GetWorkflowStatusRequest} message GetWorkflowStatusRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetWorkflowStatusRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.cluster_id = ""; + object.keyspace = ""; + object.name = ""; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + return object; + }; + + /** + * Converts this GetWorkflowStatusRequest to JSON. + * @function toJSON + * @memberof vtadmin.GetWorkflowStatusRequest + * @instance + * @returns {Object.} JSON object + */ + GetWorkflowStatusRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for GetWorkflowStatusRequest + * @function getTypeUrl + * @memberof vtadmin.GetWorkflowStatusRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetWorkflowStatusRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.GetWorkflowStatusRequest"; + }; + + return GetWorkflowStatusRequest; + })(); + + vtadmin.StartWorkflowRequest = (function() { + + /** + * Properties of a StartWorkflowRequest. + * @memberof vtadmin + * @interface IStartWorkflowRequest + * @property {string|null} [cluster_id] StartWorkflowRequest cluster_id + * @property {string|null} [keyspace] StartWorkflowRequest keyspace + * @property {string|null} [workflow] StartWorkflowRequest workflow + */ + + /** + * Constructs a new StartWorkflowRequest. + * @memberof vtadmin + * @classdesc Represents a StartWorkflowRequest. + * @implements IStartWorkflowRequest + * @constructor + * @param {vtadmin.IStartWorkflowRequest=} [properties] Properties to set + */ + function StartWorkflowRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StartWorkflowRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.StartWorkflowRequest + * @instance + */ + StartWorkflowRequest.prototype.cluster_id = ""; + + /** + * StartWorkflowRequest keyspace. + * @member {string} keyspace + * @memberof vtadmin.StartWorkflowRequest + * @instance + */ + StartWorkflowRequest.prototype.keyspace = ""; + + /** + * StartWorkflowRequest workflow. + * @member {string} workflow + * @memberof vtadmin.StartWorkflowRequest + * @instance + */ + StartWorkflowRequest.prototype.workflow = ""; + + /** + * Creates a new StartWorkflowRequest instance using the specified properties. + * @function create + * @memberof vtadmin.StartWorkflowRequest + * @static + * @param {vtadmin.IStartWorkflowRequest=} [properties] Properties to set + * @returns {vtadmin.StartWorkflowRequest} StartWorkflowRequest instance + */ + StartWorkflowRequest.create = function create(properties) { + return new StartWorkflowRequest(properties); + }; + + /** + * Encodes the specified StartWorkflowRequest message. Does not implicitly {@link vtadmin.StartWorkflowRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.StartWorkflowRequest + * @static + * @param {vtadmin.IStartWorkflowRequest} message StartWorkflowRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartWorkflowRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.keyspace); + if (message.workflow != null && Object.hasOwnProperty.call(message, "workflow")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.workflow); + return writer; + }; + + /** + * Encodes the specified StartWorkflowRequest message, length delimited. Does not implicitly {@link vtadmin.StartWorkflowRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.StartWorkflowRequest + * @static + * @param {vtadmin.IStartWorkflowRequest} message StartWorkflowRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartWorkflowRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StartWorkflowRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.StartWorkflowRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.StartWorkflowRequest} StartWorkflowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartWorkflowRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.StartWorkflowRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.cluster_id = reader.string(); + break; + } + case 2: { + message.keyspace = reader.string(); + break; + } + case 3: { + message.workflow = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StartWorkflowRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.StartWorkflowRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.StartWorkflowRequest} StartWorkflowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartWorkflowRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StartWorkflowRequest message. + * @function verify + * @memberof vtadmin.StartWorkflowRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StartWorkflowRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.workflow != null && message.hasOwnProperty("workflow")) + if (!$util.isString(message.workflow)) + return "workflow: string expected"; + return null; + }; + + /** + * Creates a StartWorkflowRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.StartWorkflowRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.StartWorkflowRequest} StartWorkflowRequest + */ + StartWorkflowRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.StartWorkflowRequest) + return object; + let message = new $root.vtadmin.StartWorkflowRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.workflow != null) + message.workflow = String(object.workflow); + return message; + }; + + /** + * Creates a plain object from a StartWorkflowRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.StartWorkflowRequest + * @static + * @param {vtadmin.StartWorkflowRequest} message StartWorkflowRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StartWorkflowRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.cluster_id = ""; + object.keyspace = ""; + object.workflow = ""; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.workflow != null && message.hasOwnProperty("workflow")) + object.workflow = message.workflow; + return object; + }; + + /** + * Converts this StartWorkflowRequest to JSON. + * @function toJSON + * @memberof vtadmin.StartWorkflowRequest + * @instance + * @returns {Object.} JSON object + */ + StartWorkflowRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for StartWorkflowRequest + * @function getTypeUrl + * @memberof vtadmin.StartWorkflowRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + StartWorkflowRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.StartWorkflowRequest"; + }; + + return StartWorkflowRequest; + })(); + + vtadmin.StopWorkflowRequest = (function() { + + /** + * Properties of a StopWorkflowRequest. + * @memberof vtadmin + * @interface IStopWorkflowRequest + * @property {string|null} [cluster_id] StopWorkflowRequest cluster_id + * @property {string|null} [keyspace] StopWorkflowRequest keyspace + * @property {string|null} [workflow] StopWorkflowRequest workflow + */ + + /** + * Constructs a new StopWorkflowRequest. + * @memberof vtadmin + * @classdesc Represents a StopWorkflowRequest. + * @implements IStopWorkflowRequest + * @constructor + * @param {vtadmin.IStopWorkflowRequest=} [properties] Properties to set + */ + function StopWorkflowRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StopWorkflowRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.StopWorkflowRequest + * @instance + */ + StopWorkflowRequest.prototype.cluster_id = ""; + + /** + * StopWorkflowRequest keyspace. + * @member {string} keyspace + * @memberof vtadmin.StopWorkflowRequest + * @instance + */ + StopWorkflowRequest.prototype.keyspace = ""; + + /** + * StopWorkflowRequest workflow. + * @member {string} workflow + * @memberof vtadmin.StopWorkflowRequest + * @instance + */ + StopWorkflowRequest.prototype.workflow = ""; + + /** + * Creates a new StopWorkflowRequest instance using the specified properties. + * @function create + * @memberof vtadmin.StopWorkflowRequest + * @static + * @param {vtadmin.IStopWorkflowRequest=} [properties] Properties to set + * @returns {vtadmin.StopWorkflowRequest} StopWorkflowRequest instance + */ + StopWorkflowRequest.create = function create(properties) { + return new StopWorkflowRequest(properties); + }; + + /** + * Encodes the specified StopWorkflowRequest message. Does not implicitly {@link vtadmin.StopWorkflowRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.StopWorkflowRequest + * @static + * @param {vtadmin.IStopWorkflowRequest} message StopWorkflowRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StopWorkflowRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.keyspace); + if (message.workflow != null && Object.hasOwnProperty.call(message, "workflow")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.workflow); + return writer; + }; + + /** + * Encodes the specified StopWorkflowRequest message, length delimited. Does not implicitly {@link vtadmin.StopWorkflowRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.StopWorkflowRequest + * @static + * @param {vtadmin.IStopWorkflowRequest} message StopWorkflowRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StopWorkflowRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StopWorkflowRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.StopWorkflowRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.StopWorkflowRequest} StopWorkflowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StopWorkflowRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.StopWorkflowRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.cluster_id = reader.string(); + break; + } + case 2: { + message.keyspace = reader.string(); + break; + } + case 3: { + message.workflow = reader.string(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StopWorkflowRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.StopWorkflowRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.StopWorkflowRequest} StopWorkflowRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StopWorkflowRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StopWorkflowRequest message. + * @function verify + * @memberof vtadmin.StopWorkflowRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StopWorkflowRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.workflow != null && message.hasOwnProperty("workflow")) + if (!$util.isString(message.workflow)) + return "workflow: string expected"; + return null; + }; + + /** + * Creates a StopWorkflowRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.StopWorkflowRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.StopWorkflowRequest} StopWorkflowRequest + */ + StopWorkflowRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.StopWorkflowRequest) + return object; + let message = new $root.vtadmin.StopWorkflowRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.workflow != null) + message.workflow = String(object.workflow); + return message; + }; + + /** + * Creates a plain object from a StopWorkflowRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.StopWorkflowRequest + * @static + * @param {vtadmin.StopWorkflowRequest} message StopWorkflowRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StopWorkflowRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.cluster_id = ""; + object.keyspace = ""; + object.workflow = ""; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.workflow != null && message.hasOwnProperty("workflow")) + object.workflow = message.workflow; + return object; + }; + + /** + * Converts this StopWorkflowRequest to JSON. + * @function toJSON + * @memberof vtadmin.StopWorkflowRequest + * @instance + * @returns {Object.} JSON object + */ + StopWorkflowRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for StopWorkflowRequest + * @function getTypeUrl + * @memberof vtadmin.StopWorkflowRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + StopWorkflowRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.StopWorkflowRequest"; + }; + + return StopWorkflowRequest; + })(); + vtadmin.GetWorkflowsRequest = (function() { /** @@ -20313,26 +22447,26 @@ export const vtadmin = $root.vtadmin = (() => { return LaunchSchemaMigrationRequest; })(); - vtadmin.PingTabletRequest = (function() { + vtadmin.MaterializeCreateRequest = (function() { /** - * Properties of a PingTabletRequest. + * Properties of a MaterializeCreateRequest. * @memberof vtadmin - * @interface IPingTabletRequest - * @property {topodata.ITabletAlias|null} [alias] PingTabletRequest alias - * @property {Array.|null} [cluster_ids] PingTabletRequest cluster_ids + * @interface IMaterializeCreateRequest + * @property {string|null} [cluster_id] MaterializeCreateRequest cluster_id + * @property {string|null} [table_settings] MaterializeCreateRequest table_settings + * @property {vtctldata.IMaterializeCreateRequest|null} [request] MaterializeCreateRequest request */ /** - * Constructs a new PingTabletRequest. + * Constructs a new MaterializeCreateRequest. * @memberof vtadmin - * @classdesc Represents a PingTabletRequest. - * @implements IPingTabletRequest + * @classdesc Represents a MaterializeCreateRequest. + * @implements IMaterializeCreateRequest * @constructor - * @param {vtadmin.IPingTabletRequest=} [properties] Properties to set + * @param {vtadmin.IMaterializeCreateRequest=} [properties] Properties to set */ - function PingTabletRequest(properties) { - this.cluster_ids = []; + function MaterializeCreateRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -20340,92 +22474,103 @@ export const vtadmin = $root.vtadmin = (() => { } /** - * PingTabletRequest alias. - * @member {topodata.ITabletAlias|null|undefined} alias - * @memberof vtadmin.PingTabletRequest + * MaterializeCreateRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.MaterializeCreateRequest * @instance */ - PingTabletRequest.prototype.alias = null; + MaterializeCreateRequest.prototype.cluster_id = ""; /** - * PingTabletRequest cluster_ids. - * @member {Array.} cluster_ids - * @memberof vtadmin.PingTabletRequest + * MaterializeCreateRequest table_settings. + * @member {string} table_settings + * @memberof vtadmin.MaterializeCreateRequest * @instance */ - PingTabletRequest.prototype.cluster_ids = $util.emptyArray; + MaterializeCreateRequest.prototype.table_settings = ""; /** - * Creates a new PingTabletRequest instance using the specified properties. + * MaterializeCreateRequest request. + * @member {vtctldata.IMaterializeCreateRequest|null|undefined} request + * @memberof vtadmin.MaterializeCreateRequest + * @instance + */ + MaterializeCreateRequest.prototype.request = null; + + /** + * Creates a new MaterializeCreateRequest instance using the specified properties. * @function create - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @static - * @param {vtadmin.IPingTabletRequest=} [properties] Properties to set - * @returns {vtadmin.PingTabletRequest} PingTabletRequest instance + * @param {vtadmin.IMaterializeCreateRequest=} [properties] Properties to set + * @returns {vtadmin.MaterializeCreateRequest} MaterializeCreateRequest instance */ - PingTabletRequest.create = function create(properties) { - return new PingTabletRequest(properties); + MaterializeCreateRequest.create = function create(properties) { + return new MaterializeCreateRequest(properties); }; /** - * Encodes the specified PingTabletRequest message. Does not implicitly {@link vtadmin.PingTabletRequest.verify|verify} messages. + * Encodes the specified MaterializeCreateRequest message. Does not implicitly {@link vtadmin.MaterializeCreateRequest.verify|verify} messages. * @function encode - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @static - * @param {vtadmin.IPingTabletRequest} message PingTabletRequest message or plain object to encode + * @param {vtadmin.IMaterializeCreateRequest} message MaterializeCreateRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - PingTabletRequest.encode = function encode(message, writer) { + MaterializeCreateRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.alias != null && Object.hasOwnProperty.call(message, "alias")) - $root.topodata.TabletAlias.encode(message.alias, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - if (message.cluster_ids != null && message.cluster_ids.length) - for (let i = 0; i < message.cluster_ids.length; ++i) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.cluster_ids[i]); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.table_settings != null && Object.hasOwnProperty.call(message, "table_settings")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.table_settings); + if (message.request != null && Object.hasOwnProperty.call(message, "request")) + $root.vtctldata.MaterializeCreateRequest.encode(message.request, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; /** - * Encodes the specified PingTabletRequest message, length delimited. Does not implicitly {@link vtadmin.PingTabletRequest.verify|verify} messages. + * Encodes the specified MaterializeCreateRequest message, length delimited. Does not implicitly {@link vtadmin.MaterializeCreateRequest.verify|verify} messages. * @function encodeDelimited - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @static - * @param {vtadmin.IPingTabletRequest} message PingTabletRequest message or plain object to encode + * @param {vtadmin.IMaterializeCreateRequest} message MaterializeCreateRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - PingTabletRequest.encodeDelimited = function encodeDelimited(message, writer) { + MaterializeCreateRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a PingTabletRequest message from the specified reader or buffer. + * Decodes a MaterializeCreateRequest message from the specified reader or buffer. * @function decode - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {vtadmin.PingTabletRequest} PingTabletRequest + * @returns {vtadmin.MaterializeCreateRequest} MaterializeCreateRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - PingTabletRequest.decode = function decode(reader, length) { + MaterializeCreateRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.PingTabletRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.MaterializeCreateRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.alias = $root.topodata.TabletAlias.decode(reader, reader.uint32()); + message.cluster_id = reader.string(); break; } case 2: { - if (!(message.cluster_ids && message.cluster_ids.length)) - message.cluster_ids = []; - message.cluster_ids.push(reader.string()); + message.table_settings = reader.string(); + break; + } + case 3: { + message.request = $root.vtctldata.MaterializeCreateRequest.decode(reader, reader.uint32()); break; } default: @@ -20437,149 +22582,145 @@ export const vtadmin = $root.vtadmin = (() => { }; /** - * Decodes a PingTabletRequest message from the specified reader or buffer, length delimited. + * Decodes a MaterializeCreateRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {vtadmin.PingTabletRequest} PingTabletRequest + * @returns {vtadmin.MaterializeCreateRequest} MaterializeCreateRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - PingTabletRequest.decodeDelimited = function decodeDelimited(reader) { + MaterializeCreateRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a PingTabletRequest message. + * Verifies a MaterializeCreateRequest message. * @function verify - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - PingTabletRequest.verify = function verify(message) { + MaterializeCreateRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.alias != null && message.hasOwnProperty("alias")) { - let error = $root.topodata.TabletAlias.verify(message.alias); + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.table_settings != null && message.hasOwnProperty("table_settings")) + if (!$util.isString(message.table_settings)) + return "table_settings: string expected"; + if (message.request != null && message.hasOwnProperty("request")) { + let error = $root.vtctldata.MaterializeCreateRequest.verify(message.request); if (error) - return "alias." + error; - } - if (message.cluster_ids != null && message.hasOwnProperty("cluster_ids")) { - if (!Array.isArray(message.cluster_ids)) - return "cluster_ids: array expected"; - for (let i = 0; i < message.cluster_ids.length; ++i) - if (!$util.isString(message.cluster_ids[i])) - return "cluster_ids: string[] expected"; + return "request." + error; } return null; }; /** - * Creates a PingTabletRequest message from a plain object. Also converts values to their respective internal types. + * Creates a MaterializeCreateRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @static * @param {Object.} object Plain object - * @returns {vtadmin.PingTabletRequest} PingTabletRequest + * @returns {vtadmin.MaterializeCreateRequest} MaterializeCreateRequest */ - PingTabletRequest.fromObject = function fromObject(object) { - if (object instanceof $root.vtadmin.PingTabletRequest) + MaterializeCreateRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.MaterializeCreateRequest) return object; - let message = new $root.vtadmin.PingTabletRequest(); - if (object.alias != null) { - if (typeof object.alias !== "object") - throw TypeError(".vtadmin.PingTabletRequest.alias: object expected"); - message.alias = $root.topodata.TabletAlias.fromObject(object.alias); - } - if (object.cluster_ids) { - if (!Array.isArray(object.cluster_ids)) - throw TypeError(".vtadmin.PingTabletRequest.cluster_ids: array expected"); - message.cluster_ids = []; - for (let i = 0; i < object.cluster_ids.length; ++i) - message.cluster_ids[i] = String(object.cluster_ids[i]); + let message = new $root.vtadmin.MaterializeCreateRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.table_settings != null) + message.table_settings = String(object.table_settings); + if (object.request != null) { + if (typeof object.request !== "object") + throw TypeError(".vtadmin.MaterializeCreateRequest.request: object expected"); + message.request = $root.vtctldata.MaterializeCreateRequest.fromObject(object.request); } return message; }; /** - * Creates a plain object from a PingTabletRequest message. Also converts values to other types if specified. + * Creates a plain object from a MaterializeCreateRequest message. Also converts values to other types if specified. * @function toObject - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @static - * @param {vtadmin.PingTabletRequest} message PingTabletRequest + * @param {vtadmin.MaterializeCreateRequest} message MaterializeCreateRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - PingTabletRequest.toObject = function toObject(message, options) { + MaterializeCreateRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; - if (options.arrays || options.defaults) - object.cluster_ids = []; - if (options.defaults) - object.alias = null; - if (message.alias != null && message.hasOwnProperty("alias")) - object.alias = $root.topodata.TabletAlias.toObject(message.alias, options); - if (message.cluster_ids && message.cluster_ids.length) { - object.cluster_ids = []; - for (let j = 0; j < message.cluster_ids.length; ++j) - object.cluster_ids[j] = message.cluster_ids[j]; + if (options.defaults) { + object.cluster_id = ""; + object.table_settings = ""; + object.request = null; } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.table_settings != null && message.hasOwnProperty("table_settings")) + object.table_settings = message.table_settings; + if (message.request != null && message.hasOwnProperty("request")) + object.request = $root.vtctldata.MaterializeCreateRequest.toObject(message.request, options); return object; }; /** - * Converts this PingTabletRequest to JSON. + * Converts this MaterializeCreateRequest to JSON. * @function toJSON - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @instance * @returns {Object.} JSON object */ - PingTabletRequest.prototype.toJSON = function toJSON() { + MaterializeCreateRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for PingTabletRequest + * Gets the default type url for MaterializeCreateRequest * @function getTypeUrl - * @memberof vtadmin.PingTabletRequest + * @memberof vtadmin.MaterializeCreateRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - PingTabletRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + MaterializeCreateRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/vtadmin.PingTabletRequest"; + return typeUrlPrefix + "/vtadmin.MaterializeCreateRequest"; }; - return PingTabletRequest; + return MaterializeCreateRequest; })(); - vtadmin.PingTabletResponse = (function() { + vtadmin.MoveTablesCompleteRequest = (function() { /** - * Properties of a PingTabletResponse. + * Properties of a MoveTablesCompleteRequest. * @memberof vtadmin - * @interface IPingTabletResponse - * @property {string|null} [status] PingTabletResponse status - * @property {vtadmin.ICluster|null} [cluster] PingTabletResponse cluster + * @interface IMoveTablesCompleteRequest + * @property {string|null} [cluster_id] MoveTablesCompleteRequest cluster_id + * @property {vtctldata.IMoveTablesCompleteRequest|null} [request] MoveTablesCompleteRequest request */ /** - * Constructs a new PingTabletResponse. + * Constructs a new MoveTablesCompleteRequest. * @memberof vtadmin - * @classdesc Represents a PingTabletResponse. - * @implements IPingTabletResponse + * @classdesc Represents a MoveTablesCompleteRequest. + * @implements IMoveTablesCompleteRequest * @constructor - * @param {vtadmin.IPingTabletResponse=} [properties] Properties to set + * @param {vtadmin.IMoveTablesCompleteRequest=} [properties] Properties to set */ - function PingTabletResponse(properties) { + function MoveTablesCompleteRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -20587,89 +22728,89 @@ export const vtadmin = $root.vtadmin = (() => { } /** - * PingTabletResponse status. - * @member {string} status - * @memberof vtadmin.PingTabletResponse + * MoveTablesCompleteRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.MoveTablesCompleteRequest * @instance */ - PingTabletResponse.prototype.status = ""; + MoveTablesCompleteRequest.prototype.cluster_id = ""; /** - * PingTabletResponse cluster. - * @member {vtadmin.ICluster|null|undefined} cluster - * @memberof vtadmin.PingTabletResponse + * MoveTablesCompleteRequest request. + * @member {vtctldata.IMoveTablesCompleteRequest|null|undefined} request + * @memberof vtadmin.MoveTablesCompleteRequest * @instance */ - PingTabletResponse.prototype.cluster = null; + MoveTablesCompleteRequest.prototype.request = null; /** - * Creates a new PingTabletResponse instance using the specified properties. + * Creates a new MoveTablesCompleteRequest instance using the specified properties. * @function create - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @static - * @param {vtadmin.IPingTabletResponse=} [properties] Properties to set - * @returns {vtadmin.PingTabletResponse} PingTabletResponse instance + * @param {vtadmin.IMoveTablesCompleteRequest=} [properties] Properties to set + * @returns {vtadmin.MoveTablesCompleteRequest} MoveTablesCompleteRequest instance */ - PingTabletResponse.create = function create(properties) { - return new PingTabletResponse(properties); + MoveTablesCompleteRequest.create = function create(properties) { + return new MoveTablesCompleteRequest(properties); }; /** - * Encodes the specified PingTabletResponse message. Does not implicitly {@link vtadmin.PingTabletResponse.verify|verify} messages. + * Encodes the specified MoveTablesCompleteRequest message. Does not implicitly {@link vtadmin.MoveTablesCompleteRequest.verify|verify} messages. * @function encode - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @static - * @param {vtadmin.IPingTabletResponse} message PingTabletResponse message or plain object to encode + * @param {vtadmin.IMoveTablesCompleteRequest} message MoveTablesCompleteRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - PingTabletResponse.encode = function encode(message, writer) { + MoveTablesCompleteRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.status != null && Object.hasOwnProperty.call(message, "status")) - writer.uint32(/* id 1, wireType 2 =*/10).string(message.status); - if (message.cluster != null && Object.hasOwnProperty.call(message, "cluster")) - $root.vtadmin.Cluster.encode(message.cluster, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.request != null && Object.hasOwnProperty.call(message, "request")) + $root.vtctldata.MoveTablesCompleteRequest.encode(message.request, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); return writer; }; /** - * Encodes the specified PingTabletResponse message, length delimited. Does not implicitly {@link vtadmin.PingTabletResponse.verify|verify} messages. + * Encodes the specified MoveTablesCompleteRequest message, length delimited. Does not implicitly {@link vtadmin.MoveTablesCompleteRequest.verify|verify} messages. * @function encodeDelimited - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @static - * @param {vtadmin.IPingTabletResponse} message PingTabletResponse message or plain object to encode + * @param {vtadmin.IMoveTablesCompleteRequest} message MoveTablesCompleteRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - PingTabletResponse.encodeDelimited = function encodeDelimited(message, writer) { + MoveTablesCompleteRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a PingTabletResponse message from the specified reader or buffer. + * Decodes a MoveTablesCompleteRequest message from the specified reader or buffer. * @function decode - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {vtadmin.PingTabletResponse} PingTabletResponse + * @returns {vtadmin.MoveTablesCompleteRequest} MoveTablesCompleteRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - PingTabletResponse.decode = function decode(reader, length) { + MoveTablesCompleteRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.PingTabletResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.MoveTablesCompleteRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.status = reader.string(); + message.cluster_id = reader.string(); break; } case 2: { - message.cluster = $root.vtadmin.Cluster.decode(reader, reader.uint32()); + message.request = $root.vtctldata.MoveTablesCompleteRequest.decode(reader, reader.uint32()); break; } default: @@ -20681,137 +22822,137 @@ export const vtadmin = $root.vtadmin = (() => { }; /** - * Decodes a PingTabletResponse message from the specified reader or buffer, length delimited. + * Decodes a MoveTablesCompleteRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {vtadmin.PingTabletResponse} PingTabletResponse + * @returns {vtadmin.MoveTablesCompleteRequest} MoveTablesCompleteRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - PingTabletResponse.decodeDelimited = function decodeDelimited(reader) { + MoveTablesCompleteRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a PingTabletResponse message. + * Verifies a MoveTablesCompleteRequest message. * @function verify - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - PingTabletResponse.verify = function verify(message) { + MoveTablesCompleteRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.status != null && message.hasOwnProperty("status")) - if (!$util.isString(message.status)) - return "status: string expected"; - if (message.cluster != null && message.hasOwnProperty("cluster")) { - let error = $root.vtadmin.Cluster.verify(message.cluster); + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.request != null && message.hasOwnProperty("request")) { + let error = $root.vtctldata.MoveTablesCompleteRequest.verify(message.request); if (error) - return "cluster." + error; + return "request." + error; } return null; }; /** - * Creates a PingTabletResponse message from a plain object. Also converts values to their respective internal types. + * Creates a MoveTablesCompleteRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @static * @param {Object.} object Plain object - * @returns {vtadmin.PingTabletResponse} PingTabletResponse + * @returns {vtadmin.MoveTablesCompleteRequest} MoveTablesCompleteRequest */ - PingTabletResponse.fromObject = function fromObject(object) { - if (object instanceof $root.vtadmin.PingTabletResponse) + MoveTablesCompleteRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.MoveTablesCompleteRequest) return object; - let message = new $root.vtadmin.PingTabletResponse(); - if (object.status != null) - message.status = String(object.status); - if (object.cluster != null) { - if (typeof object.cluster !== "object") - throw TypeError(".vtadmin.PingTabletResponse.cluster: object expected"); - message.cluster = $root.vtadmin.Cluster.fromObject(object.cluster); + let message = new $root.vtadmin.MoveTablesCompleteRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.request != null) { + if (typeof object.request !== "object") + throw TypeError(".vtadmin.MoveTablesCompleteRequest.request: object expected"); + message.request = $root.vtctldata.MoveTablesCompleteRequest.fromObject(object.request); } return message; }; /** - * Creates a plain object from a PingTabletResponse message. Also converts values to other types if specified. + * Creates a plain object from a MoveTablesCompleteRequest message. Also converts values to other types if specified. * @function toObject - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @static - * @param {vtadmin.PingTabletResponse} message PingTabletResponse + * @param {vtadmin.MoveTablesCompleteRequest} message MoveTablesCompleteRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - PingTabletResponse.toObject = function toObject(message, options) { + MoveTablesCompleteRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; if (options.defaults) { - object.status = ""; - object.cluster = null; + object.cluster_id = ""; + object.request = null; } - if (message.status != null && message.hasOwnProperty("status")) - object.status = message.status; - if (message.cluster != null && message.hasOwnProperty("cluster")) - object.cluster = $root.vtadmin.Cluster.toObject(message.cluster, options); + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.request != null && message.hasOwnProperty("request")) + object.request = $root.vtctldata.MoveTablesCompleteRequest.toObject(message.request, options); return object; }; /** - * Converts this PingTabletResponse to JSON. + * Converts this MoveTablesCompleteRequest to JSON. * @function toJSON - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @instance * @returns {Object.} JSON object */ - PingTabletResponse.prototype.toJSON = function toJSON() { + MoveTablesCompleteRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for PingTabletResponse + * Gets the default type url for MoveTablesCompleteRequest * @function getTypeUrl - * @memberof vtadmin.PingTabletResponse + * @memberof vtadmin.MoveTablesCompleteRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - PingTabletResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + MoveTablesCompleteRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/vtadmin.PingTabletResponse"; + return typeUrlPrefix + "/vtadmin.MoveTablesCompleteRequest"; }; - return PingTabletResponse; + return MoveTablesCompleteRequest; })(); - vtadmin.PlannedFailoverShardRequest = (function() { + vtadmin.MoveTablesCreateRequest = (function() { /** - * Properties of a PlannedFailoverShardRequest. + * Properties of a MoveTablesCreateRequest. * @memberof vtadmin - * @interface IPlannedFailoverShardRequest - * @property {string|null} [cluster_id] PlannedFailoverShardRequest cluster_id - * @property {vtctldata.IPlannedReparentShardRequest|null} [options] PlannedFailoverShardRequest options + * @interface IMoveTablesCreateRequest + * @property {string|null} [cluster_id] MoveTablesCreateRequest cluster_id + * @property {vtctldata.IMoveTablesCreateRequest|null} [request] MoveTablesCreateRequest request */ /** - * Constructs a new PlannedFailoverShardRequest. + * Constructs a new MoveTablesCreateRequest. * @memberof vtadmin - * @classdesc Represents a PlannedFailoverShardRequest. - * @implements IPlannedFailoverShardRequest + * @classdesc Represents a MoveTablesCreateRequest. + * @implements IMoveTablesCreateRequest * @constructor - * @param {vtadmin.IPlannedFailoverShardRequest=} [properties] Properties to set + * @param {vtadmin.IMoveTablesCreateRequest=} [properties] Properties to set */ - function PlannedFailoverShardRequest(properties) { + function MoveTablesCreateRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -20819,80 +22960,80 @@ export const vtadmin = $root.vtadmin = (() => { } /** - * PlannedFailoverShardRequest cluster_id. + * MoveTablesCreateRequest cluster_id. * @member {string} cluster_id - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @instance */ - PlannedFailoverShardRequest.prototype.cluster_id = ""; + MoveTablesCreateRequest.prototype.cluster_id = ""; /** - * PlannedFailoverShardRequest options. - * @member {vtctldata.IPlannedReparentShardRequest|null|undefined} options - * @memberof vtadmin.PlannedFailoverShardRequest + * MoveTablesCreateRequest request. + * @member {vtctldata.IMoveTablesCreateRequest|null|undefined} request + * @memberof vtadmin.MoveTablesCreateRequest * @instance */ - PlannedFailoverShardRequest.prototype.options = null; + MoveTablesCreateRequest.prototype.request = null; /** - * Creates a new PlannedFailoverShardRequest instance using the specified properties. + * Creates a new MoveTablesCreateRequest instance using the specified properties. * @function create - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @static - * @param {vtadmin.IPlannedFailoverShardRequest=} [properties] Properties to set - * @returns {vtadmin.PlannedFailoverShardRequest} PlannedFailoverShardRequest instance + * @param {vtadmin.IMoveTablesCreateRequest=} [properties] Properties to set + * @returns {vtadmin.MoveTablesCreateRequest} MoveTablesCreateRequest instance */ - PlannedFailoverShardRequest.create = function create(properties) { - return new PlannedFailoverShardRequest(properties); + MoveTablesCreateRequest.create = function create(properties) { + return new MoveTablesCreateRequest(properties); }; /** - * Encodes the specified PlannedFailoverShardRequest message. Does not implicitly {@link vtadmin.PlannedFailoverShardRequest.verify|verify} messages. + * Encodes the specified MoveTablesCreateRequest message. Does not implicitly {@link vtadmin.MoveTablesCreateRequest.verify|verify} messages. * @function encode - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @static - * @param {vtadmin.IPlannedFailoverShardRequest} message PlannedFailoverShardRequest message or plain object to encode + * @param {vtadmin.IMoveTablesCreateRequest} message MoveTablesCreateRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - PlannedFailoverShardRequest.encode = function encode(message, writer) { + MoveTablesCreateRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); - if (message.options != null && Object.hasOwnProperty.call(message, "options")) - $root.vtctldata.PlannedReparentShardRequest.encode(message.options, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.request != null && Object.hasOwnProperty.call(message, "request")) + $root.vtctldata.MoveTablesCreateRequest.encode(message.request, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); return writer; }; /** - * Encodes the specified PlannedFailoverShardRequest message, length delimited. Does not implicitly {@link vtadmin.PlannedFailoverShardRequest.verify|verify} messages. + * Encodes the specified MoveTablesCreateRequest message, length delimited. Does not implicitly {@link vtadmin.MoveTablesCreateRequest.verify|verify} messages. * @function encodeDelimited - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @static - * @param {vtadmin.IPlannedFailoverShardRequest} message PlannedFailoverShardRequest message or plain object to encode + * @param {vtadmin.IMoveTablesCreateRequest} message MoveTablesCreateRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - PlannedFailoverShardRequest.encodeDelimited = function encodeDelimited(message, writer) { + MoveTablesCreateRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a PlannedFailoverShardRequest message from the specified reader or buffer. + * Decodes a MoveTablesCreateRequest message from the specified reader or buffer. * @function decode - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {vtadmin.PlannedFailoverShardRequest} PlannedFailoverShardRequest + * @returns {vtadmin.MoveTablesCreateRequest} MoveTablesCreateRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - PlannedFailoverShardRequest.decode = function decode(reader, length) { + MoveTablesCreateRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.PlannedFailoverShardRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.MoveTablesCreateRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { @@ -20901,7 +23042,7 @@ export const vtadmin = $root.vtadmin = (() => { break; } case 2: { - message.options = $root.vtctldata.PlannedReparentShardRequest.decode(reader, reader.uint32()); + message.request = $root.vtctldata.MoveTablesCreateRequest.decode(reader, reader.uint32()); break; } default: @@ -20913,141 +23054,138 @@ export const vtadmin = $root.vtadmin = (() => { }; /** - * Decodes a PlannedFailoverShardRequest message from the specified reader or buffer, length delimited. + * Decodes a MoveTablesCreateRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {vtadmin.PlannedFailoverShardRequest} PlannedFailoverShardRequest + * @returns {vtadmin.MoveTablesCreateRequest} MoveTablesCreateRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - PlannedFailoverShardRequest.decodeDelimited = function decodeDelimited(reader) { + MoveTablesCreateRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a PlannedFailoverShardRequest message. + * Verifies a MoveTablesCreateRequest message. * @function verify - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - PlannedFailoverShardRequest.verify = function verify(message) { + MoveTablesCreateRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) if (!$util.isString(message.cluster_id)) return "cluster_id: string expected"; - if (message.options != null && message.hasOwnProperty("options")) { - let error = $root.vtctldata.PlannedReparentShardRequest.verify(message.options); + if (message.request != null && message.hasOwnProperty("request")) { + let error = $root.vtctldata.MoveTablesCreateRequest.verify(message.request); if (error) - return "options." + error; + return "request." + error; } return null; }; /** - * Creates a PlannedFailoverShardRequest message from a plain object. Also converts values to their respective internal types. + * Creates a MoveTablesCreateRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @static * @param {Object.} object Plain object - * @returns {vtadmin.PlannedFailoverShardRequest} PlannedFailoverShardRequest + * @returns {vtadmin.MoveTablesCreateRequest} MoveTablesCreateRequest */ - PlannedFailoverShardRequest.fromObject = function fromObject(object) { - if (object instanceof $root.vtadmin.PlannedFailoverShardRequest) + MoveTablesCreateRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.MoveTablesCreateRequest) return object; - let message = new $root.vtadmin.PlannedFailoverShardRequest(); + let message = new $root.vtadmin.MoveTablesCreateRequest(); if (object.cluster_id != null) message.cluster_id = String(object.cluster_id); - if (object.options != null) { - if (typeof object.options !== "object") - throw TypeError(".vtadmin.PlannedFailoverShardRequest.options: object expected"); - message.options = $root.vtctldata.PlannedReparentShardRequest.fromObject(object.options); + if (object.request != null) { + if (typeof object.request !== "object") + throw TypeError(".vtadmin.MoveTablesCreateRequest.request: object expected"); + message.request = $root.vtctldata.MoveTablesCreateRequest.fromObject(object.request); } return message; }; /** - * Creates a plain object from a PlannedFailoverShardRequest message. Also converts values to other types if specified. + * Creates a plain object from a MoveTablesCreateRequest message. Also converts values to other types if specified. * @function toObject - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @static - * @param {vtadmin.PlannedFailoverShardRequest} message PlannedFailoverShardRequest + * @param {vtadmin.MoveTablesCreateRequest} message MoveTablesCreateRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - PlannedFailoverShardRequest.toObject = function toObject(message, options) { + MoveTablesCreateRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; if (options.defaults) { object.cluster_id = ""; - object.options = null; + object.request = null; } if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) object.cluster_id = message.cluster_id; - if (message.options != null && message.hasOwnProperty("options")) - object.options = $root.vtctldata.PlannedReparentShardRequest.toObject(message.options, options); + if (message.request != null && message.hasOwnProperty("request")) + object.request = $root.vtctldata.MoveTablesCreateRequest.toObject(message.request, options); return object; }; /** - * Converts this PlannedFailoverShardRequest to JSON. + * Converts this MoveTablesCreateRequest to JSON. * @function toJSON - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @instance * @returns {Object.} JSON object */ - PlannedFailoverShardRequest.prototype.toJSON = function toJSON() { + MoveTablesCreateRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for PlannedFailoverShardRequest + * Gets the default type url for MoveTablesCreateRequest * @function getTypeUrl - * @memberof vtadmin.PlannedFailoverShardRequest + * @memberof vtadmin.MoveTablesCreateRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - PlannedFailoverShardRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + MoveTablesCreateRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/vtadmin.PlannedFailoverShardRequest"; + return typeUrlPrefix + "/vtadmin.MoveTablesCreateRequest"; }; - return PlannedFailoverShardRequest; + return MoveTablesCreateRequest; })(); - vtadmin.PlannedFailoverShardResponse = (function() { + vtadmin.PingTabletRequest = (function() { /** - * Properties of a PlannedFailoverShardResponse. + * Properties of a PingTabletRequest. * @memberof vtadmin - * @interface IPlannedFailoverShardResponse - * @property {vtadmin.ICluster|null} [cluster] PlannedFailoverShardResponse cluster - * @property {string|null} [keyspace] PlannedFailoverShardResponse keyspace - * @property {string|null} [shard] PlannedFailoverShardResponse shard - * @property {topodata.ITabletAlias|null} [promoted_primary] PlannedFailoverShardResponse promoted_primary - * @property {Array.|null} [events] PlannedFailoverShardResponse events + * @interface IPingTabletRequest + * @property {topodata.ITabletAlias|null} [alias] PingTabletRequest alias + * @property {Array.|null} [cluster_ids] PingTabletRequest cluster_ids */ /** - * Constructs a new PlannedFailoverShardResponse. + * Constructs a new PingTabletRequest. * @memberof vtadmin - * @classdesc Represents a PlannedFailoverShardResponse. - * @implements IPlannedFailoverShardResponse + * @classdesc Represents a PingTabletRequest. + * @implements IPingTabletRequest * @constructor - * @param {vtadmin.IPlannedFailoverShardResponse=} [properties] Properties to set + * @param {vtadmin.IPingTabletRequest=} [properties] Properties to set */ - function PlannedFailoverShardResponse(properties) { - this.events = []; + function PingTabletRequest(properties) { + this.cluster_ids = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -21055,42 +23193,757 @@ export const vtadmin = $root.vtadmin = (() => { } /** - * PlannedFailoverShardResponse cluster. - * @member {vtadmin.ICluster|null|undefined} cluster - * @memberof vtadmin.PlannedFailoverShardResponse - * @instance - */ - PlannedFailoverShardResponse.prototype.cluster = null; - - /** - * PlannedFailoverShardResponse keyspace. - * @member {string} keyspace - * @memberof vtadmin.PlannedFailoverShardResponse + * PingTabletRequest alias. + * @member {topodata.ITabletAlias|null|undefined} alias + * @memberof vtadmin.PingTabletRequest * @instance */ - PlannedFailoverShardResponse.prototype.keyspace = ""; + PingTabletRequest.prototype.alias = null; /** - * PlannedFailoverShardResponse shard. - * @member {string} shard - * @memberof vtadmin.PlannedFailoverShardResponse + * PingTabletRequest cluster_ids. + * @member {Array.} cluster_ids + * @memberof vtadmin.PingTabletRequest * @instance */ - PlannedFailoverShardResponse.prototype.shard = ""; + PingTabletRequest.prototype.cluster_ids = $util.emptyArray; /** - * PlannedFailoverShardResponse promoted_primary. - * @member {topodata.ITabletAlias|null|undefined} promoted_primary - * @memberof vtadmin.PlannedFailoverShardResponse - * @instance + * Creates a new PingTabletRequest instance using the specified properties. + * @function create + * @memberof vtadmin.PingTabletRequest + * @static + * @param {vtadmin.IPingTabletRequest=} [properties] Properties to set + * @returns {vtadmin.PingTabletRequest} PingTabletRequest instance */ - PlannedFailoverShardResponse.prototype.promoted_primary = null; + PingTabletRequest.create = function create(properties) { + return new PingTabletRequest(properties); + }; /** - * PlannedFailoverShardResponse events. - * @member {Array.} events - * @memberof vtadmin.PlannedFailoverShardResponse - * @instance + * Encodes the specified PingTabletRequest message. Does not implicitly {@link vtadmin.PingTabletRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.PingTabletRequest + * @static + * @param {vtadmin.IPingTabletRequest} message PingTabletRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PingTabletRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.alias != null && Object.hasOwnProperty.call(message, "alias")) + $root.topodata.TabletAlias.encode(message.alias, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.cluster_ids != null && message.cluster_ids.length) + for (let i = 0; i < message.cluster_ids.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.cluster_ids[i]); + return writer; + }; + + /** + * Encodes the specified PingTabletRequest message, length delimited. Does not implicitly {@link vtadmin.PingTabletRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.PingTabletRequest + * @static + * @param {vtadmin.IPingTabletRequest} message PingTabletRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PingTabletRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PingTabletRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.PingTabletRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.PingTabletRequest} PingTabletRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PingTabletRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.PingTabletRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.alias = $root.topodata.TabletAlias.decode(reader, reader.uint32()); + break; + } + case 2: { + if (!(message.cluster_ids && message.cluster_ids.length)) + message.cluster_ids = []; + message.cluster_ids.push(reader.string()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PingTabletRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.PingTabletRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.PingTabletRequest} PingTabletRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PingTabletRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PingTabletRequest message. + * @function verify + * @memberof vtadmin.PingTabletRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PingTabletRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.alias != null && message.hasOwnProperty("alias")) { + let error = $root.topodata.TabletAlias.verify(message.alias); + if (error) + return "alias." + error; + } + if (message.cluster_ids != null && message.hasOwnProperty("cluster_ids")) { + if (!Array.isArray(message.cluster_ids)) + return "cluster_ids: array expected"; + for (let i = 0; i < message.cluster_ids.length; ++i) + if (!$util.isString(message.cluster_ids[i])) + return "cluster_ids: string[] expected"; + } + return null; + }; + + /** + * Creates a PingTabletRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.PingTabletRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.PingTabletRequest} PingTabletRequest + */ + PingTabletRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.PingTabletRequest) + return object; + let message = new $root.vtadmin.PingTabletRequest(); + if (object.alias != null) { + if (typeof object.alias !== "object") + throw TypeError(".vtadmin.PingTabletRequest.alias: object expected"); + message.alias = $root.topodata.TabletAlias.fromObject(object.alias); + } + if (object.cluster_ids) { + if (!Array.isArray(object.cluster_ids)) + throw TypeError(".vtadmin.PingTabletRequest.cluster_ids: array expected"); + message.cluster_ids = []; + for (let i = 0; i < object.cluster_ids.length; ++i) + message.cluster_ids[i] = String(object.cluster_ids[i]); + } + return message; + }; + + /** + * Creates a plain object from a PingTabletRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.PingTabletRequest + * @static + * @param {vtadmin.PingTabletRequest} message PingTabletRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PingTabletRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.cluster_ids = []; + if (options.defaults) + object.alias = null; + if (message.alias != null && message.hasOwnProperty("alias")) + object.alias = $root.topodata.TabletAlias.toObject(message.alias, options); + if (message.cluster_ids && message.cluster_ids.length) { + object.cluster_ids = []; + for (let j = 0; j < message.cluster_ids.length; ++j) + object.cluster_ids[j] = message.cluster_ids[j]; + } + return object; + }; + + /** + * Converts this PingTabletRequest to JSON. + * @function toJSON + * @memberof vtadmin.PingTabletRequest + * @instance + * @returns {Object.} JSON object + */ + PingTabletRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for PingTabletRequest + * @function getTypeUrl + * @memberof vtadmin.PingTabletRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + PingTabletRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.PingTabletRequest"; + }; + + return PingTabletRequest; + })(); + + vtadmin.PingTabletResponse = (function() { + + /** + * Properties of a PingTabletResponse. + * @memberof vtadmin + * @interface IPingTabletResponse + * @property {string|null} [status] PingTabletResponse status + * @property {vtadmin.ICluster|null} [cluster] PingTabletResponse cluster + */ + + /** + * Constructs a new PingTabletResponse. + * @memberof vtadmin + * @classdesc Represents a PingTabletResponse. + * @implements IPingTabletResponse + * @constructor + * @param {vtadmin.IPingTabletResponse=} [properties] Properties to set + */ + function PingTabletResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PingTabletResponse status. + * @member {string} status + * @memberof vtadmin.PingTabletResponse + * @instance + */ + PingTabletResponse.prototype.status = ""; + + /** + * PingTabletResponse cluster. + * @member {vtadmin.ICluster|null|undefined} cluster + * @memberof vtadmin.PingTabletResponse + * @instance + */ + PingTabletResponse.prototype.cluster = null; + + /** + * Creates a new PingTabletResponse instance using the specified properties. + * @function create + * @memberof vtadmin.PingTabletResponse + * @static + * @param {vtadmin.IPingTabletResponse=} [properties] Properties to set + * @returns {vtadmin.PingTabletResponse} PingTabletResponse instance + */ + PingTabletResponse.create = function create(properties) { + return new PingTabletResponse(properties); + }; + + /** + * Encodes the specified PingTabletResponse message. Does not implicitly {@link vtadmin.PingTabletResponse.verify|verify} messages. + * @function encode + * @memberof vtadmin.PingTabletResponse + * @static + * @param {vtadmin.IPingTabletResponse} message PingTabletResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PingTabletResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.status != null && Object.hasOwnProperty.call(message, "status")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.status); + if (message.cluster != null && Object.hasOwnProperty.call(message, "cluster")) + $root.vtadmin.Cluster.encode(message.cluster, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified PingTabletResponse message, length delimited. Does not implicitly {@link vtadmin.PingTabletResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.PingTabletResponse + * @static + * @param {vtadmin.IPingTabletResponse} message PingTabletResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PingTabletResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PingTabletResponse message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.PingTabletResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.PingTabletResponse} PingTabletResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PingTabletResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.PingTabletResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.status = reader.string(); + break; + } + case 2: { + message.cluster = $root.vtadmin.Cluster.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PingTabletResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.PingTabletResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.PingTabletResponse} PingTabletResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PingTabletResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PingTabletResponse message. + * @function verify + * @memberof vtadmin.PingTabletResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PingTabletResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.status != null && message.hasOwnProperty("status")) + if (!$util.isString(message.status)) + return "status: string expected"; + if (message.cluster != null && message.hasOwnProperty("cluster")) { + let error = $root.vtadmin.Cluster.verify(message.cluster); + if (error) + return "cluster." + error; + } + return null; + }; + + /** + * Creates a PingTabletResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.PingTabletResponse + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.PingTabletResponse} PingTabletResponse + */ + PingTabletResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.PingTabletResponse) + return object; + let message = new $root.vtadmin.PingTabletResponse(); + if (object.status != null) + message.status = String(object.status); + if (object.cluster != null) { + if (typeof object.cluster !== "object") + throw TypeError(".vtadmin.PingTabletResponse.cluster: object expected"); + message.cluster = $root.vtadmin.Cluster.fromObject(object.cluster); + } + return message; + }; + + /** + * Creates a plain object from a PingTabletResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.PingTabletResponse + * @static + * @param {vtadmin.PingTabletResponse} message PingTabletResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PingTabletResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.status = ""; + object.cluster = null; + } + if (message.status != null && message.hasOwnProperty("status")) + object.status = message.status; + if (message.cluster != null && message.hasOwnProperty("cluster")) + object.cluster = $root.vtadmin.Cluster.toObject(message.cluster, options); + return object; + }; + + /** + * Converts this PingTabletResponse to JSON. + * @function toJSON + * @memberof vtadmin.PingTabletResponse + * @instance + * @returns {Object.} JSON object + */ + PingTabletResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for PingTabletResponse + * @function getTypeUrl + * @memberof vtadmin.PingTabletResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + PingTabletResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.PingTabletResponse"; + }; + + return PingTabletResponse; + })(); + + vtadmin.PlannedFailoverShardRequest = (function() { + + /** + * Properties of a PlannedFailoverShardRequest. + * @memberof vtadmin + * @interface IPlannedFailoverShardRequest + * @property {string|null} [cluster_id] PlannedFailoverShardRequest cluster_id + * @property {vtctldata.IPlannedReparentShardRequest|null} [options] PlannedFailoverShardRequest options + */ + + /** + * Constructs a new PlannedFailoverShardRequest. + * @memberof vtadmin + * @classdesc Represents a PlannedFailoverShardRequest. + * @implements IPlannedFailoverShardRequest + * @constructor + * @param {vtadmin.IPlannedFailoverShardRequest=} [properties] Properties to set + */ + function PlannedFailoverShardRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PlannedFailoverShardRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.PlannedFailoverShardRequest + * @instance + */ + PlannedFailoverShardRequest.prototype.cluster_id = ""; + + /** + * PlannedFailoverShardRequest options. + * @member {vtctldata.IPlannedReparentShardRequest|null|undefined} options + * @memberof vtadmin.PlannedFailoverShardRequest + * @instance + */ + PlannedFailoverShardRequest.prototype.options = null; + + /** + * Creates a new PlannedFailoverShardRequest instance using the specified properties. + * @function create + * @memberof vtadmin.PlannedFailoverShardRequest + * @static + * @param {vtadmin.IPlannedFailoverShardRequest=} [properties] Properties to set + * @returns {vtadmin.PlannedFailoverShardRequest} PlannedFailoverShardRequest instance + */ + PlannedFailoverShardRequest.create = function create(properties) { + return new PlannedFailoverShardRequest(properties); + }; + + /** + * Encodes the specified PlannedFailoverShardRequest message. Does not implicitly {@link vtadmin.PlannedFailoverShardRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.PlannedFailoverShardRequest + * @static + * @param {vtadmin.IPlannedFailoverShardRequest} message PlannedFailoverShardRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PlannedFailoverShardRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.options != null && Object.hasOwnProperty.call(message, "options")) + $root.vtctldata.PlannedReparentShardRequest.encode(message.options, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified PlannedFailoverShardRequest message, length delimited. Does not implicitly {@link vtadmin.PlannedFailoverShardRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.PlannedFailoverShardRequest + * @static + * @param {vtadmin.IPlannedFailoverShardRequest} message PlannedFailoverShardRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PlannedFailoverShardRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PlannedFailoverShardRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.PlannedFailoverShardRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.PlannedFailoverShardRequest} PlannedFailoverShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PlannedFailoverShardRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.PlannedFailoverShardRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.cluster_id = reader.string(); + break; + } + case 2: { + message.options = $root.vtctldata.PlannedReparentShardRequest.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PlannedFailoverShardRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.PlannedFailoverShardRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.PlannedFailoverShardRequest} PlannedFailoverShardRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PlannedFailoverShardRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PlannedFailoverShardRequest message. + * @function verify + * @memberof vtadmin.PlannedFailoverShardRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PlannedFailoverShardRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.options != null && message.hasOwnProperty("options")) { + let error = $root.vtctldata.PlannedReparentShardRequest.verify(message.options); + if (error) + return "options." + error; + } + return null; + }; + + /** + * Creates a PlannedFailoverShardRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.PlannedFailoverShardRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.PlannedFailoverShardRequest} PlannedFailoverShardRequest + */ + PlannedFailoverShardRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.PlannedFailoverShardRequest) + return object; + let message = new $root.vtadmin.PlannedFailoverShardRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.options != null) { + if (typeof object.options !== "object") + throw TypeError(".vtadmin.PlannedFailoverShardRequest.options: object expected"); + message.options = $root.vtctldata.PlannedReparentShardRequest.fromObject(object.options); + } + return message; + }; + + /** + * Creates a plain object from a PlannedFailoverShardRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.PlannedFailoverShardRequest + * @static + * @param {vtadmin.PlannedFailoverShardRequest} message PlannedFailoverShardRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PlannedFailoverShardRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.cluster_id = ""; + object.options = null; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.options != null && message.hasOwnProperty("options")) + object.options = $root.vtctldata.PlannedReparentShardRequest.toObject(message.options, options); + return object; + }; + + /** + * Converts this PlannedFailoverShardRequest to JSON. + * @function toJSON + * @memberof vtadmin.PlannedFailoverShardRequest + * @instance + * @returns {Object.} JSON object + */ + PlannedFailoverShardRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for PlannedFailoverShardRequest + * @function getTypeUrl + * @memberof vtadmin.PlannedFailoverShardRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + PlannedFailoverShardRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.PlannedFailoverShardRequest"; + }; + + return PlannedFailoverShardRequest; + })(); + + vtadmin.PlannedFailoverShardResponse = (function() { + + /** + * Properties of a PlannedFailoverShardResponse. + * @memberof vtadmin + * @interface IPlannedFailoverShardResponse + * @property {vtadmin.ICluster|null} [cluster] PlannedFailoverShardResponse cluster + * @property {string|null} [keyspace] PlannedFailoverShardResponse keyspace + * @property {string|null} [shard] PlannedFailoverShardResponse shard + * @property {topodata.ITabletAlias|null} [promoted_primary] PlannedFailoverShardResponse promoted_primary + * @property {Array.|null} [events] PlannedFailoverShardResponse events + */ + + /** + * Constructs a new PlannedFailoverShardResponse. + * @memberof vtadmin + * @classdesc Represents a PlannedFailoverShardResponse. + * @implements IPlannedFailoverShardResponse + * @constructor + * @param {vtadmin.IPlannedFailoverShardResponse=} [properties] Properties to set + */ + function PlannedFailoverShardResponse(properties) { + this.events = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PlannedFailoverShardResponse cluster. + * @member {vtadmin.ICluster|null|undefined} cluster + * @memberof vtadmin.PlannedFailoverShardResponse + * @instance + */ + PlannedFailoverShardResponse.prototype.cluster = null; + + /** + * PlannedFailoverShardResponse keyspace. + * @member {string} keyspace + * @memberof vtadmin.PlannedFailoverShardResponse + * @instance + */ + PlannedFailoverShardResponse.prototype.keyspace = ""; + + /** + * PlannedFailoverShardResponse shard. + * @member {string} shard + * @memberof vtadmin.PlannedFailoverShardResponse + * @instance + */ + PlannedFailoverShardResponse.prototype.shard = ""; + + /** + * PlannedFailoverShardResponse promoted_primary. + * @member {topodata.ITabletAlias|null|undefined} promoted_primary + * @memberof vtadmin.PlannedFailoverShardResponse + * @instance + */ + PlannedFailoverShardResponse.prototype.promoted_primary = null; + + /** + * PlannedFailoverShardResponse events. + * @member {Array.} events + * @memberof vtadmin.PlannedFailoverShardResponse + * @instance */ PlannedFailoverShardResponse.prototype.events = $util.emptyArray; @@ -26075,6 +28928,238 @@ export const vtadmin = $root.vtadmin = (() => { return RunHealthCheckResponse; })(); + vtadmin.ReshardCreateRequest = (function() { + + /** + * Properties of a ReshardCreateRequest. + * @memberof vtadmin + * @interface IReshardCreateRequest + * @property {string|null} [cluster_id] ReshardCreateRequest cluster_id + * @property {vtctldata.IReshardCreateRequest|null} [request] ReshardCreateRequest request + */ + + /** + * Constructs a new ReshardCreateRequest. + * @memberof vtadmin + * @classdesc Represents a ReshardCreateRequest. + * @implements IReshardCreateRequest + * @constructor + * @param {vtadmin.IReshardCreateRequest=} [properties] Properties to set + */ + function ReshardCreateRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ReshardCreateRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.ReshardCreateRequest + * @instance + */ + ReshardCreateRequest.prototype.cluster_id = ""; + + /** + * ReshardCreateRequest request. + * @member {vtctldata.IReshardCreateRequest|null|undefined} request + * @memberof vtadmin.ReshardCreateRequest + * @instance + */ + ReshardCreateRequest.prototype.request = null; + + /** + * Creates a new ReshardCreateRequest instance using the specified properties. + * @function create + * @memberof vtadmin.ReshardCreateRequest + * @static + * @param {vtadmin.IReshardCreateRequest=} [properties] Properties to set + * @returns {vtadmin.ReshardCreateRequest} ReshardCreateRequest instance + */ + ReshardCreateRequest.create = function create(properties) { + return new ReshardCreateRequest(properties); + }; + + /** + * Encodes the specified ReshardCreateRequest message. Does not implicitly {@link vtadmin.ReshardCreateRequest.verify|verify} messages. + * @function encode + * @memberof vtadmin.ReshardCreateRequest + * @static + * @param {vtadmin.IReshardCreateRequest} message ReshardCreateRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ReshardCreateRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.request != null && Object.hasOwnProperty.call(message, "request")) + $root.vtctldata.ReshardCreateRequest.encode(message.request, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ReshardCreateRequest message, length delimited. Does not implicitly {@link vtadmin.ReshardCreateRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtadmin.ReshardCreateRequest + * @static + * @param {vtadmin.IReshardCreateRequest} message ReshardCreateRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ReshardCreateRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ReshardCreateRequest message from the specified reader or buffer. + * @function decode + * @memberof vtadmin.ReshardCreateRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtadmin.ReshardCreateRequest} ReshardCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ReshardCreateRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.ReshardCreateRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.cluster_id = reader.string(); + break; + } + case 2: { + message.request = $root.vtctldata.ReshardCreateRequest.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ReshardCreateRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtadmin.ReshardCreateRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtadmin.ReshardCreateRequest} ReshardCreateRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ReshardCreateRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ReshardCreateRequest message. + * @function verify + * @memberof vtadmin.ReshardCreateRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ReshardCreateRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.request != null && message.hasOwnProperty("request")) { + let error = $root.vtctldata.ReshardCreateRequest.verify(message.request); + if (error) + return "request." + error; + } + return null; + }; + + /** + * Creates a ReshardCreateRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtadmin.ReshardCreateRequest + * @static + * @param {Object.} object Plain object + * @returns {vtadmin.ReshardCreateRequest} ReshardCreateRequest + */ + ReshardCreateRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.ReshardCreateRequest) + return object; + let message = new $root.vtadmin.ReshardCreateRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.request != null) { + if (typeof object.request !== "object") + throw TypeError(".vtadmin.ReshardCreateRequest.request: object expected"); + message.request = $root.vtctldata.ReshardCreateRequest.fromObject(object.request); + } + return message; + }; + + /** + * Creates a plain object from a ReshardCreateRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtadmin.ReshardCreateRequest + * @static + * @param {vtadmin.ReshardCreateRequest} message ReshardCreateRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ReshardCreateRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.cluster_id = ""; + object.request = null; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.request != null && message.hasOwnProperty("request")) + object.request = $root.vtctldata.ReshardCreateRequest.toObject(message.request, options); + return object; + }; + + /** + * Converts this ReshardCreateRequest to JSON. + * @function toJSON + * @memberof vtadmin.ReshardCreateRequest + * @instance + * @returns {Object.} JSON object + */ + ReshardCreateRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ReshardCreateRequest + * @function getTypeUrl + * @memberof vtadmin.ReshardCreateRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ReshardCreateRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtadmin.ReshardCreateRequest"; + }; + + return ReshardCreateRequest; + })(); + vtadmin.SetReadOnlyRequest = (function() { /** @@ -30142,26 +33227,25 @@ export const vtadmin = $root.vtadmin = (() => { return ValidateVersionShardRequest; })(); - vtadmin.VTExplainRequest = (function() { + vtadmin.VDiffCreateRequest = (function() { /** - * Properties of a VTExplainRequest. + * Properties of a VDiffCreateRequest. * @memberof vtadmin - * @interface IVTExplainRequest - * @property {string|null} [cluster] VTExplainRequest cluster - * @property {string|null} [keyspace] VTExplainRequest keyspace - * @property {string|null} [sql] VTExplainRequest sql + * @interface IVDiffCreateRequest + * @property {string|null} [cluster_id] VDiffCreateRequest cluster_id + * @property {vtctldata.IVDiffCreateRequest|null} [request] VDiffCreateRequest request */ /** - * Constructs a new VTExplainRequest. + * Constructs a new VDiffCreateRequest. * @memberof vtadmin - * @classdesc Represents a VTExplainRequest. - * @implements IVTExplainRequest + * @classdesc Represents a VDiffCreateRequest. + * @implements IVDiffCreateRequest * @constructor - * @param {vtadmin.IVTExplainRequest=} [properties] Properties to set + * @param {vtadmin.IVDiffCreateRequest=} [properties] Properties to set */ - function VTExplainRequest(properties) { + function VDiffCreateRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -30169,103 +33253,89 @@ export const vtadmin = $root.vtadmin = (() => { } /** - * VTExplainRequest cluster. - * @member {string} cluster - * @memberof vtadmin.VTExplainRequest - * @instance - */ - VTExplainRequest.prototype.cluster = ""; - - /** - * VTExplainRequest keyspace. - * @member {string} keyspace - * @memberof vtadmin.VTExplainRequest + * VDiffCreateRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.VDiffCreateRequest * @instance */ - VTExplainRequest.prototype.keyspace = ""; + VDiffCreateRequest.prototype.cluster_id = ""; /** - * VTExplainRequest sql. - * @member {string} sql - * @memberof vtadmin.VTExplainRequest + * VDiffCreateRequest request. + * @member {vtctldata.IVDiffCreateRequest|null|undefined} request + * @memberof vtadmin.VDiffCreateRequest * @instance */ - VTExplainRequest.prototype.sql = ""; + VDiffCreateRequest.prototype.request = null; /** - * Creates a new VTExplainRequest instance using the specified properties. + * Creates a new VDiffCreateRequest instance using the specified properties. * @function create - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @static - * @param {vtadmin.IVTExplainRequest=} [properties] Properties to set - * @returns {vtadmin.VTExplainRequest} VTExplainRequest instance + * @param {vtadmin.IVDiffCreateRequest=} [properties] Properties to set + * @returns {vtadmin.VDiffCreateRequest} VDiffCreateRequest instance */ - VTExplainRequest.create = function create(properties) { - return new VTExplainRequest(properties); + VDiffCreateRequest.create = function create(properties) { + return new VDiffCreateRequest(properties); }; /** - * Encodes the specified VTExplainRequest message. Does not implicitly {@link vtadmin.VTExplainRequest.verify|verify} messages. + * Encodes the specified VDiffCreateRequest message. Does not implicitly {@link vtadmin.VDiffCreateRequest.verify|verify} messages. * @function encode - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @static - * @param {vtadmin.IVTExplainRequest} message VTExplainRequest message or plain object to encode + * @param {vtadmin.IVDiffCreateRequest} message VDiffCreateRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - VTExplainRequest.encode = function encode(message, writer) { + VDiffCreateRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.cluster != null && Object.hasOwnProperty.call(message, "cluster")) - writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster); - if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.keyspace); - if (message.sql != null && Object.hasOwnProperty.call(message, "sql")) - writer.uint32(/* id 3, wireType 2 =*/26).string(message.sql); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.request != null && Object.hasOwnProperty.call(message, "request")) + $root.vtctldata.VDiffCreateRequest.encode(message.request, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); return writer; }; /** - * Encodes the specified VTExplainRequest message, length delimited. Does not implicitly {@link vtadmin.VTExplainRequest.verify|verify} messages. + * Encodes the specified VDiffCreateRequest message, length delimited. Does not implicitly {@link vtadmin.VDiffCreateRequest.verify|verify} messages. * @function encodeDelimited - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @static - * @param {vtadmin.IVTExplainRequest} message VTExplainRequest message or plain object to encode + * @param {vtadmin.IVDiffCreateRequest} message VDiffCreateRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - VTExplainRequest.encodeDelimited = function encodeDelimited(message, writer) { + VDiffCreateRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a VTExplainRequest message from the specified reader or buffer. + * Decodes a VDiffCreateRequest message from the specified reader or buffer. * @function decode - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {vtadmin.VTExplainRequest} VTExplainRequest + * @returns {vtadmin.VDiffCreateRequest} VDiffCreateRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - VTExplainRequest.decode = function decode(reader, length) { + VDiffCreateRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.VTExplainRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.VDiffCreateRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.cluster = reader.string(); + message.cluster_id = reader.string(); break; } case 2: { - message.keyspace = reader.string(); - break; - } - case 3: { - message.sql = reader.string(); + message.request = $root.vtctldata.VDiffCreateRequest.decode(reader, reader.uint32()); break; } default: @@ -30277,139 +33347,137 @@ export const vtadmin = $root.vtadmin = (() => { }; /** - * Decodes a VTExplainRequest message from the specified reader or buffer, length delimited. + * Decodes a VDiffCreateRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {vtadmin.VTExplainRequest} VTExplainRequest + * @returns {vtadmin.VDiffCreateRequest} VDiffCreateRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - VTExplainRequest.decodeDelimited = function decodeDelimited(reader) { + VDiffCreateRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a VTExplainRequest message. + * Verifies a VDiffCreateRequest message. * @function verify - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - VTExplainRequest.verify = function verify(message) { + VDiffCreateRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.cluster != null && message.hasOwnProperty("cluster")) - if (!$util.isString(message.cluster)) - return "cluster: string expected"; - if (message.keyspace != null && message.hasOwnProperty("keyspace")) - if (!$util.isString(message.keyspace)) - return "keyspace: string expected"; - if (message.sql != null && message.hasOwnProperty("sql")) - if (!$util.isString(message.sql)) - return "sql: string expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.request != null && message.hasOwnProperty("request")) { + let error = $root.vtctldata.VDiffCreateRequest.verify(message.request); + if (error) + return "request." + error; + } return null; }; /** - * Creates a VTExplainRequest message from a plain object. Also converts values to their respective internal types. + * Creates a VDiffCreateRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @static * @param {Object.} object Plain object - * @returns {vtadmin.VTExplainRequest} VTExplainRequest + * @returns {vtadmin.VDiffCreateRequest} VDiffCreateRequest */ - VTExplainRequest.fromObject = function fromObject(object) { - if (object instanceof $root.vtadmin.VTExplainRequest) + VDiffCreateRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.VDiffCreateRequest) return object; - let message = new $root.vtadmin.VTExplainRequest(); - if (object.cluster != null) - message.cluster = String(object.cluster); - if (object.keyspace != null) - message.keyspace = String(object.keyspace); - if (object.sql != null) - message.sql = String(object.sql); + let message = new $root.vtadmin.VDiffCreateRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.request != null) { + if (typeof object.request !== "object") + throw TypeError(".vtadmin.VDiffCreateRequest.request: object expected"); + message.request = $root.vtctldata.VDiffCreateRequest.fromObject(object.request); + } return message; }; /** - * Creates a plain object from a VTExplainRequest message. Also converts values to other types if specified. + * Creates a plain object from a VDiffCreateRequest message. Also converts values to other types if specified. * @function toObject - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @static - * @param {vtadmin.VTExplainRequest} message VTExplainRequest + * @param {vtadmin.VDiffCreateRequest} message VDiffCreateRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - VTExplainRequest.toObject = function toObject(message, options) { + VDiffCreateRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; if (options.defaults) { - object.cluster = ""; - object.keyspace = ""; - object.sql = ""; + object.cluster_id = ""; + object.request = null; } - if (message.cluster != null && message.hasOwnProperty("cluster")) - object.cluster = message.cluster; - if (message.keyspace != null && message.hasOwnProperty("keyspace")) - object.keyspace = message.keyspace; - if (message.sql != null && message.hasOwnProperty("sql")) - object.sql = message.sql; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.request != null && message.hasOwnProperty("request")) + object.request = $root.vtctldata.VDiffCreateRequest.toObject(message.request, options); return object; }; /** - * Converts this VTExplainRequest to JSON. + * Converts this VDiffCreateRequest to JSON. * @function toJSON - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @instance * @returns {Object.} JSON object */ - VTExplainRequest.prototype.toJSON = function toJSON() { + VDiffCreateRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for VTExplainRequest + * Gets the default type url for VDiffCreateRequest * @function getTypeUrl - * @memberof vtadmin.VTExplainRequest + * @memberof vtadmin.VDiffCreateRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - VTExplainRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + VDiffCreateRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/vtadmin.VTExplainRequest"; + return typeUrlPrefix + "/vtadmin.VDiffCreateRequest"; }; - return VTExplainRequest; + return VDiffCreateRequest; })(); - vtadmin.VTExplainResponse = (function() { + vtadmin.VDiffShowRequest = (function() { /** - * Properties of a VTExplainResponse. + * Properties of a VDiffShowRequest. * @memberof vtadmin - * @interface IVTExplainResponse - * @property {string|null} [response] VTExplainResponse response + * @interface IVDiffShowRequest + * @property {string|null} [cluster_id] VDiffShowRequest cluster_id + * @property {vtctldata.IVDiffShowRequest|null} [request] VDiffShowRequest request */ /** - * Constructs a new VTExplainResponse. + * Constructs a new VDiffShowRequest. * @memberof vtadmin - * @classdesc Represents a VTExplainResponse. - * @implements IVTExplainResponse + * @classdesc Represents a VDiffShowRequest. + * @implements IVDiffShowRequest * @constructor - * @param {vtadmin.IVTExplainResponse=} [properties] Properties to set + * @param {vtadmin.IVDiffShowRequest=} [properties] Properties to set */ - function VTExplainResponse(properties) { + function VDiffShowRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -30417,75 +33485,89 @@ export const vtadmin = $root.vtadmin = (() => { } /** - * VTExplainResponse response. - * @member {string} response - * @memberof vtadmin.VTExplainResponse + * VDiffShowRequest cluster_id. + * @member {string} cluster_id + * @memberof vtadmin.VDiffShowRequest * @instance */ - VTExplainResponse.prototype.response = ""; + VDiffShowRequest.prototype.cluster_id = ""; /** - * Creates a new VTExplainResponse instance using the specified properties. + * VDiffShowRequest request. + * @member {vtctldata.IVDiffShowRequest|null|undefined} request + * @memberof vtadmin.VDiffShowRequest + * @instance + */ + VDiffShowRequest.prototype.request = null; + + /** + * Creates a new VDiffShowRequest instance using the specified properties. * @function create - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @static - * @param {vtadmin.IVTExplainResponse=} [properties] Properties to set - * @returns {vtadmin.VTExplainResponse} VTExplainResponse instance + * @param {vtadmin.IVDiffShowRequest=} [properties] Properties to set + * @returns {vtadmin.VDiffShowRequest} VDiffShowRequest instance */ - VTExplainResponse.create = function create(properties) { - return new VTExplainResponse(properties); + VDiffShowRequest.create = function create(properties) { + return new VDiffShowRequest(properties); }; /** - * Encodes the specified VTExplainResponse message. Does not implicitly {@link vtadmin.VTExplainResponse.verify|verify} messages. + * Encodes the specified VDiffShowRequest message. Does not implicitly {@link vtadmin.VDiffShowRequest.verify|verify} messages. * @function encode - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @static - * @param {vtadmin.IVTExplainResponse} message VTExplainResponse message or plain object to encode + * @param {vtadmin.IVDiffShowRequest} message VDiffShowRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - VTExplainResponse.encode = function encode(message, writer) { + VDiffShowRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.response != null && Object.hasOwnProperty.call(message, "response")) - writer.uint32(/* id 1, wireType 2 =*/10).string(message.response); + if (message.cluster_id != null && Object.hasOwnProperty.call(message, "cluster_id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster_id); + if (message.request != null && Object.hasOwnProperty.call(message, "request")) + $root.vtctldata.VDiffShowRequest.encode(message.request, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); return writer; }; /** - * Encodes the specified VTExplainResponse message, length delimited. Does not implicitly {@link vtadmin.VTExplainResponse.verify|verify} messages. + * Encodes the specified VDiffShowRequest message, length delimited. Does not implicitly {@link vtadmin.VDiffShowRequest.verify|verify} messages. * @function encodeDelimited - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @static - * @param {vtadmin.IVTExplainResponse} message VTExplainResponse message or plain object to encode + * @param {vtadmin.IVDiffShowRequest} message VDiffShowRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - VTExplainResponse.encodeDelimited = function encodeDelimited(message, writer) { + VDiffShowRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a VTExplainResponse message from the specified reader or buffer. + * Decodes a VDiffShowRequest message from the specified reader or buffer. * @function decode - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {vtadmin.VTExplainResponse} VTExplainResponse + * @returns {vtadmin.VDiffShowRequest} VDiffShowRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - VTExplainResponse.decode = function decode(reader, length) { + VDiffShowRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.VTExplainResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.VDiffShowRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.response = reader.string(); + message.cluster_id = reader.string(); + break; + } + case 2: { + message.request = $root.vtctldata.VDiffShowRequest.decode(reader, reader.uint32()); break; } default: @@ -30497,156 +33579,137 @@ export const vtadmin = $root.vtadmin = (() => { }; /** - * Decodes a VTExplainResponse message from the specified reader or buffer, length delimited. + * Decodes a VDiffShowRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {vtadmin.VTExplainResponse} VTExplainResponse + * @returns {vtadmin.VDiffShowRequest} VDiffShowRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - VTExplainResponse.decodeDelimited = function decodeDelimited(reader) { + VDiffShowRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a VTExplainResponse message. + * Verifies a VDiffShowRequest message. * @function verify - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - VTExplainResponse.verify = function verify(message) { + VDiffShowRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.response != null && message.hasOwnProperty("response")) - if (!$util.isString(message.response)) - return "response: string expected"; + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + if (!$util.isString(message.cluster_id)) + return "cluster_id: string expected"; + if (message.request != null && message.hasOwnProperty("request")) { + let error = $root.vtctldata.VDiffShowRequest.verify(message.request); + if (error) + return "request." + error; + } return null; }; /** - * Creates a VTExplainResponse message from a plain object. Also converts values to their respective internal types. + * Creates a VDiffShowRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @static * @param {Object.} object Plain object - * @returns {vtadmin.VTExplainResponse} VTExplainResponse + * @returns {vtadmin.VDiffShowRequest} VDiffShowRequest */ - VTExplainResponse.fromObject = function fromObject(object) { - if (object instanceof $root.vtadmin.VTExplainResponse) + VDiffShowRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.VDiffShowRequest) return object; - let message = new $root.vtadmin.VTExplainResponse(); - if (object.response != null) - message.response = String(object.response); + let message = new $root.vtadmin.VDiffShowRequest(); + if (object.cluster_id != null) + message.cluster_id = String(object.cluster_id); + if (object.request != null) { + if (typeof object.request !== "object") + throw TypeError(".vtadmin.VDiffShowRequest.request: object expected"); + message.request = $root.vtctldata.VDiffShowRequest.fromObject(object.request); + } return message; }; /** - * Creates a plain object from a VTExplainResponse message. Also converts values to other types if specified. + * Creates a plain object from a VDiffShowRequest message. Also converts values to other types if specified. * @function toObject - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @static - * @param {vtadmin.VTExplainResponse} message VTExplainResponse + * @param {vtadmin.VDiffShowRequest} message VDiffShowRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - VTExplainResponse.toObject = function toObject(message, options) { + VDiffShowRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; - if (options.defaults) - object.response = ""; - if (message.response != null && message.hasOwnProperty("response")) - object.response = message.response; + if (options.defaults) { + object.cluster_id = ""; + object.request = null; + } + if (message.cluster_id != null && message.hasOwnProperty("cluster_id")) + object.cluster_id = message.cluster_id; + if (message.request != null && message.hasOwnProperty("request")) + object.request = $root.vtctldata.VDiffShowRequest.toObject(message.request, options); return object; }; /** - * Converts this VTExplainResponse to JSON. + * Converts this VDiffShowRequest to JSON. * @function toJSON - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @instance * @returns {Object.} JSON object */ - VTExplainResponse.prototype.toJSON = function toJSON() { + VDiffShowRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for VTExplainResponse + * Gets the default type url for VDiffShowRequest * @function getTypeUrl - * @memberof vtadmin.VTExplainResponse + * @memberof vtadmin.VDiffShowRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - VTExplainResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + VDiffShowRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/vtadmin.VTExplainResponse"; + return typeUrlPrefix + "/vtadmin.VDiffShowRequest"; }; - return VTExplainResponse; - })(); - - return vtadmin; -})(); - -export const logutil = $root.logutil = (() => { - - /** - * Namespace logutil. - * @exports logutil - * @namespace - */ - const logutil = {}; - - /** - * Level enum. - * @name logutil.Level - * @enum {number} - * @property {number} INFO=0 INFO value - * @property {number} WARNING=1 WARNING value - * @property {number} ERROR=2 ERROR value - * @property {number} CONSOLE=3 CONSOLE value - */ - logutil.Level = (function() { - const valuesById = {}, values = Object.create(valuesById); - values[valuesById[0] = "INFO"] = 0; - values[valuesById[1] = "WARNING"] = 1; - values[valuesById[2] = "ERROR"] = 2; - values[valuesById[3] = "CONSOLE"] = 3; - return values; + return VDiffShowRequest; })(); - logutil.Event = (function() { + vtadmin.VDiffProgress = (function() { /** - * Properties of an Event. - * @memberof logutil - * @interface IEvent - * @property {vttime.ITime|null} [time] Event time - * @property {logutil.Level|null} [level] Event level - * @property {string|null} [file] Event file - * @property {number|Long|null} [line] Event line - * @property {string|null} [value] Event value + * Properties of a VDiffProgress. + * @memberof vtadmin + * @interface IVDiffProgress + * @property {number|null} [percentage] VDiffProgress percentage + * @property {string|null} [eta] VDiffProgress eta */ /** - * Constructs a new Event. - * @memberof logutil - * @classdesc Represents an Event. - * @implements IEvent + * Constructs a new VDiffProgress. + * @memberof vtadmin + * @classdesc Represents a VDiffProgress. + * @implements IVDiffProgress * @constructor - * @param {logutil.IEvent=} [properties] Properties to set + * @param {vtadmin.IVDiffProgress=} [properties] Properties to set */ - function Event(properties) { + function VDiffProgress(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -30654,131 +33717,89 @@ export const logutil = $root.logutil = (() => { } /** - * Event time. - * @member {vttime.ITime|null|undefined} time - * @memberof logutil.Event - * @instance - */ - Event.prototype.time = null; - - /** - * Event level. - * @member {logutil.Level} level - * @memberof logutil.Event - * @instance - */ - Event.prototype.level = 0; - - /** - * Event file. - * @member {string} file - * @memberof logutil.Event - * @instance - */ - Event.prototype.file = ""; - - /** - * Event line. - * @member {number|Long} line - * @memberof logutil.Event + * VDiffProgress percentage. + * @member {number} percentage + * @memberof vtadmin.VDiffProgress * @instance */ - Event.prototype.line = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + VDiffProgress.prototype.percentage = 0; /** - * Event value. - * @member {string} value - * @memberof logutil.Event + * VDiffProgress eta. + * @member {string} eta + * @memberof vtadmin.VDiffProgress * @instance */ - Event.prototype.value = ""; + VDiffProgress.prototype.eta = ""; /** - * Creates a new Event instance using the specified properties. + * Creates a new VDiffProgress instance using the specified properties. * @function create - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @static - * @param {logutil.IEvent=} [properties] Properties to set - * @returns {logutil.Event} Event instance + * @param {vtadmin.IVDiffProgress=} [properties] Properties to set + * @returns {vtadmin.VDiffProgress} VDiffProgress instance */ - Event.create = function create(properties) { - return new Event(properties); + VDiffProgress.create = function create(properties) { + return new VDiffProgress(properties); }; /** - * Encodes the specified Event message. Does not implicitly {@link logutil.Event.verify|verify} messages. + * Encodes the specified VDiffProgress message. Does not implicitly {@link vtadmin.VDiffProgress.verify|verify} messages. * @function encode - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @static - * @param {logutil.IEvent} message Event message or plain object to encode + * @param {vtadmin.IVDiffProgress} message VDiffProgress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Event.encode = function encode(message, writer) { + VDiffProgress.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.time != null && Object.hasOwnProperty.call(message, "time")) - $root.vttime.Time.encode(message.time, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - if (message.level != null && Object.hasOwnProperty.call(message, "level")) - writer.uint32(/* id 2, wireType 0 =*/16).int32(message.level); - if (message.file != null && Object.hasOwnProperty.call(message, "file")) - writer.uint32(/* id 3, wireType 2 =*/26).string(message.file); - if (message.line != null && Object.hasOwnProperty.call(message, "line")) - writer.uint32(/* id 4, wireType 0 =*/32).int64(message.line); - if (message.value != null && Object.hasOwnProperty.call(message, "value")) - writer.uint32(/* id 5, wireType 2 =*/42).string(message.value); + if (message.percentage != null && Object.hasOwnProperty.call(message, "percentage")) + writer.uint32(/* id 1, wireType 1 =*/9).double(message.percentage); + if (message.eta != null && Object.hasOwnProperty.call(message, "eta")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.eta); return writer; }; /** - * Encodes the specified Event message, length delimited. Does not implicitly {@link logutil.Event.verify|verify} messages. + * Encodes the specified VDiffProgress message, length delimited. Does not implicitly {@link vtadmin.VDiffProgress.verify|verify} messages. * @function encodeDelimited - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @static - * @param {logutil.IEvent} message Event message or plain object to encode + * @param {vtadmin.IVDiffProgress} message VDiffProgress message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Event.encodeDelimited = function encodeDelimited(message, writer) { + VDiffProgress.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an Event message from the specified reader or buffer. + * Decodes a VDiffProgress message from the specified reader or buffer. * @function decode - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {logutil.Event} Event + * @returns {vtadmin.VDiffProgress} VDiffProgress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Event.decode = function decode(reader, length) { + VDiffProgress.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.logutil.Event(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.VDiffProgress(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.time = $root.vttime.Time.decode(reader, reader.uint32()); + message.percentage = reader.double(); break; } case 2: { - message.level = reader.int32(); - break; - } - case 3: { - message.file = reader.string(); - break; - } - case 4: { - message.line = reader.int64(); - break; - } - case 5: { - message.value = reader.string(); + message.eta = reader.string(); break; } default: @@ -30790,216 +33811,136 @@ export const logutil = $root.logutil = (() => { }; /** - * Decodes an Event message from the specified reader or buffer, length delimited. + * Decodes a VDiffProgress message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {logutil.Event} Event + * @returns {vtadmin.VDiffProgress} VDiffProgress * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Event.decodeDelimited = function decodeDelimited(reader) { + VDiffProgress.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an Event message. + * Verifies a VDiffProgress message. * @function verify - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - Event.verify = function verify(message) { + VDiffProgress.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.time != null && message.hasOwnProperty("time")) { - let error = $root.vttime.Time.verify(message.time); - if (error) - return "time." + error; - } - if (message.level != null && message.hasOwnProperty("level")) - switch (message.level) { - default: - return "level: enum value expected"; - case 0: - case 1: - case 2: - case 3: - break; - } - if (message.file != null && message.hasOwnProperty("file")) - if (!$util.isString(message.file)) - return "file: string expected"; - if (message.line != null && message.hasOwnProperty("line")) - if (!$util.isInteger(message.line) && !(message.line && $util.isInteger(message.line.low) && $util.isInteger(message.line.high))) - return "line: integer|Long expected"; - if (message.value != null && message.hasOwnProperty("value")) - if (!$util.isString(message.value)) - return "value: string expected"; + if (message.percentage != null && message.hasOwnProperty("percentage")) + if (typeof message.percentage !== "number") + return "percentage: number expected"; + if (message.eta != null && message.hasOwnProperty("eta")) + if (!$util.isString(message.eta)) + return "eta: string expected"; return null; }; /** - * Creates an Event message from a plain object. Also converts values to their respective internal types. + * Creates a VDiffProgress message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @static * @param {Object.} object Plain object - * @returns {logutil.Event} Event + * @returns {vtadmin.VDiffProgress} VDiffProgress */ - Event.fromObject = function fromObject(object) { - if (object instanceof $root.logutil.Event) + VDiffProgress.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.VDiffProgress) return object; - let message = new $root.logutil.Event(); - if (object.time != null) { - if (typeof object.time !== "object") - throw TypeError(".logutil.Event.time: object expected"); - message.time = $root.vttime.Time.fromObject(object.time); - } - switch (object.level) { - default: - if (typeof object.level === "number") { - message.level = object.level; - break; - } - break; - case "INFO": - case 0: - message.level = 0; - break; - case "WARNING": - case 1: - message.level = 1; - break; - case "ERROR": - case 2: - message.level = 2; - break; - case "CONSOLE": - case 3: - message.level = 3; - break; - } - if (object.file != null) - message.file = String(object.file); - if (object.line != null) - if ($util.Long) - (message.line = $util.Long.fromValue(object.line)).unsigned = false; - else if (typeof object.line === "string") - message.line = parseInt(object.line, 10); - else if (typeof object.line === "number") - message.line = object.line; - else if (typeof object.line === "object") - message.line = new $util.LongBits(object.line.low >>> 0, object.line.high >>> 0).toNumber(); - if (object.value != null) - message.value = String(object.value); + let message = new $root.vtadmin.VDiffProgress(); + if (object.percentage != null) + message.percentage = Number(object.percentage); + if (object.eta != null) + message.eta = String(object.eta); return message; }; /** - * Creates a plain object from an Event message. Also converts values to other types if specified. + * Creates a plain object from a VDiffProgress message. Also converts values to other types if specified. * @function toObject - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @static - * @param {logutil.Event} message Event + * @param {vtadmin.VDiffProgress} message VDiffProgress * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - Event.toObject = function toObject(message, options) { + VDiffProgress.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; if (options.defaults) { - object.time = null; - object.level = options.enums === String ? "INFO" : 0; - object.file = ""; - if ($util.Long) { - let long = new $util.Long(0, 0, false); - object.line = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.line = options.longs === String ? "0" : 0; - object.value = ""; + object.percentage = 0; + object.eta = ""; } - if (message.time != null && message.hasOwnProperty("time")) - object.time = $root.vttime.Time.toObject(message.time, options); - if (message.level != null && message.hasOwnProperty("level")) - object.level = options.enums === String ? $root.logutil.Level[message.level] === undefined ? message.level : $root.logutil.Level[message.level] : message.level; - if (message.file != null && message.hasOwnProperty("file")) - object.file = message.file; - if (message.line != null && message.hasOwnProperty("line")) - if (typeof message.line === "number") - object.line = options.longs === String ? String(message.line) : message.line; - else - object.line = options.longs === String ? $util.Long.prototype.toString.call(message.line) : options.longs === Number ? new $util.LongBits(message.line.low >>> 0, message.line.high >>> 0).toNumber() : message.line; - if (message.value != null && message.hasOwnProperty("value")) - object.value = message.value; + if (message.percentage != null && message.hasOwnProperty("percentage")) + object.percentage = options.json && !isFinite(message.percentage) ? String(message.percentage) : message.percentage; + if (message.eta != null && message.hasOwnProperty("eta")) + object.eta = message.eta; return object; }; /** - * Converts this Event to JSON. + * Converts this VDiffProgress to JSON. * @function toJSON - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @instance * @returns {Object.} JSON object */ - Event.prototype.toJSON = function toJSON() { + VDiffProgress.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for Event + * Gets the default type url for VDiffProgress * @function getTypeUrl - * @memberof logutil.Event + * @memberof vtadmin.VDiffProgress * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - Event.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + VDiffProgress.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/logutil.Event"; + return typeUrlPrefix + "/vtadmin.VDiffProgress"; }; - return Event; + return VDiffProgress; })(); - return logutil; -})(); - -export const vttime = $root.vttime = (() => { - - /** - * Namespace vttime. - * @exports vttime - * @namespace - */ - const vttime = {}; - - vttime.Time = (function() { + vtadmin.VDiffShardReport = (function() { /** - * Properties of a Time. - * @memberof vttime - * @interface ITime - * @property {number|Long|null} [seconds] Time seconds - * @property {number|null} [nanoseconds] Time nanoseconds + * Properties of a VDiffShardReport. + * @memberof vtadmin + * @interface IVDiffShardReport + * @property {string|null} [state] VDiffShardReport state + * @property {number|Long|null} [rows_compared] VDiffShardReport rows_compared + * @property {boolean|null} [has_mismatch] VDiffShardReport has_mismatch + * @property {string|null} [started_at] VDiffShardReport started_at + * @property {string|null} [completed_at] VDiffShardReport completed_at + * @property {vtadmin.IVDiffProgress|null} [progress] VDiffShardReport progress */ /** - * Constructs a new Time. - * @memberof vttime - * @classdesc Represents a Time. - * @implements ITime + * Constructs a new VDiffShardReport. + * @memberof vtadmin + * @classdesc Represents a VDiffShardReport. + * @implements IVDiffShardReport * @constructor - * @param {vttime.ITime=} [properties] Properties to set + * @param {vtadmin.IVDiffShardReport=} [properties] Properties to set */ - function Time(properties) { + function VDiffShardReport(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -31007,89 +33948,145 @@ export const vttime = $root.vttime = (() => { } /** - * Time seconds. - * @member {number|Long} seconds - * @memberof vttime.Time + * VDiffShardReport state. + * @member {string} state + * @memberof vtadmin.VDiffShardReport * @instance */ - Time.prototype.seconds = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + VDiffShardReport.prototype.state = ""; /** - * Time nanoseconds. - * @member {number} nanoseconds - * @memberof vttime.Time + * VDiffShardReport rows_compared. + * @member {number|Long} rows_compared + * @memberof vtadmin.VDiffShardReport * @instance */ - Time.prototype.nanoseconds = 0; + VDiffShardReport.prototype.rows_compared = $util.Long ? $util.Long.fromBits(0,0,false) : 0; /** - * Creates a new Time instance using the specified properties. + * VDiffShardReport has_mismatch. + * @member {boolean} has_mismatch + * @memberof vtadmin.VDiffShardReport + * @instance + */ + VDiffShardReport.prototype.has_mismatch = false; + + /** + * VDiffShardReport started_at. + * @member {string} started_at + * @memberof vtadmin.VDiffShardReport + * @instance + */ + VDiffShardReport.prototype.started_at = ""; + + /** + * VDiffShardReport completed_at. + * @member {string} completed_at + * @memberof vtadmin.VDiffShardReport + * @instance + */ + VDiffShardReport.prototype.completed_at = ""; + + /** + * VDiffShardReport progress. + * @member {vtadmin.IVDiffProgress|null|undefined} progress + * @memberof vtadmin.VDiffShardReport + * @instance + */ + VDiffShardReport.prototype.progress = null; + + /** + * Creates a new VDiffShardReport instance using the specified properties. * @function create - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @static - * @param {vttime.ITime=} [properties] Properties to set - * @returns {vttime.Time} Time instance + * @param {vtadmin.IVDiffShardReport=} [properties] Properties to set + * @returns {vtadmin.VDiffShardReport} VDiffShardReport instance */ - Time.create = function create(properties) { - return new Time(properties); + VDiffShardReport.create = function create(properties) { + return new VDiffShardReport(properties); }; /** - * Encodes the specified Time message. Does not implicitly {@link vttime.Time.verify|verify} messages. + * Encodes the specified VDiffShardReport message. Does not implicitly {@link vtadmin.VDiffShardReport.verify|verify} messages. * @function encode - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @static - * @param {vttime.ITime} message Time message or plain object to encode + * @param {vtadmin.IVDiffShardReport} message VDiffShardReport message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Time.encode = function encode(message, writer) { + VDiffShardReport.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds")) - writer.uint32(/* id 1, wireType 0 =*/8).int64(message.seconds); - if (message.nanoseconds != null && Object.hasOwnProperty.call(message, "nanoseconds")) - writer.uint32(/* id 2, wireType 0 =*/16).int32(message.nanoseconds); + if (message.state != null && Object.hasOwnProperty.call(message, "state")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.state); + if (message.rows_compared != null && Object.hasOwnProperty.call(message, "rows_compared")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.rows_compared); + if (message.has_mismatch != null && Object.hasOwnProperty.call(message, "has_mismatch")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.has_mismatch); + if (message.started_at != null && Object.hasOwnProperty.call(message, "started_at")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.started_at); + if (message.completed_at != null && Object.hasOwnProperty.call(message, "completed_at")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.completed_at); + if (message.progress != null && Object.hasOwnProperty.call(message, "progress")) + $root.vtadmin.VDiffProgress.encode(message.progress, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); return writer; }; /** - * Encodes the specified Time message, length delimited. Does not implicitly {@link vttime.Time.verify|verify} messages. + * Encodes the specified VDiffShardReport message, length delimited. Does not implicitly {@link vtadmin.VDiffShardReport.verify|verify} messages. * @function encodeDelimited - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @static - * @param {vttime.ITime} message Time message or plain object to encode + * @param {vtadmin.IVDiffShardReport} message VDiffShardReport message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Time.encodeDelimited = function encodeDelimited(message, writer) { + VDiffShardReport.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a Time message from the specified reader or buffer. + * Decodes a VDiffShardReport message from the specified reader or buffer. * @function decode - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {vttime.Time} Time + * @returns {vtadmin.VDiffShardReport} VDiffShardReport * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Time.decode = function decode(reader, length) { + VDiffShardReport.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vttime.Time(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.VDiffShardReport(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.seconds = reader.int64(); + message.state = reader.string(); break; } case 2: { - message.nanoseconds = reader.int32(); + message.rows_compared = reader.int64(); + break; + } + case 3: { + message.has_mismatch = reader.bool(); + break; + } + case 4: { + message.started_at = reader.string(); + break; + } + case 5: { + message.completed_at = reader.string(); + break; + } + case 6: { + message.progress = $root.vtadmin.VDiffProgress.decode(reader, reader.uint32()); break; } default: @@ -31101,146 +34098,183 @@ export const vttime = $root.vttime = (() => { }; /** - * Decodes a Time message from the specified reader or buffer, length delimited. + * Decodes a VDiffShardReport message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {vttime.Time} Time + * @returns {vtadmin.VDiffShardReport} VDiffShardReport * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Time.decodeDelimited = function decodeDelimited(reader) { + VDiffShardReport.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a Time message. + * Verifies a VDiffShardReport message. * @function verify - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - Time.verify = function verify(message) { + VDiffShardReport.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.seconds != null && message.hasOwnProperty("seconds")) - if (!$util.isInteger(message.seconds) && !(message.seconds && $util.isInteger(message.seconds.low) && $util.isInteger(message.seconds.high))) - return "seconds: integer|Long expected"; - if (message.nanoseconds != null && message.hasOwnProperty("nanoseconds")) - if (!$util.isInteger(message.nanoseconds)) - return "nanoseconds: integer expected"; + if (message.state != null && message.hasOwnProperty("state")) + if (!$util.isString(message.state)) + return "state: string expected"; + if (message.rows_compared != null && message.hasOwnProperty("rows_compared")) + if (!$util.isInteger(message.rows_compared) && !(message.rows_compared && $util.isInteger(message.rows_compared.low) && $util.isInteger(message.rows_compared.high))) + return "rows_compared: integer|Long expected"; + if (message.has_mismatch != null && message.hasOwnProperty("has_mismatch")) + if (typeof message.has_mismatch !== "boolean") + return "has_mismatch: boolean expected"; + if (message.started_at != null && message.hasOwnProperty("started_at")) + if (!$util.isString(message.started_at)) + return "started_at: string expected"; + if (message.completed_at != null && message.hasOwnProperty("completed_at")) + if (!$util.isString(message.completed_at)) + return "completed_at: string expected"; + if (message.progress != null && message.hasOwnProperty("progress")) { + let error = $root.vtadmin.VDiffProgress.verify(message.progress); + if (error) + return "progress." + error; + } return null; }; /** - * Creates a Time message from a plain object. Also converts values to their respective internal types. + * Creates a VDiffShardReport message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @static * @param {Object.} object Plain object - * @returns {vttime.Time} Time + * @returns {vtadmin.VDiffShardReport} VDiffShardReport */ - Time.fromObject = function fromObject(object) { - if (object instanceof $root.vttime.Time) + VDiffShardReport.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.VDiffShardReport) return object; - let message = new $root.vttime.Time(); - if (object.seconds != null) + let message = new $root.vtadmin.VDiffShardReport(); + if (object.state != null) + message.state = String(object.state); + if (object.rows_compared != null) if ($util.Long) - (message.seconds = $util.Long.fromValue(object.seconds)).unsigned = false; - else if (typeof object.seconds === "string") - message.seconds = parseInt(object.seconds, 10); - else if (typeof object.seconds === "number") - message.seconds = object.seconds; - else if (typeof object.seconds === "object") - message.seconds = new $util.LongBits(object.seconds.low >>> 0, object.seconds.high >>> 0).toNumber(); - if (object.nanoseconds != null) - message.nanoseconds = object.nanoseconds | 0; + (message.rows_compared = $util.Long.fromValue(object.rows_compared)).unsigned = false; + else if (typeof object.rows_compared === "string") + message.rows_compared = parseInt(object.rows_compared, 10); + else if (typeof object.rows_compared === "number") + message.rows_compared = object.rows_compared; + else if (typeof object.rows_compared === "object") + message.rows_compared = new $util.LongBits(object.rows_compared.low >>> 0, object.rows_compared.high >>> 0).toNumber(); + if (object.has_mismatch != null) + message.has_mismatch = Boolean(object.has_mismatch); + if (object.started_at != null) + message.started_at = String(object.started_at); + if (object.completed_at != null) + message.completed_at = String(object.completed_at); + if (object.progress != null) { + if (typeof object.progress !== "object") + throw TypeError(".vtadmin.VDiffShardReport.progress: object expected"); + message.progress = $root.vtadmin.VDiffProgress.fromObject(object.progress); + } return message; }; /** - * Creates a plain object from a Time message. Also converts values to other types if specified. + * Creates a plain object from a VDiffShardReport message. Also converts values to other types if specified. * @function toObject - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @static - * @param {vttime.Time} message Time + * @param {vtadmin.VDiffShardReport} message VDiffShardReport * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - Time.toObject = function toObject(message, options) { + VDiffShardReport.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; if (options.defaults) { + object.state = ""; if ($util.Long) { let long = new $util.Long(0, 0, false); - object.seconds = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + object.rows_compared = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else - object.seconds = options.longs === String ? "0" : 0; - object.nanoseconds = 0; + object.rows_compared = options.longs === String ? "0" : 0; + object.has_mismatch = false; + object.started_at = ""; + object.completed_at = ""; + object.progress = null; } - if (message.seconds != null && message.hasOwnProperty("seconds")) - if (typeof message.seconds === "number") - object.seconds = options.longs === String ? String(message.seconds) : message.seconds; + if (message.state != null && message.hasOwnProperty("state")) + object.state = message.state; + if (message.rows_compared != null && message.hasOwnProperty("rows_compared")) + if (typeof message.rows_compared === "number") + object.rows_compared = options.longs === String ? String(message.rows_compared) : message.rows_compared; else - object.seconds = options.longs === String ? $util.Long.prototype.toString.call(message.seconds) : options.longs === Number ? new $util.LongBits(message.seconds.low >>> 0, message.seconds.high >>> 0).toNumber() : message.seconds; - if (message.nanoseconds != null && message.hasOwnProperty("nanoseconds")) - object.nanoseconds = message.nanoseconds; + object.rows_compared = options.longs === String ? $util.Long.prototype.toString.call(message.rows_compared) : options.longs === Number ? new $util.LongBits(message.rows_compared.low >>> 0, message.rows_compared.high >>> 0).toNumber() : message.rows_compared; + if (message.has_mismatch != null && message.hasOwnProperty("has_mismatch")) + object.has_mismatch = message.has_mismatch; + if (message.started_at != null && message.hasOwnProperty("started_at")) + object.started_at = message.started_at; + if (message.completed_at != null && message.hasOwnProperty("completed_at")) + object.completed_at = message.completed_at; + if (message.progress != null && message.hasOwnProperty("progress")) + object.progress = $root.vtadmin.VDiffProgress.toObject(message.progress, options); return object; }; /** - * Converts this Time to JSON. + * Converts this VDiffShardReport to JSON. * @function toJSON - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @instance * @returns {Object.} JSON object */ - Time.prototype.toJSON = function toJSON() { + VDiffShardReport.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for Time + * Gets the default type url for VDiffShardReport * @function getTypeUrl - * @memberof vttime.Time + * @memberof vtadmin.VDiffShardReport * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - Time.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + VDiffShardReport.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/vttime.Time"; + return typeUrlPrefix + "/vtadmin.VDiffShardReport"; }; - return Time; + return VDiffShardReport; })(); - vttime.Duration = (function() { + vtadmin.VDiffShowResponse = (function() { /** - * Properties of a Duration. - * @memberof vttime - * @interface IDuration - * @property {number|Long|null} [seconds] Duration seconds - * @property {number|null} [nanos] Duration nanos + * Properties of a VDiffShowResponse. + * @memberof vtadmin + * @interface IVDiffShowResponse + * @property {Object.|null} [shard_report] VDiffShowResponse shard_report */ /** - * Constructs a new Duration. - * @memberof vttime - * @classdesc Represents a Duration. - * @implements IDuration + * Constructs a new VDiffShowResponse. + * @memberof vtadmin + * @classdesc Represents a VDiffShowResponse. + * @implements IVDiffShowResponse * @constructor - * @param {vttime.IDuration=} [properties] Properties to set + * @param {vtadmin.IVDiffShowResponse=} [properties] Properties to set */ - function Duration(properties) { + function VDiffShowResponse(properties) { + this.shard_report = {}; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -31248,89 +34282,97 @@ export const vttime = $root.vttime = (() => { } /** - * Duration seconds. - * @member {number|Long} seconds - * @memberof vttime.Duration - * @instance - */ - Duration.prototype.seconds = $util.Long ? $util.Long.fromBits(0,0,false) : 0; - - /** - * Duration nanos. - * @member {number} nanos - * @memberof vttime.Duration + * VDiffShowResponse shard_report. + * @member {Object.} shard_report + * @memberof vtadmin.VDiffShowResponse * @instance */ - Duration.prototype.nanos = 0; + VDiffShowResponse.prototype.shard_report = $util.emptyObject; /** - * Creates a new Duration instance using the specified properties. + * Creates a new VDiffShowResponse instance using the specified properties. * @function create - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @static - * @param {vttime.IDuration=} [properties] Properties to set - * @returns {vttime.Duration} Duration instance + * @param {vtadmin.IVDiffShowResponse=} [properties] Properties to set + * @returns {vtadmin.VDiffShowResponse} VDiffShowResponse instance */ - Duration.create = function create(properties) { - return new Duration(properties); + VDiffShowResponse.create = function create(properties) { + return new VDiffShowResponse(properties); }; /** - * Encodes the specified Duration message. Does not implicitly {@link vttime.Duration.verify|verify} messages. + * Encodes the specified VDiffShowResponse message. Does not implicitly {@link vtadmin.VDiffShowResponse.verify|verify} messages. * @function encode - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @static - * @param {vttime.IDuration} message Duration message or plain object to encode + * @param {vtadmin.IVDiffShowResponse} message VDiffShowResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Duration.encode = function encode(message, writer) { + VDiffShowResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds")) - writer.uint32(/* id 1, wireType 0 =*/8).int64(message.seconds); - if (message.nanos != null && Object.hasOwnProperty.call(message, "nanos")) - writer.uint32(/* id 2, wireType 0 =*/16).int32(message.nanos); + if (message.shard_report != null && Object.hasOwnProperty.call(message, "shard_report")) + for (let keys = Object.keys(message.shard_report), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); + $root.vtadmin.VDiffShardReport.encode(message.shard_report[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } return writer; }; /** - * Encodes the specified Duration message, length delimited. Does not implicitly {@link vttime.Duration.verify|verify} messages. + * Encodes the specified VDiffShowResponse message, length delimited. Does not implicitly {@link vtadmin.VDiffShowResponse.verify|verify} messages. * @function encodeDelimited - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @static - * @param {vttime.IDuration} message Duration message or plain object to encode + * @param {vtadmin.IVDiffShowResponse} message VDiffShowResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Duration.encodeDelimited = function encodeDelimited(message, writer) { + VDiffShowResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a Duration message from the specified reader or buffer. + * Decodes a VDiffShowResponse message from the specified reader or buffer. * @function decode - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {vttime.Duration} Duration + * @returns {vtadmin.VDiffShowResponse} VDiffShowResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Duration.decode = function decode(reader, length) { + VDiffShowResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vttime.Duration(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.VDiffShowResponse(), key, value; while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.seconds = reader.int64(); - break; - } - case 2: { - message.nanos = reader.int32(); + if (message.shard_report === $util.emptyObject) + message.shard_report = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.vtadmin.VDiffShardReport.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.shard_report[key] = value; break; } default: @@ -31342,158 +34384,143 @@ export const vttime = $root.vttime = (() => { }; /** - * Decodes a Duration message from the specified reader or buffer, length delimited. + * Decodes a VDiffShowResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {vttime.Duration} Duration + * @returns {vtadmin.VDiffShowResponse} VDiffShowResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Duration.decodeDelimited = function decodeDelimited(reader) { + VDiffShowResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a Duration message. + * Verifies a VDiffShowResponse message. * @function verify - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - Duration.verify = function verify(message) { + VDiffShowResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.seconds != null && message.hasOwnProperty("seconds")) - if (!$util.isInteger(message.seconds) && !(message.seconds && $util.isInteger(message.seconds.low) && $util.isInteger(message.seconds.high))) - return "seconds: integer|Long expected"; - if (message.nanos != null && message.hasOwnProperty("nanos")) - if (!$util.isInteger(message.nanos)) - return "nanos: integer expected"; + if (message.shard_report != null && message.hasOwnProperty("shard_report")) { + if (!$util.isObject(message.shard_report)) + return "shard_report: object expected"; + let key = Object.keys(message.shard_report); + for (let i = 0; i < key.length; ++i) { + let error = $root.vtadmin.VDiffShardReport.verify(message.shard_report[key[i]]); + if (error) + return "shard_report." + error; + } + } return null; }; /** - * Creates a Duration message from a plain object. Also converts values to their respective internal types. + * Creates a VDiffShowResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @static * @param {Object.} object Plain object - * @returns {vttime.Duration} Duration + * @returns {vtadmin.VDiffShowResponse} VDiffShowResponse */ - Duration.fromObject = function fromObject(object) { - if (object instanceof $root.vttime.Duration) + VDiffShowResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.VDiffShowResponse) return object; - let message = new $root.vttime.Duration(); - if (object.seconds != null) - if ($util.Long) - (message.seconds = $util.Long.fromValue(object.seconds)).unsigned = false; - else if (typeof object.seconds === "string") - message.seconds = parseInt(object.seconds, 10); - else if (typeof object.seconds === "number") - message.seconds = object.seconds; - else if (typeof object.seconds === "object") - message.seconds = new $util.LongBits(object.seconds.low >>> 0, object.seconds.high >>> 0).toNumber(); - if (object.nanos != null) - message.nanos = object.nanos | 0; + let message = new $root.vtadmin.VDiffShowResponse(); + if (object.shard_report) { + if (typeof object.shard_report !== "object") + throw TypeError(".vtadmin.VDiffShowResponse.shard_report: object expected"); + message.shard_report = {}; + for (let keys = Object.keys(object.shard_report), i = 0; i < keys.length; ++i) { + if (typeof object.shard_report[keys[i]] !== "object") + throw TypeError(".vtadmin.VDiffShowResponse.shard_report: object expected"); + message.shard_report[keys[i]] = $root.vtadmin.VDiffShardReport.fromObject(object.shard_report[keys[i]]); + } + } return message; }; /** - * Creates a plain object from a Duration message. Also converts values to other types if specified. + * Creates a plain object from a VDiffShowResponse message. Also converts values to other types if specified. * @function toObject - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @static - * @param {vttime.Duration} message Duration + * @param {vtadmin.VDiffShowResponse} message VDiffShowResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - Duration.toObject = function toObject(message, options) { + VDiffShowResponse.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; - if (options.defaults) { - if ($util.Long) { - let long = new $util.Long(0, 0, false); - object.seconds = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.seconds = options.longs === String ? "0" : 0; - object.nanos = 0; + if (options.objects || options.defaults) + object.shard_report = {}; + let keys2; + if (message.shard_report && (keys2 = Object.keys(message.shard_report)).length) { + object.shard_report = {}; + for (let j = 0; j < keys2.length; ++j) + object.shard_report[keys2[j]] = $root.vtadmin.VDiffShardReport.toObject(message.shard_report[keys2[j]], options); } - if (message.seconds != null && message.hasOwnProperty("seconds")) - if (typeof message.seconds === "number") - object.seconds = options.longs === String ? String(message.seconds) : message.seconds; - else - object.seconds = options.longs === String ? $util.Long.prototype.toString.call(message.seconds) : options.longs === Number ? new $util.LongBits(message.seconds.low >>> 0, message.seconds.high >>> 0).toNumber() : message.seconds; - if (message.nanos != null && message.hasOwnProperty("nanos")) - object.nanos = message.nanos; return object; }; /** - * Converts this Duration to JSON. + * Converts this VDiffShowResponse to JSON. * @function toJSON - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @instance * @returns {Object.} JSON object */ - Duration.prototype.toJSON = function toJSON() { + VDiffShowResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for Duration + * Gets the default type url for VDiffShowResponse * @function getTypeUrl - * @memberof vttime.Duration + * @memberof vtadmin.VDiffShowResponse * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - Duration.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + VDiffShowResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/vttime.Duration"; + return typeUrlPrefix + "/vtadmin.VDiffShowResponse"; }; - return Duration; + return VDiffShowResponse; })(); - return vttime; -})(); - -export const mysqlctl = $root.mysqlctl = (() => { - - /** - * Namespace mysqlctl. - * @exports mysqlctl - * @namespace - */ - const mysqlctl = {}; - - mysqlctl.StartRequest = (function() { + vtadmin.VTExplainRequest = (function() { /** - * Properties of a StartRequest. - * @memberof mysqlctl - * @interface IStartRequest - * @property {Array.|null} [mysqld_args] StartRequest mysqld_args + * Properties of a VTExplainRequest. + * @memberof vtadmin + * @interface IVTExplainRequest + * @property {string|null} [cluster] VTExplainRequest cluster + * @property {string|null} [keyspace] VTExplainRequest keyspace + * @property {string|null} [sql] VTExplainRequest sql */ /** - * Constructs a new StartRequest. - * @memberof mysqlctl - * @classdesc Represents a StartRequest. - * @implements IStartRequest + * Constructs a new VTExplainRequest. + * @memberof vtadmin + * @classdesc Represents a VTExplainRequest. + * @implements IVTExplainRequest * @constructor - * @param {mysqlctl.IStartRequest=} [properties] Properties to set + * @param {vtadmin.IVTExplainRequest=} [properties] Properties to set */ - function StartRequest(properties) { - this.mysqld_args = []; + function VTExplainRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -31501,78 +34528,103 @@ export const mysqlctl = $root.mysqlctl = (() => { } /** - * StartRequest mysqld_args. - * @member {Array.} mysqld_args - * @memberof mysqlctl.StartRequest + * VTExplainRequest cluster. + * @member {string} cluster + * @memberof vtadmin.VTExplainRequest * @instance */ - StartRequest.prototype.mysqld_args = $util.emptyArray; + VTExplainRequest.prototype.cluster = ""; /** - * Creates a new StartRequest instance using the specified properties. + * VTExplainRequest keyspace. + * @member {string} keyspace + * @memberof vtadmin.VTExplainRequest + * @instance + */ + VTExplainRequest.prototype.keyspace = ""; + + /** + * VTExplainRequest sql. + * @member {string} sql + * @memberof vtadmin.VTExplainRequest + * @instance + */ + VTExplainRequest.prototype.sql = ""; + + /** + * Creates a new VTExplainRequest instance using the specified properties. * @function create - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @static - * @param {mysqlctl.IStartRequest=} [properties] Properties to set - * @returns {mysqlctl.StartRequest} StartRequest instance + * @param {vtadmin.IVTExplainRequest=} [properties] Properties to set + * @returns {vtadmin.VTExplainRequest} VTExplainRequest instance */ - StartRequest.create = function create(properties) { - return new StartRequest(properties); + VTExplainRequest.create = function create(properties) { + return new VTExplainRequest(properties); }; /** - * Encodes the specified StartRequest message. Does not implicitly {@link mysqlctl.StartRequest.verify|verify} messages. + * Encodes the specified VTExplainRequest message. Does not implicitly {@link vtadmin.VTExplainRequest.verify|verify} messages. * @function encode - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @static - * @param {mysqlctl.IStartRequest} message StartRequest message or plain object to encode + * @param {vtadmin.IVTExplainRequest} message VTExplainRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - StartRequest.encode = function encode(message, writer) { + VTExplainRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.mysqld_args != null && message.mysqld_args.length) - for (let i = 0; i < message.mysqld_args.length; ++i) - writer.uint32(/* id 1, wireType 2 =*/10).string(message.mysqld_args[i]); + if (message.cluster != null && Object.hasOwnProperty.call(message, "cluster")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.cluster); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.keyspace); + if (message.sql != null && Object.hasOwnProperty.call(message, "sql")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.sql); return writer; }; /** - * Encodes the specified StartRequest message, length delimited. Does not implicitly {@link mysqlctl.StartRequest.verify|verify} messages. + * Encodes the specified VTExplainRequest message, length delimited. Does not implicitly {@link vtadmin.VTExplainRequest.verify|verify} messages. * @function encodeDelimited - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @static - * @param {mysqlctl.IStartRequest} message StartRequest message or plain object to encode + * @param {vtadmin.IVTExplainRequest} message VTExplainRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - StartRequest.encodeDelimited = function encodeDelimited(message, writer) { + VTExplainRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a StartRequest message from the specified reader or buffer. + * Decodes a VTExplainRequest message from the specified reader or buffer. * @function decode - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {mysqlctl.StartRequest} StartRequest + * @returns {vtadmin.VTExplainRequest} VTExplainRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - StartRequest.decode = function decode(reader, length) { + VTExplainRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.StartRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.VTExplainRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - if (!(message.mysqld_args && message.mysqld_args.length)) - message.mysqld_args = []; - message.mysqld_args.push(reader.string()); + message.cluster = reader.string(); + break; + } + case 2: { + message.keyspace = reader.string(); + break; + } + case 3: { + message.sql = reader.string(); break; } default: @@ -31584,133 +34636,139 @@ export const mysqlctl = $root.mysqlctl = (() => { }; /** - * Decodes a StartRequest message from the specified reader or buffer, length delimited. + * Decodes a VTExplainRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {mysqlctl.StartRequest} StartRequest + * @returns {vtadmin.VTExplainRequest} VTExplainRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - StartRequest.decodeDelimited = function decodeDelimited(reader) { + VTExplainRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a StartRequest message. + * Verifies a VTExplainRequest message. * @function verify - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - StartRequest.verify = function verify(message) { + VTExplainRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.mysqld_args != null && message.hasOwnProperty("mysqld_args")) { - if (!Array.isArray(message.mysqld_args)) - return "mysqld_args: array expected"; - for (let i = 0; i < message.mysqld_args.length; ++i) - if (!$util.isString(message.mysqld_args[i])) - return "mysqld_args: string[] expected"; - } + if (message.cluster != null && message.hasOwnProperty("cluster")) + if (!$util.isString(message.cluster)) + return "cluster: string expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.sql != null && message.hasOwnProperty("sql")) + if (!$util.isString(message.sql)) + return "sql: string expected"; return null; }; /** - * Creates a StartRequest message from a plain object. Also converts values to their respective internal types. + * Creates a VTExplainRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @static * @param {Object.} object Plain object - * @returns {mysqlctl.StartRequest} StartRequest + * @returns {vtadmin.VTExplainRequest} VTExplainRequest */ - StartRequest.fromObject = function fromObject(object) { - if (object instanceof $root.mysqlctl.StartRequest) + VTExplainRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.VTExplainRequest) return object; - let message = new $root.mysqlctl.StartRequest(); - if (object.mysqld_args) { - if (!Array.isArray(object.mysqld_args)) - throw TypeError(".mysqlctl.StartRequest.mysqld_args: array expected"); - message.mysqld_args = []; - for (let i = 0; i < object.mysqld_args.length; ++i) - message.mysqld_args[i] = String(object.mysqld_args[i]); - } + let message = new $root.vtadmin.VTExplainRequest(); + if (object.cluster != null) + message.cluster = String(object.cluster); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.sql != null) + message.sql = String(object.sql); return message; }; /** - * Creates a plain object from a StartRequest message. Also converts values to other types if specified. + * Creates a plain object from a VTExplainRequest message. Also converts values to other types if specified. * @function toObject - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @static - * @param {mysqlctl.StartRequest} message StartRequest + * @param {vtadmin.VTExplainRequest} message VTExplainRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - StartRequest.toObject = function toObject(message, options) { + VTExplainRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; - if (options.arrays || options.defaults) - object.mysqld_args = []; - if (message.mysqld_args && message.mysqld_args.length) { - object.mysqld_args = []; - for (let j = 0; j < message.mysqld_args.length; ++j) - object.mysqld_args[j] = message.mysqld_args[j]; + if (options.defaults) { + object.cluster = ""; + object.keyspace = ""; + object.sql = ""; } + if (message.cluster != null && message.hasOwnProperty("cluster")) + object.cluster = message.cluster; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.sql != null && message.hasOwnProperty("sql")) + object.sql = message.sql; return object; }; /** - * Converts this StartRequest to JSON. + * Converts this VTExplainRequest to JSON. * @function toJSON - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @instance * @returns {Object.} JSON object */ - StartRequest.prototype.toJSON = function toJSON() { + VTExplainRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for StartRequest + * Gets the default type url for VTExplainRequest * @function getTypeUrl - * @memberof mysqlctl.StartRequest + * @memberof vtadmin.VTExplainRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - StartRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + VTExplainRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/mysqlctl.StartRequest"; + return typeUrlPrefix + "/vtadmin.VTExplainRequest"; }; - return StartRequest; + return VTExplainRequest; })(); - mysqlctl.StartResponse = (function() { + vtadmin.VTExplainResponse = (function() { /** - * Properties of a StartResponse. - * @memberof mysqlctl - * @interface IStartResponse + * Properties of a VTExplainResponse. + * @memberof vtadmin + * @interface IVTExplainResponse + * @property {string|null} [response] VTExplainResponse response */ /** - * Constructs a new StartResponse. - * @memberof mysqlctl - * @classdesc Represents a StartResponse. - * @implements IStartResponse + * Constructs a new VTExplainResponse. + * @memberof vtadmin + * @classdesc Represents a VTExplainResponse. + * @implements IVTExplainResponse * @constructor - * @param {mysqlctl.IStartResponse=} [properties] Properties to set + * @param {vtadmin.IVTExplainResponse=} [properties] Properties to set */ - function StartResponse(properties) { + function VTExplainResponse(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -31718,63 +34776,77 @@ export const mysqlctl = $root.mysqlctl = (() => { } /** - * Creates a new StartResponse instance using the specified properties. + * VTExplainResponse response. + * @member {string} response + * @memberof vtadmin.VTExplainResponse + * @instance + */ + VTExplainResponse.prototype.response = ""; + + /** + * Creates a new VTExplainResponse instance using the specified properties. * @function create - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @static - * @param {mysqlctl.IStartResponse=} [properties] Properties to set - * @returns {mysqlctl.StartResponse} StartResponse instance + * @param {vtadmin.IVTExplainResponse=} [properties] Properties to set + * @returns {vtadmin.VTExplainResponse} VTExplainResponse instance */ - StartResponse.create = function create(properties) { - return new StartResponse(properties); + VTExplainResponse.create = function create(properties) { + return new VTExplainResponse(properties); }; /** - * Encodes the specified StartResponse message. Does not implicitly {@link mysqlctl.StartResponse.verify|verify} messages. + * Encodes the specified VTExplainResponse message. Does not implicitly {@link vtadmin.VTExplainResponse.verify|verify} messages. * @function encode - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @static - * @param {mysqlctl.IStartResponse} message StartResponse message or plain object to encode + * @param {vtadmin.IVTExplainResponse} message VTExplainResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - StartResponse.encode = function encode(message, writer) { + VTExplainResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); + if (message.response != null && Object.hasOwnProperty.call(message, "response")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.response); return writer; }; /** - * Encodes the specified StartResponse message, length delimited. Does not implicitly {@link mysqlctl.StartResponse.verify|verify} messages. + * Encodes the specified VTExplainResponse message, length delimited. Does not implicitly {@link vtadmin.VTExplainResponse.verify|verify} messages. * @function encodeDelimited - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @static - * @param {mysqlctl.IStartResponse} message StartResponse message or plain object to encode + * @param {vtadmin.IVTExplainResponse} message VTExplainResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - StartResponse.encodeDelimited = function encodeDelimited(message, writer) { + VTExplainResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a StartResponse message from the specified reader or buffer. + * Decodes a VTExplainResponse message from the specified reader or buffer. * @function decode - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {mysqlctl.StartResponse} StartResponse + * @returns {vtadmin.VTExplainResponse} VTExplainResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - StartResponse.decode = function decode(reader, length) { + VTExplainResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.StartResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtadmin.VTExplainResponse(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { + case 1: { + message.response = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -31784,110 +34856,156 @@ export const mysqlctl = $root.mysqlctl = (() => { }; /** - * Decodes a StartResponse message from the specified reader or buffer, length delimited. + * Decodes a VTExplainResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {mysqlctl.StartResponse} StartResponse + * @returns {vtadmin.VTExplainResponse} VTExplainResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - StartResponse.decodeDelimited = function decodeDelimited(reader) { + VTExplainResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a StartResponse message. + * Verifies a VTExplainResponse message. * @function verify - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - StartResponse.verify = function verify(message) { + VTExplainResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + if (message.response != null && message.hasOwnProperty("response")) + if (!$util.isString(message.response)) + return "response: string expected"; return null; }; /** - * Creates a StartResponse message from a plain object. Also converts values to their respective internal types. + * Creates a VTExplainResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @static * @param {Object.} object Plain object - * @returns {mysqlctl.StartResponse} StartResponse + * @returns {vtadmin.VTExplainResponse} VTExplainResponse */ - StartResponse.fromObject = function fromObject(object) { - if (object instanceof $root.mysqlctl.StartResponse) + VTExplainResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtadmin.VTExplainResponse) return object; - return new $root.mysqlctl.StartResponse(); + let message = new $root.vtadmin.VTExplainResponse(); + if (object.response != null) + message.response = String(object.response); + return message; }; /** - * Creates a plain object from a StartResponse message. Also converts values to other types if specified. + * Creates a plain object from a VTExplainResponse message. Also converts values to other types if specified. * @function toObject - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @static - * @param {mysqlctl.StartResponse} message StartResponse + * @param {vtadmin.VTExplainResponse} message VTExplainResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - StartResponse.toObject = function toObject() { - return {}; + VTExplainResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.response = ""; + if (message.response != null && message.hasOwnProperty("response")) + object.response = message.response; + return object; }; /** - * Converts this StartResponse to JSON. + * Converts this VTExplainResponse to JSON. * @function toJSON - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @instance * @returns {Object.} JSON object */ - StartResponse.prototype.toJSON = function toJSON() { + VTExplainResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for StartResponse + * Gets the default type url for VTExplainResponse * @function getTypeUrl - * @memberof mysqlctl.StartResponse + * @memberof vtadmin.VTExplainResponse * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - StartResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + VTExplainResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/mysqlctl.StartResponse"; + return typeUrlPrefix + "/vtadmin.VTExplainResponse"; }; - return StartResponse; + return VTExplainResponse; })(); - mysqlctl.ShutdownRequest = (function() { + return vtadmin; +})(); + +export const logutil = $root.logutil = (() => { + + /** + * Namespace logutil. + * @exports logutil + * @namespace + */ + const logutil = {}; + + /** + * Level enum. + * @name logutil.Level + * @enum {number} + * @property {number} INFO=0 INFO value + * @property {number} WARNING=1 WARNING value + * @property {number} ERROR=2 ERROR value + * @property {number} CONSOLE=3 CONSOLE value + */ + logutil.Level = (function() { + const valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "INFO"] = 0; + values[valuesById[1] = "WARNING"] = 1; + values[valuesById[2] = "ERROR"] = 2; + values[valuesById[3] = "CONSOLE"] = 3; + return values; + })(); + + logutil.Event = (function() { /** - * Properties of a ShutdownRequest. - * @memberof mysqlctl - * @interface IShutdownRequest - * @property {boolean|null} [wait_for_mysqld] ShutdownRequest wait_for_mysqld - * @property {vttime.IDuration|null} [mysql_shutdown_timeout] ShutdownRequest mysql_shutdown_timeout + * Properties of an Event. + * @memberof logutil + * @interface IEvent + * @property {vttime.ITime|null} [time] Event time + * @property {logutil.Level|null} [level] Event level + * @property {string|null} [file] Event file + * @property {number|Long|null} [line] Event line + * @property {string|null} [value] Event value */ /** - * Constructs a new ShutdownRequest. - * @memberof mysqlctl - * @classdesc Represents a ShutdownRequest. - * @implements IShutdownRequest + * Constructs a new Event. + * @memberof logutil + * @classdesc Represents an Event. + * @implements IEvent * @constructor - * @param {mysqlctl.IShutdownRequest=} [properties] Properties to set + * @param {logutil.IEvent=} [properties] Properties to set */ - function ShutdownRequest(properties) { + function Event(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -31895,89 +35013,131 @@ export const mysqlctl = $root.mysqlctl = (() => { } /** - * ShutdownRequest wait_for_mysqld. - * @member {boolean} wait_for_mysqld - * @memberof mysqlctl.ShutdownRequest + * Event time. + * @member {vttime.ITime|null|undefined} time + * @memberof logutil.Event * @instance */ - ShutdownRequest.prototype.wait_for_mysqld = false; + Event.prototype.time = null; /** - * ShutdownRequest mysql_shutdown_timeout. - * @member {vttime.IDuration|null|undefined} mysql_shutdown_timeout - * @memberof mysqlctl.ShutdownRequest + * Event level. + * @member {logutil.Level} level + * @memberof logutil.Event * @instance */ - ShutdownRequest.prototype.mysql_shutdown_timeout = null; + Event.prototype.level = 0; /** - * Creates a new ShutdownRequest instance using the specified properties. + * Event file. + * @member {string} file + * @memberof logutil.Event + * @instance + */ + Event.prototype.file = ""; + + /** + * Event line. + * @member {number|Long} line + * @memberof logutil.Event + * @instance + */ + Event.prototype.line = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Event value. + * @member {string} value + * @memberof logutil.Event + * @instance + */ + Event.prototype.value = ""; + + /** + * Creates a new Event instance using the specified properties. * @function create - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @static - * @param {mysqlctl.IShutdownRequest=} [properties] Properties to set - * @returns {mysqlctl.ShutdownRequest} ShutdownRequest instance + * @param {logutil.IEvent=} [properties] Properties to set + * @returns {logutil.Event} Event instance */ - ShutdownRequest.create = function create(properties) { - return new ShutdownRequest(properties); + Event.create = function create(properties) { + return new Event(properties); }; /** - * Encodes the specified ShutdownRequest message. Does not implicitly {@link mysqlctl.ShutdownRequest.verify|verify} messages. + * Encodes the specified Event message. Does not implicitly {@link logutil.Event.verify|verify} messages. * @function encode - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @static - * @param {mysqlctl.IShutdownRequest} message ShutdownRequest message or plain object to encode + * @param {logutil.IEvent} message Event message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ShutdownRequest.encode = function encode(message, writer) { + Event.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.wait_for_mysqld != null && Object.hasOwnProperty.call(message, "wait_for_mysqld")) - writer.uint32(/* id 1, wireType 0 =*/8).bool(message.wait_for_mysqld); - if (message.mysql_shutdown_timeout != null && Object.hasOwnProperty.call(message, "mysql_shutdown_timeout")) - $root.vttime.Duration.encode(message.mysql_shutdown_timeout, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.time != null && Object.hasOwnProperty.call(message, "time")) + $root.vttime.Time.encode(message.time, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.level != null && Object.hasOwnProperty.call(message, "level")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.level); + if (message.file != null && Object.hasOwnProperty.call(message, "file")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.file); + if (message.line != null && Object.hasOwnProperty.call(message, "line")) + writer.uint32(/* id 4, wireType 0 =*/32).int64(message.line); + if (message.value != null && Object.hasOwnProperty.call(message, "value")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.value); return writer; }; /** - * Encodes the specified ShutdownRequest message, length delimited. Does not implicitly {@link mysqlctl.ShutdownRequest.verify|verify} messages. + * Encodes the specified Event message, length delimited. Does not implicitly {@link logutil.Event.verify|verify} messages. * @function encodeDelimited - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @static - * @param {mysqlctl.IShutdownRequest} message ShutdownRequest message or plain object to encode + * @param {logutil.IEvent} message Event message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ShutdownRequest.encodeDelimited = function encodeDelimited(message, writer) { + Event.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a ShutdownRequest message from the specified reader or buffer. + * Decodes an Event message from the specified reader or buffer. * @function decode - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {mysqlctl.ShutdownRequest} ShutdownRequest + * @returns {logutil.Event} Event * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ShutdownRequest.decode = function decode(reader, length) { + Event.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.ShutdownRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.logutil.Event(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.wait_for_mysqld = reader.bool(); + message.time = $root.vttime.Time.decode(reader, reader.uint32()); break; } case 2: { - message.mysql_shutdown_timeout = $root.vttime.Duration.decode(reader, reader.uint32()); + message.level = reader.int32(); + break; + } + case 3: { + message.file = reader.string(); + break; + } + case 4: { + message.line = reader.int64(); + break; + } + case 5: { + message.value = reader.string(); break; } default: @@ -31989,135 +35149,216 @@ export const mysqlctl = $root.mysqlctl = (() => { }; /** - * Decodes a ShutdownRequest message from the specified reader or buffer, length delimited. + * Decodes an Event message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {mysqlctl.ShutdownRequest} ShutdownRequest + * @returns {logutil.Event} Event * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ShutdownRequest.decodeDelimited = function decodeDelimited(reader) { + Event.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a ShutdownRequest message. + * Verifies an Event message. * @function verify - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ShutdownRequest.verify = function verify(message) { + Event.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.wait_for_mysqld != null && message.hasOwnProperty("wait_for_mysqld")) - if (typeof message.wait_for_mysqld !== "boolean") - return "wait_for_mysqld: boolean expected"; - if (message.mysql_shutdown_timeout != null && message.hasOwnProperty("mysql_shutdown_timeout")) { - let error = $root.vttime.Duration.verify(message.mysql_shutdown_timeout); + if (message.time != null && message.hasOwnProperty("time")) { + let error = $root.vttime.Time.verify(message.time); if (error) - return "mysql_shutdown_timeout." + error; + return "time." + error; } + if (message.level != null && message.hasOwnProperty("level")) + switch (message.level) { + default: + return "level: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.file != null && message.hasOwnProperty("file")) + if (!$util.isString(message.file)) + return "file: string expected"; + if (message.line != null && message.hasOwnProperty("line")) + if (!$util.isInteger(message.line) && !(message.line && $util.isInteger(message.line.low) && $util.isInteger(message.line.high))) + return "line: integer|Long expected"; + if (message.value != null && message.hasOwnProperty("value")) + if (!$util.isString(message.value)) + return "value: string expected"; return null; }; /** - * Creates a ShutdownRequest message from a plain object. Also converts values to their respective internal types. + * Creates an Event message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @static * @param {Object.} object Plain object - * @returns {mysqlctl.ShutdownRequest} ShutdownRequest + * @returns {logutil.Event} Event */ - ShutdownRequest.fromObject = function fromObject(object) { - if (object instanceof $root.mysqlctl.ShutdownRequest) + Event.fromObject = function fromObject(object) { + if (object instanceof $root.logutil.Event) return object; - let message = new $root.mysqlctl.ShutdownRequest(); - if (object.wait_for_mysqld != null) - message.wait_for_mysqld = Boolean(object.wait_for_mysqld); - if (object.mysql_shutdown_timeout != null) { - if (typeof object.mysql_shutdown_timeout !== "object") - throw TypeError(".mysqlctl.ShutdownRequest.mysql_shutdown_timeout: object expected"); - message.mysql_shutdown_timeout = $root.vttime.Duration.fromObject(object.mysql_shutdown_timeout); + let message = new $root.logutil.Event(); + if (object.time != null) { + if (typeof object.time !== "object") + throw TypeError(".logutil.Event.time: object expected"); + message.time = $root.vttime.Time.fromObject(object.time); + } + switch (object.level) { + default: + if (typeof object.level === "number") { + message.level = object.level; + break; + } + break; + case "INFO": + case 0: + message.level = 0; + break; + case "WARNING": + case 1: + message.level = 1; + break; + case "ERROR": + case 2: + message.level = 2; + break; + case "CONSOLE": + case 3: + message.level = 3; + break; } + if (object.file != null) + message.file = String(object.file); + if (object.line != null) + if ($util.Long) + (message.line = $util.Long.fromValue(object.line)).unsigned = false; + else if (typeof object.line === "string") + message.line = parseInt(object.line, 10); + else if (typeof object.line === "number") + message.line = object.line; + else if (typeof object.line === "object") + message.line = new $util.LongBits(object.line.low >>> 0, object.line.high >>> 0).toNumber(); + if (object.value != null) + message.value = String(object.value); return message; }; /** - * Creates a plain object from a ShutdownRequest message. Also converts values to other types if specified. + * Creates a plain object from an Event message. Also converts values to other types if specified. * @function toObject - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @static - * @param {mysqlctl.ShutdownRequest} message ShutdownRequest + * @param {logutil.Event} message Event * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ShutdownRequest.toObject = function toObject(message, options) { + Event.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; if (options.defaults) { - object.wait_for_mysqld = false; - object.mysql_shutdown_timeout = null; + object.time = null; + object.level = options.enums === String ? "INFO" : 0; + object.file = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.line = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.line = options.longs === String ? "0" : 0; + object.value = ""; } - if (message.wait_for_mysqld != null && message.hasOwnProperty("wait_for_mysqld")) - object.wait_for_mysqld = message.wait_for_mysqld; - if (message.mysql_shutdown_timeout != null && message.hasOwnProperty("mysql_shutdown_timeout")) - object.mysql_shutdown_timeout = $root.vttime.Duration.toObject(message.mysql_shutdown_timeout, options); + if (message.time != null && message.hasOwnProperty("time")) + object.time = $root.vttime.Time.toObject(message.time, options); + if (message.level != null && message.hasOwnProperty("level")) + object.level = options.enums === String ? $root.logutil.Level[message.level] === undefined ? message.level : $root.logutil.Level[message.level] : message.level; + if (message.file != null && message.hasOwnProperty("file")) + object.file = message.file; + if (message.line != null && message.hasOwnProperty("line")) + if (typeof message.line === "number") + object.line = options.longs === String ? String(message.line) : message.line; + else + object.line = options.longs === String ? $util.Long.prototype.toString.call(message.line) : options.longs === Number ? new $util.LongBits(message.line.low >>> 0, message.line.high >>> 0).toNumber() : message.line; + if (message.value != null && message.hasOwnProperty("value")) + object.value = message.value; return object; }; /** - * Converts this ShutdownRequest to JSON. + * Converts this Event to JSON. * @function toJSON - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @instance * @returns {Object.} JSON object */ - ShutdownRequest.prototype.toJSON = function toJSON() { + Event.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ShutdownRequest + * Gets the default type url for Event * @function getTypeUrl - * @memberof mysqlctl.ShutdownRequest + * @memberof logutil.Event * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ShutdownRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + Event.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/mysqlctl.ShutdownRequest"; + return typeUrlPrefix + "/logutil.Event"; }; - return ShutdownRequest; + return Event; })(); - mysqlctl.ShutdownResponse = (function() { + return logutil; +})(); + +export const vttime = $root.vttime = (() => { + + /** + * Namespace vttime. + * @exports vttime + * @namespace + */ + const vttime = {}; + + vttime.Time = (function() { /** - * Properties of a ShutdownResponse. - * @memberof mysqlctl - * @interface IShutdownResponse + * Properties of a Time. + * @memberof vttime + * @interface ITime + * @property {number|Long|null} [seconds] Time seconds + * @property {number|null} [nanoseconds] Time nanoseconds */ /** - * Constructs a new ShutdownResponse. - * @memberof mysqlctl - * @classdesc Represents a ShutdownResponse. - * @implements IShutdownResponse + * Constructs a new Time. + * @memberof vttime + * @classdesc Represents a Time. + * @implements ITime * @constructor - * @param {mysqlctl.IShutdownResponse=} [properties] Properties to set + * @param {vttime.ITime=} [properties] Properties to set */ - function ShutdownResponse(properties) { + function Time(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -32125,63 +35366,91 @@ export const mysqlctl = $root.mysqlctl = (() => { } /** - * Creates a new ShutdownResponse instance using the specified properties. + * Time seconds. + * @member {number|Long} seconds + * @memberof vttime.Time + * @instance + */ + Time.prototype.seconds = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Time nanoseconds. + * @member {number} nanoseconds + * @memberof vttime.Time + * @instance + */ + Time.prototype.nanoseconds = 0; + + /** + * Creates a new Time instance using the specified properties. * @function create - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @static - * @param {mysqlctl.IShutdownResponse=} [properties] Properties to set - * @returns {mysqlctl.ShutdownResponse} ShutdownResponse instance + * @param {vttime.ITime=} [properties] Properties to set + * @returns {vttime.Time} Time instance */ - ShutdownResponse.create = function create(properties) { - return new ShutdownResponse(properties); + Time.create = function create(properties) { + return new Time(properties); }; /** - * Encodes the specified ShutdownResponse message. Does not implicitly {@link mysqlctl.ShutdownResponse.verify|verify} messages. + * Encodes the specified Time message. Does not implicitly {@link vttime.Time.verify|verify} messages. * @function encode - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @static - * @param {mysqlctl.IShutdownResponse} message ShutdownResponse message or plain object to encode + * @param {vttime.ITime} message Time message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ShutdownResponse.encode = function encode(message, writer) { + Time.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); + if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds")) + writer.uint32(/* id 1, wireType 0 =*/8).int64(message.seconds); + if (message.nanoseconds != null && Object.hasOwnProperty.call(message, "nanoseconds")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.nanoseconds); return writer; }; /** - * Encodes the specified ShutdownResponse message, length delimited. Does not implicitly {@link mysqlctl.ShutdownResponse.verify|verify} messages. + * Encodes the specified Time message, length delimited. Does not implicitly {@link vttime.Time.verify|verify} messages. * @function encodeDelimited - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @static - * @param {mysqlctl.IShutdownResponse} message ShutdownResponse message or plain object to encode + * @param {vttime.ITime} message Time message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ShutdownResponse.encodeDelimited = function encodeDelimited(message, writer) { + Time.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a ShutdownResponse message from the specified reader or buffer. + * Decodes a Time message from the specified reader or buffer. * @function decode - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {mysqlctl.ShutdownResponse} ShutdownResponse + * @returns {vttime.Time} Time * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ShutdownResponse.decode = function decode(reader, length) { + Time.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.ShutdownResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vttime.Time(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { + case 1: { + message.seconds = reader.int64(); + break; + } + case 2: { + message.nanoseconds = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -32191,108 +35460,146 @@ export const mysqlctl = $root.mysqlctl = (() => { }; /** - * Decodes a ShutdownResponse message from the specified reader or buffer, length delimited. + * Decodes a Time message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {mysqlctl.ShutdownResponse} ShutdownResponse + * @returns {vttime.Time} Time * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ShutdownResponse.decodeDelimited = function decodeDelimited(reader) { + Time.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a ShutdownResponse message. + * Verifies a Time message. * @function verify - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ShutdownResponse.verify = function verify(message) { + Time.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + if (message.seconds != null && message.hasOwnProperty("seconds")) + if (!$util.isInteger(message.seconds) && !(message.seconds && $util.isInteger(message.seconds.low) && $util.isInteger(message.seconds.high))) + return "seconds: integer|Long expected"; + if (message.nanoseconds != null && message.hasOwnProperty("nanoseconds")) + if (!$util.isInteger(message.nanoseconds)) + return "nanoseconds: integer expected"; return null; }; /** - * Creates a ShutdownResponse message from a plain object. Also converts values to their respective internal types. + * Creates a Time message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @static * @param {Object.} object Plain object - * @returns {mysqlctl.ShutdownResponse} ShutdownResponse + * @returns {vttime.Time} Time */ - ShutdownResponse.fromObject = function fromObject(object) { - if (object instanceof $root.mysqlctl.ShutdownResponse) + Time.fromObject = function fromObject(object) { + if (object instanceof $root.vttime.Time) return object; - return new $root.mysqlctl.ShutdownResponse(); + let message = new $root.vttime.Time(); + if (object.seconds != null) + if ($util.Long) + (message.seconds = $util.Long.fromValue(object.seconds)).unsigned = false; + else if (typeof object.seconds === "string") + message.seconds = parseInt(object.seconds, 10); + else if (typeof object.seconds === "number") + message.seconds = object.seconds; + else if (typeof object.seconds === "object") + message.seconds = new $util.LongBits(object.seconds.low >>> 0, object.seconds.high >>> 0).toNumber(); + if (object.nanoseconds != null) + message.nanoseconds = object.nanoseconds | 0; + return message; }; /** - * Creates a plain object from a ShutdownResponse message. Also converts values to other types if specified. + * Creates a plain object from a Time message. Also converts values to other types if specified. * @function toObject - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @static - * @param {mysqlctl.ShutdownResponse} message ShutdownResponse + * @param {vttime.Time} message Time * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ShutdownResponse.toObject = function toObject() { - return {}; + Time.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.seconds = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.seconds = options.longs === String ? "0" : 0; + object.nanoseconds = 0; + } + if (message.seconds != null && message.hasOwnProperty("seconds")) + if (typeof message.seconds === "number") + object.seconds = options.longs === String ? String(message.seconds) : message.seconds; + else + object.seconds = options.longs === String ? $util.Long.prototype.toString.call(message.seconds) : options.longs === Number ? new $util.LongBits(message.seconds.low >>> 0, message.seconds.high >>> 0).toNumber() : message.seconds; + if (message.nanoseconds != null && message.hasOwnProperty("nanoseconds")) + object.nanoseconds = message.nanoseconds; + return object; }; /** - * Converts this ShutdownResponse to JSON. + * Converts this Time to JSON. * @function toJSON - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @instance * @returns {Object.} JSON object */ - ShutdownResponse.prototype.toJSON = function toJSON() { + Time.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ShutdownResponse + * Gets the default type url for Time * @function getTypeUrl - * @memberof mysqlctl.ShutdownResponse + * @memberof vttime.Time * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ShutdownResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + Time.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/mysqlctl.ShutdownResponse"; + return typeUrlPrefix + "/vttime.Time"; }; - return ShutdownResponse; + return Time; })(); - mysqlctl.RunMysqlUpgradeRequest = (function() { + vttime.Duration = (function() { /** - * Properties of a RunMysqlUpgradeRequest. - * @memberof mysqlctl - * @interface IRunMysqlUpgradeRequest + * Properties of a Duration. + * @memberof vttime + * @interface IDuration + * @property {number|Long|null} [seconds] Duration seconds + * @property {number|null} [nanos] Duration nanos */ /** - * Constructs a new RunMysqlUpgradeRequest. - * @memberof mysqlctl - * @classdesc Represents a RunMysqlUpgradeRequest. - * @implements IRunMysqlUpgradeRequest + * Constructs a new Duration. + * @memberof vttime + * @classdesc Represents a Duration. + * @implements IDuration * @constructor - * @param {mysqlctl.IRunMysqlUpgradeRequest=} [properties] Properties to set + * @param {vttime.IDuration=} [properties] Properties to set */ - function RunMysqlUpgradeRequest(properties) { + function Duration(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -32300,63 +35607,91 @@ export const mysqlctl = $root.mysqlctl = (() => { } /** - * Creates a new RunMysqlUpgradeRequest instance using the specified properties. + * Duration seconds. + * @member {number|Long} seconds + * @memberof vttime.Duration + * @instance + */ + Duration.prototype.seconds = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Duration nanos. + * @member {number} nanos + * @memberof vttime.Duration + * @instance + */ + Duration.prototype.nanos = 0; + + /** + * Creates a new Duration instance using the specified properties. * @function create - * @memberof mysqlctl.RunMysqlUpgradeRequest + * @memberof vttime.Duration * @static - * @param {mysqlctl.IRunMysqlUpgradeRequest=} [properties] Properties to set - * @returns {mysqlctl.RunMysqlUpgradeRequest} RunMysqlUpgradeRequest instance + * @param {vttime.IDuration=} [properties] Properties to set + * @returns {vttime.Duration} Duration instance */ - RunMysqlUpgradeRequest.create = function create(properties) { - return new RunMysqlUpgradeRequest(properties); + Duration.create = function create(properties) { + return new Duration(properties); }; /** - * Encodes the specified RunMysqlUpgradeRequest message. Does not implicitly {@link mysqlctl.RunMysqlUpgradeRequest.verify|verify} messages. + * Encodes the specified Duration message. Does not implicitly {@link vttime.Duration.verify|verify} messages. * @function encode - * @memberof mysqlctl.RunMysqlUpgradeRequest + * @memberof vttime.Duration * @static - * @param {mysqlctl.IRunMysqlUpgradeRequest} message RunMysqlUpgradeRequest message or plain object to encode + * @param {vttime.IDuration} message Duration message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - RunMysqlUpgradeRequest.encode = function encode(message, writer) { + Duration.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); + if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds")) + writer.uint32(/* id 1, wireType 0 =*/8).int64(message.seconds); + if (message.nanos != null && Object.hasOwnProperty.call(message, "nanos")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.nanos); return writer; }; /** - * Encodes the specified RunMysqlUpgradeRequest message, length delimited. Does not implicitly {@link mysqlctl.RunMysqlUpgradeRequest.verify|verify} messages. + * Encodes the specified Duration message, length delimited. Does not implicitly {@link vttime.Duration.verify|verify} messages. * @function encodeDelimited - * @memberof mysqlctl.RunMysqlUpgradeRequest + * @memberof vttime.Duration * @static - * @param {mysqlctl.IRunMysqlUpgradeRequest} message RunMysqlUpgradeRequest message or plain object to encode + * @param {vttime.IDuration} message Duration message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - RunMysqlUpgradeRequest.encodeDelimited = function encodeDelimited(message, writer) { + Duration.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a RunMysqlUpgradeRequest message from the specified reader or buffer. + * Decodes a Duration message from the specified reader or buffer. * @function decode - * @memberof mysqlctl.RunMysqlUpgradeRequest + * @memberof vttime.Duration * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {mysqlctl.RunMysqlUpgradeRequest} RunMysqlUpgradeRequest + * @returns {vttime.Duration} Duration * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - RunMysqlUpgradeRequest.decode = function decode(reader, length) { + Duration.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.RunMysqlUpgradeRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vttime.Duration(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { + case 1: { + message.seconds = reader.int64(); + break; + } + case 2: { + message.nanos = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -32366,75 +35701,1099 @@ export const mysqlctl = $root.mysqlctl = (() => { }; /** - * Decodes a RunMysqlUpgradeRequest message from the specified reader or buffer, length delimited. + * Decodes a Duration message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof mysqlctl.RunMysqlUpgradeRequest + * @memberof vttime.Duration * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {mysqlctl.RunMysqlUpgradeRequest} RunMysqlUpgradeRequest + * @returns {vttime.Duration} Duration * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - RunMysqlUpgradeRequest.decodeDelimited = function decodeDelimited(reader) { + Duration.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a RunMysqlUpgradeRequest message. + * Verifies a Duration message. * @function verify - * @memberof mysqlctl.RunMysqlUpgradeRequest + * @memberof vttime.Duration * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - RunMysqlUpgradeRequest.verify = function verify(message) { + Duration.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + if (message.seconds != null && message.hasOwnProperty("seconds")) + if (!$util.isInteger(message.seconds) && !(message.seconds && $util.isInteger(message.seconds.low) && $util.isInteger(message.seconds.high))) + return "seconds: integer|Long expected"; + if (message.nanos != null && message.hasOwnProperty("nanos")) + if (!$util.isInteger(message.nanos)) + return "nanos: integer expected"; return null; }; /** - * Creates a RunMysqlUpgradeRequest message from a plain object. Also converts values to their respective internal types. + * Creates a Duration message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof mysqlctl.RunMysqlUpgradeRequest + * @memberof vttime.Duration * @static * @param {Object.} object Plain object - * @returns {mysqlctl.RunMysqlUpgradeRequest} RunMysqlUpgradeRequest + * @returns {vttime.Duration} Duration */ - RunMysqlUpgradeRequest.fromObject = function fromObject(object) { - if (object instanceof $root.mysqlctl.RunMysqlUpgradeRequest) + Duration.fromObject = function fromObject(object) { + if (object instanceof $root.vttime.Duration) return object; - return new $root.mysqlctl.RunMysqlUpgradeRequest(); + let message = new $root.vttime.Duration(); + if (object.seconds != null) + if ($util.Long) + (message.seconds = $util.Long.fromValue(object.seconds)).unsigned = false; + else if (typeof object.seconds === "string") + message.seconds = parseInt(object.seconds, 10); + else if (typeof object.seconds === "number") + message.seconds = object.seconds; + else if (typeof object.seconds === "object") + message.seconds = new $util.LongBits(object.seconds.low >>> 0, object.seconds.high >>> 0).toNumber(); + if (object.nanos != null) + message.nanos = object.nanos | 0; + return message; }; /** - * Creates a plain object from a RunMysqlUpgradeRequest message. Also converts values to other types if specified. + * Creates a plain object from a Duration message. Also converts values to other types if specified. * @function toObject - * @memberof mysqlctl.RunMysqlUpgradeRequest + * @memberof vttime.Duration * @static - * @param {mysqlctl.RunMysqlUpgradeRequest} message RunMysqlUpgradeRequest + * @param {vttime.Duration} message Duration * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - RunMysqlUpgradeRequest.toObject = function toObject() { - return {}; + Duration.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.seconds = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.seconds = options.longs === String ? "0" : 0; + object.nanos = 0; + } + if (message.seconds != null && message.hasOwnProperty("seconds")) + if (typeof message.seconds === "number") + object.seconds = options.longs === String ? String(message.seconds) : message.seconds; + else + object.seconds = options.longs === String ? $util.Long.prototype.toString.call(message.seconds) : options.longs === Number ? new $util.LongBits(message.seconds.low >>> 0, message.seconds.high >>> 0).toNumber() : message.seconds; + if (message.nanos != null && message.hasOwnProperty("nanos")) + object.nanos = message.nanos; + return object; }; /** - * Converts this RunMysqlUpgradeRequest to JSON. + * Converts this Duration to JSON. * @function toJSON - * @memberof mysqlctl.RunMysqlUpgradeRequest + * @memberof vttime.Duration * @instance * @returns {Object.} JSON object */ - RunMysqlUpgradeRequest.prototype.toJSON = function toJSON() { + Duration.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for RunMysqlUpgradeRequest + * Gets the default type url for Duration + * @function getTypeUrl + * @memberof vttime.Duration + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Duration.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vttime.Duration"; + }; + + return Duration; + })(); + + return vttime; +})(); + +export const mysqlctl = $root.mysqlctl = (() => { + + /** + * Namespace mysqlctl. + * @exports mysqlctl + * @namespace + */ + const mysqlctl = {}; + + mysqlctl.StartRequest = (function() { + + /** + * Properties of a StartRequest. + * @memberof mysqlctl + * @interface IStartRequest + * @property {Array.|null} [mysqld_args] StartRequest mysqld_args + */ + + /** + * Constructs a new StartRequest. + * @memberof mysqlctl + * @classdesc Represents a StartRequest. + * @implements IStartRequest + * @constructor + * @param {mysqlctl.IStartRequest=} [properties] Properties to set + */ + function StartRequest(properties) { + this.mysqld_args = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StartRequest mysqld_args. + * @member {Array.} mysqld_args + * @memberof mysqlctl.StartRequest + * @instance + */ + StartRequest.prototype.mysqld_args = $util.emptyArray; + + /** + * Creates a new StartRequest instance using the specified properties. + * @function create + * @memberof mysqlctl.StartRequest + * @static + * @param {mysqlctl.IStartRequest=} [properties] Properties to set + * @returns {mysqlctl.StartRequest} StartRequest instance + */ + StartRequest.create = function create(properties) { + return new StartRequest(properties); + }; + + /** + * Encodes the specified StartRequest message. Does not implicitly {@link mysqlctl.StartRequest.verify|verify} messages. + * @function encode + * @memberof mysqlctl.StartRequest + * @static + * @param {mysqlctl.IStartRequest} message StartRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.mysqld_args != null && message.mysqld_args.length) + for (let i = 0; i < message.mysqld_args.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.mysqld_args[i]); + return writer; + }; + + /** + * Encodes the specified StartRequest message, length delimited. Does not implicitly {@link mysqlctl.StartRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof mysqlctl.StartRequest + * @static + * @param {mysqlctl.IStartRequest} message StartRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StartRequest message from the specified reader or buffer. + * @function decode + * @memberof mysqlctl.StartRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {mysqlctl.StartRequest} StartRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.StartRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (!(message.mysqld_args && message.mysqld_args.length)) + message.mysqld_args = []; + message.mysqld_args.push(reader.string()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StartRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof mysqlctl.StartRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {mysqlctl.StartRequest} StartRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StartRequest message. + * @function verify + * @memberof mysqlctl.StartRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StartRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.mysqld_args != null && message.hasOwnProperty("mysqld_args")) { + if (!Array.isArray(message.mysqld_args)) + return "mysqld_args: array expected"; + for (let i = 0; i < message.mysqld_args.length; ++i) + if (!$util.isString(message.mysqld_args[i])) + return "mysqld_args: string[] expected"; + } + return null; + }; + + /** + * Creates a StartRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof mysqlctl.StartRequest + * @static + * @param {Object.} object Plain object + * @returns {mysqlctl.StartRequest} StartRequest + */ + StartRequest.fromObject = function fromObject(object) { + if (object instanceof $root.mysqlctl.StartRequest) + return object; + let message = new $root.mysqlctl.StartRequest(); + if (object.mysqld_args) { + if (!Array.isArray(object.mysqld_args)) + throw TypeError(".mysqlctl.StartRequest.mysqld_args: array expected"); + message.mysqld_args = []; + for (let i = 0; i < object.mysqld_args.length; ++i) + message.mysqld_args[i] = String(object.mysqld_args[i]); + } + return message; + }; + + /** + * Creates a plain object from a StartRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof mysqlctl.StartRequest + * @static + * @param {mysqlctl.StartRequest} message StartRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StartRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.mysqld_args = []; + if (message.mysqld_args && message.mysqld_args.length) { + object.mysqld_args = []; + for (let j = 0; j < message.mysqld_args.length; ++j) + object.mysqld_args[j] = message.mysqld_args[j]; + } + return object; + }; + + /** + * Converts this StartRequest to JSON. + * @function toJSON + * @memberof mysqlctl.StartRequest + * @instance + * @returns {Object.} JSON object + */ + StartRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for StartRequest + * @function getTypeUrl + * @memberof mysqlctl.StartRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + StartRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/mysqlctl.StartRequest"; + }; + + return StartRequest; + })(); + + mysqlctl.StartResponse = (function() { + + /** + * Properties of a StartResponse. + * @memberof mysqlctl + * @interface IStartResponse + */ + + /** + * Constructs a new StartResponse. + * @memberof mysqlctl + * @classdesc Represents a StartResponse. + * @implements IStartResponse + * @constructor + * @param {mysqlctl.IStartResponse=} [properties] Properties to set + */ + function StartResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new StartResponse instance using the specified properties. + * @function create + * @memberof mysqlctl.StartResponse + * @static + * @param {mysqlctl.IStartResponse=} [properties] Properties to set + * @returns {mysqlctl.StartResponse} StartResponse instance + */ + StartResponse.create = function create(properties) { + return new StartResponse(properties); + }; + + /** + * Encodes the specified StartResponse message. Does not implicitly {@link mysqlctl.StartResponse.verify|verify} messages. + * @function encode + * @memberof mysqlctl.StartResponse + * @static + * @param {mysqlctl.IStartResponse} message StartResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified StartResponse message, length delimited. Does not implicitly {@link mysqlctl.StartResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof mysqlctl.StartResponse + * @static + * @param {mysqlctl.IStartResponse} message StartResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StartResponse message from the specified reader or buffer. + * @function decode + * @memberof mysqlctl.StartResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {mysqlctl.StartResponse} StartResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.StartResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StartResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof mysqlctl.StartResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {mysqlctl.StartResponse} StartResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StartResponse message. + * @function verify + * @memberof mysqlctl.StartResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StartResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a StartResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof mysqlctl.StartResponse + * @static + * @param {Object.} object Plain object + * @returns {mysqlctl.StartResponse} StartResponse + */ + StartResponse.fromObject = function fromObject(object) { + if (object instanceof $root.mysqlctl.StartResponse) + return object; + return new $root.mysqlctl.StartResponse(); + }; + + /** + * Creates a plain object from a StartResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof mysqlctl.StartResponse + * @static + * @param {mysqlctl.StartResponse} message StartResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StartResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this StartResponse to JSON. + * @function toJSON + * @memberof mysqlctl.StartResponse + * @instance + * @returns {Object.} JSON object + */ + StartResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for StartResponse + * @function getTypeUrl + * @memberof mysqlctl.StartResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + StartResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/mysqlctl.StartResponse"; + }; + + return StartResponse; + })(); + + mysqlctl.ShutdownRequest = (function() { + + /** + * Properties of a ShutdownRequest. + * @memberof mysqlctl + * @interface IShutdownRequest + * @property {boolean|null} [wait_for_mysqld] ShutdownRequest wait_for_mysqld + * @property {vttime.IDuration|null} [mysql_shutdown_timeout] ShutdownRequest mysql_shutdown_timeout + */ + + /** + * Constructs a new ShutdownRequest. + * @memberof mysqlctl + * @classdesc Represents a ShutdownRequest. + * @implements IShutdownRequest + * @constructor + * @param {mysqlctl.IShutdownRequest=} [properties] Properties to set + */ + function ShutdownRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ShutdownRequest wait_for_mysqld. + * @member {boolean} wait_for_mysqld + * @memberof mysqlctl.ShutdownRequest + * @instance + */ + ShutdownRequest.prototype.wait_for_mysqld = false; + + /** + * ShutdownRequest mysql_shutdown_timeout. + * @member {vttime.IDuration|null|undefined} mysql_shutdown_timeout + * @memberof mysqlctl.ShutdownRequest + * @instance + */ + ShutdownRequest.prototype.mysql_shutdown_timeout = null; + + /** + * Creates a new ShutdownRequest instance using the specified properties. + * @function create + * @memberof mysqlctl.ShutdownRequest + * @static + * @param {mysqlctl.IShutdownRequest=} [properties] Properties to set + * @returns {mysqlctl.ShutdownRequest} ShutdownRequest instance + */ + ShutdownRequest.create = function create(properties) { + return new ShutdownRequest(properties); + }; + + /** + * Encodes the specified ShutdownRequest message. Does not implicitly {@link mysqlctl.ShutdownRequest.verify|verify} messages. + * @function encode + * @memberof mysqlctl.ShutdownRequest + * @static + * @param {mysqlctl.IShutdownRequest} message ShutdownRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShutdownRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.wait_for_mysqld != null && Object.hasOwnProperty.call(message, "wait_for_mysqld")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.wait_for_mysqld); + if (message.mysql_shutdown_timeout != null && Object.hasOwnProperty.call(message, "mysql_shutdown_timeout")) + $root.vttime.Duration.encode(message.mysql_shutdown_timeout, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ShutdownRequest message, length delimited. Does not implicitly {@link mysqlctl.ShutdownRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof mysqlctl.ShutdownRequest + * @static + * @param {mysqlctl.IShutdownRequest} message ShutdownRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShutdownRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ShutdownRequest message from the specified reader or buffer. + * @function decode + * @memberof mysqlctl.ShutdownRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {mysqlctl.ShutdownRequest} ShutdownRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShutdownRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.ShutdownRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.wait_for_mysqld = reader.bool(); + break; + } + case 2: { + message.mysql_shutdown_timeout = $root.vttime.Duration.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ShutdownRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof mysqlctl.ShutdownRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {mysqlctl.ShutdownRequest} ShutdownRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShutdownRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ShutdownRequest message. + * @function verify + * @memberof mysqlctl.ShutdownRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ShutdownRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.wait_for_mysqld != null && message.hasOwnProperty("wait_for_mysqld")) + if (typeof message.wait_for_mysqld !== "boolean") + return "wait_for_mysqld: boolean expected"; + if (message.mysql_shutdown_timeout != null && message.hasOwnProperty("mysql_shutdown_timeout")) { + let error = $root.vttime.Duration.verify(message.mysql_shutdown_timeout); + if (error) + return "mysql_shutdown_timeout." + error; + } + return null; + }; + + /** + * Creates a ShutdownRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof mysqlctl.ShutdownRequest + * @static + * @param {Object.} object Plain object + * @returns {mysqlctl.ShutdownRequest} ShutdownRequest + */ + ShutdownRequest.fromObject = function fromObject(object) { + if (object instanceof $root.mysqlctl.ShutdownRequest) + return object; + let message = new $root.mysqlctl.ShutdownRequest(); + if (object.wait_for_mysqld != null) + message.wait_for_mysqld = Boolean(object.wait_for_mysqld); + if (object.mysql_shutdown_timeout != null) { + if (typeof object.mysql_shutdown_timeout !== "object") + throw TypeError(".mysqlctl.ShutdownRequest.mysql_shutdown_timeout: object expected"); + message.mysql_shutdown_timeout = $root.vttime.Duration.fromObject(object.mysql_shutdown_timeout); + } + return message; + }; + + /** + * Creates a plain object from a ShutdownRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof mysqlctl.ShutdownRequest + * @static + * @param {mysqlctl.ShutdownRequest} message ShutdownRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ShutdownRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.wait_for_mysqld = false; + object.mysql_shutdown_timeout = null; + } + if (message.wait_for_mysqld != null && message.hasOwnProperty("wait_for_mysqld")) + object.wait_for_mysqld = message.wait_for_mysqld; + if (message.mysql_shutdown_timeout != null && message.hasOwnProperty("mysql_shutdown_timeout")) + object.mysql_shutdown_timeout = $root.vttime.Duration.toObject(message.mysql_shutdown_timeout, options); + return object; + }; + + /** + * Converts this ShutdownRequest to JSON. + * @function toJSON + * @memberof mysqlctl.ShutdownRequest + * @instance + * @returns {Object.} JSON object + */ + ShutdownRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ShutdownRequest + * @function getTypeUrl + * @memberof mysqlctl.ShutdownRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ShutdownRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/mysqlctl.ShutdownRequest"; + }; + + return ShutdownRequest; + })(); + + mysqlctl.ShutdownResponse = (function() { + + /** + * Properties of a ShutdownResponse. + * @memberof mysqlctl + * @interface IShutdownResponse + */ + + /** + * Constructs a new ShutdownResponse. + * @memberof mysqlctl + * @classdesc Represents a ShutdownResponse. + * @implements IShutdownResponse + * @constructor + * @param {mysqlctl.IShutdownResponse=} [properties] Properties to set + */ + function ShutdownResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new ShutdownResponse instance using the specified properties. + * @function create + * @memberof mysqlctl.ShutdownResponse + * @static + * @param {mysqlctl.IShutdownResponse=} [properties] Properties to set + * @returns {mysqlctl.ShutdownResponse} ShutdownResponse instance + */ + ShutdownResponse.create = function create(properties) { + return new ShutdownResponse(properties); + }; + + /** + * Encodes the specified ShutdownResponse message. Does not implicitly {@link mysqlctl.ShutdownResponse.verify|verify} messages. + * @function encode + * @memberof mysqlctl.ShutdownResponse + * @static + * @param {mysqlctl.IShutdownResponse} message ShutdownResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShutdownResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified ShutdownResponse message, length delimited. Does not implicitly {@link mysqlctl.ShutdownResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof mysqlctl.ShutdownResponse + * @static + * @param {mysqlctl.IShutdownResponse} message ShutdownResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShutdownResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ShutdownResponse message from the specified reader or buffer. + * @function decode + * @memberof mysqlctl.ShutdownResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {mysqlctl.ShutdownResponse} ShutdownResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShutdownResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.ShutdownResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ShutdownResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof mysqlctl.ShutdownResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {mysqlctl.ShutdownResponse} ShutdownResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShutdownResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ShutdownResponse message. + * @function verify + * @memberof mysqlctl.ShutdownResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ShutdownResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a ShutdownResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof mysqlctl.ShutdownResponse + * @static + * @param {Object.} object Plain object + * @returns {mysqlctl.ShutdownResponse} ShutdownResponse + */ + ShutdownResponse.fromObject = function fromObject(object) { + if (object instanceof $root.mysqlctl.ShutdownResponse) + return object; + return new $root.mysqlctl.ShutdownResponse(); + }; + + /** + * Creates a plain object from a ShutdownResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof mysqlctl.ShutdownResponse + * @static + * @param {mysqlctl.ShutdownResponse} message ShutdownResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ShutdownResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this ShutdownResponse to JSON. + * @function toJSON + * @memberof mysqlctl.ShutdownResponse + * @instance + * @returns {Object.} JSON object + */ + ShutdownResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ShutdownResponse + * @function getTypeUrl + * @memberof mysqlctl.ShutdownResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ShutdownResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/mysqlctl.ShutdownResponse"; + }; + + return ShutdownResponse; + })(); + + mysqlctl.RunMysqlUpgradeRequest = (function() { + + /** + * Properties of a RunMysqlUpgradeRequest. + * @memberof mysqlctl + * @interface IRunMysqlUpgradeRequest + */ + + /** + * Constructs a new RunMysqlUpgradeRequest. + * @memberof mysqlctl + * @classdesc Represents a RunMysqlUpgradeRequest. + * @implements IRunMysqlUpgradeRequest + * @constructor + * @param {mysqlctl.IRunMysqlUpgradeRequest=} [properties] Properties to set + */ + function RunMysqlUpgradeRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new RunMysqlUpgradeRequest instance using the specified properties. + * @function create + * @memberof mysqlctl.RunMysqlUpgradeRequest + * @static + * @param {mysqlctl.IRunMysqlUpgradeRequest=} [properties] Properties to set + * @returns {mysqlctl.RunMysqlUpgradeRequest} RunMysqlUpgradeRequest instance + */ + RunMysqlUpgradeRequest.create = function create(properties) { + return new RunMysqlUpgradeRequest(properties); + }; + + /** + * Encodes the specified RunMysqlUpgradeRequest message. Does not implicitly {@link mysqlctl.RunMysqlUpgradeRequest.verify|verify} messages. + * @function encode + * @memberof mysqlctl.RunMysqlUpgradeRequest + * @static + * @param {mysqlctl.IRunMysqlUpgradeRequest} message RunMysqlUpgradeRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RunMysqlUpgradeRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified RunMysqlUpgradeRequest message, length delimited. Does not implicitly {@link mysqlctl.RunMysqlUpgradeRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof mysqlctl.RunMysqlUpgradeRequest + * @static + * @param {mysqlctl.IRunMysqlUpgradeRequest} message RunMysqlUpgradeRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RunMysqlUpgradeRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RunMysqlUpgradeRequest message from the specified reader or buffer. + * @function decode + * @memberof mysqlctl.RunMysqlUpgradeRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {mysqlctl.RunMysqlUpgradeRequest} RunMysqlUpgradeRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RunMysqlUpgradeRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.RunMysqlUpgradeRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RunMysqlUpgradeRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof mysqlctl.RunMysqlUpgradeRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {mysqlctl.RunMysqlUpgradeRequest} RunMysqlUpgradeRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RunMysqlUpgradeRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RunMysqlUpgradeRequest message. + * @function verify + * @memberof mysqlctl.RunMysqlUpgradeRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RunMysqlUpgradeRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a RunMysqlUpgradeRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof mysqlctl.RunMysqlUpgradeRequest + * @static + * @param {Object.} object Plain object + * @returns {mysqlctl.RunMysqlUpgradeRequest} RunMysqlUpgradeRequest + */ + RunMysqlUpgradeRequest.fromObject = function fromObject(object) { + if (object instanceof $root.mysqlctl.RunMysqlUpgradeRequest) + return object; + return new $root.mysqlctl.RunMysqlUpgradeRequest(); + }; + + /** + * Creates a plain object from a RunMysqlUpgradeRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof mysqlctl.RunMysqlUpgradeRequest + * @static + * @param {mysqlctl.RunMysqlUpgradeRequest} message RunMysqlUpgradeRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RunMysqlUpgradeRequest.toObject = function toObject() { + return {}; + }; + + /** + * Converts this RunMysqlUpgradeRequest to JSON. + * @function toJSON + * @memberof mysqlctl.RunMysqlUpgradeRequest + * @instance + * @returns {Object.} JSON object + */ + RunMysqlUpgradeRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for RunMysqlUpgradeRequest * @function getTypeUrl * @memberof mysqlctl.RunMysqlUpgradeRequest * @static @@ -34636,6 +38995,681 @@ export const mysqlctl = $root.mysqlctl = (() => { return VersionStringResponse; })(); + mysqlctl.HostMetricsRequest = (function() { + + /** + * Properties of a HostMetricsRequest. + * @memberof mysqlctl + * @interface IHostMetricsRequest + */ + + /** + * Constructs a new HostMetricsRequest. + * @memberof mysqlctl + * @classdesc Represents a HostMetricsRequest. + * @implements IHostMetricsRequest + * @constructor + * @param {mysqlctl.IHostMetricsRequest=} [properties] Properties to set + */ + function HostMetricsRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new HostMetricsRequest instance using the specified properties. + * @function create + * @memberof mysqlctl.HostMetricsRequest + * @static + * @param {mysqlctl.IHostMetricsRequest=} [properties] Properties to set + * @returns {mysqlctl.HostMetricsRequest} HostMetricsRequest instance + */ + HostMetricsRequest.create = function create(properties) { + return new HostMetricsRequest(properties); + }; + + /** + * Encodes the specified HostMetricsRequest message. Does not implicitly {@link mysqlctl.HostMetricsRequest.verify|verify} messages. + * @function encode + * @memberof mysqlctl.HostMetricsRequest + * @static + * @param {mysqlctl.IHostMetricsRequest} message HostMetricsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HostMetricsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified HostMetricsRequest message, length delimited. Does not implicitly {@link mysqlctl.HostMetricsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof mysqlctl.HostMetricsRequest + * @static + * @param {mysqlctl.IHostMetricsRequest} message HostMetricsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HostMetricsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HostMetricsRequest message from the specified reader or buffer. + * @function decode + * @memberof mysqlctl.HostMetricsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {mysqlctl.HostMetricsRequest} HostMetricsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HostMetricsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.HostMetricsRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HostMetricsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof mysqlctl.HostMetricsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {mysqlctl.HostMetricsRequest} HostMetricsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HostMetricsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HostMetricsRequest message. + * @function verify + * @memberof mysqlctl.HostMetricsRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HostMetricsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a HostMetricsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof mysqlctl.HostMetricsRequest + * @static + * @param {Object.} object Plain object + * @returns {mysqlctl.HostMetricsRequest} HostMetricsRequest + */ + HostMetricsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.mysqlctl.HostMetricsRequest) + return object; + return new $root.mysqlctl.HostMetricsRequest(); + }; + + /** + * Creates a plain object from a HostMetricsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof mysqlctl.HostMetricsRequest + * @static + * @param {mysqlctl.HostMetricsRequest} message HostMetricsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HostMetricsRequest.toObject = function toObject() { + return {}; + }; + + /** + * Converts this HostMetricsRequest to JSON. + * @function toJSON + * @memberof mysqlctl.HostMetricsRequest + * @instance + * @returns {Object.} JSON object + */ + HostMetricsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for HostMetricsRequest + * @function getTypeUrl + * @memberof mysqlctl.HostMetricsRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + HostMetricsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/mysqlctl.HostMetricsRequest"; + }; + + return HostMetricsRequest; + })(); + + mysqlctl.HostMetricsResponse = (function() { + + /** + * Properties of a HostMetricsResponse. + * @memberof mysqlctl + * @interface IHostMetricsResponse + * @property {Object.|null} [metrics] HostMetricsResponse metrics + */ + + /** + * Constructs a new HostMetricsResponse. + * @memberof mysqlctl + * @classdesc Represents a HostMetricsResponse. + * @implements IHostMetricsResponse + * @constructor + * @param {mysqlctl.IHostMetricsResponse=} [properties] Properties to set + */ + function HostMetricsResponse(properties) { + this.metrics = {}; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HostMetricsResponse metrics. + * @member {Object.} metrics + * @memberof mysqlctl.HostMetricsResponse + * @instance + */ + HostMetricsResponse.prototype.metrics = $util.emptyObject; + + /** + * Creates a new HostMetricsResponse instance using the specified properties. + * @function create + * @memberof mysqlctl.HostMetricsResponse + * @static + * @param {mysqlctl.IHostMetricsResponse=} [properties] Properties to set + * @returns {mysqlctl.HostMetricsResponse} HostMetricsResponse instance + */ + HostMetricsResponse.create = function create(properties) { + return new HostMetricsResponse(properties); + }; + + /** + * Encodes the specified HostMetricsResponse message. Does not implicitly {@link mysqlctl.HostMetricsResponse.verify|verify} messages. + * @function encode + * @memberof mysqlctl.HostMetricsResponse + * @static + * @param {mysqlctl.IHostMetricsResponse} message HostMetricsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HostMetricsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.metrics != null && Object.hasOwnProperty.call(message, "metrics")) + for (let keys = Object.keys(message.metrics), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); + $root.mysqlctl.HostMetricsResponse.Metric.encode(message.metrics[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + return writer; + }; + + /** + * Encodes the specified HostMetricsResponse message, length delimited. Does not implicitly {@link mysqlctl.HostMetricsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof mysqlctl.HostMetricsResponse + * @static + * @param {mysqlctl.IHostMetricsResponse} message HostMetricsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HostMetricsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HostMetricsResponse message from the specified reader or buffer. + * @function decode + * @memberof mysqlctl.HostMetricsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {mysqlctl.HostMetricsResponse} HostMetricsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HostMetricsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.HostMetricsResponse(), key, value; + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (message.metrics === $util.emptyObject) + message.metrics = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.mysqlctl.HostMetricsResponse.Metric.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.metrics[key] = value; + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HostMetricsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof mysqlctl.HostMetricsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {mysqlctl.HostMetricsResponse} HostMetricsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HostMetricsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HostMetricsResponse message. + * @function verify + * @memberof mysqlctl.HostMetricsResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HostMetricsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.metrics != null && message.hasOwnProperty("metrics")) { + if (!$util.isObject(message.metrics)) + return "metrics: object expected"; + let key = Object.keys(message.metrics); + for (let i = 0; i < key.length; ++i) { + let error = $root.mysqlctl.HostMetricsResponse.Metric.verify(message.metrics[key[i]]); + if (error) + return "metrics." + error; + } + } + return null; + }; + + /** + * Creates a HostMetricsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof mysqlctl.HostMetricsResponse + * @static + * @param {Object.} object Plain object + * @returns {mysqlctl.HostMetricsResponse} HostMetricsResponse + */ + HostMetricsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.mysqlctl.HostMetricsResponse) + return object; + let message = new $root.mysqlctl.HostMetricsResponse(); + if (object.metrics) { + if (typeof object.metrics !== "object") + throw TypeError(".mysqlctl.HostMetricsResponse.metrics: object expected"); + message.metrics = {}; + for (let keys = Object.keys(object.metrics), i = 0; i < keys.length; ++i) { + if (typeof object.metrics[keys[i]] !== "object") + throw TypeError(".mysqlctl.HostMetricsResponse.metrics: object expected"); + message.metrics[keys[i]] = $root.mysqlctl.HostMetricsResponse.Metric.fromObject(object.metrics[keys[i]]); + } + } + return message; + }; + + /** + * Creates a plain object from a HostMetricsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof mysqlctl.HostMetricsResponse + * @static + * @param {mysqlctl.HostMetricsResponse} message HostMetricsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HostMetricsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.objects || options.defaults) + object.metrics = {}; + let keys2; + if (message.metrics && (keys2 = Object.keys(message.metrics)).length) { + object.metrics = {}; + for (let j = 0; j < keys2.length; ++j) + object.metrics[keys2[j]] = $root.mysqlctl.HostMetricsResponse.Metric.toObject(message.metrics[keys2[j]], options); + } + return object; + }; + + /** + * Converts this HostMetricsResponse to JSON. + * @function toJSON + * @memberof mysqlctl.HostMetricsResponse + * @instance + * @returns {Object.} JSON object + */ + HostMetricsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for HostMetricsResponse + * @function getTypeUrl + * @memberof mysqlctl.HostMetricsResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + HostMetricsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/mysqlctl.HostMetricsResponse"; + }; + + HostMetricsResponse.Metric = (function() { + + /** + * Properties of a Metric. + * @memberof mysqlctl.HostMetricsResponse + * @interface IMetric + * @property {string|null} [name] Metric name + * @property {number|null} [value] Metric value + * @property {vtrpc.IRPCError|null} [error] Metric error + */ + + /** + * Constructs a new Metric. + * @memberof mysqlctl.HostMetricsResponse + * @classdesc Represents a Metric. + * @implements IMetric + * @constructor + * @param {mysqlctl.HostMetricsResponse.IMetric=} [properties] Properties to set + */ + function Metric(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Metric name. + * @member {string} name + * @memberof mysqlctl.HostMetricsResponse.Metric + * @instance + */ + Metric.prototype.name = ""; + + /** + * Metric value. + * @member {number} value + * @memberof mysqlctl.HostMetricsResponse.Metric + * @instance + */ + Metric.prototype.value = 0; + + /** + * Metric error. + * @member {vtrpc.IRPCError|null|undefined} error + * @memberof mysqlctl.HostMetricsResponse.Metric + * @instance + */ + Metric.prototype.error = null; + + /** + * Creates a new Metric instance using the specified properties. + * @function create + * @memberof mysqlctl.HostMetricsResponse.Metric + * @static + * @param {mysqlctl.HostMetricsResponse.IMetric=} [properties] Properties to set + * @returns {mysqlctl.HostMetricsResponse.Metric} Metric instance + */ + Metric.create = function create(properties) { + return new Metric(properties); + }; + + /** + * Encodes the specified Metric message. Does not implicitly {@link mysqlctl.HostMetricsResponse.Metric.verify|verify} messages. + * @function encode + * @memberof mysqlctl.HostMetricsResponse.Metric + * @static + * @param {mysqlctl.HostMetricsResponse.IMetric} message Metric message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Metric.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + if (message.value != null && Object.hasOwnProperty.call(message, "value")) + writer.uint32(/* id 2, wireType 1 =*/17).double(message.value); + if (message.error != null && Object.hasOwnProperty.call(message, "error")) + $root.vtrpc.RPCError.encode(message.error, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified Metric message, length delimited. Does not implicitly {@link mysqlctl.HostMetricsResponse.Metric.verify|verify} messages. + * @function encodeDelimited + * @memberof mysqlctl.HostMetricsResponse.Metric + * @static + * @param {mysqlctl.HostMetricsResponse.IMetric} message Metric message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Metric.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Metric message from the specified reader or buffer. + * @function decode + * @memberof mysqlctl.HostMetricsResponse.Metric + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {mysqlctl.HostMetricsResponse.Metric} Metric + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Metric.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.mysqlctl.HostMetricsResponse.Metric(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.name = reader.string(); + break; + } + case 2: { + message.value = reader.double(); + break; + } + case 3: { + message.error = $root.vtrpc.RPCError.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Metric message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof mysqlctl.HostMetricsResponse.Metric + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {mysqlctl.HostMetricsResponse.Metric} Metric + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Metric.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Metric message. + * @function verify + * @memberof mysqlctl.HostMetricsResponse.Metric + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Metric.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.value != null && message.hasOwnProperty("value")) + if (typeof message.value !== "number") + return "value: number expected"; + if (message.error != null && message.hasOwnProperty("error")) { + let error = $root.vtrpc.RPCError.verify(message.error); + if (error) + return "error." + error; + } + return null; + }; + + /** + * Creates a Metric message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof mysqlctl.HostMetricsResponse.Metric + * @static + * @param {Object.} object Plain object + * @returns {mysqlctl.HostMetricsResponse.Metric} Metric + */ + Metric.fromObject = function fromObject(object) { + if (object instanceof $root.mysqlctl.HostMetricsResponse.Metric) + return object; + let message = new $root.mysqlctl.HostMetricsResponse.Metric(); + if (object.name != null) + message.name = String(object.name); + if (object.value != null) + message.value = Number(object.value); + if (object.error != null) { + if (typeof object.error !== "object") + throw TypeError(".mysqlctl.HostMetricsResponse.Metric.error: object expected"); + message.error = $root.vtrpc.RPCError.fromObject(object.error); + } + return message; + }; + + /** + * Creates a plain object from a Metric message. Also converts values to other types if specified. + * @function toObject + * @memberof mysqlctl.HostMetricsResponse.Metric + * @static + * @param {mysqlctl.HostMetricsResponse.Metric} message Metric + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Metric.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.name = ""; + object.value = 0; + object.error = null; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.value != null && message.hasOwnProperty("value")) + object.value = options.json && !isFinite(message.value) ? String(message.value) : message.value; + if (message.error != null && message.hasOwnProperty("error")) + object.error = $root.vtrpc.RPCError.toObject(message.error, options); + return object; + }; + + /** + * Converts this Metric to JSON. + * @function toJSON + * @memberof mysqlctl.HostMetricsResponse.Metric + * @instance + * @returns {Object.} JSON object + */ + Metric.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for Metric + * @function getTypeUrl + * @memberof mysqlctl.HostMetricsResponse.Metric + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Metric.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/mysqlctl.HostMetricsResponse.Metric"; + }; + + return Metric; + })(); + + return HostMetricsResponse; + })(); + mysqlctl.MysqlCtl = (function() { /** @@ -34932,6 +39966,39 @@ export const mysqlctl = $root.mysqlctl = (() => { * @variation 2 */ + /** + * Callback as used by {@link mysqlctl.MysqlCtl#hostMetrics}. + * @memberof mysqlctl.MysqlCtl + * @typedef HostMetricsCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {mysqlctl.HostMetricsResponse} [response] HostMetricsResponse + */ + + /** + * Calls HostMetrics. + * @function hostMetrics + * @memberof mysqlctl.MysqlCtl + * @instance + * @param {mysqlctl.IHostMetricsRequest} request HostMetricsRequest message or plain object + * @param {mysqlctl.MysqlCtl.HostMetricsCallback} callback Node-style callback called with the error, if any, and HostMetricsResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(MysqlCtl.prototype.hostMetrics = function hostMetrics(request, callback) { + return this.rpcCall(hostMetrics, $root.mysqlctl.HostMetricsRequest, $root.mysqlctl.HostMetricsResponse, request, callback); + }, "name", { value: "HostMetrics" }); + + /** + * Calls HostMetrics. + * @function hostMetrics + * @memberof mysqlctl.MysqlCtl + * @instance + * @param {mysqlctl.IHostMetricsRequest} request HostMetricsRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + return MysqlCtl; })(); @@ -41829,6 +46896,687 @@ export const topodata = $root.topodata = (() => { return topodata; })(); +export const vtrpc = $root.vtrpc = (() => { + + /** + * Namespace vtrpc. + * @exports vtrpc + * @namespace + */ + const vtrpc = {}; + + vtrpc.CallerID = (function() { + + /** + * Properties of a CallerID. + * @memberof vtrpc + * @interface ICallerID + * @property {string|null} [principal] CallerID principal + * @property {string|null} [component] CallerID component + * @property {string|null} [subcomponent] CallerID subcomponent + * @property {Array.|null} [groups] CallerID groups + */ + + /** + * Constructs a new CallerID. + * @memberof vtrpc + * @classdesc Represents a CallerID. + * @implements ICallerID + * @constructor + * @param {vtrpc.ICallerID=} [properties] Properties to set + */ + function CallerID(properties) { + this.groups = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * CallerID principal. + * @member {string} principal + * @memberof vtrpc.CallerID + * @instance + */ + CallerID.prototype.principal = ""; + + /** + * CallerID component. + * @member {string} component + * @memberof vtrpc.CallerID + * @instance + */ + CallerID.prototype.component = ""; + + /** + * CallerID subcomponent. + * @member {string} subcomponent + * @memberof vtrpc.CallerID + * @instance + */ + CallerID.prototype.subcomponent = ""; + + /** + * CallerID groups. + * @member {Array.} groups + * @memberof vtrpc.CallerID + * @instance + */ + CallerID.prototype.groups = $util.emptyArray; + + /** + * Creates a new CallerID instance using the specified properties. + * @function create + * @memberof vtrpc.CallerID + * @static + * @param {vtrpc.ICallerID=} [properties] Properties to set + * @returns {vtrpc.CallerID} CallerID instance + */ + CallerID.create = function create(properties) { + return new CallerID(properties); + }; + + /** + * Encodes the specified CallerID message. Does not implicitly {@link vtrpc.CallerID.verify|verify} messages. + * @function encode + * @memberof vtrpc.CallerID + * @static + * @param {vtrpc.ICallerID} message CallerID message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CallerID.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.principal != null && Object.hasOwnProperty.call(message, "principal")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.principal); + if (message.component != null && Object.hasOwnProperty.call(message, "component")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.component); + if (message.subcomponent != null && Object.hasOwnProperty.call(message, "subcomponent")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.subcomponent); + if (message.groups != null && message.groups.length) + for (let i = 0; i < message.groups.length; ++i) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.groups[i]); + return writer; + }; + + /** + * Encodes the specified CallerID message, length delimited. Does not implicitly {@link vtrpc.CallerID.verify|verify} messages. + * @function encodeDelimited + * @memberof vtrpc.CallerID + * @static + * @param {vtrpc.ICallerID} message CallerID message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CallerID.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CallerID message from the specified reader or buffer. + * @function decode + * @memberof vtrpc.CallerID + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtrpc.CallerID} CallerID + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CallerID.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtrpc.CallerID(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.principal = reader.string(); + break; + } + case 2: { + message.component = reader.string(); + break; + } + case 3: { + message.subcomponent = reader.string(); + break; + } + case 4: { + if (!(message.groups && message.groups.length)) + message.groups = []; + message.groups.push(reader.string()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CallerID message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtrpc.CallerID + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtrpc.CallerID} CallerID + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CallerID.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CallerID message. + * @function verify + * @memberof vtrpc.CallerID + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CallerID.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.principal != null && message.hasOwnProperty("principal")) + if (!$util.isString(message.principal)) + return "principal: string expected"; + if (message.component != null && message.hasOwnProperty("component")) + if (!$util.isString(message.component)) + return "component: string expected"; + if (message.subcomponent != null && message.hasOwnProperty("subcomponent")) + if (!$util.isString(message.subcomponent)) + return "subcomponent: string expected"; + if (message.groups != null && message.hasOwnProperty("groups")) { + if (!Array.isArray(message.groups)) + return "groups: array expected"; + for (let i = 0; i < message.groups.length; ++i) + if (!$util.isString(message.groups[i])) + return "groups: string[] expected"; + } + return null; + }; + + /** + * Creates a CallerID message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtrpc.CallerID + * @static + * @param {Object.} object Plain object + * @returns {vtrpc.CallerID} CallerID + */ + CallerID.fromObject = function fromObject(object) { + if (object instanceof $root.vtrpc.CallerID) + return object; + let message = new $root.vtrpc.CallerID(); + if (object.principal != null) + message.principal = String(object.principal); + if (object.component != null) + message.component = String(object.component); + if (object.subcomponent != null) + message.subcomponent = String(object.subcomponent); + if (object.groups) { + if (!Array.isArray(object.groups)) + throw TypeError(".vtrpc.CallerID.groups: array expected"); + message.groups = []; + for (let i = 0; i < object.groups.length; ++i) + message.groups[i] = String(object.groups[i]); + } + return message; + }; + + /** + * Creates a plain object from a CallerID message. Also converts values to other types if specified. + * @function toObject + * @memberof vtrpc.CallerID + * @static + * @param {vtrpc.CallerID} message CallerID + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CallerID.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.groups = []; + if (options.defaults) { + object.principal = ""; + object.component = ""; + object.subcomponent = ""; + } + if (message.principal != null && message.hasOwnProperty("principal")) + object.principal = message.principal; + if (message.component != null && message.hasOwnProperty("component")) + object.component = message.component; + if (message.subcomponent != null && message.hasOwnProperty("subcomponent")) + object.subcomponent = message.subcomponent; + if (message.groups && message.groups.length) { + object.groups = []; + for (let j = 0; j < message.groups.length; ++j) + object.groups[j] = message.groups[j]; + } + return object; + }; + + /** + * Converts this CallerID to JSON. + * @function toJSON + * @memberof vtrpc.CallerID + * @instance + * @returns {Object.} JSON object + */ + CallerID.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for CallerID + * @function getTypeUrl + * @memberof vtrpc.CallerID + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + CallerID.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtrpc.CallerID"; + }; + + return CallerID; + })(); + + /** + * Code enum. + * @name vtrpc.Code + * @enum {number} + * @property {number} OK=0 OK value + * @property {number} CANCELED=1 CANCELED value + * @property {number} UNKNOWN=2 UNKNOWN value + * @property {number} INVALID_ARGUMENT=3 INVALID_ARGUMENT value + * @property {number} DEADLINE_EXCEEDED=4 DEADLINE_EXCEEDED value + * @property {number} NOT_FOUND=5 NOT_FOUND value + * @property {number} ALREADY_EXISTS=6 ALREADY_EXISTS value + * @property {number} PERMISSION_DENIED=7 PERMISSION_DENIED value + * @property {number} RESOURCE_EXHAUSTED=8 RESOURCE_EXHAUSTED value + * @property {number} FAILED_PRECONDITION=9 FAILED_PRECONDITION value + * @property {number} ABORTED=10 ABORTED value + * @property {number} OUT_OF_RANGE=11 OUT_OF_RANGE value + * @property {number} UNIMPLEMENTED=12 UNIMPLEMENTED value + * @property {number} INTERNAL=13 INTERNAL value + * @property {number} UNAVAILABLE=14 UNAVAILABLE value + * @property {number} DATA_LOSS=15 DATA_LOSS value + * @property {number} UNAUTHENTICATED=16 UNAUTHENTICATED value + * @property {number} CLUSTER_EVENT=17 CLUSTER_EVENT value + * @property {number} READ_ONLY=18 READ_ONLY value + */ + vtrpc.Code = (function() { + const valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "OK"] = 0; + values[valuesById[1] = "CANCELED"] = 1; + values[valuesById[2] = "UNKNOWN"] = 2; + values[valuesById[3] = "INVALID_ARGUMENT"] = 3; + values[valuesById[4] = "DEADLINE_EXCEEDED"] = 4; + values[valuesById[5] = "NOT_FOUND"] = 5; + values[valuesById[6] = "ALREADY_EXISTS"] = 6; + values[valuesById[7] = "PERMISSION_DENIED"] = 7; + values[valuesById[8] = "RESOURCE_EXHAUSTED"] = 8; + values[valuesById[9] = "FAILED_PRECONDITION"] = 9; + values[valuesById[10] = "ABORTED"] = 10; + values[valuesById[11] = "OUT_OF_RANGE"] = 11; + values[valuesById[12] = "UNIMPLEMENTED"] = 12; + values[valuesById[13] = "INTERNAL"] = 13; + values[valuesById[14] = "UNAVAILABLE"] = 14; + values[valuesById[15] = "DATA_LOSS"] = 15; + values[valuesById[16] = "UNAUTHENTICATED"] = 16; + values[valuesById[17] = "CLUSTER_EVENT"] = 17; + values[valuesById[18] = "READ_ONLY"] = 18; + return values; + })(); + + vtrpc.RPCError = (function() { + + /** + * Properties of a RPCError. + * @memberof vtrpc + * @interface IRPCError + * @property {string|null} [message] RPCError message + * @property {vtrpc.Code|null} [code] RPCError code + */ + + /** + * Constructs a new RPCError. + * @memberof vtrpc + * @classdesc Represents a RPCError. + * @implements IRPCError + * @constructor + * @param {vtrpc.IRPCError=} [properties] Properties to set + */ + function RPCError(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RPCError message. + * @member {string} message + * @memberof vtrpc.RPCError + * @instance + */ + RPCError.prototype.message = ""; + + /** + * RPCError code. + * @member {vtrpc.Code} code + * @memberof vtrpc.RPCError + * @instance + */ + RPCError.prototype.code = 0; + + /** + * Creates a new RPCError instance using the specified properties. + * @function create + * @memberof vtrpc.RPCError + * @static + * @param {vtrpc.IRPCError=} [properties] Properties to set + * @returns {vtrpc.RPCError} RPCError instance + */ + RPCError.create = function create(properties) { + return new RPCError(properties); + }; + + /** + * Encodes the specified RPCError message. Does not implicitly {@link vtrpc.RPCError.verify|verify} messages. + * @function encode + * @memberof vtrpc.RPCError + * @static + * @param {vtrpc.IRPCError} message RPCError message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RPCError.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.message != null && Object.hasOwnProperty.call(message, "message")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.message); + if (message.code != null && Object.hasOwnProperty.call(message, "code")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.code); + return writer; + }; + + /** + * Encodes the specified RPCError message, length delimited. Does not implicitly {@link vtrpc.RPCError.verify|verify} messages. + * @function encodeDelimited + * @memberof vtrpc.RPCError + * @static + * @param {vtrpc.IRPCError} message RPCError message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RPCError.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RPCError message from the specified reader or buffer. + * @function decode + * @memberof vtrpc.RPCError + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtrpc.RPCError} RPCError + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RPCError.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtrpc.RPCError(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + message.message = reader.string(); + break; + } + case 3: { + message.code = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RPCError message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtrpc.RPCError + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtrpc.RPCError} RPCError + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RPCError.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RPCError message. + * @function verify + * @memberof vtrpc.RPCError + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RPCError.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.message != null && message.hasOwnProperty("message")) + if (!$util.isString(message.message)) + return "message: string expected"; + if (message.code != null && message.hasOwnProperty("code")) + switch (message.code) { + default: + return "code: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + break; + } + return null; + }; + + /** + * Creates a RPCError message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtrpc.RPCError + * @static + * @param {Object.} object Plain object + * @returns {vtrpc.RPCError} RPCError + */ + RPCError.fromObject = function fromObject(object) { + if (object instanceof $root.vtrpc.RPCError) + return object; + let message = new $root.vtrpc.RPCError(); + if (object.message != null) + message.message = String(object.message); + switch (object.code) { + default: + if (typeof object.code === "number") { + message.code = object.code; + break; + } + break; + case "OK": + case 0: + message.code = 0; + break; + case "CANCELED": + case 1: + message.code = 1; + break; + case "UNKNOWN": + case 2: + message.code = 2; + break; + case "INVALID_ARGUMENT": + case 3: + message.code = 3; + break; + case "DEADLINE_EXCEEDED": + case 4: + message.code = 4; + break; + case "NOT_FOUND": + case 5: + message.code = 5; + break; + case "ALREADY_EXISTS": + case 6: + message.code = 6; + break; + case "PERMISSION_DENIED": + case 7: + message.code = 7; + break; + case "RESOURCE_EXHAUSTED": + case 8: + message.code = 8; + break; + case "FAILED_PRECONDITION": + case 9: + message.code = 9; + break; + case "ABORTED": + case 10: + message.code = 10; + break; + case "OUT_OF_RANGE": + case 11: + message.code = 11; + break; + case "UNIMPLEMENTED": + case 12: + message.code = 12; + break; + case "INTERNAL": + case 13: + message.code = 13; + break; + case "UNAVAILABLE": + case 14: + message.code = 14; + break; + case "DATA_LOSS": + case 15: + message.code = 15; + break; + case "UNAUTHENTICATED": + case 16: + message.code = 16; + break; + case "CLUSTER_EVENT": + case 17: + message.code = 17; + break; + case "READ_ONLY": + case 18: + message.code = 18; + break; + } + return message; + }; + + /** + * Creates a plain object from a RPCError message. Also converts values to other types if specified. + * @function toObject + * @memberof vtrpc.RPCError + * @static + * @param {vtrpc.RPCError} message RPCError + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RPCError.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.message = ""; + object.code = options.enums === String ? "OK" : 0; + } + if (message.message != null && message.hasOwnProperty("message")) + object.message = message.message; + if (message.code != null && message.hasOwnProperty("code")) + object.code = options.enums === String ? $root.vtrpc.Code[message.code] === undefined ? message.code : $root.vtrpc.Code[message.code] : message.code; + return object; + }; + + /** + * Converts this RPCError to JSON. + * @function toJSON + * @memberof vtrpc.RPCError + * @instance + * @returns {Object.} JSON object + */ + RPCError.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for RPCError + * @function getTypeUrl + * @memberof vtrpc.RPCError + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + RPCError.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtrpc.RPCError"; + }; + + return RPCError; + })(); + + return vtrpc; +})(); + export const tabletmanagerdata = $root.tabletmanagerdata = (() => { /** @@ -49867,51 +55615,1979 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Converts this LockTablesRequest to JSON. + * Converts this LockTablesRequest to JSON. + * @function toJSON + * @memberof tabletmanagerdata.LockTablesRequest + * @instance + * @returns {Object.} JSON object + */ + LockTablesRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for LockTablesRequest + * @function getTypeUrl + * @memberof tabletmanagerdata.LockTablesRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + LockTablesRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.LockTablesRequest"; + }; + + return LockTablesRequest; + })(); + + tabletmanagerdata.LockTablesResponse = (function() { + + /** + * Properties of a LockTablesResponse. + * @memberof tabletmanagerdata + * @interface ILockTablesResponse + */ + + /** + * Constructs a new LockTablesResponse. + * @memberof tabletmanagerdata + * @classdesc Represents a LockTablesResponse. + * @implements ILockTablesResponse + * @constructor + * @param {tabletmanagerdata.ILockTablesResponse=} [properties] Properties to set + */ + function LockTablesResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new LockTablesResponse instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.LockTablesResponse + * @static + * @param {tabletmanagerdata.ILockTablesResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.LockTablesResponse} LockTablesResponse instance + */ + LockTablesResponse.create = function create(properties) { + return new LockTablesResponse(properties); + }; + + /** + * Encodes the specified LockTablesResponse message. Does not implicitly {@link tabletmanagerdata.LockTablesResponse.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.LockTablesResponse + * @static + * @param {tabletmanagerdata.ILockTablesResponse} message LockTablesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LockTablesResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified LockTablesResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.LockTablesResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.LockTablesResponse + * @static + * @param {tabletmanagerdata.ILockTablesResponse} message LockTablesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LockTablesResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LockTablesResponse message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.LockTablesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.LockTablesResponse} LockTablesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LockTablesResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.LockTablesResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LockTablesResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.LockTablesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.LockTablesResponse} LockTablesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LockTablesResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LockTablesResponse message. + * @function verify + * @memberof tabletmanagerdata.LockTablesResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LockTablesResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a LockTablesResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.LockTablesResponse + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.LockTablesResponse} LockTablesResponse + */ + LockTablesResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.LockTablesResponse) + return object; + return new $root.tabletmanagerdata.LockTablesResponse(); + }; + + /** + * Creates a plain object from a LockTablesResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.LockTablesResponse + * @static + * @param {tabletmanagerdata.LockTablesResponse} message LockTablesResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LockTablesResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this LockTablesResponse to JSON. + * @function toJSON + * @memberof tabletmanagerdata.LockTablesResponse + * @instance + * @returns {Object.} JSON object + */ + LockTablesResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for LockTablesResponse + * @function getTypeUrl + * @memberof tabletmanagerdata.LockTablesResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + LockTablesResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.LockTablesResponse"; + }; + + return LockTablesResponse; + })(); + + tabletmanagerdata.UnlockTablesRequest = (function() { + + /** + * Properties of an UnlockTablesRequest. + * @memberof tabletmanagerdata + * @interface IUnlockTablesRequest + */ + + /** + * Constructs a new UnlockTablesRequest. + * @memberof tabletmanagerdata + * @classdesc Represents an UnlockTablesRequest. + * @implements IUnlockTablesRequest + * @constructor + * @param {tabletmanagerdata.IUnlockTablesRequest=} [properties] Properties to set + */ + function UnlockTablesRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new UnlockTablesRequest instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.UnlockTablesRequest + * @static + * @param {tabletmanagerdata.IUnlockTablesRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.UnlockTablesRequest} UnlockTablesRequest instance + */ + UnlockTablesRequest.create = function create(properties) { + return new UnlockTablesRequest(properties); + }; + + /** + * Encodes the specified UnlockTablesRequest message. Does not implicitly {@link tabletmanagerdata.UnlockTablesRequest.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.UnlockTablesRequest + * @static + * @param {tabletmanagerdata.IUnlockTablesRequest} message UnlockTablesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UnlockTablesRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified UnlockTablesRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.UnlockTablesRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.UnlockTablesRequest + * @static + * @param {tabletmanagerdata.IUnlockTablesRequest} message UnlockTablesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UnlockTablesRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an UnlockTablesRequest message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.UnlockTablesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.UnlockTablesRequest} UnlockTablesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UnlockTablesRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.UnlockTablesRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an UnlockTablesRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.UnlockTablesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.UnlockTablesRequest} UnlockTablesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UnlockTablesRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an UnlockTablesRequest message. + * @function verify + * @memberof tabletmanagerdata.UnlockTablesRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + UnlockTablesRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates an UnlockTablesRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.UnlockTablesRequest + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.UnlockTablesRequest} UnlockTablesRequest + */ + UnlockTablesRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.UnlockTablesRequest) + return object; + return new $root.tabletmanagerdata.UnlockTablesRequest(); + }; + + /** + * Creates a plain object from an UnlockTablesRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.UnlockTablesRequest + * @static + * @param {tabletmanagerdata.UnlockTablesRequest} message UnlockTablesRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + UnlockTablesRequest.toObject = function toObject() { + return {}; + }; + + /** + * Converts this UnlockTablesRequest to JSON. + * @function toJSON + * @memberof tabletmanagerdata.UnlockTablesRequest + * @instance + * @returns {Object.} JSON object + */ + UnlockTablesRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for UnlockTablesRequest + * @function getTypeUrl + * @memberof tabletmanagerdata.UnlockTablesRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + UnlockTablesRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.UnlockTablesRequest"; + }; + + return UnlockTablesRequest; + })(); + + tabletmanagerdata.UnlockTablesResponse = (function() { + + /** + * Properties of an UnlockTablesResponse. + * @memberof tabletmanagerdata + * @interface IUnlockTablesResponse + */ + + /** + * Constructs a new UnlockTablesResponse. + * @memberof tabletmanagerdata + * @classdesc Represents an UnlockTablesResponse. + * @implements IUnlockTablesResponse + * @constructor + * @param {tabletmanagerdata.IUnlockTablesResponse=} [properties] Properties to set + */ + function UnlockTablesResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new UnlockTablesResponse instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.UnlockTablesResponse + * @static + * @param {tabletmanagerdata.IUnlockTablesResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.UnlockTablesResponse} UnlockTablesResponse instance + */ + UnlockTablesResponse.create = function create(properties) { + return new UnlockTablesResponse(properties); + }; + + /** + * Encodes the specified UnlockTablesResponse message. Does not implicitly {@link tabletmanagerdata.UnlockTablesResponse.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.UnlockTablesResponse + * @static + * @param {tabletmanagerdata.IUnlockTablesResponse} message UnlockTablesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UnlockTablesResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified UnlockTablesResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.UnlockTablesResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.UnlockTablesResponse + * @static + * @param {tabletmanagerdata.IUnlockTablesResponse} message UnlockTablesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UnlockTablesResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an UnlockTablesResponse message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.UnlockTablesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.UnlockTablesResponse} UnlockTablesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UnlockTablesResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.UnlockTablesResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an UnlockTablesResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.UnlockTablesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.UnlockTablesResponse} UnlockTablesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UnlockTablesResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an UnlockTablesResponse message. + * @function verify + * @memberof tabletmanagerdata.UnlockTablesResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + UnlockTablesResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates an UnlockTablesResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.UnlockTablesResponse + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.UnlockTablesResponse} UnlockTablesResponse + */ + UnlockTablesResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.UnlockTablesResponse) + return object; + return new $root.tabletmanagerdata.UnlockTablesResponse(); + }; + + /** + * Creates a plain object from an UnlockTablesResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.UnlockTablesResponse + * @static + * @param {tabletmanagerdata.UnlockTablesResponse} message UnlockTablesResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + UnlockTablesResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this UnlockTablesResponse to JSON. + * @function toJSON + * @memberof tabletmanagerdata.UnlockTablesResponse + * @instance + * @returns {Object.} JSON object + */ + UnlockTablesResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for UnlockTablesResponse + * @function getTypeUrl + * @memberof tabletmanagerdata.UnlockTablesResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + UnlockTablesResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.UnlockTablesResponse"; + }; + + return UnlockTablesResponse; + })(); + + tabletmanagerdata.ExecuteQueryRequest = (function() { + + /** + * Properties of an ExecuteQueryRequest. + * @memberof tabletmanagerdata + * @interface IExecuteQueryRequest + * @property {Uint8Array|null} [query] ExecuteQueryRequest query + * @property {string|null} [db_name] ExecuteQueryRequest db_name + * @property {number|Long|null} [max_rows] ExecuteQueryRequest max_rows + * @property {vtrpc.ICallerID|null} [caller_id] ExecuteQueryRequest caller_id + */ + + /** + * Constructs a new ExecuteQueryRequest. + * @memberof tabletmanagerdata + * @classdesc Represents an ExecuteQueryRequest. + * @implements IExecuteQueryRequest + * @constructor + * @param {tabletmanagerdata.IExecuteQueryRequest=} [properties] Properties to set + */ + function ExecuteQueryRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ExecuteQueryRequest query. + * @member {Uint8Array} query + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @instance + */ + ExecuteQueryRequest.prototype.query = $util.newBuffer([]); + + /** + * ExecuteQueryRequest db_name. + * @member {string} db_name + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @instance + */ + ExecuteQueryRequest.prototype.db_name = ""; + + /** + * ExecuteQueryRequest max_rows. + * @member {number|Long} max_rows + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @instance + */ + ExecuteQueryRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ExecuteQueryRequest caller_id. + * @member {vtrpc.ICallerID|null|undefined} caller_id + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @instance + */ + ExecuteQueryRequest.prototype.caller_id = null; + + /** + * Creates a new ExecuteQueryRequest instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @static + * @param {tabletmanagerdata.IExecuteQueryRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteQueryRequest} ExecuteQueryRequest instance + */ + ExecuteQueryRequest.create = function create(properties) { + return new ExecuteQueryRequest(properties); + }; + + /** + * Encodes the specified ExecuteQueryRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteQueryRequest.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @static + * @param {tabletmanagerdata.IExecuteQueryRequest} message ExecuteQueryRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteQueryRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.query != null && Object.hasOwnProperty.call(message, "query")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.query); + if (message.db_name != null && Object.hasOwnProperty.call(message, "db_name")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.db_name); + if (message.max_rows != null && Object.hasOwnProperty.call(message, "max_rows")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.max_rows); + if (message.caller_id != null && Object.hasOwnProperty.call(message, "caller_id")) + $root.vtrpc.CallerID.encode(message.caller_id, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ExecuteQueryRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteQueryRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @static + * @param {tabletmanagerdata.IExecuteQueryRequest} message ExecuteQueryRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteQueryRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ExecuteQueryRequest message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ExecuteQueryRequest} ExecuteQueryRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteQueryRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteQueryRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.query = reader.bytes(); + break; + } + case 2: { + message.db_name = reader.string(); + break; + } + case 3: { + message.max_rows = reader.uint64(); + break; + } + case 4: { + message.caller_id = $root.vtrpc.CallerID.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ExecuteQueryRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ExecuteQueryRequest} ExecuteQueryRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteQueryRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ExecuteQueryRequest message. + * @function verify + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ExecuteQueryRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.query != null && message.hasOwnProperty("query")) + if (!(message.query && typeof message.query.length === "number" || $util.isString(message.query))) + return "query: buffer expected"; + if (message.db_name != null && message.hasOwnProperty("db_name")) + if (!$util.isString(message.db_name)) + return "db_name: string expected"; + if (message.max_rows != null && message.hasOwnProperty("max_rows")) + if (!$util.isInteger(message.max_rows) && !(message.max_rows && $util.isInteger(message.max_rows.low) && $util.isInteger(message.max_rows.high))) + return "max_rows: integer|Long expected"; + if (message.caller_id != null && message.hasOwnProperty("caller_id")) { + let error = $root.vtrpc.CallerID.verify(message.caller_id); + if (error) + return "caller_id." + error; + } + return null; + }; + + /** + * Creates an ExecuteQueryRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ExecuteQueryRequest} ExecuteQueryRequest + */ + ExecuteQueryRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteQueryRequest) + return object; + let message = new $root.tabletmanagerdata.ExecuteQueryRequest(); + if (object.query != null) + if (typeof object.query === "string") + $util.base64.decode(object.query, message.query = $util.newBuffer($util.base64.length(object.query)), 0); + else if (object.query.length >= 0) + message.query = object.query; + if (object.db_name != null) + message.db_name = String(object.db_name); + if (object.max_rows != null) + if ($util.Long) + (message.max_rows = $util.Long.fromValue(object.max_rows)).unsigned = true; + else if (typeof object.max_rows === "string") + message.max_rows = parseInt(object.max_rows, 10); + else if (typeof object.max_rows === "number") + message.max_rows = object.max_rows; + else if (typeof object.max_rows === "object") + message.max_rows = new $util.LongBits(object.max_rows.low >>> 0, object.max_rows.high >>> 0).toNumber(true); + if (object.caller_id != null) { + if (typeof object.caller_id !== "object") + throw TypeError(".tabletmanagerdata.ExecuteQueryRequest.caller_id: object expected"); + message.caller_id = $root.vtrpc.CallerID.fromObject(object.caller_id); + } + return message; + }; + + /** + * Creates a plain object from an ExecuteQueryRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @static + * @param {tabletmanagerdata.ExecuteQueryRequest} message ExecuteQueryRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ExecuteQueryRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + if (options.bytes === String) + object.query = ""; + else { + object.query = []; + if (options.bytes !== Array) + object.query = $util.newBuffer(object.query); + } + object.db_name = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.max_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.max_rows = options.longs === String ? "0" : 0; + object.caller_id = null; + } + if (message.query != null && message.hasOwnProperty("query")) + object.query = options.bytes === String ? $util.base64.encode(message.query, 0, message.query.length) : options.bytes === Array ? Array.prototype.slice.call(message.query) : message.query; + if (message.db_name != null && message.hasOwnProperty("db_name")) + object.db_name = message.db_name; + if (message.max_rows != null && message.hasOwnProperty("max_rows")) + if (typeof message.max_rows === "number") + object.max_rows = options.longs === String ? String(message.max_rows) : message.max_rows; + else + object.max_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_rows) : options.longs === Number ? new $util.LongBits(message.max_rows.low >>> 0, message.max_rows.high >>> 0).toNumber(true) : message.max_rows; + if (message.caller_id != null && message.hasOwnProperty("caller_id")) + object.caller_id = $root.vtrpc.CallerID.toObject(message.caller_id, options); + return object; + }; + + /** + * Converts this ExecuteQueryRequest to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @instance + * @returns {Object.} JSON object + */ + ExecuteQueryRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ExecuteQueryRequest + * @function getTypeUrl + * @memberof tabletmanagerdata.ExecuteQueryRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ExecuteQueryRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ExecuteQueryRequest"; + }; + + return ExecuteQueryRequest; + })(); + + tabletmanagerdata.ExecuteQueryResponse = (function() { + + /** + * Properties of an ExecuteQueryResponse. + * @memberof tabletmanagerdata + * @interface IExecuteQueryResponse + * @property {query.IQueryResult|null} [result] ExecuteQueryResponse result + */ + + /** + * Constructs a new ExecuteQueryResponse. + * @memberof tabletmanagerdata + * @classdesc Represents an ExecuteQueryResponse. + * @implements IExecuteQueryResponse + * @constructor + * @param {tabletmanagerdata.IExecuteQueryResponse=} [properties] Properties to set + */ + function ExecuteQueryResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ExecuteQueryResponse result. + * @member {query.IQueryResult|null|undefined} result + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @instance + */ + ExecuteQueryResponse.prototype.result = null; + + /** + * Creates a new ExecuteQueryResponse instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @static + * @param {tabletmanagerdata.IExecuteQueryResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteQueryResponse} ExecuteQueryResponse instance + */ + ExecuteQueryResponse.create = function create(properties) { + return new ExecuteQueryResponse(properties); + }; + + /** + * Encodes the specified ExecuteQueryResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteQueryResponse.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @static + * @param {tabletmanagerdata.IExecuteQueryResponse} message ExecuteQueryResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteQueryResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.result != null && Object.hasOwnProperty.call(message, "result")) + $root.query.QueryResult.encode(message.result, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ExecuteQueryResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteQueryResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @static + * @param {tabletmanagerdata.IExecuteQueryResponse} message ExecuteQueryResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteQueryResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ExecuteQueryResponse message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ExecuteQueryResponse} ExecuteQueryResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteQueryResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteQueryResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.result = $root.query.QueryResult.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ExecuteQueryResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ExecuteQueryResponse} ExecuteQueryResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteQueryResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ExecuteQueryResponse message. + * @function verify + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ExecuteQueryResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.result != null && message.hasOwnProperty("result")) { + let error = $root.query.QueryResult.verify(message.result); + if (error) + return "result." + error; + } + return null; + }; + + /** + * Creates an ExecuteQueryResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ExecuteQueryResponse} ExecuteQueryResponse + */ + ExecuteQueryResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteQueryResponse) + return object; + let message = new $root.tabletmanagerdata.ExecuteQueryResponse(); + if (object.result != null) { + if (typeof object.result !== "object") + throw TypeError(".tabletmanagerdata.ExecuteQueryResponse.result: object expected"); + message.result = $root.query.QueryResult.fromObject(object.result); + } + return message; + }; + + /** + * Creates a plain object from an ExecuteQueryResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @static + * @param {tabletmanagerdata.ExecuteQueryResponse} message ExecuteQueryResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ExecuteQueryResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.result = null; + if (message.result != null && message.hasOwnProperty("result")) + object.result = $root.query.QueryResult.toObject(message.result, options); + return object; + }; + + /** + * Converts this ExecuteQueryResponse to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @instance + * @returns {Object.} JSON object + */ + ExecuteQueryResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ExecuteQueryResponse + * @function getTypeUrl + * @memberof tabletmanagerdata.ExecuteQueryResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ExecuteQueryResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ExecuteQueryResponse"; + }; + + return ExecuteQueryResponse; + })(); + + tabletmanagerdata.ExecuteFetchAsDbaRequest = (function() { + + /** + * Properties of an ExecuteFetchAsDbaRequest. + * @memberof tabletmanagerdata + * @interface IExecuteFetchAsDbaRequest + * @property {Uint8Array|null} [query] ExecuteFetchAsDbaRequest query + * @property {string|null} [db_name] ExecuteFetchAsDbaRequest db_name + * @property {number|Long|null} [max_rows] ExecuteFetchAsDbaRequest max_rows + * @property {boolean|null} [disable_binlogs] ExecuteFetchAsDbaRequest disable_binlogs + * @property {boolean|null} [reload_schema] ExecuteFetchAsDbaRequest reload_schema + * @property {boolean|null} [disable_foreign_key_checks] ExecuteFetchAsDbaRequest disable_foreign_key_checks + */ + + /** + * Constructs a new ExecuteFetchAsDbaRequest. + * @memberof tabletmanagerdata + * @classdesc Represents an ExecuteFetchAsDbaRequest. + * @implements IExecuteFetchAsDbaRequest + * @constructor + * @param {tabletmanagerdata.IExecuteFetchAsDbaRequest=} [properties] Properties to set + */ + function ExecuteFetchAsDbaRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ExecuteFetchAsDbaRequest query. + * @member {Uint8Array} query + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @instance + */ + ExecuteFetchAsDbaRequest.prototype.query = $util.newBuffer([]); + + /** + * ExecuteFetchAsDbaRequest db_name. + * @member {string} db_name + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @instance + */ + ExecuteFetchAsDbaRequest.prototype.db_name = ""; + + /** + * ExecuteFetchAsDbaRequest max_rows. + * @member {number|Long} max_rows + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @instance + */ + ExecuteFetchAsDbaRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ExecuteFetchAsDbaRequest disable_binlogs. + * @member {boolean} disable_binlogs + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @instance + */ + ExecuteFetchAsDbaRequest.prototype.disable_binlogs = false; + + /** + * ExecuteFetchAsDbaRequest reload_schema. + * @member {boolean} reload_schema + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @instance + */ + ExecuteFetchAsDbaRequest.prototype.reload_schema = false; + + /** + * ExecuteFetchAsDbaRequest disable_foreign_key_checks. + * @member {boolean} disable_foreign_key_checks + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @instance + */ + ExecuteFetchAsDbaRequest.prototype.disable_foreign_key_checks = false; + + /** + * Creates a new ExecuteFetchAsDbaRequest instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @static + * @param {tabletmanagerdata.IExecuteFetchAsDbaRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteFetchAsDbaRequest} ExecuteFetchAsDbaRequest instance + */ + ExecuteFetchAsDbaRequest.create = function create(properties) { + return new ExecuteFetchAsDbaRequest(properties); + }; + + /** + * Encodes the specified ExecuteFetchAsDbaRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsDbaRequest.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @static + * @param {tabletmanagerdata.IExecuteFetchAsDbaRequest} message ExecuteFetchAsDbaRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteFetchAsDbaRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.query != null && Object.hasOwnProperty.call(message, "query")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.query); + if (message.db_name != null && Object.hasOwnProperty.call(message, "db_name")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.db_name); + if (message.max_rows != null && Object.hasOwnProperty.call(message, "max_rows")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.max_rows); + if (message.disable_binlogs != null && Object.hasOwnProperty.call(message, "disable_binlogs")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.disable_binlogs); + if (message.reload_schema != null && Object.hasOwnProperty.call(message, "reload_schema")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.reload_schema); + if (message.disable_foreign_key_checks != null && Object.hasOwnProperty.call(message, "disable_foreign_key_checks")) + writer.uint32(/* id 6, wireType 0 =*/48).bool(message.disable_foreign_key_checks); + return writer; + }; + + /** + * Encodes the specified ExecuteFetchAsDbaRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsDbaRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @static + * @param {tabletmanagerdata.IExecuteFetchAsDbaRequest} message ExecuteFetchAsDbaRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteFetchAsDbaRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ExecuteFetchAsDbaRequest message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ExecuteFetchAsDbaRequest} ExecuteFetchAsDbaRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteFetchAsDbaRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsDbaRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.query = reader.bytes(); + break; + } + case 2: { + message.db_name = reader.string(); + break; + } + case 3: { + message.max_rows = reader.uint64(); + break; + } + case 4: { + message.disable_binlogs = reader.bool(); + break; + } + case 5: { + message.reload_schema = reader.bool(); + break; + } + case 6: { + message.disable_foreign_key_checks = reader.bool(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ExecuteFetchAsDbaRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ExecuteFetchAsDbaRequest} ExecuteFetchAsDbaRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteFetchAsDbaRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ExecuteFetchAsDbaRequest message. + * @function verify + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ExecuteFetchAsDbaRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.query != null && message.hasOwnProperty("query")) + if (!(message.query && typeof message.query.length === "number" || $util.isString(message.query))) + return "query: buffer expected"; + if (message.db_name != null && message.hasOwnProperty("db_name")) + if (!$util.isString(message.db_name)) + return "db_name: string expected"; + if (message.max_rows != null && message.hasOwnProperty("max_rows")) + if (!$util.isInteger(message.max_rows) && !(message.max_rows && $util.isInteger(message.max_rows.low) && $util.isInteger(message.max_rows.high))) + return "max_rows: integer|Long expected"; + if (message.disable_binlogs != null && message.hasOwnProperty("disable_binlogs")) + if (typeof message.disable_binlogs !== "boolean") + return "disable_binlogs: boolean expected"; + if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) + if (typeof message.reload_schema !== "boolean") + return "reload_schema: boolean expected"; + if (message.disable_foreign_key_checks != null && message.hasOwnProperty("disable_foreign_key_checks")) + if (typeof message.disable_foreign_key_checks !== "boolean") + return "disable_foreign_key_checks: boolean expected"; + return null; + }; + + /** + * Creates an ExecuteFetchAsDbaRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ExecuteFetchAsDbaRequest} ExecuteFetchAsDbaRequest + */ + ExecuteFetchAsDbaRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsDbaRequest) + return object; + let message = new $root.tabletmanagerdata.ExecuteFetchAsDbaRequest(); + if (object.query != null) + if (typeof object.query === "string") + $util.base64.decode(object.query, message.query = $util.newBuffer($util.base64.length(object.query)), 0); + else if (object.query.length >= 0) + message.query = object.query; + if (object.db_name != null) + message.db_name = String(object.db_name); + if (object.max_rows != null) + if ($util.Long) + (message.max_rows = $util.Long.fromValue(object.max_rows)).unsigned = true; + else if (typeof object.max_rows === "string") + message.max_rows = parseInt(object.max_rows, 10); + else if (typeof object.max_rows === "number") + message.max_rows = object.max_rows; + else if (typeof object.max_rows === "object") + message.max_rows = new $util.LongBits(object.max_rows.low >>> 0, object.max_rows.high >>> 0).toNumber(true); + if (object.disable_binlogs != null) + message.disable_binlogs = Boolean(object.disable_binlogs); + if (object.reload_schema != null) + message.reload_schema = Boolean(object.reload_schema); + if (object.disable_foreign_key_checks != null) + message.disable_foreign_key_checks = Boolean(object.disable_foreign_key_checks); + return message; + }; + + /** + * Creates a plain object from an ExecuteFetchAsDbaRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @static + * @param {tabletmanagerdata.ExecuteFetchAsDbaRequest} message ExecuteFetchAsDbaRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ExecuteFetchAsDbaRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + if (options.bytes === String) + object.query = ""; + else { + object.query = []; + if (options.bytes !== Array) + object.query = $util.newBuffer(object.query); + } + object.db_name = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.max_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.max_rows = options.longs === String ? "0" : 0; + object.disable_binlogs = false; + object.reload_schema = false; + object.disable_foreign_key_checks = false; + } + if (message.query != null && message.hasOwnProperty("query")) + object.query = options.bytes === String ? $util.base64.encode(message.query, 0, message.query.length) : options.bytes === Array ? Array.prototype.slice.call(message.query) : message.query; + if (message.db_name != null && message.hasOwnProperty("db_name")) + object.db_name = message.db_name; + if (message.max_rows != null && message.hasOwnProperty("max_rows")) + if (typeof message.max_rows === "number") + object.max_rows = options.longs === String ? String(message.max_rows) : message.max_rows; + else + object.max_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_rows) : options.longs === Number ? new $util.LongBits(message.max_rows.low >>> 0, message.max_rows.high >>> 0).toNumber(true) : message.max_rows; + if (message.disable_binlogs != null && message.hasOwnProperty("disable_binlogs")) + object.disable_binlogs = message.disable_binlogs; + if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) + object.reload_schema = message.reload_schema; + if (message.disable_foreign_key_checks != null && message.hasOwnProperty("disable_foreign_key_checks")) + object.disable_foreign_key_checks = message.disable_foreign_key_checks; + return object; + }; + + /** + * Converts this ExecuteFetchAsDbaRequest to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @instance + * @returns {Object.} JSON object + */ + ExecuteFetchAsDbaRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ExecuteFetchAsDbaRequest + * @function getTypeUrl + * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ExecuteFetchAsDbaRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsDbaRequest"; + }; + + return ExecuteFetchAsDbaRequest; + })(); + + tabletmanagerdata.ExecuteFetchAsDbaResponse = (function() { + + /** + * Properties of an ExecuteFetchAsDbaResponse. + * @memberof tabletmanagerdata + * @interface IExecuteFetchAsDbaResponse + * @property {query.IQueryResult|null} [result] ExecuteFetchAsDbaResponse result + */ + + /** + * Constructs a new ExecuteFetchAsDbaResponse. + * @memberof tabletmanagerdata + * @classdesc Represents an ExecuteFetchAsDbaResponse. + * @implements IExecuteFetchAsDbaResponse + * @constructor + * @param {tabletmanagerdata.IExecuteFetchAsDbaResponse=} [properties] Properties to set + */ + function ExecuteFetchAsDbaResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ExecuteFetchAsDbaResponse result. + * @member {query.IQueryResult|null|undefined} result + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @instance + */ + ExecuteFetchAsDbaResponse.prototype.result = null; + + /** + * Creates a new ExecuteFetchAsDbaResponse instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @static + * @param {tabletmanagerdata.IExecuteFetchAsDbaResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteFetchAsDbaResponse} ExecuteFetchAsDbaResponse instance + */ + ExecuteFetchAsDbaResponse.create = function create(properties) { + return new ExecuteFetchAsDbaResponse(properties); + }; + + /** + * Encodes the specified ExecuteFetchAsDbaResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsDbaResponse.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @static + * @param {tabletmanagerdata.IExecuteFetchAsDbaResponse} message ExecuteFetchAsDbaResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteFetchAsDbaResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.result != null && Object.hasOwnProperty.call(message, "result")) + $root.query.QueryResult.encode(message.result, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ExecuteFetchAsDbaResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsDbaResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @static + * @param {tabletmanagerdata.IExecuteFetchAsDbaResponse} message ExecuteFetchAsDbaResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteFetchAsDbaResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ExecuteFetchAsDbaResponse message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ExecuteFetchAsDbaResponse} ExecuteFetchAsDbaResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteFetchAsDbaResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsDbaResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.result = $root.query.QueryResult.decode(reader, reader.uint32()); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ExecuteFetchAsDbaResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ExecuteFetchAsDbaResponse} ExecuteFetchAsDbaResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteFetchAsDbaResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ExecuteFetchAsDbaResponse message. + * @function verify + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ExecuteFetchAsDbaResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.result != null && message.hasOwnProperty("result")) { + let error = $root.query.QueryResult.verify(message.result); + if (error) + return "result." + error; + } + return null; + }; + + /** + * Creates an ExecuteFetchAsDbaResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ExecuteFetchAsDbaResponse} ExecuteFetchAsDbaResponse + */ + ExecuteFetchAsDbaResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsDbaResponse) + return object; + let message = new $root.tabletmanagerdata.ExecuteFetchAsDbaResponse(); + if (object.result != null) { + if (typeof object.result !== "object") + throw TypeError(".tabletmanagerdata.ExecuteFetchAsDbaResponse.result: object expected"); + message.result = $root.query.QueryResult.fromObject(object.result); + } + return message; + }; + + /** + * Creates a plain object from an ExecuteFetchAsDbaResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @static + * @param {tabletmanagerdata.ExecuteFetchAsDbaResponse} message ExecuteFetchAsDbaResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ExecuteFetchAsDbaResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.result = null; + if (message.result != null && message.hasOwnProperty("result")) + object.result = $root.query.QueryResult.toObject(message.result, options); + return object; + }; + + /** + * Converts this ExecuteFetchAsDbaResponse to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @instance + * @returns {Object.} JSON object + */ + ExecuteFetchAsDbaResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ExecuteFetchAsDbaResponse + * @function getTypeUrl + * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ExecuteFetchAsDbaResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsDbaResponse"; + }; + + return ExecuteFetchAsDbaResponse; + })(); + + tabletmanagerdata.ExecuteMultiFetchAsDbaRequest = (function() { + + /** + * Properties of an ExecuteMultiFetchAsDbaRequest. + * @memberof tabletmanagerdata + * @interface IExecuteMultiFetchAsDbaRequest + * @property {Uint8Array|null} [sql] ExecuteMultiFetchAsDbaRequest sql + * @property {string|null} [db_name] ExecuteMultiFetchAsDbaRequest db_name + * @property {number|Long|null} [max_rows] ExecuteMultiFetchAsDbaRequest max_rows + * @property {boolean|null} [disable_binlogs] ExecuteMultiFetchAsDbaRequest disable_binlogs + * @property {boolean|null} [reload_schema] ExecuteMultiFetchAsDbaRequest reload_schema + * @property {boolean|null} [disable_foreign_key_checks] ExecuteMultiFetchAsDbaRequest disable_foreign_key_checks + */ + + /** + * Constructs a new ExecuteMultiFetchAsDbaRequest. + * @memberof tabletmanagerdata + * @classdesc Represents an ExecuteMultiFetchAsDbaRequest. + * @implements IExecuteMultiFetchAsDbaRequest + * @constructor + * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaRequest=} [properties] Properties to set + */ + function ExecuteMultiFetchAsDbaRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ExecuteMultiFetchAsDbaRequest sql. + * @member {Uint8Array} sql + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @instance + */ + ExecuteMultiFetchAsDbaRequest.prototype.sql = $util.newBuffer([]); + + /** + * ExecuteMultiFetchAsDbaRequest db_name. + * @member {string} db_name + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @instance + */ + ExecuteMultiFetchAsDbaRequest.prototype.db_name = ""; + + /** + * ExecuteMultiFetchAsDbaRequest max_rows. + * @member {number|Long} max_rows + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @instance + */ + ExecuteMultiFetchAsDbaRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ExecuteMultiFetchAsDbaRequest disable_binlogs. + * @member {boolean} disable_binlogs + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @instance + */ + ExecuteMultiFetchAsDbaRequest.prototype.disable_binlogs = false; + + /** + * ExecuteMultiFetchAsDbaRequest reload_schema. + * @member {boolean} reload_schema + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @instance + */ + ExecuteMultiFetchAsDbaRequest.prototype.reload_schema = false; + + /** + * ExecuteMultiFetchAsDbaRequest disable_foreign_key_checks. + * @member {boolean} disable_foreign_key_checks + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @instance + */ + ExecuteMultiFetchAsDbaRequest.prototype.disable_foreign_key_checks = false; + + /** + * Creates a new ExecuteMultiFetchAsDbaRequest instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @static + * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} ExecuteMultiFetchAsDbaRequest instance + */ + ExecuteMultiFetchAsDbaRequest.create = function create(properties) { + return new ExecuteMultiFetchAsDbaRequest(properties); + }; + + /** + * Encodes the specified ExecuteMultiFetchAsDbaRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteMultiFetchAsDbaRequest.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @static + * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaRequest} message ExecuteMultiFetchAsDbaRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteMultiFetchAsDbaRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.sql != null && Object.hasOwnProperty.call(message, "sql")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.sql); + if (message.db_name != null && Object.hasOwnProperty.call(message, "db_name")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.db_name); + if (message.max_rows != null && Object.hasOwnProperty.call(message, "max_rows")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.max_rows); + if (message.disable_binlogs != null && Object.hasOwnProperty.call(message, "disable_binlogs")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.disable_binlogs); + if (message.reload_schema != null && Object.hasOwnProperty.call(message, "reload_schema")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.reload_schema); + if (message.disable_foreign_key_checks != null && Object.hasOwnProperty.call(message, "disable_foreign_key_checks")) + writer.uint32(/* id 6, wireType 0 =*/48).bool(message.disable_foreign_key_checks); + return writer; + }; + + /** + * Encodes the specified ExecuteMultiFetchAsDbaRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteMultiFetchAsDbaRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @static + * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaRequest} message ExecuteMultiFetchAsDbaRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExecuteMultiFetchAsDbaRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ExecuteMultiFetchAsDbaRequest message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} ExecuteMultiFetchAsDbaRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteMultiFetchAsDbaRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteMultiFetchAsDbaRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.sql = reader.bytes(); + break; + } + case 2: { + message.db_name = reader.string(); + break; + } + case 3: { + message.max_rows = reader.uint64(); + break; + } + case 4: { + message.disable_binlogs = reader.bool(); + break; + } + case 5: { + message.reload_schema = reader.bool(); + break; + } + case 6: { + message.disable_foreign_key_checks = reader.bool(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ExecuteMultiFetchAsDbaRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} ExecuteMultiFetchAsDbaRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExecuteMultiFetchAsDbaRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ExecuteMultiFetchAsDbaRequest message. + * @function verify + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ExecuteMultiFetchAsDbaRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.sql != null && message.hasOwnProperty("sql")) + if (!(message.sql && typeof message.sql.length === "number" || $util.isString(message.sql))) + return "sql: buffer expected"; + if (message.db_name != null && message.hasOwnProperty("db_name")) + if (!$util.isString(message.db_name)) + return "db_name: string expected"; + if (message.max_rows != null && message.hasOwnProperty("max_rows")) + if (!$util.isInteger(message.max_rows) && !(message.max_rows && $util.isInteger(message.max_rows.low) && $util.isInteger(message.max_rows.high))) + return "max_rows: integer|Long expected"; + if (message.disable_binlogs != null && message.hasOwnProperty("disable_binlogs")) + if (typeof message.disable_binlogs !== "boolean") + return "disable_binlogs: boolean expected"; + if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) + if (typeof message.reload_schema !== "boolean") + return "reload_schema: boolean expected"; + if (message.disable_foreign_key_checks != null && message.hasOwnProperty("disable_foreign_key_checks")) + if (typeof message.disable_foreign_key_checks !== "boolean") + return "disable_foreign_key_checks: boolean expected"; + return null; + }; + + /** + * Creates an ExecuteMultiFetchAsDbaRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} ExecuteMultiFetchAsDbaRequest + */ + ExecuteMultiFetchAsDbaRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteMultiFetchAsDbaRequest) + return object; + let message = new $root.tabletmanagerdata.ExecuteMultiFetchAsDbaRequest(); + if (object.sql != null) + if (typeof object.sql === "string") + $util.base64.decode(object.sql, message.sql = $util.newBuffer($util.base64.length(object.sql)), 0); + else if (object.sql.length >= 0) + message.sql = object.sql; + if (object.db_name != null) + message.db_name = String(object.db_name); + if (object.max_rows != null) + if ($util.Long) + (message.max_rows = $util.Long.fromValue(object.max_rows)).unsigned = true; + else if (typeof object.max_rows === "string") + message.max_rows = parseInt(object.max_rows, 10); + else if (typeof object.max_rows === "number") + message.max_rows = object.max_rows; + else if (typeof object.max_rows === "object") + message.max_rows = new $util.LongBits(object.max_rows.low >>> 0, object.max_rows.high >>> 0).toNumber(true); + if (object.disable_binlogs != null) + message.disable_binlogs = Boolean(object.disable_binlogs); + if (object.reload_schema != null) + message.reload_schema = Boolean(object.reload_schema); + if (object.disable_foreign_key_checks != null) + message.disable_foreign_key_checks = Boolean(object.disable_foreign_key_checks); + return message; + }; + + /** + * Creates a plain object from an ExecuteMultiFetchAsDbaRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @static + * @param {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} message ExecuteMultiFetchAsDbaRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ExecuteMultiFetchAsDbaRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + if (options.bytes === String) + object.sql = ""; + else { + object.sql = []; + if (options.bytes !== Array) + object.sql = $util.newBuffer(object.sql); + } + object.db_name = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.max_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.max_rows = options.longs === String ? "0" : 0; + object.disable_binlogs = false; + object.reload_schema = false; + object.disable_foreign_key_checks = false; + } + if (message.sql != null && message.hasOwnProperty("sql")) + object.sql = options.bytes === String ? $util.base64.encode(message.sql, 0, message.sql.length) : options.bytes === Array ? Array.prototype.slice.call(message.sql) : message.sql; + if (message.db_name != null && message.hasOwnProperty("db_name")) + object.db_name = message.db_name; + if (message.max_rows != null && message.hasOwnProperty("max_rows")) + if (typeof message.max_rows === "number") + object.max_rows = options.longs === String ? String(message.max_rows) : message.max_rows; + else + object.max_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_rows) : options.longs === Number ? new $util.LongBits(message.max_rows.low >>> 0, message.max_rows.high >>> 0).toNumber(true) : message.max_rows; + if (message.disable_binlogs != null && message.hasOwnProperty("disable_binlogs")) + object.disable_binlogs = message.disable_binlogs; + if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) + object.reload_schema = message.reload_schema; + if (message.disable_foreign_key_checks != null && message.hasOwnProperty("disable_foreign_key_checks")) + object.disable_foreign_key_checks = message.disable_foreign_key_checks; + return object; + }; + + /** + * Converts this ExecuteMultiFetchAsDbaRequest to JSON. * @function toJSON - * @memberof tabletmanagerdata.LockTablesRequest + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest * @instance * @returns {Object.} JSON object */ - LockTablesRequest.prototype.toJSON = function toJSON() { + ExecuteMultiFetchAsDbaRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for LockTablesRequest + * Gets the default type url for ExecuteMultiFetchAsDbaRequest * @function getTypeUrl - * @memberof tabletmanagerdata.LockTablesRequest + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - LockTablesRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ExecuteMultiFetchAsDbaRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.LockTablesRequest"; + return typeUrlPrefix + "/tabletmanagerdata.ExecuteMultiFetchAsDbaRequest"; }; - return LockTablesRequest; + return ExecuteMultiFetchAsDbaRequest; })(); - tabletmanagerdata.LockTablesResponse = (function() { + tabletmanagerdata.ExecuteMultiFetchAsDbaResponse = (function() { /** - * Properties of a LockTablesResponse. + * Properties of an ExecuteMultiFetchAsDbaResponse. * @memberof tabletmanagerdata - * @interface ILockTablesResponse + * @interface IExecuteMultiFetchAsDbaResponse + * @property {Array.|null} [results] ExecuteMultiFetchAsDbaResponse results */ /** - * Constructs a new LockTablesResponse. + * Constructs a new ExecuteMultiFetchAsDbaResponse. * @memberof tabletmanagerdata - * @classdesc Represents a LockTablesResponse. - * @implements ILockTablesResponse + * @classdesc Represents an ExecuteMultiFetchAsDbaResponse. + * @implements IExecuteMultiFetchAsDbaResponse * @constructor - * @param {tabletmanagerdata.ILockTablesResponse=} [properties] Properties to set + * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaResponse=} [properties] Properties to set */ - function LockTablesResponse(properties) { + function ExecuteMultiFetchAsDbaResponse(properties) { + this.results = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -49919,63 +57595,80 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * Creates a new LockTablesResponse instance using the specified properties. + * ExecuteMultiFetchAsDbaResponse results. + * @member {Array.} results + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @instance + */ + ExecuteMultiFetchAsDbaResponse.prototype.results = $util.emptyArray; + + /** + * Creates a new ExecuteMultiFetchAsDbaResponse instance using the specified properties. * @function create - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @static - * @param {tabletmanagerdata.ILockTablesResponse=} [properties] Properties to set - * @returns {tabletmanagerdata.LockTablesResponse} LockTablesResponse instance + * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} ExecuteMultiFetchAsDbaResponse instance */ - LockTablesResponse.create = function create(properties) { - return new LockTablesResponse(properties); + ExecuteMultiFetchAsDbaResponse.create = function create(properties) { + return new ExecuteMultiFetchAsDbaResponse(properties); }; /** - * Encodes the specified LockTablesResponse message. Does not implicitly {@link tabletmanagerdata.LockTablesResponse.verify|verify} messages. + * Encodes the specified ExecuteMultiFetchAsDbaResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @static - * @param {tabletmanagerdata.ILockTablesResponse} message LockTablesResponse message or plain object to encode + * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaResponse} message ExecuteMultiFetchAsDbaResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - LockTablesResponse.encode = function encode(message, writer) { + ExecuteMultiFetchAsDbaResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); + if (message.results != null && message.results.length) + for (let i = 0; i < message.results.length; ++i) + $root.query.QueryResult.encode(message.results[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified LockTablesResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.LockTablesResponse.verify|verify} messages. + * Encodes the specified ExecuteMultiFetchAsDbaResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @static - * @param {tabletmanagerdata.ILockTablesResponse} message LockTablesResponse message or plain object to encode + * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaResponse} message ExecuteMultiFetchAsDbaResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - LockTablesResponse.encodeDelimited = function encodeDelimited(message, writer) { + ExecuteMultiFetchAsDbaResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a LockTablesResponse message from the specified reader or buffer. + * Decodes an ExecuteMultiFetchAsDbaResponse message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.LockTablesResponse} LockTablesResponse + * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} ExecuteMultiFetchAsDbaResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - LockTablesResponse.decode = function decode(reader, length) { + ExecuteMultiFetchAsDbaResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.LockTablesResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteMultiFetchAsDbaResponse(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { + case 1: { + if (!(message.results && message.results.length)) + message.results = []; + message.results.push($root.query.QueryResult.decode(reader, reader.uint32())); + break; + } default: reader.skipType(tag & 7); break; @@ -49985,108 +57678,142 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes a LockTablesResponse message from the specified reader or buffer, length delimited. + * Decodes an ExecuteMultiFetchAsDbaResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.LockTablesResponse} LockTablesResponse + * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} ExecuteMultiFetchAsDbaResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - LockTablesResponse.decodeDelimited = function decodeDelimited(reader) { + ExecuteMultiFetchAsDbaResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a LockTablesResponse message. + * Verifies an ExecuteMultiFetchAsDbaResponse message. * @function verify - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - LockTablesResponse.verify = function verify(message) { + ExecuteMultiFetchAsDbaResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + if (message.results != null && message.hasOwnProperty("results")) { + if (!Array.isArray(message.results)) + return "results: array expected"; + for (let i = 0; i < message.results.length; ++i) { + let error = $root.query.QueryResult.verify(message.results[i]); + if (error) + return "results." + error; + } + } return null; }; /** - * Creates a LockTablesResponse message from a plain object. Also converts values to their respective internal types. + * Creates an ExecuteMultiFetchAsDbaResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.LockTablesResponse} LockTablesResponse + * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} ExecuteMultiFetchAsDbaResponse */ - LockTablesResponse.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.LockTablesResponse) + ExecuteMultiFetchAsDbaResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteMultiFetchAsDbaResponse) return object; - return new $root.tabletmanagerdata.LockTablesResponse(); + let message = new $root.tabletmanagerdata.ExecuteMultiFetchAsDbaResponse(); + if (object.results) { + if (!Array.isArray(object.results)) + throw TypeError(".tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results: array expected"); + message.results = []; + for (let i = 0; i < object.results.length; ++i) { + if (typeof object.results[i] !== "object") + throw TypeError(".tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results: object expected"); + message.results[i] = $root.query.QueryResult.fromObject(object.results[i]); + } + } + return message; }; /** - * Creates a plain object from a LockTablesResponse message. Also converts values to other types if specified. + * Creates a plain object from an ExecuteMultiFetchAsDbaResponse message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @static - * @param {tabletmanagerdata.LockTablesResponse} message LockTablesResponse + * @param {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} message ExecuteMultiFetchAsDbaResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - LockTablesResponse.toObject = function toObject() { - return {}; + ExecuteMultiFetchAsDbaResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.results = []; + if (message.results && message.results.length) { + object.results = []; + for (let j = 0; j < message.results.length; ++j) + object.results[j] = $root.query.QueryResult.toObject(message.results[j], options); + } + return object; }; /** - * Converts this LockTablesResponse to JSON. + * Converts this ExecuteMultiFetchAsDbaResponse to JSON. * @function toJSON - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @instance * @returns {Object.} JSON object */ - LockTablesResponse.prototype.toJSON = function toJSON() { + ExecuteMultiFetchAsDbaResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for LockTablesResponse + * Gets the default type url for ExecuteMultiFetchAsDbaResponse * @function getTypeUrl - * @memberof tabletmanagerdata.LockTablesResponse + * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - LockTablesResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ExecuteMultiFetchAsDbaResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.LockTablesResponse"; + return typeUrlPrefix + "/tabletmanagerdata.ExecuteMultiFetchAsDbaResponse"; }; - return LockTablesResponse; + return ExecuteMultiFetchAsDbaResponse; })(); - tabletmanagerdata.UnlockTablesRequest = (function() { + tabletmanagerdata.ExecuteFetchAsAllPrivsRequest = (function() { /** - * Properties of an UnlockTablesRequest. + * Properties of an ExecuteFetchAsAllPrivsRequest. * @memberof tabletmanagerdata - * @interface IUnlockTablesRequest + * @interface IExecuteFetchAsAllPrivsRequest + * @property {Uint8Array|null} [query] ExecuteFetchAsAllPrivsRequest query + * @property {string|null} [db_name] ExecuteFetchAsAllPrivsRequest db_name + * @property {number|Long|null} [max_rows] ExecuteFetchAsAllPrivsRequest max_rows + * @property {boolean|null} [reload_schema] ExecuteFetchAsAllPrivsRequest reload_schema */ /** - * Constructs a new UnlockTablesRequest. + * Constructs a new ExecuteFetchAsAllPrivsRequest. * @memberof tabletmanagerdata - * @classdesc Represents an UnlockTablesRequest. - * @implements IUnlockTablesRequest + * @classdesc Represents an ExecuteFetchAsAllPrivsRequest. + * @implements IExecuteFetchAsAllPrivsRequest * @constructor - * @param {tabletmanagerdata.IUnlockTablesRequest=} [properties] Properties to set + * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsRequest=} [properties] Properties to set */ - function UnlockTablesRequest(properties) { + function ExecuteFetchAsAllPrivsRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -50094,63 +57821,119 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * Creates a new UnlockTablesRequest instance using the specified properties. + * ExecuteFetchAsAllPrivsRequest query. + * @member {Uint8Array} query + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @instance + */ + ExecuteFetchAsAllPrivsRequest.prototype.query = $util.newBuffer([]); + + /** + * ExecuteFetchAsAllPrivsRequest db_name. + * @member {string} db_name + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @instance + */ + ExecuteFetchAsAllPrivsRequest.prototype.db_name = ""; + + /** + * ExecuteFetchAsAllPrivsRequest max_rows. + * @member {number|Long} max_rows + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @instance + */ + ExecuteFetchAsAllPrivsRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ExecuteFetchAsAllPrivsRequest reload_schema. + * @member {boolean} reload_schema + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @instance + */ + ExecuteFetchAsAllPrivsRequest.prototype.reload_schema = false; + + /** + * Creates a new ExecuteFetchAsAllPrivsRequest instance using the specified properties. * @function create - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @static - * @param {tabletmanagerdata.IUnlockTablesRequest=} [properties] Properties to set - * @returns {tabletmanagerdata.UnlockTablesRequest} UnlockTablesRequest instance + * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} ExecuteFetchAsAllPrivsRequest instance */ - UnlockTablesRequest.create = function create(properties) { - return new UnlockTablesRequest(properties); + ExecuteFetchAsAllPrivsRequest.create = function create(properties) { + return new ExecuteFetchAsAllPrivsRequest(properties); }; /** - * Encodes the specified UnlockTablesRequest message. Does not implicitly {@link tabletmanagerdata.UnlockTablesRequest.verify|verify} messages. + * Encodes the specified ExecuteFetchAsAllPrivsRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAllPrivsRequest.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @static - * @param {tabletmanagerdata.IUnlockTablesRequest} message UnlockTablesRequest message or plain object to encode + * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsRequest} message ExecuteFetchAsAllPrivsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - UnlockTablesRequest.encode = function encode(message, writer) { + ExecuteFetchAsAllPrivsRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); + if (message.query != null && Object.hasOwnProperty.call(message, "query")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.query); + if (message.db_name != null && Object.hasOwnProperty.call(message, "db_name")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.db_name); + if (message.max_rows != null && Object.hasOwnProperty.call(message, "max_rows")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.max_rows); + if (message.reload_schema != null && Object.hasOwnProperty.call(message, "reload_schema")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.reload_schema); return writer; }; /** - * Encodes the specified UnlockTablesRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.UnlockTablesRequest.verify|verify} messages. + * Encodes the specified ExecuteFetchAsAllPrivsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAllPrivsRequest.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @static - * @param {tabletmanagerdata.IUnlockTablesRequest} message UnlockTablesRequest message or plain object to encode + * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsRequest} message ExecuteFetchAsAllPrivsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - UnlockTablesRequest.encodeDelimited = function encodeDelimited(message, writer) { + ExecuteFetchAsAllPrivsRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an UnlockTablesRequest message from the specified reader or buffer. + * Decodes an ExecuteFetchAsAllPrivsRequest message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.UnlockTablesRequest} UnlockTablesRequest + * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} ExecuteFetchAsAllPrivsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - UnlockTablesRequest.decode = function decode(reader, length) { + ExecuteFetchAsAllPrivsRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.UnlockTablesRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsAllPrivsRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { + case 1: { + message.query = reader.bytes(); + break; + } + case 2: { + message.db_name = reader.string(); + break; + } + case 3: { + message.max_rows = reader.uint64(); + break; + } + case 4: { + message.reload_schema = reader.bool(); + break; + } default: reader.skipType(tag & 7); break; @@ -50160,108 +57943,170 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an UnlockTablesRequest message from the specified reader or buffer, length delimited. + * Decodes an ExecuteFetchAsAllPrivsRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.UnlockTablesRequest} UnlockTablesRequest + * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} ExecuteFetchAsAllPrivsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - UnlockTablesRequest.decodeDelimited = function decodeDelimited(reader) { + ExecuteFetchAsAllPrivsRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an UnlockTablesRequest message. + * Verifies an ExecuteFetchAsAllPrivsRequest message. * @function verify - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - UnlockTablesRequest.verify = function verify(message) { + ExecuteFetchAsAllPrivsRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + if (message.query != null && message.hasOwnProperty("query")) + if (!(message.query && typeof message.query.length === "number" || $util.isString(message.query))) + return "query: buffer expected"; + if (message.db_name != null && message.hasOwnProperty("db_name")) + if (!$util.isString(message.db_name)) + return "db_name: string expected"; + if (message.max_rows != null && message.hasOwnProperty("max_rows")) + if (!$util.isInteger(message.max_rows) && !(message.max_rows && $util.isInteger(message.max_rows.low) && $util.isInteger(message.max_rows.high))) + return "max_rows: integer|Long expected"; + if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) + if (typeof message.reload_schema !== "boolean") + return "reload_schema: boolean expected"; return null; }; /** - * Creates an UnlockTablesRequest message from a plain object. Also converts values to their respective internal types. + * Creates an ExecuteFetchAsAllPrivsRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.UnlockTablesRequest} UnlockTablesRequest + * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} ExecuteFetchAsAllPrivsRequest */ - UnlockTablesRequest.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.UnlockTablesRequest) + ExecuteFetchAsAllPrivsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsAllPrivsRequest) return object; - return new $root.tabletmanagerdata.UnlockTablesRequest(); + let message = new $root.tabletmanagerdata.ExecuteFetchAsAllPrivsRequest(); + if (object.query != null) + if (typeof object.query === "string") + $util.base64.decode(object.query, message.query = $util.newBuffer($util.base64.length(object.query)), 0); + else if (object.query.length >= 0) + message.query = object.query; + if (object.db_name != null) + message.db_name = String(object.db_name); + if (object.max_rows != null) + if ($util.Long) + (message.max_rows = $util.Long.fromValue(object.max_rows)).unsigned = true; + else if (typeof object.max_rows === "string") + message.max_rows = parseInt(object.max_rows, 10); + else if (typeof object.max_rows === "number") + message.max_rows = object.max_rows; + else if (typeof object.max_rows === "object") + message.max_rows = new $util.LongBits(object.max_rows.low >>> 0, object.max_rows.high >>> 0).toNumber(true); + if (object.reload_schema != null) + message.reload_schema = Boolean(object.reload_schema); + return message; }; /** - * Creates a plain object from an UnlockTablesRequest message. Also converts values to other types if specified. + * Creates a plain object from an ExecuteFetchAsAllPrivsRequest message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @static - * @param {tabletmanagerdata.UnlockTablesRequest} message UnlockTablesRequest + * @param {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} message ExecuteFetchAsAllPrivsRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - UnlockTablesRequest.toObject = function toObject() { - return {}; + ExecuteFetchAsAllPrivsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + if (options.bytes === String) + object.query = ""; + else { + object.query = []; + if (options.bytes !== Array) + object.query = $util.newBuffer(object.query); + } + object.db_name = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.max_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.max_rows = options.longs === String ? "0" : 0; + object.reload_schema = false; + } + if (message.query != null && message.hasOwnProperty("query")) + object.query = options.bytes === String ? $util.base64.encode(message.query, 0, message.query.length) : options.bytes === Array ? Array.prototype.slice.call(message.query) : message.query; + if (message.db_name != null && message.hasOwnProperty("db_name")) + object.db_name = message.db_name; + if (message.max_rows != null && message.hasOwnProperty("max_rows")) + if (typeof message.max_rows === "number") + object.max_rows = options.longs === String ? String(message.max_rows) : message.max_rows; + else + object.max_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_rows) : options.longs === Number ? new $util.LongBits(message.max_rows.low >>> 0, message.max_rows.high >>> 0).toNumber(true) : message.max_rows; + if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) + object.reload_schema = message.reload_schema; + return object; }; /** - * Converts this UnlockTablesRequest to JSON. + * Converts this ExecuteFetchAsAllPrivsRequest to JSON. * @function toJSON - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @instance * @returns {Object.} JSON object */ - UnlockTablesRequest.prototype.toJSON = function toJSON() { + ExecuteFetchAsAllPrivsRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for UnlockTablesRequest + * Gets the default type url for ExecuteFetchAsAllPrivsRequest * @function getTypeUrl - * @memberof tabletmanagerdata.UnlockTablesRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - UnlockTablesRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ExecuteFetchAsAllPrivsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.UnlockTablesRequest"; + return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsAllPrivsRequest"; }; - return UnlockTablesRequest; + return ExecuteFetchAsAllPrivsRequest; })(); - tabletmanagerdata.UnlockTablesResponse = (function() { + tabletmanagerdata.ExecuteFetchAsAllPrivsResponse = (function() { /** - * Properties of an UnlockTablesResponse. + * Properties of an ExecuteFetchAsAllPrivsResponse. * @memberof tabletmanagerdata - * @interface IUnlockTablesResponse + * @interface IExecuteFetchAsAllPrivsResponse + * @property {query.IQueryResult|null} [result] ExecuteFetchAsAllPrivsResponse result */ /** - * Constructs a new UnlockTablesResponse. + * Constructs a new ExecuteFetchAsAllPrivsResponse. * @memberof tabletmanagerdata - * @classdesc Represents an UnlockTablesResponse. - * @implements IUnlockTablesResponse + * @classdesc Represents an ExecuteFetchAsAllPrivsResponse. + * @implements IExecuteFetchAsAllPrivsResponse * @constructor - * @param {tabletmanagerdata.IUnlockTablesResponse=} [properties] Properties to set + * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsResponse=} [properties] Properties to set */ - function UnlockTablesResponse(properties) { + function ExecuteFetchAsAllPrivsResponse(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -50269,63 +58114,77 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * Creates a new UnlockTablesResponse instance using the specified properties. + * ExecuteFetchAsAllPrivsResponse result. + * @member {query.IQueryResult|null|undefined} result + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @instance + */ + ExecuteFetchAsAllPrivsResponse.prototype.result = null; + + /** + * Creates a new ExecuteFetchAsAllPrivsResponse instance using the specified properties. * @function create - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @static - * @param {tabletmanagerdata.IUnlockTablesResponse=} [properties] Properties to set - * @returns {tabletmanagerdata.UnlockTablesResponse} UnlockTablesResponse instance + * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} ExecuteFetchAsAllPrivsResponse instance */ - UnlockTablesResponse.create = function create(properties) { - return new UnlockTablesResponse(properties); + ExecuteFetchAsAllPrivsResponse.create = function create(properties) { + return new ExecuteFetchAsAllPrivsResponse(properties); }; /** - * Encodes the specified UnlockTablesResponse message. Does not implicitly {@link tabletmanagerdata.UnlockTablesResponse.verify|verify} messages. + * Encodes the specified ExecuteFetchAsAllPrivsResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @static - * @param {tabletmanagerdata.IUnlockTablesResponse} message UnlockTablesResponse message or plain object to encode + * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsResponse} message ExecuteFetchAsAllPrivsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - UnlockTablesResponse.encode = function encode(message, writer) { + ExecuteFetchAsAllPrivsResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); + if (message.result != null && Object.hasOwnProperty.call(message, "result")) + $root.query.QueryResult.encode(message.result, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified UnlockTablesResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.UnlockTablesResponse.verify|verify} messages. + * Encodes the specified ExecuteFetchAsAllPrivsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @static - * @param {tabletmanagerdata.IUnlockTablesResponse} message UnlockTablesResponse message or plain object to encode + * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsResponse} message ExecuteFetchAsAllPrivsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - UnlockTablesResponse.encodeDelimited = function encodeDelimited(message, writer) { + ExecuteFetchAsAllPrivsResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an UnlockTablesResponse message from the specified reader or buffer. + * Decodes an ExecuteFetchAsAllPrivsResponse message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.UnlockTablesResponse} UnlockTablesResponse + * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} ExecuteFetchAsAllPrivsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - UnlockTablesResponse.decode = function decode(reader, length) { + ExecuteFetchAsAllPrivsResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.UnlockTablesResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsAllPrivsResponse(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { + case 1: { + message.result = $root.query.QueryResult.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -50335,112 +58194,128 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an UnlockTablesResponse message from the specified reader or buffer, length delimited. + * Decodes an ExecuteFetchAsAllPrivsResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.UnlockTablesResponse} UnlockTablesResponse + * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} ExecuteFetchAsAllPrivsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - UnlockTablesResponse.decodeDelimited = function decodeDelimited(reader) { + ExecuteFetchAsAllPrivsResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an UnlockTablesResponse message. + * Verifies an ExecuteFetchAsAllPrivsResponse message. * @function verify - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - UnlockTablesResponse.verify = function verify(message) { + ExecuteFetchAsAllPrivsResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + if (message.result != null && message.hasOwnProperty("result")) { + let error = $root.query.QueryResult.verify(message.result); + if (error) + return "result." + error; + } return null; }; /** - * Creates an UnlockTablesResponse message from a plain object. Also converts values to their respective internal types. + * Creates an ExecuteFetchAsAllPrivsResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.UnlockTablesResponse} UnlockTablesResponse + * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} ExecuteFetchAsAllPrivsResponse */ - UnlockTablesResponse.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.UnlockTablesResponse) + ExecuteFetchAsAllPrivsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsAllPrivsResponse) return object; - return new $root.tabletmanagerdata.UnlockTablesResponse(); + let message = new $root.tabletmanagerdata.ExecuteFetchAsAllPrivsResponse(); + if (object.result != null) { + if (typeof object.result !== "object") + throw TypeError(".tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.result: object expected"); + message.result = $root.query.QueryResult.fromObject(object.result); + } + return message; }; /** - * Creates a plain object from an UnlockTablesResponse message. Also converts values to other types if specified. + * Creates a plain object from an ExecuteFetchAsAllPrivsResponse message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @static - * @param {tabletmanagerdata.UnlockTablesResponse} message UnlockTablesResponse + * @param {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} message ExecuteFetchAsAllPrivsResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - UnlockTablesResponse.toObject = function toObject() { - return {}; + ExecuteFetchAsAllPrivsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.result = null; + if (message.result != null && message.hasOwnProperty("result")) + object.result = $root.query.QueryResult.toObject(message.result, options); + return object; }; /** - * Converts this UnlockTablesResponse to JSON. + * Converts this ExecuteFetchAsAllPrivsResponse to JSON. * @function toJSON - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @instance * @returns {Object.} JSON object */ - UnlockTablesResponse.prototype.toJSON = function toJSON() { + ExecuteFetchAsAllPrivsResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for UnlockTablesResponse + * Gets the default type url for ExecuteFetchAsAllPrivsResponse * @function getTypeUrl - * @memberof tabletmanagerdata.UnlockTablesResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - UnlockTablesResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ExecuteFetchAsAllPrivsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.UnlockTablesResponse"; + return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsAllPrivsResponse"; }; - return UnlockTablesResponse; + return ExecuteFetchAsAllPrivsResponse; })(); - tabletmanagerdata.ExecuteQueryRequest = (function() { + tabletmanagerdata.ExecuteFetchAsAppRequest = (function() { /** - * Properties of an ExecuteQueryRequest. + * Properties of an ExecuteFetchAsAppRequest. * @memberof tabletmanagerdata - * @interface IExecuteQueryRequest - * @property {Uint8Array|null} [query] ExecuteQueryRequest query - * @property {string|null} [db_name] ExecuteQueryRequest db_name - * @property {number|Long|null} [max_rows] ExecuteQueryRequest max_rows - * @property {vtrpc.ICallerID|null} [caller_id] ExecuteQueryRequest caller_id + * @interface IExecuteFetchAsAppRequest + * @property {Uint8Array|null} [query] ExecuteFetchAsAppRequest query + * @property {number|Long|null} [max_rows] ExecuteFetchAsAppRequest max_rows */ /** - * Constructs a new ExecuteQueryRequest. + * Constructs a new ExecuteFetchAsAppRequest. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteQueryRequest. - * @implements IExecuteQueryRequest + * @classdesc Represents an ExecuteFetchAsAppRequest. + * @implements IExecuteFetchAsAppRequest * @constructor - * @param {tabletmanagerdata.IExecuteQueryRequest=} [properties] Properties to set + * @param {tabletmanagerdata.IExecuteFetchAsAppRequest=} [properties] Properties to set */ - function ExecuteQueryRequest(properties) { + function ExecuteFetchAsAppRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -50448,100 +58323,80 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteQueryRequest query. + * ExecuteFetchAsAppRequest query. * @member {Uint8Array} query - * @memberof tabletmanagerdata.ExecuteQueryRequest - * @instance - */ - ExecuteQueryRequest.prototype.query = $util.newBuffer([]); - - /** - * ExecuteQueryRequest db_name. - * @member {string} db_name - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @instance */ - ExecuteQueryRequest.prototype.db_name = ""; + ExecuteFetchAsAppRequest.prototype.query = $util.newBuffer([]); /** - * ExecuteQueryRequest max_rows. + * ExecuteFetchAsAppRequest max_rows. * @member {number|Long} max_rows - * @memberof tabletmanagerdata.ExecuteQueryRequest - * @instance - */ - ExecuteQueryRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; - - /** - * ExecuteQueryRequest caller_id. - * @member {vtrpc.ICallerID|null|undefined} caller_id - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @instance */ - ExecuteQueryRequest.prototype.caller_id = null; + ExecuteFetchAsAppRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** - * Creates a new ExecuteQueryRequest instance using the specified properties. + * Creates a new ExecuteFetchAsAppRequest instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @static - * @param {tabletmanagerdata.IExecuteQueryRequest=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteQueryRequest} ExecuteQueryRequest instance + * @param {tabletmanagerdata.IExecuteFetchAsAppRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteFetchAsAppRequest} ExecuteFetchAsAppRequest instance */ - ExecuteQueryRequest.create = function create(properties) { - return new ExecuteQueryRequest(properties); + ExecuteFetchAsAppRequest.create = function create(properties) { + return new ExecuteFetchAsAppRequest(properties); }; /** - * Encodes the specified ExecuteQueryRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteQueryRequest.verify|verify} messages. + * Encodes the specified ExecuteFetchAsAppRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAppRequest.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @static - * @param {tabletmanagerdata.IExecuteQueryRequest} message ExecuteQueryRequest message or plain object to encode + * @param {tabletmanagerdata.IExecuteFetchAsAppRequest} message ExecuteFetchAsAppRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteQueryRequest.encode = function encode(message, writer) { + ExecuteFetchAsAppRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.query != null && Object.hasOwnProperty.call(message, "query")) writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.query); - if (message.db_name != null && Object.hasOwnProperty.call(message, "db_name")) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.db_name); if (message.max_rows != null && Object.hasOwnProperty.call(message, "max_rows")) - writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.max_rows); - if (message.caller_id != null && Object.hasOwnProperty.call(message, "caller_id")) - $root.vtrpc.CallerID.encode(message.caller_id, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.max_rows); return writer; }; /** - * Encodes the specified ExecuteQueryRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteQueryRequest.verify|verify} messages. + * Encodes the specified ExecuteFetchAsAppRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAppRequest.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @static - * @param {tabletmanagerdata.IExecuteQueryRequest} message ExecuteQueryRequest message or plain object to encode + * @param {tabletmanagerdata.IExecuteFetchAsAppRequest} message ExecuteFetchAsAppRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteQueryRequest.encodeDelimited = function encodeDelimited(message, writer) { + ExecuteFetchAsAppRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteQueryRequest message from the specified reader or buffer. + * Decodes an ExecuteFetchAsAppRequest message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteQueryRequest} ExecuteQueryRequest + * @returns {tabletmanagerdata.ExecuteFetchAsAppRequest} ExecuteFetchAsAppRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteQueryRequest.decode = function decode(reader, length) { + ExecuteFetchAsAppRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteQueryRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsAppRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { @@ -50550,17 +58405,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { break; } case 2: { - message.db_name = reader.string(); - break; - } - case 3: { message.max_rows = reader.uint64(); break; } - case 4: { - message.caller_id = $root.vtrpc.CallerID.decode(reader, reader.uint32()); - break; - } default: reader.skipType(tag & 7); break; @@ -50570,68 +58417,58 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteQueryRequest message from the specified reader or buffer, length delimited. + * Decodes an ExecuteFetchAsAppRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteQueryRequest} ExecuteQueryRequest + * @returns {tabletmanagerdata.ExecuteFetchAsAppRequest} ExecuteFetchAsAppRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteQueryRequest.decodeDelimited = function decodeDelimited(reader) { + ExecuteFetchAsAppRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteQueryRequest message. + * Verifies an ExecuteFetchAsAppRequest message. * @function verify - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteQueryRequest.verify = function verify(message) { + ExecuteFetchAsAppRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; if (message.query != null && message.hasOwnProperty("query")) if (!(message.query && typeof message.query.length === "number" || $util.isString(message.query))) return "query: buffer expected"; - if (message.db_name != null && message.hasOwnProperty("db_name")) - if (!$util.isString(message.db_name)) - return "db_name: string expected"; if (message.max_rows != null && message.hasOwnProperty("max_rows")) if (!$util.isInteger(message.max_rows) && !(message.max_rows && $util.isInteger(message.max_rows.low) && $util.isInteger(message.max_rows.high))) return "max_rows: integer|Long expected"; - if (message.caller_id != null && message.hasOwnProperty("caller_id")) { - let error = $root.vtrpc.CallerID.verify(message.caller_id); - if (error) - return "caller_id." + error; - } return null; }; /** - * Creates an ExecuteQueryRequest message from a plain object. Also converts values to their respective internal types. + * Creates an ExecuteFetchAsAppRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteQueryRequest} ExecuteQueryRequest + * @returns {tabletmanagerdata.ExecuteFetchAsAppRequest} ExecuteFetchAsAppRequest */ - ExecuteQueryRequest.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteQueryRequest) + ExecuteFetchAsAppRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsAppRequest) return object; - let message = new $root.tabletmanagerdata.ExecuteQueryRequest(); + let message = new $root.tabletmanagerdata.ExecuteFetchAsAppRequest(); if (object.query != null) if (typeof object.query === "string") $util.base64.decode(object.query, message.query = $util.newBuffer($util.base64.length(object.query)), 0); else if (object.query.length >= 0) message.query = object.query; - if (object.db_name != null) - message.db_name = String(object.db_name); if (object.max_rows != null) if ($util.Long) (message.max_rows = $util.Long.fromValue(object.max_rows)).unsigned = true; @@ -50641,24 +58478,19 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.max_rows = object.max_rows; else if (typeof object.max_rows === "object") message.max_rows = new $util.LongBits(object.max_rows.low >>> 0, object.max_rows.high >>> 0).toNumber(true); - if (object.caller_id != null) { - if (typeof object.caller_id !== "object") - throw TypeError(".tabletmanagerdata.ExecuteQueryRequest.caller_id: object expected"); - message.caller_id = $root.vtrpc.CallerID.fromObject(object.caller_id); - } return message; }; /** - * Creates a plain object from an ExecuteQueryRequest message. Also converts values to other types if specified. + * Creates a plain object from an ExecuteFetchAsAppRequest message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @static - * @param {tabletmanagerdata.ExecuteQueryRequest} message ExecuteQueryRequest + * @param {tabletmanagerdata.ExecuteFetchAsAppRequest} message ExecuteFetchAsAppRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteQueryRequest.toObject = function toObject(message, options) { + ExecuteFetchAsAppRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; @@ -50670,75 +58502,69 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (options.bytes !== Array) object.query = $util.newBuffer(object.query); } - object.db_name = ""; if ($util.Long) { let long = new $util.Long(0, 0, true); object.max_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else object.max_rows = options.longs === String ? "0" : 0; - object.caller_id = null; } if (message.query != null && message.hasOwnProperty("query")) object.query = options.bytes === String ? $util.base64.encode(message.query, 0, message.query.length) : options.bytes === Array ? Array.prototype.slice.call(message.query) : message.query; - if (message.db_name != null && message.hasOwnProperty("db_name")) - object.db_name = message.db_name; if (message.max_rows != null && message.hasOwnProperty("max_rows")) if (typeof message.max_rows === "number") object.max_rows = options.longs === String ? String(message.max_rows) : message.max_rows; else object.max_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_rows) : options.longs === Number ? new $util.LongBits(message.max_rows.low >>> 0, message.max_rows.high >>> 0).toNumber(true) : message.max_rows; - if (message.caller_id != null && message.hasOwnProperty("caller_id")) - object.caller_id = $root.vtrpc.CallerID.toObject(message.caller_id, options); return object; }; /** - * Converts this ExecuteQueryRequest to JSON. + * Converts this ExecuteFetchAsAppRequest to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @instance * @returns {Object.} JSON object */ - ExecuteQueryRequest.prototype.toJSON = function toJSON() { + ExecuteFetchAsAppRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteQueryRequest + * Gets the default type url for ExecuteFetchAsAppRequest * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteQueryRequest + * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteQueryRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ExecuteFetchAsAppRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteQueryRequest"; + return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsAppRequest"; }; - return ExecuteQueryRequest; + return ExecuteFetchAsAppRequest; })(); - tabletmanagerdata.ExecuteQueryResponse = (function() { + tabletmanagerdata.ExecuteFetchAsAppResponse = (function() { /** - * Properties of an ExecuteQueryResponse. + * Properties of an ExecuteFetchAsAppResponse. * @memberof tabletmanagerdata - * @interface IExecuteQueryResponse - * @property {query.IQueryResult|null} [result] ExecuteQueryResponse result + * @interface IExecuteFetchAsAppResponse + * @property {query.IQueryResult|null} [result] ExecuteFetchAsAppResponse result */ /** - * Constructs a new ExecuteQueryResponse. + * Constructs a new ExecuteFetchAsAppResponse. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteQueryResponse. - * @implements IExecuteQueryResponse + * @classdesc Represents an ExecuteFetchAsAppResponse. + * @implements IExecuteFetchAsAppResponse * @constructor - * @param {tabletmanagerdata.IExecuteQueryResponse=} [properties] Properties to set + * @param {tabletmanagerdata.IExecuteFetchAsAppResponse=} [properties] Properties to set */ - function ExecuteQueryResponse(properties) { + function ExecuteFetchAsAppResponse(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -50746,35 +58572,35 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteQueryResponse result. + * ExecuteFetchAsAppResponse result. * @member {query.IQueryResult|null|undefined} result - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @instance */ - ExecuteQueryResponse.prototype.result = null; + ExecuteFetchAsAppResponse.prototype.result = null; /** - * Creates a new ExecuteQueryResponse instance using the specified properties. + * Creates a new ExecuteFetchAsAppResponse instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @static - * @param {tabletmanagerdata.IExecuteQueryResponse=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteQueryResponse} ExecuteQueryResponse instance + * @param {tabletmanagerdata.IExecuteFetchAsAppResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ExecuteFetchAsAppResponse} ExecuteFetchAsAppResponse instance */ - ExecuteQueryResponse.create = function create(properties) { - return new ExecuteQueryResponse(properties); + ExecuteFetchAsAppResponse.create = function create(properties) { + return new ExecuteFetchAsAppResponse(properties); }; /** - * Encodes the specified ExecuteQueryResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteQueryResponse.verify|verify} messages. + * Encodes the specified ExecuteFetchAsAppResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAppResponse.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @static - * @param {tabletmanagerdata.IExecuteQueryResponse} message ExecuteQueryResponse message or plain object to encode + * @param {tabletmanagerdata.IExecuteFetchAsAppResponse} message ExecuteFetchAsAppResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteQueryResponse.encode = function encode(message, writer) { + ExecuteFetchAsAppResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.result != null && Object.hasOwnProperty.call(message, "result")) @@ -50783,33 +58609,33 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Encodes the specified ExecuteQueryResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteQueryResponse.verify|verify} messages. + * Encodes the specified ExecuteFetchAsAppResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAppResponse.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @static - * @param {tabletmanagerdata.IExecuteQueryResponse} message ExecuteQueryResponse message or plain object to encode + * @param {tabletmanagerdata.IExecuteFetchAsAppResponse} message ExecuteFetchAsAppResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteQueryResponse.encodeDelimited = function encodeDelimited(message, writer) { + ExecuteFetchAsAppResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteQueryResponse message from the specified reader or buffer. + * Decodes an ExecuteFetchAsAppResponse message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteQueryResponse} ExecuteQueryResponse + * @returns {tabletmanagerdata.ExecuteFetchAsAppResponse} ExecuteFetchAsAppResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteQueryResponse.decode = function decode(reader, length) { + ExecuteFetchAsAppResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteQueryResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsAppResponse(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { @@ -50826,30 +58652,30 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteQueryResponse message from the specified reader or buffer, length delimited. + * Decodes an ExecuteFetchAsAppResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteQueryResponse} ExecuteQueryResponse + * @returns {tabletmanagerdata.ExecuteFetchAsAppResponse} ExecuteFetchAsAppResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteQueryResponse.decodeDelimited = function decodeDelimited(reader) { + ExecuteFetchAsAppResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteQueryResponse message. + * Verifies an ExecuteFetchAsAppResponse message. * @function verify - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteQueryResponse.verify = function verify(message) { + ExecuteFetchAsAppResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; if (message.result != null && message.hasOwnProperty("result")) { @@ -50861,35 +58687,35 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Creates an ExecuteQueryResponse message from a plain object. Also converts values to their respective internal types. + * Creates an ExecuteFetchAsAppResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteQueryResponse} ExecuteQueryResponse + * @returns {tabletmanagerdata.ExecuteFetchAsAppResponse} ExecuteFetchAsAppResponse */ - ExecuteQueryResponse.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteQueryResponse) + ExecuteFetchAsAppResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsAppResponse) return object; - let message = new $root.tabletmanagerdata.ExecuteQueryResponse(); + let message = new $root.tabletmanagerdata.ExecuteFetchAsAppResponse(); if (object.result != null) { if (typeof object.result !== "object") - throw TypeError(".tabletmanagerdata.ExecuteQueryResponse.result: object expected"); + throw TypeError(".tabletmanagerdata.ExecuteFetchAsAppResponse.result: object expected"); message.result = $root.query.QueryResult.fromObject(object.result); } return message; }; /** - * Creates a plain object from an ExecuteQueryResponse message. Also converts values to other types if specified. + * Creates a plain object from an ExecuteFetchAsAppResponse message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @static - * @param {tabletmanagerdata.ExecuteQueryResponse} message ExecuteQueryResponse + * @param {tabletmanagerdata.ExecuteFetchAsAppResponse} message ExecuteFetchAsAppResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteQueryResponse.toObject = function toObject(message, options) { + ExecuteFetchAsAppResponse.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; @@ -50901,57 +58727,52 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Converts this ExecuteQueryResponse to JSON. + * Converts this ExecuteFetchAsAppResponse to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @instance * @returns {Object.} JSON object */ - ExecuteQueryResponse.prototype.toJSON = function toJSON() { + ExecuteFetchAsAppResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteQueryResponse + * Gets the default type url for ExecuteFetchAsAppResponse * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteQueryResponse + * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteQueryResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ExecuteFetchAsAppResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteQueryResponse"; + return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsAppResponse"; }; - return ExecuteQueryResponse; + return ExecuteFetchAsAppResponse; })(); - tabletmanagerdata.ExecuteFetchAsDbaRequest = (function() { + tabletmanagerdata.GetUnresolvedTransactionsRequest = (function() { /** - * Properties of an ExecuteFetchAsDbaRequest. + * Properties of a GetUnresolvedTransactionsRequest. * @memberof tabletmanagerdata - * @interface IExecuteFetchAsDbaRequest - * @property {Uint8Array|null} [query] ExecuteFetchAsDbaRequest query - * @property {string|null} [db_name] ExecuteFetchAsDbaRequest db_name - * @property {number|Long|null} [max_rows] ExecuteFetchAsDbaRequest max_rows - * @property {boolean|null} [disable_binlogs] ExecuteFetchAsDbaRequest disable_binlogs - * @property {boolean|null} [reload_schema] ExecuteFetchAsDbaRequest reload_schema - * @property {boolean|null} [disable_foreign_key_checks] ExecuteFetchAsDbaRequest disable_foreign_key_checks + * @interface IGetUnresolvedTransactionsRequest + * @property {number|Long|null} [abandon_age] GetUnresolvedTransactionsRequest abandon_age */ /** - * Constructs a new ExecuteFetchAsDbaRequest. + * Constructs a new GetUnresolvedTransactionsRequest. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteFetchAsDbaRequest. - * @implements IExecuteFetchAsDbaRequest + * @classdesc Represents a GetUnresolvedTransactionsRequest. + * @implements IGetUnresolvedTransactionsRequest * @constructor - * @param {tabletmanagerdata.IExecuteFetchAsDbaRequest=} [properties] Properties to set + * @param {tabletmanagerdata.IGetUnresolvedTransactionsRequest=} [properties] Properties to set */ - function ExecuteFetchAsDbaRequest(properties) { + function GetUnresolvedTransactionsRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -50959,145 +58780,75 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteFetchAsDbaRequest query. - * @member {Uint8Array} query - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest - * @instance - */ - ExecuteFetchAsDbaRequest.prototype.query = $util.newBuffer([]); - - /** - * ExecuteFetchAsDbaRequest db_name. - * @member {string} db_name - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest - * @instance - */ - ExecuteFetchAsDbaRequest.prototype.db_name = ""; - - /** - * ExecuteFetchAsDbaRequest max_rows. - * @member {number|Long} max_rows - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest - * @instance - */ - ExecuteFetchAsDbaRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; - - /** - * ExecuteFetchAsDbaRequest disable_binlogs. - * @member {boolean} disable_binlogs - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest - * @instance - */ - ExecuteFetchAsDbaRequest.prototype.disable_binlogs = false; - - /** - * ExecuteFetchAsDbaRequest reload_schema. - * @member {boolean} reload_schema - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest - * @instance - */ - ExecuteFetchAsDbaRequest.prototype.reload_schema = false; - - /** - * ExecuteFetchAsDbaRequest disable_foreign_key_checks. - * @member {boolean} disable_foreign_key_checks - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * GetUnresolvedTransactionsRequest abandon_age. + * @member {number|Long} abandon_age + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @instance */ - ExecuteFetchAsDbaRequest.prototype.disable_foreign_key_checks = false; + GetUnresolvedTransactionsRequest.prototype.abandon_age = $util.Long ? $util.Long.fromBits(0,0,false) : 0; /** - * Creates a new ExecuteFetchAsDbaRequest instance using the specified properties. + * Creates a new GetUnresolvedTransactionsRequest instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @static - * @param {tabletmanagerdata.IExecuteFetchAsDbaRequest=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteFetchAsDbaRequest} ExecuteFetchAsDbaRequest instance + * @param {tabletmanagerdata.IGetUnresolvedTransactionsRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest instance */ - ExecuteFetchAsDbaRequest.create = function create(properties) { - return new ExecuteFetchAsDbaRequest(properties); + GetUnresolvedTransactionsRequest.create = function create(properties) { + return new GetUnresolvedTransactionsRequest(properties); }; /** - * Encodes the specified ExecuteFetchAsDbaRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsDbaRequest.verify|verify} messages. + * Encodes the specified GetUnresolvedTransactionsRequest message. Does not implicitly {@link tabletmanagerdata.GetUnresolvedTransactionsRequest.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @static - * @param {tabletmanagerdata.IExecuteFetchAsDbaRequest} message ExecuteFetchAsDbaRequest message or plain object to encode + * @param {tabletmanagerdata.IGetUnresolvedTransactionsRequest} message GetUnresolvedTransactionsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsDbaRequest.encode = function encode(message, writer) { + GetUnresolvedTransactionsRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.query != null && Object.hasOwnProperty.call(message, "query")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.query); - if (message.db_name != null && Object.hasOwnProperty.call(message, "db_name")) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.db_name); - if (message.max_rows != null && Object.hasOwnProperty.call(message, "max_rows")) - writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.max_rows); - if (message.disable_binlogs != null && Object.hasOwnProperty.call(message, "disable_binlogs")) - writer.uint32(/* id 4, wireType 0 =*/32).bool(message.disable_binlogs); - if (message.reload_schema != null && Object.hasOwnProperty.call(message, "reload_schema")) - writer.uint32(/* id 5, wireType 0 =*/40).bool(message.reload_schema); - if (message.disable_foreign_key_checks != null && Object.hasOwnProperty.call(message, "disable_foreign_key_checks")) - writer.uint32(/* id 6, wireType 0 =*/48).bool(message.disable_foreign_key_checks); + if (message.abandon_age != null && Object.hasOwnProperty.call(message, "abandon_age")) + writer.uint32(/* id 1, wireType 0 =*/8).int64(message.abandon_age); return writer; }; /** - * Encodes the specified ExecuteFetchAsDbaRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsDbaRequest.verify|verify} messages. + * Encodes the specified GetUnresolvedTransactionsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.GetUnresolvedTransactionsRequest.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @static - * @param {tabletmanagerdata.IExecuteFetchAsDbaRequest} message ExecuteFetchAsDbaRequest message or plain object to encode + * @param {tabletmanagerdata.IGetUnresolvedTransactionsRequest} message GetUnresolvedTransactionsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsDbaRequest.encodeDelimited = function encodeDelimited(message, writer) { + GetUnresolvedTransactionsRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteFetchAsDbaRequest message from the specified reader or buffer. + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteFetchAsDbaRequest} ExecuteFetchAsDbaRequest + * @returns {tabletmanagerdata.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsDbaRequest.decode = function decode(reader, length) { + GetUnresolvedTransactionsRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsDbaRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.GetUnresolvedTransactionsRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.query = reader.bytes(); - break; - } - case 2: { - message.db_name = reader.string(); - break; - } - case 3: { - message.max_rows = reader.uint64(); - break; - } - case 4: { - message.disable_binlogs = reader.bool(); - break; - } - case 5: { - message.reload_schema = reader.bool(); - break; - } - case 6: { - message.disable_foreign_key_checks = reader.bool(); + message.abandon_age = reader.int64(); break; } default: @@ -51109,186 +58860,137 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteFetchAsDbaRequest message from the specified reader or buffer, length delimited. + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteFetchAsDbaRequest} ExecuteFetchAsDbaRequest + * @returns {tabletmanagerdata.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsDbaRequest.decodeDelimited = function decodeDelimited(reader) { + GetUnresolvedTransactionsRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteFetchAsDbaRequest message. + * Verifies a GetUnresolvedTransactionsRequest message. * @function verify - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteFetchAsDbaRequest.verify = function verify(message) { + GetUnresolvedTransactionsRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.query != null && message.hasOwnProperty("query")) - if (!(message.query && typeof message.query.length === "number" || $util.isString(message.query))) - return "query: buffer expected"; - if (message.db_name != null && message.hasOwnProperty("db_name")) - if (!$util.isString(message.db_name)) - return "db_name: string expected"; - if (message.max_rows != null && message.hasOwnProperty("max_rows")) - if (!$util.isInteger(message.max_rows) && !(message.max_rows && $util.isInteger(message.max_rows.low) && $util.isInteger(message.max_rows.high))) - return "max_rows: integer|Long expected"; - if (message.disable_binlogs != null && message.hasOwnProperty("disable_binlogs")) - if (typeof message.disable_binlogs !== "boolean") - return "disable_binlogs: boolean expected"; - if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) - if (typeof message.reload_schema !== "boolean") - return "reload_schema: boolean expected"; - if (message.disable_foreign_key_checks != null && message.hasOwnProperty("disable_foreign_key_checks")) - if (typeof message.disable_foreign_key_checks !== "boolean") - return "disable_foreign_key_checks: boolean expected"; + if (message.abandon_age != null && message.hasOwnProperty("abandon_age")) + if (!$util.isInteger(message.abandon_age) && !(message.abandon_age && $util.isInteger(message.abandon_age.low) && $util.isInteger(message.abandon_age.high))) + return "abandon_age: integer|Long expected"; return null; }; /** - * Creates an ExecuteFetchAsDbaRequest message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest - * @static - * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteFetchAsDbaRequest} ExecuteFetchAsDbaRequest - */ - ExecuteFetchAsDbaRequest.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsDbaRequest) - return object; - let message = new $root.tabletmanagerdata.ExecuteFetchAsDbaRequest(); - if (object.query != null) - if (typeof object.query === "string") - $util.base64.decode(object.query, message.query = $util.newBuffer($util.base64.length(object.query)), 0); - else if (object.query.length >= 0) - message.query = object.query; - if (object.db_name != null) - message.db_name = String(object.db_name); - if (object.max_rows != null) - if ($util.Long) - (message.max_rows = $util.Long.fromValue(object.max_rows)).unsigned = true; - else if (typeof object.max_rows === "string") - message.max_rows = parseInt(object.max_rows, 10); - else if (typeof object.max_rows === "number") - message.max_rows = object.max_rows; - else if (typeof object.max_rows === "object") - message.max_rows = new $util.LongBits(object.max_rows.low >>> 0, object.max_rows.high >>> 0).toNumber(true); - if (object.disable_binlogs != null) - message.disable_binlogs = Boolean(object.disable_binlogs); - if (object.reload_schema != null) - message.reload_schema = Boolean(object.reload_schema); - if (object.disable_foreign_key_checks != null) - message.disable_foreign_key_checks = Boolean(object.disable_foreign_key_checks); + * Creates a GetUnresolvedTransactionsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest + */ + GetUnresolvedTransactionsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.GetUnresolvedTransactionsRequest) + return object; + let message = new $root.tabletmanagerdata.GetUnresolvedTransactionsRequest(); + if (object.abandon_age != null) + if ($util.Long) + (message.abandon_age = $util.Long.fromValue(object.abandon_age)).unsigned = false; + else if (typeof object.abandon_age === "string") + message.abandon_age = parseInt(object.abandon_age, 10); + else if (typeof object.abandon_age === "number") + message.abandon_age = object.abandon_age; + else if (typeof object.abandon_age === "object") + message.abandon_age = new $util.LongBits(object.abandon_age.low >>> 0, object.abandon_age.high >>> 0).toNumber(); return message; }; /** - * Creates a plain object from an ExecuteFetchAsDbaRequest message. Also converts values to other types if specified. + * Creates a plain object from a GetUnresolvedTransactionsRequest message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @static - * @param {tabletmanagerdata.ExecuteFetchAsDbaRequest} message ExecuteFetchAsDbaRequest + * @param {tabletmanagerdata.GetUnresolvedTransactionsRequest} message GetUnresolvedTransactionsRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteFetchAsDbaRequest.toObject = function toObject(message, options) { + GetUnresolvedTransactionsRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; - if (options.defaults) { - if (options.bytes === String) - object.query = ""; - else { - object.query = []; - if (options.bytes !== Array) - object.query = $util.newBuffer(object.query); - } - object.db_name = ""; + if (options.defaults) if ($util.Long) { - let long = new $util.Long(0, 0, true); - object.max_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + let long = new $util.Long(0, 0, false); + object.abandon_age = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else - object.max_rows = options.longs === String ? "0" : 0; - object.disable_binlogs = false; - object.reload_schema = false; - object.disable_foreign_key_checks = false; - } - if (message.query != null && message.hasOwnProperty("query")) - object.query = options.bytes === String ? $util.base64.encode(message.query, 0, message.query.length) : options.bytes === Array ? Array.prototype.slice.call(message.query) : message.query; - if (message.db_name != null && message.hasOwnProperty("db_name")) - object.db_name = message.db_name; - if (message.max_rows != null && message.hasOwnProperty("max_rows")) - if (typeof message.max_rows === "number") - object.max_rows = options.longs === String ? String(message.max_rows) : message.max_rows; + object.abandon_age = options.longs === String ? "0" : 0; + if (message.abandon_age != null && message.hasOwnProperty("abandon_age")) + if (typeof message.abandon_age === "number") + object.abandon_age = options.longs === String ? String(message.abandon_age) : message.abandon_age; else - object.max_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_rows) : options.longs === Number ? new $util.LongBits(message.max_rows.low >>> 0, message.max_rows.high >>> 0).toNumber(true) : message.max_rows; - if (message.disable_binlogs != null && message.hasOwnProperty("disable_binlogs")) - object.disable_binlogs = message.disable_binlogs; - if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) - object.reload_schema = message.reload_schema; - if (message.disable_foreign_key_checks != null && message.hasOwnProperty("disable_foreign_key_checks")) - object.disable_foreign_key_checks = message.disable_foreign_key_checks; + object.abandon_age = options.longs === String ? $util.Long.prototype.toString.call(message.abandon_age) : options.longs === Number ? new $util.LongBits(message.abandon_age.low >>> 0, message.abandon_age.high >>> 0).toNumber() : message.abandon_age; return object; }; /** - * Converts this ExecuteFetchAsDbaRequest to JSON. + * Converts this GetUnresolvedTransactionsRequest to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @instance * @returns {Object.} JSON object */ - ExecuteFetchAsDbaRequest.prototype.toJSON = function toJSON() { + GetUnresolvedTransactionsRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteFetchAsDbaRequest + * Gets the default type url for GetUnresolvedTransactionsRequest * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteFetchAsDbaRequest + * @memberof tabletmanagerdata.GetUnresolvedTransactionsRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteFetchAsDbaRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + GetUnresolvedTransactionsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsDbaRequest"; + return typeUrlPrefix + "/tabletmanagerdata.GetUnresolvedTransactionsRequest"; }; - return ExecuteFetchAsDbaRequest; + return GetUnresolvedTransactionsRequest; })(); - tabletmanagerdata.ExecuteFetchAsDbaResponse = (function() { + tabletmanagerdata.GetUnresolvedTransactionsResponse = (function() { /** - * Properties of an ExecuteFetchAsDbaResponse. + * Properties of a GetUnresolvedTransactionsResponse. * @memberof tabletmanagerdata - * @interface IExecuteFetchAsDbaResponse - * @property {query.IQueryResult|null} [result] ExecuteFetchAsDbaResponse result + * @interface IGetUnresolvedTransactionsResponse + * @property {Array.|null} [transactions] GetUnresolvedTransactionsResponse transactions */ /** - * Constructs a new ExecuteFetchAsDbaResponse. + * Constructs a new GetUnresolvedTransactionsResponse. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteFetchAsDbaResponse. - * @implements IExecuteFetchAsDbaResponse + * @classdesc Represents a GetUnresolvedTransactionsResponse. + * @implements IGetUnresolvedTransactionsResponse * @constructor - * @param {tabletmanagerdata.IExecuteFetchAsDbaResponse=} [properties] Properties to set + * @param {tabletmanagerdata.IGetUnresolvedTransactionsResponse=} [properties] Properties to set */ - function ExecuteFetchAsDbaResponse(properties) { + function GetUnresolvedTransactionsResponse(properties) { + this.transactions = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -51296,75 +58998,78 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteFetchAsDbaResponse result. - * @member {query.IQueryResult|null|undefined} result - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * GetUnresolvedTransactionsResponse transactions. + * @member {Array.} transactions + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @instance */ - ExecuteFetchAsDbaResponse.prototype.result = null; + GetUnresolvedTransactionsResponse.prototype.transactions = $util.emptyArray; /** - * Creates a new ExecuteFetchAsDbaResponse instance using the specified properties. + * Creates a new GetUnresolvedTransactionsResponse instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @static - * @param {tabletmanagerdata.IExecuteFetchAsDbaResponse=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteFetchAsDbaResponse} ExecuteFetchAsDbaResponse instance + * @param {tabletmanagerdata.IGetUnresolvedTransactionsResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.GetUnresolvedTransactionsResponse} GetUnresolvedTransactionsResponse instance */ - ExecuteFetchAsDbaResponse.create = function create(properties) { - return new ExecuteFetchAsDbaResponse(properties); + GetUnresolvedTransactionsResponse.create = function create(properties) { + return new GetUnresolvedTransactionsResponse(properties); }; /** - * Encodes the specified ExecuteFetchAsDbaResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsDbaResponse.verify|verify} messages. + * Encodes the specified GetUnresolvedTransactionsResponse message. Does not implicitly {@link tabletmanagerdata.GetUnresolvedTransactionsResponse.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @static - * @param {tabletmanagerdata.IExecuteFetchAsDbaResponse} message ExecuteFetchAsDbaResponse message or plain object to encode + * @param {tabletmanagerdata.IGetUnresolvedTransactionsResponse} message GetUnresolvedTransactionsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsDbaResponse.encode = function encode(message, writer) { + GetUnresolvedTransactionsResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.result != null && Object.hasOwnProperty.call(message, "result")) - $root.query.QueryResult.encode(message.result, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.transactions != null && message.transactions.length) + for (let i = 0; i < message.transactions.length; ++i) + $root.query.TransactionMetadata.encode(message.transactions[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified ExecuteFetchAsDbaResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsDbaResponse.verify|verify} messages. + * Encodes the specified GetUnresolvedTransactionsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.GetUnresolvedTransactionsResponse.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @static - * @param {tabletmanagerdata.IExecuteFetchAsDbaResponse} message ExecuteFetchAsDbaResponse message or plain object to encode + * @param {tabletmanagerdata.IGetUnresolvedTransactionsResponse} message GetUnresolvedTransactionsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsDbaResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetUnresolvedTransactionsResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteFetchAsDbaResponse message from the specified reader or buffer. + * Decodes a GetUnresolvedTransactionsResponse message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteFetchAsDbaResponse} ExecuteFetchAsDbaResponse + * @returns {tabletmanagerdata.GetUnresolvedTransactionsResponse} GetUnresolvedTransactionsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsDbaResponse.decode = function decode(reader, length) { + GetUnresolvedTransactionsResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsDbaResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.GetUnresolvedTransactionsResponse(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.result = $root.query.QueryResult.decode(reader, reader.uint32()); + if (!(message.transactions && message.transactions.length)) + message.transactions = []; + message.transactions.push($root.query.TransactionMetadata.decode(reader, reader.uint32())); break; } default: @@ -51376,132 +59081,139 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteFetchAsDbaResponse message from the specified reader or buffer, length delimited. + * Decodes a GetUnresolvedTransactionsResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteFetchAsDbaResponse} ExecuteFetchAsDbaResponse + * @returns {tabletmanagerdata.GetUnresolvedTransactionsResponse} GetUnresolvedTransactionsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsDbaResponse.decodeDelimited = function decodeDelimited(reader) { + GetUnresolvedTransactionsResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteFetchAsDbaResponse message. + * Verifies a GetUnresolvedTransactionsResponse message. * @function verify - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteFetchAsDbaResponse.verify = function verify(message) { + GetUnresolvedTransactionsResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.result != null && message.hasOwnProperty("result")) { - let error = $root.query.QueryResult.verify(message.result); - if (error) - return "result." + error; + if (message.transactions != null && message.hasOwnProperty("transactions")) { + if (!Array.isArray(message.transactions)) + return "transactions: array expected"; + for (let i = 0; i < message.transactions.length; ++i) { + let error = $root.query.TransactionMetadata.verify(message.transactions[i]); + if (error) + return "transactions." + error; + } } return null; }; /** - * Creates an ExecuteFetchAsDbaResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetUnresolvedTransactionsResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteFetchAsDbaResponse} ExecuteFetchAsDbaResponse + * @returns {tabletmanagerdata.GetUnresolvedTransactionsResponse} GetUnresolvedTransactionsResponse */ - ExecuteFetchAsDbaResponse.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsDbaResponse) + GetUnresolvedTransactionsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.GetUnresolvedTransactionsResponse) return object; - let message = new $root.tabletmanagerdata.ExecuteFetchAsDbaResponse(); - if (object.result != null) { - if (typeof object.result !== "object") - throw TypeError(".tabletmanagerdata.ExecuteFetchAsDbaResponse.result: object expected"); - message.result = $root.query.QueryResult.fromObject(object.result); + let message = new $root.tabletmanagerdata.GetUnresolvedTransactionsResponse(); + if (object.transactions) { + if (!Array.isArray(object.transactions)) + throw TypeError(".tabletmanagerdata.GetUnresolvedTransactionsResponse.transactions: array expected"); + message.transactions = []; + for (let i = 0; i < object.transactions.length; ++i) { + if (typeof object.transactions[i] !== "object") + throw TypeError(".tabletmanagerdata.GetUnresolvedTransactionsResponse.transactions: object expected"); + message.transactions[i] = $root.query.TransactionMetadata.fromObject(object.transactions[i]); + } } return message; }; /** - * Creates a plain object from an ExecuteFetchAsDbaResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetUnresolvedTransactionsResponse message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @static - * @param {tabletmanagerdata.ExecuteFetchAsDbaResponse} message ExecuteFetchAsDbaResponse + * @param {tabletmanagerdata.GetUnresolvedTransactionsResponse} message GetUnresolvedTransactionsResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteFetchAsDbaResponse.toObject = function toObject(message, options) { + GetUnresolvedTransactionsResponse.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; - if (options.defaults) - object.result = null; - if (message.result != null && message.hasOwnProperty("result")) - object.result = $root.query.QueryResult.toObject(message.result, options); + if (options.arrays || options.defaults) + object.transactions = []; + if (message.transactions && message.transactions.length) { + object.transactions = []; + for (let j = 0; j < message.transactions.length; ++j) + object.transactions[j] = $root.query.TransactionMetadata.toObject(message.transactions[j], options); + } return object; }; /** - * Converts this ExecuteFetchAsDbaResponse to JSON. + * Converts this GetUnresolvedTransactionsResponse to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @instance * @returns {Object.} JSON object */ - ExecuteFetchAsDbaResponse.prototype.toJSON = function toJSON() { + GetUnresolvedTransactionsResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteFetchAsDbaResponse + * Gets the default type url for GetUnresolvedTransactionsResponse * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteFetchAsDbaResponse + * @memberof tabletmanagerdata.GetUnresolvedTransactionsResponse * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteFetchAsDbaResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + GetUnresolvedTransactionsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsDbaResponse"; + return typeUrlPrefix + "/tabletmanagerdata.GetUnresolvedTransactionsResponse"; }; - return ExecuteFetchAsDbaResponse; + return GetUnresolvedTransactionsResponse; })(); - tabletmanagerdata.ExecuteMultiFetchAsDbaRequest = (function() { + tabletmanagerdata.ReadTransactionRequest = (function() { /** - * Properties of an ExecuteMultiFetchAsDbaRequest. + * Properties of a ReadTransactionRequest. * @memberof tabletmanagerdata - * @interface IExecuteMultiFetchAsDbaRequest - * @property {Uint8Array|null} [sql] ExecuteMultiFetchAsDbaRequest sql - * @property {string|null} [db_name] ExecuteMultiFetchAsDbaRequest db_name - * @property {number|Long|null} [max_rows] ExecuteMultiFetchAsDbaRequest max_rows - * @property {boolean|null} [disable_binlogs] ExecuteMultiFetchAsDbaRequest disable_binlogs - * @property {boolean|null} [reload_schema] ExecuteMultiFetchAsDbaRequest reload_schema - * @property {boolean|null} [disable_foreign_key_checks] ExecuteMultiFetchAsDbaRequest disable_foreign_key_checks + * @interface IReadTransactionRequest + * @property {string|null} [dtid] ReadTransactionRequest dtid */ /** - * Constructs a new ExecuteMultiFetchAsDbaRequest. + * Constructs a new ReadTransactionRequest. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteMultiFetchAsDbaRequest. - * @implements IExecuteMultiFetchAsDbaRequest + * @classdesc Represents a ReadTransactionRequest. + * @implements IReadTransactionRequest * @constructor - * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaRequest=} [properties] Properties to set + * @param {tabletmanagerdata.IReadTransactionRequest=} [properties] Properties to set */ - function ExecuteMultiFetchAsDbaRequest(properties) { + function ReadTransactionRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -51509,145 +59221,75 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteMultiFetchAsDbaRequest sql. - * @member {Uint8Array} sql - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest - * @instance - */ - ExecuteMultiFetchAsDbaRequest.prototype.sql = $util.newBuffer([]); - - /** - * ExecuteMultiFetchAsDbaRequest db_name. - * @member {string} db_name - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest - * @instance - */ - ExecuteMultiFetchAsDbaRequest.prototype.db_name = ""; - - /** - * ExecuteMultiFetchAsDbaRequest max_rows. - * @member {number|Long} max_rows - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest - * @instance - */ - ExecuteMultiFetchAsDbaRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; - - /** - * ExecuteMultiFetchAsDbaRequest disable_binlogs. - * @member {boolean} disable_binlogs - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest - * @instance - */ - ExecuteMultiFetchAsDbaRequest.prototype.disable_binlogs = false; - - /** - * ExecuteMultiFetchAsDbaRequest reload_schema. - * @member {boolean} reload_schema - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest - * @instance - */ - ExecuteMultiFetchAsDbaRequest.prototype.reload_schema = false; - - /** - * ExecuteMultiFetchAsDbaRequest disable_foreign_key_checks. - * @member {boolean} disable_foreign_key_checks - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * ReadTransactionRequest dtid. + * @member {string} dtid + * @memberof tabletmanagerdata.ReadTransactionRequest * @instance */ - ExecuteMultiFetchAsDbaRequest.prototype.disable_foreign_key_checks = false; + ReadTransactionRequest.prototype.dtid = ""; /** - * Creates a new ExecuteMultiFetchAsDbaRequest instance using the specified properties. + * Creates a new ReadTransactionRequest instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @static - * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaRequest=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} ExecuteMultiFetchAsDbaRequest instance + * @param {tabletmanagerdata.IReadTransactionRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ReadTransactionRequest} ReadTransactionRequest instance */ - ExecuteMultiFetchAsDbaRequest.create = function create(properties) { - return new ExecuteMultiFetchAsDbaRequest(properties); + ReadTransactionRequest.create = function create(properties) { + return new ReadTransactionRequest(properties); }; /** - * Encodes the specified ExecuteMultiFetchAsDbaRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteMultiFetchAsDbaRequest.verify|verify} messages. + * Encodes the specified ReadTransactionRequest message. Does not implicitly {@link tabletmanagerdata.ReadTransactionRequest.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @static - * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaRequest} message ExecuteMultiFetchAsDbaRequest message or plain object to encode + * @param {tabletmanagerdata.IReadTransactionRequest} message ReadTransactionRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteMultiFetchAsDbaRequest.encode = function encode(message, writer) { + ReadTransactionRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.sql != null && Object.hasOwnProperty.call(message, "sql")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.sql); - if (message.db_name != null && Object.hasOwnProperty.call(message, "db_name")) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.db_name); - if (message.max_rows != null && Object.hasOwnProperty.call(message, "max_rows")) - writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.max_rows); - if (message.disable_binlogs != null && Object.hasOwnProperty.call(message, "disable_binlogs")) - writer.uint32(/* id 4, wireType 0 =*/32).bool(message.disable_binlogs); - if (message.reload_schema != null && Object.hasOwnProperty.call(message, "reload_schema")) - writer.uint32(/* id 5, wireType 0 =*/40).bool(message.reload_schema); - if (message.disable_foreign_key_checks != null && Object.hasOwnProperty.call(message, "disable_foreign_key_checks")) - writer.uint32(/* id 6, wireType 0 =*/48).bool(message.disable_foreign_key_checks); + if (message.dtid != null && Object.hasOwnProperty.call(message, "dtid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.dtid); return writer; }; /** - * Encodes the specified ExecuteMultiFetchAsDbaRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteMultiFetchAsDbaRequest.verify|verify} messages. + * Encodes the specified ReadTransactionRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ReadTransactionRequest.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @static - * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaRequest} message ExecuteMultiFetchAsDbaRequest message or plain object to encode + * @param {tabletmanagerdata.IReadTransactionRequest} message ReadTransactionRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteMultiFetchAsDbaRequest.encodeDelimited = function encodeDelimited(message, writer) { + ReadTransactionRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteMultiFetchAsDbaRequest message from the specified reader or buffer. + * Decodes a ReadTransactionRequest message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} ExecuteMultiFetchAsDbaRequest + * @returns {tabletmanagerdata.ReadTransactionRequest} ReadTransactionRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteMultiFetchAsDbaRequest.decode = function decode(reader, length) { + ReadTransactionRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteMultiFetchAsDbaRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ReadTransactionRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.sql = reader.bytes(); - break; - } - case 2: { - message.db_name = reader.string(); - break; - } - case 3: { - message.max_rows = reader.uint64(); - break; - } - case 4: { - message.disable_binlogs = reader.bool(); - break; - } - case 5: { - message.reload_schema = reader.bool(); - break; - } - case 6: { - message.disable_foreign_key_checks = reader.bool(); + message.dtid = reader.string(); break; } default: @@ -51659,187 +59301,122 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteMultiFetchAsDbaRequest message from the specified reader or buffer, length delimited. + * Decodes a ReadTransactionRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} ExecuteMultiFetchAsDbaRequest + * @returns {tabletmanagerdata.ReadTransactionRequest} ReadTransactionRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteMultiFetchAsDbaRequest.decodeDelimited = function decodeDelimited(reader) { + ReadTransactionRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteMultiFetchAsDbaRequest message. + * Verifies a ReadTransactionRequest message. * @function verify - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteMultiFetchAsDbaRequest.verify = function verify(message) { + ReadTransactionRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.sql != null && message.hasOwnProperty("sql")) - if (!(message.sql && typeof message.sql.length === "number" || $util.isString(message.sql))) - return "sql: buffer expected"; - if (message.db_name != null && message.hasOwnProperty("db_name")) - if (!$util.isString(message.db_name)) - return "db_name: string expected"; - if (message.max_rows != null && message.hasOwnProperty("max_rows")) - if (!$util.isInteger(message.max_rows) && !(message.max_rows && $util.isInteger(message.max_rows.low) && $util.isInteger(message.max_rows.high))) - return "max_rows: integer|Long expected"; - if (message.disable_binlogs != null && message.hasOwnProperty("disable_binlogs")) - if (typeof message.disable_binlogs !== "boolean") - return "disable_binlogs: boolean expected"; - if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) - if (typeof message.reload_schema !== "boolean") - return "reload_schema: boolean expected"; - if (message.disable_foreign_key_checks != null && message.hasOwnProperty("disable_foreign_key_checks")) - if (typeof message.disable_foreign_key_checks !== "boolean") - return "disable_foreign_key_checks: boolean expected"; + if (message.dtid != null && message.hasOwnProperty("dtid")) + if (!$util.isString(message.dtid)) + return "dtid: string expected"; return null; }; /** - * Creates an ExecuteMultiFetchAsDbaRequest message from a plain object. Also converts values to their respective internal types. + * Creates a ReadTransactionRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} ExecuteMultiFetchAsDbaRequest + * @returns {tabletmanagerdata.ReadTransactionRequest} ReadTransactionRequest */ - ExecuteMultiFetchAsDbaRequest.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteMultiFetchAsDbaRequest) + ReadTransactionRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ReadTransactionRequest) return object; - let message = new $root.tabletmanagerdata.ExecuteMultiFetchAsDbaRequest(); - if (object.sql != null) - if (typeof object.sql === "string") - $util.base64.decode(object.sql, message.sql = $util.newBuffer($util.base64.length(object.sql)), 0); - else if (object.sql.length >= 0) - message.sql = object.sql; - if (object.db_name != null) - message.db_name = String(object.db_name); - if (object.max_rows != null) - if ($util.Long) - (message.max_rows = $util.Long.fromValue(object.max_rows)).unsigned = true; - else if (typeof object.max_rows === "string") - message.max_rows = parseInt(object.max_rows, 10); - else if (typeof object.max_rows === "number") - message.max_rows = object.max_rows; - else if (typeof object.max_rows === "object") - message.max_rows = new $util.LongBits(object.max_rows.low >>> 0, object.max_rows.high >>> 0).toNumber(true); - if (object.disable_binlogs != null) - message.disable_binlogs = Boolean(object.disable_binlogs); - if (object.reload_schema != null) - message.reload_schema = Boolean(object.reload_schema); - if (object.disable_foreign_key_checks != null) - message.disable_foreign_key_checks = Boolean(object.disable_foreign_key_checks); + let message = new $root.tabletmanagerdata.ReadTransactionRequest(); + if (object.dtid != null) + message.dtid = String(object.dtid); return message; }; /** - * Creates a plain object from an ExecuteMultiFetchAsDbaRequest message. Also converts values to other types if specified. + * Creates a plain object from a ReadTransactionRequest message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @static - * @param {tabletmanagerdata.ExecuteMultiFetchAsDbaRequest} message ExecuteMultiFetchAsDbaRequest + * @param {tabletmanagerdata.ReadTransactionRequest} message ReadTransactionRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteMultiFetchAsDbaRequest.toObject = function toObject(message, options) { + ReadTransactionRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; - if (options.defaults) { - if (options.bytes === String) - object.sql = ""; - else { - object.sql = []; - if (options.bytes !== Array) - object.sql = $util.newBuffer(object.sql); - } - object.db_name = ""; - if ($util.Long) { - let long = new $util.Long(0, 0, true); - object.max_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.max_rows = options.longs === String ? "0" : 0; - object.disable_binlogs = false; - object.reload_schema = false; - object.disable_foreign_key_checks = false; - } - if (message.sql != null && message.hasOwnProperty("sql")) - object.sql = options.bytes === String ? $util.base64.encode(message.sql, 0, message.sql.length) : options.bytes === Array ? Array.prototype.slice.call(message.sql) : message.sql; - if (message.db_name != null && message.hasOwnProperty("db_name")) - object.db_name = message.db_name; - if (message.max_rows != null && message.hasOwnProperty("max_rows")) - if (typeof message.max_rows === "number") - object.max_rows = options.longs === String ? String(message.max_rows) : message.max_rows; - else - object.max_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_rows) : options.longs === Number ? new $util.LongBits(message.max_rows.low >>> 0, message.max_rows.high >>> 0).toNumber(true) : message.max_rows; - if (message.disable_binlogs != null && message.hasOwnProperty("disable_binlogs")) - object.disable_binlogs = message.disable_binlogs; - if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) - object.reload_schema = message.reload_schema; - if (message.disable_foreign_key_checks != null && message.hasOwnProperty("disable_foreign_key_checks")) - object.disable_foreign_key_checks = message.disable_foreign_key_checks; + if (options.defaults) + object.dtid = ""; + if (message.dtid != null && message.hasOwnProperty("dtid")) + object.dtid = message.dtid; return object; }; /** - * Converts this ExecuteMultiFetchAsDbaRequest to JSON. + * Converts this ReadTransactionRequest to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @instance * @returns {Object.} JSON object */ - ExecuteMultiFetchAsDbaRequest.prototype.toJSON = function toJSON() { + ReadTransactionRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteMultiFetchAsDbaRequest + * Gets the default type url for ReadTransactionRequest * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaRequest + * @memberof tabletmanagerdata.ReadTransactionRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteMultiFetchAsDbaRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ReadTransactionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteMultiFetchAsDbaRequest"; + return typeUrlPrefix + "/tabletmanagerdata.ReadTransactionRequest"; }; - return ExecuteMultiFetchAsDbaRequest; + return ReadTransactionRequest; })(); - tabletmanagerdata.ExecuteMultiFetchAsDbaResponse = (function() { + tabletmanagerdata.ReadTransactionResponse = (function() { /** - * Properties of an ExecuteMultiFetchAsDbaResponse. + * Properties of a ReadTransactionResponse. * @memberof tabletmanagerdata - * @interface IExecuteMultiFetchAsDbaResponse - * @property {Array.|null} [results] ExecuteMultiFetchAsDbaResponse results + * @interface IReadTransactionResponse + * @property {query.ITransactionMetadata|null} [transaction] ReadTransactionResponse transaction */ /** - * Constructs a new ExecuteMultiFetchAsDbaResponse. + * Constructs a new ReadTransactionResponse. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteMultiFetchAsDbaResponse. - * @implements IExecuteMultiFetchAsDbaResponse + * @classdesc Represents a ReadTransactionResponse. + * @implements IReadTransactionResponse * @constructor - * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaResponse=} [properties] Properties to set + * @param {tabletmanagerdata.IReadTransactionResponse=} [properties] Properties to set */ - function ExecuteMultiFetchAsDbaResponse(properties) { - this.results = []; + function ReadTransactionResponse(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -51847,78 +59424,75 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteMultiFetchAsDbaResponse results. - * @member {Array.} results - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * ReadTransactionResponse transaction. + * @member {query.ITransactionMetadata|null|undefined} transaction + * @memberof tabletmanagerdata.ReadTransactionResponse * @instance */ - ExecuteMultiFetchAsDbaResponse.prototype.results = $util.emptyArray; + ReadTransactionResponse.prototype.transaction = null; /** - * Creates a new ExecuteMultiFetchAsDbaResponse instance using the specified properties. + * Creates a new ReadTransactionResponse instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @static - * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaResponse=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} ExecuteMultiFetchAsDbaResponse instance + * @param {tabletmanagerdata.IReadTransactionResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ReadTransactionResponse} ReadTransactionResponse instance */ - ExecuteMultiFetchAsDbaResponse.create = function create(properties) { - return new ExecuteMultiFetchAsDbaResponse(properties); + ReadTransactionResponse.create = function create(properties) { + return new ReadTransactionResponse(properties); }; /** - * Encodes the specified ExecuteMultiFetchAsDbaResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.verify|verify} messages. + * Encodes the specified ReadTransactionResponse message. Does not implicitly {@link tabletmanagerdata.ReadTransactionResponse.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @static - * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaResponse} message ExecuteMultiFetchAsDbaResponse message or plain object to encode + * @param {tabletmanagerdata.IReadTransactionResponse} message ReadTransactionResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteMultiFetchAsDbaResponse.encode = function encode(message, writer) { + ReadTransactionResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.results != null && message.results.length) - for (let i = 0; i < message.results.length; ++i) - $root.query.QueryResult.encode(message.results[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction")) + $root.query.TransactionMetadata.encode(message.transaction, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified ExecuteMultiFetchAsDbaResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.verify|verify} messages. + * Encodes the specified ReadTransactionResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ReadTransactionResponse.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @static - * @param {tabletmanagerdata.IExecuteMultiFetchAsDbaResponse} message ExecuteMultiFetchAsDbaResponse message or plain object to encode + * @param {tabletmanagerdata.IReadTransactionResponse} message ReadTransactionResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteMultiFetchAsDbaResponse.encodeDelimited = function encodeDelimited(message, writer) { + ReadTransactionResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteMultiFetchAsDbaResponse message from the specified reader or buffer. + * Decodes a ReadTransactionResponse message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} ExecuteMultiFetchAsDbaResponse + * @returns {tabletmanagerdata.ReadTransactionResponse} ReadTransactionResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteMultiFetchAsDbaResponse.decode = function decode(reader, length) { + ReadTransactionResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteMultiFetchAsDbaResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ReadTransactionResponse(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - if (!(message.results && message.results.length)) - message.results = []; - message.results.push($root.query.QueryResult.decode(reader, reader.uint32())); + message.transaction = $root.query.TransactionMetadata.decode(reader, reader.uint32()); break; } default: @@ -51930,142 +59504,128 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteMultiFetchAsDbaResponse message from the specified reader or buffer, length delimited. + * Decodes a ReadTransactionResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} ExecuteMultiFetchAsDbaResponse + * @returns {tabletmanagerdata.ReadTransactionResponse} ReadTransactionResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteMultiFetchAsDbaResponse.decodeDelimited = function decodeDelimited(reader) { + ReadTransactionResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteMultiFetchAsDbaResponse message. + * Verifies a ReadTransactionResponse message. * @function verify - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteMultiFetchAsDbaResponse.verify = function verify(message) { + ReadTransactionResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.results != null && message.hasOwnProperty("results")) { - if (!Array.isArray(message.results)) - return "results: array expected"; - for (let i = 0; i < message.results.length; ++i) { - let error = $root.query.QueryResult.verify(message.results[i]); - if (error) - return "results." + error; - } + if (message.transaction != null && message.hasOwnProperty("transaction")) { + let error = $root.query.TransactionMetadata.verify(message.transaction); + if (error) + return "transaction." + error; } return null; }; /** - * Creates an ExecuteMultiFetchAsDbaResponse message from a plain object. Also converts values to their respective internal types. + * Creates a ReadTransactionResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} ExecuteMultiFetchAsDbaResponse + * @returns {tabletmanagerdata.ReadTransactionResponse} ReadTransactionResponse */ - ExecuteMultiFetchAsDbaResponse.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteMultiFetchAsDbaResponse) + ReadTransactionResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ReadTransactionResponse) return object; - let message = new $root.tabletmanagerdata.ExecuteMultiFetchAsDbaResponse(); - if (object.results) { - if (!Array.isArray(object.results)) - throw TypeError(".tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results: array expected"); - message.results = []; - for (let i = 0; i < object.results.length; ++i) { - if (typeof object.results[i] !== "object") - throw TypeError(".tabletmanagerdata.ExecuteMultiFetchAsDbaResponse.results: object expected"); - message.results[i] = $root.query.QueryResult.fromObject(object.results[i]); - } + let message = new $root.tabletmanagerdata.ReadTransactionResponse(); + if (object.transaction != null) { + if (typeof object.transaction !== "object") + throw TypeError(".tabletmanagerdata.ReadTransactionResponse.transaction: object expected"); + message.transaction = $root.query.TransactionMetadata.fromObject(object.transaction); } return message; }; /** - * Creates a plain object from an ExecuteMultiFetchAsDbaResponse message. Also converts values to other types if specified. + * Creates a plain object from a ReadTransactionResponse message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @static - * @param {tabletmanagerdata.ExecuteMultiFetchAsDbaResponse} message ExecuteMultiFetchAsDbaResponse + * @param {tabletmanagerdata.ReadTransactionResponse} message ReadTransactionResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteMultiFetchAsDbaResponse.toObject = function toObject(message, options) { + ReadTransactionResponse.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; - if (options.arrays || options.defaults) - object.results = []; - if (message.results && message.results.length) { - object.results = []; - for (let j = 0; j < message.results.length; ++j) - object.results[j] = $root.query.QueryResult.toObject(message.results[j], options); - } + if (options.defaults) + object.transaction = null; + if (message.transaction != null && message.hasOwnProperty("transaction")) + object.transaction = $root.query.TransactionMetadata.toObject(message.transaction, options); return object; }; /** - * Converts this ExecuteMultiFetchAsDbaResponse to JSON. + * Converts this ReadTransactionResponse to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @instance * @returns {Object.} JSON object */ - ExecuteMultiFetchAsDbaResponse.prototype.toJSON = function toJSON() { + ReadTransactionResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteMultiFetchAsDbaResponse + * Gets the default type url for ReadTransactionResponse * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteMultiFetchAsDbaResponse + * @memberof tabletmanagerdata.ReadTransactionResponse * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteMultiFetchAsDbaResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ReadTransactionResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteMultiFetchAsDbaResponse"; + return typeUrlPrefix + "/tabletmanagerdata.ReadTransactionResponse"; }; - return ExecuteMultiFetchAsDbaResponse; + return ReadTransactionResponse; })(); - tabletmanagerdata.ExecuteFetchAsAllPrivsRequest = (function() { + tabletmanagerdata.ConcludeTransactionRequest = (function() { /** - * Properties of an ExecuteFetchAsAllPrivsRequest. + * Properties of a ConcludeTransactionRequest. * @memberof tabletmanagerdata - * @interface IExecuteFetchAsAllPrivsRequest - * @property {Uint8Array|null} [query] ExecuteFetchAsAllPrivsRequest query - * @property {string|null} [db_name] ExecuteFetchAsAllPrivsRequest db_name - * @property {number|Long|null} [max_rows] ExecuteFetchAsAllPrivsRequest max_rows - * @property {boolean|null} [reload_schema] ExecuteFetchAsAllPrivsRequest reload_schema + * @interface IConcludeTransactionRequest + * @property {string|null} [dtid] ConcludeTransactionRequest dtid + * @property {boolean|null} [mm] ConcludeTransactionRequest mm */ /** - * Constructs a new ExecuteFetchAsAllPrivsRequest. + * Constructs a new ConcludeTransactionRequest. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteFetchAsAllPrivsRequest. - * @implements IExecuteFetchAsAllPrivsRequest + * @classdesc Represents a ConcludeTransactionRequest. + * @implements IConcludeTransactionRequest * @constructor - * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsRequest=} [properties] Properties to set + * @param {tabletmanagerdata.IConcludeTransactionRequest=} [properties] Properties to set */ - function ExecuteFetchAsAllPrivsRequest(properties) { + function ConcludeTransactionRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -52073,117 +59633,89 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteFetchAsAllPrivsRequest query. - * @member {Uint8Array} query - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest - * @instance - */ - ExecuteFetchAsAllPrivsRequest.prototype.query = $util.newBuffer([]); - - /** - * ExecuteFetchAsAllPrivsRequest db_name. - * @member {string} db_name - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest - * @instance - */ - ExecuteFetchAsAllPrivsRequest.prototype.db_name = ""; - - /** - * ExecuteFetchAsAllPrivsRequest max_rows. - * @member {number|Long} max_rows - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * ConcludeTransactionRequest dtid. + * @member {string} dtid + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @instance */ - ExecuteFetchAsAllPrivsRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + ConcludeTransactionRequest.prototype.dtid = ""; /** - * ExecuteFetchAsAllPrivsRequest reload_schema. - * @member {boolean} reload_schema - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * ConcludeTransactionRequest mm. + * @member {boolean} mm + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @instance */ - ExecuteFetchAsAllPrivsRequest.prototype.reload_schema = false; + ConcludeTransactionRequest.prototype.mm = false; /** - * Creates a new ExecuteFetchAsAllPrivsRequest instance using the specified properties. + * Creates a new ConcludeTransactionRequest instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @static - * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsRequest=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} ExecuteFetchAsAllPrivsRequest instance + * @param {tabletmanagerdata.IConcludeTransactionRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ConcludeTransactionRequest} ConcludeTransactionRequest instance */ - ExecuteFetchAsAllPrivsRequest.create = function create(properties) { - return new ExecuteFetchAsAllPrivsRequest(properties); + ConcludeTransactionRequest.create = function create(properties) { + return new ConcludeTransactionRequest(properties); }; /** - * Encodes the specified ExecuteFetchAsAllPrivsRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAllPrivsRequest.verify|verify} messages. + * Encodes the specified ConcludeTransactionRequest message. Does not implicitly {@link tabletmanagerdata.ConcludeTransactionRequest.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @static - * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsRequest} message ExecuteFetchAsAllPrivsRequest message or plain object to encode + * @param {tabletmanagerdata.IConcludeTransactionRequest} message ConcludeTransactionRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsAllPrivsRequest.encode = function encode(message, writer) { + ConcludeTransactionRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.query != null && Object.hasOwnProperty.call(message, "query")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.query); - if (message.db_name != null && Object.hasOwnProperty.call(message, "db_name")) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.db_name); - if (message.max_rows != null && Object.hasOwnProperty.call(message, "max_rows")) - writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.max_rows); - if (message.reload_schema != null && Object.hasOwnProperty.call(message, "reload_schema")) - writer.uint32(/* id 4, wireType 0 =*/32).bool(message.reload_schema); + if (message.dtid != null && Object.hasOwnProperty.call(message, "dtid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.dtid); + if (message.mm != null && Object.hasOwnProperty.call(message, "mm")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.mm); return writer; }; /** - * Encodes the specified ExecuteFetchAsAllPrivsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAllPrivsRequest.verify|verify} messages. + * Encodes the specified ConcludeTransactionRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ConcludeTransactionRequest.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @static - * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsRequest} message ExecuteFetchAsAllPrivsRequest message or plain object to encode + * @param {tabletmanagerdata.IConcludeTransactionRequest} message ConcludeTransactionRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsAllPrivsRequest.encodeDelimited = function encodeDelimited(message, writer) { + ConcludeTransactionRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteFetchAsAllPrivsRequest message from the specified reader or buffer. + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} ExecuteFetchAsAllPrivsRequest + * @returns {tabletmanagerdata.ConcludeTransactionRequest} ConcludeTransactionRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsAllPrivsRequest.decode = function decode(reader, length) { + ConcludeTransactionRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsAllPrivsRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ConcludeTransactionRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.query = reader.bytes(); + message.dtid = reader.string(); break; } case 2: { - message.db_name = reader.string(); - break; - } - case 3: { - message.max_rows = reader.uint64(); - break; - } - case 4: { - message.reload_schema = reader.bool(); + message.mm = reader.bool(); break; } default: @@ -52195,170 +59727,130 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteFetchAsAllPrivsRequest message from the specified reader or buffer, length delimited. + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} ExecuteFetchAsAllPrivsRequest + * @returns {tabletmanagerdata.ConcludeTransactionRequest} ConcludeTransactionRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsAllPrivsRequest.decodeDelimited = function decodeDelimited(reader) { + ConcludeTransactionRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteFetchAsAllPrivsRequest message. + * Verifies a ConcludeTransactionRequest message. * @function verify - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteFetchAsAllPrivsRequest.verify = function verify(message) { + ConcludeTransactionRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.query != null && message.hasOwnProperty("query")) - if (!(message.query && typeof message.query.length === "number" || $util.isString(message.query))) - return "query: buffer expected"; - if (message.db_name != null && message.hasOwnProperty("db_name")) - if (!$util.isString(message.db_name)) - return "db_name: string expected"; - if (message.max_rows != null && message.hasOwnProperty("max_rows")) - if (!$util.isInteger(message.max_rows) && !(message.max_rows && $util.isInteger(message.max_rows.low) && $util.isInteger(message.max_rows.high))) - return "max_rows: integer|Long expected"; - if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) - if (typeof message.reload_schema !== "boolean") - return "reload_schema: boolean expected"; + if (message.dtid != null && message.hasOwnProperty("dtid")) + if (!$util.isString(message.dtid)) + return "dtid: string expected"; + if (message.mm != null && message.hasOwnProperty("mm")) + if (typeof message.mm !== "boolean") + return "mm: boolean expected"; return null; }; /** - * Creates an ExecuteFetchAsAllPrivsRequest message from a plain object. Also converts values to their respective internal types. + * Creates a ConcludeTransactionRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} ExecuteFetchAsAllPrivsRequest + * @returns {tabletmanagerdata.ConcludeTransactionRequest} ConcludeTransactionRequest */ - ExecuteFetchAsAllPrivsRequest.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsAllPrivsRequest) + ConcludeTransactionRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ConcludeTransactionRequest) return object; - let message = new $root.tabletmanagerdata.ExecuteFetchAsAllPrivsRequest(); - if (object.query != null) - if (typeof object.query === "string") - $util.base64.decode(object.query, message.query = $util.newBuffer($util.base64.length(object.query)), 0); - else if (object.query.length >= 0) - message.query = object.query; - if (object.db_name != null) - message.db_name = String(object.db_name); - if (object.max_rows != null) - if ($util.Long) - (message.max_rows = $util.Long.fromValue(object.max_rows)).unsigned = true; - else if (typeof object.max_rows === "string") - message.max_rows = parseInt(object.max_rows, 10); - else if (typeof object.max_rows === "number") - message.max_rows = object.max_rows; - else if (typeof object.max_rows === "object") - message.max_rows = new $util.LongBits(object.max_rows.low >>> 0, object.max_rows.high >>> 0).toNumber(true); - if (object.reload_schema != null) - message.reload_schema = Boolean(object.reload_schema); + let message = new $root.tabletmanagerdata.ConcludeTransactionRequest(); + if (object.dtid != null) + message.dtid = String(object.dtid); + if (object.mm != null) + message.mm = Boolean(object.mm); return message; }; /** - * Creates a plain object from an ExecuteFetchAsAllPrivsRequest message. Also converts values to other types if specified. + * Creates a plain object from a ConcludeTransactionRequest message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @static - * @param {tabletmanagerdata.ExecuteFetchAsAllPrivsRequest} message ExecuteFetchAsAllPrivsRequest + * @param {tabletmanagerdata.ConcludeTransactionRequest} message ConcludeTransactionRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteFetchAsAllPrivsRequest.toObject = function toObject(message, options) { + ConcludeTransactionRequest.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; if (options.defaults) { - if (options.bytes === String) - object.query = ""; - else { - object.query = []; - if (options.bytes !== Array) - object.query = $util.newBuffer(object.query); - } - object.db_name = ""; - if ($util.Long) { - let long = new $util.Long(0, 0, true); - object.max_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.max_rows = options.longs === String ? "0" : 0; - object.reload_schema = false; + object.dtid = ""; + object.mm = false; } - if (message.query != null && message.hasOwnProperty("query")) - object.query = options.bytes === String ? $util.base64.encode(message.query, 0, message.query.length) : options.bytes === Array ? Array.prototype.slice.call(message.query) : message.query; - if (message.db_name != null && message.hasOwnProperty("db_name")) - object.db_name = message.db_name; - if (message.max_rows != null && message.hasOwnProperty("max_rows")) - if (typeof message.max_rows === "number") - object.max_rows = options.longs === String ? String(message.max_rows) : message.max_rows; - else - object.max_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_rows) : options.longs === Number ? new $util.LongBits(message.max_rows.low >>> 0, message.max_rows.high >>> 0).toNumber(true) : message.max_rows; - if (message.reload_schema != null && message.hasOwnProperty("reload_schema")) - object.reload_schema = message.reload_schema; + if (message.dtid != null && message.hasOwnProperty("dtid")) + object.dtid = message.dtid; + if (message.mm != null && message.hasOwnProperty("mm")) + object.mm = message.mm; return object; }; /** - * Converts this ExecuteFetchAsAllPrivsRequest to JSON. + * Converts this ConcludeTransactionRequest to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @instance * @returns {Object.} JSON object */ - ExecuteFetchAsAllPrivsRequest.prototype.toJSON = function toJSON() { + ConcludeTransactionRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteFetchAsAllPrivsRequest + * Gets the default type url for ConcludeTransactionRequest * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsRequest + * @memberof tabletmanagerdata.ConcludeTransactionRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteFetchAsAllPrivsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ConcludeTransactionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsAllPrivsRequest"; + return typeUrlPrefix + "/tabletmanagerdata.ConcludeTransactionRequest"; }; - return ExecuteFetchAsAllPrivsRequest; + return ConcludeTransactionRequest; })(); - tabletmanagerdata.ExecuteFetchAsAllPrivsResponse = (function() { + tabletmanagerdata.ConcludeTransactionResponse = (function() { /** - * Properties of an ExecuteFetchAsAllPrivsResponse. + * Properties of a ConcludeTransactionResponse. * @memberof tabletmanagerdata - * @interface IExecuteFetchAsAllPrivsResponse - * @property {query.IQueryResult|null} [result] ExecuteFetchAsAllPrivsResponse result + * @interface IConcludeTransactionResponse */ /** - * Constructs a new ExecuteFetchAsAllPrivsResponse. + * Constructs a new ConcludeTransactionResponse. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteFetchAsAllPrivsResponse. - * @implements IExecuteFetchAsAllPrivsResponse + * @classdesc Represents a ConcludeTransactionResponse. + * @implements IConcludeTransactionResponse * @constructor - * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsResponse=} [properties] Properties to set + * @param {tabletmanagerdata.IConcludeTransactionResponse=} [properties] Properties to set */ - function ExecuteFetchAsAllPrivsResponse(properties) { + function ConcludeTransactionResponse(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -52366,77 +59858,63 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteFetchAsAllPrivsResponse result. - * @member {query.IQueryResult|null|undefined} result - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse - * @instance - */ - ExecuteFetchAsAllPrivsResponse.prototype.result = null; - - /** - * Creates a new ExecuteFetchAsAllPrivsResponse instance using the specified properties. + * Creates a new ConcludeTransactionResponse instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @static - * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsResponse=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} ExecuteFetchAsAllPrivsResponse instance + * @param {tabletmanagerdata.IConcludeTransactionResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ConcludeTransactionResponse} ConcludeTransactionResponse instance */ - ExecuteFetchAsAllPrivsResponse.create = function create(properties) { - return new ExecuteFetchAsAllPrivsResponse(properties); + ConcludeTransactionResponse.create = function create(properties) { + return new ConcludeTransactionResponse(properties); }; /** - * Encodes the specified ExecuteFetchAsAllPrivsResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.verify|verify} messages. + * Encodes the specified ConcludeTransactionResponse message. Does not implicitly {@link tabletmanagerdata.ConcludeTransactionResponse.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @static - * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsResponse} message ExecuteFetchAsAllPrivsResponse message or plain object to encode + * @param {tabletmanagerdata.IConcludeTransactionResponse} message ConcludeTransactionResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsAllPrivsResponse.encode = function encode(message, writer) { + ConcludeTransactionResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.result != null && Object.hasOwnProperty.call(message, "result")) - $root.query.QueryResult.encode(message.result, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified ExecuteFetchAsAllPrivsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.verify|verify} messages. + * Encodes the specified ConcludeTransactionResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ConcludeTransactionResponse.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @static - * @param {tabletmanagerdata.IExecuteFetchAsAllPrivsResponse} message ExecuteFetchAsAllPrivsResponse message or plain object to encode + * @param {tabletmanagerdata.IConcludeTransactionResponse} message ConcludeTransactionResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsAllPrivsResponse.encodeDelimited = function encodeDelimited(message, writer) { + ConcludeTransactionResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteFetchAsAllPrivsResponse message from the specified reader or buffer. + * Decodes a ConcludeTransactionResponse message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} ExecuteFetchAsAllPrivsResponse + * @returns {tabletmanagerdata.ConcludeTransactionResponse} ConcludeTransactionResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsAllPrivsResponse.decode = function decode(reader, length) { + ConcludeTransactionResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsAllPrivsResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ConcludeTransactionResponse(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.result = $root.query.QueryResult.decode(reader, reader.uint32()); - break; - } default: reader.skipType(tag & 7); break; @@ -52446,128 +59924,108 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteFetchAsAllPrivsResponse message from the specified reader or buffer, length delimited. + * Decodes a ConcludeTransactionResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} ExecuteFetchAsAllPrivsResponse + * @returns {tabletmanagerdata.ConcludeTransactionResponse} ConcludeTransactionResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsAllPrivsResponse.decodeDelimited = function decodeDelimited(reader) { + ConcludeTransactionResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteFetchAsAllPrivsResponse message. + * Verifies a ConcludeTransactionResponse message. * @function verify - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteFetchAsAllPrivsResponse.verify = function verify(message) { + ConcludeTransactionResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.result != null && message.hasOwnProperty("result")) { - let error = $root.query.QueryResult.verify(message.result); - if (error) - return "result." + error; - } return null; }; /** - * Creates an ExecuteFetchAsAllPrivsResponse message from a plain object. Also converts values to their respective internal types. + * Creates a ConcludeTransactionResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} ExecuteFetchAsAllPrivsResponse + * @returns {tabletmanagerdata.ConcludeTransactionResponse} ConcludeTransactionResponse */ - ExecuteFetchAsAllPrivsResponse.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsAllPrivsResponse) + ConcludeTransactionResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ConcludeTransactionResponse) return object; - let message = new $root.tabletmanagerdata.ExecuteFetchAsAllPrivsResponse(); - if (object.result != null) { - if (typeof object.result !== "object") - throw TypeError(".tabletmanagerdata.ExecuteFetchAsAllPrivsResponse.result: object expected"); - message.result = $root.query.QueryResult.fromObject(object.result); - } - return message; + return new $root.tabletmanagerdata.ConcludeTransactionResponse(); }; /** - * Creates a plain object from an ExecuteFetchAsAllPrivsResponse message. Also converts values to other types if specified. + * Creates a plain object from a ConcludeTransactionResponse message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @static - * @param {tabletmanagerdata.ExecuteFetchAsAllPrivsResponse} message ExecuteFetchAsAllPrivsResponse + * @param {tabletmanagerdata.ConcludeTransactionResponse} message ConcludeTransactionResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteFetchAsAllPrivsResponse.toObject = function toObject(message, options) { - if (!options) - options = {}; - let object = {}; - if (options.defaults) - object.result = null; - if (message.result != null && message.hasOwnProperty("result")) - object.result = $root.query.QueryResult.toObject(message.result, options); - return object; + ConcludeTransactionResponse.toObject = function toObject() { + return {}; }; /** - * Converts this ExecuteFetchAsAllPrivsResponse to JSON. + * Converts this ConcludeTransactionResponse to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @instance * @returns {Object.} JSON object */ - ExecuteFetchAsAllPrivsResponse.prototype.toJSON = function toJSON() { + ConcludeTransactionResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteFetchAsAllPrivsResponse + * Gets the default type url for ConcludeTransactionResponse * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteFetchAsAllPrivsResponse + * @memberof tabletmanagerdata.ConcludeTransactionResponse * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteFetchAsAllPrivsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + ConcludeTransactionResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsAllPrivsResponse"; + return typeUrlPrefix + "/tabletmanagerdata.ConcludeTransactionResponse"; }; - return ExecuteFetchAsAllPrivsResponse; + return ConcludeTransactionResponse; })(); - tabletmanagerdata.ExecuteFetchAsAppRequest = (function() { + tabletmanagerdata.MysqlHostMetricsRequest = (function() { /** - * Properties of an ExecuteFetchAsAppRequest. + * Properties of a MysqlHostMetricsRequest. * @memberof tabletmanagerdata - * @interface IExecuteFetchAsAppRequest - * @property {Uint8Array|null} [query] ExecuteFetchAsAppRequest query - * @property {number|Long|null} [max_rows] ExecuteFetchAsAppRequest max_rows + * @interface IMysqlHostMetricsRequest */ /** - * Constructs a new ExecuteFetchAsAppRequest. + * Constructs a new MysqlHostMetricsRequest. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteFetchAsAppRequest. - * @implements IExecuteFetchAsAppRequest + * @classdesc Represents a MysqlHostMetricsRequest. + * @implements IMysqlHostMetricsRequest * @constructor - * @param {tabletmanagerdata.IExecuteFetchAsAppRequest=} [properties] Properties to set + * @param {tabletmanagerdata.IMysqlHostMetricsRequest=} [properties] Properties to set */ - function ExecuteFetchAsAppRequest(properties) { + function MysqlHostMetricsRequest(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -52575,91 +60033,63 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteFetchAsAppRequest query. - * @member {Uint8Array} query - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest - * @instance - */ - ExecuteFetchAsAppRequest.prototype.query = $util.newBuffer([]); - - /** - * ExecuteFetchAsAppRequest max_rows. - * @member {number|Long} max_rows - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest - * @instance - */ - ExecuteFetchAsAppRequest.prototype.max_rows = $util.Long ? $util.Long.fromBits(0,0,true) : 0; - - /** - * Creates a new ExecuteFetchAsAppRequest instance using the specified properties. + * Creates a new MysqlHostMetricsRequest instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @static - * @param {tabletmanagerdata.IExecuteFetchAsAppRequest=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteFetchAsAppRequest} ExecuteFetchAsAppRequest instance + * @param {tabletmanagerdata.IMysqlHostMetricsRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.MysqlHostMetricsRequest} MysqlHostMetricsRequest instance */ - ExecuteFetchAsAppRequest.create = function create(properties) { - return new ExecuteFetchAsAppRequest(properties); + MysqlHostMetricsRequest.create = function create(properties) { + return new MysqlHostMetricsRequest(properties); }; /** - * Encodes the specified ExecuteFetchAsAppRequest message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAppRequest.verify|verify} messages. + * Encodes the specified MysqlHostMetricsRequest message. Does not implicitly {@link tabletmanagerdata.MysqlHostMetricsRequest.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @static - * @param {tabletmanagerdata.IExecuteFetchAsAppRequest} message ExecuteFetchAsAppRequest message or plain object to encode + * @param {tabletmanagerdata.IMysqlHostMetricsRequest} message MysqlHostMetricsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsAppRequest.encode = function encode(message, writer) { + MysqlHostMetricsRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.query != null && Object.hasOwnProperty.call(message, "query")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.query); - if (message.max_rows != null && Object.hasOwnProperty.call(message, "max_rows")) - writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.max_rows); return writer; }; /** - * Encodes the specified ExecuteFetchAsAppRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAppRequest.verify|verify} messages. + * Encodes the specified MysqlHostMetricsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.MysqlHostMetricsRequest.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @static - * @param {tabletmanagerdata.IExecuteFetchAsAppRequest} message ExecuteFetchAsAppRequest message or plain object to encode + * @param {tabletmanagerdata.IMysqlHostMetricsRequest} message MysqlHostMetricsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsAppRequest.encodeDelimited = function encodeDelimited(message, writer) { + MysqlHostMetricsRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteFetchAsAppRequest message from the specified reader or buffer. + * Decodes a MysqlHostMetricsRequest message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteFetchAsAppRequest} ExecuteFetchAsAppRequest + * @returns {tabletmanagerdata.MysqlHostMetricsRequest} MysqlHostMetricsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsAppRequest.decode = function decode(reader, length) { + MysqlHostMetricsRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsAppRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.MysqlHostMetricsRequest(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - message.query = reader.bytes(); - break; - } - case 2: { - message.max_rows = reader.uint64(); - break; - } default: reader.skipType(tag & 7); break; @@ -52669,154 +60099,109 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteFetchAsAppRequest message from the specified reader or buffer, length delimited. + * Decodes a MysqlHostMetricsRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteFetchAsAppRequest} ExecuteFetchAsAppRequest + * @returns {tabletmanagerdata.MysqlHostMetricsRequest} MysqlHostMetricsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsAppRequest.decodeDelimited = function decodeDelimited(reader) { + MysqlHostMetricsRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteFetchAsAppRequest message. + * Verifies a MysqlHostMetricsRequest message. * @function verify - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteFetchAsAppRequest.verify = function verify(message) { + MysqlHostMetricsRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.query != null && message.hasOwnProperty("query")) - if (!(message.query && typeof message.query.length === "number" || $util.isString(message.query))) - return "query: buffer expected"; - if (message.max_rows != null && message.hasOwnProperty("max_rows")) - if (!$util.isInteger(message.max_rows) && !(message.max_rows && $util.isInteger(message.max_rows.low) && $util.isInteger(message.max_rows.high))) - return "max_rows: integer|Long expected"; return null; }; /** - * Creates an ExecuteFetchAsAppRequest message from a plain object. Also converts values to their respective internal types. + * Creates a MysqlHostMetricsRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteFetchAsAppRequest} ExecuteFetchAsAppRequest + * @returns {tabletmanagerdata.MysqlHostMetricsRequest} MysqlHostMetricsRequest */ - ExecuteFetchAsAppRequest.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsAppRequest) + MysqlHostMetricsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.MysqlHostMetricsRequest) return object; - let message = new $root.tabletmanagerdata.ExecuteFetchAsAppRequest(); - if (object.query != null) - if (typeof object.query === "string") - $util.base64.decode(object.query, message.query = $util.newBuffer($util.base64.length(object.query)), 0); - else if (object.query.length >= 0) - message.query = object.query; - if (object.max_rows != null) - if ($util.Long) - (message.max_rows = $util.Long.fromValue(object.max_rows)).unsigned = true; - else if (typeof object.max_rows === "string") - message.max_rows = parseInt(object.max_rows, 10); - else if (typeof object.max_rows === "number") - message.max_rows = object.max_rows; - else if (typeof object.max_rows === "object") - message.max_rows = new $util.LongBits(object.max_rows.low >>> 0, object.max_rows.high >>> 0).toNumber(true); - return message; + return new $root.tabletmanagerdata.MysqlHostMetricsRequest(); }; /** - * Creates a plain object from an ExecuteFetchAsAppRequest message. Also converts values to other types if specified. + * Creates a plain object from a MysqlHostMetricsRequest message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @static - * @param {tabletmanagerdata.ExecuteFetchAsAppRequest} message ExecuteFetchAsAppRequest + * @param {tabletmanagerdata.MysqlHostMetricsRequest} message MysqlHostMetricsRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteFetchAsAppRequest.toObject = function toObject(message, options) { - if (!options) - options = {}; - let object = {}; - if (options.defaults) { - if (options.bytes === String) - object.query = ""; - else { - object.query = []; - if (options.bytes !== Array) - object.query = $util.newBuffer(object.query); - } - if ($util.Long) { - let long = new $util.Long(0, 0, true); - object.max_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.max_rows = options.longs === String ? "0" : 0; - } - if (message.query != null && message.hasOwnProperty("query")) - object.query = options.bytes === String ? $util.base64.encode(message.query, 0, message.query.length) : options.bytes === Array ? Array.prototype.slice.call(message.query) : message.query; - if (message.max_rows != null && message.hasOwnProperty("max_rows")) - if (typeof message.max_rows === "number") - object.max_rows = options.longs === String ? String(message.max_rows) : message.max_rows; - else - object.max_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_rows) : options.longs === Number ? new $util.LongBits(message.max_rows.low >>> 0, message.max_rows.high >>> 0).toNumber(true) : message.max_rows; - return object; + MysqlHostMetricsRequest.toObject = function toObject() { + return {}; }; /** - * Converts this ExecuteFetchAsAppRequest to JSON. + * Converts this MysqlHostMetricsRequest to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @instance * @returns {Object.} JSON object */ - ExecuteFetchAsAppRequest.prototype.toJSON = function toJSON() { + MysqlHostMetricsRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteFetchAsAppRequest + * Gets the default type url for MysqlHostMetricsRequest * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteFetchAsAppRequest + * @memberof tabletmanagerdata.MysqlHostMetricsRequest * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteFetchAsAppRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + MysqlHostMetricsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsAppRequest"; + return typeUrlPrefix + "/tabletmanagerdata.MysqlHostMetricsRequest"; }; - return ExecuteFetchAsAppRequest; + return MysqlHostMetricsRequest; })(); - tabletmanagerdata.ExecuteFetchAsAppResponse = (function() { + tabletmanagerdata.MysqlHostMetricsResponse = (function() { /** - * Properties of an ExecuteFetchAsAppResponse. + * Properties of a MysqlHostMetricsResponse. * @memberof tabletmanagerdata - * @interface IExecuteFetchAsAppResponse - * @property {query.IQueryResult|null} [result] ExecuteFetchAsAppResponse result + * @interface IMysqlHostMetricsResponse + * @property {mysqlctl.IHostMetricsResponse|null} [HostMetrics] MysqlHostMetricsResponse HostMetrics */ /** - * Constructs a new ExecuteFetchAsAppResponse. + * Constructs a new MysqlHostMetricsResponse. * @memberof tabletmanagerdata - * @classdesc Represents an ExecuteFetchAsAppResponse. - * @implements IExecuteFetchAsAppResponse + * @classdesc Represents a MysqlHostMetricsResponse. + * @implements IMysqlHostMetricsResponse * @constructor - * @param {tabletmanagerdata.IExecuteFetchAsAppResponse=} [properties] Properties to set + * @param {tabletmanagerdata.IMysqlHostMetricsResponse=} [properties] Properties to set */ - function ExecuteFetchAsAppResponse(properties) { + function MysqlHostMetricsResponse(properties) { if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -52824,75 +60209,75 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } /** - * ExecuteFetchAsAppResponse result. - * @member {query.IQueryResult|null|undefined} result - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * MysqlHostMetricsResponse HostMetrics. + * @member {mysqlctl.IHostMetricsResponse|null|undefined} HostMetrics + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @instance */ - ExecuteFetchAsAppResponse.prototype.result = null; + MysqlHostMetricsResponse.prototype.HostMetrics = null; /** - * Creates a new ExecuteFetchAsAppResponse instance using the specified properties. + * Creates a new MysqlHostMetricsResponse instance using the specified properties. * @function create - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @static - * @param {tabletmanagerdata.IExecuteFetchAsAppResponse=} [properties] Properties to set - * @returns {tabletmanagerdata.ExecuteFetchAsAppResponse} ExecuteFetchAsAppResponse instance + * @param {tabletmanagerdata.IMysqlHostMetricsResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.MysqlHostMetricsResponse} MysqlHostMetricsResponse instance */ - ExecuteFetchAsAppResponse.create = function create(properties) { - return new ExecuteFetchAsAppResponse(properties); + MysqlHostMetricsResponse.create = function create(properties) { + return new MysqlHostMetricsResponse(properties); }; /** - * Encodes the specified ExecuteFetchAsAppResponse message. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAppResponse.verify|verify} messages. + * Encodes the specified MysqlHostMetricsResponse message. Does not implicitly {@link tabletmanagerdata.MysqlHostMetricsResponse.verify|verify} messages. * @function encode - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @static - * @param {tabletmanagerdata.IExecuteFetchAsAppResponse} message ExecuteFetchAsAppResponse message or plain object to encode + * @param {tabletmanagerdata.IMysqlHostMetricsResponse} message MysqlHostMetricsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsAppResponse.encode = function encode(message, writer) { + MysqlHostMetricsResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.result != null && Object.hasOwnProperty.call(message, "result")) - $root.query.QueryResult.encode(message.result, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.HostMetrics != null && Object.hasOwnProperty.call(message, "HostMetrics")) + $root.mysqlctl.HostMetricsResponse.encode(message.HostMetrics, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified ExecuteFetchAsAppResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ExecuteFetchAsAppResponse.verify|verify} messages. + * Encodes the specified MysqlHostMetricsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.MysqlHostMetricsResponse.verify|verify} messages. * @function encodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @static - * @param {tabletmanagerdata.IExecuteFetchAsAppResponse} message ExecuteFetchAsAppResponse message or plain object to encode + * @param {tabletmanagerdata.IMysqlHostMetricsResponse} message MysqlHostMetricsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - ExecuteFetchAsAppResponse.encodeDelimited = function encodeDelimited(message, writer) { + MysqlHostMetricsResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an ExecuteFetchAsAppResponse message from the specified reader or buffer. + * Decodes a MysqlHostMetricsResponse message from the specified reader or buffer. * @function decode - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {tabletmanagerdata.ExecuteFetchAsAppResponse} ExecuteFetchAsAppResponse + * @returns {tabletmanagerdata.MysqlHostMetricsResponse} MysqlHostMetricsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsAppResponse.decode = function decode(reader, length) { + MysqlHostMetricsResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ExecuteFetchAsAppResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.MysqlHostMetricsResponse(); while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { case 1: { - message.result = $root.query.QueryResult.decode(reader, reader.uint32()); + message.HostMetrics = $root.mysqlctl.HostMetricsResponse.decode(reader, reader.uint32()); break; } default: @@ -52904,107 +60289,107 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { }; /** - * Decodes an ExecuteFetchAsAppResponse message from the specified reader or buffer, length delimited. + * Decodes a MysqlHostMetricsResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {tabletmanagerdata.ExecuteFetchAsAppResponse} ExecuteFetchAsAppResponse + * @returns {tabletmanagerdata.MysqlHostMetricsResponse} MysqlHostMetricsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - ExecuteFetchAsAppResponse.decodeDelimited = function decodeDelimited(reader) { + MysqlHostMetricsResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an ExecuteFetchAsAppResponse message. + * Verifies a MysqlHostMetricsResponse message. * @function verify - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - ExecuteFetchAsAppResponse.verify = function verify(message) { + MysqlHostMetricsResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.result != null && message.hasOwnProperty("result")) { - let error = $root.query.QueryResult.verify(message.result); + if (message.HostMetrics != null && message.hasOwnProperty("HostMetrics")) { + let error = $root.mysqlctl.HostMetricsResponse.verify(message.HostMetrics); if (error) - return "result." + error; + return "HostMetrics." + error; } return null; }; /** - * Creates an ExecuteFetchAsAppResponse message from a plain object. Also converts values to their respective internal types. + * Creates a MysqlHostMetricsResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @static * @param {Object.} object Plain object - * @returns {tabletmanagerdata.ExecuteFetchAsAppResponse} ExecuteFetchAsAppResponse + * @returns {tabletmanagerdata.MysqlHostMetricsResponse} MysqlHostMetricsResponse */ - ExecuteFetchAsAppResponse.fromObject = function fromObject(object) { - if (object instanceof $root.tabletmanagerdata.ExecuteFetchAsAppResponse) + MysqlHostMetricsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.MysqlHostMetricsResponse) return object; - let message = new $root.tabletmanagerdata.ExecuteFetchAsAppResponse(); - if (object.result != null) { - if (typeof object.result !== "object") - throw TypeError(".tabletmanagerdata.ExecuteFetchAsAppResponse.result: object expected"); - message.result = $root.query.QueryResult.fromObject(object.result); + let message = new $root.tabletmanagerdata.MysqlHostMetricsResponse(); + if (object.HostMetrics != null) { + if (typeof object.HostMetrics !== "object") + throw TypeError(".tabletmanagerdata.MysqlHostMetricsResponse.HostMetrics: object expected"); + message.HostMetrics = $root.mysqlctl.HostMetricsResponse.fromObject(object.HostMetrics); } return message; }; /** - * Creates a plain object from an ExecuteFetchAsAppResponse message. Also converts values to other types if specified. + * Creates a plain object from a MysqlHostMetricsResponse message. Also converts values to other types if specified. * @function toObject - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @static - * @param {tabletmanagerdata.ExecuteFetchAsAppResponse} message ExecuteFetchAsAppResponse + * @param {tabletmanagerdata.MysqlHostMetricsResponse} message MysqlHostMetricsResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - ExecuteFetchAsAppResponse.toObject = function toObject(message, options) { + MysqlHostMetricsResponse.toObject = function toObject(message, options) { if (!options) options = {}; let object = {}; if (options.defaults) - object.result = null; - if (message.result != null && message.hasOwnProperty("result")) - object.result = $root.query.QueryResult.toObject(message.result, options); + object.HostMetrics = null; + if (message.HostMetrics != null && message.hasOwnProperty("HostMetrics")) + object.HostMetrics = $root.mysqlctl.HostMetricsResponse.toObject(message.HostMetrics, options); return object; }; /** - * Converts this ExecuteFetchAsAppResponse to JSON. + * Converts this MysqlHostMetricsResponse to JSON. * @function toJSON - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @instance * @returns {Object.} JSON object */ - ExecuteFetchAsAppResponse.prototype.toJSON = function toJSON() { + MysqlHostMetricsResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; /** - * Gets the default type url for ExecuteFetchAsAppResponse + * Gets the default type url for MysqlHostMetricsResponse * @function getTypeUrl - * @memberof tabletmanagerdata.ExecuteFetchAsAppResponse + * @memberof tabletmanagerdata.MysqlHostMetricsResponse * @static * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") * @returns {string} The default type url */ - ExecuteFetchAsAppResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + MysqlHostMetricsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { if (typeUrlPrefix === undefined) { typeUrlPrefix = "type.googleapis.com"; } - return typeUrlPrefix + "/tabletmanagerdata.ExecuteFetchAsAppResponse"; + return typeUrlPrefix + "/tabletmanagerdata.MysqlHostMetricsResponse"; }; - return ExecuteFetchAsAppResponse; + return MysqlHostMetricsResponse; })(); tabletmanagerdata.ReplicationStatusRequest = (function() { @@ -58547,6 +65932,384 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { return PopulateReparentJournalResponse; })(); + tabletmanagerdata.ReadReparentJournalInfoRequest = (function() { + + /** + * Properties of a ReadReparentJournalInfoRequest. + * @memberof tabletmanagerdata + * @interface IReadReparentJournalInfoRequest + */ + + /** + * Constructs a new ReadReparentJournalInfoRequest. + * @memberof tabletmanagerdata + * @classdesc Represents a ReadReparentJournalInfoRequest. + * @implements IReadReparentJournalInfoRequest + * @constructor + * @param {tabletmanagerdata.IReadReparentJournalInfoRequest=} [properties] Properties to set + */ + function ReadReparentJournalInfoRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new ReadReparentJournalInfoRequest instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @static + * @param {tabletmanagerdata.IReadReparentJournalInfoRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ReadReparentJournalInfoRequest} ReadReparentJournalInfoRequest instance + */ + ReadReparentJournalInfoRequest.create = function create(properties) { + return new ReadReparentJournalInfoRequest(properties); + }; + + /** + * Encodes the specified ReadReparentJournalInfoRequest message. Does not implicitly {@link tabletmanagerdata.ReadReparentJournalInfoRequest.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @static + * @param {tabletmanagerdata.IReadReparentJournalInfoRequest} message ReadReparentJournalInfoRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ReadReparentJournalInfoRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified ReadReparentJournalInfoRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ReadReparentJournalInfoRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @static + * @param {tabletmanagerdata.IReadReparentJournalInfoRequest} message ReadReparentJournalInfoRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ReadReparentJournalInfoRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ReadReparentJournalInfoRequest message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ReadReparentJournalInfoRequest} ReadReparentJournalInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ReadReparentJournalInfoRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ReadReparentJournalInfoRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ReadReparentJournalInfoRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ReadReparentJournalInfoRequest} ReadReparentJournalInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ReadReparentJournalInfoRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ReadReparentJournalInfoRequest message. + * @function verify + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ReadReparentJournalInfoRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a ReadReparentJournalInfoRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ReadReparentJournalInfoRequest} ReadReparentJournalInfoRequest + */ + ReadReparentJournalInfoRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ReadReparentJournalInfoRequest) + return object; + return new $root.tabletmanagerdata.ReadReparentJournalInfoRequest(); + }; + + /** + * Creates a plain object from a ReadReparentJournalInfoRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @static + * @param {tabletmanagerdata.ReadReparentJournalInfoRequest} message ReadReparentJournalInfoRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ReadReparentJournalInfoRequest.toObject = function toObject() { + return {}; + }; + + /** + * Converts this ReadReparentJournalInfoRequest to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @instance + * @returns {Object.} JSON object + */ + ReadReparentJournalInfoRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ReadReparentJournalInfoRequest + * @function getTypeUrl + * @memberof tabletmanagerdata.ReadReparentJournalInfoRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ReadReparentJournalInfoRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ReadReparentJournalInfoRequest"; + }; + + return ReadReparentJournalInfoRequest; + })(); + + tabletmanagerdata.ReadReparentJournalInfoResponse = (function() { + + /** + * Properties of a ReadReparentJournalInfoResponse. + * @memberof tabletmanagerdata + * @interface IReadReparentJournalInfoResponse + * @property {number|null} [length] ReadReparentJournalInfoResponse length + */ + + /** + * Constructs a new ReadReparentJournalInfoResponse. + * @memberof tabletmanagerdata + * @classdesc Represents a ReadReparentJournalInfoResponse. + * @implements IReadReparentJournalInfoResponse + * @constructor + * @param {tabletmanagerdata.IReadReparentJournalInfoResponse=} [properties] Properties to set + */ + function ReadReparentJournalInfoResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ReadReparentJournalInfoResponse length. + * @member {number} length + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @instance + */ + ReadReparentJournalInfoResponse.prototype.length = 0; + + /** + * Creates a new ReadReparentJournalInfoResponse instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @static + * @param {tabletmanagerdata.IReadReparentJournalInfoResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ReadReparentJournalInfoResponse} ReadReparentJournalInfoResponse instance + */ + ReadReparentJournalInfoResponse.create = function create(properties) { + return new ReadReparentJournalInfoResponse(properties); + }; + + /** + * Encodes the specified ReadReparentJournalInfoResponse message. Does not implicitly {@link tabletmanagerdata.ReadReparentJournalInfoResponse.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @static + * @param {tabletmanagerdata.IReadReparentJournalInfoResponse} message ReadReparentJournalInfoResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ReadReparentJournalInfoResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.length != null && Object.hasOwnProperty.call(message, "length")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.length); + return writer; + }; + + /** + * Encodes the specified ReadReparentJournalInfoResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ReadReparentJournalInfoResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @static + * @param {tabletmanagerdata.IReadReparentJournalInfoResponse} message ReadReparentJournalInfoResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ReadReparentJournalInfoResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ReadReparentJournalInfoResponse message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ReadReparentJournalInfoResponse} ReadReparentJournalInfoResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ReadReparentJournalInfoResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ReadReparentJournalInfoResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.length = reader.int32(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ReadReparentJournalInfoResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ReadReparentJournalInfoResponse} ReadReparentJournalInfoResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ReadReparentJournalInfoResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ReadReparentJournalInfoResponse message. + * @function verify + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ReadReparentJournalInfoResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.length != null && message.hasOwnProperty("length")) + if (!$util.isInteger(message.length)) + return "length: integer expected"; + return null; + }; + + /** + * Creates a ReadReparentJournalInfoResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ReadReparentJournalInfoResponse} ReadReparentJournalInfoResponse + */ + ReadReparentJournalInfoResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ReadReparentJournalInfoResponse) + return object; + let message = new $root.tabletmanagerdata.ReadReparentJournalInfoResponse(); + if (object.length != null) + message.length = object.length | 0; + return message; + }; + + /** + * Creates a plain object from a ReadReparentJournalInfoResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @static + * @param {tabletmanagerdata.ReadReparentJournalInfoResponse} message ReadReparentJournalInfoResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ReadReparentJournalInfoResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.length = 0; + if (message.length != null && message.hasOwnProperty("length")) + object.length = message.length; + return object; + }; + + /** + * Converts this ReadReparentJournalInfoResponse to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @instance + * @returns {Object.} JSON object + */ + ReadReparentJournalInfoResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ReadReparentJournalInfoResponse + * @function getTypeUrl + * @memberof tabletmanagerdata.ReadReparentJournalInfoResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ReadReparentJournalInfoResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ReadReparentJournalInfoResponse"; + }; + + return ReadReparentJournalInfoResponse; + })(); + tabletmanagerdata.InitReplicaRequest = (function() { /** @@ -62600,6 +70363,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {boolean|null} [allow_primary] BackupRequest allow_primary * @property {string|null} [incremental_from_pos] BackupRequest incremental_from_pos * @property {boolean|null} [upgrade_safe] BackupRequest upgrade_safe + * @property {string|null} [backup_engine] BackupRequest backup_engine */ /** @@ -62649,6 +70413,28 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ BackupRequest.prototype.upgrade_safe = false; + /** + * BackupRequest backup_engine. + * @member {string|null|undefined} backup_engine + * @memberof tabletmanagerdata.BackupRequest + * @instance + */ + BackupRequest.prototype.backup_engine = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * BackupRequest _backup_engine. + * @member {"backup_engine"|undefined} _backup_engine + * @memberof tabletmanagerdata.BackupRequest + * @instance + */ + Object.defineProperty(BackupRequest.prototype, "_backup_engine", { + get: $util.oneOfGetter($oneOfFields = ["backup_engine"]), + set: $util.oneOfSetter($oneOfFields) + }); + /** * Creates a new BackupRequest instance using the specified properties. * @function create @@ -62681,6 +70467,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { writer.uint32(/* id 3, wireType 2 =*/26).string(message.incremental_from_pos); if (message.upgrade_safe != null && Object.hasOwnProperty.call(message, "upgrade_safe")) writer.uint32(/* id 4, wireType 0 =*/32).bool(message.upgrade_safe); + if (message.backup_engine != null && Object.hasOwnProperty.call(message, "backup_engine")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.backup_engine); return writer; }; @@ -62731,6 +70519,10 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.upgrade_safe = reader.bool(); break; } + case 5: { + message.backup_engine = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -62766,6 +70558,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { BackupRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + let properties = {}; if (message.concurrency != null && message.hasOwnProperty("concurrency")) if (!$util.isInteger(message.concurrency)) return "concurrency: integer expected"; @@ -62778,6 +70571,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (message.upgrade_safe != null && message.hasOwnProperty("upgrade_safe")) if (typeof message.upgrade_safe !== "boolean") return "upgrade_safe: boolean expected"; + if (message.backup_engine != null && message.hasOwnProperty("backup_engine")) { + properties._backup_engine = 1; + if (!$util.isString(message.backup_engine)) + return "backup_engine: string expected"; + } return null; }; @@ -62801,6 +70599,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.incremental_from_pos = String(object.incremental_from_pos); if (object.upgrade_safe != null) message.upgrade_safe = Boolean(object.upgrade_safe); + if (object.backup_engine != null) + message.backup_engine = String(object.backup_engine); return message; }; @@ -62831,6 +70631,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.incremental_from_pos = message.incremental_from_pos; if (message.upgrade_safe != null && message.hasOwnProperty("upgrade_safe")) object.upgrade_safe = message.upgrade_safe; + if (message.backup_engine != null && message.hasOwnProperty("backup_engine")) { + object.backup_engine = message.backup_engine; + if (options.oneofs) + object._backup_engine = "backup_engine"; + } return object; }; @@ -63081,6 +70886,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {string|null} [restore_to_pos] RestoreFromBackupRequest restore_to_pos * @property {boolean|null} [dry_run] RestoreFromBackupRequest dry_run * @property {vttime.ITime|null} [restore_to_timestamp] RestoreFromBackupRequest restore_to_timestamp + * @property {Array.|null} [allowed_backup_engines] RestoreFromBackupRequest allowed_backup_engines */ /** @@ -63092,6 +70898,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @param {tabletmanagerdata.IRestoreFromBackupRequest=} [properties] Properties to set */ function RestoreFromBackupRequest(properties) { + this.allowed_backup_engines = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -63130,6 +70937,14 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ RestoreFromBackupRequest.prototype.restore_to_timestamp = null; + /** + * RestoreFromBackupRequest allowed_backup_engines. + * @member {Array.} allowed_backup_engines + * @memberof tabletmanagerdata.RestoreFromBackupRequest + * @instance + */ + RestoreFromBackupRequest.prototype.allowed_backup_engines = $util.emptyArray; + /** * Creates a new RestoreFromBackupRequest instance using the specified properties. * @function create @@ -63162,6 +70977,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { writer.uint32(/* id 3, wireType 0 =*/24).bool(message.dry_run); if (message.restore_to_timestamp != null && Object.hasOwnProperty.call(message, "restore_to_timestamp")) $root.vttime.Time.encode(message.restore_to_timestamp, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.allowed_backup_engines != null && message.allowed_backup_engines.length) + for (let i = 0; i < message.allowed_backup_engines.length; ++i) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.allowed_backup_engines[i]); return writer; }; @@ -63212,6 +71030,12 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.restore_to_timestamp = $root.vttime.Time.decode(reader, reader.uint32()); break; } + case 5: { + if (!(message.allowed_backup_engines && message.allowed_backup_engines.length)) + message.allowed_backup_engines = []; + message.allowed_backup_engines.push(reader.string()); + break; + } default: reader.skipType(tag & 7); break; @@ -63263,6 +71087,13 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (error) return "restore_to_timestamp." + error; } + if (message.allowed_backup_engines != null && message.hasOwnProperty("allowed_backup_engines")) { + if (!Array.isArray(message.allowed_backup_engines)) + return "allowed_backup_engines: array expected"; + for (let i = 0; i < message.allowed_backup_engines.length; ++i) + if (!$util.isString(message.allowed_backup_engines[i])) + return "allowed_backup_engines: string[] expected"; + } return null; }; @@ -63292,6 +71123,13 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { throw TypeError(".tabletmanagerdata.RestoreFromBackupRequest.restore_to_timestamp: object expected"); message.restore_to_timestamp = $root.vttime.Time.fromObject(object.restore_to_timestamp); } + if (object.allowed_backup_engines) { + if (!Array.isArray(object.allowed_backup_engines)) + throw TypeError(".tabletmanagerdata.RestoreFromBackupRequest.allowed_backup_engines: array expected"); + message.allowed_backup_engines = []; + for (let i = 0; i < object.allowed_backup_engines.length; ++i) + message.allowed_backup_engines[i] = String(object.allowed_backup_engines[i]); + } return message; }; @@ -63308,6 +71146,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (!options) options = {}; let object = {}; + if (options.arrays || options.defaults) + object.allowed_backup_engines = []; if (options.defaults) { object.backup_time = null; object.restore_to_pos = ""; @@ -63322,6 +71162,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.dry_run = message.dry_run; if (message.restore_to_timestamp != null && message.hasOwnProperty("restore_to_timestamp")) object.restore_to_timestamp = $root.vttime.Time.toObject(message.restore_to_timestamp, options); + if (message.allowed_backup_engines && message.allowed_backup_engines.length) { + object.allowed_backup_engines = []; + for (let j = 0; j < message.allowed_backup_engines.length; ++j) + object.allowed_backup_engines[j] = message.allowed_backup_engines[j]; + } return object; }; @@ -64418,6 +72263,457 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { return CreateVReplicationWorkflowResponse; })(); + tabletmanagerdata.DeleteTableDataRequest = (function() { + + /** + * Properties of a DeleteTableDataRequest. + * @memberof tabletmanagerdata + * @interface IDeleteTableDataRequest + * @property {Object.|null} [table_filters] DeleteTableDataRequest table_filters + * @property {number|Long|null} [batch_size] DeleteTableDataRequest batch_size + */ + + /** + * Constructs a new DeleteTableDataRequest. + * @memberof tabletmanagerdata + * @classdesc Represents a DeleteTableDataRequest. + * @implements IDeleteTableDataRequest + * @constructor + * @param {tabletmanagerdata.IDeleteTableDataRequest=} [properties] Properties to set + */ + function DeleteTableDataRequest(properties) { + this.table_filters = {}; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DeleteTableDataRequest table_filters. + * @member {Object.} table_filters + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @instance + */ + DeleteTableDataRequest.prototype.table_filters = $util.emptyObject; + + /** + * DeleteTableDataRequest batch_size. + * @member {number|Long} batch_size + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @instance + */ + DeleteTableDataRequest.prototype.batch_size = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new DeleteTableDataRequest instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @static + * @param {tabletmanagerdata.IDeleteTableDataRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.DeleteTableDataRequest} DeleteTableDataRequest instance + */ + DeleteTableDataRequest.create = function create(properties) { + return new DeleteTableDataRequest(properties); + }; + + /** + * Encodes the specified DeleteTableDataRequest message. Does not implicitly {@link tabletmanagerdata.DeleteTableDataRequest.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @static + * @param {tabletmanagerdata.IDeleteTableDataRequest} message DeleteTableDataRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeleteTableDataRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.table_filters != null && Object.hasOwnProperty.call(message, "table_filters")) + for (let keys = Object.keys(message.table_filters), i = 0; i < keys.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.table_filters[keys[i]]).ldelim(); + if (message.batch_size != null && Object.hasOwnProperty.call(message, "batch_size")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.batch_size); + return writer; + }; + + /** + * Encodes the specified DeleteTableDataRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.DeleteTableDataRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @static + * @param {tabletmanagerdata.IDeleteTableDataRequest} message DeleteTableDataRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeleteTableDataRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DeleteTableDataRequest message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.DeleteTableDataRequest} DeleteTableDataRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeleteTableDataRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.DeleteTableDataRequest(), key, value; + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (message.table_filters === $util.emptyObject) + message.table_filters = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.table_filters[key] = value; + break; + } + case 2: { + message.batch_size = reader.int64(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DeleteTableDataRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.DeleteTableDataRequest} DeleteTableDataRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeleteTableDataRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DeleteTableDataRequest message. + * @function verify + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DeleteTableDataRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.table_filters != null && message.hasOwnProperty("table_filters")) { + if (!$util.isObject(message.table_filters)) + return "table_filters: object expected"; + let key = Object.keys(message.table_filters); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.table_filters[key[i]])) + return "table_filters: string{k:string} expected"; + } + if (message.batch_size != null && message.hasOwnProperty("batch_size")) + if (!$util.isInteger(message.batch_size) && !(message.batch_size && $util.isInteger(message.batch_size.low) && $util.isInteger(message.batch_size.high))) + return "batch_size: integer|Long expected"; + return null; + }; + + /** + * Creates a DeleteTableDataRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.DeleteTableDataRequest} DeleteTableDataRequest + */ + DeleteTableDataRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.DeleteTableDataRequest) + return object; + let message = new $root.tabletmanagerdata.DeleteTableDataRequest(); + if (object.table_filters) { + if (typeof object.table_filters !== "object") + throw TypeError(".tabletmanagerdata.DeleteTableDataRequest.table_filters: object expected"); + message.table_filters = {}; + for (let keys = Object.keys(object.table_filters), i = 0; i < keys.length; ++i) + message.table_filters[keys[i]] = String(object.table_filters[keys[i]]); + } + if (object.batch_size != null) + if ($util.Long) + (message.batch_size = $util.Long.fromValue(object.batch_size)).unsigned = false; + else if (typeof object.batch_size === "string") + message.batch_size = parseInt(object.batch_size, 10); + else if (typeof object.batch_size === "number") + message.batch_size = object.batch_size; + else if (typeof object.batch_size === "object") + message.batch_size = new $util.LongBits(object.batch_size.low >>> 0, object.batch_size.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a DeleteTableDataRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @static + * @param {tabletmanagerdata.DeleteTableDataRequest} message DeleteTableDataRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DeleteTableDataRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.objects || options.defaults) + object.table_filters = {}; + if (options.defaults) + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.batch_size = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.batch_size = options.longs === String ? "0" : 0; + let keys2; + if (message.table_filters && (keys2 = Object.keys(message.table_filters)).length) { + object.table_filters = {}; + for (let j = 0; j < keys2.length; ++j) + object.table_filters[keys2[j]] = message.table_filters[keys2[j]]; + } + if (message.batch_size != null && message.hasOwnProperty("batch_size")) + if (typeof message.batch_size === "number") + object.batch_size = options.longs === String ? String(message.batch_size) : message.batch_size; + else + object.batch_size = options.longs === String ? $util.Long.prototype.toString.call(message.batch_size) : options.longs === Number ? new $util.LongBits(message.batch_size.low >>> 0, message.batch_size.high >>> 0).toNumber() : message.batch_size; + return object; + }; + + /** + * Converts this DeleteTableDataRequest to JSON. + * @function toJSON + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @instance + * @returns {Object.} JSON object + */ + DeleteTableDataRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for DeleteTableDataRequest + * @function getTypeUrl + * @memberof tabletmanagerdata.DeleteTableDataRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + DeleteTableDataRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.DeleteTableDataRequest"; + }; + + return DeleteTableDataRequest; + })(); + + tabletmanagerdata.DeleteTableDataResponse = (function() { + + /** + * Properties of a DeleteTableDataResponse. + * @memberof tabletmanagerdata + * @interface IDeleteTableDataResponse + */ + + /** + * Constructs a new DeleteTableDataResponse. + * @memberof tabletmanagerdata + * @classdesc Represents a DeleteTableDataResponse. + * @implements IDeleteTableDataResponse + * @constructor + * @param {tabletmanagerdata.IDeleteTableDataResponse=} [properties] Properties to set + */ + function DeleteTableDataResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new DeleteTableDataResponse instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @static + * @param {tabletmanagerdata.IDeleteTableDataResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.DeleteTableDataResponse} DeleteTableDataResponse instance + */ + DeleteTableDataResponse.create = function create(properties) { + return new DeleteTableDataResponse(properties); + }; + + /** + * Encodes the specified DeleteTableDataResponse message. Does not implicitly {@link tabletmanagerdata.DeleteTableDataResponse.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @static + * @param {tabletmanagerdata.IDeleteTableDataResponse} message DeleteTableDataResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeleteTableDataResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified DeleteTableDataResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.DeleteTableDataResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @static + * @param {tabletmanagerdata.IDeleteTableDataResponse} message DeleteTableDataResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeleteTableDataResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DeleteTableDataResponse message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.DeleteTableDataResponse} DeleteTableDataResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeleteTableDataResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.DeleteTableDataResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DeleteTableDataResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.DeleteTableDataResponse} DeleteTableDataResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeleteTableDataResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DeleteTableDataResponse message. + * @function verify + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DeleteTableDataResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a DeleteTableDataResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.DeleteTableDataResponse} DeleteTableDataResponse + */ + DeleteTableDataResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.DeleteTableDataResponse) + return object; + return new $root.tabletmanagerdata.DeleteTableDataResponse(); + }; + + /** + * Creates a plain object from a DeleteTableDataResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @static + * @param {tabletmanagerdata.DeleteTableDataResponse} message DeleteTableDataResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DeleteTableDataResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this DeleteTableDataResponse to JSON. + * @function toJSON + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @instance + * @returns {Object.} JSON object + */ + DeleteTableDataResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for DeleteTableDataResponse + * @function getTypeUrl + * @memberof tabletmanagerdata.DeleteTableDataResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + DeleteTableDataResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.DeleteTableDataResponse"; + }; + + return DeleteTableDataResponse; + })(); + tabletmanagerdata.DeleteVReplicationWorkflowRequest = (function() { /** @@ -66163,6 +74459,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {boolean|null} [defer_secondary_keys] ReadVReplicationWorkflowResponse defer_secondary_keys * @property {Array.|null} [streams] ReadVReplicationWorkflowResponse streams * @property {string|null} [options] ReadVReplicationWorkflowResponse options + * @property {Object.|null} [config_overrides] ReadVReplicationWorkflowResponse config_overrides */ /** @@ -66176,6 +74473,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { function ReadVReplicationWorkflowResponse(properties) { this.tablet_types = []; this.streams = []; + this.config_overrides = {}; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -66270,6 +74568,14 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ ReadVReplicationWorkflowResponse.prototype.options = ""; + /** + * ReadVReplicationWorkflowResponse config_overrides. + * @member {Object.} config_overrides + * @memberof tabletmanagerdata.ReadVReplicationWorkflowResponse + * @instance + */ + ReadVReplicationWorkflowResponse.prototype.config_overrides = $util.emptyObject; + /** * Creates a new ReadVReplicationWorkflowResponse instance using the specified properties. * @function create @@ -66321,6 +74627,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { $root.tabletmanagerdata.ReadVReplicationWorkflowResponse.Stream.encode(message.streams[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); if (message.options != null && Object.hasOwnProperty.call(message, "options")) writer.uint32(/* id 12, wireType 2 =*/98).string(message.options); + if (message.config_overrides != null && Object.hasOwnProperty.call(message, "config_overrides")) + for (let keys = Object.keys(message.config_overrides), i = 0; i < keys.length; ++i) + writer.uint32(/* id 13, wireType 2 =*/106).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.config_overrides[keys[i]]).ldelim(); return writer; }; @@ -66351,7 +74660,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { ReadVReplicationWorkflowResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ReadVReplicationWorkflowResponse(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ReadVReplicationWorkflowResponse(), key, value; while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { @@ -66408,6 +74717,29 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.options = reader.string(); break; } + case 13: { + if (message.config_overrides === $util.emptyObject) + message.config_overrides = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.config_overrides[key] = value; + break; + } default: reader.skipType(tag & 7); break; @@ -66521,6 +74853,14 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (message.options != null && message.hasOwnProperty("options")) if (!$util.isString(message.options)) return "options: string expected"; + if (message.config_overrides != null && message.hasOwnProperty("config_overrides")) { + if (!$util.isObject(message.config_overrides)) + return "config_overrides: object expected"; + let key = Object.keys(message.config_overrides); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.config_overrides[key[i]])) + return "config_overrides: string{k:string} expected"; + } return null; }; @@ -66687,6 +75027,13 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } if (object.options != null) message.options = String(object.options); + if (object.config_overrides) { + if (typeof object.config_overrides !== "object") + throw TypeError(".tabletmanagerdata.ReadVReplicationWorkflowResponse.config_overrides: object expected"); + message.config_overrides = {}; + for (let keys = Object.keys(object.config_overrides), i = 0; i < keys.length; ++i) + message.config_overrides[keys[i]] = String(object.config_overrides[keys[i]]); + } return message; }; @@ -66707,6 +75054,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.tablet_types = []; object.streams = []; } + if (options.objects || options.defaults) + object.config_overrides = {}; if (options.defaults) { object.workflow = ""; object.cells = ""; @@ -66746,6 +75095,12 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } if (message.options != null && message.hasOwnProperty("options")) object.options = message.options; + let keys2; + if (message.config_overrides && (keys2 = Object.keys(message.config_overrides)).length) { + object.config_overrides = {}; + for (let j = 0; j < keys2.length; ++j) + object.config_overrides[keys2[j]] = message.config_overrides[keys2[j]]; + } return object; }; @@ -67392,6 +75747,408 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { return ReadVReplicationWorkflowResponse; })(); + tabletmanagerdata.ValidateVReplicationPermissionsRequest = (function() { + + /** + * Properties of a ValidateVReplicationPermissionsRequest. + * @memberof tabletmanagerdata + * @interface IValidateVReplicationPermissionsRequest + */ + + /** + * Constructs a new ValidateVReplicationPermissionsRequest. + * @memberof tabletmanagerdata + * @classdesc Represents a ValidateVReplicationPermissionsRequest. + * @implements IValidateVReplicationPermissionsRequest + * @constructor + * @param {tabletmanagerdata.IValidateVReplicationPermissionsRequest=} [properties] Properties to set + */ + function ValidateVReplicationPermissionsRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new ValidateVReplicationPermissionsRequest instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @static + * @param {tabletmanagerdata.IValidateVReplicationPermissionsRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ValidateVReplicationPermissionsRequest} ValidateVReplicationPermissionsRequest instance + */ + ValidateVReplicationPermissionsRequest.create = function create(properties) { + return new ValidateVReplicationPermissionsRequest(properties); + }; + + /** + * Encodes the specified ValidateVReplicationPermissionsRequest message. Does not implicitly {@link tabletmanagerdata.ValidateVReplicationPermissionsRequest.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @static + * @param {tabletmanagerdata.IValidateVReplicationPermissionsRequest} message ValidateVReplicationPermissionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidateVReplicationPermissionsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified ValidateVReplicationPermissionsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ValidateVReplicationPermissionsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @static + * @param {tabletmanagerdata.IValidateVReplicationPermissionsRequest} message ValidateVReplicationPermissionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidateVReplicationPermissionsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ValidateVReplicationPermissionsRequest message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ValidateVReplicationPermissionsRequest} ValidateVReplicationPermissionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidateVReplicationPermissionsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ValidateVReplicationPermissionsRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ValidateVReplicationPermissionsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ValidateVReplicationPermissionsRequest} ValidateVReplicationPermissionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidateVReplicationPermissionsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ValidateVReplicationPermissionsRequest message. + * @function verify + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ValidateVReplicationPermissionsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a ValidateVReplicationPermissionsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ValidateVReplicationPermissionsRequest} ValidateVReplicationPermissionsRequest + */ + ValidateVReplicationPermissionsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ValidateVReplicationPermissionsRequest) + return object; + return new $root.tabletmanagerdata.ValidateVReplicationPermissionsRequest(); + }; + + /** + * Creates a plain object from a ValidateVReplicationPermissionsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @static + * @param {tabletmanagerdata.ValidateVReplicationPermissionsRequest} message ValidateVReplicationPermissionsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ValidateVReplicationPermissionsRequest.toObject = function toObject() { + return {}; + }; + + /** + * Converts this ValidateVReplicationPermissionsRequest to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @instance + * @returns {Object.} JSON object + */ + ValidateVReplicationPermissionsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ValidateVReplicationPermissionsRequest + * @function getTypeUrl + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ValidateVReplicationPermissionsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ValidateVReplicationPermissionsRequest"; + }; + + return ValidateVReplicationPermissionsRequest; + })(); + + tabletmanagerdata.ValidateVReplicationPermissionsResponse = (function() { + + /** + * Properties of a ValidateVReplicationPermissionsResponse. + * @memberof tabletmanagerdata + * @interface IValidateVReplicationPermissionsResponse + * @property {string|null} [user] ValidateVReplicationPermissionsResponse user + * @property {boolean|null} [ok] ValidateVReplicationPermissionsResponse ok + */ + + /** + * Constructs a new ValidateVReplicationPermissionsResponse. + * @memberof tabletmanagerdata + * @classdesc Represents a ValidateVReplicationPermissionsResponse. + * @implements IValidateVReplicationPermissionsResponse + * @constructor + * @param {tabletmanagerdata.IValidateVReplicationPermissionsResponse=} [properties] Properties to set + */ + function ValidateVReplicationPermissionsResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ValidateVReplicationPermissionsResponse user. + * @member {string} user + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @instance + */ + ValidateVReplicationPermissionsResponse.prototype.user = ""; + + /** + * ValidateVReplicationPermissionsResponse ok. + * @member {boolean} ok + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @instance + */ + ValidateVReplicationPermissionsResponse.prototype.ok = false; + + /** + * Creates a new ValidateVReplicationPermissionsResponse instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @static + * @param {tabletmanagerdata.IValidateVReplicationPermissionsResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ValidateVReplicationPermissionsResponse} ValidateVReplicationPermissionsResponse instance + */ + ValidateVReplicationPermissionsResponse.create = function create(properties) { + return new ValidateVReplicationPermissionsResponse(properties); + }; + + /** + * Encodes the specified ValidateVReplicationPermissionsResponse message. Does not implicitly {@link tabletmanagerdata.ValidateVReplicationPermissionsResponse.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @static + * @param {tabletmanagerdata.IValidateVReplicationPermissionsResponse} message ValidateVReplicationPermissionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidateVReplicationPermissionsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.user != null && Object.hasOwnProperty.call(message, "user")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.user); + if (message.ok != null && Object.hasOwnProperty.call(message, "ok")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.ok); + return writer; + }; + + /** + * Encodes the specified ValidateVReplicationPermissionsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ValidateVReplicationPermissionsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @static + * @param {tabletmanagerdata.IValidateVReplicationPermissionsResponse} message ValidateVReplicationPermissionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ValidateVReplicationPermissionsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ValidateVReplicationPermissionsResponse message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ValidateVReplicationPermissionsResponse} ValidateVReplicationPermissionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidateVReplicationPermissionsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ValidateVReplicationPermissionsResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.user = reader.string(); + break; + } + case 2: { + message.ok = reader.bool(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ValidateVReplicationPermissionsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ValidateVReplicationPermissionsResponse} ValidateVReplicationPermissionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ValidateVReplicationPermissionsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ValidateVReplicationPermissionsResponse message. + * @function verify + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ValidateVReplicationPermissionsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.user != null && message.hasOwnProperty("user")) + if (!$util.isString(message.user)) + return "user: string expected"; + if (message.ok != null && message.hasOwnProperty("ok")) + if (typeof message.ok !== "boolean") + return "ok: boolean expected"; + return null; + }; + + /** + * Creates a ValidateVReplicationPermissionsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ValidateVReplicationPermissionsResponse} ValidateVReplicationPermissionsResponse + */ + ValidateVReplicationPermissionsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ValidateVReplicationPermissionsResponse) + return object; + let message = new $root.tabletmanagerdata.ValidateVReplicationPermissionsResponse(); + if (object.user != null) + message.user = String(object.user); + if (object.ok != null) + message.ok = Boolean(object.ok); + return message; + }; + + /** + * Creates a plain object from a ValidateVReplicationPermissionsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @static + * @param {tabletmanagerdata.ValidateVReplicationPermissionsResponse} message ValidateVReplicationPermissionsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ValidateVReplicationPermissionsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.user = ""; + object.ok = false; + } + if (message.user != null && message.hasOwnProperty("user")) + object.user = message.user; + if (message.ok != null && message.hasOwnProperty("ok")) + object.ok = message.ok; + return object; + }; + + /** + * Converts this ValidateVReplicationPermissionsResponse to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @instance + * @returns {Object.} JSON object + */ + ValidateVReplicationPermissionsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ValidateVReplicationPermissionsResponse + * @function getTypeUrl + * @memberof tabletmanagerdata.ValidateVReplicationPermissionsResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ValidateVReplicationPermissionsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ValidateVReplicationPermissionsResponse"; + }; + + return ValidateVReplicationPermissionsResponse; + })(); + tabletmanagerdata.VDiffRequest = (function() { /** @@ -68245,6 +77002,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {boolean|null} [debug_query] VDiffReportOptions debug_query * @property {string|null} [format] VDiffReportOptions format * @property {number|Long|null} [max_sample_rows] VDiffReportOptions max_sample_rows + * @property {number|Long|null} [row_diff_column_truncate_at] VDiffReportOptions row_diff_column_truncate_at */ /** @@ -68294,6 +77052,14 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ VDiffReportOptions.prototype.max_sample_rows = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + /** + * VDiffReportOptions row_diff_column_truncate_at. + * @member {number|Long} row_diff_column_truncate_at + * @memberof tabletmanagerdata.VDiffReportOptions + * @instance + */ + VDiffReportOptions.prototype.row_diff_column_truncate_at = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + /** * Creates a new VDiffReportOptions instance using the specified properties. * @function create @@ -68326,6 +77092,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { writer.uint32(/* id 3, wireType 2 =*/26).string(message.format); if (message.max_sample_rows != null && Object.hasOwnProperty.call(message, "max_sample_rows")) writer.uint32(/* id 4, wireType 0 =*/32).int64(message.max_sample_rows); + if (message.row_diff_column_truncate_at != null && Object.hasOwnProperty.call(message, "row_diff_column_truncate_at")) + writer.uint32(/* id 5, wireType 0 =*/40).int64(message.row_diff_column_truncate_at); return writer; }; @@ -68376,6 +77144,10 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.max_sample_rows = reader.int64(); break; } + case 5: { + message.row_diff_column_truncate_at = reader.int64(); + break; + } default: reader.skipType(tag & 7); break; @@ -68423,6 +77195,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (message.max_sample_rows != null && message.hasOwnProperty("max_sample_rows")) if (!$util.isInteger(message.max_sample_rows) && !(message.max_sample_rows && $util.isInteger(message.max_sample_rows.low) && $util.isInteger(message.max_sample_rows.high))) return "max_sample_rows: integer|Long expected"; + if (message.row_diff_column_truncate_at != null && message.hasOwnProperty("row_diff_column_truncate_at")) + if (!$util.isInteger(message.row_diff_column_truncate_at) && !(message.row_diff_column_truncate_at && $util.isInteger(message.row_diff_column_truncate_at.low) && $util.isInteger(message.row_diff_column_truncate_at.high))) + return "row_diff_column_truncate_at: integer|Long expected"; return null; }; @@ -68453,6 +77228,15 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.max_sample_rows = object.max_sample_rows; else if (typeof object.max_sample_rows === "object") message.max_sample_rows = new $util.LongBits(object.max_sample_rows.low >>> 0, object.max_sample_rows.high >>> 0).toNumber(); + if (object.row_diff_column_truncate_at != null) + if ($util.Long) + (message.row_diff_column_truncate_at = $util.Long.fromValue(object.row_diff_column_truncate_at)).unsigned = false; + else if (typeof object.row_diff_column_truncate_at === "string") + message.row_diff_column_truncate_at = parseInt(object.row_diff_column_truncate_at, 10); + else if (typeof object.row_diff_column_truncate_at === "number") + message.row_diff_column_truncate_at = object.row_diff_column_truncate_at; + else if (typeof object.row_diff_column_truncate_at === "object") + message.row_diff_column_truncate_at = new $util.LongBits(object.row_diff_column_truncate_at.low >>> 0, object.row_diff_column_truncate_at.high >>> 0).toNumber(); return message; }; @@ -68478,6 +77262,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.max_sample_rows = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else object.max_sample_rows = options.longs === String ? "0" : 0; + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.row_diff_column_truncate_at = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.row_diff_column_truncate_at = options.longs === String ? "0" : 0; } if (message.only_pks != null && message.hasOwnProperty("only_pks")) object.only_pks = message.only_pks; @@ -68490,6 +77279,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.max_sample_rows = options.longs === String ? String(message.max_sample_rows) : message.max_sample_rows; else object.max_sample_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_sample_rows) : options.longs === Number ? new $util.LongBits(message.max_sample_rows.low >>> 0, message.max_sample_rows.high >>> 0).toNumber() : message.max_sample_rows; + if (message.row_diff_column_truncate_at != null && message.hasOwnProperty("row_diff_column_truncate_at")) + if (typeof message.row_diff_column_truncate_at === "number") + object.row_diff_column_truncate_at = options.longs === String ? String(message.row_diff_column_truncate_at) : message.row_diff_column_truncate_at; + else + object.row_diff_column_truncate_at = options.longs === String ? $util.Long.prototype.toString.call(message.row_diff_column_truncate_at) : options.longs === Number ? new $util.LongBits(message.row_diff_column_truncate_at.low >>> 0, message.row_diff_column_truncate_at.high >>> 0).toNumber() : message.row_diff_column_truncate_at; return object; }; @@ -68537,6 +77331,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {number|Long|null} [max_extra_rows_to_compare] VDiffCoreOptions max_extra_rows_to_compare * @property {boolean|null} [update_table_stats] VDiffCoreOptions update_table_stats * @property {number|Long|null} [max_diff_seconds] VDiffCoreOptions max_diff_seconds + * @property {boolean|null} [auto_start] VDiffCoreOptions auto_start */ /** @@ -68626,6 +77421,28 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ VDiffCoreOptions.prototype.max_diff_seconds = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + /** + * VDiffCoreOptions auto_start. + * @member {boolean|null|undefined} auto_start + * @memberof tabletmanagerdata.VDiffCoreOptions + * @instance + */ + VDiffCoreOptions.prototype.auto_start = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * VDiffCoreOptions _auto_start. + * @member {"auto_start"|undefined} _auto_start + * @memberof tabletmanagerdata.VDiffCoreOptions + * @instance + */ + Object.defineProperty(VDiffCoreOptions.prototype, "_auto_start", { + get: $util.oneOfGetter($oneOfFields = ["auto_start"]), + set: $util.oneOfSetter($oneOfFields) + }); + /** * Creates a new VDiffCoreOptions instance using the specified properties. * @function create @@ -68668,6 +77485,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { writer.uint32(/* id 8, wireType 0 =*/64).bool(message.update_table_stats); if (message.max_diff_seconds != null && Object.hasOwnProperty.call(message, "max_diff_seconds")) writer.uint32(/* id 9, wireType 0 =*/72).int64(message.max_diff_seconds); + if (message.auto_start != null && Object.hasOwnProperty.call(message, "auto_start")) + writer.uint32(/* id 10, wireType 0 =*/80).bool(message.auto_start); return writer; }; @@ -68738,6 +77557,10 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.max_diff_seconds = reader.int64(); break; } + case 10: { + message.auto_start = reader.bool(); + break; + } default: reader.skipType(tag & 7); break; @@ -68773,6 +77596,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { VDiffCoreOptions.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + let properties = {}; if (message.tables != null && message.hasOwnProperty("tables")) if (!$util.isString(message.tables)) return "tables: string expected"; @@ -68800,6 +77624,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (message.max_diff_seconds != null && message.hasOwnProperty("max_diff_seconds")) if (!$util.isInteger(message.max_diff_seconds) && !(message.max_diff_seconds && $util.isInteger(message.max_diff_seconds.low) && $util.isInteger(message.max_diff_seconds.high))) return "max_diff_seconds: integer|Long expected"; + if (message.auto_start != null && message.hasOwnProperty("auto_start")) { + properties._auto_start = 1; + if (typeof message.auto_start !== "boolean") + return "auto_start: boolean expected"; + } return null; }; @@ -68868,6 +77697,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.max_diff_seconds = object.max_diff_seconds; else if (typeof object.max_diff_seconds === "object") message.max_diff_seconds = new $util.LongBits(object.max_diff_seconds.low >>> 0, object.max_diff_seconds.high >>> 0).toNumber(); + if (object.auto_start != null) + message.auto_start = Boolean(object.auto_start); return message; }; @@ -68948,6 +77779,11 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.max_diff_seconds = options.longs === String ? String(message.max_diff_seconds) : message.max_diff_seconds; else object.max_diff_seconds = options.longs === String ? $util.Long.prototype.toString.call(message.max_diff_seconds) : options.longs === Number ? new $util.LongBits(message.max_diff_seconds.low >>> 0, message.max_diff_seconds.high >>> 0).toNumber() : message.max_diff_seconds; + if (message.auto_start != null && message.hasOwnProperty("auto_start")) { + object.auto_start = message.auto_start; + if (options.oneofs) + object._auto_start = "auto_start"; + } return object; }; @@ -69257,6 +78093,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {tabletmanagerdata.TabletSelectionPreference|null} [tablet_selection_preference] UpdateVReplicationWorkflowRequest tablet_selection_preference * @property {binlogdata.OnDDLAction|null} [on_ddl] UpdateVReplicationWorkflowRequest on_ddl * @property {binlogdata.VReplicationWorkflowState|null} [state] UpdateVReplicationWorkflowRequest state + * @property {Object.|null} [config_overrides] UpdateVReplicationWorkflowRequest config_overrides */ /** @@ -69270,6 +78107,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { function UpdateVReplicationWorkflowRequest(properties) { this.cells = []; this.tablet_types = []; + this.config_overrides = {}; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -69302,27 +78140,71 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { /** * UpdateVReplicationWorkflowRequest tablet_selection_preference. - * @member {tabletmanagerdata.TabletSelectionPreference} tablet_selection_preference + * @member {tabletmanagerdata.TabletSelectionPreference|null|undefined} tablet_selection_preference * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest * @instance */ - UpdateVReplicationWorkflowRequest.prototype.tablet_selection_preference = 0; + UpdateVReplicationWorkflowRequest.prototype.tablet_selection_preference = null; /** * UpdateVReplicationWorkflowRequest on_ddl. - * @member {binlogdata.OnDDLAction} on_ddl + * @member {binlogdata.OnDDLAction|null|undefined} on_ddl * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest * @instance */ - UpdateVReplicationWorkflowRequest.prototype.on_ddl = 0; + UpdateVReplicationWorkflowRequest.prototype.on_ddl = null; /** * UpdateVReplicationWorkflowRequest state. - * @member {binlogdata.VReplicationWorkflowState} state + * @member {binlogdata.VReplicationWorkflowState|null|undefined} state + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest + * @instance + */ + UpdateVReplicationWorkflowRequest.prototype.state = null; + + /** + * UpdateVReplicationWorkflowRequest config_overrides. + * @member {Object.} config_overrides + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest + * @instance + */ + UpdateVReplicationWorkflowRequest.prototype.config_overrides = $util.emptyObject; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * UpdateVReplicationWorkflowRequest _tablet_selection_preference. + * @member {"tablet_selection_preference"|undefined} _tablet_selection_preference + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest + * @instance + */ + Object.defineProperty(UpdateVReplicationWorkflowRequest.prototype, "_tablet_selection_preference", { + get: $util.oneOfGetter($oneOfFields = ["tablet_selection_preference"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * UpdateVReplicationWorkflowRequest _on_ddl. + * @member {"on_ddl"|undefined} _on_ddl * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest * @instance */ - UpdateVReplicationWorkflowRequest.prototype.state = 0; + Object.defineProperty(UpdateVReplicationWorkflowRequest.prototype, "_on_ddl", { + get: $util.oneOfGetter($oneOfFields = ["on_ddl"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * UpdateVReplicationWorkflowRequest _state. + * @member {"state"|undefined} _state + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowRequest + * @instance + */ + Object.defineProperty(UpdateVReplicationWorkflowRequest.prototype, "_state", { + get: $util.oneOfGetter($oneOfFields = ["state"]), + set: $util.oneOfSetter($oneOfFields) + }); /** * Creates a new UpdateVReplicationWorkflowRequest instance using the specified properties. @@ -69365,6 +78247,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { writer.uint32(/* id 5, wireType 0 =*/40).int32(message.on_ddl); if (message.state != null && Object.hasOwnProperty.call(message, "state")) writer.uint32(/* id 6, wireType 0 =*/48).int32(message.state); + if (message.config_overrides != null && Object.hasOwnProperty.call(message, "config_overrides")) + for (let keys = Object.keys(message.config_overrides), i = 0; i < keys.length; ++i) + writer.uint32(/* id 8, wireType 2 =*/66).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.config_overrides[keys[i]]).ldelim(); return writer; }; @@ -69395,7 +78280,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { UpdateVReplicationWorkflowRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.UpdateVReplicationWorkflowRequest(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.UpdateVReplicationWorkflowRequest(), key, value; while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { @@ -69432,6 +78317,29 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.state = reader.int32(); break; } + case 8: { + if (message.config_overrides === $util.emptyObject) + message.config_overrides = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.config_overrides[key] = value; + break; + } default: reader.skipType(tag & 7); break; @@ -69467,6 +78375,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { UpdateVReplicationWorkflowRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + let properties = {}; if (message.workflow != null && message.hasOwnProperty("workflow")) if (!$util.isString(message.workflow)) return "workflow: string expected"; @@ -69498,7 +78407,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { break; } } - if (message.tablet_selection_preference != null && message.hasOwnProperty("tablet_selection_preference")) + if (message.tablet_selection_preference != null && message.hasOwnProperty("tablet_selection_preference")) { + properties._tablet_selection_preference = 1; switch (message.tablet_selection_preference) { default: return "tablet_selection_preference: enum value expected"; @@ -69507,7 +78417,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { case 3: break; } - if (message.on_ddl != null && message.hasOwnProperty("on_ddl")) + } + if (message.on_ddl != null && message.hasOwnProperty("on_ddl")) { + properties._on_ddl = 1; switch (message.on_ddl) { default: return "on_ddl: enum value expected"; @@ -69517,7 +78429,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { case 3: break; } - if (message.state != null && message.hasOwnProperty("state")) + } + if (message.state != null && message.hasOwnProperty("state")) { + properties._state = 1; switch (message.state) { default: return "state: enum value expected"; @@ -69530,6 +78444,15 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { case 6: break; } + } + if (message.config_overrides != null && message.hasOwnProperty("config_overrides")) { + if (!$util.isObject(message.config_overrides)) + return "config_overrides: object expected"; + let key = Object.keys(message.config_overrides); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.config_overrides[key[i]])) + return "config_overrides: string{k:string} expected"; + } return null; }; @@ -69691,6 +78614,13 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.state = 6; break; } + if (object.config_overrides) { + if (typeof object.config_overrides !== "object") + throw TypeError(".tabletmanagerdata.UpdateVReplicationWorkflowRequest.config_overrides: object expected"); + message.config_overrides = {}; + for (let keys = Object.keys(object.config_overrides), i = 0; i < keys.length; ++i) + message.config_overrides[keys[i]] = String(object.config_overrides[keys[i]]); + } return message; }; @@ -69711,12 +78641,10 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.cells = []; object.tablet_types = []; } - if (options.defaults) { + if (options.objects || options.defaults) + object.config_overrides = {}; + if (options.defaults) object.workflow = ""; - object.tablet_selection_preference = options.enums === String ? "ANY" : 0; - object.on_ddl = options.enums === String ? "IGNORE" : 0; - object.state = options.enums === String ? "Unknown" : 0; - } if (message.workflow != null && message.hasOwnProperty("workflow")) object.workflow = message.workflow; if (message.cells && message.cells.length) { @@ -69729,12 +78657,27 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { for (let j = 0; j < message.tablet_types.length; ++j) object.tablet_types[j] = options.enums === String ? $root.topodata.TabletType[message.tablet_types[j]] === undefined ? message.tablet_types[j] : $root.topodata.TabletType[message.tablet_types[j]] : message.tablet_types[j]; } - if (message.tablet_selection_preference != null && message.hasOwnProperty("tablet_selection_preference")) + if (message.tablet_selection_preference != null && message.hasOwnProperty("tablet_selection_preference")) { object.tablet_selection_preference = options.enums === String ? $root.tabletmanagerdata.TabletSelectionPreference[message.tablet_selection_preference] === undefined ? message.tablet_selection_preference : $root.tabletmanagerdata.TabletSelectionPreference[message.tablet_selection_preference] : message.tablet_selection_preference; - if (message.on_ddl != null && message.hasOwnProperty("on_ddl")) + if (options.oneofs) + object._tablet_selection_preference = "tablet_selection_preference"; + } + if (message.on_ddl != null && message.hasOwnProperty("on_ddl")) { object.on_ddl = options.enums === String ? $root.binlogdata.OnDDLAction[message.on_ddl] === undefined ? message.on_ddl : $root.binlogdata.OnDDLAction[message.on_ddl] : message.on_ddl; - if (message.state != null && message.hasOwnProperty("state")) + if (options.oneofs) + object._on_ddl = "on_ddl"; + } + if (message.state != null && message.hasOwnProperty("state")) { object.state = options.enums === String ? $root.binlogdata.VReplicationWorkflowState[message.state] === undefined ? message.state : $root.binlogdata.VReplicationWorkflowState[message.state] : message.state; + if (options.oneofs) + object._state = "state"; + } + let keys2; + if (message.config_overrides && (keys2 = Object.keys(message.config_overrides)).length) { + object.config_overrides = {}; + for (let j = 0; j < keys2.length; ++j) + object.config_overrides[keys2[j]] = message.config_overrides[keys2[j]]; + } return object; }; @@ -70032,27 +78975,63 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { /** * UpdateVReplicationWorkflowsRequest state. - * @member {binlogdata.VReplicationWorkflowState} state + * @member {binlogdata.VReplicationWorkflowState|null|undefined} state * @memberof tabletmanagerdata.UpdateVReplicationWorkflowsRequest * @instance */ - UpdateVReplicationWorkflowsRequest.prototype.state = 0; + UpdateVReplicationWorkflowsRequest.prototype.state = null; /** * UpdateVReplicationWorkflowsRequest message. - * @member {string} message + * @member {string|null|undefined} message * @memberof tabletmanagerdata.UpdateVReplicationWorkflowsRequest * @instance */ - UpdateVReplicationWorkflowsRequest.prototype.message = ""; + UpdateVReplicationWorkflowsRequest.prototype.message = null; /** * UpdateVReplicationWorkflowsRequest stop_position. - * @member {string} stop_position + * @member {string|null|undefined} stop_position + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowsRequest + * @instance + */ + UpdateVReplicationWorkflowsRequest.prototype.stop_position = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * UpdateVReplicationWorkflowsRequest _state. + * @member {"state"|undefined} _state * @memberof tabletmanagerdata.UpdateVReplicationWorkflowsRequest * @instance */ - UpdateVReplicationWorkflowsRequest.prototype.stop_position = ""; + Object.defineProperty(UpdateVReplicationWorkflowsRequest.prototype, "_state", { + get: $util.oneOfGetter($oneOfFields = ["state"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * UpdateVReplicationWorkflowsRequest _message. + * @member {"message"|undefined} _message + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowsRequest + * @instance + */ + Object.defineProperty(UpdateVReplicationWorkflowsRequest.prototype, "_message", { + get: $util.oneOfGetter($oneOfFields = ["message"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * UpdateVReplicationWorkflowsRequest _stop_position. + * @member {"stop_position"|undefined} _stop_position + * @memberof tabletmanagerdata.UpdateVReplicationWorkflowsRequest + * @instance + */ + Object.defineProperty(UpdateVReplicationWorkflowsRequest.prototype, "_stop_position", { + get: $util.oneOfGetter($oneOfFields = ["stop_position"]), + set: $util.oneOfSetter($oneOfFields) + }); /** * Creates a new UpdateVReplicationWorkflowsRequest instance using the specified properties. @@ -70189,6 +79168,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { UpdateVReplicationWorkflowsRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + let properties = {}; if (message.all_workflows != null && message.hasOwnProperty("all_workflows")) if (typeof message.all_workflows !== "boolean") return "all_workflows: boolean expected"; @@ -70206,7 +79186,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (!$util.isString(message.exclude_workflows[i])) return "exclude_workflows: string[] expected"; } - if (message.state != null && message.hasOwnProperty("state")) + if (message.state != null && message.hasOwnProperty("state")) { + properties._state = 1; switch (message.state) { default: return "state: enum value expected"; @@ -70219,12 +79200,17 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { case 6: break; } - if (message.message != null && message.hasOwnProperty("message")) + } + if (message.message != null && message.hasOwnProperty("message")) { + properties._message = 1; if (!$util.isString(message.message)) return "message: string expected"; - if (message.stop_position != null && message.hasOwnProperty("stop_position")) + } + if (message.stop_position != null && message.hasOwnProperty("stop_position")) { + properties._stop_position = 1; if (!$util.isString(message.stop_position)) return "stop_position: string expected"; + } return null; }; @@ -70316,12 +79302,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.include_workflows = []; object.exclude_workflows = []; } - if (options.defaults) { + if (options.defaults) object.all_workflows = false; - object.state = options.enums === String ? "Unknown" : 0; - object.message = ""; - object.stop_position = ""; - } if (message.all_workflows != null && message.hasOwnProperty("all_workflows")) object.all_workflows = message.all_workflows; if (message.include_workflows && message.include_workflows.length) { @@ -70334,12 +79316,21 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { for (let j = 0; j < message.exclude_workflows.length; ++j) object.exclude_workflows[j] = message.exclude_workflows[j]; } - if (message.state != null && message.hasOwnProperty("state")) + if (message.state != null && message.hasOwnProperty("state")) { object.state = options.enums === String ? $root.binlogdata.VReplicationWorkflowState[message.state] === undefined ? message.state : $root.binlogdata.VReplicationWorkflowState[message.state] : message.state; - if (message.message != null && message.hasOwnProperty("message")) + if (options.oneofs) + object._state = "state"; + } + if (message.message != null && message.hasOwnProperty("message")) { object.message = message.message; - if (message.stop_position != null && message.hasOwnProperty("stop_position")) + if (options.oneofs) + object._message = "message"; + } + if (message.stop_position != null && message.hasOwnProperty("stop_position")) { object.stop_position = message.stop_position; + if (options.oneofs) + object._stop_position = "stop_position"; + } return object; }; @@ -71270,6 +80261,28 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { return CheckThrottlerRequest; })(); + /** + * CheckThrottlerResponseCode enum. + * @name tabletmanagerdata.CheckThrottlerResponseCode + * @enum {number} + * @property {number} UNDEFINED=0 UNDEFINED value + * @property {number} OK=1 OK value + * @property {number} THRESHOLD_EXCEEDED=2 THRESHOLD_EXCEEDED value + * @property {number} APP_DENIED=3 APP_DENIED value + * @property {number} UNKNOWN_METRIC=4 UNKNOWN_METRIC value + * @property {number} INTERNAL_ERROR=5 INTERNAL_ERROR value + */ + tabletmanagerdata.CheckThrottlerResponseCode = (function() { + const valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNDEFINED"] = 0; + values[valuesById[1] = "OK"] = 1; + values[valuesById[2] = "THRESHOLD_EXCEEDED"] = 2; + values[valuesById[3] = "APP_DENIED"] = 3; + values[valuesById[4] = "UNKNOWN_METRIC"] = 4; + values[valuesById[5] = "INTERNAL_ERROR"] = 5; + return values; + })(); + tabletmanagerdata.CheckThrottlerResponse = (function() { /** @@ -71283,6 +80296,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {string|null} [message] CheckThrottlerResponse message * @property {boolean|null} [recently_checked] CheckThrottlerResponse recently_checked * @property {Object.|null} [metrics] CheckThrottlerResponse metrics + * @property {string|null} [app_name] CheckThrottlerResponse app_name + * @property {string|null} [summary] CheckThrottlerResponse summary + * @property {tabletmanagerdata.CheckThrottlerResponseCode|null} [response_code] CheckThrottlerResponse response_code */ /** @@ -71357,6 +80373,30 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ CheckThrottlerResponse.prototype.metrics = $util.emptyObject; + /** + * CheckThrottlerResponse app_name. + * @member {string} app_name + * @memberof tabletmanagerdata.CheckThrottlerResponse + * @instance + */ + CheckThrottlerResponse.prototype.app_name = ""; + + /** + * CheckThrottlerResponse summary. + * @member {string} summary + * @memberof tabletmanagerdata.CheckThrottlerResponse + * @instance + */ + CheckThrottlerResponse.prototype.summary = ""; + + /** + * CheckThrottlerResponse response_code. + * @member {tabletmanagerdata.CheckThrottlerResponseCode} response_code + * @memberof tabletmanagerdata.CheckThrottlerResponse + * @instance + */ + CheckThrottlerResponse.prototype.response_code = 0; + /** * Creates a new CheckThrottlerResponse instance using the specified properties. * @function create @@ -71398,6 +80438,12 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { writer.uint32(/* id 7, wireType 2 =*/58).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); $root.tabletmanagerdata.CheckThrottlerResponse.Metric.encode(message.metrics[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); } + if (message.app_name != null && Object.hasOwnProperty.call(message, "app_name")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.app_name); + if (message.summary != null && Object.hasOwnProperty.call(message, "summary")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.summary); + if (message.response_code != null && Object.hasOwnProperty.call(message, "response_code")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.response_code); return writer; }; @@ -71479,6 +80525,18 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.metrics[key] = value; break; } + case 8: { + message.app_name = reader.string(); + break; + } + case 9: { + message.summary = reader.string(); + break; + } + case 10: { + message.response_code = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -71542,6 +80600,24 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { return "metrics." + error; } } + if (message.app_name != null && message.hasOwnProperty("app_name")) + if (!$util.isString(message.app_name)) + return "app_name: string expected"; + if (message.summary != null && message.hasOwnProperty("summary")) + if (!$util.isString(message.summary)) + return "summary: string expected"; + if (message.response_code != null && message.hasOwnProperty("response_code")) + switch (message.response_code) { + default: + return "response_code: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; + } return null; }; @@ -71579,6 +80655,42 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.metrics[keys[i]] = $root.tabletmanagerdata.CheckThrottlerResponse.Metric.fromObject(object.metrics[keys[i]]); } } + if (object.app_name != null) + message.app_name = String(object.app_name); + if (object.summary != null) + message.summary = String(object.summary); + switch (object.response_code) { + default: + if (typeof object.response_code === "number") { + message.response_code = object.response_code; + break; + } + break; + case "UNDEFINED": + case 0: + message.response_code = 0; + break; + case "OK": + case 1: + message.response_code = 1; + break; + case "THRESHOLD_EXCEEDED": + case 2: + message.response_code = 2; + break; + case "APP_DENIED": + case 3: + message.response_code = 3; + break; + case "UNKNOWN_METRIC": + case 4: + message.response_code = 4; + break; + case "INTERNAL_ERROR": + case 5: + message.response_code = 5; + break; + } return message; }; @@ -71604,6 +80716,9 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.error = ""; object.message = ""; object.recently_checked = false; + object.app_name = ""; + object.summary = ""; + object.response_code = options.enums === String ? "UNDEFINED" : 0; } if (message.status_code != null && message.hasOwnProperty("status_code")) object.status_code = message.status_code; @@ -71623,6 +80738,12 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { for (let j = 0; j < keys2.length; ++j) object.metrics[keys2[j]] = $root.tabletmanagerdata.CheckThrottlerResponse.Metric.toObject(message.metrics[keys2[j]], options); } + if (message.app_name != null && message.hasOwnProperty("app_name")) + object.app_name = message.app_name; + if (message.summary != null && message.hasOwnProperty("summary")) + object.summary = message.summary; + if (message.response_code != null && message.hasOwnProperty("response_code")) + object.response_code = options.enums === String ? $root.tabletmanagerdata.CheckThrottlerResponseCode[message.response_code] === undefined ? message.response_code : $root.tabletmanagerdata.CheckThrottlerResponseCode[message.response_code] : message.response_code; return object; }; @@ -71665,6 +80786,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @property {string|null} [error] Metric error * @property {string|null} [message] Metric message * @property {string|null} [scope] Metric scope + * @property {tabletmanagerdata.CheckThrottlerResponseCode|null} [response_code] Metric response_code */ /** @@ -71738,6 +80860,14 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ Metric.prototype.scope = ""; + /** + * Metric response_code. + * @member {tabletmanagerdata.CheckThrottlerResponseCode} response_code + * @memberof tabletmanagerdata.CheckThrottlerResponse.Metric + * @instance + */ + Metric.prototype.response_code = 0; + /** * Creates a new Metric instance using the specified properties. * @function create @@ -71776,6 +80906,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { writer.uint32(/* id 6, wireType 2 =*/50).string(message.message); if (message.scope != null && Object.hasOwnProperty.call(message, "scope")) writer.uint32(/* id 7, wireType 2 =*/58).string(message.scope); + if (message.response_code != null && Object.hasOwnProperty.call(message, "response_code")) + writer.uint32(/* id 8, wireType 0 =*/64).int32(message.response_code); return writer; }; @@ -71838,6 +80970,10 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.scope = reader.string(); break; } + case 8: { + message.response_code = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -71894,6 +81030,18 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (message.scope != null && message.hasOwnProperty("scope")) if (!$util.isString(message.scope)) return "scope: string expected"; + if (message.response_code != null && message.hasOwnProperty("response_code")) + switch (message.response_code) { + default: + return "response_code: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; + } return null; }; @@ -71923,6 +81071,38 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.message = String(object.message); if (object.scope != null) message.scope = String(object.scope); + switch (object.response_code) { + default: + if (typeof object.response_code === "number") { + message.response_code = object.response_code; + break; + } + break; + case "UNDEFINED": + case 0: + message.response_code = 0; + break; + case "OK": + case 1: + message.response_code = 1; + break; + case "THRESHOLD_EXCEEDED": + case 2: + message.response_code = 2; + break; + case "APP_DENIED": + case 3: + message.response_code = 3; + break; + case "UNKNOWN_METRIC": + case 4: + message.response_code = 4; + break; + case "INTERNAL_ERROR": + case 5: + message.response_code = 5; + break; + } return message; }; @@ -71947,6 +81127,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.error = ""; object.message = ""; object.scope = ""; + object.response_code = options.enums === String ? "UNDEFINED" : 0; } if (message.name != null && message.hasOwnProperty("name")) object.name = message.name; @@ -71962,6 +81143,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { object.message = message.message; if (message.scope != null && message.hasOwnProperty("scope")) object.scope = message.scope; + if (message.response_code != null && message.hasOwnProperty("response_code")) + object.response_code = options.enums === String ? $root.tabletmanagerdata.CheckThrottlerResponseCode[message.response_code] === undefined ? message.response_code : $root.tabletmanagerdata.CheckThrottlerResponseCode[message.response_code] : message.response_code; return object; }; @@ -73480,6 +82663,7 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { * @interface IRecentApp * @property {vttime.ITime|null} [checked_at] RecentApp checked_at * @property {number|null} [status_code] RecentApp status_code + * @property {tabletmanagerdata.CheckThrottlerResponseCode|null} [response_code] RecentApp response_code */ /** @@ -73513,6 +82697,14 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { */ RecentApp.prototype.status_code = 0; + /** + * RecentApp response_code. + * @member {tabletmanagerdata.CheckThrottlerResponseCode} response_code + * @memberof tabletmanagerdata.GetThrottlerStatusResponse.RecentApp + * @instance + */ + RecentApp.prototype.response_code = 0; + /** * Creates a new RecentApp instance using the specified properties. * @function create @@ -73541,6 +82733,8 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { $root.vttime.Time.encode(message.checked_at, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.status_code != null && Object.hasOwnProperty.call(message, "status_code")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.status_code); + if (message.response_code != null && Object.hasOwnProperty.call(message, "response_code")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.response_code); return writer; }; @@ -73583,6 +82777,10 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { message.status_code = reader.int32(); break; } + case 3: { + message.response_code = reader.int32(); + break; + } default: reader.skipType(tag & 7); break; @@ -73626,6 +82824,18 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (message.status_code != null && message.hasOwnProperty("status_code")) if (!$util.isInteger(message.status_code)) return "status_code: integer expected"; + if (message.response_code != null && message.hasOwnProperty("response_code")) + switch (message.response_code) { + default: + return "response_code: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; + } return null; }; @@ -73648,6 +82858,38 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { } if (object.status_code != null) message.status_code = object.status_code | 0; + switch (object.response_code) { + default: + if (typeof object.response_code === "number") { + message.response_code = object.response_code; + break; + } + break; + case "UNDEFINED": + case 0: + message.response_code = 0; + break; + case "OK": + case 1: + message.response_code = 1; + break; + case "THRESHOLD_EXCEEDED": + case 2: + message.response_code = 2; + break; + case "APP_DENIED": + case 3: + message.response_code = 3; + break; + case "UNKNOWN_METRIC": + case 4: + message.response_code = 4; + break; + case "INTERNAL_ERROR": + case 5: + message.response_code = 5; + break; + } return message; }; @@ -73667,11 +82909,14 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { if (options.defaults) { object.checked_at = null; object.status_code = 0; + object.response_code = options.enums === String ? "UNDEFINED" : 0; } if (message.checked_at != null && message.hasOwnProperty("checked_at")) object.checked_at = $root.vttime.Time.toObject(message.checked_at, options); if (message.status_code != null && message.hasOwnProperty("status_code")) object.status_code = message.status_code; + if (message.response_code != null && message.hasOwnProperty("response_code")) + object.response_code = options.enums === String ? $root.tabletmanagerdata.CheckThrottlerResponseCode[message.response_code] === undefined ? message.response_code : $root.tabletmanagerdata.CheckThrottlerResponseCode[message.response_code] : message.response_code; return object; }; @@ -73707,6 +82952,506 @@ export const tabletmanagerdata = $root.tabletmanagerdata = (() => { return GetThrottlerStatusResponse; })(); + tabletmanagerdata.ChangeTagsRequest = (function() { + + /** + * Properties of a ChangeTagsRequest. + * @memberof tabletmanagerdata + * @interface IChangeTagsRequest + * @property {Object.|null} [tags] ChangeTagsRequest tags + * @property {boolean|null} [replace] ChangeTagsRequest replace + */ + + /** + * Constructs a new ChangeTagsRequest. + * @memberof tabletmanagerdata + * @classdesc Represents a ChangeTagsRequest. + * @implements IChangeTagsRequest + * @constructor + * @param {tabletmanagerdata.IChangeTagsRequest=} [properties] Properties to set + */ + function ChangeTagsRequest(properties) { + this.tags = {}; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ChangeTagsRequest tags. + * @member {Object.} tags + * @memberof tabletmanagerdata.ChangeTagsRequest + * @instance + */ + ChangeTagsRequest.prototype.tags = $util.emptyObject; + + /** + * ChangeTagsRequest replace. + * @member {boolean} replace + * @memberof tabletmanagerdata.ChangeTagsRequest + * @instance + */ + ChangeTagsRequest.prototype.replace = false; + + /** + * Creates a new ChangeTagsRequest instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ChangeTagsRequest + * @static + * @param {tabletmanagerdata.IChangeTagsRequest=} [properties] Properties to set + * @returns {tabletmanagerdata.ChangeTagsRequest} ChangeTagsRequest instance + */ + ChangeTagsRequest.create = function create(properties) { + return new ChangeTagsRequest(properties); + }; + + /** + * Encodes the specified ChangeTagsRequest message. Does not implicitly {@link tabletmanagerdata.ChangeTagsRequest.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ChangeTagsRequest + * @static + * @param {tabletmanagerdata.IChangeTagsRequest} message ChangeTagsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChangeTagsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tags != null && Object.hasOwnProperty.call(message, "tags")) + for (let keys = Object.keys(message.tags), i = 0; i < keys.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.tags[keys[i]]).ldelim(); + if (message.replace != null && Object.hasOwnProperty.call(message, "replace")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.replace); + return writer; + }; + + /** + * Encodes the specified ChangeTagsRequest message, length delimited. Does not implicitly {@link tabletmanagerdata.ChangeTagsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ChangeTagsRequest + * @static + * @param {tabletmanagerdata.IChangeTagsRequest} message ChangeTagsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChangeTagsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ChangeTagsRequest message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ChangeTagsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ChangeTagsRequest} ChangeTagsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChangeTagsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ChangeTagsRequest(), key, value; + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (message.tags === $util.emptyObject) + message.tags = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.tags[key] = value; + break; + } + case 2: { + message.replace = reader.bool(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ChangeTagsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ChangeTagsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ChangeTagsRequest} ChangeTagsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChangeTagsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ChangeTagsRequest message. + * @function verify + * @memberof tabletmanagerdata.ChangeTagsRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ChangeTagsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tags != null && message.hasOwnProperty("tags")) { + if (!$util.isObject(message.tags)) + return "tags: object expected"; + let key = Object.keys(message.tags); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.tags[key[i]])) + return "tags: string{k:string} expected"; + } + if (message.replace != null && message.hasOwnProperty("replace")) + if (typeof message.replace !== "boolean") + return "replace: boolean expected"; + return null; + }; + + /** + * Creates a ChangeTagsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ChangeTagsRequest + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ChangeTagsRequest} ChangeTagsRequest + */ + ChangeTagsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ChangeTagsRequest) + return object; + let message = new $root.tabletmanagerdata.ChangeTagsRequest(); + if (object.tags) { + if (typeof object.tags !== "object") + throw TypeError(".tabletmanagerdata.ChangeTagsRequest.tags: object expected"); + message.tags = {}; + for (let keys = Object.keys(object.tags), i = 0; i < keys.length; ++i) + message.tags[keys[i]] = String(object.tags[keys[i]]); + } + if (object.replace != null) + message.replace = Boolean(object.replace); + return message; + }; + + /** + * Creates a plain object from a ChangeTagsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ChangeTagsRequest + * @static + * @param {tabletmanagerdata.ChangeTagsRequest} message ChangeTagsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ChangeTagsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.objects || options.defaults) + object.tags = {}; + if (options.defaults) + object.replace = false; + let keys2; + if (message.tags && (keys2 = Object.keys(message.tags)).length) { + object.tags = {}; + for (let j = 0; j < keys2.length; ++j) + object.tags[keys2[j]] = message.tags[keys2[j]]; + } + if (message.replace != null && message.hasOwnProperty("replace")) + object.replace = message.replace; + return object; + }; + + /** + * Converts this ChangeTagsRequest to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ChangeTagsRequest + * @instance + * @returns {Object.} JSON object + */ + ChangeTagsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ChangeTagsRequest + * @function getTypeUrl + * @memberof tabletmanagerdata.ChangeTagsRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ChangeTagsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ChangeTagsRequest"; + }; + + return ChangeTagsRequest; + })(); + + tabletmanagerdata.ChangeTagsResponse = (function() { + + /** + * Properties of a ChangeTagsResponse. + * @memberof tabletmanagerdata + * @interface IChangeTagsResponse + * @property {Object.|null} [tags] ChangeTagsResponse tags + */ + + /** + * Constructs a new ChangeTagsResponse. + * @memberof tabletmanagerdata + * @classdesc Represents a ChangeTagsResponse. + * @implements IChangeTagsResponse + * @constructor + * @param {tabletmanagerdata.IChangeTagsResponse=} [properties] Properties to set + */ + function ChangeTagsResponse(properties) { + this.tags = {}; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ChangeTagsResponse tags. + * @member {Object.} tags + * @memberof tabletmanagerdata.ChangeTagsResponse + * @instance + */ + ChangeTagsResponse.prototype.tags = $util.emptyObject; + + /** + * Creates a new ChangeTagsResponse instance using the specified properties. + * @function create + * @memberof tabletmanagerdata.ChangeTagsResponse + * @static + * @param {tabletmanagerdata.IChangeTagsResponse=} [properties] Properties to set + * @returns {tabletmanagerdata.ChangeTagsResponse} ChangeTagsResponse instance + */ + ChangeTagsResponse.create = function create(properties) { + return new ChangeTagsResponse(properties); + }; + + /** + * Encodes the specified ChangeTagsResponse message. Does not implicitly {@link tabletmanagerdata.ChangeTagsResponse.verify|verify} messages. + * @function encode + * @memberof tabletmanagerdata.ChangeTagsResponse + * @static + * @param {tabletmanagerdata.IChangeTagsResponse} message ChangeTagsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChangeTagsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tags != null && Object.hasOwnProperty.call(message, "tags")) + for (let keys = Object.keys(message.tags), i = 0; i < keys.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.tags[keys[i]]).ldelim(); + return writer; + }; + + /** + * Encodes the specified ChangeTagsResponse message, length delimited. Does not implicitly {@link tabletmanagerdata.ChangeTagsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof tabletmanagerdata.ChangeTagsResponse + * @static + * @param {tabletmanagerdata.IChangeTagsResponse} message ChangeTagsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChangeTagsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ChangeTagsResponse message from the specified reader or buffer. + * @function decode + * @memberof tabletmanagerdata.ChangeTagsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {tabletmanagerdata.ChangeTagsResponse} ChangeTagsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChangeTagsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.tabletmanagerdata.ChangeTagsResponse(), key, value; + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (message.tags === $util.emptyObject) + message.tags = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.tags[key] = value; + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ChangeTagsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof tabletmanagerdata.ChangeTagsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {tabletmanagerdata.ChangeTagsResponse} ChangeTagsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChangeTagsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ChangeTagsResponse message. + * @function verify + * @memberof tabletmanagerdata.ChangeTagsResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ChangeTagsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tags != null && message.hasOwnProperty("tags")) { + if (!$util.isObject(message.tags)) + return "tags: object expected"; + let key = Object.keys(message.tags); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.tags[key[i]])) + return "tags: string{k:string} expected"; + } + return null; + }; + + /** + * Creates a ChangeTagsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof tabletmanagerdata.ChangeTagsResponse + * @static + * @param {Object.} object Plain object + * @returns {tabletmanagerdata.ChangeTagsResponse} ChangeTagsResponse + */ + ChangeTagsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.tabletmanagerdata.ChangeTagsResponse) + return object; + let message = new $root.tabletmanagerdata.ChangeTagsResponse(); + if (object.tags) { + if (typeof object.tags !== "object") + throw TypeError(".tabletmanagerdata.ChangeTagsResponse.tags: object expected"); + message.tags = {}; + for (let keys = Object.keys(object.tags), i = 0; i < keys.length; ++i) + message.tags[keys[i]] = String(object.tags[keys[i]]); + } + return message; + }; + + /** + * Creates a plain object from a ChangeTagsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof tabletmanagerdata.ChangeTagsResponse + * @static + * @param {tabletmanagerdata.ChangeTagsResponse} message ChangeTagsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ChangeTagsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.objects || options.defaults) + object.tags = {}; + let keys2; + if (message.tags && (keys2 = Object.keys(message.tags)).length) { + object.tags = {}; + for (let j = 0; j < keys2.length; ++j) + object.tags[keys2[j]] = message.tags[keys2[j]]; + } + return object; + }; + + /** + * Converts this ChangeTagsResponse to JSON. + * @function toJSON + * @memberof tabletmanagerdata.ChangeTagsResponse + * @instance + * @returns {Object.} JSON object + */ + ChangeTagsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ChangeTagsResponse + * @function getTypeUrl + * @memberof tabletmanagerdata.ChangeTagsResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ChangeTagsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/tabletmanagerdata.ChangeTagsResponse"; + }; + + return ChangeTagsResponse; + })(); + return tabletmanagerdata; })(); @@ -77827,6 +87572,7 @@ export const binlogdata = $root.binlogdata = (() => { * @property {string|null} [keyspace] RowEvent keyspace * @property {string|null} [shard] RowEvent shard * @property {number|null} [flags] RowEvent flags + * @property {boolean|null} [is_internal_table] RowEvent is_internal_table */ /** @@ -77885,6 +87631,14 @@ export const binlogdata = $root.binlogdata = (() => { */ RowEvent.prototype.flags = 0; + /** + * RowEvent is_internal_table. + * @member {boolean} is_internal_table + * @memberof binlogdata.RowEvent + * @instance + */ + RowEvent.prototype.is_internal_table = false; + /** * Creates a new RowEvent instance using the specified properties. * @function create @@ -77920,6 +87674,8 @@ export const binlogdata = $root.binlogdata = (() => { writer.uint32(/* id 4, wireType 2 =*/34).string(message.shard); if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.flags); + if (message.is_internal_table != null && Object.hasOwnProperty.call(message, "is_internal_table")) + writer.uint32(/* id 6, wireType 0 =*/48).bool(message.is_internal_table); return writer; }; @@ -77976,6 +87732,10 @@ export const binlogdata = $root.binlogdata = (() => { message.flags = reader.uint32(); break; } + case 6: { + message.is_internal_table = reader.bool(); + break; + } default: reader.skipType(tag & 7); break; @@ -78032,6 +87792,9 @@ export const binlogdata = $root.binlogdata = (() => { if (message.flags != null && message.hasOwnProperty("flags")) if (!$util.isInteger(message.flags)) return "flags: integer expected"; + if (message.is_internal_table != null && message.hasOwnProperty("is_internal_table")) + if (typeof message.is_internal_table !== "boolean") + return "is_internal_table: boolean expected"; return null; }; @@ -78065,6 +87828,8 @@ export const binlogdata = $root.binlogdata = (() => { message.shard = String(object.shard); if (object.flags != null) message.flags = object.flags >>> 0; + if (object.is_internal_table != null) + message.is_internal_table = Boolean(object.is_internal_table); return message; }; @@ -78088,6 +87853,7 @@ export const binlogdata = $root.binlogdata = (() => { object.keyspace = ""; object.shard = ""; object.flags = 0; + object.is_internal_table = false; } if (message.table_name != null && message.hasOwnProperty("table_name")) object.table_name = message.table_name; @@ -78102,6 +87868,8 @@ export const binlogdata = $root.binlogdata = (() => { object.shard = message.shard; if (message.flags != null && message.hasOwnProperty("flags")) object.flags = message.flags; + if (message.is_internal_table != null && message.hasOwnProperty("is_internal_table")) + object.is_internal_table = message.is_internal_table; return object; }; @@ -78145,6 +87913,7 @@ export const binlogdata = $root.binlogdata = (() => { * @property {string|null} [keyspace] FieldEvent keyspace * @property {string|null} [shard] FieldEvent shard * @property {boolean|null} [enum_set_string_values] FieldEvent enum_set_string_values + * @property {boolean|null} [is_internal_table] FieldEvent is_internal_table */ /** @@ -78203,6 +87972,14 @@ export const binlogdata = $root.binlogdata = (() => { */ FieldEvent.prototype.enum_set_string_values = false; + /** + * FieldEvent is_internal_table. + * @member {boolean} is_internal_table + * @memberof binlogdata.FieldEvent + * @instance + */ + FieldEvent.prototype.is_internal_table = false; + /** * Creates a new FieldEvent instance using the specified properties. * @function create @@ -78238,6 +88015,8 @@ export const binlogdata = $root.binlogdata = (() => { writer.uint32(/* id 4, wireType 2 =*/34).string(message.shard); if (message.enum_set_string_values != null && Object.hasOwnProperty.call(message, "enum_set_string_values")) writer.uint32(/* id 25, wireType 0 =*/200).bool(message.enum_set_string_values); + if (message.is_internal_table != null && Object.hasOwnProperty.call(message, "is_internal_table")) + writer.uint32(/* id 26, wireType 0 =*/208).bool(message.is_internal_table); return writer; }; @@ -78294,6 +88073,10 @@ export const binlogdata = $root.binlogdata = (() => { message.enum_set_string_values = reader.bool(); break; } + case 26: { + message.is_internal_table = reader.bool(); + break; + } default: reader.skipType(tag & 7); break; @@ -78350,6 +88133,9 @@ export const binlogdata = $root.binlogdata = (() => { if (message.enum_set_string_values != null && message.hasOwnProperty("enum_set_string_values")) if (typeof message.enum_set_string_values !== "boolean") return "enum_set_string_values: boolean expected"; + if (message.is_internal_table != null && message.hasOwnProperty("is_internal_table")) + if (typeof message.is_internal_table !== "boolean") + return "is_internal_table: boolean expected"; return null; }; @@ -78383,6 +88169,8 @@ export const binlogdata = $root.binlogdata = (() => { message.shard = String(object.shard); if (object.enum_set_string_values != null) message.enum_set_string_values = Boolean(object.enum_set_string_values); + if (object.is_internal_table != null) + message.is_internal_table = Boolean(object.is_internal_table); return message; }; @@ -78406,6 +88194,7 @@ export const binlogdata = $root.binlogdata = (() => { object.keyspace = ""; object.shard = ""; object.enum_set_string_values = false; + object.is_internal_table = false; } if (message.table_name != null && message.hasOwnProperty("table_name")) object.table_name = message.table_name; @@ -78420,6 +88209,8 @@ export const binlogdata = $root.binlogdata = (() => { object.shard = message.shard; if (message.enum_set_string_values != null && message.hasOwnProperty("enum_set_string_values")) object.enum_set_string_values = message.enum_set_string_values; + if (message.is_internal_table != null && message.hasOwnProperty("is_internal_table")) + object.is_internal_table = message.is_internal_table; return object; }; @@ -79683,6 +89474,7 @@ export const binlogdata = $root.binlogdata = (() => { * @property {string|null} [keyspace] VEvent keyspace * @property {string|null} [shard] VEvent shard * @property {boolean|null} [throttled] VEvent throttled + * @property {string|null} [throttled_reason] VEvent throttled_reason */ /** @@ -79812,6 +89604,14 @@ export const binlogdata = $root.binlogdata = (() => { */ VEvent.prototype.throttled = false; + /** + * VEvent throttled_reason. + * @member {string} throttled_reason + * @memberof binlogdata.VEvent + * @instance + */ + VEvent.prototype.throttled_reason = ""; + /** * Creates a new VEvent instance using the specified properties. * @function create @@ -79864,6 +89664,8 @@ export const binlogdata = $root.binlogdata = (() => { writer.uint32(/* id 23, wireType 2 =*/186).string(message.shard); if (message.throttled != null && Object.hasOwnProperty.call(message, "throttled")) writer.uint32(/* id 24, wireType 0 =*/192).bool(message.throttled); + if (message.throttled_reason != null && Object.hasOwnProperty.call(message, "throttled_reason")) + writer.uint32(/* id 25, wireType 2 =*/202).string(message.throttled_reason); return writer; }; @@ -79954,6 +89756,10 @@ export const binlogdata = $root.binlogdata = (() => { message.throttled = reader.bool(); break; } + case 25: { + message.throttled_reason = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -80065,6 +89871,9 @@ export const binlogdata = $root.binlogdata = (() => { if (message.throttled != null && message.hasOwnProperty("throttled")) if (typeof message.throttled !== "boolean") return "throttled: boolean expected"; + if (message.throttled_reason != null && message.hasOwnProperty("throttled_reason")) + if (!$util.isString(message.throttled_reason)) + return "throttled_reason: string expected"; return null; }; @@ -80227,6 +90036,8 @@ export const binlogdata = $root.binlogdata = (() => { message.shard = String(object.shard); if (object.throttled != null) message.throttled = Boolean(object.throttled); + if (object.throttled_reason != null) + message.throttled_reason = String(object.throttled_reason); return message; }; @@ -80266,6 +90077,7 @@ export const binlogdata = $root.binlogdata = (() => { object.keyspace = ""; object.shard = ""; object.throttled = false; + object.throttled_reason = ""; } if (message.type != null && message.hasOwnProperty("type")) object.type = options.enums === String ? $root.binlogdata.VEventType[message.type] === undefined ? message.type : $root.binlogdata.VEventType[message.type] : message.type; @@ -80301,6 +90113,8 @@ export const binlogdata = $root.binlogdata = (() => { object.shard = message.shard; if (message.throttled != null && message.hasOwnProperty("throttled")) object.throttled = message.throttled; + if (message.throttled_reason != null && message.hasOwnProperty("throttled_reason")) + object.throttled_reason = message.throttled_reason; return object; }; @@ -80887,6 +90701,284 @@ export const binlogdata = $root.binlogdata = (() => { return MinimalSchema; })(); + binlogdata.VStreamOptions = (function() { + + /** + * Properties of a VStreamOptions. + * @memberof binlogdata + * @interface IVStreamOptions + * @property {Array.|null} [internal_tables] VStreamOptions internal_tables + * @property {Object.|null} [config_overrides] VStreamOptions config_overrides + */ + + /** + * Constructs a new VStreamOptions. + * @memberof binlogdata + * @classdesc Represents a VStreamOptions. + * @implements IVStreamOptions + * @constructor + * @param {binlogdata.IVStreamOptions=} [properties] Properties to set + */ + function VStreamOptions(properties) { + this.internal_tables = []; + this.config_overrides = {}; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * VStreamOptions internal_tables. + * @member {Array.} internal_tables + * @memberof binlogdata.VStreamOptions + * @instance + */ + VStreamOptions.prototype.internal_tables = $util.emptyArray; + + /** + * VStreamOptions config_overrides. + * @member {Object.} config_overrides + * @memberof binlogdata.VStreamOptions + * @instance + */ + VStreamOptions.prototype.config_overrides = $util.emptyObject; + + /** + * Creates a new VStreamOptions instance using the specified properties. + * @function create + * @memberof binlogdata.VStreamOptions + * @static + * @param {binlogdata.IVStreamOptions=} [properties] Properties to set + * @returns {binlogdata.VStreamOptions} VStreamOptions instance + */ + VStreamOptions.create = function create(properties) { + return new VStreamOptions(properties); + }; + + /** + * Encodes the specified VStreamOptions message. Does not implicitly {@link binlogdata.VStreamOptions.verify|verify} messages. + * @function encode + * @memberof binlogdata.VStreamOptions + * @static + * @param {binlogdata.IVStreamOptions} message VStreamOptions message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VStreamOptions.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.internal_tables != null && message.internal_tables.length) + for (let i = 0; i < message.internal_tables.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.internal_tables[i]); + if (message.config_overrides != null && Object.hasOwnProperty.call(message, "config_overrides")) + for (let keys = Object.keys(message.config_overrides), i = 0; i < keys.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.config_overrides[keys[i]]).ldelim(); + return writer; + }; + + /** + * Encodes the specified VStreamOptions message, length delimited. Does not implicitly {@link binlogdata.VStreamOptions.verify|verify} messages. + * @function encodeDelimited + * @memberof binlogdata.VStreamOptions + * @static + * @param {binlogdata.IVStreamOptions} message VStreamOptions message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VStreamOptions.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a VStreamOptions message from the specified reader or buffer. + * @function decode + * @memberof binlogdata.VStreamOptions + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {binlogdata.VStreamOptions} VStreamOptions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VStreamOptions.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.binlogdata.VStreamOptions(), key, value; + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (!(message.internal_tables && message.internal_tables.length)) + message.internal_tables = []; + message.internal_tables.push(reader.string()); + break; + } + case 2: { + if (message.config_overrides === $util.emptyObject) + message.config_overrides = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.config_overrides[key] = value; + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a VStreamOptions message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof binlogdata.VStreamOptions + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {binlogdata.VStreamOptions} VStreamOptions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VStreamOptions.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a VStreamOptions message. + * @function verify + * @memberof binlogdata.VStreamOptions + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + VStreamOptions.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.internal_tables != null && message.hasOwnProperty("internal_tables")) { + if (!Array.isArray(message.internal_tables)) + return "internal_tables: array expected"; + for (let i = 0; i < message.internal_tables.length; ++i) + if (!$util.isString(message.internal_tables[i])) + return "internal_tables: string[] expected"; + } + if (message.config_overrides != null && message.hasOwnProperty("config_overrides")) { + if (!$util.isObject(message.config_overrides)) + return "config_overrides: object expected"; + let key = Object.keys(message.config_overrides); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.config_overrides[key[i]])) + return "config_overrides: string{k:string} expected"; + } + return null; + }; + + /** + * Creates a VStreamOptions message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof binlogdata.VStreamOptions + * @static + * @param {Object.} object Plain object + * @returns {binlogdata.VStreamOptions} VStreamOptions + */ + VStreamOptions.fromObject = function fromObject(object) { + if (object instanceof $root.binlogdata.VStreamOptions) + return object; + let message = new $root.binlogdata.VStreamOptions(); + if (object.internal_tables) { + if (!Array.isArray(object.internal_tables)) + throw TypeError(".binlogdata.VStreamOptions.internal_tables: array expected"); + message.internal_tables = []; + for (let i = 0; i < object.internal_tables.length; ++i) + message.internal_tables[i] = String(object.internal_tables[i]); + } + if (object.config_overrides) { + if (typeof object.config_overrides !== "object") + throw TypeError(".binlogdata.VStreamOptions.config_overrides: object expected"); + message.config_overrides = {}; + for (let keys = Object.keys(object.config_overrides), i = 0; i < keys.length; ++i) + message.config_overrides[keys[i]] = String(object.config_overrides[keys[i]]); + } + return message; + }; + + /** + * Creates a plain object from a VStreamOptions message. Also converts values to other types if specified. + * @function toObject + * @memberof binlogdata.VStreamOptions + * @static + * @param {binlogdata.VStreamOptions} message VStreamOptions + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + VStreamOptions.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.internal_tables = []; + if (options.objects || options.defaults) + object.config_overrides = {}; + if (message.internal_tables && message.internal_tables.length) { + object.internal_tables = []; + for (let j = 0; j < message.internal_tables.length; ++j) + object.internal_tables[j] = message.internal_tables[j]; + } + let keys2; + if (message.config_overrides && (keys2 = Object.keys(message.config_overrides)).length) { + object.config_overrides = {}; + for (let j = 0; j < keys2.length; ++j) + object.config_overrides[keys2[j]] = message.config_overrides[keys2[j]]; + } + return object; + }; + + /** + * Converts this VStreamOptions to JSON. + * @function toJSON + * @memberof binlogdata.VStreamOptions + * @instance + * @returns {Object.} JSON object + */ + VStreamOptions.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for VStreamOptions + * @function getTypeUrl + * @memberof binlogdata.VStreamOptions + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + VStreamOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/binlogdata.VStreamOptions"; + }; + + return VStreamOptions; + })(); + binlogdata.VStreamRequest = (function() { /** @@ -80899,6 +90991,7 @@ export const binlogdata = $root.binlogdata = (() => { * @property {string|null} [position] VStreamRequest position * @property {binlogdata.IFilter|null} [filter] VStreamRequest filter * @property {Array.|null} [table_last_p_ks] VStreamRequest table_last_p_ks + * @property {binlogdata.IVStreamOptions|null} [options] VStreamRequest options */ /** @@ -80965,6 +91058,14 @@ export const binlogdata = $root.binlogdata = (() => { */ VStreamRequest.prototype.table_last_p_ks = $util.emptyArray; + /** + * VStreamRequest options. + * @member {binlogdata.IVStreamOptions|null|undefined} options + * @memberof binlogdata.VStreamRequest + * @instance + */ + VStreamRequest.prototype.options = null; + /** * Creates a new VStreamRequest instance using the specified properties. * @function create @@ -81002,6 +91103,8 @@ export const binlogdata = $root.binlogdata = (() => { if (message.table_last_p_ks != null && message.table_last_p_ks.length) for (let i = 0; i < message.table_last_p_ks.length; ++i) $root.binlogdata.TableLastPK.encode(message.table_last_p_ks[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.options != null && Object.hasOwnProperty.call(message, "options")) + $root.binlogdata.VStreamOptions.encode(message.options, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); return writer; }; @@ -81062,6 +91165,10 @@ export const binlogdata = $root.binlogdata = (() => { message.table_last_p_ks.push($root.binlogdata.TableLastPK.decode(reader, reader.uint32())); break; } + case 7: { + message.options = $root.binlogdata.VStreamOptions.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -81129,6 +91236,11 @@ export const binlogdata = $root.binlogdata = (() => { return "table_last_p_ks." + error; } } + if (message.options != null && message.hasOwnProperty("options")) { + let error = $root.binlogdata.VStreamOptions.verify(message.options); + if (error) + return "options." + error; + } return null; }; @@ -81176,6 +91288,11 @@ export const binlogdata = $root.binlogdata = (() => { message.table_last_p_ks[i] = $root.binlogdata.TableLastPK.fromObject(object.table_last_p_ks[i]); } } + if (object.options != null) { + if (typeof object.options !== "object") + throw TypeError(".binlogdata.VStreamRequest.options: object expected"); + message.options = $root.binlogdata.VStreamOptions.fromObject(object.options); + } return message; }; @@ -81200,6 +91317,7 @@ export const binlogdata = $root.binlogdata = (() => { object.target = null; object.position = ""; object.filter = null; + object.options = null; } if (message.effective_caller_id != null && message.hasOwnProperty("effective_caller_id")) object.effective_caller_id = $root.vtrpc.CallerID.toObject(message.effective_caller_id, options); @@ -81216,6 +91334,8 @@ export const binlogdata = $root.binlogdata = (() => { for (let j = 0; j < message.table_last_p_ks.length; ++j) object.table_last_p_ks[j] = $root.binlogdata.TableLastPK.toObject(message.table_last_p_ks[j], options); } + if (message.options != null && message.hasOwnProperty("options")) + object.options = $root.binlogdata.VStreamOptions.toObject(message.options, options); return object; }; @@ -81483,6 +91603,7 @@ export const binlogdata = $root.binlogdata = (() => { * @property {query.ITarget|null} [target] VStreamRowsRequest target * @property {string|null} [query] VStreamRowsRequest query * @property {query.IQueryResult|null} [lastpk] VStreamRowsRequest lastpk + * @property {binlogdata.IVStreamOptions|null} [options] VStreamRowsRequest options */ /** @@ -81540,6 +91661,14 @@ export const binlogdata = $root.binlogdata = (() => { */ VStreamRowsRequest.prototype.lastpk = null; + /** + * VStreamRowsRequest options. + * @member {binlogdata.IVStreamOptions|null|undefined} options + * @memberof binlogdata.VStreamRowsRequest + * @instance + */ + VStreamRowsRequest.prototype.options = null; + /** * Creates a new VStreamRowsRequest instance using the specified properties. * @function create @@ -81574,6 +91703,8 @@ export const binlogdata = $root.binlogdata = (() => { writer.uint32(/* id 4, wireType 2 =*/34).string(message.query); if (message.lastpk != null && Object.hasOwnProperty.call(message, "lastpk")) $root.query.QueryResult.encode(message.lastpk, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.options != null && Object.hasOwnProperty.call(message, "options")) + $root.binlogdata.VStreamOptions.encode(message.options, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); return writer; }; @@ -81628,6 +91759,10 @@ export const binlogdata = $root.binlogdata = (() => { message.lastpk = $root.query.QueryResult.decode(reader, reader.uint32()); break; } + case 6: { + message.options = $root.binlogdata.VStreamOptions.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -81686,6 +91821,11 @@ export const binlogdata = $root.binlogdata = (() => { if (error) return "lastpk." + error; } + if (message.options != null && message.hasOwnProperty("options")) { + let error = $root.binlogdata.VStreamOptions.verify(message.options); + if (error) + return "options." + error; + } return null; }; @@ -81723,6 +91863,11 @@ export const binlogdata = $root.binlogdata = (() => { throw TypeError(".binlogdata.VStreamRowsRequest.lastpk: object expected"); message.lastpk = $root.query.QueryResult.fromObject(object.lastpk); } + if (object.options != null) { + if (typeof object.options !== "object") + throw TypeError(".binlogdata.VStreamRowsRequest.options: object expected"); + message.options = $root.binlogdata.VStreamOptions.fromObject(object.options); + } return message; }; @@ -81745,6 +91890,7 @@ export const binlogdata = $root.binlogdata = (() => { object.target = null; object.query = ""; object.lastpk = null; + object.options = null; } if (message.effective_caller_id != null && message.hasOwnProperty("effective_caller_id")) object.effective_caller_id = $root.vtrpc.CallerID.toObject(message.effective_caller_id, options); @@ -81756,6 +91902,8 @@ export const binlogdata = $root.binlogdata = (() => { object.query = message.query; if (message.lastpk != null && message.hasOwnProperty("lastpk")) object.lastpk = $root.query.QueryResult.toObject(message.lastpk, options); + if (message.options != null && message.hasOwnProperty("options")) + object.options = $root.binlogdata.VStreamOptions.toObject(message.options, options); return object; }; @@ -81801,6 +91949,7 @@ export const binlogdata = $root.binlogdata = (() => { * @property {query.IRow|null} [lastpk] VStreamRowsResponse lastpk * @property {boolean|null} [throttled] VStreamRowsResponse throttled * @property {boolean|null} [heartbeat] VStreamRowsResponse heartbeat + * @property {string|null} [throttled_reason] VStreamRowsResponse throttled_reason */ /** @@ -81877,6 +92026,14 @@ export const binlogdata = $root.binlogdata = (() => { */ VStreamRowsResponse.prototype.heartbeat = false; + /** + * VStreamRowsResponse throttled_reason. + * @member {string} throttled_reason + * @memberof binlogdata.VStreamRowsResponse + * @instance + */ + VStreamRowsResponse.prototype.throttled_reason = ""; + /** * Creates a new VStreamRowsResponse instance using the specified properties. * @function create @@ -81918,6 +92075,8 @@ export const binlogdata = $root.binlogdata = (() => { writer.uint32(/* id 6, wireType 0 =*/48).bool(message.throttled); if (message.heartbeat != null && Object.hasOwnProperty.call(message, "heartbeat")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.heartbeat); + if (message.throttled_reason != null && Object.hasOwnProperty.call(message, "throttled_reason")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.throttled_reason); return writer; }; @@ -81986,6 +92145,10 @@ export const binlogdata = $root.binlogdata = (() => { message.heartbeat = reader.bool(); break; } + case 8: { + message.throttled_reason = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -82062,6 +92225,9 @@ export const binlogdata = $root.binlogdata = (() => { if (message.heartbeat != null && message.hasOwnProperty("heartbeat")) if (typeof message.heartbeat !== "boolean") return "heartbeat: boolean expected"; + if (message.throttled_reason != null && message.hasOwnProperty("throttled_reason")) + if (!$util.isString(message.throttled_reason)) + return "throttled_reason: string expected"; return null; }; @@ -82118,6 +92284,8 @@ export const binlogdata = $root.binlogdata = (() => { message.throttled = Boolean(object.throttled); if (object.heartbeat != null) message.heartbeat = Boolean(object.heartbeat); + if (object.throttled_reason != null) + message.throttled_reason = String(object.throttled_reason); return message; }; @@ -82144,6 +92312,7 @@ export const binlogdata = $root.binlogdata = (() => { object.lastpk = null; object.throttled = false; object.heartbeat = false; + object.throttled_reason = ""; } if (message.fields && message.fields.length) { object.fields = []; @@ -82168,6 +92337,8 @@ export const binlogdata = $root.binlogdata = (() => { object.throttled = message.throttled; if (message.heartbeat != null && message.hasOwnProperty("heartbeat")) object.heartbeat = message.heartbeat; + if (message.throttled_reason != null && message.hasOwnProperty("throttled_reason")) + object.throttled_reason = message.throttled_reason; return object; }; @@ -82209,6 +92380,7 @@ export const binlogdata = $root.binlogdata = (() => { * @property {vtrpc.ICallerID|null} [effective_caller_id] VStreamTablesRequest effective_caller_id * @property {query.IVTGateCallerID|null} [immediate_caller_id] VStreamTablesRequest immediate_caller_id * @property {query.ITarget|null} [target] VStreamTablesRequest target + * @property {binlogdata.IVStreamOptions|null} [options] VStreamTablesRequest options */ /** @@ -82250,6 +92422,14 @@ export const binlogdata = $root.binlogdata = (() => { */ VStreamTablesRequest.prototype.target = null; + /** + * VStreamTablesRequest options. + * @member {binlogdata.IVStreamOptions|null|undefined} options + * @memberof binlogdata.VStreamTablesRequest + * @instance + */ + VStreamTablesRequest.prototype.options = null; + /** * Creates a new VStreamTablesRequest instance using the specified properties. * @function create @@ -82280,6 +92460,8 @@ export const binlogdata = $root.binlogdata = (() => { $root.query.VTGateCallerID.encode(message.immediate_caller_id, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.target != null && Object.hasOwnProperty.call(message, "target")) $root.query.Target.encode(message.target, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.options != null && Object.hasOwnProperty.call(message, "options")) + $root.binlogdata.VStreamOptions.encode(message.options, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); return writer; }; @@ -82326,6 +92508,10 @@ export const binlogdata = $root.binlogdata = (() => { message.target = $root.query.Target.decode(reader, reader.uint32()); break; } + case 4: { + message.options = $root.binlogdata.VStreamOptions.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -82376,6 +92562,11 @@ export const binlogdata = $root.binlogdata = (() => { if (error) return "target." + error; } + if (message.options != null && message.hasOwnProperty("options")) { + let error = $root.binlogdata.VStreamOptions.verify(message.options); + if (error) + return "options." + error; + } return null; }; @@ -82406,6 +92597,11 @@ export const binlogdata = $root.binlogdata = (() => { throw TypeError(".binlogdata.VStreamTablesRequest.target: object expected"); message.target = $root.query.Target.fromObject(object.target); } + if (object.options != null) { + if (typeof object.options !== "object") + throw TypeError(".binlogdata.VStreamTablesRequest.options: object expected"); + message.options = $root.binlogdata.VStreamOptions.fromObject(object.options); + } return message; }; @@ -82426,6 +92622,7 @@ export const binlogdata = $root.binlogdata = (() => { object.effective_caller_id = null; object.immediate_caller_id = null; object.target = null; + object.options = null; } if (message.effective_caller_id != null && message.hasOwnProperty("effective_caller_id")) object.effective_caller_id = $root.vtrpc.CallerID.toObject(message.effective_caller_id, options); @@ -82433,6 +92630,8 @@ export const binlogdata = $root.binlogdata = (() => { object.immediate_caller_id = $root.query.VTGateCallerID.toObject(message.immediate_caller_id, options); if (message.target != null && message.hasOwnProperty("target")) object.target = $root.query.Target.toObject(message.target, options); + if (message.options != null && message.hasOwnProperty("options")) + object.options = $root.binlogdata.VStreamOptions.toObject(message.options, options); return object; }; @@ -83902,687 +94101,6 @@ export const binlogdata = $root.binlogdata = (() => { return binlogdata; })(); -export const vtrpc = $root.vtrpc = (() => { - - /** - * Namespace vtrpc. - * @exports vtrpc - * @namespace - */ - const vtrpc = {}; - - vtrpc.CallerID = (function() { - - /** - * Properties of a CallerID. - * @memberof vtrpc - * @interface ICallerID - * @property {string|null} [principal] CallerID principal - * @property {string|null} [component] CallerID component - * @property {string|null} [subcomponent] CallerID subcomponent - * @property {Array.|null} [groups] CallerID groups - */ - - /** - * Constructs a new CallerID. - * @memberof vtrpc - * @classdesc Represents a CallerID. - * @implements ICallerID - * @constructor - * @param {vtrpc.ICallerID=} [properties] Properties to set - */ - function CallerID(properties) { - this.groups = []; - if (properties) - for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * CallerID principal. - * @member {string} principal - * @memberof vtrpc.CallerID - * @instance - */ - CallerID.prototype.principal = ""; - - /** - * CallerID component. - * @member {string} component - * @memberof vtrpc.CallerID - * @instance - */ - CallerID.prototype.component = ""; - - /** - * CallerID subcomponent. - * @member {string} subcomponent - * @memberof vtrpc.CallerID - * @instance - */ - CallerID.prototype.subcomponent = ""; - - /** - * CallerID groups. - * @member {Array.} groups - * @memberof vtrpc.CallerID - * @instance - */ - CallerID.prototype.groups = $util.emptyArray; - - /** - * Creates a new CallerID instance using the specified properties. - * @function create - * @memberof vtrpc.CallerID - * @static - * @param {vtrpc.ICallerID=} [properties] Properties to set - * @returns {vtrpc.CallerID} CallerID instance - */ - CallerID.create = function create(properties) { - return new CallerID(properties); - }; - - /** - * Encodes the specified CallerID message. Does not implicitly {@link vtrpc.CallerID.verify|verify} messages. - * @function encode - * @memberof vtrpc.CallerID - * @static - * @param {vtrpc.ICallerID} message CallerID message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - CallerID.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.principal != null && Object.hasOwnProperty.call(message, "principal")) - writer.uint32(/* id 1, wireType 2 =*/10).string(message.principal); - if (message.component != null && Object.hasOwnProperty.call(message, "component")) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.component); - if (message.subcomponent != null && Object.hasOwnProperty.call(message, "subcomponent")) - writer.uint32(/* id 3, wireType 2 =*/26).string(message.subcomponent); - if (message.groups != null && message.groups.length) - for (let i = 0; i < message.groups.length; ++i) - writer.uint32(/* id 4, wireType 2 =*/34).string(message.groups[i]); - return writer; - }; - - /** - * Encodes the specified CallerID message, length delimited. Does not implicitly {@link vtrpc.CallerID.verify|verify} messages. - * @function encodeDelimited - * @memberof vtrpc.CallerID - * @static - * @param {vtrpc.ICallerID} message CallerID message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - CallerID.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a CallerID message from the specified reader or buffer. - * @function decode - * @memberof vtrpc.CallerID - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {vtrpc.CallerID} CallerID - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - CallerID.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtrpc.CallerID(); - while (reader.pos < end) { - let tag = reader.uint32(); - switch (tag >>> 3) { - case 1: { - message.principal = reader.string(); - break; - } - case 2: { - message.component = reader.string(); - break; - } - case 3: { - message.subcomponent = reader.string(); - break; - } - case 4: { - if (!(message.groups && message.groups.length)) - message.groups = []; - message.groups.push(reader.string()); - break; - } - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a CallerID message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof vtrpc.CallerID - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {vtrpc.CallerID} CallerID - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - CallerID.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a CallerID message. - * @function verify - * @memberof vtrpc.CallerID - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - CallerID.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.principal != null && message.hasOwnProperty("principal")) - if (!$util.isString(message.principal)) - return "principal: string expected"; - if (message.component != null && message.hasOwnProperty("component")) - if (!$util.isString(message.component)) - return "component: string expected"; - if (message.subcomponent != null && message.hasOwnProperty("subcomponent")) - if (!$util.isString(message.subcomponent)) - return "subcomponent: string expected"; - if (message.groups != null && message.hasOwnProperty("groups")) { - if (!Array.isArray(message.groups)) - return "groups: array expected"; - for (let i = 0; i < message.groups.length; ++i) - if (!$util.isString(message.groups[i])) - return "groups: string[] expected"; - } - return null; - }; - - /** - * Creates a CallerID message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof vtrpc.CallerID - * @static - * @param {Object.} object Plain object - * @returns {vtrpc.CallerID} CallerID - */ - CallerID.fromObject = function fromObject(object) { - if (object instanceof $root.vtrpc.CallerID) - return object; - let message = new $root.vtrpc.CallerID(); - if (object.principal != null) - message.principal = String(object.principal); - if (object.component != null) - message.component = String(object.component); - if (object.subcomponent != null) - message.subcomponent = String(object.subcomponent); - if (object.groups) { - if (!Array.isArray(object.groups)) - throw TypeError(".vtrpc.CallerID.groups: array expected"); - message.groups = []; - for (let i = 0; i < object.groups.length; ++i) - message.groups[i] = String(object.groups[i]); - } - return message; - }; - - /** - * Creates a plain object from a CallerID message. Also converts values to other types if specified. - * @function toObject - * @memberof vtrpc.CallerID - * @static - * @param {vtrpc.CallerID} message CallerID - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - CallerID.toObject = function toObject(message, options) { - if (!options) - options = {}; - let object = {}; - if (options.arrays || options.defaults) - object.groups = []; - if (options.defaults) { - object.principal = ""; - object.component = ""; - object.subcomponent = ""; - } - if (message.principal != null && message.hasOwnProperty("principal")) - object.principal = message.principal; - if (message.component != null && message.hasOwnProperty("component")) - object.component = message.component; - if (message.subcomponent != null && message.hasOwnProperty("subcomponent")) - object.subcomponent = message.subcomponent; - if (message.groups && message.groups.length) { - object.groups = []; - for (let j = 0; j < message.groups.length; ++j) - object.groups[j] = message.groups[j]; - } - return object; - }; - - /** - * Converts this CallerID to JSON. - * @function toJSON - * @memberof vtrpc.CallerID - * @instance - * @returns {Object.} JSON object - */ - CallerID.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - /** - * Gets the default type url for CallerID - * @function getTypeUrl - * @memberof vtrpc.CallerID - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - CallerID.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/vtrpc.CallerID"; - }; - - return CallerID; - })(); - - /** - * Code enum. - * @name vtrpc.Code - * @enum {number} - * @property {number} OK=0 OK value - * @property {number} CANCELED=1 CANCELED value - * @property {number} UNKNOWN=2 UNKNOWN value - * @property {number} INVALID_ARGUMENT=3 INVALID_ARGUMENT value - * @property {number} DEADLINE_EXCEEDED=4 DEADLINE_EXCEEDED value - * @property {number} NOT_FOUND=5 NOT_FOUND value - * @property {number} ALREADY_EXISTS=6 ALREADY_EXISTS value - * @property {number} PERMISSION_DENIED=7 PERMISSION_DENIED value - * @property {number} RESOURCE_EXHAUSTED=8 RESOURCE_EXHAUSTED value - * @property {number} FAILED_PRECONDITION=9 FAILED_PRECONDITION value - * @property {number} ABORTED=10 ABORTED value - * @property {number} OUT_OF_RANGE=11 OUT_OF_RANGE value - * @property {number} UNIMPLEMENTED=12 UNIMPLEMENTED value - * @property {number} INTERNAL=13 INTERNAL value - * @property {number} UNAVAILABLE=14 UNAVAILABLE value - * @property {number} DATA_LOSS=15 DATA_LOSS value - * @property {number} UNAUTHENTICATED=16 UNAUTHENTICATED value - * @property {number} CLUSTER_EVENT=17 CLUSTER_EVENT value - * @property {number} READ_ONLY=18 READ_ONLY value - */ - vtrpc.Code = (function() { - const valuesById = {}, values = Object.create(valuesById); - values[valuesById[0] = "OK"] = 0; - values[valuesById[1] = "CANCELED"] = 1; - values[valuesById[2] = "UNKNOWN"] = 2; - values[valuesById[3] = "INVALID_ARGUMENT"] = 3; - values[valuesById[4] = "DEADLINE_EXCEEDED"] = 4; - values[valuesById[5] = "NOT_FOUND"] = 5; - values[valuesById[6] = "ALREADY_EXISTS"] = 6; - values[valuesById[7] = "PERMISSION_DENIED"] = 7; - values[valuesById[8] = "RESOURCE_EXHAUSTED"] = 8; - values[valuesById[9] = "FAILED_PRECONDITION"] = 9; - values[valuesById[10] = "ABORTED"] = 10; - values[valuesById[11] = "OUT_OF_RANGE"] = 11; - values[valuesById[12] = "UNIMPLEMENTED"] = 12; - values[valuesById[13] = "INTERNAL"] = 13; - values[valuesById[14] = "UNAVAILABLE"] = 14; - values[valuesById[15] = "DATA_LOSS"] = 15; - values[valuesById[16] = "UNAUTHENTICATED"] = 16; - values[valuesById[17] = "CLUSTER_EVENT"] = 17; - values[valuesById[18] = "READ_ONLY"] = 18; - return values; - })(); - - vtrpc.RPCError = (function() { - - /** - * Properties of a RPCError. - * @memberof vtrpc - * @interface IRPCError - * @property {string|null} [message] RPCError message - * @property {vtrpc.Code|null} [code] RPCError code - */ - - /** - * Constructs a new RPCError. - * @memberof vtrpc - * @classdesc Represents a RPCError. - * @implements IRPCError - * @constructor - * @param {vtrpc.IRPCError=} [properties] Properties to set - */ - function RPCError(properties) { - if (properties) - for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * RPCError message. - * @member {string} message - * @memberof vtrpc.RPCError - * @instance - */ - RPCError.prototype.message = ""; - - /** - * RPCError code. - * @member {vtrpc.Code} code - * @memberof vtrpc.RPCError - * @instance - */ - RPCError.prototype.code = 0; - - /** - * Creates a new RPCError instance using the specified properties. - * @function create - * @memberof vtrpc.RPCError - * @static - * @param {vtrpc.IRPCError=} [properties] Properties to set - * @returns {vtrpc.RPCError} RPCError instance - */ - RPCError.create = function create(properties) { - return new RPCError(properties); - }; - - /** - * Encodes the specified RPCError message. Does not implicitly {@link vtrpc.RPCError.verify|verify} messages. - * @function encode - * @memberof vtrpc.RPCError - * @static - * @param {vtrpc.IRPCError} message RPCError message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - RPCError.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.message != null && Object.hasOwnProperty.call(message, "message")) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.message); - if (message.code != null && Object.hasOwnProperty.call(message, "code")) - writer.uint32(/* id 3, wireType 0 =*/24).int32(message.code); - return writer; - }; - - /** - * Encodes the specified RPCError message, length delimited. Does not implicitly {@link vtrpc.RPCError.verify|verify} messages. - * @function encodeDelimited - * @memberof vtrpc.RPCError - * @static - * @param {vtrpc.IRPCError} message RPCError message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - RPCError.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a RPCError message from the specified reader or buffer. - * @function decode - * @memberof vtrpc.RPCError - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {vtrpc.RPCError} RPCError - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - RPCError.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtrpc.RPCError(); - while (reader.pos < end) { - let tag = reader.uint32(); - switch (tag >>> 3) { - case 2: { - message.message = reader.string(); - break; - } - case 3: { - message.code = reader.int32(); - break; - } - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a RPCError message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof vtrpc.RPCError - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {vtrpc.RPCError} RPCError - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - RPCError.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a RPCError message. - * @function verify - * @memberof vtrpc.RPCError - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - RPCError.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.message != null && message.hasOwnProperty("message")) - if (!$util.isString(message.message)) - return "message: string expected"; - if (message.code != null && message.hasOwnProperty("code")) - switch (message.code) { - default: - return "code: enum value expected"; - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - break; - } - return null; - }; - - /** - * Creates a RPCError message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof vtrpc.RPCError - * @static - * @param {Object.} object Plain object - * @returns {vtrpc.RPCError} RPCError - */ - RPCError.fromObject = function fromObject(object) { - if (object instanceof $root.vtrpc.RPCError) - return object; - let message = new $root.vtrpc.RPCError(); - if (object.message != null) - message.message = String(object.message); - switch (object.code) { - default: - if (typeof object.code === "number") { - message.code = object.code; - break; - } - break; - case "OK": - case 0: - message.code = 0; - break; - case "CANCELED": - case 1: - message.code = 1; - break; - case "UNKNOWN": - case 2: - message.code = 2; - break; - case "INVALID_ARGUMENT": - case 3: - message.code = 3; - break; - case "DEADLINE_EXCEEDED": - case 4: - message.code = 4; - break; - case "NOT_FOUND": - case 5: - message.code = 5; - break; - case "ALREADY_EXISTS": - case 6: - message.code = 6; - break; - case "PERMISSION_DENIED": - case 7: - message.code = 7; - break; - case "RESOURCE_EXHAUSTED": - case 8: - message.code = 8; - break; - case "FAILED_PRECONDITION": - case 9: - message.code = 9; - break; - case "ABORTED": - case 10: - message.code = 10; - break; - case "OUT_OF_RANGE": - case 11: - message.code = 11; - break; - case "UNIMPLEMENTED": - case 12: - message.code = 12; - break; - case "INTERNAL": - case 13: - message.code = 13; - break; - case "UNAVAILABLE": - case 14: - message.code = 14; - break; - case "DATA_LOSS": - case 15: - message.code = 15; - break; - case "UNAUTHENTICATED": - case 16: - message.code = 16; - break; - case "CLUSTER_EVENT": - case 17: - message.code = 17; - break; - case "READ_ONLY": - case 18: - message.code = 18; - break; - } - return message; - }; - - /** - * Creates a plain object from a RPCError message. Also converts values to other types if specified. - * @function toObject - * @memberof vtrpc.RPCError - * @static - * @param {vtrpc.RPCError} message RPCError - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - RPCError.toObject = function toObject(message, options) { - if (!options) - options = {}; - let object = {}; - if (options.defaults) { - object.message = ""; - object.code = options.enums === String ? "OK" : 0; - } - if (message.message != null && message.hasOwnProperty("message")) - object.message = message.message; - if (message.code != null && message.hasOwnProperty("code")) - object.code = options.enums === String ? $root.vtrpc.Code[message.code] === undefined ? message.code : $root.vtrpc.Code[message.code] : message.code; - return object; - }; - - /** - * Converts this RPCError to JSON. - * @function toJSON - * @memberof vtrpc.RPCError - * @instance - * @returns {Object.} JSON object - */ - RPCError.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - /** - * Gets the default type url for RPCError - * @function getTypeUrl - * @memberof vtrpc.RPCError - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - RPCError.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/vtrpc.RPCError"; - }; - - return RPCError; - })(); - - return vtrpc; -})(); - export const query = $root.query = (() => { /** @@ -85549,6 +95067,8 @@ export const query = $root.query = (() => { * @property {number} HEXNUM=4128 HEXNUM value * @property {number} HEXVAL=4129 HEXVAL value * @property {number} BITNUM=4130 BITNUM value + * @property {number} VECTOR=2083 VECTOR value + * @property {number} RAW=2084 RAW value */ query.Type = (function() { const valuesById = {}, values = Object.create(valuesById); @@ -85587,6 +95107,8 @@ export const query = $root.query = (() => { values[valuesById[4128] = "HEXNUM"] = 4128; values[valuesById[4129] = "HEXVAL"] = 4129; values[valuesById[4130] = "BITNUM"] = 4130; + values[valuesById[2083] = "VECTOR"] = 2083; + values[valuesById[2084] = "RAW"] = 2084; return values; })(); @@ -85775,6 +95297,8 @@ export const query = $root.query = (() => { case 4128: case 4129: case 4130: + case 2083: + case 2084: break; } if (message.value != null && message.hasOwnProperty("value")) @@ -85942,453 +95466,471 @@ export const query = $root.query = (() => { case 4130: message.type = 4130; break; - } - if (object.value != null) - if (typeof object.value === "string") - $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0); - else if (object.value.length >= 0) - message.value = object.value; - return message; - }; - - /** - * Creates a plain object from a Value message. Also converts values to other types if specified. - * @function toObject - * @memberof query.Value - * @static - * @param {query.Value} message Value - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - Value.toObject = function toObject(message, options) { - if (!options) - options = {}; - let object = {}; - if (options.defaults) { - object.type = options.enums === String ? "NULL_TYPE" : 0; - if (options.bytes === String) - object.value = ""; - else { - object.value = []; - if (options.bytes !== Array) - object.value = $util.newBuffer(object.value); - } - } - if (message.type != null && message.hasOwnProperty("type")) - object.type = options.enums === String ? $root.query.Type[message.type] === undefined ? message.type : $root.query.Type[message.type] : message.type; - if (message.value != null && message.hasOwnProperty("value")) - object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value; - return object; - }; - - /** - * Converts this Value to JSON. - * @function toJSON - * @memberof query.Value - * @instance - * @returns {Object.} JSON object - */ - Value.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - /** - * Gets the default type url for Value - * @function getTypeUrl - * @memberof query.Value - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/query.Value"; - }; - - return Value; - })(); - - query.BindVariable = (function() { - - /** - * Properties of a BindVariable. - * @memberof query - * @interface IBindVariable - * @property {query.Type|null} [type] BindVariable type - * @property {Uint8Array|null} [value] BindVariable value - * @property {Array.|null} [values] BindVariable values - */ - - /** - * Constructs a new BindVariable. - * @memberof query - * @classdesc Represents a BindVariable. - * @implements IBindVariable - * @constructor - * @param {query.IBindVariable=} [properties] Properties to set - */ - function BindVariable(properties) { - this.values = []; - if (properties) - for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * BindVariable type. - * @member {query.Type} type - * @memberof query.BindVariable - * @instance - */ - BindVariable.prototype.type = 0; - - /** - * BindVariable value. - * @member {Uint8Array} value - * @memberof query.BindVariable - * @instance - */ - BindVariable.prototype.value = $util.newBuffer([]); - - /** - * BindVariable values. - * @member {Array.} values - * @memberof query.BindVariable - * @instance - */ - BindVariable.prototype.values = $util.emptyArray; - - /** - * Creates a new BindVariable instance using the specified properties. - * @function create - * @memberof query.BindVariable - * @static - * @param {query.IBindVariable=} [properties] Properties to set - * @returns {query.BindVariable} BindVariable instance - */ - BindVariable.create = function create(properties) { - return new BindVariable(properties); - }; - - /** - * Encodes the specified BindVariable message. Does not implicitly {@link query.BindVariable.verify|verify} messages. - * @function encode - * @memberof query.BindVariable - * @static - * @param {query.IBindVariable} message BindVariable message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - BindVariable.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.type != null && Object.hasOwnProperty.call(message, "type")) - writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); - if (message.value != null && Object.hasOwnProperty.call(message, "value")) - writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.value); - if (message.values != null && message.values.length) - for (let i = 0; i < message.values.length; ++i) - $root.query.Value.encode(message.values[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified BindVariable message, length delimited. Does not implicitly {@link query.BindVariable.verify|verify} messages. - * @function encodeDelimited - * @memberof query.BindVariable - * @static - * @param {query.IBindVariable} message BindVariable message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - BindVariable.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a BindVariable message from the specified reader or buffer. - * @function decode - * @memberof query.BindVariable - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {query.BindVariable} BindVariable - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - BindVariable.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.query.BindVariable(); - while (reader.pos < end) { - let tag = reader.uint32(); - switch (tag >>> 3) { - case 1: { - message.type = reader.int32(); - break; - } - case 2: { - message.value = reader.bytes(); - break; - } - case 3: { - if (!(message.values && message.values.length)) - message.values = []; - message.values.push($root.query.Value.decode(reader, reader.uint32())); - break; - } - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a BindVariable message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof query.BindVariable - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {query.BindVariable} BindVariable - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - BindVariable.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a BindVariable message. - * @function verify - * @memberof query.BindVariable - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - BindVariable.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.type != null && message.hasOwnProperty("type")) - switch (message.type) { - default: - return "type: enum value expected"; - case 0: - case 257: - case 770: - case 259: - case 772: - case 261: - case 774: - case 263: - case 776: - case 265: - case 778: - case 1035: - case 1036: - case 2061: - case 2062: - case 2063: - case 2064: - case 785: - case 18: - case 6163: - case 10260: - case 6165: - case 10262: - case 6167: - case 10264: - case 2073: - case 2074: - case 2075: - case 28: - case 2077: - case 2078: - case 31: - case 4128: - case 4129: - case 4130: - break; - } - if (message.value != null && message.hasOwnProperty("value")) - if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value))) - return "value: buffer expected"; - if (message.values != null && message.hasOwnProperty("values")) { - if (!Array.isArray(message.values)) - return "values: array expected"; - for (let i = 0; i < message.values.length; ++i) { - let error = $root.query.Value.verify(message.values[i]); - if (error) - return "values." + error; - } - } - return null; - }; - - /** - * Creates a BindVariable message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof query.BindVariable - * @static - * @param {Object.} object Plain object - * @returns {query.BindVariable} BindVariable - */ - BindVariable.fromObject = function fromObject(object) { - if (object instanceof $root.query.BindVariable) - return object; - let message = new $root.query.BindVariable(); - switch (object.type) { - default: - if (typeof object.type === "number") { - message.type = object.type; - break; - } - break; - case "NULL_TYPE": - case 0: - message.type = 0; - break; - case "INT8": - case 257: - message.type = 257; - break; - case "UINT8": - case 770: - message.type = 770; - break; - case "INT16": - case 259: - message.type = 259; - break; - case "UINT16": - case 772: - message.type = 772; - break; - case "INT24": - case 261: - message.type = 261; - break; - case "UINT24": - case 774: - message.type = 774; - break; - case "INT32": - case 263: - message.type = 263; - break; - case "UINT32": - case 776: - message.type = 776; - break; - case "INT64": - case 265: - message.type = 265; - break; - case "UINT64": - case 778: - message.type = 778; - break; - case "FLOAT32": - case 1035: - message.type = 1035; - break; - case "FLOAT64": - case 1036: - message.type = 1036; - break; - case "TIMESTAMP": - case 2061: - message.type = 2061; - break; - case "DATE": - case 2062: - message.type = 2062; - break; - case "TIME": - case 2063: - message.type = 2063; - break; - case "DATETIME": - case 2064: - message.type = 2064; - break; - case "YEAR": - case 785: - message.type = 785; - break; - case "DECIMAL": - case 18: - message.type = 18; - break; - case "TEXT": - case 6163: - message.type = 6163; - break; - case "BLOB": - case 10260: - message.type = 10260; - break; - case "VARCHAR": - case 6165: - message.type = 6165; - break; - case "VARBINARY": - case 10262: - message.type = 10262; - break; - case "CHAR": - case 6167: - message.type = 6167; - break; - case "BINARY": - case 10264: - message.type = 10264; - break; - case "BIT": - case 2073: - message.type = 2073; - break; - case "ENUM": - case 2074: - message.type = 2074; - break; - case "SET": - case 2075: - message.type = 2075; - break; - case "TUPLE": - case 28: - message.type = 28; - break; - case "GEOMETRY": - case 2077: - message.type = 2077; - break; - case "JSON": - case 2078: - message.type = 2078; - break; - case "EXPRESSION": - case 31: - message.type = 31; - break; - case "HEXNUM": - case 4128: - message.type = 4128; - break; - case "HEXVAL": - case 4129: - message.type = 4129; + case "VECTOR": + case 2083: + message.type = 2083; + break; + case "RAW": + case 2084: + message.type = 2084; + break; + } + if (object.value != null) + if (typeof object.value === "string") + $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0); + else if (object.value.length >= 0) + message.value = object.value; + return message; + }; + + /** + * Creates a plain object from a Value message. Also converts values to other types if specified. + * @function toObject + * @memberof query.Value + * @static + * @param {query.Value} message Value + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Value.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.type = options.enums === String ? "NULL_TYPE" : 0; + if (options.bytes === String) + object.value = ""; + else { + object.value = []; + if (options.bytes !== Array) + object.value = $util.newBuffer(object.value); + } + } + if (message.type != null && message.hasOwnProperty("type")) + object.type = options.enums === String ? $root.query.Type[message.type] === undefined ? message.type : $root.query.Type[message.type] : message.type; + if (message.value != null && message.hasOwnProperty("value")) + object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value; + return object; + }; + + /** + * Converts this Value to JSON. + * @function toJSON + * @memberof query.Value + * @instance + * @returns {Object.} JSON object + */ + Value.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for Value + * @function getTypeUrl + * @memberof query.Value + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/query.Value"; + }; + + return Value; + })(); + + query.BindVariable = (function() { + + /** + * Properties of a BindVariable. + * @memberof query + * @interface IBindVariable + * @property {query.Type|null} [type] BindVariable type + * @property {Uint8Array|null} [value] BindVariable value + * @property {Array.|null} [values] BindVariable values + */ + + /** + * Constructs a new BindVariable. + * @memberof query + * @classdesc Represents a BindVariable. + * @implements IBindVariable + * @constructor + * @param {query.IBindVariable=} [properties] Properties to set + */ + function BindVariable(properties) { + this.values = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * BindVariable type. + * @member {query.Type} type + * @memberof query.BindVariable + * @instance + */ + BindVariable.prototype.type = 0; + + /** + * BindVariable value. + * @member {Uint8Array} value + * @memberof query.BindVariable + * @instance + */ + BindVariable.prototype.value = $util.newBuffer([]); + + /** + * BindVariable values. + * @member {Array.} values + * @memberof query.BindVariable + * @instance + */ + BindVariable.prototype.values = $util.emptyArray; + + /** + * Creates a new BindVariable instance using the specified properties. + * @function create + * @memberof query.BindVariable + * @static + * @param {query.IBindVariable=} [properties] Properties to set + * @returns {query.BindVariable} BindVariable instance + */ + BindVariable.create = function create(properties) { + return new BindVariable(properties); + }; + + /** + * Encodes the specified BindVariable message. Does not implicitly {@link query.BindVariable.verify|verify} messages. + * @function encode + * @memberof query.BindVariable + * @static + * @param {query.IBindVariable} message BindVariable message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BindVariable.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.type != null && Object.hasOwnProperty.call(message, "type")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.type); + if (message.value != null && Object.hasOwnProperty.call(message, "value")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.value); + if (message.values != null && message.values.length) + for (let i = 0; i < message.values.length; ++i) + $root.query.Value.encode(message.values[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified BindVariable message, length delimited. Does not implicitly {@link query.BindVariable.verify|verify} messages. + * @function encodeDelimited + * @memberof query.BindVariable + * @static + * @param {query.IBindVariable} message BindVariable message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BindVariable.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a BindVariable message from the specified reader or buffer. + * @function decode + * @memberof query.BindVariable + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {query.BindVariable} BindVariable + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BindVariable.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.query.BindVariable(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.type = reader.int32(); + break; + } + case 2: { + message.value = reader.bytes(); + break; + } + case 3: { + if (!(message.values && message.values.length)) + message.values = []; + message.values.push($root.query.Value.decode(reader, reader.uint32())); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a BindVariable message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof query.BindVariable + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {query.BindVariable} BindVariable + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BindVariable.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a BindVariable message. + * @function verify + * @memberof query.BindVariable + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + BindVariable.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.type != null && message.hasOwnProperty("type")) + switch (message.type) { + default: + return "type: enum value expected"; + case 0: + case 257: + case 770: + case 259: + case 772: + case 261: + case 774: + case 263: + case 776: + case 265: + case 778: + case 1035: + case 1036: + case 2061: + case 2062: + case 2063: + case 2064: + case 785: + case 18: + case 6163: + case 10260: + case 6165: + case 10262: + case 6167: + case 10264: + case 2073: + case 2074: + case 2075: + case 28: + case 2077: + case 2078: + case 31: + case 4128: + case 4129: + case 4130: + case 2083: + case 2084: + break; + } + if (message.value != null && message.hasOwnProperty("value")) + if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value))) + return "value: buffer expected"; + if (message.values != null && message.hasOwnProperty("values")) { + if (!Array.isArray(message.values)) + return "values: array expected"; + for (let i = 0; i < message.values.length; ++i) { + let error = $root.query.Value.verify(message.values[i]); + if (error) + return "values." + error; + } + } + return null; + }; + + /** + * Creates a BindVariable message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof query.BindVariable + * @static + * @param {Object.} object Plain object + * @returns {query.BindVariable} BindVariable + */ + BindVariable.fromObject = function fromObject(object) { + if (object instanceof $root.query.BindVariable) + return object; + let message = new $root.query.BindVariable(); + switch (object.type) { + default: + if (typeof object.type === "number") { + message.type = object.type; + break; + } + break; + case "NULL_TYPE": + case 0: + message.type = 0; + break; + case "INT8": + case 257: + message.type = 257; + break; + case "UINT8": + case 770: + message.type = 770; + break; + case "INT16": + case 259: + message.type = 259; + break; + case "UINT16": + case 772: + message.type = 772; + break; + case "INT24": + case 261: + message.type = 261; + break; + case "UINT24": + case 774: + message.type = 774; + break; + case "INT32": + case 263: + message.type = 263; + break; + case "UINT32": + case 776: + message.type = 776; + break; + case "INT64": + case 265: + message.type = 265; + break; + case "UINT64": + case 778: + message.type = 778; + break; + case "FLOAT32": + case 1035: + message.type = 1035; + break; + case "FLOAT64": + case 1036: + message.type = 1036; + break; + case "TIMESTAMP": + case 2061: + message.type = 2061; + break; + case "DATE": + case 2062: + message.type = 2062; + break; + case "TIME": + case 2063: + message.type = 2063; + break; + case "DATETIME": + case 2064: + message.type = 2064; + break; + case "YEAR": + case 785: + message.type = 785; + break; + case "DECIMAL": + case 18: + message.type = 18; + break; + case "TEXT": + case 6163: + message.type = 6163; + break; + case "BLOB": + case 10260: + message.type = 10260; + break; + case "VARCHAR": + case 6165: + message.type = 6165; + break; + case "VARBINARY": + case 10262: + message.type = 10262; + break; + case "CHAR": + case 6167: + message.type = 6167; + break; + case "BINARY": + case 10264: + message.type = 10264; + break; + case "BIT": + case 2073: + message.type = 2073; + break; + case "ENUM": + case 2074: + message.type = 2074; + break; + case "SET": + case 2075: + message.type = 2075; + break; + case "TUPLE": + case 28: + message.type = 28; + break; + case "GEOMETRY": + case 2077: + message.type = 2077; + break; + case "JSON": + case 2078: + message.type = 2078; + break; + case "EXPRESSION": + case 31: + message.type = 31; + break; + case "HEXNUM": + case 4128: + message.type = 4128; + break; + case "HEXVAL": + case 4129: + message.type = 4129; + break; + case "BITNUM": + case 4130: + message.type = 4130; + break; + case "VECTOR": + case 2083: + message.type = 2083; break; - case "BITNUM": - case 4130: - message.type = 4130; + case "RAW": + case 2084: + message.type = 2084; break; } if (object.value != null) @@ -86762,6 +96304,7 @@ export const query = $root.query = (() => { * @property {Array.|null} [transaction_access_mode] ExecuteOptions transaction_access_mode * @property {string|null} [WorkloadName] ExecuteOptions WorkloadName * @property {string|null} [priority] ExecuteOptions priority + * @property {number|Long|null} [authoritative_timeout] ExecuteOptions authoritative_timeout */ /** @@ -86876,6 +96419,28 @@ export const query = $root.query = (() => { */ ExecuteOptions.prototype.priority = ""; + /** + * ExecuteOptions authoritative_timeout. + * @member {number|Long|null|undefined} authoritative_timeout + * @memberof query.ExecuteOptions + * @instance + */ + ExecuteOptions.prototype.authoritative_timeout = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * ExecuteOptions timeout. + * @member {"authoritative_timeout"|undefined} timeout + * @memberof query.ExecuteOptions + * @instance + */ + Object.defineProperty(ExecuteOptions.prototype, "timeout", { + get: $util.oneOfGetter($oneOfFields = ["authoritative_timeout"]), + set: $util.oneOfSetter($oneOfFields) + }); + /** * Creates a new ExecuteOptions instance using the specified properties. * @function create @@ -86928,6 +96493,8 @@ export const query = $root.query = (() => { writer.uint32(/* id 15, wireType 2 =*/122).string(message.WorkloadName); if (message.priority != null && Object.hasOwnProperty.call(message, "priority")) writer.uint32(/* id 16, wireType 2 =*/130).string(message.priority); + if (message.authoritative_timeout != null && Object.hasOwnProperty.call(message, "authoritative_timeout")) + writer.uint32(/* id 17, wireType 0 =*/136).int64(message.authoritative_timeout); return writer; }; @@ -87017,6 +96584,10 @@ export const query = $root.query = (() => { message.priority = reader.string(); break; } + case 17: { + message.authoritative_timeout = reader.int64(); + break; + } default: reader.skipType(tag & 7); break; @@ -87052,6 +96623,7 @@ export const query = $root.query = (() => { ExecuteOptions.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + let properties = {}; if (message.included_fields != null && message.hasOwnProperty("included_fields")) switch (message.included_fields) { default: @@ -87139,6 +96711,11 @@ export const query = $root.query = (() => { if (message.priority != null && message.hasOwnProperty("priority")) if (!$util.isString(message.priority)) return "priority: string expected"; + if (message.authoritative_timeout != null && message.hasOwnProperty("authoritative_timeout")) { + properties.timeout = 1; + if (!$util.isInteger(message.authoritative_timeout) && !(message.authoritative_timeout && $util.isInteger(message.authoritative_timeout.low) && $util.isInteger(message.authoritative_timeout.high))) + return "authoritative_timeout: integer|Long expected"; + } return null; }; @@ -87342,6 +96919,15 @@ export const query = $root.query = (() => { message.WorkloadName = String(object.WorkloadName); if (object.priority != null) message.priority = String(object.priority); + if (object.authoritative_timeout != null) + if ($util.Long) + (message.authoritative_timeout = $util.Long.fromValue(object.authoritative_timeout)).unsigned = false; + else if (typeof object.authoritative_timeout === "string") + message.authoritative_timeout = parseInt(object.authoritative_timeout, 10); + else if (typeof object.authoritative_timeout === "number") + message.authoritative_timeout = object.authoritative_timeout; + else if (typeof object.authoritative_timeout === "object") + message.authoritative_timeout = new $util.LongBits(object.authoritative_timeout.low >>> 0, object.authoritative_timeout.high >>> 0).toNumber(); return message; }; @@ -87407,6 +96993,14 @@ export const query = $root.query = (() => { object.WorkloadName = message.WorkloadName; if (message.priority != null && message.hasOwnProperty("priority")) object.priority = message.priority; + if (message.authoritative_timeout != null && message.hasOwnProperty("authoritative_timeout")) { + if (typeof message.authoritative_timeout === "number") + object.authoritative_timeout = options.longs === String ? String(message.authoritative_timeout) : message.authoritative_timeout; + else + object.authoritative_timeout = options.longs === String ? $util.Long.prototype.toString.call(message.authoritative_timeout) : options.longs === Number ? new $util.LongBits(message.authoritative_timeout.low >>> 0, message.authoritative_timeout.high >>> 0).toNumber() : message.authoritative_timeout; + if (options.oneofs) + object.timeout = "authoritative_timeout"; + } return object; }; @@ -87880,6 +97474,8 @@ export const query = $root.query = (() => { case 4128: case 4129: case 4130: + case 2083: + case 2084: break; } if (message.table != null && message.hasOwnProperty("table")) @@ -88073,6 +97669,14 @@ export const query = $root.query = (() => { case 4130: message.type = 4130; break; + case "VECTOR": + case 2083: + message.type = 2083; + break; + case "RAW": + case 2084: + message.type = 2084; + break; } if (object.table != null) message.table = String(object.table); @@ -96687,6 +106291,7 @@ export const query = $root.query = (() => { * @property {vtrpc.ICallerID|null} [effective_caller_id] UnresolvedTransactionsRequest effective_caller_id * @property {query.IVTGateCallerID|null} [immediate_caller_id] UnresolvedTransactionsRequest immediate_caller_id * @property {query.ITarget|null} [target] UnresolvedTransactionsRequest target + * @property {number|Long|null} [abandon_age] UnresolvedTransactionsRequest abandon_age */ /** @@ -96728,6 +106333,14 @@ export const query = $root.query = (() => { */ UnresolvedTransactionsRequest.prototype.target = null; + /** + * UnresolvedTransactionsRequest abandon_age. + * @member {number|Long} abandon_age + * @memberof query.UnresolvedTransactionsRequest + * @instance + */ + UnresolvedTransactionsRequest.prototype.abandon_age = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + /** * Creates a new UnresolvedTransactionsRequest instance using the specified properties. * @function create @@ -96758,6 +106371,8 @@ export const query = $root.query = (() => { $root.query.VTGateCallerID.encode(message.immediate_caller_id, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.target != null && Object.hasOwnProperty.call(message, "target")) $root.query.Target.encode(message.target, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.abandon_age != null && Object.hasOwnProperty.call(message, "abandon_age")) + writer.uint32(/* id 4, wireType 0 =*/32).int64(message.abandon_age); return writer; }; @@ -96804,6 +106419,10 @@ export const query = $root.query = (() => { message.target = $root.query.Target.decode(reader, reader.uint32()); break; } + case 4: { + message.abandon_age = reader.int64(); + break; + } default: reader.skipType(tag & 7); break; @@ -96854,6 +106473,9 @@ export const query = $root.query = (() => { if (error) return "target." + error; } + if (message.abandon_age != null && message.hasOwnProperty("abandon_age")) + if (!$util.isInteger(message.abandon_age) && !(message.abandon_age && $util.isInteger(message.abandon_age.low) && $util.isInteger(message.abandon_age.high))) + return "abandon_age: integer|Long expected"; return null; }; @@ -96884,6 +106506,15 @@ export const query = $root.query = (() => { throw TypeError(".query.UnresolvedTransactionsRequest.target: object expected"); message.target = $root.query.Target.fromObject(object.target); } + if (object.abandon_age != null) + if ($util.Long) + (message.abandon_age = $util.Long.fromValue(object.abandon_age)).unsigned = false; + else if (typeof object.abandon_age === "string") + message.abandon_age = parseInt(object.abandon_age, 10); + else if (typeof object.abandon_age === "number") + message.abandon_age = object.abandon_age; + else if (typeof object.abandon_age === "object") + message.abandon_age = new $util.LongBits(object.abandon_age.low >>> 0, object.abandon_age.high >>> 0).toNumber(); return message; }; @@ -96904,6 +106535,11 @@ export const query = $root.query = (() => { object.effective_caller_id = null; object.immediate_caller_id = null; object.target = null; + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.abandon_age = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.abandon_age = options.longs === String ? "0" : 0; } if (message.effective_caller_id != null && message.hasOwnProperty("effective_caller_id")) object.effective_caller_id = $root.vtrpc.CallerID.toObject(message.effective_caller_id, options); @@ -96911,6 +106547,11 @@ export const query = $root.query = (() => { object.immediate_caller_id = $root.query.VTGateCallerID.toObject(message.immediate_caller_id, options); if (message.target != null && message.hasOwnProperty("target")) object.target = $root.query.Target.toObject(message.target, options); + if (message.abandon_age != null && message.hasOwnProperty("abandon_age")) + if (typeof message.abandon_age === "number") + object.abandon_age = options.longs === String ? String(message.abandon_age) : message.abandon_age; + else + object.abandon_age = options.longs === String ? $util.Long.prototype.toString.call(message.abandon_age) : options.longs === Number ? new $util.LongBits(message.abandon_age.low >>> 0, message.abandon_age.high >>> 0).toNumber() : message.abandon_age; return object; }; @@ -105203,6 +114844,8 @@ export const query = $root.query = (() => { case 4128: case 4129: case 4130: + case 2083: + case 2084: break; } return null; @@ -105371,6 +115014,14 @@ export const query = $root.query = (() => { case 4130: message.return_type = 4130; break; + case "VECTOR": + case 2083: + message.return_type = 2083; + break; + case "RAW": + case 2084: + message.return_type = 2084; + break; } return message; }; @@ -106899,6 +116550,7 @@ export const replicationdata = $root.replicationdata = (() => { * @interface IPrimaryStatus * @property {string|null} [position] PrimaryStatus position * @property {string|null} [file_position] PrimaryStatus file_position + * @property {string|null} [server_uuid] PrimaryStatus server_uuid */ /** @@ -106932,6 +116584,14 @@ export const replicationdata = $root.replicationdata = (() => { */ PrimaryStatus.prototype.file_position = ""; + /** + * PrimaryStatus server_uuid. + * @member {string} server_uuid + * @memberof replicationdata.PrimaryStatus + * @instance + */ + PrimaryStatus.prototype.server_uuid = ""; + /** * Creates a new PrimaryStatus instance using the specified properties. * @function create @@ -106960,6 +116620,8 @@ export const replicationdata = $root.replicationdata = (() => { writer.uint32(/* id 1, wireType 2 =*/10).string(message.position); if (message.file_position != null && Object.hasOwnProperty.call(message, "file_position")) writer.uint32(/* id 2, wireType 2 =*/18).string(message.file_position); + if (message.server_uuid != null && Object.hasOwnProperty.call(message, "server_uuid")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.server_uuid); return writer; }; @@ -107002,6 +116664,10 @@ export const replicationdata = $root.replicationdata = (() => { message.file_position = reader.string(); break; } + case 3: { + message.server_uuid = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -107043,6 +116709,9 @@ export const replicationdata = $root.replicationdata = (() => { if (message.file_position != null && message.hasOwnProperty("file_position")) if (!$util.isString(message.file_position)) return "file_position: string expected"; + if (message.server_uuid != null && message.hasOwnProperty("server_uuid")) + if (!$util.isString(message.server_uuid)) + return "server_uuid: string expected"; return null; }; @@ -107062,6 +116731,8 @@ export const replicationdata = $root.replicationdata = (() => { message.position = String(object.position); if (object.file_position != null) message.file_position = String(object.file_position); + if (object.server_uuid != null) + message.server_uuid = String(object.server_uuid); return message; }; @@ -107081,11 +116752,14 @@ export const replicationdata = $root.replicationdata = (() => { if (options.defaults) { object.position = ""; object.file_position = ""; + object.server_uuid = ""; } if (message.position != null && message.hasOwnProperty("position")) object.position = message.position; if (message.file_position != null && message.hasOwnProperty("file_position")) object.file_position = message.file_position; + if (message.server_uuid != null && message.hasOwnProperty("server_uuid")) + object.server_uuid = message.server_uuid; return object; }; @@ -108957,6 +118631,8 @@ export const vschema = $root.vschema = (() => { case 4128: case 4129: case 4130: + case 2083: + case 2084: break; } return null; @@ -109123,6 +118799,14 @@ export const vschema = $root.vschema = (() => { case 4130: message.tenant_id_column_type = 4130; break; + case "VECTOR": + case 2083: + message.tenant_id_column_type = 2083; + break; + case "RAW": + case 2084: + message.tenant_id_column_type = 2084; + break; } return message; }; @@ -110663,6 +120347,8 @@ export const vschema = $root.vschema = (() => { case 4128: case 4129: case 4130: + case 2083: + case 2084: break; } if (message.invisible != null && message.hasOwnProperty("invisible")) @@ -110856,6 +120542,14 @@ export const vschema = $root.vschema = (() => { case 4130: message.type = 4130; break; + case "VECTOR": + case 2083: + message.type = 2083; + break; + case "RAW": + case 2084: + message.type = 2084; + break; } if (object.invisible != null) message.invisible = Boolean(object.invisible); @@ -113483,6 +123177,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {tabletmanagerdata.TabletSelectionPreference|null} [tablet_selection_preference] MaterializeSettings tablet_selection_preference * @property {boolean|null} [atomic_copy] MaterializeSettings atomic_copy * @property {vtctldata.IWorkflowOptions|null} [workflow_options] MaterializeSettings workflow_options + * @property {Array.|null} [reference_tables] MaterializeSettings reference_tables */ /** @@ -113496,6 +123191,7 @@ export const vtctldata = $root.vtctldata = (() => { function MaterializeSettings(properties) { this.table_settings = []; this.source_shards = []; + this.reference_tables = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -113638,6 +123334,14 @@ export const vtctldata = $root.vtctldata = (() => { */ MaterializeSettings.prototype.workflow_options = null; + /** + * MaterializeSettings reference_tables. + * @member {Array.} reference_tables + * @memberof vtctldata.MaterializeSettings + * @instance + */ + MaterializeSettings.prototype.reference_tables = $util.emptyArray; + /** * Creates a new MaterializeSettings instance using the specified properties. * @function create @@ -113698,6 +123402,9 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 16, wireType 0 =*/128).bool(message.atomic_copy); if (message.workflow_options != null && Object.hasOwnProperty.call(message, "workflow_options")) $root.vtctldata.WorkflowOptions.encode(message.workflow_options, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + if (message.reference_tables != null && message.reference_tables.length) + for (let i = 0; i < message.reference_tables.length; ++i) + writer.uint32(/* id 18, wireType 2 =*/146).string(message.reference_tables[i]); return writer; }; @@ -113804,6 +123511,12 @@ export const vtctldata = $root.vtctldata = (() => { message.workflow_options = $root.vtctldata.WorkflowOptions.decode(reader, reader.uint32()); break; } + case 18: { + if (!(message.reference_tables && message.reference_tables.length)) + message.reference_tables = []; + message.reference_tables.push(reader.string()); + break; + } default: reader.skipType(tag & 7); break; @@ -113914,6 +123627,13 @@ export const vtctldata = $root.vtctldata = (() => { if (error) return "workflow_options." + error; } + if (message.reference_tables != null && message.hasOwnProperty("reference_tables")) { + if (!Array.isArray(message.reference_tables)) + return "reference_tables: array expected"; + for (let i = 0; i < message.reference_tables.length; ++i) + if (!$util.isString(message.reference_tables[i])) + return "reference_tables: string[] expected"; + } return null; }; @@ -114015,6 +123735,13 @@ export const vtctldata = $root.vtctldata = (() => { throw TypeError(".vtctldata.MaterializeSettings.workflow_options: object expected"); message.workflow_options = $root.vtctldata.WorkflowOptions.fromObject(object.workflow_options); } + if (object.reference_tables) { + if (!Array.isArray(object.reference_tables)) + throw TypeError(".vtctldata.MaterializeSettings.reference_tables: array expected"); + message.reference_tables = []; + for (let i = 0; i < object.reference_tables.length; ++i) + message.reference_tables[i] = String(object.reference_tables[i]); + } return message; }; @@ -114034,6 +123761,7 @@ export const vtctldata = $root.vtctldata = (() => { if (options.arrays || options.defaults) { object.table_settings = []; object.source_shards = []; + object.reference_tables = []; } if (options.defaults) { object.workflow = ""; @@ -114092,6 +123820,11 @@ export const vtctldata = $root.vtctldata = (() => { object.atomic_copy = message.atomic_copy; if (message.workflow_options != null && message.hasOwnProperty("workflow_options")) object.workflow_options = $root.vtctldata.WorkflowOptions.toObject(message.workflow_options, options); + if (message.reference_tables && message.reference_tables.length) { + object.reference_tables = []; + for (let j = 0; j < message.reference_tables.length; ++j) + object.reference_tables[j] = message.reference_tables[j]; + } return object; }; @@ -116321,6 +126054,22 @@ export const vtctldata = $root.vtctldata = (() => { return Shard; })(); + /** + * ShardedAutoIncrementHandling enum. + * @name vtctldata.ShardedAutoIncrementHandling + * @enum {number} + * @property {number} LEAVE=0 LEAVE value + * @property {number} REMOVE=1 REMOVE value + * @property {number} REPLACE=2 REPLACE value + */ + vtctldata.ShardedAutoIncrementHandling = (function() { + const valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "LEAVE"] = 0; + values[valuesById[1] = "REMOVE"] = 1; + values[valuesById[2] = "REPLACE"] = 2; + return values; + })(); + vtctldata.WorkflowOptions = (function() { /** @@ -116328,8 +126077,10 @@ export const vtctldata = $root.vtctldata = (() => { * @memberof vtctldata * @interface IWorkflowOptions * @property {string|null} [tenant_id] WorkflowOptions tenant_id - * @property {boolean|null} [strip_sharded_auto_increment] WorkflowOptions strip_sharded_auto_increment + * @property {vtctldata.ShardedAutoIncrementHandling|null} [sharded_auto_increment_handling] WorkflowOptions sharded_auto_increment_handling * @property {Array.|null} [shards] WorkflowOptions shards + * @property {Object.|null} [config] WorkflowOptions config + * @property {string|null} [global_keyspace] WorkflowOptions global_keyspace */ /** @@ -116342,6 +126093,7 @@ export const vtctldata = $root.vtctldata = (() => { */ function WorkflowOptions(properties) { this.shards = []; + this.config = {}; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -116357,12 +126109,12 @@ export const vtctldata = $root.vtctldata = (() => { WorkflowOptions.prototype.tenant_id = ""; /** - * WorkflowOptions strip_sharded_auto_increment. - * @member {boolean} strip_sharded_auto_increment + * WorkflowOptions sharded_auto_increment_handling. + * @member {vtctldata.ShardedAutoIncrementHandling} sharded_auto_increment_handling * @memberof vtctldata.WorkflowOptions * @instance */ - WorkflowOptions.prototype.strip_sharded_auto_increment = false; + WorkflowOptions.prototype.sharded_auto_increment_handling = 0; /** * WorkflowOptions shards. @@ -116372,6 +126124,22 @@ export const vtctldata = $root.vtctldata = (() => { */ WorkflowOptions.prototype.shards = $util.emptyArray; + /** + * WorkflowOptions config. + * @member {Object.} config + * @memberof vtctldata.WorkflowOptions + * @instance + */ + WorkflowOptions.prototype.config = $util.emptyObject; + + /** + * WorkflowOptions global_keyspace. + * @member {string} global_keyspace + * @memberof vtctldata.WorkflowOptions + * @instance + */ + WorkflowOptions.prototype.global_keyspace = ""; + /** * Creates a new WorkflowOptions instance using the specified properties. * @function create @@ -116398,11 +126166,16 @@ export const vtctldata = $root.vtctldata = (() => { writer = $Writer.create(); if (message.tenant_id != null && Object.hasOwnProperty.call(message, "tenant_id")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.tenant_id); - if (message.strip_sharded_auto_increment != null && Object.hasOwnProperty.call(message, "strip_sharded_auto_increment")) - writer.uint32(/* id 2, wireType 0 =*/16).bool(message.strip_sharded_auto_increment); + if (message.sharded_auto_increment_handling != null && Object.hasOwnProperty.call(message, "sharded_auto_increment_handling")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.sharded_auto_increment_handling); if (message.shards != null && message.shards.length) for (let i = 0; i < message.shards.length; ++i) writer.uint32(/* id 3, wireType 2 =*/26).string(message.shards[i]); + if (message.config != null && Object.hasOwnProperty.call(message, "config")) + for (let keys = Object.keys(message.config), i = 0; i < keys.length; ++i) + writer.uint32(/* id 4, wireType 2 =*/34).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.config[keys[i]]).ldelim(); + if (message.global_keyspace != null && Object.hasOwnProperty.call(message, "global_keyspace")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.global_keyspace); return writer; }; @@ -116433,7 +126206,7 @@ export const vtctldata = $root.vtctldata = (() => { WorkflowOptions.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.WorkflowOptions(); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.WorkflowOptions(), key, value; while (reader.pos < end) { let tag = reader.uint32(); switch (tag >>> 3) { @@ -116442,7 +126215,7 @@ export const vtctldata = $root.vtctldata = (() => { break; } case 2: { - message.strip_sharded_auto_increment = reader.bool(); + message.sharded_auto_increment_handling = reader.int32(); break; } case 3: { @@ -116451,6 +126224,33 @@ export const vtctldata = $root.vtctldata = (() => { message.shards.push(reader.string()); break; } + case 4: { + if (message.config === $util.emptyObject) + message.config = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.config[key] = value; + break; + } + case 5: { + message.global_keyspace = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -116489,9 +126289,15 @@ export const vtctldata = $root.vtctldata = (() => { if (message.tenant_id != null && message.hasOwnProperty("tenant_id")) if (!$util.isString(message.tenant_id)) return "tenant_id: string expected"; - if (message.strip_sharded_auto_increment != null && message.hasOwnProperty("strip_sharded_auto_increment")) - if (typeof message.strip_sharded_auto_increment !== "boolean") - return "strip_sharded_auto_increment: boolean expected"; + if (message.sharded_auto_increment_handling != null && message.hasOwnProperty("sharded_auto_increment_handling")) + switch (message.sharded_auto_increment_handling) { + default: + return "sharded_auto_increment_handling: enum value expected"; + case 0: + case 1: + case 2: + break; + } if (message.shards != null && message.hasOwnProperty("shards")) { if (!Array.isArray(message.shards)) return "shards: array expected"; @@ -116499,6 +126305,17 @@ export const vtctldata = $root.vtctldata = (() => { if (!$util.isString(message.shards[i])) return "shards: string[] expected"; } + if (message.config != null && message.hasOwnProperty("config")) { + if (!$util.isObject(message.config)) + return "config: object expected"; + let key = Object.keys(message.config); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.config[key[i]])) + return "config: string{k:string} expected"; + } + if (message.global_keyspace != null && message.hasOwnProperty("global_keyspace")) + if (!$util.isString(message.global_keyspace)) + return "global_keyspace: string expected"; return null; }; @@ -116516,8 +126333,26 @@ export const vtctldata = $root.vtctldata = (() => { let message = new $root.vtctldata.WorkflowOptions(); if (object.tenant_id != null) message.tenant_id = String(object.tenant_id); - if (object.strip_sharded_auto_increment != null) - message.strip_sharded_auto_increment = Boolean(object.strip_sharded_auto_increment); + switch (object.sharded_auto_increment_handling) { + default: + if (typeof object.sharded_auto_increment_handling === "number") { + message.sharded_auto_increment_handling = object.sharded_auto_increment_handling; + break; + } + break; + case "LEAVE": + case 0: + message.sharded_auto_increment_handling = 0; + break; + case "REMOVE": + case 1: + message.sharded_auto_increment_handling = 1; + break; + case "REPLACE": + case 2: + message.sharded_auto_increment_handling = 2; + break; + } if (object.shards) { if (!Array.isArray(object.shards)) throw TypeError(".vtctldata.WorkflowOptions.shards: array expected"); @@ -116525,6 +126360,15 @@ export const vtctldata = $root.vtctldata = (() => { for (let i = 0; i < object.shards.length; ++i) message.shards[i] = String(object.shards[i]); } + if (object.config) { + if (typeof object.config !== "object") + throw TypeError(".vtctldata.WorkflowOptions.config: object expected"); + message.config = {}; + for (let keys = Object.keys(object.config), i = 0; i < keys.length; ++i) + message.config[keys[i]] = String(object.config[keys[i]]); + } + if (object.global_keyspace != null) + message.global_keyspace = String(object.global_keyspace); return message; }; @@ -116543,19 +126387,30 @@ export const vtctldata = $root.vtctldata = (() => { let object = {}; if (options.arrays || options.defaults) object.shards = []; + if (options.objects || options.defaults) + object.config = {}; if (options.defaults) { object.tenant_id = ""; - object.strip_sharded_auto_increment = false; + object.sharded_auto_increment_handling = options.enums === String ? "LEAVE" : 0; + object.global_keyspace = ""; } if (message.tenant_id != null && message.hasOwnProperty("tenant_id")) object.tenant_id = message.tenant_id; - if (message.strip_sharded_auto_increment != null && message.hasOwnProperty("strip_sharded_auto_increment")) - object.strip_sharded_auto_increment = message.strip_sharded_auto_increment; + if (message.sharded_auto_increment_handling != null && message.hasOwnProperty("sharded_auto_increment_handling")) + object.sharded_auto_increment_handling = options.enums === String ? $root.vtctldata.ShardedAutoIncrementHandling[message.sharded_auto_increment_handling] === undefined ? message.sharded_auto_increment_handling : $root.vtctldata.ShardedAutoIncrementHandling[message.sharded_auto_increment_handling] : message.sharded_auto_increment_handling; if (message.shards && message.shards.length) { object.shards = []; for (let j = 0; j < message.shards.length; ++j) object.shards[j] = message.shards[j]; } + let keys2; + if (message.config && (keys2 = Object.keys(message.config)).length) { + object.config = {}; + for (let j = 0; j < keys2.length; ++j) + object.config[keys2[j]] = message.config[keys2[j]]; + } + if (message.global_keyspace != null && message.hasOwnProperty("global_keyspace")) + object.global_keyspace = message.global_keyspace; return object; }; @@ -123194,6 +133049,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {number|null} [concurrency] BackupRequest concurrency * @property {string|null} [incremental_from_pos] BackupRequest incremental_from_pos * @property {boolean|null} [upgrade_safe] BackupRequest upgrade_safe + * @property {string|null} [backup_engine] BackupRequest backup_engine */ /** @@ -123251,6 +133107,28 @@ export const vtctldata = $root.vtctldata = (() => { */ BackupRequest.prototype.upgrade_safe = false; + /** + * BackupRequest backup_engine. + * @member {string|null|undefined} backup_engine + * @memberof vtctldata.BackupRequest + * @instance + */ + BackupRequest.prototype.backup_engine = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * BackupRequest _backup_engine. + * @member {"backup_engine"|undefined} _backup_engine + * @memberof vtctldata.BackupRequest + * @instance + */ + Object.defineProperty(BackupRequest.prototype, "_backup_engine", { + get: $util.oneOfGetter($oneOfFields = ["backup_engine"]), + set: $util.oneOfSetter($oneOfFields) + }); + /** * Creates a new BackupRequest instance using the specified properties. * @function create @@ -123285,6 +133163,8 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 4, wireType 2 =*/34).string(message.incremental_from_pos); if (message.upgrade_safe != null && Object.hasOwnProperty.call(message, "upgrade_safe")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.upgrade_safe); + if (message.backup_engine != null && Object.hasOwnProperty.call(message, "backup_engine")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.backup_engine); return writer; }; @@ -123339,6 +133219,10 @@ export const vtctldata = $root.vtctldata = (() => { message.upgrade_safe = reader.bool(); break; } + case 6: { + message.backup_engine = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -123374,6 +133258,7 @@ export const vtctldata = $root.vtctldata = (() => { BackupRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + let properties = {}; if (message.tablet_alias != null && message.hasOwnProperty("tablet_alias")) { let error = $root.topodata.TabletAlias.verify(message.tablet_alias); if (error) @@ -123391,6 +133276,11 @@ export const vtctldata = $root.vtctldata = (() => { if (message.upgrade_safe != null && message.hasOwnProperty("upgrade_safe")) if (typeof message.upgrade_safe !== "boolean") return "upgrade_safe: boolean expected"; + if (message.backup_engine != null && message.hasOwnProperty("backup_engine")) { + properties._backup_engine = 1; + if (!$util.isString(message.backup_engine)) + return "backup_engine: string expected"; + } return null; }; @@ -123419,6 +133309,8 @@ export const vtctldata = $root.vtctldata = (() => { message.incremental_from_pos = String(object.incremental_from_pos); if (object.upgrade_safe != null) message.upgrade_safe = Boolean(object.upgrade_safe); + if (object.backup_engine != null) + message.backup_engine = String(object.backup_engine); return message; }; @@ -123452,6 +133344,11 @@ export const vtctldata = $root.vtctldata = (() => { object.incremental_from_pos = message.incremental_from_pos; if (message.upgrade_safe != null && message.hasOwnProperty("upgrade_safe")) object.upgrade_safe = message.upgrade_safe; + if (message.backup_engine != null && message.hasOwnProperty("backup_engine")) { + object.backup_engine = message.backup_engine; + if (options.oneofs) + object._backup_engine = "backup_engine"; + } return object; }; @@ -124561,6 +134458,593 @@ export const vtctldata = $root.vtctldata = (() => { return CancelSchemaMigrationResponse; })(); + vtctldata.ChangeTabletTagsRequest = (function() { + + /** + * Properties of a ChangeTabletTagsRequest. + * @memberof vtctldata + * @interface IChangeTabletTagsRequest + * @property {topodata.ITabletAlias|null} [tablet_alias] ChangeTabletTagsRequest tablet_alias + * @property {Object.|null} [tags] ChangeTabletTagsRequest tags + * @property {boolean|null} [replace] ChangeTabletTagsRequest replace + */ + + /** + * Constructs a new ChangeTabletTagsRequest. + * @memberof vtctldata + * @classdesc Represents a ChangeTabletTagsRequest. + * @implements IChangeTabletTagsRequest + * @constructor + * @param {vtctldata.IChangeTabletTagsRequest=} [properties] Properties to set + */ + function ChangeTabletTagsRequest(properties) { + this.tags = {}; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ChangeTabletTagsRequest tablet_alias. + * @member {topodata.ITabletAlias|null|undefined} tablet_alias + * @memberof vtctldata.ChangeTabletTagsRequest + * @instance + */ + ChangeTabletTagsRequest.prototype.tablet_alias = null; + + /** + * ChangeTabletTagsRequest tags. + * @member {Object.} tags + * @memberof vtctldata.ChangeTabletTagsRequest + * @instance + */ + ChangeTabletTagsRequest.prototype.tags = $util.emptyObject; + + /** + * ChangeTabletTagsRequest replace. + * @member {boolean} replace + * @memberof vtctldata.ChangeTabletTagsRequest + * @instance + */ + ChangeTabletTagsRequest.prototype.replace = false; + + /** + * Creates a new ChangeTabletTagsRequest instance using the specified properties. + * @function create + * @memberof vtctldata.ChangeTabletTagsRequest + * @static + * @param {vtctldata.IChangeTabletTagsRequest=} [properties] Properties to set + * @returns {vtctldata.ChangeTabletTagsRequest} ChangeTabletTagsRequest instance + */ + ChangeTabletTagsRequest.create = function create(properties) { + return new ChangeTabletTagsRequest(properties); + }; + + /** + * Encodes the specified ChangeTabletTagsRequest message. Does not implicitly {@link vtctldata.ChangeTabletTagsRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.ChangeTabletTagsRequest + * @static + * @param {vtctldata.IChangeTabletTagsRequest} message ChangeTabletTagsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChangeTabletTagsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tablet_alias != null && Object.hasOwnProperty.call(message, "tablet_alias")) + $root.topodata.TabletAlias.encode(message.tablet_alias, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.tags != null && Object.hasOwnProperty.call(message, "tags")) + for (let keys = Object.keys(message.tags), i = 0; i < keys.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.tags[keys[i]]).ldelim(); + if (message.replace != null && Object.hasOwnProperty.call(message, "replace")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.replace); + return writer; + }; + + /** + * Encodes the specified ChangeTabletTagsRequest message, length delimited. Does not implicitly {@link vtctldata.ChangeTabletTagsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ChangeTabletTagsRequest + * @static + * @param {vtctldata.IChangeTabletTagsRequest} message ChangeTabletTagsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChangeTabletTagsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ChangeTabletTagsRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ChangeTabletTagsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ChangeTabletTagsRequest} ChangeTabletTagsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChangeTabletTagsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ChangeTabletTagsRequest(), key, value; + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.tablet_alias = $root.topodata.TabletAlias.decode(reader, reader.uint32()); + break; + } + case 2: { + if (message.tags === $util.emptyObject) + message.tags = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.tags[key] = value; + break; + } + case 3: { + message.replace = reader.bool(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ChangeTabletTagsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ChangeTabletTagsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ChangeTabletTagsRequest} ChangeTabletTagsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChangeTabletTagsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ChangeTabletTagsRequest message. + * @function verify + * @memberof vtctldata.ChangeTabletTagsRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ChangeTabletTagsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tablet_alias != null && message.hasOwnProperty("tablet_alias")) { + let error = $root.topodata.TabletAlias.verify(message.tablet_alias); + if (error) + return "tablet_alias." + error; + } + if (message.tags != null && message.hasOwnProperty("tags")) { + if (!$util.isObject(message.tags)) + return "tags: object expected"; + let key = Object.keys(message.tags); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.tags[key[i]])) + return "tags: string{k:string} expected"; + } + if (message.replace != null && message.hasOwnProperty("replace")) + if (typeof message.replace !== "boolean") + return "replace: boolean expected"; + return null; + }; + + /** + * Creates a ChangeTabletTagsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ChangeTabletTagsRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ChangeTabletTagsRequest} ChangeTabletTagsRequest + */ + ChangeTabletTagsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ChangeTabletTagsRequest) + return object; + let message = new $root.vtctldata.ChangeTabletTagsRequest(); + if (object.tablet_alias != null) { + if (typeof object.tablet_alias !== "object") + throw TypeError(".vtctldata.ChangeTabletTagsRequest.tablet_alias: object expected"); + message.tablet_alias = $root.topodata.TabletAlias.fromObject(object.tablet_alias); + } + if (object.tags) { + if (typeof object.tags !== "object") + throw TypeError(".vtctldata.ChangeTabletTagsRequest.tags: object expected"); + message.tags = {}; + for (let keys = Object.keys(object.tags), i = 0; i < keys.length; ++i) + message.tags[keys[i]] = String(object.tags[keys[i]]); + } + if (object.replace != null) + message.replace = Boolean(object.replace); + return message; + }; + + /** + * Creates a plain object from a ChangeTabletTagsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ChangeTabletTagsRequest + * @static + * @param {vtctldata.ChangeTabletTagsRequest} message ChangeTabletTagsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ChangeTabletTagsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.objects || options.defaults) + object.tags = {}; + if (options.defaults) { + object.tablet_alias = null; + object.replace = false; + } + if (message.tablet_alias != null && message.hasOwnProperty("tablet_alias")) + object.tablet_alias = $root.topodata.TabletAlias.toObject(message.tablet_alias, options); + let keys2; + if (message.tags && (keys2 = Object.keys(message.tags)).length) { + object.tags = {}; + for (let j = 0; j < keys2.length; ++j) + object.tags[keys2[j]] = message.tags[keys2[j]]; + } + if (message.replace != null && message.hasOwnProperty("replace")) + object.replace = message.replace; + return object; + }; + + /** + * Converts this ChangeTabletTagsRequest to JSON. + * @function toJSON + * @memberof vtctldata.ChangeTabletTagsRequest + * @instance + * @returns {Object.} JSON object + */ + ChangeTabletTagsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ChangeTabletTagsRequest + * @function getTypeUrl + * @memberof vtctldata.ChangeTabletTagsRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ChangeTabletTagsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.ChangeTabletTagsRequest"; + }; + + return ChangeTabletTagsRequest; + })(); + + vtctldata.ChangeTabletTagsResponse = (function() { + + /** + * Properties of a ChangeTabletTagsResponse. + * @memberof vtctldata + * @interface IChangeTabletTagsResponse + * @property {Object.|null} [before_tags] ChangeTabletTagsResponse before_tags + * @property {Object.|null} [after_tags] ChangeTabletTagsResponse after_tags + */ + + /** + * Constructs a new ChangeTabletTagsResponse. + * @memberof vtctldata + * @classdesc Represents a ChangeTabletTagsResponse. + * @implements IChangeTabletTagsResponse + * @constructor + * @param {vtctldata.IChangeTabletTagsResponse=} [properties] Properties to set + */ + function ChangeTabletTagsResponse(properties) { + this.before_tags = {}; + this.after_tags = {}; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ChangeTabletTagsResponse before_tags. + * @member {Object.} before_tags + * @memberof vtctldata.ChangeTabletTagsResponse + * @instance + */ + ChangeTabletTagsResponse.prototype.before_tags = $util.emptyObject; + + /** + * ChangeTabletTagsResponse after_tags. + * @member {Object.} after_tags + * @memberof vtctldata.ChangeTabletTagsResponse + * @instance + */ + ChangeTabletTagsResponse.prototype.after_tags = $util.emptyObject; + + /** + * Creates a new ChangeTabletTagsResponse instance using the specified properties. + * @function create + * @memberof vtctldata.ChangeTabletTagsResponse + * @static + * @param {vtctldata.IChangeTabletTagsResponse=} [properties] Properties to set + * @returns {vtctldata.ChangeTabletTagsResponse} ChangeTabletTagsResponse instance + */ + ChangeTabletTagsResponse.create = function create(properties) { + return new ChangeTabletTagsResponse(properties); + }; + + /** + * Encodes the specified ChangeTabletTagsResponse message. Does not implicitly {@link vtctldata.ChangeTabletTagsResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.ChangeTabletTagsResponse + * @static + * @param {vtctldata.IChangeTabletTagsResponse} message ChangeTabletTagsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChangeTabletTagsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.before_tags != null && Object.hasOwnProperty.call(message, "before_tags")) + for (let keys = Object.keys(message.before_tags), i = 0; i < keys.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.before_tags[keys[i]]).ldelim(); + if (message.after_tags != null && Object.hasOwnProperty.call(message, "after_tags")) + for (let keys = Object.keys(message.after_tags), i = 0; i < keys.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.after_tags[keys[i]]).ldelim(); + return writer; + }; + + /** + * Encodes the specified ChangeTabletTagsResponse message, length delimited. Does not implicitly {@link vtctldata.ChangeTabletTagsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ChangeTabletTagsResponse + * @static + * @param {vtctldata.IChangeTabletTagsResponse} message ChangeTabletTagsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChangeTabletTagsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ChangeTabletTagsResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ChangeTabletTagsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ChangeTabletTagsResponse} ChangeTabletTagsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChangeTabletTagsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ChangeTabletTagsResponse(), key, value; + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (message.before_tags === $util.emptyObject) + message.before_tags = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.before_tags[key] = value; + break; + } + case 2: { + if (message.after_tags === $util.emptyObject) + message.after_tags = {}; + let end2 = reader.uint32() + reader.pos; + key = ""; + value = ""; + while (reader.pos < end2) { + let tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = reader.string(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.after_tags[key] = value; + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ChangeTabletTagsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ChangeTabletTagsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ChangeTabletTagsResponse} ChangeTabletTagsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChangeTabletTagsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ChangeTabletTagsResponse message. + * @function verify + * @memberof vtctldata.ChangeTabletTagsResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ChangeTabletTagsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.before_tags != null && message.hasOwnProperty("before_tags")) { + if (!$util.isObject(message.before_tags)) + return "before_tags: object expected"; + let key = Object.keys(message.before_tags); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.before_tags[key[i]])) + return "before_tags: string{k:string} expected"; + } + if (message.after_tags != null && message.hasOwnProperty("after_tags")) { + if (!$util.isObject(message.after_tags)) + return "after_tags: object expected"; + let key = Object.keys(message.after_tags); + for (let i = 0; i < key.length; ++i) + if (!$util.isString(message.after_tags[key[i]])) + return "after_tags: string{k:string} expected"; + } + return null; + }; + + /** + * Creates a ChangeTabletTagsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ChangeTabletTagsResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ChangeTabletTagsResponse} ChangeTabletTagsResponse + */ + ChangeTabletTagsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ChangeTabletTagsResponse) + return object; + let message = new $root.vtctldata.ChangeTabletTagsResponse(); + if (object.before_tags) { + if (typeof object.before_tags !== "object") + throw TypeError(".vtctldata.ChangeTabletTagsResponse.before_tags: object expected"); + message.before_tags = {}; + for (let keys = Object.keys(object.before_tags), i = 0; i < keys.length; ++i) + message.before_tags[keys[i]] = String(object.before_tags[keys[i]]); + } + if (object.after_tags) { + if (typeof object.after_tags !== "object") + throw TypeError(".vtctldata.ChangeTabletTagsResponse.after_tags: object expected"); + message.after_tags = {}; + for (let keys = Object.keys(object.after_tags), i = 0; i < keys.length; ++i) + message.after_tags[keys[i]] = String(object.after_tags[keys[i]]); + } + return message; + }; + + /** + * Creates a plain object from a ChangeTabletTagsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ChangeTabletTagsResponse + * @static + * @param {vtctldata.ChangeTabletTagsResponse} message ChangeTabletTagsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ChangeTabletTagsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.objects || options.defaults) { + object.before_tags = {}; + object.after_tags = {}; + } + let keys2; + if (message.before_tags && (keys2 = Object.keys(message.before_tags)).length) { + object.before_tags = {}; + for (let j = 0; j < keys2.length; ++j) + object.before_tags[keys2[j]] = message.before_tags[keys2[j]]; + } + if (message.after_tags && (keys2 = Object.keys(message.after_tags)).length) { + object.after_tags = {}; + for (let j = 0; j < keys2.length; ++j) + object.after_tags[keys2[j]] = message.after_tags[keys2[j]]; + } + return object; + }; + + /** + * Converts this ChangeTabletTagsResponse to JSON. + * @function toJSON + * @memberof vtctldata.ChangeTabletTagsResponse + * @instance + * @returns {Object.} JSON object + */ + ChangeTabletTagsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ChangeTabletTagsResponse + * @function getTypeUrl + * @memberof vtctldata.ChangeTabletTagsResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ChangeTabletTagsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.ChangeTabletTagsResponse"; + }; + + return ChangeTabletTagsResponse; + })(); + vtctldata.ChangeTabletTypeRequest = (function() { /** @@ -130247,6 +140731,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {vttime.IDuration|null} [wait_replicas_timeout] EmergencyReparentShardRequest wait_replicas_timeout * @property {boolean|null} [prevent_cross_cell_promotion] EmergencyReparentShardRequest prevent_cross_cell_promotion * @property {boolean|null} [wait_for_all_tablets] EmergencyReparentShardRequest wait_for_all_tablets + * @property {topodata.ITabletAlias|null} [expected_primary] EmergencyReparentShardRequest expected_primary */ /** @@ -130321,6 +140806,14 @@ export const vtctldata = $root.vtctldata = (() => { */ EmergencyReparentShardRequest.prototype.wait_for_all_tablets = false; + /** + * EmergencyReparentShardRequest expected_primary. + * @member {topodata.ITabletAlias|null|undefined} expected_primary + * @memberof vtctldata.EmergencyReparentShardRequest + * @instance + */ + EmergencyReparentShardRequest.prototype.expected_primary = null; + /** * Creates a new EmergencyReparentShardRequest instance using the specified properties. * @function create @@ -130360,6 +140853,8 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 6, wireType 0 =*/48).bool(message.prevent_cross_cell_promotion); if (message.wait_for_all_tablets != null && Object.hasOwnProperty.call(message, "wait_for_all_tablets")) writer.uint32(/* id 7, wireType 0 =*/56).bool(message.wait_for_all_tablets); + if (message.expected_primary != null && Object.hasOwnProperty.call(message, "expected_primary")) + $root.topodata.TabletAlias.encode(message.expected_primary, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); return writer; }; @@ -130424,6 +140919,10 @@ export const vtctldata = $root.vtctldata = (() => { message.wait_for_all_tablets = reader.bool(); break; } + case 8: { + message.expected_primary = $root.topodata.TabletAlias.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -130490,6 +140989,11 @@ export const vtctldata = $root.vtctldata = (() => { if (message.wait_for_all_tablets != null && message.hasOwnProperty("wait_for_all_tablets")) if (typeof message.wait_for_all_tablets !== "boolean") return "wait_for_all_tablets: boolean expected"; + if (message.expected_primary != null && message.hasOwnProperty("expected_primary")) { + let error = $root.topodata.TabletAlias.verify(message.expected_primary); + if (error) + return "expected_primary." + error; + } return null; }; @@ -130533,6 +141037,11 @@ export const vtctldata = $root.vtctldata = (() => { message.prevent_cross_cell_promotion = Boolean(object.prevent_cross_cell_promotion); if (object.wait_for_all_tablets != null) message.wait_for_all_tablets = Boolean(object.wait_for_all_tablets); + if (object.expected_primary != null) { + if (typeof object.expected_primary !== "object") + throw TypeError(".vtctldata.EmergencyReparentShardRequest.expected_primary: object expected"); + message.expected_primary = $root.topodata.TabletAlias.fromObject(object.expected_primary); + } return message; }; @@ -130558,6 +141067,7 @@ export const vtctldata = $root.vtctldata = (() => { object.wait_replicas_timeout = null; object.prevent_cross_cell_promotion = false; object.wait_for_all_tablets = false; + object.expected_primary = null; } if (message.keyspace != null && message.hasOwnProperty("keyspace")) object.keyspace = message.keyspace; @@ -130576,6 +141086,8 @@ export const vtctldata = $root.vtctldata = (() => { object.prevent_cross_cell_promotion = message.prevent_cross_cell_promotion; if (message.wait_for_all_tablets != null && message.hasOwnProperty("wait_for_all_tablets")) object.wait_for_all_tablets = message.wait_for_all_tablets; + if (message.expected_primary != null && message.hasOwnProperty("expected_primary")) + object.expected_primary = $root.topodata.TabletAlias.toObject(message.expected_primary, options); return object; }; @@ -145582,6 +156094,894 @@ export const vtctldata = $root.vtctldata = (() => { return TopologyCell; })(); + vtctldata.GetUnresolvedTransactionsRequest = (function() { + + /** + * Properties of a GetUnresolvedTransactionsRequest. + * @memberof vtctldata + * @interface IGetUnresolvedTransactionsRequest + * @property {string|null} [keyspace] GetUnresolvedTransactionsRequest keyspace + * @property {number|Long|null} [abandon_age] GetUnresolvedTransactionsRequest abandon_age + */ + + /** + * Constructs a new GetUnresolvedTransactionsRequest. + * @memberof vtctldata + * @classdesc Represents a GetUnresolvedTransactionsRequest. + * @implements IGetUnresolvedTransactionsRequest + * @constructor + * @param {vtctldata.IGetUnresolvedTransactionsRequest=} [properties] Properties to set + */ + function GetUnresolvedTransactionsRequest(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetUnresolvedTransactionsRequest keyspace. + * @member {string} keyspace + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @instance + */ + GetUnresolvedTransactionsRequest.prototype.keyspace = ""; + + /** + * GetUnresolvedTransactionsRequest abandon_age. + * @member {number|Long} abandon_age + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @instance + */ + GetUnresolvedTransactionsRequest.prototype.abandon_age = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new GetUnresolvedTransactionsRequest instance using the specified properties. + * @function create + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @static + * @param {vtctldata.IGetUnresolvedTransactionsRequest=} [properties] Properties to set + * @returns {vtctldata.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest instance + */ + GetUnresolvedTransactionsRequest.create = function create(properties) { + return new GetUnresolvedTransactionsRequest(properties); + }; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message. Does not implicitly {@link vtctldata.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @static + * @param {vtctldata.IGetUnresolvedTransactionsRequest} message GetUnresolvedTransactionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetUnresolvedTransactionsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.keyspace); + if (message.abandon_age != null && Object.hasOwnProperty.call(message, "abandon_age")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.abandon_age); + return writer; + }; + + /** + * Encodes the specified GetUnresolvedTransactionsRequest message, length delimited. Does not implicitly {@link vtctldata.GetUnresolvedTransactionsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @static + * @param {vtctldata.IGetUnresolvedTransactionsRequest} message GetUnresolvedTransactionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetUnresolvedTransactionsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetUnresolvedTransactionsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.GetUnresolvedTransactionsRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.keyspace = reader.string(); + break; + } + case 2: { + message.abandon_age = reader.int64(); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetUnresolvedTransactionsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetUnresolvedTransactionsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetUnresolvedTransactionsRequest message. + * @function verify + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetUnresolvedTransactionsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.abandon_age != null && message.hasOwnProperty("abandon_age")) + if (!$util.isInteger(message.abandon_age) && !(message.abandon_age && $util.isInteger(message.abandon_age.low) && $util.isInteger(message.abandon_age.high))) + return "abandon_age: integer|Long expected"; + return null; + }; + + /** + * Creates a GetUnresolvedTransactionsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.GetUnresolvedTransactionsRequest} GetUnresolvedTransactionsRequest + */ + GetUnresolvedTransactionsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.GetUnresolvedTransactionsRequest) + return object; + let message = new $root.vtctldata.GetUnresolvedTransactionsRequest(); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.abandon_age != null) + if ($util.Long) + (message.abandon_age = $util.Long.fromValue(object.abandon_age)).unsigned = false; + else if (typeof object.abandon_age === "string") + message.abandon_age = parseInt(object.abandon_age, 10); + else if (typeof object.abandon_age === "number") + message.abandon_age = object.abandon_age; + else if (typeof object.abandon_age === "object") + message.abandon_age = new $util.LongBits(object.abandon_age.low >>> 0, object.abandon_age.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a GetUnresolvedTransactionsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @static + * @param {vtctldata.GetUnresolvedTransactionsRequest} message GetUnresolvedTransactionsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetUnresolvedTransactionsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + object.keyspace = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.abandon_age = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.abandon_age = options.longs === String ? "0" : 0; + } + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.abandon_age != null && message.hasOwnProperty("abandon_age")) + if (typeof message.abandon_age === "number") + object.abandon_age = options.longs === String ? String(message.abandon_age) : message.abandon_age; + else + object.abandon_age = options.longs === String ? $util.Long.prototype.toString.call(message.abandon_age) : options.longs === Number ? new $util.LongBits(message.abandon_age.low >>> 0, message.abandon_age.high >>> 0).toNumber() : message.abandon_age; + return object; + }; + + /** + * Converts this GetUnresolvedTransactionsRequest to JSON. + * @function toJSON + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @instance + * @returns {Object.} JSON object + */ + GetUnresolvedTransactionsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for GetUnresolvedTransactionsRequest + * @function getTypeUrl + * @memberof vtctldata.GetUnresolvedTransactionsRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetUnresolvedTransactionsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.GetUnresolvedTransactionsRequest"; + }; + + return GetUnresolvedTransactionsRequest; + })(); + + vtctldata.GetUnresolvedTransactionsResponse = (function() { + + /** + * Properties of a GetUnresolvedTransactionsResponse. + * @memberof vtctldata + * @interface IGetUnresolvedTransactionsResponse + * @property {Array.|null} [transactions] GetUnresolvedTransactionsResponse transactions + */ + + /** + * Constructs a new GetUnresolvedTransactionsResponse. + * @memberof vtctldata + * @classdesc Represents a GetUnresolvedTransactionsResponse. + * @implements IGetUnresolvedTransactionsResponse + * @constructor + * @param {vtctldata.IGetUnresolvedTransactionsResponse=} [properties] Properties to set + */ + function GetUnresolvedTransactionsResponse(properties) { + this.transactions = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetUnresolvedTransactionsResponse transactions. + * @member {Array.} transactions + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @instance + */ + GetUnresolvedTransactionsResponse.prototype.transactions = $util.emptyArray; + + /** + * Creates a new GetUnresolvedTransactionsResponse instance using the specified properties. + * @function create + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @static + * @param {vtctldata.IGetUnresolvedTransactionsResponse=} [properties] Properties to set + * @returns {vtctldata.GetUnresolvedTransactionsResponse} GetUnresolvedTransactionsResponse instance + */ + GetUnresolvedTransactionsResponse.create = function create(properties) { + return new GetUnresolvedTransactionsResponse(properties); + }; + + /** + * Encodes the specified GetUnresolvedTransactionsResponse message. Does not implicitly {@link vtctldata.GetUnresolvedTransactionsResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @static + * @param {vtctldata.IGetUnresolvedTransactionsResponse} message GetUnresolvedTransactionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetUnresolvedTransactionsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.transactions != null && message.transactions.length) + for (let i = 0; i < message.transactions.length; ++i) + $root.query.TransactionMetadata.encode(message.transactions[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetUnresolvedTransactionsResponse message, length delimited. Does not implicitly {@link vtctldata.GetUnresolvedTransactionsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @static + * @param {vtctldata.IGetUnresolvedTransactionsResponse} message GetUnresolvedTransactionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetUnresolvedTransactionsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetUnresolvedTransactionsResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.GetUnresolvedTransactionsResponse} GetUnresolvedTransactionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetUnresolvedTransactionsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.GetUnresolvedTransactionsResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (!(message.transactions && message.transactions.length)) + message.transactions = []; + message.transactions.push($root.query.TransactionMetadata.decode(reader, reader.uint32())); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetUnresolvedTransactionsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.GetUnresolvedTransactionsResponse} GetUnresolvedTransactionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetUnresolvedTransactionsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetUnresolvedTransactionsResponse message. + * @function verify + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetUnresolvedTransactionsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.transactions != null && message.hasOwnProperty("transactions")) { + if (!Array.isArray(message.transactions)) + return "transactions: array expected"; + for (let i = 0; i < message.transactions.length; ++i) { + let error = $root.query.TransactionMetadata.verify(message.transactions[i]); + if (error) + return "transactions." + error; + } + } + return null; + }; + + /** + * Creates a GetUnresolvedTransactionsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.GetUnresolvedTransactionsResponse} GetUnresolvedTransactionsResponse + */ + GetUnresolvedTransactionsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.GetUnresolvedTransactionsResponse) + return object; + let message = new $root.vtctldata.GetUnresolvedTransactionsResponse(); + if (object.transactions) { + if (!Array.isArray(object.transactions)) + throw TypeError(".vtctldata.GetUnresolvedTransactionsResponse.transactions: array expected"); + message.transactions = []; + for (let i = 0; i < object.transactions.length; ++i) { + if (typeof object.transactions[i] !== "object") + throw TypeError(".vtctldata.GetUnresolvedTransactionsResponse.transactions: object expected"); + message.transactions[i] = $root.query.TransactionMetadata.fromObject(object.transactions[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a GetUnresolvedTransactionsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @static + * @param {vtctldata.GetUnresolvedTransactionsResponse} message GetUnresolvedTransactionsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetUnresolvedTransactionsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.transactions = []; + if (message.transactions && message.transactions.length) { + object.transactions = []; + for (let j = 0; j < message.transactions.length; ++j) + object.transactions[j] = $root.query.TransactionMetadata.toObject(message.transactions[j], options); + } + return object; + }; + + /** + * Converts this GetUnresolvedTransactionsResponse to JSON. + * @function toJSON + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @instance + * @returns {Object.} JSON object + */ + GetUnresolvedTransactionsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for GetUnresolvedTransactionsResponse + * @function getTypeUrl + * @memberof vtctldata.GetUnresolvedTransactionsResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + GetUnresolvedTransactionsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.GetUnresolvedTransactionsResponse"; + }; + + return GetUnresolvedTransactionsResponse; + })(); + + vtctldata.ConcludeTransactionRequest = (function() { + + /** + * Properties of a ConcludeTransactionRequest. + * @memberof vtctldata + * @interface IConcludeTransactionRequest + * @property {string|null} [dtid] ConcludeTransactionRequest dtid + * @property {Array.|null} [participants] ConcludeTransactionRequest participants + */ + + /** + * Constructs a new ConcludeTransactionRequest. + * @memberof vtctldata + * @classdesc Represents a ConcludeTransactionRequest. + * @implements IConcludeTransactionRequest + * @constructor + * @param {vtctldata.IConcludeTransactionRequest=} [properties] Properties to set + */ + function ConcludeTransactionRequest(properties) { + this.participants = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ConcludeTransactionRequest dtid. + * @member {string} dtid + * @memberof vtctldata.ConcludeTransactionRequest + * @instance + */ + ConcludeTransactionRequest.prototype.dtid = ""; + + /** + * ConcludeTransactionRequest participants. + * @member {Array.} participants + * @memberof vtctldata.ConcludeTransactionRequest + * @instance + */ + ConcludeTransactionRequest.prototype.participants = $util.emptyArray; + + /** + * Creates a new ConcludeTransactionRequest instance using the specified properties. + * @function create + * @memberof vtctldata.ConcludeTransactionRequest + * @static + * @param {vtctldata.IConcludeTransactionRequest=} [properties] Properties to set + * @returns {vtctldata.ConcludeTransactionRequest} ConcludeTransactionRequest instance + */ + ConcludeTransactionRequest.create = function create(properties) { + return new ConcludeTransactionRequest(properties); + }; + + /** + * Encodes the specified ConcludeTransactionRequest message. Does not implicitly {@link vtctldata.ConcludeTransactionRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.ConcludeTransactionRequest + * @static + * @param {vtctldata.IConcludeTransactionRequest} message ConcludeTransactionRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ConcludeTransactionRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.dtid != null && Object.hasOwnProperty.call(message, "dtid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.dtid); + if (message.participants != null && message.participants.length) + for (let i = 0; i < message.participants.length; ++i) + $root.query.Target.encode(message.participants[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ConcludeTransactionRequest message, length delimited. Does not implicitly {@link vtctldata.ConcludeTransactionRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ConcludeTransactionRequest + * @static + * @param {vtctldata.IConcludeTransactionRequest} message ConcludeTransactionRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ConcludeTransactionRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ConcludeTransactionRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ConcludeTransactionRequest} ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ConcludeTransactionRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ConcludeTransactionRequest(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.dtid = reader.string(); + break; + } + case 2: { + if (!(message.participants && message.participants.length)) + message.participants = []; + message.participants.push($root.query.Target.decode(reader, reader.uint32())); + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ConcludeTransactionRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ConcludeTransactionRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ConcludeTransactionRequest} ConcludeTransactionRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ConcludeTransactionRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ConcludeTransactionRequest message. + * @function verify + * @memberof vtctldata.ConcludeTransactionRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ConcludeTransactionRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.dtid != null && message.hasOwnProperty("dtid")) + if (!$util.isString(message.dtid)) + return "dtid: string expected"; + if (message.participants != null && message.hasOwnProperty("participants")) { + if (!Array.isArray(message.participants)) + return "participants: array expected"; + for (let i = 0; i < message.participants.length; ++i) { + let error = $root.query.Target.verify(message.participants[i]); + if (error) + return "participants." + error; + } + } + return null; + }; + + /** + * Creates a ConcludeTransactionRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ConcludeTransactionRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ConcludeTransactionRequest} ConcludeTransactionRequest + */ + ConcludeTransactionRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ConcludeTransactionRequest) + return object; + let message = new $root.vtctldata.ConcludeTransactionRequest(); + if (object.dtid != null) + message.dtid = String(object.dtid); + if (object.participants) { + if (!Array.isArray(object.participants)) + throw TypeError(".vtctldata.ConcludeTransactionRequest.participants: array expected"); + message.participants = []; + for (let i = 0; i < object.participants.length; ++i) { + if (typeof object.participants[i] !== "object") + throw TypeError(".vtctldata.ConcludeTransactionRequest.participants: object expected"); + message.participants[i] = $root.query.Target.fromObject(object.participants[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a ConcludeTransactionRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ConcludeTransactionRequest + * @static + * @param {vtctldata.ConcludeTransactionRequest} message ConcludeTransactionRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ConcludeTransactionRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.participants = []; + if (options.defaults) + object.dtid = ""; + if (message.dtid != null && message.hasOwnProperty("dtid")) + object.dtid = message.dtid; + if (message.participants && message.participants.length) { + object.participants = []; + for (let j = 0; j < message.participants.length; ++j) + object.participants[j] = $root.query.Target.toObject(message.participants[j], options); + } + return object; + }; + + /** + * Converts this ConcludeTransactionRequest to JSON. + * @function toJSON + * @memberof vtctldata.ConcludeTransactionRequest + * @instance + * @returns {Object.} JSON object + */ + ConcludeTransactionRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ConcludeTransactionRequest + * @function getTypeUrl + * @memberof vtctldata.ConcludeTransactionRequest + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ConcludeTransactionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.ConcludeTransactionRequest"; + }; + + return ConcludeTransactionRequest; + })(); + + vtctldata.ConcludeTransactionResponse = (function() { + + /** + * Properties of a ConcludeTransactionResponse. + * @memberof vtctldata + * @interface IConcludeTransactionResponse + */ + + /** + * Constructs a new ConcludeTransactionResponse. + * @memberof vtctldata + * @classdesc Represents a ConcludeTransactionResponse. + * @implements IConcludeTransactionResponse + * @constructor + * @param {vtctldata.IConcludeTransactionResponse=} [properties] Properties to set + */ + function ConcludeTransactionResponse(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new ConcludeTransactionResponse instance using the specified properties. + * @function create + * @memberof vtctldata.ConcludeTransactionResponse + * @static + * @param {vtctldata.IConcludeTransactionResponse=} [properties] Properties to set + * @returns {vtctldata.ConcludeTransactionResponse} ConcludeTransactionResponse instance + */ + ConcludeTransactionResponse.create = function create(properties) { + return new ConcludeTransactionResponse(properties); + }; + + /** + * Encodes the specified ConcludeTransactionResponse message. Does not implicitly {@link vtctldata.ConcludeTransactionResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.ConcludeTransactionResponse + * @static + * @param {vtctldata.IConcludeTransactionResponse} message ConcludeTransactionResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ConcludeTransactionResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified ConcludeTransactionResponse message, length delimited. Does not implicitly {@link vtctldata.ConcludeTransactionResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ConcludeTransactionResponse + * @static + * @param {vtctldata.IConcludeTransactionResponse} message ConcludeTransactionResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ConcludeTransactionResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ConcludeTransactionResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ConcludeTransactionResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ConcludeTransactionResponse} ConcludeTransactionResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ConcludeTransactionResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ConcludeTransactionResponse(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ConcludeTransactionResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ConcludeTransactionResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ConcludeTransactionResponse} ConcludeTransactionResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ConcludeTransactionResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ConcludeTransactionResponse message. + * @function verify + * @memberof vtctldata.ConcludeTransactionResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ConcludeTransactionResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a ConcludeTransactionResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ConcludeTransactionResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ConcludeTransactionResponse} ConcludeTransactionResponse + */ + ConcludeTransactionResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ConcludeTransactionResponse) + return object; + return new $root.vtctldata.ConcludeTransactionResponse(); + }; + + /** + * Creates a plain object from a ConcludeTransactionResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ConcludeTransactionResponse + * @static + * @param {vtctldata.ConcludeTransactionResponse} message ConcludeTransactionResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ConcludeTransactionResponse.toObject = function toObject() { + return {}; + }; + + /** + * Converts this ConcludeTransactionResponse to JSON. + * @function toJSON + * @memberof vtctldata.ConcludeTransactionResponse + * @instance + * @returns {Object.} JSON object + */ + ConcludeTransactionResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for ConcludeTransactionResponse + * @function getTypeUrl + * @memberof vtctldata.ConcludeTransactionResponse + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + ConcludeTransactionResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/vtctldata.ConcludeTransactionResponse"; + }; + + return ConcludeTransactionResponse; + })(); + vtctldata.GetVSchemaRequest = (function() { /** @@ -154750,6 +166150,8 @@ export const vtctldata = $root.vtctldata = (() => { * @property {topodata.ITabletAlias|null} [avoid_primary] PlannedReparentShardRequest avoid_primary * @property {vttime.IDuration|null} [wait_replicas_timeout] PlannedReparentShardRequest wait_replicas_timeout * @property {vttime.IDuration|null} [tolerable_replication_lag] PlannedReparentShardRequest tolerable_replication_lag + * @property {boolean|null} [allow_cross_cell_promotion] PlannedReparentShardRequest allow_cross_cell_promotion + * @property {topodata.ITabletAlias|null} [expected_primary] PlannedReparentShardRequest expected_primary */ /** @@ -154815,6 +166217,22 @@ export const vtctldata = $root.vtctldata = (() => { */ PlannedReparentShardRequest.prototype.tolerable_replication_lag = null; + /** + * PlannedReparentShardRequest allow_cross_cell_promotion. + * @member {boolean} allow_cross_cell_promotion + * @memberof vtctldata.PlannedReparentShardRequest + * @instance + */ + PlannedReparentShardRequest.prototype.allow_cross_cell_promotion = false; + + /** + * PlannedReparentShardRequest expected_primary. + * @member {topodata.ITabletAlias|null|undefined} expected_primary + * @memberof vtctldata.PlannedReparentShardRequest + * @instance + */ + PlannedReparentShardRequest.prototype.expected_primary = null; + /** * Creates a new PlannedReparentShardRequest instance using the specified properties. * @function create @@ -154851,6 +166269,10 @@ export const vtctldata = $root.vtctldata = (() => { $root.vttime.Duration.encode(message.wait_replicas_timeout, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.tolerable_replication_lag != null && Object.hasOwnProperty.call(message, "tolerable_replication_lag")) $root.vttime.Duration.encode(message.tolerable_replication_lag, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.allow_cross_cell_promotion != null && Object.hasOwnProperty.call(message, "allow_cross_cell_promotion")) + writer.uint32(/* id 7, wireType 0 =*/56).bool(message.allow_cross_cell_promotion); + if (message.expected_primary != null && Object.hasOwnProperty.call(message, "expected_primary")) + $root.topodata.TabletAlias.encode(message.expected_primary, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); return writer; }; @@ -154909,6 +166331,14 @@ export const vtctldata = $root.vtctldata = (() => { message.tolerable_replication_lag = $root.vttime.Duration.decode(reader, reader.uint32()); break; } + case 7: { + message.allow_cross_cell_promotion = reader.bool(); + break; + } + case 8: { + message.expected_primary = $root.topodata.TabletAlias.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -154970,6 +166400,14 @@ export const vtctldata = $root.vtctldata = (() => { if (error) return "tolerable_replication_lag." + error; } + if (message.allow_cross_cell_promotion != null && message.hasOwnProperty("allow_cross_cell_promotion")) + if (typeof message.allow_cross_cell_promotion !== "boolean") + return "allow_cross_cell_promotion: boolean expected"; + if (message.expected_primary != null && message.hasOwnProperty("expected_primary")) { + let error = $root.topodata.TabletAlias.verify(message.expected_primary); + if (error) + return "expected_primary." + error; + } return null; }; @@ -155009,6 +166447,13 @@ export const vtctldata = $root.vtctldata = (() => { throw TypeError(".vtctldata.PlannedReparentShardRequest.tolerable_replication_lag: object expected"); message.tolerable_replication_lag = $root.vttime.Duration.fromObject(object.tolerable_replication_lag); } + if (object.allow_cross_cell_promotion != null) + message.allow_cross_cell_promotion = Boolean(object.allow_cross_cell_promotion); + if (object.expected_primary != null) { + if (typeof object.expected_primary !== "object") + throw TypeError(".vtctldata.PlannedReparentShardRequest.expected_primary: object expected"); + message.expected_primary = $root.topodata.TabletAlias.fromObject(object.expected_primary); + } return message; }; @@ -155032,6 +166477,8 @@ export const vtctldata = $root.vtctldata = (() => { object.avoid_primary = null; object.wait_replicas_timeout = null; object.tolerable_replication_lag = null; + object.allow_cross_cell_promotion = false; + object.expected_primary = null; } if (message.keyspace != null && message.hasOwnProperty("keyspace")) object.keyspace = message.keyspace; @@ -155045,6 +166492,10 @@ export const vtctldata = $root.vtctldata = (() => { object.wait_replicas_timeout = $root.vttime.Duration.toObject(message.wait_replicas_timeout, options); if (message.tolerable_replication_lag != null && message.hasOwnProperty("tolerable_replication_lag")) object.tolerable_replication_lag = $root.vttime.Duration.toObject(message.tolerable_replication_lag, options); + if (message.allow_cross_cell_promotion != null && message.hasOwnProperty("allow_cross_cell_promotion")) + object.allow_cross_cell_promotion = message.allow_cross_cell_promotion; + if (message.expected_primary != null && message.hasOwnProperty("expected_primary")) + object.expected_primary = $root.topodata.TabletAlias.toObject(message.expected_primary, options); return object; }; @@ -160315,6 +171766,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {boolean|null} [stop_after_copy] ReshardCreateRequest stop_after_copy * @property {boolean|null} [defer_secondary_keys] ReshardCreateRequest defer_secondary_keys * @property {boolean|null} [auto_start] ReshardCreateRequest auto_start + * @property {vtctldata.IWorkflowOptions|null} [workflow_options] ReshardCreateRequest workflow_options */ /** @@ -160432,6 +171884,14 @@ export const vtctldata = $root.vtctldata = (() => { */ ReshardCreateRequest.prototype.auto_start = false; + /** + * ReshardCreateRequest workflow_options. + * @member {vtctldata.IWorkflowOptions|null|undefined} workflow_options + * @memberof vtctldata.ReshardCreateRequest + * @instance + */ + ReshardCreateRequest.prototype.workflow_options = null; + /** * Creates a new ReshardCreateRequest instance using the specified properties. * @function create @@ -160487,6 +171947,8 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 11, wireType 0 =*/88).bool(message.defer_secondary_keys); if (message.auto_start != null && Object.hasOwnProperty.call(message, "auto_start")) writer.uint32(/* id 12, wireType 0 =*/96).bool(message.auto_start); + if (message.workflow_options != null && Object.hasOwnProperty.call(message, "workflow_options")) + $root.vtctldata.WorkflowOptions.encode(message.workflow_options, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); return writer; }; @@ -160582,6 +172044,10 @@ export const vtctldata = $root.vtctldata = (() => { message.auto_start = reader.bool(); break; } + case 13: { + message.workflow_options = $root.vtctldata.WorkflowOptions.decode(reader, reader.uint32()); + break; + } default: reader.skipType(tag & 7); break; @@ -160689,6 +172155,11 @@ export const vtctldata = $root.vtctldata = (() => { if (message.auto_start != null && message.hasOwnProperty("auto_start")) if (typeof message.auto_start !== "boolean") return "auto_start: boolean expected"; + if (message.workflow_options != null && message.hasOwnProperty("workflow_options")) { + let error = $root.vtctldata.WorkflowOptions.verify(message.workflow_options); + if (error) + return "workflow_options." + error; + } return null; }; @@ -160816,6 +172287,11 @@ export const vtctldata = $root.vtctldata = (() => { message.defer_secondary_keys = Boolean(object.defer_secondary_keys); if (object.auto_start != null) message.auto_start = Boolean(object.auto_start); + if (object.workflow_options != null) { + if (typeof object.workflow_options !== "object") + throw TypeError(".vtctldata.ReshardCreateRequest.workflow_options: object expected"); + message.workflow_options = $root.vtctldata.WorkflowOptions.fromObject(object.workflow_options); + } return message; }; @@ -160847,6 +172323,7 @@ export const vtctldata = $root.vtctldata = (() => { object.stop_after_copy = false; object.defer_secondary_keys = false; object.auto_start = false; + object.workflow_options = null; } if (message.workflow != null && message.hasOwnProperty("workflow")) object.workflow = message.workflow; @@ -160884,6 +172361,8 @@ export const vtctldata = $root.vtctldata = (() => { object.defer_secondary_keys = message.defer_secondary_keys; if (message.auto_start != null && message.hasOwnProperty("auto_start")) object.auto_start = message.auto_start; + if (message.workflow_options != null && message.hasOwnProperty("workflow_options")) + object.workflow_options = $root.vtctldata.WorkflowOptions.toObject(message.workflow_options, options); return object; }; @@ -160927,6 +172406,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {string|null} [restore_to_pos] RestoreFromBackupRequest restore_to_pos * @property {boolean|null} [dry_run] RestoreFromBackupRequest dry_run * @property {vttime.ITime|null} [restore_to_timestamp] RestoreFromBackupRequest restore_to_timestamp + * @property {Array.|null} [allowed_backup_engines] RestoreFromBackupRequest allowed_backup_engines */ /** @@ -160938,6 +172418,7 @@ export const vtctldata = $root.vtctldata = (() => { * @param {vtctldata.IRestoreFromBackupRequest=} [properties] Properties to set */ function RestoreFromBackupRequest(properties) { + this.allowed_backup_engines = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -160984,6 +172465,14 @@ export const vtctldata = $root.vtctldata = (() => { */ RestoreFromBackupRequest.prototype.restore_to_timestamp = null; + /** + * RestoreFromBackupRequest allowed_backup_engines. + * @member {Array.} allowed_backup_engines + * @memberof vtctldata.RestoreFromBackupRequest + * @instance + */ + RestoreFromBackupRequest.prototype.allowed_backup_engines = $util.emptyArray; + /** * Creates a new RestoreFromBackupRequest instance using the specified properties. * @function create @@ -161018,6 +172507,9 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 4, wireType 0 =*/32).bool(message.dry_run); if (message.restore_to_timestamp != null && Object.hasOwnProperty.call(message, "restore_to_timestamp")) $root.vttime.Time.encode(message.restore_to_timestamp, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.allowed_backup_engines != null && message.allowed_backup_engines.length) + for (let i = 0; i < message.allowed_backup_engines.length; ++i) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.allowed_backup_engines[i]); return writer; }; @@ -161072,6 +172564,12 @@ export const vtctldata = $root.vtctldata = (() => { message.restore_to_timestamp = $root.vttime.Time.decode(reader, reader.uint32()); break; } + case 6: { + if (!(message.allowed_backup_engines && message.allowed_backup_engines.length)) + message.allowed_backup_engines = []; + message.allowed_backup_engines.push(reader.string()); + break; + } default: reader.skipType(tag & 7); break; @@ -161128,6 +172626,13 @@ export const vtctldata = $root.vtctldata = (() => { if (error) return "restore_to_timestamp." + error; } + if (message.allowed_backup_engines != null && message.hasOwnProperty("allowed_backup_engines")) { + if (!Array.isArray(message.allowed_backup_engines)) + return "allowed_backup_engines: array expected"; + for (let i = 0; i < message.allowed_backup_engines.length; ++i) + if (!$util.isString(message.allowed_backup_engines[i])) + return "allowed_backup_engines: string[] expected"; + } return null; }; @@ -161162,6 +172667,13 @@ export const vtctldata = $root.vtctldata = (() => { throw TypeError(".vtctldata.RestoreFromBackupRequest.restore_to_timestamp: object expected"); message.restore_to_timestamp = $root.vttime.Time.fromObject(object.restore_to_timestamp); } + if (object.allowed_backup_engines) { + if (!Array.isArray(object.allowed_backup_engines)) + throw TypeError(".vtctldata.RestoreFromBackupRequest.allowed_backup_engines: array expected"); + message.allowed_backup_engines = []; + for (let i = 0; i < object.allowed_backup_engines.length; ++i) + message.allowed_backup_engines[i] = String(object.allowed_backup_engines[i]); + } return message; }; @@ -161178,6 +172690,8 @@ export const vtctldata = $root.vtctldata = (() => { if (!options) options = {}; let object = {}; + if (options.arrays || options.defaults) + object.allowed_backup_engines = []; if (options.defaults) { object.tablet_alias = null; object.backup_time = null; @@ -161195,6 +172709,11 @@ export const vtctldata = $root.vtctldata = (() => { object.dry_run = message.dry_run; if (message.restore_to_timestamp != null && message.hasOwnProperty("restore_to_timestamp")) object.restore_to_timestamp = $root.vttime.Time.toObject(message.restore_to_timestamp, options); + if (message.allowed_backup_engines && message.allowed_backup_engines.length) { + object.allowed_backup_engines = []; + for (let j = 0; j < message.allowed_backup_engines.length; ++j) + object.allowed_backup_engines[j] = message.allowed_backup_engines[j]; + } return object; }; @@ -173852,6 +185371,8 @@ export const vtctldata = $root.vtctldata = (() => { * @property {boolean|null} [verbose] VDiffCreateRequest verbose * @property {number|Long|null} [max_report_sample_rows] VDiffCreateRequest max_report_sample_rows * @property {vttime.IDuration|null} [max_diff_duration] VDiffCreateRequest max_diff_duration + * @property {number|Long|null} [row_diff_column_truncate_at] VDiffCreateRequest row_diff_column_truncate_at + * @property {boolean|null} [auto_start] VDiffCreateRequest auto_start */ /** @@ -174033,6 +185554,36 @@ export const vtctldata = $root.vtctldata = (() => { */ VDiffCreateRequest.prototype.max_diff_duration = null; + /** + * VDiffCreateRequest row_diff_column_truncate_at. + * @member {number|Long} row_diff_column_truncate_at + * @memberof vtctldata.VDiffCreateRequest + * @instance + */ + VDiffCreateRequest.prototype.row_diff_column_truncate_at = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * VDiffCreateRequest auto_start. + * @member {boolean|null|undefined} auto_start + * @memberof vtctldata.VDiffCreateRequest + * @instance + */ + VDiffCreateRequest.prototype.auto_start = null; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * VDiffCreateRequest _auto_start. + * @member {"auto_start"|undefined} _auto_start + * @memberof vtctldata.VDiffCreateRequest + * @instance + */ + Object.defineProperty(VDiffCreateRequest.prototype, "_auto_start", { + get: $util.oneOfGetter($oneOfFields = ["auto_start"]), + set: $util.oneOfSetter($oneOfFields) + }); + /** * Creates a new VDiffCreateRequest instance using the specified properties. * @function create @@ -174104,6 +185655,10 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 19, wireType 0 =*/152).int64(message.max_report_sample_rows); if (message.max_diff_duration != null && Object.hasOwnProperty.call(message, "max_diff_duration")) $root.vttime.Duration.encode(message.max_diff_duration, writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim(); + if (message.row_diff_column_truncate_at != null && Object.hasOwnProperty.call(message, "row_diff_column_truncate_at")) + writer.uint32(/* id 21, wireType 0 =*/168).int64(message.row_diff_column_truncate_at); + if (message.auto_start != null && Object.hasOwnProperty.call(message, "auto_start")) + writer.uint32(/* id 22, wireType 0 =*/176).bool(message.auto_start); return writer; }; @@ -174231,6 +185786,14 @@ export const vtctldata = $root.vtctldata = (() => { message.max_diff_duration = $root.vttime.Duration.decode(reader, reader.uint32()); break; } + case 21: { + message.row_diff_column_truncate_at = reader.int64(); + break; + } + case 22: { + message.auto_start = reader.bool(); + break; + } default: reader.skipType(tag & 7); break; @@ -174266,6 +185829,7 @@ export const vtctldata = $root.vtctldata = (() => { VDiffCreateRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; + let properties = {}; if (message.workflow != null && message.hasOwnProperty("workflow")) if (!$util.isString(message.workflow)) return "workflow: string expected"; @@ -174368,6 +185932,14 @@ export const vtctldata = $root.vtctldata = (() => { if (error) return "max_diff_duration." + error; } + if (message.row_diff_column_truncate_at != null && message.hasOwnProperty("row_diff_column_truncate_at")) + if (!$util.isInteger(message.row_diff_column_truncate_at) && !(message.row_diff_column_truncate_at && $util.isInteger(message.row_diff_column_truncate_at.low) && $util.isInteger(message.row_diff_column_truncate_at.high))) + return "row_diff_column_truncate_at: integer|Long expected"; + if (message.auto_start != null && message.hasOwnProperty("auto_start")) { + properties._auto_start = 1; + if (typeof message.auto_start !== "boolean") + return "auto_start: boolean expected"; + } return null; }; @@ -174541,6 +186113,17 @@ export const vtctldata = $root.vtctldata = (() => { throw TypeError(".vtctldata.VDiffCreateRequest.max_diff_duration: object expected"); message.max_diff_duration = $root.vttime.Duration.fromObject(object.max_diff_duration); } + if (object.row_diff_column_truncate_at != null) + if ($util.Long) + (message.row_diff_column_truncate_at = $util.Long.fromValue(object.row_diff_column_truncate_at)).unsigned = false; + else if (typeof object.row_diff_column_truncate_at === "string") + message.row_diff_column_truncate_at = parseInt(object.row_diff_column_truncate_at, 10); + else if (typeof object.row_diff_column_truncate_at === "number") + message.row_diff_column_truncate_at = object.row_diff_column_truncate_at; + else if (typeof object.row_diff_column_truncate_at === "object") + message.row_diff_column_truncate_at = new $util.LongBits(object.row_diff_column_truncate_at.low >>> 0, object.row_diff_column_truncate_at.high >>> 0).toNumber(); + if (object.auto_start != null) + message.auto_start = Boolean(object.auto_start); return message; }; @@ -174592,6 +186175,11 @@ export const vtctldata = $root.vtctldata = (() => { } else object.max_report_sample_rows = options.longs === String ? "0" : 0; object.max_diff_duration = null; + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.row_diff_column_truncate_at = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.row_diff_column_truncate_at = options.longs === String ? "0" : 0; } if (message.workflow != null && message.hasOwnProperty("workflow")) object.workflow = message.workflow; @@ -174654,6 +186242,16 @@ export const vtctldata = $root.vtctldata = (() => { object.max_report_sample_rows = options.longs === String ? $util.Long.prototype.toString.call(message.max_report_sample_rows) : options.longs === Number ? new $util.LongBits(message.max_report_sample_rows.low >>> 0, message.max_report_sample_rows.high >>> 0).toNumber() : message.max_report_sample_rows; if (message.max_diff_duration != null && message.hasOwnProperty("max_diff_duration")) object.max_diff_duration = $root.vttime.Duration.toObject(message.max_diff_duration, options); + if (message.row_diff_column_truncate_at != null && message.hasOwnProperty("row_diff_column_truncate_at")) + if (typeof message.row_diff_column_truncate_at === "number") + object.row_diff_column_truncate_at = options.longs === String ? String(message.row_diff_column_truncate_at) : message.row_diff_column_truncate_at; + else + object.row_diff_column_truncate_at = options.longs === String ? $util.Long.prototype.toString.call(message.row_diff_column_truncate_at) : options.longs === Number ? new $util.LongBits(message.row_diff_column_truncate_at.low >>> 0, message.row_diff_column_truncate_at.high >>> 0).toNumber() : message.row_diff_column_truncate_at; + if (message.auto_start != null && message.hasOwnProperty("auto_start")) { + object.auto_start = message.auto_start; + if (options.oneofs) + object._auto_start = "auto_start"; + } return object; }; @@ -175323,6 +186921,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {string|null} [workflow] VDiffResumeRequest workflow * @property {string|null} [target_keyspace] VDiffResumeRequest target_keyspace * @property {string|null} [uuid] VDiffResumeRequest uuid + * @property {Array.|null} [target_shards] VDiffResumeRequest target_shards */ /** @@ -175334,6 +186933,7 @@ export const vtctldata = $root.vtctldata = (() => { * @param {vtctldata.IVDiffResumeRequest=} [properties] Properties to set */ function VDiffResumeRequest(properties) { + this.target_shards = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -175364,6 +186964,14 @@ export const vtctldata = $root.vtctldata = (() => { */ VDiffResumeRequest.prototype.uuid = ""; + /** + * VDiffResumeRequest target_shards. + * @member {Array.} target_shards + * @memberof vtctldata.VDiffResumeRequest + * @instance + */ + VDiffResumeRequest.prototype.target_shards = $util.emptyArray; + /** * Creates a new VDiffResumeRequest instance using the specified properties. * @function create @@ -175394,6 +187002,9 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 2, wireType 2 =*/18).string(message.target_keyspace); if (message.uuid != null && Object.hasOwnProperty.call(message, "uuid")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.uuid); + if (message.target_shards != null && message.target_shards.length) + for (let i = 0; i < message.target_shards.length; ++i) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.target_shards[i]); return writer; }; @@ -175440,6 +187051,12 @@ export const vtctldata = $root.vtctldata = (() => { message.uuid = reader.string(); break; } + case 4: { + if (!(message.target_shards && message.target_shards.length)) + message.target_shards = []; + message.target_shards.push(reader.string()); + break; + } default: reader.skipType(tag & 7); break; @@ -175484,6 +187101,13 @@ export const vtctldata = $root.vtctldata = (() => { if (message.uuid != null && message.hasOwnProperty("uuid")) if (!$util.isString(message.uuid)) return "uuid: string expected"; + if (message.target_shards != null && message.hasOwnProperty("target_shards")) { + if (!Array.isArray(message.target_shards)) + return "target_shards: array expected"; + for (let i = 0; i < message.target_shards.length; ++i) + if (!$util.isString(message.target_shards[i])) + return "target_shards: string[] expected"; + } return null; }; @@ -175505,6 +187129,13 @@ export const vtctldata = $root.vtctldata = (() => { message.target_keyspace = String(object.target_keyspace); if (object.uuid != null) message.uuid = String(object.uuid); + if (object.target_shards) { + if (!Array.isArray(object.target_shards)) + throw TypeError(".vtctldata.VDiffResumeRequest.target_shards: array expected"); + message.target_shards = []; + for (let i = 0; i < object.target_shards.length; ++i) + message.target_shards[i] = String(object.target_shards[i]); + } return message; }; @@ -175521,6 +187152,8 @@ export const vtctldata = $root.vtctldata = (() => { if (!options) options = {}; let object = {}; + if (options.arrays || options.defaults) + object.target_shards = []; if (options.defaults) { object.workflow = ""; object.target_keyspace = ""; @@ -175532,6 +187165,11 @@ export const vtctldata = $root.vtctldata = (() => { object.target_keyspace = message.target_keyspace; if (message.uuid != null && message.hasOwnProperty("uuid")) object.uuid = message.uuid; + if (message.target_shards && message.target_shards.length) { + object.target_shards = []; + for (let j = 0; j < message.target_shards.length; ++j) + object.target_shards[j] = message.target_shards[j]; + } return object; }; @@ -176243,6 +187881,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {string|null} [workflow] VDiffStopRequest workflow * @property {string|null} [target_keyspace] VDiffStopRequest target_keyspace * @property {string|null} [uuid] VDiffStopRequest uuid + * @property {Array.|null} [target_shards] VDiffStopRequest target_shards */ /** @@ -176254,6 +187893,7 @@ export const vtctldata = $root.vtctldata = (() => { * @param {vtctldata.IVDiffStopRequest=} [properties] Properties to set */ function VDiffStopRequest(properties) { + this.target_shards = []; if (properties) for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -176284,6 +187924,14 @@ export const vtctldata = $root.vtctldata = (() => { */ VDiffStopRequest.prototype.uuid = ""; + /** + * VDiffStopRequest target_shards. + * @member {Array.} target_shards + * @memberof vtctldata.VDiffStopRequest + * @instance + */ + VDiffStopRequest.prototype.target_shards = $util.emptyArray; + /** * Creates a new VDiffStopRequest instance using the specified properties. * @function create @@ -176314,6 +187962,9 @@ export const vtctldata = $root.vtctldata = (() => { writer.uint32(/* id 2, wireType 2 =*/18).string(message.target_keyspace); if (message.uuid != null && Object.hasOwnProperty.call(message, "uuid")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.uuid); + if (message.target_shards != null && message.target_shards.length) + for (let i = 0; i < message.target_shards.length; ++i) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.target_shards[i]); return writer; }; @@ -176360,6 +188011,12 @@ export const vtctldata = $root.vtctldata = (() => { message.uuid = reader.string(); break; } + case 4: { + if (!(message.target_shards && message.target_shards.length)) + message.target_shards = []; + message.target_shards.push(reader.string()); + break; + } default: reader.skipType(tag & 7); break; @@ -176404,6 +188061,13 @@ export const vtctldata = $root.vtctldata = (() => { if (message.uuid != null && message.hasOwnProperty("uuid")) if (!$util.isString(message.uuid)) return "uuid: string expected"; + if (message.target_shards != null && message.hasOwnProperty("target_shards")) { + if (!Array.isArray(message.target_shards)) + return "target_shards: array expected"; + for (let i = 0; i < message.target_shards.length; ++i) + if (!$util.isString(message.target_shards[i])) + return "target_shards: string[] expected"; + } return null; }; @@ -176425,6 +188089,13 @@ export const vtctldata = $root.vtctldata = (() => { message.target_keyspace = String(object.target_keyspace); if (object.uuid != null) message.uuid = String(object.uuid); + if (object.target_shards) { + if (!Array.isArray(object.target_shards)) + throw TypeError(".vtctldata.VDiffStopRequest.target_shards: array expected"); + message.target_shards = []; + for (let i = 0; i < object.target_shards.length; ++i) + message.target_shards[i] = String(object.target_shards[i]); + } return message; }; @@ -176441,6 +188112,8 @@ export const vtctldata = $root.vtctldata = (() => { if (!options) options = {}; let object = {}; + if (options.arrays || options.defaults) + object.target_shards = []; if (options.defaults) { object.workflow = ""; object.target_keyspace = ""; @@ -176452,6 +188125,11 @@ export const vtctldata = $root.vtctldata = (() => { object.target_keyspace = message.target_keyspace; if (message.uuid != null && message.hasOwnProperty("uuid")) object.uuid = message.uuid; + if (message.target_shards && message.target_shards.length) { + object.target_shards = []; + for (let j = 0; j < message.target_shards.length; ++j) + object.target_shards[j] = message.target_shards[j]; + } return object; }; @@ -176670,6 +188348,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {boolean|null} [keep_data] WorkflowDeleteRequest keep_data * @property {boolean|null} [keep_routing_rules] WorkflowDeleteRequest keep_routing_rules * @property {Array.|null} [shards] WorkflowDeleteRequest shards + * @property {number|Long|null} [delete_batch_size] WorkflowDeleteRequest delete_batch_size */ /** @@ -176728,6 +188407,14 @@ export const vtctldata = $root.vtctldata = (() => { */ WorkflowDeleteRequest.prototype.shards = $util.emptyArray; + /** + * WorkflowDeleteRequest delete_batch_size. + * @member {number|Long} delete_batch_size + * @memberof vtctldata.WorkflowDeleteRequest + * @instance + */ + WorkflowDeleteRequest.prototype.delete_batch_size = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + /** * Creates a new WorkflowDeleteRequest instance using the specified properties. * @function create @@ -176763,6 +188450,8 @@ export const vtctldata = $root.vtctldata = (() => { if (message.shards != null && message.shards.length) for (let i = 0; i < message.shards.length; ++i) writer.uint32(/* id 5, wireType 2 =*/42).string(message.shards[i]); + if (message.delete_batch_size != null && Object.hasOwnProperty.call(message, "delete_batch_size")) + writer.uint32(/* id 6, wireType 0 =*/48).int64(message.delete_batch_size); return writer; }; @@ -176819,6 +188508,10 @@ export const vtctldata = $root.vtctldata = (() => { message.shards.push(reader.string()); break; } + case 6: { + message.delete_batch_size = reader.int64(); + break; + } default: reader.skipType(tag & 7); break; @@ -176873,6 +188566,9 @@ export const vtctldata = $root.vtctldata = (() => { if (!$util.isString(message.shards[i])) return "shards: string[] expected"; } + if (message.delete_batch_size != null && message.hasOwnProperty("delete_batch_size")) + if (!$util.isInteger(message.delete_batch_size) && !(message.delete_batch_size && $util.isInteger(message.delete_batch_size.low) && $util.isInteger(message.delete_batch_size.high))) + return "delete_batch_size: integer|Long expected"; return null; }; @@ -176903,6 +188599,15 @@ export const vtctldata = $root.vtctldata = (() => { for (let i = 0; i < object.shards.length; ++i) message.shards[i] = String(object.shards[i]); } + if (object.delete_batch_size != null) + if ($util.Long) + (message.delete_batch_size = $util.Long.fromValue(object.delete_batch_size)).unsigned = false; + else if (typeof object.delete_batch_size === "string") + message.delete_batch_size = parseInt(object.delete_batch_size, 10); + else if (typeof object.delete_batch_size === "number") + message.delete_batch_size = object.delete_batch_size; + else if (typeof object.delete_batch_size === "object") + message.delete_batch_size = new $util.LongBits(object.delete_batch_size.low >>> 0, object.delete_batch_size.high >>> 0).toNumber(); return message; }; @@ -176926,6 +188631,11 @@ export const vtctldata = $root.vtctldata = (() => { object.workflow = ""; object.keep_data = false; object.keep_routing_rules = false; + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.delete_batch_size = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.delete_batch_size = options.longs === String ? "0" : 0; } if (message.keyspace != null && message.hasOwnProperty("keyspace")) object.keyspace = message.keyspace; @@ -176940,6 +188650,11 @@ export const vtctldata = $root.vtctldata = (() => { for (let j = 0; j < message.shards.length; ++j) object.shards[j] = message.shards[j]; } + if (message.delete_batch_size != null && message.hasOwnProperty("delete_batch_size")) + if (typeof message.delete_batch_size === "number") + object.delete_batch_size = options.longs === String ? String(message.delete_batch_size) : message.delete_batch_size; + else + object.delete_batch_size = options.longs === String ? $util.Long.prototype.toString.call(message.delete_batch_size) : options.longs === Number ? new $util.LongBits(message.delete_batch_size.low >>> 0, message.delete_batch_size.high >>> 0).toNumber() : message.delete_batch_size; return object; }; @@ -178993,6 +190708,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {boolean|null} [dry_run] WorkflowSwitchTrafficRequest dry_run * @property {boolean|null} [initialize_target_sequences] WorkflowSwitchTrafficRequest initialize_target_sequences * @property {Array.|null} [shards] WorkflowSwitchTrafficRequest shards + * @property {boolean|null} [force] WorkflowSwitchTrafficRequest force */ /** @@ -179101,6 +190817,14 @@ export const vtctldata = $root.vtctldata = (() => { */ WorkflowSwitchTrafficRequest.prototype.shards = $util.emptyArray; + /** + * WorkflowSwitchTrafficRequest force. + * @member {boolean} force + * @memberof vtctldata.WorkflowSwitchTrafficRequest + * @instance + */ + WorkflowSwitchTrafficRequest.prototype.force = false; + /** * Creates a new WorkflowSwitchTrafficRequest instance using the specified properties. * @function create @@ -179153,6 +190877,8 @@ export const vtctldata = $root.vtctldata = (() => { if (message.shards != null && message.shards.length) for (let i = 0; i < message.shards.length; ++i) writer.uint32(/* id 11, wireType 2 =*/90).string(message.shards[i]); + if (message.force != null && Object.hasOwnProperty.call(message, "force")) + writer.uint32(/* id 12, wireType 0 =*/96).bool(message.force); return writer; }; @@ -179242,6 +190968,10 @@ export const vtctldata = $root.vtctldata = (() => { message.shards.push(reader.string()); break; } + case 12: { + message.force = reader.bool(); + break; + } default: reader.skipType(tag & 7); break; @@ -179340,6 +191070,9 @@ export const vtctldata = $root.vtctldata = (() => { if (!$util.isString(message.shards[i])) return "shards: string[] expected"; } + if (message.force != null && message.hasOwnProperty("force")) + if (typeof message.force !== "boolean") + return "force: boolean expected"; return null; }; @@ -179448,6 +191181,8 @@ export const vtctldata = $root.vtctldata = (() => { for (let i = 0; i < object.shards.length; ++i) message.shards[i] = String(object.shards[i]); } + if (object.force != null) + message.force = Boolean(object.force); return message; }; @@ -179478,6 +191213,7 @@ export const vtctldata = $root.vtctldata = (() => { object.timeout = null; object.dry_run = false; object.initialize_target_sequences = false; + object.force = false; } if (message.keyspace != null && message.hasOwnProperty("keyspace")) object.keyspace = message.keyspace; @@ -179510,6 +191246,8 @@ export const vtctldata = $root.vtctldata = (() => { for (let j = 0; j < message.shards.length; ++j) object.shards[j] = message.shards[j]; } + if (message.force != null && message.hasOwnProperty("force")) + object.force = message.force; return object; }; diff --git a/web/vtadmin/src/util/time.ts b/web/vtadmin/src/util/time.ts index 5e7c723c3d8..82703d60281 100644 --- a/web/vtadmin/src/util/time.ts +++ b/web/vtadmin/src/util/time.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as dayjs from 'dayjs'; +import dayjs from 'dayjs'; import localizedFormat from 'dayjs/plugin/localizedFormat'; import relativeTime from 'dayjs/plugin/relativeTime'; @@ -40,3 +40,15 @@ export const formatRelativeTime = (timestamp: number | Long | null | undefined): const u = parse(timestamp); return u ? u.fromNow() : null; }; + +export const formatDateTimeShort = (timestamp: number | Long | null | undefined): string | null => { + return format(timestamp, 'MM/DD/YY HH:mm:ss Z'); +}; + +export const formatRelativeTimeInSeconds = (timestamp: number | Long | null | undefined): string | null => { + const u = parse(timestamp); + if (!u) return null; + const currentTime = dayjs(); + const secondsElapsed = currentTime.diff(u, 'second'); + return `${secondsElapsed} seconds ago`; +}; diff --git a/web/vtadmin/src/util/transactions.ts b/web/vtadmin/src/util/transactions.ts new file mode 100644 index 00000000000..10d18cb6173 --- /dev/null +++ b/web/vtadmin/src/util/transactions.ts @@ -0,0 +1,28 @@ +/** + * Copyright 2024 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. + */ +import { invertBy } from 'lodash-es'; +import { query } from '../proto/vtadmin'; + +/** + * TRANSACTION_STATES maps numeric transaction state back to human readable strings. + */ +export const TRANSACTION_STATES = Object.entries(invertBy(query.TransactionState)).reduce((acc, [k, vs]) => { + acc[k] = vs[0]; + return acc; +}, {} as { [k: string]: string }); + +export const formatTransactionState = (transaction: query.ITransactionMetadata) => + transaction.state && TRANSACTION_STATES[transaction.state]; diff --git a/web/vtadmin/src/util/workflows.ts b/web/vtadmin/src/util/workflows.ts index 66e8d765961..3a0a03dc51b 100644 --- a/web/vtadmin/src/util/workflows.ts +++ b/web/vtadmin/src/util/workflows.ts @@ -94,3 +94,49 @@ export const getStreamTablets = (workflow: W | null | un return [...aliases]; }; + +/** + * getReverseWorkflow returns the reverse workflow of `originalWorkflow` by looking for the '_reverse' + * suffix and the source and target keyspace from all `workflows` list. + */ +export const getReverseWorkflow = ( + workflows: W[], + originalWorkflow: W | undefined | null +): W | undefined => { + if (!originalWorkflow) return; + const originalWorkflowName = originalWorkflow.workflow?.name!; + let reverseWorkflowName = originalWorkflowName.concat('_reverse'); + if (originalWorkflowName.endsWith('_reverse')) { + reverseWorkflowName = originalWorkflowName.split('_reverse')[0]; + } + return workflows.find( + (workflow) => + workflow.workflow?.name === reverseWorkflowName && + workflow.workflow?.source?.keyspace === originalWorkflow.workflow?.target?.keyspace && + workflow.workflow?.target?.keyspace === originalWorkflow.workflow?.source?.keyspace + ); +}; + +export interface TableCopyState extends vtctldata.WorkflowStatusResponse.ITableCopyState { + tableName: string; +} + +/** + * getTableCopyStates returns a list of table copy states with `tableName` included + * in the `TableCopyState` object, from the `workflowStatus` output. + */ +export const getTableCopyStates = ( + workflowStatus: vtctldata.WorkflowStatusResponse | undefined +): TableCopyState[] | undefined => { + if (!workflowStatus) return; + const tableNames = Object.keys(workflowStatus.table_copy_state); + if (!tableNames.length) return; + const tableCopyState: TableCopyState[] = tableNames.map((tableName) => { + const tableState = workflowStatus.table_copy_state[tableName]; + return { + tableName, + ...tableState, + }; + }); + return tableCopyState; +};